Mpi H3 Image To Video
One MiniMax H3 conditioning node for every mode — t2v, first-frame, last-frame, or both
- clip
- vae
- first_frame
- last_frame
- positive
- latent
If you've loaded any MiniMax H3 workflow into a recent ComfyUI, you know the shape of it: before the sampler sits an image-to-video conditioning node that takes your clip, your VAE, a prompt and - optionally - a first or last frame, and hands the sampler a positive conditioning and a latent. H3 is the 33B omni-modal video model that landed with day-zero ComfyUI support (in 0.30.0) and does something most local video models can't: it generates a soundtrack with the picture, one joint AV latent.
Core ComfyUI ships a node for that job, MiniMaxH3ImageToVideo. MpiH3ImageToVideo, from the MadPonyInteractive/ComfyUi-MpiNodes pack ("ComfyUi-MpiNodes"), is a wrapper around that core node that fixes two genuine annoyances - which is a nicer place to be than a from-scratch reimplementation, because the tensor math stays ComfyUI's own and can't drift from it.
Why you'd reach for this one
It tolerates empty frames. Core's node skips a keyframe that arrives as None, but a graph can't push None down a connected link. So covering all four modes - text-to-video, first-frame i2v, last-frame-only, and first+last - meant keeping four copies of the node behind a lattice of boolean switches. That's what a host app had to compile, and what this node kills: "empty" means nothing connected or an Mpi loader with block_if_empty off (which emits a 1×1 image). A genuinely black frame reports its real size and passes through untouched, so you don't lose legitimately black keyframes.
It cover-crops both frames to the canvas. Core is asymmetric about this: it stretches first_frame (crop disabled) while it cover-crops last_frame. Feed an off-aspect source and the first frame comes back squashed, and the two keyframes disagree with each other. This node crops both before delegating. Crop, never pad - letterbox bars baked into frame 0 get animated as scenery.
There's a second payoff that matters if you do H3 latent upscaling: because the keyframe latent is encoded at the first stage's dimensions, a second conditioning at upscaled dimensions is what a refine pass needs - an upscaled latent otherwise raises a shape mismatch inside SamplerCustomAdvanced.
The inputs that matter
clip,vae- from your H3 checkpoint loader and VAE loader, same as any core setup.prompt- your positive text.width/height- canvas size, default 1344×768, stepped to multiples of 32.length- frame count at 24 fps. Default 124 (about 5 s); the trained range is roughly 124–362 frames. Feed this from the pack's MpiH3Length node - H3 only generates frame counts wheren % 17 == 5, so a "clean" number like 120 isn't reachable and whole seconds mostly aren't either.first_frame/last_frame- optional IMAGE inputs, exactly as described above.
The two outputs are positive (CONDITIONING) and latent (LATENT). Wire positive into your sampler's positive socket and latent into its latent input; decode the result with the pack's H3 decode/save side (MpiH3DecodeAV, or a VAE decode) to get your clip plus its soundtrack.
Install
Same as every node in this pack. In ComfyUI Manager, search ComfyUi-MpiNodes, install, restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/MadPonyInteractive/ComfyUi-MpiNodes
Then restart ComfyUI. No extra Python dependencies and no model download for the node itself - but you need ComfyUI 0.30.0 or newer for H3 support, and this node will tell you so with a clear error if it's missing. The H3 weights themselves are the real install: roughly 42.5 GB, and under the MiniMax H3 Community License they're not licensed for local use in the US, EU, UK or South Korea. Worth knowing before you build a workflow around it. Note the pack switched to AGPL-3.0 at version 1.2.7 (earlier releases remain MIT).
Troubleshooting
- "MiniMax H3 nodes are missing - MpiH3ImageToVideo needs ComfyUI 0.30.0 or newer." The pack's import guard caught your ComfyUI being too old. Update ComfyUI; H3 only exists there.
- Frame count feels wrong - you typed a raw number instead of feeding
lengthfrom MpiH3Length. H3 snaps to its17k+5grid, so hand-picked "round" counts land you somewhere else entirely. - First frame looks squashed or the keyframes disagree - that's the core asymmetry this node fixes; if you're still seeing it, the image is probably already at canvas size and being passed through, or you're looking at a workflow wired straight to core's node instead.
- Sampler raises a shape mismatch on an upscaled latent - you need the second conditioning at upscaled dimensions, which is exactly the case this node is built for.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | CLIP | — | |
| vae | VAE | — | |
| prompt | STRING | — | |
| width | INT | 134432–16384 | — |
| height | INT | 76832–16384 | — |
| length | INT | 1245–3600 | Frame count at 24 fps (124 = ~5 s, trained range ~124-362). Feed it from MpiH3Length. |
| first_frameopt | IMAGE | Geometry anchor at frame 0. Leave unconnected, or feed a loader with block_if_empty OFF, to skip it. | |
| last_frameopt | IMAGE | Follower at the final frame. Leave unconnected, or feed a loader with block_if_empty OFF, to skip it. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| latent | LATENT | — |