Nodes/闲兔 Qwen Image 2.1 工作台/闲兔|故事分镜导演台
ComfyUI Node

闲兔|故事分镜导演台

A shot list that compiles into prompts, not pictures

By xiantuhenlan·Created 21 days ago·Updated a day ago· 5
闲兔|故事分镜导演台
  • 模型接口
  • positive
  • negative
  • 当前分镜
  • 批量分镜
  • 完整分镜
  • 资产分镜
  • 视频分镜
◄storyboard_json►
◄active_shot_id►
◄selection_mode▾►

The pitch for this node is a whole pre-production pipeline: paste a story, let a local LLM break it into shots, then render them one at a time on a consistent set of characters, scenes and props. The node itself does none of that. It's a compiler: storyboard JSON in, seven strings out, no model loading, no sampling, no files written. The author says so in the node description - 本节点不加载模型 - and the source agrees, which makes it easy to debug and easy to be disappointed by if you expected a renderer.

Where it fits

The storyboard JSON is a project object plus a list of shots (max 500, unique IDs, up to 16 reference assets per shot) that the panel on the node edits. Generation of that JSON is a separate button: the pack's backend route calls a local or online LLM and hands you a structured board with characters, scenes, props and per-shot prompts. From then on, the director is how that board gets into the graph.

That's a deliberate design choice, and I think it's the right one. A shot list is data with a lifetime longer than one generation - you want to edit shot 6's prompt without re-running an LLM, and you want the same board to drive an image pass today and a video pass tomorrow. Compiling it into prompt strings at execution time gives you exactly that.

Inputs

storyboard_json is the whole board as a string - the panel keeps it on the node, so your project rides along with the workflow file (assets are stored as filename/subfolder/type records, not pixels, which is why a 500-shot board fits under the 2 MiB sanity cap).

active_shot_id picks the current shot; if it matches nothing, the compiler falls back to the first. selection_mode (当前分镜 / 勾选分镜 / 从当前开始) decides what the batch output contains - and note that 勾选分镜 with nothing ticked quietly falls back to the current shot rather than erroring, so a "why did my batch render one clip" moment is almost always an unticked list.

There's one optional input, 模型接口 of type STORY_MODEL_CONFIG, with the author's tooltip telling you to connect 故事模型与 LoRA. Connect it and... the compiler drops it (del 模型接口 in the source). Its real job is signalling: the panel reads it to decide whether the board-generation call should go to your external GGUF through that node's config instead of an online provider. It changes who writes the shot list, not what this node does at run time.

Outputs, and what wires where

positive and negative are the ones you'll use 90% of the time: project-level global positive + visual style + shot prompt, and global negative + shot negative, joined with newlines. Straight into a CLIP Text Encode for your image model.

The rest are JSON, and they're the reason this node exists:

  • 当前分镜 - the active shot, enriched with its resolved image tasks. Depending on the shot's video mode you get a 起始图 task, or 首帧/尾帧 pair, or one task per reference image; each carries a prompt, an image-generation mode, an engine label (defaults to Qwen Image 2.1) and the asset refs it needs.
  • 批量分镜 - the queue for the mode you selected. This is what you iterate over.
  • 完整分镜 - everything, for archiving or for a downstream node that wants the whole board.
  • 资产分镜 - a shot-shaped task whose job is generating a character/scene/prop sheet rather than a shot. If you've set up asset entries with their own image prompts, this is how you render the reference art before the shots that depend on it. That ordering - assets first, then shots referencing them - is the practical answer to character consistency at this scale, and it's the same build-the-plate-first advice the character-consistency literature lands on.
  • 视频分镜 - the same shot tagged route: video, with a video_prompt that concatenates action, camera movement, dialogue and the positive prompt. That's a sensible ordering for video models that reward explicit camera language.

IS_CHANGED hashes the board, the active shot and the selection mode, so every edit in the panel marks the graph dirty - expect re-runs after you nudge a prompt, which is what you want.

Install

Same pack, same drill:

cd ComfyUI/custom_nodes
git clone https://github.com/xiantuhenlan/ComfyUI-Xiantu-QwenImage21-Workbench.git
pip install -r ComfyUI-Xiantu-QwenImage21-Workbench/requirements.txt

Restart and hard-refresh the browser; the director's panel is a frontend extension and a stale cache looks exactly like a broken install. Nothing extra to download for this node - but if you want the "generate the shot list from a story" button, you need a story model: either the pack's 闲兔|故事模型与 LoRA node plus the author's separate XiantuAIToolkit runtime, or an OpenAI-compatible endpoint.

Errors you'll actually hit

分镜数据为空 means the widget is empty; 分镜数据超过 2 MiB 限制 means you pasted something absurd into it; 分镜 ID 重复:... means two shots share an ID, which is what happens if you hand-edit the JSON or merge boards from two projects. 第 N 个分镜最多支持 16 张参考图 is the hard cap. All of these surface at validation, before your sampler starts, which is the good kind of failure.

Category闲兔/故事分镜

Inputs (4)

NameTypeDefaultDescription
storyboard_jsonSTRING—
active_shot_idSTRING—
selection_modeCOMBO3 options: 当前分镜, 勾选分镜, 从当前开始
模型接口optSTORY_MODEL_CONFIG连接“闲兔|故事模型与 LoRA”节点。

Outputs (7)

NameTypeDescription
positiveSTRING—
negativeSTRING—
当前分镜STRING—
批量分镜STRING—
完整分镜STRING—
资产分镜STRING—
视频分镜STRING—