ComfyUI Node

⬡ Polyhedron NAG

Negative prompts at CFG 1 — NAG brings them back on Wan

By PolyhedronAI·Created 3 months ago·Updated a day ago· 2
⬡ Polyhedron NAG
  • model
  • conditioning
  • model
nag_scale11.000
nag_alpha0.250
nag_tau2.500
start_percent0.000
end_percent1.000

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. 0 disables the node entirely (no cost). 1 is 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. 0 blends 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 big nag_scale plateaus: 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.

CategoryPolyhedron/Wan

Inputs (7)

NameTypeDefaultDescription
modelMODEL
conditioningCONDITIONINGTHE 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_scaleFLOAT11.0000–100How 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_alphaFLOAT0.2500–1How much of the guided result is blended in. 0 blends none of it -- a no-op at full cost, which the node reports.
nag_tauFLOAT2.5000–10Ceiling 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_percentFLOAT0.0000–1Guide only from this fraction of the schedule onward. Outside the window the block runs its ordinary cross-attention at normal cost.
end_percentFLOAT1.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)

NameTypeDescription
modelMODEL