You painstakingly listed “blurry, low quality, text, watermark, extra fingers, deformed hands, jpeg artifacts” in the negative prompt. The image came back with text on a t-shirt, a faint watermark in the corner, and six fingers. It looks like the negative prompt is being thrown away. Sometimes it literally is — the API client did not pass it. More often the model is parsing it but the concept you are negating is too strongly baked into the base weights or your positive prompt to be pushed out. Treat the negative prompt as one tool among several, not as a magic eraser.
Common causes
Listed by frequency in real pipelines.
1. Negative prompt never made it to the model
In API calls this is the most common — the field is named negative_prompt, neg_prompt, or unconditional_prompt depending on the provider. A typo means an empty string is sent. UIs sometimes silently drop the field on certain workflows (e.g. img2img in some Comfy nodes).
How to spot it: Echo the outgoing request body. If negative_prompt is missing or empty, the model never saw it.
2. CFG scale is too low for the negative prompt to bite
CFG controls how strongly the model pushes toward positive and away from negative. At CFG 4-5 the negative prompt has weak effect; at 7-9 it bites; above 12 it can over-correct into ugly artifacts.
How to spot it: Re-run at CFG 8 with negative prompt unchanged. If the unwanted element disappears, low CFG was the cause.
3. Positive prompt is summoning what the negative is rejecting
If the positive prompt mentions “magazine cover” the model will produce text — and “text” in the negative is fighting the entire positive prompt. Negative prompts cannot overcome a contradiction inside the positive prompt.
How to spot it: Read the positive prompt and ask “would a literal-minded model add the thing I am trying to remove?” If yes, fix the positive prompt first.
4. Model has the unwanted concept overtrained
Some checkpoints (especially photorealism fine-tunes) are saturated with watermarks because their training set included stock photos. The negative prompt nudges but does not overcome a hard-coded bias.
How to spot it: Generate with a fully empty positive prompt and full negative prompt. If the watermark still appears, the base model is the source.
5. Negative prompt is too long and got truncated
CLIP’s token limit is 77 (about 60 words). Long negative prompts get cut off mid-token. The tokens past 77 are silently dropped — sometimes including the very concept you cared about most.
How to spot it: Count tokens with a CLIP tokenizer. If your negative prompt is > 77 tokens, the tail is being ignored.
6. Token weight syntax is wrong for the platform
(blurry:1.4) works in AUTOMATIC1111 but not in raw Diffusers. [blurry:1.4] is interpreted differently in different UIs. Wrong syntax means the parser sees garbled text and the weight is not applied.
How to spot it: Test with plain words first, no parentheses or weights. If plain words work and weighted versions do not, syntax is the issue.
7. SDXL refiner pass re-introduces what the base removed
SDXL’s two-stage pipeline runs a base model then a refiner. If the negative prompt is only passed to the base, the refiner can re-add detail (including watermark-like noise) on top of a clean base image.
How to spot it: Run base-only (refiner disabled) and compare. If base-only is clean and refined is dirty, the refiner pass is at fault.
Before you start
- Save one “bad” output and note the exact positive + negative prompt strings and all parameters.
- Confirm the API or UI you are using supports negative prompts at all (some basic providers do not).
- Decide which unwanted element is most important to remove — fixing one at a time is faster than fighting all at once.
Information to collect
- Full positive prompt and negative prompt strings (copy from request log, not from memory).
- CFG scale, sampler, model name, model version.
- Token count of both prompts (use a CLIP tokenizer).
- Whether you are running base only, refiner only, or both.
- The exact field name your client uses (
negative_promptvsneg_promptvs other).
Step-by-step fix
Ordered by ROI.
Step 1: Confirm the negative prompt is actually sent
Log the outgoing request body:
import json
print(json.dumps(payload, indent=2))
Or in curl:
curl -v -X POST $API_URL \
-H "Authorization: Bearer $KEY" \
-d '{"prompt": "...", "negative_prompt": "blurry, text, watermark", "cfg_scale": 7.5}'
If the negative_prompt key is absent, fix the field name. Half of “negative prompt ignored” tickets end here.
Step 2: Raise CFG and re-test
Try CFG 8.0, then 9.5. Watch for over-correction (washed-out colors, fried-looking edges) but if CFG 8 makes the unwanted element disappear, low CFG was the cause.
{"cfg_scale": 8.5}
Step 3: Fix the positive prompt to stop summoning the unwanted thing
If you wrote “studio portrait, magazine cover quality, fashion editorial style” and negative-prompted “no text”, you are contradicting yourself. Rewrite:
positive: studio portrait, soft rim light, neutral grey backdrop, plain background
negative: text, watermark, signature, letters, logo
A clean positive prompt does more work than a frantic negative prompt.
Step 4: Trim the negative prompt to < 60 tokens
Order matters — put the most important rejections first. Tokens past 77 are dropped.
negative: text, watermark, extra fingers, deformed hands, blurry, low quality
Drop low-value generic words like “ugly”, “bad”, “weird” — they rarely help and crowd out specific tokens.
Step 5: Use platform-correct weighting syntax
For AUTOMATIC1111 / ComfyUI / InvokeAI:
(watermark:1.5), (text:1.4), (extra fingers:1.3), blurry, deformed
For raw Diffusers, weighting requires compel or prompt-weighting middleware. Without it, parens are noise.
Step 6: Switch checkpoint if the concept is overtrained
If a stock-photo-trained checkpoint always emits watermarks, swap to one trained on cleaner data (a “photo-real-clean” variant, or the base SDXL without stock fine-tunes). Related: AI image watermark residue.
Step 7: Pass the negative prompt to both base and refiner (SDXL)
In SDXL pipelines, ensure the refiner stage also receives the negative prompt:
image = pipe(
prompt=pos,
negative_prompt=neg,
).images[0]
image = refiner(
prompt=pos,
negative_prompt=neg,
image=image,
).images[0]
Many tutorials forget the refiner call’s negative_prompt argument — leaving it default re-introduces the bad content.
Verify
- Run a 4-image grid with the fixed prompts. The unwanted element should be absent or rare across all four.
- Generate with negative prompt empty and confirm the unwanted element returns. Proves the negative prompt is now load-bearing.
- Generate one extreme case (CFG 12, max weights) and confirm the model can fully suppress the element — even if you would not ship at that CFG, it confirms the lever works.
Long-term prevention
- Keep a tested negative prompt library per checkpoint. What works on SDXL base does not work on Flux.
- Log positive + negative + CFG + sampler + checkpoint together. When negative prompt fails, you want to bisect from a known-good config.
- Fix the positive prompt first. Negative prompt is a corrector, not a rewriter.
- Cap negative prompt at 60 tokens; put critical rejections in the first 20.
- Validate the request payload in CI for your custom pipelines — assert that
negative_promptis present and non-empty. - Re-test your negative prompt library every time you change checkpoint version.
Common pitfalls
- Treating the negative prompt as a wishlist and stuffing 200 words in it. The tail is dropped.
- Writing “no text” in the negative prompt — model parses “no” and “text” as separate concepts; “text” is what registers. Just write the concept you reject.
- Using AUTOMATIC1111 weight syntax in a raw Diffusers script that does not parse it.
- Forgetting that hosted providers may strip or remap the field. Check their docs.
- Raising CFG to 15+ to brute-force suppression — output gets fried and saturated. Better to fix the positive prompt or change checkpoint.
- Assuming negative prompt fixes everything. Use reference image or ControlNet for structural problems negative prompts cannot fix.
FAQ
Q: Should I always use a long negative prompt by default?
No. Default negative prompts copied from forums often contain contradictions or waste tokens. Use a short, targeted negative prompt focused on the actual problems your checkpoint shows.
Q: My positive prompt is short and clean and the model still adds text. What now?
Test with a different checkpoint. Some realism fine-tunes have watermark/text deeply baked in and no negative prompt fully removes them.
Q: Can I use a regex or template for negative prompts?
Treat the negative prompt like a checklist: per-checkpoint, per-style. There is no universal regex. Save 3-4 named profiles (“portrait-clean”, “product-clean”, “anime-clean”) and reuse.
Q: Does Flux respect negative prompts the same way?
Flux’s relationship to negative prompts is different — many Flux variants ignore them entirely. Use positive prompting and CFG tuning instead, or switch to a model that documents negative prompt support.
Related
- AI image watermark residue
- AI image not matching prompt
- AI image hands fingers extra
- AI image prompt bleeding attributes
Tags: #Troubleshooting #ai-image #negative-prompt #Prompt engineering #diffusion