Back to blog
Engineering17 min read

Why Is My Negative Prompt Being Ignored?

Negative prompt not working? Six documented causes, checked against vendor docs: no field exists, wrong endpoint, vendor advises against it, silent truncation, precedence, and weighting.

NH
Nafiul Hasan
Founder, Prompt Architects

TL;DR: A negative prompt not working has six documented causes. The model has no such field. The field exists on a different endpoint. The vendor's own guide tells you not to negate. A character cap truncated it. Your positive prompt outranks it. Or it worked exactly as designed, because it is a steering weight and not a filter.

You typed no text, no watermark, no extra fingers, ran the generation, and got text, a watermark and six fingers. The instinct is that the model disobeyed. It usually did not: the exclusion never became an instruction in the first place, and the reason is documented on the vendor's own page.

This is the troubleshooting companion to our negative prompt support matrix, which establishes which models publish the field. Everything below was read on vendor documentation on 27 August 2026.

Why is my negative prompt not working? Six causes, in the order to check them

Work down this list. The first three account for most of it, and none are about the wording of your exclusion.

#CauseThe tellFix section
1No negative_prompt field exists on the modelYour exclusion sits inside the ordinary prompt stringBelow
2The field is on a different endpoint or versionThe API accepted your key without complaintBelow
3The vendor advises against negationYou wrote "no" or "don't" into a field that wants nounsBelow
4A character cap truncated itLong boilerplate, short field limitBelow
5The positive prompt takes precedenceThe excluded term also appears in the main promptBelow
6It worked; a weight is not a banThe element appears less often, not neverBelow

Does the model you are calling even have a negative prompt field?

Start here, because on a large share of current models there is no field to ignore. Your "no X" is ordinary text, weighed like every other clause.

OpenAI's public API specification covers the chat models, image generation and the Sora video endpoints in one file, and it contains zero occurrences of negative_prompt or negativePrompt. Anthropic's Messages API reference, a 950 KB document listing every request field, contains zero occurrences of the word "negative". Kling's 3.0 text-to-video body is prompt plus a settings object, and the prompt field's own description reads: "The prompt can include positive and negative descriptions". One string, both jobs.

So this fails on a text model, every time, and not because the model is stubborn:

Write a 200-word product description for a stainless steel water bottle.

Negative prompt: no buzzwords, no exclamation marks, no "revolutionary", no em dashes.

The label Negative prompt: means nothing to a chat model. It reads as a heading followed by concepts you have now placed in context. The version that survives names the replacement:

Write a 200-word product description for a stainless steel water bottle.

Style rules:
- Every sentence ends in a full stop. No other terminal punctuation.
- Use concrete nouns and measurements: capacity in litres, wall thickness, weight in grams.
- Describe two specific use cases (gym bag, desk) instead of adjectives about quality.
- Replace any claim of superiority with a measured comparison to a plastic bottle.

The same failure on an image model that has no field:

A minimalist ceramic vase on a windowsill, morning light --no flowers, no text, no watermark

Sent to a model where --no is not a parameter, that string puts "flowers", "text" and "watermark" into the description. The working version specifies what fills the space instead:

A minimalist ceramic vase on a windowsill in bare morning light. The vase is empty.
The sill is unpainted timber, clean and unmarked. Plain plaster wall behind, no signage or lettering of any kind.

The same shape for video, on Kling 3.0's single-string form:

A kitten running through a moonlit garden. Slow dolly-in, shallow depth of field.
The garden is planted with ferns and moss only, bare soil and stone paths.
Clean frame with no on-screen text, captions or logos.

Is the field on the endpoint you are actually calling?

This one causes the most confusion, because the request succeeds. You get a 200 and a video, and nothing tells you the exclusion was dropped.

Runway's OpenAPI specification is the sharpest example on the open web. Its /v1/text_to_video request body is a discriminated union keyed on model, with eleven branches. Exactly two carry negativePromptveo3.1 and veo3.1_fast — described as "Text describing what should not appear in the output video." with a maxLength of 1000. Gen-4.5 does not have it. Neither do the Seedance, Hailuo, Grok Imagine or Gemini Omni Flash branches. Same endpoint, same JSON body, and whether your key is valid depends entirely on the value of a different key.

This request is honoured:

{
  "model": "veo3.1",
  "promptText": "A solitary oak tree in a strong autumn wind, warm palette, slow push-in",
  "negativePrompt": "urban background, man-made structures, dark, stormy atmosphere",
  "ratio": "1280:720",
  "duration": 8
}

This one is not, and looks identical:

{
  "model": "gen4.5",
  "promptText": "A solitary oak tree in a strong autumn wind, warm palette, slow push-in",
  "negativePrompt": "urban background, man-made structures, dark, stormy atmosphere",
  "ratio": "1280:720",
  "duration": 8
}

There is a sharper trap one level up. Runway's routed endpoint, /v1/generate/video, is described as "Start a video generation task using a saved Model Router config instead of naming a model." Its input object accepts negativePrompt, "A text description of what to avoid in the output.", regardless of which model the router later selects. The field is valid at the wrapper. Whether it reaches anything depends on a routing decision you did not make.

Kling reproduces the pattern inside one vendor. Its legacy /v1/videos/text2video endpoint accepts a model_name enum running from kling-v1 right through to kling-v3, and it exposes negative_prompt. The newer /text-to-video/kling-3.0 endpoint does not expose it at all. Both are current, both are Kling's own documentation, and "does Kling 3.0 support negative prompts" therefore has two correct answers depending on the path you POST to. Our Kling prompt format guide is built around the single-string form for exactly this reason.

Google splits the same way across surfaces. The Vertex page for Veo text-to-video documents negativePrompt as "A string value that describes content that you want to prevent the model from generating." The Gemini API's "Veo API parameters and specifications" table covers Veo 3.1, 3.1 Fast, 3.1 Lite, Veo 3 and Veo 2, and the word "negative" does not appear on that page once. Same model family, two front doors, two answers.

Did the vendor tell you not to negate in the first place?

Three vendors publish guidance against writing negation at all, and it is the case most articles on this topic miss.

Google is the most explicit. Its Veo prompt guide has a section on negative prompts that reads, verbatim:

Not recommended: using instructive language or words such as "no" or "don't". For example, avoid prompts such as "no walls" or "don't show walls".

Recommended: Describe what you don't want to see. For example, "wall, frame", which means that you don't want a wall or a frame in the video.

The usual summary of that gets it backwards. Google is not telling you to skip the negative prompt. It is telling you the field takes things, not sentences about things. So this value is malformed:

negativePrompt: "no walls, don't show any frames, avoid modern buildings"

And this one is what the field is designed to receive:

negativePrompt: "wall, frame, modern building, glass facade, signage"

Google says the adjacent thing for stills. Its Gemini image generation guidance reads:

Use "semantic negative prompts": Instead of saying "no cars," describe the intended scene positively: "an empty, deserted street with no signs of traffic."

Google's own replacement phrasing still contains the word "no", which tells you the real rule is about describing a scene rather than banning a token.

A city street at dawn, no cars, no people, no traffic

Becomes:

An empty, deserted street at dawn. Wet asphalt, empty parking bays, shuttered storefronts.
The only movement is a plastic bag drifting across the centre line. Wide static shot, natural light.

Anthropic gives identical advice for text, under its guidance on controlling response format: "Tell Claude what to do instead of what not to do", pairing "Do not use markdown in your response" against "Your response should be composed of smoothly flowing prose paragraphs."

Summarise this transcript. Do not use markdown. Do not use bullet points. Do not use headings.

Becomes:

Summarise this transcript as three flowing prose paragraphs of four to six sentences each.
Open with the decision that was reached, then the reasoning, then the open questions.

If your model ignores format instructions no matter what you say, that failure has its own diagnosis: instructions compete with a strong default, and negation is the weakest way to compete.

Did a character limit quietly cut your negative prompt in half?

Some fields are far smaller than the prompt beside them, and at least one vendor truncates without telling you.

