Nodes/comfyui-AGSoft/AGSoft Loop Samplers
ComfyUI Node

AGSoft Loop Samplers

Twenty samplers in one wire — A/B testing without the graph spaghetti

By Art-xmaster·Created 12 months ago·Updated a day ago· 23
AGSoft Loop Samplers
    • samplers_list
    sampler_1none
    sampler_2none
    sampler_3none
    sampler_4none
    sampler_5none
    sampler_6none
    sampler_7none
    sampler_8none
    sampler_9none
    sampler_10none
    sampler_11none
    sampler_12none
    sampler_13none
    sampler_14none
    sampler_15none
    sampler_16none
    sampler_17none
    sampler_18none
    sampler_19none
    sampler_20none

    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.

    CategoryAGSoft/Utility

    Inputs (20)

    NameTypeDefaultDescription
    sampler_1COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_2COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_3COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_4COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_5COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_6COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_7COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_8COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_9COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_10COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_11COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_12COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_13COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_14COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_15COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_16COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_17COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_18COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_19COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39
    sampler_20COMBOnone45 options: none, euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, +39

    Outputs (1)

    NameTypeDescription
    samplers_listeuler,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