Bifrost HTTP Transport Release v1.5.0
**v1.5.0 contains multiple breaking changes.** See the **[v1.5.0 Migration Guide](/migration-guides/v1.5.0)** for full before/after examples, automatic migration details, and a step-by-step checklist before upgrading.✨ Features
Providers & models
- Claude Opus 4.7 - Compatibility for Anthropic's Claude Opus 4.7 model, including adaptive thinking, task-budgets beta header,
displayparameter handling, and "xhigh" effort mapping - Anthropic Structured Outputs -
response_formatand structured-output support across chat completions and Responses API, with order-preserving merge of additional model request fields (thanks @emirhanmutlu-natuvion!) - Anthropic Server Tools - Surface server-side tools (web search, code execution, computer use containers) end-to-end across Anthropic chat schema and Responses converters
- Anthropic Computer Use - Cross-provider parity fixes for Anthropic computer use across Bedrock, Vertex, and Anthropic
- Fireworks AI Provider - Add Fireworks AI as a first-class provider with native completions, responses, embeddings, and image generations (thanks @ivanetchart!)
- StabilityAI on Bedrock - StabilityAI image generation through the Bedrock provider
- Bedrock Embeddings & Image Gen - Embeddings, image generation, image edit, and variation support on Bedrock
- Bedrock Structured-Output Fallback - Synthetic structured-output tool fallback for Bedrock Converse API
- Azure Container API - Azure provider now supports the container API for code-execution / computer-use scenarios
- Azure Passthrough - Native Azure passthrough support for Responses, chat completions, embeddings, and audio
- Gemini Named Content Cache - Named content cache support on Gemini
- Realtime Support - WebSocket, WebRTC, and client-secret handlers with session state management and transport-context helpers; OpenAI Realtime audio base64 encoding (thanks @Mahmoud-Khater!)
- OCR Request Support - First-class OCR request type with stream terminal detection, full body accumulation for passthrough streams, input logging with detail view, and per-request pricing
- vLLM / SGL Compatibility - Extra-body params (
chat_template_kwargs,guided_json,guided_regex,separate_reasoning) flow through vLLM and SGL viaBifrostContextKeyPassthroughExtraParams(thanks @hensapir!)
MCP
- MCP Tool Groups -
tool_groupsconfig with governance scoping (virtual key, team, customer, user, provider, API key) and camelCase Helm aliases for MCP client fields - MCP Tool Annotations - Preserve
title,readOnly,destructive,idempotent,openWorldannotations across bidirectional conversion so agents can reason about tool behavior - MCP Reverse Proxy OAuth - External base-URL support for reverse-proxy MCP OAuth flows; later split into separate server and client URL fields for clearer reverse-proxy configuration
- MCP Tool Discovery - Discovered tools and tool-name mapping columns added to MCP clients
- MCP Per-Tool Access Control - Virtual-key MCP configs now act as an execution-time allow-list; tools not permitted by the VK are blocked at inference and MCP tool execution
- MCP Disable Auto Tool Inject - Per-request opt-out via
MCPToolManagerConfigandBifrostContextKeyMCPAddedToolstracking - MCP Header Filters -
x-bf-mcp-include-clientsandx-bf-mcp-include-toolsrequest headers filter the MCPtools/listresponse when Bifrost runs as an MCP gateway - MCP Request-Level Headers - Per-request extra headers on MCP tool execution via
BifrostContextKeyMCPExtraHeaders - MCP Duration Strings + Hash Reconciliation -
tool_sync_intervalaccepts Go duration strings; hash-based reconciliation prevents unnecessary MCP client restarts on config reload - MCP OAuth Edit - Ability to edit pre-existing MCP OAuth details
- MCP
disabledToggle -disabledfield on MCP clients for toggling connection without removing the config - MCP OAuth
EnvVarRefs -client_idandclient_secretacceptEnvVarreferences for secret injection - MCP Clients on All VKs - Option to allow MCP clients to run on all virtual keys without explicit assignment
Governance, RBAC & teams
- Access Profiles - Fine-grained permission control via access profiles, seedable declaratively from
config.jsonand Helm values (provider restrictions, model allowlists, budgets, rate limits, MCP server/tool controls) - Team Budgets - Per-team spending tracking with atomic rate-limit updates, DB tables, and
business_units,team_id,calendar_aligned,virtual_key_countfields in governance schema and Helm - Granular RBAC - Replaced the single
GovernanceRBAC check with granular per-resource permissions; enforcement on routing rules (view/edit/create), model provider create/update, and MCP tool groups routes - Direct Key Bypass Removed - Removed direct key bypass from HTTP gateway and Go SDK; all keys now flow through governance
- Unique Team Names - Enforce unique
governance_teams.namewith deduplication migration GetTeamByName- Config store interface and RDB now support team lookup by name
Routing, logging & observability
- Auto-Resolve Provider - Inference and integration routes now auto-resolve the provider when no provider prefix is given on the model name
- Auto-fill Incoming Model for Fallbacks - Routing rule fallback entries can omit the model; the incoming request model is substituted automatically at runtime
- Self-Looping Chain Rules - Chain rules with self-loops continue evaluating subsequent rules instead of halting
- Routing Rules Scope Cache - Cache routing rules per scope upfront, plus model-catalog routing engine label and icon
- Per-Request Content Logging Overrides - Opt-in per-request overrides for content logging and raw request/response visibility, with DB migrations and live-reload
- Unified Dimension Headers (
x-bf-dim-*) - Forwarded automatically to logs, traces, Prometheus, and Maxim tags - Logging Tracking Fields - Track
userId,teamId,customerId, andbusinessUnitIdacross logging, Maxim, and OTEL parent_request_id,user_ids,aliasesURL State - Propagated through logs and traces for cross-request correlation- Trace Attribute Flow - Custom trace attributes flow through the OTEL exporter
- Finish Reasons in OTEL Root Spans - Finish reasons added to root spans, with correct model and provider names propagated
- Local Cache Hit Rate Speedometer - Dashboard speedometer showing local cache hit rate (thanks @loss-and-quick!)
- Single Log Export - Export individual log entries from the logs view and MCP logs sheet
- Virtual Keys CSV Export - Sorting and CSV export from the virtual keys table
- Period Parameter -
periodparam for relative time-range queries on dashboard and logs endpoints - Passthrough Streaming Accumulation - Accumulator for passthrough streaming responses, enabling proper logging and cost tracking on raw provider streams
- VK-Scoped Model Lists - Model list endpoints scoped to virtual-key-allowed providers and models via request headers
objectStorageExcludeFields- Configurable list of log payload fields that stay in the database instead of being offloaded to object storage
Pricing
- Pricing Overrides - Scoped pricing overrides per provider/key/model
- 272k Token Tier - 272k token tier pricing support
- Flex / Priority Tiers - Flex and priority tier pricing with
service_tier-based selection - Cache Creation Pricing - 5-minute and 1-hour TTL pricing tiers for Claude cache creation
- Container Creation Cost - Per-request container creation cost support
Configuration & deploy
- Dedicated Provider Keys API - Keys are managed via
/api/providers/{provider}/keysendpoints instead of being embedded in provider create/update payloads key_idsWildcard - VK provider configkey_idssupports["*"]to allow all keys; emptykey_idsdenies all- Empty-Array Conventions -
[]means deny-all,["*"]means allow-all across models, tools, and keys - Deny-by-Default Virtual Keys - VK provider and MCP configs block all access when empty; automatic migration backfills existing keys to preserve behavior
- Model Alias - Map model names to provider-specific identifiers (deployment names, inference profile ARNs, fine-tuned IDs, custom names) via per-key alias config
provider_key_nameAlias - Human-readable alias for routing targets and pricing overrides, resolved tokey_idat config loadenv.*References for Proxy and TLS -url,username,password,ca_cert_pemacceptenv.VAR_NAMEfor secret injectionschemas.Duration- Go duration string support for MCP, Redis, Weaviate, and mocker duration fields- Path Whitelisting - Path whitelisting from security config
- Server Bootstrap Timer - Startup diagnostics
- Plugin Trace-Level Logging - Plugins can inject logs at trace level via
ctx.Log(schemas.LogLevelInfo, ...) - Per-User OAuth Consent - Per-user OAuth consent flow with identity selection and MCP authentication; OAuth server selection and validation per-user in codemode
- Prompts Plugin - New prompts plugin with direct key header resolver and selective message inclusion when committing prompt sessions
- EnvVar Improvements -
IsSetmethod onEnvVarand auto-redaction of env-backed values in JSON serialization - Optional
txinDeleteVirtualKey- External transactions can drive VK deletion atomically - Trial Expiry Banner - Sticky trial-expiry banner replacing the sidebar indicator
Helm & enterprise
- Enterprise Helm Overlays - Composable overlays for guardrails, org governance, access profiles, customer budgets, teams, multi-customer governance, and SCIM/SSO
- Semantic Cache Helm Layers -
values-semantic-search-redis.yamlandvalues-semantic-search-weaviate.yamlplus a client-config overlay - Key IDs in Helm -
key_idsis now the preferred field for pinning provider keys in Helm virtual key configurations
🐞 Fixed
Providers
- Provider Queue Shutdown Panic - Eliminated
send on closed channelpanics by leaving channels open and exiting workers via the done signal; stale producers transparently re-route to new queues duringUpdateProvider - Provider Update Stalls - Avoid provider update stalls under high load
- Keyless Provider Reload - Broadcast provider config changes to cluster for keyless providers; provider runtime reloads correctly after key creation
- Default Routing Provider Filter - Filter out unconfigured providers in default routing
- Custom Providers - Custom providers without a list-models endpoint accept any model rather than restricting on virtual-key registration
- OpenAI Tool Result Output - Flatten array-form
tool_resultoutput into a newline-joined string for the Responses API so strict upstreams (Ollama Cloud, openai-go typed models) no longer reject with HTTP 400 (thanks @martingiguere!) - OpenAI Responses Tool Fields - Preserve tool fields in OpenAI responses (thanks @princepal9120!)
- OpenAI Transcription Formats - Handle
text,vtt, andsrtresponse formats in OpenAI transcription response - Anthropic WebSearch - Removed the Claude Code user agent restriction so WebSearch tool arguments flow for all clients
- Anthropic Request Fallbacks - Dropped fallback fields from outgoing Anthropic requests to avoid schema validation errors
- Anthropic Empty Thinking Block - Drop empty thinking block for Anthropic provider on Claude Code
- Anthropic Integration Routing - Skip model catalog routing when loadbalancer or governance routing has already selected the provider
- Bedrock Streaming - Emit
message_stopevent for Anthropic invoke stream and case-insensitiveanthropic-betaheader merging (thanks @tefimov!) - Bedrock Streaming Retries - Retry retryable AWS exceptions and stale/closed-connection errors
- Bedrock Tool Choice - Convert tool choice to
autocorrectly - Bedrock SigV4 Service - Correct SigV4 service name for agent-runtime rerank
- Bedrock Tool Images - Preserve image content blocks in tool results when converting Anthropic Messages to Bedrock Converse API (thanks @Edward-Upton!)
- Bedrock Structured-Output Streaming - Suppress non-tool content events (text deltas, reasoning, non-tool content-block starts) when structured output mode is active, preventing prose from corrupting the assembled JSON
- Bedrock Llama
toolChoice.tool- OmittoolChoice.toolon Meta Llama variants under Bedrock Converse to satisfy upstream rejection (thanks @ryan-orphic!) - Vertex Endpoint - Vertex endpoint correction
- Vertex
google/Prefix - Stripgoogle/prefix from Vertex model IDs across all request types - Vertex Multi-Region Routing - Multi-region-only models now route to multi-region endpoints when the provider key is configured for a single region only
- Gemini Tool Outputs - Handle content block tool outputs in Responses API path for
function_call_outputmessages (thanks @tom-diacono!) - Gemini Thinking Level - Preserve
thinkingLevelparameters across round-trip conversions and correct finish-reason mapping - Gemini Thinking Budget - Thinking budget validation for Gemini models
- vLLM Token Usage - Treat
delta.content=""the same asnilin streaming so the synthesis chunk retains itsfinish_reason, restoring token-usage attribution in logs and UI - vLLM Extra Params - Extra parameters now passed through to vLLM providers
- PydanticAI Null Text Fields - Normalize null text content in PydanticAI stream response chunks
- Embedding Model Backfill - Backfill
Modelin embedding response when provider omits it
MCP & OAuth
- MCP Tool Logs - MCP tool logs are captured correctly
- MCP Tool Field Resolution - Resolve
tools_to_executeandtools_to_auto_executefrom existing config before validation in MCP client update - OAuth Query Params - Preserve existing query parameters when building OAuth upstream authorize URLs
- OAuth Token
expires_at- Nullable; refresh/reconnect guarded on nil expiry - OAuth Permanent Errors - Only treat
invalid_grantandunauthorized_clientas permanent OAuth errors; transient refresh failures no longer mark configs expired - OAuth Per-User Reauth - Handle per-user OAuth re-auth, refresh token expiry, and reconnection
- OAuth Credential Rotation - Temporarily disabled OAuth credential rotation and header reconciliation pending follow-up work
- OAuth2 Token Source Cache - Cache OAuth2 token source to eliminate per-request overhead
oauth_client_id/oauth_client_secretValidation - Excluded from config field validation that previously rejected env-backed values- Per-User OAuth Codemode - Use per-user OAuth servers in codemode
Streaming, transport & runtime
- Streaming Post-Hook Race - Race where fasthttp
RequestCtxcould be recycled before transport post-hooks completed in streaming goroutines; eagerly captures request/response snapshots before the handler returns - Streaming Pool-Reuse Corruption - Snapshot
RequestTypebefore closure to prevent pool-reuse corruption - Streaming Pipeline
RawRequest- PropagateRawRequestthrough the streaming pipeline and fix pool leak (thanks @loss-and-quick!) - Streaming Timeouts - Separate streaming clients per provider to prevent read-timeout collisions
- Streaming Latency Validation - Allow zero-millisecond latency values (valid for sub-millisecond cache hits)
- Streaming Error Logs - Improved streaming error log handling (thanks @loss-and-quick!)
- Logging Streaming Errors - Improved streaming error handling in logging plugin (thanks @loss-and-quick!)
- Logging Request Type - Resolve request type from pending data before streaming to prevent missing
Objectfield in error logs - Responses Streaming Errors - Capture errors mid-stream in the Responses API so transport clients see failures instead of silent termination
- Async Context Propagation - Preserve context values in async requests so downstream handlers retain request-scoped data
- Async User Values - Propagate user values through all async inference handlers and job submissions
- Async Log Store Exceptions - Exception handling in async log store jobs
- Trace Completer Safety - Trace completer accepts transport logs as a parameter instead of reading from potentially recycled context
- Trace Completion Deadlock - SSE heartbeats and deferred trace completion to prevent deadlock
- Plugin Timer Concurrency - Concurrent map access in plugin timer
- WebSocket
/responsesReliability - Upstream handshake diagnostics, proper error capture, WebSocket lifecycle, VK stripping, logging, and cost tracking - WebSocket Nil Checks -
sendMessageSafelynil guards, panic recovery, and client cleanup - WebSocket Extra Headers - Forward extra headers on responses websocket upstreams
- Raw Request Passthrough - Removed
SendBackRawRequestfrom all provider passthrough flows; passthrough streaming sets proper SSE headers - Network Config Fallback - Fall back to network config if key-config URL is not set for Ollama and SGL
base_urlBackward Compatibility -base_urladded tonetwork_configfor backward compatibilityResponseToolMessageNamespace - Namespace fix inResponseToolMessagefor cross-provider compatibility- Tool Execution Header - Removed redundant static header assignment in tool-execution flow
Governance, virtual keys & teams
- Self-Looping Chain Rules - Chain rules with self-loops continue evaluating subsequent rules
- Virtual Key Configs - VK configurations cleaned up correctly on provider changes
- Virtual Key Management - VK creation validation and update handling
- Routing Rule Targets - Preserve routing-rule targets for genai and bedrock paths
- Routing Rule Query Normalization - Normalize
queryfield to validRuleGroupTypeand tighten schema validation - Provider Budget Duplication - Provider-level multi-line budget duplication issue
- Governance Budgets in Model Providers - Persisted correctly across server restarts
governance_budgetsJoin - Corrected join condition to usevirtual_key_id- Budget and Team Co-creation - Fixed creation of budgets and teams in the same request
- Access Profile Rate Limits - Rate-limit counters for access profiles were always showing 0; now persisted correctly to the database
- Gossip Baseline & Orphaned Rate Limits - Add gossip baseline methods and clean up orphaned rate limits
- Default Routing Provider Filter - Filter out unconfigured providers in default routing
afterPagination - Graceful error for invalidaftervalues by letting upstream pagination handle them
Caching, OTEL & telemetry
- Semantic Cache Determinism - Deterministic request hashing and
CacheDebugpropagation in streaming (thanks @loss-and-quick!) - Semanticcache Provider Keys - Inherit provider keys from global client in semanticcache plugin
- OTel Metrics - OpenTelemetry metrics pipeline (thanks @tcx4c70!)
- OTel Export - OTEL exporting now correctly shows input and output messages
- OTel Cost Info - Cost info in OTEL calls and response tools
- OTel Insecure Default - OTel plugin defaults
insecuretotruewhen omitted, enabling HTTP collectors without explicit config; OTel semconv updated to v1.40.0 - OTel Input/Output Messages - Propagation to root span
resolvePeriodUTC - UTC handling inresolvePeriodtime calculation- Prometheus Telemetry Plugin - Nil config handling
Database & migrations
- SQLite Migrations - SQLite migration connections, error handling, and disabled foreign-key checks during migration
- Migrations Conflict Resolution - Resolved migration conflicts
- Migration Pools Cached Plan - Use simple-query protocol for migration pools to prevent cached plan errors
- Calendar-Aligned Propagation -
calendar_alignedpropagation in v1.5.0-prerelease4 migration - Multipart File Uploads - Write multipart metadata before file content to fix upload ordering
Configuration, env & misc
- MarshalJSON Auto-Redaction - Removed
MarshalJSONauto-redaction; explicit redaction is now applied to env-backed fields inProxyConfig,ClientConfig, andAzureKeyConfig - Env Var Redacted Check - Added missing redacted check for env var values
- EnvVar JSON Serialization - Auto-redact env-backed values in
EnvVarJSON serialization - Tool Parameter Schemas - Preserve explicit empty tool parameter schemas for OpenAI passthrough
- Config Schema - Bedrock key config schema fix
- List Models Output - Include raw model ID alongside aliases
- Model Listing - Unify
/api/modelsand/api/models/detailslisting behavior - Model Alias Tracking - Split
ModelRequestedintoOriginalModelRequestedandResolvedModelUsedfor accurate model-alias resolution tracking - Data Race in fasthttp Read - Race in data reading from fasthttp request for integrations
- Fallback Stream State - Clear
BifrostContextKeyStreamEndIndicatorbefore fallback requests so stale streaming state doesn't carry into retries - API Key Auth Middleware - Adjusted API key authentication handling in middleware
- Auth Config Disabled Context - Update request context correctly when auth config is disabled
BifrostErrorString Output -String()method so logged errors render as JSON instead of decimal byte dumpsNewUnsupportedOperationErrorContext - Now populatesProviderandRequestTypeinExtraFields- SCIM Page Layout - Added
no-scrollbarutility class and appliedno-padding-parentto the SCIM page - Teams View OSS/Enterprise Split - Extracted full TeamsView into the shared fallback component so it works correctly in OSS builds; fixed pagination offset snap-back and RBAC loading state race
MockConfigStoreDuplicate - Removed duplicateGetOauthConfigsByIDsfromMockConfigStore
Helm
- Helm
mcpClientConfig- Templating fix (thanks @crust3780!) - Helm Encryption Key -
encryptionKeyis properly optional for StatefulSet deployments when using a Kubernetes secret reference - Helm Chart - Validation refresh
- Dockerfile.local - Uses local packages (thanks @ReStranger!)
🔧 Maintenance
IsActive/EnabledPointer Types - RefactoredIsActiveandEnabledto pointer types with nil-as-default semantics so unset fields no longer collapse tofalse- Streaming Accumulator Raw Request - Moved raw request extraction to final chunk processing in the streaming accumulator
- Provider Capability Matrix - Re-enabled
ContextEditingandContextManagementFieldfor Vertex; disabledTaskBudgetsfor Azure (not documented upstream); addedclaude-4.6-sonnetsupport to Bedrock test account - Schema Normalizer -
NormalizeSchemaForAnthropicRaw(gjson/sjson) avoidsmap[string]interface{}round-trips during Anthropic schema preparation - Auth Middleware Context Keys - Added
IsAPIKeyAuthContextKey(short-circuit when API-key auth already passed) andIsLocalAdminContextKey(bypass RBAC when auth is disabled) - Helm Chart Upgrades - Guardrails Helm chart upgrade; Helm
applystep added; Kubernetes pod-discovery RBAC templates added - Dashboard UI Polish - Popover scrolling, sheets/cluster page indentation, save-button validation, dialog overflow, fixed
ChartCardheights, broaderComboboxSelectadoption (pricing, routing, assignment fields) - Plugin Lifecycle Logging - Log level param on
AppendRoutingEngineLog; trimmed unused dependencies in semanticcache - Test Harness - Test harness for quick checks
- Parallel Model Listing - Parallelize model listing for providers to speed up startup time
Installation
Docker
docker run -p 8080:8080 maximhq/bifrost:v1.5.0Binary Download
npx @maximhq/bifrost --transport-version v1.5.0Docker Images
maximhq/bifrost:v1.5.0- This specific versionmaximhq/bifrost:latest- Latest version (updated with this release)
This release was automatically created with dependencies: core v1.5.8, framework v1.3.8. All plugins have been validated and updated.