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
4 changes: 2 additions & 2 deletions .agents/skills/sdk-dependency-updates/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
---
name: sdk-dependency-updates
description: "Review and refresh Braintrust Python SDK dependency update PRs, especially automated `chore(deps): daily dependency update` PRs. Use when Codex needs to inspect `py/pyproject.toml` and `py/uv.lock`, reproduce the workflow's label decision, decide whether provider `latest` cassettes need re-recording, run the exact nox sessions, and validate playback before merge."
description: "Review and refresh Braintrust Python SDK dependency update PRs, especially automated `chore(deps): weekly dependency update` PRs. Use when Codex needs to inspect `py/pyproject.toml` and `py/uv.lock`, reproduce the workflow's label decision, decide whether provider `latest` cassettes need re-recording, run the exact nox sessions, and validate playback before merge."
---

# SDK Dependency Updates

Use this skill for dependency bump PRs in this repo, especially the daily automation from `.github/workflows/dependency-updates.yml`.
Use this skill for dependency bump PRs in this repo, especially the weekly automation from `.github/workflows/dependency-updates.yml`.

Keep the work narrow. These PRs should usually stay limited to:

Expand Down
14 changes: 7 additions & 7 deletions .github/workflows/dependency-updates.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: Dependency updates
on:
schedule:
- cron: "0 6 * * 1-5" # weekdays 6am UTC
- cron: "0 6 * * 1" # Mondays 6am UTC
workflow_dispatch:

permissions:
Expand Down Expand Up @@ -36,16 +36,16 @@ jobs:
id: date
run: echo "date=$(date +%Y-%m-%d)" >> "$GITHUB_OUTPUT"

- name: Close stale daily dependency update PRs
- name: Close stale weekly dependency update PRs
if: steps.labels.outputs.changed == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CURRENT_BRANCH: deps/daily-update-${{ steps.date.outputs.date }}
CURRENT_BRANCH: deps/weekly-update-${{ steps.date.outputs.date }}
run: |
gh pr list \
--state open \
--json number,title,headRefName \
--jq ".[] | select(.title == \"chore(deps): daily dependency update\") | select(.headRefName != \"$CURRENT_BRANCH\") | .number" \
--jq ".[] | select(.title == \"chore(deps): weekly dependency update\") | select(.headRefName != \"$CURRENT_BRANCH\") | .number" \
| while read -r pr; do
echo "Closing stale dependency update PR #$pr"
gh pr close "$pr" --comment "Superseded by a newer automated dependency update." --delete-branch
Expand All @@ -55,12 +55,12 @@ jobs:
if: steps.labels.outputs.changed == 'true'
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
with:
title: "chore(deps): daily dependency update"
title: "chore(deps): weekly dependency update"
body: |
Automated daily dependency update via `python scripts/update-matrix-latest.py && uv lock --upgrade`.
Automated weekly dependency update via `python scripts/update-matrix-latest.py && uv lock --upgrade`.

${{ steps.labels.outputs.needs_rerecord == 'true' && '⚠️ **Provider SDK packages changed.** A human needs to re-record cassettes locally before merging.' || '✅ Only test infrastructure deps changed. Safe to merge if CI passes.' }}
branch: deps/daily-update-${{ steps.date.outputs.date }}
branch: deps/weekly-update-${{ steps.date.outputs.date }}
labels: |
dependencies
${{ steps.labels.outputs.needs_rerecord == 'true' && 'needs-cassette-rerecord' || 'auto-merge-candidate' }}
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ All nox session dependency pins are centralized in `py/pyproject.toml`:

The `LATEST` sentinel in the noxfile maps to the `latest` key in the matrix table — it is no longer a floating install.

A daily GitHub Actions workflow (`.github/workflows/dependency-updates.yml`) runs `uv lock --upgrade`, classifies changes by reading group names from `pyproject.toml`, and opens a PR labeled `needs-cassette-rerecord` (provider SDK bumps) or `auto-merge-candidate` (infra-only bumps).
A weekly GitHub Actions workflow (`.github/workflows/dependency-updates.yml`) runs `uv lock --upgrade`, classifies changes by reading group names from `pyproject.toml`, and opens a PR labeled `needs-cassette-rerecord` (provider SDK bumps) or `auto-merge-candidate` (infra-only bumps).

## Editing Guidelines

