license: mit
tags:
- comfyui
- custom-nodes
- minimax-h3
- video-generation
- text-to-video
language:
- en
pipeline_tag: text-to-video
base_model:
- MiniMaxAI/MiniMax-H3
H3-LongVideos
One prompt in. A ~2-minute MiniMax-H3 video with audio out.
A ComfyUI node pack that turns a single written prompt into a long, continuous H3 video β automatically splitting it into shots, chaining them together, and keeping characters, wardrobe and audio consistent across the whole thing.
H3 caps a single generation at 362 frames (~15s). This node writes the shots for
you, chains each one from the last frame of the previous, and hands back one
images + audio pair for the finished video.
Why this exists
Chaining H3 shots by hand means solving the same problems over and over:
- The model renders a character twice when the prompt names them more than once.
- A character changes clothes between shots, or a removed jacket comes back.
- Mouths move and produce gibberish on shots that have no dialogue.
- Someone who walked out of frame reappears two shots later.
- A 12-shot chain runs out of VRAM halfway through.
This pack fixes those in the prompt-assembly and memory layers, so the shots you write are the shots you get.
Install
- Open the Files and versions tab above and download all the files.
- Create a new folder called
H3-LongVideosinsideComfyUI/custom_nodes/. - Drop the downloaded files into it, so you have:
ComfyUI/
βββ custom_nodes/
βββ H3-LongVideos/
βββ __init__.py
βββ sampler.py
βββ shot_length.py
βββ inspector.py
βββ test_prompt_logic.py
βββ README.md
- Restart ComfyUI β a full server restart, not just a browser refresh.
Requires ComfyUI 0.30+ with native MiniMax-H3 support.
Dependencies
None. No pip install, no requirements.txt, no third-party node packs.
Everything is Python's standard library plus ComfyUI core (nodes, comfy.utils,
comfy.samplers, comfy.model_management, comfy.nested_tensor,
node_helpers, folder_paths).
You do need the standard H3 model files, loaded with ComfyUI's own loaders:
| File | Loader |
|---|---|
| H3 diffusion checkpoint | Load Diffusion Model |
| Qwen3-VL text encoder | CLIP Loader |
minimax_h3_video_vae |
VAE Loader β vae |
minimax_h3_audio_vae |
VAE Loader β audio_vae |
Optional integrations
These are detected at runtime and never required β if a pack isn't installed,
the node falls back cleanly and reports it in info. Nothing here can break a
render by being absent.
| Feature | Needs | Fallback if missing |
|---|---|---|
upscale: rtx |
Nvidia_RTX_Nodes_ComfyUI (RTX Video Super Resolution) | falls back to model, then lanczos |
upscale: model |
any upscale model in models/upscale_models (Real-ESRGAN, UltraSharp, β¦) β uses ComfyUI's built-in loader |
falls back to lanczos |
| Live previews during sampling | a tiny H3 preview decoder (taeh3) in models/vae_approx |
previews fall back to latent2rgb |
Higher-quality upscaling (SeedVR2, LTX-2.3) runs as a separate pass on this
node's images output β it is not wired into the node and needs no integration.
Nodes
| Node | Purpose |
|---|---|
| H3 Long Videos V1 | The main node. Prompt + length β chained video + audio. |
| H3 Shot Length | One shot length as both seconds and a valid 17k+5 frame count. |
| H3 Model Inspector | Reports checkpoint precision (BF16/FP8/INT8/NVFP4/MXFP8) and whether your card runs it natively. |
Quick start
Wire model, clip, vae and audio_vae from the standard H3 loaders, then:
Prompt β first paragraph is the scene and style, each later paragraph is one shot:
A cinematic aircraft hangar and airfield, warm late-afternoon light.
Slow, smooth camera movement. Minimal motion blur.
Teresa walks in and crosses to the workbench.
Dan asks Teresa, "Did you bring the engine as requested?"
Teresa points at the crate in the corner.
character_memory β who is in the video, as attributes:
Teresa = she, mid-thirties, slim, blonde hair, biker t-shirt, leather pants
Dan = he, forties, brown hair, black t-shirt, jeans
That's it. Set resolution, steps and seed, and queue.
Set plan_only to preview the shot split β how many shots, how long each,
total runtime β instantly, without rendering.
What it handles for you
Character and wardrobe state
Clothing lives in one mutable channel, so it can actually change:
- Removals are read from your prose. "She takes off her jacket" drops the jacket, and it stays gone. Gated on items the character is actually wearing, so "the plane takes off" removes nothing.
- Per-person.
Teresa -= jacketdoesn't touch Dan. - Framing-independent. A close-up that crops the trousers won't make the next shot reinvent them.
- Exits stick. "He walks out of the hangar" removes him from every later shot β and a later pronoun can't summon him back.
Duplication control
The most common cause of a character rendering twice is the prompt introducing them twice. The node assembles each shot so that:
- Each person is described once, bound inline at their first mention.
- People named or described in the anchor are stripped from it (the anchor is stamped into every shot, so a name there is a second introduction).
- Noun phrases become attributes β
a woman with silver hairβsilver hairβ becauseShe (a woman withβ¦)reads as two subjects. - Generic camera-direction references (
the camera follows **the subject**) are rewritten, so they don't summon an unnamed extra body. - An explicit subject count is added below native resolution or when a LoRA is applied.
Audio
- Non-dialogue shots are silenced. Any beat without a quoted line gets an explicit lips-closed instruction, so mouths don't flap and vocalise gibberish.
mute_nonspeech_audiogoes further and zeroes those shots' audio outright β deterministic rather than asking the model nicely.- Music is opt-in. A blank music field emits the schema's
N/Atoken, so H3 doesn't improvise a score. - Dialogue-fit warnings flag lines too long for the shot they're in, before you render.
VRAM
- Shot length is budgeted from card capacity minus measured weight size, scaled by resolution β so it adapts to any quant without special-casing.
- Between shots: decoded frames move to system RAM, and the text encoder and VAEs are evicted before sampling (ComfyUI keeps them resident otherwise).
- Checkpoint swaps are detected and flushed, so a stale model from a previous run doesn't poison the budget.
- Optional temporal/spatial VAE decode tiling for the largest allocation in a run.
- Reports free VRAM per shot in
infoso you can see whether a chain is stable.
Outputs
images Β· audio Β· info Β· script Β· frames_per_shot Β· total_frames Β·
shots Β· video_seconds
script is the literal text sent to the model for every shot β the first place to
look when a render doesn't match what you wrote.
Resolution
18 presets, all multiples of 32, in three short-edge tiers per aspect ratio:
- native 768 β H3's trained size, best detail
- balanced 640
- fast 512 β renders faster, frees VRAM, allows longer shots
Lower tiers are for the generate-low-then-upscale workflow. H3 distorts faces on wide shots at any resolution, so keep faces reasonably large in frame.
Settings that matter
| Setting | Base model | Low-step checkpoint (e.g. MXFP8) |
|---|---|---|
steps |
~20 | 8 |
shift_video / shift_audio |
12 / 3 | 8 / 3 |
sampler / scheduler |
res_multistep / simple |
same |
cfg |
1.0 (H3 is CFG-free) | 1.0 |
Low steps on a base checkpoint is the single most common cause of soft output.
Honest limitations
Things this node cannot fix, because they're the model or the hardware:
- Distilled/turbo LoRAs override prompts. Compressing ~20 steps into 4β8 means composition, identity and age settle in the first step or two. Expect character drift, invented content and duplication that prompt engineering can't undo.
- Multi-subject weaknesses. Identity binding, attribute cross-wiring and multi-speaker audio all degrade as you add people. Keep characters visually distinct and prefer one speaker per shot.
- Rigid objects (chains, tools, thin metal) deform frame to frame. No prompt setting fixes it.
- A checkpoint larger than your VRAM will stream, and some spill is structural before a single frame is allocated.
- Audio can't cross a shot boundary. Each shot generates its own, so a line of dialogue spanning a cut won't be continuous. Lay a continuous ambience bed under the video in post.
Tested on
RTX 5060 Ti 16GB (Blackwell, sm_120), ComfyUI 0.31.1, CUDA 13.3.
Measured on that card, 1344Γ768, pruned NVFP4 (11.7GB resident): 243 frames
(10s) per shot renders comfortably; 362 frames (~15s) overflows. Setting
NVIDIA's CUDA β Sysmem Fallback Policy to Prefer No Sysmem Fallback freed
roughly 800MB and was the single largest VRAM win found during development.
Testing
python3 test_prompt_logic.py
Runs the full prompt-assembly suite (duplication, wardrobe, exits, dialogue, audio, VRAM budget) against a 12-beat chain with no GPU and no ComfyUI required.
Licence
Node pack: MIT.
MiniMax H3 itself uses a custom territorial licence whose open-weight grant excludes the US, EU, UK and South Korea. This pack contains no model weights β check H3's own licence terms before using the model.