Nodes/OmniNodes/KSampler Base+Refiner 🎭
ComfyUI Node

KSampler Base+Refiner 🎭

The Two-Model Handoff, Done Correctly in One Node

By TensorVizionΒ·Created 3 months agoΒ·Updated about 8 hours agoΒ· 0
KSampler Base+Refiner 🎭
  • model_base
  • model_refiner
  • positive
  • negative
  • latent_image
  • latent
  • summary
β—„seed0β–Ί
β—„steps30β–Ί
β—„cfg7.0β–Ί
β—„sampler_namedpmpp_2mβ–Ί
β—„schedulerkarrasβ–Ί
β—„switch_fraction0.80β–Ί

SDXL's base+refiner setup was supposed to be the standard workflow: a big base model does most of the denoising, then a second, smaller refiner model takes over for the last stretch and adds detail like skin texture. In vanilla ComfyUI that means two separately-configured KSamplerAdvanced nodes wired together with matching step ranges and a careful leftover-noise handoff - fiddly, and easy to get subtly wrong. KSampler Base+Refiner wraps that whole two-stage dance into one node with two MODEL inputs.

The correctness is the point, and it's real. The node runs two internal KSamplerAdvanced calls: stage 1 samples the base model with return_with_leftover_noise=True, handing stage 2 a latent that still carries the right amount of residual noise for its start step; stage 2 (the refiner) finishes with return_with_leftover_noise=False. That's the difference between a correct handoff and "two independent samples stitched together" - a distinction that shows up as visible seams and weird textures if you get it wrong.

switch_fraction (default 0.8) controls where the handoff happens: the base does the first 80% of steps, the refiner finishes the last 20%. That 0.8 matches Stability's own published recommendation for the pair. Everything else - seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image - behaves like a normal sampler, and outputs are the latent plus a summary.

The honest part: the community abandoned this

Now the part that's easy to miss if you only read the node's docs. The KB's SDXL panel is blunt about it: once fine-tuned checkpoints matured, the community dropped the refiner. Juggernaut, RealVis, Pony - all the checkpoints people actually use are already fine-tuned single models, and the refiner "always seemed like an added step that never added much" (the model's own author's words, per the KB). The base+refiner path survives mostly in nostalgia and a few specific hires-fix workflows.

So: is this node worth installing for you? If you're on a modern fine-tuned checkpoint - almost certainly not; the refiner stage would be redundant or actively weird. If you're doing SDXL history, or you have a specific workflow built around the base+refiner pair and want it in one node instead of four, this is the cleanest implementation of that pattern I've seen, precisely because it does the handoff the way the official docs describe rather than as a hack.

Install

ComfyUI Manager β†’ search OmniNodes, or:

cd ComfyUI/custom_nodes
git clone https://github.com/TensorVizion/OmniNodes

Restart ComfyUI; it's under TensorVizion/Sampling. It delegates to core KSamplerAdvanced via the same getattr(instance, instance.FUNCTION) pattern as the pack's other new samplers - no extra dependencies, and the pack's changelog notes it was built against real core source to catch the noise_seed vs seed difference in KSamplerAdvanced before shipping. That kind of attention to the handoff is exactly what you want from a node whose entire job is getting the handoff right.

CategoryTensorVizion/Sampling

Inputs (11)

NameTypeDefaultDescription
model_baseMODELβ€”
model_refinerMODELβ€”
seedINT00–18446744073709550000β€”
stepsINT301–10000β€”
cfgFLOAT7.00–100β€”
sampler_nameSTRINGdpmpp_2mβ€”
schedulerSTRINGkarrasβ€”
positiveCONDITIONINGβ€”
negativeCONDITIONINGβ€”
latent_imageLATENTβ€”
switch_fractionFLOAT0.800.05–0.95β€”

Outputs (2)

NameTypeDescription
latentLATENTβ€”
summarySTRINGβ€”