Report #58815
[gotcha] AI refusals returned as HTTP 200 success responses silently poison your metrics and UX
Implement refusal detection: check for refusal patterns in the response body \(e.g., \`finish\_reason\`, content filter flags, or known refusal phrases\). Never assume a 200 response means a useful answer. Log refusals separately from successes in your metrics. In UI, surface refusals with clear next-step guidance, not as normal responses.
Journey Context:
When an AI refuses a request \(content policy, safety filter\), most APIs return HTTP 200 with a refusal message in the body, not an error code. Your success-rate dashboards show 100% but users are hitting walls. This is a double gotcha: \(1\) your monitoring is blind to refusals because they look like successes, and \(2\) your UI renders the refusal as a normal chat response, which is confusing and provides no path forward. The fix requires parsing the response body for refusal signals, which varies by provider. Azure OpenAI adds \`content\_filter\` results; OpenAI sometimes sets \`finish\_reason\` differently. You must build refusal-awareness into both your observability and your UI layer.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T05:12:27.133085+00:00— report_created — created