Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions docs/changelogs/helm-v2.1.28.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
title: "v2.1.28"
description: "Helm v2.1.28 changelog - 2026-07-10"
---

<Update label="Bifrost Helm" description="v2.1.28">

## Changelog

- `bifrost.auditLogs.objectStorage` for archiving audit events to S3/GCS. Each flushed batch is written as a JSONL object (`{prefix}/audit-logs/YYYY/MM/DD/HH/{id}.jsonl`); set `compress: true` to gzip the output (`.jsonl.gz`). Supports `type` (s3/gcs), `bucket`, `prefix`, `compress`, and full S3 credential fields (`region`, `endpoint`, `accessKeyId`, `secretAccessKey`, `sessionToken`, `roleArn`, `forcePathStyle`) and GCS fields (`projectId`, `credentialsJson`). Renders into `audit_logs.object_storage`.
- `force_single_region` on `bifrost.providers.vertex.keys[*].vertex_key_config` — when `true`, skips automatic promotion of multi-region-only models to a multi-region endpoint. Enable for provisioned throughput. Renders into `vertex_key_config.force_single_region`.
- `calendar_aligned` on `bifrost.accessProfiles[*]` (top-level) — snaps all budget and rate-limit reset windows to calendar boundaries for the profile. Passes through into `access_profiles[*].calendar_aligned`.
- `calendar_aligned` on `bifrost.accessProfiles[*].budgets[*]` and `bifrost.accessProfiles[*].provider_configs[*].budgets[*]` — schema previously blocked this field; now matches parity with `governance.budgets[*].calendar_aligned`.
- `calendar_aligned` on `bifrost.governance.virtualKeys[*]` — was accepted by schema but not rendered into config. Now correctly emits `virtual_keys[*].calendar_aligned` in the generated config.
- `allowOnAllVirtualKeys` on `bifrost.mcp.clientConfigs[*]` — grants this MCP server access to all virtual keys without per-key assignment. Already wired in the template; now documented in `values.yaml`. Renders into `mcp.client_configs[*].allow_on_all_virtual_keys`.

