Nodes/RES4SHO/Manual Sampler
ComfyUI Node

Manual Sampler

Make Your Own Sampler Without Writing Any Code

By WASasquatch·Created 4 months ago·Updated 4 months ago· 23
Manual Sampler
    • SAMPLER
    base_samplereuler
    stages2
    eta_override-1.00
    s_noise1.00
    preset_data

    "Creating a new sampler" usually means writing a k-diffusion function, tuning it until it NaNs, and reading stack traces at 1 a.m. Manual Sampler is the version where you don't. It wraps any sampler that's already registered in ComfyUI - the built-ins, RES4SHO's own hfe_*/hfx_* variants, even samplers from other packs like RES4LYF - hands you the knobs that actually matter, and saves the result as a named sampler that shows up in every dropdown. You get to make a sampler; the pack does the math.

    It ships in RES4SHO, a high-frequency-detail sampling pack by WASasquatch - the same person who built the enormous WAS Node Suite (archived in 2025, still widely forked and used). RES4SHO is a much younger, far more niche thing: its hfe_* samplers re-inject high-frequency detail via a spatial high-pass, and its hfx_* modes sharpen in spatial, value, frequency, temporal and inter-stage domains. Don't confuse the pack with RES4LYF (that's ClownsharkBatwing's flow-matching solver collection) - though Manual Sampler can wrap RES4LYF samplers too, since they're all in the same registry.

    Why you'd reach for it

    Two reasons. First, RES4SHO's higher integration accuracy - stages 3 through 5 - is only reachable through this node. The old hfe3_*, hfe4_*, hfe5_* samplers were removed, and the pack now expects you to promote any hfe_* sampler here instead. Second, it's the supported way to create a new sampler. Pick a known-good integrator, dial in the knobs, save it under a name. The README says this is deliberate: every saved preset is guaranteed to be a sensible integrator that won't NaN, because there's no facility for hand-writing integrator code from a node.

    How it works

    The node keeps a list of every registered sampler (about 103 choices) and builds a thin wrapper around the chosen one's function in comfy.samplers.k_diffusion_sampling. The clever part is that it inspects that function's Python signature and only injects the parameters it actually accepts - and the frontend mirrors that on the widget side. Pick euler, and the stages widget disappears, because euler has no stages. Nothing gets force-fed into a function that would raise TypeError.

    The inputs that matter

    • base_sampler - any sampler in the registry. Defaults to euler.
    • eta_override - the one people actually tune. -1.0 means "use the base sampler's default"; 0 is fully deterministic; >0 is noisier, and for hfe/hfx samplers it acts as an HF amplification peak.
    • stages - 2–5, honored only by hfe_* and hfe_auto. Higher stages mean more model evaluations per step but better ODE accuracy.
    • s_noise - noise scale for stochastic samplers.
    • preset_data - the save/load JSON. The tooltip says it's not meant for direct entry, and it isn't; let the canvas widget handle it.

    Output is a single SAMPLER, wired into the sampler input of SamplerCustom / SamplerCustomAdvanced.

    Installing it

    Via ComfyUI Manager (search "RES4SHO"), or the old-fashioned way:

    cd ComfyUI/custom_nodes
    git clone https://github.com/WASasquatch/RES4SHO
    

    Then restart ComfyUI. No pip dependencies and no model downloads - everything it needs ships with ComfyUI (it wants ComfyUI ≥ 1.0.0). Saved presets land in presets/manual_samplers.json and re-register as manual_sampler_<name> samplers on every startup.

    Where people get burned

    The stages field is silently dropped for samplers that don't accept it - set 5 on euler and you'll get 2, with no error at all. If stages seems to do nothing, check the widget is even visible; the UI hides it for non-hfe samplers, which is your honest signal. Presets appear in the dropdowns only after the frontend refreshes node defs, and names are restricted to alphanumerics, dashes, underscores and spaces. And if you're upgrading: old hfe3_*/hfe4_*/hfe5_* names are explicitly unregistered on load, so saved workflows that reference them need repointing at the current equivalents.

    It's a niche node - barely any community chatter around it yet. But the one concrete usage worth knowing: an Anima realism finetune that got its best results from hfx_stochastic_s2 + atan_detail, tuned through exactly this kind of workflow. Start there if you want somewhere to point.

    Categorysampling/custom_sampling/samplers

    Inputs (5)

    NameTypeDefaultDescription
    base_samplerCOMBOeuler103 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +97
    stagesINT22–5Integrator stages for samplers that accept it (hfe / hfe_auto / hfe_s*). Higher = more model evaluations per step but better ODE accuracy. Hidden for samplers that don't expose stages.
    eta_overrideFLOAT-1.00-1–5Stochasticity for ancestral / SDE samplers, or HF amplification peak for hfe/hfx. -1 = use the base sampler's default; 0 = deterministic; >0 = noisier / sharper.
    s_noiseFLOAT1.000–5Noise scale for stochastic samplers.
    preset_dataSTRINGEdited via the canvas widget; JSON of the saved preset name and parameters. Not meant for direct entry.

    Outputs (1)

    NameTypeDescription
    SAMPLERSAMPLER