LC Sampler Scheduler ⚙️
One dropdown for every sampler in the graph
- sampler_name
- scheduler
Count the KSamplers in your current workflow. High pass, low pass, a detailer pass, maybe a second model for the refine - that's three or four nodes, each with its own sampler_name and scheduler widget, each set independently. Now change the sampler to test something. You edit four widgets, and there's an even chance you miss one, and the run finishes with a mismatched schedule that has the high pass on Euler and the low pass on DPM++ 2M, and you spend twenty minutes comparing images that were never comparable.
LC Sampler Scheduler ⚙️ is the fix for that. One node, two dropdowns, wire them everywhere. Change it once, every sampler moves. It's the same idea as rgthree's KSampler Config and it's based on the Sampler Scheduler Settings node from JPS Nodes - a small category of node that exists purely because ComfyUI bakes sampler and scheduler into each sampler node instead of keeping them as a workflow-level setting.
Why this one plugs into everything
The implementation is worth knowing because it's the reason the node is more than a text box:
RETURN_TYPES = (comfy.samplers.KSampler.SAMPLERS, comfy.samplers.KSampler.SCHEDULERS)
It doesn't copy a hardcoded list of names. It uses ComfyUI's own list objects as both the widget options and the output types, and it hands the same string straight back - pure pass-through, no math, no state.
That has two consequences you actually notice. First, when you right-click a KSampler's sampler_name widget and pick Convert widget to input, the socket it creates expects exactly this list type - so the wire just connects, with no type-mismatch red. Second, any sampler or scheduler other packs register shows up here automatically. If you have RES4LYF (ClownShark) installed, its samplers are in the dropdown; a stock install shows 44 samplers and 11 schedulers, and beta57, bong_tangent and kl_optimal sit alongside simple and karras.
Inputs and outputs
- sampler_name - 44 options on a stock install, defaulting to
euler. - scheduler - 11 options, defaulting to
simple.
Outputs are the same two names, sampler_name and scheduler. That's the whole node.
Wiring it: right-click each KSampler → Convert widget to input on sampler_name, then drag a wire from the matching output. Do it for scheduler too. Then each KSampler's dropdown becomes an input and the LC node is the single source of truth. It works on KSampler, KSampler (Advanced), and any third-party sampler node that exposes the same combo widgets, because the type it's feeding is ComfyUI's own.
Worth doing once, not once per render
Sampler choice is not a solved default, and the popular answers age badly. The largest public sweep the community has run - 62 samplers × 16 schedulers, roughly 1000 images on Z-Image Turbo - found Karras and Exponential outright failures on that model, with low-step-robust samplers on conservative schedules winning. Older guidance runs the other way: DPM++ 2M Karras is a safe default for SD 1.5 and SDXL, and distilled models come with a recommended sgm_uniform or similar because step count and schedule are coupled. None of that is encoded in this node - what it gives you is a cheap experiment: flip the hub, re-run the same seed, get a clean A/B instead of six edits and a mismatched schedule. Two things to know while you test: some third-party schedulers (RES4LYF's bong_tangent among them) apply their own sigma shift and ignore your workflow's, and the flow-matching models expose a shift knob that is roughly the modern replacement for picking a scheduler at all.
Install
ComfyUI Manager → search ComfyUI_LC123_nodes → Install, or:
cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC123_nodes.git
Restart. No requirements.txt and no pip step - the pack runs on ComfyUI's own torch/numpy. If it doesn't appear, the folder is nested one level too deep; __init__.py must sit directly inside custom_nodes/ComfyUI_LC123_nodes/, and the console prints an [LC123] + line per module when it loads.
Things that bite
- A wire that refuses to connect. That KSampler's widget isn't the same combo type. Check you're converting the widget rather than adding a socket by hand.
- Portability. The list is whatever your install has, so a workflow saved with a ClownShark sampler or
beta57selected will not run on a machine without that pack - the standard way workflows arrive broken, with a scheduler name nobody recognises. Sharing the workflow? Keep the hub on stockeuler/simple. - Don't bypass the hub. With the KSamplers' widgets converted to inputs, bypassing the LC node leaves them unconnected and the run errors out. The clean move is to edit the hub, and keep it the one place anyone edits a schedule.
- It's not a sampler. Changing the name here doesn't touch your steps, CFG or denoise. If you want one hub for those too, that's LC Sampler Configure.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| sampler_name | COMBO | euler | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| scheduler | COMBO | simple | 11 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +5 |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| sampler_name | euler,euler_cfg_pp,euler_ancestral,euler_ancestral_cfg_pp,heun,heunpp2,exp_heun_2_x0,exp_heun_2_x0_sde,dpm_2,dpm_2_ancestral,lms,dpm_fast,dpm_adaptive,dpmpp_2s_ancestral,dpmpp_2s_ancestral_cfg_pp,dpmpp_sde,dpmpp_sde_gpu,dpmpp_2m,dpmpp_2m_cfg_pp,dpmpp_2m_sde,dpmpp_2m_sde_gpu,dpmpp_2m_sde_heun,dpmpp_2m_sde_heun_gpu,dpmpp_3m_sde,dpmpp_3m_sde_gpu,ddpm,lcm,ipndm,ipndm_v,deis,res_multistep,res_multistep_cfg_pp,res_multistep_ancestral,res_multistep_ancestral_cfg_pp,gradient_estimation,gradient_estimation_cfg_pp,er_sde,seeds_2,seeds_3,sa_solver,sa_solver_pece,ddim,uni_pc,uni_pc_bh2 | — |
| scheduler | simple,sgm_uniform,karras,exponential,ddim_uniform,beta,normal,linear_quadratic,kl_optimal,beta57,bong_tangent | — |