MiniMax H3 CLIP-Cached FL2VA (Dual Resolution)
The Dual Resolution FL2VA
- vae
- first_frame
- last_frame
- positive
- latent
- positive_upscale
Latent-upscale H3 workflows have a bookkeeping problem: you want one generation at a base resolution and a second conditioning prepared for an upscaled resolution, and the honest way to build that with separate nodes means wiring the same prompt, same encoder, same keyframes, same frame count into two conditioning nodes and hoping they never drift apart. MiniMaxH3CLIPCachedFL2VADualRes is the pack's answer: one node that prepares both the base MiniMax H3 conditioning/latent and a matching upscale-resolution conditioning from a single shared set of inputs.
Get the framing right and everything else falls into place: this node is not an upscaler. It doesn't resize your video or touch pixels. It prepares the conditioning and latent both branches need - positive + latent for the base width/height, and positive_upscale for width_upscale/height_upscale. The actual latent upscaling happens in a separate latent-upscale node downstream, which is why there's no upscale latent output: the second pass builds an empty latent internally and discards it, because a real upscale workflow takes the base latent, resizes it externally, and feeds the result in alongside positive_upscale.
Inputs and outputs
It carries the same core inputs as the single-resolution cached FL2VA node - clip_name (encoder from models/text_encoders, loaded lazily), vae, prompt, width, height, length, optional first_frame/last_frame - plus the two extra resolution fields width_upscale/height_upscale. length defaults to 124 frames (~5 s at 24 fps) and is snapped to the model's frame grid.
Two controls deserve attention. cache_mode (auto/refresh) applies to both resolutions at once. And generate_upscale_cond, on by default, is the only switch that skips the second encode: flip it off and positive_upscale comes back as None and no upscale cache lookup happens. This matters more than it looks, because the node runs as one atomic call - bypassing or disconnecting the downstream upscale consumer does not skip the upscale encode by itself. If you're generating plain single-resolution output while the Dual Resolution node sits in the graph, turn generate_upscale_cond off or you'll pay an encode you're not using. Outputs: positive, latent, and positive_upscale.
How caching works across the two resolutions
Each resolution runs the normal cached path independently, and each makes its own hit/miss decision based on what Qwen3-VL would actually see. With cache_mode=auto, the interesting case is when both resolutions produce the same effective encoder input - no keyframes, or keyframes that resize identically. Then they resolve to the same cache entry, the first pass creates it, and the second pass is an instant hit: Qwen3-VL loads at most once per run. When keyframes make the pixels differ per resolution, both encode for real and get their own entries, exactly as two separate nodes would. refresh deliberately re-encodes both passes even when they'd share an entry - expect the encoder to load twice on that run.
When the two resolutions do produce distinct entries, the pack records them as a base/upscale pair so its Cache Manager UI can show them together instead of two identical-looking rows.
Installing
Same pack, same routine: ComfyUI Manager (search "MiniMax H3 CLIP-Cached"), or
cd ComfyUI/custom_nodes
git clone https://github.com/Mu5hr00moO/ComfyUI-MiniMaxH3-CLIPCached
Restart ComfyUI; the node sits under model/conditioning/minimax/cached. Requirements are the pack-wide ones: ComfyUI v0.30.0+ with native H3 nodes (validated against v0.34.2), the MiniMax H3 encoder checkpoint in models/text_encoders, and nothing beyond the safetensors ComfyUI already provides.
The honest caveat
Reach for this node specifically when a latent-upscale branch is in the workflow - that's the use case it exists for, and the reason its shared inputs can't silently drift. If you never upscale, the single-resolution cached FL2VA is simpler and skips the second pass entirely by not existing. Also remember the MiniMax H3 weights carry a community license excluding the US, EU, UK and Korea - worth checking before you invest in the workflow at all.
Inputs (12)
| 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 | — | |
| 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, snapped up to the model's 17k+5 grid (124 = ~5s; trained range is ~124-362, longer is untested) |
| first_frameopt | IMAGE | — | |
| last_frameopt | IMAGE | — | |
| 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+first_frame+last_frame+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 | — |