MoE Sampler Dual (CCN)
MoE Sampler Dual (CCN)
- model_high
- model_low
- positive
- negative
- sigmas
- latent_image
- curve_high
- curve_low
- lora_lanes
- sampler
- latent
- info
MoE Sampler Dual (CCN) is the all-in-one sampler for Wan 2.2's two-expert architecture - the node that replaces the fiddly hand-built graph of "split the sigmas, run high with one KSampler, chain the latent, run low with another, get the noise placement right." You hand it both experts, one conditioning, one schedule, and it does the whole two-phase dance internally: splits the sigma schedule at the trained expert boundary (via MoE Sigma Split, same logic), runs the high-noise expert over the first segment, chains the latent, runs the low-noise expert over the rest, and handles the degenerate empty-phase cases so you never execute a stub schedule.
Where it gets interesting is that it isn't just a convenience wrapper - it adds two things you can't easily do with the manual two-sampler graph. First, per-phase curve-driven CFG: each expert gets its own CFG value (cfg_high, cfg_low) and an optional CCN_CURVE, so you can shape classifier-free guidance differently in the composition-heavy high-noise phase versus the detail-heavy low-noise phase, with the curve measured per phase (in step or sigma mode) and optional sigma decay toward 1.0. Second, curve-scheduled LoRA lanes: feed it lora_lanes from LoRA Pair Lane and it compiles every lane's curve into a staircase of strength segments, re-patching the model clone between segments so a LoRA can ramp across the whole run - including across the expert boundary. lane_segments (1–8) is your repatch budget per phase; more segments means smoother curves at the cost of more re-patching.
The inputs are the standard sampler kit plus the MoE-specific ones. You'll set:
- model_high / model_low - the two experts.
- positive / negative, sigmas (full schedule, split internally), latent_image, noise_seed, add_noise (disable only if your latent is already noised for this schedule).
- boundary - t2v (0.875), i2v (0.900), or custom. This is the single most important decision and the community's least settled one: the official values come from Wan's configs, but your scheduler/shift changes where the ideal cut actually is, and the split is "only partially knowable."
- cfg_high / cfg_high_min / cfg_low / cfg_low_min - CFG per phase, with the *_min values as curve floors.
- Optional: curve_high, curve_low, lora_lanes, and a sampler object that overrides
sampler_name.
Outputs: latent (final, wire to your VAE) and info (the full report - split, CFG lines, compiled lane staircase - which the cockpit widget in the UI previews live and then trues up after each run).
Install
WIP pack member, git clone:
cd ComfyUI/custom_nodes
git clone https://github.com/valkymaera/ComfyCollectorNodes
Restart ComfyUI; find it in the "CCN" category. It uses ComfyUI internals (comfy.sample, comfy.samplers, comfy.sd) - all stock, no new pip deps. No model downloads; bring your own Wan 2.2 checkpoints and pair LoRAs. MIT, with the WIP caveat that internals can shift.
Common issues
The boundary is where most confusion lives - the presets match Wan's configs, but the visually ideal split for your scheduler and shift may differ; the info output tells you the actual step counts, and if a phase is unexpectedly tiny, raise/lower the boundary and re-check. Multistep samplers reset their history at segment boundaries (the same reset the manual graph accepts once at the expert hand-off) - expected, not a bug, but worth knowing if you're chasing subtle differences with a Heun-style sampler. And if lora_lanes is connected and you see blocky strength changes, lane_segments is your knob. When in doubt, run with no curves and no lanes first to verify the two-expert baseline, then add layers.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| model_high | MODEL | High-noise expert model. | |
| model_low | MODEL | Low-noise expert model. | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| sigmas | SIGMAS | Full schedule from an upstream scheduler; split internally at the expert boundary. | |
| latent_image | LATENT | — | |
| noise_seed | INT | 00–18446744073709550000 | — |
| add_noise | BOOLEAN | true | Disable only when the incoming latent is already noised for this schedule. |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| boundary | COMBO | i2v (0.900) | Trained expert boundary (t = sigma * 1000). |
| custom_boundary | FLOAT | 0.8750–1 | Used only when boundary = custom. |
| curve_mode | COMBO | How progress is measured for CFG curves (per-phase) and LoRA lane curves (global). | |
| sigma_decay | BOOLEAN | false | Attenuate effective CFG toward 1.0 as sigma falls within each phase (matches CurveCFGGuider). |
| cfg_high | FLOAT | 3.5000–100 | — |
| cfg_high_min | FLOAT | 1.0000–100 | Curve floor for the high phase; unused without a curve. |
| cfg_low | FLOAT | 3.5000–100 | — |
| cfg_low_min | FLOAT | 1.0000–100 | Curve floor for the low phase; unused without a curve. |
| lane_segments | INT | 41–8 | Max LoRA lane segments per phase (repatch budget). Used only when lora_lanes is connected. |
| curve_highopt | CCN_CURVE | — | |
| curve_lowopt | CCN_CURVE | — | |
| lora_lanesopt | CCN_LORA_LANES | Schedulable LoRA lanes from LoRA Pair Lane. | |
| sampleropt | SAMPLER | Overrides sampler_name when connected. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | — |
| info | STRING | — |