Nodes/KIE.ai Nodes Next/KIE • Shot Plan Review
ComfyUI Node

KIE • Shot Plan Review

Fix the shot list before you pay for it

By felipederosilva·Created 2 months ago·Updated 3 days ago· 3
KIE • Shot Plan Review
    • shot_sequence_json
    • total_duration
    • review_notes
    ◄proposed_json—►
    ◄edited_json►

    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:

    1. Queue once with edited_json empty 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).
    2. Paste it into edited_json.
    3. Rewrite prompts, change durations, delete shots you don't want.
    4. 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 prompt string. A shot with no prompt is a paid job with no brief.
    • Every shot needs an integer duration from 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 camera is 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.

    CategoryKIE Next/Studio/Direction

    Inputs (2)

    NameTypeDefaultDescription
    proposed_jsonSTRING—
    edited_jsonoptSTRINGPaste and edit the proposed JSON here. Leave blank to pass the proposal through.

    Outputs (3)

    NameTypeDescription
    shot_sequence_jsonSTRING—
    total_durationINT—
    review_notesSTRING—