invoke-ai/InvokeAI · error · ValueError

cfg_scale must be greater than 1

Error message

cfg_scale must be greater than 1

What it means

The DenoiseLatents invocation validates that every classifier-free-guidance scale value is >= 1 via a pydantic field_validator. CFG below 1 would invert the guidance direction, which InvokeAI considers invalid, so a single float below 1 raises this ValueError at model validation time.

Source

Thrown at invokeai/app/invocations/denoise_latents.py:245

        default=None,
        description=FieldDescriptions.latents,
        input=Input.Connection,
        ui_order=4,
    )
    denoise_mask: Optional[DenoiseMaskField] = InputField(
        default=None,
        description=FieldDescriptions.denoise_mask,
        input=Input.Connection,
        ui_order=8,
    )

    @field_validator("cfg_scale")
    def ge_one(cls, v: Union[List[float], float]) -> Union[List[float], float]:
        """validate that all cfg_scale values are >= 1"""
        if isinstance(v, list):
            for i in v:
                if i < 1:
                    raise ValueError("cfg_scale must be greater than 1")
        else:
            if v < 1:
                raise ValueError("cfg_scale must be greater than 1")
        return v

    @staticmethod
    def _get_text_embeddings_and_masks(
        cond_list: list[ConditioningField],
        context: InvocationContext,
        device: torch.device,
        dtype: torch.dtype,
    ) -> tuple[Union[list[BasicConditioningInfo], list[SDXLConditioningInfo]], list[Optional[torch.Tensor]]]:
        """Get the text embeddings and masks from the input conditioning fields."""
        text_embeddings: Union[list[BasicConditioningInfo], list[SDXLConditioningInfo]] = []
        text_embeddings_masks: list[Optional[torch.Tensor]] = []
        for cond in cond_list:
            cond_data = context.conditioning.load(cond.conditioning_name)
            text_embeddings.append(cond_data.conditionings[0].to(device=device, dtype=dtype))

View on GitHub (pinned to 0b6a024f2f)

Solutions

  1. Raise cfg_scale to a value >= 1 (typically 6-12 for SD)
  2. Check each element if passing a list — remove or raise any element below 1
  3. If you truly want unguided output, set cfg_scale = 1 (equivalent to no CFG) rather than < 1

Example fix

// before
DenoiseLatents(cfg_scale=0.75, ...)
// after
DenoiseLatents(cfg_scale=1.0, ...)  # or higher, e.g. 7.5
Defensive patterns

Strategy: validation

Validate before calling

values = cfg_scale if isinstance(cfg_scale, list) else [cfg_scale]
if any(v < 1 for v in values):
    raise ValueError("all cfg_scale values must be >= 1")

Type guard

def is_valid_cfg(cfg: object) -> bool:
    if isinstance(cfg, list):
        return all(isinstance(v, (int, float)) and v >= 1 for v in cfg)
    return isinstance(cfg, (int, float)) and cfg >= 1

Try / catch

try:
    denoise = DenoiseLatents(cfg_scale=cfg, ...)
except pydantic.ValidationError as e:
    cfg = max(cfg, 1.0)
    denoise = DenoiseLatents(cfg_scale=cfg, ...)

Prevention

When it happens

Trigger: Constructing a DenoiseLatents with `cfg_scale` < 1 as a plain float; passing a list of cfg_scale values where any single element is < 1 (list branch at this line).

Common situations: Users experimenting with negative/low CFG borrowed from other tools (some samplers allow cfg<1); API clients submitting per-step CFG lists where one entry is wrong; UI defaults carried over from libraries that permit cfg 0.x.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


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