Skip to content

release: 0.60.0#110

Merged
IlyaasK merged 7 commits into
mainfrom
release-please--branches--main--changes--next
Jun 3, 2026
Merged

release: 0.60.0#110
IlyaasK merged 7 commits into
mainfrom
release-please--branches--main--changes--next

Conversation

@stainless-app
Copy link
Copy Markdown
Contributor

@stainless-app stainless-app Bot commented Jun 3, 2026

Automated Release PR

0.60.0 (2026-06-03)

Full Changelog: v0.59.0...v0.60.0

Features

  • Add API-backed API key management endpoints (55bd31e)
  • examples: add browser-telemetry example (4c29993)
  • Fix browser pool update schema (903fe13)
  • route browser telemetry directly to the VM by default (cb50725)

Bug Fixes

  • streaming: don't dispatch empty SSE keepalive comment frames (a0ee2b2)

This pull request is managed by Stainless's GitHub App.

The semver version number is based on included commit messages. Alternatively, you can manually set the version number in the title of this pull request.

For a better experience, it is recommended to use either rebase-merge or squash-merge when merging this pull request.

🔗 Stainless website
📚 Read the docs
🙋 Reach out for help or questions


Note

Medium Risk
Default telemetry VM routing and SSE decoder behavior affect long-lived streams; optional pool size is a breaking signature change for callers that relied on required size on update.

Overview
Release 0.60.0 bumps package version metadata and refreshes the OpenAPI spec pointer; most substantive changes are in generated SDK code and client behavior.

API keys: api_keys.list gains optional query, sort_by, and sort_direction for search and ordering (sync and async).

Browser pools: browser_pools.update no longer requires size; it is optional so callers can patch other pool fields without sending pool capacity.

Browser routing: Default direct-to-VM subresources now include telemetry alongside curl, so telemetry streams can hit the browser VM without extra env config.

SSE streaming: SSEDecoder no longer emits empty events for comment-only keepalive blocks (:) after a prior event set last_event_id, avoiding JSON decode failures on typed telemetry streams.

Adds examples/browser_telemetry.py and tests for routing, streaming, API keys, and browser pools.

Reviewed by Cursor Bugbot for commit cecaff2. Bugbot is set up for automated code reviews on this repo. Configure here.

rgarcia and others added 4 commits June 3, 2026 11:41
Telemetry is now a default direct-to-VM routing subresource. The
telemetry stream method path is changed from /browsers/{id}/telemetry to
/browsers/{id}/telemetry/stream so it mirrors the browser VM endpoint:
when the request is rewritten for direct routing it yields
{base_url}/telemetry/stream, which is the SSE stream on the VM (the VM's
/telemetry is a different, non-stream JSON endpoint).

"telemetry" is added to the default KERNEL_BROWSER_ROUTING_SUBRESOURCES
allowlist alongside "curl".

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The SSE decoder's empty-block guard included last_event_id, which is sticky
across events per the SSE spec. Once any event carried an id, every subsequent
comment-only block (e.g. the server's ":\n\n" keepalive, sent every 15s on an
idle stream) fell through the guard and dispatched an empty-data event. The
typed Stream wrapper then calls .json() on it unconditionally, raising
JSONDecodeError and killing the stream.

This made idle browser telemetry streams crash after ~15s. Drop last_event_id
from the guard so dispatch depends only on the current block's event/data/retry
fields. Event-typed empty-data frames still dispatch (unchanged). Adds a
regression test for a keepalive comment following an id-bearing event.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat: route browser telemetry directly to the VM by default
@stainless-app
Copy link
Copy Markdown
Contributor Author

stainless-app Bot commented Jun 3, 2026

🧪 Testing

To try out this version of the SDK:

pip install 'https://pkg.stainless.com/s/kernel-python/55bd31edfed74f3bc4b08f83e07448e2e53378b0/kernel-0.59.0-py3-none-any.whl'

Expires at: Fri, 03 Jul 2026 19:41:55 GMT
Updated at: Wed, 03 Jun 2026 19:41:55 GMT

@firetiger-agent
Copy link
Copy Markdown

Created a monitoring plan for this PR.

What this PR does: Ships kernel Python SDK v0.60.0, which routes browser telemetry streams directly to the browser VM by default (previously opt-in via env var) and fixes a bug where SSE keepalive frames would crash typed stream iterators with a JSONDecodeError after any event carrying an id field.

Intended effect:

  • Browser telemetry stream success rate: baseline 0 traffic (feature was opt-in only); confirmed if client.browsers.telemetry.stream() calls succeed end-to-end without decoder errors after upgrading.
  • SSE stream stability: baseline — streams following id:-carrying events would previously raise JSONDecodeError on keepalives; confirmed if no such errors appear post-upgrade.
  • API 5xx rate: baseline 0.007–0.12% (Railway HTTP, Jun 2–3 2026); confirmed if it stays within this range.

Risks:

  • Telemetry requests falling through to API gateway — if the browser route cache is not populated before telemetry.stream() is called, requests arrive at the API gateway without a JWT; alert if any sustained rise in 401/403 responses on /browsers/*/telemetry/stream.
  • Unexpected network path for opt-out users — callers who previously relied on KERNEL_BROWSER_ROUTING_SUBRESOURCES being unset to send telemetry through the API gateway will now be routed direct-to-VM; alert if any JWT-missing telemetry stream 4xx errors appear.
  • API 5xx regression — alert if Railway HTTP 5xx rate on API service exceeds 0.5% for 2+ consecutive hours (baseline: < 0.12%).

Status updates will be posted automatically on this PR as monitoring progresses.

View monitor

@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from d14974b to 5aad9e9 Compare June 3, 2026 17:45
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from d953cd2 to cecaff2 Compare June 3, 2026 19:41
@IlyaasK IlyaasK self-requested a review June 3, 2026 19:56
Copy link
Copy Markdown
Contributor

@IlyaasK IlyaasK left a comment

Choose a reason for hiding this comment

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

lgtm

@IlyaasK IlyaasK merged commit c9e1eb0 into main Jun 3, 2026
11 checks passed
@stainless-app
Copy link
Copy Markdown
Contributor Author

stainless-app Bot commented Jun 3, 2026

Sign up for free to 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.

2 participants