Nodes/ComfyUI_MieNodes/MiniMax H3 分镜资产生成器 · Storyboard Asset Generator 🐑
ComfyUI Node

MiniMax H3 分镜资产生成器 · Storyboard Asset Generator 🐑

Shot lists you can argue with, not just generate

By MieMieeeee·Created 2 years ago·Updated 9 days ago· 279
MiniMax H3 分镜资产生成器 · Storyboard Asset Generator 🐑
  • llm_service_connector
  • storyboard
  • storyboard_json
  • storyboard_text
  • shot_count
◄name新分镜►
◄concept角色2动作:双手拿着苹果递向角色1。 角色2:吃苹果吗? 角色1:不吃。►
◄character_count2►
◄character_settings角色1:角色1 | 画面内 | 左侧 | adult male 角色2:角色2 | 画面内 | 右侧 | adult female►
◄shot_count1►
◄target_duration_seconds20►
◄camera_framing▾►
◄camera_movement▾►
◄camera_perspective▾►
◄languagezh►
◄seed0►
◄lookNatural lighting, coherent visual style.►
◄setting►
◄constraints►
◄continuation_overlap_frames22►
◄temperature0.20►
◄max_tokens8192►
◄timeout120►
◄audio_modegenerated►

Every long AI video starts the same way: you queue eight clips, wait, and discover the story made no sense. MiniMaxH3StoryboardGenerator makes you look at the plan first. Give it a concept and a target shot count and one LLM call returns a structured storyboard - beats, shot sizes, camera moves, transitions, durations - as a table you can read and a JSON array your tooling can chew.

It's a planning artifact and stays one. This node doesn't write H3 prompts and doesn't touch the Production Plan; that's MiniMaxH3LoopPromptGenerator's job further down the graph.

What you set

  • concept - the whole story in a paragraph. Blank falls back to a built-in "short cinematic moment with a protagonist" default: useful for seeing the output shape before committing a real idea.
  • shot_count - what you're asking for, 1 to 20. It's a request, not a contract: read the third output pin for the real number.
  • style - how beats get arranged, and the dropdown that changes the board most: narrative_arc (three-act), parallel_montage, rhythmic_cuts, single_continuous for the one-take look, character_study.
  • genre - a 22-entry taxonomy shared with the pack's H3 prompt generator, so the advice here and downstream don't contradict each other.
  • output_format - how storyboard_text renders: table (Markdown table), detailed (multi-field per shot), minimal (id plus description).

language picks the prose language (en / zh; English by default because H3 behaves better with it). Advanced knobs are temperature at 0.8 - a storyboard is the one place in this pipeline where you want creative layout, not obedient formatting - plus max_tokens and timeout.

What comes out

  • storyboard_text - the rendered board. This is the one humans read and edit.
  • shots_json - the normalized array: shot_type, camera_movement, transition_in, duration_seconds, narrative_beat, plus characters, props, notes. Shot types come from a fixed whitelist (extreme_wide_shot through extreme_close_up, over_the_shoulder, point_of_view, two_shot, insert_shot, …) with unknown values falling back to medium_shot, durations clamped, ids uniqued. So the JSON is safe to key on, which is more than you can say for most model output.
  • shot_count (INT) - what the board actually contains.

