I update frequently. As soon as I see a bug, I kill it. I apologize for the crazy morning of chaos updates!
Profil d'exécution
Description de la source
I update frequently. As soon as I see a bug, I kill it. I apologize for the crazy morning of chaos updates!
2.1.2 — reference images, per-shot saves, and six repairs
One new capability and a set of fixes. The chaining itself is untouched: nothing here changes how shots join, so a graph that renders well today renders identically after updating.
New: reference images actually have a way in
The sampler's reference_images input has existed since 2.0, and SETTINGS.md documented it — as unwired , because nothing in the shipped workflow was connected to it. There was no way to use it without building the lane yourself.
The full workflow now carries a REFERENCE lane in the anchors column: two image loaders → ImageBatch → a gate → the sampler. It ships with the gate off , so nothing changes until you turn it on. Point the loaders at portraits of your character, flip the gate, and they ride into every shot as , . Chain another ImageBatch for a third and fourth. Needs a ref2va checkpoint.
Commentaire généré par l’IA
Explication générée par l’IA à partir des détails de la source et de la configuration. Les suggestions sont clairement signalées.
Use this MiniMax-H3 ComfyUI workflow to turn a story or shot prompts into one continuous video with sound; it takes prompts or a prompt file plus a MiniMax-H3 checkpoint and produces a joined video with audio.
Shots are chained into one continuous take. The full version adds an LLM writer, identity and voice anchors, batch prompts, boundary plates, and an audio spine; optional lanes start off.
For manual input, provide one prompt per shot, separated by a line containing `---`; you can also point the prompt source at a file.
With `save_every_shot` enabled, each decoded shot is saved to `output/video/H3_SHOTS/` alongside the master. These copies are made before seam trimming, so adjacent shots overlap by about a second.
Use ComfyUI v0.30.0 or newer. Copy `ComfyUI-H3-Multishot/` into `ComfyUI/custom_nodes/`; the full workflow also uses `ComfyUI_JoyAI_Echo_GGUF_Nodes/`. Restart ComfyUI and load a workflow from `workflows/`.
The full workflow’s local Ollama writer uses the `qwen3:14b` model tag by default. Pull that tag first, or set the endpoint URL in `base_url` and its exact model tag in `model_name`.
`H3_Seamless_Chain_CORE` and `H3_Seamless_Chain_v2` list `MiniMax-H3-ref2va-curve-Q8_0.gguf`, `qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors`, `minimax_h3_video_vae_fp16.safetensors`, and `minimax_h3_audio_vae_fp32.safetensors`. `H3_Keyframes` lists `MiniMax-H3-fl2va-Q5_1.gguf` ,
The full workflow lists `comfyui-custom-scripts` and `comfyui-easy-use`, along with `ComfyUI-H3-Motion-Context`, `RES4LYF`, `ComfyUI-sol-attn`, and `comfyui-minimax-h3-blockcache-T8`.
In the full workflow, turn on the reference-image gate to pass character portraits from the image loaders into every shot. They carry identity without setting shot 1’s composition; this needs a ref2va checkpoint.
For a starting render, use the listed `euler` sampler, `context_pin` continuity, 14 steps, 24 fps, and 362 frames per shot. The full workflow uses `beta57`; CORE uses `beta`.
Suggestion
You can connect a custom `SIGMAS` schedule to replace the generated schedule; when connected, the steps and scheduler widgets are ignored.
The custom `SIGMAS` input has not been exercised in a render.
A saved v2.0 or v2.1 workflow may retain an old `system_prompt` that overrides the mode dropdown. Clear that field to use the current prompt files.
Faut-il modifier cela ?
Connectez-vous pour envoyer une demande de modification.
Sources
1 sourceExtraits de sources
1 extraitSource context: 10753 downloads · Type Workflows · Base model MiniMax H3
Unlike the identity anchor above it, these are not a first frame — they do not constrain shot 1's composition, they only carry who the person is. That also makes them the thing that covers shot 1 , where the memory bank is still empty and has nothing to carry identity from yet.
New: every shot can be saved as it renders
A chain only became a file at the very end, when the master was muxed. So anything that failed after the last shot destroyed the entire run — and one report was three hours lost to an out-of-memory error at the mux, after every shot had already rendered successfully. The work existed and was thrown away, which is the worst version of that bug rather than the mildest.
save_every_shot (on both samplers) writes each shot to output/video/H3_SHOTS/ the moment it decodes, alongside the master. If the mux dies you have every shot on disk and a joining job instead of a lost day. Files are written before the seam trim, so consecutive shots overlap by about a second — the master is still the clean join, these are the safety copy. Requested in issue #13.
New: custom sigma schedules
The samplers built the schedule themselves from steps + scheduler , with no way to supply your own — so a turbo LoRA that ships the curve it needs could not use it, and ran wrong rather than refusing. Both samplers now take an optional SIGMAS input. Connect one and it replaces the schedule entirely, steps rebinds to len(sigmas)-1 so the two-pass upscale split is taken as a fraction of your curve, and the console states that the steps and scheduler widgets are being ignored instead of silently overriding you. Link-only input, so saved graphs load unchanged. Issue #14.
Fixed: --- separators were ignored in passthrough mode
example_script.txt ships --- separated and every document tells you to write scripts that way, but the writer's passthrough path returned the whole file as ONE shot — which the sampler then repeated to fill shot_count . Pasting a finished four-shot script rendered the entire text as shot 1, four times over. It now splits on exactly the same rule the sampler uses. A single paragraph is still one shot, so .txt batches are unaffected.
Fixed: a stale prompt-set filename killed the whole queue
ComfyUI validates every combo value in a graph before it runs anything. If RiftPromptSource 's saved source_file no longer existed — a renamed folder, a workflow shared from another machine, or the prompt lane simply switched to manual — the queue failed with Value not in list and nothing ran, including the lanes that were perfectly fine. Switching to manual did not disable it, because validation happens before the switch is ever consulted.
The node now declares VALIDATE_INPUTS , so the filename is resolved only if the node actually executes. Manual mode now genuinely disables it. If it does run and the file is missing, the error names the file.
Fixed: the writer
These three only matter if you let the LLM write your shots. If you paste your own shot list, they change nothing for you.
Every story came out 15 shots. The system prompt ordered exactly 15 whenever the brief didn't ask for a count, so the model never got to decide. It now counts the story's beats and lands where the story lands — measured 4–7 on ordinary briefs, and about 7 when the brief gives no length signal at all. Seven chained shots is roughly 65 seconds at 243 frames, which clears the 1-minute mark platforms pay on. Ask for a specific count and you still get exactly that count.
The mode dropdown did nothing. The shipped workflow's system_prompt box held a frozen copy of the long-story prompt, and a filled box overrides the per-mode prompt file — so every mode ran the long prompt no matter what the dropdown said, and prompt updates in the pack never reached anyone using the shipped graph. The box now ships empty and the dropdown works. If you saved your own copy of the v2.0 or v2.1 workflow, clear that box by hand — your saved graph still carries the old frozen prompt, and this update cannot reach it. Related: short_story is now 1–3 shots instead of always exactly 1.
A messy answer from the model no longer kills the render. Three separate real failures, all seen on local models: a markdown fence sharing a line with the payload ( ```json {"prompts":... ) was destroyed by the fence stripper; a reply truncated at the token ceiling left no balanced object to recover; and parsing sat outside the retry loop, so one malformed answer ended a run after a 100–240 s call that a re-ask usually fixes. The order is now clean → parse → retry ×3 → salvage the shots that completed → fail, and the final error names passthrough mode as the escape hatch.
Verification, plainly. The reference lane, the per-shot saves and the --- fix are all confirmed by a live chained render, not by inspection: the console logs 2 reference image(s) ride in every shot as , PASSTHROUGH: 4 shot(s) (it would have said 1 before the fix), and shot 1/4 saved through shot 4/4 saved , with four files on disk. The three JSON failures are unit-tested against the actual captured payloads that caused them; the live re-run afterwards parsed on the first attempt, so that proved no regression rather than proving the salvage path fires in a real queue. Shot counts were measured over two runs of five briefs on a local 8B: 4–7 shots, ±1 between runs — before the change all five returned 15. The custom sigmas input has not been exercised by a render — it needs a schedule source wired in, and I would rather say so than imply it.
Install
Unzip. Copy both node folders into ComfyUI/custom_nodes/ :
ComfyUI-H3-Multishot/ the sampler and helper nodes ComfyUI_JoyAI_Echo_GGUF_Nodes/ the LLM prompt writer (full workflow only)
Restart ComfyUI. ComfyUI v0.30.0 or newer is required — that is the release with native MiniMax-H3 support.
Load a workflow from workflows/ through the workflow menu.
The full workflow needs five packs (two are in this zip): the writer pack below, ComfyUI-H3-Motion-Context for the context_pin default, RES4LYF for the beta57 scheduler, and ComfyUI-sol-attn + comfyui-minimax-h3-blockcache-T8 for the VRAM panel; ComfyUI-Custom-Scripts adds the script preview. ComfyUI validates every node class before it will queue, so a missing pack stops the whole workflow rather than just its own feature — INSTALL.md lists how to remove each one instead if you would rather not install it. CORE needs none of them , and that is tested on a clean install.
On the Motion-Context fork. There is an active fork, ethanfel/ComfyUI-MiniMaxH3-Contex-Loop , well ahead of upstream with a disk-backed chain/loop system. It is a complement , not a replacement: by design it leaves the MiniMaxH3MotionContext node id to NikoDemon80's pack. Install the fork instead of upstream and context_pin still fails, because the node it calls is not there. Install both - they are built to coexist, and this pack works with either one's runtime patches. As of 2.1.1 the error message says so directly when it detects the fork.
The writer pack is RealRebelAI's ( github.com/RealRebelAI/ComfyUI_JoyAI_Echo_GGUF_Nodes ), modified so the workflow's join rules actually reach the model; NOTICE_RIFT_MODIFICATIONS.md inside it lists every change. If you already have that pack, replace it with this copy. The CORE workflow does not need it at all.
Models you need
checkpoint MiniMax-H3 ref2va (GGUF Q8_0 / Q5_1 / Q4_0) -> models/diffusion_models text encoder qwen3vl minimax_h3 (+ its -mmproj sidecar) -> models/text_encoders video VAE minimax_h3_video_vae -> models/vae audio VAE minimax_h3_audio_vae -> models/vae
GGUF quants: huggingface.co/joeygambino/MiniMax-H3-GGUF — Q8_0 for 32 GB, Q5_1 for 24 GB, Q4_0 below that.
GGUF encoder pairing. ComfyUI-GGUF matches the -mmproj vision sidecar to the encoder by filename, in the encoder's own folder. Rename either, or split them up, and it loads the encoder without its vision tower — which presents as the model ignoring your reference image. This pack's CLIP loader raises instead of continuing blind, uses the only mmproj beside the encoder when there is exactly one, and takes an mmproj_name widget so you can point at the file directly.
Which workflow
H3_Seamless_Chain_CORE — start here. The same seamless chaining with zero third-party packs . Type shots into the script box and queue.
H3_Seamless_Chain_v2 — everything: master controls, LLM writer, VRAM panel, identity and voice anchors, episode/batch prompt source, boundary plates, audio spine. Optional lanes are gated off by default.
H3_Keyframes — one clip, anchors at chosen frame positions, per-anchor condition strength.
The two things that stop people on the first run
The full workflow points at a local Ollama with model_name = qwen3:14b . If it is not pulled, the first queue stops immediately:
LLM API error 404: model 'qwen3:14b' not found
Fix: ollama pull qwen3:14b . Any OpenAI-compatible endpoint works — its URL in base_url , its exact tag in model_name . ollama list prints the tags you have, and it must match character for character.
No LLM at all? Set the master panel's use_file_prompts to manual entry, delete the writer, and feed your own script into the sampler's script input — one prompt per shot, separated by --- on its own line. CORE already works this way.
Turn on unload_model_after on the writer. It frees its own model from Ollama the moment the script is written. Without it the model stays resident for the server's default five minutes — your whole first shot. ComfyUI's own eviction cannot reach it, because Ollama is a separate process with its own allocator, and Ollama's OpenAI-compatible endpoint has no keep_alive field to ask with; the switch calls the native endpoint, which honours it. On under 32 GB, prefer a remote endpoint entirely.
Settings: start here, change nothing
checkpoint ref2va sampler euler continuity context_pin scheduler beta57 (full) / beta (CORE) steps 14 fps 24 frames/shot 362 (~15.1s, the trained maximum) resolution 1280x736 landscape or 768x1344 vertical
beta57 comes from RES4LYF , not stock ComfyUI. Measured on an identical seed it scored 10/10 for lip-sync against 8/10 for stock beta , with image quality, skin texture, artifacts and audio judged equal — so the full workflow ships it and lists RES4LYF as required, while CORE ships beta and keeps its zero-third-party-pack promise. One widget either way.
Leave every VRAM switch off and the reserve at 0 , and try a render before touching any of it. The activation reserve measures each shape and conditioning payload as it renders and sizes the pool itself; it holds on 24 GB cards as well as 32 GB. A hand-set reserve overrides that measurement, so a number that suited one shape becomes wrong for the next. Those switches exist to dig out of a spill the console has already named, not for pre-emptive tuning.
Resolution...
Hardware and download-size estimates are not available yet.
Exigences
minimax_h3_audio_vae_fp32.safetensors
Fichier non vérifiéVAE · SAFETENSORS · Unknown
minimax_h3_video_vae_fp16.safetensors
Fichier non vérifiéVAE · SAFETENSORS · Unknown
MiniMax-H3-encoder-Q4_K_M.gguf
Non résoluText encoder · Unknown
MiniMax-H3-fl2va-Q5_1.gguf
Non résoluCheckpoint · Unknown