{"record":{"id":"841450aec77a241e","repo":"Comfy-Org/ComfyUI","slug":"connect-at-least-2-luma-ray-3-2-keyframe-nodes-us","errorCode":null,"errorMessage":"Connect at least 2 Luma Ray 3.2 Keyframe nodes (use Luma Ray 3.2 Image to Video for a single start/end frame).","messagePattern":"Connect at least 2 Luma Ray 3\\.2 Keyframe nodes \\(use Luma Ray 3\\.2 Image to Video for a single start/end frame\\)\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"comfy_api_nodes/nodes_luma.py","lineNumber":1235,"sourceCode":"                IO.Hidden.unique_id,\n            ],\n            is_api_node=True,\n            price_badge=_BADGE_RAY32_VIDEO,\n        )\n\n    @classmethod\n    async def execute(\n        cls,\n        prompt: str,\n        resolution: str,\n        duration: str,\n        seed: int,\n        keyframes: LumaRay32KeyframeChain | None = None,\n    ) -> IO.NodeOutput:\n        validate_string(prompt, strip_whitespace=True, min_length=1, max_length=6000)\n        items = keyframes.items if keyframes is not None else []\n        if len(items) < 2:\n            raise ValueError(\n                \"Connect at least 2 Luma Ray 3.2 Keyframe nodes \"\n                \"(use Luma Ray 3.2 Image to Video for a single start/end frame).\"\n            )\n        if len(items) > 64:\n            raise ValueError(f\"Ray 3.2 supports at most 64 keyframes; got {len(items)}.\")\n        maxframe = 120 if duration == \"5s\" else 240\n        duration_seconds = maxframe / 24  # 5.0 or 10.0\n        # Resolve each keyframe to an output-frame index, then order by position\n        # (so the user can chain keyframes in any order — the position is what places them)\n        placed: list[tuple[int, torch.Tensor]] = []\n        for item in items:\n            if item.mode == LUMA_KEYFRAME_MODE_SECONDS:\n                if item.value > duration_seconds:\n                    raise ValueError(\n                        f\"Keyframe position {item.value:g}s is past the end of the {duration} video; \"\n                        f\"use 0-{duration_seconds:g}s (or switch the keyframe to fraction mode).\"\n                    )\n                idx = round(item.value * 24)","sourceCodeStart":1217,"sourceCodeEnd":1253,"githubUrl":"https://github.com/Comfy-Org/ComfyUI/blob/1c6d8d45b3693bfbb32385b410d813a7fd6be216/comfy_api_nodes/nodes_luma.py#L1217-L1253","documentation":"Raised by the Luma Ray 3.2 keyframe video node (comfy_api_nodes/nodes_luma.py:1235) when fewer than 2 keyframe nodes are chained into its keyframes input. The keyframes API path is for multi-frame interpolation; a single start or end frame should go through the dedicated image-to-video node instead.","triggerScenarios":"Executing LumaRay32KeyframeVideoNode with zero keyframe nodes, or with exactly one LumaRay32KeyframeNode connected (keyframes=None also yields 0 items).","commonSituations":"User tests the node with a single keyframe first; chain input accidentally disconnected; misunderstanding that this node requires ≥2 anchored positions.","solutions":["Chain at least 2 Luma Ray 3.2 Keyframe nodes into the keyframes input.","For a single start/end frame, use Luma Ray 3.2 Image to Video instead (as the message says).","Verify the chain nodes actually feed the keyframes input and not an unrelated image input."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"items = keyframes.items if keyframes is not None else []\nif len(items) < 2:\n    raise ValueError(\"Connect >= 2 Ray 3.2 keyframe nodes, or use Image to Video for one frame\")","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Reserve the keyframe node for multi-position interpolation; single frames belong in image-to-video.","Count chain inputs before queueing keyframe-based workflows."],"tags":["luma","ray-3-2","keyframes","input-validation","comfy-api-nodes"],"backgroundTag":null,"analyzedSha":"1c6d8d45b3693bfbb32385b410d813a7fd6be216","analyzedAt":"2026-08-14T19:37:18.893Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}