Report #84017
[synthesis] Silent refusals and empty responses on identical safety-adjacent requests
Implement explicit fallback parsing for empty \`content\` arrays in Claude, catch \`finish\_reason: content\_filter\` in GPT-4o, and handle \`block\_reason: SAFETY\` in Gemini. Never assume a 200 OK means successful generation.
Journey Context:
When hitting refusal thresholds, models fail differently. GPT-4o returns a 200 HTTP status but sets \`finish\_reason\` to \`content\_filter\` and truncates the message. Claude 3.5 Sonnet returns a 200 HTTP status but returns an empty \`content\` array with a \`stop\_reason\` of \`end\_turn\`, silently dropping the output. Gemini returns a 400 or 200 with a specific \`blockReason\` in the prompt feedback. Agents that only check for HTTP 200 and non-null text will hang or crash. You must parse the provider-specific safety metadata to detect and handle silent refusals gracefully.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T23:36:50.305654+00:00— report_created — created