{"record":{"id":"ee6cf1f85a591f6b","repo":"invoke-ai/InvokeAI","slug":"there-are-no-submodels-in-an-ip-adapter-model","errorCode":null,"errorMessage":"There are no submodels in an IP-Adapter model.","messagePattern":"There are no submodels in an IP-Adapter model\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"invokeai/backend/model_manager/load/model_loaders/ip_adapter.py","lineNumber":27,"sourceCode":"from invokeai.backend.ip_adapter.ip_adapter import build_ip_adapter\nfrom invokeai.backend.model_manager.configs.factory import AnyModelConfig\nfrom invokeai.backend.model_manager.load import ModelLoader, ModelLoaderRegistry\nfrom invokeai.backend.model_manager.taxonomy import AnyModel, BaseModelType, ModelFormat, ModelType, SubModelType\nfrom invokeai.backend.raw_model import RawModel\n\n\n@ModelLoaderRegistry.register(base=BaseModelType.Any, type=ModelType.IPAdapter, format=ModelFormat.InvokeAI)\n@ModelLoaderRegistry.register(base=BaseModelType.Any, type=ModelType.IPAdapter, format=ModelFormat.Checkpoint)\nclass IPAdapterInvokeAILoader(ModelLoader):\n    \"\"\"Class to load IP Adapter diffusers 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(\"There are no submodels in an IP-Adapter model.\")\n        model_path = Path(config.path)\n        model: RawModel = build_ip_adapter(\n            ip_adapter_ckpt_path=model_path,\n            device=torch.device(\"cpu\"),\n            dtype=self._torch_dtype,\n        )\n        return model\n","sourceCodeStart":9,"sourceCodeEnd":35,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/backend/model_manager/load/model_loaders/ip_adapter.py#L9-L35","documentation":"IP-Adapter models are single-artifact raw models with no decomposable submodels, unlike main pipelines. The loader therefore inverts the usual contract: it raises if a submodel_type is provided (rather than requiring one), then loads the whole IP-Adapter checkpoint via build_ip_adapter.","triggerScenarios":"Calling _load_model with any non-None submodel_type (Transformer, VAE, etc.) for an IP-Adapter model.","commonSituations":"Generic loading loops that always pass a submodel_type for ModelType records; copying pipeline-loading code and applying it to IP-Adapter loads.","solutions":["Call _load_model with submodel_type=None (the default) for IP-Adapter models.","Update generic load helpers to skip submodel_type for ModelType.IPAdapter records.","Access specific IP-Adapter internals from the returned model object instead of requesting submodels."],"exampleFix":"// before\nadapter = loader._load_model(cfg, SubModelType.Transformer)\n// after\nadapter = loader._load_model(cfg, None)","handlingStrategy":"type-guard","validationCode":"from invokeai.backend.model_manager import ModelType\nif config.type == ModelType.IPAdapter and submodel_type is not None:\n    raise ValueError(\"IP-Adapter models take no submodel_type\")","typeGuard":"def ip_adapter_accepts(submodel_type) -> bool:\n    return submodel_type is None","tryCatchPattern":"try:\n    adapter = loader._load_model(cfg, submodel_type)\nexcept ValueError as e:\n    if \"no submodels in an IP-Adapter\" in str(e):\n        adapter = loader._load_model(cfg, None)\n    else:\n        raise","preventionTips":["Branch on ModelType before calling loaders: pass submodel_type only for Main models.","Encapsulate per-model-type calling conventions in a single dispatch helper.","Test generic loading loops against every ModelType."],"tags":["api-misuse","ip-adapter","model-loading"],"backgroundTag":"unexpected-argument","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}