MiniMax-H3 Universal Writer
References, their order, and the rewrite
- options
- references
- clip
- rewritten_prompt
- integrated_multimodal_description
- subject_definitions
- summary
- retention_analysis
- detailed_description
- overall_soundscape
- non_diegetic_music
- reference_assets
- captions
This is the everything node of the pack: it captions your references, decides their order, and writes the finished MiniMax-H3 prompt from the guide, covering all five tasks - T2VA through Ref2VA. It's what the Multi Reference Caption plus both writer nodes do, folded into a single box. Those stay exactly as they are; nothing you've built stops working.
The reason to fold them together is order, and order is genuinely load-bearing. Picture 1 and Picture 2 are not interchangeable in FL2VA: one opens the video and the other closes it. Until this node, the only thing deciding which was which was the order the caption node happened to write them in - which came in turn from which slot each was plugged into. Real, and nowhere on screen. Here, it's the whole point.
One socket, and a strip that decides everything
references is a single growing socket that takes an image, a clip or a sound - more slots appear as you fill them. There's no wrong socket to plug into, because which socket you used no longer decides anything.
Below the inputs, the strip shows every connected reference as a colored square, numbered exactly as the block will number it:
| Square | Label | What it means |
|---|---|---|
| pic | <Picture N> | an image as an actual frame - first, last, key, composition anchor |
| subj | <Subject N> | reusable visible content - a person, an animal, a place, a style |
| vid | <Video N> | a clip, or a batch of frames read as one |
| aud | <Audio N> | a voice timbre, music, ambience, an effect |
- Drag a square to move it; numbering follows immediately. The number is a position, the slot name under it stays with the square.
- Click its label to change what an image is for -
pic→subj→vidand round again. Clips and sounds are what they are. - Click its number (or the checkbox on the slot's row) to switch a reference off without unplugging it.
The task switch reads the strip: a task greys out while the strip can't supply what it's written from. Nothing connected → only T2VA lit. One picture → I2VA and L2VA. Two → FL2VA. A task you picked that becomes impossible turns red rather than quietly failing later. A mismatch is refused before anything is downloaded, and the message names the strip, because that's where the fix is.
Inputs to know
task- all five. Ref2VA uses the six-section full-reference guide and accepts any number of references (at least one).caption_model/writer_model- two models, two jobs. The captioner reads the references; the writer produces the prompt from the guide. Both ordinary GGUFs, no LoRA anywhere.duration- a slider in tenths of a second, and its range is the node's ownmax_durationproperty (right-click → Properties Panel), 30 seconds until you change it. The server accepts up to ten minutes.clip- connect a multimodal encoder fromCLIPLoaderand it replacescaption_modelfor reading references, staying loaded between them. On T2VA no captioner is touched at all.previous- a reference block from an earlier caption node; its labels are counted, so this node's references continue from where it stopped.max_frames/context_size- the captioner's knobs;context_size0 sizes itself from the references and your card.
Outputs are the union of both writers' - the three T2VA fields, the six Ref2VA fields, plus reference_assets and captions. A task that doesn't write a field leaves it empty, because a node's outputs can't change with a widget value.
Install and gotchas
Same pack, same install (ComfyUI Manager → search "MiniMax-H3", or git clone into custom_nodes). Weights fetch on first use.
- Needs a recent ComfyUI - the growing
referencesinput isio.Autogrowfrom the v3 node API. On an older install this node goes missing while the rest of the pack registers. - Block order is strip order, not guide order. Multi Reference Caption writes subjects-pictures-videos-audio whatever the wiring says; this one writes in strip order, because the strip is the point. An untouched strip is slot order.
- No UI fallback is a loss. If the interface script doesn't load, the strip, task switch and ratio picker fall back to plain widgets and the node still runs - but the checkboxes on the input rows are canvas-drawn, so with Modern Node Design (Nodes 2.0) you switch references off via the square's number instead.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| reference_layout | STRING | {} | The strip's state as JSON -- which squares are switched off, what order they are in, and what each image is being used as. It is a widget so the arrangement travels with the workflow and through the API; the interface draws it as squares instead. A slot missing from it is on, in slot order, and used as a picture. |
| task | COMBO | T2VA | T2VA: text alone, references ignored. I2VA: one picture, the first frame. L2VA: one picture, the final frame. FL2VA: two pictures, first and last. Ref2VA: any number of references the target video reuses, written with the six-section full-reference guide. Everything but T2VA opens with the alignment line, duration already filled in. |
| resolution | COMBO | 16:9 | Target aspect ratio the rewrite is composed for. |
| duration | FLOAT | 10.00.1–600 | Target clip length in seconds; drives shot count and pacing. The slider's upper end is the node's own 'max_duration' property (right-click, Properties Panel), 30 seconds until you change it -- MiniMax's guide is written around clips of a few seconds, so a shorter range is a more useful slider than a longer one. |
| prompt | STRING | What the target video should show. For Ref2VA, also how it uses the references -- the descriptions say what they are, this says what they are for. | |
| caption_model | COMBO | The multimodal GGUF that reads the references, with its projector. Entries prefixed 'on disk:' are pairs already in your model folders. One model reads every reference here, so it has to cover every kind you connected. Unused while 'clip' is connected, or on T2VA. | |
| caption_length | COMBO | standard | How much the captioner is asked to write, for every reference here. |
| writer_model | COMBO | The language model that writes the finished prompt from the guide. Any instruction-following GGUF; the full-reference guide is the longer of the two, so a 4B holds the format but a 9B keeps the labels consistent across all six sections. | |
| greedy | BOOLEAN | true | Deterministic decoding. Worth keeping on for small models, which drift out of the format when they sample. |
| seed | INT | 420–4294967295 | — |
| keep_model_loaded | BOOLEAN | false | Keep the writer in VRAM after the rewrite. Leave off when the same GPU has to run MiniMax-H3 video generation afterwards. |
| optionsopt | H3_REWRITER_OPTIONS | — | |
| referencesopt | COMFY_AUTOGROW_V3 | One image, clip or sound per slot; more slots appear as you fill them. What a reference is used for is set on its square in the strip below, not by which slot it is in -- so there is no wrong socket to plug into here. | |
| clipopt | CLIP | A multimodal text encoder loaded by 'CLIPLoader' -- Qwen3-VL or Gemma-4. Connect it and every reference here is described by that model instead of by 'caption_model': it stays loaded between references and between runs. Only Gemma-4 E2B, E4B and 12B can hear audio. Leave it unconnected and nothing changes. | |
| previousopt | STRING | A reference block from an earlier caption node, if this one is in a chain. Its labels are counted, so the references here carry on from where it stopped. | |
| max_framesopt | INT | 81–64 | How many frames to take from a batch or a clip, spread evenly. All of them would overflow the context and the wall clock. |
| context_sizeopt | INT | 00–131072 | Context for the captioner. 0 sizes it from the references and the card, rather than from a model header that can say 256k and cost tens of GB of KV cache. Set a number to say it yourself. The writer sizes its own context from the guide. |
| bypassopt | BOOLEAN | false | Hand 'prompt' straight to the output and run no model at all: nothing is downloaded, nothing is loaded, no VRAM is touched. This is what ComfyUI's own bypass (Ctrl+B) cannot do here - it only forwards a connected link, and every input this node writes from is a widget, so bypassing the node the usual way leaves the nodes downstream with nothing. The section outputs come back empty. |
Outputs (10)
| Name | Type | Description |
|---|---|---|
| rewritten_prompt | STRING | — |
| integrated_multimodal_description | STRING | — |
| subject_definitions | STRING | — |
| summary | STRING | — |
| retention_analysis | STRING | — |
| detailed_description | STRING | — |
| overall_soundscape | STRING | — |
| non_diegetic_music | STRING | — |
| reference_assets | STRING | — |
| captions | STRING | — |