H3 Reference
Pixels vs Meaning
- images
- references
- references
H3 conditions on a reference image through two independent channels. Its vision tokens go into the Qwen3-VL conditioning behind a <Picture i> label. Its pixels go in as a VAE latent packed into the DiT sequence. Core's MiniMax H3 Reference to Video couples those two with a single check: wire a VAE and every reference becomes a latent; leave it out and none does.
H3 Reference decouples them, per reference. That's it. That's the whole node, and it's a genuinely useful switch.
Why you'd want the split
A hero shot wants its identity carried as pixels - that's what holds a face or a costume shape. A style board wants to steer the look without H3 reproducing its content literally. Core forces you to pick one behaviour for the whole chain. Here you set role per group:
reference- pixels and meaning. A VAE latent gets packed into the DiT, so identity and structure carry. Needs a VAE on the encode node.semantic- meaning only, through the vision tokens the text encoder keeps. No latent slot at all, so it costs nothing in the DiT sequence.
A semantic reference costs no latent slot because core's packed layout gives reference image k the position text_len + k, as a run after the whole text rather than spliced at its tag. Dropping one just closes the gap.
The inputs, and the one that surprises people
images is an autogrow group, up to 9 - each becomes its own <Picture i>.
role - reference (default) or semantic, as above.
vision_size - caps the resolution these images reach the text encoder at. This is what decides how literally they transfer, and the author's tooltip is the thing to internalise: Qwen3-VL spends one token per 32×32 pixels and never downscales what it is given. A full-size reference is around 1000 tokens of dense, spatially-resolved encoding - enough to reproduce the image closely even with no latent at all. 512 is ~256 tokens; 256 is ~64. 0 leaves it to the encode node.
So semantic does not mean "abstract." Resolution buys abstraction, not the role. What semantic removes is one transfer channel, not the other. It also never touches the VAE latent and never upscales - a reference can keep full-resolution pixels while its vision tokens stay coarse.
label is just a name for error messages.
Output is a single references of type NYNXZ_H3_REFS, going into H3 Reference to Video.
Chain it right
There's a references input for chaining another H3 Reference in. Use BYPASS (Ctrl+B) to disable one - the docs are blunt that muting breaks the chain.
And the numbering trap: H3 addresses references positionally as <Picture 1>, <Picture 2>… Latent-bearing references are emitted first, so the numbering is not your chain order, and <Picture 1> is always a reference. The encode node prints the mapping it assigned. Read the picture_map before you write the prompt - it's the authoritative list.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Nynxz/ComfyUI-NynxzH3
Restart with ComfyUI 0.30.0+ and the H3 weights (diffusion model, Qwen3-VL text encoder, video VAE from Comfy-Org's MiniMax-H3 repo). No extra dependency for this node.
Be honest about the risk
The pack flags this whole group experimental, and the limit is stated plainly: a <Picture N> that has vision tokens but no latent is a shape H3 was probably never trained on, so semantic is an extrapolation, not a documented mode. Both endpoints are supported by core - all-latent, and no-VAE-at-all - and the equivalent split demonstrably does something on Qwen Image 2.1. Whether the middle is useful here is exactly what this group exists to find out. Try it, but don't rebuild your pipeline on it before you've seen it work.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| images | COMFY_AUTOGROW_V3 | Reference images. Each becomes its own <Picture i>. | |
| role | COMBO | reference | 'reference' = pixels and meaning: a VAE latent is packed into the DiT, so identity and structure carry. Needs a VAE on the encode node. 'semantic' = meaning only, through the vision tokens the text encoder keeps — use it for style or mood you do not want reproduced literally. |
| vision_size | INT | 00–2048 | Caps the resolution these images reach the TEXT ENCODER at, which is what decides how literally they transfer. Qwen3-VL spends one token per 32x32 pixels and never downscales what it is given, so a full-size reference is ~1000 tokens and reproduces closely even with no latent. 512 is ~256 tokens, 256 is ~64. 0 leaves it to the encode node. Never upscales, and never touches the VAE latent — a 'reference' can keep full-resolution pixels while its vision tokens stay coarse. |
| label | STRING | A name for these references, used in error messages. H3 addresses them positionally as <Picture 1>, <Picture 2>, … and the encode node prints the mapping it assigned, because latent references are emitted first. | |
| referencesopt | NYNXZ_H3_REFS | Chain another H3 Reference in here. Use BYPASS (Ctrl+B) to disable one; muting breaks the chain. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| references | NYNXZ_H3_REFS | — |