Skip to content
Merged

v2.2.2 #7442

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
6cebda9
refactor: move session key stickiness behind a SessionAffinity seam
Pratham-Mishra04 Sep 14, 2026
6a5f064
feat: session affinity at the provider level, bound on outcome
Pratham-Mishra04 Sep 14, 2026
cd8c35f
ui: session affinity at the provider level, and its engine in the log…
Pratham-Mishra04 Sep 14, 2026
776e70f
refactor: complexity session state keys through the shared session-st…
Pratham-Mishra04 Sep 14, 2026
87b5d20
docs: session affinity guide with routing, agent, and load balancing …
Pratham-Mishra04 Sep 15, 2026
086726b
fix: minor routing fixes
Pratham-Mishra04 Sep 17, 2026
4bd1922
feat: extract session stickiness into a pluggable `SessionAffinity` i…
akshaydeo Sep 19, 2026
1267331
feat: route and key session affinity driven by observed outcomes, wit…
akshaydeo Sep 19, 2026
ccdd3a6
feat: add `BifrostContextKeySessionAffinity` for per-request session …
akshaydeo Sep 19, 2026
52594b5
refactor: export `SessionStateKey`, `SessionAffinity`, and related he…
akshaydeo Sep 19, 2026
d2571fd
docs: add Session Affinity guide and cross-link it from routing, CLI …
akshaydeo Sep 19, 2026
94fb9ee
fix: record session affinity agreement with routing in trail and engi…
akshaydeo Sep 19, 2026
217f9d0
[fix]: preserve API web search source names (#7358)
g-yixuan Sep 20, 2026
1a17949
fix(bedrock): keep cache_control when a message's content is a string…
basil-k-aji-dev Sep 20, 2026
b08d22c
dependabot cleanups (#7378)
akshaydeo Sep 21, 2026
920d743
fix: allow all providers access and api models response (#7375)
TejasGhatte Sep 21, 2026
c686bdf
typesafe models support, new decisions endpoint (#7355)
akshaydeo Sep 21, 2026
70928ea
feat(decision): emulate decisions via LLM tool-calling for all provid…
akshaydeo Sep 21, 2026
ee3d497
benchmarking and api struct fixes (#7384)
akshaydeo Sep 21, 2026
4f01269
fix: removes unnecessary allocations from compat plugin (#7097)
sammaji Sep 21, 2026
8c719d0
fix: strip bedrock cachepoint markers for non-bedrock providers while…
sammaji Sep 21, 2026
40c3f7e
adds bedrock unknown json document handling (#7396)
akshaydeo Sep 21, 2026
2cbb54d
[fix]: preserve Grok 4.7 xhigh reasoning effort (#7403)
nettee Sep 22, 2026
fb91b10
adds safeguard support for passthrough requests (#7393)
akshaydeo Sep 22, 2026
00042d8
memory fixes for streaming cancellation (#7406)
akshaydeo Sep 22, 2026
8b7978b
fix(responses): stop rewriting OpenAI `computer` tool to `computer_us…
abhishekgahlot2 Sep 22, 2026
1aa53a8
perf: avoid redundant JSON decoding in Responses requests (#7412)
G-XD Sep 22, 2026
a9a3d1f
fix(schemas): deep copy extended Responses fields in DeepCopyResponse…
Madhuvod Sep 22, 2026
8cba983
ci: add CodSpeed benchmarks for the request hot path (#7409)
codspeed[bot] Sep 22, 2026
a8d1d45
readact anthropic billing headers to avoid cache spoiling (#7431)
akshaydeo Sep 22, 2026
a03cdd2
kimi and deepseek support for claude code (#7430)
akshaydeo Sep 22, 2026
c77a588
codspeed fixes and harness fixes
akshaydeo Sep 22, 2026
6c10b8a
fix: claude opus 5-5 changes (#7433)
TejasGhatte Sep 22, 2026
6d75a4b
fix: restore `HTTP_PROXY`/`HTTPS_PROXY` support for MCP connections w…
Pratham-Mishra04 Sep 22, 2026
21bb5b5
test fixes (#7440)
akshaydeo Sep 22, 2026
86378b2
fix: computer toolset compatibility (#7434)
TejasGhatte Sep 22, 2026
230a614
fix: computer toolset model capability (#7441)
TejasGhatte Sep 22, 2026
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
7 changes: 4 additions & 3 deletions .claude/skills/harness-test-writer/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,10 @@ Conventions (match the existing collection exactly):
pins the same invariant independently (e.g. native `/v1/responses` alongside the
converted `/v1/chat/completions` path).
- **Test scripts** (Postman `event[].script.exec`, plain ES5 JavaScript):
- Start with an infra guard so auth/rate/server noise skips instead of false-failing:
`if ([401, 403, 429, 500, 502, 503, 504].indexOf(pm.response.code) !== -1) { return; }`
Do NOT guard on 400 when a 400 IS the regression signature - that must fail loudly.
- Never skip any error status code. Do NOT open the script with an early-return
guard like `if ([401, 403, 429, 500, 502, 503, 504].indexOf(pm.response.code) !== -1) { return; }`
- every unexpected status (auth failure, rate limit, 5xx) must fail the case
loudly instead of silently passing it. Assert the exact status the case expects.
- Assert the specific failure signature is absent (error substring, param name) AND
that the happy path succeeded (status below 400, expected fields present).
- Include the response text in failure messages:
Expand Down
133 changes: 133 additions & 0 deletions .github/workflows/codspeed.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
name: CodSpeed Benchmarks

# Continuous performance measurement for the request hot path.
#
# Bifrost sits inline on every LLM call, so the CPU cost of the translation
# layers (payload parsing, provider request/response conversion, SSE framing,
# key selection) is paid once per request - and once per chunk on a stream.
# `go test -bench` already covers those paths; this workflow runs the same
# benchmarks under the CodSpeed walltime instrument on every PR so a regression
# shows up as a diff against the base commit instead of surfacing in a load
# test later.
#
# Walltime is the only instrument the Go integration supports, so the job runs
# on CodSpeed macro runners (bare metal, pinned CPU) - GitHub-hosted runners are
# too noisy for wall-clock comparisons.

on:
push:
branches:
- dev
- main
pull_request:
# `workflow_dispatch` allows CodSpeed to trigger backtest performance
# analysis in order to generate initial data.
workflow_dispatch:

permissions:
contents: read

concurrency:
group: codspeed-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
benchmarks:
name: Benchmarks (${{ matrix.name }})
# CodSpeed's managed bare-metal runner for walltime benchmarks.
# https://codspeed.io/docs/benchmarks/go
# The org's Default runner group must "Allow public repositories", or the
# jobs queue without ever starting.
runs-on: codspeed-macro
timeout-minutes: 45

env:
# The modules declare go 1.27.0; keep the toolchain resolution identical to
# the test workflows rather than depending on the runner image default.
GOTOOLCHAIN: auto

permissions:
contents: read # required for actions/checkout
id-token: write # required for OIDC authentication with CodSpeed

strategy:
# One module's benchmarks failing should not hide the others' results.
fail-fast: false
matrix:
include:
# Package lists are explicit rather than ./... : most packages carry no
# benchmarks, and the ones excluded here either need live provider
# credentials or benchmark a comparison baseline that is not worth
# tracking as a trend.
- name: core
module: core
packages: . ./schemas/ ./keyselectors/ ./providers/openai/ ./providers/anthropic/ ./providers/utils/
- name: framework
module: framework
packages: ./modelcatalog/ ./tracing/
- name: plugin-governance
module: plugins/governance
packages: .
- name: plugin-mocker
module: plugins/mocker
packages: .

steps:
# CodSpeed macro runners are self-hosted: their image must have the
# StepSecurity agent installed for this policy to be enforced. The action
# configures an existing agent; it does not install one on self-hosted VMs.
- name: Harden Runner
uses: step-security/harden-runner@fe104658747b27e96e4f7e80cd0a94068e53901d # v2.16.1
with:
egress-policy: block
# Infrastructure only: Go toolchain/modules, GitHub release assets,
# and CodSpeed installation/results. Benchmarks use local fixtures;
# provider APIs and live-test assets are intentionally not allowed.
allowed-endpoints: >
api.codspeed.io:443
api.github.com:443
app.codspeed.io:443
codspeed.io:443
dl.google.com:443
github.com:443
go.dev:443
gql.codspeed.io:443
objects.githubusercontent.com:443
proxy.golang.org:443
raw.githubusercontent.com:443
release-assets.githubusercontent.com:443
storage.googleapis.com:443
sum.golang.org:443

- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Set up Go
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: "1.27.0"
cache-dependency-path: |
core/go.sum
framework/go.sum
plugins/*/go.sum

# The modules are versioned independently and carry no replace directives,
# so without a workspace the framework and plugin benchmarks would measure
# the last PUBLISHED core rather than the commit under test. Same script
# the test workflows use, so the module list cannot drift.
- name: Set up Go workspace
run: source ./.github/workflows/scripts/setup-go-workspace.sh
shell: bash

- name: Download module dependencies
working-directory: ${{ matrix.module }}
run: go mod download

- name: Run benchmarks
uses: CodSpeedHQ/action@373d6868929f444bc08d901fd0eb0ad52a8875ea # v5.2.1
with:
mode: walltime
working-directory: ${{ matrix.module }}
# CodSpeed's Go runner discovers benchmarks without running regular tests.
# Its Go integration currently supports only the -bench flag.
run: go test -bench=. ${{ matrix.packages }}
1 change: 1 addition & 0 deletions .github/workflows/pr-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ jobs:
SGL_API_KEY: ${{ secrets.SGL_API_KEY }}
CEREBRAS_API_KEY: ${{ secrets.CEREBRAS_API_KEY }}
SARVAM_API_KEY: ${{ secrets.SARVAM_API_KEY }}
TYPESAFE_API_KEY: ${{ secrets.TYPESAFE_API_KEY }}
DATABRICKS_TOKEN: ${{ secrets.DATABRICKS_TOKEN }}
DATABRICKS_WORKSPACE_URL: ${{ secrets.DATABRICKS_WORKSPACE_URL }}
GITHUB_COPILOT_APP_ID: ${{ secrets.GITHUB_COPILOT_APP_ID }}
Expand Down
Loading
Loading