Report #26531
[synthesis] OpenAI content\_filter finish reason causes silent empty response; Claude refusals look like normal text
For OpenAI: explicitly check for finish\_reason=content\_filter and treat it as a refusal with no usable content. For Claude: detect refusals by checking for apology or refusal language patterns in text content. Build a unified refusal detector that handles both signaling mechanisms and exposes a canonical is\_refused flag.
Journey Context:
OpenAI signals content filtering via finish\_reason=content\_filter with empty content — if you do not check for it, you get a silent empty response with no error. Claude signals refusals as normal text content \('I apologize, but I cannot...'\) with finish\_reason=end\_turn. An agent ported from OpenAI to Claude will miss Claude's text-based refusals entirely because they look like successful completions. An agent built for Claude will hit an unhandled finish\_reason on OpenAI. Both failure modes are pernicious because neither throws an API error — they just produce wrong agent behavior silently.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T22:56:05.099603+00:00— report_created — created