Expand Down
20 changes: 10 additions & 10 deletions py/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ conflicts = [
#
# Each key is a provider prefix. The value is a dict mapping human-readable
# version tags to the pip requirement string. "latest" is pinned to an
# explicit version and bumped by the daily dependency-update workflow.
# explicit version and bumped by the weekly dependency-update workflow.
# ---------------------------------------------------------------------------

[tool.braintrust.matrix]
Expand All @@ -298,7 +298,7 @@ latest = "cohere==6.1.0"
"5.0.0" = "cohere==5.0.0"

[tool.braintrust.matrix.openai-agents]
latest = "openai-agents==0.14.8"
latest = "openai-agents==0.15.0"
"0.13.6" = "openai-agents==0.13.6"
"0.0.19" = "openai-agents==0.0.19"

Expand All @@ -307,7 +307,7 @@ latest = "litellm==1.83.14"
"1.74.0" = "litellm==1.74.0"

[tool.braintrust.matrix.claude-agent-sdk]
latest = "claude-agent-sdk==0.1.71"
latest = "claude-agent-sdk==0.1.72"
"0.1.10" = "claude-agent-sdk==0.1.10"

[tool.braintrust.matrix.agno]
Expand All @@ -328,15 +328,15 @@ latest = "autogen-ext[openai]==0.7.5"
"0.7.0" = "autogen-ext[openai]==0.7.0"

[tool.braintrust.matrix.strands-agents]
latest = "strands-agents==1.37.0"
latest = "strands-agents==1.38.0"
"1.20.0" = "strands-agents==1.20.0"

[tool.braintrust.matrix.pydantic-ai-integration]
latest = "pydantic-ai==1.88.0"
latest = "pydantic-ai==1.89.0"
"1.10.0" = "pydantic-ai==1.10.0"

[tool.braintrust.matrix.pydantic-ai-wrap-openai]
latest = "pydantic-ai==1.88.0"
latest = "pydantic-ai==1.89.0"
"1.0.1" = "pydantic-ai==1.0.1"
"0.1.9" = "pydantic-ai==0.1.9"

Expand All @@ -356,11 +356,11 @@ latest = "dspy==3.2.0"
# 1.13.0 is the first release with the full causal-id surface (event_id /
# parent_event_id / started_event_id on BaseEvent) plus the ``usage`` field on
# LLMCallCompletedEvent that the Braintrust CrewAI integration depends on.
latest = "crewai==1.14.3"
latest = "crewai==1.14.4"
"1.13.0" = "crewai==1.13.0"

[tool.braintrust.matrix.google-adk]
latest = "google-adk==1.31.1"
latest = "google-adk==1.32.0"
"1.14.1" = "google-adk==1.14.1"

[tool.braintrust.matrix.langchain-core]
Expand All @@ -376,11 +376,11 @@ latest = "openrouter==0.9.1"
"0.6.0" = "openrouter==0.6.0"

[tool.braintrust.matrix.mistralai]
latest = "mistralai==2.4.3"
latest = "mistralai==2.4.4"
"1.12.4" = "mistralai==1.12.4"

[tool.braintrust.matrix.temporalio]
latest = "temporalio==1.26.0"
latest = "temporalio==1.27.0"
"1.20.0" = "temporalio==1.20.0"
"1.19.0" = "temporalio==1.19.0"

Expand Down
2 changes: 1 addition & 1 deletion py/scripts/determine-dependency-update-labels.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""Determine GitHub Actions outputs for the daily dependency update workflow.
"""Determine GitHub Actions outputs for the weekly dependency update workflow.

Inspects the working-tree diff of ``py/pyproject.toml`` and ``py/uv.lock`` to
decide whether anything changed and, if so, whether any provider SDK pins
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
interactions:
- request:
body: '{"include":[],"input":[{"content":"What is 2+2? Just the number.","role":"user"}],"instructions":"You
are a helpful assistant. Be very concise.","model":"gpt-4o-mini","prompt_cache_key":"agents-sdk:run:c4b68e8b849647b7b38934304c622fa1","tools":[]}'
are a helpful assistant. Be very concise.","model":"gpt-4o-mini","prompt_cache_key":"agents-sdk:run:09feed69efe74e0a81eda0fac0a9775a","tools":[]}'
headers:
Accept:
- application/json
Expand All @@ -16,7 +16,7 @@ interactions:
Host:
- api.openai.com
User-Agent:
- Agents/Python 0.14.3
- Agents/Python 0.15.0
X-Stainless-Arch:
- arm64
X-Stainless-Async:
Expand All @@ -30,7 +30,7 @@ interactions:
X-Stainless-Runtime:
- CPython
X-Stainless-Runtime-Version:
- 3.14.3
- 3.12.12
x-stainless-read-timeout:
- '600'
x-stainless-retry-count:
Expand All @@ -39,20 +39,20 @@ interactions:
uri: https://api.openai.com/v1/responses
response:
body:
string: "{\n \"id\": \"resp_070f09e9a7ce55fa0069e798145454819c9d62b4a02c5863bf\",\n
\ \"object\": \"response\",\n \"created_at\": 1776785428,\n \"status\":
string: "{\n \"id\": \"resp_06aefc55e94728bd0069f4de79cd8081a3ae0cfa0aa810e4a9\",\n
\ \"object\": \"response\",\n \"created_at\": 1777655417,\n \"status\":
\"completed\",\n \"background\": false,\n \"billing\": {\n \"payer\":
\"developer\"\n },\n \"completed_at\": 1776785428,\n \"error\": null,\n
\"developer\"\n },\n \"completed_at\": 1777655418,\n \"error\": null,\n
\ \"frequency_penalty\": 0.0,\n \"incomplete_details\": null,\n \"instructions\":
\"You are a helpful assistant. Be very concise.\",\n \"max_output_tokens\":
null,\n \"max_tool_calls\": null,\n \"model\": \"gpt-4o-mini-2024-07-18\",\n
\ \"output\": [\n {\n \"id\": \"msg_070f09e9a7ce55fa0069e79814f0b8819cb268d3f1066b402c\",\n
\ \"moderation\": null,\n \"output\": [\n {\n \"id\": \"msg_06aefc55e94728bd0069f4de7af03881a3a6181ebbfd64087c\",\n
\ \"type\": \"message\",\n \"status\": \"completed\",\n \"content\":
[\n {\n \"type\": \"output_text\",\n \"annotations\":
[],\n \"logprobs\": [],\n \"text\": \"4\"\n }\n ],\n
\ \"role\": \"assistant\"\n }\n ],\n \"parallel_tool_calls\": true,\n
\ \"presence_penalty\": 0.0,\n \"previous_response_id\": null,\n \"prompt_cache_key\":
\"agents-sdk:run:c4b68e8b849647b7b38934304c622fa1\",\n \"prompt_cache_retention\":
\"agents-sdk:run:09feed69efe74e0a81eda0fac0a9775a\",\n \"prompt_cache_retention\":
\"in_memory\",\n \"reasoning\": {\n \"effort\": null,\n \"summary\":
null\n },\n \"safety_identifier\": null,\n \"service_tier\": \"default\",\n
\ \"store\": true,\n \"temperature\": 1.0,\n \"text\": {\n \"format\":
Expand All @@ -64,14 +64,16 @@ interactions:
0\n },\n \"total_tokens\": 34\n },\n \"user\": null,\n \"metadata\":
{}\n}"
headers:
CF-RAY:
- 9efd6e1ecfcdebb9-YYZ
CF-Cache-Status:
- DYNAMIC
CF-Ray:
- 9f506618eff935ae-YYZ
Connection:
- keep-alive
Content-Type:
- application/json
Date:
- Tue, 21 Apr 2026 15:30:29 GMT
- Fri, 01 May 2026 17:10:19 GMT
Server:
- cloudflare
Strict-Transport-Security:
Expand All @@ -82,36 +84,34 @@ interactions:
- nosniff
alt-svc:
- h3=":443"; ma=86400
cf-cache-status:
- DYNAMIC
content-length:
- '1623'
- '1645'
openai-organization:
- braintrust-data
openai-processing-ms:
- '713'
- '1284'
openai-project:
- proj_vsCSXafhhByzWOThMrJcZiw9
openai-version:
- '2020-10-01'
set-cookie:
- __cf_bm=XygGanws9_foz2ssW3mekEHVtLm8JKIWwrG7kNCpxMM-1776785428.288884-1.0.1.1-B6oNsne64GG5RIWzHAWS8mHr1r2hI6zH1hmTATh3LHkE8cvS15YWcxoX1LDPbi.ZHTqt8BDOK7jvhXPH7oDLvBGZQA3fk8nn2dBLMCcoKP7DwJ46ReNjkr0KAGGgKJFL;
HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Tue, 21 Apr 2026
16:00:29 GMT
- __cf_bm=Lsg3i5bJ_YSfVsCGE7sw_iFX4Qp90m_L171lqpaHZw8-1777655417.741916-1.0.1.1-xeQrZUx4nKDTabAo0vQ0ci9mU3f5cHuXM2U0SwGCByuiwH3bdKgE_BumuBCeOo0TSvgJpslQNyLepu4lXj2vZ9r4JE7Hs.hk.gXswCT8005mg11.GuYDRFL9vUxmVQHY;
HttpOnly; Secure; Path=/; Domain=api.openai.com; Expires=Fri, 01 May 2026
17:40:19 GMT
x-ratelimit-limit-requests:
- '30000'
x-ratelimit-limit-tokens:
- '150000000'
x-ratelimit-remaining-requests:
- '29999'
x-ratelimit-remaining-tokens:
- '149999950'
- '149999947'
x-ratelimit-reset-requests:
- 2ms
x-ratelimit-reset-tokens:
- 0s
x-request-id:
- req_b16acc49e9dd4398bd9fcd19141ff1be
- req_7ca2e623a9834128b8deeece1581f7e5
status:
code: 200
message: OK
Expand Down
Loading