Painter Sampler Advanced
PainterSampler and the Wan 2.2 two-expert shuffle
- high_model
- low_model
- positive
- negative
- latent_image
- latent
If you've run Wan 2.2 in ComfyUI, you've stared at the official workflow's two KSamplerAdvanced nodes chained back to back: one for the high-noise expert, one for the low-noise expert. Wan 2.2 is a mixture-of-experts model, and it splits denoising into a high-noise pass that handles motion and composition and a low-noise pass that refines detail. The native workflow runs them as two separate samplers, which means twice the wiring and two CFG sliders to keep in sync. PainterSampler collapses the whole chain into one node - same two models, same two passes, one widget stack.
That's the entire pitch, and it's honest. The node's README says "one node, same quality," and the mechanism backs it up: the source is a verbatim copy of ComfyUI's own common_ksampler, run twice in sequence. It doesn't call an API, load extra weights, or reinvent sampling. It's the same code path the stock sampler uses, which is why the "bit-identical frames" claim is mechanically plausible rather than marketing. What you actually get beyond tidiness is a second CFG slider - high_cfg and low_cfg let you tune the two passes independently, which the stock double-KSampler chain makes you chase manually.
How it works
Phase one runs your high_model from start_at_step to switch_at_step - that's the motion/composition expert doing its thing on fresh noise (add_noise controls whether it gets any). Phase two hands the latent to low_model from switch_at_step to end_at_step, with noise always disabled, exactly like the tail end of a KSamplerAdvanced chain. return_leftover_noise maps to the final force_full_denoise on that last pass. Both stages share noise_seed, and you get one latent out, ready for VAE decode.
The inputs that matter
- high_model / low_model - your two Wan 2.2 experts. This is also where you get to follow the community's best practice for speed LoRAs: attach the acceleration LoRA to
low_modelonly, and keep the high-noise pass unmodified. Doing the reverse tanks motion quality. - start_at_step / switch_at_step / end_at_step - the whole two-pass schedule. The README's 4-step Wan 2.2 recipe is
steps 4,start 0,switch 2,end 4,return_leftover_noisedisabled. - high_cfg / low_cfg - the independent CFGs, the one feature the official chain doesn't give you.
The rest - sampler_name, scheduler, positive, negative, latent_image, noise_seed - wire exactly like a KSamplerAdvanced, because that's what this node is pretending to be.
Installing it
There's no requirements.txt and no model download; the only dependency is ComfyUI itself. Clone it in, restart, and the node appears under sampling → painter:
cd ComfyUI/custom_nodes
git clone https://github.com/princepainter/Comfyui-PainterSampler.git
You can also try ComfyUI Manager, but it's a young, near-untouched pack (zero search impressions as of writing), so the Manager index may lag behind the repo - the clone route is the reliable one.
Where people get burned
Honestly, there's not much community wisdom to lean on - this node has essentially no footprint on Reddit, which tells you two things. First, if something breaks, you're debugging it alone. Second, this is a quality-of-life wrapper, not a fix: if the stock KSamplerAdvanced behavior changes in a ComfyUI update, this copy won't follow automatically, so a future update could quietly drift from "bit-identical."
One quiet behavior worth knowing: the code clamps your slider values. end_at_step gets forced to at least start_at_step + 2, and switch_at_step gets clamped between start + 1 and end - 1. Pull the sliders into a nonsense range and it won't error - it'll just fix them for you.
And the honest caveat: if you're not already running the two-expert Wan 2.2 setup, this node does nothing for you. It's purpose-built for that specific chain, not a general-purpose sampler. But if you are, and you're tired of dragging lines across the canvas between two identical KSamplerAdvanced stacks, it's the tidy one.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| high_model | MODEL | — | |
| low_model | MODEL | — | |
| add_noise | COMBO | enable | 2 options: enable, disable |
| noise_seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–10000 | — |
| high_cfg | FLOAT | 8.000–100 | — |
| low_cfg | FLOAT | 8.000–100 | — |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| latent_image | LATENT | — | |
| start_at_step | INT | 00–10000 | — |
| switch_at_step | INT | 21–10000 | — |
| end_at_step | INT | 100000–10000 | — |
| return_leftover_noise | COMBO | disable | 2 options: disable, enable |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | — |