invoke-ai/InvokeAI · error · ValueError
No VAE source provided. Single-file / GGUF transformers requ
Error message
No VAE source provided. Single-file / GGUF transformers require a separate VAE. Options: 1. Set 'VAE' to a standalone FLUX.2 VAE model 2. Set 'Mistral Source' to a Diffusers FLUX.2 [dev] model to extract the VAE from
What it means
The FLUX.2 [dev] model loader throws this when a single-file or GGUF transformer is selected but no VAE source is configured. Single-file/GGUF checkpoints do not bundle a VAE, so InvokeAI requires either a standalone FLUX.2 VAE model or a Diffusers FLUX.2 [dev] pipeline from which the VAE can be extracted. The invoke() method raises ValueError as an input-validation gate before any model loading.
Source
Thrown at invokeai/app/invocations/flux2_dev_model_loader.py:139
raise ValueError(
f"FLUX.2 [dev] loader requires a FLUX.2 [dev] transformer, "
f"but the selected model is variant '{variant.value}'. "
"Use the FLUX.2 Klein loader for Klein variants."
)
transformer = self.model.model_copy(update={"submodel_type": SubModelType.Transformer})
main_is_diffusers = main_config.format == ModelFormat.Diffusers
# Resolve VAE.
if self.vae_model is not None:
vae = self.vae_model.model_copy(update={"submodel_type": SubModelType.VAE})
elif main_is_diffusers:
vae = self.model.model_copy(update={"submodel_type": SubModelType.VAE})
elif self.mistral_source_model is not None:
self._validate_diffusers_format(context, self.mistral_source_model, "Mistral Source")
vae = self.mistral_source_model.model_copy(update={"submodel_type": SubModelType.VAE})
else:
raise ValueError(
"No VAE source provided. Single-file / GGUF transformers require a separate VAE. "
"Options:\n"
" 1. Set 'VAE' to a standalone FLUX.2 VAE model\n"
" 2. Set 'Mistral Source' to a Diffusers FLUX.2 [dev] model to extract the VAE from"
)
# Resolve Mistral encoder.
if self.mistral_encoder_model is not None:
tokenizer = self.mistral_encoder_model.model_copy(update={"submodel_type": SubModelType.Tokenizer})
text_encoder = self.mistral_encoder_model.model_copy(update={"submodel_type": SubModelType.TextEncoder})
elif main_is_diffusers:
tokenizer = self.model.model_copy(update={"submodel_type": SubModelType.Tokenizer})
text_encoder = self.model.model_copy(update={"submodel_type": SubModelType.TextEncoder})
elif self.mistral_source_model is not None:
self._validate_encoder_source(context, self.mistral_source_model, "Mistral Source")
tokenizer = self.mistral_source_model.model_copy(update={"submodel_type": SubModelType.Tokenizer})
text_encoder = self.mistral_source_model.model_copy(update={"submodel_type": SubModelType.TextEncoder})
else:View on GitHub (pinned to 0b6a024f2f)
Solutions
- Connect a standalone FLUX.2 VAE model to the loader's 'VAE' input.
- Connect a Diffusers FLUX.2 [dev] model to the 'Mistral Source' input so the VAE can be extracted from it.
Example fix
// before (workflow graph) loader = Flux2DevModelLoader(model=gguf_transformer) # VAE, Mistral Source unconnected // after loader = Flux2DevModelLoader(model=gguf_transformer, vae=flux2_vae_model)
Defensive patterns
Strategy: validation
Validate before calling
# before invoking the loader
if not vae_input and not mistral_source_input:
raise ValueError("Connect a standalone FLUX.2 VAE or a Diffusers FLUX.2 [dev] 'Mistral Source' before running the loader") Type guard
def has_vae_source(loader) -> bool:
return loader.vae is not None or loader.mistral_source_model is not None Try / catch
try:
output = loader.invoke(context)
except ValueError as e:
if "No VAE source provided" in str(e):
loader.vae = standalone_flux2_vae
output = loader.invoke(context)
else:
raise Prevention
- Always wire the VAE input when using GGUF or single-file FLUX.2 transformers.
- Use the frontend FLUX.2 template workflows, which pre-wire VAE and encoder inputs.
- Check loader inputs in the workflow editor before queueing the graph.
When it happens
Trigger: Invoking the FLUX.2 [dev] model loader where the main model is not a Diffusers pipeline (main_is_diffusers is False), self.vae is unset, and self.mistral_source_model is None.
Common situations: User selects a GGUF or single-file FLUX.2 transformer in the loader node but leaves both the 'VAE' input and the 'Mistral Source' input unconnected in the workflow graph.
Related errors
- No Mistral encoder source provided. Single-file / GGUF trans
- FLUX.2 [dev] loader requires a FLUX.2 [dev] transformer, but
- The {model_name} model must be a Diffusers format model. The
- The {model_name} model must be a FLUX.2 [dev] pipeline, but
- Expected PreTrainedModel for text encoder, got {type(text_en
AI-assisted analysis of invoke-ai/InvokeAI@0b6a024f2f (2026-08-29).
Data as JSON: /api/errors/0e9eb79c84610591.
Report an issue: GitHub.