Bart's MiniMax H3 Prompt Helper (Ollama/Clip) ๐ฌ
MiniMax H3 Doesn't Want a Sentence, It Wants a Three-Field Prompt Document
- clip
- prompt
- report
- duration
- frames
- width
- height
- seed
The part nobody warns you about
You load ComfyUI's MiniMax H3 nodes, type a nice sentence into the prompt box, and it works. Sort of. Then you see someone else's H3 output: [Shot 1] and [Shot 2] markers with cut times baked in, an alignment line for their reference picture, a paragraph on the soundscape, another on the music. That isn't showing off - it's closer to the format H3 was trained to read, three ordered fields with shots marked up inside the first.
Writing that by hand is tedious in a way an LLM isn't. Bart's MiniMax H3 Prompt (Ollama) ๐ฌ wraps a bundled kit, h3kit, that owns the structure - shot plan, cut times, alignment line, triggers, dialogue - and asks the model only for the scene, then repairs and validates the answer. It doesn't run H3; it feeds whatever H3 node you already have.
What it does with your request
Ask for "an old fisherman hauls a net at dawn" at 8 seconds and the kit plans two 4-second shots, writing [Shot 2] At 4.00, the camera cuts to into the skeleton before the model speaks. It fills in scenery around a frame it can't get wrong.
Then the validator, where this node's personality lives. The text must start with [Shot 1], match the shot count, name a shot size and one known camera move per shot, and use each trigger once, unquoted, without inventing dialogue. Failures go back with the complaint list, up to retries times. If it still fails you get the best attempt plus the problems in report - fair, since a prompt that's 95% there beats an exception.
Inputs you'll actually touch
ollama_url and model are the server and chat model; request is the idea, in any language, and the only thing you must type. Then the clip's shape: duration (4โ120s), aspect, mode (T2VA, I2VA, FL2VA, L2VA), variant, shots. On auto, variant picks the writer - story past 15 seconds splits the plan into ~10s scenes, one prompt per clip. shots at 0 plans it for you; 1โ3 forces the count.
triggers-style:retro_vhs, subject:sks_man, place:alps_road. Each placed exactly once, which the validator enforces.dialogue- lines split by newline or|, optionalS2:speaker and[Spanish]prefix. The node builds H3's<d>blocks; don't hand-write them.
The โจ Generate button runs the whole pipeline without executing the graph and drops the text into generated, fresh seed each press, so pressing again gives another take. There's also a clip socket: link a text-LLM encoder from Load CLIP (a Qwen or Gemma model) and the graph writes the prompt itself, no Ollama involved.
Outputs and where they go
Seven: prompt, report, duration, frames, width, height, seed. The first, third and fourth are lists, one entry per clip - which is what makes a 20-second story runnable: feed prompt and duration into a video node and it runs once per clip. frames is duration ร 24, which H3's nodes snap to their grid; width/height come from aspect plus short_side, rounded down to multiples of 32. The Cloud/API H3 nodes take aspect_ratio as a dropdown, though, which a STRING can't feed - set that by hand.
Installing it
ComfyUI Manager: search "Bart's ComfyUI Nodes", or just bart - everything in the pack is named Bart's โฆ. By hand:
cd ComfyUI/custom_nodes
git clone https://github.com/bartenevve/comfyui-bart-nodes
Restart. No pip install step: the client is standard library, no requirements file to fight. Ollama itself is separate:
ollama pull qwen3:4b-instruct
ollama serve # 127.0.0.1:11434
In Docker, localhost means the container, not your host. The author got 4โ10s per prompt from that 4B; bigger models take much longer.
Where people get burned
Saved text beats your edits, by design. Run the graph with generated filled and it outputs that text as-is, hand edits included, even if you've since changed request. You get a โ inputs changed since this text was generated hint instead; press Regenerate or clear it.
Thinking models eat their token budget here. qwen3-vl:8b ignores both think: false and Qwen3's /no_think switch against this kit's system prompt, spends everything reasoning, returns nothing. Leave append_no_think on and prefer a plain instruct model.
The button can't read links from computing nodes. It runs outside the graph, so it only resolves a link from a Primitive-style node (Reroutes are fine). Feed duration from something computed at run time and the button says it can't. With a CLIP linked, Generate is unavailable entirely, and variant = slots is refused there too. Interrupt won't cancel Ollama: it's a blocking call, ending at the answer or at timeout.
One pack-level thing: the node registers POST /minimax_h3/generate and takes ollama_url from the caller - so anyone reaching your ComfyUI port can make it POST anywhere it can see and read the answer back. Validation is tight, but if ComfyUI isn't localhost-only, put something authenticating in front of it.
Inputs (27)
| Name | Type | Default | Description |
|---|---|---|---|
| ollama_url | STRING | http://localhost:11434 | โ |
| model | STRING | qwen3:4b-instruct | โ |
| request | STRING | โ | |
| duration | INT | 84โ120 | โ |
| aspect | COMBO | 16:9 | 6 options: 16:9, 9:16, 1:1, 4:3, 3:4, 21:9 |
| mode | COMBO | T2VA | 4 options: T2VA, I2VA, FL2VA, L2VA |
| variant | COMBO | auto | 9 options: auto, t2va, i2va, fl2va, talking, product, +3 |
| seed | INT | 00โ2147483647 | โ |
| triggersopt | STRING | โ | |
| dialogueopt | STRING | โ | |
| textopt | STRING | โ | |
| imageopt | STRING | โ | |
| startopt | STRING | โ | |
| endopt | STRING | โ | |
| shotsopt | INT | 00โ3 | โ |
| refsopt | STRING | โ | |
| temperatureopt | FLOAT | 0.300โ2 | โ |
| num_ctxopt | INT | 81924096โ131072 | โ |
| num_predictopt | INT | 00โ32768 | โ |
| retriesopt | INT | 20โ5 | โ |
| timeoutopt | INT | 60010โ3600 | โ |
| thinkopt | BOOLEAN | false | โ |
| append_no_thinkopt | BOOLEAN | true | โ |
| generatedopt | STRING | โ | |
| generated_keyopt | STRING | โ | |
| short_sideopt | INT | 768256โ4096 | โ |
| clipopt | CLIP | Optional: write the prompt with this text-LLM encoder instead of Ollama (only when the graph runs; ollama_url and model are then ignored) |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | โ |
| report | STRING | โ |
| duration | INT | โ |
| frames | INT | โ |
| width | INT | โ |
| height | INT | โ |
| seed | INT | โ |