MiniMax H3 In-Node Long Video Loop / 节点内循环长视频 (Advanced EXP/T8)
H3 long video that renders every segment in a single execution
- model
- clip
- video_vae
- audio_vae
- drive_audio
- final_audio
- first_frame
- last_frame
- persistent_identity_image
- ref_images
- ref_videos
- ref_video_audios
- ref_audios
- long_video_sampling_plan
- video
- video_path
- manifest_path
- completed_segments
- status
- report_json
MiniMax H3 generates clips in bounded windows - the model's native length tops out around 15 seconds, and the pack's baseline window is 124 frames. Anything longer means stitching segments, and the old way of doing that in ComfyUI is a queue of separate runs with you babysitting each one. This node is the "fire and forget" alternative the README points new long-video users at: one execution generates every segment strictly in sequence, accepts each completed segment atomically, survives interruption by resuming from disk, and streams the accepted files into one final video. You queue it once, go make coffee, and come back to a finished clip.
The key design decisions are in the description, so read them carefully. Segments run strictly in sequence - deterministic, no parallel VRAM gambling. Each completed segment is atomically accepted before the next starts, which is how interruption recovery works: what's on disk is trusted and complete. And critically, this route intentionally has no per-segment human review gate. If you want to eyeball every segment before it's committed, the pack says plainly to use the existing Background/Accepted workflow instead. This node is for people who trust the process; the review path is for people who don't.
The inputs that matter
The schema is big because it's a full pipeline in one node. The ones you'll actually touch:
- model, clip (the native H3 Qwen3-VL CLIP), video_vae, audio_vae - the usual four
- chain_id - names this job; resume keys off it, so don't change it mid-run
- total_duration_seconds (30) - how long the finished video is; segments are derived from this and the window
- width / height (736×416) and render_window_frames (124 baseline) - canvas and per-segment length
- global_prompt and segment_prompts_json - the story; per-segment overrides let you change prompt/seed per shot
- base_seed + seed_policy (increment) - how seeds roll across segments
- steps (4), shift_video (12), shift_audio (3), sampler_name (
dual_clock_euler), scheduler (native_flow) - the sampling stack - audio_mode, audio_denoise_strength (0.35) - sound handling, including
lock_sourceto preserve original audio - resume_existing (true) - resume only when the saved job contract matches; disable to force a fresh chain
Outputs: video, video_path, manifest_path, completed_segments (INT - how far you got, handy after a resume), status, and report_json.
Installing it
Part of the T8mars/comfyui-minimax-h3-audio-T8 pack - search "MiniMax H3 Audio T8" in ComfyUI Manager, install, restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/comfyui-minimax-h3-audio-T8.git minimax-h3-audio-T8
Update ComfyUI itself first (recent core: comfy_api.latest, comfy.weight_adapter, comfy.patcher_extension, comfy.ldm.minimax); requirements.txt is intentionally empty. The canonical workflow is 04-long-video/In_Node_Long_Video_Loop - drag it in, replace the model and media, run.
Where people get burned
Two traps. First, the seed contract: base_seed + increment means a rerun doesn't give you the same frames unless the contract (prompts, LoRAs, sampling) is identical - which is also the condition for resume_existing to accept a resume. Change anything mid-run and the resume logic correctly refuses. Second, VRAM: the README's minimum_free_vram_mib-style floors exist for a reason; this node holds a lot in flight, so drop resolution/frame count before blaming the loop. And don't stack it with other nodes that own the sampler or MODEL forward path. FFmpeg on PATH matters too - the final mux and streaming into one video is where the "one file at the end" promise gets fulfilled.
Inputs (48)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | Native MiniMax H3 Qwen3-VL CLIP. | |
| video_vae | VAE | MiniMax H3 video VAE. | |
| audio_vae | VAE | MiniMax H3 audio VAE. | |
| chain_id | STRING | my_h3_in_node_long_video | — |
| total_duration_seconds | FLOAT | 30.000.04–3600 | — |
| width | INT | 73632–16384 | — |
| height | INT | 41632–16384 | — |
| render_window_frames | INT | 124124–362 | Each segment is sampled independently with this fixed H3 window. 124 is the bounded-memory baseline. |
| context_frames | COMBO | 22 | 3 options: 5, 22, 39 |
| global_prompt | STRING | — | |
| segment_prompts_json | STRING | Optional list/object. Each segment may override prompt, seed and note. | |
| base_seed | INT | 1234567890–18446744073709550000 | — |
| seed_policy | COMBO | increment | 3 options: increment, fixed, hash_chain_segment |
| steps | INT | 41–1000 | — |
| shift_video | FLOAT | 12.000.01–100 | — |
| shift_audio | FLOAT | 3.000.01–100 | — |
| sampler_name | COMBO | dual_clock_euler | 45 options: dual_clock_euler, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| scheduler | COMBO | native_flow | 11 options: native_flow, beta57, simple, sgm_uniform, karras, exponential, +5 |
| 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 | Resume only when the saved job contract matches. Disable to require an empty chain_id. |
| filename_prefix | STRING | H3_In_Node_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 | — |
| model_id | STRING | unknown | — |
| 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 | — | |
| long_video_sampling_planopt | H3_T8_LONG_VIDEO_SAMPLING_PLAN | Optional Tail/manual second-pass plan. Disconnect to preserve the original loop sampler and cache contract. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| video_path | STRING | — |
| manifest_path | STRING | — |
| completed_segments | INT | — |
| status | STRING | — |
| report_json | STRING | — |