Nodes/ComfyUI-MiniMaxH3-Context-Loop/MiniMaxH3ChainUpscaleAdvance
ComfyUI Node

MiniMaxH3ChainUpscaleAdvance

You'll never add this node by hand — and that's exactly why it matters

By ethanfel·Created 30 days ago·Updated about 19 hours ago· 383
MiniMaxH3ChainUpscaleAdvance
  • next_state
  • H3_CHAIN_MANIFEST
  • STRING
  • IMAGE
  • LATENT
loop_id

If you search for this node, here's the first thing to know: you are not supposed to wire it up yourself. MiniMaxH3ChainUpscaleAdvance lives in the _internal/minimax/upscale category for a reason - it's an implementation detail of the MiniMax H3 Context Loop pack's deferred upscale machinery, and it only exists so long, multi-scene upscales don't melt your GPU.

Where it comes from

When you render an H3 video and then run it through a proper external upscaler - the pack's deferred-upscale workflows use things like SeedVR2, an LBH H3 latent upscaler, or a pixel upscaler - it doesn't do the whole movie at once. It goes scene by scene: each saved scene's RAW HQ frames are decoded, upscaled, and saved before the next scene starts. That loop is driven by Upscale Loop End, which recurses using ComfyUI's GraphBuilder.

Here's the subtlety that made these internal nodes necessary. If the loop kept every scene's full-resolution frames around while waiting to recurse, ComfyUI's output cache would pin them all in memory. At 1920×1088 a single RGB float32 frame batch can run to gigabytes - a handful of scenes and you've OOM'd before the upscaler even sees the second one. So Loop End splits each iteration in two. First a handoff node consumes the just-saved scene's big tensors and produces the state. Then this node, Advance, continues the loop into the next scene - with only a small state object and a loop id as inputs. No full pixel input, nothing heavy to pin.

Inputs and outputs

Which is exactly what its schema shows. Just two required inputs:

  • next_state - an H3_CHAIN_UPSCALE_STATE, the compact state handed over from the handoff step.
  • loop_id - the id of the originating Upscale Loop End node, so the recursion knows where to continue.

Its four outputs mirror Upscale Loop End's own outputs (H3_CHAIN_MANIFEST, STRING, IMAGE, LATENT) - the manifest, status JSON, context frames and latent that downstream assembly sees once the recursion finishes. From your side the whole thing looks like one continuous upscale; the Advance node is the seam in the middle.

Practical advice

Leave it alone. If you're following a deferred-upscale example workflow and you see MiniMaxH3ChainUpscaleAdvance (and its partner MiniMaxH3ChainUpscaleHandoff) flash by in the executed graph, that's the recursion working as intended - don't delete them, don't rewire them. If you're building an upscale graph from scratch, you wire Upscale Loop End, not this.

The usual install applies: ComfyUI Manager (search "MiniMax H3 Context Loop") or

git clone https://github.com/seitanism/ComfyUI-H3-Motion-Context-MultiRef.git
git clone https://github.com/ethanfel/ComfyUI-MiniMaxH3-Contex-Loop.git

plus a ComfyUI build with native MiniMax H3 support and the H3 model files. One genuinely useful troubleshooting note: this lazy handoff/advance split is part of the pack's pixel-upscale memory work, so if you're chasing out-of-memory errors on a long upscale, update to the latest release before you start buying RAM. And if your upscale recursion fails, the fault is almost always in the graph you built around it - these nodes just do what Loop End tells them.

Category_internal/minimax/upscale

Inputs (2)

NameTypeDefaultDescription
next_stateH3_CHAIN_UPSCALE_STATE
loop_idSTRING

Outputs (4)

NameTypeDescription
H3_CHAIN_MANIFESTH3_CHAIN_MANIFEST
STRINGSTRING
IMAGEIMAGE
LATENTLATENT