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

  1. Use the enum value string: {'base': BaseModelType.StableDiffusion1.value} or {'base': 'sd-1'}.
  2. Pass the BaseModelType Enum member directly.
  3. 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

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


AI-assisted analysis of invoke-ai/InvokeAI@0b6a024f2f (2026-08-29). Data as JSON: /api/errors/eca70643af719481. Report an issue: GitHub.