MiniMax References Manager
The MiniMax H3 Reference Manager That Writes Its Own Prompt
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- image_7
- image_8
- image_9
- video_1
- video_2
- video_3
- video_audio_1
- video_audio_2
- video_audio_3
- audio_1
- audio_2
- audio_3
- prompt
- debug
MiniMax H3 is the 33B omni-modal video model from the Hailuo folks - text, image, video and audio in one context, with native stereo sound - and it got day-zero ComfyUI support. The catch: the core MiniMax H3 Reference to Video node expects up to nine images, three videos, three soundtracks and three audio clips, each on its own socket, plus a prompt in a six-section format. Wire that by hand and you've built a plate of spaghetti you re-cook every time you swap a reference. This node removes that pain.
What it actually is
MiniMaxH3ReferencePack (display name "MiniMax References Manager") is a companion node, not a generator. It owns your whole reference set - you drop images, videos and audio into its UI instead of wiring loaders - and fans them out to the core node's 18 reference sockets. Wire it once and changing a reference never touches the graph. Empty slots emit None, which the core node skips, so the unused sockets just dangle.
It does two jobs beyond the plumbing. First, it labels every asset the way MiniMax will actually see it - <Picture 2>, <Video 1>, <Audio 1> - right on the tile. Second, and this is the party trick, it writes the prompt for you: a vision-language model reads your direction, looks at the references, and produces the six-section MiniMax prompt H3 expects. Two registers - standard writes a scene, replacement swaps something in a reference video for something in a reference image - and auto lets a cheap classifier pick.
It's emphatically not a wrapper - the source is explicit that it never touches H3's VAE or tokenizer. Generation still happens in MiniMax H3 Reference to Video - which is also why it downloads no model files; the whole dependency is requests.
The inputs that matter
The only required input is direction - your steer on subject, mood and action. Everything else has sane defaults. Three matter:
prompt_provider-openrouter,local, ornone; the whole architecture in one dropdown.openroutercalls a hosted multimodal model (needs a key).localpoints the writer at any OpenAI-compatible server on your machine - Ollama, LM Studio, llama.cpp, vLLM - no account, nothing leaves your box.noneskips the API and passes yourdirectiontext straight through toprompt.reasoning_effort-none/low/medium/high, defaultmedium. Only sent to OpenRouter, dropped for models that don't reason.max_reference_edge- downscales a reference image whose long edge exceeds it (default 2048,0off). Not cosmetic: MiniMax sizes references off their short edge, so a huge reference silently makes every sampling step pay for it.
There's a nice touch in local mode: the Local LLM button sweeps the usual local ports (LM Studio 1234, Ollama 11434, llama.cpp 8080, vLLM 8000), lists every server that answered, and fills in api_base and local_model_slug in one click. The scan is loopback-only.
The outputs
You get 20 sockets: image_1–image_9, video_1–video_3, video_audio_1–video_audio_3 (each video's soundtrack, extracted unless you toggle it off), audio_1–audio_3, plus prompt and debug. Wire the 18 reference sockets and prompt into MiniMax H3 Reference to Video and you're done. The debug socket dumps the whole request - where it posted, the model, every setting, each content part - worth a preview node.
Installing it
ComfyUI Manager, search "ComfyUI-MiniMaxRefPack". Or the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/Hearmeman24/ComfyUI-MiniMaxRefPack
pip install -r ComfyUI-MiniMaxRefPack/requirements.txt
Then restart ComfyUI. A complete Reference-to-Video workflow ships with the pack (Workflow → Browse Templates → ComfyUI-MiniMaxRefPack), so you can see it all wired up first.
Where people get burned
- Local scan finds nothing. Start your server first (
ollama serve, or LM Studio's Developer tab), then Rescan. Andlocalhostmeans the machine ComfyUI runs on - if ComfyUI is in Docker or on a pod, its localhost isn't your laptop. - Local prompts come out weaker. A local server takes text and images, not video or audio, so a clip goes as six still frames with no sound. The node says so on the canvas and in
debug- honest, not broken. - A key typed into the node lives inside the workflow JSON. Sharing that workflow ships your key - use
OPENROUTER_API_KEYorLLM_KEYinstead, which take precedence and stay out of the file. On local mode the environment is never read, so a stray key can't follow a pasted URL to someone else's server. - Odd
retention_analysislines in the prompt. Known quirk: the packaged system prompt asks for one line per label, while MiniMax's guide says invented content gets none - the model sometimes resolves that by dropping or inventing a line. Thedebugsocket shows exactly what it was told.
One thing to keep separate: this node manages references and writes prompts - running H3 still needs the core node and weights, which the MiniMax H3 Community License currently bars in the US, EU, UK and Korea. The node is MIT, needs no account, and only calls the provider you choose.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| direction | STRING | Steers the VLM's prompt writing (subject, mood, action). | |
| references_jsonopt | STRING | Reference list written by the modal. Do not hand-edit. | |
| system_promptopt | STRING | VLM system prompt, editable per-workflow via the settings modal. Blank falls back to the packaged default. | |
| prompt_provideropt | COMBO | openrouter | Who writes the prompt. openrouter = the hosted API (needs a key). local = any OpenAI-compatible server, set api_base below (Ollama, LM Studio, llama.cpp, vLLM); video is sent as still frames and audio is not sent at all. none = no call, your direction text passes through verbatim. |
| openrouter_api_keyopt | STRING | OpenRouter key. Blank falls back to OPENROUTER_API_KEY / LLM_KEY. | |
| openrouter_modelopt | COMBO | google/gemini-3-flash-preview | Used only when prompt_provider is 'openrouter'. Lists models that accept text, images, audio and video. |
| reasoning_effortopt | COMBO | medium | Used only when prompt_provider is 'openrouter'. How hard the model thinks before writing. OpenRouter drops it for models that don't reason; other endpoints never see it. |
| api_baseopt | STRING | Only used when prompt_provider is 'local'. The base URL of an OpenAI-compatible server, ending in /v1. Ollama: http://localhost:11434/v1 · LM Studio: http://localhost:1234/v1 | |
| local_model_slugopt | STRING | Used only when prompt_provider is 'local'. The model id your own server reports, e.g. google/gemma-4-e2b or qwen2.5vl:7b. The Local LLM button fills this in for you. | |
| job_typeopt | COMBO | auto | Which register to write in. standard = a scene (six-section Ref2VA). replacement = swap one thing in a reference video for the thing in a reference image. auto = a cheap classifier decides, and only runs when there is at least 1 video and 1 image. |
| widthopt | INT | 12800–8192 | Target frame width, told to the VLM. 0 = unspecified. |
| heightopt | INT | 7200–8192 | Target frame height, told to the VLM. 0 = unspecified. |
| length_secondsopt | FLOAT | 8.000–60 | Target clip duration in seconds, told to the VLM. 0 = unspecified. |
| max_reference_edgeopt | INT | 20480–8192 | Downscale a reference IMAGE whose long edge exceeds this (0 = off). Never upscales. MiniMax sizes references off their SHORT edge, so at ref_image_size=max a wide sheet arrives huge and every sampling step pays for it. Reference videos are already capped by the core node. |
Outputs (20)
| Name | Type | Description |
|---|---|---|
| image_1 | IMAGE | — |
| image_2 | IMAGE | — |
| image_3 | IMAGE | — |
| image_4 | IMAGE | — |
| image_5 | IMAGE | — |
| image_6 | IMAGE | — |
| image_7 | IMAGE | — |
| image_8 | IMAGE | — |
| image_9 | IMAGE | — |
| video_1 | IMAGE | — |
| video_2 | IMAGE | — |
| video_3 | IMAGE | — |
| video_audio_1 | AUDIO | — |
| video_audio_2 | AUDIO | — |
| video_audio_3 | AUDIO | — |
| audio_1 | AUDIO | — |
| audio_2 | AUDIO | — |
| audio_3 | AUDIO | — |
| prompt | STRING | — |
| debug | STRING | — |