mirror of
https://github.com/Routstr/routstr-core.git
synced 2026-08-09 02:54:37 +00:00
Replace the fragile `re.split(b"data: ")` streaming parser with a buffered, event-delimited parser in both the chat-completion and Responses-API streamers. Events are accumulated until the SSE blank-line delimiter, so parsing is independent of network chunk boundaries. Fixes: - OpenRouter `: OPENROUTER PROCESSING` keepalive comments no longer leak to clients as `data: : ...` (the `Unexpected token ':'` client crash). - JSON payloads split across TCP reads are reassembled before parsing. - CRLF framing (Gemini native alt=sse) handled. - Combined content+usage chunks (Gemini thinking models over the OpenAI-compat endpoint) forward content once and still report usage in the cost trailer, instead of dropping the assistant message. - Multi-line non-JSON `data` blocks are re-prefixed per line so they stay valid SSE framing for the client. Adds tests/unit/test_streaming_sse_providers.py driving the real generator against per-provider on-the-wire framing, and switches the integration token-mint fallback to secrets.token_hex to kill a PRNG/clock collision flake.