invoke-ai/InvokeAI · error · ValueError

Only Tokenizer and TextEncoder submodels are supported. Rece

Error message

Only Tokenizer and TextEncoder submodels are supported. Received: {submodel_type.value if submodel_type else 'None'}

What it means

The diffusers-format Qwen VL encoder loader supports only Tokenizer and TextEncoder submodels. Any other submodel type (or None) falls past the match/if-chain and raises this ValueError echoing the received submodel type.

Source

Thrown at invokeai/backend/model_manager/load/model_loaders/qwen_image.py:324

        model_path = Path(config.path)

        target_device = TorchDevice.choose_torch_device()
        model_dtype = TorchDevice.choose_bfloat16_safe_dtype(target_device)

        match submodel_type:
            case SubModelType.Tokenizer:
                tokenizer_path = model_path / "tokenizer"
                return AutoTokenizer.from_pretrained(str(tokenizer_path), local_files_only=True)
            case SubModelType.TextEncoder:
                encoder_path = model_path / "text_encoder"
                return Qwen2_5_VLForConditionalGeneration.from_pretrained(
                    str(encoder_path),
                    torch_dtype=model_dtype,
                    low_cpu_mem_usage=True,
                    local_files_only=True,
                )

        raise ValueError(
            f"Only Tokenizer and TextEncoder submodels are supported. "
            f"Received: {submodel_type.value if submodel_type else 'None'}"
        )


@ModelLoaderRegistry.register(base=BaseModelType.Any, type=ModelType.QwenVLEncoder, format=ModelFormat.Checkpoint)
class QwenVLEncoderCheckpointLoader(ModelLoader):
    """Loads a single-file Qwen2.5-VL encoder checkpoint (e.g. ComfyUI fp8_scaled).

    The checkpoint bundles the language model and the visual tower into one
    safetensors file. Tokenizer + processor are pulled from HuggingFace
    (`Qwen/Qwen2.5-VL-7B-Instruct`) on first use, with offline cache fallback.
    """

    DEFAULT_HF_REPO = "Qwen/Qwen2.5-VL-7B-Instruct"

    def _load_model(
        self,

View on GitHub (pinned to 0b6a024f2f)

Solutions

  1. Request only SubModelType.Tokenizer or SubModelType.TextEncoder from this loader.
  2. Load transformer/VAE components from their own registered models.
  3. Fix the model registration so other submodels resolve to appropriate loaders.

Example fix

// before
enc = loader._load_model(config, SubModelType.VAE)
// after
tok = loader._load_model(config, SubModelType.Tokenizer)
enc = loader._load_model(config, SubModelType.TextEncoder)
Defensive patterns

Strategy: validation

Validate before calling

SUPPORTED = {SubModelType.Tokenizer, SubModelType.TextEncoder}
if submodel_type not in SUPPORTED:
    raise ValueError(f"QwenVL encoder loader supports only Tokenizer/TextEncoder, got {submodel_type}")

Type guard

def is_encoder_submodel(sub: SubModelType | None) -> bool:
    return sub in (SubModelType.Tokenizer, SubModelType.TextEncoder)

Try / catch

try:
    comp = loader._load_model(config, submodel_type)
except ValueError as e:
    if "Only Tokenizer and TextEncoder" in str(e):
        logger.warning("Load other components from their own model entries")
    else:
        raise

Prevention

When it happens

Trigger: Calling this loader's _load_model with submodel_type other than SubModelType.Tokenizer or SubModelType.TextEncoder (e.g. Transformer, VAE, or None).

Common situations: Registry/base-type misconfiguration causing the manager to request unrelated submodels from the encoder entry; scripts enumerating submodels generically.

Related errors


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