Skip to content

Commit 48fd526

Browse files
feat: Add browser location session policy
Stainless-Generated-From: a55a0720ed50df5df1001ae2613977041468284b
1 parent a9ab0d3 commit 48fd526

17 files changed

Lines changed: 186 additions & 2 deletions

‎README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,9 +203,9 @@ from kernel import Kernel
203203
client = Kernel()
204204

205205
browser = client.browsers.create(
206-
network={},
206+
location={},
207207
)
208-
print(browser.network)
208+
print(browser.location)
209209
```
210210

211211
## File uploads

‎api.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ Types:
118118
```python
119119
from kernel.types import (
120120
BrowserAllowlistState,
121+
BrowserLocation,
122+
BrowserLocationRequest,
123+
BrowserLocationSource,
124+
BrowserLocationUpdateRequest,
121125
BrowserMemory,
122126
BrowserMemoryRequest,
123127
BrowserNetworkConfig,

‎src/kernel/resources/browsers/browsers.py‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,10 @@
116116
from ...types.browser_network_config_param import BrowserNetworkConfigParam
117117
from ...types.browser_network_update_param import BrowserNetworkUpdateParam
118118
from ...types.shared_params.browser_profile import BrowserProfile
119+
from ...types.browser_location_request_param import BrowserLocationRequestParam
119120
from ...types.shared_params.browser_viewport import BrowserViewport
120121
from ...types.shared_params.browser_extension import BrowserExtension
122+
from ...types.browser_location_update_request_param import BrowserLocationUpdateRequestParam
121123

122124
__all__ = ["BrowsersResource", "AsyncBrowsersResource"]
123125

@@ -195,6 +197,7 @@ def create(
195197
headless: bool | Omit = omit,
196198
invocation_id: str | Omit = omit,
197199
kiosk_mode: bool | Omit = omit,
200+
location: BrowserLocationRequestParam | Omit = omit,
198201
memory: BrowserMemoryRequest | Omit = omit,
199202
name: str | Omit = omit,
200203
network: BrowserNetworkConfigParam | Omit = omit,
@@ -239,6 +242,9 @@ def create(
239242
kiosk_mode: If true, launches the browser in kiosk mode to hide address bar and tabs in live
240243
view.
241244
245+
location: Optional session-only timezone and locale overrides. Each omitted field uses the
246+
default for the browser's region. start_url opens once the location applies.
247+
242248
memory:
243249
Memory for a non-GPU browser. Headless: 1GiB (default), 2GiB, or 4GiB. Headful:
244250
8GiB (default) or 16GiB.
@@ -333,6 +339,7 @@ def create(
333339
"headless": headless,
334340
"invocation_id": invocation_id,
335341
"kiosk_mode": kiosk_mode,
342+
"location": location,
336343
"memory": memory,
337344
"name": name,
338345
"network": network,
@@ -404,6 +411,7 @@ def update(
404411
id_or_name: str,
405412
*,
406413
disable_default_proxy: bool | Omit = omit,
414+
location: BrowserLocationUpdateRequestParam | Omit = omit,
407415
name: Optional[str] | Omit = omit,
408416
network: BrowserNetworkUpdateParam | Omit = omit,
409417
profile: BrowserProfile | Omit = omit,
@@ -427,6 +435,14 @@ def update(
427435
disable_default_proxy: If true, stealth browsers connect directly instead of using the default stealth
428436
proxy. Deprecated in favor of proxy.mode.
429437
438+
location: Session-only timezone and locale overrides. Omit the object or a field to leave
439+
it unchanged; set a string to override; set null to clear that field and use the
440+
browser region's default. A browser that cannot change location refuses the
441+
request before anything changes. The location applies after the request's other
442+
changes, and start_url opens once it has applied. If applying it fails, the
443+
other changes and the saved override remain and start_url does not open; retry
444+
the request to apply both.
445+
430446
name: Human-readable name for the browser session. Omit to leave unchanged, set to an
431447
empty string to clear the name. When set, must be unique among active sessions
432448
within the project.
@@ -478,6 +494,7 @@ def update(
478494
body=maybe_transform(
479495
{
480496
"disable_default_proxy": disable_default_proxy,
497+
"location": location,
481498
"name": name,
482499
"network": network,
483500
"profile": profile,
@@ -912,6 +929,7 @@ async def create(
912929
headless: bool | Omit = omit,
913930
invocation_id: str | Omit = omit,
914931
kiosk_mode: bool | Omit = omit,
932+
location: BrowserLocationRequestParam | Omit = omit,
915933
memory: BrowserMemoryRequest | Omit = omit,
916934
name: str | Omit = omit,
917935
network: BrowserNetworkConfigParam | Omit = omit,
@@ -956,6 +974,9 @@ async def create(
956974
kiosk_mode: If true, launches the browser in kiosk mode to hide address bar and tabs in live
957975
view.
958976
977+
location: Optional session-only timezone and locale overrides. Each omitted field uses the
978+
default for the browser's region. start_url opens once the location applies.
979+
959980
memory:
960981
Memory for a non-GPU browser. Headless: 1GiB (default), 2GiB, or 4GiB. Headful:
961982
8GiB (default) or 16GiB.
@@ -1050,6 +1071,7 @@ async def create(
10501071
"headless": headless,
10511072
"invocation_id": invocation_id,
10521073
"kiosk_mode": kiosk_mode,
1074+
"location": location,
10531075
"memory": memory,
10541076
"name": name,
10551077
"network": network,
@@ -1121,6 +1143,7 @@ async def update(
11211143
id_or_name: str,
11221144
*,
11231145
disable_default_proxy: bool | Omit = omit,
1146+
location: BrowserLocationUpdateRequestParam | Omit = omit,
11241147
name: Optional[str] | Omit = omit,
11251148
network: BrowserNetworkUpdateParam | Omit = omit,
11261149
profile: BrowserProfile | Omit = omit,
@@ -1144,6 +1167,14 @@ async def update(
11441167
disable_default_proxy: If true, stealth browsers connect directly instead of using the default stealth
11451168
proxy. Deprecated in favor of proxy.mode.
11461169
1170+
location: Session-only timezone and locale overrides. Omit the object or a field to leave
1171+
it unchanged; set a string to override; set null to clear that field and use the
1172+
browser region's default. A browser that cannot change location refuses the
1173+
request before anything changes. The location applies after the request's other
1174+
changes, and start_url opens once it has applied. If applying it fails, the
1175+
other changes and the saved override remain and start_url does not open; retry
1176+
the request to apply both.
1177+
11471178
name: Human-readable name for the browser session. Omit to leave unchanged, set to an
11481179
empty string to clear the name. When set, must be unique among active sessions
11491180
within the project.
@@ -1195,6 +1226,7 @@ async def update(
11951226
body=await async_maybe_transform(
11961227
{
11971228
"disable_default_proxy": disable_default_proxy,
1229+
"location": location,
11981230
"name": name,
11991231
"network": network,
12001232
"profile": profile,

‎src/kernel/types/__init__.py‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
from .lookup_response import LookupResponse as LookupResponse
4545
from .vault_reference import VaultReference as VaultReference
4646
from .analysis_summary import AnalysisSummary as AnalysisSummary
47+
from .browser_location import BrowserLocation as BrowserLocation
4748
from .browser_pool_ref import BrowserPoolRef as BrowserPoolRef
4849
from .app_list_response import AppListResponse as AppListResponse
4950
from .no_recommendation import NoRecommendation as NoRecommendation
@@ -100,6 +101,7 @@
100101
from .api_key_retrieve_params import APIKeyRetrieveParams as APIKeyRetrieveParams
101102
from .browser_allowlist_state import BrowserAllowlistState as BrowserAllowlistState
102103
from .browser_create_response import BrowserCreateResponse as BrowserCreateResponse
104+
from .browser_location_source import BrowserLocationSource as BrowserLocationSource
103105
from .browser_retrieve_params import BrowserRetrieveParams as BrowserRetrieveParams
104106
from .browser_update_response import BrowserUpdateResponse as BrowserUpdateResponse
105107
from .extension_list_response import ExtensionListResponse as ExtensionListResponse
@@ -144,6 +146,7 @@
144146
from .config_registry_lookup_params import ConfigRegistryLookupParams as ConfigRegistryLookupParams
145147
from .credential_totp_code_response import CredentialTotpCodeResponse as CredentialTotpCodeResponse
146148
from .browser_load_extensions_params import BrowserLoadExtensionsParams as BrowserLoadExtensionsParams
149+
from .browser_location_request_param import BrowserLocationRequestParam as BrowserLocationRequestParam
147150
from .config_registry_resolve_params import ConfigRegistryResolveParams as ConfigRegistryResolveParams
148151
from .credential_provider_list_params import CredentialProviderListParams as CredentialProviderListParams
149152
from .credential_provider_test_result import CredentialProviderTestResult as CredentialProviderTestResult
@@ -153,6 +156,9 @@
153156
from .vault_provider_config_list_params import VaultProviderConfigListParams as VaultProviderConfigListParams
154157
from .vault_provider_config_create_params import VaultProviderConfigCreateParams as VaultProviderConfigCreateParams
155158
from .vault_provider_config_update_params import VaultProviderConfigUpdateParams as VaultProviderConfigUpdateParams
159+
from .browser_location_update_request_param import (
160+
BrowserLocationUpdateRequestParam as BrowserLocationUpdateRequestParam,
161+
)
156162
from .credential_provider_list_items_response import (
157163
CredentialProviderListItemsResponse as CredentialProviderListItemsResponse,
158164
)

‎src/kernel/types/browser_create_params.py‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from .browser_proxy_config_param import BrowserProxyConfigParam
1313
from .browser_network_config_param import BrowserNetworkConfigParam
1414
from .shared_params.browser_profile import BrowserProfile
15+
from .browser_location_request_param import BrowserLocationRequestParam
1516
from .shared_params.browser_viewport import BrowserViewport
1617
from .shared_params.browser_extension import BrowserExtension
1718
from .browsers.browser_telemetry_categories_config_param import BrowserTelemetryCategoriesConfigParam
@@ -62,6 +63,13 @@ class BrowserCreateParams(TypedDict, total=False):
6263
view.
6364
"""
6465

66+
location: BrowserLocationRequestParam
67+
"""Optional session-only timezone and locale overrides.
68+
69+
Each omitted field uses the default for the browser's region. start_url opens
70+
once the location applies.
71+
"""
72+
6573
memory: BrowserMemoryRequest
6674
"""Memory for a non-GPU browser.
6775

‎src/kernel/types/browser_create_response.py‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from .browser_usage import BrowserUsage
1212
from .browser_memory import BrowserMemory
1313
from .vault_reference import VaultReference
14+
from .browser_location import BrowserLocation
1415
from .browser_pool_ref import BrowserPoolRef
1516
from .browser_video_memory import BrowserVideoMemory
1617
from .browser_network_config import BrowserNetworkConfig
@@ -76,6 +77,9 @@ class BrowserCreateResponse(BaseModel):
7677
kiosk_mode: Optional[bool] = None
7778
"""Whether the browser session is running in kiosk mode."""
7879

80+
location: Optional[BrowserLocation] = None
81+
"""Effective browser timezone and locale with per-field provenance."""
82+
7983
name: Optional[str] = None
8084
"""Human-readable name of the browser session, if one was set at creation."""
8185

‎src/kernel/types/browser_list_response.py‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from .browser_usage import BrowserUsage
1212
from .browser_memory import BrowserMemory
1313
from .vault_reference import VaultReference
14+
from .browser_location import BrowserLocation
1415
from .browser_pool_ref import BrowserPoolRef
1516
from .browser_video_memory import BrowserVideoMemory
1617
from .browser_network_config import BrowserNetworkConfig
@@ -76,6 +77,9 @@ class BrowserListResponse(BaseModel):
7677
kiosk_mode: Optional[bool] = None
7778
"""Whether the browser session is running in kiosk mode."""
7879

80+
location: Optional[BrowserLocation] = None
81+
"""Effective browser timezone and locale with per-field provenance."""
82+
7983
name: Optional[str] = None
8084
"""Human-readable name of the browser session, if one was set at creation."""
8185

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from .._models import BaseModel
4+
from .browser_location_source import BrowserLocationSource
5+
6+
__all__ = ["BrowserLocation"]
7+
8+
9+
class BrowserLocation(BaseModel):
10+
locale: str
11+
"""Effective canonical BCP 47 formatting locale selected for the browser session."""
12+
13+
locale_source: BrowserLocationSource
14+
"""Where one effective browser location field came from.
15+
16+
`override` is set explicitly on the session; `metro` is the default for the
17+
browser's region.
18+
"""
19+
20+
timezone: str
21+
"""Effective IANA timezone selected for the browser session."""
22+
23+
timezone_source: BrowserLocationSource
24+
"""Where one effective browser location field came from.
25+
26+
`override` is set explicitly on the session; `metro` is the default for the
27+
browser's region.
28+
"""
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from __future__ import annotations
4+
5+
from typing_extensions import TypedDict
6+
7+
__all__ = ["BrowserLocationRequestParam"]
8+
9+
10+
class BrowserLocationRequestParam(TypedDict, total=False):
11+
locale: str
12+
"""Session-only supported canonical BCP 47 locale override.
13+
14+
Omit to use the default for the browser's region.
15+
"""
16+
17+
timezone: str
18+
"""Session-only IANA timezone override.
19+
20+
Omit to use the default for the browser's region.
21+
"""
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2+
3+
from typing_extensions import Literal, TypeAlias
4+
5+
__all__ = ["BrowserLocationSource"]
6+
7+
BrowserLocationSource: TypeAlias = Literal["override", "metro"]

0 commit comments

Comments
 (0)