{"record":{"id":"96f9e4e2b2b9765f","repo":"invoke-ai/InvokeAI","slug":"no-qwen3-encoder-source-provided-standalone-safet","errorCode":null,"errorMessage":"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","messagePattern":"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","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"invokeai/app/invocations/flux2_klein_model_loader.py","lineNumber":180,"sourceCode":"            )\n\n        # Determine Qwen3 Encoder source\n        if self.qwen3_encoder_model is not None:\n            # Use standalone Qwen3 Encoder - validate it matches the FLUX.2 Klein variant\n            self._validate_qwen3_encoder_variant(context, main_config)\n            qwen3_tokenizer = self.qwen3_encoder_model.model_copy(update={\"submodel_type\": SubModelType.Tokenizer})\n            qwen3_encoder = self.qwen3_encoder_model.model_copy(update={\"submodel_type\": SubModelType.TextEncoder})\n        elif main_is_diffusers:\n            # Extract from main model (recommended for FLUX.2 Klein)\n            qwen3_tokenizer = self.model.model_copy(update={\"submodel_type\": SubModelType.Tokenizer})\n            qwen3_encoder = self.model.model_copy(update={\"submodel_type\": SubModelType.TextEncoder})\n        elif self.qwen3_source_model is not None:\n            # Extract from separate Diffusers model\n            self._validate_encoder_source(context, self.qwen3_source_model, \"Qwen3 Source\", main_config)\n            qwen3_tokenizer = self.qwen3_source_model.model_copy(update={\"submodel_type\": SubModelType.Tokenizer})\n            qwen3_encoder = self.qwen3_source_model.model_copy(update={\"submodel_type\": SubModelType.TextEncoder})\n        else:\n            raise ValueError(\n                \"No Qwen3 Encoder source provided. Standalone safetensors/GGUF models require a separate text encoder. \"\n                \"Options:\\n\"\n                \"  1. Set 'Qwen3 Encoder' to a standalone Qwen3 text encoder model \"\n                \"(Klein 4B needs Qwen3 4B, Klein 9B needs Qwen3 8B)\\n\"\n                \"  2. Set 'Qwen3 Source' to a Diffusers Flux2 Klein model to extract the encoder from\"\n            )\n\n        return Flux2KleinModelLoaderOutput(\n            transformer=TransformerField(transformer=transformer, loras=[]),\n            qwen3_encoder=Qwen3EncoderField(tokenizer=qwen3_tokenizer, text_encoder=qwen3_encoder),\n            vae=VAEField(vae=vae),\n            max_seq_len=self.max_seq_len,\n        )\n\n    def _validate_diffusers_format(\n        self, context: InvocationContext, model: ModelIdentifierField, model_name: str\n    ) -> AnyModelConfig:\n        \"\"\"Validate that a model exposes the diffusers-style submodel layout and return its config.","sourceCodeStart":162,"sourceCodeEnd":198,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/invocations/flux2_klein_model_loader.py#L162-L198","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","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"],"exampleFix":"// before\nloader = Flux2KleinModelLoader(model=safetensors_checkpoint, vae_model=flux_vae)\n// after\nloader = Flux2KleinModelLoader(\n    model=safetensors_checkpoint,\n    vae_model=flux_vae,\n    qwen3_encoder_model=qwen3_4b_encoder,   # Klein 4B -> Qwen3 4B\n    # or: qwen3_source_model=diffusers_klein_pipeline\n)\noutput = loader.invoke(context)","handlingStrategy":"validation","validationCode":"cfg = context.models.get_config(loader.model)\nif cfg.format != ModelFormat.Diffusers and loader.qwen3_encoder_model is None and loader.qwen3_source_model is None:\n    raise ValueError(\"standalone checkpoint needs Qwen3 encoder or Qwen3 Source\")","typeGuard":"def has_encoder_source(loader) -> bool:\n    return loader.qwen3_encoder_model is not None or loader.qwen3_source_model is not None","tryCatchPattern":"try:\n    output = loader.invoke(context)\nexcept ValueError as e:\n    if 'No Qwen3 Encoder source provided' in str(e):\n        loader.qwen3_encoder_model = pick_qwen3_encoder_for(loader.model)\n        output = loader.invoke(context)\n    else:\n        raise","preventionTips":["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"],"tags":["text-encoder","missing-input","qwen3","invokeai"],"backgroundTag":"missing-text-encoder-source","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}