Nodes/ComfyUI_LC123_nodes/LC Sigmas (BETA)
ComfyUI Node

LC Sigmas (BETA)

One Node for the Entire Noise Schedule

By lonecatone23·Created 3 months ago·Updated about 7 hours ago· 46
LC Sigmas (BETA)
  • model
  • model_2
  • image_size_latent
  • sigmas_high
  • sigmas_low
  • noise_high
  • noise_low
  • info
  • sigmas_full
  • sampler
◄samplereuler►
◄sigma_curve_presetsbase►
◄base_schedulerbeta57►
◄steps10►
◄step_swap0►
◄denoise1.00►
◄denoise_stepsfull schedule►
◄low_passcontinue noise schedule►
◄scheduler_shape_2same as first►
◄first_pass_resample1.00►
◄sigma_shiftuse model default►
◄custom_shift1.15►
◄beta_alpha0.60►
◄beta_beta0.60►
◄flowmatch_shift3.00►
◄flowmatch_dynamictrue►
◄flowmatch_terminal0.00►
◄hyperbolic_functiontanh►
◄hyperbolic_scale1.00►
◄gaussian_mean0.04►
◄gaussian_std1.00►
◄gaussian_operationmodulate►
◄edit_modesmooth►
◄smooth_radius1.5►
◄curve_edit►
◄seed0►

Schedulers are the knob everyone leaves on default. That was fine when the answer was always Karras. On flow-matching models Karras and exponential went from safe to actively harmful - a straight trajectory has nothing for an aggressive noise schedule to fix - and the real shortlist now lives in a third-party pack, which is why workflows naming beta57 won't even load without RES4LYF installed. LC Sigmas is the attempt to put all of that in one node, with the maths built in rather than borrowed.

What it is

A scheduler node. It builds a sigma schedule from your model's own noise range and shift, and it handles one-pass and two-pass sampling in the same place: the curve, the step swap to a second model, image-to-image denoise, what the second pass does at the handover, and the noise and sampler for each pass.

sigma_curve_presets is the shape of the schedule:

  • base - a plain ComfyUI scheduler chosen in base_scheduler (simple, sgm_uniform, karras, exponential, beta, beta57, bong_tangent, kl_optimal and friends).
  • beta - Comfy's beta schedule with your own beta_alpha and beta_beta.
  • flowmatch - the FlowMatch Euler Discrete curve, with flowmatch_shift, flowmatch_dynamic and flowmatch_terminal.
  • hyperbolic and gaussian - the base curve bent by sinh/cosh/tanh and friends, or by a bell curve (gaussian_operation pdf/cdf/inverse_cdf/transform/modulate). These are the same maths as RES4LYF's Sigmas Hyperbolic and Sigmas Gaussian nodes.
  • saved: … - your own curves, saved from here or from LC Sigma Curve, living in ComfyUI/user/LC123/sigma_curves/ where an update can't eat them.

And the graph on the node isn't decorative. Drag a point and the curve bends: edit_mode smooth pulls neighbouring steps along, spike moves only that point, and smooth_radius says how many neighbours come along. reset curve clears the edit. save curve arms a save - you still have to queue the workflow for it to happen.

The two-pass half

step_swap is the step where model_2 takes over (0 = one pass). The second pass starts at exactly the noise level the first stopped at, and the node lines up two different architectures by comparing noise as a share of noise in the image, which is what makes an SDXL-esque model hand off cleanly to a flow model. scheduler_shape_2 gives the second pass its own curve, or follows the first.

low_pass decides what the handover means:

  • continue noise schedule - the second model takes the leftover noise and finishes the job. One schedule, two samplers.
  • renoise - the first pass finishes the picture, fresh noise goes back up to the swap level, and the second pass refines from there. That's a detailer, and it's the setting people want when pairing a base model with a different refiner.

