bifrost.governance in your values file and seeded into the database at startup.
The governance plugin must also be enabled for enforcement to take effect:See the Plugins page for plugin configuration details.
Admin Authentication
Protect the Bifrost dashboard and management API with username/password auth.Budgets
Spending caps that reset on a configurable period. Budgets are referenced by ID from virtual keys, teams, customers, or providers.| Reset duration | Syntax |
|---|---|
| 30 seconds | "30s" |
| 5 minutes | "5m" |
| 1 hour | "1h" |
| 1 day | "1d" |
| 1 week | "1w" |
| 1 month | "1M" |
| 1 year | "1Y" |
Rate Limits
Token and request-count caps per time window. Referenced by ID from virtual keys, teams, customers, or providers.Customers & Teams
Optional organizational hierarchy. Virtual keys can be assigned to customers or teams, inheriting their budgets and rate limits.Virtual Keys
Virtual keys are the primary access tokens issued to callers. They scope which providers, models, and underlying API keys are accessible.provider_configs[].key_ids and provider_configs[].keys are both supported in Helm values. Prefer key_ids for parity with config.json (key_ids should contain provider key names).
Use a virtual key in API calls:
Model Limits
Apply budgets and rate limits at the model level. Each entry is keyed onmodel_name (use "*" for all models), an optional provider, and a scope that determines who the limit applies to.
| Field | Default | Description |
|---|---|---|
id | — | Unique identifier |
model_name | — | Model name, or "*" to match all models |
provider | (all) | Provider name; omit to cover all providers |
scope | "global" | "global" (all traffic) or "virtual_key" (one VK) |
scope_id | — | Required when scope is "virtual_key" — the virtual key ID |
budget_id | — | References a governance.budgets entry |
rate_limit_id | — | References a governance.rate_limits entry |
Provider Governance
Apply budgets and rate limits at the provider level:Routing Rules
CEL-expression-based routing rules redirect requests to different providers or models based on request attributes.| Field | Description |
|---|---|
cel_expression | CEL expression evaluated against the request; if true, rule fires |
targets | Provider/model targets with weights |
fallbacks | Providers to try if all targets fail |
scope | global, team, customer, or virtual_key |
scope_id | Required for non-global scopes |
priority | Lower number = evaluated first |
Complexity Router Configuration
If you usecomplexity_tier in routing rules, you can seed the analyzer thresholds and keyword lists from Helm. The chart renders this block to governance.complexity_analyzer_config in config.json.
Omit this block, or leave complexityAnalyzerConfig: null, to use the built-in defaults.
In the default split mode, runtime UI and API edits are preserved while the matching Helm-rendered section is unchanged. When Helm changes a section, tier boundaries are replaced from the rendered
config.json, while keyword lists are merged additively with stored runtime keywords (union with duplicates removed). Use bifrost.sourceOfTruth: config.json only when Helm should replace stored governance state. See Source of Truth & Reconciliation for the full startup rules.Full Example
Access Profiles (Enterprise)
You can seed enterpriseaccess_profiles directly from Helm values. The chart renders bifrost.accessProfiles into top-level access_profiles in config.json.

