v1.5.7
Changelog
This release adds temporary per-user budget overrides with cluster-safe propagation, automatic virtual key attachment for identity-authenticated requests without an explicit key, and a redesigned Access Profile editor with per-model rate limits. It also fixes a class of multi-node budget/rate-limit accounting bugs (phantom usage on override edits, drifting reset times, cloning double-counts) and closes several identity/SCIM correctness gaps.✨ Features
- Per-User Budget Overrides - Admins can temporarily raise or lower a user’s effective access-profile budget from the User Detail Sheet, in “cycles” or “forever” mode, gated behind the
AccessProfiles.Updatepermission. Overrides propagate cluster-wide, survive access-profile cloning and propagation, and are correctly reconciled when a node joins or rejoins the cluster mid-override. - Auto-Attach Virtual Key for Identity-Authenticated Requests - Inference requests authenticated via an identity provider but arriving without an explicit virtual key now automatically resolve and attach the user’s first active, non-expired access-profile-managed VK, so governance and billing still attribute usage correctly.
- Access Profile Editor Redesign - The Access Profile editor and detail view now use a collapsible outline/tree layout instead of an accordion, with compact meta chips, an “All models” toggle, MCP tool access details, and read-only workspace-level budget context shown inline on each provider row.
- Per-Model Rate Limits on Access Profiles - Access profile provider model budget groups now support per-model rate limits (tokens and requests) alongside existing per-model budgets, with usage hydrated live from the generated model config and surfaced in the User Detail Sheet’s three-level Rate Limits hierarchy.
- Blocked Models and Weight on Access Profiles - Access Profile per-provider configs gained a
blacklisted_modelsdenylist and aweightload-balancer seed, matching the fields already available on standalone Virtual Keys. - Async Role Attach/Detach - Attaching or detaching a role from more than 100 users is now offloaded to a background job with live WebSocket progress in the Role Sheet, instead of blocking the request.
- SCIM Provider Lifecycle Endpoints - Added dedicated
POST(create) andDELETEendpoints for SCIM providers, so the setup wizard no longer silently creates providers viaPUT;PUTon a non-existent provider now returns404, andDELETEon an active provider returns409until it is disabled. - SCIM Reliability Improvements - SCIM group-membership reconciliation is now batched with async offload for large groups, group deletes offload to a background job, PATCH requests apply mixed replace/add/remove operations correctly and no longer clear unrelated attributes, and SCIM-provisioned team-to-business-unit edges carry provenance metadata so OIDC claim syncs cannot clear them.
- Identity Resolution Fallback and Caching - Local user resolution now falls back to email when an IdP
subdoes not match, adds a cluster-evicted in-memory identity cache to avoid a DB round-trip per request, and fails closed on unresolvable identities under enforcement. - Cluster-Wide Model Refresh - Pressing “Refresh models” on one node now propagates the refresh to every peer via a new gossip entity type, instead of only updating the local node’s catalog.
- Guardrail Providers - Added Lakera Guard v2 and Repello Argus as guardrail integrations.
🌎 Open Source Features
- Virtual Key Budget Overrides - The database schema, governance store, admin APIs, and UI now support temporary budget overrides for virtual keys, configured via
override_mode,override_cycles_total, andoverride_anchor_reset. - User Scope for Routing and Pricing - Routing rules and pricing overrides can be scoped to individual users, with a
user_idCEL variable and an enterprise user picker. - Access Profile Config Schema -
config.schema.jsonnow acceptsblacklisted_models,weight, andmodel_budgetson access profile provider configs, which previously failed schema validation. - Background Model Catalog Refresh - Each provider’s list-models response is re-fetched in the background on a configurable
live_models_sync_interval(default 1 hour,0disables), so models an upstream adds after boot no longer stay invisible until restart. - Stream Truncation Detection - Added stream-death detection across all providers so an upstream connection drop surfaces as an error instead of a clean
[DONE]. - Database Connection Controls - Added
conn_max_idle_time,cache_ttlfor password-command credential resolution, andmatview_refresh_timeoutbounding materialized view refresh time. - OTel Export Timeout - Added
export_timeout(default 5s) so a slow or unreachable collector cannot hold an export goroutine indefinitely. - Lakera and Repello Argus Guardrails - Added as OSS guardrail integrations with configuration docs and UI branding.
- SSO Additional Scopes -
config.schema.jsonnow acceptsadditionalScopesfor requesting extra OAuth scopes beyond the base set.
🐞 Fixed
- Multi-Node Budget Override Phantom Usage - Override edits no longer inflate budget, token, and request usage across cluster nodes; override mutations now propagate as configuration-only reloads instead of full usage rebases.
- Multi-Node Budget Reset Drift - Reset times for sub-day rolling budgets (1h, 30m) are now computed from a fixed grid anchored to creation time instead of each node’s own clock, and override cycle counts are derived from that anchor instead of stored and re-decremented.
- Budget/Rate-Limit Cloning - Cloning no longer copies row IDs (which caused double-counted usage) but does preserve
IDandCreatedAtwhere needed for reset-window continuity, and now preservesOverrideCyclesTotal/OverrideAnchorReset. - Cluster Join Override Sync - A node that joins or rejoins gossip while a budget override is active now reconciles override state from the database instead of missing it entirely.
- Case-Insensitive Email and User Lookups -
GetUserByEmail,GetSoftDeletedUserByEmail, and/api/userssearch are now case-insensitive and trim whitespace. - Guardrail Span Names - Guardrail child spans now follow the
plugin.<name>.<stage>naming convention expected by observability connectors. - Guardrail Tool Extraction - Guardrail providers now receive tool definitions for Responses and Count Tokens requests, not just Chat requests, and Gray Swan metadata headers are consistently sourced from trusted context.
- Identity Cache Race - A sharded per-subject lock now guards identity cache resolve/evict so a concurrent user delete or rename cannot be lost to an in-flight lookup.
- Auth Enforcement Bypass - Identity-provider JWTs and opaque browser session cookies could previously bypass identity resolution when
enforceAuthOnInferencewas disabled; both now always attempt resolution. - SCIM RFC 7644 Conformance - SCIM filter
eqcomparisons are now case-insensitive and plus-addressed emails round-trip correctly. - SCIM PATCH Semantics - Partial PATCH updates no longer clear mapped attributes omitted from the payload, and combined replace+add/remove operations on group members now apply in order.
- SCIM Group Claim Detection - Claims that look like group identifiers (e.g.
groups) now default to group-type SCIM matching automatically. - Cross-IdP Deprovisioning - SCIM reconciliation now filters by
(source_name, source_id)so switching identity providers no longer deprovisions users imported by a different provider. - Bedrock Guardrail Error Message - The ARN parse error now names the expected field and shape instead of surfacing the SDK’s opaque error.
- Reduced Log Verbosity - DAC, access-profile, and identity-aware-proxy log lines that fire on every request were downgraded from
InfotoDebug. - Connector Whitespace Trimming - BigQuery, Datadog, Kafka, and Pub/Sub connector config fields now trim leading/trailing whitespace on save.
- Datadog Error Metrics Parity - The
bifrost.errors.totalDatadog metric now carries a normalizedstatus_codetag, matching Prometheus and OTEL.
🐙 Closed OSS Issues
- #4215 - HuggingFace models show provider ID twice in
/v1/models, which breaks requests - #4851 - v1.6.2 and v1.6.3 governance rate-limit reset causes high CPU in
BumpRateLimitUsage/updateRateLimitReferences - #5329 -
/api/logsreturns an incorrecttotal_countfor time ranges of 24 hours or longer - #5433 -
/genaiendpoint rejects validminLength/maxLengthin tool schemas (400 INVALID_ARGUMENT) - #5504 - vLLM streaming Responses API hangs forever, chunks are silently discarded and the request never completes
- #5546 - Upstream SSE stream death swallowed into a clean
[DONE], so dead streams appear successful - #5551 -
transports/bifrost-http/libtest package does not compile on dev (MockConfigStoremissingUpdateBudgetOverride) - #5552 - Refresh the live model catalog in the background (models added after boot stay invisible until restart)
- #5554 - Provider reload wipes the live model catalog before refetching, so a transient list-models failure empties it
- #5555 -
*StreamRequestreturns(nil, nil)for empty streams, so consumers hang forever on a nil-channel receive
📀 Base OSS version
transports/v1.6.7
