Skip to content
Open
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
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.26.0"
".": "0.27.0"
}
4 changes: 2 additions & 2 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 91
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-fc2c80b398a8dd511010ae7cda5e21c353e388ee130aa288974b47af4208b5b8.yml
openapi_spec_hash: 5e06586dbbb9fce12b907f4e32497006
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-59d2925a3cb93809cc762a3ac350691b365898e284f2c66a5999b9a6a37a35e5.yml
openapi_spec_hash: dfcb0a49e657426d0c0f44cfa3e89430
config_hash: cc7fdd701d995d4b3456d77041c604cf
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog

## 0.27.0 (2026-01-19)

Full Changelog: [v0.26.0...v0.27.0](https://github.com/kernel/kernel-python-sdk/compare/v0.26.0...v0.27.0)

### Features

* **dashboard:** add browser replays support for past browsers ([9d81781](https://github.com/kernel/kernel-python-sdk/commit/9d81781970ed6230844d479bc27893453b34a05e))

## 0.26.0 (2026-01-17)

Full Changelog: [v0.25.0...v0.26.0](https://github.com/kernel/kernel-python-sdk/compare/v0.25.0...v0.26.0)
Expand Down
2 changes: 1 addition & 1 deletion api.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ from kernel.types import (
Methods:

- <code title="post /browsers">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">create</a>(\*\*<a href="src/kernel/types/browser_create_params.py">params</a>) -> <a href="./src/kernel/types/browser_create_response.py">BrowserCreateResponse</a></code>
- <code title="get /browsers/{id}">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">retrieve</a>(id) -> <a href="./src/kernel/types/browser_retrieve_response.py">BrowserRetrieveResponse</a></code>
- <code title="get /browsers/{id}">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">retrieve</a>(id, \*\*<a href="src/kernel/types/browser_retrieve_params.py">params</a>) -> <a href="./src/kernel/types/browser_retrieve_response.py">BrowserRetrieveResponse</a></code>
- <code title="patch /browsers/{id}">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">update</a>(id, \*\*<a href="src/kernel/types/browser_update_params.py">params</a>) -> <a href="./src/kernel/types/browser_update_response.py">BrowserUpdateResponse</a></code>
- <code title="get /browsers">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">list</a>(\*\*<a href="src/kernel/types/browser_list_params.py">params</a>) -> <a href="./src/kernel/types/browser_list_response.py">SyncOffsetPagination[BrowserListResponse]</a></code>
- <code title="delete /browsers">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">delete</a>(\*\*<a href="src/kernel/types/browser_delete_params.py">params</a>) -> None</code>
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "kernel"
version = "0.26.0"
version = "0.27.0"
description = "The official Python library for the kernel API"
dynamic = ["readme"]
license = "Apache-2.0"
Expand Down
2 changes: 1 addition & 1 deletion src/kernel/_version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

__title__ = "kernel"
__version__ = "0.26.0" # x-release-please-version
__version__ = "0.27.0" # x-release-please-version
50 changes: 40 additions & 10 deletions src/kernel/resources/browsers/browsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import typing_extensions
from typing import Mapping, Iterable, Optional, cast
from typing_extensions import Literal

import httpx

Expand All @@ -28,6 +29,7 @@
browser_create_params,
browser_delete_params,
browser_update_params,
browser_retrieve_params,
browser_load_extensions_params,
)
from .process import (
Expand Down Expand Up @@ -226,6 +228,7 @@ def retrieve(
self,
id: str,
*,
include_deleted: bool | 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,
Expand All @@ -237,6 +240,8 @@ def retrieve(
Get information about a browser session.

Args:
include_deleted: When true, includes soft-deleted browser sessions in the lookup.

extra_headers: Send extra headers

extra_query: Add additional query parameters to the request
Expand All @@ -250,7 +255,13 @@ def retrieve(
return self._get(
f"/browsers/{id}",
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
extra_headers=extra_headers,
extra_query=extra_query,
extra_body=extra_body,
timeout=timeout,
query=maybe_transform(
{"include_deleted": include_deleted}, browser_retrieve_params.BrowserRetrieveParams
),
),
cast_to=BrowserRetrieveResponse,
)
Expand Down Expand Up @@ -300,6 +311,7 @@ def list(
include_deleted: bool | Omit = omit,
limit: int | Omit = omit,
offset: int | Omit = omit,
status: Literal["active", "deleted", "all"] | 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,
Expand All @@ -309,17 +321,20 @@ def list(
) -> SyncOffsetPagination[BrowserListResponse]:
"""List all browser sessions with pagination support.

Use include_deleted=true to
include soft-deleted sessions in the results.
Use status parameter to
filter by session state.

Args:
include_deleted: When true, includes soft-deleted browser sessions in the results alongside
active sessions.
include_deleted: Deprecated: Use status=all instead. When true, includes soft-deleted browser
sessions in the results alongside active sessions.

limit: Maximum number of results to return. Defaults to 20, maximum 100.

offset: Number of results to skip. Defaults to 0.

status: Filter sessions by status. "active" returns only active sessions (default),
"deleted" returns only soft-deleted sessions, "all" returns both.

extra_headers: Send extra headers

extra_query: Add additional query parameters to the request
Expand All @@ -341,6 +356,7 @@ def list(
"include_deleted": include_deleted,
"limit": limit,
"offset": offset,
"status": status,
},
browser_list_params.BrowserListParams,
),
Expand Down Expand Up @@ -610,6 +626,7 @@ async def retrieve(
self,
id: str,
*,
include_deleted: bool | 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,
Expand All @@ -621,6 +638,8 @@ async def retrieve(
Get information about a browser session.

Args:
include_deleted: When true, includes soft-deleted browser sessions in the lookup.

extra_headers: Send extra headers

extra_query: Add additional query parameters to the request
Expand All @@ -634,7 +653,13 @@ async def retrieve(
return await self._get(
f"/browsers/{id}",
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
extra_headers=extra_headers,
extra_query=extra_query,
extra_body=extra_body,
timeout=timeout,
query=await async_maybe_transform(
{"include_deleted": include_deleted}, browser_retrieve_params.BrowserRetrieveParams
),
),
cast_to=BrowserRetrieveResponse,
)
Expand Down Expand Up @@ -684,6 +709,7 @@ def list(
include_deleted: bool | Omit = omit,
limit: int | Omit = omit,
offset: int | Omit = omit,
status: Literal["active", "deleted", "all"] | 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,
Expand All @@ -693,17 +719,20 @@ def list(
) -> AsyncPaginator[BrowserListResponse, AsyncOffsetPagination[BrowserListResponse]]:
"""List all browser sessions with pagination support.

Use include_deleted=true to
include soft-deleted sessions in the results.
Use status parameter to
filter by session state.

Args:
include_deleted: When true, includes soft-deleted browser sessions in the results alongside
active sessions.
include_deleted: Deprecated: Use status=all instead. When true, includes soft-deleted browser
sessions in the results alongside active sessions.

limit: Maximum number of results to return. Defaults to 20, maximum 100.

offset: Number of results to skip. Defaults to 0.

status: Filter sessions by status. "active" returns only active sessions (default),
"deleted" returns only soft-deleted sessions, "all" returns both.

extra_headers: Send extra headers

extra_query: Add additional query parameters to the request
Expand All @@ -725,6 +754,7 @@ def list(
"include_deleted": include_deleted,
"limit": limit,
"offset": offset,
"status": status,
},
browser_list_params.BrowserListParams,
),
Expand Down
1 change: 1 addition & 0 deletions src/kernel/types/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
from .invocation_list_params import InvocationListParams as InvocationListParams
from .invocation_state_event import InvocationStateEvent as InvocationStateEvent
from .browser_create_response import BrowserCreateResponse as BrowserCreateResponse
from .browser_retrieve_params import BrowserRetrieveParams as BrowserRetrieveParams
from .browser_update_response import BrowserUpdateResponse as BrowserUpdateResponse
from .extension_list_response import ExtensionListResponse as ExtensionListResponse
from .extension_upload_params import ExtensionUploadParams as ExtensionUploadParams
Expand Down
12 changes: 10 additions & 2 deletions src/kernel/types/browser_list_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@

from __future__ import annotations

from typing_extensions import TypedDict
from typing_extensions import Literal, TypedDict

__all__ = ["BrowserListParams"]


class BrowserListParams(TypedDict, total=False):
include_deleted: bool
"""
"""Deprecated: Use status=all instead.

When true, includes soft-deleted browser sessions in the results alongside
active sessions.
"""
Expand All @@ -19,3 +20,10 @@ class BrowserListParams(TypedDict, total=False):

offset: int
"""Number of results to skip. Defaults to 0."""

status: Literal["active", "deleted", "all"]
"""Filter sessions by status.

"active" returns only active sessions (default), "deleted" returns only
soft-deleted sessions, "all" returns both.
"""
12 changes: 12 additions & 0 deletions src/kernel/types/browser_retrieve_params.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

from __future__ import annotations

from typing_extensions import TypedDict

__all__ = ["BrowserRetrieveParams"]


class BrowserRetrieveParams(TypedDict, total=False):
include_deleted: bool
"""When true, includes soft-deleted browser sessions in the lookup."""
36 changes: 28 additions & 8 deletions tests/api_resources/test_browsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,15 +87,24 @@ def test_streaming_response_create(self, client: Kernel) -> None:
@parametrize
def test_method_retrieve(self, client: Kernel) -> None:
browser = client.browsers.retrieve(
"htzv5orfit78e1m2biiifpbv",
id="htzv5orfit78e1m2biiifpbv",
)
assert_matches_type(BrowserRetrieveResponse, browser, path=["response"])

@pytest.mark.skip(reason="Prism tests are disabled")
@parametrize
def test_method_retrieve_with_all_params(self, client: Kernel) -> None:
browser = client.browsers.retrieve(
id="htzv5orfit78e1m2biiifpbv",
include_deleted=True,
)
assert_matches_type(BrowserRetrieveResponse, browser, path=["response"])

@pytest.mark.skip(reason="Prism tests are disabled")
@parametrize
def test_raw_response_retrieve(self, client: Kernel) -> None:
response = client.browsers.with_raw_response.retrieve(
"htzv5orfit78e1m2biiifpbv",
id="htzv5orfit78e1m2biiifpbv",
)

assert response.is_closed is True
Expand All @@ -107,7 +116,7 @@ def test_raw_response_retrieve(self, client: Kernel) -> None:
@parametrize
def test_streaming_response_retrieve(self, client: Kernel) -> None:
with client.browsers.with_streaming_response.retrieve(
"htzv5orfit78e1m2biiifpbv",
id="htzv5orfit78e1m2biiifpbv",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
Expand All @@ -122,7 +131,7 @@ def test_streaming_response_retrieve(self, client: Kernel) -> None:
def test_path_params_retrieve(self, client: Kernel) -> None:
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
client.browsers.with_raw_response.retrieve(
"",
id="",
)

@pytest.mark.skip(reason="Prism tests are disabled")
Expand Down Expand Up @@ -189,6 +198,7 @@ def test_method_list_with_all_params(self, client: Kernel) -> None:
include_deleted=True,
limit=1,
offset=0,
status="active",
)
assert_matches_type(SyncOffsetPagination[BrowserListResponse], browser, path=["response"])

Expand Down Expand Up @@ -428,15 +438,24 @@ async def test_streaming_response_create(self, async_client: AsyncKernel) -> Non
@parametrize
async def test_method_retrieve(self, async_client: AsyncKernel) -> None:
browser = await async_client.browsers.retrieve(
"htzv5orfit78e1m2biiifpbv",
id="htzv5orfit78e1m2biiifpbv",
)
assert_matches_type(BrowserRetrieveResponse, browser, path=["response"])

@pytest.mark.skip(reason="Prism tests are disabled")
@parametrize
async def test_method_retrieve_with_all_params(self, async_client: AsyncKernel) -> None:
browser = await async_client.browsers.retrieve(
id="htzv5orfit78e1m2biiifpbv",
include_deleted=True,
)
assert_matches_type(BrowserRetrieveResponse, browser, path=["response"])

@pytest.mark.skip(reason="Prism tests are disabled")
@parametrize
async def test_raw_response_retrieve(self, async_client: AsyncKernel) -> None:
response = await async_client.browsers.with_raw_response.retrieve(
"htzv5orfit78e1m2biiifpbv",
id="htzv5orfit78e1m2biiifpbv",
)

assert response.is_closed is True
Expand All @@ -448,7 +467,7 @@ async def test_raw_response_retrieve(self, async_client: AsyncKernel) -> None:
@parametrize
async def test_streaming_response_retrieve(self, async_client: AsyncKernel) -> None:
async with async_client.browsers.with_streaming_response.retrieve(
"htzv5orfit78e1m2biiifpbv",
id="htzv5orfit78e1m2biiifpbv",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
Expand All @@ -463,7 +482,7 @@ async def test_streaming_response_retrieve(self, async_client: AsyncKernel) -> N
async def test_path_params_retrieve(self, async_client: AsyncKernel) -> None:
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
await async_client.browsers.with_raw_response.retrieve(
"",
id="",
)

@pytest.mark.skip(reason="Prism tests are disabled")
Expand Down Expand Up @@ -530,6 +549,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncKernel) -> N
include_deleted=True,
limit=1,
offset=0,
status="active",
)
assert_matches_type(AsyncOffsetPagination[BrowserListResponse], browser, path=["response"])

Expand Down