ComfyUI Node
Morpheus Storyboard π
Writes a whole Morpheus storyboard with a local LLM: one MiniMax-format prompt per shot, keyframes consumed as shot boundaries, continuity carried between shots by an end-state line. Outputs the chain the video sampler takes.
Morpheus Storyboard π
- config
- keyframes
- shots
- shots
- prompts
- style
- report
- script
βbriefββΊ
βshot_count0βΊ
βdurations5.17βΊ
βanchorcontinuousβΊ
βlinkcontinueβΊ
βseed0βΊ
βcachediskβΊ
βunload_after_rununload after runβΊ
βscriptautoβΊ
βlive_previewtrueβΊ
βbeatsββΊ
βprompt_overridesββΊ
βstyleββΊ
βlinksβΊ
βstyle_systemββΊ
βshot_system_morphββΊ
βshot_system_startββΊ
βshot_system_textββΊ
βscript_systemββΊ
CategoryKinburg-Nodes/Bestiary/Morpheus
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| config | KINBURG_LLM_CONFIG | A 'Local LLM Settings (GGUF)' bundle. Attach a 'Vision Settings (GGUF)' (mmproj) too if you wire keyframes β without it the images are ignored and the shots are written from text alone. | |
| brief | STRING | The idea, in your own words: what happens across the whole sequence. One or two sentences is enough β the style bible and the per-shot prompts are written from it. | |
| shot_count | INT | 00β64 | How many shots to write. 0 = derive it from the keyframes (K frames β K-1 bridging shots). Set it higher than K-1 to keep going on text alone after the keyframes run out, or use it on its own with no keyframes at all. |
| durations | STRING | 5.17 | Seconds per shot: one value for all of them, or a comma list ('5.2, 6, 5.2') where the last value repeats. Each is snapped to H3's 0.71 s grid by the Dream node, and the LLM is told the snapped length so its beats cover the real duration. |
| anchor | COMBO | continuous | What a shot's FIRST frame is wired to when a keyframe exists for it: β’ continuous β only the END keyframe is wired; the shot starts from the previous shot's generated tail. Seams are exactly continuous, and the shot is still pulled to its planned keyframe by its end. Best default. β’ plan β both keyframes are wired, like doing it by hand. Tighter adherence to the storyboard, at the price of a small jump at each seam (a generated tail is never bit-identical to the re-encoded keyframe). Either way the LLM SEES both frames β this only changes what the sampler is conditioned on. |
| link | COMBO | continue | What shots with no start keyframe do: 'continue' inherits the previous shot's last frame (one flowing take), 'cut' starts fresh from text (a montage of hard cuts). |
| seed | INT | 00β18446744073709550000 | LLM seed. Deliberately NOT 'control after generate': the prompts are the sampler's cache key, so a seed that moved every run would re-sample every shot at minutes apiece. Change it to re-roll all the writing. |
| cache | COMBO | disk | Cache the LLM's answers on disk (keyed causally, like the sampler's latents), so re-running the graph doesn't rewrite prompts and invalidate finished shots. Editing one shot's beat re-rolls that shot and the ones after it, because the end-state carries forward. |
| unload_after_run | COMBO | unload after run | Free the LLM from VRAM when this node is done. Defaults to unloading because what runs next is H3 plus a 30B text encoder. |
| script | COMBO | auto | auto = before writing any shot, break the brief into ONE DIRECTION PER SHOT with a text-only call, and use those as the shots' direction. This is what stops the brief being handed to every shot whole β a shot told the entire story replays the entire story. Skipped automatically when you fill 'beats' yourself (your lines win). off = no plan. Shots then take their direction only from 'beats', their keyframes and the previous shot's end state β fine for a chain where every shot is bounded by two keyframes, thin for a text-driven one. The plan comes out on the 'script' output in exactly the format 'beats' takes: edit a line, paste it back, and only that shot onwards is rewritten. |
| live_preview | BOOLEAN | true | Stream every call to a 'Kinburg Live Log' node as it's written, one labelled block per call ('style bible', 'shot 2/4'), with the frames it was shown. Drop a Kinburg Live Log anywhere on the canvas β no wiring. On by default: writing a storyboard is minutes of otherwise silent work. |
| keyframesopt | IMAGE | Keyframes in order, as one IMAGE batch β used as SHOT BOUNDARIES left to right: frame 1 starts shot 1, frame 2 ends shot 1 and starts shot 2, and so on. Give as many or as few as you have: none (all text), one (a hard opening then free fantasy), K-1 shots' worth, or all of them. | |
| beatsopt | STRING | Optional direction, ONE LINE PER SHOT ('shot 3: he crashes through a billboard'). Lines are matched to shots by position; blank or missing lines leave that shot to the LLM. This is the main handle on a text-only chain. | |
| prompt_overridesopt | STRING | Finished prompts that BYPASS the LLM, separated by a line of three dashes (---), in shot order; an empty block keeps the LLM's version. The 'prompts' output uses the same format, so the loop is: run once, read it, fix the one shot that came out wrong, paste it back. | |
| styleopt | STRING | Skip the style-bible call and use these blocks verbatim: paste back a previous run's 'style' output (or hand-write [STYLE]: / [SCENE]: / [AUDIO BED]: / [NEGATIVE]: blocks). This is how you keep one look across several runs. | |
| shotsopt | KINBURG_MORPHEUS_SHOT | A chain to work on. Shots that already have a prompt pass through untouched β that is the 'hand-build the opening shot with Morpheus Dream and let this node write the rest' case. Shots with an EMPTY prompt are WRITTEN IN PLACE, keeping their own keyframes, length and link: that is what 'Morpheus Dream Board π' sends, and with it you can leave keyframes / durations / links / shot_count alone. shot_count then means how many extra shots to append after the chain (default none). | |
| linksopt | STRING | Per-shot override for 'link', same shape as 'durations': 'continue, cut, continue' where the last value repeats. Blank = the single 'link' setting for every shot. Use it to put a hard cut in the middle of an otherwise flowing sequence. Only matters for shots with no start keyframe β a wired frame always wins. NOTE: changing it re-writes every shot, since a shot's link decides whether its prompt may open the story. | |
| style_systemopt | STRING | Override the built-in system prompt for the style-bible call. Blank = the default, which asks for [STYLE] / [SCENE] / [AUDIO BED] / [NEGATIVE]. | |
| shot_system_morphopt | STRING | Override the system prompt used when a shot has BOTH keyframes ('describe the change that carries the first image into the second'). Blank = built-in default. All three shot prompts must ask for the same five labelled blocks β [SITUATION] / [STORYBOARD] / [CAMERA] / [AUDIO] / [END STATE] β or the answer can't be assembled. | |
| shot_system_startopt | STRING | Override the system prompt used when a shot has only its FIRST keyframe ('carry on from this state; there is no target'). Blank = built-in default. | |
| shot_system_textopt | STRING | Override the system prompt used when a shot has NO images ('invent it from the direction, and from the previous shot's end state if there is one'). Blank = built-in default. | |
| script_systemopt | STRING | Override the system prompt for the planning call. Blank = the default, which asks for one numbered line per shot, two or three concrete sentences each, ending on the state that shot must reach. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| shots | KINBURG_MORPHEUS_SHOT | The finished chain β wire it straight into 'Morpheus (Video Sampler)'. |
| prompts | STRING | Every prompt, in the same ---separated format 'prompt_overrides' takes. |
| style | STRING | The style bible, to paste into 'style' on a later run for the same look. |
| report | STRING | Per-shot table: duration, which keyframes were used, where the text came from. |
| script | STRING | The plan: one direction per shot, one line each β exactly the format 'beats' takes. Edit a line and paste it back and only that shot onwards is rewritten; paste it back unchanged and nothing is. |