⬡ Polyhedron NAG
Negative prompts at CFG 1 — NAG brings them back on Wan
- model
- conditioning
- model
If you've run a distilled or few-step model and typed a negative prompt only to watch it do nothing, you already know the problem: at CFG 1 there's no unconditional pass for the negative to steer, so the box is inert. ⬡ Polyhedron NAG (Normalized Attention Guidance, arXiv 2505.21179) is the fix for Wan specifically - it restores negative prompting by guiding inside the cross-attention instead of at the model output.
The cost story is what makes it practical. CFG-based guidance doubles the model pass; NAG runs a second pass over the text tokens only, not the model. So on a Wan 2.2 workflow running at CFG 1 - which is where all the Lightning and distilled setups live - you get a working negative for the price of an attention-level correction, not a doubled render.
The one input beginners get wrong
The conditioning input is the negative prompt - and not the one wired into the sampler. At CFG 1 the sampler's negative does nothing; this is the one that acts. The tooltip says it plainly, and the node's author lists mixing the two up as the most common mistake with the method. Wire the negative conditioning (the encoded negative prompt) into this node, not the positive. If your NAG does nothing at all, check that first.
The knobs that matter
nag_scale(default 11) - how far to extrapolate away from the negative context.0disables the node entirely (no cost).1is a no-op that still pays the full doubled cross-attention - the node says so out loud, which is nicer than most packs.nag_alpha(default 0.25) - how much of the guided result gets blended in.0blends none of it: a no-op at full cost, again reported.nag_tau(default 2.5) - the ceiling on how far guided attention may grow, as a multiple of the positive attention's L1 length. This is what stops large scales from running away, and it's the reason a very bignag_scaleplateaus: once you're at the tau ceiling, raising scale changes nothing - tau is the knob that still moves.start_percent/end_percent- the window of the schedule the guide applies to. Late steps are where extrapolation is most likely to cost fine detail, so ending early (say 0.8) is a real quality lever.
The node also reads ComfyUI's own cond_or_uncond flag so a genuine batch isn't mistaken for a CFG pair - the classic NAG footgun where a real positive/negative batch gets treated as guidance and the guide fires on data it shouldn't.
How it fits the graph
It takes a MODEL and a CONDITIONING and returns a patched MODEL, so it sits like any other model patch: after the LoRAs, before the sampler. Wire model → NAG → sampler, with the negative conditioning on the side.
Installing it
Part of the ⬡ Polyhedron Suite pack. ComfyUI Manager → "Polyhedron Suite", or:
cd ComfyUI/custom_nodes
git clone https://github.com/PolyhedronAI/ComfyUI-PolyhedronLoRAStack.git
# restart ComfyUI
No extra dependencies.
Gotchas
Beyond the negative-vs-sampler mixup: keep an eye on scale. The concepts KB notes the original NAG author's caution about not pushing nag_scale to extremes - with this node's tau clamp you won't blow anything up, you'll just plateau, and the symptom of "raising scale changes nothing" is your cue that tau, not scale, is the knob. And if the node looks blank under ComfyUI's Nodes 2.0 renderer, disable Modern Node Design in Settings.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| conditioning | CONDITIONING | THE NEGATIVE PROMPT -- and not the one wired into the sampler. At CFG 1 the sampler's negative does nothing; this is the one that acts. Mixing the two up is the most common mistake with this method. | |
| nag_scale | FLOAT | 11.0000–100 | How far to extrapolate away from the negative context. 0 disables the node entirely (no cost). 1 is a NO-OP that still pays the full doubled cross-attention -- the node says so. Large values mostly hit the tau ceiling; if raising this stops changing anything, tau is the knob that still moves. |
| nag_alpha | FLOAT | 0.2500–1 | How much of the guided result is blended in. 0 blends none of it -- a no-op at full cost, which the node reports. |
| nag_tau | FLOAT | 2.5000–10 | Ceiling on how far the guided attention may grow, as a multiple of the positive attention's L1 length. This is what stops large nag_scale values from running away, and the reason a very large scale plateaus. |
| start_percent | FLOAT | 0.0000–1 | Guide only from this fraction of the schedule onward. Outside the window the block runs its ordinary cross-attention at normal cost. |
| end_percent | FLOAT | 1.0000–1 | ...and up to this fraction. Late steps are where extrapolation is most likely to cost fine detail, so ending early is a real knob. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |