invoke-ai/InvokeAI · error · ValueError

No Qwen3 Encoder source provided. Standalone safetensors/GGU

Error message

No Qwen3 Encoder source provided. Standalone safetensors/GGUF models require a separate text encoder. Options:
  1. Set 'Qwen3 Encoder' to a standalone Qwen3 text encoder model (Klein 4B needs Qwen3 4B, Klein 9B needs Qwen3 8B)
  2. Set 'Qwen3 Source' to a Diffusers Flux2 Klein model to extract the encoder from

What it means

The FLUX.2 Klein model loader raised ValueError because the standalone safetensors/GGUF main model was given no Qwen3 text encoder source — neither a standalone Qwen3 encoder model nor a Diffusers Flux2 Klein pipeline to extract it from. Standalone checkpoints do not include the text encoder, so the loader cannot build a runnable model.

Source

Thrown at invokeai/app/invocations/flux2_klein_model_loader.py:180

            )

        # Determine Qwen3 Encoder source
        if self.qwen3_encoder_model is not None:
            # Use standalone Qwen3 Encoder - validate it matches the FLUX.2 Klein variant
            self._validate_qwen3_encoder_variant(context, main_config)
            qwen3_tokenizer = self.qwen3_encoder_model.model_copy(update={"submodel_type": SubModelType.Tokenizer})
            qwen3_encoder = self.qwen3_encoder_model.model_copy(update={"submodel_type": SubModelType.TextEncoder})
        elif main_is_diffusers:
            # Extract from main model (recommended for FLUX.2 Klein)
            qwen3_tokenizer = self.model.model_copy(update={"submodel_type": SubModelType.Tokenizer})
            qwen3_encoder = self.model.model_copy(update={"submodel_type": SubModelType.TextEncoder})
        elif self.qwen3_source_model is not None:
            # Extract from separate Diffusers model
            self._validate_encoder_source(context, self.qwen3_source_model, "Qwen3 Source", main_config)
            qwen3_tokenizer = self.qwen3_source_model.model_copy(update={"submodel_type": SubModelType.Tokenizer})
            qwen3_encoder = self.qwen3_source_model.model_copy(update={"submodel_type": SubModelType.TextEncoder})
        else:
            raise ValueError(
                "No Qwen3 Encoder source provided. Standalone safetensors/GGUF models require a separate text encoder. "
                "Options:\n"
                "  1. Set 'Qwen3 Encoder' to a standalone Qwen3 text encoder model "
                "(Klein 4B needs Qwen3 4B, Klein 9B needs Qwen3 8B)\n"
                "  2. Set 'Qwen3 Source' to a Diffusers Flux2 Klein model to extract the encoder from"
            )

        return Flux2KleinModelLoaderOutput(
            transformer=TransformerField(transformer=transformer, loras=[]),
            qwen3_encoder=Qwen3EncoderField(tokenizer=qwen3_tokenizer, text_encoder=qwen3_encoder),
            vae=VAEField(vae=vae),
            max_seq_len=self.max_seq_len,
        )

    def _validate_diffusers_format(
        self, context: InvocationContext, model: ModelIdentifierField, model_name: str
    ) -> AnyModelConfig:
        """Validate that a model exposes the diffusers-style submodel layout and return its config.

View on GitHub (pinned to 0b6a024f2f)

Solutions

  1. Set 'Qwen3 Encoder' to a standalone Qwen3 text encoder model (Qwen3 4B for Klein 4B, Qwen3 8B for Klein 9B)
  2. Set 'Qwen3 Source' to a Diffusers FLUX.2 Klein pipeline so tokenizer+encoder are extracted from it
  3. Install the appropriate Qwen3 encoder via the model manager
  4. Catch ValueError and prompt the user to supply one of the two encoder sources

Example fix

// before
loader = Flux2KleinModelLoader(model=safetensors_checkpoint, vae_model=flux_vae)
// after
loader = Flux2KleinModelLoader(
    model=safetensors_checkpoint,
    vae_model=flux_vae,
    qwen3_encoder_model=qwen3_4b_encoder,   # Klein 4B -> Qwen3 4B
    # or: qwen3_source_model=diffusers_klein_pipeline
)
output = loader.invoke(context)
Defensive patterns

Strategy: validation

Validate before calling

cfg = context.models.get_config(loader.model)
if cfg.format != ModelFormat.Diffusers and loader.qwen3_encoder_model is None and loader.qwen3_source_model is None:
    raise ValueError("standalone checkpoint needs Qwen3 encoder or Qwen3 Source")

Type guard

def has_encoder_source(loader) -> bool:
    return loader.qwen3_encoder_model is not None or loader.qwen3_source_model is not None

Try / catch

try:
    output = loader.invoke(context)
except ValueError as e:
    if 'No Qwen3 Encoder source provided' in str(e):
        loader.qwen3_encoder_model = pick_qwen3_encoder_for(loader.model)
        output = loader.invoke(context)
    else:
        raise

Prevention

When it happens

Trigger: invoke() reaches encoder resolution with self.model in safetensors/GGUF format while self.qwen3_encoder_model is None and self.qwen3_source_model is None (final else branch).

Common situations: Single-file Klein checkpoint downloaded without the required Qwen3 encoder; user unaware that Klein 4B needs Qwen3 4B and Klein 9B needs Qwen3 8B; workflow saved before the encoder input was wired.

Related errors


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