AGSoft Loop Samplers
Twenty samplers in one wire — A/B testing without the graph spaghetti
- samplers_list
You've dialed in steps, CFG, and scheduler, but you still can't decide between dpmpp_2m_sde and euler_ancestral. Normally that means editing a KSampler, running, editing again, running - or building a parallel graph that looks like a plate of spaghetti. AGSoft Loop Samplers exists to kill that workflow: you pick up to 20 samplers in one node, and it hands the whole list to a KSampler in one run.
The description says it best: "Select up to 20 samplers for batch processing. Connect directly to KSampler.sampler_name." That's the entire pitch, and it's a good one.
How it works
The node pulls its options straight from ComfyUI's own comfy.samplers.KSampler.SAMPLERS list at load time. That means whatever samplers your ComfyUI build knows about - including the CFG++ variants (euler_cfg_pp, dpmpp_2m_cfg_pp), the newer res_multistep family, sa_solver, uni_pc, all of it - show up here automatically. Set a slot to none and it's skipped. Wire the samplers_list output into a KSampler's sampler_name input and let the batch loop handle the rest.
The clever bit is the wiring. The node returns its list using the same type as KSampler's sampler_name input (comfy.samplers.KSampler.SAMPLERS) with a list-output flag, so ComfyUI's native list expansion handles the iteration - wire samplers_list straight into sampler_name and you're done. No extra loop node required, and the tooltip's promise of "connect directly" is literally true. It's a data generator, not a sampler itself: pick samplers here, sample somewhere else.
The inputs
Twenty identical dropdowns, sampler_1 through sampler_20, each defaulting to none. That's the whole input side, and it's exactly as simple as it looks. Select the ones you want to compare, leave the rest untouched.
The output is the notable bit: samplers_list is a list type, not a single string - one value per sampler slot you filled, in order. That list type is the key to why this works in batch workflows.
Why you'd bother
Two honest uses. First, sampler comparison: when a workflow update or new checkpoint lands and you want to see which sampler the community's latest take is using, one queue gets you a column of candidates instead of an afternoon of clicking. Second, systematic sweeps: pair it with a LoRA-strength loop or a seed loop and you're doing proper parameter exploration.
The flip side: if you already use an A/B workflow built on primitive "anything" switches, this won't change your life. It's for people who genuinely want N samplers compared in a single pass and don't want to build the switch logic by hand.
Installing it
Standard pack install - ComfyUI Manager, search comfyui-AGSoft, install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/Art-xmaster/comfyui-AGSoft.git
No dependencies beyond what ComfyUI already has; the node is a thin wrapper over the built-in sampler registry. Note the pack's requirements file only really lists translators for the Translate node, so a bare clone runs this node fine.
Common issues
The typical stumble is expecting the node to run sampling. It won't - if nothing lights up, check that a loop is consuming the list. Also, sampler names come from your ComfyUI build: if a freshly-released sampler doesn't appear, update ComfyUI before blaming the pack. And the pack's dynamic loader logs [AGSoft] errors per-module when something fails to import - if the whole pack seems half-missing after an update, the console is where the real story is.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| sampler_1 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_2 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_3 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_4 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_5 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_6 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_7 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_8 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_9 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_10 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_11 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_12 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_13 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_14 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_15 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_16 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_17 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_18 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_19 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
| sampler_20 | COMBO | none | 45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| samplers_list | 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 | — |