One wrinkle before you wire it: the docs describe feeding shots_json into the Loop Plan Generator, but the loop node's only free-text input is user_input - there's no shot-list socket on it. The handoff is text: read storyboard_text, edit what you disagree with, paste it into user_input (or the enhancer's draft). The board is your thinking space; the loop node turns prose into plan-shaped prompts.

H3 timing note: duration_seconds is the field to respect. H3 generates 4–15s per call and the loop node caps every scene at 14s, so a board planning eight 20-second shots is a board you'll be re-cutting.

How it behaves when the model misbehaves

It asks for a JSON array in one call, tolerates a bare array, a ```json fence or prose around it, and strips a leading <think> block from a reasoning model. If the array still won't parse it does one corrective retry - a "your last reply was malformed" turn - then fails the node outright. No partial boards, which is the behaviour you want when a bad board would otherwise become twelve paid generations.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/MieMieeeee/ComfyUI-MieNodes
cd ComfyUI-MieNodes && pip install -r requirements.txt

Or find ComfyUI_MieNodes in ComfyUI Manager - it's on the Comfy Registry under publisher mie. No models, no heavy dependencies: just a Set*LLMServiceConnector with a working key (or a local Ollama endpoint, which costs nothing per call and handles this job fine).

Where people get burned

  • A local 8B model that won't emit JSON. The contract is a JSON array, and the failure is a hard fail, not a shrug. Keep getting "unparseable after 2 attempts" on a small local model? Switch that one node to something bigger - it's the least frequent call in the pipeline, so it's the cheapest place to rent quality.
  • Reasoning models and max_tokens. The 8192 default already assumes some models burn budget thinking before they answer (the source of this repo notes exactly that failure: HTTP 200, empty content). If you drop it low "to save money", that's what you'll get.
  • shot_count isn't honoured to the digit. Models round, merge and pad. Trust the output pin, not the number you typed.
  • It plans, it doesn't prompt. No dialogue is locked verbatim, no <d> blocks are emitted, no continuation rules are written. If what you want is a shootable H3 plan, this is step one of two - the loop node is step two.
Category🐑 MieNodes/🐑 Prompt Generator

Inputs (20)

NameTypeDefaultDescription
llm_service_connectorLLMServiceConnector—
nameSTRING新分镜分镜资产名,可直接保存入库
conceptSTRING角色2动作:双手拿着苹果递向角色1。 角色2:吃苹果吗? 角色1:不吃。按时间顺序,每行一个事件:角色1:台词 / 角色1动作:动作 / 角色1入场:动作 / 角色1离场:动作;可加[zh]或[en]。原文逐字锁定。
character_countINT21–8—
character_settingsSTRING角色1:角色1 | 画面内 | 左侧 | adult male 角色2:角色2 | 画面内 | 右侧 | adult female每角色一行:角色1:名字 | 画面内/画外/稍后入场 | 左侧/右侧/中间/无 | 声音要求。数量须与角色数一致;留空使用编号角色。外观来自后续角色资产。
shot_countINT11–20Loop生成片段数。约14秒内能装下就填1:每多一段就多一次续生成,单人独占台词的续生成片段是已知崩角色形态。一个场景内的切镜写在constraints中,由camera_cuts编译为同一H3提示词的[Shot 1]/[Shot 2]。
target_duration_secondsFLOAT201–600目标交付总时长;按H3帧网格分配并计入续接裁剪,实际值在预览中显示。过短会报错,不删减台词。
camera_framingCOMBO5 options: medium_shot, two_shot, medium_close_up, close_up, wide_shot
camera_movementCOMBO2 options: locked, gentle_follow
camera_perspectiveCOMBO2 options: observer, first_person
languageCOMBOzh2 options: zh, en
seedINT00–18446744073709550000—
lookoptSTRINGNatural lighting, coherent visual style.—
settingoptSTRING人物位置与情境;具体环境可由V3的可选场景资产提供。
constraintsoptSTRING导演约束,原样保留。例如:只拍两人对话,不把台词中的回忆拍出来。
continuation_overlap_framesoptINT220–120需与Loop续接重叠帧一致;独立片段不裁剪时设0。
temperatureoptFLOAT0.200–2—
max_tokensoptINT8192256–32768—
timeoutoptCOMBO1204 options: 30, 60, 120, 300
audio_modeoptCOMBOgeneratedgenerated:H3自选声音;reference:V3中每个角色都接带参考音频的人物资产,画外角色仅使用声音。最多3个角色;Asset→Slots音频需接到H3参考音频输入。

Outputs (4)

NameTypeDescription
storyboardMIE_STORYBOARD—
storyboard_jsonSTRING—
storyboard_textSTRING—
shot_countINT—