moderation: low does nothing, and a method that finds the trigger word in about 20 calls.
The case: web app renders, API returns sexual
A customer usedgpt-image-2.5-sunburst to generate a character sheet (face close-up on the left, front / side / back turnaround on the right). The request:
I get that it is content safety, but the same thing works in the ChatGPT web app. You have to tell me why the web app passes.Nothing in the prompt is explicit. It is just “glamorous woman + turnaround + white background”. A ticket of the form “I did not write anything bad but got blocked” needs a completely different approach from “I wrote something bad and got blocked”.
First: which layer is blocking?
Image models have two safety gates. They fail differently and are debugged differently:Why the web app passes
This is the same point made in How to Get Satisfying Images: the web app is an agent, the API is a single atomic call.- The ChatGPT web app does not feed your text to the image model verbatim. The chat model rewrites and expands the prompt first, and it usually fills in clothing, setting and lighting on its own. That is exactly the “add clothing” step described below, done for you.
- The API sends your prompt as-is. You did not say what she wears, so the model decides. Under “glamorous + full-body turnaround + white background” it leans toward a tight or minimal outfit, which is what a character sheet often looks like, and the render crosses the line.
- Add the randomness of output-side moderation on top, and “web app passed once, API failed once” is not a contradiction.
Word ablation: change one thing at a time
A prompt like this has a dozen adjectives and layout constraints. Guessing which one is at fault is slow. The effective approach is ablation: remove or replace exactly one word block per variant, keep everything else byte-identical, and watch which variant flips the result.List the suspect word blocks
Change exactly one block per variant
Re-run any flip 2 to 3 times
Take the smallest edit
Conclusion and recommended fix
Mechanism: “glamorous” pushes the model toward a sensual rendering, and “full-body turnaround + white background” is the classic character-sheet layout. Together they produce renders the output-side classifier flags as sexual. Not a single word in the prompt is itself a violation. Recommended fix: keep the entire original prompt and add one explicit clothing phrase right after the character description. This passed 3 of 3 runs and kept both the look and the layout the customer wanted:
Same prompt with one clothing phrase added: 3 of 3 calls passed, with the face close-up and the front / side / back turnaround all delivered
Why moderation: low did not help
Themoderation parameter (see the text-to-image parameter table) accepts auto / low and lowers the strictness of prompt-side moderation. Passing low here still returned 400, because the block happens on the output side, which this parameter does not control.
From outside the gateway we cannot tell “the parameter was not forwarded” from “it was forwarded and had no effect”, but the conclusion is the same either way: for an output-side block, changing parameters does nothing; change the prompt.
General checklist
Did the error come back instantly, or after a long wait?
Did the error come back instantly, or after a long wait?
Did you leave the outfit up to the model?
Did you leave the outfit up to the model?
Did you change only one word at a time?
Did you change only one word at a time?
Are blocked requests billed?
Are blocked requests billed?
Quick reference
- Use latency to find the layer: an instant 400 is prompt-level; a 400 that took as long as a render is the output-side classifier rejecting the image.
- Output-side blocks are stochastic: the same prompt passes sometimes and fails sometimes, so a single result proves nothing. Re-run 2 to 3 times.
- The web app passing does not mean the API is stricter: the web app rewrites and expands the prompt (adding clothing, setting), the API sends it verbatim.
- Word ablation: change one block per variant, run variants in parallel, keep the edit with the least change of intent. Here the trigger was “glamorous”.
- Spell out clothing in character prompts: one added clothing phrase with everything else untouched passed 3 of 3;
moderation: lowdoes nothing for output-side blocks.