invoke-ai/InvokeAI · error · ValueError

Unexpected submodel requested for LLaVA OneVision model.

Error message

Unexpected submodel requested for LLaVA OneVision model.

What it means

The SigLIP (LLaVA OneVision) loader loads a complete vision model and supports no submodels. If _load_model is called with a non-None submodel_type, it raises this ValueError immediately. It protects against callers assuming the SigLIP checkpoint is a multi-component pipeline.

Source

Thrown at invokeai/backend/model_manager/load/model_loaders/sig_lip.py:22

from transformers import SiglipVisionModel

from invokeai.backend.model_manager.configs.factory import AnyModelConfig
from invokeai.backend.model_manager.load.load_default import ModelLoader
from invokeai.backend.model_manager.load.model_loader_registry import ModelLoaderRegistry
from invokeai.backend.model_manager.taxonomy import AnyModel, BaseModelType, ModelFormat, ModelType, SubModelType


@ModelLoaderRegistry.register(base=BaseModelType.Any, type=ModelType.SigLIP, format=ModelFormat.Diffusers)
class SigLIPModelLoader(ModelLoader):
    """Class for loading SigLIP models."""

    def _load_model(
        self,
        config: AnyModelConfig,
        submodel_type: Optional[SubModelType] = None,
    ) -> AnyModel:
        if submodel_type is not None:
            raise ValueError("Unexpected submodel requested for LLaVA OneVision model.")

        model_path = Path(config.path)
        model = SiglipVisionModel.from_pretrained(model_path, local_files_only=True, torch_dtype=self._torch_dtype)
        return model

View on GitHub (pinned to 0b6a024f2f)

Solutions

  1. Call load_model for SigLIP models without a submodel_type (pass None).
  2. Load the vision encoder as a whole model; get text generation parts from the parent LLaVA model's own loader.
  3. Check model type in your dispatch code before passing submodel_type.

Example fix

// before
model = loader.load_model(config, submodel_type=SubModelType.TextEncoder)
// after
model = loader.load_model(config, submodel_type=None)
Defensive patterns

Strategy: validation

Validate before calling

if model_type is ModelType.SigLIP and submodel_type is not None:
    raise ValueError("SigLIP models take no submodel_type")

Type guard

def takes_submodel(model_type: ModelType) -> bool:
    return model_type in {ModelType.Main, ModelType.ONNX}

Try / catch

try:
    model = loader.load_model(config, submodel_type=None)
except ValueError as e:
    logger.error("SigLIP load failed: %s", e)
    raise

Prevention

When it happens

Trigger: Requesting any SubModelType (e.g. TextEncoder, Tokenizer) when loading a LLaVA OneVision / SigLIP model via ModelLoaderRegistry.

Common situations: Code written for main-pipeline models (which use submodel_type) reused against a SigLIP model; a pipeline submodel dispatcher routing a request to the wrong loader.

Related errors


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