⬡ Polyhedron MiniMax Reference
<Picture i> reference conditioning for MiniMax H3, with the sizing under your control
- clip
- vae
- latent
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- image_7
- image_8
- image_9
- audio_vae
- video_1
- video_audio_1
- video_2
- video_audio_2
- video_3
- video_audio_3
- audio_1
- audio_2
- audio_3
- refs
- first_frame
- positive
- latent
- info
- prompt_text
MiniMax H3 is the 2026 open-weights omni video model - text, image, video and audio in one context - and its reference-image workflow is not an ordinary text encode. Your reference images get woven into the token stream itself, and the stock template for it is a tangle: a reference node, a resolution selector, a float for duration, a math expression, all feeding each other. ⬡ Polyhedron MiniMax Reference collapses that into one node and reads the geometry from a wire instead of re-deriving it.
The "from a wire" bit is the design that holds it together. Instead of building the latent under the hood and hoping it matches your sampler, the node takes a joint MiniMax H3 AV latent - the kind ⬡ Polyhedron Empty Latent makes when you pick MiniMax H3 AV - and reads width, height and frame count out of it. One source of truth. Change the latent's length and every downstream number follows; nothing silently disagrees.
How the references work
Each optional image_1 / image_2 / image_3 input becomes a <Picture 1> / <Picture 2> / <Picture 3> tag in the prompt - and the number follows the input slot, not the order you wired them, so be deliberate about which socket each image lands in. The info output lists the tags that are actually live, so you can check your prompt against reality. The clip input is the H3 text encoder, and this is where the weaving happens: the reference images are encoded with the wired vae and joined to the tokens here. That's why the node can't be moved upstream - the reference conditioning is this step.
The genuinely H3-specific knob is ref_image_size, plus the per-image megapixels_1/2/3 budgets. Core only offers one global rule; this node lets each reference have its own. ref_image_size = match scales each reference to the generation's pixel area (the default); max uses a 2048 short edge for best identity fidelity. The honest tradeoff: reference tokens ride through every sampling step, so max can be several times slower. And a face doesn't deserve the same token budget as a backdrop - give the face megapixels_1 = 1.0 or 2.0 and leave the scenery at 0 to follow the global rule.
What comes out
positive(CONDITIONING) - the reference-augmented conditioning, straight into the sampler.latent(LATENT) - the joint latent, passed through, so you don't need a second wire from the Empty Latent.info(STRING) - what it did: live tags, sizes, budgets. Wire into a note.
Installing it
Part of the ⬡ Polyhedron Suite pack. ComfyUI Manager → "Polyhedron Suite", or:
cd ComfyUI/custom_nodes
git clone https://github.com/PolyhedronAI/ComfyUI-PolyhedronLoRAStack.git
# restart ComfyUI
No extra dependencies. You do need the H3 weights (video VAE + audio VAE + text encoder) and, like the rest of the H3 ecosystem, a head's-up that the H3 Community License geofences out the US, EU, UK and South Korea - worth checking before you build a workflow on it.
Gotchas
The biggest one is the slot-vs-number rule above - rewire a reference and the tag moves with the socket, so your "this is the hero face" image can silently become <Picture 3> if it's in socket 3. And remember the latent has to be a joint H3 AV latent; feed it a plain image latent and the whole geometry story falls apart. If a Polyhedron node renders blank under Nodes 2.0 (Modern Node Design), disable it in Settings.
Inputs (36)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | CLIP | The MiniMax H3 text encoder. The reference images are woven into the TOKENS here -- this is not an ordinary text encode and cannot be moved upstream. | |
| vae | VAE | The VIDEO vae. Each reference image is encoded with it before it joins the conditioning. | |
| latent | LATENT | A joint MiniMax H3 AV latent -- from Polyhedron Empty Latent with latent_type 'MiniMax H3 AV'. Width, height and frame count are READ from it, so there is exactly one source of truth for the size. | |
| prompt | STRING | Refer to the references as <Picture i>, <Video k> and <Audio j>. Each kind is counted in WIRED order; a video's soundtrack takes an <Audio j> number BEFORE the standalone audios. The info output lists the tags that are actually live. | |
| ref_image_size | COMBO | match | The default rule for every reference without its own megapixel target. 'match': scale to the generation's pixel area. 'max': a 2048 short edge, best identity fidelity. Reference tokens ride through EVERY sampling step, so 'max' can be several times slower. |
| megapixels_1 | FLOAT | 0.00–16 | Per-image budget for image_1. 0 = follow ref_image_size. Core has only the global rule; a face and a backdrop rarely deserve the same token budget. |
| megapixels_2 | FLOAT | 0.00–16 | Per-image budget for image_2. 0 = follow ref_image_size. |
| megapixels_3 | FLOAT | 0.00–16 | Per-image budget for image_3. 0 = follow ref_image_size. |
| image_1opt | IMAGE | Reference image 1. Numbered in WIRED order: the first wired image is <Picture 1>, whatever its slot. The info output lists the live tags. | |
| image_2opt | IMAGE | Reference image 2. Numbered in WIRED order: the first wired image is <Picture 1>, whatever its slot. The info output lists the live tags. | |
| image_3opt | IMAGE | Reference image 3. Numbered in WIRED order: the first wired image is <Picture 1>, whatever its slot. The info output lists the live tags. | |
| image_4opt | IMAGE | Reference image 4. Numbered in WIRED order: the first wired image is <Picture 1>, whatever its slot. The info output lists the live tags. | |
| image_5opt | IMAGE | Reference image 5. Numbered in WIRED order: the first wired image is <Picture 1>, whatever its slot. The info output lists the live tags. | |
| image_6opt | IMAGE | Reference image 6. Numbered in WIRED order: the first wired image is <Picture 1>, whatever its slot. The info output lists the live tags. | |
| image_7opt | IMAGE | Reference image 7. Numbered in WIRED order: the first wired image is <Picture 1>, whatever its slot. The info output lists the live tags. | |
| image_8opt | IMAGE | Reference image 8. Numbered in WIRED order: the first wired image is <Picture 1>, whatever its slot. The info output lists the live tags. | |
| image_9opt | IMAGE | Reference image 9. Numbered in WIRED order: the first wired image is <Picture 1>, whatever its slot. The info output lists the live tags. | |
| megapixels_4opt | FLOAT | 0.00–16 | Per-image budget for image_4. 0 = follow ref_image_size. |
| megapixels_5opt | FLOAT | 0.00–16 | Per-image budget for image_5. 0 = follow ref_image_size. |
| megapixels_6opt | FLOAT | 0.00–16 | Per-image budget for image_6. 0 = follow ref_image_size. |
| megapixels_7opt | FLOAT | 0.00–16 | Per-image budget for image_7. 0 = follow ref_image_size. |
| megapixels_8opt | FLOAT | 0.00–16 | Per-image budget for image_8. 0 = follow ref_image_size. |
| megapixels_9opt | FLOAT | 0.00–16 | Per-image budget for image_9. 0 = follow ref_image_size. |
| audio_vaeopt | VAE | The MiniMax H3 AUDIO vae. Needed only when an audio or a video soundtrack is wired -- the node refuses by name if one is and this is not. | |
| video_1opt | VIDEO | Reference video 1 (a VIDEO, e.g. the Media Loader's `video`). Its real frame rate is read and resampled to 24 fps -- Core assumes 24. Trimmed to the clip length and to the 17k+5 grid. Official: 2-15 s, all videos together <= 15 s. | |
| video_audio_1opt | AUDIO | Soundtrack OF video_1: its own <Audio j> label right before that <Video>. Used only when video_1 is wired. Wire it explicitly -- the node never lifts a track out of the VIDEO by itself. | |
| video_2opt | VIDEO | Reference video 2 (a VIDEO, e.g. the Media Loader's `video`). Its real frame rate is read and resampled to 24 fps -- Core assumes 24. Trimmed to the clip length and to the 17k+5 grid. Official: 2-15 s, all videos together <= 15 s. | |
| video_audio_2opt | AUDIO | Soundtrack OF video_2: its own <Audio j> label right before that <Video>. Used only when video_2 is wired. Wire it explicitly -- the node never lifts a track out of the VIDEO by itself. | |
| video_3opt | VIDEO | Reference video 3 (a VIDEO, e.g. the Media Loader's `video`). Its real frame rate is read and resampled to 24 fps -- Core assumes 24. Trimmed to the clip length and to the 17k+5 grid. Official: 2-15 s, all videos together <= 15 s. | |
| video_audio_3opt | AUDIO | Soundtrack OF video_3: its own <Audio j> label right before that <Video>. Used only when video_3 is wired. Wire it explicitly -- the node never lifts a track out of the VIDEO by itself. | |
| audio_1opt | AUDIO | Standalone reference audio 1: an <Audio j> label after all video soundtracks. Official: 2-15 s, all audios together <= 15 s. | |
| audio_2opt | AUDIO | Standalone reference audio 2: an <Audio j> label after all video soundtracks. Official: 2-15 s, all audios together <= 15 s. | |
| audio_3opt | AUDIO | Standalone reference audio 3: an <Audio j> label after all video soundtracks. Official: 2-15 s, all audios together <= 15 s. | |
| refsopt | PLS_REFS | From Polyhedron Reference Board: its images, videos (with their soundtrack) and audios fill this node's FREE slots in board order, and their @tags work in the prompt without a tags line. A slot that is wired stays the wire's. | |
| tagsopt | STRING | Speaking names for the slots, one per line: 'fox = image_1', 'forest = image_3', 'prev = video_1'. In the prompt write @fox -- the node puts in the LIVE <Picture i> / <Video k> / <Audio j> right before the encode, so rewiring never breaks the prompt. Every slot name is a tag by itself (@image_2, @video_audio_1). An unknown tag stops the run by name. | |
| first_frameopt | IMAGE | Pinned at pixel frame 0 of the clip, never denoised -- e.g. the Cine Timeline's first_frame when a scene CARRIES the last frame of the scene before. Next to <Picture i> references it is NOT a picture of the prompt (the references keep their numbers); alone it is presented like MiniMax Keyframes' <Picture 1>. Stretched to the canvas like Core's first frame. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| latent | LATENT | — |
| info | STRING | — |
| prompt_text | STRING | — |