Skip to content

Commit f4cf217

Browse files
authored
Merge pull request #212 from kernel/release-please--branches--main--changes--next
release: 0.142.0
2 parents 70454bb + 65c930f commit f4cf217

27 files changed

Lines changed: 892 additions & 35 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.141.0"
2+
".": "0.142.0"
33
}

‎.stats.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
configured_endpoints: 176
1+
configured_endpoints: 178

‎CHANGELOG.md‎

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

3+
## [0.142.0](https://github.com/kernel/kernel-python-sdk/compare/v0.141.0...v0.142.0) (2026-11-06)
4+
5+
6+
### Features
7+
8+
* Let reserved orgs list, pin and move ISP proxy IPs ([cfda76a](https://github.com/kernel/kernel-python-sdk/commit/cfda76aba98f670654ecb40853a33e8bfaeeb82e))
9+
310
## [0.141.0](https://github.com/kernel/kernel-python-sdk/compare/v0.140.0...v0.141.0) (2026-11-05)
411

512

‎api.md‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,19 @@ Methods:
498498
- <code title="delete /proxies/{id_or_name}">client.proxies.<a href="./src/kernel/resources/proxies.py">delete</a>(id_or_name) -> None</code>
499499
- <code title="post /proxies/{id_or_name}/check">client.proxies.<a href="./src/kernel/resources/proxies.py">check</a>(id_or_name, \*\*<a href="src/kernel/types/proxy_check_params.py">params</a>) -> <a href="./src/kernel/types/proxy_check_response.py">ProxyCheckResponse</a></code>
500500

501+
# ProxyIPs
502+
503+
Types:
504+
505+
```python
506+
from kernel.types import ProxyIP, ProxyIPDetail
507+
```
508+
509+
Methods:
510+
511+
- <code title="get /proxy_ips/{ip_address}">client.proxy_ips.<a href="./src/kernel/resources/proxy_ips.py">retrieve</a>(ip_address) -> <a href="./src/kernel/types/proxy_ip_detail.py">ProxyIPDetail</a></code>
512+
- <code title="get /proxy_ips">client.proxy_ips.<a href="./src/kernel/resources/proxy_ips.py">list</a>(\*\*<a href="src/kernel/types/proxy_ip_list_params.py">params</a>) -> <a href="./src/kernel/types/proxy_ip.py">SyncOffsetPagination[ProxyIP]</a></code>
513+
501514
# Extensions
502515

503516
Types:

‎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.141.0"
3+
version = "0.142.0"
44
description = "The official Python library for the kernel API"
55
dynamic = ["readme"]
66
license = "Apache-2.0"

‎src/kernel/_client.py‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
browsers,
6565
profiles,
6666
projects,
67+
proxy_ips,
6768
telemetry,
6869
audit_logs,
6970
extensions,
@@ -81,6 +82,7 @@
8182
from .resources.api_keys import APIKeysResource, AsyncAPIKeysResource
8283
from .resources.profiles import ProfilesResource, AsyncProfilesResource
8384
from .resources.auth.auth import AuthResource, AsyncAuthResource
85+
from .resources.proxy_ips import ProxyIPsResource, AsyncProxyIPsResource
8486
from .resources.extensions import ExtensionsResource, AsyncExtensionsResource
8587
from .resources.credentials import CredentialsResource, AsyncCredentialsResource
8688
from .resources.deployments import DeploymentsResource, AsyncDeploymentsResource
@@ -281,6 +283,13 @@ def proxies(self) -> ProxiesResource:
281283

282284
return ProxiesResource(self)
283285

286+
@cached_property
287+
def proxy_ips(self) -> ProxyIPsResource:
288+
"""Create and manage proxy configurations for routing browser traffic."""
289+
from .resources.proxy_ips import ProxyIPsResource
290+
291+
return ProxyIPsResource(self)
292+
284293
@cached_property
285294
def extensions(self) -> ExtensionsResource:
286295
"""Create, list, retrieve, and delete browser extensions."""
@@ -690,6 +699,13 @@ def proxies(self) -> AsyncProxiesResource:
690699

691700
return AsyncProxiesResource(self)
692701

702+
@cached_property
703+
def proxy_ips(self) -> AsyncProxyIPsResource:
704+
"""Create and manage proxy configurations for routing browser traffic."""
705+
from .resources.proxy_ips import AsyncProxyIPsResource
706+
707+
return AsyncProxyIPsResource(self)
708+
693709
@cached_property
694710
def extensions(self) -> AsyncExtensionsResource:
695711
"""Create, list, retrieve, and delete browser extensions."""
@@ -999,6 +1015,13 @@ def proxies(self) -> proxies.ProxiesResourceWithRawResponse:
9991015

10001016
return ProxiesResourceWithRawResponse(self._client.proxies)
10011017

1018+
@cached_property
1019+
def proxy_ips(self) -> proxy_ips.ProxyIPsResourceWithRawResponse:
1020+
"""Create and manage proxy configurations for routing browser traffic."""
1021+
from .resources.proxy_ips import ProxyIPsResourceWithRawResponse
1022+
1023+
return ProxyIPsResourceWithRawResponse(self._client.proxy_ips)
1024+
10021025
@cached_property
10031026
def extensions(self) -> extensions.ExtensionsResourceWithRawResponse:
10041027
"""Create, list, retrieve, and delete browser extensions."""
@@ -1140,6 +1163,13 @@ def proxies(self) -> proxies.AsyncProxiesResourceWithRawResponse:
11401163

11411164
return AsyncProxiesResourceWithRawResponse(self._client.proxies)
11421165

1166+
@cached_property
1167+
def proxy_ips(self) -> proxy_ips.AsyncProxyIPsResourceWithRawResponse:
1168+
"""Create and manage proxy configurations for routing browser traffic."""
1169+
from .resources.proxy_ips import AsyncProxyIPsResourceWithRawResponse
1170+
1171+
return AsyncProxyIPsResourceWithRawResponse(self._client.proxy_ips)
1172+
11431173
@cached_property
11441174
def extensions(self) -> extensions.AsyncExtensionsResourceWithRawResponse:
11451175
"""Create, list, retrieve, and delete browser extensions."""
@@ -1281,6 +1311,13 @@ def proxies(self) -> proxies.ProxiesResourceWithStreamingResponse:
12811311

12821312
return ProxiesResourceWithStreamingResponse(self._client.proxies)
12831313

1314+
@cached_property
1315+
def proxy_ips(self) -> proxy_ips.ProxyIPsResourceWithStreamingResponse:
1316+
"""Create and manage proxy configurations for routing browser traffic."""
1317+
from .resources.proxy_ips import ProxyIPsResourceWithStreamingResponse
1318+
1319+
return ProxyIPsResourceWithStreamingResponse(self._client.proxy_ips)
1320+
12841321
@cached_property
12851322
def extensions(self) -> extensions.ExtensionsResourceWithStreamingResponse:
12861323
"""Create, list, retrieve, and delete browser extensions."""
@@ -1422,6 +1459,13 @@ def proxies(self) -> proxies.AsyncProxiesResourceWithStreamingResponse:
14221459

14231460
return AsyncProxiesResourceWithStreamingResponse(self._client.proxies)
14241461

1462+
@cached_property
1463+
def proxy_ips(self) -> proxy_ips.AsyncProxyIPsResourceWithStreamingResponse:
1464+
"""Create and manage proxy configurations for routing browser traffic."""
1465+
from .resources.proxy_ips import AsyncProxyIPsResourceWithStreamingResponse
1466+
1467+
return AsyncProxyIPsResourceWithStreamingResponse(self._client.proxy_ips)
1468+
14251469
@cached_property
14261470
def extensions(self) -> extensions.AsyncExtensionsResourceWithStreamingResponse:
14271471
"""Create, list, retrieve, and delete browser extensions."""

‎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.141.0" # x-release-please-version
4+
__version__ = "0.142.0" # x-release-please-version

‎src/kernel/resources/__init__.py‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@
7272
ProjectsResourceWithStreamingResponse,
7373
AsyncProjectsResourceWithStreamingResponse,
7474
)
75+
from .proxy_ips import (
76+
ProxyIPsResource,
77+
AsyncProxyIPsResource,
78+
ProxyIPsResourceWithRawResponse,
79+
AsyncProxyIPsResourceWithRawResponse,
80+
ProxyIPsResourceWithStreamingResponse,
81+
AsyncProxyIPsResourceWithStreamingResponse,
82+
)
7583
from .telemetry import (
7684
TelemetryResource,
7785
AsyncTelemetryResource,
@@ -216,6 +224,12 @@
216224
"AsyncProxiesResourceWithRawResponse",
217225
"ProxiesResourceWithStreamingResponse",
218226
"AsyncProxiesResourceWithStreamingResponse",
227+
"ProxyIPsResource",
228+
"AsyncProxyIPsResource",
229+
"ProxyIPsResourceWithRawResponse",
230+
"AsyncProxyIPsResourceWithRawResponse",
231+
"ProxyIPsResourceWithStreamingResponse",
232+
"AsyncProxyIPsResourceWithStreamingResponse",
219233
"ExtensionsResource",
220234
"AsyncExtensionsResource",
221235
"ExtensionsResourceWithRawResponse",

‎src/kernel/resources/proxies.py‎

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,8 @@ def update(
150150
self,
151151
id_or_name: str,
152152
*,
153-
name: str,
153+
config: proxy_update_params.Config | Omit = omit,
154+
name: str | Omit = omit,
154155
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
155156
# The extra values given here take precedence over values defined on the client or passed to this method.
156157
extra_headers: Headers | None = None,
@@ -159,12 +160,19 @@ def update(
159160
timeout: float | httpx.Timeout | None | NotGiven = not_given,
160161
idempotency_key: str | None = None,
161162
) -> ProxyUpdateResponse:
162-
"""Update a proxy's name.
163+
"""Update a proxy's name, or move an ISP proxy to another reserved exit IP.
163164
164-
Proxy names are not unique and duplicate names are
165-
allowed.
165+
Proxy
166+
names are not unique and duplicate names are allowed. Moving requires a reserved
167+
ISP allocation and is accepted only for proxies of type isp: the new endpoint is
168+
probed first and nothing changes if the probe fails. An IP outside the
169+
allocation is a 400 with code ip_not_reserved. A 409 means the IP cannot
170+
currently be assigned or the proxy was changed concurrently; read it back and
171+
retry.
166172
167173
Args:
174+
config: Changes to an ISP proxy's exit IP. Accepted only for proxies of type `isp`.
175+
168176
name: New proxy name. Proxy names are trimmed and length-checked only; duplicates are
169177
allowed because proxies are updated by ID, not by name.
170178
@@ -182,7 +190,13 @@ def update(
182190
raise ValueError(f"Expected a non-empty value for `id_or_name` but received {id_or_name!r}")
183191
return self._patch(
184192
path_template("/proxies/{id_or_name}", id_or_name=id_or_name),
185-
body=maybe_transform({"name": name}, proxy_update_params.ProxyUpdateParams),
193+
body=maybe_transform(
194+
{
195+
"config": config,
196+
"name": name,
197+
},
198+
proxy_update_params.ProxyUpdateParams,
199+
),
186200
options=make_request_options(
187201
extra_headers=extra_headers,
188202
extra_query=extra_query,
@@ -196,6 +210,7 @@ def update(
196210
def list(
197211
self,
198212
*,
213+
ip_address: str | Omit = omit,
199214
limit: int | Omit = omit,
200215
name: str | Omit = omit,
201216
offset: int | Omit = omit,
@@ -211,6 +226,10 @@ def list(
211226
List proxies in the resolved project.
212227
213228
Args:
229+
ip_address: Exact match on the primary exit IP of ISP proxies. Must be an IPv4 address. Only
230+
ISP proxies are matched: the ip_address shown on other proxy types is a one-time
231+
observation, not a stable identity.
232+
214233
limit: Limit the number of proxies to return.
215234
216235
name: Exact-match filter on proxy name using the database collation. In production,
@@ -240,6 +259,7 @@ def list(
240259
timeout=timeout,
241260
query=maybe_transform(
242261
{
262+
"ip_address": ip_address,
243263
"limit": limit,
244264
"name": name,
245265
"offset": offset,
@@ -480,7 +500,8 @@ async def update(
480500
self,
481501
id_or_name: str,
482502
*,
483-
name: str,
503+
config: proxy_update_params.Config | Omit = omit,
504+
name: str | Omit = omit,
484505
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
485506
# The extra values given here take precedence over values defined on the client or passed to this method.
486507
extra_headers: Headers | None = None,
@@ -489,12 +510,19 @@ async def update(
489510
timeout: float | httpx.Timeout | None | NotGiven = not_given,
490511
idempotency_key: str | None = None,
491512
) -> ProxyUpdateResponse:
492-
"""Update a proxy's name.
513+
"""Update a proxy's name, or move an ISP proxy to another reserved exit IP.
493514
494-
Proxy names are not unique and duplicate names are
495-
allowed.
515+
Proxy
516+
names are not unique and duplicate names are allowed. Moving requires a reserved
517+
ISP allocation and is accepted only for proxies of type isp: the new endpoint is
518+
probed first and nothing changes if the probe fails. An IP outside the
519+
allocation is a 400 with code ip_not_reserved. A 409 means the IP cannot
520+
currently be assigned or the proxy was changed concurrently; read it back and
521+
retry.
496522
497523
Args:
524+
config: Changes to an ISP proxy's exit IP. Accepted only for proxies of type `isp`.
525+
498526
name: New proxy name. Proxy names are trimmed and length-checked only; duplicates are
499527
allowed because proxies are updated by ID, not by name.
500528
@@ -512,7 +540,13 @@ async def update(
512540
raise ValueError(f"Expected a non-empty value for `id_or_name` but received {id_or_name!r}")
513541
return await self._patch(
514542
path_template("/proxies/{id_or_name}", id_or_name=id_or_name),
515-
body=await async_maybe_transform({"name": name}, proxy_update_params.ProxyUpdateParams),
543+
body=await async_maybe_transform(
544+
{
545+
"config": config,
546+
"name": name,
547+
},
548+
proxy_update_params.ProxyUpdateParams,
549+
),
516550
options=make_request_options(
517551
extra_headers=extra_headers,
518552
extra_query=extra_query,
@@ -526,6 +560,7 @@ async def update(
526560
def list(
527561
self,
528562
*,
563+
ip_address: str | Omit = omit,
529564
limit: int | Omit = omit,
530565
name: str | Omit = omit,
531566
offset: int | Omit = omit,
@@ -541,6 +576,10 @@ def list(
541576
List proxies in the resolved project.
542577
543578
Args:
579+
ip_address: Exact match on the primary exit IP of ISP proxies. Must be an IPv4 address. Only
580+
ISP proxies are matched: the ip_address shown on other proxy types is a one-time
581+
observation, not a stable identity.
582+
544583
limit: Limit the number of proxies to return.
545584
546585
name: Exact-match filter on proxy name using the database collation. In production,
@@ -570,6 +609,7 @@ def list(
570609
timeout=timeout,
571610
query=maybe_transform(
572611
{
612+
"ip_address": ip_address,
573613
"limit": limit,
574614
"name": name,
575615
"offset": offset,

0 commit comments

Comments
 (0)