---
title: "v1.4.23"
description: "v1.4.23 changelog - 2026-04-18"
---
<Tabs>
  <Tab title="NPX">
    ```bash
    npx -y @maximhq/bifrost --transport-version v1.4.23
    ```
  </Tab>
  <Tab title="Docker">
    ```bash
    docker pull maximhq/bifrost:v1.4.23
    docker run -p 8080:8080 maximhq/bifrost:v1.4.23
    ```
  </Tab>
</Tabs>

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

- **Claude Opus 4.7 Support** — Added compatibility for Anthropic's Claude Opus 4.7 model, including adaptive thinking, task-budgets beta header, `display` parameter handling, and "xhigh" effort mapping
- **Anthropic Structured Outputs** — Added `response_format` and structured output support for Anthropic models across chat completions and Responses API, including JSON-schema and JSON-object formats with order-preserving merge of additional model request fields (thanks [@emirhanmutlu-natuvion](https://github.com/emirhanmutlu-natuvion)!)
- **MCP Tool Annotations** — Preserve MCP tool annotations (`title`, `readOnly`, `destructive`, `idempotent`, `openWorld`) in bidirectional conversion between MCP tools and Bifrost chat tools so agents can reason about tool behavior
- **Anthropic Server Tools** — Expanded Anthropic chat schema and Responses converters to surface server-side tools (web search, code execution, computer use containers) end-to-end

## 🐞 Fixed

- **Provider Queue Shutdown Panic** — Eliminated `send on closed channel` panics in provider queue shutdown by leaving queue channels open and exiting workers via the `done` signal; stale producers transparently re-route to new queues during `UpdateProvider`, with rollback on failed updates
- **OpenAI Tool Result Output** — Flatten array-form `tool_result` output into a newline-joined string before marshaling for the Responses API so strict upstreams (Ollama Cloud, openai-go typed models) no longer reject it with HTTP 400; non-text blocks (images, files) are preserved (thanks [@martingiguere](https://github.com/martingiguere)!)
- **vLLM Token Usage** — Treat `delta.content=""` the same as `nil` in streaming so the synthesis chunk retains its `finish_reason`, restoring token usage attribution in logs and UI
- **Config Schema Validator** — Corrected JSON-path lookups for concurrency and SCIM blocks in the schema validation script, and reformatted `transports/config.schema.json` for readability
- **CI Egress Hardening** — Switched `step-security/harden-runner` from `audit` to `block` across all GitHub Actions workflows with explicit `allowed-endpoints` per job
- **Gemini Tool Outputs** — Handle content block tool outputs in Responses API path for `function_call_output` messages (thanks [@tom-diacono](https://github.com/tom-diacono)!)
- **Bedrock Streaming** — Emit `message_stop` event for Anthropic invoke stream and case-insensitive `anthropic-beta` header merging (thanks [@tefimov](https://github.com/tefimov)!)
- **Bedrock Tool Images** — Preserve image content blocks in tool results when converting Anthropic Messages to Bedrock Converse API (thanks [@Edward-Upton](https://github.com/Edward-Upton)!)
- **Gemini Thinking Level** — Preserved `thinkingLevel` parameters across round-trip conversions and corrected finish reason mapping
- **Anthropic WebSearch** — Removed the Claude Code user agent restriction so WebSearch tool arguments flow for all clients
- **Responses Streaming Errors** — Capture errors mid-stream in the Responses API so transport clients see failures instead of silent termination
- **Anthropic Request Fallbacks** — Dropped fallback fields from outgoing Anthropic requests to avoid schema validation errors
- **Async Context Propagation** — Preserve context values in async requests so downstream handlers retain request-scoped data
- **Custom Providers** — Allow custom providers without a list-models endpoint to accept any model rather than restricting on virtual key registration
- **OTEL Plugin** — Default `insecure` to `true` in config.json and include fallbacks in emitted OTEL metrics
- **Payload Marshalling** — Removed unnecessary marshalling of payload in the transport path
- **Helm mcpClientConfig** — Fixed templating for `mcpClientConfig` (thanks [@crust3780](https://github.com/crust3780)!)
- **Helm Chart** — Refreshed the helm chart with validation fixes and removed the prerelease tag

</Update>
<Update label="Core" description="1.4.22">
- fix: OpenAI provider - flatten array-form tool_result output for Responses API (thanks [@martingiguere](https://github.com/martingiguere)!)
- fix: Gemini provider - handle content block tool outputs in Responses API path (thanks [@tom-diacono](https://github.com/tom-diacono)!)
- fix: case-insensitive `anthropic-beta` merge in `MergeBetaHeaders`
- fix: Bedrock provider - emit message_stop event for Anthropic invoke stream (thanks [@tefimov](https://github.com/tefimov)!)
- fix: Bedrock provider - preserve image content in tool results for Converse API (thanks [@Edward-Upton](https://github.com/Edward-Upton)!)
- fix: gemini preserves thinkingLevel parameters during round-trip and finish reason mapping
- fix: WebSearch tool argument handling for all clients by removing the Claude Code user agent restriction
- fix: capture responses streaming API errors
- fix: delete fallbacks from outgoing Anthropic requests
- feat: claude-opus-4-7 compatibility
- fix: token usage for vllm

</Update>
<Update label="Framework" description="1.2.39">
- chore: upgraded core to v1.4.20
- fix: preserve context values in async requests
- fix: capture responses streaming API errors
- fix: otel plugin fixes
- fix: allow custom providers without a list models endpoint to register any model

</Update>
<Update label="governance" description="1.4.39">
- chore: upgraded core to v1.4.20 and framework to v1.2.39
- fix: allow custom providers without a list models endpoint to pass in any model rather than restrict it on vk

</Update>
<Update label="jsonparser" description="1.4.38">
- chore: upgraded core to v1.4.20 and framework to v1.2.39

</Update>
<Update label="litellmcompat" description="0.0.28">
- chore: upgraded core to v1.4.20 and framework to v1.2.39

</Update>
<Update label="logging" description="1.4.39">
- chore: upgraded core to v1.4.20 and framework to v1.2.39
- fix: capture responses streaming API errors

</Update>
<Update label="maxim" description="1.5.39">
- chore: upgraded core to v1.4.20 and framework to v1.2.39

</Update>
<Update label="mocker" description="1.4.38">
- chore: upgraded core to v1.4.20 and framework to v1.2.39

</Update>
<Update label="otel" description="1.1.38">
- chore: upgraded core to v1.4.20 and framework to v1.2.39
- fix: sets default for `insecure` to `true` for config.json
- fix: includes fallbacks in otel metrics

</Update>
<Update label="semanticcache" description="1.4.37">
- chore: upgraded core to v1.4.20 and framework to v1.2.39

</Update>
<Update label="telemetry" description="1.4.39">
- chore: upgraded core to v1.4.20 and framework to v1.2.39

</Update>