Alibaba's Wan documentation describes negative_prompt as "Elements to exclude from the generated video. Supports Chinese and English. Maximum 500 characters; longer text is auto-truncated." The positive prompt for wan2.7-t2v, on the same page, accepts 5,000. Ten to one, and the smaller side fails silently.

The boilerplate negative prompt that circulates on forums runs well past 500 characters. Pasted into Wan, the tail of it never reaches the model:

low resolution, error, worst quality, low quality, jpeg artifacts, ugly, duplicate, morbid,
mutilated, extra fingers, mutated hands, poorly drawn hands, poorly drawn face, mutation,
deformed, blurry, dehydrated, bad anatomy, bad proportions, extra limbs, cloned face,
disfigured, gross proportions, malformed limbs, missing arms, missing legs, extra arms,
extra legs, fused fingers, too many fingers, long neck, watermark, signature, text, logo,
username, artist name, cropped, out of frame, worst face, lowres, jpeg, compression

The version that fits, ordered so the terms that matter most to your shot come first:

extra fingers, deformed hands, bad anatomy, extra limbs, watermark, text, logo, low resolution

Other caps behave differently. Runway's negativePrompt has a schema maxLength of 1,000, so an over-long value should fail validation rather than truncate. Kling's legacy documentation states that negative_prompt "Cannot exceed 2500 characters". Stability sets maxLength to 10,000 across sixteen request schemas and calls the field, twice, "This is an advanced feature." One boilerplate across several vendors is being cut to a different length on each.

Is your own positive prompt overriding it?

At least one vendor publishes an explicit precedence rule, and it is more useful than any character limit.

Ideogram's 3.0 generate endpoint documents negative_prompt as "Description of what to exclude from an image. Descriptions in the prompt take precedence to descriptions in the negative prompt." Put a term on both sides and the positive side wins. Obvious when stated, and violated constantly, because the conflict is usually implicit rather than literal.

This is self-cancelling:

prompt: "A luxury watch on a marble surface, dramatic studio lighting, deep shadows"
negative_prompt: "shadows, dark areas, high contrast"

You asked for deep shadows, then asked for no shadows, and the prompt wins. Move the constraint into the description, where it can be specific:

prompt: "A luxury watch on a marble surface. Broad soft key light from the front left and a
white fill card on the right, so the shadow under the case is soft-edged and no darker than
mid-grey. Even exposure across the marble."
negative_prompt: "harsh spotlight, black background, silhouette"

The same conflict in prose, which is harder to see:

Write a dramatic, high-stakes opening paragraph for a thriller. Do not be melodramatic.

Becomes:

Write an opening paragraph for a thriller. Convey stakes through one concrete physical detail
and one specific number. No character may state how they feel; show it through an action.
Maximum 60 words.

What is a negative prompt actually doing?

Only one vendor here documents the mechanism, and it explains the whole category.

Midjourney publishes that --no is a weighting operation. From its multi-prompts documentation: "Using the no parameter is the same as using a -0.5 weight. So vibrant tulip fields --no red is the same as vibrant tulip fields:: red::-0.5". It also publishes the constraint that follows: "the total of all weights in your prompt needs to be a positive number", so still life painting:: fruit::-0.5 works while still life painting:: fruit::-2 returns an error.

Two things fall out of that. A negative prompt is a nudge with a magnitude, not a filter with a guarantee. And magnitudes are finite, so a strong positive signal elsewhere in your prompt can simply outweigh it.

Midjourney also documents a parsing gotcha almost nobody repeats: "Midjourney's moderation system reads every word you add to the --no parameter independently." Its example is that --no modern clothing is read as "no modern" and "no clothing", which can trigger a warning. Its bad examples are "still life gouache painting without any fruit" and "still life gouache painting, please don't add fruit!", against the good one:

still life gouache painting --no fruit, apple, pear

Where a multi-word negative is risky, name what you want instead:

portrait of a farmer in a 1930s wool work jacket and flat cap, --no denim, nylon

How do you rewrite an exclusion so it works?

Five moves, in order. Every one replaces an absence with a presence, which is the only thing a generative model can render.

1. Describe the desired positive state. The strongest fix and the only one that is portable across every vendor in this post.

A conference room, no clutter on the table
A conference room with a bare walnut table. One closed laptop at the head of the table
and nothing else on the surface. Chairs pushed in and evenly spaced.

2. Name the replacement, not the exclusion. If a slot must not contain X, say what it does contain. An unfilled slot gets whatever the model considers typical.

A woman reading in a cafe, no phone
A woman reading a hardback book in a cafe, both hands on the book, a cooling espresso
and a folded newspaper on the table beside her.

3. Use the parameter where one genuinely exists, and give it nouns. Sentences belong in the prompt, terms belong in the field.

{
  "prompt": "A kitten running in a moonlit garden, slow dolly-in, shallow depth of field",
  "negative_prompt": "flower, text, watermark, subtitle, extra finger, low resolution"
}

4. Split it into two generations. When an element must be absent rather than unlikely, stop asking the sampler to do it. Generate the scene, then edit. Region-based tools operate on pixels rather than probabilities, which is a different guarantee entirely.

Step 1 — generate: "An empty pedestrian street at dawn, wet cobbles, shuttered shopfronts, wide static shot"
Step 2 — inpaint/remove: mask any remaining signage and run an object-removal or inpaint endpoint on that region only

5. Accept that some exclusions cannot be enforced. No vendor here publishes a reliability figure for negation. If your output has a hard requirement, such as no visible brand marks in a commercial deliverable, that is a review step, not a prompt clause.

Generate the image with the positive description only.
Then run the check: "List every piece of legible text visible in this image, and every logo or brand mark."
Reject and regenerate on any hit. Do not rely on the exclusion to have held.
How the three approaches actually behave, from vendor documentation only (27 August 2026)
FeatureProse negationnegative_prompt fieldPositive description
Works with no vendor support
Survives a model upgradeNot on Kling or Ideogram
Has a documented character cap500 to 10,000, by vendor
Vendor advises against itGoogle and Anthropic do
Enforces the exclusion

How do you check your own model in two minutes?

Three checks, in order of reliability. Each takes longer to read about than to run.

  1. Search the machine-readable spec, not the marketing page. Runway, Ideogram and Stability all publish an OpenAPI document. Search it for negative. It answers in seconds, and it tells you which model branches carry the field rather than whether the vendor has one somewhere.
  2. Confirm the surface, not just the vendor. Veo proves that naming the model is not enough. Vertex and the Gemini API expose the same family with different parameter sets, and Kling's two text-to-video endpoints disagree about the same model string.
  3. Test with one unmissable term. Set the negative prompt to a single concept you have deliberately described in the positive prompt, and see whether anything shifts across four generations. If nothing moves, the field is not reaching the model. That is the isolate-one-variable discipline behind our prompt diagnostic flowchart.

What can a negative prompt never do?

It cannot guarantee. That is the honest ceiling, and it changes what you should build on top of it.

Not one vendor in this post publishes a reliability figure for exclusion. Google, Anthropic and Kling all recommend in writing that you supplement or replace negation with positive description. Kling's own legacy documentation, sitting directly beneath the field it still supports, says "It is recommended to supplement negative prompt via negative sentences within positive prompts". That page also carries a notice: "This model or capability will be retired on September 15, 2026." The vendor shipped the parameter, advised against relying on it, and scheduled the model that carries it for removal.

So treat the positive description as the artefact you maintain, and the negative prompt as a per-model attachment you expect to lose. That is a prompt engineering habit rather than a workaround: it is the half of the prompt that keeps working when you change models, change endpoints, or upgrade a version number and find the field gone.

Free Chrome Extension

Stop rewriting prompts. Start shipping.

Works with ChatGPT, Claude, Gemini, Grok, Midjourney, Ideogram, Veo3 & Kling. 5.0★ on the Chrome Web Store.

Create An Account

Frequently asked questions

Free Chrome Extension

Stop rewriting prompts. Start shipping.

Works with ChatGPT, Claude, Gemini, Grok, Midjourney, Ideogram, Veo3 & Kling. 5.0★ on the Chrome Web Store.

Create An Account