Conversation
This stack of pull requests is managed by Graphite. Learn more about stacking. |
📝 WalkthroughWalkthroughA Helm chart version bump from 2.0.14 to 2.0.15 introducing new configuration options for MCP auto-tool injection controls, WebSocket gateway tuning, governance pricing overrides, and enhanced client header forwarding capabilities. Schema constraints were relaxed for provider key configurations. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 3❌ Failed checks (2 warnings, 1 inconclusive)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
Confidence Score: 5/5Safe to merge; all findings are P2 style/quality suggestions with no blocking issues. The changes are well-structured and additive. The SSE connection string bug fix is correct. Template helpers consistently use
Important Files Changed
Reviews (1): Last reviewed commit: "helm chart upgrade" | Re-trigger Greptile |
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
helm-charts/bifrost/values.schema.json (1)
2891-3075:⚠️ Potential issue | 🟠 MajorKeep
virtualKeyProviderConfig.keys[]aligned with$defs.providerKey.This nested schema is now looser than the top-level
providerKeyschema. That weakens Helm validation and defers broken configs to runtime; a nestedvertex_key_configcan now pass withoutproject_id, even thoughcore/providers/vertex/vertex.gostill rejects an emptyproject_id.Suggested fix
"azure_key_config": { "type": "object", "properties": { "endpoint": { "type": "string", "description": "Azure endpoint (can use env. prefix)" }, "deployments": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Model to deployment mappings" }, "api_version": { "type": "string", "description": "Azure API version" } }, + "required": ["endpoint", "api_version"], "additionalProperties": false }, "vertex_key_config": { "type": "object", "properties": { "project_id": { "type": "string", "description": "Google Cloud project ID (can use env. prefix)" }, "project_number": { "type": "string", "description": "Google Cloud project number" }, "region": { "type": "string", "description": "Google Cloud region" }, "auth_credentials": { "type": "string", "description": "Authentication credentials (can use env. prefix)" }, "deployments": { "type": "object", "additionalProperties": { "type": "string" }, "description": "Model to deployment mappings" } }, + "required": ["project_id", "region"], "additionalProperties": false }, "vllm_key_config": { "type": "object", "properties": { "url": { "type": "string", "description": "VLLM server base URL (can use env. prefix)" }, "model_name": { "type": "string", "description": "Exact model name served on this VLLM instance" } }, + "required": ["url", "model_name"], "additionalProperties": false }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@helm-charts/bifrost/values.schema.json` around lines 2891 - 3075, The nested schema virtualKeyProviderConfig.keys[] is looser than the top-level $defs.providerKey and allows missing required fields (e.g., vertex_key_config.project_id) that the runtime (core/providers/vertex/vertex.go) expects; fix it by making the keys[] item schema reference the canonical providerKey ($ref to $defs.providerKey) or by copying the exact properties/required constraints from $defs.providerKey into the keys[] item so both schemas are identical (ensure vertex_key_config requires project_id/project_number/region as in providerKey).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@helm-charts/bifrost/README.md`:
- Line 7: The README advertises "Latest Version: 2.0.15" but install/upgrade
snippets still pin mixed image tags (e.g., v1.4.3, v1.5.0, v1.5.2); update those
snippets to either remove explicit image tags or change them to match the
chart's appVersion (appVersion: 1.4.11) so copy/paste installs deploy the
expected app version—search for the image tag strings (v1.4.3, v1.5.0, v1.5.2)
in README.md and replace them with either no tag (let the chart default) or with
v1.4.11 and ensure the "Latest Version: 2.0.15" header remains correct.
In `@helm-charts/bifrost/values.schema.json`:
- Around line 1231-1263: The pricingOverrides item schema currently only
documents virtual_key_id, provider_id, and provider_key_id but does not enforce
them for specific scope_kind values; add JSON Schema conditional rules under the
pricingOverrides->items object using "if"/"then" (or "oneOf" alternatives) that
require virtual_key_id when scope_kind is "virtual_key" or starts with
"virtual_key", require provider_id when scope_kind is "provider" or includes
"provider", and require provider_key_id for "provider_key" and
"virtual_key_provider_key"; ensure these conditions reference the existing
"scope_kind" discriminator and add appropriate required arrays so an object with
scope_kind "virtual_key_provider_key" cannot validate without all three IDs
(virtual_key_id, provider_id, provider_key_id).
In `@helm-charts/index.yaml`:
- Around line 4-24: The index entry for version 2.0.15 was hand-edited and has
an empty digest and mismatched metadata; regenerate the index from the packaged
chart artifact (bifrost-2.0.15.tgz) so the digest is computed and the entry
fields (maintainers/email, icon URL, home, etc.) match the chart’s Chart.yaml
values (e.g., support@getbifrost.ai and getbifrost.ai/favicon.png). Re-run the
helm repo index generation against the chart (or the CI step that produced the
package) to replace the manual entry for version 2.0.15 with the canonical data
extracted from the tarball.
---
Outside diff comments:
In `@helm-charts/bifrost/values.schema.json`:
- Around line 2891-3075: The nested schema virtualKeyProviderConfig.keys[] is
looser than the top-level $defs.providerKey and allows missing required fields
(e.g., vertex_key_config.project_id) that the runtime
(core/providers/vertex/vertex.go) expects; fix it by making the keys[] item
schema reference the canonical providerKey ($ref to $defs.providerKey) or by
copying the exact properties/required constraints from $defs.providerKey into
the keys[] item so both schemas are identical (ensure vertex_key_config requires
project_id/project_number/region as in providerKey).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: f0cd08ef-aa94-4a52-9c7f-ecb146200a7c
📒 Files selected for processing (5)
helm-charts/bifrost/Chart.yamlhelm-charts/bifrost/README.mdhelm-charts/bifrost/templates/_helpers.tplhelm-charts/bifrost/values.schema.jsonhelm-charts/index.yaml
| Official Helm charts for deploying [Bifrost](https://github.com/maximhq/bifrost) - a high-performance AI gateway with unified interface for multiple providers. | ||
|
|
||
| **Latest Version:** 2.0.14 | ||
| **Latest Version:** 2.0.15 |
There was a problem hiding this comment.
Update the example image tags alongside the chart bump.
The README now advertises 2.0.15, but several install/upgrade snippets in this file still pin mixed image tags (v1.4.3, v1.5.0, v1.5.2). Either align them with appVersion: 1.4.11 or drop the explicit tag so copy/paste installs do not silently deploy a different app version.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@helm-charts/bifrost/README.md` at line 7, The README advertises "Latest
Version: 2.0.15" but install/upgrade snippets still pin mixed image tags (e.g.,
v1.4.3, v1.5.0, v1.5.2); update those snippets to either remove explicit image
tags or change them to match the chart's appVersion (appVersion: 1.4.11) so
copy/paste installs deploy the expected app version—search for the image tag
strings (v1.4.3, v1.5.0, v1.5.2) in README.md and replace them with either no
tag (let the chart default) or with v1.4.11 and ensure the "Latest Version:
2.0.15" header remains correct.
| "pricingOverrides": { | ||
| "type": "array", | ||
| "description": "Scoped pricing overrides applied at runtime by the model catalog", | ||
| "items": { | ||
| "type": "object", | ||
| "properties": { | ||
| "id": { "type": "string", "description": "Unique pricing override ID" }, | ||
| "name": { "type": "string", "description": "Human-readable name for this override" }, | ||
| "scope_kind": { | ||
| "type": "string", | ||
| "enum": ["global", "provider", "provider_key", "virtual_key", "virtual_key_provider", "virtual_key_provider_key"], | ||
| "description": "Scope level for this override" | ||
| }, | ||
| "virtual_key_id": { "type": "string", "description": "Virtual key ID (required for virtual_key* scopes)" }, | ||
| "provider_id": { "type": "string", "description": "Provider ID (required for provider* scopes)" }, | ||
| "provider_key_id": { "type": "string", "description": "Provider key ID (required for provider_key and virtual_key_provider_key scopes)" }, | ||
| "match_type": { | ||
| "type": "string", | ||
| "enum": ["exact", "wildcard"], | ||
| "description": "How the pattern is matched against model names" | ||
| }, | ||
| "pattern": { "type": "string", "description": "Model name pattern to match" }, | ||
| "request_types": { | ||
| "type": "array", | ||
| "minItems": 1, | ||
| "items": { "type": "string" }, | ||
| "description": "Request types this override applies to" | ||
| }, | ||
| "pricing_patch": { "type": "string", "description": "JSON-encoded pricing fields to override" }, | ||
| "config_hash": { "type": "string", "description": "Internal hash for change detection (auto-managed)" } | ||
| }, | ||
| "required": ["id", "name", "scope_kind", "match_type", "pattern", "request_types"] | ||
| } |
There was a problem hiding this comment.
Enforce the scope-specific IDs in pricingOverrides.
virtual_key_id, provider_id, and provider_key_id are only documented in descriptions right now. A scope_kind: "virtual_key_provider_key" object with none of those fields still passes schema validation, so Helm will accept an override that cannot be resolved unambiguously.
Suggested schema tightening
"pricingOverrides": {
"type": "array",
"description": "Scoped pricing overrides applied at runtime by the model catalog",
"items": {
"type": "object",
"properties": {
"id": { "type": "string", "description": "Unique pricing override ID" },
"name": { "type": "string", "description": "Human-readable name for this override" },
"scope_kind": {
"type": "string",
"enum": ["global", "provider", "provider_key", "virtual_key", "virtual_key_provider", "virtual_key_provider_key"],
"description": "Scope level for this override"
},
"virtual_key_id": { "type": "string", "description": "Virtual key ID (required for virtual_key* scopes)" },
"provider_id": { "type": "string", "description": "Provider ID (required for provider* scopes)" },
"provider_key_id": { "type": "string", "description": "Provider key ID (required for provider_key and virtual_key_provider_key scopes)" },
"match_type": {
"type": "string",
"enum": ["exact", "wildcard"],
"description": "How the pattern is matched against model names"
},
"pattern": { "type": "string", "description": "Model name pattern to match" },
"request_types": {
"type": "array",
"minItems": 1,
"items": { "type": "string" },
"description": "Request types this override applies to"
},
"pricing_patch": { "type": "string", "description": "JSON-encoded pricing fields to override" },
"config_hash": { "type": "string", "description": "Internal hash for change detection (auto-managed)" }
},
- "required": ["id", "name", "scope_kind", "match_type", "pattern", "request_types"]
+ "required": ["id", "name", "scope_kind", "match_type", "pattern", "request_types"],
+ "allOf": [
+ {
+ "if": {
+ "properties": {
+ "scope_kind": {
+ "enum": ["provider", "provider_key", "virtual_key_provider", "virtual_key_provider_key"]
+ }
+ },
+ "required": ["scope_kind"]
+ },
+ "then": {
+ "required": ["provider_id"]
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "scope_kind": {
+ "enum": ["virtual_key", "virtual_key_provider", "virtual_key_provider_key"]
+ }
+ },
+ "required": ["scope_kind"]
+ },
+ "then": {
+ "required": ["virtual_key_id"]
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "scope_kind": {
+ "enum": ["provider_key", "virtual_key_provider_key"]
+ }
+ },
+ "required": ["scope_kind"]
+ },
+ "then": {
+ "required": ["provider_key_id"]
+ }
+ }
+ ]
}
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "pricingOverrides": { | |
| "type": "array", | |
| "description": "Scoped pricing overrides applied at runtime by the model catalog", | |
| "items": { | |
| "type": "object", | |
| "properties": { | |
| "id": { "type": "string", "description": "Unique pricing override ID" }, | |
| "name": { "type": "string", "description": "Human-readable name for this override" }, | |
| "scope_kind": { | |
| "type": "string", | |
| "enum": ["global", "provider", "provider_key", "virtual_key", "virtual_key_provider", "virtual_key_provider_key"], | |
| "description": "Scope level for this override" | |
| }, | |
| "virtual_key_id": { "type": "string", "description": "Virtual key ID (required for virtual_key* scopes)" }, | |
| "provider_id": { "type": "string", "description": "Provider ID (required for provider* scopes)" }, | |
| "provider_key_id": { "type": "string", "description": "Provider key ID (required for provider_key and virtual_key_provider_key scopes)" }, | |
| "match_type": { | |
| "type": "string", | |
| "enum": ["exact", "wildcard"], | |
| "description": "How the pattern is matched against model names" | |
| }, | |
| "pattern": { "type": "string", "description": "Model name pattern to match" }, | |
| "request_types": { | |
| "type": "array", | |
| "minItems": 1, | |
| "items": { "type": "string" }, | |
| "description": "Request types this override applies to" | |
| }, | |
| "pricing_patch": { "type": "string", "description": "JSON-encoded pricing fields to override" }, | |
| "config_hash": { "type": "string", "description": "Internal hash for change detection (auto-managed)" } | |
| }, | |
| "required": ["id", "name", "scope_kind", "match_type", "pattern", "request_types"] | |
| } | |
| "pricingOverrides": { | |
| "type": "array", | |
| "description": "Scoped pricing overrides applied at runtime by the model catalog", | |
| "items": { | |
| "type": "object", | |
| "properties": { | |
| "id": { "type": "string", "description": "Unique pricing override ID" }, | |
| "name": { "type": "string", "description": "Human-readable name for this override" }, | |
| "scope_kind": { | |
| "type": "string", | |
| "enum": ["global", "provider", "provider_key", "virtual_key", "virtual_key_provider", "virtual_key_provider_key"], | |
| "description": "Scope level for this override" | |
| }, | |
| "virtual_key_id": { "type": "string", "description": "Virtual key ID (required for virtual_key* scopes)" }, | |
| "provider_id": { "type": "string", "description": "Provider ID (required for provider* scopes)" }, | |
| "provider_key_id": { "type": "string", "description": "Provider key ID (required for provider_key and virtual_key_provider_key scopes)" }, | |
| "match_type": { | |
| "type": "string", | |
| "enum": ["exact", "wildcard"], | |
| "description": "How the pattern is matched against model names" | |
| }, | |
| "pattern": { "type": "string", "description": "Model name pattern to match" }, | |
| "request_types": { | |
| "type": "array", | |
| "minItems": 1, | |
| "items": { "type": "string" }, | |
| "description": "Request types this override applies to" | |
| }, | |
| "pricing_patch": { "type": "string", "description": "JSON-encoded pricing fields to override" }, | |
| "config_hash": { "type": "string", "description": "Internal hash for change detection (auto-managed)" } | |
| }, | |
| "required": ["id", "name", "scope_kind", "match_type", "pattern", "request_types"], | |
| "allOf": [ | |
| { | |
| "if": { | |
| "properties": { | |
| "scope_kind": { | |
| "enum": ["provider", "provider_key", "virtual_key_provider", "virtual_key_provider_key"] | |
| } | |
| }, | |
| "required": ["scope_kind"] | |
| }, | |
| "then": { | |
| "required": ["provider_id"] | |
| } | |
| }, | |
| { | |
| "if": { | |
| "properties": { | |
| "scope_kind": { | |
| "enum": ["virtual_key", "virtual_key_provider", "virtual_key_provider_key"] | |
| } | |
| }, | |
| "required": ["scope_kind"] | |
| }, | |
| "then": { | |
| "required": ["virtual_key_id"] | |
| } | |
| }, | |
| { | |
| "if": { | |
| "properties": { | |
| "scope_kind": { | |
| "enum": ["provider_key", "virtual_key_provider_key"] | |
| } | |
| }, | |
| "required": ["scope_kind"] | |
| }, | |
| "then": { | |
| "required": ["provider_key_id"] | |
| } | |
| } | |
| ] | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@helm-charts/bifrost/values.schema.json` around lines 1231 - 1263, The
pricingOverrides item schema currently only documents virtual_key_id,
provider_id, and provider_key_id but does not enforce them for specific
scope_kind values; add JSON Schema conditional rules under the
pricingOverrides->items object using "if"/"then" (or "oneOf" alternatives) that
require virtual_key_id when scope_kind is "virtual_key" or starts with
"virtual_key", require provider_id when scope_kind is "provider" or includes
"provider", and require provider_key_id for "provider_key" and
"virtual_key_provider_key"; ensure these conditions reference the existing
"scope_kind" discriminator and add appropriate required arrays so an object with
scope_kind "virtual_key_provider_key" cannot validate without all three IDs
(virtual_key_id, provider_id, provider_key_id).
| - apiVersion: v2 | ||
| appVersion: 1.4.11 | ||
| created: "2026-04-01T12:00:00.000000+00:00" | ||
| description: A Helm chart for deploying Bifrost - AI Gateway with unified interface for multiple providers | ||
| digest: "" | ||
| home: https://www.getmaxim.ai/bifrost | ||
| icon: https://www.getmaxim.ai/bifrost/bifrost-logo-only.png | ||
| keywords: | ||
| - ai | ||
| - gateway | ||
| - llm | ||
| maintainers: | ||
| - email: akshay@getmaxim.ai | ||
| name: Bifrost Team | ||
| name: bifrost | ||
| sources: | ||
| - https://github.com/maximhq/bifrost | ||
| type: application | ||
| urls: | ||
| - https://maximhq.github.io/bifrost/helm-charts/bifrost-2.0.15.tgz | ||
| version: 2.0.15 |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
python - <<'PY'
from pathlib import Path
chart_lines = Path("helm-charts/bifrost/Chart.yaml").read_text().splitlines()
index_lines = Path("helm-charts/index.yaml").read_text().splitlines()
def scalar(lines, key):
prefix = f"{key}:"
for line in lines:
stripped = line.strip()
if stripped.startswith(prefix):
return stripped.split(":", 1)[1].strip().strip('"')
return None
def maintainer_email(lines):
in_maintainers = False
for line in lines:
stripped = line.strip()
if stripped == "maintainers:":
in_maintainers = True
continue
if in_maintainers:
if stripped.startswith("email:") or stripped.startswith("- email:"):
return stripped.split(":", 1)[1].strip()
if stripped and not stripped.startswith("-") and not stripped.startswith("name:") and not stripped.startswith("email:"):
break
return None
def extract_index_block(lines, version):
for i, line in enumerate(lines):
if line.strip() == f"version: {version}":
start = i
while start >= 0 and not lines[start].startswith(" - apiVersion:"):
start -= 1
end = i
while end + 1 < len(lines) and not lines[end + 1].startswith(" - apiVersion:") and not lines[end + 1].startswith("generated:"):
end += 1
return lines[start:end + 1]
raise SystemExit(f"ERROR: version {version} not found in helm-charts/index.yaml")
block = extract_index_block(index_lines, "2.0.15")
chart_email = maintainer_email(chart_lines)
index_email = maintainer_email(block)
chart_icon = scalar(chart_lines, "icon")
index_icon = scalar(block, "icon")
index_digest = scalar(block, "digest")
print("Chart.yaml maintainer email:", chart_email)
print("index.yaml maintainer email:", index_email)
print("Chart.yaml icon:", chart_icon)
print("index.yaml icon:", index_icon)
print("index.yaml digest:", index_digest)
mismatches = []
if chart_email != index_email:
mismatches.append("maintainer email mismatch")
if chart_icon != index_icon:
mismatches.append("icon mismatch")
if not index_digest:
mismatches.append("index digest is empty")
if mismatches:
for item in mismatches:
print("ERROR:", item)
raise SystemExit(1)
PY
pkg="$(find . -name 'bifrost-2.0.15.tgz' -print | head -n 1)"
if [ -z "$pkg" ]; then
echo "ERROR: packaged chart bifrost-2.0.15.tgz is missing"
exit 1
fi
echo "Packaged chart found: $pkg"
sha256sum "$pkg"Repository: maximhq/bifrost
Length of output: 386
Regenerate the 2.0.15 index entry from the packaged chart.
The digest field is empty, and the maintainer email and icon URL in the index entry do not match helm-charts/bifrost/Chart.yaml (index has akshay@getmaxim.ai and getmaxim.ai/bifrost/bifrost-logo-only.png while Chart.yaml has support@getbifrost.ai and getbifrost.ai/favicon.png). This indicates the repo index was hand-edited instead of rebuilt from the actual bifrost-2.0.15.tgz artifact, which can cause published metadata to drift from what users install. If the packaging step occurs elsewhere in this Graphite stack, keep this out-of-sync only temporarily.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@helm-charts/index.yaml` around lines 4 - 24, The index entry for version
2.0.15 was hand-edited and has an empty digest and mismatched metadata;
regenerate the index from the packaged chart artifact (bifrost-2.0.15.tgz) so
the digest is computed and the entry fields (maintainers/email, icon URL, home,
etc.) match the chart’s Chart.yaml values (e.g., support@getbifrost.ai and
getbifrost.ai/favicon.png). Re-run the helm repo index generation against the
chart (or the CI step that produced the package) to replace the manual entry for
version 2.0.15 with the canonical data extracted from the tarball.
Merge activity
|

Summary
Bumped Bifrost Helm chart to version 2.0.15 with comprehensive schema synchronization and new configuration options for MCP, governance, and WebSocket functionality.
Changes
Schema Synchronization: Added missing properties from transport
config.schema.json:client.mcpDisableAutoToolInjectfor disabling automatic MCP tool injectiongovernance.budgets[].calendar_alignedfor snapping budget resets to calendar boundariesgovernance.pricingOverridesfor scoped pricing overrides in the model catalogmcp.clientConfigs[].allowedExtraHeadersfor header allowlists per MCP clientmcp.clientConfigs[].allowOnAllVirtualKeysfor making MCP servers accessible to all virtual keysmcp.toolManagerConfig.disableAutoToolInjectfor disabling auto tool injection at manager levelnetworkConfig.beta_header_overridesfor overriding Anthropic beta header support per providerwebsocketconfiguration for full WebSocket gateway tuning (connections, pool, transcript buffer)Template Fixes: Fixed SSE
connectionStringnot being rendered in_helpers.tplfor MCP clients and added template rendering for all new propertiesDocumentation: Updated README.md with detailed changelog for v2.0.15
Type of change
Affected areas
How to test
Validate the Helm chart schema and template rendering:
Test the new configuration options:
Screenshots/Recordings
N/A - Helm chart configuration changes only.
Breaking changes
All new properties are optional with sensible defaults.
Related issues
Part of ongoing effort to maintain schema parity between Helm charts and core transport configuration.
Security considerations
allowedExtraHeadersconfiguration requires careful review to prevent header injection attacksallowOnAllVirtualKeyssetting should be used cautiously as it bypasses key-based access controlsChecklist
docs/contributing/README.mdand followed the guidelines