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 @@
{
".": "1.18.1"
".": "1.19.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: 110
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-f0eb12cf4df4fa3046bd88aae4966062eb6e9703768a07a0136da2f26a2ebd56.yml
openapi_spec_hash: cdbd63a8162f1e987e937042cbd60eea
config_hash: 526cf0707adc54c690fc687a1c6db728
configured_endpoints: 115
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-5b536a11a713dd4e47b270c130368dbfdf1f30282f262c160cd0411fcd291806.yml
openapi_spec_hash: f94d993a7f34461ebde7d0186e8e3c3a
config_hash: 12de9459ff629b6a3072a75b236b7b70
23 changes: 23 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,28 @@
# Changelog

## 1.19.0 (2026-04-13)

Full Changelog: [v1.18.1...v1.19.0](https://github.com/runloopai/api-client-python/compare/v1.18.1...v1.19.0)

### Features

* Add wake on axon event as an API primitive ([#8681](https://github.com/runloopai/api-client-python/issues/8681)) ([255099a](https://github.com/runloopai/api-client-python/commit/255099a940a7892f3c66e6534517e3545d7daccb))
* Allow API keys to create API and restricted keys ([#8663](https://github.com/runloopai/api-client-python/issues/8663)) ([2e03b55](https://github.com/runloopai/api-client-python/commit/2e03b55638a83a8354481f47a30910e94ff57fc3))


### Bug Fixes

* add missing agent API paths to stainless config ([#8699](https://github.com/runloopai/api-client-python/issues/8699)) ([4f6fe60](https://github.com/runloopai/api-client-python/commit/4f6fe60a63fd31c049e54febb81801031dce2325))
* ensure file data are only sent as 1 parameter ([f7ca2cc](https://github.com/runloopai/api-client-python/commit/f7ca2cc280f1e7a4ab73f331be8fe3e33ae1c611))


### Documentation

* add snapshot, suspend & resume example ([#764](https://github.com/runloopai/api-client-python/issues/764)) ([f4b942b](https://github.com/runloopai/api-client-python/commit/f4b942b3329e98a4ea5182c04d6db90fd0b70308))
* added Async vs Sync tabs, removed top-level class descriptions ([#783](https://github.com/runloopai/api-client-python/issues/783)) ([6a99c56](https://github.com/runloopai/api-client-python/commit/6a99c569914d93e07087ed5003ee7c77f2ab88ff))
* restructure sphinx docs with async-first API reference and full type coverage ([#782](https://github.com/runloopai/api-client-python/issues/782)) ([514cf93](https://github.com/runloopai/api-client-python/commit/514cf93e8ff8b97bfde171a83cf9abf211193e7f))
* show full field descriptions for SDK parameter types ([#784](https://github.com/runloopai/api-client-python/issues/784)) ([f04a506](https://github.com/runloopai/api-client-python/commit/f04a5069c33fceb7a4d3db634bfd77ab789314dc))

## 1.18.1 (2026-04-10)

Full Changelog: [v1.17.0...v1.18.1](https://github.com/runloopai/api-client-python/compare/v1.17.0...v1.18.1)
Expand Down
38 changes: 37 additions & 1 deletion api.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,14 +79,22 @@ Methods:
Types:

```python
from runloop_api_client.types import AgentCreateParameters, AgentListView, AgentView
from runloop_api_client.types import (
AgentCreateParameters,
AgentDevboxCountsView,
AgentListView,
AgentView,
)
```

Methods:

- <code title="post /v1/agents">client.agents.<a href="./src/runloop_api_client/resources/agents.py">create</a>(\*\*<a href="src/runloop_api_client/types/agent_create_params.py">params</a>) -> <a href="./src/runloop_api_client/types/agent_view.py">AgentView</a></code>
- <code title="get /v1/agents/{id}">client.agents.<a href="./src/runloop_api_client/resources/agents.py">retrieve</a>(id) -> <a href="./src/runloop_api_client/types/agent_view.py">AgentView</a></code>
- <code title="get /v1/agents">client.agents.<a href="./src/runloop_api_client/resources/agents.py">list</a>(\*\*<a href="src/runloop_api_client/types/agent_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/agent_view.py">SyncAgentsCursorIDPage[AgentView]</a></code>
- <code title="post /v1/agents/{id}/delete">client.agents.<a href="./src/runloop_api_client/resources/agents.py">delete</a>(id) -> object</code>
- <code title="get /v1/agents/devbox_counts">client.agents.<a href="./src/runloop_api_client/resources/agents.py">devbox_counts</a>() -> <a href="./src/runloop_api_client/types/agent_devbox_counts_view.py">AgentDevboxCountsView</a></code>
- <code title="get /v1/agents/list_public">client.agents.<a href="./src/runloop_api_client/resources/agents.py">list_public</a>(\*\*<a href="src/runloop_api_client/types/agent_list_public_params.py">params</a>) -> <a href="./src/runloop_api_client/types/agent_view.py">SyncAgentsCursorIDPage[AgentView]</a></code>

# Axons

Expand Down Expand Up @@ -439,3 +447,31 @@ Methods:
- <code title="post /v1/mcp-configs/{id}">client.mcp_configs.<a href="./src/runloop_api_client/resources/mcp_configs.py">update</a>(id, \*\*<a href="src/runloop_api_client/types/mcp_config_update_params.py">params</a>) -> <a href="./src/runloop_api_client/types/mcp_config_view.py">McpConfigView</a></code>
- <code title="get /v1/mcp-configs">client.mcp_configs.<a href="./src/runloop_api_client/resources/mcp_configs.py">list</a>(\*\*<a href="src/runloop_api_client/types/mcp_config_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/mcp_config_view.py">SyncMcpConfigsCursorIDPage[McpConfigView]</a></code>
- <code title="post /v1/mcp-configs/{id}/delete">client.mcp_configs.<a href="./src/runloop_api_client/resources/mcp_configs.py">delete</a>(id) -> <a href="./src/runloop_api_client/types/mcp_config_view.py">McpConfigView</a></code>

# Apikeys

Types:

```python
from runloop_api_client.types import APIKeyCreatedView, APIKeyCreateParameters
```

Methods:

- <code title="post /v1/apikeys">client.apikeys.<a href="./src/runloop_api_client/resources/apikeys.py">create</a>(\*\*<a href="src/runloop_api_client/types/apikey_create_params.py">params</a>) -> <a href="./src/runloop_api_client/types/api_key_created_view.py">APIKeyCreatedView</a></code>

# RestrictedKeys

Types:

```python
from runloop_api_client.types import (
RestrictedKeyCreatedView,
RestrictedKeyCreateParameters,
ScopeEntryView,
)
```

Methods:

- <code title="post /v1/restricted_keys">client.restricted_keys.<a href="./src/runloop_api_client/resources/restricted_keys.py">create</a>(\*\*<a href="src/runloop_api_client/types/restricted_key_create_params.py">params</a>) -> <a href="./src/runloop_api_client/types/restricted_key_created_view.py">RestrictedKeyCreatedView</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 = "runloop_api_client"
version = "1.18.1"
version = "1.19.0"
description = "The official Python library for the runloop API"
dynamic = ["readme"]
license = "MIT"
Expand Down
76 changes: 76 additions & 0 deletions src/runloop_api_client/_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
from .resources import (
axons,
agents,
apikeys,
objects,
secrets,
devboxes,
Expand All @@ -44,9 +45,11 @@
benchmark_jobs,
benchmark_runs,
gateway_configs,
restricted_keys,
network_policies,
)
from .resources.agents import AgentsResource, AsyncAgentsResource
from .resources.apikeys import ApikeysResource, AsyncApikeysResource
from .resources.objects import ObjectsResource, AsyncObjectsResource
from .resources.secrets import SecretsResource, AsyncSecretsResource
from .resources.benchmarks import BenchmarksResource, AsyncBenchmarksResource
Expand All @@ -56,6 +59,7 @@
from .resources.benchmark_jobs import BenchmarkJobsResource, AsyncBenchmarkJobsResource
from .resources.benchmark_runs import BenchmarkRunsResource, AsyncBenchmarkRunsResource
from .resources.gateway_configs import GatewayConfigsResource, AsyncGatewayConfigsResource
from .resources.restricted_keys import RestrictedKeysResource, AsyncRestrictedKeysResource
from .resources.network_policies import NetworkPoliciesResource, AsyncNetworkPoliciesResource
from .resources.devboxes.devboxes import DevboxesResource, AsyncDevboxesResource
from .resources.scenarios.scenarios import ScenariosResource, AsyncScenariosResource
Expand Down Expand Up @@ -198,6 +202,18 @@ def mcp_configs(self) -> McpConfigsResource:

return McpConfigsResource(self)

@cached_property
def apikeys(self) -> ApikeysResource:
from .resources.apikeys import ApikeysResource

return ApikeysResource(self)

@cached_property
def restricted_keys(self) -> RestrictedKeysResource:
from .resources.restricted_keys import RestrictedKeysResource

return RestrictedKeysResource(self)

@cached_property
def with_raw_response(self) -> RunloopWithRawResponse:
return RunloopWithRawResponse(self)
Expand Down Expand Up @@ -446,6 +462,18 @@ def mcp_configs(self) -> AsyncMcpConfigsResource:

return AsyncMcpConfigsResource(self)

@cached_property
def apikeys(self) -> AsyncApikeysResource:
from .resources.apikeys import AsyncApikeysResource

return AsyncApikeysResource(self)

@cached_property
def restricted_keys(self) -> AsyncRestrictedKeysResource:
from .resources.restricted_keys import AsyncRestrictedKeysResource

return AsyncRestrictedKeysResource(self)

@cached_property
def with_raw_response(self) -> AsyncRunloopWithRawResponse:
return AsyncRunloopWithRawResponse(self)
Expand Down Expand Up @@ -643,6 +671,18 @@ def mcp_configs(self) -> mcp_configs.McpConfigsResourceWithRawResponse:

return McpConfigsResourceWithRawResponse(self._client.mcp_configs)

@cached_property
def apikeys(self) -> apikeys.ApikeysResourceWithRawResponse:
from .resources.apikeys import ApikeysResourceWithRawResponse

return ApikeysResourceWithRawResponse(self._client.apikeys)

@cached_property
def restricted_keys(self) -> restricted_keys.RestrictedKeysResourceWithRawResponse:
from .resources.restricted_keys import RestrictedKeysResourceWithRawResponse

return RestrictedKeysResourceWithRawResponse(self._client.restricted_keys)


class AsyncRunloopWithRawResponse:
_client: AsyncRunloop
Expand Down Expand Up @@ -728,6 +768,18 @@ def mcp_configs(self) -> mcp_configs.AsyncMcpConfigsResourceWithRawResponse:

return AsyncMcpConfigsResourceWithRawResponse(self._client.mcp_configs)

@cached_property
def apikeys(self) -> apikeys.AsyncApikeysResourceWithRawResponse:
from .resources.apikeys import AsyncApikeysResourceWithRawResponse

return AsyncApikeysResourceWithRawResponse(self._client.apikeys)

@cached_property
def restricted_keys(self) -> restricted_keys.AsyncRestrictedKeysResourceWithRawResponse:
from .resources.restricted_keys import AsyncRestrictedKeysResourceWithRawResponse

return AsyncRestrictedKeysResourceWithRawResponse(self._client.restricted_keys)


class RunloopWithStreamedResponse:
_client: Runloop
Expand Down Expand Up @@ -813,6 +865,18 @@ def mcp_configs(self) -> mcp_configs.McpConfigsResourceWithStreamingResponse:

return McpConfigsResourceWithStreamingResponse(self._client.mcp_configs)

@cached_property
def apikeys(self) -> apikeys.ApikeysResourceWithStreamingResponse:
from .resources.apikeys import ApikeysResourceWithStreamingResponse

return ApikeysResourceWithStreamingResponse(self._client.apikeys)

@cached_property
def restricted_keys(self) -> restricted_keys.RestrictedKeysResourceWithStreamingResponse:
from .resources.restricted_keys import RestrictedKeysResourceWithStreamingResponse

return RestrictedKeysResourceWithStreamingResponse(self._client.restricted_keys)


class AsyncRunloopWithStreamedResponse:
_client: AsyncRunloop
Expand Down Expand Up @@ -898,6 +962,18 @@ def mcp_configs(self) -> mcp_configs.AsyncMcpConfigsResourceWithStreamingRespons

return AsyncMcpConfigsResourceWithStreamingResponse(self._client.mcp_configs)

@cached_property
def apikeys(self) -> apikeys.AsyncApikeysResourceWithStreamingResponse:
from .resources.apikeys import AsyncApikeysResourceWithStreamingResponse

return AsyncApikeysResourceWithStreamingResponse(self._client.apikeys)

@cached_property
def restricted_keys(self) -> restricted_keys.AsyncRestrictedKeysResourceWithStreamingResponse:
from .resources.restricted_keys import AsyncRestrictedKeysResourceWithStreamingResponse

return AsyncRestrictedKeysResourceWithStreamingResponse(self._client.restricted_keys)


Client = Runloop

Expand Down
5 changes: 3 additions & 2 deletions src/runloop_api_client/_utils/_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,9 @@ def _extract_items(
index += 1
if is_dict(obj):
try:
# We are at the last entry in the path so we must remove the field
if (len(path)) == index:
# Remove the field if there are no more dict keys in the path,
# only "<array>" traversal markers or end.
if all(p == "<array>" for p in path[index:]):
item = obj.pop(key)
else:
item = obj[key]
Expand Down
2 changes: 1 addition & 1 deletion src/runloop_api_client/_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__ = "runloop_api_client"
__version__ = "1.18.1" # x-release-please-version
__version__ = "1.19.0" # x-release-please-version
28 changes: 28 additions & 0 deletions src/runloop_api_client/resources/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,14 @@
AgentsResourceWithStreamingResponse,
AsyncAgentsResourceWithStreamingResponse,
)
from .apikeys import (
ApikeysResource,
AsyncApikeysResource,
ApikeysResourceWithRawResponse,
AsyncApikeysResourceWithRawResponse,
ApikeysResourceWithStreamingResponse,
AsyncApikeysResourceWithStreamingResponse,
)
from .objects import (
ObjectsResource,
AsyncObjectsResource,
Expand Down Expand Up @@ -96,6 +104,14 @@
GatewayConfigsResourceWithStreamingResponse,
AsyncGatewayConfigsResourceWithStreamingResponse,
)
from .restricted_keys import (
RestrictedKeysResource,
AsyncRestrictedKeysResource,
RestrictedKeysResourceWithRawResponse,
AsyncRestrictedKeysResourceWithRawResponse,
RestrictedKeysResourceWithStreamingResponse,
AsyncRestrictedKeysResourceWithStreamingResponse,
)
from .network_policies import (
NetworkPoliciesResource,
AsyncNetworkPoliciesResource,
Expand Down Expand Up @@ -184,4 +200,16 @@
"AsyncMcpConfigsResourceWithRawResponse",
"McpConfigsResourceWithStreamingResponse",
"AsyncMcpConfigsResourceWithStreamingResponse",
"ApikeysResource",
"AsyncApikeysResource",
"ApikeysResourceWithRawResponse",
"AsyncApikeysResourceWithRawResponse",
"ApikeysResourceWithStreamingResponse",
"AsyncApikeysResourceWithStreamingResponse",
"RestrictedKeysResource",
"AsyncRestrictedKeysResource",
"RestrictedKeysResourceWithRawResponse",
"AsyncRestrictedKeysResourceWithRawResponse",
"RestrictedKeysResourceWithStreamingResponse",
"AsyncRestrictedKeysResourceWithStreamingResponse",
]
Loading