Nodes/ComfyUI-CineStack-H3/CineStack H3 Director
ComfyUI Node

CineStack H3 Director

Ten Seconds of H3 Is Five Shots — This Node Runs All of Them

By guomenghao·Created 6 days ago·Updated 2 days ago· 0
CineStack H3 Director
  • 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
  • first_pass_video
  • final_video
◄task_typet2v — 文生视频(Text to Video)►
◄global_promptA cinematic scene with natural motion and synchronized ambience►
◄cfg1.00►
◄seed0►
◄frame_rate24.00►
◄width864►
◄height480►
◄ref_max_size864►
◄total_frames124►
◄timeline_data►
◄steps25►
◄samplerres_multistep►
◄schedulersimple►
◄shift_video12.00►
◄shift_audio3.00►
◄clear_vram_between_segmentstrue►
◄clear_vram_before_refinefalse►
◄clear_vram_before_face_refinefalse►
◄cache_frames_codecraw►
◄export_source_imagesfalse►
◄export_pre_face_refinefalse►
◄cache_name►

MiniMax H3 is a 33B omni-modal video model: 4–15 second clips, 24fps, stereo audio generated jointly with the picture instead of bolted on afterwards. That's genuinely great, and also the whole problem. You don't want a ten-second clip, you want a scene - and the official H3 graph gives you one shot per chain, so five segments means five copies of the graph and a full re-render when segment 3 has a bad hand.

CineStack H3 Director is the answer to that specific annoyance. It's one node that holds a whole multi-segment timeline, generates it segment by segment, caches each segment to disk, and lets you redo just the one you hate.

What it actually is

This is a workbench node, not a sampler. Under the hood it does what the official H3 template does - encode the prompt with the minimax CLIP, build an audio+video latent, patch the model with MiniMaxH3SigmaShift, run a single-stage KSampler at CFG 1.0, then decode through LTXVSeparateAVLatent into frames and audio. The difference is that it repeats that per segment, writes each result to output/minimax_seg_cache/<cache_name>_<nodeid>/, and keeps a per-segment seed so a redo doesn't nuke the shots you approved.

The pack is an honest fork: AIMixer's MiniMax H3 Director, Apache-2.0, with segment seeds, strict cache reuse, selective rework and rolling export added on top. It's young - 0.6.11, Git-only, no Registry listing, almost no community thread trail yet - so you're trusting the README and the source.

The inputs that matter

The four socket inputs are non-negotiable: model (the H3 UNET), video_vae, audio_vae, and clip. audio_vae is a required socket even for pure t2v, where the tooltip says it's only for r2v/v2v/rv2v. Plug it in anyway - H3 decodes audio as part of the deal.

On the widget side, start here:

  • task_type - t2v, i2v, fl2v, r2v, v2v, rv2v, or mixed if different segments need different modes. Reference modes use <Picture 1>, video-to-video uses <Video 1> in the prompt.
  • global_prompt for the text, width/height at 864×480 for a first test, and total_frames for length. Frames snap to H3's 17k+5 grid, so 124 is your ~5 seconds at 24fps; asking for 120 quietly becomes something else.
  • steps 25, sampler res_multistep, scheduler simple, cfg 1.0, shift_video 12, shift_audio 3 - those are the official template values. Leave them alone until something looks wrong.

timeline_data is marked internal and populated by the UI. Don't type in it.

The rest of the sockets are where the pack earns its keep: i2v_groups and r2v_groups take external shot packs from the Group nodes (external wiring wins over the UI cards), and semantic_bridge, selflift, refine, face_refine chain the four optional refinement nodes into the same pass.

Outputs, and where they go

Ten outputs, and the pair at the end is the important one. first_pass_video and final_video are VIDEO types meant to go straight into the official SaveVideo with format auto - that's the file-backed rolling path, where FFmpeg reads and merges per-segment files instead of rebuilding the whole film as one giant IMAGE tensor in Python.

If you prefer the classic route, images and audio go through CreateVideo → SaveVideo as usual, with the caveat that the whole timeline then lives in RAM at once. report is a STRING - stick a PreviewAny on it and read what actually happened. images_pre_refine is the first pass before any second sample; images_pre_face_refine stays blocked unless FaceRefine is connected and its "output pre-face-refine" switch is on.

Install

Standard custom-node install, in the same Python environment that runs ComfyUI:

cd ComfyUI/custom_nodes
git clone https://github.com/guomenghao/ComfyUI-CineStack-H3.git
python -m pip install -r ComfyUI-CineStack-H3/requirements.txt

That file pulls opencv-python-headless, imageio-ffmpeg, scenedetect and ultralytics - the last is a hefty install, and given the December 2024 compromised-Ultralytics incident that reached ComfyUI users through detector nodes, keep it current rather than pinned to something ancient. nvidia-vfx, for RTX VSR upscaling, is deliberately not a hard dependency: AMD and cloud boxes would break.

You also need ComfyUI with H3 support, plus the weights: minimax_h3_fl2va_pruned_int8_convrot.safetensors for t2v/i2v/fl2v, minimax_h3_ref2va_pruned_int8_convrot.safetensors for the reference modes (both in models/diffusion_models/), qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors in models/text_encoders/, and the fp16 video VAE plus fp32 audio VAE in models/vae/. In CLIPLoader, the type must be minimax. Nodes live under CineStack/H3.

Where people get burned

Turning the file outputs on without rolling mode. Wire final_video into SaveVideo in normal mode and the pack tells you to enable rolling generation, because the file ports only exist on that path.

Assuming "fixed" means reproducible. Fixed seeds manage attempts; they don't guarantee pixel-identical frames across models, versions or cards. Cache reuse is stricter but pickier - change the prompt, seed or sampling settings and the cached first pass no longer matches, and "second pass only" stops and names the segment and the field instead of silently re-running.

