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.14.0"
".": "0.14.1"
}
6 changes: 3 additions & 3 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 57
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-936db268b3dcae5d64bd5d590506d8134304ffcbf67389eb9b1555b3febfd4cb.yml
openapi_spec_hash: 145485087adf1b28c052bacb4df68462
config_hash: 15cd063f8e308686ac71bf9ee9634625
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-1cd328ccf61f0e888d6df27b091c30b38c392ab9ca8ce7fd0ead8f10aaf71ffa.yml
openapi_spec_hash: af761c48d1955f11822f3b95f9c46750
config_hash: deadfc4d2b0a947673bcf559b5db6e1b
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
# Changelog

## 0.14.1 (2025-10-13)

Full Changelog: [v0.14.0...v0.14.1](https://github.com/onkernel/kernel-python-sdk/compare/v0.14.0...v0.14.1)

### Features

* Hide and deprecate mobile proxy type ([bee8d86](https://github.com/onkernel/kernel-python-sdk/commit/bee8d86588ce57de073583fa7e94a5ba38f21b9a))
* WIP: Configurable Viewport ([60b9961](https://github.com/onkernel/kernel-python-sdk/commit/60b99616dea9fa4ba823f58c2c18ea9dda60b836))


### Chores

* **internal:** detect missing future annotations with ruff ([b53927c](https://github.com/onkernel/kernel-python-sdk/commit/b53927c4013a34ad6afee95efe5608b56e34755a))

## 0.14.0 (2025-10-07)

Full Changelog: [v0.13.0...v0.14.0](https://github.com/onkernel/kernel-python-sdk/compare/v0.13.0...v0.14.0)
Expand Down
2 changes: 1 addition & 1 deletion api.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ Methods:
- <code title="get /browsers">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">list</a>() -> <a href="./src/kernel/types/browser_list_response.py">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>
- <code title="delete /browsers/{id}">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">delete_by_id</a>(id) -> None</code>
- <code title="post /browsers/{id}/extensions">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">upload_extensions</a>(id, \*\*<a href="src/kernel/types/browser_upload_extensions_params.py">params</a>) -> None</code>
- <code title="post /browsers/{id}/extensions">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">load_extensions</a>(id, \*\*<a href="src/kernel/types/browser_load_extensions_params.py">params</a>) -> None</code>

## Replays

Expand Down
6 changes: 5 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "kernel"
version = "0.14.0"
version = "0.14.1"
description = "The official Python library for the kernel API"
dynamic = ["readme"]
license = "Apache-2.0"
Expand Down Expand Up @@ -224,6 +224,8 @@ select = [
"B",
# remove unused imports
"F401",
# check for missing future annotations
"FA102",
# bare except statements
"E722",
# unused arguments
Expand All @@ -246,6 +248,8 @@ unfixable = [
"T203",
]

extend-safe-fixes = ["FA102"]

[tool.ruff.lint.flake8-tidy-imports.banned-api]
"functools.lru_cache".msg = "This function does not retain type information for the wrapped function's arguments; The `lru_cache` function from `_utils` should be used instead"

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.14.0" # x-release-please-version
__version__ = "0.14.1" # x-release-please-version
52 changes: 37 additions & 15 deletions src/kernel/resources/browsers/browsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
FsResourceWithStreamingResponse,
AsyncFsResourceWithStreamingResponse,
)
from ...types import browser_create_params, browser_delete_params, browser_upload_extensions_params
from ...types import browser_create_params, browser_delete_params, browser_load_extensions_params
from .process import (
ProcessResource,
AsyncProcessResource,
Expand Down Expand Up @@ -105,6 +105,7 @@ def create(
proxy_id: str | Omit = omit,
stealth: bool | Omit = omit,
timeout_seconds: int | Omit = omit,
viewport: browser_create_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.
extra_headers: Headers | None = None,
Expand Down Expand Up @@ -142,6 +143,15 @@ def create(
seconds, so the actual timeout behavior you will see is +/- 5 seconds around the
specified value.

viewport: Initial browser window size in pixels with optional refresh rate. If omitted,
image defaults apply (commonly 1024x768@60). Only specific viewport
configurations are supported. The server will reject unsupported combinations.
Supported resolutions are: 2560x1440@10, 1920x1080@25, 1920x1200@25,
1440x900@25, 1024x768@60 If refresh_rate is not provided, it will be
automatically determined from the width and height if they match a supported
configuration exactly. Note: Higher resolutions may affect the responsiveness of
live view browser

extra_headers: Send extra headers

extra_query: Add additional query parameters to the request
Expand All @@ -162,6 +172,7 @@ def create(
"proxy_id": proxy_id,
"stealth": stealth,
"timeout_seconds": timeout_seconds,
"viewport": viewport,
},
browser_create_params.BrowserCreateParams,
),
Expand Down Expand Up @@ -295,11 +306,11 @@ def delete_by_id(
cast_to=NoneType,
)

def upload_extensions(
def load_extensions(
self,
id: str,
*,
extensions: Iterable[browser_upload_extensions_params.Extension],
extensions: Iterable[browser_load_extensions_params.Extension],
# 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 Down Expand Up @@ -333,7 +344,7 @@ def upload_extensions(
extra_headers["Content-Type"] = "multipart/form-data"
return self._post(
f"/browsers/{id}/extensions",
body=maybe_transform(body, browser_upload_extensions_params.BrowserUploadExtensionsParams),
body=maybe_transform(body, browser_load_extensions_params.BrowserLoadExtensionsParams),
files=files,
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
Expand Down Expand Up @@ -389,6 +400,7 @@ async def create(
proxy_id: str | Omit = omit,
stealth: bool | Omit = omit,
timeout_seconds: int | Omit = omit,
viewport: browser_create_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.
extra_headers: Headers | None = None,
Expand Down Expand Up @@ -426,6 +438,15 @@ async def create(
seconds, so the actual timeout behavior you will see is +/- 5 seconds around the
specified value.

viewport: Initial browser window size in pixels with optional refresh rate. If omitted,
image defaults apply (commonly 1024x768@60). Only specific viewport
configurations are supported. The server will reject unsupported combinations.
Supported resolutions are: 2560x1440@10, 1920x1080@25, 1920x1200@25,
1440x900@25, 1024x768@60 If refresh_rate is not provided, it will be
automatically determined from the width and height if they match a supported
configuration exactly. Note: Higher resolutions may affect the responsiveness of
live view browser

extra_headers: Send extra headers

extra_query: Add additional query parameters to the request
Expand All @@ -446,6 +467,7 @@ async def create(
"proxy_id": proxy_id,
"stealth": stealth,
"timeout_seconds": timeout_seconds,
"viewport": viewport,
},
browser_create_params.BrowserCreateParams,
),
Expand Down Expand Up @@ -581,11 +603,11 @@ async def delete_by_id(
cast_to=NoneType,
)

async def upload_extensions(
async def load_extensions(
self,
id: str,
*,
extensions: Iterable[browser_upload_extensions_params.Extension],
extensions: Iterable[browser_load_extensions_params.Extension],
# 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 Down Expand Up @@ -619,7 +641,7 @@ async def upload_extensions(
extra_headers["Content-Type"] = "multipart/form-data"
return await self._post(
f"/browsers/{id}/extensions",
body=await async_maybe_transform(body, browser_upload_extensions_params.BrowserUploadExtensionsParams),
body=await async_maybe_transform(body, browser_load_extensions_params.BrowserLoadExtensionsParams),
files=files,
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
Expand Down Expand Up @@ -647,8 +669,8 @@ def __init__(self, browsers: BrowsersResource) -> None:
self.delete_by_id = to_raw_response_wrapper(
browsers.delete_by_id,
)
self.upload_extensions = to_raw_response_wrapper(
browsers.upload_extensions,
self.load_extensions = to_raw_response_wrapper(
browsers.load_extensions,
)

@cached_property
Expand Down Expand Up @@ -687,8 +709,8 @@ def __init__(self, browsers: AsyncBrowsersResource) -> None:
self.delete_by_id = async_to_raw_response_wrapper(
browsers.delete_by_id,
)
self.upload_extensions = async_to_raw_response_wrapper(
browsers.upload_extensions,
self.load_extensions = async_to_raw_response_wrapper(
browsers.load_extensions,
)

@cached_property
Expand Down Expand Up @@ -727,8 +749,8 @@ def __init__(self, browsers: BrowsersResource) -> None:
self.delete_by_id = to_streamed_response_wrapper(
browsers.delete_by_id,
)
self.upload_extensions = to_streamed_response_wrapper(
browsers.upload_extensions,
self.load_extensions = to_streamed_response_wrapper(
browsers.load_extensions,
)

@cached_property
Expand Down Expand Up @@ -767,8 +789,8 @@ def __init__(self, browsers: AsyncBrowsersResource) -> None:
self.delete_by_id = async_to_streamed_response_wrapper(
browsers.delete_by_id,
)
self.upload_extensions = async_to_streamed_response_wrapper(
browsers.upload_extensions,
self.load_extensions = async_to_streamed_response_wrapper(
browsers.load_extensions,
)

@cached_property
Expand Down
2 changes: 1 addition & 1 deletion src/kernel/types/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
from .invocation_update_response import InvocationUpdateResponse as InvocationUpdateResponse
from .deployment_retrieve_response import DeploymentRetrieveResponse as DeploymentRetrieveResponse
from .invocation_retrieve_response import InvocationRetrieveResponse as InvocationRetrieveResponse
from .browser_upload_extensions_params import BrowserUploadExtensionsParams as BrowserUploadExtensionsParams
from .browser_load_extensions_params import BrowserLoadExtensionsParams as BrowserLoadExtensionsParams
from .extension_download_from_chrome_store_params import (
ExtensionDownloadFromChromeStoreParams as ExtensionDownloadFromChromeStoreParams,
)
30 changes: 28 additions & 2 deletions src/kernel/types/browser_create_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
from __future__ import annotations

from typing import Iterable
from typing_extensions import TypedDict
from typing_extensions import Required, TypedDict

from .browser_persistence_param import BrowserPersistenceParam

__all__ = ["BrowserCreateParams", "Extension", "Profile"]
__all__ = ["BrowserCreateParams", "Extension", "Profile", "Viewport"]


class BrowserCreateParams(TypedDict, total=False):
Expand Down Expand Up @@ -58,6 +58,18 @@ class BrowserCreateParams(TypedDict, total=False):
specified value.
"""

viewport: Viewport
"""Initial browser window size in pixels with optional refresh rate.

If omitted, image defaults apply (commonly 1024x768@60). Only specific viewport
configurations are supported. The server will reject unsupported combinations.
Supported resolutions are: 2560x1440@10, 1920x1080@25, 1920x1200@25,
1440x900@25, 1024x768@60 If refresh_rate is not provided, it will be
automatically determined from the width and height if they match a supported
configuration exactly. Note: Higher resolutions may affect the responsiveness of
live view browser
"""


class Extension(TypedDict, total=False):
id: str
Expand Down Expand Up @@ -85,3 +97,17 @@ class Profile(TypedDict, total=False):
If true, save changes made during the session back to the profile when the
session ends.
"""


class Viewport(TypedDict, total=False):
height: Required[int]
"""Browser window height in pixels."""

width: Required[int]
"""Browser window width in pixels."""

refresh_rate: int
"""Display refresh rate in Hz.

If omitted, automatically determined from width and height.
"""
28 changes: 27 additions & 1 deletion src/kernel/types/browser_create_response.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,21 @@
from .._models import BaseModel
from .browser_persistence import BrowserPersistence

__all__ = ["BrowserCreateResponse"]
__all__ = ["BrowserCreateResponse", "Viewport"]


class Viewport(BaseModel):
height: int
"""Browser window height in pixels."""

width: int
"""Browser window width in pixels."""

refresh_rate: Optional[int] = None
"""Display refresh rate in Hz.

If omitted, automatically determined from width and height.
"""


class BrowserCreateResponse(BaseModel):
Expand Down Expand Up @@ -43,3 +57,15 @@ class BrowserCreateResponse(BaseModel):

proxy_id: Optional[str] = None
"""ID of the proxy associated with this browser session, if any."""

viewport: Optional[Viewport] = None
"""Initial browser window size in pixels with optional refresh rate.

If omitted, image defaults apply (commonly 1024x768@60). Only specific viewport
configurations are supported. The server will reject unsupported combinations.
Supported resolutions are: 2560x1440@10, 1920x1080@25, 1920x1200@25,
1440x900@25, 1024x768@60 If refresh_rate is not provided, it will be
automatically determined from the width and height if they match a supported
configuration exactly. Note: Higher resolutions may affect the responsiveness of
live view browser
"""
28 changes: 27 additions & 1 deletion src/kernel/types/browser_list_response.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,21 @@
from .._models import BaseModel
from .browser_persistence import BrowserPersistence

__all__ = ["BrowserListResponse", "BrowserListResponseItem"]
__all__ = ["BrowserListResponse", "BrowserListResponseItem", "BrowserListResponseItemViewport"]


class BrowserListResponseItemViewport(BaseModel):
height: int
"""Browser window height in pixels."""

width: int
"""Browser window width in pixels."""

refresh_rate: Optional[int] = None
"""Display refresh rate in Hz.

If omitted, automatically determined from width and height.
"""


class BrowserListResponseItem(BaseModel):
Expand Down Expand Up @@ -45,5 +59,17 @@ class BrowserListResponseItem(BaseModel):
proxy_id: Optional[str] = None
"""ID of the proxy associated with this browser session, if any."""

viewport: Optional[BrowserListResponseItemViewport] = None
"""Initial browser window size in pixels with optional refresh rate.

If omitted, image defaults apply (commonly 1024x768@60). Only specific viewport
configurations are supported. The server will reject unsupported combinations.
Supported resolutions are: 2560x1440@10, 1920x1080@25, 1920x1200@25,
1440x900@25, 1024x768@60 If refresh_rate is not provided, it will be
automatically determined from the width and height if they match a supported
configuration exactly. Note: Higher resolutions may affect the responsiveness of
live view browser
"""


BrowserListResponse: TypeAlias = List[BrowserListResponseItem]
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@

from .._types import FileTypes

__all__ = ["BrowserUploadExtensionsParams", "Extension"]
__all__ = ["BrowserLoadExtensionsParams", "Extension"]


class BrowserUploadExtensionsParams(TypedDict, total=False):
class BrowserLoadExtensionsParams(TypedDict, total=False):
extensions: Required[Iterable[Extension]]
"""List of extensions to upload and activate"""

Expand Down
Loading