{"record":{"id":"6b4ee337d427faf0","repo":"invoke-ai/InvokeAI","slug":"model-config-discriminator-value-must-be-computed","errorCode":null,"errorMessage":"Model config discriminator value must be computed from a dict or ModelConfigBase instance","messagePattern":"Model config discriminator value must be computed from a dict or ModelConfigBase instance","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"invokeai/backend/model_manager/configs/base.py","lineNumber":204,"sourceCode":"\n            # Special case: CLIP Embed models also need the variant to distinguish them.\n            if (\n                type_ == ModelType.CLIPEmbed.value\n                and format_ == ModelFormat.Diffusers.value\n                and base_ == BaseModelType.Any.value\n            ):\n                if variant_ := v.get(\"variant\"):\n                    if isinstance(variant_, Enum):\n                        variant_ = variant_.value\n                    elif not isinstance(variant_, str):\n                        raise ValueError(\"Model config dict 'variant' field must be a string or Enum\")\n                    tag_strings.append(variant_)\n                else:\n                    raise ValueError(\"CLIP Embed model config dict must include a 'variant' field\")\n\n            return \".\".join(tag_strings)\n        else:\n            raise ValueError(\n                \"Model config discriminator value must be computed from a dict or ModelConfigBase instance\"\n            )\n\n    @classmethod\n    @abstractmethod\n    def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) -> Self:\n        \"\"\"Given the model on disk and any override fields, attempt to construct an instance of this config class.\n\n        This method serves to identify whether the model on disk matches this config class, and if so, to extract any\n        additional metadata needed to instantiate the config.\n\n        Implementations should raise a NotAMatchError if the model does not match this config class.\"\"\"\n        raise NotImplementedError(f\"from_model_on_disk not implemented for {cls.__name__}\")\n\n\nclass Checkpoint_Config_Base(ABC, BaseModel):\n    \"\"\"Base class for checkpoint-style models.\"\"\"\n","sourceCodeStart":186,"sourceCodeEnd":222,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/backend/model_manager/configs/base.py#L186-L222","documentation":"get_model_discriminator_value computes a string discriminator used to pick the right ModelConfigBase subclass. It only accepts either a raw config dict or an already-instantiated ModelConfigBase; anything else (None, a path, a string, arbitrary object) reaches the final else branch and raises this ValueError. It is an internal typing/contract error in InvokeAI's model-manager config resolution.","triggerScenarios":"Calling get_model_discriminator_value with an argument that is neither a dict nor a ModelConfigBase instance — e.g. passing None, a Path/str model path, or a plain object instead of the config dict; also happens when upstream config-loading code fails to build the dict and silently forwards the wrong type.","commonSituations":"Custom probe/integration code that calls discriminator resolution directly; passing a ModelOnDisk or path where the loaded config dict was expected; a subclassed config pipeline that returns None from a loader and forwards it.","solutions":["Pass the loaded config dict or a ModelConfigBase instance instead of a path/object","Before calling, check isinstance(value, (dict, ModelConfigBase)) and load/convert otherwise","Inspect the caller that produced the value — it likely swallowed a load failure and returned None","Upgrade/align InvokeAI versions; internal signature of discriminator resolution changed across releases"],"exampleFix":"// before\ndiscrim = get_model_discriminator_value(model_path)\n// after\nconfig = load_config_dict(model_path)  # dict[str, Any]\nassert isinstance(config, dict)\ndiscrim = get_model_discriminator_value(config)","handlingStrategy":"type-guard","validationCode":"from typing import Any\nfrom invokeai.backend.model_manager.configs.base import ModelConfigBase\n\ndef can_compute_discriminator(value: Any) -> bool:\n    return isinstance(value, (dict, ModelConfigBase))","typeGuard":"def is_config_input(value: Any) -> bool:\n    return isinstance(value, (dict, ModelConfigBase))","tryCatchPattern":"try:\n    discrim = get_model_discriminator_value(value)\nexcept ValueError as e:\n    if \"discriminator value\" in str(e):\n        value = value.config if hasattr(value, \"config\") else dict(value)\n        discrim = get_model_discriminator_value(value)\n    else:\n        raise","preventionTips":["Always load the config into a dict before discriminator resolution","Never pass Path/str/model objects to get_model_discriminator_value","Check loader return values for None before forwarding","Pin InvokeAI versions when relying on internal config APIs"],"tags":["python","model-manager","type-error","config"],"backgroundTag":"invalid-argument-type","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}