What's Changed
- [fix]: Anthropic provider - keep web search server-side on chat completions by @brianhadley2026 in #7656
- main backmerge by @akshaydeo in #8771
- fix(core): bound each list-models page, not the whole walk, in ListAllModels by @akshaydeo in #8767
- docs: add Azure Key Vault and Kubernetes auth to secret management guides by @BearTS in #8562
- dependabot fixes by @akshaydeo in #8777
- feat(ui): shared decision-model picker for prompt guardrails by @kohlivrinda in #8487
- [StepSecurity] Apply security best practices by @stepsecurity-app[bot] in #7045
- fix(bedrock): render a one-text-block tool result like its string form by @akshaydeo in #8803
- ci: hold outside-contributor pull request workflows for bifrost-admin approval by @akshaydeo in #8868
- ci: hold outside-contributor pull request workflows for bifrost-admin approval (main) by @akshaydeo in #8869
- feat(core): add MiniMax provider for chat, image and video generation by @impoiler in #8622
- feat(ui): expose MiniMax in the config schema and provider UI by @impoiler in #8623
- docs: document the MiniMax provider by @impoiler in #8624
- test(e2e): add MiniMax to CI and the provider harness by @impoiler in #8625
- feat(core): add MiniMax text-to-speech and speech-to-text by @impoiler in #8636
- fix(minimax): close provider onboarding gaps by @impoiler in #8651
- feat(core): add BytePlus ModelArk provider for chat, responses and embeddings by @impoiler in #8652
- feat(core): add BytePlus Seedream image and Seedance video generation by @impoiler in #8653
- feat(ui): expose BytePlus in the config schema and provider UI by @impoiler in #8654
- docs: document the BytePlus provider by @impoiler in #8655
- test(e2e): add BytePlus to CI and the provider harness by @impoiler in #8656
- feat(core): stream BytePlus Seedream images and pass Seedance task options through by @impoiler in #8739
- fix(ui): apply active timezone to date range picker calendar by @impoiler in #8872
- fix(ui): redesign MCP registry OAuth callback page and update cluster settings icon by @impoiler in #8874
- fix(ui): allow clearing default cache key and vector store namespace by @impoiler in #8871
- feat(logstore): add user agent mappings to ClickHouse log store by @impoiler in #8876
- refactor: replace github copilot app auth with pat and oauth token support by @sammaji in #8661
- feat: route github copilot claude models to /v1/messages and add native responses and embeddings by @sammaji in #8677
- feat: add github copilot device-flow sign-in endpoints by @sammaji in #8678
- feat: replace ui github app credentials with sign in with github for copilot keys by @sammaji in #8662
- test: add github-copilot e2e coverage for sign-in flow and provider filtering by @sammaji in #8663
- docs: update github copilot docs and openapi schema by @sammaji in #8664
- fix: adjust provider icon spacing and alignment by @sammaji in #8870
- [fix]: show a load error on the providers page by @hmdsefi in #8280
- fix(governance): govern known users without a presented credential in PreA2AHook by @Pratham-Mishra04 in #8856
- feat(mcp/oauth): exchange the user's stored sign-in for token exchange when a request carries no identity token by @Pratham-Mishra04 in #8857
- feat(mcp/oauth2): verify token-exchange clients using the admin's stored sign-in when the request carries no token by @Pratham-Mishra04 in #8858
- fix(mcp): refresh rejected credentials in the background when an auth retry is skipped by @Pratham-Mishra04 in #8859
- docs(mcp): document token exchange using the caller's Bifrost sign-in by @Pratham-Mishra04 in #8894
- feat: add disable_onboarding flag to hide setup checklist on stateless deployments by @impoiler in #8885
- fix: adds signature fallback to websockets flow by @akshaydeo in #8863
- adds websockted encrypted content retry by @akshaydeo in #8893
- [feat]: Export filtered logs to CSV from the Logs page by @Shashank2985 in #8611
- feat: propagate opted-in metadata to realtime and Live units by @danpiths in #8903
- fix(databricks): send reasoning_effort as output_config.effort on adaptive-only Claude by @impoiler in #8908
- fix: correct turn lifecycles, logs, and upstream errors by @danpiths in #8904
- fix(databricks): send the output ceiling as max_tokens by @impoiler in #8910
- fix: logstore builds without cgo again by @jeremym-tanium in #8825
- ci: label pull requests by area from changed paths by @akshaydeo in #8781
- [fix]: OpenAI provider - forward stream chunks whose delta carries only extra_content by @Javtor in #8935
- Stop compat from stripping sampling params on datasheet rows without model_parameters by @ege-arhan in #8782
- feat(tracing): add HoldTraceFlush to delay trace export until background writers finish by @Madhuvod in #8764
- fix(routing): skip complexity classification when other rule conditions already decide the outcome by @Madhuvod in #8875
- fix(decisions): leave unprefixed models for routing instead of pinning to OpenAI or Typesafe by @Madhuvod in #8913
- feat(ui): add assigned user email column to virtual keys CSV export by @impoiler in #8945
- feat(helm): add configurable PodDisruptionBudget for cluster mode by @CarlosLanderas in #8911
- perf(logstore): add one-pass usage reads for per-entity rollups by @impoiler in #8747
- feat(warp topics):topic labelling by @kohlivrinda in #7695
- fix(ui): correct STDIO Docker notice to say the official image lacks runtimes by @Pratham-Mishra04 in #8930
- feat(warp topics): topics e2e tests by @kohlivrinda in #7700
- feat(governance): add per-project content logging override that takes precedence over the virtual key by @Pratham-Mishra04 in #8931
- docs(governance): document per-project content logging override by @Pratham-Mishra04 in #8932
- fix: normalize github copilot provider name in datasheet pricing by @sammaji in #8946
- feat: provider level passthrough routes allow list by @TejasGhatte in #8798
- feat: support openai format custom deployments on vertex by @TejasGhatte in #8736
- feat(ui): let owner-governed virtual keys stay editable and confirm assigning owned keys to Virtual MCPs by @BearTS in #8805
- feat(audit): record entity changes from management handlers by @impoiler in #8532
- docs(audit): document event names, diffs, system events and signing keys by @impoiler in #8534
- feat(warp topics):add clustering tables by @kohlivrinda in #8096
- feat(warp topics): write topics to the log store by @kohlivrinda in #8390
- feat(warp topics): file requests under topics as they are indexed by @kohlivrinda in #8391
- feat(warp topics): discover topics from the pool and keep them in shape by @kohlivrinda in #8392
- feat(warp topics): count topics over a window with trends, metrics and scoped reads by @kohlivrinda in #8393
- feat(warp topics): filter logs by topic and link topics to their requests by @kohlivrinda in #8394
- feat(warp topics): group topics into themes by @kohlivrinda in #8395
- feat(warp topics): embed what the person asked, not the agent's reminders by @kohlivrinda in #8396
- feat(warp): prunde dead topic rows and forget deleted logs by @kohlivrinda in #8457
- feat(warp topics): updated ux by @kohlivrinda in #8591
- feat(warp): add config.json support by @kohlivrinda in #8790
- feat(warp):move to responses streaming by @kohlivrinda in #8791
- feat(decisions): add native gpt-6-luna decision support to the Azure provider by @Madhuvod in #8973
- fix: openai ws response.interrupt event by @TejasGhatte in #8743
- fix: gemini continuation token by @TejasGhatte in #8779
- docs(enterprise): document audit log storage move to log store and legacy view by @impoiler in #8965
- fix: openrouter image gen response by @TejasGhatte in #8851
- fix: mid conv tools by @TejasGhatte in #8852
- fix: update display type thinking by @TejasGhatte in #8942
- feat: client settings to skip access-profile user virtual key creation and deletion by @BearTS in #8719
- fix(ui): skip RBAC-dependent queries the signed-in user cannot read by @BearTS in #8862
- feat(helm): add access profile virtual key skip options and Okta syncAllUsers (v2.1.46) by @BearTS in #8720
- fix(deps): resolve open dependabot alerts by @akshaydeo in #8986
- [fix]: Bedrock provider - report a failed connection as a 502 from upstream by @dinhxuanvu in #8971
- [fix]: Bedrock provider - report a mid-stream connection drop as a 502 from upstream by @dinhxuanvu in #8964
- [fix]: Bedrock provider - report tool_use stop_reason on invoke-with-response-stream by @pcbeingused333 in #8633
- fix(anthropic): omit synthetic signature on bridged reasoning blocks by @rxchitrx in #8701
- fixes bedrock response convertor for automatic cache control (#8573) by @akshaydeo in #8597
- fix(bedrock): forward tool strict to Converse toolSpec.strict for Claude by @akshaydeo in #8977
- fix: commit held streams as soon as the upstream produces output by @akshaydeo in #8933
- [fix]: Gemini - send the provider the tool-call id it issued, not the signature-joined one by @Vivek1898 in #8565
- config: keep the runtime classifier on reload and serialize SQLite client-config writes by @akshaydeo in #7940
- fix orphan matview refreshes by @akshaydeo in #8826
- feat(decisions): add native System One (OpenJev) decision support to the Databricks provider by @Madhuvod in #8979
- feat(warp): topics fixes by @kohlivrinda in #8992
- feat(warp topics): add pending-deletes table by @kohlivrinda in #8998
- feat(ui): add view-as user mode to topbar with CORS support for X-Bifrost-View-As header by @impoiler in #8918
- fix(mcp): propagate header credential cache evictions to other processes after writes by @Pratham-Mishra04 in #8996
- fix(mcp/oauth2): propagate token cache evictions to other processes after provider token writes by @Pratham-Mishra04 in #8997
- feat(ui): show fallback chain banner and timeline in log details by @impoiler in #8941
- fix(databricks): keep key aliases unprefixed when a virtual key load balances them by @impoiler in #9039
- fix(models): backfill aliases allowed only by regex entries in list models by @Pratham-Mishra04 in #8987
- fix(vertex): list Model Garden catalog for OAuth keys with deployments or allowlists by @Pratham-Mishra04 in #8988
- feat(oauth2): add extension hooks for custom grant types, discovery metadata, and token validation by @BearTS in #8953
- feat(mcp): Cross App Access (id_jag) profile for token exchange by @BearTS in #8959
- feat(ui): configure the Cross App Access token-exchange profile by @BearTS in #8960
- feat(ui): edit the OAuth issuer URL under Settings > Security by @BearTS in #8993
- improved github workflows by @akshaydeo in #9015
- release approver by @akshaydeo in #9016
- [feat]: add optional browser login to CLI auth print-token by @CallumWayve in #8671
- dependabot fixes by @akshaydeo in #9073
- feat: add terraform module for vLLM, SGLang and Ollama on runpod by @sammaji in #7175
- feat: add native decision support for vllm and sgl providers by @sammaji in #8974
- docs: document native decisions support for vllm and sglang providers by @sammaji in #8975
- fix: closes realtime client socket when upstream ends by @sammaji in #8629
- feat: adds realtime connector for non-websocket providers by @sammaji in #8630
- feat: adds openai realtime translator for bedrock nova sonic by @sammaji in #8631
- fix: send developer messages as system and fold mid conversation system messages by @sammaji in #8884
- feat: add nova sonic realtime support to bedrock provider by @sammaji in #8588
- feat: support disable_store for fireworks responses requests by @sammaji in #8883
- test: add realtime api e2e suite for openai, azure, and bedrock nova sonic by @sammaji in #8632
- chore: add bedrock nova sonic realtime documentation by @sammaji in #8589
- chore: add harness cases for developer role and mid-conversation system message handling by @sammaji in #9028
- [feat]: Add Azure Blob Storage support by @CallumWayve in #9053
- fix(oauth2): match protected resource metadata to the server url by @akshaydeo in #9007
- fix(governance): check models named in server tools by @akshaydeo in #9008
- fix(anthropic): bill advisor iterations by @akshaydeo in #9009
- fix(npx): verify downloaded gateway binary checksum by @akshaydeo in #9010
- fix(warp topics): labels and merges by @kohlivrinda in #9077
- refactor(warp topics): run upkeep as a job in the topics partition by @kohlivrinda in #9137
- test(warp): skip internal filter fields and stub vector-delete retry in upkeep test by @kohlivrinda in #9138
- feat: azure native stt and tts by @TejasGhatte in #8916
- fix: whisper models cost in json forma by @TejasGhatte in #8917
- feat(decisions): support conversation items, JSON parts, and prompt caching in OpenAI decisions by @Madhuvod in #9155
- fix: use speech endpoints field in azure key by @TejasGhatte in #9032
- feat: azure voice live api by @TejasGhatte in #9033
- feat: azure integration routes by @TejasGhatte in #9034
- feat: gpt live api for azure by @TejasGhatte in #9054
- fix: align bedrock nova sonic realtime handling with live api behavior by @sammaji in #9175
- feat(chatgpt-passthrough): support Codex ChatGPT sign-in model list and skip stored OpenAI key by @impoiler in #9074
- docs(codex): document enterprise gateway OAuth sign-in through the identity provider by @impoiler in #9136
- fix(passthrough): record served service tier in logs by @impoiler in #9187
- feat: add terraform module for SageMaker on AWS by @sammaji in #8952
- feat: add aws sagemaker provider by @sammaji in #9002
- feat: add sagemaker passthrough for InvokeEndpoint and response streaming by @sammaji in #9037
- chore: add sagemaker provider config to helm chart and config schemas by @sammaji in #9003
- docs: add sagemaker provider key config to openapi schema and e2e tests by @sammaji in #9004
- feat(helm): expose PostgreSQL tuning and PVC attributes by @CarlosLanderas in #9186
- fix(ui): tidy logs header menu and hidden-content error text by @impoiler in #9195
- feat(warp): helm updates by @kohlivrinda in #9179
- fix: sweep abandoned oauth_configs rows from never-completed MCP OAuth installs by @impoiler in #8887
- test(warp): fix unit test by @kohlivrinda in #9191
- fix: delta in responses stream event by @TejasGhatte in #9161
- fix: regex pattern model capability drop by @TejasGhatte in #9193
- chore: update mcp-go to v1.3.0 to support newer protocols by @roroghost17 in #9058
- adds created at field in model catalog by @akshaydeo in #9190
- fix: remove endpoint checks for deployments by @TejasGhatte in #9199
- refactor: move MCP initialization handling to mcp-go by @roroghost17 in #9059
- perf: reuse HTTP connections and pin legacy protocol version for per-call MCP clients by @roroghost17 in #9060
- fix: only treat a 404 as a dead MCP session on protocol revisions that have sessions by @roroghost17 in #9061
- feat: add upstream notifications support in MCP servers by @roroghost17 in #9062
- fix: clear error when an upstream MCP server returns input_required by @roroghost17 in #9063
- feat: support CIMD client registration for upstream MCP OAuth by @roroghost17 in #9064
- feat: support CIMD clients in the MCP OAuth server by @roroghost17 in #9065
- feat(chatgpt-passthrough): Codex ChatGPT sign-in and Responses stream end on main by @impoiler in #9196
- feat: add a global and per-server MCP max protocol version setting by @roroghost17 in #9066
- feat: discover MCP server resources and prompts by @roroghost17 in #9067
- feat: serve upstream MCP prompts and resources through MCP gateway by @roroghost17 in #9068
- feat: validate the authorization server issuer for upstream MCP OAuth by @roroghost17 in #9069
- feat: support MCP tool output schemas, titles, icons and multimodal results by @roroghost17 in #9070
- feat: log MCP prompt and resource reads by @roroghost17 in #9071
- feat(core): relays to non-LLM APIs and the relay plugin hooks by @BearTS in #9168
- feat(framework): add relay config store, virtual key grants, relay logs, and async job settlement by @BearTS in #9169
- feat(governance): relay access grants, budgets, and logging for relay calls by @BearTS in #9170
- feat: add Relays for proxying non-LLM APIs with usage billing and virtual key grants by @BearTS in #9171
- feat(ui): dashboard relays page, access changes and docs by @BearTS in #9174
- feat(relay): log metadata and route-matched headers on relay logs instead of all headers by @BearTS in #9200
- [fix]: anthropic - render the required message_delta frame and report only the usage the upstream sent by @valentinyanakiev in #7896
- [fix]: OpenAI provider - keep id and status of a native web_search_call in Responses input by @pcbeingused333 in #8776
- docs: cover Okta access-token claims for Codex gateway sign-in by @impoiler in #9207
- test(e2e): relay access, governance and pricing end to end by @BearTS in #9185
- feat(relay): capture streamed response bodies for relay logs when content logging is enabled by @BearTS in #9202
- feat(relay): detail-sheet header parity and table-row wording fixes by @BearTS in #9204
- feat(relay): allow route header matchers on any header name by @BearTS in #9206
- fix(modelcatalog): store one deterministic price when datasheet rows fold onto one key by @aharshit123456 in #8492
- fix: fix auth required checks to use the helper ,ethod from mcp-go by @roroghost17 in #9217
- fix: narrow MCP gateway tools/list with a hook instead of a tool filter with mcp-go update by @roroghost17 in #9218
- fix: bifrost_overhead_latency_microseconds not showing up in Prometheus by @roroghost17 in #8906
- docs: update x-bf-lh docs into request options by @roroghost17 in #8907
- feat(databricks): list key models and aliases in /v1/models by @impoiler in #9226
- feat(helm): prepare chart 2.1.46 - relays, Cross App Access IdP settings, token exchange clientId rule by @BearTS in #9208
- fix(governance): skip unknown relay and agent grants on new virtual keys instead of failing startup by @BearTS in #9214
- fix(relay): replace virtual key relay grants follow the same pattern for split mode by @BearTS in #9215
- fix(ui): remove "new" badge from A2A agents sidebar item by @BearTS in #9210
- fix(ui): align relay screens with the rest of the app by @BearTS in #9224
- feat(relays): import routes from an OpenAPI document fetched by URL by @BearTS in #9225
- fix: stop rewriting fallback-credit beta header date for bedrock by @sammaji in #9211
- fix(modelcatalog): fall back to per-image pricing when reported tokens have no rate by @impoiler in #9230
- feat(ui): inline OpenAPI spec URL fetch button and remove relay logs units metric by @BearTS in #9236
- fix: price byteplus seedance video by output tokens by @impoiler in #9234
- [fix]: anthropic - forward a native Sonnet 5.5 caller's reasoning and sampling surface by @valentinyanakiev in #7895
- ci: run live provider calls through real http, https and socks5 proxies by @akshaydeo in #7577
- fix: upstream and overhead latency fixes for multi-turn MCP code-mode requests by @roroghost17 in #8912
- fix: streaming spans missing token usage, chunk count and TTFC by @roroghost17 in #9237
- fix: handle Ocp-Apim-Subscription-Key in http request by @TejasGhatte in #9222
- fix: azure list voices in list models by @TejasGhatte in #9229
- feat(mcp/oauth2): validate token-exchange settings at client create and edit by @Pratham-Mishra04 in #9221
- fix: billing header and served model in azure by @TejasGhatte in #9232
- fix: azure live api fixes by @TejasGhatte in #9235
- chore: backmerge main into dev by @impoiler in #9242
- fix(models): stop narrowing unfiltered model listings to the caller's virtual key access by @Pratham-Mishra04 in #9178
- fix: mark an expired OAuth credential with no refresh token as needs_reauth by @roroghost17 in #9239
- fix: let a public OAuth client change its authorize and token URLs without a client secret by @roroghost17 in #9240
- fix: azure voice live endpoint pricing by @TejasGhatte in #9244
- feat: add SetSpanStartTime so a span opened after its work finishes shows the work's real duration by @roroghost17 in #9247
- fix: config hash relay credential by reference so rotated env values don't re-sync config by @BearTS in #9250
- fix: give streaming plugin post-hook spans real durations and nest plugin spans under them by @roroghost17 in #9248
- fix(warp): strip codex wrappers and handle log truncation by @kohlivrinda in #9243
- fix: leave background spans out of the overhead breakdown by @roroghost17 in #9249
- fix(ui): remove top alignment from method cell in relay routes table by @BearTS in #9253
- fix(mcp-logs): open the detail sheet for a selected_log outside the loaded page by @impoiler in #9255
- fix(openai): default detail on input_image blocks inside tool outputs by @akshaydeo in #9209
- fix(deepseek): reject document content before egress on the Anthropic endpoint by @valentinyanakiev in #6741
- feat(helm): support OpenAPI-based MCP clients via openapiConfig by @BearTS in #9254
- fix(routing): fall back to single-text embeddings on refused batches and correct warmup failure messaging when a fallback is set by @Madhuvod in #9261
- fix: send a thinking budget to Gemini 4 as thinkingLevel (≤1024 low, ≤8192 medium, higher high) by @akshaydeo in #9262
- fix(modelcatalog): price image models called over chat and responses by @impoiler in #9263
- fix(gemini): count thoughtsTokenCount in image generation usage by @impoiler in #9264
- test: update provider test models for retired and deprecated models by @sammaji in #9268
- test: skip matview_refresh_state table in migration snapshot comparison by @sammaji in #9269
- fix: config.json MCP clients use the stored ID when another node stored them first by @roroghost17 in #9270
- fix(relays): require authenticated admin to change relay credential destination under auth bypass by @BearTS in #9271
- test(e2e): fix flaky e2e specs across mcp-registry, providers, and placeholders by @impoiler in #9272
- test: set fixed viewport and add logs table test id for logs e2e tests by @sammaji in #9274
- feat: add vk metadata to connectors export by @roroghost17 in #9279
- 2.4.0 by @akshaydeo in #9283
- workflow changes by @akshaydeo in #9284
- test(e2e): add secret redaction cases for sagemaker, minimax, and byteplus providers by @BearTS in #9286
- test: update sgl and vllm decision tests for DecisionData file field by @sammaji in #9288
- test fixes by @akshaydeo in #9289
- updates test scripts by @akshaydeo in #9291
- test fixes by @akshaydeo in #9299
- fix: offload relay log bodies to object storage on hybrid mode by @BearTS in #9301
- test: retry runpod pod creation across gpu types and upgrade to stable vllm version for reasoning models by @sammaji in #9293
- relay handover fix by @akshaydeo in #9303
- test: add setup token header to warp e2e newman collection by @sammaji in #9294
- mirro fix by @akshaydeo in #9304
- tests_fix_failing_warp_tests by @kohlivrinda in #9302
- fix failing tests by @akshaydeo in #9306
New Contributors
- @brianhadley2026 made their first contribution in #7656
- @dinhxuanvu made their first contribution in #8971
- @pcbeingused333 made their first contribution in #8633
- @rxchitrx made their first contribution in #8701
- @valentinyanakiev made their first contribution in #7896
- @aharshit123456 made their first contribution in #8492
Full Changelog: ent-v2.3.2-base...ent-v2.4.0-base