Wan MoE KSampler
Stop guessing the high-noise → low-noise swap
- model_high_noise
- model_low_noise
- positive
- negative
- latent_image
- LATENT
If you've run Wan 2.2 A14B, you've bumped into its one genuinely annoying quirk: it's not one model, it's two. Wan 2.2 ships as a Mixture-of-Experts with a high-noise expert that handles motion and scene composition and a low-noise expert that refines detail. The standard ComfyUI setup is to chain two KSampler (Advanced) nodes, run the high-noise model for the first chunk of steps, then hand off to the low-noise model for the rest. Which works fine, except for the part where you have to pick the handoff step. Guess wrong and you either starve the composition pass or over-cook the refiner.
This node deletes that guess. You give it both experts, and it swaps from high to low automatically at the point where the signal-to-noise ratio is supposed to hit 1:1, instead of at some step number you eyeballed. One node, two model inputs, done.
Why you'd reach for it
The two-pass architecture is the thing that makes Wan 2.2 better than 2.1, and it's also where people trip. The community's hard-won best practice is that the two passes want different treatment, that's the whole reason speed LoRAs are supposed to go on the low-noise pass only. But if your swap point drifts every time you change step count or sampler, none of that tuning holds. The Wan MoE KSampler pins the swap to a property of the model (the noise level), not to your step slider, so the boundary stays meaningful no matter how many steps you run.
And it's not obscure: the node shows up on community "must-have custom nodes for Wan 2.2" lists.
How it works
The key idea, straight from the author: the swap happens at a diffusion timestep, not a denoising step, and those are not the same thing. Think of the timestep as how much noise is in the image, 0 is clean, 1 is pure noise. Around timestep 0.875 for Wan 2.2 T2V (0.900 for I2V), the video is roughly half signal, half noise, and that's the natural line where the high-noise expert has done its job and the low-noise expert should take over. The node figures out which denoising step that timestep lands on given your step count, scheduler, and sigma shift, then switches models there.
The inputs that matter
model_high_noiseandmodel_low_noise- your two Wan 2.2 experts. Load them with two separate loaders and wire each in. This is the whole point of the node, don't cross them.boundary(default 0.875) - the swap timestep. Use 0.875 for T2V, 0.900 for I2V. Other values work but these are the model's designed crossover points.cfg_high_noise(default 4) andcfg_low_noise(default 3) - separate guidance for each pass, since the two experts genuinely want different CFG. Without speed LoRAs, Wan likes a higher CFG on the high-noise pass for prompt adherence.sigma_shift(default 8) - Wan's timestep shift, which controls how sampling effort splits between composition and detail. The default of 8 is tuned for Wan; leave it unless you know why you're moving it.
The rest are the usual KSampler controls you already know: steps, seed, sampler_name, scheduler, denoise, plus positive/negative conditioning and latent_image. It outputs a single LATENT, which goes straight into your VAE Decode like any other sampler.
How to install it
- ComfyUI Manager - search KSampler for Wan 2.2 MoE (the pack title), install, restart.
- Manual -
cd ComfyUI/custom_nodes && git clone https://github.com/stduhpf/ComfyUI-WanMoeKSampler, then restart ComfyUI.
That's genuinely it. There's no requirements.txt to fight and no model files bundled with the node, it's basically ComfyUI's own sampling code repackaged. You bring the two Wan 2.2 experts yourself (the high-noise and low-noise checkpoints, or their GGUF quants). The repo also ships example workflows, start from one.
Common issues & troubleshooting
Output looks like the wrong expert ran the whole thing. Check you didn't swap the two model inputs, and that boundary matches your task, 0.875 for T2V, 0.900 for I2V. An I2V run with a T2V boundary hands off a hair too early.
You set boundary and nothing seems to change. Remember it's a timestep, not a step. At low step counts a small boundary tweak may not move the actual swap step at all, because the timestep-to-step mapping is nonlinear and depends on your scheduler and sigma_shift. If you want to see which step it lands on, that's what the SplitSigmasAtT node in this same pack is for.
Motion or lighting went plastic. That's usually a speed LoRA on the high-noise pass, not this node. The community rule stands: put lightx2v/CausVid on the low-noise side only. Since this node runs both experts internally, apply your speed LoRA to the model_low_noise input before it reaches the sampler.
Inputs (14)
| 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 | Boundary (or t_moe): Timestep (not to be confused with denoising step) at which models should be switched. Recommended values: 0.875 for t2v, 0.9 for i2v |
| seed | INT | 00–18446744073709550000 | The random seed used for creating the noise. |
| steps | INT | 201–10000 | The number of steps used in the denoising process. |
| cfg_high_noise | FLOAT | 4.00–100 | The Classifier-Free Guidance scale balances creativity and adherence to the prompt. Higher values result in images more closely matching the prompt however too high values will negatively impact quality. |
| cfg_low_noise | FLOAT | 3.00–100 | The Classifier-Free Guidance scale balances creativity and adherence to the prompt. Higher values result in images more closely matching the prompt however too high values will negatively impact quality. |
| sampler_name | COMBO | The algorithm used when sampling, this can affect the quality, speed, and style of the generated output. | |
| scheduler | COMBO | The scheduler controls how noise is gradually removed to form the image. | |
| 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 | The conditioning describing the attributes you want to include in the image. | |
| negative | CONDITIONING | The conditioning describing the attributes you want to exclude from the image. | |
| latent_image | LATENT | The latent image to denoise. | |
| denoise | FLOAT | 1.000–1 | The amount of denoising applied, lower values will maintain the structure of the initial image allowing for image to image sampling. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | The denoised latent. |