Sampler Selector (Citron Image Saver)
One dropdown, two wires, honest metadata
- sampler
- sampler_name
Pick a sampler once, feed it to your KSampler and to your save node. That's it. That's the node. Forty-four samplers in a dropdown, one selection, two outputs.
It looks trivial, and it is - but it solves a real annoyance that anyone who's chased CivitAI metadata has hit. The Citron saver's sampler_name input is a plain string. Type it by hand and it drifts: you switch from dpmpp_2m to euler_ancestral in the sampler, forget the text field, and every file from then on claims the wrong sampler. A value node makes one selection authoritative, which is the standard fix for exactly this class of bug.
How it works
One required input, sampler_name, an enum of ComfyUI's standard sampler list - euler, euler_cfg_pp, euler_ancestral, heun, heunpp2, dpm_2, dpmpp_2m, dpmpp_2m_sde, dpmpp_3m_sde, lcm, ddim, uni_pc, res_multistep, gradient_estimation, sa_solver and the rest of the 44.
Two outputs: sampler, typed as the SAMPLERS combo so it plugs into a KSampler's sampler_name socket, and sampler_name, a STRING for the saver. Both carry the same string - the tooltips literally read "sampler (SAMPLERS)" and "sampler name (STRING)". There's no logic beyond returning the selection twice in two types.
Why the type split matters: ComfyUI won't let a STRING output connect to a combo input, so without the SAMPLERS-typed output you couldn't drive the sampler at all, and without the string output you'd be feeding a text field from a combo. This node is the adapter between the two.
The list is ComfyUI's core sampler list, snapshotted when the module imports. Samplers added by other packs - RES4LYF's res_* family, for instance - are not in it; those packs ship their own sampler nodes and selectors. If you install a pack that extends the core list, restart ComfyUI so this dropdown refreshes.
For context on what you're choosing: converging samplers (Euler, DPM++ 2M, DDIM, UniPC) settle to a stable image, ancestral ones (Euler A, DPM++ SDE) keep injecting noise so more steps keep changing the result rather than refining it. DPM++ 2M is the boring safe default on SD 1.5 and SDXL; on flow-matching models the shortlist is different and much shorter.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/citronlegacy/ComfyUI-CitronNodes
# restart ComfyUI
ComfyUI Manager may not have this pack in its index yet - the README still marks Manager support "coming soon" and the repo metadata is placeholder - so cloning is the reliable install. Only pip dependency is piexif; a missing copy breaks the whole pack's import, this selector included:
pip install piexif
No models needed. Find it under Citron_ImageSaver/utils.
Common issues
- Dropdown's missing a sampler I have. This is core Comfy only. Pack-provided samplers don't appear here, and a restart won't help if the pack registers its own node instead of extending the list.
- KSampler rejects the connection. Make sure you're using the
sampleroutput, notsampler_name- the string one won't type-check against the combo input. - Metadata sampler name and actual sampler disagree. Both wires have to come from this one node. If the sampler input on one KSampler is still typed in by hand, you're back to two sources of truth.
- Type mismatch after a ComfyUI update. The output type is built from ComfyUI's own sampler list, so a core change to that list is the one thing that can invalidate an old graph. Restart and reload before rebuilding the wiring.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| sampler_name | COMBO | sampler (Comfy's standard) |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| sampler | 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 | sampler (SAMPLERS) |
| sampler_name | STRING | sampler name (STRING) |