MiniMax H3 Cast to Video
Stop Hand-Typing <Picture> Tags — Let H3 Cast to Video Number Them
- clip
- vae
- audio_vae
- cast_1
- cast_2
- cast_3
- scene_asset
- scene_images
- positive
- latent
- final_prompt
- report
If H3CastMember is the save file, H3CastToVideo is the game. It's the compose node for the whole pack: connect up to three saved cast members plus optional scene reference images, write your prompt in plain language - "Maya sits by the window reading" - and it does the grunt work of MiniMax H3's multi-reference pathway for you, including writing the <Picture i> / <Audio j> intro lines.
Why does that matter? H3's native reference node is powerful but raw. You're expected to number every reference slot by hand, budget nine image slots across characters and scene, and keep the intro text and the actual refs in perfect sync. Get one tag wrong and the model quietly binds the wrong person to the wrong slot. This node does that bookkeeping, and it's the difference between a reusable workflow and a spreadsheet.
How it works
Under the hood it wraps the stock MiniMaxH3ReferenceToVideo node - no new conditioning mechanism, so every native knob keeps working. It takes each cast member's saved views in order, fans them into ref_image_1..9, fills ref_audio_1..3 with voices, and builds the intro for you:
<Picture 1>, <Picture 2>: Maya -- red jacket, nervous energy. <Audio 1> is Maya's voice.
Then your prompt just says "Maya". Three members is the max, and the 9 image slots are shared by all members plus scene images - max_views_per_member (default 3) controls the split.
Inputs that matter
clip,vae- your H3 CLIP and video VAE, same as the native node.audio_vae- the H3 audio VAE. If any member has a voice andinclude_voicesis on, this is required; the node refuses to run rather than silently dropping audio. Set it or flipinclude_voicesoff.prompt- refer to characters by name; the tooltip is explicit that the intro lines are written for you.scene_images+scene_description- extra reference images of the location (room renders, and a batch means one ref slot per frame). Concrete detail inscene_descriptionanchors the background far better than the generic placeholder - think of it like an Image Reference description.width/height/length- defaults 1344×768, 124 frames, the native node's own defaults.max_views_per_member,auto_intro- the slot split and whether intros get written at all.
The ref_* knobs (ref_spacing, ref_strength, ref_decay, ref_ramp, ref_image_size, temporal_stretch) pass straight through to the native node. If your ComfyUI build's H3 nodes predate one of them - temporal_stretch exists on the kat3ri fork but not everywhere - it's dropped and noted in the report instead of throwing.
Outputs
positive (CONDITIONING) and latent (LATENT) wire into BasicGuider / SamplerCustomAdvanced exactly like the native node. Then two freebies: final_prompt is the exact text that got sent (so nothing is a black box - if a character is misbehaving, look here first), and report lists slot usage. Anything dropped - a member's later views crowded out by a scene image, a voice over the 3-clip cap - is listed, not silently ignored.
Why you'd reach for it
Character consistency across a clip is H3's marquee strength, and the community's read on its reference-to-video quality was essentially "reference to video can replace LoRAs for many use-cases." This node makes that repeatable: same cast, same scene pack, any prompt, no tag arithmetic. If you're generating more than one clip with the same people, it's the one you'll actually reach for.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/kat3ri/ComfyUI-H3-Cast
# restart ComfyUI - node appears under "MiniMax H3/cast"
Or search "ComfyUI-H3-Cast" in ComfyUI Manager. No extra Python dependencies, and no API key - everything runs through the native node on your own machine. You do need the H3 weights (a separate download), and remember the model's community license doesn't cover the US, EU, UK or South Korea.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | CLIP | — | |
| vae | VAE | — | |
| prompt | STRING | Refer to characters by NAME -- the <Picture i>/<Audio j> intro lines are written for you (see final_prompt output) | |
| width | INT | 134432–8192 | — |
| height | INT | 76832–8192 | — |
| length | INT | 1245–3600 | — |
| max_views_per_member | INT | 31–9 | Views taken per cast member, in saved order. 9 total image slots are shared by all members + scene images. |
| auto_intro | BOOLEAN | true | Write the '<Picture 1>, <Picture 2>: Name -- description' intro lines automatically |
| audio_vaeopt | VAE | — | |
| cast_1opt | H3_CAST_MEMBER | — | |
| cast_2opt | H3_CAST_MEMBER | — | |
| cast_3opt | H3_CAST_MEMBER | — | |
| scene_assetopt | H3_SCENE_ASSET | A saved location/background from H3 Scene Asset. Combines with scene_images if both are connected. | |
| scene_imagesopt | IMAGE | Extra reference images of the location/scene (e.g. room renders); batch = one ref slot per frame. Combines with scene_asset if both are connected. | |
| scene_descriptionopt | STRING | What's actually in the scene -- used verbatim in the intro line instead of scene_asset's saved description or the generic 'the location where this scene takes place.' placeholder. Concrete detail here (like Plan v2's Image Reference description) is what actually anchors the model to the background; leave blank to use scene_asset's saved description, if any. | |
| include_voicesopt | BOOLEAN | true | — |
| ref_image_sizeopt | COMBO | match | 2 options: match, max |
| ref_spacingopt | FLOAT | 1.00–50 | — |
| ref_strengthopt | FLOAT | 1.000–1 | — |
| ref_decayopt | FLOAT | 0.000–1 | — |
| ref_rampopt | FLOAT | 0.00–50 | — |
| temporal_stretchopt | FLOAT | 1.01–100 | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| positive | CONDITIONING | — |
| latent | LATENT | — |
| final_prompt | STRING | — |
| report | STRING | — |