Skip to content

Commit d9dedd2

Browse files
feat: Support hot swap proxy on a session
1 parent 28f7c36 commit d9dedd2

File tree

7 files changed

+284
-5
lines changed

7 files changed

+284
-5
lines changed

.stats.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 90
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-cc60c65c6bb0b8a8ea662cf758806e641790870ded35f6ffdb9f4801f3d29b15.yml
3-
openapi_spec_hash: a1074e1bba578bcd5912512166ada0dc
4-
config_hash: 7868d3397406c2974b6f058488aeefd6
1+
configured_endpoints: 91
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-4f5307643555b7917e8681b1966ae0b99f770cf59805e2f917ec7528edf11ba8.yml
3+
openapi_spec_hash: 873a9aa3a88b6cec1ad94f848eeb1c45
4+
config_hash: 20337f7888852c165d099faa7589c90a

api.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ from kernel.types import (
8181
Profile,
8282
BrowserCreateResponse,
8383
BrowserRetrieveResponse,
84+
BrowserUpdateResponse,
8485
BrowserListResponse,
8586
)
8687
```
@@ -89,6 +90,7 @@ Methods:
8990

9091
- <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>
9192
- <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>
93+
- <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>
9294
- <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>
9395
- <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>
9496
- <code title="delete /browsers/{id}">client.browsers.<a href="./src/kernel/resources/browsers/browsers.py">delete_by_id</a>(id) -> None</code>

src/kernel/resources/browsers/browsers.py

Lines changed: 93 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from __future__ import annotations
44

55
import typing_extensions
6-
from typing import Mapping, Iterable, cast
6+
from typing import Mapping, Iterable, Optional, cast
77

88
import httpx
99

@@ -27,6 +27,7 @@
2727
browser_list_params,
2828
browser_create_params,
2929
browser_delete_params,
30+
browser_update_params,
3031
browser_load_extensions_params,
3132
)
3233
from .process import (
@@ -75,6 +76,7 @@
7576
from ..._base_client import AsyncPaginator, make_request_options
7677
from ...types.browser_list_response import BrowserListResponse
7778
from ...types.browser_create_response import BrowserCreateResponse
79+
from ...types.browser_update_response import BrowserUpdateResponse
7880
from ...types.browser_persistence_param import BrowserPersistenceParam
7981
from ...types.browser_retrieve_response import BrowserRetrieveResponse
8082
from ...types.shared_params.browser_profile import BrowserProfile
@@ -253,6 +255,45 @@ def retrieve(
253255
cast_to=BrowserRetrieveResponse,
254256
)
255257

258+
def update(
259+
self,
260+
id: str,
261+
*,
262+
proxy_id: Optional[str] | Omit = omit,
263+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
264+
# The extra values given here take precedence over values defined on the client or passed to this method.
265+
extra_headers: Headers | None = None,
266+
extra_query: Query | None = None,
267+
extra_body: Body | None = None,
268+
timeout: float | httpx.Timeout | None | NotGiven = not_given,
269+
) -> BrowserUpdateResponse:
270+
"""Update a browser session.
271+
272+
Args:
273+
proxy_id: ID of the proxy to use.
274+
275+
Omit to leave unchanged, set to empty string to remove
276+
proxy.
277+
278+
extra_headers: Send extra headers
279+
280+
extra_query: Add additional query parameters to the request
281+
282+
extra_body: Add additional JSON properties to the request
283+
284+
timeout: Override the client-level default timeout for this request, in seconds
285+
"""
286+
if not id:
287+
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
288+
return self._patch(
289+
f"/browsers/{id}",
290+
body=maybe_transform({"proxy_id": proxy_id}, browser_update_params.BrowserUpdateParams),
291+
options=make_request_options(
292+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
293+
),
294+
cast_to=BrowserUpdateResponse,
295+
)
296+
256297
def list(
257298
self,
258299
*,
@@ -598,6 +639,45 @@ async def retrieve(
598639
cast_to=BrowserRetrieveResponse,
599640
)
600641

642+
async def update(
643+
self,
644+
id: str,
645+
*,
646+
proxy_id: Optional[str] | Omit = omit,
647+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
648+
# The extra values given here take precedence over values defined on the client or passed to this method.
649+
extra_headers: Headers | None = None,
650+
extra_query: Query | None = None,
651+
extra_body: Body | None = None,
652+
timeout: float | httpx.Timeout | None | NotGiven = not_given,
653+
) -> BrowserUpdateResponse:
654+
"""Update a browser session.
655+
656+
Args:
657+
proxy_id: ID of the proxy to use.
658+
659+
Omit to leave unchanged, set to empty string to remove
660+
proxy.
661+
662+
extra_headers: Send extra headers
663+
664+
extra_query: Add additional query parameters to the request
665+
666+
extra_body: Add additional JSON properties to the request
667+
668+
timeout: Override the client-level default timeout for this request, in seconds
669+
"""
670+
if not id:
671+
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
672+
return await self._patch(
673+
f"/browsers/{id}",
674+
body=await async_maybe_transform({"proxy_id": proxy_id}, browser_update_params.BrowserUpdateParams),
675+
options=make_request_options(
676+
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
677+
),
678+
cast_to=BrowserUpdateResponse,
679+
)
680+
601681
def list(
602682
self,
603683
*,
@@ -786,6 +866,9 @@ def __init__(self, browsers: BrowsersResource) -> None:
786866
self.retrieve = to_raw_response_wrapper(
787867
browsers.retrieve,
788868
)
869+
self.update = to_raw_response_wrapper(
870+
browsers.update,
871+
)
789872
self.list = to_raw_response_wrapper(
790873
browsers.list,
791874
)
@@ -836,6 +919,9 @@ def __init__(self, browsers: AsyncBrowsersResource) -> None:
836919
self.retrieve = async_to_raw_response_wrapper(
837920
browsers.retrieve,
838921
)
922+
self.update = async_to_raw_response_wrapper(
923+
browsers.update,
924+
)
839925
self.list = async_to_raw_response_wrapper(
840926
browsers.list,
841927
)
@@ -886,6 +972,9 @@ def __init__(self, browsers: BrowsersResource) -> None:
886972
self.retrieve = to_streamed_response_wrapper(
887973
browsers.retrieve,
888974
)
975+
self.update = to_streamed_response_wrapper(
976+
browsers.update,
977+
)
889978
self.list = to_streamed_response_wrapper(
890979
browsers.list,
891980
)
@@ -936,6 +1025,9 @@ def __init__(self, browsers: AsyncBrowsersResource) -> None:
9361025
self.retrieve = async_to_streamed_response_wrapper(
9371026
browsers.retrieve,
9381027
)
1028+
self.update = async_to_streamed_response_wrapper(
1029+
browsers.update,
1030+
)
9391031
self.list = async_to_streamed_response_wrapper(
9401032
browsers.list,
9411033
)

src/kernel/types/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from .browser_create_params import BrowserCreateParams as BrowserCreateParams
2727
from .browser_delete_params import BrowserDeleteParams as BrowserDeleteParams
2828
from .browser_list_response import BrowserListResponse as BrowserListResponse
29+
from .browser_update_params import BrowserUpdateParams as BrowserUpdateParams
2930
from .profile_create_params import ProfileCreateParams as ProfileCreateParams
3031
from .profile_list_response import ProfileListResponse as ProfileListResponse
3132
from .proxy_create_response import ProxyCreateResponse as ProxyCreateResponse
@@ -35,6 +36,7 @@
3536
from .invocation_list_params import InvocationListParams as InvocationListParams
3637
from .invocation_state_event import InvocationStateEvent as InvocationStateEvent
3738
from .browser_create_response import BrowserCreateResponse as BrowserCreateResponse
39+
from .browser_update_response import BrowserUpdateResponse as BrowserUpdateResponse
3840
from .extension_list_response import ExtensionListResponse as ExtensionListResponse
3941
from .extension_upload_params import ExtensionUploadParams as ExtensionUploadParams
4042
from .proxy_retrieve_response import ProxyRetrieveResponse as ProxyRetrieveResponse
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from __future__ import annotations
4+
5+
from typing import Optional
6+
from typing_extensions import TypedDict
7+
8+
__all__ = ["BrowserUpdateParams"]
9+
10+
11+
class BrowserUpdateParams(TypedDict, total=False):
12+
proxy_id: Optional[str]
13+
"""ID of the proxy to use.
14+
15+
Omit to leave unchanged, set to empty string to remove proxy.
16+
"""
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing import Optional
4+
from datetime import datetime
5+
6+
from .profile import Profile
7+
from .._models import BaseModel
8+
from .browser_persistence import BrowserPersistence
9+
from .shared.browser_viewport import BrowserViewport
10+
11+
__all__ = ["BrowserUpdateResponse"]
12+
13+
14+
class BrowserUpdateResponse(BaseModel):
15+
cdp_ws_url: str
16+
"""Websocket URL for Chrome DevTools Protocol connections to the browser session"""
17+
18+
created_at: datetime
19+
"""When the browser session was created."""
20+
21+
headless: bool
22+
"""Whether the browser session is running in headless mode."""
23+
24+
session_id: str
25+
"""Unique identifier for the browser session"""
26+
27+
stealth: bool
28+
"""Whether the browser session is running in stealth mode."""
29+
30+
timeout_seconds: int
31+
"""The number of seconds of inactivity before the browser session is terminated."""
32+
33+
browser_live_view_url: Optional[str] = None
34+
"""Remote URL for live viewing the browser session.
35+
36+
Only available for non-headless browsers.
37+
"""
38+
39+
deleted_at: Optional[datetime] = None
40+
"""When the browser session was soft-deleted. Only present for deleted sessions."""
41+
42+
kiosk_mode: Optional[bool] = None
43+
"""Whether the browser session is running in kiosk mode."""
44+
45+
persistence: Optional[BrowserPersistence] = None
46+
"""DEPRECATED: Use timeout_seconds (up to 72 hours) and Profiles instead."""
47+
48+
profile: Optional[Profile] = None
49+
"""Browser profile metadata."""
50+
51+
proxy_id: Optional[str] = None
52+
"""ID of the proxy associated with this browser session, if any."""
53+
54+
viewport: Optional[BrowserViewport] = None
55+
"""Initial browser window size in pixels with optional refresh rate.
56+
57+
If omitted, image defaults apply (1920x1080@25). Only specific viewport
58+
configurations are supported. The server will reject unsupported combinations.
59+
Supported resolutions are: 2560x1440@10, 1920x1080@25, 1920x1200@25,
60+
1440x900@25, 1024x768@60, 1200x800@60 If refresh_rate is not provided, it will
61+
be automatically determined from the width and height if they match a supported
62+
configuration exactly. Note: Higher resolutions may affect the responsiveness of
63+
live view browser
64+
"""

0 commit comments

Comments
 (0)