KIE • Shot Plan Review
Fix the shot list before you pay for it
- shot_sequence_json
- total_duration
- review_notes
KIE • Script to Shot Draft gives you a shot list. It's faithful to your script, but it's still a machine's guess at durations and it hands every shot the same camera block unless you picked a rhythm. Shot Plan Review is the editing pass: it validates the JSON, lets you override it by hand, and refuses to pass a plan your video model couldn't actually generate.
No KIE call, no credits. It's a lint-and-edit step sitting between the draft and anything expensive.
The pass-through trick
The node takes the proposal on a socket and an override in a text box. The rule is simple: if edited_json is non-empty, it wins; if it's blank, the proposal passes through untouched.
So the workflow is copy, edit, paste:
- Queue once with
edited_jsonempty and read the plan (the node shows it in a panel, same as the draft node - right-click the draft node to view or copy its JSON). - Paste it into
edited_json. - Rewrite prompts, change durations, delete shots you don't want.
- Queue again - the edited version is what flows out.
Because edited_json is a plain widget, not a socket, it survives workflow saving. Your edits live in the graph.
What it will reject
The validation is the genuinely useful part, because every rule here maps to a real constraint downstream:
- The plan must be a JSON array of 1 to 6 shots - the same ceiling the storyboard renders.
- Every shot needs a non-empty
promptstring. A shot with no prompt is a paid job with no brief. - Every shot needs an integer
durationfrom 1 to 15 seconds. Not a string, not a float, not 0. Fifteen is the documented per-shot ceiling the pack enforces so your plan is portable to models like Kling Omni. - If
camerais present it must be a JSON object. It's optional; a shot with no camera block is fine.
Fail, and you get a message naming the shot number: Shot 3 needs an integer duration from 1 to 15 seconds. That's a lot better than a 400 from an API you've already paid for.
Inputs and outputs
- proposed_json - forced input, so it wants a connection. Wire it from Script to Shot Draft.
- edited_json - multiline string, optional. Tooltip, in the author's words: "Paste and edit the proposed JSON here. Leave blank to pass the proposal through."
Outputs mirror the draft node exactly: shot_sequence_json (the validated array), total_duration (INT, the summed seconds), and review_notes (a summary line you can hang off a text node).
Identical output types are the point - Shot Plan Review is a drop-in replacement for the draft node, so you can put it in the chain and everything downstream keeps working:
Script to Shot Draft → Shot Plan Review → Storyboard Contact Sheet
↘ Kling Omni (manual multi-shot)
For Kling Omni's manual multi-shot mode, keep total_duration inside the 3–15 second window the model documents. The pack's preflight checks that before uploading, so you'll get a local error instead of a rejected job.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
cd ComfyUI-KIE-Nodes-Next
pip install -r requirements.txt
Restart ComfyUI; it's under KIE Next / Studio / Direction. Pure Python - no OpenCV, no models, no key needed for this node specifically.
Gotchas
"Shot plan must be a JSON array. Check commas and quotation marks." You're in edited_json and something's malformed. The array brackets are the usual casualty after deleting a shot.
"A shot plan must contain 1 to 6 shots." Deleting down to zero, or pasting a plan from a different tool with eight shots in it.
Edits seem to be ignored. Check edited_json isn't just whitespace - the node strips it and falls back to the proposal if it's empty.
"Shot N camera must be a JSON object." You wrote "camera": "wide shot". It wants {"shot_size": "wide"}. Or drop the field entirely; nothing downstream requires it.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| proposed_json | STRING | — | |
| edited_jsonopt | STRING | Paste and edit the proposed JSON here. Leave blank to pass the proposal through. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| shot_sequence_json | STRING | — |
| total_duration | INT | — |
| review_notes | STRING | — |