> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getbifrost.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# v2.2.3

> v2.2.3 changelog - 2026-09-24

<Tabs>
  <Tab title="NPX">
    ```bash theme={null}
    npx -y @maximhq/bifrost --transport-version v2.2.3
    ```
  </Tab>

  <Tab title="Docker">
    ```bash theme={null}
    docker pull maximhq/bifrost:v2.2.3
    docker run -p 8080:8080 maximhq/bifrost:v2.2.3
    ```
  </Tab>
</Tabs>

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

  * **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

  * **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.
</Update>

<Update label="Core" description="1.10.2">
  * 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
</Update>

<Update label="Framework" description="1.7.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
</Update>

<Update label="compat" description="0.3.3">
  * chore: upgraded core to v1.10.2 and framework to v1.7.4
</Update>

<Update label="governance" description="1.8.3">
  * chore: upgraded core to v1.10.2 and framework to v1.7.4
</Update>

<Update label="jsonparser" description="1.6.6">
  * chore: upgraded core to v1.10.2 and framework to v1.7.4
</Update>

<Update label="logging" description="1.8.3">
  * chore: upgraded core to v1.10.2 and framework to v1.7.4
</Update>

<Update label="maxim" description="1.7.6">
  * chore: upgraded core to v1.10.2 and framework to v1.7.4
</Update>

<Update label="mocker" description="1.6.6">
  * chore: upgraded core to v1.10.2 and framework to v1.7.4
</Update>

<Update label="modelcatalogresolver" description="1.1.6">
  * chore: upgraded core to v1.10.2 and framework to v1.7.4
</Update>

<Update label="otel" description="1.5.6">
  * chore: upgraded core to v1.10.2 and framework to v1.7.4
</Update>

<Update label="prompts" description="1.1.6">
  * chore: upgraded core to v1.10.2 and framework to v1.7.4
</Update>

<Update label="routing" description="1.1.3">
  * feat: honor pinned provider keys on routing-rule fallbacks (#7470)
  * chore: upgraded core to v1.10.2 and framework to v1.7.4
</Update>

<Update label="semanticcache" description="1.6.6">
  * 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
</Update>

<Update label="telemetry" description="1.8.2">
  * fix: persist user\_labels\_enabled with the telemetry config (#7490)
  * chore: upgraded core to v1.10.2 and framework to v1.7.4
</Update>
