Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions core/changelog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
- feat: pinned provider keys on routing fallbacks via key_id on each fallback (#7470)
- feat: forward OpenAI async tools, output_schema and tunnel_id on Responses, stripping async for unsupported models with a SupportsAsyncTools datasheet override (#7242)
- feat: prompt-cache breakpoints for the GPT-6 family with a SupportsPromptCacheBreakpoint datasheet override (#7240)
- feat: reasoning effort none for gpt-6-sol and gpt-6-luna (#7492)
- fix: strip unsupported temperature, top_logprobs and logprobs alongside top_p for OpenAI reasoning models, and count an omitted effort as none only for models that default to no reasoning (#7239)
- fix: Responses wire shapes for structured MCP tool errors, object-form conversation, array-form MCP allowed_tools, approval_request_id and in/nin file search filters (#7241)
<Warning>Go SDK callers: `ResponsesMCPApprovalResponse.ApprovalResponseID` is now `ApprovalRequestID`, the message type is now `mcp_approval_response`, and `ResponsesToolMessage.Error` and `ResponsesParameters.Conversation` are now union types, where they used to be `*string`.</Warning>
- fix: keep cache_control breakpoints for Anthropic models routed through OpenRouter (#7521)
- fix: move routing key pins with their provider when session affinity reorders the chain (#7468)
- fix: match session affinity routes on provider and model together, and drop bindings the request followed into a failure (#7473)
- fix: merge multiple system and developer messages for Databricks-hosted Gemini models (#7461)
- fix: treat Bedrock's cross-account or cross-model encrypted reasoning rejection as recoverable and retry without it
- fix: decision emulation uses tool_choice auto for gpt-oss on Bedrock Mantle, and recovers leaked parameter tags with surrounding whitespace
- fix: report Gemini transcription usage even when the transcript is empty
2 changes: 1 addition & 1 deletion core/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.10.1
1.10.2
4 changes: 4 additions & 0 deletions framework/changelog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
- feat: RoutingFallback type accepting the legacy provider/model string or an object with a pinned key_id or provider_key_name (#7470)
- fix: keep a routing rule's stored enabled value when an update or config sync omits it
- fix: deep copy the async flag and union tool error in streaming Responses messages (#7241, #7242)
- chore: upgraded core to v1.10.2
2 changes: 1 addition & 1 deletion framework/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.7.3
1.7.4
1 change: 1 addition & 0 deletions plugins/compat/changelog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- chore: upgraded core to v1.10.2 and framework to v1.7.4
2 changes: 1 addition & 1 deletion plugins/compat/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.3.2
0.3.3
1 change: 1 addition & 0 deletions plugins/governance/changelog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- chore: upgraded core to v1.10.2 and framework to v1.7.4
2 changes: 1 addition & 1 deletion plugins/governance/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.8.2
1.8.3
1 change: 1 addition & 0 deletions plugins/jsonparser/changelog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- chore: upgraded core to v1.10.2 and framework to v1.7.4
2 changes: 1 addition & 1 deletion plugins/jsonparser/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.6.5
1.6.6
1 change: 1 addition & 0 deletions plugins/logging/changelog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- chore: upgraded core to v1.10.2 and framework to v1.7.4
2 changes: 1 addition & 1 deletion plugins/logging/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.8.2
1.8.3
1 change: 1 addition & 0 deletions plugins/maxim/changelog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- chore: upgraded core to v1.10.2 and framework to v1.7.4
2 changes: 1 addition & 1 deletion plugins/maxim/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.7.5
1.7.6
1 change: 1 addition & 0 deletions plugins/mocker/changelog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- chore: upgraded core to v1.10.2 and framework to v1.7.4
2 changes: 1 addition & 1 deletion plugins/mocker/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.6.5
1.6.6
1 change: 1 addition & 0 deletions plugins/modelcatalogresolver/changelog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- chore: upgraded core to v1.10.2 and framework to v1.7.4
2 changes: 1 addition & 1 deletion plugins/modelcatalogresolver/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.1.5
1.1.6
1 change: 1 addition & 0 deletions plugins/otel/changelog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- chore: upgraded core to v1.10.2 and framework to v1.7.4
2 changes: 1 addition & 1 deletion plugins/otel/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.5.5
1.5.6
1 change: 1 addition & 0 deletions plugins/prompts/changelog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- chore: upgraded core to v1.10.2 and framework to v1.7.4
2 changes: 1 addition & 1 deletion plugins/prompts/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.1.5
1.1.6
2 changes: 2 additions & 0 deletions plugins/routing/changelog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- feat: honor pinned provider keys on routing-rule fallbacks (#7470)
- chore: upgraded core to v1.10.2 and framework to v1.7.4
2 changes: 1 addition & 1 deletion plugins/routing/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.1.2
1.1.3
2 changes: 2 additions & 0 deletions plugins/semanticcache/changelog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- fix: read both string and object forms of conversation for cache metadata (#7241)
- chore: upgraded core to v1.10.2 and framework to v1.7.4
2 changes: 1 addition & 1 deletion plugins/semanticcache/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.6.5
1.6.6
2 changes: 2 additions & 0 deletions plugins/telemetry/changelog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- fix: persist user_labels_enabled with the telemetry config (#7490)
- chore: upgraded core to v1.10.2 and framework to v1.7.4
2 changes: 1 addition & 1 deletion plugins/telemetry/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.8.1
1.8.2
146 changes: 16 additions & 130 deletions transports/changelog.md
Original file line number Diff line number Diff line change
@@ -1,139 +1,25 @@
---
title: "v2.2.2"
description: "v2.2.2 changelog - 2026-09-23"
---
<Tabs>
<Tab title="NPX">
```bash
npx -y @maximhq/bifrost --transport-version v2.2.2
```
</Tab>
<Tab title="Docker">
```bash
docker pull maximhq/bifrost:v2.2.2
docker run -p 8080:8080 maximhq/bifrost:v2.2.2
```
</Tab>
</Tabs>

<Update label="Bifrost(HTTP)" description="2.2.2">
## ✨ Features

- **Typesafe Provider and Decisions API** - New typesafe provider, `/v1/decisions` endpoint and `/typesafe` integration. Providers without native decision support now answer decision requests through forced tool-calling on their chat model, whether used as the primary or as a fallback. Probabilities are normalized to sum to exactly 1 and the chosen option must be the most likely one. Decision requests are priced from the datasheet and logged with their answers (#7355, #7361, #7384, #7440)
- **Provider-Level Session Affinity** - A session (from `x-bf-session-id` or the session header that Claude Code, Codex CLI or OpenCode already send) stays on the provider and key that last served it. Affinity only reorders the chain routing built and never restores a provider routing excluded. The logs UI shows it as a routing engine
- **Claude Opus 5.5 Support** - Computer use sends `computer_toolset_20260801` on the Anthropic API and Vertex, while Bedrock and Azure keep `computer_20251124`. `toolset_name` is carried on both halves of each call/result pair across typed, raw passthrough and streaming paths. Disabled thinking and forced tool choice are rejected for Opus 5.5+, and the datasheet `supports_reasoning_disable` field can override this (#7433, #7434, #7441)
- **Claude Code Auto-Mode Safeguards Passthrough** - `safeguards` and `safeguard_results` are forwarded byte-for-byte on requests, responses and stream events to the direct Anthropic provider and stripped on every other provider. The `dangerous-tool-use` and `auto-mode-classifier` betas are gated the same way. Unknown Anthropic SSE events are forwarded raw on the Anthropic passthrough (#7393, #7440)
- **Pinned Keys on Routing Fallbacks** - Each routing-rule fallback can pin a provider key via `key_id`, or `provider_key_name` in config.json. The UI rule editor lets you pick or clear a key per fallback. Unpinned fallbacks keep the legacy `provider/model` string, so existing rules keep their config hash (#7470, #7379, #7380, #7381)
- **OpenAI Async Tool Execution** - The `async` flag on Responses tools and tool calls, `output_schema` on function tools and `tunnel_id` on MCP tools are now forwarded to OpenAI. `async` is stripped for models without support, and the datasheet `supports_async_tools` field can override this (#7242)
- **GPT-6 Prompt Cache Breakpoints** - Prompt-cache breakpoints now cover the GPT-6 family on OpenAI, Azure, Bedrock and Bedrock Mantle. The datasheet `supports_prompt_cache_breakpoint` field can override this (#7240)
- **GPT-6 Sol and Luna Reasoning Off** - `reasoning.effort: "none"` is forwarded for `gpt-6-sol` and `gpt-6-luna`. Other GPT-6 models keep reasoning on (#7492)

## 🐞 Fixed

- **Kimi and DeepSeek with Claude Code** - Tool-schema regex patterns are rewritten (`\0` to `\x00`, lookaround assertions stripped) for Moonshot and DeepSeek models only. kimi-k3 on Bedrock no longer returns an empty stream, and every other model gets byte-identical schemas (#7430)
- **Anthropic Billing Header Leak** - Claude Code's `x-anthropic-billing-header` system block is removed at Messages ingress and restored only for Anthropic-family attempts, including fallbacks and alias targets, so it no longer pollutes GPT or Gemini prompts (#7431)
- **MCP Egress Proxy** - MCP HTTP/SSE connections honor `HTTP_PROXY`, `HTTPS_PROXY` and `NO_PROXY` again (broken since core v1.8.5). Link-local and unspecified destinations are refused before the proxy is dialed (#7437)
- **OpenAI `computer` Tool** - The bare `{"type":"computer"}` tool is no longer rewritten to `computer_use_preview`, which fixes computer use on GPT-6 Astra and GPT-5.6 (#7426) (thanks [@abhishekgahlot2](https://github.com/abhishekgahlot2)!)
- **Streaming Memory Leaks** - The request context is cancelled on every stream exit path, not only on write errors, which stops leaked disconnect watchers from pinning request contexts. `StripEmptyThinkingBlocks` rewrites the body once instead of once per block, and Anthropic beta-header gating no longer decodes the full request body (#7406)
- **Bedrock cachePoint Leak** - Bedrock `cachePoint` markers are stripped copy-on-write for non-Bedrock providers and kept for Bedrock fallbacks. The compat plugin no longer mutates the shared request. Nova reasoning signatures are stripped on the wire only (#7182)
- **Bedrock Empty JSON Keys** - Tool results containing an empty-string object key (such as Cursor's `list_directory`) are sent as text, so Converse no longer rejects them (#7396)
- **Bedrock cache_control on String Content** - InvokeModel keeps every `cache_control` when any message's content is a plain string (#7360) (thanks [@basil-k-aji-dev](https://github.com/basil-k-aji-dev)!)
- **Web Search Source Names** - Responses web search API sources keep their `name` and no longer emit an empty `url` (#7358) (thanks [@g-yixuan](https://github.com/g-yixuan)!)
- **Grok 4.7 xhigh Reasoning** - `xhigh` reasoning effort is no longer downgraded to `high` (#7403) (thanks [@nettee](https://github.com/nettee)!)
- **Allow-All Provider Access** - Virtual keys that allow every provider now list models from, and route to, every configured provider. The governance routing log names providers excluded for having no weight (#7375)
- **OpenAI Chat Stream Framing** - Bundled raw finish and usage frames on the OpenAI chat stream passthrough each get their own `data:` prefix (#7440)
- **Responses Deep Copy** - `DeepCopyResponsesMessage` now deep copies cache controls, provider-native parts, computer/MCP/code-interpreter tool fields and annotations, so copies no longer share pointers with the original (#7422)
- **Request Preparation Performance** - Responses requests are decoded once instead of several times, and the compat plugin clones only the fields it writes (#7412, #7097) (thanks [@G-XD](https://github.com/G-XD)!)
- **OpenAI Sampling Parameters on Reasoning Models** - `temperature`, `top_logprobs` and `logprobs` are now stripped alongside `top_p` on chat and Responses when the model and effort do not support them. An omitted `reasoning.effort` now counts as `none` only for models that default to no reasoning (#7239)
- **Responses API Wire Shapes** - Structured MCP tool-call errors, object-form `conversation`, array-form MCP `allowed_tools`, `approval_request_id` on MCP approval responses, and `in`/`nin` file search filters now decode and re-encode correctly (#7241)
<Warning>Go SDK callers: `ResponsesMCPApprovalResponse.ApprovalResponseID` is now `ApprovalRequestID`, the message type is now `mcp_approval_response`, and `ResponsesToolMessage.Error` and `ResponsesParameters.Conversation` are now union types, where they used to be `*string`.</Warning>
- **OpenRouter Anthropic Cache Breakpoints** - Anthropic models routed through OpenRouter now keep their `cache_control` breakpoints, based on the model capability (#7521)
- **Session Affinity with Pinned Keys** - When session affinity reorders the chain, a routing rule's key pin now moves with its provider, so the pinned key is never looked up under the wrong provider (#7468)
- **Session Affinity Route Matching** - A session's route is now matched on provider and model together. Bindings the request followed into a failure are dropped (#7473)
- **Databricks Gemini System Prompts** - Multiple system and developer messages are merged into one for Gemini models hosted on Databricks, which reject more than one system prompt (#7461)
- **Bedrock Encrypted Reasoning Replay** - Bedrock's "encrypted reasoning was created for a different account or model" error now triggers the strip-and-retry path for unverifiable reasoning
- **Decisions on Bedrock Mantle** - Decision emulation now sends `tool_choice: "auto"` for gpt-oss models on Bedrock Mantle, which reject `"required"`. Leaked parameter tags with surrounding whitespace are now recovered
- **Gemini Transcription Usage** - Usage is reported even when the transcript is empty
- **Routing Rule Enabled State** - Syncing or updating a routing rule that omits `enabled` keeps the stored value, where it used to write NULL
- **Telemetry User Labels Toggle** - `user_labels_enabled` is now saved with the telemetry config (#7490)

## 🗄️ Database Migrations

- No new database migrations in this release.

## 🐙 Closed GitHub Issues

- [#7223](https://github.com/maximhq/bifrost/issues/7223) - MCP client HTTP transport ignores HTTP_PROXY/HTTPS_PROXY and fails on any deployment behind an egress proxy
- [#7336](https://github.com/maximhq/bifrost/issues/7336) - Bedrock InvokeModel drops message-level cache_control when any historical message content is a JSON string
- [#7356](https://github.com/maximhq/bifrost/issues/7356) - Responses web search API source name is dropped during round-trip
- [#7402](https://github.com/maximhq/bifrost/issues/7402) - Grok 4.7 xhigh reasoning effort is silently downgraded to high
- [#7411](https://github.com/maximhq/bifrost/issues/7411) - Redundant JSON decoding in Responses request preparation
- [#7425](https://github.com/maximhq/bifrost/issues/7425) - Responses: `{"type":"computer"}` is rewritten to `computer_use_preview`, breaking GPT-6 Astra / GPT-5.6 computer use

</Update>
<Update label="Core" description="1.10.1">
- feat: typesafe provider, /v1/decisions endpoint, and decision emulation via forced tool-calling for providers without native decision support (#7355, #7361, #7384, #7440)
- feat: provider-level session affinity through the SessionAffinity seam, bound on request outcome
- feat: Claude Opus 5.5 computer_toolset_20260801 support with toolset_name round-trip, and disabled-thinking/forced-tool-choice gating overridable from the datasheet (#7433, #7434, #7441)
- feat: safeguards/safeguard_results passthrough for Claude Code auto-mode on direct Anthropic, stripped elsewhere; raw carrier for unknown Anthropic stream events (#7393, #7440)
- fix: rewrite tool-schema regex NUL escapes and lookarounds for Moonshot and DeepSeek models only (#7430)
- fix: strip Anthropic billing header at ingress and restore it only for Anthropic-family attempts (#7431)
- fix: honor HTTP_PROXY/HTTPS_PROXY/NO_PROXY for MCP connections with a pre-proxy link-local guard (#7437)
- fix: stop rewriting OpenAI `computer` tool to computer_use_preview (#7426) (thanks [@abhishekgahlot2](https://github.com/abhishekgahlot2)!)
- fix: linear StripEmptyThinkingBlocks and beta-header gating without full body decode (#7406)
- fix: strip Bedrock cachePoint markers copy-on-write for non-Bedrock providers, preserved for fallbacks (#7182)
- fix: Bedrock tool results with empty-string JSON keys sent as text (#7396)
- fix: deep copy extended Responses fields in DeepCopyResponsesMessage (#7422)
- fix: frame bundled OpenAI chat stream raw frames with a data prefix each (#7440)
- fix: stream errors after startup events (response.created, in_progress, empty role delta) now reach retry and fallback for OpenAI models on every host (OpenAI, Bedrock, Bedrock Mantle, Vertex, custom providers), not only Azure; an overloaded stream no longer reaches the client as an error when a fallback is configured
- [perf]: avoid redundant JSON decoding in Responses request preparation
- [fix]: preserve xhigh reasoning effort for Grok 4.7 [@nettee](https://github.com/nettee)
- [fix]: Bedrock InvokeModel keeps cache_control when any message's content is a plain string. BedrockMessage.Content is typed as content blocks, so one bare string anywhere in messages[] failed the standard unmarshal and diverted the whole request into the AI21 string fallback, which rebuilt the messages without calling applyMessageContentCacheControl. Every cache_control in the request was dropped rather than only the one on the string message, so prompt caching went off silently with just the system cachePoint surviving. The fallback now makes the same translation the standard path does (#7336) [@basil-k-aji-dev](https://github.com/basil-k-aji-dev)
- [fix]: web search action sources round-trip their name and no longer fabricate an empty url. OpenAI Responses web search can return specialized API sources (`{"type":"api","name":"oai-weather"}`) that carry a name and no URL; the typed source schema only modeled type and a required url, so decode dropped name and re-encode emitted "url":"", and the OpenAI request-side source sanitization rebuilt sources without name. url is now omitempty and name survives both the schema round-trip and the sanitization path (#7356) [@g-yixuan](https://github.com/g-yixuan)

</Update>
<Update label="Framework" description="1.7.3">
- feat: decision request pricing and "decisions" usage type in the datasheet
- chore: upgraded core to v1.10.0
- fix: replace streaming gate replay-buffer size accounting with cached zero-marshal estimates (eliminates per-chunk MarshalJSON on the full-hold path)

</Update>
<Update label="compat" description="0.3.2">
- fix: Bedrock cachePoint handling moved to core dispatch; plugin no longer mutates the shared request (#7182)
- fix: clone only Reasoning, ToolChoice and Tools in PreLLMHook (#7097)
- chore: upgraded core to v1.10.0 and framework to v1.7.3

</Update>
<Update label="governance" description="1.8.2">
- fix: allow-all virtual keys list and route every configured provider (#7375)
- fix: routing log names providers excluded for having no weight
- chore: upgraded core to v1.10.0 and framework to v1.7.3

</Update>
<Update label="jsonparser" description="1.6.5">
- chore: upgraded core to v1.10.0 and framework to v1.7.3

</Update>
<Update label="logging" description="1.8.2">
- feat: log decision requests with usage, cost and answers (#7355)
- chore: upgraded core to v1.10.0 and framework to v1.7.3

</Update>
<Update label="maxim" description="1.7.5">
- chore: upgraded core to v1.10.0 and framework to v1.7.3

</Update>
<Update label="mocker" description="1.6.5">
- chore: upgraded core to v1.10.0 and framework to v1.7.3

</Update>
<Update label="modelcatalogresolver" description="1.1.5">
- chore: upgraded core to v1.10.0 and framework to v1.7.3

</Update>
<Update label="otel" description="1.5.5">
- chore: upgraded core to v1.10.0 and framework to v1.7.3

</Update>
<Update label="prompts" description="1.1.5">
- chore: upgraded core to v1.10.0 and framework to v1.7.3

</Update>
<Update label="routing" description="1.1.2">
- chore: complexity routing session keys built through the shared session-state builder
- chore: upgraded core to v1.10.0 and framework to v1.7.3

</Update>
<Update label="semanticcache" description="1.6.5">
- chore: upgraded core to v1.10.0 and framework to v1.7.3

</Update>
<Update label="telemetry" description="1.8.1">
- chore: shared label-value splice helper for metric labels (#7378)
- chore: upgraded core to v1.10.0 and framework to v1.7.3

</Update>
2 changes: 1 addition & 1 deletion transports/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.2.2
2.2.3
Loading