Skip to content

Commit efa6445

Browse files
authored
Merge pull request #191 from kernel/release-please--branches--main--changes--next
release: 0.123.0
2 parents 84acd58 + 14c0301 commit efa6445

28 files changed

Lines changed: 195 additions & 52 deletions

‎.release-please-manifest.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "0.122.0"
2+
".": "0.123.0"
33
}

‎CHANGELOG.md‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
# Changelog
22

3+
## [0.123.0](https://github.com/kernel/kernel-python-sdk/compare/v0.122.0...v0.123.0) (2026-10-09)
4+
5+
6+
### Features
7+
8+
* Add video_memory to request the 4GiB VRAM GPU browser tier ([31b7bda](https://github.com/kernel/kernel-python-sdk/commit/31b7bda620f53bc6026b5eb3fac34d50859fa1df))
9+
* Filter the telemetry SSE stream by event type ([f7daa04](https://github.com/kernel/kernel-python-sdk/commit/f7daa043513d08f6cc6aefec7b058d5bd57f2590))
10+
* Fix 1Password fill classification for repeat fills and unconfirmed submits ([d387aab](https://github.com/kernel/kernel-python-sdk/commit/d387aab4847329eb4405318a20ee93a372399f70))
11+
* Support egress allowlists on browser pools ([541fb3f](https://github.com/kernel/kernel-python-sdk/commit/541fb3fc033b8b9542838a116684578cab18fba0))
12+
313
## [0.122.0](https://github.com/kernel/kernel-python-sdk/compare/v0.121.0...v0.122.0) (2026-10-09)
414

515

‎api.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ from kernel.types import (
131131
BrowserReplResult,
132132
BrowserReplTextContent,
133133
BrowserUsage,
134+
BrowserVideoMemory,
134135
Profile,
135136
Tags,
136137
VaultReference,

‎pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "kernel"
3-
version = "0.122.0"
3+
version = "0.123.0"
44
description = "The official Python library for the kernel API"
55
dynamic = ["readme"]
66
license = "Apache-2.0"

‎src/kernel/_version.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
22

33
__title__ = "kernel"
4-
__version__ = "0.122.0" # x-release-please-version
4+
__version__ = "0.123.0" # x-release-please-version

‎src/kernel/resources/browser_pools.py‎

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,9 @@ def create(
123123
124124
name: Optional name for the browser pool. Must be unique within the project.
125125
126-
network: Network configuration applied to browsers in this pool. Proxy routes require
127-
proxy-v3; the pool will not provision browsers through Envoy if proxy-v3 is
128-
unavailable.
126+
network: Network configuration applied to browsers in this pool. Egress allowlists and
127+
proxy routes require proxy-v3; the pool will not provision browsers through
128+
Envoy if proxy-v3 is unavailable.
129129
130130
profile: Profile configuration for browsers in a pool. Provide either id or name.
131131
Profiles must be created beforehand. Unlike single browser sessions, pools load
@@ -296,9 +296,11 @@ def update(
296296
discard_all_idle: Whether to discard all idle browsers and rebuild them immediately with the new
297297
configuration. Defaults to false. Only browsers that are idle when the update
298298
runs are rebuilt. A browser that is in use during the update keeps its original
299-
configuration, and if it is later released with `reuse: true` it returns to the
300-
pool with that stale configuration until it is discarded (by this flag on a
301-
later update, or by flushing the pool).
299+
configuration, except that its allowlist is reset to the current pool baseline
300+
on release or the browser is replaced. For other configuration fields, if it is
301+
later released with `reuse: true` it returns to the pool with that stale
302+
configuration until it is discarded (by this flag on a later update, or by
303+
flushing the pool).
302304
303305
extensions: If provided, replaces the extension list. Empty array clears all
304306
previously-selected extensions. Omit this field to leave extensions unchanged.
@@ -321,10 +323,14 @@ def update(
321323
network: If provided, replaces the pool's network configuration. Omit to leave the
322324
existing configuration unchanged; an empty object ({}) removes it, while
323325
network: {private_hosts: []} or network: {proxy_routes: []} sets an explicit
324-
empty list. Proxy routes require proxy-v3; the pool will not provision browsers
325-
through Envoy if proxy-v3 is unavailable. Only applied to browsers created in
326-
the pool after the update; browsers already in the pool keep their configuration
327-
until discarded (see discard_all_idle).
326+
empty list; allowed_hosts must be non-empty when supplied. Egress allowlists and
327+
proxy routes require proxy-v3; the pool will not provision browsers through
328+
Envoy if proxy-v3 is unavailable. Changing allowed_hosts automatically replaces
329+
idle browsers. Leased browsers retain their allowlist until release, when it is
330+
reset to the current pool baseline or the browser is replaced if it cannot
331+
safely receive that baseline. Stale browsers cannot be acquired. Other network
332+
fields only apply to browsers created after the update; existing browsers keep
333+
those fields until discarded (see discard_all_idle).
328334
329335
profile: Profile configuration for browsers in a pool. Provide either id or name.
330336
Profiles must be created beforehand. Unlike single browser sessions, pools load
@@ -774,9 +780,9 @@ async def create(
774780
775781
name: Optional name for the browser pool. Must be unique within the project.
776782
777-
network: Network configuration applied to browsers in this pool. Proxy routes require
778-
proxy-v3; the pool will not provision browsers through Envoy if proxy-v3 is
779-
unavailable.
783+
network: Network configuration applied to browsers in this pool. Egress allowlists and
784+
proxy routes require proxy-v3; the pool will not provision browsers through
785+
Envoy if proxy-v3 is unavailable.
780786
781787
profile: Profile configuration for browsers in a pool. Provide either id or name.
782788
Profiles must be created beforehand. Unlike single browser sessions, pools load
@@ -947,9 +953,11 @@ async def update(
947953
discard_all_idle: Whether to discard all idle browsers and rebuild them immediately with the new
948954
configuration. Defaults to false. Only browsers that are idle when the update
949955
runs are rebuilt. A browser that is in use during the update keeps its original
950-
configuration, and if it is later released with `reuse: true` it returns to the
951-
pool with that stale configuration until it is discarded (by this flag on a
952-
later update, or by flushing the pool).
956+
configuration, except that its allowlist is reset to the current pool baseline
957+
on release or the browser is replaced. For other configuration fields, if it is
958+
later released with `reuse: true` it returns to the pool with that stale
959+
configuration until it is discarded (by this flag on a later update, or by
960+
flushing the pool).
953961
954962
extensions: If provided, replaces the extension list. Empty array clears all
955963
previously-selected extensions. Omit this field to leave extensions unchanged.
@@ -972,10 +980,14 @@ async def update(
972980
network: If provided, replaces the pool's network configuration. Omit to leave the
973981
existing configuration unchanged; an empty object ({}) removes it, while
974982
network: {private_hosts: []} or network: {proxy_routes: []} sets an explicit
975-
empty list. Proxy routes require proxy-v3; the pool will not provision browsers
976-
through Envoy if proxy-v3 is unavailable. Only applied to browsers created in
977-
the pool after the update; browsers already in the pool keep their configuration
978-
until discarded (see discard_all_idle).
983+
empty list; allowed_hosts must be non-empty when supplied. Egress allowlists and
984+
proxy routes require proxy-v3; the pool will not provision browsers through
985+
Envoy if proxy-v3 is unavailable. Changing allowed_hosts automatically replaces
986+
idle browsers. Leased browsers retain their allowlist until release, when it is
987+
reset to the current pool baseline or the browser is replaced if it cannot
988+
safely receive that baseline. Stale browsers cannot be acquired. Other network
989+
fields only apply to browsers created after the update; existing browsers keep
990+
those fields until discarded (see discard_all_idle).
979991
980992
profile: Profile configuration for browsers in a pool. Provide either id or name.
981993
Profiles must be created beforehand. Unlike single browser sessions, pools load

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
AsyncFsResourceWithStreamingResponse,
2626
)
2727
from ...types import (
28+
BrowserVideoMemory,
2829
BrowserMemoryRequest,
2930
browser_curl_params,
3031
browser_list_params,
@@ -97,6 +98,7 @@
9798
AsyncPlaywrightResourceWithStreamingResponse,
9899
)
99100
from ...types.browser_repl_result import BrowserReplResult
101+
from ...types.browser_video_memory import BrowserVideoMemory
100102
from ...types.browser_curl_response import BrowserCurlResponse
101103
from ...types.browser_list_response import BrowserListResponse
102104
from ...types.vault_reference_param import VaultReferenceParam
@@ -206,6 +208,7 @@ def create(
206208
telemetry: Optional[browser_create_params.Telemetry] | Omit = omit,
207209
timeout_seconds: int | Omit = omit,
208210
vaults: Iterable[VaultReferenceParam] | Omit = omit,
211+
video_memory: BrowserVideoMemory | Omit = omit,
209212
viewport: BrowserViewport | Omit = omit,
210213
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
211214
# The extra values given here take precedence over values defined on the client or passed to this method.
@@ -293,6 +296,10 @@ def create(
293296
vaults: Project-scoped vaults to link to the browser session. Links are immutable after
294297
creation.
295298
299+
video_memory: Video memory (VRAM) for a GPU browser session. Requires gpu=true. Defaults to
300+
2GiB, which comes with 4 vCPU and 6GiB memory. 4GiB comes with 8 vCPU and 12GiB
301+
memory.
302+
296303
viewport: Initial browser window size in pixels with optional refresh rate. If omitted,
297304
image defaults apply (1920x1080@25). For GPU images, the default is
298305
1920x1080@60. Arbitrary viewport dimensions and refresh rates are accepted.
@@ -337,6 +344,7 @@ def create(
337344
"telemetry": telemetry,
338345
"timeout_seconds": timeout_seconds,
339346
"vaults": vaults,
347+
"video_memory": video_memory,
340348
"viewport": viewport,
341349
},
342350
browser_create_params.BrowserCreateParams,
@@ -915,6 +923,7 @@ async def create(
915923
telemetry: Optional[browser_create_params.Telemetry] | Omit = omit,
916924
timeout_seconds: int | Omit = omit,
917925
vaults: Iterable[VaultReferenceParam] | Omit = omit,
926+
video_memory: BrowserVideoMemory | Omit = omit,
918927
viewport: BrowserViewport | Omit = omit,
919928
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
920929
# The extra values given here take precedence over values defined on the client or passed to this method.
@@ -1002,6 +1011,10 @@ async def create(
10021011
vaults: Project-scoped vaults to link to the browser session. Links are immutable after
10031012
creation.
10041013
1014+
video_memory: Video memory (VRAM) for a GPU browser session. Requires gpu=true. Defaults to
1015+
2GiB, which comes with 4 vCPU and 6GiB memory. 4GiB comes with 8 vCPU and 12GiB
1016+
memory.
1017+
10051018
viewport: Initial browser window size in pixels with optional refresh rate. If omitted,
10061019
image defaults apply (1920x1080@25). For GPU images, the default is
10071020
1920x1080@60. Arbitrary viewport dimensions and refresh rates are accepted.
@@ -1046,6 +1059,7 @@ async def create(
10461059
"telemetry": telemetry,
10471060
"timeout_seconds": timeout_seconds,
10481061
"vaults": vaults,
1062+
"video_memory": video_memory,
10491063
"viewport": viewport,
10501064
},
10511065
browser_create_params.BrowserCreateParams,

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

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ def stream(
157157
id_or_name: str,
158158
*,
159159
replay: str | Omit = omit,
160+
type: SequenceNotStr[str] | Omit = omit,
160161
last_event_id: str | Omit = omit,
161162
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
162163
# The extra values given here take precedence over values defined on the client or passed to this method.
@@ -171,7 +172,10 @@ def stream(
171172
stream closes when the browser session terminates. Each event frame includes an
172173
id: field containing a monotonically increasing sequence number; pass it as
173174
Last-Event-ID on reconnect to resume without gaps. The event: field is never
174-
set; all frames carry JSON in the data: field. A keepalive comment frame is sent
175+
set; event frames carry JSON in the data: field. A frame with an id: field and
176+
no data: field moves Last-Event-ID past events that were not delivered, because
177+
a type filter excluded them or they could not be decoded or exceeded the size
178+
limit; SSE clients dispatch no event for it. A keepalive comment frame is sent
175179
every 15 seconds when no events arrive. Returns 404 if the browser session does
176180
not exist. If telemetry was not enabled on the session, the stream opens but no
177181
events are delivered. Fresh connections only see new events; pass replay=all to
@@ -182,6 +186,14 @@ def stream(
182186
any other value is treated as from-now. The buffer is bounded, so the first
183187
event id may be greater than 1 if older events were evicted.
184188
189+
type: Deliver only these event types, such as captcha_solve_started or
190+
captcha_challenge_result. Repeat the parameter or pass comma-separated values
191+
for multiple types. Keepalive frames are always delivered. Filtered-out events
192+
are not sent. An id-only frame carrying the latest skipped id is sent about
193+
every 15 seconds while skipped events keep arriving, and otherwise with the next
194+
keepalive or when the stream ends, so the connection stays active and
195+
Last-Event-ID moves past them; a reconnect resumes after the skipped events.
196+
185197
extra_headers: Send extra headers
186198
187199
extra_query: Add additional query parameters to the request
@@ -201,7 +213,13 @@ def stream(
201213
extra_query=extra_query,
202214
extra_body=extra_body,
203215
timeout=timeout,
204-
query=maybe_transform({"replay": replay}, telemetry_stream_params.TelemetryStreamParams),
216+
query=maybe_transform(
217+
{
218+
"replay": replay,
219+
"type": type,
220+
},
221+
telemetry_stream_params.TelemetryStreamParams,
222+
),
205223
),
206224
cast_to=TelemetryStreamResponse,
207225
stream=True,
@@ -339,6 +357,7 @@ async def stream(
339357
id_or_name: str,
340358
*,
341359
replay: str | Omit = omit,
360+
type: SequenceNotStr[str] | Omit = omit,
342361
last_event_id: str | Omit = omit,
343362
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
344363
# The extra values given here take precedence over values defined on the client or passed to this method.
@@ -353,7 +372,10 @@ async def stream(
353372
stream closes when the browser session terminates. Each event frame includes an
354373
id: field containing a monotonically increasing sequence number; pass it as
355374
Last-Event-ID on reconnect to resume without gaps. The event: field is never
356-
set; all frames carry JSON in the data: field. A keepalive comment frame is sent
375+
set; event frames carry JSON in the data: field. A frame with an id: field and
376+
no data: field moves Last-Event-ID past events that were not delivered, because
377+
a type filter excluded them or they could not be decoded or exceeded the size
378+
limit; SSE clients dispatch no event for it. A keepalive comment frame is sent
357379
every 15 seconds when no events arrive. Returns 404 if the browser session does
358380
not exist. If telemetry was not enabled on the session, the stream opens but no
359381
events are delivered. Fresh connections only see new events; pass replay=all to
@@ -364,6 +386,14 @@ async def stream(
364386
any other value is treated as from-now. The buffer is bounded, so the first
365387
event id may be greater than 1 if older events were evicted.
366388
389+
type: Deliver only these event types, such as captcha_solve_started or
390+
captcha_challenge_result. Repeat the parameter or pass comma-separated values
391+
for multiple types. Keepalive frames are always delivered. Filtered-out events
392+
are not sent. An id-only frame carrying the latest skipped id is sent about
393+
every 15 seconds while skipped events keep arriving, and otherwise with the next
394+
keepalive or when the stream ends, so the connection stays active and
395+
Last-Event-ID moves past them; a reconnect resumes after the skipped events.
396+
367397
extra_headers: Send extra headers
368398
369399
extra_query: Add additional query parameters to the request
@@ -383,7 +413,13 @@ async def stream(
383413
extra_query=extra_query,
384414
extra_body=extra_body,
385415
timeout=timeout,
386-
query=await async_maybe_transform({"replay": replay}, telemetry_stream_params.TelemetryStreamParams),
416+
query=await async_maybe_transform(
417+
{
418+
"replay": replay,
419+
"type": type,
420+
},
421+
telemetry_stream_params.TelemetryStreamParams,
422+
),
387423
),
388424
cast_to=TelemetryStreamResponse,
389425
stream=True,

‎src/kernel/types/__init__.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
from .vault_upsert_params import VaultUpsertParams as VaultUpsertParams
6666
from .browser_proxy_config import BrowserProxyConfig as BrowserProxyConfig
6767
from .browser_repl_content import BrowserReplContent as BrowserReplContent
68+
from .browser_video_memory import BrowserVideoMemory as BrowserVideoMemory
6869
from .proxy_check_response import ProxyCheckResponse as ProxyCheckResponse
6970
from .search_create_params import SearchCreateParams as SearchCreateParams
7071
from .vault_encryption_key import VaultEncryptionKey as VaultEncryptionKey

‎src/kernel/types/browser_create_params.py‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from typing_extensions import Literal, TypedDict
77

88
from .tags_param import TagsParam
9+
from .browser_video_memory import BrowserVideoMemory
910
from .vault_reference_param import VaultReferenceParam
1011
from .browser_memory_request import BrowserMemoryRequest
1112
from .browser_proxy_config_param import BrowserProxyConfigParam
@@ -158,6 +159,13 @@ class BrowserCreateParams(TypedDict, total=False):
158159
Links are immutable after creation.
159160
"""
160161

162+
video_memory: BrowserVideoMemory
163+
"""Video memory (VRAM) for a GPU browser session.
164+
165+
Requires gpu=true. Defaults to 2GiB, which comes with 4 vCPU and 6GiB memory.
166+
4GiB comes with 8 vCPU and 12GiB memory.
167+
"""
168+
161169
viewport: BrowserViewport
162170
"""
163171
Initial browser window size in pixels with optional refresh rate. If omitted,

0 commit comments

Comments
 (0)