{"record":{"id":"e909604e497f542e","repo":"invoke-ai/InvokeAI","slug":"unexpected-submodel-requested-for-llava-onevision-e90960","errorCode":null,"errorMessage":"Unexpected submodel requested for LLaVA OneVision model.","messagePattern":"Unexpected submodel requested for LLaVA OneVision model\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"invokeai/backend/model_manager/load/model_loaders/sig_lip.py","lineNumber":22,"sourceCode":"from transformers import SiglipVisionModel\n\nfrom invokeai.backend.model_manager.configs.factory import AnyModelConfig\nfrom invokeai.backend.model_manager.load.load_default import ModelLoader\nfrom invokeai.backend.model_manager.load.model_loader_registry import ModelLoaderRegistry\nfrom invokeai.backend.model_manager.taxonomy import AnyModel, BaseModelType, ModelFormat, ModelType, SubModelType\n\n\n@ModelLoaderRegistry.register(base=BaseModelType.Any, type=ModelType.SigLIP, format=ModelFormat.Diffusers)\nclass SigLIPModelLoader(ModelLoader):\n    \"\"\"Class for loading SigLIP models.\"\"\"\n\n    def _load_model(\n        self,\n        config: AnyModelConfig,\n        submodel_type: Optional[SubModelType] = None,\n    ) -> AnyModel:\n        if submodel_type is not None:\n            raise ValueError(\"Unexpected submodel requested for LLaVA OneVision model.\")\n\n        model_path = Path(config.path)\n        model = SiglipVisionModel.from_pretrained(model_path, local_files_only=True, torch_dtype=self._torch_dtype)\n        return model\n","sourceCodeStart":4,"sourceCodeEnd":27,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/backend/model_manager/load/model_loaders/sig_lip.py#L4-L27","documentation":"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.","triggerScenarios":"Requesting any SubModelType (e.g. TextEncoder, Tokenizer) when loading a LLaVA OneVision / SigLIP model via ModelLoaderRegistry.","commonSituations":"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.","solutions":["Call load_model for SigLIP models without a submodel_type (pass None).","Load the vision encoder as a whole model; get text generation parts from the parent LLaVA model's own loader.","Check model type in your dispatch code before passing submodel_type."],"exampleFix":"// before\nmodel = loader.load_model(config, submodel_type=SubModelType.TextEncoder)\n// after\nmodel = loader.load_model(config, submodel_type=None)","handlingStrategy":"validation","validationCode":"if model_type is ModelType.SigLIP and submodel_type is not None:\n    raise ValueError(\"SigLIP models take no submodel_type\")","typeGuard":"def takes_submodel(model_type: ModelType) -> bool:\n    return model_type in {ModelType.Main, ModelType.ONNX}","tryCatchPattern":"try:\n    model = loader.load_model(config, submodel_type=None)\nexcept ValueError as e:\n    logger.error(\"SigLIP load failed: %s\", e)\n    raise","preventionTips":["Always pass submodel_type=None for whole-model types (SigLIP, Spandrel, TI, TextLLM).","Centralize loader dispatch so submodel handling is type-aware.","Read the loader's _load_model contract before generic calls."],"tags":["valueerror","submodel","siglip","model-loading"],"backgroundTag":"unsupported-submodel-type","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}