LZ Advanced Negative Prompt
Keep the junk out of your negatives without retyping the boilerplate
- clip
- conditioning (negative)
- negative_text
If you've ever typed the same forty keywords of negative prompt into a box for the thousandth time, this node is for you. LZ Advanced Negative Prompt splits your negative into two fields - the boilerplate you always want, and the extras you add per-image - then concatenates them and CLIP-encodes the result in one shot. You wire a CLIP into it and get a ready-to-use negative CONDITIONING out, plus the exact text it encoded.
Why it exists
The pack it ships in (ComfyUI-LZNodes) is built around condensing the repetitive parts of a ComfyUI graph. This node is the negative half of that idea. Instead of a single monolithic text box where you have to remember to keep the "worst quality, low quality, bad anatomy" preamble and surgically append your one new idea, you get:
- base_negative - your permanent list, pre-filled with a sane SD-lineage default (
worst quality, low quality, normal quality, lowres, bad anatomy, bad hands, blurry). - extra_negative - the per-job addition. Leave it empty and it's simply skipped.
It joins the two non-empty parts with a comma, runs clip.tokenize() + clip.encode_from_tokens_scheduled(), and hands you the result.
The one honest caveat
A negative prompt is only alive while CFG is above 1. If you're running a distilled model (Flux, Z-Image Turbo, an Anima turbo LoRA) at CFG 1, this node - like every negative prompt box on earth - does nothing, because classifier-free guidance's unconditioned pass isn't even computed at 1. On plain SD 1.5/SDXL and on Anima base at its recommended CFG, it works exactly as advertised. The bundled default is classic SD-era boilerplate; on Anima you'll likely want to swap in worst quality, low quality, score_1, score_2, score_3, artist name instead, which is what the pack's own LZAnimaLoader defaults to.
Inputs and outputs that matter
It's a small node, so the list is short. clip is the only socket - feed it from any checkpoint or CLIP loader. The two text fields are the widgets you actually edit. Outputs are:
- conditioning (negative) - the encoded negative, wired to your sampler's negative input.
- negative_text - the joined string, handy if you want the log or a save node to know exactly what ran.
Pair it with its sibling AdvancedPositivePrompt and you've replaced two vanilla CLIP Text Encode nodes with two that also tell you what text they produced.
Installing it
The node ships in the LZNodes pack:
cd ComfyUI/custom_nodes
git clone https://github.com/liz-ils/ComfyUI-LZNodes
then restart ComfyUI. Or search ComfyUI-LZNodes in ComfyUI Manager and install from there. No extra pip packages - the pack has no requirements.txt; everything it touches (torch, PIL, the comfy core APIs) already ships with ComfyUI.
Where people get burned
Mostly they don't - it's a simple node - but two things catch people: forgetting that a negative prompt is inert at CFG 1 on distilled models, and expecting extra_negative to replace the base rather than add to it. It always appends. If you want a totally different negative per job, clear the base field. And if you see no text in negative_text, you've left both fields empty - the node encodes an empty string, which is just an empty conditioning.
It's not a glamorous node. It's the kind that quietly deletes a recurring annoyance from your workflow, which is honestly what most of this pack is about.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| clip | CLIP | — | |
| base_negative | STRING | worst quality, low quality, normal quality, lowres, bad anatomy, bad hands, blurry | — |
| extra_negative | STRING | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| conditioning (negative) | CONDITIONING | — |
| negative_text | STRING | — |