Nodes/Y7Nodes for ComfyUI/Y7 Krea 2 Three-Stage Sampler
ComfyUI Node

Y7 Krea 2 Three-Stage Sampler

Cfg-guided at both ends, fast in the middle

By yushan777·Created 2 years ago·Updated 6 days ago· 10
Y7 Krea 2 Three-Stage Sampler
  • stage1_model
  • stage2_model
  • positive
  • negative
  • latent_image
  • stage2_positive_optional
  • stage2_negative_optional
  • latent
◄seed0►
◄handoff_percent12.00►
◄stage3_handoff_percent83.33►
◄stage1_steps52►
◄stage1_cfg4.0►
◄stage1_sampler_name▾►
◄stage1_scheduler▾►
◄stage2_steps8►
◄stage2_cfg1.0►
◄stage2_sampler_name▾►
◄stage2_scheduler▾►
◄final_width0►
◄final_height0►
◄upscale_methodbislerp►

Krea 2's two checkpoints split the job cleanly. Raw is CFG-guided and undistilled - 52 steps, cfg around 3.5, and the only one of the pair that will actually listen to a negative prompt. Turbo is distilled down to 8 steps at cfg 1, which means the negative isn't doing anything at all. Guidance-distilled models don't have a negative branch to steer with; that's the trade you made for the speed.

Which creates a specific annoyance. The useful, varied part of a generation happens at the noisy end, where you want Raw and your negative prompt. The finishing happens at the clean end, where Turbo's refinement is cheap and good - and where you'd also like a negative again, because that's when you notice you didn't want freckles, or a purple cast. Y7 Krea 2 Three-Stage Sampler is the Two-Stage Sampler with a third pass bolted on the end that reuses all of stage 1's settings: same model, steps, cfg, sampler, scheduler.

What the extra stage actually is

Stage 1 runs from the top of its schedule to handoff_percent. Stage 2 runs from there to stage3_handoff_percent. Stage 3 then picks up and finishes, using stage 1's model and stage 1's settings.

The mechanism is neater than "run it again at the end". stage3_handoff_percent is read off stage 1's own schedule - the same 52-step curve - so stage 3 isn't a fresh sampler start, it's literally the tail of that curve, cut at a second index. Stage 2 is the sandwich filling: its schedule is trimmed at both ends to the steps nearest the two boundary sigmas, with those exact sigmas forced in as its first and last entries. And stage 3 runs with fresh noise disabled, because by then the noise has already been added at the handoff and there's nothing to re-roll.

One asymmetry worth knowing: the resize from final_width / final_height happens at the first handoff, once. Stage 2 and stage 3 continue at the new size.

Inputs that differ from the two-stage version

Everything from the Two-Stage Sampler is here - stage1_model, stage2_model, positive, negative, latent_image, seed, handoff_percent, the two stages' steps/cfg/sampler/scheduler, final_width / final_height, upscale_method, and the optional stage2_positive_optional / stage2_negative_optional. The additions:

  • stage3_handoff_percent (default 83.33, must be ≥ handoff_percent). The point where stage 2 stops and stage 3 takes over. At the defaults, stage 1 does the first 12% of the curve, stage 2 the middle ~71%, and stage 3 the last ~17%.
  • Stages 1 and 3 always use positive / negative. The stage2_*_optional inputs only affect the middle stage - which is fine, because a cfg-1 middle stage isn't reading its negative anyway.

Output is a single latent. Decode it.

Two shortcuts are baked in and both are useful: stage3_handoff_percent at 100 gives you exactly the Two-Stage Sampler, and setting it equal to handoff_percent skips stage 2 entirely - stage 1 settings run either side of one handoff, which is a completely different look (raw at both ends, nothing fast in between) and worth one test run just to hear the difference.

Should you use this one?

Honestly, start with the Two-Stage Sampler. This node is the fiddliest thing in the pack, the author's own README opens with "probably only useful to me", and three stages is three things to get wrong. Reach for it when you have a specific complaint the two-stage version can't answer: your images come out technically finished but flat and slightly plasticky because the whole clean half was cfg-1, or you want a negative prompt still steering the fine detail pass, or you specifically want a Raw-class model doing the last steps instead of a distilled one. Those are real differences, not imagined ones.

The cost is what you'd expect. Stage 3 runs at stage 1's cfg, which at cfg 4 means two model passes per step. The last 17% of the schedule is where the finest detail is made, so it's the most expensive 17% you could choose - expect the run to take noticeably longer than two-stage at the same step counts.

Install

cd /path/to/ComfyUI/custom_nodes
git clone https://github.com/yushan777/ComfyUI-Y7Nodes
pip install -r ComfyUI-Y7Nodes/requirements.txt

Or ComfyUI Manager → search Y7 → Install → restart. The pack's color-matcher and opencv-python-headless dependencies are for the colour-matching nodes, not this one. It's built on ComfyUI's newer V3 node API, so it won't appear on a ComfyUI old enough to predate comfy_api.latest.

Where people get burned

The handoffs collapse into each other. If both percentages round to the same sigma, the node raises "stage3_handoff_percent must produce a later denoising sigma than handoff_percent". Move the two values further apart - they have to land on genuinely different steps of stage 1's curve.

Shift mismatch again. The same trap as the two-stage node: Raw and Turbo don't load with compatible sampling settings, so the boundary sigma can land outside stage 2's schedule entirely. Put Y7 Krea 2 Raw Sampling Shift on the stage-1 chain, and give stage 2 something compatible.

handoff_percent 0 is a different animal. With stage 1 skipped, stage 2 runs from the very top of its own schedule up to the stage-3 boundary and stage 3 finishes - Turbo doing the noisy part, Raw cleaning up. That's the mirror image of what this node is for, and it's a real experiment (the Turbo LoRA path at 1.0 does something similar by accident), just don't expect the bookending behaviour you set the node up for. If you want to isolate what the third stage contributes, set stage3_handoff_percent to 100 - identical to the two-stage node - then to 83, and compare the same seed.

CategoryY7Nodes/Sampling

Inputs (21)

NameTypeDefaultDescription
stage1_modelMODEL—
stage2_modelMODEL—
positiveCONDITIONING—
negativeCONDITIONING—
latent_imageLATENT—
seedINT00–18446744073709550000—
handoff_percentFLOAT12.000–100Point in the denoising process where stage 1 hands off to stage 2. 0% uses only stage 2; 100% uses only stage 1.
stage3_handoff_percentFLOAT83.330–100Point in the denoising process where stage 2 hands off to stage 3. Stage 3 reuses all stage 1 settings. Must be greater than or equal to handoff_percent.
stage1_stepsINT522–200—
stage1_cfgFLOAT4.00–100—
stage1_sampler_nameCOMBO44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
stage1_schedulerCOMBO9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
stage2_stepsINT82–200—
stage2_cfgFLOAT1.00–100—
stage2_sampler_nameCOMBO44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
stage2_schedulerCOMBO9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
final_widthINT00–16384Resolution for stage 2 onward. 0 = derive from final_height (or no resize if both are 0).
final_heightINT00–16384Resolution for stage 2 onward. 0 = derive from final_width (or no resize if both are 0).
upscale_methodCOMBObislerpHow the latent is resized at the handoff.
stage2_positive_optionaloptCONDITIONINGStage 2 positive conditioning. Uses positive when unconnected.
stage2_negative_optionaloptCONDITIONINGStage 2 negative conditioning. Uses negative when unconnected; zeroed at stage 2 cfg 1.

Outputs (1)

NameTypeDescription
latentLATENT—