MiniMaxH3Director
Turn a model that does one clip into a node that edits a scene
- model
- video_vae
- audio_vae
- clip
- bd_grp_sample
- i2v_groups
- r2v_groups
- semantic_bridge
- selflift
- refine
- face_refine
- bd_grp_advanced
- bd_grp_perf
- sigmas
- images
- audio
- fps
- frame_count
- source_images
- report
- images_pre_refine
- images_pre_face_refine
MiniMax H3 was the release that finally gave open weights what Veo had in closed ones: video and stereo audio generated together in one pass, no separate "add a soundtrack" step. The catch for ComfyUI users is that the official H3 nodes are single-shot. One prompt, one clip, done. That's fine for a clip. It's wrong for a scene.
MiniMaxH3Director (also registered under the legacy id ComfyMiniMaxH3Director) is what you reach for when one clip isn't the job: a timeline editor packed into one node. You split, trim, and reorder segments, type a prompt per segment, queue - and it handles conditioning, sampling, AV decode and export for every segment in order, handing you one finished video with sound. No API, no key; it just drives the official H3 pipeline harder.
How it works
Each segment runs through ComfyUI's official MiniMaxH3ImageToVideo or MiniMaxH3ReferenceToVideo conditioning (tokenization happens internally, so you don't wire up text encoding yourself), then a single-stage KSampler at CFG 1.0 with MiniMaxH3SigmaShift applied, then an AV-latent decode that splits picture and stereo audio apart. The task_type menu decides which official node runs per segment: t2v, i2v, and fl2v (first-last frame) go down the fl2va path; r2v, v2v, and rv2v go down the reference path and need the audio_vae. There's a "mixed" mode too, if you want different segment types in one timeline.
The interesting trick is segment continuity. With inter-segment guidance on in the UI (default off), the tail motion and generated audio of one segment get pinned into the next and cropped off after sampling - which is what stops a multi-segment video from feeling like five videos glued together. Credit for the approach goes to ComfyUI-H3-Motion-Context.
Wiring it up
The pack needs ComfyUI 0.30.0+ - it calls ComfyUI's official MiniMax H3 nodes (PRs #15224/#15228) and refuses to load without them. Install:
cd ComfyUI/custom_nodes
git clone https://github.com/AIMixer/ComfyUI_MiniMaxH3_Director.git
pip install -r ComfyUI_MiniMaxH3_Director/requirements.txt
Restart, or use ComfyUI Manager → Install via Git URL with the same URL. requirements.txt adds opencv-python-headless, imageio-ffmpeg, and scenedetect for the v2v/rv2v source-video features and smart shot-splitting.
Models aren't bundled - that's the heavy part. You need the H3 video VAE, the H3 audio VAE (fp32), a Qwen3-VL CLIP loaded with CLIPLoader type = minimax, and two UNETs: fl2va for t2v/i2v/fl2v, ref2va for r2v/v2v/rv2v. The README points at Comfy-Org's MiniMax-H3 repo on Hugging Face or the author's Comfyit pack. This is a 33B model at roughly 42.5 GB full precision, so grab the pruned/int8 variants the README recommends and bring a real GPU. And check your region before downloading: the MiniMax H3 Community License excludes the US, EU, UK, and South Korea from running the local weights - a licensing fact, not a technical one.
The inputs that matter
The four model inputs are model, video_vae, audio_vae, and clip (minimax-type Qwen3-VL). Then the few you actually touch:
task_type- t2v / i2v / fl2v / r2v / v2v / rv2v / mixed. Picks the official node and the UNET the workflow expects.global_prompt- sent straight to the H3 node. In r2v you reference a loaded image as<Picture 1>; in v2v the source segment is auto-bound as<Video 1>.frame_rate,width,height,total_frames- defaults 24 fps, 864×480 (0.4MP 16:9), 124 frames ≈ 5s; frame counts snap to MiniMax's 17k+5 grid.cfg(1.0 - not a typo, H3 wants it low),seed, plus the advanced group:steps25,samplerres_multistep,schedulersimple,shift_video12 /shift_audio3. All mirror the official template.
The optional sockets are where this gets interesting: i2v_groups / r2v_groups take multi-group packs from this pack's Group nodes (external input overrides the UI cards), and refine takes the MiniMax H3 Director Refine node for a second-pass polish or upscale.
Outputs
images (one frame list per segment), audio (native AUDIO - wire it to your sound-saving node), fps, frame_count, and a report string summarizing each segment's plan. With a refine node attached, images_pre_refine carries the first-pass result for comparison. Leave source_images disconnected unless you explicitly want the original timeline frames decoded - it won't touch the main images output.
Where people get burned
Same three complaints every time: missing official H3 nodes (upgrade ComfyUI), a ref2va clip dropped on the fl2va UNET (wrong model for the task type), and a CLIP loaded without type=minimax (garbage conditioning). One more: the report output is where decode failures get explained - the node prints gray placeholders rather than fake frames, so read it before assuming the sampler broke.
Inputs (35)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | MiniMax H3 UNET (UNETLoader). | |
| video_vae | VAE | MiniMax H3 video VAE (minimax_h3_video_vae). | |
| audio_vae | VAE | MiniMax H3 audio VAE (minimax_h3_audio_vae). Required for r2v / v2v / rv2v. | |
| clip | CLIP | CLIPLoader type=minimax (qwen3vl). | |
| task_type | COMBO | t2v — 文生视频(Text to Video) | MiniMax H3 支持 t2v / i2v / fl2v / r2v / v2v / rv2v / mixed。提示词直接送入 MiniMaxH3ImageToVideo 或 MiniMaxH3ReferenceToVideo(内部 tokenize)。mixed 为每段自选 t2v/i2v/fl2v/r2v;r2v 用 <Picture 1>;v2v/rv2v 为源视频时间轴编辑(自动绑定 <Video 1>);rv2v 另可挂参考图。 |
| global_prompt | STRING | A cinematic scene with natural motion and synchronized ambience | User prompt — sent directly to MiniMaxH3ImageToVideo / ReferenceToVideo. r2v: <Picture 1>. v2v: source-timeline edit (<Video 1>). rv2v: source timeline + reference images (<Video 1> + <Picture N>). |
| bd_grp_sample | BDGROUP | 采样设置 | — |
| cfg | FLOAT | 1.000–30 | CFG for KSampler. |
| seed | INT | 00–18446744073709550000 | Random seed for sampling. |
| frame_rate | FLOAT | 24.001–240 | Timeline / output FPS (H3 trained at 24). |
| width | INT | 86432–8192 | — |
| height | INT | 48032–8192 | — |
| ref_max_size | INT | 86432–8192 | — |
| total_frames | INT | 1245–100000 | Frame count at 24 fps; snapped to MiniMax 17k+5 grid (124 ≈ 5s). |
| timeline_data | STRING | Internal — video, segments, refs (populated by UI). | |
| i2v_groupsopt | MMX_DIR_GROUP | External Image to Video group(s) (t2v / i2v / fl2v). When connected, overrides UI cards for execution (external priority). Connect Group (Image to Video).group, or Groups Combine. | |
| r2v_groupsopt | MMX_DIR_GROUP | External Reference to Video group(s). When connected, overrides UI cards for execution (external priority). Connect Group (Reference to Video).group, or Groups Combine. | |
| semantic_bridgeopt | MMX_DIR_SEMANTIC_BRIDGE | Optional Semantic Bridge node (above SelfLift). When connected, official cond tokens are rewritten with the student MLP (RMS-norm → residual mix). Unconnected = identical. Distilled on FL2VA; r2v / v2v / rv2v is forced-compat — use with care. | |
| selfliftopt | MMX_DIR_SELFLIFT | Optional SelfLift node (above Refine). When connected, first-pass is low-res prefix + 3D lift + high-res tail on this Director canvas. Unconnected = current single-stage sample. Refine may still upscale afterward (e.g. 1.0MP first pass → 2.0MP). Timeline continuity keeps native low-res carry + high-res pin. Euler only. | |
| refineopt | MMX_DIR_REFINE | Optional Refine node. When connected, each segment runs a second sample pass (same-size refine, or upscale then sample). Wire a MODEL into Refine.refine_model to use a different UNET for that pass; unwired uses this Director model. images is the refined result; images_pre_refine is the first pass. Unconnected = single-pass (current behavior). | |
| face_refineopt | MMX_DIR_FACE_REFINE | Optional FaceRefine node. When connected, Director tracks the face on the final decoded frames (after Refine if that is also wired), re-samples the crop, and pastes the face back. images is after stitch; images_pre_face_refine is before stitch when「输出修脸前」is on (otherwise that output is blocked). Unconnected = no face pass (that output stays blocked). | |
| bd_grp_advancedopt | BDGROUP | 高级采样 | — |
| stepsopt | INT | 251–200 | 一采步数(官方模板 25)。接了 sigmas 口后忽略此项,改用外接噪声表。 |
| sampleropt | COMBO | res_multistep | Official template: KSamplerSelect res_multistep. |
| scheduleropt | COMBO | simple | 一采调度器(官方模板 simple)。接了 sigmas 口后忽略此项,改用外接噪声表。 |
| shift_videoopt | FLOAT | 12.000.01–100 | MiniMaxH3SigmaShift shift_video. |
| shift_audioopt | FLOAT | 3.000.01–100 | MiniMaxH3SigmaShift shift_audio. |
| bd_grp_perfopt | BDGROUP | 性能 | — |
| clear_vram_between_segmentsopt | BOOLEAN | true | 段间清理显存:每段结束后卸载模型并清空 CUDA 缓存。 |
| clear_vram_before_refineopt | BOOLEAN | false | 二采前清理显存:一采结束后、放大或二采开始前卸载模型并清空 CUDA 缓存。默认关。24GB 或一采/二采不同 UNET 时勾上,可降低二采峰值,但每段会多一次加载。 |
| clear_vram_before_face_refineopt | BOOLEAN | false | 脸修前清理显存:成片解码后、FaceRefine 开始前卸载模型并清空 CUDA 缓存。默认关。未接 FaceRefine 时无效。24GB 或解码后立刻 OOM 时勾上,但每段会多一次加载。 |
| cache_frames_codecopt | COMBO | raw | 分段缓存的像素帧怎么存。raw:uint8 .pt,读写快,磁盘大。ffv1:无损压缩,体积大约三分之一,命中和写入都会多一次编解码。两种都能读;某一段被重新写入时才换成当前选项。latent / 音频缓存不受影响。 |
| export_source_imagesopt | BOOLEAN | false | 将时间轴原片解码到独立的 source_images 输出口;需将 source_images 另接预览/合成节点才能查看,不会改变主 images。默认关以节省内存。 |
| export_pre_face_refineopt | BOOLEAN | false | 将修脸前的视频输出到 images_pre_face_refine,方便和 images 对比。分段导出时同时写入 seg_XXXX_facepre.mp4。默认关:该口阻断、下游不执行,也不占成片内存。未接 FaceRefine 时无效。 |
| sigmasopt | SIGMAS | 可选。一采噪声表,接 BasicScheduler 或 ManualSigmas。接线后覆盖导演台「步数」和「调度器」(采样器下拉仍有效)。BasicScheduler 请接 SigmaShift 之后的同一套 H3 MODEL。不接则仍用步数 + 调度器、denoise=1 自动算表。 |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| audio | AUDIO | — |
| fps | FLOAT | — |
| frame_count | INT | — |
| source_images | IMAGE | — |
| report | STRING | — |
| images_pre_refine | IMAGE | — |
| images_pre_face_refine | IMAGE | — |