Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.22.0"
".": "0.23.0"
}
8 changes: 4 additions & 4 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 74
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-003e9afa15f0765009d2c7d34e8eb62268d818e628e3c84361b21138e30cc423.yml
openapi_spec_hash: c1b8309f60385bf2b02d245363ca47c1
config_hash: a4124701ae0a474e580d7416adbcfb00
configured_endpoints: 82
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-dac11bdb857e700a8c39d183e753ddd1ebaaca69fd9fc5ee57d6b56b70b00e6e.yml
openapi_spec_hash: 78fbc50dd0b61cdc87564fbea278ee23
config_hash: a4b4d14bdf6af723b235a6981977627c
26 changes: 26 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,31 @@
# Changelog

## 0.23.0 (2025-12-11)

Full Changelog: [v0.22.0...v0.23.0](https://github.com/onkernel/kernel-python-sdk/compare/v0.22.0...v0.23.0)

### Features

* [wip] Browser pools polish pass ([2ba9e57](https://github.com/onkernel/kernel-python-sdk/commit/2ba9e5740d0b12605de3b48af06658b8db47ba11))
* enhance agent authentication API with new endpoints and request… ([84a794c](https://github.com/onkernel/kernel-python-sdk/commit/84a794c35f5a454b047d53b37867586f85e2536a))
* Enhance agent authentication with optional login page URL and auth ch… ([d7bd8a2](https://github.com/onkernel/kernel-python-sdk/commit/d7bd8a22d40243c043e14b899dd2006fc0d51a19))
* Enhance AuthAgent model with last_auth_check_at field ([169539a](https://github.com/onkernel/kernel-python-sdk/commit/169539a9b861b90f554b192dc8e457ad17a851a0))


### Bug Fixes

* **types:** allow pyright to infer TypedDict types within SequenceNotStr ([c8d571c](https://github.com/onkernel/kernel-python-sdk/commit/c8d571c785a4488549701aad525357a9fabec69f))


### Chores

* add missing docstrings ([75fa7cb](https://github.com/onkernel/kernel-python-sdk/commit/75fa7cb7b954f8a68cc5eb74ad3196b350e8f9dd))


### Refactors

* **browser:** remove persistence option UI ([57af2e1](https://github.com/onkernel/kernel-python-sdk/commit/57af2e181b716145ff3e11a0d74c04dd332f9e35))

## 0.22.0 (2025-12-05)

Full Changelog: [v0.21.0...v0.22.0](https://github.com/onkernel/kernel-python-sdk/compare/v0.21.0...v0.22.0)
Expand Down
18 changes: 8 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ client = Kernel(
)

browser = client.browsers.create(
persistence={"id": "browser-for-user-1234"},
stealth=True,
)
print(browser.session_id)
```
Expand Down Expand Up @@ -63,7 +63,7 @@ client = AsyncKernel(

async def main() -> None:
browser = await client.browsers.create(
persistence={"id": "browser-for-user-1234"},
stealth=True,
)
print(browser.session_id)

Expand Down Expand Up @@ -99,7 +99,7 @@ async def main() -> None:
http_client=DefaultAioHttpClient(),
) as client:
browser = await client.browsers.create(
persistence={"id": "browser-for-user-1234"},
stealth=True,
)
print(browser.session_id)

Expand Down Expand Up @@ -242,7 +242,7 @@ client = Kernel()

try:
client.browsers.create(
persistence={"id": "browser-for-user-1234"},
stealth=True,
)
except kernel.APIConnectionError as e:
print("The server could not be reached")
Expand Down Expand Up @@ -287,7 +287,7 @@ client = Kernel(

# Or, configure per-request:
client.with_options(max_retries=5).browsers.create(
persistence={"id": "browser-for-user-1234"},
stealth=True,
)
```

Expand All @@ -312,7 +312,7 @@ client = Kernel(

# Override per-request:
client.with_options(timeout=5.0).browsers.create(
persistence={"id": "browser-for-user-1234"},
stealth=True,
)
```

Expand Down Expand Up @@ -355,9 +355,7 @@ from kernel import Kernel

client = Kernel()
response = client.browsers.with_raw_response.create(
persistence={
"id": "browser-for-user-1234"
},
stealth=True,
)
print(response.headers.get('X-My-Header'))

Expand All @@ -377,7 +375,7 @@ To stream the response body, use `.with_streaming_response` instead, which requi

```python
with client.browsers.with_streaming_response.create(
persistence={"id": "browser-for-user-1234"},
stealth=True,
) as response:
print(response.headers.get("X-My-Header"))

Expand Down
41 changes: 41 additions & 0 deletions api.md
Original file line number Diff line number Diff line change
Expand Up @@ -280,3 +280,44 @@ Methods:
- <code title="post /browser_pools/{id_or_name}/acquire">client.browser_pools.<a href="./src/kernel/resources/browser_pools.py">acquire</a>(id_or_name, \*\*<a href="src/kernel/types/browser_pool_acquire_params.py">params</a>) -> <a href="./src/kernel/types/browser_pool_acquire_response.py">BrowserPoolAcquireResponse</a></code>
- <code title="post /browser_pools/{id_or_name}/flush">client.browser_pools.<a href="./src/kernel/resources/browser_pools.py">flush</a>(id_or_name) -> None</code>
- <code title="post /browser_pools/{id_or_name}/release">client.browser_pools.<a href="./src/kernel/resources/browser_pools.py">release</a>(id_or_name, \*\*<a href="src/kernel/types/browser_pool_release_params.py">params</a>) -> None</code>

# Agents

## Auth

Types:

```python
from kernel.types.agents import (
AgentAuthDiscoverResponse,
AgentAuthInvocationResponse,
AgentAuthSubmitResponse,
AuthAgent,
AuthAgentCreateRequest,
AuthAgentInvocationCreateRequest,
AuthAgentInvocationCreateResponse,
DiscoveredField,
)
```

Methods:

- <code title="post /agents/auth">client.agents.auth.<a href="./src/kernel/resources/agents/auth/auth.py">create</a>(\*\*<a href="src/kernel/types/agents/auth_create_params.py">params</a>) -> <a href="./src/kernel/types/agents/auth_agent.py">AuthAgent</a></code>
- <code title="get /agents/auth/{id}">client.agents.auth.<a href="./src/kernel/resources/agents/auth/auth.py">retrieve</a>(id) -> <a href="./src/kernel/types/agents/auth_agent.py">AuthAgent</a></code>
- <code title="get /agents/auth">client.agents.auth.<a href="./src/kernel/resources/agents/auth/auth.py">list</a>(\*\*<a href="src/kernel/types/agents/auth_list_params.py">params</a>) -> <a href="./src/kernel/types/agents/auth_agent.py">SyncOffsetPagination[AuthAgent]</a></code>

### Invocations

Types:

```python
from kernel.types.agents.auth import InvocationExchangeResponse
```

Methods:

- <code title="post /agents/auth/invocations">client.agents.auth.invocations.<a href="./src/kernel/resources/agents/auth/invocations.py">create</a>(\*\*<a href="src/kernel/types/agents/auth/invocation_create_params.py">params</a>) -> <a href="./src/kernel/types/agents/auth_agent_invocation_create_response.py">AuthAgentInvocationCreateResponse</a></code>
- <code title="get /agents/auth/invocations/{invocation_id}">client.agents.auth.invocations.<a href="./src/kernel/resources/agents/auth/invocations.py">retrieve</a>(invocation_id) -> <a href="./src/kernel/types/agents/agent_auth_invocation_response.py">AgentAuthInvocationResponse</a></code>
- <code title="post /agents/auth/invocations/{invocation_id}/discover">client.agents.auth.invocations.<a href="./src/kernel/resources/agents/auth/invocations.py">discover</a>(invocation_id, \*\*<a href="src/kernel/types/agents/auth/invocation_discover_params.py">params</a>) -> <a href="./src/kernel/types/agents/agent_auth_discover_response.py">AgentAuthDiscoverResponse</a></code>
- <code title="post /agents/auth/invocations/{invocation_id}/exchange">client.agents.auth.invocations.<a href="./src/kernel/resources/agents/auth/invocations.py">exchange</a>(invocation_id, \*\*<a href="src/kernel/types/agents/auth/invocation_exchange_params.py">params</a>) -> <a href="./src/kernel/types/agents/auth/invocation_exchange_response.py">InvocationExchangeResponse</a></code>
- <code title="post /agents/auth/invocations/{invocation_id}/submit">client.agents.auth.invocations.<a href="./src/kernel/resources/agents/auth/invocations.py">submit</a>(invocation_id, \*\*<a href="src/kernel/types/agents/auth/invocation_submit_params.py">params</a>) -> <a href="./src/kernel/types/agents/agent_auth_submit_response.py">AgentAuthSubmitResponse</a></code>
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "kernel"
version = "0.22.0"
version = "0.23.0"
description = "The official Python library for the kernel API"
dynamic = ["readme"]
license = "Apache-2.0"
Expand Down
9 changes: 9 additions & 0 deletions src/kernel/_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
SyncAPIClient,
AsyncAPIClient,
)
from .resources.agents import agents
from .resources.browsers import browsers

__all__ = [
Expand Down Expand Up @@ -58,6 +59,7 @@ class Kernel(SyncAPIClient):
proxies: proxies.ProxiesResource
extensions: extensions.ExtensionsResource
browser_pools: browser_pools.BrowserPoolsResource
agents: agents.AgentsResource
with_raw_response: KernelWithRawResponse
with_streaming_response: KernelWithStreamedResponse

Expand Down Expand Up @@ -147,6 +149,7 @@ def __init__(
self.proxies = proxies.ProxiesResource(self)
self.extensions = extensions.ExtensionsResource(self)
self.browser_pools = browser_pools.BrowserPoolsResource(self)
self.agents = agents.AgentsResource(self)
self.with_raw_response = KernelWithRawResponse(self)
self.with_streaming_response = KernelWithStreamedResponse(self)

Expand Down Expand Up @@ -266,6 +269,7 @@ class AsyncKernel(AsyncAPIClient):
proxies: proxies.AsyncProxiesResource
extensions: extensions.AsyncExtensionsResource
browser_pools: browser_pools.AsyncBrowserPoolsResource
agents: agents.AsyncAgentsResource
with_raw_response: AsyncKernelWithRawResponse
with_streaming_response: AsyncKernelWithStreamedResponse

Expand Down Expand Up @@ -355,6 +359,7 @@ def __init__(
self.proxies = proxies.AsyncProxiesResource(self)
self.extensions = extensions.AsyncExtensionsResource(self)
self.browser_pools = browser_pools.AsyncBrowserPoolsResource(self)
self.agents = agents.AsyncAgentsResource(self)
self.with_raw_response = AsyncKernelWithRawResponse(self)
self.with_streaming_response = AsyncKernelWithStreamedResponse(self)

Expand Down Expand Up @@ -475,6 +480,7 @@ def __init__(self, client: Kernel) -> None:
self.proxies = proxies.ProxiesResourceWithRawResponse(client.proxies)
self.extensions = extensions.ExtensionsResourceWithRawResponse(client.extensions)
self.browser_pools = browser_pools.BrowserPoolsResourceWithRawResponse(client.browser_pools)
self.agents = agents.AgentsResourceWithRawResponse(client.agents)


class AsyncKernelWithRawResponse:
Expand All @@ -487,6 +493,7 @@ def __init__(self, client: AsyncKernel) -> None:
self.proxies = proxies.AsyncProxiesResourceWithRawResponse(client.proxies)
self.extensions = extensions.AsyncExtensionsResourceWithRawResponse(client.extensions)
self.browser_pools = browser_pools.AsyncBrowserPoolsResourceWithRawResponse(client.browser_pools)
self.agents = agents.AsyncAgentsResourceWithRawResponse(client.agents)


class KernelWithStreamedResponse:
Expand All @@ -499,6 +506,7 @@ def __init__(self, client: Kernel) -> None:
self.proxies = proxies.ProxiesResourceWithStreamingResponse(client.proxies)
self.extensions = extensions.ExtensionsResourceWithStreamingResponse(client.extensions)
self.browser_pools = browser_pools.BrowserPoolsResourceWithStreamingResponse(client.browser_pools)
self.agents = agents.AgentsResourceWithStreamingResponse(client.agents)


class AsyncKernelWithStreamedResponse:
Expand All @@ -511,6 +519,7 @@ def __init__(self, client: AsyncKernel) -> None:
self.proxies = proxies.AsyncProxiesResourceWithStreamingResponse(client.proxies)
self.extensions = extensions.AsyncExtensionsResourceWithStreamingResponse(client.extensions)
self.browser_pools = browser_pools.AsyncBrowserPoolsResourceWithStreamingResponse(client.browser_pools)
self.agents = agents.AsyncAgentsResourceWithStreamingResponse(client.agents)


Client = Kernel
Expand Down
5 changes: 3 additions & 2 deletions src/kernel/_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,9 @@ class HttpxSendArgs(TypedDict, total=False):
if TYPE_CHECKING:
# This works because str.__contains__ does not accept object (either in typeshed or at runtime)
# https://github.com/hauntsaninja/useful_types/blob/5e9710f3875107d068e7679fd7fec9cfab0eff3b/useful_types/__init__.py#L285
#
# Note: index() and count() methods are intentionally omitted to allow pyright to properly
# infer TypedDict types when dict literals are used in lists assigned to SequenceNotStr.
class SequenceNotStr(Protocol[_T_co]):
@overload
def __getitem__(self, index: SupportsIndex, /) -> _T_co: ...
Expand All @@ -251,8 +254,6 @@ def __getitem__(self, index: slice, /) -> Sequence[_T_co]: ...
def __contains__(self, value: object, /) -> bool: ...
def __len__(self) -> int: ...
def __iter__(self) -> Iterator[_T_co]: ...
def index(self, value: Any, start: int = 0, stop: int = ..., /) -> int: ...
def count(self, value: Any, /) -> int: ...
def __reversed__(self) -> Iterator[_T_co]: ...
else:
# just point this to a normal `Sequence` at runtime to avoid having to special case
Expand Down
2 changes: 1 addition & 1 deletion src/kernel/_version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

__title__ = "kernel"
__version__ = "0.22.0" # x-release-please-version
__version__ = "0.23.0" # x-release-please-version
14 changes: 14 additions & 0 deletions src/kernel/resources/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,14 @@
AppsResourceWithStreamingResponse,
AsyncAppsResourceWithStreamingResponse,
)
from .agents import (
AgentsResource,
AsyncAgentsResource,
AgentsResourceWithRawResponse,
AsyncAgentsResourceWithRawResponse,
AgentsResourceWithStreamingResponse,
AsyncAgentsResourceWithStreamingResponse,
)
from .proxies import (
ProxiesResource,
AsyncProxiesResource,
Expand Down Expand Up @@ -114,4 +122,10 @@
"AsyncBrowserPoolsResourceWithRawResponse",
"BrowserPoolsResourceWithStreamingResponse",
"AsyncBrowserPoolsResourceWithStreamingResponse",
"AgentsResource",
"AsyncAgentsResource",
"AgentsResourceWithRawResponse",
"AsyncAgentsResourceWithRawResponse",
"AgentsResourceWithStreamingResponse",
"AsyncAgentsResourceWithStreamingResponse",
]
33 changes: 33 additions & 0 deletions src/kernel/resources/agents/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

from .auth import (
AuthResource,
AsyncAuthResource,
AuthResourceWithRawResponse,
AsyncAuthResourceWithRawResponse,
AuthResourceWithStreamingResponse,
AsyncAuthResourceWithStreamingResponse,
)
from .agents import (
AgentsResource,
AsyncAgentsResource,
AgentsResourceWithRawResponse,
AsyncAgentsResourceWithRawResponse,
AgentsResourceWithStreamingResponse,
AsyncAgentsResourceWithStreamingResponse,
)

__all__ = [
"AuthResource",
"AsyncAuthResource",
"AuthResourceWithRawResponse",
"AsyncAuthResourceWithRawResponse",
"AuthResourceWithStreamingResponse",
"AsyncAuthResourceWithStreamingResponse",
"AgentsResource",
"AsyncAgentsResource",
"AgentsResourceWithRawResponse",
"AsyncAgentsResourceWithRawResponse",
"AgentsResourceWithStreamingResponse",
"AsyncAgentsResourceWithStreamingResponse",
]
Loading