From c5f21ecf3e1081c774ba58ad32b10e8cd5b0a94a Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Sun, 24 May 2026 21:26:08 +0000
Subject: [PATCH 1/4] feat: api: dual-route /projects under /org/projects,
deprecate /projects
---
.stats.yml | 6 +++---
api.md | 14 +++++++-------
src/kernel/resources/projects/limits.py | 8 ++++----
src/kernel/resources/projects/projects.py | 20 ++++++++++----------
4 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 6f5d31f..dbf097f 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 112
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-5d96fec7a84722f300bd99db7352d6284141826f3412f6d370ac0926edf03d42.yml
-openapi_spec_hash: d4e1a29ac06f9543e0ef69372eb3ff35
-config_hash: ae3dea7997fb5d36fa41979f9585ed78
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-a0ad160eb0fb11e201e240de8487c12992a474076aeed1c1167ee54ade43edfb.yml
+openapi_spec_hash: 84a7075fddbe17b1446a759e8cc39047
+config_hash: 26beac3050665664d5d74d2bbfe9e808
diff --git a/api.md b/api.md
index b652f86..4785c2d 100644
--- a/api.md
+++ b/api.md
@@ -395,11 +395,11 @@ from kernel.types import CreateProjectRequest, Project, UpdateProjectRequest
Methods:
-- client.projects.create(\*\*params) -> Project
-- client.projects.retrieve(id) -> Project
-- client.projects.update(id, \*\*params) -> Project
-- client.projects.list(\*\*params) -> SyncOffsetPagination[Project]
-- client.projects.delete(id) -> None
+- client.projects.create(\*\*params) -> Project
+- client.projects.retrieve(id) -> Project
+- client.projects.update(id, \*\*params) -> Project
+- client.projects.list(\*\*params) -> SyncOffsetPagination[Project]
+- client.projects.delete(id) -> None
## Limits
@@ -411,8 +411,8 @@ from kernel.types.projects import ProjectLimits, UpdateProjectLimitsRequest
Methods:
-- client.projects.limits.retrieve(id) -> ProjectLimits
-- client.projects.limits.update(id, \*\*params) -> ProjectLimits
+- client.projects.limits.retrieve(id) -> ProjectLimits
+- client.projects.limits.update(id, \*\*params) -> ProjectLimits
# CredentialProviders
diff --git a/src/kernel/resources/projects/limits.py b/src/kernel/resources/projects/limits.py
index 04ac314..ade9302 100644
--- a/src/kernel/resources/projects/limits.py
+++ b/src/kernel/resources/projects/limits.py
@@ -73,7 +73,7 @@ def retrieve(
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return self._get(
- path_template("/projects/{id}/limits", id=id),
+ path_template("/org/projects/{id}/limits", id=id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -121,7 +121,7 @@ def update(
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return self._patch(
- path_template("/projects/{id}/limits", id=id),
+ path_template("/org/projects/{id}/limits", id=id),
body=maybe_transform(
{
"max_concurrent_invocations": max_concurrent_invocations,
@@ -187,7 +187,7 @@ async def retrieve(
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return await self._get(
- path_template("/projects/{id}/limits", id=id),
+ path_template("/org/projects/{id}/limits", id=id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -235,7 +235,7 @@ async def update(
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return await self._patch(
- path_template("/projects/{id}/limits", id=id),
+ path_template("/org/projects/{id}/limits", id=id),
body=await async_maybe_transform(
{
"max_concurrent_invocations": max_concurrent_invocations,
diff --git a/src/kernel/resources/projects/projects.py b/src/kernel/resources/projects/projects.py
index 87fae1b..ea97768 100644
--- a/src/kernel/resources/projects/projects.py
+++ b/src/kernel/resources/projects/projects.py
@@ -85,7 +85,7 @@ def create(
timeout: Override the client-level default timeout for this request, in seconds
"""
return self._post(
- "/projects",
+ "/org/projects",
body=maybe_transform({"name": name}, project_create_params.ProjectCreateParams),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
@@ -119,7 +119,7 @@ def retrieve(
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return self._get(
- path_template("/projects/{id}", id=id),
+ path_template("/org/projects/{id}", id=id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -158,7 +158,7 @@ def update(
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return self._patch(
- path_template("/projects/{id}", id=id),
+ path_template("/org/projects/{id}", id=id),
body=maybe_transform(
{
"name": name,
@@ -204,7 +204,7 @@ def list(
timeout: Override the client-level default timeout for this request, in seconds
"""
return self._get_api_list(
- "/projects",
+ "/org/projects",
page=SyncOffsetPagination[Project],
options=make_request_options(
extra_headers=extra_headers,
@@ -251,7 +251,7 @@ def delete(
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
extra_headers = {"Accept": "*/*", **(extra_headers or {})}
return self._delete(
- path_template("/projects/{id}", id=id),
+ path_template("/org/projects/{id}", id=id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -312,7 +312,7 @@ async def create(
timeout: Override the client-level default timeout for this request, in seconds
"""
return await self._post(
- "/projects",
+ "/org/projects",
body=await async_maybe_transform({"name": name}, project_create_params.ProjectCreateParams),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
@@ -346,7 +346,7 @@ async def retrieve(
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return await self._get(
- path_template("/projects/{id}", id=id),
+ path_template("/org/projects/{id}", id=id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
@@ -385,7 +385,7 @@ async def update(
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return await self._patch(
- path_template("/projects/{id}", id=id),
+ path_template("/org/projects/{id}", id=id),
body=await async_maybe_transform(
{
"name": name,
@@ -431,7 +431,7 @@ def list(
timeout: Override the client-level default timeout for this request, in seconds
"""
return self._get_api_list(
- "/projects",
+ "/org/projects",
page=AsyncOffsetPagination[Project],
options=make_request_options(
extra_headers=extra_headers,
@@ -478,7 +478,7 @@ async def delete(
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
extra_headers = {"Accept": "*/*", **(extra_headers or {})}
return await self._delete(
- path_template("/projects/{id}", id=id),
+ path_template("/org/projects/{id}", id=id),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
From f48cbee40aee158615972e6f39b92179e06efbce Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 26 May 2026 17:42:46 +0000
Subject: [PATCH 2/4] feat: Support telemetry enabled request config
---
.stats.yml | 6 +--
api.md | 1 +
src/kernel/resources/browsers/browsers.py | 40 +++++++++++--------
src/kernel/types/browser_create_params.py | 10 +++--
src/kernel/types/browser_update_params.py | 11 ++---
src/kernel/types/browsers/__init__.py | 4 +-
.../browsers/browser_telemetry_config.py | 4 +-
.../browser_telemetry_config_param.py | 16 --------
.../browser_telemetry_request_config_param.py | 28 +++++++++++++
tests/api_resources/test_browsers.py | 12 ++++--
10 files changed, 80 insertions(+), 52 deletions(-)
delete mode 100644 src/kernel/types/browsers/browser_telemetry_config_param.py
create mode 100644 src/kernel/types/browsers/browser_telemetry_request_config_param.py
diff --git a/.stats.yml b/.stats.yml
index dbf097f..47ab7c1 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 112
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-a0ad160eb0fb11e201e240de8487c12992a474076aeed1c1167ee54ade43edfb.yml
-openapi_spec_hash: 84a7075fddbe17b1446a759e8cc39047
-config_hash: 26beac3050665664d5d74d2bbfe9e808
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel/kernel-e9c99662d29710f105847d461f8919e06f6aa2e43b0e1a6285d0b137643a7907.yml
+openapi_spec_hash: 4415cb4790c7a5ec892f4e3521217cb4
+config_hash: 27b38657d9a3b33328be930eeb319628
diff --git a/api.md b/api.md
index 4785c2d..106e3cd 100644
--- a/api.md
+++ b/api.md
@@ -137,6 +137,7 @@ from kernel.types.browsers import (
BrowserTelemetryCategoryConfig,
BrowserTelemetryConfig,
BrowserTelemetryEvent,
+ BrowserTelemetryRequestConfig,
TelemetryStreamResponse,
)
```
diff --git a/src/kernel/resources/browsers/browsers.py b/src/kernel/resources/browsers/browsers.py
index d346a70..ad8087f 100644
--- a/src/kernel/resources/browsers/browsers.py
+++ b/src/kernel/resources/browsers/browsers.py
@@ -99,7 +99,7 @@
from ...types.shared_params.browser_profile import BrowserProfile
from ...types.shared_params.browser_viewport import BrowserViewport
from ...types.shared_params.browser_extension import BrowserExtension
-from ...types.browsers.browser_telemetry_config_param import BrowserTelemetryConfigParam
+from ...types.browsers.browser_telemetry_request_config_param import BrowserTelemetryRequestConfigParam
__all__ = ["BrowsersResource", "AsyncBrowsersResource"]
@@ -173,7 +173,7 @@ def create(
proxy_id: str | Omit = omit,
start_url: str | Omit = omit,
stealth: bool | Omit = omit,
- telemetry: Optional[BrowserTelemetryConfigParam] | Omit = omit,
+ telemetry: Optional[BrowserTelemetryRequestConfigParam] | Omit = omit,
timeout_seconds: int | Omit = omit,
viewport: BrowserViewport | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
@@ -219,9 +219,11 @@ def create(
stealth: If true, launches the browser in stealth mode to reduce detection by anti-bot
mechanisms.
- telemetry: Telemetry configuration for the browser session. If provided, telemetry capture
- starts with the specified category filter when the session is created. If
- omitted, no telemetry capture is started.
+ 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
+ category settings, or all four categories are explicitly disabled, capture is
+ not started.
timeout_seconds: The number of seconds of inactivity before the browser session is terminated.
Activity includes CDP connections and live view connections. Defaults to 60
@@ -325,7 +327,7 @@ def update(
disable_default_proxy: bool | Omit = omit,
profile: BrowserProfile | Omit = omit,
proxy_id: Optional[str] | Omit = omit,
- telemetry: Optional[BrowserTelemetryConfigParam] | Omit = omit,
+ telemetry: Optional[BrowserTelemetryRequestConfigParam] | Omit = omit,
viewport: browser_update_params.Viewport | 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.
@@ -348,9 +350,10 @@ def update(
proxy.
telemetry: Telemetry configuration. Omit, set to null, or set to an empty object ({}) to
- leave the existing configuration unchanged (no-op). To enable capture for all
- categories using VM defaults, set browser to an empty object ({"browser": {}}).
- To stop capture, set every category's enabled to false.
+ leave the existing configuration unchanged. Set enabled to true to enable
+ capture using VM defaults. Set enabled to false to stop capture. Provide browser
+ category settings for per-category updates. Explicitly disabling all four
+ categories also stops capture.
viewport: Viewport configuration to apply to the browser session.
@@ -717,7 +720,7 @@ async def create(
proxy_id: str | Omit = omit,
start_url: str | Omit = omit,
stealth: bool | Omit = omit,
- telemetry: Optional[BrowserTelemetryConfigParam] | Omit = omit,
+ telemetry: Optional[BrowserTelemetryRequestConfigParam] | Omit = omit,
timeout_seconds: int | Omit = omit,
viewport: BrowserViewport | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
@@ -763,9 +766,11 @@ async def create(
stealth: If true, launches the browser in stealth mode to reduce detection by anti-bot
mechanisms.
- telemetry: Telemetry configuration for the browser session. If provided, telemetry capture
- starts with the specified category filter when the session is created. If
- omitted, no telemetry capture is started.
+ 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
+ category settings, or all four categories are explicitly disabled, capture is
+ not started.
timeout_seconds: The number of seconds of inactivity before the browser session is terminated.
Activity includes CDP connections and live view connections. Defaults to 60
@@ -869,7 +874,7 @@ async def update(
disable_default_proxy: bool | Omit = omit,
profile: BrowserProfile | Omit = omit,
proxy_id: Optional[str] | Omit = omit,
- telemetry: Optional[BrowserTelemetryConfigParam] | Omit = omit,
+ telemetry: Optional[BrowserTelemetryRequestConfigParam] | Omit = omit,
viewport: browser_update_params.Viewport | 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.
@@ -892,9 +897,10 @@ async def update(
proxy.
telemetry: Telemetry configuration. Omit, set to null, or set to an empty object ({}) to
- leave the existing configuration unchanged (no-op). To enable capture for all
- categories using VM defaults, set browser to an empty object ({"browser": {}}).
- To stop capture, set every category's enabled to false.
+ leave the existing configuration unchanged. Set enabled to true to enable
+ capture using VM defaults. Set enabled to false to stop capture. Provide browser
+ category settings for per-category updates. Explicitly disabling all four
+ categories also stops capture.
viewport: Viewport configuration to apply to the browser session.
diff --git a/src/kernel/types/browser_create_params.py b/src/kernel/types/browser_create_params.py
index 1c2ed5e..82406a5 100644
--- a/src/kernel/types/browser_create_params.py
+++ b/src/kernel/types/browser_create_params.py
@@ -8,7 +8,7 @@
from .shared_params.browser_profile import BrowserProfile
from .shared_params.browser_viewport import BrowserViewport
from .shared_params.browser_extension import BrowserExtension
-from .browsers.browser_telemetry_config_param import BrowserTelemetryConfigParam
+from .browsers.browser_telemetry_request_config_param import BrowserTelemetryRequestConfigParam
__all__ = ["BrowserCreateParams"]
@@ -75,11 +75,13 @@ class BrowserCreateParams(TypedDict, total=False):
mechanisms.
"""
- telemetry: Optional[BrowserTelemetryConfigParam]
+ telemetry: Optional[BrowserTelemetryRequestConfigParam]
"""Telemetry configuration for the browser session.
- If provided, telemetry capture starts with the specified category filter when
- the session is created. If omitted, no telemetry capture is started.
+ 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 category settings, or all four categories are
+ explicitly disabled, capture is not started.
"""
timeout_seconds: int
diff --git a/src/kernel/types/browser_update_params.py b/src/kernel/types/browser_update_params.py
index 297d038..c883089 100644
--- a/src/kernel/types/browser_update_params.py
+++ b/src/kernel/types/browser_update_params.py
@@ -7,7 +7,7 @@
from .shared_params.browser_profile import BrowserProfile
from .shared_params.browser_viewport import BrowserViewport
-from .browsers.browser_telemetry_config_param import BrowserTelemetryConfigParam
+from .browsers.browser_telemetry_request_config_param import BrowserTelemetryRequestConfigParam
__all__ = ["BrowserUpdateParams", "Viewport"]
@@ -31,13 +31,14 @@ class BrowserUpdateParams(TypedDict, total=False):
Omit to leave unchanged, set to empty string to remove proxy.
"""
- telemetry: Optional[BrowserTelemetryConfigParam]
+ telemetry: Optional[BrowserTelemetryRequestConfigParam]
"""Telemetry configuration.
Omit, set to null, or set to an empty object ({}) to leave the existing
- configuration unchanged (no-op). To enable capture for all categories using VM
- defaults, set browser to an empty object ({"browser": {}}). To stop capture, set
- every category's enabled to false.
+ configuration unchanged. Set enabled to true to enable capture using VM
+ defaults. Set enabled to false to stop capture. Provide browser category
+ settings for per-category updates. Explicitly disabling all four categories also
+ stops capture.
"""
viewport: Viewport
diff --git a/src/kernel/types/browsers/__init__.py b/src/kernel/types/browsers/__init__.py
index a3bca41..619a59c 100644
--- a/src/kernel/types/browsers/__init__.py
+++ b/src/kernel/types/browsers/__init__.py
@@ -57,7 +57,6 @@
from .browser_page_tab_opened_event import BrowserPageTabOpenedEvent as BrowserPageTabOpenedEvent
from .f_set_file_permissions_params import FSetFilePermissionsParams as FSetFilePermissionsParams
from .browser_network_response_event import BrowserNetworkResponseEvent as BrowserNetworkResponseEvent
-from .browser_telemetry_config_param import BrowserTelemetryConfigParam as BrowserTelemetryConfigParam
from .process_stdout_stream_response import ProcessStdoutStreamResponse as ProcessStdoutStreamResponse
from .browser_interaction_click_event import BrowserInteractionClickEvent as BrowserInteractionClickEvent
from .browser_page_layout_shift_event import BrowserPageLayoutShiftEvent as BrowserPageLayoutShiftEvent
@@ -83,6 +82,9 @@
from .browser_monitor_reconnect_failed_event import (
BrowserMonitorReconnectFailedEvent as BrowserMonitorReconnectFailedEvent,
)
+from .browser_telemetry_request_config_param import (
+ BrowserTelemetryRequestConfigParam as BrowserTelemetryRequestConfigParam,
+)
from .browser_telemetry_category_config_param import (
BrowserTelemetryCategoryConfigParam as BrowserTelemetryCategoryConfigParam,
)
diff --git a/src/kernel/types/browsers/browser_telemetry_config.py b/src/kernel/types/browsers/browser_telemetry_config.py
index d4365ee..2fae7a3 100644
--- a/src/kernel/types/browsers/browser_telemetry_config.py
+++ b/src/kernel/types/browsers/browser_telemetry_config.py
@@ -9,7 +9,7 @@
class BrowserTelemetryConfig(BaseModel):
- """Telemetry configuration for a browser session."""
+ """Active telemetry configuration for a browser session."""
browser: Optional[BrowserTelemetryCategoriesConfig] = None
- """Per-category enable/disable flags. If omitted, all categories are captured."""
+ """Per-category enable/disable flags."""
diff --git a/src/kernel/types/browsers/browser_telemetry_config_param.py b/src/kernel/types/browsers/browser_telemetry_config_param.py
deleted file mode 100644
index 3346434..0000000
--- a/src/kernel/types/browsers/browser_telemetry_config_param.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import TypedDict
-
-from .browser_telemetry_categories_config_param import BrowserTelemetryCategoriesConfigParam
-
-__all__ = ["BrowserTelemetryConfigParam"]
-
-
-class BrowserTelemetryConfigParam(TypedDict, total=False):
- """Telemetry configuration for a browser session."""
-
- browser: BrowserTelemetryCategoriesConfigParam
- """Per-category enable/disable flags. If omitted, all categories are captured."""
diff --git a/src/kernel/types/browsers/browser_telemetry_request_config_param.py b/src/kernel/types/browsers/browser_telemetry_request_config_param.py
new file mode 100644
index 0000000..d901a74
--- /dev/null
+++ b/src/kernel/types/browsers/browser_telemetry_request_config_param.py
@@ -0,0 +1,28 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import TypedDict
+
+from .browser_telemetry_categories_config_param import BrowserTelemetryCategoriesConfigParam
+
+__all__ = ["BrowserTelemetryRequestConfigParam"]
+
+
+class BrowserTelemetryRequestConfigParam(TypedDict, total=False):
+ """Telemetry request configuration for a browser session."""
+
+ browser: BrowserTelemetryCategoriesConfigParam
+ """Per-category enable/disable flags.
+
+ If enabled is true and browser is omitted or empty, the VM default category set
+ is used. Explicitly disabling all four categories stops capture on update and
+ starts no capture on create.
+ """
+
+ enabled: bool
+ """Request shortcut for browser telemetry capture.
+
+ True enables capture using VM defaults. False stops capture on update and starts
+ no capture on create. Cannot be combined with browser category settings.
+ """
diff --git a/tests/api_resources/test_browsers.py b/tests/api_resources/test_browsers.py
index 57aa89f..c845e52 100644
--- a/tests/api_resources/test_browsers.py
+++ b/tests/api_resources/test_browsers.py
@@ -59,7 +59,8 @@ def test_method_create_with_all_params(self, client: Kernel) -> None:
"interaction": {"enabled": True},
"network": {"enabled": True},
"page": {"enabled": True},
- }
+ },
+ "enabled": True,
},
timeout_seconds=10,
viewport={
@@ -169,7 +170,8 @@ def test_method_update_with_all_params(self, client: Kernel) -> None:
"interaction": {"enabled": True},
"network": {"enabled": True},
"page": {"enabled": True},
- }
+ },
+ "enabled": True,
},
viewport={
"height": 800,
@@ -463,7 +465,8 @@ async def test_method_create_with_all_params(self, async_client: AsyncKernel) ->
"interaction": {"enabled": True},
"network": {"enabled": True},
"page": {"enabled": True},
- }
+ },
+ "enabled": True,
},
timeout_seconds=10,
viewport={
@@ -573,7 +576,8 @@ async def test_method_update_with_all_params(self, async_client: AsyncKernel) ->
"interaction": {"enabled": True},
"network": {"enabled": True},
"page": {"enabled": True},
- }
+ },
+ "enabled": True,
},
viewport={
"height": 800,
From 805946f1d2405cba4698ad5012541edd65736337 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Tue, 26 May 2026 17:59:58 +0000
Subject: [PATCH 3/4] release: 0.57.0
---
CHANGELOG.md | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9649399..4df91e6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,14 @@
# Changelog
+## 0.57.0 (2026-05-26)
+
+Full Changelog: [v0.57.0...v0.57.0](https://github.com/kernel/kernel-python-sdk/compare/v0.57.0...v0.57.0)
+
+### Features
+
+* api: dual-route /projects under /org/projects, deprecate /projects ([c5f21ec](https://github.com/kernel/kernel-python-sdk/commit/c5f21ecf3e1081c774ba58ad32b10e8cd5b0a94a))
+* Support telemetry enabled request config ([f48cbee](https://github.com/kernel/kernel-python-sdk/commit/f48cbee40aee158615972e6f39b92179e06efbce))
+
## 0.57.0 (2026-05-22)
Full Changelog: [v0.56.0...v0.57.0](https://github.com/kernel/kernel-python-sdk/compare/v0.56.0...v0.57.0)
From 1181567c19b43dc72953aaad50898e1d70d72dc7 Mon Sep 17 00:00:00 2001
From: IlyaasK <86218345+IlyaasK@users.noreply.github.com>
Date: Tue, 26 May 2026 14:12:15 -0400
Subject: [PATCH 4/4] Fix browser routing project path mock
---
tests/test_browser_routing.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/test_browser_routing.py b/tests/test_browser_routing.py
index 810de80..ac84152 100644
--- a/tests/test_browser_routing.py
+++ b/tests/test_browser_routing.py
@@ -180,7 +180,7 @@ async def test_async_raw_browser_create_warms_route_cache() -> None:
@respx.mock
def test_only_browser_metadata_endpoints_warm_route_cache() -> None:
- projects_route = respx.get(f"{base_url}/projects").mock(return_value=httpx.Response(200, json=_fake_browser()))
+ projects_route = respx.get(f"{base_url}/org/projects").mock(return_value=httpx.Response(200, json=_fake_browser()))
with Kernel(base_url=base_url, api_key=api_key, _strict_response_validation=True) as client:
response = client.projects.with_raw_response.list()
with pytest.raises(ValueError, match="route cache"):