invoke-ai/InvokeAI · error · ValueError
Model config dict 'base' field must be a string or Enum
Error message
Model config dict 'base' field must be a string or Enum
What it means
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.
Source
Thrown at invokeai/backend/model_manager/configs/base.py:184
if type_ := v.get("type"):
if isinstance(type_, Enum):
type_ = str(type_.value)
elif not isinstance(type_, str):
raise ValueError("Model config dict 'type' field must be a string or Enum")
tag_strings.append(type_)
if format_ := v.get("format"):
if isinstance(format_, Enum):
format_ = str(format_.value)
elif not isinstance(format_, str):
raise ValueError("Model config dict 'format' field must be a string or Enum")
tag_strings.append(format_)
if base_ := v.get("base"):
if isinstance(base_, Enum):
base_ = str(base_.value)
elif not isinstance(base_, str):
raise ValueError("Model config dict 'base' field must be a string or Enum")
tag_strings.append(base_)
# Special case: CLIP Embed models also need the variant to distinguish them.
if (
type_ == ModelType.CLIPEmbed.value
and format_ == ModelFormat.Diffusers.value
and base_ == BaseModelType.Any.value
):
if variant_ := v.get("variant"):
if isinstance(variant_, Enum):
variant_ = variant_.value
elif not isinstance(variant_, str):
raise ValueError("Model config dict 'variant' field must be a string or Enum")
tag_strings.append(variant_)
else:
raise ValueError("CLIP Embed model config dict must include a 'variant' field")
return ".".join(tag_strings)View on GitHub (pinned to 0b6a024f2f)
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).
Example fix
// before
{'type': 'main', 'format': 'diffusers', 'base': 2}
// after
{'type': 'main', 'format': 'diffusers', 'base': BaseModelType.StableDiffusionXL.value} Defensive patterns
Strategy: validation
Validate before calling
def normalize_base(v) -> str:
return v.value if isinstance(v, Enum) else str(v) Type guard
def is_valid_base(v: object) -> TypeGuard[str | Enum]:
return isinstance(v, (str, Enum)) Try / catch
try:
config = AnyModelConfig(**cfg)
except ValueError as e:
if "'base' field must be a string or Enum" in str(e):
cfg['base'] = cfg['base'].value if isinstance(cfg['base'], Enum) else str(cfg['base'])
config = AnyModelConfig(**cfg)
else:
raise Prevention
- 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.
When it happens
Trigger: Building a model config dict with 'base' as an int, non-Enum object, or bytes - e.g. {'type': 'main', 'format': 'diffusers', 'base': 2}.
Common situations: Migrating configs from other UIs that index base models numerically; serde settings dumping BaseModelType as an int; hand-edited config files.
Related errors
- Model config dict 'type' field must be a string or Enum
- Model config dict 'format' field must be a string or Enum
- source_url must be a string
- Model config dict 'variant' field must be a string or Enum
- CLIP Embed model config dict must include a 'variant' field
AI-assisted analysis of invoke-ai/InvokeAI@0b6a024f2f (2026-08-29).
Data as JSON: /api/errors/eca70643af719481.
Report an issue: GitHub.