github maximhq/bifrost framework/v1.7.0
Framework v1.7.0

7 hours ago

Framework Release v1.7.0

  • feat: model allow and block lists accept regex: entries. The provider-key aggregate keeps an exact name next to a pattern that also covers it, the catalog allow check tries a pattern against the bare name and provider/model, and listings skip pattern entries
  • fix: ClickHouse log store deletes no longer run as heavyweight ALTER TABLE ... DELETE mutations. The retention cleaner issued one such mutation per 100 rows, each rewriting the whole current-month part, and the once-a-minute stale-processing sweeps issued one per table unconditionally, filling replica disks in minutes. Every delete on the ClickHouse store (retention sweep, Flush/FlushMCPToolLogs, UI log deletes, async job and webhook delivery expiry) is now a single lightweight DELETE FROM ... WHERE per run, skipped entirely when nothing matches. The table TTL derived from logs_store.retention_days is now reconciled on every startup with MODIFY TTL (metadata only), so changing the value reaches existing tables; 0 leaves an existing TTL untouched (#7098)
  • feat: access profiles and governance projects reference Virtual MCPs through virtual_mcp_name, so config files are portable across environments instead of carrying database-assigned integer IDs. Names resolve to stored records on startup and a name that matches nothing is refused; virtual_mcp_id is deprecated, still accepted, and wins when both are set. mcp_configs ({ mcp_client_id, tools_to_execute }) replaces the mcp_servers and mcp_tool_overrides include-exclude model with a single allowlist, where ["*"] grants all tools including future ones, [] grants none, and a named list grants only those; the old keys are deprecated, still accepted, and folded into the new shape at load time (#7181)
  • feat: MCPToolLog records governance entity names beside their IDs, so MCP tool logs carry the same attribution shape the logs table has instead of rendering raw UUIDs in the dashboard. user_name, team_name, customer_name and business_unit_name stop being gorm:"-" transients and become storage; the multi-valued team_ids/team_names, customer_ids/customer_names and business_unit_ids/business_unit_names sets are stored as index-aligned JSON arrays; and budget_ids and rate_limit_ids are recorded id-only, as in logs. Names are written from the request context at ingestion through the new MCPToolLog.ApplyGovernance in framework/logstore/governance.go, with nothing resolved on read. Added by migration mcp_tool_logs_add_governance_snapshots (#7154)
  • feat: endpoint-attributed MCP observations are carried in the standard logging pipeline, so inspected MCP tool calls are logged with bounded identity (device, app key, server label, tool name, decision) sourced from the gateway rather than from payload-supplied headers. SetMCPObservation attaches the attribution to a BifrostContext and applyMCPObservation writes it onto the MCPToolLog from both PreMCPHook and PostMCPHook, snapshotting the observation so it cannot alias across async log entries (#6959)
  • feat: the error_type classification vocabulary is threaded through the framework so bifrost_error_requests_total can carry a normalized fault-domain label alongside status_code (#7141)
  • feat: model pricing supports time-of-day peak and off-peak rates. TableModelPricing gains off_peak_cost_multiplier (a nullable float) and peak_hours (a JSON-serialized PeakHoursSchedule of recurring weekly windows using IANA timezone names, weekday numbers and half-open HH:MM intervals that may wrap past midnight), added by migration add_time_of_day_pricing_columns and aliased into the datasheet package so the JSON shape stays self-contained. The cost engine evaluates the schedule against the request start time and scales usage-based charges by the multiplier when the request falls outside every peak window, applied once in computeCostFromInput so every modality is covered; flat CostPerRequest and SearchQueriesCost fees are excluded, as is AdditionalCost, which is discounted independently through its own pricing rows. Both fields are exposed on PricingPatch in the OpenAPI and governance schemas, with off_peak_cost_multiplier bounded to (0, 1] (#6574, #6575, #6576)
  • feat: SecretVar.RedactedIfSecret() is used for non-credential fields in ProviderConfig.Redacted(), Config.GetAllKeys() and Config.RedactMCPClientConfig(), so regions, endpoints, service URLs and MCP connection strings surface as plaintext while anything env-var or vault-backed stays masked (#7085)
  • feat: GA realtime transcription sessions are routed, governed, logged and priced through the normal framework pipeline, resolving the routing model from the nested audio.input.transcription.model that arrives in session.update rather than from the connect URL (#7089)
  • feat: a use_openai_endpoints column on the provider keys table, added by migration add_use_openai_endpoints_column, opts a Bedrock key or alias into Bedrock's OpenAI-compatible endpoints instead of Converse (#7073)
  • feat: the reserved tool-namespace list a provider keeps for its own server tools is read from the datasheet row reserved_tool_namespaces, so a namespace collision check no longer requires a code change (#7084)
  • fix: exchangeRefreshToken includes client_secret only when the secret is non-empty, matching exchangeCodeForTokensWithPKCE. Public OAuth2 clients registered against servers that support only token_endpoint_auth_method: none have no secret, and unconditionally setting client_secret= sent an empty client_secret_post attempt that strict authorization servers answered with invalid_client, flipping the token row to needs_reauth even though the refresh token was valid (#7042)
  • fix: the virtual key allowed_models: ["*"] handling for governance added in #6767 is reverted, returning the wildcard-with-empty-synced-catalog case to its previous behaviour (#7053)

Installation

go get github.com/maximhq/bifrost/framework@v1.7.0

This release was automatically created and uses core version: v1.9.0

Don't miss a new bifrost release

NewReleases is sending notifications on new releases.