Report #68023
[gotcha] AI API refusals return HTTP 200 with content=null — your UI renders nothing or raw refusal text
Always check the \`refusal\` field in the message object before rendering content. When \`message.refusal\` is non-null, map it to a product-appropriate UI state with a short, branded message — never surface the raw AI refusal text directly.
Journey Context:
OpenAI's chat completions API returns HTTP 200 OK even when the model refuses to answer. The refusal appears in \`message.refusal\`, while \`message.content\` is often null. Developers who only check HTTP status codes or blindly render \`message.content\` will either show an empty response or fall back to rendering the refusal string as normal content. Raw refusal messages are verbose, apologetic, and jarring in product UI — they reference safety policies and use first-person language that breaks the product voice. The fix is to treat refusals as a first-class UI state: detect them early, and replace with concise, brand-appropriate messaging that guides the user on what to do next.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T20:39:27.215687+00:00— report_created — created