Nodes/MiniMax-H3-Prompt-Rewriter-ComfyUI/MiniMax-H3 Universal Writer
ComfyUI Node

MiniMax-H3 Universal Writer

References, their order, and the rewrite

By pytraveler·Created 18 days ago·Updated about 22 hours ago· 54
MiniMax-H3 Universal Writer
  • options
  • references
  • clip
  • rewritten_prompt
  • integrated_multimodal_description
  • subject_definitions
  • summary
  • retention_analysis
  • detailed_description
  • overall_soundscape
  • non_diegetic_music
  • reference_assets
  • captions
reference_layout{}
taskT2VA
resolution16:9
duration10.0
prompt
caption_model
caption_lengthstandard
writer_model
greedytrue
seed42
keep_model_loadedfalse
previous
max_frames8
context_size0
bypassfalse

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 - picsubjvid and 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 own max_duration property (right-click → Properties Panel), 30 seconds until you change it. The server accepts up to ten minutes.
  • clip - connect a multimodal encoder from CLIPLoader and it replaces caption_model for 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_size 0 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 references input is io.Autogrow from 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.
CategoryMiniMax-H3

Inputs (18)

NameTypeDefaultDescription
reference_layoutSTRING{}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.
taskCOMBOT2VAT2VA: 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.
resolutionCOMBO16:9Target aspect ratio the rewrite is composed for.
durationFLOAT10.00.1–600Target 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.
promptSTRINGWhat 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_modelCOMBOThe 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_lengthCOMBOstandardHow much the captioner is asked to write, for every reference here.
writer_modelCOMBOThe 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.
greedyBOOLEANtrueDeterministic decoding. Worth keeping on for small models, which drift out of the format when they sample.
seedINT420–4294967295
keep_model_loadedBOOLEANfalseKeep the writer in VRAM after the rewrite. Leave off when the same GPU has to run MiniMax-H3 video generation afterwards.
optionsoptH3_REWRITER_OPTIONS
referencesoptCOMFY_AUTOGROW_V3One 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.
clipoptCLIPA 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.
previousoptSTRINGA 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_framesoptINT81–64How many frames to take from a batch or a clip, spread evenly. All of them would overflow the context and the wall clock.
context_sizeoptINT00–131072Context 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.
bypassoptBOOLEANfalseHand '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)

NameTypeDescription
rewritten_promptSTRING
integrated_multimodal_descriptionSTRING
subject_definitionsSTRING
summarySTRING
retention_analysisSTRING
detailed_descriptionSTRING
overall_soundscapeSTRING
non_diegetic_musicSTRING
reference_assetsSTRING
captionsSTRING