H3 HyperFlow P7 · Save Separate Candidate (T8 EXP)
The node that writes your segment — and still refuses to call it final
- high_result
- video_vae
- audio_vae
- candidate_json_path
- candidate_video
- job_sha256
- report_json
This is the last node in the P7 segment pipeline, and it is deliberately pessimistic. It decodes, trims, writes a file - and then does not accept it. That refusal is the whole design. P7 is the separated ("modular") long-video route where each segment is a real artifact on disk that the next segment is allowed to depend on, so nothing gets promoted to "this is the previous segment" until you say so explicitly with a separate node.
What it actually does
You hand it a completed HIGH result - the joint audio+video latent that came out of the HIGH 4:8 sampler and got bound by the High Result node. It decodes that AV through your video VAE and your audio VAE, throws away the leading context frames that were only there to hold continuity with the previous segment, optionally colour-matches the new frames against the accepted predecessor, and commits an immutable candidate to the chain directory (output/minimax_h3_t8_long_video/<chain_id>/candidates/segment_00000/<token>).
If the segment is not final, it also writes a LOW-resolution video carrying the completed HIGH audio plus a 4+4 effects audit record. That LOW-with-HIGH-audio pair is what the next segment reads as its continuation context, which is why the node needs to know whether this is the end of the run.
The inputs worth touching
high_result is the typed input - it comes from Bind Completed HIGH Result (fresh run) or Load Exact Completed HIGH (resumed run), never from a raw LATENT.
candidate_id is the identity of this take. Leave it empty and the node generates a token, or give it a safe name ([A-Za-z0-9][A-Za-z0-9_.-]*). It must be new every time: if that candidate directory already exists you get a FileExistsError, not an overwrite. Re-rolling a segment means picking a new id.
is_final_segment and final_frame_count only matter on the last segment of a chain - set the boolean true and, if you want a specific delivered length, the frame count.
model_id is the stable chain model label written into the first segment's manifest (h3_p7_modular_exp by default). On segment 0 you need a non-empty value; later segments inherit it.
color_match is on by default and runs the pack's bounded spatial colour correction against the accepted predecessor - the known seam drift between P7 segments is exactly what it exists for. bit_depth (8 or 10) and crf (18 default, 0–51) are your encode settings; nudge CRF up if the intermediate files are eating your disk.
Outputs
candidate_json_path is the one that matters - that path plus job_sha256 are what you feed the Candidate Accept node. candidate_video is the preview. report_json has the decode/trim/colour/encode receipts if something looks off.
Install
Same as the rest of the pack. ComfyUI Manager → search MiniMax H3 Audio T8 (note the Manager list can lag GitHub; the Registry and GitHub releases move independently), or:
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/comfyui-minimax-h3-audio-T8.git minimax-h3-audio-T8
Restart ComfyUI fully and refresh the browser. The pack's requirements.txt deliberately installs nothing - this is a node pack that refuses to touch your Torch/CUDA stack, so don't panic at the empty file. You still need the H3 weights (main model in models/diffusion_models, Qwen text encoder in models/text_encoders, video and audio VAE in models/vae) and the HyperFlow adapter placed under models/hyperflow/loras/.
Where people get burned
Three that are actually in the code: non-finite values in either the LOW or HIGH AV refuse the save instead of writing a bad MP4; a segment with no decodable audio errors out rather than shipping silent video; and the two VAE inputs are both mandatory because this is a joint AV decode, not a picture-only one. Also watch the placeholders - the shipped example workflows use dummy chain ids and zeroed SHAs, and they will not run until you replace them with values your own chain produced.
And keep the sequencing straight: this node writes a candidate. MiniMaxH3HyperFlowP7CandidateAcceptEXPT8 is the one that flips it into an accepted parent, and that node defaults to preview-only until you set accept_candidate true.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| high_result | T8_HYPERFLOW_P7_HIGH_RESULT | — | |
| video_vae | VAE | — | |
| audio_vae | VAE | — | |
| candidate_id | STRING | — | |
| is_final_segment | BOOLEAN | false | — |
| final_frame_count | INT | 00–100000 | — |
| model_id | STRING | h3_p7_modular_exp | — |
| seed | INT | 00–18446744073709550000 | — |
| color_match | BOOLEAN | true | — |
| bit_depth | COMBO | 8 | 2 options: 8, 10 |
| crf | INT | 180–51 | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| candidate_json_path | STRING | — |
| candidate_video | VIDEO | — |
| job_sha256 | STRING | — |
| report_json | STRING | — |