πͺ My Sampler+scheduler
Flip your sampler loadouts with one click
- presets
- sampler_name
- scheduler
- steps
Ever find yourself on a workflow that wants DPM++ 2M Karras at 28 steps for the good pass, then swapping to euler at 8 just to check a prompt fast - and re-typing all three widgets every time? This node is the fix for exactly that, and it's about the only one I've seen that does it without turning into a settings panel. It's the front half of a two-node pair from Gattopeloso/My_sample-scheduler_GATTO: the CONFIG node defines your named presets, this one lets you pick which preset is live with a single toggle.
What it actually is
Think of it as a sampler/scheduler/steps speed dial that sits right next to your KSampler. Where a plain KSampler makes you hand-edit sampler_name, scheduler, and steps separately, this node hands you one radio list of presets - "Draft", "Final", "Distilled pass", whatever you named them - and each click swaps all three values at once. One active preset at a time, enforced on the frontend so you can't accidentally leave two toggles on.
It's a small thing, and I'll be straight with you: if you don't actually switch sampler combos during a session, this is solving a problem you don't have. But if you keep one stable graph and just want to bounce between a quick draft and the keeper render, it removes a surprising amount of fiddling. The README's license line - "i made this just because i'm LAZY!" - is the whole pitch in one sentence.
How it works
The presets input receives the packed dict that comes out of the CONFIG node - a custom type literally named SAMPLER_SCHED_PRESETS that's just a Python dict riding the wire with the preset names, samplers, schedulers, and step counts inside. The frontend JS extension reads that dict, pulls the pretty preset names off the connected config node, and renders one toggle per preset. Pick one, and the backend picks the first enabled entry and returns its values.
Two details worth knowing. First, the JS re-syncs from the config node every ~400ms, so if you edit a preset name or a sampler in the config, the selector reflects it without you re-wiring anything. Second, the outputs are typed to plug straight into a KSampler: sampler_name is typed against ComfyUI's own sampler list, and steps is an INT, so both click cleanly into the matching KSampler inputs.
The inputs and outputs that matter
You only ever touch two things:
presets- wire this from the CONFIG node's output. This is the whole point; without it, the node falls back to plain euler/simple/10.enabled_1throughenabled_8- the radio toggles. Exactly one is on; that's your active preset.
The rest (pair_count, label_1..8) is backend plumbing that the frontend hides and auto-syncs from the config. Outputs are sampler_name, scheduler, and steps, and all three go into a KSampler node's matching inputs - you can even skip the KSampler's own widgets entirely.
Install
Two ways, both trivial:
cd ComfyUI/custom_nodes
git clone https://github.com/Gattopeloso/My_sample-scheduler_GATTO.git
or search "My Sampler" in ComfyUI Manager and hit install. Then restart ComfyUI - the JS extensions won't load otherwise. There are no dependencies and no model downloads to worry about; the pack imports comfy.samplers and uses whatever sampler list your ComfyUI version ships, so newer entries like res_multistep or seeds_2 show up automatically when you're on a recent build.
Gotchas
The big one: the presets wire has to actually be connected. If it isn't, the node silently returns euler/simple/10 and the toggle labels render as "-" - that's your tell. Also, since presets are just workflow data, they only survive if you save the workflow. And a quick reminder from the sampler lore: sampler+scheduler is one combined choice in practice, and what's right depends on your model - Karras is the SD 1.5/SDXL all-rounder, but it's a known failure on flow-matching checkpoints like Flux. This node doesn't care either way. It's a neutral container; put whatever pair your model card recommends in it.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| presets | SAMPLER_SCHED_PRESETS | β | |
| pair_count | INT | 11β8 | β |
| label_1 | STRING | Preset 1 | β |
| enabled_1 | BOOLEAN | true | β |
| label_2 | STRING | Preset 2 | β |
| enabled_2 | BOOLEAN | false | β |
| label_3 | STRING | Preset 3 | β |
| enabled_3 | BOOLEAN | false | β |
| label_4 | STRING | Preset 4 | β |
| enabled_4 | BOOLEAN | false | β |
| label_5 | STRING | Preset 5 | β |
| enabled_5 | BOOLEAN | false | β |
| label_6 | STRING | Preset 6 | β |
| enabled_6 | BOOLEAN | false | β |
| label_7 | STRING | Preset 7 | β |
| enabled_7 | BOOLEAN | false | β |
| label_8 | STRING | Preset 8 | β |
| enabled_8 | BOOLEAN | false | β |
Outputs (3)
| 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 | * | β |
| steps | INT | β |