From 0dea35847a9559c86038774966bae28911c0a044 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 4 Jun 2026 19:39:12 +0000 Subject: [PATCH 1/5] feat(api): allow setting a custom name on a browser session at create time --- .stats.yml | 4 ++-- src/kernel/resources/browsers/browsers.py | 16 ++++++++++++++-- src/kernel/types/browser_create_params.py | 7 +++++++ src/kernel/types/browser_create_response.py | 3 +++ src/kernel/types/browser_list_params.py | 2 +- src/kernel/types/browser_list_response.py | 3 +++ .../types/browser_pool_acquire_response.py | 3 +++ src/kernel/types/browser_retrieve_response.py | 3 +++ src/kernel/types/browser_update_response.py | 3 +++ .../types/invocation_list_browsers_response.py | 3 +++ tests/api_resources/test_browsers.py | 2 ++ 11 files changed, 44 insertions(+), 5 deletions(-) diff --git a/.stats.yml b/.stats.yml index 5ea72073..b8e42864 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 117 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-e6c711f0d29a7d956cc8ca621440da966c1f1575b1205d01328b1099edf1c517.yml -openapi_spec_hash: c06e7e36de1c6f9b29b54a6e3dc08ee5 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-e7925f5cb9626a47fd24470851ff4149c27bc89795f75e8641c618fff93a076c.yml +openapi_spec_hash: 955d4bf81e9838b0732c0e52716a2030 config_hash: 36159c262d293fbeacf513ab600a1729 diff --git a/src/kernel/resources/browsers/browsers.py b/src/kernel/resources/browsers/browsers.py index 801cd152..b439fdb3 100644 --- a/src/kernel/resources/browsers/browsers.py +++ b/src/kernel/resources/browsers/browsers.py @@ -169,6 +169,7 @@ def create( headless: bool | Omit = omit, invocation_id: str | Omit = omit, kiosk_mode: bool | Omit = omit, + name: str | Omit = omit, profile: BrowserProfile | Omit = omit, proxy_id: str | Omit = omit, start_url: str | Omit = omit, @@ -205,6 +206,10 @@ def create( kiosk_mode: If true, launches the browser in kiosk mode to hide address bar and tabs in live view. + name: Optional human-readable name for the browser session, used to find it later in + the dashboard. Must be unique among active sessions within the project. Set at + creation time only. + profile: Profile selection for the browser session. Provide either id or name. If specified, the matching profile will be loaded into the browser session. Profiles must be created beforehand. @@ -262,6 +267,7 @@ def create( "headless": headless, "invocation_id": invocation_id, "kiosk_mode": kiosk_mode, + "name": name, "profile": profile, "proxy_id": proxy_id, "start_url": start_url, @@ -413,7 +419,7 @@ def list( offset: Number of results to skip. Defaults to 0. - query: Search browsers by session ID, profile ID, proxy ID, or pool name. + query: Search browsers by name, session ID, profile ID, proxy ID, or pool name. status: Filter sessions by status. "active" returns only active sessions (default), "deleted" returns only soft-deleted sessions, "all" returns both. @@ -717,6 +723,7 @@ async def create( headless: bool | Omit = omit, invocation_id: str | Omit = omit, kiosk_mode: bool | Omit = omit, + name: str | Omit = omit, profile: BrowserProfile | Omit = omit, proxy_id: str | Omit = omit, start_url: str | Omit = omit, @@ -753,6 +760,10 @@ async def create( kiosk_mode: If true, launches the browser in kiosk mode to hide address bar and tabs in live view. + name: Optional human-readable name for the browser session, used to find it later in + the dashboard. Must be unique among active sessions within the project. Set at + creation time only. + profile: Profile selection for the browser session. Provide either id or name. If specified, the matching profile will be loaded into the browser session. Profiles must be created beforehand. @@ -810,6 +821,7 @@ async def create( "headless": headless, "invocation_id": invocation_id, "kiosk_mode": kiosk_mode, + "name": name, "profile": profile, "proxy_id": proxy_id, "start_url": start_url, @@ -961,7 +973,7 @@ def list( offset: Number of results to skip. Defaults to 0. - query: Search browsers by session ID, profile ID, proxy ID, or pool name. + query: Search browsers by name, session ID, profile ID, proxy ID, or pool name. status: Filter sessions by status. "active" returns only active sessions (default), "deleted" returns only soft-deleted sessions, "all" returns both. diff --git a/src/kernel/types/browser_create_params.py b/src/kernel/types/browser_create_params.py index c94071cf..de6ba5dd 100644 --- a/src/kernel/types/browser_create_params.py +++ b/src/kernel/types/browser_create_params.py @@ -49,6 +49,13 @@ class BrowserCreateParams(TypedDict, total=False): view. """ + name: str + """ + Optional human-readable name for the browser session, used to find it later in + the dashboard. Must be unique among active sessions within the project. Set at + creation time only. + """ + profile: BrowserProfile """Profile selection for the browser session. diff --git a/src/kernel/types/browser_create_response.py b/src/kernel/types/browser_create_response.py index 651216ab..27da0664 100644 --- a/src/kernel/types/browser_create_response.py +++ b/src/kernel/types/browser_create_response.py @@ -63,6 +63,9 @@ class BrowserCreateResponse(BaseModel): kiosk_mode: Optional[bool] = None """Whether the browser session is running in kiosk mode.""" + name: Optional[str] = None + """Human-readable name of the browser session, if one was set at creation.""" + pool: Optional[BrowserPoolRef] = None """Browser pool this session was acquired from, if any.""" diff --git a/src/kernel/types/browser_list_params.py b/src/kernel/types/browser_list_params.py index d659b8cb..2761e83b 100644 --- a/src/kernel/types/browser_list_params.py +++ b/src/kernel/types/browser_list_params.py @@ -22,7 +22,7 @@ class BrowserListParams(TypedDict, total=False): """Number of results to skip. Defaults to 0.""" query: str - """Search browsers by session ID, profile ID, proxy ID, or pool name.""" + """Search browsers by name, session ID, profile ID, proxy ID, or pool name.""" status: Literal["active", "deleted", "all"] """Filter sessions by status. diff --git a/src/kernel/types/browser_list_response.py b/src/kernel/types/browser_list_response.py index 79db0cfc..83154a94 100644 --- a/src/kernel/types/browser_list_response.py +++ b/src/kernel/types/browser_list_response.py @@ -63,6 +63,9 @@ class BrowserListResponse(BaseModel): kiosk_mode: Optional[bool] = None """Whether the browser session is running in kiosk mode.""" + name: Optional[str] = None + """Human-readable name of the browser session, if one was set at creation.""" + pool: Optional[BrowserPoolRef] = None """Browser pool this session was acquired from, if any.""" diff --git a/src/kernel/types/browser_pool_acquire_response.py b/src/kernel/types/browser_pool_acquire_response.py index b3cbabfa..bcda928d 100644 --- a/src/kernel/types/browser_pool_acquire_response.py +++ b/src/kernel/types/browser_pool_acquire_response.py @@ -63,6 +63,9 @@ class BrowserPoolAcquireResponse(BaseModel): kiosk_mode: Optional[bool] = None """Whether the browser session is running in kiosk mode.""" + name: Optional[str] = None + """Human-readable name of the browser session, if one was set at creation.""" + pool: Optional[BrowserPoolRef] = None """Browser pool this session was acquired from, if any.""" diff --git a/src/kernel/types/browser_retrieve_response.py b/src/kernel/types/browser_retrieve_response.py index 86b5fbef..9042d010 100644 --- a/src/kernel/types/browser_retrieve_response.py +++ b/src/kernel/types/browser_retrieve_response.py @@ -63,6 +63,9 @@ class BrowserRetrieveResponse(BaseModel): kiosk_mode: Optional[bool] = None """Whether the browser session is running in kiosk mode.""" + name: Optional[str] = None + """Human-readable name of the browser session, if one was set at creation.""" + pool: Optional[BrowserPoolRef] = None """Browser pool this session was acquired from, if any.""" diff --git a/src/kernel/types/browser_update_response.py b/src/kernel/types/browser_update_response.py index 60e95176..89c79f48 100644 --- a/src/kernel/types/browser_update_response.py +++ b/src/kernel/types/browser_update_response.py @@ -63,6 +63,9 @@ class BrowserUpdateResponse(BaseModel): kiosk_mode: Optional[bool] = None """Whether the browser session is running in kiosk mode.""" + name: Optional[str] = None + """Human-readable name of the browser session, if one was set at creation.""" + pool: Optional[BrowserPoolRef] = None """Browser pool this session was acquired from, if any.""" diff --git a/src/kernel/types/invocation_list_browsers_response.py b/src/kernel/types/invocation_list_browsers_response.py index 0a1700c2..d42a3abf 100644 --- a/src/kernel/types/invocation_list_browsers_response.py +++ b/src/kernel/types/invocation_list_browsers_response.py @@ -63,6 +63,9 @@ class Browser(BaseModel): kiosk_mode: Optional[bool] = None """Whether the browser session is running in kiosk mode.""" + name: Optional[str] = None + """Human-readable name of the browser session, if one was set at creation.""" + pool: Optional[BrowserPoolRef] = None """Browser pool this session was acquired from, if any.""" diff --git a/tests/api_resources/test_browsers.py b/tests/api_resources/test_browsers.py index c845e52b..69b14ac4 100644 --- a/tests/api_resources/test_browsers.py +++ b/tests/api_resources/test_browsers.py @@ -45,6 +45,7 @@ def test_method_create_with_all_params(self, client: Kernel) -> None: headless=False, invocation_id="rr33xuugxj9h0bkf1rdt2bet", kiosk_mode=True, + name="amazon-scrape-1", profile={ "id": "id", "name": "name", @@ -451,6 +452,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncKernel) -> headless=False, invocation_id="rr33xuugxj9h0bkf1rdt2bet", kiosk_mode=True, + name="amazon-scrape-1", profile={ "id": "id", "name": "name", From 01b15f602a4c21ab4e757bf46ed2d4c1481c14ce Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 4 Jun 2026 22:07:37 +0000 Subject: [PATCH 2/5] docs(api): use neutral example for browser session name field --- .stats.yml | 4 ++-- tests/api_resources/test_browsers.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.stats.yml b/.stats.yml index b8e42864..afee3b79 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 117 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-e7925f5cb9626a47fd24470851ff4149c27bc89795f75e8641c618fff93a076c.yml -openapi_spec_hash: 955d4bf81e9838b0732c0e52716a2030 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-152175b971564fc089733419adff5f79aa5556cb264bea7be5ca7582fda82b61.yml +openapi_spec_hash: 054e48b4743d014f0ec199757990e2c3 config_hash: 36159c262d293fbeacf513ab600a1729 diff --git a/tests/api_resources/test_browsers.py b/tests/api_resources/test_browsers.py index 69b14ac4..06d997c6 100644 --- a/tests/api_resources/test_browsers.py +++ b/tests/api_resources/test_browsers.py @@ -45,7 +45,7 @@ def test_method_create_with_all_params(self, client: Kernel) -> None: headless=False, invocation_id="rr33xuugxj9h0bkf1rdt2bet", kiosk_mode=True, - name="amazon-scrape-1", + name="checkout-flow-1", profile={ "id": "id", "name": "name", @@ -452,7 +452,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncKernel) -> headless=False, invocation_id="rr33xuugxj9h0bkf1rdt2bet", kiosk_mode=True, - name="amazon-scrape-1", + name="checkout-flow-1", profile={ "id": "id", "name": "name", From 62f45a6cbfe0f2b7e81ed9eb7081db6c56fad830 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 4 Jun 2026 22:18:56 +0000 Subject: [PATCH 3/5] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index afee3b79..c2258b3d 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 117 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-152175b971564fc089733419adff5f79aa5556cb264bea7be5ca7582fda82b61.yml -openapi_spec_hash: 054e48b4743d014f0ec199757990e2c3 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-d0f7d8820ee342b6b8e32d5c08620d7a31135a6aabbe8266118b54269fbabb9d.yml +openapi_spec_hash: 371eb419c25eb160fbc0135e45c133d1 config_hash: 36159c262d293fbeacf513ab600a1729 From f9ca7c19aa71326c97b14d723dfd79840e3e8dd7 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 5 Jun 2026 15:36:40 +0000 Subject: [PATCH 4/5] feat(api): allow setting key-value tags on a browser session at create time --- .stats.yml | 6 ++--- api.md | 1 + src/kernel/resources/browsers/browsers.py | 23 +++++++++++++++++++ src/kernel/types/__init__.py | 2 ++ src/kernel/types/browser_create_params.py | 7 ++++++ src/kernel/types/browser_create_response.py | 7 ++++++ src/kernel/types/browser_list_params.py | 8 +++++++ src/kernel/types/browser_list_response.py | 7 ++++++ .../types/browser_pool_acquire_response.py | 7 ++++++ src/kernel/types/browser_retrieve_response.py | 7 ++++++ src/kernel/types/browser_update_response.py | 7 ++++++ .../invocation_list_browsers_response.py | 7 ++++++ src/kernel/types/tags.py | 8 +++++++ src/kernel/types/tags_param.py | 10 ++++++++ tests/api_resources/test_browsers.py | 10 ++++++++ 15 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 src/kernel/types/tags.py create mode 100644 src/kernel/types/tags_param.py diff --git a/.stats.yml b/.stats.yml index c2258b3d..b53121ed 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 117 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-d0f7d8820ee342b6b8e32d5c08620d7a31135a6aabbe8266118b54269fbabb9d.yml -openapi_spec_hash: 371eb419c25eb160fbc0135e45c133d1 -config_hash: 36159c262d293fbeacf513ab600a1729 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-8f84f4214a8024d8ea62ee639eeaf2fa26900fabe23c8b87accb41d529a0bf4f.yml +openapi_spec_hash: db14f415438b3d338d9376bddc83a5cf +config_hash: 590bf8cb85948cf1e63b7b5ef60686c8 diff --git a/api.md b/api.md index 8f9df345..fe9135b5 100644 --- a/api.md +++ b/api.md @@ -83,6 +83,7 @@ from kernel.types import ( BrowserPoolRef, BrowserUsage, Profile, + Tags, BrowserCreateResponse, BrowserRetrieveResponse, BrowserUpdateResponse, diff --git a/src/kernel/resources/browsers/browsers.py b/src/kernel/resources/browsers/browsers.py index b439fdb3..516eca31 100644 --- a/src/kernel/resources/browsers/browsers.py +++ b/src/kernel/resources/browsers/browsers.py @@ -85,6 +85,7 @@ ) from ...pagination import SyncOffsetPagination, AsyncOffsetPagination from ..._base_client import AsyncPaginator, make_request_options +from ...types.tags_param import TagsParam from ...types.browser_curl_response import BrowserCurlResponse from ...types.browser_list_response import BrowserListResponse from ...lib.browser_routing.raw_http import ( @@ -174,6 +175,7 @@ def create( proxy_id: str | Omit = omit, start_url: str | Omit = omit, stealth: bool | Omit = omit, + tags: TagsParam | Omit = omit, telemetry: Optional[browser_create_params.Telemetry] | Omit = omit, timeout_seconds: int | Omit = omit, viewport: BrowserViewport | Omit = omit, @@ -224,6 +226,9 @@ def create( stealth: If true, launches the browser in stealth mode to reduce detection by anti-bot mechanisms. + tags: Optional user-defined key-value tags for the browser session, used to find and + group sessions later. Set at creation time only. Up to 50 pairs. + telemetry: Telemetry configuration for the browser session. Set enabled to true to start capture using VM defaults, or provide browser category settings. If omitted, null, set to an empty object ({}), set to enabled: false without browser @@ -272,6 +277,7 @@ def create( "proxy_id": proxy_id, "start_url": start_url, "stealth": stealth, + "tags": tags, "telemetry": telemetry, "timeout_seconds": timeout_seconds, "viewport": viewport, @@ -399,6 +405,7 @@ def list( offset: int | Omit = omit, query: str | Omit = omit, status: Literal["active", "deleted", "all"] | Omit = omit, + tags: Dict[str, str] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. extra_headers: Headers | None = None, @@ -424,6 +431,10 @@ def list( status: Filter sessions by status. "active" returns only active sessions (default), "deleted" returns only soft-deleted sessions, "all" returns both. + tags: Filter sessions by tag key-value pairs using deepObject style, e.g. + ?tags[team]=backend&tags[env]=staging. Multiple pairs are ANDed: a session must + match every supplied pair exactly. + extra_headers: Send extra headers extra_query: Add additional query parameters to the request @@ -447,6 +458,7 @@ def list( "offset": offset, "query": query, "status": status, + "tags": tags, }, browser_list_params.BrowserListParams, ), @@ -728,6 +740,7 @@ async def create( proxy_id: str | Omit = omit, start_url: str | Omit = omit, stealth: bool | Omit = omit, + tags: TagsParam | Omit = omit, telemetry: Optional[browser_create_params.Telemetry] | Omit = omit, timeout_seconds: int | Omit = omit, viewport: BrowserViewport | Omit = omit, @@ -778,6 +791,9 @@ async def create( stealth: If true, launches the browser in stealth mode to reduce detection by anti-bot mechanisms. + tags: Optional user-defined key-value tags for the browser session, used to find and + group sessions later. Set at creation time only. Up to 50 pairs. + telemetry: Telemetry configuration for the browser session. Set enabled to true to start capture using VM defaults, or provide browser category settings. If omitted, null, set to an empty object ({}), set to enabled: false without browser @@ -826,6 +842,7 @@ async def create( "proxy_id": proxy_id, "start_url": start_url, "stealth": stealth, + "tags": tags, "telemetry": telemetry, "timeout_seconds": timeout_seconds, "viewport": viewport, @@ -953,6 +970,7 @@ def list( offset: int | Omit = omit, query: str | Omit = omit, status: Literal["active", "deleted", "all"] | Omit = omit, + tags: Dict[str, str] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. extra_headers: Headers | None = None, @@ -978,6 +996,10 @@ def list( status: Filter sessions by status. "active" returns only active sessions (default), "deleted" returns only soft-deleted sessions, "all" returns both. + tags: Filter sessions by tag key-value pairs using deepObject style, e.g. + ?tags[team]=backend&tags[env]=staging. Multiple pairs are ANDed: a session must + match every supplied pair exactly. + extra_headers: Send extra headers extra_query: Add additional query parameters to the request @@ -1001,6 +1023,7 @@ def list( "offset": offset, "query": query, "status": status, + "tags": tags, }, browser_list_params.BrowserListParams, ), diff --git a/src/kernel/types/__init__.py b/src/kernel/types/__init__.py index 7932162d..1e9b39a4 100644 --- a/src/kernel/types/__init__.py +++ b/src/kernel/types/__init__.py @@ -4,6 +4,7 @@ from . import browsers from .. import _compat +from .tags import Tags as Tags from .shared import ( LogEvent as LogEvent, AppAction as AppAction, @@ -19,6 +20,7 @@ from .profile import Profile as Profile from .project import Project as Project from .credential import Credential as Credential +from .tags_param import TagsParam as TagsParam from .browser_pool import BrowserPool as BrowserPool from .browser_usage import BrowserUsage as BrowserUsage from .app_list_params import AppListParams as AppListParams diff --git a/src/kernel/types/browser_create_params.py b/src/kernel/types/browser_create_params.py index de6ba5dd..fe62f31a 100644 --- a/src/kernel/types/browser_create_params.py +++ b/src/kernel/types/browser_create_params.py @@ -5,6 +5,7 @@ from typing import Dict, Iterable, Optional from typing_extensions import TypedDict +from .tags_param import TagsParam from .shared_params.browser_profile import BrowserProfile from .shared_params.browser_viewport import BrowserViewport from .shared_params.browser_extension import BrowserExtension @@ -82,6 +83,12 @@ class BrowserCreateParams(TypedDict, total=False): mechanisms. """ + tags: TagsParam + """ + Optional user-defined key-value tags for the browser session, used to find and + group sessions later. Set at creation time only. Up to 50 pairs. + """ + telemetry: Optional[Telemetry] """Telemetry configuration for the browser session. diff --git a/src/kernel/types/browser_create_response.py b/src/kernel/types/browser_create_response.py index 27da0664..ec54e598 100644 --- a/src/kernel/types/browser_create_response.py +++ b/src/kernel/types/browser_create_response.py @@ -3,6 +3,7 @@ from typing import Dict, Optional from datetime import datetime +from .tags import Tags from .profile import Profile from .._models import BaseModel from .browser_usage import BrowserUsage @@ -84,6 +85,12 @@ class BrowserCreateResponse(BaseModel): browser actually loaded. """ + tags: Optional[Tags] = None + """User-defined key-value tags that were set on this browser session, if any. + + Echoed back when present. + """ + telemetry: Optional[BrowserTelemetryConfig] = None """Active telemetry configuration for the session, if any.""" diff --git a/src/kernel/types/browser_list_params.py b/src/kernel/types/browser_list_params.py index 2761e83b..4006dfbe 100644 --- a/src/kernel/types/browser_list_params.py +++ b/src/kernel/types/browser_list_params.py @@ -2,6 +2,7 @@ from __future__ import annotations +from typing import Dict from typing_extensions import Literal, TypedDict __all__ = ["BrowserListParams"] @@ -30,3 +31,10 @@ class BrowserListParams(TypedDict, total=False): "active" returns only active sessions (default), "deleted" returns only soft-deleted sessions, "all" returns both. """ + + tags: Dict[str, str] + """Filter sessions by tag key-value pairs using deepObject style, e.g. + + ?tags[team]=backend&tags[env]=staging. Multiple pairs are ANDed: a session must + match every supplied pair exactly. + """ diff --git a/src/kernel/types/browser_list_response.py b/src/kernel/types/browser_list_response.py index 83154a94..4de6bb00 100644 --- a/src/kernel/types/browser_list_response.py +++ b/src/kernel/types/browser_list_response.py @@ -3,6 +3,7 @@ from typing import Dict, Optional from datetime import datetime +from .tags import Tags from .profile import Profile from .._models import BaseModel from .browser_usage import BrowserUsage @@ -84,6 +85,12 @@ class BrowserListResponse(BaseModel): browser actually loaded. """ + tags: Optional[Tags] = None + """User-defined key-value tags that were set on this browser session, if any. + + Echoed back when present. + """ + telemetry: Optional[BrowserTelemetryConfig] = None """Active telemetry configuration for the session, if any.""" diff --git a/src/kernel/types/browser_pool_acquire_response.py b/src/kernel/types/browser_pool_acquire_response.py index bcda928d..6d3b0b68 100644 --- a/src/kernel/types/browser_pool_acquire_response.py +++ b/src/kernel/types/browser_pool_acquire_response.py @@ -3,6 +3,7 @@ from typing import Dict, Optional from datetime import datetime +from .tags import Tags from .profile import Profile from .._models import BaseModel from .browser_usage import BrowserUsage @@ -84,6 +85,12 @@ class BrowserPoolAcquireResponse(BaseModel): browser actually loaded. """ + tags: Optional[Tags] = None + """User-defined key-value tags that were set on this browser session, if any. + + Echoed back when present. + """ + telemetry: Optional[BrowserTelemetryConfig] = None """Active telemetry configuration for the session, if any.""" diff --git a/src/kernel/types/browser_retrieve_response.py b/src/kernel/types/browser_retrieve_response.py index 9042d010..48dfa362 100644 --- a/src/kernel/types/browser_retrieve_response.py +++ b/src/kernel/types/browser_retrieve_response.py @@ -3,6 +3,7 @@ from typing import Dict, Optional from datetime import datetime +from .tags import Tags from .profile import Profile from .._models import BaseModel from .browser_usage import BrowserUsage @@ -84,6 +85,12 @@ class BrowserRetrieveResponse(BaseModel): browser actually loaded. """ + tags: Optional[Tags] = None + """User-defined key-value tags that were set on this browser session, if any. + + Echoed back when present. + """ + telemetry: Optional[BrowserTelemetryConfig] = None """Active telemetry configuration for the session, if any.""" diff --git a/src/kernel/types/browser_update_response.py b/src/kernel/types/browser_update_response.py index 89c79f48..15c043ea 100644 --- a/src/kernel/types/browser_update_response.py +++ b/src/kernel/types/browser_update_response.py @@ -3,6 +3,7 @@ from typing import Dict, Optional from datetime import datetime +from .tags import Tags from .profile import Profile from .._models import BaseModel from .browser_usage import BrowserUsage @@ -84,6 +85,12 @@ class BrowserUpdateResponse(BaseModel): browser actually loaded. """ + tags: Optional[Tags] = None + """User-defined key-value tags that were set on this browser session, if any. + + Echoed back when present. + """ + telemetry: Optional[BrowserTelemetryConfig] = None """Active telemetry configuration for the session, if any.""" diff --git a/src/kernel/types/invocation_list_browsers_response.py b/src/kernel/types/invocation_list_browsers_response.py index d42a3abf..b060f8bb 100644 --- a/src/kernel/types/invocation_list_browsers_response.py +++ b/src/kernel/types/invocation_list_browsers_response.py @@ -3,6 +3,7 @@ from typing import Dict, List, Optional from datetime import datetime +from .tags import Tags from .profile import Profile from .._models import BaseModel from .browser_usage import BrowserUsage @@ -84,6 +85,12 @@ class Browser(BaseModel): browser actually loaded. """ + tags: Optional[Tags] = None + """User-defined key-value tags that were set on this browser session, if any. + + Echoed back when present. + """ + telemetry: Optional[BrowserTelemetryConfig] = None """Active telemetry configuration for the session, if any.""" diff --git a/src/kernel/types/tags.py b/src/kernel/types/tags.py new file mode 100644 index 00000000..988894da --- /dev/null +++ b/src/kernel/types/tags.py @@ -0,0 +1,8 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import Dict +from typing_extensions import TypeAlias + +__all__ = ["Tags"] + +Tags: TypeAlias = Dict[str, str] diff --git a/src/kernel/types/tags_param.py b/src/kernel/types/tags_param.py new file mode 100644 index 00000000..9e9e5cba --- /dev/null +++ b/src/kernel/types/tags_param.py @@ -0,0 +1,10 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Dict +from typing_extensions import TypeAlias + +__all__ = ["TagsParam"] + +TagsParam: TypeAlias = Dict[str, str] diff --git a/tests/api_resources/test_browsers.py b/tests/api_resources/test_browsers.py index 06d997c6..590640c9 100644 --- a/tests/api_resources/test_browsers.py +++ b/tests/api_resources/test_browsers.py @@ -54,6 +54,10 @@ def test_method_create_with_all_params(self, client: Kernel) -> None: proxy_id="proxy_id", start_url="https://example.com", stealth=True, + tags={ + "team": "backend", + "env": "staging", + }, telemetry={ "browser": { "console": {"enabled": True}, @@ -232,6 +236,7 @@ def test_method_list_with_all_params(self, client: Kernel) -> None: offset=0, query="query", status="active", + tags={"foo": "string"}, ) assert_matches_type(SyncOffsetPagination[BrowserListResponse], browser, path=["response"]) @@ -461,6 +466,10 @@ async def test_method_create_with_all_params(self, async_client: AsyncKernel) -> proxy_id="proxy_id", start_url="https://example.com", stealth=True, + tags={ + "team": "backend", + "env": "staging", + }, telemetry={ "browser": { "console": {"enabled": True}, @@ -639,6 +648,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncKernel) -> N offset=0, query="query", status="active", + tags={"foo": "string"}, ) assert_matches_type(AsyncOffsetPagination[BrowserListResponse], browser, path=["response"]) From 92bc50bb82c8d35d3cee8f8fd31c1e45b9bdeba6 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 5 Jun 2026 15:37:07 +0000 Subject: [PATCH 5/5] release: 0.63.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 14 ++++++++++++++ pyproject.toml | 2 +- src/kernel/_version.py | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index fdce8724..3cb6257c 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.62.0" + ".": "0.63.0" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index bbd58123..04be67f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## 0.63.0 (2026-06-05) + +Full Changelog: [v0.62.0...v0.63.0](https://github.com/kernel/kernel-python-sdk/compare/v0.62.0...v0.63.0) + +### Features + +* **api:** allow setting a custom name on a browser session at create time ([0dea358](https://github.com/kernel/kernel-python-sdk/commit/0dea35847a9559c86038774966bae28911c0a044)) +* **api:** allow setting key-value tags on a browser session at create time ([f9ca7c1](https://github.com/kernel/kernel-python-sdk/commit/f9ca7c19aa71326c97b14d723dfd79840e3e8dd7)) + + +### Documentation + +* **api:** use neutral example for browser session name field ([01b15f6](https://github.com/kernel/kernel-python-sdk/commit/01b15f602a4c21ab4e757bf46ed2d4c1481c14ce)) + ## 0.62.0 (2026-06-04) Full Changelog: [v0.61.0...v0.62.0](https://github.com/kernel/kernel-python-sdk/compare/v0.61.0...v0.62.0) diff --git a/pyproject.toml b/pyproject.toml index f246f34a..710e7a06 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "kernel" -version = "0.62.0" +version = "0.63.0" description = "The official Python library for the kernel API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/kernel/_version.py b/src/kernel/_version.py index 785c4450..52d2f619 100644 --- a/src/kernel/_version.py +++ b/src/kernel/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "kernel" -__version__ = "0.62.0" # x-release-please-version +__version__ = "0.63.0" # x-release-please-version