Wan MoE KSampler (Advanced)
The auto-swap sampler with the extra knobs
- model_high_noise
- model_low_noise
- positive
- negative
- latent_image
- LATENT
This is the same trick as the plain Wan MoE KSampler, with the extra controls from ComfyUI's KSampler (Advanced) bolted on. Same core job: Wan 2.2 A14B is a two-expert model, a high-noise expert for motion and composition and a low-noise expert for detail, and this node runs both and swaps between them automatically at the signal-to-noise crossover instead of at a step number you had to guess. What "Advanced" buys you is control over noise and over which slice of the schedule this node handles, which is exactly what you need when this sampler isn't the only one in the chain.
When you actually want this one
If you're doing a single, self-contained Wan generation, the basic node is simpler and you should use it. Reach for Advanced when you're building a multi-stage pipeline, a base pass that hands leftover noise to a refiner, an upscale-then-resample setup, or anything where you want to run only part of the denoising schedule in this node and the rest somewhere else. Those patterns need explicit noise control and step ranges, and that's precisely what the extra inputs give you.
The inputs that matter
Everything from the basic node is here, both experts, boundary, per-expert CFG, steps, sampler_name, scheduler, sigma_shift, and the conditioning/latent inputs. If you're new to the pack, read the basic node's page first, that's where the MoE swap and the boundary timestep (0.875 for T2V, 0.900 for I2V) are explained. The Advanced-only additions:
add_noise(enable/disable) - whether this node adds fresh noise to the incoming latent before sampling. Enable it for a normal from-scratch generation. Disable it when the latent already carries noise from an upstream sampler and you're continuing, not restarting.start_at_stepandend_at_step- the slice of the schedule this node runs. Defaults are 0 and 10000, so out of the box it runs the whole thing. Setend_at_stepshort to stop early and hand off; setstart_at_stepto pick up where another sampler left off.return_with_leftover_noise(enable/disable) - whether the output latent keeps its remaining noise instead of being fully denoised. Enable it on a base pass so the next sampler has noise to work with; disable it on the final pass so you get a clean latent to decode.noise_seed- the seed for the added noise (the Advanced node's name for what the basic node callsseed).
Note the CFG defaults differ from the basic node: both cfg_high_noise and cfg_low_noise default to 8 here rather than 4/3. If you're porting settings over from the simple node, don't just accept the defaults, set the CFG values deliberately. The output is a single LATENT, same as any sampler, which either decodes or feeds the next stage depending on your return_with_leftover_noise choice.
How to install it
Same pack, same two ways:
- ComfyUI Manager - search KSampler for Wan 2.2 MoE, install, restart.
- Manual -
cd ComfyUI/custom_nodes && git clone https://github.com/stduhpf/ComfyUI-WanMoeKSampler, then restart ComfyUI.
No heavy dependencies, no bundled model files, it's ComfyUI's sampling code repackaged with the auto-swap logic. You supply the two Wan 2.2 experts. The repo includes example workflows worth cloning as a starting point.
Common issues & troubleshooting
The classic advanced-KSampler mistake: mismatched noise flags between stages. If you run a base pass with return_with_leftover_noise: enable but the next sampler has add_noise: enable, you're double-noising and the result turns to mush. The rule: the pass that ends early returns leftover noise, and the pass that continues it disables add_noise. Get those two flags consistent across the chain.
Nothing renders past a certain step. Check end_at_step. If you set it low for a handoff and then forgot to add the downstream sampler, you've only denoised part of the way and the latent is still full of noise.
Plastic skin, dead motion. Same as everywhere in Wan land: that's a speed LoRA on the high-noise pass, not this node. Put lightx2v/CausVid on the model_low_noise input only, at reduced strength. The high-noise expert is where composition and motion live, keep it clean.
Boundary tweaks feel like they do nothing. The swap point is a diffusion timestep mapped onto your step schedule, so small changes may not move the actual swap step, especially at low step counts. Use the pack's SplitSigmasAtT node if you want to read off exactly which step the swap lands on.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| model_high_noise | MODEL | The first expert of the model used for denoising the input latent. | |
| model_low_noise | MODEL | The second expert of the model used for denoising the input latent. | |
| boundary | FLOAT | 0.8750–1 | — |
| add_noise | COMBO | 2 options: enable, disable | |
| noise_seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–10000 | — |
| cfg_high_noise | FLOAT | 8.00–100 | — |
| cfg_low_noise | FLOAT | 8.00–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 | |
| sigma_shift | FLOAT | 8.000–100 | Same purpose as the a shift parameter in the ModelSamplingSD3 node (same value applied to both models) |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| latent_image | LATENT | — | |
| start_at_step | INT | 00–10000 | — |
| end_at_step | INT | 100000–10000 | — |
| return_with_leftover_noise | COMBO | 2 options: disable, enable |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | — |