{"record":{"id":"9fd8fd1052ba1be9","repo":"invoke-ai/InvokeAI","slug":"unexpected-submodel-requested-for-llava-onevision","errorCode":null,"errorMessage":"Unexpected submodel requested for LLaVA OneVision model.","messagePattern":"Unexpected submodel requested for LLaVA OneVision model\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"invokeai/backend/model_manager/load/model_loaders/llava_onevision.py","lineNumber":22,"sourceCode":"from transformers import LlavaOnevisionForConditionalGeneration\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.LlavaOnevision, format=ModelFormat.Diffusers)\nclass LlavaOnevisionModelLoader(ModelLoader):\n    \"\"\"Class for loading LLaVA Onevision VLLM 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 = LlavaOnevisionForConditionalGeneration.from_pretrained(\n            model_path, local_files_only=True, torch_dtype=self._torch_dtype\n        )\n        assert isinstance(model, LlavaOnevisionForConditionalGeneration)\n        return model\n","sourceCodeStart":4,"sourceCodeEnd":30,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/backend/model_manager/load/model_loaders/llava_onevision.py#L4-L30","documentation":"This ValueError is thrown by the LLaVA OneVision loader when _load_model receives a non-None submodel_type. Unlike diffusion models, LLaVA OneVision is loaded as a single monolithic model (LlavaOnevisionForConditionalGeneration) with no tokenizer/text-encoder/VAE submodel split, so any submodel request indicates a routing mistake.","triggerScenarios":"Calling the loader (or ModelManager load) for a LLaVA OneVision model key with submodel_type set to Tokenizer, TextEncoder, Vae, etc.; generic code paths that always pass a SubModelType for every model family.","commonSituations":"Porting code written for diffusion models (which require submodel_type) to LLaVA OneVision; a UI or pipeline enumerating submodels for a multimodal model; model-manager records created with submodel entries for a single-file model.","solutions":["Load LLaVA OneVision with submodel_type=None (or via the standard whole-model load API) rather than requesting a submodel.","Remove any submodel-specific calls (tokenizer/text-encoder) for this model — obtain the tokenizer via model.get_tokenizer() or the transformers pipeline instead.","Check that the model key you are loading actually points to the LLaVA OneVision entry and not a diffusion model record.","Update InvokeAI if a newer version splits the model into submodels."],"exampleFix":"// before\nenc = loader._load_model(config, SubModelType.TextEncoder)  # raises\n// after\nmodel = loader._load_model(config, submodel_type=None)  # single-file model\ntokenizer = model.get_tokenizer()  # tokenizer comes from the model itself","handlingStrategy":"validation","validationCode":"if submodel_type is not None:\n    raise ValueError(\"LLaVA OneVision has no submodels; load it with submodel_type=None\")","typeGuard":"def is_whole_model_load(st: Optional[SubModelType]) -> bool:\n    return st is None","tryCatchPattern":"try:\n    model = loader._load_model(config, submodel_type)\nexcept ValueError as e:\n    if 'Unexpected submodel requested for LLaVA' in str(e):\n        model = loader._load_model(config, submodel_type=None)\n    else:\n        raise","preventionTips":["Remember LLaVA OneVision is a single-file multimodal model — always load with submodel_type=None.","Get tokenizers/processors from the loaded model object, not via submodel requests.","Do not reuse diffusion-model loading loops for multimodal models.","Route loads through ModelManager so family-specific behavior is handled for you."],"tags":["python","valueerror","model-loader","invokeai","llava","multimodal"],"backgroundTag":"unsupported-submodel-type","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}