mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-20 14:12:59 +03:00
validateResponseQuality() only recognized Claude SSE lifecycle events (message_start/content_block_*/message_stop/message_delta.stop_reason). An OpenAI-shape stream (choices[].delta) that emits some bytes (e.g. a role-only delta) and then closes without ever carrying finish_reason (and without a data: [DONE] sentinel) fell through to the generic replay branch and was forwarded to the client as a success instead of triggering combo failover. Adds OpenAI-shape lifecycle tracking (hasChoicePayload/hasTerminalMarker) parallel to the existing Claude tracking: when an OpenAI-shape chunk was seen but the stream ends without finish_reason or [DONE], and no recognized content was found, mark the response invalid so combo failover retries a sibling target. Healthy OpenAI streams (finish_reason present, or real content found) are unaffected — they exit the peek loop before reaching this check, preserving the #3399/#3685 pass-through contract. Regression test: tests/unit/combo-streaming-openai-no-finish-reason-7285.test.ts