MiniMax H3 CLIP-Cached Ref2VA (Dual Resolution)
The Ref2VA Dual Resolution node
- vae
- audio_vae
- ref_image_0
- ref_image_1
- ref_image_2
- ref_image_3
- ref_image_4
- ref_image_5
- ref_image_6
- ref_image_7
- ref_image_8
- ref_video_0
- ref_video_1
- ref_video_2
- ref_video_audio_0
- ref_video_audio_1
- ref_video_audio_2
- ref_audio_0
- ref_audio_1
- ref_audio_2
- positive
- latent
- positive_upscale
MiniMaxH3CLIPCachedRef2VADualRes is what you get when you combine the two ideas the pack sells separately: the cached Ref2VA reference-to-video path, and the Dual Resolution trick of preparing a base generation and its upscale-target conditioning from one shared set of inputs. If your workflow conditions H3 on reference images or video and continues through a latent-upscale branch, this is the node that keeps the prompt, references, encoder choice, and length in a single place instead of duplicating a whole reference conditioning node for the upscale pass.
Like its FL2VA sibling, this is not an upscaler. It prepares conditioning for two resolutions; a separate latent-upscale node resizes the base latent and hands it to the upscale branch. The node returns three outputs - positive and latent for the base width/height, and positive_upscale (CONDITIONING) for width_upscale/height_upscale. There's deliberately no second latent output: an upscale workflow takes the base latent, resizes it externally, and combines that with positive_upscale, so exposing a second empty latent was pointless and the author removed it.
Inputs that matter
Everything from the single-resolution cached Ref2VA node carries over: clip_name, vae plus audio_vae, prompt, width/height, length (124 ≈ 5 s at 24 fps), and ref_image_size (match scales references to the generation pixel area; max keeps the 2048-px short-edge path for identity fidelity at the cost of slower sampling). The reference slots are the same fixed set - ref_image_0–ref_image_8, ref_video_0–ref_video_2 with matching soundtracks, and ref_audio_0–ref_audio_2 - and the same slot rules apply: unconnected slots are dropped, order is preserved, and MiniMax H3 prompt references like <Picture 1> address the positional order after compaction, not the socket number you wired.
The two new controls are the resolution pair width_upscale/height_upscale and generate_upscale_cond. That boolean defaults to on, and it's the only way to skip the second-resolution encode: turn it off and positive_upscale comes back as None. This is more load-bearing than it looks because the node is one atomic call that returns all three outputs together - bypassing the downstream upscale consumer does not skip the encode on its own. cache_mode (auto/refresh) applies to both resolutions; with auto, if the two resolutions end up presenting the encoder with the same effective reference pixels, they share one cache entry and Qwen3-VL loads at most once per run.
Installing
The pack-wide routine applies: ComfyUI Manager (search "MiniMax H3 CLIP-Cached"), or
cd ComfyUI/custom_nodes
git clone https://github.com/Mu5hr00moO/ComfyUI-MiniMaxH3-CLIPCached
Restart, and the node appears under model/conditioning/minimax/cached. It needs ComfyUI v0.30.0+ with native H3 nodes (validated against v0.34.2), a MiniMax H3 encoder checkpoint in models/text_encoders, and no dependencies beyond the safetensors ComfyUI already bundles.
The honest caveat
Two caveats stack here, so read them both. First, this is a Ref2VA-based node, and the author's own docs flag the Ref2VA path as less battle-tested than FL2VA - it delegates to ComfyUI's stock Reference to Video implementation and shares its cache architecture, but hasn't seen the same depth of real-world workflow testing. Second, this is the least common configuration in the pack: you're combining the newer reference path with the two-resolution bookkeeping, so you're the most likely person to hit something the author hasn't. If a workflow-specific issue shows up, that's a report-upstream moment, not a sign you misconfigured it. And if you don't actually have an upscale branch, skip the Dual Resolution node entirely - the plain cached Ref2VA is simpler and won't tempt you into paying for an encode you don't use.
Inputs (30)
| Name | Type | Default | Description |
|---|---|---|---|
| clip_name | COMBO | MiniMax H3 text/vision encoder (Qwen3-VL) checkpoint from models/text_encoders. Loaded lazily -- only on a cache miss. | |
| vae | VAE | — | |
| audio_vae | VAE | — | |
| prompt | STRING | — | |
| width | INT | 134432–16384 | — |
| height | INT | 76832–16384 | — |
| width_upscale | INT | 134432–16384 | Encoded through the same fully independent cached path as width -- with cache_mode auto a cache HIT when the encoder input ends up identical, otherwise a real encode; cache_mode refresh always re-encodes. |
| height_upscale | INT | 76832–16384 | Encoded through the same fully independent cached path as height -- with cache_mode auto a cache HIT when the encoder input ends up identical, otherwise a real encode; cache_mode refresh always re-encodes. |
| length | INT | 1245–3600 | Frame count at 24 fps, (124 = ~5s, trained range is ~124-362) |
| ref_image_size | COMBO | match | Reference image sizing. 'match' scales each ref (down only, keeping aspect) to the generation's pixel area; 'max' uses the reference pipeline's 2048px short edge for best identity fidelity. Reference tokens ride through every sampling step, so 'max' can be several times slower. |
| ref_image_0opt | IMAGE | Reference image (downscaled to 2048 short edge if larger, never upscaled) | |
| ref_image_1opt | IMAGE | Reference image (downscaled to 2048 short edge if larger, never upscaled) | |
| ref_image_2opt | IMAGE | Reference image (downscaled to 2048 short edge if larger, never upscaled) | |
| ref_image_3opt | IMAGE | Reference image (downscaled to 2048 short edge if larger, never upscaled) | |
| ref_image_4opt | IMAGE | Reference image (downscaled to 2048 short edge if larger, never upscaled) | |
| ref_image_5opt | IMAGE | Reference image (downscaled to 2048 short edge if larger, never upscaled) | |
| ref_image_6opt | IMAGE | Reference image (downscaled to 2048 short edge if larger, never upscaled) | |
| ref_image_7opt | IMAGE | Reference image (downscaled to 2048 short edge if larger, never upscaled) | |
| ref_image_8opt | IMAGE | Reference image (downscaled to 2048 short edge if larger, never upscaled) | |
| ref_video_0opt | IMAGE | Reference video frames at 24 fps (2-15s) | |
| ref_video_1opt | IMAGE | Reference video frames at 24 fps (2-15s) | |
| ref_video_2opt | IMAGE | Reference video frames at 24 fps (2-15s) | |
| ref_video_audio_0opt | AUDIO | Soundtrack of the same-numbered reference video | |
| ref_video_audio_1opt | AUDIO | Soundtrack of the same-numbered reference video | |
| ref_video_audio_2opt | AUDIO | Soundtrack of the same-numbered reference video | |
| ref_audio_0opt | AUDIO | Standalone reference audio | |
| ref_audio_1opt | AUDIO | Standalone reference audio | |
| ref_audio_2opt | AUDIO | Standalone reference audio | |
| generate_upscale_condopt | BOOLEAN | true | When off, the second (upscale-resolution) encode is skipped entirely - positive_upscale comes back as None. Turn off for a plain generation where nothing downstream uses the upscale conditioning; turn on when you actually need it. Bypassing the upscale consumer downstream does NOT skip this encode by itself - this is the only thing that does, because the node runs as one atomic call. |
| cache_modeopt | COMBO | auto | auto: reuse the cached encode for an identical prompt + reference images/videos/audio + clip_name (checkpoint identity = filename+size+mtime+ctime) if one exists, otherwise encode and save it. refresh: ignore any cached encode, always re-encode and overwrite the cache. Applies to both resolutions. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| latent | LATENT | — |
| positive_upscale | CONDITIONING | — |