KoO Sigma Schedule Designer
Your Sampler's Schedule Is a Curve. This Node Lets You Bend It.
- reference_sigmas
- sigmas
- sigma_info
Pick "normal" or "karras" from the scheduler dropdown and you're picking one of a handful of curves somebody else wrote. Those curves decide where your steps go - how much of the denoising budget gets spent inventing composition versus defining materials versus polishing texture. Same 30 steps, same seed, different spacing, visibly different image.
KoOSigmaEqualizer - it shows up in the menu as KoO Sigma Schedule Designer - hands you that curve as an editable object. Sigmas in, sigmas out, with four bands of the schedule you can re-weight without touching your step count. It's the difference between "use karras" and "spend three more evaluations on microdetail and two fewer on large forms."
Where it fits
In a stock SDXL graph you never see a sigma tensor; the sampler makes one from the dropdown. Move to SamplerCustomAdvanced and sigmas become a real wire - the wire this node feeds.
The interesting case is a two-stage handoff: a first sampler ends around sigma 1.6, where composition and big forms are settled, and a second one takes the low end and does detail work. The Designer has a mode for each role and a numeric handoff_sigma to bind them together.
One honest caveat. Reshaping is a big win on SD1.5/SDXL-class noise schedules and a weak tool on rectified-flow models, which are already trained on a straight trajectory; the better sampler sweeps keep landing on the same conclusion. Nudge the curve, don't reflavor it.
How it works
The order of operations explains most of its behavior.
- Source. If usable SIGMAS are wired, it uses them (
range_sourcedefaults toAUTO / INPUT). Otherwise it fabricates a reference fromstepsandmax_sigma. - Range.
sigma_range_modepicksFULL RANGE,HIGH SIGMA(stops at the handoff) orLOW SIGMA(starts there).IMG2IMG REFINEmode crops bydenoise_active_rangeon top of that. - Shape. The
profileis stored as normalized (progress, remaining sigma) anchors, so one shape scales to a 14.6 full schedule or a 1.6 refinement tail. The band sliders move where those anchors sit;curve_strengthdecides how far the target departs from the reference. - Smooth and validate.
smoothnessflattens kinks, then the toggles fire: monotonic lock, duplicate repair, endpoint pinning, clamping to the input range. - Blend back.
reference_blendpulls the result toward the original schedule, then it validates again.
The inputs you'll actually touch
mode first: AUTO works out from the incoming schedule whether you're a first or second sampler, and FIRST SAMPLER / SECOND SAMPLER / IMG2IMG REFINE / CUSTOM override it. Older workflows using Auto, TXT2IMG or Manual still load - legacy names get migrated.
profile is the vocabulary: 15 current presets (Balanced Generation, Photoreal Base, Detail Refiner, Microdetail, Turbo Tail, Identity Refine…), the legacy names they replaced, and a Custom slot. Choosing one writes its band values into the sliders; from there you fiddle.
Then curve_strength and reference_blend, the two knobs most people should be turning. High strength with low blend is a big departure from what the model expects. High blend with moderate strength is a gentle re-weight that rarely breaks anything.
steps and max_sigma are pure fallbacks - AUTO / INPUT ignores them whenever incoming sigmas are usable, so don't tune them while wired up. Everything else lives behind ui_complexity; leave it on BASIC until you have a reason.
The outputs
sigmas goes into SamplerCustomAdvanced (with a KSamplerSelect for the algorithm), or into SplitSigmas if you're building a handoff. A plain KSampler won't take it; that node makes its own schedule.
sigma_info is a long STRING of diagnostics: source used, whether it fell back, first and last values in and out, tensor length, finite/monotonic flags, every repair applied. Wire it into any string consumer. It answers "why did nothing change" in one line, because it literally reports input_equals_output.
Install
Manager, searching koo-nodes-pack (publisher KoO.Ai; registry availability depends on moderation approval). Otherwise:
cd ComfyUI/custom_nodes
git clone https://github.com/kevintronchin-blip/koo-nodes-pack
Restart and hard-refresh. requirements.txt only declares torch, numpy, Pillow and aiohttp, all shipped with ComfyUI. No downloads; the pack never pip-installs at runtime.
Where people get stuck
The curve editor ignores your clicks. Manual point editing unlocks only in CUSTOM mode with ui_complexity on PRO. The status line says so; clicking on a preset profile does nothing until you switch.
Your input was ignored. If incoming sigmas aren't strictly decreasing - a cropped tail, a split range fed back in - the node treats them as unusable and falls back to steps/max_sigma. sigma_info says exactly that.
Nodes 2.0. The Designer draws its own curve canvas, and the README is upfront that node-level canvas drawing and mouse hooks need the Legacy/LiteGraph renderer. On Nodes 2.0 you get a node with no editor.
Inputs (49)
| Name | Type | Default | Description |
|---|---|---|---|
| mode | COMBO | AUTO | Sampling use case. Legacy mode values are accepted and migrated. |
| profile | COMBO | Balanced Generation | A scale-independent sigma distribution preset. |
| structure_creativity | FLOAT | 550–100 | Allocates more schedule influence to high sigma structure and large-form creation. |
| shapes_materials | FLOAT | 520–100 | Allocates more schedule influence to mid-sigma shape and material definition. |
| microdetail | FLOAT | 500–100 | Allocates more evaluations to low-sigma texture and microdetail. |
| final_cleanup | FLOAT | 480–100 | Allocates more evaluations to the final cleanup tail. |
| curve_strength | FLOAT | 700–100 | How strongly the selected preset reshapes the reference schedule. |
| reference_blend | FLOAT | 300–100 | How strongly the final schedule stays near the original input/reference sigma schedule. |
| smoothness | FLOAT | 350–100 | Reduces abrupt changes between adjacent sigma intervals. |
| steps | INT | 301–10000 | Fallback transition count when no usable SIGMAS input is available. |
| max_sigma | FLOAT | 14.600.000001–1000 | Fallback/model maximum. AUTO / INPUT ignores this whenever incoming SIGMAS are usable. |
| interpolation_type | COMBO | Smoothstep | Interpolation used between manual or preset curve anchors. |
| high_to_mid_boundary | FLOAT | 0.660.05–0.95 | Normalized boundary between high-sigma structure and mid-sigma work. |
| mid_to_low_boundary | FLOAT | 0.220.01–0.9 | Normalized boundary between mid-sigma material work and low-sigma detail. |
| tail_length | FLOAT | 0.0550.001–0.4 | Normalized size of the final cleanup band. |
| curve_gamma | FLOAT | 1.000.1–5 | Global exponent applied to the generated normalized curve. |
| tail_exponent | FLOAT | 1.000.1–5 | Additional exponent applied inside the low-sigma cleanup tail. |
| txt2img_settings | STRING | {} | — |
| img2img_settings | STRING | {} | — |
| auto_settings | STRING | {} | — |
| manual_curve_points | STRING | [{"id":"start","x":0,"sigma":14.6},{"id":"end","x":1,"sigma":0}] | Serialized manual curve. Legacy normalized x/y points remain supported. |
| normalized_manual_points | STRING | — | |
| lock_monotonic_curve | BOOLEAN | true | Prevents sigma increases as sampling progresses. |
| prevent_duplicate_sigmas | BOOLEAN | true | Repairs consecutive equal sigma values using an adaptive epsilon. |
| normalize_endpoints | BOOLEAN | true | Pins output start/end to the selected input range endpoints. |
| clamp_to_input_range | BOOLEAN | true | Keeps all generated values inside the selected incoming sigma range. |
| preserve_final_zero | BOOLEAN | true | Preserves zero only for ranges that own a zero endpoint; HIGH SIGMA handoffs remain non-zero. |
| allow_sigma_expansion | BOOLEAN | false | Allows generated values up to the available source maximum. AUTO / INPUT never expands a cropped start to fallback max. |
| include_appearance_in_preset | BOOLEAN | false | — |
| denoise_active_range | FLOAT | 1.000–1 | Fraction of the selected range used by IMG2IMG REFINE. Already-cropped inputs are not cropped twice in Auto mode. |
| input_already_cropped | COMBO | Auto | Override numeric cropped-input detection only when necessary. |
| output_steps_override_enabled | BOOLEAN | false | Resample the active range to an explicit transition count. |
| output_steps_override | INT | 00–10000 | — |
| reference_sigmasopt | SIGMAS | — | |
| denoiseopt | FLOAT | 1.000–1 | — |
| external_strengthopt | FLOAT | 1.000–2 | — |
| external_reference_blendopt | FLOAT | -1-1–100 | — |
| sigma_range_modeopt | COMBO | FULL RANGE | FULL uses the available range; HIGH ends at handoff; LOW begins at handoff/available cropped start. |
| range_sourceopt | COMBO | AUTO / INPUT | AUTO / INPUT trusts incoming SIGMAS. Model/custom sources are explicit opt-ins. |
| custom_max_sigmaopt | FLOAT | 14.600.000001–1000 | Maximum used only when Range Source is CUSTOM MAX SIGMA. |
| handoff_sigmaopt | FLOAT | 1.6000–1000 | Numeric FIRST-to-SECOND sampler boundary. |
| ui_complexityopt | COMBO | BASIC | 2 options: BASIC, PRO |
| show_sigma_labelsopt | BOOLEAN | true | — |
| show_step_numbersopt | BOOLEAN | true | — |
| show_reference_curveopt | BOOLEAN | true | — |
| show_generated_curveopt | BOOLEAN | true | — |
| show_final_curveopt | BOOLEAN | true | — |
| point_table_openopt | BOOLEAN | false | — |
| workflow_schema_versionopt | INT | 21–2 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| sigmas | SIGMAS | — |
| sigma_info | STRING | — |