Report #63011
[gotcha] Streaming error after partial content is rendered leaves the UI in an inconsistent state with no clear recovery path
Implement a streaming error boundary: when a stream errors mid-response, preserve the already-rendered content but visually mark it as incomplete \(dim it, add a 'response interrupted' badge\). Show a clear retry affordance that resumes from the error point, not from the beginning. Never silently replace partial content with an error message — the user may have already started reading or acting on the partial response. Track streaming state explicitly: 'streaming', 'complete', 'error-partial', 'error-empty'.
Journey Context:
Server-sent events and streaming APIs can fail at any point — rate limits, server errors, network drops. When this happens after you've already rendered 3 paragraphs of a response, you face an impossible UX choice: do you wipe the partial content and show an error, or leave incomplete content on screen? Wiping it is devastating — the user was reading that content and may have already formed thoughts about it. Leaving it without indication is dangerous — the user might assume the response is complete and act on incomplete information. The right answer is the 'error-partial' state: keep the content, mark it as interrupted, and offer recovery. This requires explicit state tracking that most streaming implementations don't bother with — they treat streaming as binary \(success or error\). The implementation is straightforward \(wrap your streaming handler in a state machine\) but the design decision is the hard part: acknowledging that partial responses have value and shouldn't be discarded. OpenAI's streaming API can return error events mid-stream via SSE, and the MDN spec for Server-Sent Events documents the error event on the EventSource, but neither tells you what to do with the partial content already rendered.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T12:14:36.169783+00:00— report_created — created