invoke-ai/InvokeAI · error · ValueError

Unsupported IP-Adapter base type: '{ip_adapter_info.base}'.

Error message

Unsupported IP-Adapter base type: '{ip_adapter_info.base}'.

What it means

The IP-Adapter invocation throws this ValueError during invoke() when the selected method is 'style' but the IP-Adapter model's base model type (ip_adapter_info.base) is neither 'sd-1' nor 'sdxl'. The 'style' method works by targeting specific attention blocks of the underlying UNet, and InvokeAI only knows the correct block names for SD1.5 and SDXL architectures. Any other base (e.g. SD2, SDXL-Refiner, Flux) has different block naming, so the invocation refuses to proceed rather than silently targeting wrong blocks.

Source

Thrown at invokeai/app/invocations/ip_adapter.py:144

        assert isinstance(ip_adapter_info, (IPAdapter_InvokeAI_Config_Base, IPAdapter_Checkpoint_Config_Base))

        if isinstance(ip_adapter_info, IPAdapter_InvokeAI_Config_Base):
            image_encoder_model_id = ip_adapter_info.image_encoder_model_id
            image_encoder_model_name = image_encoder_model_id.split("/")[-1].strip()
        else:
            image_encoder_starter_model = CLIP_VISION_MODEL_MAP[self.clip_vision_model]
            image_encoder_model_id = image_encoder_starter_model.source
            image_encoder_model_name = image_encoder_starter_model.name

        image_encoder_model = self.get_clip_image_encoder(context, image_encoder_model_id, image_encoder_model_name)

        if self.method == "style":
            if ip_adapter_info.base == "sd-1":
                target_blocks = ["up_blocks.1"]
            elif ip_adapter_info.base == "sdxl":
                target_blocks = ["up_blocks.0.attentions.1"]
            else:
                raise ValueError(f"Unsupported IP-Adapter base type: '{ip_adapter_info.base}'.")
        elif self.method == "composition":
            if ip_adapter_info.base == "sd-1":
                target_blocks = ["down_blocks.2", "mid_block"]
            elif ip_adapter_info.base == "sdxl":
                target_blocks = ["down_blocks.2.attentions.1"]
            else:
                raise ValueError(f"Unsupported IP-Adapter base type: '{ip_adapter_info.base}'.")
        elif self.method == "style_precise":
            if ip_adapter_info.base == "sd-1":
                target_blocks = ["up_blocks.1", "down_blocks.2", "mid_block"]
            elif ip_adapter_info.base == "sdxl":
                target_blocks = ["up_blocks.0.attentions.1", "down_blocks.2.attentions.1"]
            else:
                raise ValueError(f"Unsupported IP-Adapter base type: '{ip_adapter_info.base}'.")
        elif self.method == "style_strong":
            if ip_adapter_info.base == "sd-1":
                target_blocks = ["up_blocks.0", "up_blocks.1", "up_blocks.2", "down_blocks.0", "down_blocks.1"]
            elif ip_adapter_info.base == "sdxl":

View on GitHub (pinned to 0b6a024f2f)

Solutions

  1. Use method='full' (or a method without base-specific block targeting) if your IP-Adapter base is not sd-1/sdxl.
  2. Re-import or edit the IP-Adapter model in the Model Manager so its base model type is StableDiffusion1 or StableDiffusionXL, matching the actual model.
  3. Swap the ip_adapter_model input to an IP-Adapter model that matches the checkpoint architecture being used (sd-1 for SD1.5, sdxl for SDXL).

Example fix

// before
IPAdapterInvocation(image=..., ip_adapter_model=sd2_ip_adapter, method='style')
// after
IPAdapterInvocation(image=..., ip_adapter_model=sd1_ip_adapter, method='style')
// or, for a non-sd-1/sdxl base:
IPAdapterInvocation(image=..., ip_adapter_model=sd2_ip_adapter, method='full')
Defensive patterns

Strategy: validation

Validate before calling

info = context.models.get_config(node.ip_adapter_model.key)
assert info.base in ("sd-1", "sdxl"), f"method='style' requires sd-1/sdxl, got {info.base}"

Type guard

def is_style_capable(base: str) -> bool:
    return base in ("sd-1", "sdxl")

Try / catch

try:
    out = invoke(ip_adapter_node)
except ValueError as e:
    if "Unsupported IP-Adapter base type" in str(e):
        node.method = "full"  # base-agnostic fallback
        out = invoke(node)

Prevention

When it happens

Trigger: Running an 'ip_adapter' invocation node with method='style' (via the workflow graph API or the canvas) whose ip_adapter_model points to an IP-Adapter model whose config's base is not BaseModelType.StableDiffusion1 ('sd-1') or StableDiffusionXL ('sdxl') — e.g. an SD2-based or mismatched IP-Adapter model.

Common situations: Selecting an IP-Adapter model that was imported with the wrong base model type in the model manager; using a workflow authored for SD1.5/SDXL with a model whose base was auto-detected incorrectly; feeding an IP-Adapter config for SD2 or another architecture into a style-method node.

Related errors


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