⬡ 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
- positive
- latent
- info
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 (11)
| 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 wired images as <Picture 1>, <Picture 2>, <Picture 3> -- the number follows the INPUT slot, not the order you wired them in. 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 | Becomes <Picture 1>. | |
| image_2opt | IMAGE | Becomes <Picture 2>. | |
| image_3opt | IMAGE | Becomes <Picture 3>. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| latent | LATENT | — |
| info | STRING | — |