Composable NOT Guider (Liu et al. 2022)
A negative prompt that subtracts instead of cancels
- model
- positive
- negative
- null
- GUIDER
A normal negative prompt in ComfyUI is not a subtraction. It's the empty prompt with stuff in it, and CFG extrapolates away from it. The two are related but not the same, which is why negatives behave oddly when you write them too strongly or stack several concepts in one box.
Composable NOT (Liu, Li, Du, Torralba & Tenenbaum, ECCV 2022) is the literal version, from the
composable-diffusion line of work: u + w(c - n), where u is the true empty prompt, c is your
positive and n is the negative. Your positive is measured from the null and your negative is
subtracted from it as a direction to leave. Clean, explicit, and it explains why the same negative
text "works" differently here than it does in the KSampler's box.
Why this is a guider, not a model patch
Everything else in this pack patches a MODEL and hands it to your existing sampler. This one produces
a GUIDER, which means it goes into SamplerCustomAdvanced's guider input, not into a
KSampler.
That's the first thing that trips people up. The second is that it needs three conditioning inputs:
- positive - your prompt's conditioning.
- negative - the thing you want to move away from.
- null - the empty prompt. The node's tooltip is blunt about it: "the true unconditional."
You need to wire a genuinely empty CLIP Text Encode (blank text) into null. If you wire your
negative prompt there - or reuse the same conditioning object - you're no longer doing composable
negation, you're doing something else with three copies of the same vector, and the results will be
nondescript in a way that's hard to debug.
- cfg (default 7) - this is the guider's scale. There's no separate
scaleinput: the guider owns it because SamplerCustomAdvanced's guider path doesn't take a cfg widget the way KSampler does. - space -
autouses the method's published space.
One GUIDER output, into SamplerCustomAdvanced.
The cost
Three predictions per step: positive, negative, null. Plain CFG gets two (and one if you're at cfg 1 with the optimization on). So this is roughly a 50% step-cost increase over classic CFG, on top of losing the CFG-1 shortcut. It's a tool for a specific job, not a default you leave in.
Install
# ComfyUI Manager: search "CFG Megapack" -> Install -> restart
# or:
comfy node install comfy-cfg-megapack
# or by hand:
cd ComfyUI/custom_nodes && git clone https://github.com/AbstractEyes/comfy-cfg-megapack
No dependencies, nothing to download, ComfyUI ≥ 0.38.
Related nodes in the same menu
The pack ships a general-purpose CFG Guider: Positive, Negative and Null which exposes several
three-way rules - perp_neg (subtract only the part of the negative perpendicular to your positive,
so a negative can't cancel what you asked for), separate_negative (the composable-negation form
implemented here), and negative_as_null (plain CFG, for reference, and stated to be bit-identical
to ComfyUI's own CFGGuider). If you want to compare this node against something, use
negative_as_null - it's the control.
The perpendicular variant is the one to reach for when your negatives are fighting your positives, which is the usual cause of "my negative prompt is eating my subject". Composable NOT, by contrast, is for when you want an unambiguous subtraction and don't mind it being strong.
One more: the model's other CFG Megapack stages still apply to this guider. If you have a schedule or a correction on the model wire, it's still in play - which is either exactly what you wanted or a surprise, depending on whether you remembered.
Two things to know before you spend an hour on it
The pack forces three passes, so the negative actually runs - unlike at CFG 1, where a guidance-distilled 2026 model has no unconditional pass at all and the negative box is inert. If you're on Z-Image Turbo or a Klein distilled build and you want working negatives, this is a legitimate route: the guider constructs the passes explicitly. Just be aware you're paying for two extra forward passes per step, which is most of the reason those models are fast.
A wrong null gives you nonsense, not an error. Blank CLIP Text Encode into null, always. And
if you want to check what the model is actually running, drop CFG Plan Readout on the model wire -
it prints the full plan, stage by stage, in the order it executes.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| null | CONDITIONING | The empty prompt: the true unconditional. | |
| cfg | FLOAT | 7.00–100 | — |
| space | COMBO | auto (the method's own) | Where the rule is computed. Linear rules give the same image in any space; nonlinear ones do not. 'auto' uses the space the method was published in (noise for most, denoised for APG and the angle rule, velocity for flow models). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| GUIDER | GUIDER | — |