ComfyUI Node

Cue

A 4B model on your own GPU writes the prompt, and it won't refuse you

By omervaner·Created 3 months ago·Updated about 17 hours ago· 4
Cue
  • image
  • image_last
  • ref_1
  • ref_2
  • ref_3
  • ref_4
  • ref_5
  • ref_6
  • ref_7
  • ref_8
  • ref_9
  • prompt
  • prompt_tokens
  • subjects
  • duration_seconds
  • mode
◄intent►
◄notes►
◄target▾►
◄modei2v►
◄duration_seconds5.0►
◄dialogue_languageEnglish►
◄detailauto►
◄framingauto►
◄writerhuihui_ai/qwen3-vl-abliterated:4b-instruct►
◄vision_writerhuihui_ai/qwen3-vl-abliterated:4b-instruct►
◄endpointhttp://127.0.0.1:11434►
◄seed0►
◄lockfalse►
◄label_1►
◄label_2►
◄label_3►
◄label_4►
◄label_5►
◄label_6►
◄label_7►
◄label_8►
◄label_9►
◄subjects_override►
◄result►
◄history►

The problem Cue thinks it's solving

MiniMax H3 is a strange model to prompt. It was trained on the output of MiniMax's own hosted rewriter - the thing that turns "superman saving people" into a labelled, timecoded shot plan - and that rewriter was never open-sourced. So you download 40-odd GB of weights, type a sentence into a text box, and hope. The author's own design notes say it plainly: local H3 doesn't want a normal prompt, it wants the rewriter's format.

Which leaves two options. Call a hosted LLM and paste the result, or run a small model locally and let it do the translation. Cue picks the second, and the reason is only half about format. Hosted APIs refuse things; a local abliterated Qwen3-VL doesn't, and the system prompt tells it so: when the intent is violence or an undress-and-cut-to-black scene, write it plainly. That's the mainstream shape of an LLM node in 2026 - one narrow structured job, done locally because it needs uncensored and free-per-call more than frontier prose.

How it works

Cue talks to Ollama on your machine over /api/chat at http://127.0.0.1:11434. No key, no cloud, no per-token bill. The important bit is keep_alive: 0 - the writer is unloaded the moment it answers, so it never sits in VRAM competing with your video model.

The formats aren't hardcoded. They live in templates/ as markdown files: a ## system section plus per-mode task blocks. The H3 template declares its modes and a timeline, which is why mode and duration_seconds do anything at all; Generic and Krea 2 declare neither, so they just write prose. A new target model is a new text file, never new code.

For H3 the writer answers JSON against a schema, so sections can't go missing or arrive out of order, and it plans beats before writing prose - roughly one action per 2.5 seconds, one shot per 5. A validator then checks sections, labels, timestamps and dialogue, retrying once; whatever it couldn't fix shows up behind the ⚠ button instead of in your prompt.

The inputs that matter and what comes out

You set three things. intent is the ask - a word, a line, or a whole brief - and quoted text inside it is kept verbatim as dialogue, tagged by dialogue_language. target picks the format. mode is H3-only: t2v, i2v, first+last, last, ref2v, or one of the two continuation modes.

Everything else is a dial you touch once. notes travels with every request and lives in the workflow: world, house rules, LoRA trigger words. writer and vision_writer are separate Ollama models - a text-only writer is faster for the no-picture path. duration_seconds shapes the shot plan, so a 15-second prompt is genuinely different from a 5-second one. lock freezes the result box as editable and used verbatim, no model call - how you hand-edit a 95% prompt without losing it.

For ref2v there are nine reference sockets, ref_1–ref_9, each with a matching label_N. Same label on three slots means one subject defined from three pictures; a slot labelled first frame is a frame anchor, not a character. subjects_override takes man = tall woman with red hair lines and swaps a character with no model call - point a second Prompt Deck of characters at it and you get actions × characters.

Outputs: prompt into whatever builds your H3 conditioning, prompt_tokens with the tokens unfilled, subjects, duration_seconds (link it into the Director's duration), and mode, a Director-style code like T2VA or REF2VA. Cue is an output node, so it runs standalone - iterate prompts all evening without loading a model.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/omervaner/ComfyUI-PromptDeck

No pip installs - the pack declares zero dependencies. Restart the server, not just the browser tab. Then the half people forget, because Ollama is a separate install:

ollama serve
ollama pull huihui_ai/qwen3-vl-abliterated:4b-instruct

That name is the default for both writer and vision_writer. A 2B works too, and is quicker on a laptop.

Where people get burned

Ollama isn't running. The node tells you rather than failing silently, which is more than most LLM nodes manage. Install Ollama and never start the service and that's your first hour gone.

You changed nothing, so nothing changed. The cache keys on every input: same intent, seed and notes → identical prompt, no model call. Confusing when you wanted a reroll - press ↻ or bump seed.

palette is not a model. The dropdown is scanned from templates/, so that file shows up in the list too. It's the variety palette the writer draws settings from. Pick MiniMax H3, Krea 2 or Generic.

Reference slots must line up with the Director. Slot 1 has to be its first image tile, slot 2 its second. Get that wrong and you get a beautifully written prompt describing the wrong person.

One expectation to drop at the door: this is a formatting tool, not a writer with taste. Small models drift and add things you didn't ask for. It removes the blank page; it doesn't replace having an idea.

CategoryPromptDeck

Inputs (36)

NameTypeDefaultDescription
intentSTRINGWhat should happen. A word, a line, or a brief. Quoted text is dialogue, kept verbatim. Link Prompt Deck's text here to feed it line by line.
notesSTRINGStanding notes sent with every request: world, house rules, LoRA trigger words. Saved in the workflow.
targetCOMBOTarget model. One file per model in templates/.
modeCOMBOi2vMiniMax H3 only. ref2v uses the ref slots; continuation modes write only the next action.
duration_secondsFLOAT5.00.5–60Clip length the prompt is planned for (snapped to H3's 17k+5 frame grid). Link the output to the Director's duration.
dialogue_languageSTRINGEnglishLanguage tag for spoken lines: <d>[English] ...</d>. The body stays English.
detailCOMBOautoauto = the template's default (H3 long, Krea 2 medium).
framingCOMBOautoForces the shot size. The writer must state it and keep it; the validator checks.
writerSTRINGhuihui_ai/qwen3-vl-abliterated:4b-instructOllama model that writes the prompt when no picture is involved. A text-only model is faster and better here (models ▾ lists some).
vision_writerSTRINGhuihui_ai/qwen3-vl-abliterated:4b-instructVision model used to look at pictures, and to write when the request includes a picture (i2v, first+last, last, image targets with a picture).
endpointSTRINGhttp://127.0.0.1:11434Ollama server.
seedINT00–2147483647Writer seed. ↻ rerolls; fixed keeps the same prompt on re-queue.
lockBOOLEANfalseLocked: the result box is editable and used verbatim; no model call.
imageoptIMAGEStart frame (i2v, first+last) or the picture to work from.
image_lastoptIMAGELast frame (first+last, last).
ref_1optIMAGEReference picture 1. Feeding the Director: slot 1 must be its 1th image tile.
ref_2optIMAGEReference picture 2. Feeding the Director: slot 2 must be its 2th image tile.
ref_3optIMAGEReference picture 3. Feeding the Director: slot 3 must be its 3th image tile.
ref_4optIMAGEReference picture 4. Feeding the Director: slot 4 must be its 4th image tile.
ref_5optIMAGEReference picture 5. Feeding the Director: slot 5 must be its 5th image tile.
ref_6optIMAGEReference picture 6. Feeding the Director: slot 6 must be its 6th image tile.
ref_7optIMAGEReference picture 7. Feeding the Director: slot 7 must be its 7th image tile.
ref_8optIMAGEReference picture 8. Feeding the Director: slot 8 must be its 8th image tile.
ref_9optIMAGEReference picture 9. Feeding the Director: slot 9 must be its 9th image tile.
label_1optSTRINGWhat reference 1 is: man, woman, the bar, ... Same label on several slots = one subject.
label_2optSTRINGWhat reference 2 is: man, woman, the bar, ... Same label on several slots = one subject.
label_3optSTRINGWhat reference 3 is: man, woman, the bar, ... Same label on several slots = one subject.
label_4optSTRINGWhat reference 4 is: man, woman, the bar, ... Same label on several slots = one subject.
label_5optSTRINGWhat reference 5 is: man, woman, the bar, ... Same label on several slots = one subject.
label_6optSTRINGWhat reference 6 is: man, woman, the bar, ... Same label on several slots = one subject.
label_7optSTRINGWhat reference 7 is: man, woman, the bar, ... Same label on several slots = one subject.
label_8optSTRINGWhat reference 8 is: man, woman, the bar, ... Same label on several slots = one subject.
label_9optSTRINGWhat reference 9 is: man, woman, the bar, ... Same label on several slots = one subject.
subjects_overrideoptSTRINGLines 'token = description' that replace a subject's description without a model call. Link a second Prompt Deck here for actions x characters.
resultoptSTRING—
historyoptSTRING—

Outputs (5)

NameTypeDescription
promptSTRING—
prompt_tokensSTRING—
subjectsSTRING—
duration_secondsFLOAT—
modeSTRING—