Fantastic H3 Reference Map
Know what `<Picture N>` means before you render
- mods
- references
- reference_map
Why this node exists
MiniMax H3 - the 33B omni-modal video model MiniMax opened in August 2026, the first credible open-weight answer to Veo's native-audio trick - doesn't take references the way ControlNet or IPAdapter do. In reference mode you hand it pictures, clips and audio, and then you cite them in the prompt by label: <Picture 1>, <Video 2>, <Audio 1>. The labels are positional, and H3 numbers references by the order they arrive rather than by which slot you plugged them into, so <Picture 1> is not "whatever is in picture_1".
Ordinarily the only place you'd see that mapping is the reference_map output on Fantastic H3 RefMod Text Encode, which means loading VAEs and actually encoding your media to read a list of strings. This node produces the same list from the bundles alone. Nothing is decoded, no model is touched, no VRAM moves.
So: reach for it when you want the labels without the encode. The main use is driving prompt-writing with an LLM - wire the output into a text or LLM node and it knows exactly which tags exist to cite. The other is the boring one that saves a failed render: ⧉ Copy the map into a chat window and ask for a prompt written against your tags, or just read it to work out why the model keeps ignoring your second character.
The two inputs and the one output
Both inputs are optional, and they're deliberately the same wires the Text Encode takes:
references(H3_REFS) - "the Media Loader bundle the Text Encode gets."mods(H3_REF_MODS) - "the RefMod bundle the Text Encode gets."
If you're running the Prompt Builder, it passes both bundles straight through, so the connection is the same one feeding the Text Encode. The output is a single reference_map string, one label per line. With nothing connected it returns No references. - that's not an error, that's the node telling you your graph is empty.
A typical result looks like this:
<Picture 1> = picture 1 (media)
<Audio 1> = soundtrack of video 1 (media)
<Video 1> = video 1 (media)
<Audio 2> = audio 1 (media)
<Picture 2> = ann_face
Editing clip_a.mp4 (masked area regenerated)
Loader media comes first (pictures, then each video with its soundtrack labelled just before it, then standalone audio), then the RefMods numbered on from there, one counter per kind. Note the audio numbering: that video's soundtrack takes <Audio 1> because it's presented before its own video, which is exactly the thing that trips people up in reference mode. RefMods sitting at zero strength in the stack don't get a label at all, matching what the encode would actually send. The final line only shows up when the Media Loader bundle carries a masked edit.
The box in the node body
The node draws the same text in a read-only box headed "Updates as you edit the graph", with a ⧉ Copy button beside it. That box is the frontend's own reading of the wires, recomputed as the graph changes, so the map is readable before anything is queued. The string on the output pin is the Python side's version, computed when you hit Queue. They agree; the output is the one to wire into an LLM node.
Install
The whole pack is one install. You need ComfyUI 0.30.0 or newer (H3 support landed there) plus the H3 checkpoints - fl2va for text and keyframe work, ref2va for reference mode, both wired up by ComfyUI's own H3 templates.
cd ComfyUI/custom_nodes
git clone https://github.com/Adudeguyman/ComfyUI-Fantastic-MiniMaxH3-PromptBuilder
Or search "Fantastic H3 Prompt Builder" in ComfyUI Manager. Then restart ComfyUI fully - node registration happens at startup only. The node lives under conditioning → video_models.
The pack's only declared dependency is av (PyAV) for video and audio decoding. ComfyUI core requires it too, so a working install already has it; if videos get rejected, something else downgraded PyAV - aiortc is the known culprit, pinning av<17 - and pip install 'av>=17' fixes it.
One caveat before you download 40-odd GB: H3's Community License excludes the US, EU, UK and South Korea from its Applicable Territory. The hosted Hailuo API is the licensed path in those regions.
Where people get burned
- Rearranging media changes the labels but not your prompt. Drag a picture to a new position on the Media Loader and
<Picture 2>may now mean a different file, while the text you already wrote still says<Picture 2>. This node is how you check, and it's the reason the loader shows tag order along its bottom edge too. - A wrong-typed wire gives you a one-line error, not a stack trace - "not a Media Loader bundle", or an entry that "came from a pack this node doesn't understand".
- If the box is missing entirely, the Python side registered but the frontend script didn't build. Usually a stale browser cache - hard-refresh with Ctrl+Shift+R. If another extension threw during load first, the browser console (F12) names it, and it's usually not this pack.
One piece of honesty about the premise: H3 follows a casual prose prompt fine for plain text-to-video - people were posting good results with run-on sentences the day the weights dropped. The labelled, structured prompt is what reference mode needs, because something has to tell the model which tag is which character. This node is what makes that visible.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| modsopt | H3_REF_MODS | The RefMod bundle the Text Encode gets. | |
| referencesopt | H3_REFS | The Media Loader bundle the Text Encode gets. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| reference_map | STRING | — |