Expecting rolling generation to be a memory ceiling. It removes decoded-frame accumulation; it doesn't make model residency, current-canvas size or VAE decode free. On a 24GB card keep clear_vram_between_segments on (it's the default), and switch on clear_vram_before_refine when your two passes use different UNETs.

Missing nodes after an update. Restart the server and hard-refresh (Ctrl+F5). 0.6.11 specifically patched panel remount and load retries on the Nodes 2.0 frontend, so if the Director panel is blank, update before you debug.

And one non-technical trap worth knowing before you invest a weekend: the MiniMax H3 community licence excludes the US, EU, UK and South Korea from its applicable territory. That has nothing to do with this pack, and everything to do with whether you're licensed to run the weights at all.

CategoryCineStack/H3

Inputs (36)

NameTypeDefaultDescription
modelMODELMiniMax H3 UNET (UNETLoader).
video_vaeVAEMiniMax H3 video VAE (minimax_h3_video_vae).
audio_vaeVAEMiniMax H3 audio VAE (minimax_h3_audio_vae). Required for r2v / v2v / rv2v.
clipCLIPCLIPLoader type=minimax (qwen3vl).
task_typeCOMBOt2v — 文生视频(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_promptSTRINGA cinematic scene with natural motion and synchronized ambienceUser 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_sampleBDGROUP采样设置—
cfgFLOAT1.000–30CFG for KSampler.
seedINT00–18446744073709550000Random seed for sampling.
frame_rateFLOAT24.001–240Timeline / output FPS (H3 trained at 24).
widthINT86432–8192—
heightINT48032–8192—
ref_max_sizeINT86432–8192—
total_framesINT1245–100000Frame count at 24 fps; snapped to MiniMax 17k+5 grid (124 ≈ 5s).
timeline_dataSTRINGInternal — video, segments, refs (populated by UI).
i2v_groupsoptMMX_DIR_GROUPExternal 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_groupsoptMMX_DIR_GROUPExternal Reference to Video group(s). When connected, overrides UI cards for execution (external priority). Connect Group (Reference to Video).group, or Groups Combine.
semantic_bridgeoptMMX_DIR_SEMANTIC_BRIDGEOptional 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.
selfliftoptMMX_DIR_SELFLIFTOptional 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.
refineoptMMX_DIR_REFINEOptional 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_refineoptMMX_DIR_FACE_REFINEOptional 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_advancedoptBDGROUP高级采样—
stepsoptINT251–200一采步数(官方模板 25)。接了 sigmas 口后忽略此项,改用外接噪声表。
sampleroptCOMBOres_multistepOfficial template: KSamplerSelect res_multistep.
scheduleroptCOMBOsimple一采调度器(官方模板 simple)。接了 sigmas 口后忽略此项,改用外接噪声表。
shift_videooptFLOAT12.000.01–100MiniMaxH3SigmaShift shift_video.
shift_audiooptFLOAT3.000.01–100MiniMaxH3SigmaShift shift_audio.
bd_grp_perfoptBDGROUP性能—
clear_vram_between_segmentsoptBOOLEANtrue段间清理显存:每段结束后卸载模型并清空 CUDA 缓存。
clear_vram_before_refineoptBOOLEANfalse二采前清理显存:一采结束后、放大或二采开始前卸载模型并清空 CUDA 缓存。默认关。24GB 或一采/二采不同 UNET 时勾上,可降低二采峰值,但每段会多一次加载。
clear_vram_before_face_refineoptBOOLEANfalse脸修前清理显存:成片解码后、FaceRefine 开始前卸载模型并清空 CUDA 缓存。默认关。未接 FaceRefine 时无效。24GB 或解码后立刻 OOM 时勾上,但每段会多一次加载。
cache_frames_codecoptCOMBOraw分段缓存的像素帧怎么存。raw:uint8 .pt,读写快,磁盘大。ffv1:无损压缩,体积大约三分之一,命中和写入都会多一次编解码。两种都能读;某一段被重新写入时才换成当前选项。latent / 音频缓存不受影响。
export_source_imagesoptBOOLEANfalse将时间轴原片解码到独立的 source_images 输出口;需将 source_images 另接预览/合成节点才能查看,不会改变主 images。默认关以节省内存。
export_pre_face_refineoptBOOLEANfalse将修脸前的视频输出到 images_pre_face_refine,方便和 images 对比。分段导出时同时写入 seg_XXXX_facepre.mp4。默认关:该口阻断、下游不执行,也不占成片内存。未接 FaceRefine 时无效。
cache_nameoptSTRING分段缓存目录:output/minimax_seg_cache/<这个名字>_<节点id>/。留空 = 只用节点 id(旧行为,已有缓存目录不变)。填了名字后,同一张图里的不同导演台、以及节点 id 不同的工作流会分开存放。复制工作流后节点 id 通常不变,名字也相同的话仍然共用一个目录;要隔开就改名字。非法字符 / \ : * ? " < > | 会自动替换成下划线。
sigmasoptSIGMAS可选。一采噪声表,接 BasicScheduler 或 ManualSigmas。接线后覆盖导演台「步数」和「调度器」(采样器下拉仍有效)。BasicScheduler 请接 SigmaShift 之后的同一套 H3 MODEL。不接则仍用步数 + 调度器、denoise=1 自动算表。

Outputs (10)

NameTypeDescription
imagesIMAGE—
audioAUDIO—
fpsFLOAT—
frame_countINT—
source_imagesIMAGE—
reportSTRING—
images_pre_refineIMAGE—
images_pre_face_refineIMAGE—
first_pass_videoVIDEO—
final_videoVIDEO—