Skip to content

v3.18.1

Choose a tag to compare

@eniz1806 eniz1806 released this 30 Jun 09:10

Bug fixes for OpenAI-compatible providers (DeepSeek, OpenAI, Groq, Mistral, Qwen).

Fixed

  • DeepSeek/OpenAI-compatible 400 on mixed-format history. A follow-up turn could fail with Messages with role 'tool' must be a response to a preceding message with 'tool_calls'. Conversation history is now normalized before every request: Claude-format tool_use/tool_result blocks (left by a turn that ran on Claude, including via failover) are converted to OpenAI tool_calls/tool messages, orphan tool messages (from an interrupt or compaction) are dropped, and any unanswered tool_call gets a stub reply — so the request is always structurally valid regardless of how the history was built.
  • A malformed request (400/422) no longer triggers failover. Because a 400 fails identically on every provider, it was silently cascading a valid paid provider (e.g. DeepSeek) down the failover chain to the next one — straight into, e.g., Qwen's free-quota wall. The real error is now surfaced and the active provider is kept. Transient/availability failures (401, 429, 5xx, network errors) still fail over as before.