沐阳 H3 · 保存一采检查点(内部)
Save the exact pass-1 latents so a re-render isn't a re-sample
- samples
- samples
The other half of the checkpoint pair. Where H3Pass1CheckpointLoad reads a saved pass-1 latent back, this one writes it - the full H3 audio+video latent, straight off the sampler, before any decoding has been done to it.
The value proposition is unglamorous and real: pass 1 is the expensive part of a two-pass H3 job, and the second pass is the part you're going to fiddle with. Save the latent once, and every refine experiment after that costs a fraction of the original run.
The write
Four required inputs:
samples(LATENT) - the sampled output. Note it's the latent, not decoded frames; if you're thinking in pixels you're one node too late.filename_prefix(STRING, defaultvideo/H3_长视频) - an output-relative prefix, resolved underComfyUI/outputand constrained to stay there.segment_index(INT, 1-9999, default 1).frames(INT, default 125) - the segment's frame count, recorded in the file so the loader can verify it later.
Output: samples - the same latent passed through, so you can chain the save inline without branching the graph.
The file
It lands as <prefix>_一采检查点_第NN段.h3pass1 under ComfyUI/output, a safetensors file containing the video latent, the audio latent, a format version, the segment index and the frame count. Both latents are detached and moved to CPU before writing, so a save doesn't pin GPU memory it doesn't need.
Two implementation details are worth stealing if you're writing something similar.
It writes atomically. The file is written to .tmp first and then moved into place, so an interrupted write or a crash leaves you with the previous good checkpoint rather than a truncated file that a later load will reject or, worse, half-read.
It doesn't use ComfyUI's generic saver. The source says why: the generic path collects prompt metadata and can wait on the global output-save queue. For a small deterministic per-segment AV blob, going straight to safetensors is faster and more predictable.
And yes, it forces itself to re-run every queue. Saving is an intentional side effect, and a cached side effect is a side effect that didn't happen. That's the same IS_CHANGED idiom the pack's memory barriers use.
Inputs and outputs, honestly
The pass-through output means there's no reason to build a separate branch for saving. In the pack's expanded graphs it sits in the wire between the sampler and the decode, saving on the way past. If you're wiring it by hand, put it there and feed the same latent on to H3Pass1CheckpointLoad's counterpart path when you refit the graph for a refine run.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/civilcoco/ComfyUI-MiniMaxH3-Myang
Restart ComfyUI, hard-refresh, category 沐阳 H3/内部. The pack declares no Python dependencies, and safetensors ships with the ComfyUI environment already.
Requires the usual H3 stack to be useful: the diffusion model, Qwen text encoder, video VAE, audio VAE. Weights are not distributed with the pack, and the H3 community licence is territory-restricted, so check that before downloading anything.
The traps
Keep the prefix the same everywhere. The save node and the load node resolve filename_prefix independently, so a prefix that drifts - a renamed output folder, a copy-pasted graph with a stale string - gives you a load error whose message tells you to check the prefix. That message exists because people hit it.
Frame count is the other one. frames is recorded and verified on read, so a checkpoint saved with 125 against a segment the graph now believes is 108 won't load. That's the guard working; the fix is to save again from a graph that agrees with itself.
And a reminder that lives outside this node: pass 1's audio is the audio that ships. The README is clear that final audio comes directly from the first pass and only receives seam handling and duration trimming - the second pass doesn't re-render the soundtrack. Which is exactly why saving pass 1's full AV latent, audio included, is the right thing to checkpoint. The upscaling write-up covers the general two-pass trade if you want the wider context.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| samples | LATENT | — | |
| filename_prefix | STRING | video/H3_长视频 | — |
| segment_index | INT | 11–9999 | — |
| frames | INT | 1251–100000 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| samples | LATENT | — |