π H3 Refine Pass - LD
The Refine Pass Sampler
- latent
- positive
- model
- video_vae
- audio_vae
- sampler
- sigmas
- frames_in
- audio_in
- frames
- audio
- latent
- report
The second pass that doesn't throw away the take you liked
Here's the classic upscale workflow trap on video: you hunt for a good seed, find a take you love, run it through an upscaler to add real detail - and the upscaler's output is a different video. Not just sharper, different. The motion changed, the face wandered, the take you picked is gone. H3 Refine Pass (π H3 Refine Pass - LD, under LD / PromptMaster / Finishing, in PromptMasterLD) is built for that exact moment: it takes the AV latent that came back from the MiniMax upscaler and runs a short, partial-denoise refine on it - 3/4/5-step schedules starting near 0.90 denoise - so the structure of the take you chose survives the pass while the upscaler's added detail gets polished instead of re-rolled.
The numbers are the whole design: starting near 0.90 means the sampler barely moves - it's correcting and re-integrating, not generating fresh. More steps means more new detail and more drift from the take you chose, so the honest guidance is "use the fewest steps that fix what bothers you."
What it expects
- latent - the UPSCALED AV latent: video out of the Minimax upscaler, re-joined to its audio by a Concat AV Latent node. This is not the raw sampler output.
- positive - straight from the seed hunter. It must be the conditioning the take was sampled against; a fresh encode at another size is a different picture, and the refine pass can't be expected to preserve a take it never knew.
- model, video_vae, audio_vae, sampler, steps, seed - the usual sampler set.
seedre-rolls the upscale pass without re-hunting, which is the workflow's cheapest do-over.
The optional block is where the real H3 care shows:
- frames_in / audio_in - wire the hunter's
framesandaudiohere. They're ignored while this node runs; they're what comes out the other side when the group is bypassed during a hunt. One graph, two roles. - expect_w / expect_h - the hunter's
out_w/out_h. This is the SIZE THE TAKE WAS SAMPLED AT, not a demand the upscaler match it. When they differ, keyframe/reference conditioning is resized to the upscaled latent so pass 2 doesn't crash. - seconds_at_a_time - how many seconds of the upscaled clip H3 refines in one go. 3s keeps a 24GB card from paging (the docs describe 99% VRAM, cold GPU); 0 = whole clip. Snaps to H3's 17k+5 grid, so ~3s becomes 73 frames, and the windows overlap-blend so the cut doesn't flash.
- sigmas - optional override; wired, it wins over
steps.
Outputs: frames (IMAGE), audio (AUDIO), latent (LATENT) - so you can keep refining, decode, or hand the latent onward - and report (STRING).
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Lora-Daddy/PromptMasterLD
cd PromptMasterLD
pip install -r requirements.txt
Restart ComfyUI, or ComfyUI Manager β search "PromptMasterLD".
The workflow it belongs to
This node is one stage in a finishing chain, not a standalone renderer: hunter picks the take β MiniMax upscaler adds detail β Concat AV Latent re-joins the upscaled picture to the original audio β [optionally H3 Lock Audio to pin that audio] β H3 Refine Pass re-integrates β decode and save. The two most common mistakes are feeding it the wrong latent (the upscaled one, re-joined to audio - not the raw sampler output) and giving it a positive from a different encode than the take. Get those two right and the refine pass is the difference between "upscaled video" and "the take you picked, only better."
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| latent | LATENT | The UPSCALED AV latent β video out of the Minimax upscaler, re-joined to its audio by Concat AV Latent. | |
| positive | CONDITIONING | Straight from the Seed Hunter. It must be the conditioning the take was sampled against; a fresh encode at another size is a different picture. | |
| model | MODEL | β | |
| video_vae | VAE | β | |
| audio_vae | VAE | β | |
| sampler | SAMPLER | β | |
| steps | COMBO | 3 | Partial-denoise schedules from the reference workflow, starting at ~0.90. More steps means more new detail AND more drift from the take you chose. |
| seed | INT | 4440β72057594037927940 | Re-roll the upscale pass without re-hunting. |
| sigmasopt | SIGMAS | Optional override. Wired, it wins over `steps` β your own ManualSigmas go here. | |
| frames_inopt | IMAGE | Wire the Seed Hunter's `frames` here. It is ignored while this node runs; it is what comes out the other side when the group is bypassed during a hunt. | |
| audio_inopt | AUDIO | The hunter's `audio`, for the same reason. | |
| expect_wopt | INT | 00β16384 | Wire the hunter's `out_w`. This is the SIZE THE TAKE WAS SAMPLED AT, not a demand that the upscaler match it. When they differ, keyframe/ref cond is resized to the upscaled latent so pass 2 does not crash. |
| expect_hopt | INT | 00β16384 | The hunter's `out_h`, same job. |
| seconds_at_a_timeopt | FLOAT | 3.00β30 | How many seconds of the upscaled clip H3 refines in one go. 3s keeps 24GB cards from paging (99% VRAM, cold GPU). 0 = whole clip. Snaps to H3's 17k+5 grid (~3s becomes 73 frames). Windows overlap-blend so the cut does not flash. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| frames | IMAGE | β |
| audio | AUDIO | β |
| latent | LATENT | β |
| report | STRING | β |