Nodes/Krea2 Training Free Improvements/Krea2 NAG Negative Prompt
ComfyUI Node

Krea2 NAG Negative Prompt

Making the negative box work again at CFG 1

By iljung1106·Created 2 months ago·Updated 2 months ago· 1
Krea2 NAG Negative Prompt
  • model
  • nag_negative
  • model
◄phi4.0►
◄tau2.50►
◄alpha0.25►
◄sigma_start1000.000►
◄sigma_end0.000►

Here's the thing nobody tells you when they hand you a Turbo workflow: at CFG 1, that negative prompt box is decoration. ComfyUI doesn't zero the guidance term, it skips computing the unconditional pass at all - math.isclose(cond_scale, 1.0) gates it off as an optimisation. Krea 2 Turbo runs at CFG 1. So does the community's favourite Krea 2 setup, Raw with the Turbo LoRA. Which means the model's dislike of your "extra fingers, bad anatomy" list is not being consulted in any way.

Normalized Attention Guidance is the established way around that. It got distilled models their negatives back starting with Wan and Flux Kontext in mid-2025, then Z-Image Turbo, Flux 2 Klein, Anima - every guidance-distilled architecture of the last year has a NAG port somewhere. This node is the Krea 2 one, and it fits the pack's house style: no CFG, no second full model evaluation.

How it works

The input is a real CONDITIONING, not a string, so you wire a CLIPTextEncode containing your negative text into nag_negative. That negative context is encoded through Krea 2's text fusion and run through all 28 single-stream blocks alongside the image, with its own position frequencies - a genuine second stream, not a hack on the positive one.

Then, on the image-query outputs, the node applies NAG's equations 7-10. The guided direction is positive + phi * (positive - negative). Left alone that balloons, so it rescales: measure the guided magnitude against the positive magnitude, clamp that ratio at tau, multiply it back in. Finally alpha blends the normalized guidance against the plain positive output. That's why NAG gives you a negative prompt at CFG 1 without a timestep-ensembled second denoiser.

Only the image tokens get corrected; the negative branch's own text tokens are updated so the stream stays coherent down the block stack. Output is the usual model (MODEL).

The inputs that matter

nag_negative is the one you'll get wrong first - it takes conditioning, so an empty or crossed wire throws "nag_negative conditioning is empty." Then:

  • phi (4, 0-20) - how hard you push away from the negative. Up is stronger, and past a point you get contorted, over-cooked output rather than a cleaner image.
  • alpha (0.25, 0-1) - how much of the guided result replaces the plain positive. This is the polite knob; drop it before you drop phi.
  • tau (2.5) - the magnitude cap. It's what keeps the extrapolation from blowing up the feature norms.

sigma_start (1000) and sigma_end (0) mean the whole schedule by default, which is a sane default for negative prompting. There's no output besides model, so it slots straight into the MODEL chain.

One editorial note on content: write a specific negative. "Big wings" beats forty keywords of SD 1.5 boilerplate every time, on any architecture, and the generic list has been A/B'd into the ground since 2022.

Install

cd ComfyUI/custom_nodes
git clone https://github.com/iljung1106/Krea2-Training-Free-Improvements
# restart ComfyUI

No requirements.txt, no pip dependencies, no extra weights - dependencies = [] in the pyproject. Manager search for "Krea2 Training Free Improvements" works too. The repo ships Krea2 GAG and NAG - Raw FP8 Turbo.json if you want the working graph rather than a described one.

Where people get burned

The pack refuses to share a model with older Krea2 NAG implementations. If you still have a legacy Krea2 normalized-attention-guidance node or a Krea2Edit wrapper loaded, you'll get "Do not stack this node pack with legacy Krea2 NAG or Krea2Edit wrappers" and a list of what it found. That's intentional - two NAG implementations on one model is not a thing you want to debug. Delete the old nodes and re-run.

CFG must be 1.0, for the same reason as the rest of the pack: the wrapper rejects any non-positive branch with a RuntimeError. And it needs Krea 2's SingleStreamDiT; other checkpoints are rejected loudly rather than quietly ignored. Composing it with GAG is fine in either order, and the README's tested example is a llama-bird hybrid with big wings as the negative - before/after images are in the repo, same seed, Raw FP8 plus the Turbo LoRA, 10 Euler/simple steps.

CategoryKrea2 Training Free Improvements/guidance

Inputs (7)

NameTypeDefaultDescription
modelMODEL—
nag_negativeCONDITIONING—
phiFLOAT4.00–20—
tauFLOAT2.500.01–20—
alphaFLOAT0.250–1—
sigma_startFLOAT1000.0000–1000—
sigma_endFLOAT0.0000–1000—

Outputs (1)

NameTypeDescription
modelMODEL—