denoise (with denoise_steps set to full schedule or at step swap) covers image-to-image. first_pass_resample spreads the first pass over more steps along the same path without moving where it starts or stops. sigma_shift bends the schedule without changing the step count - use model default, by image size (Flux's rule; needs image_size_latent wired), or custom with custom_shift.

Outputs, and the bit to actually read

Seven of them: sigmas_high and sigmas_low (the two passes), noise_high and noise_low (NOISE objects, with noise_low derived from seed + 1), sigmas_full for the unsplit schedule, sampler - the enum choice handed out as a real SAMPLER for SamplerCustomAdvanced - and info, a plain-language string describing what the schedule does. Wire sigmas_high, noise_high and sampler into SamplerCustomAdvanced and you're running.

The sampler dropdown lists 44 options and pulls in RES4LYF's samplers when it's installed; a ClownSampler Selector can be wired in too. More usefully, the line under the graph recommends a pairing for the model you plugged in, from the pack's own testing: Krea 2 → euler + beta57; Z-Image → uni_pc + simple; Flux 2 → uni_pc/simple or dpmpp_2m/sgm_uniform; SDXL, Illustrious and Pony → dpmpp_2m + karras.

Worth knowing where that recommendation breaks: with a large sigma shift (say ModelSamplingAuraFlow at 4 in front of Krea 2), beta57 crams the last steps into very low noise, and a Turbo-based model starts drawing grain there - which Detail Daemon then turns into crunchy skin. At high shift, simple stays photographic. The node accounts for this, but now you know why.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC123_nodes.git

Restart, or search ComfyUI LC123 Nodes in ComfyUI Manager. No requirements.txt, no pip. The node is still marked BETA, and the live curve editor is a classic-canvas feature: in Nodes 2.0 you get a picture of the curve after the run instead.

Where it bites

Two practical traps. A high shift combined with a low-end-crowding schedule - crunchy skin, inked-looking eyes - so change the shape before you blame the sampler. And expecting renoise and continue noise schedule to behave alike: one hands over, the other restarts. If you're on an SDXL finetune, none of this buys you anything - dpmpp_2m with Karras is still correct there.

CategoryLC123/sampling

Inputs (29)

NameTypeDefaultDescription
modelMODELThe first pass's model. Its noise range and sigma shift set the schedule.
samplerCOMBOeulerThe sampler both passes use (the sampler output). With RES4LYF installed its samplers are listed too, and a ClownSampler Selector can be wired in. The line under the graph shows what tested best for your model.
sigma_curve_presetsCOMBObaseThe curve the steps follow, from noisy to clean. base = a plain scheduler (base_scheduler). beta = the beta curve with your own alpha and beta. flowmatch = the FlowMatch Euler Discrete curve. hyperbolic = the base curve bent by sinh / cosh / tanh. gaussian = the base curve bent by a bell curve. saved: = a curve you saved. Drag the points on the graph to bend any of them.
base_schedulerCOMBObeta57The scheduler under base, hyperbolic and gaussian (sigma_curve_presets). Flow models (Krea 2, Z-Image, Flux 2): beta, beta57 and simple are safe; karras, kl_optimal and linear_quadratic burn.
stepsINT101–1000Total steps, both passes together.
step_swapINT00–1000The step where the second model (model_2) takes over. 0 = one pass only.
denoiseFLOAT1.000–1How much of your input image gets redrawn. 1 = a new image from scratch (text to image).
denoise_stepsCOMBOfull schedulefull schedule = denoise covers the whole run; the second pass just carries on. at step swap = denoise covers the first pass only; the second pass refines on its own.
low_passCOMBOcontinue noise scheduleWhat the second pass does at the step swap. continue noise schedule = it takes the leftover noise and finishes the job (one schedule over two samplers). renoise = the first pass finishes the picture, then fresh noise goes back up to the swap point's level, so the second pass has something to refine, like a detailer.
scheduler_shape_2COMBOsame as firstThe second pass's curve. same as first = the schedule above, curve edits included.
first_pass_resampleFLOAT1.000.25–4Walks the first pass in more (or fewer) steps along the same path; where it starts and stops stays put. 1 = off. 1.15 = 15% more first-pass steps.
sigma_shiftCOMBOuse model defaultBends the schedule without changing the step count. Higher = more steps on composition (the noisy start), lower = more on detail. use model default = what the model was trained with. by image size = Flux's rule (needs image_size_latent). custom = custom_shift. SDXL-type models have no shift. flowmatch and saved curves ignore it.
custom_shiftFLOAT1.150–20The model's own shift number. Krea 2 / Flux: 0.5 small images, 1.15 = Krea 2 Turbo's default, 2+ = strongly composition-heavy.
beta_alphaFLOAT0.600–50beta: higher = more steps at the noisy start.
beta_betaFLOAT0.600–50beta: higher = more steps at the clean end (detail).
flowmatch_shiftFLOAT3.000–20flowmatch: the curve's shift (used when flowmatch_dynamic is off).
flowmatch_dynamicBOOLEANtrueflowmatch: dynamic shifting (as in V23.2) or the fixed flowmatch_shift.
flowmatch_terminalFLOAT0.000–0.99flowmatch: stretch the curve so the last step lands here. 0 = off.
hyperbolic_functionCOMBOtanhhyperbolic: the function that bends the base curve.
hyperbolic_scaleFLOAT1.000.01–10hyperbolic: how hard the function bends it.
gaussian_meanFLOAT0.04-10–10gaussian: where the bell curve sits (a noise level).
gaussian_stdFLOAT1.000.01–10gaussian: how wide the bell curve is.
gaussian_operationCOMBOmodulategaussian: how the bell curve bends the base curve.
edit_modeCOMBOsmoothDragging a point on the graph: smooth pulls its neighbours along, spike moves only that point.
smooth_radiusFLOAT1.50–20smooth: how many steps around the point come along.
curve_editSTRINGYour curve edit (set by dragging on the graph).
seedINT00–18446744073709550000Seed for noise_high (noise_low uses seed + 1).
model_2optMODELThe second pass's model, if different (e.g. without ControlNet). Its own schedule, lined up.
image_size_latentoptLATENTOnly for sigma_shift = by image size: the empty latent, so the shift can follow the image size.

Outputs (7)

NameTypeDescription
sigmas_highSIGMASFirst pass (or the only pass).
sigmas_lowSIGMASSecond pass, from the step swap.
noise_highNOISENoise for the first sampler.
noise_lowNOISENoise for the second sampler (none when it continues the schedule).
infoSTRINGWhat the schedule does, in words.
sigmas_fullSIGMASThe whole first-model schedule, unsplit.
samplerSAMPLERThe chosen sampler, for SamplerCustomAdvanced.