Nodes/Kinburg-Nodes/Morpheus Storyboard πŸŒ™
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.

By KinburgΒ·Created 2 months agoΒ·Updated 3 days agoΒ· 1
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)

NameTypeDefaultDescription
configKINBURG_LLM_CONFIGA '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.
briefSTRINGThe 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_countINT00–64How 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.
durationsSTRING5.17Seconds 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.
anchorCOMBOcontinuousWhat 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.
linkCOMBOcontinueWhat 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).
seedINT00–18446744073709550000LLM 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.
cacheCOMBOdiskCache 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_runCOMBOunload after runFree the LLM from VRAM when this node is done. Defaults to unloading because what runs next is H3 plus a 30B text encoder.
scriptCOMBOautoauto = 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_previewBOOLEANtrueStream 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.
keyframesoptIMAGEKeyframes 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.
beatsoptSTRINGOptional 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_overridesoptSTRINGFinished 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.
styleoptSTRINGSkip 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.
shotsoptKINBURG_MORPHEUS_SHOTA 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).
linksoptSTRINGPer-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_systemoptSTRINGOverride the built-in system prompt for the style-bible call. Blank = the default, which asks for [STYLE] / [SCENE] / [AUDIO BED] / [NEGATIVE].
shot_system_morphoptSTRINGOverride 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_startoptSTRINGOverride 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_textoptSTRINGOverride 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_systemoptSTRINGOverride 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)

NameTypeDescription
shotsKINBURG_MORPHEUS_SHOTThe finished chain β€” wire it straight into 'Morpheus (Video Sampler)'.
promptsSTRINGEvery prompt, in the same ---separated format 'prompt_overrides' takes.
styleSTRINGThe style bible, to paste into 'style' on a later run for the same look.
reportSTRINGPer-shot table: duration, which keyframes were used, where the text came from.
scriptSTRINGThe 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.