{"record":{"id":"de653df30aa7249b","repo":"invoke-ai/InvokeAI","slug":"shift-must-be-finite","errorCode":null,"errorMessage":"shift must be finite.","messagePattern":"shift must be finite\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"invokeai/app/invocations/krea2_denoise.py","lineNumber":113,"sourceCode":"    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:\n            return None\n        mask = context.tensors.load(self.denoise_mask.mask_name)\n        mask = 1.0 - mask\n        _, _, latent_height, latent_width = latents.shape\n        mask = tv_resize(\n            img=mask,\n            size=[latent_height, latent_width],","sourceCodeStart":95,"sourceCodeEnd":131,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/invocations/krea2_denoise.py#L95-L131","documentation":"A pydantic field_validator on the optional 'shift' field of the Krea2 denoise invocation rejects NaN/±Infinity. 'shift' controls the flow-matching timestep shift for Krea2 models; a non-finite shift is invalid, so the model refuses construction with 'shift must be finite.'","triggerScenarios":"Constructing/deserializing the Krea2 denoise invocation with shift=nan, shift=float('inf'), or equivalent JSON 'NaN'/'Infinity' literals; leaving a computed shift of None is fine, only explicit non-finite floats fail.","commonSituations":"Computing shift from model metadata where a missing value became NaN instead of None; hand-written API payloads containing Infinity; interpolation code dividing by zero.","solutions":["Pass a finite float (or omit/None to use the default shift), e.g. shift=3.0.","Coerce bad computed values to None instead of NaN when the shift is unknown.","Guard with math.isfinite(value) before assigning shift."],"exampleFix":"// before\nshift=float(\"nan\")  # raises\n// after\nshift=None  # use default, or e.g. shift=3.0","handlingStrategy":"validation","validationCode":"import math\ndef shift_ok(v) -> bool:\n    return v is None or (isinstance(v, (int, float)) and math.isfinite(v))","typeGuard":"def is_finite_shift(v: object) -> bool:\n    return v is None or (isinstance(v, (int, float)) and math.isfinite(v))","tryCatchPattern":"try:\n    node = Krea2DenoiseInvocation(**params)\nexcept ValueError as e:\n    if \"shift must be finite\" in str(e):\n        params[\"shift\"] = None  # fall back to default\n        node = Krea2DenoiseInvocation(**params)","preventionTips":["Convert unknown/computed-bad shifts to None rather than NaN.","Guard shift computations against division by zero.","Validate with math.isfinite before assigning the field."],"tags":["validation","pydantic","invokeai","krea2","shift"],"backgroundTag":"non-finite-value","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}