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

Y7 Krea 2 Two-Stage Sampler

The Krea 2 handoff done properly

By yushan777·Created 2 years ago·Updated 6 days ago· 10
Y7 Krea 2 Two-Stage Sampler
  • stage1_model
  • stage2_model
  • positive
  • negative
  • latent_image
  • stage2_positive_optional
  • stage2_negative_optional
  • latent
◄seed0►
◄handoff_percent12.00►
◄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►

The setting most Krea 2 users converge on is neither of the two checkpoints. It's Raw doing the early work - the undistilled base, which is much more creative seed-to-seed - and then something fast and guidance-free finishing the image: Turbo, or the Turbo LoRA at 0.6 on top of Raw. You get variety where variety is decided and speed where speed is possible, and there is a real argument that this beats both checkpoints used alone.

The obvious way to wire it is two KSamplers, the second one at a low denoise. The people who've A/B'd it will tell you that's a different operation. A KSampler at denoise 0.2 still runs a complete schedule - it just starts from a noisier sigma and walks all the way down. Chaining schedules mid-trajectory, so stage 2 picks up at the exact sigma stage 1 stopped at, is not what a denoise value does. Y7 Krea 2 Two-Stage Sampler does the chaining, in one node, and can optionally change resolution at the handoff.

How the handoff works

Both stages build their own schedule from their own model, steps, sampler and scheduler. handoff_percent is where stage 1 stops: at 12% of 52 steps, stage 1 walks the first handful of sigmas of its own curve. The sigma at that index becomes the boundary.

Stage 2 then cuts its own (possibly completely different) schedule at the step nearest that boundary sigma, and overwrites its first entry with the exact boundary value. No gap, no double-stepped sigma, and the two stages can use totally different step counts - which is the point, because stage 1 wants 52 steps and stage 2 wants 8.

Then there's the resize, and this is where the node earns its keep. No resize (final_width and final_height both 0): stage 1's leftover noise carries straight into stage 2, which adds none of its own. With a resize: stage 1 is run out to a clean estimate - its last sigma is forced to zero - the latent is resized (bislerp by default), and stage 2 re-noises at the boundary sigma and denoises from there at the new size. That's a proper hires pass with the noise handled correctly, not a low-denoise upscale smearing the result.

The inputs you'll actually touch

  • stage1_model / stage2_model - two MODEL chains. They can be the same checkpoint with different settings, or Raw and Turbo, or a LoRA'd chain and a clean one (LoraLoaderModelOnly on just one branch is a legitimate way to give each stage its own effective model).
  • handoff_percent (default 12, 0–100). 12% means stage 1 handles the high-noise structure and stage 2 does the rest. 0% runs only stage 2, 100% runs only stage 1 - handy for A/B-ing what the second stage is actually contributing.
  • stage1_steps 52, stage1_cfg 4.0 - Raw's published settings, within a whisker of Krea's own 52 steps / cfg 3.5.
  • stage2_steps 8, stage2_cfg 1.0 - Turbo's settings. At cfg 1 the node zeroes stage 2's negative for you.
  • final_width / final_height (0 = no resize). Set one and the other is derived from the current aspect ratio; set neither and nothing resizes.
  • upscale_method (advanced, default bislerp) - how the latent is resampled at the handoff.
  • stage2_positive_optional / stage2_negative_optional - unconnected, stage 2 reuses positive / negative. Useful when your stage-2 prompt should be a plainer "clean up, don't add objects" version of the original.

Output is a single latent, straight into VAE Decode. Steps always mean steps across the whole schedule, not that stage's share - so raising stage1_steps at a fixed handoff_percent moves the boundary.

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 / opencv-python-headless dependencies are for other nodes; the samplers need only torch and ComfyUI itself. This is written against the newer V3 node API, so an elderly ComfyUI won't list it.

Where people get burned

The handoff sigma error. "The handoff sigma is outside the stage 2 schedule" means the two models don't agree on how sigma maps to timesteps. Raw and Turbo load with different effective sampling settings, so put Y7 Krea 2 Raw Sampling Shift on the stage-1 chain (and give stage 2 something compatible), or use manual_shift 1.15 on both. This is the single most common way this node fails.

Grainy stage 2 at cfg 1. The node zeroes stage 2's negative when its cfg is exactly 1.0, and zeroed conditioning is one of those things Krea 2 users have reported producing grain from. If stage 2 comes out noisy rather than detailed, try a hair above 1.0 so the branch stays live, and try euler / beta before blaming the node.

Expecting mid-run prompts to change much at 12%. Stage 1 has already committed the composition by the time stage 2 sees your prompt. Give stage 2 a short, safe description rather than a second creative idea - it's cleaning up, not re-imagining.

Difficulty at very low handoff values. Below roughly 5% on a 52-step schedule you're handing off after one or two steps, which mostly wastes the Raw pass. If you want the turbo-like path, set handoff_percent to 0 and run stage 2 alone; it'll be honest about it.

CategoryY7Nodes/Sampling

Inputs (20)

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.
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—