MiniMax H3 双MODEL潜空间放大长视频 / Dual Model Long Video (EXP/T8)
The 4+4 long-video node
- model_pass1
- model_pass2
- clip
- video_vae
- audio_vae
- prompt_relay_plan
- drive_audio
- final_audio
- first_frame
- last_frame
- persistent_identity_image
- ref_images
- ref_videos
- ref_video_audios
- ref_audios
- source_motion
- video
- video_path
- manifest_path
- completed_segments
- status
- report_json
Long video with a diffusion model is a stitching problem wearing a costume. The interesting answer in this pack is that you don't have to generate every second of your 24-second clip at full resolution: run a coarse pass at 512×288 on one model, learn-upscale the latent, then refine on a second, independent model at 1024×576. Four steps, upscale, four steps. That's the whole idea, and it's why this node takes two MODEL inputs instead of one.
It's the honest kind of experimental node too. The author's own release notes say the 24-second chains are the ones still failing on seams, and that after a 2026-09-12 fix only the two-segment 8-second template got the "接缝似乎还行 / the seams seem OK" verdict. So: read the 8-second templates as the supported path and 24 seconds as a thing you're allowed to try.
How it works
Everything happens inside this one node, serially - you queue once. For each segment of total_duration_seconds, the first pass samples coarse_steps (default 4) at low_width × low_height, and hands the learned upscaler a predicted clean latent x0, not a noisy mid-trajectory tensor. The learned H3 latent upscaler (models/latent_upscale_models/minimax_h3_latent_upscaler_3d_fp16.safetensors) doubles the latent geometry. Then the second pass runs refine_steps (default 4) on model_pass2 with its own dual-clock, native-flow schedule - not a copy of the first pass's time steps.
Segments overlap by context_frames (default 22, which is 7 latent time units) and render_window_frames defaults to 124, in multiples of 17. chain_id names the resumable job; if you change the prompt, model, LoRA, duration or size, change the id.
Audio is the part to actually understand, because that's what broke in earlier builds. With second_audio_source=auto, a 4+4 pass lets the second sampler finish the audio jointly - only a complete Stock20 first pass locks it. Both spatial continuations then carry the completed audio forward. Older workflows that froze half-finished first-pass audio are migrated, and the log says so. If you want to nudge rather than replace that behaviour, second_audio_strength defaults to 0 and does not override the native mask in auto mode.
color_match (default on) samples the last five frames of the accepted previous segment and applies bounded colour correction to the first 24 frames of the continuation. video_context_mode defaults to reference_only; the EXP alternative, high_native_mask_exp, drops the previous segment's final high-resolution tail into the known region of the second pass and locks it there. Don't switch that mode while reusing a chain_id - the stage cache belongs to the mode.
The inputs you set first
model_pass1 / model_pass2 (each with its own LoRA chain - that's the point), low_width/low_height and the final width/height, upscaler_model, coarse_steps/refine_steps, clip (native H3 Qwen3-VL), video_vae and audio_vae, plus total_duration_seconds, global_prompt and chain_id. There are optional first_frame/last_frame, reference images/videos/audios, drive_audio, final_audio and color_match.
It outputs video, video_path, manifest_path, completed_segments, status and report_json. Wire video into a save/preview node; the manifest is what makes resume work.
Install
ComfyUI Manager → search MiniMax H3 Audio T8, or:
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/comfyui-minimax-h3-audio-T8.git minimax-h3-audio-T8
Then restart completely. This node adds no Python dependencies of its own, but you need the H3 base models in models/diffusion_models, the Qwen3-VL encoder in models/text_encoders, both VAEs in models/vae, and the latent upscaler in models/latent_upscale_models. No download of the pack's models happens automatically.
Traps, in the order you'll hit them
Both final dimensions must be strictly larger than the first-pass ones, and the target size has to be representable by the learned upscaler's geometry - miss it and you get a geometry error before any GPU work happens, which is the right behaviour and still annoying at 11pm. eav_mode only applies to a Stock20 (coarse_steps=20) first pass; for 4+4 it must stay disabled, so if you turned it on, turn it off.
Resume verifies content: hashes of both models, the upscaler, your media, and the pack's own Python files. Updating the nodes invalidates a half-finished chain, and that's deliberate - just re-run.
And don't stack this with VDN, or with SLA/VSA/Sol-Attn/BlockCache model-takeover nodes. VDN's 8+4 is a different route; two attention owners in one graph is how you get silent wrongness rather than an error message. If you're on 16GB, run one job at a time and lower resolution before you lower step counts.
Inputs (67)
| Name | Type | Default | Description |
|---|---|---|---|
| model_pass1 | MODEL | — | |
| model_pass2 | MODEL | — | |
| low_width | INT | 51232–16384 | — |
| low_height | INT | 28832–16384 | — |
| upscaler_model | COMBO | 0 options: | |
| coarse_steps | COMBO | 4 | 2 options: 4, 20 |
| refine_steps | COMBO | 4 | 3 options: 3, 4, 5 |
| first_shift_video | FLOAT | 12.000.01–100 | — |
| first_shift_audio | FLOAT | 3.000.01–100 | — |
| second_shift_video | FLOAT | 12.000.01–100 | — |
| second_shift_audio | FLOAT | 3.000.01–100 | — |
| second_audio_source | COMBO | auto | 4 options: auto, legacy_policy, first_pass, highres_template |
| second_audio_strength | FLOAT | 0.000–1 | — |
| clip | CLIP | Native MiniMax H3 Qwen3-VL CLIP. | |
| video_vae | VAE | — | |
| audio_vae | VAE | — | |
| chain_id | STRING | h3_dual_model_long_video | — |
| total_duration_seconds | FLOAT | 24.000.04–3600 | — |
| width | INT | 102432–16384 | — |
| height | INT | 57632–16384 | — |
| render_window_frames | INT | 124124–362 | — |
| context_frames | COMBO | 22 | 3 options: 5, 22, 39 |
| global_prompt | STRING | Used when Prompt Relay is disabled. With Relay, leave empty or copy the Plan global prompt exactly. | |
| segment_prompts_json | STRING | Prompt overrides must be empty when Prompt Relay owns the timeline. | |
| prompt_relay_mode | COMBO | disabled | disabled is exact bypass; report_only compiles/projects Relay without attention bias; apply_exp enables the projected route. |
| query_chunk_rows | INT | 25632–2048 | — |
| eav_mode | COMBO | disabled | Stock20 only. report_only audits CFI/g without modifying attention; apply_exp enables target-video FETA gain. |
| eav_tau | FLOAT | 4.00-32–32 | — |
| eav_start_video_progress | FLOAT | 0.000–0.99 | — |
| eav_end_video_progress | FLOAT | 1.000.01–1 | — |
| eav_max_workspace_mib | INT | 324–512 | — |
| eav_g_hard_limit | FLOAT | 1.501–3 | — |
| minimum_free_vram_mib | INT | 5120–65536 | Rechecked before every segment; this is a start floor, not a peak guarantee. |
| base_seed | INT | 1234567890–18446744073709550000 | — |
| seed_policy | COMBO | increment | 3 options: increment, fixed, hash_chain_segment |
| task_type | COMBO | auto | 7 options: auto, T2VA, I2VA, FL2VA, L2VA, Ref2VA, +1 |
| context_audio | COMBO | video_and_audio | 2 options: video_and_audio, video_only |
| audio_mode | COMBO | native | 4 options: lock_source, remix_source, reference_only, native |
| audio_denoise_strength | FLOAT | 0.350–1 | — |
| add_source_as_reference | BOOLEAN | true | — |
| prompt_primary_audio_ordinal | INT | 00–9 | — |
| strict_prompt_tags | BOOLEAN | true | — |
| ref_image_size | COMBO | match | 2 options: match, max |
| reference_video_policy | COMBO | official_2_to_15s | 2 options: official_2_to_15s, model_minimum |
| first_frame_reuse | COMBO | segment0_only | 2 options: segment0_only, persistent_identity_reference |
| persistent_identity_strategy | COMBO | single_reference | 2 options: single_reference, scene_plus_identity |
| persistent_identity_interval | INT | 11–32 | — |
| resume_existing | BOOLEAN | true | — |
| filename_prefix | STRING | H3_In_Node_Effects_Long_Video | — |
| audio_seam_policy | COMBO | cosine_bridge | 2 options: cosine_bridge, none |
| bridge_ms | FLOAT | 5.00–50 | — |
| bit_depth | COMBO | 8 | 2 options: 8, 10 |
| crf | INT | 180–51 | — |
| prompt_relay_planopt | H3_T8_PROMPT_RELAY_PLAN | — | |
| drive_audioopt | AUDIO | — | |
| final_audioopt | AUDIO | — | |
| first_frameopt | IMAGE | — | |
| last_frameopt | IMAGE | — | |
| persistent_identity_imageopt | IMAGE | — | |
| ref_imagesopt | COMFY_AUTOGROW_V3 | — | |
| ref_videosopt | COMFY_AUTOGROW_V3 | — | |
| ref_video_audiosopt | COMFY_AUTOGROW_V3 | — | |
| ref_audiosopt | COMFY_AUTOGROW_V3 | — | |
| source_motionopt | H3_T8_DANCE_MOTION | Dance RGB motion source. Read a different source interval per segment; generated continuity is separate. | |
| color_matchopt | BOOLEAN | true | Match each continuation to the accepted RGB tail; bounded color correction only, not geometry repair. |
| video_context_modeopt | COMBO | reference_only | EXP: constrain high-pass overlap to the accepted final tail. Audio unchanged; inspect the full continuation. |
| low_context_sourceopt | COMBO | independent_low_x0 | Accepted picture: re-encode the previous accepted movie tail for LOW video guidance only. Adds a short VAE encode, no sampling steps. New chain_id when switching. Example reviewed at 0.4MP/8s/22 context/4+4. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| video_path | STRING | — |
| manifest_path | STRING | — |
| completed_segments | INT | — |
| status | STRING | — |
| report_json | STRING | — |