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
- Only pass ConditioningMode.Positive or ConditioningMode.Negative.
- If you added a new mode, extend the if/elif chain in to_unet_kwargs to handle it.
- Rebuild conditioning data objects rather than unpickling stale cached ones from older versions.
- 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
- Only construct ConditioningMode via the enum, never raw strings
- Avoid caching/pickling conditioning data across library versions
- Extend to_unet_kwargs when adding new enum members
- Update InvokeAI if this fires in stock workflows
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
- Invalid mode selected
- Unexpected control_input type: ${type(control_input)}
- Unexpected T2I-Adapter base model type: '${t2i_adapter_model
- 'latents' or 'noise' must be provided!
- Incompatible 'noise' and 'latents' shapes: ${latents.shape=}
AI-assisted analysis of invoke-ai/InvokeAI@0b6a024f2f (2026-08-29).
Data as JSON: /api/errors/0fa835a1c9b0cdbd.
Report an issue: GitHub.