invoke-ai/InvokeAI · error · ValueError

There are no submodels in an IP-Adapter model.

Error message

There are no submodels in an IP-Adapter model.

What it means

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.

Source

Thrown at invokeai/backend/model_manager/load/model_loaders/ip_adapter.py:27

from invokeai.backend.ip_adapter.ip_adapter import build_ip_adapter
from invokeai.backend.model_manager.configs.factory import AnyModelConfig
from invokeai.backend.model_manager.load import ModelLoader, ModelLoaderRegistry
from invokeai.backend.model_manager.taxonomy import AnyModel, BaseModelType, ModelFormat, ModelType, SubModelType
from invokeai.backend.raw_model import RawModel


@ModelLoaderRegistry.register(base=BaseModelType.Any, type=ModelType.IPAdapter, format=ModelFormat.InvokeAI)
@ModelLoaderRegistry.register(base=BaseModelType.Any, type=ModelType.IPAdapter, format=ModelFormat.Checkpoint)
class IPAdapterInvokeAILoader(ModelLoader):
    """Class to load IP Adapter diffusers models."""

    def _load_model(
        self,
        config: AnyModelConfig,
        submodel_type: Optional[SubModelType] = None,
    ) -> AnyModel:
        if submodel_type is not None:
            raise ValueError("There are no submodels in an IP-Adapter model.")
        model_path = Path(config.path)
        model: RawModel = build_ip_adapter(
            ip_adapter_ckpt_path=model_path,
            device=torch.device("cpu"),
            dtype=self._torch_dtype,
        )
        return model

View on GitHub (pinned to 0b6a024f2f)

Solutions

  1. Call _load_model with submodel_type=None (the default) for IP-Adapter models.
  2. Update generic load helpers to skip submodel_type for ModelType.IPAdapter records.
  3. Access specific IP-Adapter internals from the returned model object instead of requesting submodels.

Example fix

// before
adapter = loader._load_model(cfg, SubModelType.Transformer)
// after
adapter = loader._load_model(cfg, None)
Defensive patterns

Strategy: type-guard

Validate before calling

from invokeai.backend.model_manager import ModelType
if config.type == ModelType.IPAdapter and submodel_type is not None:
    raise ValueError("IP-Adapter models take no submodel_type")

Type guard

def ip_adapter_accepts(submodel_type) -> bool:
    return submodel_type is None

Try / catch

try:
    adapter = loader._load_model(cfg, submodel_type)
except ValueError as e:
    if "no submodels in an IP-Adapter" in str(e):
        adapter = loader._load_model(cfg, None)
    else:
        raise

Prevention

When it happens

Trigger: Calling _load_model with any non-None submodel_type (Transformer, VAE, etc.) for an IP-Adapter model.

Common situations: Generic loading loops that always pass a submodel_type for ModelType records; copying pipeline-loading code and applying it to IP-Adapter loads.

Related errors


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