MiniMax H3 Unified To Video (best-effort)
Three native H3 nodes, collapsed into one
- clip
- video_vae
- audio_vae
- first_frame
- last_frame
- references
- picture_1
- picture_2
- picture_3
- picture_4
- video_1
- video_audio_1
- audio_1
- audio_2
- positive
- av_latent
- conditioned_prompt
- media_map_json
- report
MiniMax H3's native ComfyUI support is spread across several nodes: EmptyMiniMaxH3LatentAV makes the latent, MiniMaxH3ImageToVideo handles keyframes, MiniMaxH3ReferenceToVideo handles references. Fine for a clean text-to-video, but the moment you want keyframes and reference images and a reference video with its own audio and a standalone audio clip, you're juggling three nodes and manually keeping tag numbering consistent.
This node collapses that whole stack into one: it builds the AV latent, tags every piece of media into a single <Picture N> / <Video N> / <Audio N> sequence, and hands you ready-to-sample positive conditioning plus the av_latent in one shot.
The essential inputs:
clipandvideo_vae- your H3 text encoder and VAE.prompt- the H3 prompt text.mode-auto(use whatever's wired),keyframe(ignore all reference inputs),reference(ignore first/last frame),hybrid, ortext(ignore all media).width,height,duration,fps- generation size and length; duration is snapped to H3's frame grid.ref_image_size-matchscales reference images to the generation's own pixel area (cheaper);maxuses H3's higher-fidelity 2048px-short-edge reference pipeline (slower, better).
Optional media inputs: first_frame / last_frame (anchored as literal keyframes at frame 0 and the final frame, like the native I2V node does), picture_1–4, video_1, video_audio_1, audio_1/audio_2 - and a references bundle (type H3_REFS) you can wire straight from the "Fantastic H3 Prompt Builder" pack's MiniMaxH3MediaLoader or MiniMaxH3PromptBuilder. Direct sockets win per-slot; the bundle fills in the rest, up to its own capacity (9 pictures, 3 videos, 3 paired video audios, 3 audios).
Outputs: positive (CONDITIONING), av_latent (LATENT), plus conditioned_prompt, media_map_json (a JSON summary of what was attached and how it was tagged, with a warnings list), and report for humans.
Provenance, straight up: this is a best-effort reimplementation of a node type from a privately-distributed H3 workflow with no public source. The frame/canvas/latent math is copied verbatim from ComfyUI's real native H3 nodes so shapes stay byte-for-byte compatible; the merging of keyframe and reference pathways into one unified tag sequence is inferred from a single saved prompt in the source workflow. The pack's model card rates it "medium" confidence. Treat it as a strong starting point, not a verified clone.
Two gotchas. First, the migration one: reference sockets were renamed from the old ref_image_0/ref_video_0 style to the 1-indexed picture_1/video_1/audio_1 names that match MiniMaxH3ReferenceSplitter. If you have an existing workflow, delete the node instance and place a fresh one - reloading in place won't pick up the new socket names cleanly. Second, a reference video longer than the requested output gets trimmed to fit, and both report and media_map_json tell you exactly how many frames were dropped - no silent truncation.
Install:
cd ComfyUI/custom_nodes
git clone https://github.com/jjmaden/comfyui-jjmaden-random-nodes
Restart ComfyUI, or search "JJMaden Random Nodes" in ComfyUI Manager. You need a current ComfyUI with native H3 support, plus the separately-installed siblings this pack doesn't ship (MiniMaxH3SigmaShift in core, the SageAttention patch in KJNodes, MiniMaxH3ReferenceSplitter in the Fantastic H3 Prompt Builder pack). No extra Python deps; the H3 weights are a separate large download. For the mixed-keyframe-plus-references workflow, this is the node that makes the graph readable again - one node instead of three, and one tag sequence instead of your best guess.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | CLIP | — | |
| video_vae | VAE | — | |
| prompt | STRING | — | |
| mode | COMBO | auto | auto/hybrid = use whatever is wired. keyframe = ignore ref_* inputs. reference = ignore first_frame/last_frame. text = ignore all media. |
| width | INT | 134432–16384 | — |
| height | INT | 76832–16384 | — |
| duration | FLOAT | 5.00.2–150 | Seconds; converted to a frame count via fps and snapped to H3's grid. |
| fps | INT | 241–60 | — |
| ref_image_size | COMBO | match | match = scale refs to the generation's pixel area. max = use the 2048px reference pipeline (slower, higher fidelity). |
| audio_vaeopt | VAE | — | |
| first_frameopt | IMAGE | — | |
| last_frameopt | IMAGE | — | |
| referencesopt | H3_REFS | Wire this straight from MiniMaxH3MediaLoader's or MiniMaxH3PromptBuilder's 'references' output instead of using a Reference Splitter. Fills in whichever picture_N/video_N/video_audio_N/audio_N slot below isn't directly wired (up to 9 pictures / 3 videos / 3 paired video_audios / 3 standalone audios). | |
| picture_1opt | IMAGE | — | |
| picture_2opt | IMAGE | — | |
| picture_3opt | IMAGE | — | |
| picture_4opt | IMAGE | — | |
| video_1opt | IMAGE | — | |
| video_audio_1opt | AUDIO | — | |
| audio_1opt | AUDIO | — | |
| audio_2opt | AUDIO | — |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| av_latent | LATENT | — |
| conditioned_prompt | STRING | — |
| media_map_json | STRING | — |
| report | STRING | — |