invoke-ai/InvokeAI · error · ValueError

Unsupported submodel type: {submodel_type}

Error message

Unsupported submodel type: {submodel_type}

What it means

The SDNQ diffusers FLUX loader's component dispatch handles a fixed set of submodel types (Transformer, Tokenizer, Tokenizer2, TextEncoder, TextEncoder2, VAE) via match/case; any other SubModelType hits the wildcard case and raises ValueError, since that component cannot come from this model.

Source

Thrown at invokeai/backend/model_manager/load/model_loaders/flux.py:1623

        # These branches build their modules by hand (`init_empty_weights` + `load_state_dict`)
        # rather than through `from_pretrained`, so they arrive in training mode — `put_in_eval_mode`
        # in `load_default._load_and_cache` is what puts every loaded model into inference mode.
        match submodel_type:
            case SubModelType.Transformer:
                return self._load_sdnq_transformer(submodel_path, config)
            case SubModelType.TextEncoder:
                return self._load_text_encoder(submodel_path)
            case SubModelType.TextEncoder2:
                return self._load_text_encoder_2(submodel_path)
            case SubModelType.Tokenizer:
                return CLIPTokenizer.from_pretrained(submodel_path, local_files_only=True)
            case SubModelType.Tokenizer2:
                return T5Tokenizer.from_pretrained(submodel_path, max_length=512, local_files_only=True)
            case SubModelType.VAE:
                return self._load_vae(submodel_path)
            case _:
                raise ValueError(f"Unsupported submodel type: {submodel_type}")

    def _load_sdnq_transformer_checkpoint(self, config: Main_SDNQ_FLUX_Config) -> AnyModel:
        """Load SDNQ transformer from single-file checkpoint."""
        model_path = Path(config.path)

        with accelerate.init_empty_weights():
            model = Flux(get_flux_transformers_params(config.variant))

        sd = sdnq_sd_loader(model_path, compute_dtype=torch.bfloat16)

        # Handle ComfyUI bundle format
        if "model.diffusion_model.double_blocks.0.img_attn.norm.key_norm.scale" in sd:
            sd = convert_bundle_to_flux_transformer_checkpoint(sd)

        model.load_state_dict(sd, assign=True)
        return model

    def _load_sdnq_transformer(self, transformer_path: Path, config: Main_SDNQ_Diffusers_FLUX_Config) -> AnyModel:

View on GitHub (pinned to 0b6a024f2f)

Solutions

  1. Only request Transformer, Tokenizer(2), TextEncoder(2), or VAE submodels from an SDNQ FLUX diffusers model.
  2. Load other components (controlnets, schedulers, etc.) from their separately registered models.
  3. Filter your submodel list against the supported set before calling the loader.

Example fix

// before
for sub in SubModelType:
    loader.load_model(sdnq_config, sub)  # raises on unsupported types
// after
supported = {SubModelType.Transformer, SubModelType.Tokenizer, SubModelType.Tokenizer2, SubModelType.TextEncoder, SubModelType.TextEncoder2, SubModelType.VAE}
for sub in supported:
    loader.load_model(sdnq_config, sub)
Defensive patterns

Strategy: validation

Validate before calling

supported = {SubModelType.Transformer, SubModelType.Tokenizer, SubModelType.Tokenizer2, SubModelType.TextEncoder, SubModelType.TextEncoder2, SubModelType.VAE}
if submodel_type not in supported:
    raise ValueError(f"{submodel_type} is not a component of an SDNQ FLUX diffusers model")

Type guard

def is_sdnq_component(submodel_type: SubModelType) -> bool:
    return submodel_type in {SubModelType.Transformer, SubModelType.Tokenizer, SubModelType.Tokenizer2, SubModelType.TextEncoder, SubModelType.TextEncoder2, SubModelType.VAE}

Try / catch

try:
    model = loader.load_model(config, submodel_type)
except ValueError as e:
    if "Unsupported submodel type" in str(e):
        raise RuntimeError(f"Load {submodel_type} from its separately registered model") from e
    raise

Prevention

When it happens

Trigger: Requesting a submodel type outside the handled set (e.g. SubModelType.ControlNet, Scheduler, or another non-component type) while loading a Main_SDNQ_Diffusers_FLUX_Config.

Common situations: Generic pipeline-loading loops that try every SubModelType against every model; passing the wrong enum value from custom orchestration code.

Related errors


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