Skip to content
Merged
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.30.0"
".": "0.31.0"
}
8 changes: 4 additions & 4 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 98
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-ccbe854895eb34a9562e33979f5f43cd6ad1f529d5924ee56e56f0c94dcf0454.yml
openapi_spec_hash: 2fa4ecbe742fc46fdde481188c1d885e
config_hash: dd218aae3f852dff79e77febc2077b8e
configured_endpoints: 100
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-a6d93dc291278035c96add38bb6150ec2b9ba8bbabb4676e3dbbb8444cf3b1e4.yml
openapi_spec_hash: 694bcc56d94fd0ff0d1f7b0fc1dae8ba
config_hash: 62e33cf2ed8fe0b4ceebba63367481ad
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog

## 0.31.0 (2026-02-06)

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

### Features

* add batch computer action proxy endpoint ([f316e9b](https://github.com/kernel/kernel-python-sdk/commit/f316e9bf1a47e982af7af6ed8a4e8f701baf50b9))

## 0.30.0 (2026-02-03)

Full Changelog: [v0.29.0...v0.30.0](https://github.com/kernel/kernel-python-sdk/compare/v0.29.0...v0.30.0)
Expand Down
7 changes: 6 additions & 1 deletion api.md
Original file line number Diff line number Diff line change
Expand Up @@ -187,14 +187,19 @@ Methods:
Types:

```python
from kernel.types.browsers import ComputerSetCursorVisibilityResponse
from kernel.types.browsers import (
ComputerGetMousePositionResponse,
ComputerSetCursorVisibilityResponse,
)
```

Methods:

- <code title="post /browsers/{id}/computer/batch">client.browsers.computer.<a href="./src/kernel/resources/browsers/computer.py">batch</a>(id, \*\*<a href="src/kernel/types/browsers/computer_batch_params.py">params</a>) -> None</code>
- <code title="post /browsers/{id}/computer/screenshot">client.browsers.computer.<a href="./src/kernel/resources/browsers/computer.py">capture_screenshot</a>(id, \*\*<a href="src/kernel/types/browsers/computer_capture_screenshot_params.py">params</a>) -> BinaryAPIResponse</code>
- <code title="post /browsers/{id}/computer/click_mouse">client.browsers.computer.<a href="./src/kernel/resources/browsers/computer.py">click_mouse</a>(id, \*\*<a href="src/kernel/types/browsers/computer_click_mouse_params.py">params</a>) -> None</code>
- <code title="post /browsers/{id}/computer/drag_mouse">client.browsers.computer.<a href="./src/kernel/resources/browsers/computer.py">drag_mouse</a>(id, \*\*<a href="src/kernel/types/browsers/computer_drag_mouse_params.py">params</a>) -> None</code>
- <code title="post /browsers/{id}/computer/get_mouse_position">client.browsers.computer.<a href="./src/kernel/resources/browsers/computer.py">get_mouse_position</a>(id) -> <a href="./src/kernel/types/browsers/computer_get_mouse_position_response.py">ComputerGetMousePositionResponse</a></code>
- <code title="post /browsers/{id}/computer/move_mouse">client.browsers.computer.<a href="./src/kernel/resources/browsers/computer.py">move_mouse</a>(id, \*\*<a href="src/kernel/types/browsers/computer_move_mouse_params.py">params</a>) -> None</code>
- <code title="post /browsers/{id}/computer/press_key">client.browsers.computer.<a href="./src/kernel/resources/browsers/computer.py">press_key</a>(id, \*\*<a href="src/kernel/types/browsers/computer_press_key_params.py">params</a>) -> None</code>
- <code title="post /browsers/{id}/computer/scroll">client.browsers.computer.<a href="./src/kernel/resources/browsers/computer.py">scroll</a>(id, \*\*<a href="src/kernel/types/browsers/computer_scroll_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.30.0"
version = "0.31.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.30.0" # x-release-please-version
__version__ = "0.31.0" # x-release-please-version
172 changes: 172 additions & 0 deletions src/kernel/resources/browsers/computer.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
)
from ..._base_client import make_request_options
from ...types.browsers import (
computer_batch_params,
computer_scroll_params,
computer_press_key_params,
computer_type_text_params,
Expand All @@ -36,6 +37,7 @@
computer_capture_screenshot_params,
computer_set_cursor_visibility_params,
)
from ...types.browsers.computer_get_mouse_position_response import ComputerGetMousePositionResponse
from ...types.browsers.computer_set_cursor_visibility_response import ComputerSetCursorVisibilityResponse

__all__ = ["ComputerResource", "AsyncComputerResource"]
Expand All @@ -61,6 +63,46 @@ def with_streaming_response(self) -> ComputerResourceWithStreamingResponse:
"""
return ComputerResourceWithStreamingResponse(self)

def batch(
self,
id: str,
*,
actions: Iterable[computer_batch_params.Action],
# 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,
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
Send an array of computer actions to execute in order on the browser instance.
Execution stops on the first error. This reduces network latency compared to
sending individual action requests.

Args:
actions: Ordered list of actions to execute. Execution stops on the first error.

extra_headers: Send extra headers

extra_query: Add additional query parameters to the request

extra_body: Add additional JSON properties to the request

timeout: Override the client-level default timeout for this request, in seconds
"""
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
extra_headers = {"Accept": "*/*", **(extra_headers or {})}
return self._post(
f"/browsers/{id}/computer/batch",
body=maybe_transform({"actions": actions}, computer_batch_params.ComputerBatchParams),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
cast_to=NoneType,
)

def capture_screenshot(
self,
id: str,
Expand Down Expand Up @@ -227,6 +269,39 @@ def drag_mouse(
cast_to=NoneType,
)

def get_mouse_position(
self,
id: str,
*,
# 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,
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ComputerGetMousePositionResponse:
"""
Get the current mouse cursor position on the browser instance

Args:
extra_headers: Send extra headers

extra_query: Add additional query parameters to the request

extra_body: Add additional JSON properties to the request

timeout: Override the client-level default timeout for this request, in seconds
"""
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return self._post(
f"/browsers/{id}/computer/get_mouse_position",
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
cast_to=ComputerGetMousePositionResponse,
)

def move_mouse(
self,
id: str,
Expand Down Expand Up @@ -499,6 +574,46 @@ def with_streaming_response(self) -> AsyncComputerResourceWithStreamingResponse:
"""
return AsyncComputerResourceWithStreamingResponse(self)

async def batch(
self,
id: str,
*,
actions: Iterable[computer_batch_params.Action],
# 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,
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> None:
"""
Send an array of computer actions to execute in order on the browser instance.
Execution stops on the first error. This reduces network latency compared to
sending individual action requests.

Args:
actions: Ordered list of actions to execute. Execution stops on the first error.

extra_headers: Send extra headers

extra_query: Add additional query parameters to the request

extra_body: Add additional JSON properties to the request

timeout: Override the client-level default timeout for this request, in seconds
"""
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
extra_headers = {"Accept": "*/*", **(extra_headers or {})}
return await self._post(
f"/browsers/{id}/computer/batch",
body=await async_maybe_transform({"actions": actions}, computer_batch_params.ComputerBatchParams),
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
cast_to=NoneType,
)

async def capture_screenshot(
self,
id: str,
Expand Down Expand Up @@ -665,6 +780,39 @@ async def drag_mouse(
cast_to=NoneType,
)

async def get_mouse_position(
self,
id: str,
*,
# 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,
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> ComputerGetMousePositionResponse:
"""
Get the current mouse cursor position on the browser instance

Args:
extra_headers: Send extra headers

extra_query: Add additional query parameters to the request

extra_body: Add additional JSON properties to the request

timeout: Override the client-level default timeout for this request, in seconds
"""
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return await self._post(
f"/browsers/{id}/computer/get_mouse_position",
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
cast_to=ComputerGetMousePositionResponse,
)

async def move_mouse(
self,
id: str,
Expand Down Expand Up @@ -921,6 +1069,9 @@ class ComputerResourceWithRawResponse:
def __init__(self, computer: ComputerResource) -> None:
self._computer = computer

self.batch = to_raw_response_wrapper(
computer.batch,
)
self.capture_screenshot = to_custom_raw_response_wrapper(
computer.capture_screenshot,
BinaryAPIResponse,
Expand All @@ -931,6 +1082,9 @@ def __init__(self, computer: ComputerResource) -> None:
self.drag_mouse = to_raw_response_wrapper(
computer.drag_mouse,
)
self.get_mouse_position = to_raw_response_wrapper(
computer.get_mouse_position,
)
self.move_mouse = to_raw_response_wrapper(
computer.move_mouse,
)
Expand All @@ -952,6 +1106,9 @@ class AsyncComputerResourceWithRawResponse:
def __init__(self, computer: AsyncComputerResource) -> None:
self._computer = computer

self.batch = async_to_raw_response_wrapper(
computer.batch,
)
self.capture_screenshot = async_to_custom_raw_response_wrapper(
computer.capture_screenshot,
AsyncBinaryAPIResponse,
Expand All @@ -962,6 +1119,9 @@ def __init__(self, computer: AsyncComputerResource) -> None:
self.drag_mouse = async_to_raw_response_wrapper(
computer.drag_mouse,
)
self.get_mouse_position = async_to_raw_response_wrapper(
computer.get_mouse_position,
)
self.move_mouse = async_to_raw_response_wrapper(
computer.move_mouse,
)
Expand All @@ -983,6 +1143,9 @@ class ComputerResourceWithStreamingResponse:
def __init__(self, computer: ComputerResource) -> None:
self._computer = computer

self.batch = to_streamed_response_wrapper(
computer.batch,
)
self.capture_screenshot = to_custom_streamed_response_wrapper(
computer.capture_screenshot,
StreamedBinaryAPIResponse,
Expand All @@ -993,6 +1156,9 @@ def __init__(self, computer: ComputerResource) -> None:
self.drag_mouse = to_streamed_response_wrapper(
computer.drag_mouse,
)
self.get_mouse_position = to_streamed_response_wrapper(
computer.get_mouse_position,
)
self.move_mouse = to_streamed_response_wrapper(
computer.move_mouse,
)
Expand All @@ -1014,6 +1180,9 @@ class AsyncComputerResourceWithStreamingResponse:
def __init__(self, computer: AsyncComputerResource) -> None:
self._computer = computer

self.batch = async_to_streamed_response_wrapper(
computer.batch,
)
self.capture_screenshot = async_to_custom_streamed_response_wrapper(
computer.capture_screenshot,
AsyncStreamedBinaryAPIResponse,
Expand All @@ -1024,6 +1193,9 @@ def __init__(self, computer: AsyncComputerResource) -> None:
self.drag_mouse = async_to_streamed_response_wrapper(
computer.drag_mouse,
)
self.get_mouse_position = async_to_streamed_response_wrapper(
computer.get_mouse_position,
)
self.move_mouse = async_to_streamed_response_wrapper(
computer.move_mouse,
)
Expand Down
2 changes: 2 additions & 0 deletions src/kernel/types/browsers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from .process_spawn_params import ProcessSpawnParams as ProcessSpawnParams
from .process_stdin_params import ProcessStdinParams as ProcessStdinParams
from .replay_list_response import ReplayListResponse as ReplayListResponse
from .computer_batch_params import ComputerBatchParams as ComputerBatchParams
from .f_list_files_response import FListFilesResponse as FListFilesResponse
from .process_exec_response import ProcessExecResponse as ProcessExecResponse
from .process_kill_response import ProcessKillResponse as ProcessKillResponse
Expand All @@ -41,6 +42,7 @@
from .f_set_file_permissions_params import FSetFilePermissionsParams as FSetFilePermissionsParams
from .process_stdout_stream_response import ProcessStdoutStreamResponse as ProcessStdoutStreamResponse
from .computer_capture_screenshot_params import ComputerCaptureScreenshotParams as ComputerCaptureScreenshotParams
from .computer_get_mouse_position_response import ComputerGetMousePositionResponse as ComputerGetMousePositionResponse
from .computer_set_cursor_visibility_params import (
ComputerSetCursorVisibilityParams as ComputerSetCursorVisibilityParams,
)
Expand Down
Loading