{"record":{"id":"8c8c22bf2c878d2e","repo":"huggingface/transformers","slug":"model-cls-name-has-no-config-class-or-model","errorCode":null,"errorMessage":"Model {cls.__name__} has no config class or model type","messagePattern":"Model (.+?) has no config class or model type","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/transformers/fusion_mapping.py","lineNumber":211,"sourceCode":"    \"\"\"Register one fusion family for `cls`.\n\n    This function updates the two global registries used by fused loading:\n    - the monkey-patching registry, so compatible module classes are replaced before initialization\n    - the checkpoint conversion mapping, so fused runtime modules still load from the original checkpoint layout\n\n    Notes:\n    - conflicting checkpoint transforms fail fast\n    \"\"\"\n\n    fusable_classes = _discover_fusable_modules(cls, config, fusion_name=fusion_name, spec=spec)\n    if not fusable_classes:\n        logger.info(spec.get_empty_log(cls.__name__))\n        return\n\n    register_patch_mapping(fusable_classes, overwrite=True)\n\n    if not hasattr(cls, \"config_class\") or not hasattr(cls.config_class, \"model_type\"):\n        raise ValueError(f\"Model {cls.__name__} has no config class or model type\")\n    model_type = cls.config_class.model_type\n    converters = spec.make_transforms(config)\n\n    existing_converters = get_checkpoint_conversion_mapping(model_type)\n    if existing_converters is not None:\n        # WeightConverter matching stops at the first matching source pattern, so\n        # conflicting converters must fail fast instead of being appended.\n        existing_converter_sources = {tuple(existing.source_patterns): existing for existing in existing_converters}\n        for converter in converters:\n            source_patterns = tuple(converter.source_patterns)\n            existing_converter = existing_converter_sources.get(source_patterns)\n            if existing_converter is not None:\n                raise ValueError(\n                    f\"Fusion {fusion_name} for model type {model_type} conflicts with an existing conversion mapping \"\n                    f\"for source patterns {source_patterns}.\"\n                )\n\n        # TODO: allow compatible fusions mentioned https://github.com/huggingface/transformers/pull/45041#discussion_r3028989716","sourceCodeStart":193,"sourceCodeEnd":229,"githubUrl":"https://github.com/huggingface/transformers/blob/a597f974857b3d92939971296bc0deb93d33d780/src/transformers/fusion_mapping.py#L193-L229","documentation":"In the module-fusion machinery, after discovering fusable modules and registering patch mappings, the code requires cls.config_class with a model_type attribute to key checkpoint conversion mappings. Model classes lacking a proper config class (or whose config class has no model_type) cannot participate in fusion.","triggerScenarios":"Calling register_fusion_patches (directly or via model loading with a fusion_config) on a custom PreTrainedModel subclass whose config_class is missing or whose config class does not define model_type.","commonSituations":"Experimental/custom model implementations that skip config_class, or configs built from a plain dict without setting model_type before fusion is requested.","solutions":["Set cls.config_class = MyConfig on the model class and define MyConfig.model_type (e.g. 'my-model')","Verify fusable modules were actually discovered first — the error only fires when fusable_classes is non-empty","Do not enable fusion_config for model types that do not support fusion"],"exampleFix":"# before\nclass MyModel(PreTrainedModel):\n    config_class = None  # fusion then fails\n# after\nclass MyConfig(PretrainedConfig):\n    model_type = \"my-model\"\nclass MyModel(PreTrainedModel):\n    config_class = MyConfig","handlingStrategy":"validation","validationCode":"def supports_fusion(cls) -> bool:\n    return hasattr(cls, \"config_class\") and hasattr(cls.config_class, \"model_type\")","typeGuard":"from transformers import PreTrainedModel, PretrainedConfig\n\ndef has_model_type(cls: type[PreTrainedModel]) -> bool:\n    cfg = getattr(cls, \"config_class\", None)\n    return isinstance(cfg, type) and issubclass(cfg, PretrainedConfig) and bool(getattr(cfg, \"model_type\", None))","tryCatchPattern":null,"preventionTips":["Always define config_class and model_type on custom PreTrainedModel subclasses","Only enable fusion_config on models documented to support fusion"],"tags":["python","transformers","fusion","model-config","model-type"],"backgroundTag":null,"analyzedSha":"a597f974857b3d92939971296bc0deb93d33d780","analyzedAt":"2026-08-14T18:24:08.354Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}