- NPX
- Docker
2.0.0
v2.0.0 is the first stable release on the 2.0 line. This changelog rolls up
2.0.0-prerelease1 (based on v1.6.3), 2.0.0-prerelease2, 2.0.0-prerelease3 and the final release window, so it is the complete delta for a deployment upgrading from any v1.6.x release. Fixes that also shipped on the v1.6.x line after v1.6.3 are listed once here.✨ Features
- Batch Accounting - Provider batch jobs are tracked in a new
batch_jobstable and settled asynchronously: results are priced per model from catalog batch rates (0.5 default ratio) on the/resultspath, one aggregate cost log is written idempotently with the creating request’s identity, a background sweeper with ownership fencing re-drives jobs that timed out, settled usage is charged exactly once to the creating user’s budgets and rate limits (including unscoped virtual key budgets on model-less batch-create requests), mixed-model batch rows are repriced during cost recalculation, and the log detail view shows a Batch Details block with per-state request counts and the settled cost (#5291, #5292, #5293, #5294, #5295, #5296, #6109, #6121, #6376, #6410, #6474, #6505) - Claude-on-Vertex Batches - Vertex batch jobs route Anthropic models to
publishers/anthropic/..., build Claude-on-Vertex JSONL instances, round-tripcustom_id, and preservetools,toolConfig,cachedContent,labelsanddisplay_nameon Gemini/Vertex batch requests (#5368) - Input / Output Cost Split - Every log carries
input_cost,output_costandadditional_cost(guardrails, semantic cache, MCP) next to the total, across the RDB, ClickHouse, matviews, recalculation and the quota API; speech, transcription and OCR usages carryBifrostCost; the log detail view shows the split with per-category detail (#6511) - Bifrost Overhead Latency -
upstream_latencyandoverhead_latencyare recorded on every log, aggregated (avg, p90, p95, p99) in the dashboard’s new Bifrost Overhead chart and shown in the log detail view; the overhead is decomposed by span self-time into serialization, conversion, plugins, middleware, key selection, queue wait, networking, client delivery and scheduling buckets (including streaming per-chunk parse, conversion and backpressure and the worker hand-off), persisted tooverhead_breakdownand rendered as a stacked bar in the log detail view; abifrost_overhead_latency_microsecondshistogram is exported to Prometheus and OpenTelemetry andupstream_latency_ms/overhead_latency_mstags to Maxim, while breakdown spans are kept out of observability connectors (#5533, #5534, #5535, #6345, #6388, #6389, #6433, #6470, #6495) - Notification Center - Role-targeted dashboard notifications stored in the database, delivered over WebSocket and surfaced in a topbar tray via
GET/POST /api/notifications(#6207, #6227, #6324) - Topbar and Responsive Dashboard - Persistent topbar with page titles, theme toggle, external links, user menu and version; responsive layouts across all views with truncation and tooltips for long values and icon-only buttons; version-skew detection with an auto-reloading upgrading screen (#6196, #6105, #6126, #6204, #6232, #6330, #6370, #6476, #6485, #6493)
- Video Edits -
POST /v1/videos/editsapplies prompt-driven edits, upscaling and background removal to an existing video supplied as bytes, a URL or a provider video ID, on OpenAI and Runware (#6270) - Runware Chat, Catalog and Media Operations - Chat completions, streaming and Responses via Runware’s OpenAI-compatible endpoint,
ListModelsfrom the curated catalog, image upscale via/v1/images/edits(type=upscale), image-to-3D and async 3D generation via/v1/videos(type=3d), provider-reported per-task cost, and a raw/runware_passthroughroute (#6260, #6372, #6208, #6075) - JSON Image Edits -
POST /v1/images/editsaccepts JSON bodies with URL or base64 images and typed extra params in addition to multipart (#6418) - OpenAI Ultrafast Service Tier -
service_tier: "ultrafast"is forwarded only to models that support it and billed at dedicated ultrafast rates, with matching custom pricing override fields (#6396, #6399) - Service Tier on Logs - Logs record the tier actually served, including Anthropic’s
service_tierfrommessage_starton streams, with a Service Tier column and detail field so repricing uses the served tier (#6233, #6236) - Pricing Fields - New per-request flat fee (
cost_per_request), megapixel-based image tiers (4/8/16/32/64 MP), per-size and joint size+quality image rates forgpt-image-1-style models, andinput_cost_per_queryfor rerank flow through datasheet sync, the cost engine, custom overrides, the API and the UI override form; upscale output resolution is backfilled fromtarget/factoron Replicate so tiered rates bill the real output size (#6079, #6082, #6083, #6379, #6380) - Model Catalog Pricing and Overrides - Pricing data in the model catalog (thanks @johnbrett!), with resolved pricing overrides exposed on
/api/models/detailsand on catalog rows, shown in the dashboard (#6055, #6056, #6058) - Typed Embeddings on Bedrock - Titan V2
embeddingTypesand Cohereembedding_typeson Converse, the native invoke route and LangChainBedrockEmbeddings(#6381) - Rerank Upgrades - Structured JSON documents,
return_documents,next_tokenpagination, caller document IDs preserved in every result, Cohere-shaped errors, cross-provider responses converted back to the caller’s wire shape, and/genai/v1/rankserved cross-provider (#6328, #6301, #6432) - OpenRouter Speech, Transcription and Embeddings - TTS and STT through OpenRouter’s audio endpoints, and embedding models included in
ListModels(#5734, #6264) - Grok on Bedrock Mantle -
xai.models route through theopenai/v1Mantle path (#6022) - Gemini 3 Thinking Levels - A per-model
thinkingLevelsupport table clamps requested levels to the rungs each model implements;reasoning_effort: "none"sets the model’s floor level instead of zeroingthinkingBudget(#6280) - Datasheet-Backed Compatibility - Anthropic, Bedrock, Cohere and Gemini request shaping (adaptive thinking, native effort, disable-reasoning, mid-conversation system turns, computer-use and text-editor tool generations, default max output tokens, tool validation) is resolved from model capabilities instead of hardcoded model-name checks (#6281, #6492)
- Reasoning Effort None - Models that reason by default but do not support reasoning with tool calls get
reasoning.effort: "none"when they advertisesupports_none_reasoning_effort, instead of losingreasoningentirely (#6293) - HTTP Transport Pre-Auth Hook - New
HTTPTransportPreAuthHookplugin phase runs before transport authentication so plugins can inject credentials such asx-bf-vk; avirtual-key-from-confignative plugin example ships alongside it (#6375, #6373) - Plugin Inject Limits - Per-plugin
semaphore_sizeandinject_timeoutonPluginConfigbound observabilityInjectcalls so a hung connector releases its slot (#6341) - Harness Session Autodetection - Claude Code, Codex CLI and OpenCode session headers populate the session ID when
x-bf-session-idis absent (#6333) - Auth and Model Check Skip Paths - Context keys let trusted internal callers bypass auth resolution, and let evaluate-only requests such as
/inspectbypass the virtual key provider and model allowlists while budgets and rate limits still apply (#6124, #6479) - Passthrough Encoding Negotiation - Forwarded
Accept-Encodingis filtered to decodable codecs (gzip, deflate, brotli, zstd; gzip and identity for streams) and chained content encodings are decoded (#6360) - Routing Plugin - Routing rules and the complexity router live in a dedicated
routingplugin that runs after governance so rules evaluate on the fully stamped context; endpoints moved to/api/routing/rulesand/api/routing/complexity-analyzer-configwith deprecated/api/governance/*aliases; complexity routing now reads the text of mixed text+image turns (#6144, #6145, #6146, #6147, #6253) - Dimension Scope Ceiling - Grouped log analytics (rankings, histograms, key pairs) are bounded to the customer, team, business unit, user and virtual key ids the caller may see (#6262)
- MCP Per-User OAuth and Token Exchange - 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,oauth_config.resource(RFC 8707), VK/Users filters on the OAuth Grants and MCP Auth Sessions sidebars and one shared create/install client form;token_exchangegainsuse_idp_credentialsto reuse SSO login app credentials for providers such as Microsoft Entra ID (client_idbecomes optional) and combinesoffline_accesswith<audience>/.defaultfor Entra OBO; shared-OAuth clients showneeds_reauthwhen their token row is invalidated,Reauthorizeis limited to shared clients, the OAuth flow claim is atomic against concurrent reauth, stored scopes survive a decode failure, and credential caches propagate cancellation and version their entries (#6068, #6069, #6078, #6411, #6428, #6429, #6504) - MCP Connection Lifecycle and Tool Discovery - Discovered tools persist and resync uniformly across all client types through a hash-gated core callback, surviving restarts and propagating across a cluster; connections use make-before-break reconnects with ephemeral clients rebuilt across the whole connect+init retry, last-known tool maps preserved, connect attempts bound to entry identity and background reconnects deduped;
needs_session_stickinessis pinned acrossconfig.jsonreconciliation; updating static headers on a sticky client pre-flight verifies the new credential and swaps it onto the live connection, per-call shared-credential clients refresh tools synchronously, and a failed enable parks the client atDisabledso it can be retried; the globaltool_sync_intervalhot-reloads and re-times running checkers; state badges render with spaces and thedisconnectedfilter bucket is nowunstable(#6409, #6430, #6431, #6483, #6502) - Air-Gapped MCP Catalog -
mcp_library_sync_interval: 0disables catalog sync andfile://URLs load the MCP server library from disk (#6195) - MCP Log Redaction and Plugin Logs - MCP tool logs carry redaction mappings and plugin logs (#5744, #5746)
- Splunk Connector Configuration -
config.schema.json, Helm values and dashboard entries for the Splunk HEC observability connector (#6296, #6091, #6099) - Helm Broker Clustering -
bifrost.cluster.type: brokerwith broker address, port and TLS settings alongside the existing mesh transport (#6398) - HTTP/2 Ping Interval in the UI - Provider network configuration exposes
http2_ping_interval_in_seconds(#6228) - Status Code Badges - Error and passthrough logs show the upstream HTTP status code in the log detail header (#5536)
- Server-Side Tool Calls in Logs -
web_search_call,code_interpreter_calland similar Responses items render their full payload in the log detail view (#6475) - Gemini Server-Side Tool Calls - Gemini
toolCall/toolResponseparts surface asweb_search_callitems with their own call ID and queries, unmapped tool types are preserved on the native round-trip, and eachthoughtSignatureappears exactly once on replay (#6071) - Bedrock VPC Endpoints - AWS Bedrock keys can target VPC endpoints (#6064)
- W3C Trace ID Propagation - Requests carry a W3C trace ID on the context (#5945)
- Durable Background Jobs - New
sidekiqbackground-job table, store methods, and runner with recovery and reaper; cost recalculation migrated to a durable, resumable and cancellable job with polling instead of SSE (#5800, #5801) - Separate OTEL Metrics Pipeline - The OTEL collector supports a metrics tab independent of traces, plus separate headers for traces and metrics (#5939, #5940)
- Grouped Logs View - The logs table groups fallback chains under expandable roots backed by the new
roots_onlyfilter with child aggregates, and the model catalog persists tab, search and provider in the URL (#5522, #5737, #6059) - User Agent and App Attribution - Logs and MCP tool logs record user agent, app, source, decision, app key and device ID, with custom user-agent mapping and dashboard dimension rankings; MCP tool logs observed by the Bifrost Edge agent can be ingested with device, app key, decision and source attribution
- 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) - Custom Branding - Logo and icon branding support with an OSS fallback stub, cached in localStorage to prevent a logo flash on load (#5806, #6096)
- User Assignment on Virtual Keys - Users can be assigned from the virtual key sheet (#5863)
- Quarterly Budgets - Quarterly budget windows with a configurable fiscal year start for customers and virtual key provider configs, surfaced in budget labels (#5996, #5997, #5999, #6115, #6116)
- Sarvam AI Provider - Added Sarvam AI as a first-class provider with chat, text-to-speech, and speech-to-text support (thanks @Purvi09!)
- ElevenLabs Sound Effects - Added text-to-sound generation support via
/v1/sound-generation(thanks @SecretSun!) - Bedrock Project Scoping - Added optional
project_idto Bedrock and Bedrock Mantle key configs with per-alias overrides for Bedrock, Bedrock Mantle, and Vertex, plus UI support - Trace Redaction - Phase-scoped redaction and revealing, transient redaction data field for guardrails, and trace content redaction before connector export
- Audit Log Object Storage - S3/GCS object storage config schema for audit log archival
- Alerting Configuration - Alerting schema in
config.schema.jsonwith declarative channels and CEL-based rules, Helm chart support, and enterprise fallback pages - Canonical Model Names - Dashboard model rankings now show canonical model names instead of inference-profile IDs (thanks @satyamkrishna!)
- OAuth2 Hardening - Allowlist for private-use redirect URI schemes (RFC 8252 §7.1) and a
shouldSweepgate on the OAuth2 sweep worker - Mirrored Schema Support -
schema_url/BIFROST_SCHEMA_URLfor mirrored schema locations in isolated deployments - Vertex Single-Region Config - Enforce single-region configuration in Vertex key config
- Helm Chart Updates -
bifrost.alerting, audit-log object storage,postgresql.external.portstring support, andbifrost.mcp.toolGroups[*].id - ChatGPT Passthrough - Added a ChatGPT passthrough route on the OpenAI integration with dedicated request handling
- Edge Fallback Pages - Added fallback pages for Bifrost Edge control views (config, devices, inventory) backed by governance resolver support
- Agent Handover View - Added an agent handover page with seeded end-to-end data support
- First-Time Setup Token - A setup token gates first-time setup so a fresh deployment is not open to the world, and the onboarding checklist is back, completing its dashboard auth step on SSO deployments (#5759, #5784, #6322)
🐞 Fixed
- Structured Output Schema Order -
response_formatJSON schemas are forwarded byte-for-byte to OpenAI, Anthropic, Bedrock, Gemini and Cohere so the model generates fields in the caller’s declared order instead of a re-sorted one (#6235) - Thinking Block Typing on Streams - Reasoning items carrying both an encrypted payload and a visible summary open as
thinkingblocks instead ofredacted_thinking(#6292) - Replayed Thinking Blocks via
bedrock/Prefix - Content-lesstool_resultblocks are kept, interleaved block order is preserved,incompletemaps toerroron Converse, and pending reasoning is consumed by its owning item, so multi-turn tool use no longer wedges (#6346) - Gemini 400s on Claude Code Traffic - Trailing assistant prefills are trimmed and mid-conversation system turns are inlined for Gemini/Vertex;
extra_fieldsis echoed on/anthropic/v1/messages(#6363) - Bedrock Tool Use IDs - IDs longer than 64 characters or outside Bedrock’s charset (such as Gemini thought-signature IDs) are aliased deterministically on both
tool_useandtool_result(#6300) - Azure Responses Stream Errors - Terminal
errorandresponse.failedevents inside an already-open HTTP 200 SSE stream are surfaced as errors with their nested type, code and message (thanks @dani29!) (#6302) - GenAI SSE Heartbeats - GenAI streams delimit heartbeat comments so Google SDK clients preserve the following event, while older openai-go clients keep the bare heartbeat (thanks @dani29!) (#6252)
- OpenCode max_tokens -
max_tokensis preserved for OpenCode-compatible chat endpoints (thanks @Alex-wangyang!) (#6458) - HuggingFace Streaming Usage - HuggingFace is no longer listed as omitting the
[DONE]marker, andstream_options.include_usagedefaults on its chat streaming path, so streamed calls stop reporting zero tokens and zero cost (thanks @elliottrabac!) (#6478) - Provider Key Name on Update - A key PUT that omits
nameno longer clears it, and already-exists errors keep their constraint detail (thanks @cpsc!) (#6417) - Bedrock Mantle Streaming - Bedrock Mantle is registered in
ProviderSendsDoneMarkerso streams end afterfinish_reason(#6021) - URL-Sourced Files and Images -
gs://URIs go to Gemini/Gemma asfileData.fileUriand are read from Cloud Storage for Claude-on-Vertex,s3://references go to Bedrock Converse ass3Location, Bedrock rerank synthesizes the foundation-model ARN from a bare model ID, OpenAI file blocks keepfile_url, non-http schemes pass through on the OpenAI and native-Anthropic paths, and Gemini always emits a candidate with its finish reason and drops payload-free parts (#6239) - Together and Alias Pricing - The management catalog resolves runtime provider
togetherto the datasheet identity and prices configured aliases through their target model (thanks @dani29!) (#6257, #6320) - Redis Vector Store TAG Escaping - All RediSearch special characters are escaped in TAG query values (thanks @AdityaPainuli!) (#5351)
- MCP Tool Sync Interval Corruption - Toggling an MCP client’s enable/disable switch no longer corrupts
tool_sync_interval; the value is a whole number of minutes, negative values are rejected instead of silently disabling sync, and re-enabling a per-call client restarts its discovery cycle (#6409, #6502) - MCP Tool Map Staleness -
SetClientToolsreplaces the in-memory tool map instead of merging, so tools removed upstream leave memory once the database has dropped them (#6484) - SSE Reconnect Identity -
OnConnectionLoston SSE MCP clients is gated on connection identity so a stale connection cannot tear down its replacement - Connector Header Redaction -
Authorization,x-api-key, Cloudflare Access and AWS ALB OIDC headers are redacted before export to every observability backend (#6371) - Vertex Mixed Tools - Vertex AI accepts function declarations and Google Search in the same request without
includeServerSideToolInvocations, and search localization viaretrievalConfig.latLngis preserved (#6066) - Gemini Tool Preference - When tool combination is disabled, function declarations win over Google Search so the model can still call the caller’s tools (#6065)
- Bedrock Stop Reasons - Bedrock
content_filterandguardrail_intervenedstop reasons map toincompletestatus with acontent_filterreason - Encrypted Reasoning on Compaction - The fail-soft that strips
encrypted_contentbefore retrying a rejected request also covers/v1/responses/compactand count-tokens requests, and recognizes Anthropic’sredacted_thinkingrejection (#6041, #5960) - DAC-Scoped VK Reads -
from_memoryvirtual key reads are blocked for DAC-scoped callers - 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)
- Governance List-Models Call - Budgets and rate limits no longer trigger a list-models call (#6051)
- Realtime Response Create Input - Guarded
response.createinput (#6050) - Governance Rate-Limit Reset CPU - Guards against invalid reset timeouts, parallelized resting-budget flows only when absolutely required, and fixed the calendar-based alignment qualifier
- Masked Key Persistence - Never persist masked provider key previews to config storage (thanks @eyeveil!)
- OpenShift Arbitrary UIDs - Build-time group-0 ownership with no runtime chown (thanks @eyeveil!)
- Passthrough Virtual Key Attribution - Passthrough calls via the Azure
api-keyheader now attribute to the virtual key (thanks @eyeveil!) - Rerank for Custom Providers -
/v1/reranknow works with custom OpenAI-compatible providers (thanks @eyeveil!) - Responses Stream Usage - Persist stream usage when providers omit or reuse sequence numbers (thanks @eyeveil!)
- Wildcard allowed_models Repair - Repair bare wildcard
allowed_modelsrows that broke admin provider updates (thanks @eyeveil!) - Streaming Error Panic - Nil-safe tracing span lookup prevents panics on streaming errors (thanks @eyeveil!)
- Anthropic Tool ID Sanitization - Sanitize
tool_use/tool_resultids to Anthropic’s charset (thanks @Shaik-Sirajuddin!) - Realtime Transcription Sessions - Support GA transcription-type sessions in
POST /v1/realtime/client_secrets(thanks @Shaik-Sirajuddin!) - Diarized Transcription - Support
diarized_jsonsegments and ElevenLabs speaker passthrough (thanks @Shaik-Sirajuddin!) - Model Discovery - Skip disabled keys when scheduling model-discovery fetches (thanks @Shaik-Sirajuddin!)
- MCP Timeout Placeholder - Show the real global default in the MCP tool execution timeout placeholder (thanks @Shaik-Sirajuddin!)
- Redacted Thinking Round-Trip - Round-trip Anthropic
redacted_thinkingblocks on the Responses surface (thanks @fus3r!) - Streaming Accumulation - Preserve citation annotations and
finish_reasonin the accumulated streaming response (thanks @fus3r!) - Gemini Grounded Streaming - Reset web-search flag when recycling pooled stream state so
web_search_callitems keep emitting (thanks @fus3r!) - Bedrock Truncation Signal - Signal
max_output_tokenstruncation on the Responses API (thanks @jeremym-tanium!) - Bedrock Reasoning Config - Preserve
reasoning_configon cross-provider translation so fallbacks keep extended thinking (thanks @Purvi09!) - Anthropic tool_search - Forward and rebuild server-side
tool_searchon the Responses path (thanks @ws4charlie!) - OpenAI Responses Input - Strip
rolefrom non-message input items (thanks @nettee!) and serialize compaction requestinputcorrectly (thanks @mcclurmc!) - additional_tools Support - Added
additional_toolsmessage type support, preserving nested tool types on/v1/responses - Plugin Stream Errors - Emit structured plugin stream errors on integration routes (thanks @jeffhos!)
- Pooled Object Hygiene - Zero pooled ChannelMessage references on release and sweep orphaned deferred spans in trace store TTL cleanup (thanks @citrocat!)
- Hybrid Log Token Usage - Rebuild token usage from denormalized columns in hybrid log list (thanks @G-XD!)
- MCP Tool Ordering - Deterministic MCP tool ordering for prompt cache stability
- MCP Inline-Auth Links - Warn callers not to truncate the
#t=temp-token fragment (thanks @MarcusPeng!) - Gemini Fixes - Web search options map to Google Search grounding, file upload MIME types preserved, and video reference fields map to instances (thanks @vojthor!)
- OpenAI Parameters - Honor service tier in chat completion and cap max reasoning effort
- Anthropic Costing - Correct inference geo cost and cache rate for fast mode
- SecretVar Parsing - Parse
SecretVarJSON withref/env_varfields even whenvalueis absent - Telemetry - Forward request id and trace id, reduce metrics cardinality explosion risk, and send status codes on OTEL metrics
- Dashboard - Preserve active time period when applying dimension filters, adjust bucket size thresholds for month-range durations, show user popover with
preferred_usernamefallback, filter provider-level keys from the prompt manager selector (thanks @rlex!), skip password validation for redacted credentials, and improveModelMultiselectempty and error states - API Key Provider Selection - Fixed provider selection for API keys
- Azure Auth Headers - Pass Azure auth headers in helpers
- Stream Delta Schema - Added
ExtraContenttoChatStreamResponseChoiceDelta(thanks @nghodkicisco!) - API Auth Bypass - Stopped
/api/devicesbypassing auth via the/api/devprefix - Bedrock Error Types - Surface the AWS exception type (
X-Amzn-Errortype) on non-streaming Bedrock error responses instead of dropping it
🔧 Maintenance
- Hot-Path Performance - Cached serialization for shared MCP tools, a direct
OrderedMapJSON writer, bulk span attribute writes with cached span pointers, reusable worker delivery timers, retained span attribute maps, generation-stamped memoization ofGetProvidersForModelandGetModelsForProvidervia the newgencachepackage, sonic-based JSON responses, and a plugin-log existence check before draining (#6242, #6241, #5956, #5957, #5657, #6387, #5641, #6224, #6268, #6211) - Go Toolchain - Modules build with Go 1.26.6 and the Nix flake pins 1.26.7 (#6269, #6385)
- Dependency Upgrades - Dependabot updates across all modules, newman 6.2.2 with pinned transitive overrides, module path fixes and
openai_configreferenced from every provider config schema (#6040, #5864, #6267, #6305, #6275) - Test Coverage - vLLM instances provisioned on RunPod in the release pipeline, Runware harness coverage including
/v1/images/editsand/v1/videos, batch and pricing-override lifecycle harness cases, an Anthropicmessage_startusage regression test, LangChain rerank and embedding integration tests, and e2e fixes for dashboard auth, budget reset and MCP state (#5541, #6303, #6319, #6299, #6327, #6432, #6351) - Documentation - v2.0.0 migration guide with the governance namespace mapping and a v1.5.x downgrade guide for
prerelease3deployments, v2.0.0 availability callouts, routing API namespace docs, Bedrock application inference profiles, Splunk connector docs, config.schema.json and Datadog env var reference fixes, and Discord badge fixes (thanks @Swpn0neel!) (#6332, #6374, #6420, #6147, #6203, #6099, #5938, #6019, #6425, #6448) - Helm - Chart releases v2.1.35 and v2.1.36 (#6129, #6249)
- Governance Route Families - Editions can override governance route families (#5839)
🗄️ Database Migrations
All migrations below are new relative to v1.6.11. Deployments on an older v1.6.x release should also review the intermediate v1.6.x changelogs.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. - add_notifications_table - Creates the
notificationstable for the dashboard notification center. Reversible: drops the table. - add_batch_jobs_table - Creates
batch_jobswith a unique(provider, batch_id)identity index, a sweeper scan index and a runner-id index. Reversible: drops the table. - add_image_megapixel_tier_pricing_columns - Adds the five
output_cost_per_image_above_{4,8,16,32,64}_megapixelscolumns to model pricing. Reversible: drops the added columns. - add_input_cost_per_query_column - Adds
input_cost_per_queryto model pricing for rerank. Reversible: drops the added column. - add_ultrafast_pricing_columns - Adds the four
*_ultrafasttoken rate columns to model pricing. Reversible: drops the added columns. - add_image_size_quality_pricing_columns - Adds the 14 per-size and size+quality image output rate columns to model pricing. Reversible: drops the added columns.
- add_batch_jobs_attribution_columns - Adds
user_id,team_id,customer_idandsource_log_idtobatch_jobsplus auser_idindex. Reversible: drops the index and the four columns.
- 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. - logs_recreate_matviews_with_app_column - Recreates the log materialized views to include the user agent and app columns. Rollback is a no-op because
ensureMatViewsrecreates them on next startup. - 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_add_video_edit_input_column - Adds
video_edit_inputto logs. Reversible: drops the added column. - logs_add_upstream_and_overhead_latency_columns - Adds
upstream_latencyandoverhead_latencyto logs. Reversible: drops both columns. - logs_add_batch_debug_column - Adds
batch_debugto logs. Reversible: drops the added column. - logs_add_cost_breakdown_columns - Adds
input_cost,output_costandadditional_costto logs. Reversible: drops the three columns. - logs_recreate_matviews_with_cost_breakdown - Marks the hourly matview for rebuild with the cost split columns;
repairMatViewShapesdrops and recreatesmv_logs_hourlyon the next startup. Rollback is a no-op becauseensureMatViewsrecreates it on next startup. - logs_add_overhead_breakdown_column - Adds
overhead_breakdownto logs. Reversible: drops the added column.
🐙 Closed GitHub Issues
- #123 - Files API Support
- #2347 - MCP tool ordering is non-deterministic, breaking prefix-based prompt caching
- #3455 - Segfault/nil dereference panic in Bedrock provider
- #4318 - allowed_models persisted as bare ”*” string blocks subsequent provider updates
- #4353 - config.db corruption from masked-key preview in provider_configs JSON column
- #4367 - Image incompatible with OpenShift arbitrary UIDs
- #4402 - Vertex provider drops image blocks whose URL uses gs:// scheme
- #4477 - Passthrough calls using a Virtual Key log as actual key
- #4679 - Bedrock Responses API does not signal max_output_tokens truncation
- #4689 - Custom providers cannot set budget
- #4712 - ElevenLabs sound effects (/v1/sound-generation)
- #4780 - Anthropic server-side tool_search results are dropped on /v1/responses
- #4834 - /v1/rerank is not available with custom providers
- #4846 - Responses stream usage present in response.completed but not persisted in LLM Logs
- #4851 - Governance rate-limit reset causes high CPU in BumpRateLimitUsage
- #4870 - Pooled ChannelMessage retains request body, context, and undelivered response while idle
- #4940 - Show canonical model names instead of Bedrock inference-profile IDs in Model Rankings
- #4963 - Streaming finish_reason dropped from the accumulated (logged) response
- #5002 - gpt-4o-transcribe-diarize transcription fails due to string segment IDs
- #5013 - OpenAI /responses/compact input serialized as a JSON object causing 400
- #5026 - [Bug]: Toggling an MCP client’s enable/disable switch corrupts its tool_sync_interval (nanoseconds resent as minutes)
- #5027 - MCP Tool Execution Timeout placeholder shows 0 instead of real global default
- #5036 - Plugin StreamInterceptionError is flattened on integration routes
- #5037 - Disabled keys break provider model discovery
- #5051 - Add Sarvam AI provider (chat + TTS/STT)
- #5061 - Streaming responses drop citation annotations from the accumulated message
- #5093 - Streaming /v1/responses drops Anthropic redacted_thinking blocks
- #5097 - Anthropic rejects replayed tool_use/tool_result ids from non-conforming upstream providers
- #5100 - additional_tools loses nested tool types on /v1/responses
- #5101 - Chat-to-Responses tool replay sends role on function_call input items
- #5108 - Bedrock reasoning_config silently dropped on cross-provider translation
- #5113 - Gemini/Vertex streaming stops emitting web_search_call items after first grounded request
- #5432 - Add TTS and STT support for OpenRouter
- #5472 - [Bug]: Bedrock rejects office/PDF document uploads via OpenAI
type:"file"- “The PDF specified was not valid” - #5871 - [Bug]: AWS Bedrock Mantle streaming is broken
- #5874 - [Bug]: SSE heartbeat frame aborts streams for openai-go ssestream consumers (< v3.43.0) with “unexpected end of JSON input”
- #5885 - [Bug]: v1.6.8 omits message_start.message.usage on Bedrock-backed providers, breaking @ai-sdk/anthropic streaming
- #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’
- #6240 - [Bug]: GenAI SSE heartbeat framing causes @google/genai to silently drop the following data event
- #6248 - [Bug]: OpenRouter embedding models missing from Semantic Cache dropdown
- #6334 - [Bug]: Gemini/Vertex provider fails on Claude Code assistant prefills and mid-conversation system turns (Gemini 3.6 Flash & 3.7 Flash HTTP 400)
- #6342 - [Bug]: Anthropic ingress with bedrock/ prefix restructures replayed thinking blocks, wedging multi-turn tool use on claude-opus-4-8
- #6416 - [Bug]: Provider key update silently clears “name” when omitted, then the unique-name index 409s subsequent updates
- #6457 - [Bug]: OpenCode chat endpoints drop max completion limit
1.8.3
- fix: forward OpenCode Responses requests directly to /v1/responses @mohammadrezwankhan
- feat: add the
VideoEditoperation withBifrostVideoEditRequest,VideoEditInputandVideoEditParametersfor prompt-driven edits, upscaling and background removal on an existing video supplied as bytes, a URL or a provider video ID; implemented for OpenAI (/v1/videos/edits) and Runware (videoInference,upscale,removeBackground), with the model optional when the source is a video ID and the prompt optional for asset-driven task types (#6270) - feat: batch accounting:
MergeBifrostLLMUsagepromoted toschemas,EndpointonBifrostBatchResultsResponse,BatchResultItem.Failed(),BatchRequestCountsFromResults,BatchRequestCounts.IsZero(), raw-JSON Gemini batch result parsing andcustom_idvalidation inConvertRequestsToJSONL; the settlement engine (AccountBatchResultswith runner-ID ownership fencing, idempotent aggregate log writes and governance reporting) and a sweeper that polls due jobs with capped, jittered backoff; aggregate log entries carry abifrost/<version>user agent viaBifrostContextKeyRuntimeVersion(thanks @SahilChoudhary22!) (#5291, #5294, #6474) - feat: Claude-on-Vertex batch support:
ToVertexBatchCreateRequestresolves Anthropic families topublishers/anthropic/models/...,vertexConvertRequestsToJSONLemits Claude-on-Vertex instances,custom_idround-trips throughbatchResultsByKey, andGeminiBatchGenerateContentRequestkeepstools,toolConfig,cachedContent,labelsand the display name (#5368) - feat: add
HTTPTransportPreAuthHookto theHTTPTransportPlugininterface, a phase that runs before transport authentication;HTTPTransportPreHooknow runs after it (#6375) - feat: add
semaphore_sizeandinject_timeouttoPluginConfigso observabilityInjectcalls are context-bounded per plugin (#6341) - feat: Runware provider expansion: chat completions, streaming and Responses through its OpenAI-compatible
/v1/chat/completionsendpoint (Responses muxed viaToChatRequest()),ListModelssweeping the curatedmodelSearchcatalog with the AIR as the model ID, image upscale via/v1/images/edits(type=upscale) and image-to-3D via/v1/videos(type=3d), a sharedsettingsextra-param coercion for multipart and JSON callers, prompt-optional asset-driven operations, and input handling for edit, upscale and video task shapes (#6260, #6372, #6208) - feat: OpenAI
ultrafastservice tier:BifrostServiceTierUltrafast, capability-gated forwarding viaserviceTierForModelon chat, Responses and compaction, andultrafastpreserved throughWithDefaults(#6396) - feat: JSON bodies on
/v1/images/edits:ImageInputaccepts a bare string or{ "url", "image" }, typed extra params reach providers with their real types, andimagesis a known field (#6418) - feat:
EmbeddingData.EncodingFormatwith typedint8,uint8,binary,ubinaryandbase64vectors; Bedrock Titan V2embeddingTypesand Cohereembedding_typeson Converse, native invoke and LangChainBedrockEmbeddingscompatibility (#6381) - feat: rerank:
RerankDocument.Datafor structured documents,RerankResult.ID,RerankParameters.NextToken,ReturnDocumentsforwarded to Cohere and Vertex,ToCohereErrorfor Cohere-shaped errors,/genai/v1/rankserved cross-provider viax-model-provider, cross-provider responses converted back to the caller’s wire shape withToBedrockRerankResponse,ToCohereRerankResponseandToVertexRankResponse, and rerank cost accounting for Bedrock and Cohere (#6301, #6328) - feat: datasheet-backed compatibility flows: Anthropic, Bedrock, Cohere and Gemini request shaping (adaptive-only thinking, adaptive thinking, native effort, disable-reasoning, mid-conversation system turns, computer-use and text-editor tool generations, default max output tokens, tool validation, thinking-budget zeroing) is resolved through
schemas.ResolveModelCapsinstead of hardcoded model-name checks (#6281, #6492) - feat: Gemini 3 per-model
thinkingLevelsupport table (geminiThinkingLevelSupport) withclampThinkingLevelsnapping requested levels to the nearest rung (ties break upward) andlowestThinkingLevelforreasoning_effort: "none", sosetThinkingBudgetZeroIfSupportedsets the floor level on Gemini 3+ instead of zeroingthinkingBudget(#6280) - feat: Bifrost overhead latency accounting:
upstream_latencyandoverhead_latencyonBifrostResponseExtraFields(PopulateOverheadLatency,BifrostContextKeyRequestStartTime,populateLatencyExtraFieldsso logging plugins see both at hook time); per-phase overhead spans across the request pipeline (queue-wait,attribute-population,convertor,request-marshal,response-parse,handle-setup,pipeline-pre,pipeline-post,worker-setup,key-pool, Bedrockrequest-signandcredentials-fetch,response-finalize) withStampWorkerHandoffonChannelMessage.sentAt; lock-free stream overhead accumulators for per-chunk parse, conversion and backpressure installed viaResetStreamOverhead,StampStreamTransportfor the outbound marshal and client-write time, anddefaultSSEDataReader.ReadDataLineattributing socket reads to upstream; andIsOverheadBreakdownSpan,WithoutOverheadBreakdownSpansand theOverheadSpanConsumerinterface so breakdown spans stay out of connectors that do not opt in (#5533, #6388, #6389, #6433, #6470, #6495) - feat: input/output/additional cost split (
BifrostCost) on inference usages, extended to speech, transcription and OCR usages - feat:
Notification,NotificationInput,NotificationSeverity,NotificationAudienceand theNotificationPublisherfunction type for the dashboard notification center (#6207) - feat:
BifrostContextKeySkipModelCheckshort-circuits the virtual key model allowlist for evaluate-only requests such as/inspectwhile keeping every other governance rule (#6479) - feat:
HarnessSessionHeadersandMaxSessionIDLengthso Claude Code, Codex CLI and OpenCode session headers can fall back into the session ID (#6333) - feat:
RedactSensitiveHeaders, withIsSensitiveHeaderextended to Cloudflare Access (cf-access-*), AWS ALB OIDC (x-amzn-oidc-*) and genericjwt/assertionheaders (#6371) - feat:
ResponsesResponseError.Typeand a shared Responses stream-error normalizer so terminalerror/response.failedevents inside an HTTP 200 Azure SSE stream surface as errors with their nested type, code and message on both create-stream and retrieve-stream paths (thanks @dani29!) (#6302) - feat:
ServiceTieronStreamAccumulatorResult, with Anthropic’sservice_tierfrommessage_startlatched onto the final chunk of chat and Responses streams (#6236) - feat: OpenRouter speech and transcription through the OpenAI-compatible audio handlers instead of returning unsupported-operation errors (#5734)
- fix: preserve
max_tokensfor OpenCode-compatible chat endpoints (thanks @Alex-wangyang!) (#6458) - fix: HuggingFace chat streaming completed with zero tokens and therefore zero cost while non-streaming calls on the same models priced correctly, for two reasons: HuggingFace was listed as a provider that omits the
[DONE]marker (it sends one), which made the shared OpenAI streaming loopbreakon the firstfinish_reasonand discard the trailing usage-only chunk that several router inference providers emit; andstream_options.include_usagenever reached the router because the shared streaming handler returns early when a provider supplies a custom request converter. Both are corrected, and an explicitstream_optionsfrom the caller still wins (thanks @elliottrabac!) (#6478) - fix: preserve the caller’s JSON Schema key order for structured outputs -
ChatParameters.UnmarshalJSONholdsresponse_formatas raw bytes and the newChatResponseFormatreader splices them verbatim into OpenAI, Anthropic, Bedrock, Gemini (unless a uniontypearray needs normalizing) and Cohere requests, andResponsesTextConfigFormatJSONSchemare-encodes in the decoded key sequence, because OpenAI structured outputs generate fields in the declared order and a re-sorted schema silently changes model behavior (#6235) - fix: open reasoning stream items that carry both an encrypted payload and a visible summary as
thinkingblocks instead ofredacted_thinkingon the Anthropic egress, withisReasoningItemandreasoningPayloadAndSummaryshared by the native-reasoning and misclassified-function-call branches (#6292) - fix: replayed thinking blocks through the Anthropic ingress with a
bedrock/model prefix: content-lesstool_resultblocks are kept, interleaved text/tool-use/thinking order is preserved by the grouped converter,incompletemaps toerroron ConversetoolResult.status, and buffered reasoning is consumed by the item that owns it, so multi-turn tool use no longer wedges (#6346) - fix: Gemini/Vertex HTTP 400s on Claude Code traffic routed through
/anthropic/v1/messages: trailing assistant prefills are trimmed on both the Responses and chat paths, mid-conversationsystemmessages are inlined in place instead of hoisted intosystemInstruction, andAnthropicMessageResponsegainsExtraFields(#6363) - fix: alias Bedrock
toolUseId/toolResultIdvalues longer than 64 characters or outside[a-zA-Z0-9_.:-](such as Gemini thought-signature IDs) with a deterministic hash prefix, applied identically ontool_useandtool_resultin both the Responses and chat converters (#6300) - fix: route Grok (
xai.) models through theopenai/v1Mantle path on Bedrock and Bedrock Mantle, since they have no Converse equivalent (#6022) - fix: register Bedrock Mantle in
ProviderSendsDoneMarkerso its streams end afterfinish_reasoninstead of waiting for a[DONE]marker (#6021) - fix: include OpenRouter embedding models from
/v1/embeddings/modelsinListModels, merged case-insensitively and best-effort (#6264) - fix: force
reasoning.effortto"none"for models that reason by default but do not support reasoning with tool calls when they advertisesupports_none_reasoning_effort, instead of droppingreasoningoutright (#6293) - fix: backfill upscale output resolution on Replicate from the
target/factorparams andmetrics.resolution_targetbands so resolution-tiered pricing bills the real output size (#6083) - fix: filter forwarded
Accept-Encodingto the codecsCheckAndDecodeBodycan decode (gzip,x-gzip,deflate,br,zstd,identity), restrict streaming endpoints togzip/identityviaSetPassthroughHeadersForStreaming, and decode chained content encodings in reverse order (#6360) - fix:
tool_sync_intervalhandling: negative values are rejected (the “disable sync” semantic is gone now that the connection checker drives discovery and liveness together),ResolveToolSyncIntervalfollows the global setting for sub-second values, a fresh per-call checker starts onEnableClientand on a sticky-to-per-call flip, andMCPManager.UpdateToolSyncInterval,ConnectionCheckerManager.SetGlobalInterval/ApplyGlobalInterval/RetimeClientandClientConnectionChecker.SetHealthyIntervalhot-reload the global cadence and re-time running checkers in place;GetMCPConfigcarries the stored global interval (#6502) - fix:
SetClientToolsandUpdateClientCredentialsreplace the MCP tool map instead ofmaps.Copy-merging into it, so a tool removed upstream is evicted from memory once the database has dropped it (#6484) - fix: per-call shared-credential MCP clients (
oauth,headers,none) refresh tools synchronously on credential update instead of returningErrMCPReconnectNotApplicable; disabled per-call clients and per-user auth types keep the sentinel (#6483) - fix: park a failed
EnableClientdial atDisabledinstead ofUnstable, addErrMCPEnableConnectFailedso callers do not roll back the persisteddisabledflag, and guardisEnableableon both state and config so the admin can retry (#6431) - fix:
output_item.donereplaces server-side tool item shells (web_search_call,code_interpreter_call,image_generation_call) in the Responses streaming accumulator so their full payload survives (#6475) - feat: send
s3://image and document references to Bedrock Converse as thes3Locationsource member instead of downloading the bytes and re-uploading them - Converse resolves the object itself, which skips a round trip and the 25 MiB inline cap entirely. Image format is derived from the object extension since nothing is fetched and there is noContent-Typeto read, and an extension-less object is rejected up front rather than producing an opaque 400 (#6239) - feat: resolve Vertex URL sources per model family rather than inlining everything - a
gs://URI is now forwarded to Gemini/Gemma asfileData.fileUri(the documented form, resolved under the caller’s own project IAM, and the only thing that keeps multi-hundred-MB video inputs viable) and read from Cloud Storage with the request key’s own Google credentials for Claude-on-Vertex, which accepts base64 sources only.http(s)is still always fetched: forwarding one was measured against the harness and Vertex rejected every endpoint shape withURL_REJECTED-REJECTED_FC_TOO_MANY_PENDING(#6239) - fix: always emit a Gemini candidate carrying its finish reason on
generateContent, even when nothing visible was generated - a thinking model that spends its whole output budget before emitting a token is a successful 200 with an empty answer, butCandidatesisomitempty, so dropping that candidate produced a body with nocandidateskey at all and left a loneusageMetadataobject that every Gemini-shaped client dereferences blind (#6239) - fix: drop payload-free Gemini parts when assembling a candidate - every
Partfield isomitempty, so such a part marshals to exactly{}; the harness observed one on the wire when a transcription request for an unintelligible tone came back asparts:[{}], where it is noise a client will try to read and it masks the contentless case by making the parts slice look non-empty (#6239) - fix: accept a bare model identifier on Bedrock rerank by synthesizing the foundation-model ARN from the resolved region - Rerank is the one Bedrock surface that names its model by ARN rather than by bare ID, so all three rerank drop-ins in the provider harness 400’d on
amazon.rerank-v1:0. The partition is derived from the region (aws,aws-cn,aws-us-gov) so GovCloud and China build a correct ARN, and an explicit ARN still passes through untouched (#6239) - fix: stop stripping
file_urlfrom OpenAI-shaped chat file blocks on marshal - dropping it produced{"type":"file","file":{}}and an upstream complaint about a missingfile_id, which hid the fact that a source had been discarded. Providers that cannot take a URL now say so by name, and any OpenAI-compatible endpoint that does accept one keeps working without a Bifrost change (#6239) - fix: leave URL content sources Bifrost cannot download in place on the OpenAI and native-Anthropic paths instead of failing the request - only
http(s)is fetched, and whether ags://,s3://or scheme-less reference is usable is the provider’s call, so the source now travels as{"type":"url"}and the platform answers for itself (#6239) - perf: JSON serialization on the hot path: shared MCP tools cache their serialized bytes on
ChatTool(EnsureSerialized,precomputeToolSerialization) so catalog tools are marshalled once, andOrderedMap.MarshalJSONwrites compact JSON directly into a buffer with an inline HTML-safe string escaper instead of re-routing every nested map throughMarshalSorted, pinned by a byte-identity fuzz harness (#6241, #6242) - perf: allocation and tracing reductions on the request path:
StartSpanIDandSpanFromHandleon the tracer withSpan.SetAttributesfor bulk writes, a resolved-once attribute block inexecuteRequestWithRetries, reusable worker delivery timers,Span.Resetkeeping map capacity,reservedKeysas a set, pre-sizeduserValues, logging context reads deferred to the final chunk, no redundantfmt.Sprintfin logger calls, cached plugin span names, compact JSON request bodies,math/rand/v2inGetRandomString, and aHasPluginLogsguard before draining plugin logs (#5657, #5956, #5957, #6211) - chore: remove the legacy
gen_ai.*-namespaced Bifrost-internal attribute constants,AttrPromptTokens/AttrCompletionTokens,AttrLegacyRetryCountand the nanosecondAttrTimeToFirstTokenin favor of the canonicalbifrost.*keys (#6403) - chore: build with Go 1.26.6 (#6269)
1.6.0
- feat: batch accounting: the
batch_jobstable and its lifecycle store API (UpsertBatchJob,GetBatchJob,ListDueBatchJobs,ClaimBatchJob,MarkBatchJobAggregateLogWritten,MarkBatchJobGovernanceReported,CompleteBatchJob,MarkBatchJobUnpriceable,FailBatchJob) with runner fencing onclaimed_atanduser_id,team_id,customer_idandsource_log_idattribution so settlement carries the creating request’s identity;batch_debugon logs; batch pricing in the model catalog (computeBatchTextCostwith catalog batch rates and a 0.5 default ratio,CalculateBatchCostDetailsForUsage,BatchResultsRequestrouted through the batch path); andpersistRecalcOutcomesshared by foreground and background recalculation (thanks @SahilChoudhary22!) (#5292, #5293, #6505) - feat: input/output/additional cost split: denormalized
input_cost,output_costandadditional_costcolumns on logs, carried through matviews, ClickHouse, the hybrid store, cost recalculation and the quota API, populated on fallback billing paths, with semantic cache cost folded into additional cost - feat: Bifrost overhead latency:
upstream_latencyandoverhead_latencycolumns on logs with avg, p90, p95 and p99 overhead aggregates inmv_logs_hourly, ClickHouse, Postgrespercentile_contand the Go-side SQLite/MySQL histograms, theoverhead_breakdowncolumn for the per-span self-time decomposition, andCompleteAndFlushTracehanding connectors a copy of the trace without breakdown spans unless the plugin implementsOverheadSpanConsumer(#5533, #5534, #6388, #6389) - feat:
video_edit_inputcolumn on logs for the new video edit request type (#6270) - feat: new pricing columns and cost computation: megapixel-tier image fields (
output_cost_per_image_above_{4,8,16,32,64}_megapixels) with a unified pixel-count tier ladder incomputeImageOutputCost; per-size and joint size+quality image rates for 1024x1536 and 1536x1024 with a priority chain of size+quality, quality-only, size-only, then flat per-image rate, andparseImageDimensionsso portrait and landscape sizes with equal pixel counts price correctly;input_cost_per_queryfor rerank; andultrafastservice tier rates (#6082, #6379, #6396) - feat: notifications store:
TableNotification,NotificationStore,CreateNotificationandListNotificationswith JSON-serialized role IDs (#6207) - feat:
gencachegeneration-stamped memo cache, withGetProvidersForModelandGetModelsForProvidermemoized until any backing store advances its write generation (#5641, #6224) - feat:
DimensionScopeinqueryscopeandapplyDimensionCeilingon rankings, histograms and key-pair queries so grouped analytics only expose organisation ids the caller may see;getAvailableFilterDatano longer passes an empty id list to the redaction lookups, which returned every row (#6262) - feat:
ObservabilityLimits(per-plugin semaphore size and inject timeout) with context-boundedInjectcalls andDeadlineExceededaccounting (#6341) - feat:
GetSharedOauthTokensByConfigIDsbatch lookup on the config store so shared-OAuth MCP clients projectneeds_reauthwhen their token row is invalidated (#6429) - feat:
mcp_library_sync_interval: 0disables MCP library sync (MCPLibrarySyncDisabled),file://catalog URLs resolve throughdatasheet.FilePathFromURLwithout retry backoff, andResolveFrameworkPricingConfigno longer backfills a zero interval (#6195) - feat:
ReloadComplexityAnalyzerConfigonServerCallbacksfor the routing handler (#6146) - feat:
service_tiercopied from the processed stream response intoStreamAccumulatorResultinProcessStreamingChunk(#6236) - fix: resolve runtime provider
together(and variants such astogether_ai, matched withstrings.Contains) to the datasheet identity for catalog reads and price configured aliases throughAliasConfig.ModelName, thenModelID, then the alias key (thanks @dani29!) (#6257, #6320) - fix: escape every RediSearch special character in TAG query values in the Redis vector store, iterating bytes rather than runes (thanks @AdityaPainuli!) (#5351)
- fix: redact sensitive and identity-aware-proxy request headers at
SetTraceRequestHeadersso every connector (Datadog, OTEL, BigQuery, Kafka, Pub/Sub) receives redacted values (#6371) - fix:
supports_none_reasoning_effortdatasheet flag wired throughextractSupportedParamsanddropUnsupportedParamsso models that reason by default getreasoning.effort: "none"instead of losingreasoning(#6293) - fix: reject negative
tool_sync_intervalatUpdateMCPClientConfigand on config file load, treat the value as whole minutes, and carry the stored global interval intoGetMCPConfig(#6409, #6502) - perf:
spanHandlecarries the*Spanpointer soEndSpan,SetAttributeandSpanFromHandleskip the per-call trace and span scan, alongside bulk span attribute writes and reusable delivery timers in the tracing hot path (#5657, #5956, #6387) - chore: remove legacy
gen_ai.*attribute emission from the tracer in favor of the canonicalbifrost.*keys (#6403) - chore: close leaked Postgres pools and a stale hardcoded date in logstore tests (#6351)
- chore: build with Go 1.26.6 (#6269)
- chore: upgraded core to v1.8.0
0.2.0
- fix: force
reasoning.effortto"none"indropUnsupportedParamswhen a model supports reasoning but notreasoning_with_tool_callsand advertisessupports_none_reasoning_effort; models without the flag still havereasoningdropped (#6293) - fix: clone
json.RawMessagevalues (such as a rawresponse_format) in the request copier so the compat clone never shares a backing array with the original request (#6235) - feat: add a no-op
HTTPTransportPreAuthHookfor the new pre-authentication transport phase (#6375) - chore: upgraded core to v1.8.0 and framework to v1.6.0
1.7.0
- feat: routing rules and the complexity router are extracted into the dedicated
routingplugin: governance now runs at priority 4 and routing at 5,PublishRoutingAllowlistandLoadBalanceProviderare exported onGovernancePluginandBaseGovernancePluginand are called from the routing plugin after rule evaluation instead of from governance’sPreRequestHook,runPreRequestRoutingis removed, andReloadRoutingRule,RemoveRoutingRuleand the routing rule and complexity analyzer handlers leaveGovernanceManagerandGovernanceHandlerforRoutingHandlerunder/api/routing/*(with deprecated/api/governance/*aliases) (#6144, #6145, #6146) - feat: batch usage reporting:
ReportBatchUsageapplies settled batch cost, tokens and requests to every budget and rate limit on aBatchUsageReportexactly once per request ID via a claim/release marker with a 7-day TTL, and charges the creating user’s tiers whenUserIDis present;BumpBudgetUsageandBumpRateLimitUsageare added toGovernanceStore; governance IDs, including VK-scoped, user-scoped and global wildcard budgets and rate limits, are collected for batch-create requests that carry no model (thanks @SahilChoudhary22!) (#5295, #6410, #6505) - feat: honor
BifrostContextKeySkipModelCheckinEvaluateVirtualKeyRequestso evaluate-only requests such as/inspectbypass the model allowlist while budgets, rate limits and provider checks still apply (#6479) - feat: add a no-op
HTTPTransportPreAuthHookfor the new pre-authentication transport phase (#6375) - chore: upgraded core to v1.8.0 and framework to v1.6.0
1.6.0
- feat: add a no-op
HTTPTransportPreAuthHookfor the new pre-authentication transport phase (#6375) - chore: upgraded core to v1.8.0 and framework to v1.6.0
1.7.0
- feat: batch accounting:
recordBatchJobLifecyclepersists batch state on create and retrieve,accountBatchResultssettles costs inline on the/resultspath under a 30-second bound,StartBatchAccountingSweeperre-drives jobs that timed out with a per-runner ownership identity,EmitBatchAggregateLogwrites the aggregate cost entry with the creating request’s identity and abifrost/<version>user agent,calculateBatchAggregateCostrepricesModel="mixed"rows per model breakdown during cost recalculation (foreground and background, via the sharedpersistRecalcOutcomes), andbatch_debugis included in list queries;Inittakes abatchStore(nil disables batch accounting) (thanks @SahilChoudhary22!) (#5296, #6121, #6474, #6505) - feat: input/output/additional cost split persisted on every log and surfaced as
cost_breakdownin the log detail API, with cached-read, reasoning, guardrail, MCP and semantic cache detail; fallback billing paths, speech, transcription and OCR usages populate the split, and legacy total-only rows are attributed to input cost (#6511) - feat: Bifrost overhead latency:
upstream_latencyandoverhead_latencyforwarded fromPostLLMHookand backfilled from the root span’s authoritative attributes inInject, stamped only on the terminal entry per trace;computeOverheadBreakdownwalks the span tree, computes self-time per span, groups overhead-side spans into buckets (serialization, middleware, plugins, queue wait, key selection, convertor, networking, client delivery, scheduling, worker hand-off, provider-internal) and persists them tooverhead_breakdown, with streaming traces folding parse, convert, backpressure, transport CPU and client-write time into their own buckets and using the measured sum as overhead;ConsumesOverheadSpansreturns true so the plugin keeps receiving breakdown spans that other connectors no longer see (#5533, #6388, #6389, #6433, #6470, #6495) - feat:
service_tierfrom streamed Anthropic responses flows throughconvertToProcessedStreamResponseinto the log entry so repricing uses the served tier (#6236) - feat: video edit requests are logged with their input (#6270)
- perf: identity and governance context reads are deferred past the non-final-chunk gate in
PostLLMHook, and JSON encoding in HTTP helpers uses sonic (#5957, #6268) - feat: add a no-op
HTTPTransportPreAuthHookfor the new pre-authentication transport phase (#6375) - chore: upgraded core to v1.8.0 and framework to v1.6.0
1.7.0
- feat:
addLatencyTagsforwardsupstream_latency_msandoverhead_latency_msas tags on both the generation and the trace, leaving unmeasured values unreported (#6345) - fix: sensitive and identity-aware-proxy request headers are redacted in
PostLLMHookbefore export (#6371) - feat: add a no-op
HTTPTransportPreAuthHookfor the new pre-authentication transport phase (#6375) - chore: upgraded core to v1.8.0 and framework to v1.6.0
1.6.0
- feat: add a no-op
HTTPTransportPreAuthHookfor the new pre-authentication transport phase (#6375) - chore: upgraded core to v1.8.0 and framework to v1.6.0
1.1.0
- chore: upgraded core to v1.8.0 and framework to v1.6.0
1.5.0
- feat:
bifrost_overhead_latency_microsecondshistogram derived from the root span’s overhead attribute, with a microsecond-scale bucket set (#6345) - chore: remove the legacy
gen_ai.*-namespaced Bifrost-internal attributes,gen_ai.usage.prompt_tokens/completion_tokensand the nanosecondtime_to_first_tokenattribute;buildSpanAttrsandentitySetFromAttrsread the canonicalbifrost.*keys andtime_to_first_chunkdirectly (#6403) - feat: add a no-op
HTTPTransportPreAuthHookfor the new pre-authentication transport phase (#6375) - chore: upgraded core to v1.8.0 and framework to v1.6.0
1.1.0
- feat: add a no-op
HTTPTransportPreAuthHookfor the new pre-authentication transport phase (#6375) - chore: upgraded core to v1.8.0 and framework to v1.6.0
1.0.0
- feat: initial release: the routing rules engine (
rules/) and the complexity router (complexity/) are extracted from the governance plugin into a dedicated routing plugin that depends on governance through a smallGovernanceinterface; it runs at priority 5, after governance has stamped the virtual key scope, and callsPublishRoutingAllowlistandLoadBalanceProviderafter rule evaluation so both act on the post-rule model (theHasRulesearly return moved intoapplyRoutingRulesso provider materialization still runs with no rules configured); routing rules and complexity analyzer config endpoints are served byRoutingHandlerat/api/routing/rulesand/api/routing/complexity-analyzer-config, with the legacy/api/governance/*paths registered as deprecated aliases on the same handlers (#6144, #6145, #6146) - feat: complexity routing extracts text from mixed-modality user turns (text plus image, file or audio blocks) instead of skipping the turn, and still produces no input for turns with no text at all (#6253)
1.6.0
- feat: add a no-op
HTTPTransportPreAuthHookfor the new pre-authentication transport phase (#6375) - chore: upgraded core to v1.8.0 and framework to v1.6.0
1.6.0
- feat:
bifrost_overhead_latency_microsecondshistogram measured across the HTTP transport hooks as total request time minus time blocked on upstream provider sockets, with a microsecond-scale bucket set (#6345) - chore:
x-bf-prom-*request headers are no longer consumed as Prometheus label dimensions incollectPrometheusKeyValuesandapplyCustomLabels(the prefix is still stripped from forwarded requests), and legacygen_ai.*attribute emission is removed (#6403) - feat: add a no-op
HTTPTransportPreAuthHookfor the new pre-authentication transport phase (#6375) - chore: upgraded core to v1.8.0 and framework to v1.6.0

