Skip to content

Commit 351585d

Browse files
feat: WIP: Configurable Viewport
1 parent 49eb50b commit 351585d

File tree

10 files changed

+179
-43
lines changed

10 files changed

+179
-43
lines changed

.stats.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 57
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-592ab7a96084f7241d77b4cc1ce2a074795b0dc40d8247e1a0129fe3f89c1ed4.yml
3-
openapi_spec_hash: 3a23b4c9c05946251be45c5c4e7a415d
4-
config_hash: 15cd063f8e308686ac71bf9ee9634625
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-1cd328ccf61f0e888d6df27b091c30b38c392ab9ca8ce7fd0ead8f10aaf71ffa.yml
3+
openapi_spec_hash: af761c48d1955f11822f3b95f9c46750
4+
config_hash: deadfc4d2b0a947673bcf559b5db6e1b

api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ Methods:
8282
- <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>
8383
- <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>
8484
- <code title="delete /browsers/{id}">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">delete_by_id</a>(id) -> None</code>
85-
- <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>
85+
- <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>
8686

8787
## Replays
8888

src/kernel/resources/browsers/browsers.py

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
FsResourceWithStreamingResponse,
2323
AsyncFsResourceWithStreamingResponse,
2424
)
25-
from ...types import browser_create_params, browser_delete_params, browser_upload_extensions_params
25+
from ...types import browser_create_params, browser_delete_params, browser_load_extensions_params
2626
from .process import (
2727
ProcessResource,
2828
AsyncProcessResource,
@@ -105,6 +105,7 @@ def create(
105105
proxy_id: str | Omit = omit,
106106
stealth: bool | Omit = omit,
107107
timeout_seconds: int | Omit = omit,
108+
viewport: browser_create_params.Viewport | Omit = omit,
108109
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
109110
# The extra values given here take precedence over values defined on the client or passed to this method.
110111
extra_headers: Headers | None = None,
@@ -142,6 +143,15 @@ def create(
142143
seconds, so the actual timeout behavior you will see is +/- 5 seconds around the
143144
specified value.
144145
146+
viewport: Initial browser window size in pixels with optional refresh rate. If omitted,
147+
image defaults apply (commonly 1024x768@60). Only specific viewport
148+
configurations are supported. The server will reject unsupported combinations.
149+
Supported resolutions are: 2560x1440@10, 1920x1080@25, 1920x1200@25,
150+
1440x900@25, 1024x768@60 If refresh_rate is not provided, it will be
151+
automatically determined from the width and height if they match a supported
152+
configuration exactly. Note: Higher resolutions may affect the responsiveness of
153+
live view browser
154+
145155
extra_headers: Send extra headers
146156
147157
extra_query: Add additional query parameters to the request
@@ -162,6 +172,7 @@ def create(
162172
"proxy_id": proxy_id,
163173
"stealth": stealth,
164174
"timeout_seconds": timeout_seconds,
175+
"viewport": viewport,
165176
},
166177
browser_create_params.BrowserCreateParams,
167178
),
@@ -295,11 +306,11 @@ def delete_by_id(
295306
cast_to=NoneType,
296307
)
297308

298-
def upload_extensions(
309+
def load_extensions(
299310
self,
300311
id: str,
301312
*,
302-
extensions: Iterable[browser_upload_extensions_params.Extension],
313+
extensions: Iterable[browser_load_extensions_params.Extension],
303314
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
304315
# The extra values given here take precedence over values defined on the client or passed to this method.
305316
extra_headers: Headers | None = None,
@@ -333,7 +344,7 @@ def upload_extensions(
333344
extra_headers["Content-Type"] = "multipart/form-data"
334345
return self._post(
335346
f"/browsers/{id}/extensions",
336-
body=maybe_transform(body, browser_upload_extensions_params.BrowserUploadExtensionsParams),
347+
body=maybe_transform(body, browser_load_extensions_params.BrowserLoadExtensionsParams),
337348
files=files,
338349
options=make_request_options(
339350
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
@@ -389,6 +400,7 @@ async def create(
389400
proxy_id: str | Omit = omit,
390401
stealth: bool | Omit = omit,
391402
timeout_seconds: int | Omit = omit,
403+
viewport: browser_create_params.Viewport | Omit = omit,
392404
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
393405
# The extra values given here take precedence over values defined on the client or passed to this method.
394406
extra_headers: Headers | None = None,
@@ -426,6 +438,15 @@ async def create(
426438
seconds, so the actual timeout behavior you will see is +/- 5 seconds around the
427439
specified value.
428440
441+
viewport: Initial browser window size in pixels with optional refresh rate. If omitted,
442+
image defaults apply (commonly 1024x768@60). Only specific viewport
443+
configurations are supported. The server will reject unsupported combinations.
444+
Supported resolutions are: 2560x1440@10, 1920x1080@25, 1920x1200@25,
445+
1440x900@25, 1024x768@60 If refresh_rate is not provided, it will be
446+
automatically determined from the width and height if they match a supported
447+
configuration exactly. Note: Higher resolutions may affect the responsiveness of
448+
live view browser
449+
429450
extra_headers: Send extra headers
430451
431452
extra_query: Add additional query parameters to the request
@@ -446,6 +467,7 @@ async def create(
446467
"proxy_id": proxy_id,
447468
"stealth": stealth,
448469
"timeout_seconds": timeout_seconds,
470+
"viewport": viewport,
449471
},
450472
browser_create_params.BrowserCreateParams,
451473
),
@@ -581,11 +603,11 @@ async def delete_by_id(
581603
cast_to=NoneType,
582604
)
583605

584-
async def upload_extensions(
606+
async def load_extensions(
585607
self,
586608
id: str,
587609
*,
588-
extensions: Iterable[browser_upload_extensions_params.Extension],
610+
extensions: Iterable[browser_load_extensions_params.Extension],
589611
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
590612
# The extra values given here take precedence over values defined on the client or passed to this method.
591613
extra_headers: Headers | None = None,
@@ -619,7 +641,7 @@ async def upload_extensions(
619641
extra_headers["Content-Type"] = "multipart/form-data"
620642
return await self._post(
621643
f"/browsers/{id}/extensions",
622-
body=await async_maybe_transform(body, browser_upload_extensions_params.BrowserUploadExtensionsParams),
644+
body=await async_maybe_transform(body, browser_load_extensions_params.BrowserLoadExtensionsParams),
623645
files=files,
624646
options=make_request_options(
625647
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
@@ -647,8 +669,8 @@ def __init__(self, browsers: BrowsersResource) -> None:
647669
self.delete_by_id = to_raw_response_wrapper(
648670
browsers.delete_by_id,
649671
)
650-
self.upload_extensions = to_raw_response_wrapper(
651-
browsers.upload_extensions,
672+
self.load_extensions = to_raw_response_wrapper(
673+
browsers.load_extensions,
652674
)
653675

654676
@cached_property
@@ -687,8 +709,8 @@ def __init__(self, browsers: AsyncBrowsersResource) -> None:
687709
self.delete_by_id = async_to_raw_response_wrapper(
688710
browsers.delete_by_id,
689711
)
690-
self.upload_extensions = async_to_raw_response_wrapper(
691-
browsers.upload_extensions,
712+
self.load_extensions = async_to_raw_response_wrapper(
713+
browsers.load_extensions,
692714
)
693715

694716
@cached_property
@@ -727,8 +749,8 @@ def __init__(self, browsers: BrowsersResource) -> None:
727749
self.delete_by_id = to_streamed_response_wrapper(
728750
browsers.delete_by_id,
729751
)
730-
self.upload_extensions = to_streamed_response_wrapper(
731-
browsers.upload_extensions,
752+
self.load_extensions = to_streamed_response_wrapper(
753+
browsers.load_extensions,
732754
)
733755

734756
@cached_property
@@ -767,8 +789,8 @@ def __init__(self, browsers: AsyncBrowsersResource) -> None:
767789
self.delete_by_id = async_to_streamed_response_wrapper(
768790
browsers.delete_by_id,
769791
)
770-
self.upload_extensions = async_to_streamed_response_wrapper(
771-
browsers.upload_extensions,
792+
self.load_extensions = async_to_streamed_response_wrapper(
793+
browsers.load_extensions,
772794
)
773795

774796
@cached_property

src/kernel/types/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
from .invocation_update_response import InvocationUpdateResponse as InvocationUpdateResponse
4848
from .deployment_retrieve_response import DeploymentRetrieveResponse as DeploymentRetrieveResponse
4949
from .invocation_retrieve_response import InvocationRetrieveResponse as InvocationRetrieveResponse
50-
from .browser_upload_extensions_params import BrowserUploadExtensionsParams as BrowserUploadExtensionsParams
50+
from .browser_load_extensions_params import BrowserLoadExtensionsParams as BrowserLoadExtensionsParams
5151
from .extension_download_from_chrome_store_params import (
5252
ExtensionDownloadFromChromeStoreParams as ExtensionDownloadFromChromeStoreParams,
5353
)

src/kernel/types/browser_create_params.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
from __future__ import annotations
44

55
from typing import Iterable
6-
from typing_extensions import TypedDict
6+
from typing_extensions import Required, TypedDict
77

88
from .browser_persistence_param import BrowserPersistenceParam
99

10-
__all__ = ["BrowserCreateParams", "Extension", "Profile"]
10+
__all__ = ["BrowserCreateParams", "Extension", "Profile", "Viewport"]
1111

1212

1313
class BrowserCreateParams(TypedDict, total=False):
@@ -58,6 +58,18 @@ class BrowserCreateParams(TypedDict, total=False):
5858
specified value.
5959
"""
6060

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

6274
class Extension(TypedDict, total=False):
6375
id: str
@@ -85,3 +97,17 @@ class Profile(TypedDict, total=False):
8597
If true, save changes made during the session back to the profile when the
8698
session ends.
8799
"""
100+
101+
102+
class Viewport(TypedDict, total=False):
103+
height: Required[int]
104+
"""Browser window height in pixels."""
105+
106+
width: Required[int]
107+
"""Browser window width in pixels."""
108+
109+
refresh_rate: int
110+
"""Display refresh rate in Hz.
111+
112+
If omitted, automatically determined from width and height.
113+
"""

src/kernel/types/browser_create_response.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,21 @@
77
from .._models import BaseModel
88
from .browser_persistence import BrowserPersistence
99

10-
__all__ = ["BrowserCreateResponse"]
10+
__all__ = ["BrowserCreateResponse", "Viewport"]
11+
12+
13+
class Viewport(BaseModel):
14+
height: int
15+
"""Browser window height in pixels."""
16+
17+
width: int
18+
"""Browser window width in pixels."""
19+
20+
refresh_rate: Optional[int] = None
21+
"""Display refresh rate in Hz.
22+
23+
If omitted, automatically determined from width and height.
24+
"""
1125

1226

1327
class BrowserCreateResponse(BaseModel):
@@ -43,3 +57,15 @@ class BrowserCreateResponse(BaseModel):
4357

4458
proxy_id: Optional[str] = None
4559
"""ID of the proxy associated with this browser session, if any."""
60+
61+
viewport: Optional[Viewport] = None
62+
"""Initial browser window size in pixels with optional refresh rate.
63+
64+
If omitted, image defaults apply (commonly 1024x768@60). Only specific viewport
65+
configurations are supported. The server will reject unsupported combinations.
66+
Supported resolutions are: 2560x1440@10, 1920x1080@25, 1920x1200@25,
67+
1440x900@25, 1024x768@60 If refresh_rate is not provided, it will be
68+
automatically determined from the width and height if they match a supported
69+
configuration exactly. Note: Higher resolutions may affect the responsiveness of
70+
live view browser
71+
"""

src/kernel/types/browser_list_response.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,21 @@
88
from .._models import BaseModel
99
from .browser_persistence import BrowserPersistence
1010

11-
__all__ = ["BrowserListResponse", "BrowserListResponseItem"]
11+
__all__ = ["BrowserListResponse", "BrowserListResponseItem", "BrowserListResponseItemViewport"]
12+
13+
14+
class BrowserListResponseItemViewport(BaseModel):
15+
height: int
16+
"""Browser window height in pixels."""
17+
18+
width: int
19+
"""Browser window width in pixels."""
20+
21+
refresh_rate: Optional[int] = None
22+
"""Display refresh rate in Hz.
23+
24+
If omitted, automatically determined from width and height.
25+
"""
1226

1327

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

62+
viewport: Optional[BrowserListResponseItemViewport] = None
63+
"""Initial browser window size in pixels with optional refresh rate.
64+
65+
If omitted, image defaults apply (commonly 1024x768@60). Only specific viewport
66+
configurations are supported. The server will reject unsupported combinations.
67+
Supported resolutions are: 2560x1440@10, 1920x1080@25, 1920x1200@25,
68+
1440x900@25, 1024x768@60 If refresh_rate is not provided, it will be
69+
automatically determined from the width and height if they match a supported
70+
configuration exactly. Note: Higher resolutions may affect the responsiveness of
71+
live view browser
72+
"""
73+
4874

4975
BrowserListResponse: TypeAlias = List[BrowserListResponseItem]

src/kernel/types/browser_upload_extensions_params.py renamed to src/kernel/types/browser_load_extensions_params.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77

88
from .._types import FileTypes
99

10-
__all__ = ["BrowserUploadExtensionsParams", "Extension"]
10+
__all__ = ["BrowserLoadExtensionsParams", "Extension"]
1111

1212

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

src/kernel/types/browser_retrieve_response.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,21 @@
77
from .._models import BaseModel
88
from .browser_persistence import BrowserPersistence
99

10-
__all__ = ["BrowserRetrieveResponse"]
10+
__all__ = ["BrowserRetrieveResponse", "Viewport"]
11+
12+
13+
class Viewport(BaseModel):
14+
height: int
15+
"""Browser window height in pixels."""
16+
17+
width: int
18+
"""Browser window width in pixels."""
19+
20+
refresh_rate: Optional[int] = None
21+
"""Display refresh rate in Hz.
22+
23+
If omitted, automatically determined from width and height.
24+
"""
1125

1226

1327
class BrowserRetrieveResponse(BaseModel):
@@ -43,3 +57,15 @@ class BrowserRetrieveResponse(BaseModel):
4357

4458
proxy_id: Optional[str] = None
4559
"""ID of the proxy associated with this browser session, if any."""
60+
61+
viewport: Optional[Viewport] = None
62+
"""Initial browser window size in pixels with optional refresh rate.
63+
64+
If omitted, image defaults apply (commonly 1024x768@60). Only specific viewport
65+
configurations are supported. The server will reject unsupported combinations.
66+
Supported resolutions are: 2560x1440@10, 1920x1080@25, 1920x1200@25,
67+
1440x900@25, 1024x768@60 If refresh_rate is not provided, it will be
68+
automatically determined from the width and height if they match a supported
69+
configuration exactly. Note: Higher resolutions may affect the responsiveness of
70+
live view browser
71+
"""

0 commit comments

Comments
 (0)