invoke-ai/InvokeAI · error · ValueError

Unexpected conditioning mode: {conditioning_mode}

Error message

Unexpected conditioning mode: {conditioning_mode}

What it means

BasicConditioningData.to_unet_kwargs dispatches on a ConditioningMode enum (Positive/Negative). If the mode value is neither — for example an unknown enum member or a corrupted/None value — the if/elif chain falls through to ValueError.

Source

Thrown at invokeai/backend/stable_diffusion/diffusion/conditioning_data.py:355

            unet_kwargs (UNetKwargs): Object which stores UNet model arguments.
            conditioning_mode (ConditioningMode): Describes which conditionings should be used.
        """
        _, _, h, w = unet_kwargs.sample.shape
        device = unet_kwargs.sample.device
        dtype = unet_kwargs.sample.dtype

        # TODO: combine regions with conditionings
        if conditioning_mode == ConditioningMode.Both:
            conditionings = [self.uncond_text, self.cond_text]
            c_regions = [self.uncond_regions, self.cond_regions]
        elif conditioning_mode == ConditioningMode.Positive:
            conditionings = [self.cond_text]
            c_regions = [self.cond_regions]
        elif conditioning_mode == ConditioningMode.Negative:
            conditionings = [self.uncond_text]
            c_regions = [self.uncond_regions]
        else:
            raise ValueError(f"Unexpected conditioning mode: {conditioning_mode}")

        encoder_hidden_states, encoder_attention_mask = self._concat_conditionings_for_batch(
            [c.embeds for c in conditionings]
        )

        unet_kwargs.encoder_hidden_states = encoder_hidden_states
        unet_kwargs.encoder_attention_mask = encoder_attention_mask

        if self.is_sdxl():
            added_cond_kwargs = dict(  # noqa: C408
                text_embeds=torch.cat([c.pooled_embeds for c in conditionings]),
                time_ids=torch.cat([c.add_time_ids for c in conditionings]),
            )

            unet_kwargs.added_cond_kwargs = added_cond_kwargs

        if any(r is not None for r in c_regions):
            tmp_regions = []

View on GitHub (pinned to 0b6a024f2f)

Solutions

  1. Only pass ConditioningMode.Positive or ConditioningMode.Negative.
  2. If you added a new mode, extend the if/elif chain in to_unet_kwargs to handle it.
  3. Rebuild conditioning data objects rather than unpickling stale cached ones from older versions.
  4. Update InvokeAI in case this is a fixed internal bug.

Example fix

// before
cond.to_unet_kwargs(unet_kwargs, conditioning_mode="both")
// after
from invokeai.backend.stable_diffusion.diffusion.conditioning_data import ConditioningMode
cond.to_unet_kwargs(unet_kwargs, ConditioningMode.Positive)
Defensive patterns

Strategy: type-guard

Validate before calling

from invokeai.backend.stable_diffusion.diffusion.conditioning_data import ConditioningMode
assert conditioning_mode in (ConditioningMode.Positive, ConditioningMode.Negative)

Type guard

def is_valid_conditioning_mode(m) -> bool:
    return isinstance(m, ConditioningMode) and m in (ConditioningMode.Positive, ConditioningMode.Negative)

Try / catch

try:
    cond.to_unet_kwargs(unet_kwargs, conditioning_mode)
except ValueError as e:
    if "Unexpected conditioning mode" in str(e):
        cond.to_unet_kwargs(unet_kwargs, ConditioningMode.Positive)
    else:
        raise

Prevention

When it happens

Trigger: Calling to_unet_kwargs with conditioning_mode set to something other than ConditioningMode.Positive or ConditioningMode.Negative, typically from run_unet or _run.

Common situations: A library bug or stale pickle/cached conditioning object carrying an out-of-range enum value; third-party extension passing a raw string or custom mode; version mismatch where ConditioningMode gained new members handled elsewhere but not here.

Related errors


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