v2.4.0
Changelog
v2.4.0 moves the enterprise gateway onto OSS transports v2.4.0. Relays (governed calls to non-LLM APIs) get enterprise access control: relay grants on access profiles and projects, Relays and RelayLogs RBAC resources, and DAC-scoped Relay Logs. Okta Cross App Access lets AI apps exchange an Okta identity assertion for a Bifrost token that acts as the user. Audit logs record typed events with before/after diffs, sign with rotatable keys, and move to the log store when it can hold them. Admins can view the gateway as any user in read-only mode. The OSS release adds Relays, Warp Topics, the MiniMax, BytePlus and AWS SageMaker providers, and MCP prompts and resources.✨ Features
- Relay Access Control - Access profiles, user and entity profiles, and projects accept
relay_grants, so relays are granted the same way as agents and MCP servers. New RBAC resourcesRelays(Create, View, Update, Delete) andRelayLogs(View, Delete): Admin gets all of them, Developer and Viewer get View. Relay Logs reads and deletes are DAC-scoped like request logs, and fetching a relay’s OpenAPI spec needsRelays:Update. The access profile and project sheets edit relay access, Home shows relays,GET /api/relays/{name}/access-profileslists who holds a relay, and log connectors export relay calls. Docs - Okta Cross App Access (ID-JAG) - An AI app can exchange an Okta identity assertion (ID-JAG) at
/oauth2/tokenfor a Bifrost token that acts as, and is attributed to, the named user. It is set on the Okta SSO provider (crossAppAccess:enabled,accessTokenTtl,provisionUsers) and needs Bifrost’s OAuth server enabled. Clients are managed under User Provisioning (/api/scim/idjag/clients) withmcpandllmscopes; a token with thellmscope works on inference routes as its user. Each assertion can be redeemed once, and disabling or rescoping a client refuses its tokens at once on every node. Docs - Audit Log Events and Diffs - Audit rows now name what happened (for example
virtual_key.updated,user.access_profiles_removed,auth.login) and store a before/after diff, shown in the detail view. Rows carry the request ID, session ID, auth method and on-behalf-of user, and return a severity. Routine reads are skipped, and test or preview calls are recorded as reads. New events cover agent sign-in, refresh and sign-out, background jobs, identity sync, identity-driven team and business unit changes, and node startup. Docs - Audit Signature v2 and Key Rotation - v2 signatures cover every stored field instead of seven, in the format
v2:<key id>:<hex>.audit_logs.hmac_keyswithactive_key_idlets you rotate keys while older keys keep verifying their rows, and v1 rows still verify. With no key configured, Bifrost now generates one shared key, stored encrypted in the config store, instead of a random key per node per boot that never verified after a restart. Docs - Audit Events in the Log Store - When the log store can hold them, new audit events go to its
enterprise_audit_eventstable. The config store’s table becomes a read-only Legacy view in the Audit Logs page, and retention and archival still apply to it. - View as User - Admins with the new
Users:ViewAspermission (granted to Admin by migration) can open the gateway as a chosen user, in a new tab, to check what that user sees. RBAC, DAC scope and/meresolve as that user. Only GET, HEAD and OPTIONS pass; writes and API-key callers get 403. Starting a view writes auser.view_as_startedaudit row. - First-Match Access Profile Resolution - SSO providers accept
accessProfileResolutionStrategy.all(default) grants every matching attribute rule, as before.ordergrants only the first matching rule, and each rule can grant one or more access profiles. Underorder, a SCIM push also removes the login’s attribute grant. The SSO mapping editor has the option. Docs - Skip User Virtual Key Creation and Deletion - Two client settings,
skip_access_profile_user_virtual_key_creationandskip_access_profile_user_virtual_key_deletion, stop an access profile from creating a user’s first virtual key, or from deleting the user’s keys when the last profile goes. Existing keys are still adopted and governed while the user holds a profile. Docs - Per-Project Content Logging - Projects have a content-logging setting that overrides the virtual key’s, set from the project sheet. Docs
- Guardrail Updates - Docs
- Prompt guardrails can use a decision model, and the rule is phrased as a yes/no question.
- New per-rule
profileExecutionMode.chainedruns profiles in order, and each one sees the payload as the earlier profiles redacted it, so a local PII redactor can run before an external check.independent(default) keeps the current behaviour. - Lakera requests accept configurable metadata headers.
- The CEL rule builder has a business unit condition.
- Background output-monitor checks emit their own trace span. Gray Swan observe-mode and below-threshold results, and outcome-specific Bedrock assessments, are recorded as detections.
- Edge Server Support - Docs
- Admins can let users pick their own Cursor default model and Antigravity CLI helper model, optionally from a fixed list (
app_setting_policiesonPUT /api/edge/config). Choices are stored per user and served through/api/agent/app-settings. - Model picker lists: a global list plus per-app overrides set the models each app’s picker shows, in order.
append_remainingshows the rest of the catalog after them. Edge settings can suggest the newest models per provider from the model catalog. - Edge can sign in with a virtual key alone (fleet switch
virtual_key_auth_disabled). A virtual key never creates a user session. - Edge sign-in uses proof-bound (DPoP, RFC 9449) refresh tokens. Old and new Edge clients and gateways work together during a rolling upgrade.
- OpenCode can be turned on or off for capture like the other apps, and the Edge settings pages are reorganized.
- Admins can let users pick their own Cursor default model and Antigravity CLI helper model, optionally from a fixed list (
- Codex Users Identified by Gateway Cookie - On
/chatgpt_passthrough, the user is identified by Codex’sauth-openidgateway cookie or a virtual key, and the ChatGPT token is forwarded unchanged. The cookie is never sent upstream. A ChatGPT token withx-bf-vknow passes under every dual-credential setting. - Stored IdP Sign-In for Token Exchange - MCP token exchange refreshes and uses the user’s stored identity provider sign-in, and Edge sessions are recorded for it. Token exchanges go only to the identity provider’s hosts, and the authorization server URL is checked when the MCP client is saved.
- Cluster Sync for MCP Prompts and Resources - Discovered MCP prompts and resources and their
prompts_to_expose/resources_to_exposeallow-lists sync across enterprise nodes. - Warp Topics Scoped by DAC - Warp topic reads follow the caller’s data access scope. Docs
- Image Provenance and SBOM - Every pushed enterprise image has SLSA provenance and an SBOM attached.
🌎 Open Source Features
- Relays - New relays call non-LLM APIs (Tavily, AWS Textract, Azure Speech and others) through
/relay/{name}/{path}with one stored credential, per-route pricing and usage mapping, and streaming. Virtual keys getrelay_grants, and relay calls are charged to the caller’s virtual key, team and customer budgets. Relay Logs record metadata, route-matched headers and (with content logging on) streamed response bodies. Routes can be imported from an OpenAPI document. Relays sync from config.json. Docs - Warp Topics - Warp groups logged requests into topics and broader themes, files each request under a topic as it is indexed, discovers new topics from unmatched requests, and counts topics over a time window with trends and metrics. Logs can be filtered by topic. Docs
- MiniMax Provider - New
minimaxprovider for chat completions, Responses, image generation, async video generation, text-to-speech and speech-to-text, withthinkingpassthrough. Docs - BytePlus Provider - New
byteplusprovider for BytePlus ModelArk: Seed chat completions, the native Responses API, embeddings, Seedream image generation and editing, and async Seedance video generation. Docs - AWS SageMaker Provider - New
sagemakerprovider for real-time endpoints. Chat goes through SageMaker’s OpenAI-compatible route (vLLM, SGLang, LMI, llama.cpp containers), and/sagemaker_passthroughforwards rawInvokeEndpointandInvokeEndpointWithResponseStreamcalls. - Azure Speech and Live APIs - Azure keys reach Azure AI Speech for SSML text-to-speech and fast transcription (
use_speech_endpoints), Azure Voice Live realtime sessions (use_voice_live_endpoints), and GPT Live. A new/azureroute group lets Azure AI Speech clients and the Azure OpenAI SDK use Bifrost as their Azure resource. - Bedrock Nova Sonic Realtime - Amazon Nova Sonic speech-to-speech on the OpenAI Realtime-compatible surface, translated onto Bedrock’s signed HTTP/2 event stream.
- MCP Prompts and Resources - Bifrost discovers the prompts, resources and resource templates an upstream MCP server offers and serves them on
/mcp, withcompletion/complete. Each server getsprompts_to_exposeandresources_to_exposeallow-lists, narrowed by virtual keys and Virtual MCPs like tools. - MCP Protocol 2026-07-28 - mcp-go moves to v1.3.0. A global and per-server max protocol version setting caps what Bifrost offers upstream. Tool results keep images, audio and structured content, and tool output schemas, titles, icons and annotations reach clients.
The MCP gateway now validates
Originas the Streamable HTTP spec requires. Browser requests to/mcpfrom an origin that is not allowed get a403. Requests with noOriginheader (CLIs, SDKs, server-side clients) are unaffected. - MCP OAuth CIMD and Issuer Binding - Upstream MCP OAuth publishes a Client ID Metadata Document at
/api/oauth/client-metadata.jsonand registers with it. Each MCP client’s credentials are bound to the authorization server that issued them (RFC 8414, RFC 9207). The OAuth issuer URL is editable under Settings > Security. - Native Decisions on More Providers -
/v1/decisionsruns natively on vLLM, SGLang, Databricks System One and Azure gpt-6-luna. OpenAI decisions accept conversation items, JSON parts and prompt caching. - GitHub Copilot Token Auth - GitHub Copilot keys take a fine-grained PAT or a GitHub OAuth token in
value, and the UI signs in with GitHub through the device flow. Claude models go to Copilot’s native/v1/messages, OpenAI models to/responses. Docs - Passthrough Route Allowlist - Each provider has a passthrough route policy that controls which routes
/openai_passthrough,/anthropic_passthrough,/azure_passthrough,/genai_passthroughand the other passthrough endpoints forward. - Codex with ChatGPT Sign-In -
/chatgpt_passthroughforwardsGET /backend-api/codex/models, so Codex signed in with ChatGPT runs through Bifrost with the virtual key inx-bf-vk. Each responses turn is still checked against the key. - Vertex OpenAI-Format Endpoints - A Vertex alias can point at a custom Vertex endpoint (vLLM or another container) that accepts OpenAI chat completions, through
vertex_endpointwithraw_predictorpredict. - Azure Blob Storage - Log payload and skills-file storage on Azure Blob with default Azure identity or connection-string authentication, JSON/gzip and Parquet.
- Log CSV Export - The Logs page exports the filtered logs to CSV.
- Fallback Chain in Log Details - Log details show a banner and timeline for the fallback chain a request went through.
- Hide the Setup Checklist - A new
disable_onboardingflag hides the setup checklist on stateless and provider-less deployments. - Developer Role and Mid-Conversation System Messages - Models whose datasheet row sets
supports_developer_roleto false get developer messages assystem, and later system messages are folded in for models that reject them. - Gemini 4 Thinking Level and Continuation - A thinking budget sent to Gemini 4 models becomes
thinkingLevel(up to 1024 islow, up to 8192 ismedium, larger ishigh). Hops that end withfinishReason: CONTINUATIONcarry theircontinuationToken. - Provider Additions - Fireworks Responses honours
disable_store./v1/models?provider=databrickslists the key’s configured models and aliases.stricton a tool reaches ConversetoolSpec.strictfor Claude on Bedrock. The model catalog keeps each model’s creation time. - Platform Hooks - Plugins can carry opted-in HTTP metadata into native realtime turns.
HoldTraceFlushdelays trace export until background writers finish, andSetSpanStartTimegives late-opened spans their real duration. The ClickHouse log store gets the user agent mappings table.
⚙️ Upgrade Notes
- GitHub Copilot App mode removed - Replace App-based GitHub Copilot keys with a PAT or OAuth token before upgrading; see the Warning above.
- MCP gateway checks
Origin- Browser requests to/mcpfrom an origin that is not allowed get403. - Audit log export needs
AuditLogs:Download- Roles that exported audit logs with only View need this permission. - Adopted keys lose their own grants - When an access profile adopts a virtual key, the key’s own agent grants, Virtual MCP assignments and relay grants are removed, and
allow_all_providersis cleared. Migrations apply this to keys adopted before the upgrade, so a key that outlives its profile does not regain access the profile never gave. - Audit storage moves - When the log store can hold audit events, new events are written there and the old config-store rows are shown as a Legacy view.
🐞 Fixed
- Startup on Unknown Grants - A virtual key in config.json whose
agent_grantsorrelay_grantsnames an agent or relay that is not stored is created with a warning instead of stopping startup. - Token Expiry Clock Skew - Token expiry tolerates clock skew, and an expired bearer gets an RFC 6750 challenge.
- JWT Validation Cache Race - Callers no longer get the cache’s shared claims map, which they could change.
- Dashboard Cookie Sessions - Cookie sessions exchange the stored sign-in instead of the cookie’s token.
- User-Mode MCP Consent - User-mode MCP consent is refused for API-key requests.
- VK Temporary Token Flow - Per-user headers are whitelisted so the virtual key temporary token flow completes.
- Azure Subscription Key - The middleware accepts
Ocp-Apim-Subscription-Key. - Refusals Charged to Keys - Keys are no longer charged for caller-fault refusals that core retries with the reasoning token stripped.
- Budget Alerts with Extensions - Budget alerts account for budget extensions.
- Access Profile Budget Overrides - Budget overrides apply to the target user, not the profile template.
- Budget Requests List - The list cache is keyed by caller, so one user’s list is never served to another.
- Batched Virtual Key Reload - Virtual MCP assignments converge in memory after a batched reload.
- Entity-Owned Keys - Keys owned by a governed team, business unit or customer are managed like any entity key, and governed key fields match case-insensitively.
- Business Unit Key Attribution - Requests with a business unit’s key are attributed to the unit and its customers.
- SCIM Group Pushes - Removals apply by ID, and additions apply only while a rule maps the target. Business unit membership sync now matches teams on removal, resolve failure and manual assign.
- Customer Team Count - The team count covers only teams the caller can see.
- Relay Deletion - A deleted relay is removed from every in-memory holder at once, and
relay_logscounts as a logs-store table. - RBAC Routes -
/api/rssmaps to Notifications, with writes gated on Settings update. UI action gates match the permissions the API checks, and RBAC-dependent queries are skipped when not allowed. - Audit Attribution and Verification - SSO logouts are attributed to the session user, anonymous password-logout rows are skipped, and agent sign-out rows name the user. Legacy v1 signatures verify across time zones and when the database dropped nanoseconds, and a mismatch is explained.
- Home Budgets - Profile budget burn is measured on the user’s total spend, access profile budgets are pooled in the overview, and My Access lists MCP servers and agents allowed by default.
- Org Chart Performance - Org chart log reads are batched and bounded by the gateway timeout.
- Guardrail Sampling - Rule sampling is an independent random draw per request instead of a cluster-synced counter.
- Guardrail Spans and Overhead - Monitor-mode checks are left out of request overhead, span timings are set directly, and a stream gets one output span instead of one per chunk.
- Guardrail Output Rules - Stale output rules are cleared across fallbacks and nested MCP calls, and Bedrock camelCase usage is decoded.
- Guardrail Media Prompts - Video, speech and transcription prompts are extracted and redacted instead of sending raw audio.
- Guardrail Config Validation - Rule and config validation is stricter, secrets are redacted, and rule writes are atomic.
- Guardrail CEL Values - Numeric-looking header, substring and identity values are quoted, and incomplete conditions are omitted.
- Guardrail Judge Fields - Judge provider and model are no longer flagged as required when the judge type is toggled.
- Cross App Access Card - The card follows the provider save and fits its table.
- OSS: Anthropic and Bedrock - Sonnet 5.5 passthrough keeps reasoning and sampling settings,
message_deltakeeps itsdelta, web search on Chat Completions no longer leaks an orphantool_callsdelta, advisor passes are billed, Bedrock connection failures return a retryable502, tool-use streams end withstop_reason: tool_use, and prompt caching holds across tool turns. - OSS: Gemini Tool-Call IDs - Gemini and Vertex receive the tool-call ID they issued instead of a ~500-character ID.
- OSS: OpenAI-Compatible Streams -
extra_content-only chunks are forwarded, nativeweb_search_callreplay keepsidandstatus, andinput_imagein tool outputs gets a defaultdetail. - OSS: Responses WebSocket and Realtime - Responses WebSocket accepts
response.interruptand stays on one key; an audio commit no longer blocks the nextresponse.create. - OSS: List Models - Paginated providers are no longer cut off in aggregate listings, and
/anthropic/v1/modelsincludesmax_input_tokens. - OSS: Pricing - Datasheet sync stores one deterministic price for shared Bedrock model names, image models over chat are priced from their image row, and compat keeps sampling params on rows without
model_parameters. - OSS: MCP OAuth and Sessions - Protected resource metadata must match the server URL, abandoned installs are swept, expired tokens without refresh are marked
needs_reauth, and404means a dead session only on revisions with sessions. - OSS: Platform - Held streams commit as soon as output starts, materialized view refreshes stop with their pod, config reload keeps the runtime classifier,
framework/logstorebuilds without cgo, and thenpxlauncher verifies the binary checksum. - OSS: UI - The providers page shows a load error instead of onboarding, and the date range picker uses the active timezone.
🗄️ Database Migrations
Enterprise
- ent_add_users_view_as_permission - Adds the
Users:ViewAspermission and grants it to Admin. Rollback is a no-op, so the grant stays. - ent_add_relay_rbac_resources - Seeds the
RelaysandRelayLogsRBAC resources and their role permissions. Rollback is a no-op. - ent_add_relay_grants - Creates
enterprise_access_profile_relay_grants,enterprise_user_access_profile_relay_grants,enterprise_entity_access_profile_relay_grantsandenterprise_project_relay_grants, with cascading foreign keys. Reversible: rollback drops the four tables. - ent_strip_adopted_vk_own_relay_access - Deletes relay grants from virtual keys that an access profile has adopted. Non-reversible.
- ent_clear_adopted_user_vk_allow_all_providers - Sets
allow_all_providersto false on user keys adopted by an access profile. Non-reversible: which keys had the flag is not recorded. - ent_strip_adopted_vk_own_agent_and_virtual_mcp_access - Deletes agent grants and Virtual MCP assignments from adopted keys, and clears
allow_all_providerson keys governed by an entity’s access profile. Non-reversible. - ent_add_idjag_clients_table - Creates
enterprise_idjag_clientsfor Cross App Access clients. Reversible: rollback drops the table. - ent_add_idjag_redemptions_table - Creates
enterprise_idjag_redemptionsfor single-use assertions. Reversible: rollback drops the table. - ent_add_agent_dpop - Adds
dpop_thumbprintto agent auth codes,dpop_thumbprint,client_idandrefresh_modeto agent sessions, and createsenterprise_agent_dpop_proofs. Non-reversible: dropping them could make bound sessions eligible for legacy refresh. - ent_add_user_app_settings_table - Creates
enterprise_user_app_settings(one row per user and setting). Reversible: rollback drops the table. - ent_add_project_disable_content_logging_column - Adds
disable_content_loggingtoenterprise_projects. Reversible: rollback drops the column. - ent_add_guardrail_rule_profile_execution_mode_column - Adds
profile_execution_modetoenterprise_guardrail_rules. Reversible: rollback drops the column. - ent_add_audit_log_actor_context_columns - Adds
request_id,session_id,auth_methodandon_behalf_of_idtoenterprise_audit_logs. Non-reversible. - ent_add_audit_log_event_name_columns - Adds
event_nameandchangestoenterprise_audit_logs. Reversible: rollback drops both columns. - ent_add_audit_settings_state_table - Creates
enterprise_audit_settings_state. Non-reversible. - ent_widen_audit_log_signature_column - Widens
enterprise_audit_logs.signaturetovarchar(160)for v2 signatures. Non-reversible: v2 signatures do not fit the old width. - ent_add_audit_log_request_id_index - Builds
idx_audit_request_idonenterprise_audit_logsconcurrently, in the background after startup. Reversible: rollback drops the index. - ent_add_audit_log_event_name_index - Builds
idx_audit_event_name_timeonenterprise_audit_logsconcurrently, in the background after startup. Reversible: rollback drops the index. - ent_logs_add_audit_events_table (log store) - Creates
enterprise_audit_events(also in ClickHouse). Reversible: rollback drops the table.
Open Source
- add_client_config_skip_access_profile_user_virtual_key_lifecycle_columns - Adds two client config columns that control access-profile user virtual key creation and deletion. Reversible: rolls back by dropping both columns.
- add_passthrough_json_column - Adds the per-provider passthrough route allowlist. Non-reversible: dropping it would delete every provider’s passthrough allowlist.
- add_warp_topic_discovery_min_requests_column - Adds the Warp topic discovery threshold. Reversible: without the column discovery runs at the default.
- add_azure_use_speech_endpoints_column - Adds the Azure key
use_speech_endpointsflag. Reversible: rolls back by dropping the column. - add_azure_use_voice_live_endpoints_column - Adds the Azure key
use_voice_live_endpointsflag. Reversible: rolls back by dropping the column. - add_sagemaker_key_columns - Adds the SageMaker key config columns. Reversible: rolls back by dropping the columns.
- widen_oauth2_client_id_columns - Widens OAuth
client_idcolumns beyondvarchar(255)for CIMD URLs. Non-reversible: longer client IDs may already be stored. - add_oauth2_refresh_token_client_display_name_column - Adds a client display name to OAuth refresh tokens. Reversible: rolls back by dropping the column.
- add_mcp_max_protocol_version_columns - Adds the global and per-server MCP protocol cap. Non-reversible: dropping the columns would delete every configured cap.
- add_mcp_client_discovered_resources_prompts_columns - Stores discovered MCP resources, resource templates and prompts. Reversible: rolls back by dropping the columns.
- add_mcp_client_expose_lists_columns - Adds
prompts_to_exposeandresources_to_expose. Non-reversible: dropping the allow-lists would expose every prompt and resource they restrict. - add_oauth_issuer_binding_columns - Binds MCP OAuth credentials to their issuing authorization server. Reversible: rolls back by dropping the columns.
- add_mcp_client_discovered_tool_details_column - Stores discovered MCP tool titles, icons and output schemas. Reversible: rolls back by dropping the column.
- add_relays_tables - Creates the relay, route and virtual key grant tables. Non-reversible: dropping them would delete relay endpoints, their credentials and virtual key grants.
- add_video_token_pricing_column - Adds
output_cost_per_video_token. Non-reversible: dropping it would delete custom per-token video prices and bill token-metered video at $0. - add_voice_live_pricing_columns - Adds Azure Voice Live pricing columns. Non-reversible: dropping them would delete every Voice Live rate an operator set.
- logs_add_warp_topic_tables - Creates the Warp topic, assignment and unmatched tables in the log store. Non-reversible once populated: topics outlive the requests they were built from and cannot be rebuilt from the logs.
- logs_add_warp_vector_deletes_table - Creates the pending vector deletes table. Non-reversible while it holds rows: they list deleted logs whose vectors are still in the vector store.
- mcp_tool_logs_add_method_column - Adds
methodto MCP tool logs for prompt and resource reads. Reversible: rolls back by dropping the column. - add_relay_logs_table - Creates the relay logs table (also created in ClickHouse). Non-reversible: it holds recorded call history and charges.
🐙 Closed OSS Issues
- #5649 - defaultImageDetail fix (#5352) doesn’t cover images inside function_call_output (tool results), Responses API to self-host vLLM still fails
- #7189 - Realtime audio commit blocks subsequent response.create with active-response error
- #7319 - /anthropic/v1/models omits max_input_tokens - integration list-models route never enriches from the model catalog
- #7655 - Anthropic web search on /v1/chat/completions leaks the search query as an orphan tool_calls delta and drops citations
- #8152 - Allow setup checklist to be dismissed persistently on stateless / provider-less deployments
- #8268 - Providers page shows the “no providers configured” onboarding screen when the providers request fails
- #8382 - Bifrost 2.2.6 strips web_search_call.status from Responses history, breaking Codex replay
- #8489 - Datasheet sync stores a random price when bedrock and bedrock_mantle rows share a model name
- #8546 - Gemini/Vertex receives the full
_ts_-embedded call id asfunctionCall.id, so the model sees (and copies) ~500-char ids - #8547 - Abandoned shared OAuth MCP installs leave oauth_configs rows pending forever
- #8549 - thinking blocks bridged from Chat Completions reasoning_content get a synthetic brid_ signature
- #8550 - Bedrock invoke-with-response-stream reports
stop_reason: "end_turn"for tool-use turns - #8594 - Export filtered logs to CSV from the Logs page
- #8759 - GET /v1/models omits models from a paginated provider in aggregate listings
- #8765 - Bedrock datasheet rows without model_parameters make compat drop all sampling params and substitute the model default max_tokens
- #8801 - Bedrock: a tool message with one text block renders as text, but the same content as a string renders as json, which breaks prompt caching across turns
- #8824 - framework/logstore no longer builds with CGO_ENABLED=0
- #8934 - OpenAI-compatible chat streams drop chunks whose delta carries only extra_content
- #8963 - Bedrock stream dropped mid-response reaches Anthropic clients as invalid_request_error
- #8970 - Bedrock returns HTTP 400 when it can’t connect to the provider
📀 Base OSS version
transports/v2.4.0
