⬡ Polyhedron Sampler
One sampler for the boring setups and the two-expert ones
- model
- positive
- negative
- latent_image
- model_low
- sigmas
- sigmas_high
- sigmas_low
- noise
- LATENT
The Polyhedron Sampler is the pack's one-node answer to "which sampler do I use?", and the honest headline is that in Single mode it's a superset of KSampler plus KSampler (Advanced) - all the fields you know, plus the ones you always wished the basic node had. But the reason it exists is the High + Low pill, because that's the architecture Wan 2.2 ships and most of the ecosystem still struggles to wire it by hand.
Single mode
seed, steps, cfg, sampler_name, scheduler, denoise - all there. What the stock Advanced node doesn't expose is a real denoise field alongside start_at_step / end_at_step and return_with_leftover_noise, and add_noise to decide whether the run adds noise at all. That combination turns the manual HIGH/LOW split (two chained samplers, one handing an unfinished latent to the next) from a multi-node dance into one node's fields. sigma_shift applies a flow-matching shift before the schedule is built - 0 means off, and the tooltip is blunt: Wan 2.2 needs a shift, typically 8.0, or a short run leaves residual noise as RGB speckle. This is the same shift knob the flow-matching world learned to care about when scheduler choice stopped being the tuning lever.
High + Low mode
Flip dual_moe on and the same node runs a noise-split two-expert denoise. model becomes the high-noise expert, model_low takes the low one, and the boundary (the "Handoff") is the one number that matters. It's a noise level, not a step count: every step whose sigma is at or above it runs on the high expert, the rest on the low. There's no automatic value - the Wan 2.2 conventions are 0.875 for text-to-video and 0.900 for image-to-video, so start there and adjust by eye.
cfg_low gives the low expert its own guidance - distilled and Lightning LoRAs typically run the low pass at 1.0, which is exactly the "speed LoRA on the low pass only" pattern the community converged on. sampler_low and scheduler_low default to "same as high". handoff_mode decides the seam: Continuous runs both experts as one unbroken denoise, while Wan MoE parity reproduces the Wan MoE KSampler exactly (high expert finishes on a clean estimate, low re-noises it with the same seed noise) - use that one when you need to match Wan 2.2 res_2s output byte-for-byte.
You can also drive it with external schedules: sigmas (one full curve, split at the handoff), or sigmas_high/sigmas_low as separate segments, or a custom noise source. Output is a single LATENT, image or video, whichever you fed in.
Live preview
preview_mode picks the in-node decoder: Still · refreshes one frame per step like a KSampler; the Video · modes animate every frame of the predicted latent so on a video you watch the motion settle before the run ends. The two Video · TAE modes decode through a small approximate decoder - slower per step, far closer to the finished picture, and they carry their download size in the label because the files have to be on disk first. It's visualisation only - the output latent is identical whatever you pick.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/PolyhedronAI/ComfyUI-PolyhedronLoRAStack.git
# restart ComfyUI
Or ComfyUI Manager, search "Polyhedron Suite". No hard dependencies. The recurring gotcha is the shift: if you're coming from a workflow that used a separate ModelSamplingSD3 node, leave sigma_shift at 0 (an upstream node already provides it) - a positive value here overrides rather than adds. And when driving with an external SIGMAS curve, leave the shift at 0 too; the curve owns the schedule.
Inputs (28)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | The model used to denoise the latent. | |
| positive | CONDITIONING | Conditioning to include. | |
| negative | CONDITIONING | Conditioning to exclude. | |
| latent_image | LATENT | The latent to denoise (image or video). | |
| dual_moe | BOOLEAN | false | Sampling architecture. Single: one model denoises every step. High + Low: a noise-split mixture-of-experts (MoE) -- the HIGH-noise expert ('model') handles the early, high-sigma steps (structure/motion); the LOW-noise expert ('model_low') the later, low-sigma steps (detail); they hand off at the Handoff noise level. Used by Wan 2.2 (Handoff 0.875 T2V / 0.900 I2V) and by any model family that ships a high/low expert pair. In High + Low the manual start/end_at_step controls are replaced by the automatic Handoff split. |
| boundary | FLOAT | 0.8750–1 | Handoff — the noise level where the run passes from the HIGH-noise expert to the LOW-noise expert. Steps whose sigma is >= Handoff run on the HIGH expert ('model'), the rest on the LOW expert ('model_low'). Higher = the HIGH expert covers fewer (only the loudest) steps. Set it by hand for your task — Text→Video 0.875, Image→Video 0.900 (Wan 2.2 standard). |
| cfg_low | FLOAT | 6.00–100 | High + Low: CFG for the LOW-noise expert pass ('cfg' applies to the HIGH-noise expert). Distilled / Lightning LoRAs use 1.0. |
| seed | INT | 00–18446744073709550000 | Seed for the initial noise. |
| steps | INT | 201–10000 | Number of denoising steps. |
| cfg | FLOAT | 6.00–100 | Classifier-Free Guidance. Flow models (e.g. WAN) usually want a lower value than SD; distilled / Lightning LoRAs use 1.0. In High + Low this is the HIGH-noise expert's CFG. |
| sampler_name | COMBO | Sampling algorithm — the full list, no per-model subset. | |
| scheduler | COMBO | Sigma schedule — the full list. | |
| denoise | FLOAT | 1.000–1 | 1.0 = full generation from noise. Lower keeps the input latent's structure for img2img / v2v (e.g. 0.25). This is the field the stock KSampler (Advanced) does not expose. |
| add_noise | BOOLEAN | true | Add initial noise. Turn off for the LOW pass of a manual HIGH/LOW split (denoise an already-noised latent). |
| start_at_step | INT | 00–10000 | First sigma step to run. The LOW pass of a manual split starts where the HIGH pass ended (e.g. 19). |
| end_at_step | INT | 100000–10000 | Last sigma step to run (clamped to the schedule). The HIGH pass of a manual split ends here (e.g. 19 of 36). |
| return_with_leftover_noise | BOOLEAN | false | Leave the latent partially noised for a following pass — ON for the HIGH pass, OFF for the LOW / final pass (OFF forces a clean final denoise). Ignored in High + Low mode (the boundary drives the split there). |
| preview_mode | COMBO | Still · ComfyUI | In-node live preview decoder — visualisation only, it NEVER changes the output latent. 'Still ·' modes show a SINGLE frame that refreshes each step (like the KSampler / standard ComfyUI); 'Video ·' modes ANIMATE every frame of the predicted latent (only visible when generating video — a single image has one frame). 'Still · ComfyUI' uses ComfyUI's own previewer (honours --preview-method; models/vae_approx TAESD/TAEHV or latent2rgb). 'Still · latent2rgb' forces the model-free latent2rgb view (ignores vae_approx even when present). 'Video · latent2rgb' is the same projection animated ('smooth' LANCZOS / 'crisp' NEAREST). 'Video · TAE' animates a TAE decode: 'lighttaew2_1' is the WAN video TAE (TAEHV); 'taew2_1' the image-TAE path. Anything unavailable falls back to latent2rgb (smooth). Applies from the start of each render. |
| sigma_shift | FLOAT | 0.000–20 | Flow-matching sigma shift (ModelSamplingSD3). 0 = OFF: the model_sampling is left as-is — use an upstream ModelSamplingSD3 node, or the model's native shift. WAN 2.2 flow sampling NEEDS a shift: set 8.0 to match the Wan MoE KSampler. Without it a short run cannot converge and leaves residual noise (RGB speckle). Applied to BOTH experts in High + Low (before the schedule and the boundary split are computed) unless sigma_shift_low gives the LOW expert its own value. When driving with an external SIGMAS curve, leave this at 0 (the curve owns the schedule). Leave at 0 for non-flow models (SD/SDXL) — a flow shift only makes sense for flow-matching models like WAN. |
| handoff_mode | COMBO | Continuous | High + Low: how the HIGH-noise expert hands the latent to the LOW-noise expert at the Handoff. 'Continuous' (default) runs both experts as ONE unbroken denoise — the HIGH expert stops leaving leftover noise and the LOW expert picks it straight up (this node's original behaviour, the mathematically clean euler-continuation). 'Wan MoE parity' reproduces the Wan MoE KSampler exactly: the switch happens ONE step earlier, the HIGH expert finishes on a clean x0 estimate, and the LOW expert re-noises that x0 with the SAME seed noise before denoising to the end — use this to match Wan 2.2 res_2s output. Applies to the built-in schedule AND to external SIGMAS in High + Low (two segments on sigmas_high/sigmas_low, or ONE curve on sigmas that the sampler splits at the Handoff). Single mode ignores this. |
| sampler_low | COMBO | same as high | High + Low: sampling ALGORITHM for the LOW-noise expert ('sampler_name' drives the HIGH expert). Free in every handoff mode — a sampler only CONSUMES the sigma schedule, it does not define it. Note that ancestral / SDE samplers (*_a, *_sde) inject fresh noise every step, which changes the character of the LOW pass. |
| scheduler_low | COMBO | same as high | High + Low: sigma SCHEDULE for the LOW-noise expert. Only honoured with handoff_mode = 'Wan MoE parity', where the two segments are independent (the HIGH expert finishes on a clean x0 and the LOW expert re-noises it onto ITS OWN schedule). In 'Continuous' both experts share ONE schedule by construction (the LOW pass picks up the leftover noise at the Handoff sigma), so this is IGNORED and the console says so. Inert when an external SIGMAS curve drives the run — the curve owns the schedule. |
| sigma_shift_low | FLOAT | -1.00-1–20 | Flow-matching sigma shift for the LOW-noise expert (High + Low). -1 = same as high (default): the LOW expert follows sigma_shift. 0 = OFF for the LOW expert: its model_sampling is left untouched even when sigma_shift is set. Any positive value gives the LOW expert its OWN shift -- e.g. sigma_shift 8.0 with sigma_shift_low 5.0 replaces a graph that used two upstream ModelSamplingSD3 nodes (8 high / 5 low). Only bites with handoff_mode = 'Wan MoE parity', where the LOW segment's schedule is built from the LOW expert; in 'Continuous' both experts share ONE schedule (built from the HIGH expert) and this is inert -- the console says so. Ignored in Single mode and when an external SIGMAS curve drives the schedule. |
| model_lowopt | MODEL | High + Low: the LOW-noise expert. The 'model' input is the HIGH-noise expert. (Wan 2.2 ships these as a high/low pair.) Connect this and set the mode pill to High + Low. | |
| sigmasopt | SIGMAS | An external sigma schedule (e.g. from the Polyhedron Sigma Curve). Overrides scheduler/steps/denoise — the array IS the schedule (length = steps; last value decides a clean vs. leftover-noise finish). High + Low mode: the sampler splits this ONE curve at the Handoff and runs both experts on the slices (boundary stays active; handoff_mode decides the seam). Ignored if sigmas_high + sigmas_low are both connected. | |
| sigmas_highopt | SIGMAS | High + Low mode: the HIGH-noise expert's sigma SEGMENT (NOT a full curve — it should END where the LOW segment begins; for a full curve use the single `sigmas` input). Needs sigmas_low connected too. Together they drive the split, so boundary is ignored. | |
| sigmas_lowopt | SIGMAS | High + Low mode: the LOW-noise expert's sigma SEGMENT. Continuous: its first sigma is snapped to the HIGH segment's last (continuous handoff). Wan MoE parity: fully independent of the HIGH segment — HIGH ends on x0 and this segment re-noises it to its own first sigma. | |
| noiseopt | NOISE | Optional noise SOURCE (e.g. the Polyhedron Seed's `noise` output, or Core's RandomNoise). It replaces the sampler's own gaussian starting noise -- this is the noise the model denoises, so its character (brown, fractal, ...) reaches the result. Unwired, nothing changes. Ignored while add_noise is off. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| LATENT | LATENT | The denoised latent. |