v1.5.10
Changelog
This release rebases Bifrost Enterprise on OSS transportsv1.6.10. It completes quarterly (fiscal) budget support end to end, carrying the fiscal quarter definition through access profiles and propagating operator budget resets and calendar-alignment switches across every cluster node. It also hardens SCIM: deprovisioning now cascades to virtual keys, access profiles, budgets and rate limits, and directory previews for large Google Workspace tenants return quickly instead of paging the whole directory.✨ Features
- Fiscal Quarter Definition Through Access Profiles - The budget reset config (fiscal quarter start month) is now copied into every budget built from an access profile, both top-level and per-provider, so a quarterly budget on a non-January fiscal year windows correctly instead of falling back to the calendar year. Budget introspection exposes the resolved quarter start month.
- Cluster-Wide Budget Reset Propagation - An operator budget usage reset is now gossiped to every node for all owner types (virtual key, team, customer, model limits and provider governance), so in-memory counters on peer nodes clear at the same time as the database row.
- Cluster-Wide Calendar Alignment Adoption - Switching a budget or rate limit to calendar alignment is propagated through two new gossip keys, and each node re-anchors the affected budgets and rate limits in memory instead of waiting for a restart.
- Enforcement For Unmanaged Virtual Keys - Virtual keys assigned directly to a user but not managed by an access profile now have their own budget and rate limits enforced in the pre-request hook, returning
402on an exhausted budget and429on an exhausted rate limit. Access-profile-managed keys keep their existing enforcement path. - Per-Model Budget Override Manager - The user detail sheet groups a provider’s own budget with its per-model budgets in one dialog, so operators can see and override provider and model limits together instead of one flat list.
- SCIM-Signal Login Admission - A SCIM-provisioned user whose OIDC token carries no role claim is now admitted at login when persisted SCIM signals (group membership and provisioned role) justify the role, instead of being rejected for a missing claim.
- Bounded Google Directory Previews - Interactive SCIM user previews for Google Workspace stop paging as soon as the preview limit is reached and report an unknown total (
-1). Connection verification still pages the full directory when an accurate count is required. Group-member fetching is parallelized with bounded worker pools and retries with jittered backoff that honoursRetry-After. - Virtual Key Creation On Reprovisioning - Reprovisioning a user who has an access profile now creates the virtual key if it is missing, instead of leaving the user without a usable key.
🌎 Open Source Features
- Quarterly Budget Windows - Budgets support a quarterly reset period with a configurable fiscal start month, so a fiscal year that does not begin in January windows correctly.
- Per-Model Budgets and Rate Limits - Virtual key provider configs accept budgets and rate limits scoped to individual models, surfaced in the UI through a unified budget override manager that groups provider and model budgets together.
- Budget Usage Reset Coverage - The reset budget usage flow now covers teams, customers, model limits and provider governance, not just virtual keys.
- Fiscal Quarter UI - The governance UI exposes the quarterly period with fiscal-quarter advanced settings, and provider cards show a model budget count in the header summary.
🐞 Fixed
- Usage Re-Seeded On Access Profile Reload - An access-profile reload no longer re-seeds usage onto budgets the node already tracks, so live counters are not overwritten with stale values.
- Budget Overrides Lost On Re-Sync - Operator-set per-model budget overrides now survive a usage-preserving re-sync, and the override handler resolves a per-model budget to the enforced governance row instead of a non-enforced one.
- SCIM Deprovision Left Orphans - Deprovisioning a SCIM user now cascades to their virtual keys, access profile assignment, budgets and rate limits through a shared
CascadeDeleteUserpath, which the API delete route also uses. - IdP Role Removals Bypassed Cascade -
SyncAllUserRolesroutes users removed at the IdP through the deprovision cascade instead of a raw user delete. - Token Refresh Deprovisioned SCIM Users - Users owned by SCIM push are skipped in the token-refresh decommission check, so a refresh no longer deprovisions a user the IdP still owns.
- Stale Roles Kept After Mapping Miss -
ExtractRolesreturns an authoritative empty slice when attribute mappings are configured but nothing matches, so previously granted roles are cleared instead of retained. - Attributes Missing After Refresh -
department,titleand mapped metadata attributes are backfilled into claims at token-refresh time for Entra and Auth0 attribute mappings. - Calendar Alignment Semantics - Enabling calendar alignment preserves the currently open window and applies from the next period, instead of truncating the window in flight.
- Together Pricing Lookup - Fixed the pricing provider lookup for Together so model costs resolve correctly.
- Encrypted Reasoning Verification - Patched encrypted reasoning content that providers rejected as unverifiable.
- Gemini Reasoning Replay - Standalone Gemini reasoning messages are no longer skipped when converting Responses history to Gemini contents, and a consumed reasoning item’s thought text is carried alongside the signature the preceding function call took from it.
- Bedrock Reasoning Blocks - Bedrock no longer receives a reasoning block with an absent text key, the replayed signature attaches to the first reasoning summary block, and signature-only replay blocks serialize to a shape Bifrost can decode.
- Cohere Encrypted Reasoning - Encrypted reasoning is emitted alongside the summary rather than instead of it, and the marker is parsed back into
EncryptedContenton ingress so it no longer reaches clients as visible reasoning text. - Replayed Reasoning Dropped - Messages carrying a non-nil but empty ContentBlocks list no longer drop replayed reasoning in the Anthropic, Bedrock and Cohere converters.
🗄️ Database Migrations
- add_budget_reset_config_column (OSS transports) - Adds the nullable
reset_config_jsoncolumn togovernance_budgetsto hold a budget’s fiscal-quarter definition. It is additive with no backfill, so it is safe during a rolling deploy: older binaries ignore the column and a NULL value reads back as the January default. Non-reversible: dropping the column would permanently delete every budget’s fiscal-quarter definition and silently re-window those budgets onto the calendar year. Take a backup ofgovernance_budgetsbefore upgrading if you need a path back to the previous release.
🐙 Closed OSS Issues
- #4851 - v1.6.2 and v1.6.3 governance rate-limit reset causes high CPU in BumpRateLimitUsage/updateRateLimitReferences
📀 Base OSS version
transports/v1.6.10