</Update>
1 change: 1 addition & 0 deletions docs/docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -948,6 +948,7 @@
"item": "Helm",
"icon": "box",
"pages": [
"changelogs/helm-v2.1.28",
"changelogs/helm-v2.1.26",
"changelogs/helm-v2.1.25",
"changelogs/helm-v2.1.24",
Expand Down
10 changes: 10 additions & 0 deletions helm-charts/bifrost/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@ Official Helm charts for deploying [Bifrost](https://github.com/maximhq/bifrost)

## Changelog

### Upcoming

- Added `bifrost.auditLogs.objectStorage` for archiving audit events to S3/GCS. Supports `type` (s3/gcs), `bucket`, `prefix`, `compress`, and full S3 credential fields (`region`, `endpoint`, `accessKeyId`, `secretAccessKey`, `sessionToken`, `roleArn`, `forcePathStyle`) and GCS fields (`projectId`, `credentialsJson`). Renders into `audit_logs.object_storage`.
- Added `force_single_region` to `bifrost.providers.vertex.keys[*].vertex_key_config`. When `true`, skips automatic promotion of multi-region-only models to a multi-region endpoint. Enable for provisioned throughput. Renders into `vertex_key_config.force_single_region`.
- Added `calendar_aligned` to `bifrost.accessProfiles[*]` (top-level on each profile). Snaps all budget and rate-limit reset windows to calendar boundaries for the profile. Passes through directly into `access_profiles[*].calendar_aligned`.
- Added `calendar_aligned` to `bifrost.accessProfiles[*].budgets[*]` and `bifrost.accessProfiles[*].provider_configs[*].budgets[*]`. Schema previously blocked this field via `additionalProperties: false`; now parity with `governance.budgets[*].calendar_aligned`.
- Added `calendar_aligned` rendering for `bifrost.governance.virtualKeys[*].calendar_aligned`. Was in schema but not rendered into config. Now emits `virtual_keys[*].calendar_aligned` in the generated config.
- Added `allowOnAllVirtualKeys` to the `bifrost.mcp.clientConfigs[*]` example documentation. Field was already wired in the template; now visible in `values.yaml`. Renders into `mcp.client_configs[*].allow_on_all_virtual_keys`.
- Documented `calendar_aligned` in the `bifrost.governance.budgets[*]` example. Was already schema-supported; now shown in the `values.yaml` commented example.

### 2.1.27

- Added `bifrost.schemaUrl` to override the generated `config.json` `$schema` location for isolated deployments. It accepts HTTP(S), `file://`, or filesystem paths. When set, it is also exported as `BIFROST_SCHEMA_URL` in the pod; when empty (default), the env var is not injected and the public schema URL is used.
Expand Down
45 changes: 44 additions & 1 deletion helm-charts/bifrost/templates/_helpers.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -512,6 +512,7 @@ false
{{- if .customer_id }}{{- $_ := set $vk "customer_id" .customer_id }}{{- end }}
{{- if hasKey . "access_profile_id" }}{{- $_ := set $vk "access_profile_id" .access_profile_id }}{{- end }}
{{- if .rate_limit_id }}{{- $_ := set $vk "rate_limit_id" .rate_limit_id }}{{- end }}
{{- if hasKey . "calendar_aligned" }}{{- $_ := set $vk "calendar_aligned" .calendar_aligned }}{{- end }}
{{- if .provider_configs }}{{- $_ := set $vk "provider_configs" .provider_configs }}{{- end }}
{{- if .mcp_configs }}{{- $_ := set $vk "mcp_configs" .mcp_configs }}{{- end }}
{{- $vks = append $vks $vk }}
Expand Down Expand Up @@ -1554,7 +1555,49 @@ false
{{- if .Values.bifrost.auditLogs.hmacKey }}
{{- $_ := set $auditLogs "hmac_key" .Values.bifrost.auditLogs.hmacKey }}
{{- end }}
{{- if or (hasKey $auditLogs "disabled") $auditLogs.hmac_key }}
{{- if .Values.bifrost.auditLogs.objectStorage }}
{{- $aos := .Values.bifrost.auditLogs.objectStorage }}
{{- $aosConfig := dict "type" $aos.type "bucket" $aos.bucket }}
{{- if $aos.prefix }}
{{- $_ := set $aosConfig "prefix" $aos.prefix }}
{{- end }}
{{- if $aos.compress }}
{{- $_ := set $aosConfig "compress" true }}
{{- end }}
{{- if eq $aos.type "s3" }}
{{- if $aos.region }}
{{- $_ := set $aosConfig "region" $aos.region }}
{{- end }}
{{- if $aos.endpoint }}
{{- $_ := set $aosConfig "endpoint" $aos.endpoint }}
{{- end }}
{{- if $aos.accessKeyId }}
{{- $_ := set $aosConfig "access_key_id" $aos.accessKeyId }}
{{- end }}
{{- if $aos.secretAccessKey }}
{{- $_ := set $aosConfig "secret_access_key" $aos.secretAccessKey }}
{{- end }}
{{- if $aos.sessionToken }}
{{- $_ := set $aosConfig "session_token" $aos.sessionToken }}
{{- end }}
{{- if $aos.roleArn }}
{{- $_ := set $aosConfig "role_arn" $aos.roleArn }}
{{- end }}
{{- if $aos.forcePathStyle }}
{{- $_ := set $aosConfig "force_path_style" true }}
{{- end }}
{{- end }}
{{- if eq $aos.type "gcs" }}
{{- if $aos.projectId }}
{{- $_ := set $aosConfig "project_id" $aos.projectId }}
{{- end }}
{{- if $aos.credentialsJson }}
{{- $_ := set $aosConfig "credentials_json" $aos.credentialsJson }}
{{- end }}
{{- end }}
{{- $_ := set $auditLogs "object_storage" $aosConfig }}
{{- end }}
{{- if or (hasKey $auditLogs "disabled") $auditLogs.hmac_key $auditLogs.object_storage }}
{{- $_ := set $config "audit_logs" $auditLogs }}
{{- end }}
{{- end }}
Expand Down
88 changes: 88 additions & 0 deletions helm-charts/bifrost/values.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -3088,6 +3088,11 @@
},
"reset_duration": {
"type": "string"
},
"calendar_aligned": {
"type": "boolean",
"description": "Deprecated: set calendar_aligned on the parent access profile instead. The reconciler promotes any true value here to the profile's top-level calendar_aligned at load time.",
"default": false
}
Comment thread
greptile-apps[bot] marked this conversation as resolved.
},
"required": ["id", "max_limit", "reset_duration"],
Expand Down Expand Up @@ -3146,6 +3151,11 @@
},
"reset_duration": {
"type": "string"
},
"calendar_aligned": {
"type": "boolean",
"description": "Deprecated: set calendar_aligned on the parent access profile instead. The reconciler promotes any true value here to the profile's top-level calendar_aligned at load time.",
"default": false
}
Comment thread
greptile-apps[bot] marked this conversation as resolved.
},
"required": ["id", "max_limit", "reset_duration"],
Expand Down Expand Up @@ -3230,6 +3240,11 @@
"required": ["mcp_client_id", "tool_name", "action"],
"additionalProperties": false
}
},
"calendar_aligned": {
"type": "boolean",
"description": "Snap budget and rate-limit reset windows to clean calendar boundaries (day, week, month, year) for this profile",
"default": false
}
},
"required": ["name"],
Expand All @@ -3244,6 +3259,69 @@
},
"hmacKey": {
"type": "string"
},
"objectStorage": {
"type": "object",
"description": "Optional object storage for archiving audit events to S3/GCS. Each flushed batch is written as a gzipped JSONL object at {prefix}/audit-logs/YYYY/MM/DD/HH/{id}.jsonl[.gz], in addition to the database.",
"properties": {
"type": {
"type": "string",
"enum": ["s3", "gcs"],
"description": "Object storage backend type"
},
"bucket": {
"type": "string",
"description": "Bucket name"
},
"prefix": {
"type": "string",
"description": "Base key path for stored audit objects; audit-logs/ is appended under it",
"default": "bifrost"
},
"compress": {
"type": "boolean",
"description": "Enable gzip compression for stored objects",
"default": false
},
"region": {
"type": "string",
"description": "AWS region (S3 only)"
},
"endpoint": {
"type": "string",
"description": "Custom S3-compatible endpoint for MinIO/R2 (S3 only)"
},
"accessKeyId": {
"type": "string",
"description": "AWS access key ID; omit to use default credential chain (S3 only)"
},
"secretAccessKey": {
"type": "string",
"description": "AWS secret access key (S3 only)"
},
"sessionToken": {
"type": "string",
"description": "AWS STS session token (S3 only, optional)"
},
"roleArn": {
"type": "string",
"description": "AWS IAM role ARN to assume via STS (S3 only)"
},
"forcePathStyle": {
"type": "boolean",
"description": "Use path-style S3 URLs; required for MinIO (S3 only)",
"default": false
},
"projectId": {
"type": "string",
"description": "GCP project ID override (GCS only)"
},
"credentialsJson": {
"type": "string",
"description": "GCP service account credentials JSON or file path; omit for Application Default Credentials (GCS only)"
}
},
"required": ["type", "bucket"]
}
}
},
Expand Down Expand Up @@ -4661,6 +4739,11 @@
"type": "string",
"description": "Authentication credentials (can use env. prefix)"
},
"force_single_region": {
"type": "boolean",
"description": "When true, always call the configured region and skip automatic promotion of multi-region-only models to a multi-region endpoint. Enable for provisioned throughput.",
"default": false
},
"deployments": {
"type": "object",
"additionalProperties": {
Expand Down Expand Up @@ -5568,6 +5651,11 @@
"type": "string",
"description": "Authentication credentials (can use env. prefix)"
},
"force_single_region": {
"type": "boolean",
Comment thread
greptile-apps[bot] marked this conversation as resolved.
"description": "When true, always call the configured region and skip automatic promotion of multi-region-only models to a multi-region endpoint. Enable for provisioned throughput.",
"default": false
},
"deployments": {
"type": "object",
"additionalProperties": {
Expand Down
30 changes: 30 additions & 0 deletions helm-charts/bifrost/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,7 @@ bifrost:
# project_id: "my-gcp-project"
# region: "us-central1"
# auth_credentials: "env.GOOGLE_CREDENTIALS"
# force_single_region: false # Set true for provisioned throughput to skip multi-region promotion
#
# # AWS Bedrock example (requires bedrock_key_config)
# bedrock:
Expand Down Expand Up @@ -484,6 +485,9 @@ bifrost:
# # oauth_config is registered via the API (POST /api/mcp/clients), not configured here.
# authType: "oauth"
# oauthConfigId: "my-oauth-config-id" # ID of the OAuth config created in Bifrost
# # When true, this MCP server is accessible to all virtual keys without explicit per-key assignment.
# # If a virtual key has an explicit MCP config for this server, that config takes precedence.
# allowOnAllVirtualKeys: false
# toolSyncInterval: "10m" # Global tool sync interval (Go duration string, e.g. "10m", "1h", "0s")
# Tool manager configuration
toolManagerConfig:
Expand Down Expand Up @@ -705,6 +709,7 @@ bifrost:
# - id: "budget-1"
# max_limit: 100
# reset_duration: "1M" # Supports: 30s, 5m, 1h, 1d, 1w, 1M, 1Y
# calendar_aligned: false # Snap reset to calendar boundaries (e.g. 1M resets on the 1st)
rateLimits: []
# - id: "rate-limit-1"
# token_max_limit: 100000
Expand Down Expand Up @@ -753,6 +758,7 @@ bifrost:
# value: "sk-bf-..." # Optional - auto-generated if omitted
# is_active: true
# expires_at: "2026-12-31T23:59:59Z" # Optional RFC3339 expiry; requests rejected once passed. Omit for no expiry
# calendar_aligned: false # Snap all budget resets for this key to calendar boundaries
# team_id: "team-1" # Mutually exclusive with customer_id
# customer_id: "" # Mutually exclusive with team_id
# rate_limit_id: "rate-limit-1"
Expand Down Expand Up @@ -1033,11 +1039,13 @@ bifrost:
# - name: "platform-default"
# description: "Default platform profile"
# is_active: true
# calendar_aligned: false # Snap all budget/rate-limit resets to calendar boundaries
# tags: ["platform", "default"]
# budgets:
# - id: "ap-budget-1"
# max_limit: 100
# reset_duration: "1M"
# calendar_aligned: false # Snap this budget's reset to calendar boundaries
# rate_limit:
# id: "ap-rate-limit-1"
# token_max_limit: 200000
Expand All @@ -1059,6 +1067,28 @@ bifrost:
auditLogs:
disabled: false
hmacKey: ""
# Object storage archival for audit events (optional)
# When configured, each flushed batch of audit events is written as a JSONL object at
# {prefix}/audit-logs/YYYY/MM/DD/HH/{id}.jsonl in addition to the DB.
# Set compress: true to gzip the objects ({id}.jsonl.gz).
# objectStorage:
# type: s3 # Options: s3, gcs
# bucket: "" # Bucket name
# prefix: bifrost # Base key path (audit-logs/ is appended under it)
# compress: false # Enable gzip compression for stored objects
Comment thread
coderabbitai[bot] marked this conversation as resolved.
#
# # S3 configuration (when type is s3)
# region: us-east-1
# endpoint: "" # Custom endpoint for MinIO/R2
# accessKeyId: "" # Leave empty to use default AWS credential chain
# secretAccessKey: ""
# sessionToken: "" # AWS STS session token (optional)
# roleArn: "" # AWS IAM role ARN to assume via STS
# forcePathStyle: false # Set true for MinIO
#
# # GCS configuration (when type is gcs)
# projectId: ""
# credentialsJson: "" # Service account JSON, omit for default credentials

# Large payload optimization - streams large payloads without full materialization
# largePayloadOptimization:
Expand Down
Loading
Loading