{"record":{"id":"eca70643af719481","repo":"invoke-ai/InvokeAI","slug":"model-config-dict-base-field-must-be-a-string-or","errorCode":null,"errorMessage":"Model config dict 'base' field must be a string or Enum","messagePattern":"Model config dict 'base' field must be a string or Enum","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"invokeai/backend/model_manager/configs/base.py","lineNumber":184,"sourceCode":"            if type_ := v.get(\"type\"):\n                if isinstance(type_, Enum):\n                    type_ = str(type_.value)\n                elif not isinstance(type_, str):\n                    raise ValueError(\"Model config dict 'type' field must be a string or Enum\")\n                tag_strings.append(type_)\n\n            if format_ := v.get(\"format\"):\n                if isinstance(format_, Enum):\n                    format_ = str(format_.value)\n                elif not isinstance(format_, str):\n                    raise ValueError(\"Model config dict 'format' field must be a string or Enum\")\n                tag_strings.append(format_)\n\n            if base_ := v.get(\"base\"):\n                if isinstance(base_, Enum):\n                    base_ = str(base_.value)\n                elif not isinstance(base_, str):\n                    raise ValueError(\"Model config dict 'base' field must be a string or Enum\")\n                tag_strings.append(base_)\n\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)","sourceCodeStart":166,"sourceCodeEnd":202,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/backend/model_manager/configs/base.py#L166-L202","documentation":"get_model_discriminator_value requires the 'base' field of a config dict to be a string or Enum (a BaseModelType value like 'sd-1', 'sdxl', 'flux'); otherwise ValueError is raised while computing the discriminator tag.","triggerScenarios":"Building a model config dict with 'base' as an int, non-Enum object, or bytes - e.g. {'type': 'main', 'format': 'diffusers', 'base': 2}.","commonSituations":"Migrating configs from other UIs that index base models numerically; serde settings dumping BaseModelType as an int; hand-edited config files.","solutions":["Use the enum value string: {'base': BaseModelType.StableDiffusion1.value} or {'base': 'sd-1'}.","Pass the BaseModelType Enum member directly.","Ensure the JSON/YAML producer serializes enums as strings (use_enum_values or json dump of .value)."],"exampleFix":"// before\n{'type': 'main', 'format': 'diffusers', 'base': 2}\n// after\n{'type': 'main', 'format': 'diffusers', 'base': BaseModelType.StableDiffusionXL.value}","handlingStrategy":"validation","validationCode":"def normalize_base(v) -> str:\n    return v.value if isinstance(v, Enum) else str(v)","typeGuard":"def is_valid_base(v: object) -> TypeGuard[str | Enum]:\n    return isinstance(v, (str, Enum))","tryCatchPattern":"try:\n    config = AnyModelConfig(**cfg)\nexcept ValueError as e:\n    if \"'base' field must be a string or Enum\" in str(e):\n        cfg['base'] = cfg['base'].value if isinstance(cfg['base'], Enum) else str(cfg['base'])\n        config = AnyModelConfig(**cfg)\n    else:\n        raise","preventionTips":["Use BaseModelType enum values ('sd-1', 'sdxl', 'flux', ...) when constructing dicts.","Convert numeric base-model codes from other tools via an explicit lookup table.","Validate configs with pydantic early (at import/migration time), not at use time."],"tags":["invokeai","pydantic","discriminator","type-mismatch"],"backgroundTag":"discriminator-validation-failed","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}