Perp-Neg (DEPRECATED by Perp-Neg Guider)
The deprecated perp-neg node, and why you should use the Guider instead
- model
- empty_conditioning
- MODEL
This node still exists so your old workflows keep loading. The display name says it plainly - "Perp-Neg (DEPRECATED by Perp-Neg Guider)" - and the source code has a comment that's even blunter: "TODO: This node should be removed." So the short version is: if you're building something new, use PerpNegGuider and don't read further. If a downloaded workflow uses this one, here's what it's doing and how to migrate.
What it does. Same perpendicular-negative idea as the Guider: it decomposes the negative prompt's effect into a component parallel to the positive direction and one perpendicular to it, keeps only the perpendicular part, so the negative steers you away on axes that don't contradict the positive. What's different is the interface and the plumbing. This is a model patcher - you drop it between the checkpoint and a plain KSampler, exactly like you would a guidance node.
Inputs:
- model - your checkpoint, patched.
- empty_conditioning - a conditioning from encoding an empty prompt. It's the "no condition at all" reference the math needs.
- neg_scale (default 1.0) - how hard the perpendicular negative steering pushes.
Notably, there's no positive or negative input. The node doesn't take conditioning for those at all - it grabs whatever conditioned and unconditioned predictions the sampler is already computing and only supplies the empty-conditioning pass itself. That's the architectural sin that got it deprecated: every step runs the positive+negative batch, then runs a separate empty-conditioning pass on top. That's a third model call per step beyond CFG's usual two, and it's slow.
Why the Guider is better. PerpNegGuider restructures the whole thing as a guider that feeds positive, negative, and empty into one batched call per step - you get the same perpendicular correction at closer to the normal cost. It also gives you an explicit cfg input and takes positive/negative conditioning as proper inputs, so it composes with SamplerCustomAdvanced the way a modern sampling stack should. There's no good reason to build on the old one.
Migrating a workflow. It's a small rewrite: replace the old graph -
model → PerpNeg → KSampler
- with a guider stack:
model, positive, negative, empty_conditioning → PerpNegGuider → SamplerCustomAdvanced (guider input)
Reuse the same empty-conditioning encode, carry your neg_scale over, and set cfg on the guider to whatever the old workflow was using. Same result, no third pass.
The honest caveat on the whole family. Perp-neg is a niche technique and it's been quiet for a while - community discussion peaked around 2023-2024 and has largely dried up. It's for SDXL-lineage models running real CFG where a regular negative genuinely hurts the output in a specific way. On the guidance-distilled CFG-1 models of 2026 there's no unconditional pass to decompose, so neither node does anything there. If your workflow loads, keep it; if you touch it, migrate it. Don't go looking for reasons to add it.
Ships with ComfyUI core; no install. It's deprecated, not broken - it just isn't where new work should go.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| empty_conditioning | CONDITIONING | — | |
| neg_scale | FLOAT | 1.000–100 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |