Bifrost HTTP Transport Release v2.0.0-prerelease3
✨ Features
- MCP Per-User OAuth - MCP clients can hold per-user OAuth credentials and per-user headers, configurable from
config.jsonas well as the UI, with a documented shared vs per-identity token lookup contract and VK/Users filters on the OAuth Grants and MCP Auth Sessions sidebars - Token Exchange IDP Credentials - New
use_idp_credentialsontoken_exchangereuses SSO login app credentials for providers that require it, such as Microsoft Entra ID;client_idbecomes optional when it is set (#6068, #6069) - Bedrock VPC Endpoints - AWS Bedrock keys can target VPC endpoints (#6064)
- Per-Request Flat-Fee Pricing - New
cost_per_requestfield flows through datasheet sync, the cost engine, custom overrides and the UI override form (#6079) - Pricing Overrides in the Model Catalog -
/api/models/detailsexposes resolved pricing overrides, and catalog rows resolve overrides server-side (#6055, #6056) - MCP Tool Discovery Persistence - Discovered MCP tools persist and resync uniformly across all client types through a hash-gated core callback, surviving restarts and propagating across a cluster
- W3C Trace ID Propagation - Requests carry a W3C trace ID on the context (#5945)
- Cancellable Log Cost Recalculation - Log cost recalculation tasks can be cancelled from the backend (#5801)
- Separate OTEL Metrics Pipeline - The OTEL collector supports a metrics tab independent of traces, plus separate headers for traces and metrics (#5939, #5940)
- Roots-Only Log Filter - New
roots_onlyfilter collapses fallback chains into their root entry with child aggregates (#5737) - MCP Log Redaction and Plugin Logs - MCP tool logs carry redaction mappings and plugin logs (#5744, #5746)
- User Agent and App Attribution in Logs - Logs and MCP tool logs record user agent, app, source, decision, app key and device ID
- S3 Log Export Metadata - Additional metadata is written alongside S3 log exports (#6070)
- Matview Maintenance Off Switch -
matview_refresh_intervalaccepts"off"to disable logstore matview maintenance entirely (thanks @jeremym-tanium!) (#5693) - Video Request Info in Logs UI - Video requests surface their details in the logs UI (#5946)
- Shell Rewriter Hook - The UI handler exposes a
ShellRewriterhook for pre-hydration HTML rewriting (#5807) - Auth Skip Path - Adds a context path letting trusted internal callers bypass auth resolution
-
- Runware passthrough - Adds
runware_passthroughpath for handling passthrough mode for Runware provider
- Runware passthrough - Adds
🐞 Fixed
- Path Normalization Auth Bypass - Fixed a path normalization flaw that allowed auth to be bypassed (#5763)
- Minimal Reasoning Effort on GPT-5 Models -
reasoning_effort: "minimal"is preserved for GPT-5-family OpenAI models instead of being downgraded tolow(thanks @jitokim!) (#6046) - Gemini Truncated Response Finish Reason - Truncated Gemini responses report
MAX_TOKENSinstead ofOTHER(thanks @AdityaPainuli!) (#5979) - Null Tool-Call Function Name on Streaming - Streaming continuation deltas no longer materialize an absent tool-call function name as
null(thanks @AdityaPainuli!) (#5966) - Bedrock Document Uploads - Fixed Bedrock file handling in inference so office and PDF documents sent as OpenAI
type: "file"are accepted (#5947) - xAI Usage Cost - Fixed USD cost ticks for xAI usage (#5950)
- Anthropic Encrypted Reasoning - Added an Anthropic error branch when stripping encrypted reasoning content
- MCP Reconnect and Lock Ordering - Broke a lock-order inversion in
ConnectionCheckerManager, rebuilt ephemeral clients across the whole connect+init retry, preserved last-known tool maps across close-first reconnects, bound connect attempts to entry identity, deduped background reconnects and gated SSEOnConnectionLoston connection identity - MCP OAuth Session Correctness - Restricted
Reauthorizeto shared OAuth clients, rejected inactive tokens inValidateToken, made the OAuth flow claim atomic against concurrent reauth, stopped dropping stored scopes on decode failure, and closed a verify-headers double-submit race that also dropped TLS, timeout and per-user-header fields - Session Stickiness Reconciliation -
needs_session_stickinessis pinned acrossconfig.jsonreconciliation, so an unrelated file edit can no longer silently revert a client to per-call - Credential Cache Cancellation -
headerCredentialCache.FillanduserTokenCache.Fillpropagate context so a cancelled request unblocks instead of waiting on an unrelated leader; LRU entries carry a version so a rejected staleGetcannot evict a concurrently-updated value - Governance List-Models Call - Budgets and rate limits no longer trigger a list-models call (#6051)
- Realtime Response Create Input - Guarded
response.createinput (#6050) - HTTP Server Timeouts - Configured bounded
http.Servertimeouts and a request-body limit - MCP Client State Badges - State badges render with spaces instead of underscores, and the state filter bucket was renamed from
disconnectedtounstable - Entra OBO Scope -
offline_accessis combined with<audience>/.defaultfor Entra OBO instead of replacing it (#6078)
🔧 Maintenance
- Governance Route Families - Editions can override governance route families (#5839)
- Dependency Upgrades - Dependabot updates across all modules, plus module path fixes (#6040, #5864)
- Documentation - config.schema.json doc fixes and Datadog env var reference fixes in the helm chart docs (#5938, #6019)
🗄️ Database Migrations
configstore:
- add_mcp_client_pending_oauth_config_json_column - Adds
pending_oauth_config_jsontoconfig_mcp_clients. Reversible: drops the added column. - merge_oauth_token_tables - Consolidates
oauth_tokensandoauth_user_tokensintomcp_oauth_tokens. Non-reversible: rollback deliberately leavesmcp_oauth_tokensin place, because every OAuth read and write targets it from this migration onward and dropping it would destroy any token created or refreshed since, forcing every holder to re-authorize. - create_mcp_oauth_flows_table - Creates
mcp_oauth_flowsto track in-flight OAuth flows. Reversible: drops the new table. - drop_oauth_config_pkce_columns - Drops CSRF state, PKCE verifier and
expires_atfrom the OAuth config table now that they live onmcp_oauth_flows. Non-reversible: forward-only, the dropped values were per-flow ephemeral and re-adding empty columns would restore nothing. - drop_oauth_config_token_id_column - Drops
token_id. Non-reversible: forward-only, it was a pure FK shortcut now reachable via(oauth_config_id, auth_mode). - add_mcp_admin_auth_mode_indexes - Adds admin partial unique indexes on
mcp_oauth_tokensandmcp_per_user_header_credentials. Reversible: drops both indexes. - add_mcp_client_token_exchange_json_column - Adds
token_exchange_jsontoconfig_mcp_clients. Reversible: drops the added column. - add_needs_session_stickiness_column - Adds
needs_session_stickinesstoconfig_mcp_clients. Reversible: drops the added column. - add_bedrock_endpoints_columns - Adds Bedrock VPC endpoint columns to the keys table. Reversible: drops the added columns.
- add_cost_per_request_pricing_column - Adds
cost_per_requestto model pricing. Reversible: drops the added column.
logstore:
- logs_add_guardrail_debug_column - Adds
guardrail_debugto logs. Reversible: drops the added column. - mcp_tool_logs_add_redaction_mapping_column - Adds the redaction mapping column to MCP tool logs. Non-reversible: rollback is a no-op because dropping the column would permanently destroy reveal data for already-redacted MCP logs.
- logs_add_user_agent_column - Adds user agent and app columns, their indexes, and a
UserAgentMappingtable. Reversible: drops the indexes and the mapping table. - mcp_tool_logs_add_user_agent_column - Adds user agent and app columns plus indexes to MCP tool logs. Reversible: drops both indexes and the
appcolumn. - mcp_tool_logs_add_endpoint_columns - Adds
source,decision,app_keyanddevice_idto MCP tool logs. Reversible: drops all four columns. - mcp_tool_logs_add_plugin_logs_column - Adds
plugin_logsto MCP tool logs. Reversible: drops the added column. - logs_recreate_matviews_with_user_agent_column and logs_recreate_matviews_with_app_column - Recreate the log materialized views to include the new columns. Rollback is a no-op because
ensureMatViewsrecreates them on next startup.
Every logstore migration above alters logs or mcp_tool_logs, the two highest-insert tables in Bifrost, and several also build indexes on them. On a busy instance the index builds hold locks that block concurrent log inserts for the duration of the build, and the matview recreations rebuild against the full table. Schedule the upgrade for a low-traffic period, or expect elevated log-write latency and possible request-path backpressure while the migrations run.
🐙 Closed GitHub Issues
- #123 - Files API Support
- #5472 - [Bug]: Bedrock rejects office/PDF document uploads via OpenAI
type:"file"- "The PDF specified was not valid" - #5900 - [Bug]: Streaming continuation chunks materialize omitted tool-call metadata as null
- #5978 - [Bug]: Gemini egress reports truncated responses as FinishReason OTHER, IncompleteDetails switch matches a string that never occurs
- #6044 - [Bug]: normalizeOpenAIReasoningEffort maps 'minimal' to 'low' for ALL OpenAI models, even ones that natively support 'minimal'
Installation
Docker
docker run -p 8080:8080 maximhq/bifrost:v2.0.0-prerelease3Binary Download
npx @maximhq/bifrost --transport-version v2.0.0-prerelease3Docker Images
maximhq/bifrost:v2.0.0-prerelease3- This specific versionmaximhq/bifrost:latest- Latest version (updated with this release)
This release was automatically created with dependencies: core v1.7.11, framework v1.5.9. All plugins have been validated and updated.