{"record":{"id":"e64381fb954c007a","repo":"Comfy-Org/ComfyUI","slug":"total-storyboard-duration-total-storyboard-durat","errorCode":null,"errorMessage":"Total storyboard duration ({total_storyboard_duration}s) must equal the global duration ({duration}s).","messagePattern":"Total storyboard duration \\((.+?)s\\) must equal the global duration \\((.+?)s\\)\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"comfy_api_nodes/nodes_kling.py","lineNumber":730,"sourceCode":"        multi_prompt_list = None\n        if stories_enabled:\n            count = int(storyboards[\"storyboards\"].split()[0])\n            multi_shot = True\n            multi_prompt_list = []\n            for i in range(1, count + 1):\n                sb_prompt = storyboards[f\"storyboard_{i}_prompt\"]\n                sb_duration = storyboards[f\"storyboard_{i}_duration\"]\n                validate_string(sb_prompt, field_name=f\"storyboard_{i}_prompt\", min_length=1, max_length=512)\n                multi_prompt_list.append(\n                    MultiPromptEntry(\n                        index=i,\n                        prompt=sb_prompt,\n                        duration=str(sb_duration),\n                    )\n                )\n            total_storyboard_duration = sum(int(e.duration) for e in multi_prompt_list)\n            if total_storyboard_duration != duration:\n                raise ValueError(\n                    f\"Total storyboard duration ({total_storyboard_duration}s) \"\n                    f\"must equal the global duration ({duration}s).\"\n                )\n\n        if resolution == \"4k\":\n            mode = \"4k\"\n        elif resolution == \"1080p\":\n            mode = \"pro\"\n        else:\n            mode = \"std\"\n        response = await sync_op(\n            cls,\n            ApiEndpoint(path=\"/proxy/kling/v1/videos/omni-video\", method=\"POST\"),\n            response_model=TaskStatusResponse,\n            data=OmniProText2VideoRequest(\n                model_name=model_name,\n                prompt=prompt,\n                aspect_ratio=aspect_ratio,","sourceCodeStart":712,"sourceCodeEnd":748,"githubUrl":"https://github.com/Comfy-Org/ComfyUI/blob/1c6d8d45b3693bfbb32385b410d813a7fd6be216/comfy_api_nodes/nodes_kling.py#L712-L748","documentation":"Client-side consistency check after building the multi-prompt storyboard list: the sum of all per-storyboard durations must exactly equal the node's global duration parameter. Any mismatch (e.g. 3+3+5 storyboards vs duration=10) raises with both totals in the message. Prevents sending Kling a multi_prompt list whose durations disagree with the top-level duration.","triggerScenarios":"Editing storyboard durations without re-totaling the global duration input; adding/removing a storyboard slot; unit confusion (seconds vs. frames) in programmatic runs.","commonSituations":"Iterative storyboard editing; copied workflows with per-slot durations that don't match the copied global duration; fractional durations truncated by int().","solutions":["Make the storyboard slot durations sum exactly to the global duration (message shows both numbers)","Adjust the global duration input to match the sum, or trim a slot","Compute the global duration programmatically from the slots when driving the node via API"],"exampleFix":"// before\nduration = 10\nstoryboards = {\"storyboards\": \"3 shots\", \"storyboard_1_duration\": 5, \"storyboard_2_duration\": 5, \"storyboard_3_duration\": 5}  # sum 15 != 10\n\n// after\nduration = 15  # equals 5+5+5","handlingStrategy":"validation","validationCode":"def storyboard_total_valid(storyboards: dict, duration: int, count: int) -> bool:\n    total = sum(int(storyboards[f\"storyboard_{i}_duration\"]) for i in range(1, count + 1))\n    return total == duration\n\nassert storyboard_total_valid(storyboards, duration, count)","typeGuard":"def durations_consistent(storyboards: dict, duration: int) -> bool:\n    keys = [k for k in storyboards if k.endswith(\"_duration\")]\n    return sum(int(storyboards[k]) for k in keys) == duration","tryCatchPattern":"try:\n    out = await kling_t2v_node(model_name=model, duration=duration, storyboards=storyboards, ...)\nexcept ValueError as e:\n    if \"must equal the global duration\" in str(e):\n        fixed = sum(int(storyboards[k]) for k in storyboards if k.endswith(\"_duration\"))\n        out = await kling_t2v_node(model_name=model, duration=fixed, storyboards=storyboards, ...)\n    else:\n        raise","preventionTips":["Derive the global duration from the slot sum when driving the node programmatically","After editing any storyboard duration, re-total before running","Use whole-second slot durations — the check compares int values exactly"],"tags":["kling","storyboards","duration","validation","pre-flight"],"backgroundTag":null,"analyzedSha":"1c6d8d45b3693bfbb32385b410d813a7fd6be216","analyzedAt":"2026-08-14T19:37:18.893Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}