Nodes/Kinburg-Nodes/Chimera (Multi-Sampler) 🦁
ComfyUI Node

Chimera (Multi-Sampler) 🦁

Run two samplers over one image with a real step budget

By KinburgΒ·Created 3 months agoΒ·Updated 6 days agoΒ· 1
Chimera (Multi-Sampler) 🦁
  • model
  • positive
  • negative
  • latent_image
  • stage_a
  • stage_b
  • model_negative
  • guider
  • sigmas
  • model_b
  • positive_b
  • negative_b
  • latent
  • handoff_latent
  • handoff_denoised
  • report
  • gen_extra_info
  • time
  • seconds
β—„handoffcontinuousβ–Ί
β—„step_splitstage stepsβ–Ί
β—„total_steps0β–Ί
β—„handoff_step0β–Ί
β—„split_percent60β–Ί
β—„handoff_sigma0.50β–Ί
β—„verbosetrueβ–Ί

"First pass with one sampler, second pass to refine" is one of the most common tricks in ComfyUI, and it usually looks like two KSamplers chained together, each re-adding noise, each with its own step count you're hand-tuning. Chimera is the version of that idea that doesn't waste your time or your denoise. It's a multi-stage sampler: you feed it two (or more) Sampler Settings bundles - the pack's own config node - and it runs them over one image with an explicit step budget, handing off cleanly between stages.

The thing that separates it from "two KSamplers" is the handoff mode. Continuous (the default) builds one sigma schedule and gives each stage a slice of it. Stage two resumes exactly where stage one stopped - no fresh noise added - so the run is one honest traversal of one noise trajectory, just with different samplers, cfg and eta per segment. It's like chaining KSampler Advanced by start/end step, except the boundary is a setting instead of arithmetic you do in your head. Restart is the classic two-samplers pattern: every stage builds its own schedule and adds its own noise, so stage two needs denoise < 1 or it will destroy stage one's work. Different effect, not better - continuous for refinement, restart for genuine img2img re-invention.

Where the boundary falls is its own input, step_split, and you get the same decision in whatever unit you're thinking in:

  • stage steps - each stage runs exactly the steps it declares.
  • at step - cut a shared total_steps at handoff_step, so you can sweep the boundary without editing the Settings nodes.
  • at percent - same cut as a percentage of the steps (60% of 30 β†’ 18/12).
  • at sigma - hand over once the noise level crosses handoff_sigma. The one genuinely tricky one: the sigma scale is model-dependent. Flow-matching models (Flux, SD3, Krea) run 1.0 β†’ 0, so the useful range is 0–1; SD/SDXL start around 14.6 and you'd want single digits. The report output prints the curve's actual range, so one run tells you which world you're in.

The stage_a / stage_b inputs take KINBURG_SAMPLER_CFG bundles from the pack's Sampler Settings node - leave stage_b empty and Chimera just runs stage A as a plain single-pass sampler, so it doubles as a fancy KSampler. There are escape hatches if you need them: model_b / positive_b / negative_b for a different LoRA stack or refiner on stage two (must share the main model's noise schedule), model_negative for checkpoints shipped as a model + uncond-model pair (Ideogram), and guider to plug in any custom guider - though wiring one ignores this node's own positive/negative and per-stage cfg, so only do it when you must.

Worth knowing: the sampler measures its own time - time and seconds outputs - which the docs note can't be skewed by how ComfyUI schedules other branches of the graph, unlike Start/Stop Timer nodes. And gen_extra_info carries what it resolved at run time, wireable into a Generation Info node so your settings dump records what actually happened.

Installing

Ships in Kinburg-Nodes: ComfyUI Manager β†’ search "Kinburg-Nodes", or clone into custom_nodes:

cd ComfyUI/custom_nodes
git clone https://github.com/Kinburg/Kinburg-Nodes
# restart ComfyUI

You'll also want the pack's Sampler Settings node, which ships in the same pack. No extra dependencies.

Gotchas

In continuous mode the shared curve takes its scheduler and denoise from stage A - a later stage's own denoise is ignored (a different scheduler gets spliced in, and the report tells you). The Settings node's seed_mode / seed_step are Ouroboros-loop dials and are ignored here; only seed is used. And if you set total_steps longer than the sum of the stages' steps, the tail of the curve is left unwalked on purpose - residual noise comes out the other end, which is a feature if you know you want it and a surprise if you don't.

CategoryKinburg-Nodes/Bestiary/Chimera

Inputs (19)

NameTypeDefaultDescription
modelMODELβ€”
positiveCONDITIONINGβ€”
negativeCONDITIONINGβ€”
latent_imageLATENTβ€”
stage_aKINBURG_SAMPLER_CFGFirst stage — a 'Sampler Settings' bundle. Wire a second one into 'stage_b' for two-stage sampling (a chain of Sampler Settings also works and is flattened into stages, left→right). NOTE: 'seed_mode' / 'seed_step' on the Settings node are Ouroboros-loop dials and are ignored here — only 'seed' is used.
handoffCOMBOcontinuousHow stage 2+ picks up from stage 1. β€’ continuous (recommended) β€” ONE schedule is built and each stage runs a slice of it; later stages add NO fresh noise and resume exactly where the previous one stopped. The run is one honest traversal of one noise trajectory with different samplers/cfg/eta per segment. The shared curve takes its scheduler + denoise from STAGE A (a later stage's own denoise is ignored; a different scheduler is spliced in β€” see the report). β€’ restart β€” the classic 'two KSamplers' pattern: every stage builds its own schedule and adds its own noise, so stage 2+ NEEDS denoise<1 or it will destroy stage 1's image. A different effect (img2img refine), not a better or worse one.
step_splitCOMBOstage stepsWHERE the boundary between the stages falls. The last three are the same decision in different units β€” pick whichever unit you're thinking in. β€’ stage steps β€” each stage runs exactly the 'steps' it declares; the curve is their sum (unless total_steps overrides it). β€’ at step β€” cut total_steps at 'handoff_step': stage 1 gets that many steps, the rest gets the remainder. Same unit as above, but the boundary is on THIS node, so you can sweep it without editing the Sampler Settings. β€’ at percent β€” the same cut as a percentage OF THE STEPS: 60% of 30 steps β†’ 18 / 12. (It divides steps, not the sigma range.) β€’ at sigma β€” the cut lands where the NOISE LEVEL crosses 'handoff_sigma'. Use it when the stages run different schedulers, or to keep the boundary in the same place as you change the step count: step numbers aren't comparable across schedules, noise levels are. The last three ignore the 'steps' set inside the Sampler Settings nodes.
total_stepsINT00–10000Length of the shared schedule. 0 = auto (the sum of the stages' own 'steps'). In the 'stage steps' split, setting this LONGER than the sum leaves the tail of the curve unwalked, so the result keeps residual noise on purpose (reported). Shorter than the sum β†’ the last stages get clipped.
handoff_stepINT00–10000'at step' split only: how many steps the FIRST stage runs; everything left goes to the rest. 0 = halfway. Clamped so both sides always get at least one step.
split_percentFLOAT600–100'at percent' split only: the share OF THE STEPS given to the FIRST stage (60 β†’ 18/12 out of 30). Both sides always get at least one step.
handoff_sigmaFLOAT0.500–1000'at sigma' split only: hand over to the next stage once the noise level has fallen to this sigma. The scale is MODEL-dependent: flow-matching models (Flux / SD3 / Krea) run 1.0 β†’ 0, so the useful range is 0..1 and the 0.5 default sits mid-trajectory; SD / SDXL run from about 14.6, where you'd want single digits instead. The report prints the curve's actual range and the sigma the split landed on, so one run tells you the scale you're working in.
stage_boptKINBURG_SAMPLER_CFGSecond stage β€” another 'Sampler Settings' bundle. Leave empty to run stage A alone (a plain single-pass sampler).
model_negativeoptMODELSecond model for the UNCONDITIONAL (negative) pass β€” for checkpoints shipped as a model + uncond-model pair, such as Ideogram. The dual-model guider is built PER STAGE from that stage's conditioning and cfg, so 'positive_b' and per-stage cfg keep working (wiring a ready-made 'Dual Model CFG Guider' into 'guider' instead would freeze both). NOTE: at cfg 1.0 the guider skips the unconditional pass entirely and this model does nothing β€” use a cfg above 1.
guideroptGUIDEREscape hatch for ANY custom guider (Dual CFG, CFG++, a hand-rolled one…). It carries its own model, conditioning and cfg, so this node's 'positive' / 'negative' / 'positive_b' and every stage's cfg are IGNORED while it's wired (the report says so). The sigma curve is built from the guider's own model. Takes precedence over 'model_negative'. For the common Ideogram case use 'model_negative' instead β€” it keeps the per-stage prompts working.
sigmasoptSIGMASExternal noise schedule, replacing the one this node builds. 'total_steps' and every stage's scheduler and denoise are then IGNORED (reported) β€” the curve is given. Splitting still works exactly the same: all four 'step_split' modes just slice the supplied curve, so you can pair any scheduler node with staged sampling.
model_boptMODELOptional model for stage 2+ β€” a different LoRA stack or a refiner. It must share the noise schedule of the main model (same family): in 'continuous' handoff the shared curve is always built from the MAIN model, since that's the space the in-flight latent's noise level lives in.
positive_boptCONDITIONINGOptional positive conditioning for stage 2+ β€” e.g. polish on a shorter prompt, or without the style tokens. Falls back to 'positive'.
negative_boptCONDITIONINGOptional negative conditioning for stage 2+. Falls back to 'negative'.
verboseoptBOOLEANtruePrint the split report (curve, per-stage step ranges and sigma boundaries, warnings) to the console. The same text is always on the 'report' output.

Outputs (7)

NameTypeDescription
latentLATENTβ€”
handoff_latentLATENTβ€”
handoff_denoisedLATENTβ€”
reportSTRINGβ€”
gen_extra_infoGEN_INFOβ€”
timeSTRINGβ€”
secondsFLOATβ€”