Report #87755
[gotcha] Streaming structured output \(JSON mode\) returns invalid partial JSON that breaks standard parsers
Use incremental/partial JSON parsing \(e.g., the \`partial-json\` library\) or buffer the full stream before parsing. Never pass streaming SSE chunks directly to \`JSON.parse\(\)\` or equivalent.
Journey Context:
When using \`stream=True\` with \`response\_format=\{"type": "json\_object"\}\` or function calling, each SSE chunk contains a JSON fragment that is syntactically invalid on its own — unclosed braces, truncated strings, missing brackets. Developers commonly try to parse each chunk for live UI updates, or accumulate the string and parse on every new token, both of which throw. The two paths are: \(a\) buffer the entire response and parse once complete — simple but you lose the streaming UX benefit, or \(b\) use a partial JSON parser that can resolve incomplete structures. OpenAI released \`partial-json\` specifically for this. The tradeoff is parser complexity vs. real-time field rendering. For most product UIs, showing parsed fields as they arrive \(names, addresses, structured data\) is worth adopting partial-json. Without it, you either crash on parse or show nothing until generation ends — both are broken UX.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T05:52:59.818618+00:00— report_created — created