') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); chore(deps): weekly dependency update by github-actions[bot] · Pull Request #719 · braintrustdata/braintrust-sdk-python · GitHub
Skip to content

chore(deps): weekly dependency update - #719

Merged
Abhijeet Prasad (AbhiPrasad) merged 4 commits into
mainfrom
deps/weekly-update-2026-08-31
Aug 31, 2026
Merged

chore(deps): weekly dependency update#719
Abhijeet Prasad (AbhiPrasad) merged 4 commits into
mainfrom
deps/weekly-update-2026-08-31

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Automated weekly dependency update via python scripts/update-matrix-latest.py && uv lock --upgrade.

⚠️Provider SDK packages changed. A human needs to re-record cassettes locally before merging.

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:344933d2bc

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "Codex (@codex) review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "Codex (@codex) address that feedback".

Comment threadpy/pyproject.toml

[tool.braintrust.matrix.ai-sdk]
latest = "ai[openai]==0.4.2"
latest = "ai[openai]==0.5.0"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Re-record cassettes for bumped provider SDKs

This commit changes only the pins and lockfile, so the affected latest nox sessions continue loading recordings created with the previous SDK versions from cassettes/latest/. This leaves major/minor upgrades such as ai 0.4→0.5 and agno 2→3 exercising stale provider traffic, which can either fail playback when request matching changes or pass without covering the new wire behavior. Re-record and commit every affected latest cassette directory before merging.

AGENTS.md reference: AGENTS.md:L194-L199

Useful? React with 👍 / 👎.

google-genai 2.20.0 restricted ``Models.generate_images`` to Vertex AI
("Gemini Enterprise Agent Platform") mode. On the Developer API (API-key)
path it now raises ValueError client-side before issuing a request:
ValueError: This method is only supported in Gemini Enterprise Agent
Platform mode, not in Gemini Developer API mode.
Because no HTTP request is made, this cannot be fixed by re-recording the
cassettes. Gate the two affected tests behind a version check so they keep
running against the 1.75.0 and 1.30.0 matrix entries and skip on latest.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Re-records the `latest` cassettes for the provider SDKs that moved by a
minor version in this update: ai-sdk 0.4.2 -> 0.5.0, openai 3.3.1 -> 3.6.0,
anthropic 1.0.0 -> 1.2.0, cohere 7.0.9 -> 7.1.0, pipecat-ai 1.7.0 -> 1.8.1,
strands-agents 1.53.0 -> 1.54.0, pydantic-ai 2.33.0 -> 2.36.0 and
google-adk 2.7.1 -> 2.8.0.
Shared cassette directories were deleted once and then re-recorded by every
session that writes into them, serially:
integrations/openai/cassettes/latest test_openai, test_openai_http2_streaming, test_btx_openai
integrations/pydantic_ai/cassettes/latest test_pydantic_ai_{integration,logfire,wrap_openai}
The diffs are dominated by fresh request ids, timestamps, fingerprints and
obfuscation nonces; the substantive change is the bumped client version in
the recorded request headers.
instructor is intentionally not re-recorded: test_instructor.py pins a dummy
`sk-test-...` key, so its tests are playback-only and --vcr-record=all just
earns a 401.
Validated by replaying every affected session with CI=1 so a missing
cassette fails instead of silently re-recording.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…e re-recorded
``_make_openai_client`` hard-coded ``sk-test-dummy-api-key-for-vcr-tests``,
which is the same value ``conftest.py`` already injects via
``os.environ.setdefault``. Hard-coding it defeated that escape hatch: with
``--vcr-record=all`` the request is forwarded to the real API and comes back
401, so the cassettes could never be refreshed after a dependency bump.
Use ``openai.OpenAI()`` and let it read the environment, matching
``test_openai.py``. Playback with no key configured still works because the
conftest default applies, and ``filter_headers`` strips ``authorization``
before a cassette is written (verified: no key material in the cassettes).
Two of the three cassettes are re-recorded here against instructor 1.16.0 /
openai 3.6.0. The third belongs to
``test_instructor_openai_retries_then_succeeds`` and is hand-authored -- its
first interaction omits ``age`` to force a validation retry, which no live
model will do on request -- so it is preserved and now carries a docstring
warning against re-recording.
Also drops cassettes/latest/test_instructor_openai_single_success.yaml, an
orphan from before that test moved into ``TestInstructorOpenAISpans``; the
live cassette is the class-prefixed file and nothing referenced the old name.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@AbhiPrasad
Abhijeet Prasad (AbhiPrasad) merged commit 269eb30 into mainAug 31, 2026
83 checks passed
@AbhiPrasad
Abhijeet Prasad (AbhiPrasad) deleted the deps/weekly-update-2026-08-31 branch August 31, 2026 16:01
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@AbhiPrasad