{"record":{"id":"5fabaf4d55401bf7","repo":"invoke-ai/InvokeAI","slug":"cfg-scale-values-must-be-finite","errorCode":null,"errorMessage":"cfg_scale values must be finite.","messagePattern":"cfg_scale values must be finite\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"invokeai/app/invocations/krea2_denoise.py","lineNumber":106,"sourceCode":"    # CFG uses the standard formulation (uncond + cfg_scale*(cond-uncond)); cfg_scale <= 1 disables it.\n    # Krea-2-Turbo is distilled and runs with CFG disabled (cfg_scale=1.0).\n    cfg_scale: float | list[float] = InputField(default=1.0, description=FieldDescriptions.cfg_scale, title=\"CFG Scale\")\n    width: int = InputField(default=1024, gt=0, multiple_of=16, description=\"Width of the generated image.\")\n    height: int = InputField(default=1024, gt=0, multiple_of=16, description=\"Height of the generated image.\")\n    steps: int = InputField(default=8, gt=0, description=FieldDescriptions.steps)\n    seed: int = InputField(default=0, description=\"Randomness seed for reproducibility.\")\n    shift: Optional[float] = InputField(\n        default=None,\n        description=\"Override the resolution-aware timestep shift (mu). Leave unset to use the model default \"\n        \"(mu=1.15 for the distilled Turbo checkpoint).\",\n    )\n\n    @field_validator(\"cfg_scale\")\n    @classmethod\n    def validate_cfg_scale_is_finite(cls, value: float | list[float]) -> float | list[float]:\n        values = value if isinstance(value, list) else [value]\n        if not all(math.isfinite(item) for item in values):\n            raise ValueError(\"cfg_scale values must be finite.\")\n        return value\n\n    @field_validator(\"shift\")\n    @classmethod\n    def validate_shift_is_finite(cls, value: float | None) -> float | None:\n        if value is not None and not math.isfinite(value):\n            raise ValueError(\"shift must be finite.\")\n        return value\n\n    @torch.no_grad()\n    def invoke(self, context: InvocationContext) -> LatentsOutput:\n        latents = self._run_diffusion(context)\n        latents = latents.detach().to(\"cpu\")\n        name = context.tensors.save(tensor=latents)\n        return LatentsOutput.build(latents_name=name, latents=latents, seed=None)\n\n    def _prep_inpaint_mask(self, context: InvocationContext, latents: torch.Tensor) -> torch.Tensor | None:\n        if self.denoise_mask is None:","sourceCodeStart":88,"sourceCodeEnd":124,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/invocations/krea2_denoise.py#L88-L124","documentation":"The Krea2 denoise invocation is a pydantic model with a field_validator on cfg_scale that rejects any non-finite value (NaN or ±Infinity), whether cfg_scale is a single float or a list of per-step floats. Non-finite guidance scales would poison the denoising math, so validation fails at model construction time with 'cfg_scale values must be finite.'","triggerScenarios":"Constructing or deserializing a Krea2 denoise invocation (via graph submission or the API) with cfg_scale=nan, cfg_scale=float('inf'), or a list containing any NaN/inf element.","commonSituations":"Programmatic graph generation computing cfg_scale from upstream math that produced NaN; JSON payloads with 'NaN'/'Infinity' literals (Python's json accepts these by default); config interpolation bugs.","solutions":["Set cfg_scale to a finite positive float (or list of finite floats), e.g. 1.0–10.0.","Fix the upstream computation producing NaN/inf before it reaches cfg_scale.","Parse JSON with parse_constant rejecting NaN/Infinity so bad payloads fail early with a clearer message."],"exampleFix":"// before\ncfg_scale=float(\"inf\")  # or [1.0, float(\"nan\")]\n// after\ncfg_scale=7.5  # or [1.0, 7.5, 3.0]","handlingStrategy":"validation","validationCode":"import math\ndef cfg_scale_ok(v) -> bool:\n    vals = v if isinstance(v, list) else [v]\n    return all(isinstance(x, float) and math.isfinite(x) for x in vals)","typeGuard":"def is_finite_number(x: object) -> bool:\n    return isinstance(x, (int, float)) and math.isfinite(x)","tryCatchPattern":"try:\n    node = Krea2DenoiseInvocation(**params)\nexcept ValueError as e:\n    if \"cfg_scale values must be finite\" in str(e):\n        params[\"cfg_scale\"] = 7.5\n        node = Krea2DenoiseInvocation(**params)","preventionTips":["Validate cfg_scale with math.isfinite before building the graph.","Compute guidance scale with zero-division guards.","Configure JSON parsing to reject NaN/Infinity literals (json.loads(..., parse_constant=...))."],"tags":["validation","pydantic","invokeai","krea2","cfg-scale"],"backgroundTag":"non-finite-value","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}