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
- Set 'Qwen3 Encoder' to a standalone Qwen3 text encoder model (Qwen3 4B for Klein 4B, Qwen3 8B for Klein 9B)
- Set 'Qwen3 Source' to a Diffusers FLUX.2 Klein pipeline so tokenizer+encoder are extracted from it
- Install the appropriate Qwen3 encoder via the model manager
- 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
- Pair the encoder size to the Klein size (4B->Qwen3 4B, 9B->Qwen3 8B)
- Install both standalone FLUX VAE and Qwen3 encoders alongside single-file checkpoints
- Prefer Diffusers pipelines that bundle tokenizer and encoder
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
- Expected PreTrainedModel for text encoder, got {type(text_en
- No Mistral encoder source provided. Single-file / GGUF trans
- Qwen3 encoder variant mismatch: FLUX.2 Klein {main_config.va
- No Qwen3 Encoder source provided. Either set 'Qwen3 Encoder'
- LoRA "{lora_key}" already applied to Qwen3 encoder.
AI-assisted analysis of invoke-ai/InvokeAI@0b6a024f2f (2026-08-29).
Data as JSON: /api/errors/96f9e4e2b2b9765f.
Report an issue: GitHub.