invoke-ai/InvokeAI · error · ValueError

The selected FLUX model does not ship its own {', '.join(mis

Error message

The selected FLUX model does not ship its own {', '.join(missing)}, so {'it' if len(missing) == 1 else 'they'} must be selected explicitly. Only a complete SDNQ pipeline install (transformer + CLIP + T5 + VAE) can supply these itself.

What it means

When loading a FLUX model that is not a complete self-contained SDNQ pipeline, the loader resolves T5 encoder, CLIP embed, and VAE from explicit selections or the main model. If any of the three ends up with no source, it raises ValueError listing the missing components, because FLUX cannot run without them and only a full SDNQ pipeline install can self-supply them.

Source

Thrown at invokeai/app/invocations/flux_model_loader.py:112

        self_contained = is_self_contained_sdnq_flux1_pipeline(main_config)

        def resolve(selected: ModelIdentifierField | None) -> ModelIdentifierField | None:
            """Explicit selection wins; otherwise the main model supplies the part if it can."""
            if selected is not None:
                return selected
            return self.model if self_contained else None

        t5_source = resolve(self.t5_encoder_model)
        clip_source = resolve(self.clip_embed_model)
        vae_source = resolve(self.vae_model)

        missing = [
            title
            for title, source in (("T5 Encoder", t5_source), ("CLIP Embed", clip_source), ("VAE", vae_source))
            if source is None
        ]
        if missing:
            raise ValueError(
                f"The selected FLUX model does not ship its own {', '.join(missing)}, so "
                f"{'it' if len(missing) == 1 else 'they'} must be selected explicitly. Only a complete "
                "SDNQ pipeline install (transformer + CLIP + T5 + VAE) can supply these itself."
            )

        transformer = self.model.model_copy(update={"submodel_type": SubModelType.Transformer})
        vae = vae_source.model_copy(update={"submodel_type": SubModelType.VAE})

        tokenizer = clip_source.model_copy(update={"submodel_type": SubModelType.Tokenizer})
        clip_encoder = clip_source.model_copy(update={"submodel_type": SubModelType.TextEncoder})

        if t5_source is self.model:
            # The pipeline's own T5 lives in the slots discovery recorded, not behind the standalone
            # T5 bundle layouts `preprocess_t5_*` exists to normalize.
            tokenizer2 = t5_source.model_copy(update={"submodel_type": SubModelType.Tokenizer2})
            t5_encoder = t5_source.model_copy(update={"submodel_type": SubModelType.TextEncoder2})
        else:
            tokenizer2 = preprocess_t5_tokenizer_model_identifier(t5_source)

View on GitHub (pinned to 0b6a024f2f)

Solutions

  1. Select explicit T5 encoder, CLIP embed, and VAE models in the FLUX loader node fields
  2. Install a complete SDNQ FLUX pipeline (transformer + CLIP + T5 + VAE)
  3. Install the missing companion models and point the node at them
  4. Check is_self_contained_sdnq_flux1_pipeline applicability or use a complete model folder

Example fix

// before: transformer-only selection, no companions
FluxModelLoader(model=flux_key)
// after
FluxModelLoader(model=flux_key, t5_encoder_model=t5_key, clip_embed_model=clip_key, vae_model=vae_key)
Defensive patterns

Strategy: validation

Validate before calling

# ensure explicit selections exist and are set when the main model is not a full SDNQ pipeline
assert t5_encoder_model and clip_embed_model and vae_model, "Select T5, CLIP and VAE explicitly"
for m in (t5_encoder_model, clip_embed_model, vae_model):
    assert context.models.exists(m.key), f"Missing companion model {m.key}"

Type guard

def has_all_companions(t5, clip, vae) -> bool:
    return t5 is not None and clip is not None and vae is not None

Try / catch

try:
    output = loader.invoke(context)
except ValueError as e:
    if 'must be selected explicitly' in str(e):
        # provide t5_encoder_model/clip_embed_model/vae_model or install full SDNQ pipeline
        pass
    else:
        raise

Prevention

When it happens

Trigger: invoke() with a partial/incomplete FLUX install (transformer-only) and no explicit t5_encoder_model/clip_embed_model/vae_model selections, or selections that failed resolution, so missing != [] after source resolution.

Common situations: Installing only the FLUX transformer checkpoint without T5/CLIP/VAE companions; a non-SDNQ FLUX model missing VAE; deleting a companion model while the workflow relied on the main model to supply it.

Related errors


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