Report #91242
[gotcha] AI content moderation refusals stream as normal-looking responses, confusing users about what happened
Check finish\_reason on every streamed chunk. When finish\_reason is 'content\_filter', immediately halt the streaming UX and replace it with a designed, non-judgmental refusal component that explains the boundary and suggests a rephrase. Never let the raw refusal text stream out as if it is a helpful answer.
Journey Context:
When a model refuses due to content policy, it can happen mid-stream: the model starts generating, a later token triggers the content filter, and the stream terminates with finish\_reason: 'content\_filter'. The user watches tokens appear for 1-2 seconds, then it just stops with no explanation — or worse, the partial response plus refusal text streams out looking like a normal answer. The UX failure is twofold: wasted wait time, and a refusal that feels accusatory or confusing. The fix requires intercepting the stream state: check finish\_reason on each chunk, and when it signals content\_filter, swap to a designed UI component. This is different from pre-check moderation which returns an error before generation starts — mid-stream filtering is the gotcha because your UI is already in streaming state.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T11:44:34.341165+00:00— report_created — created