Skip to content

Commit d58250d

Browse files
release: 1.7.0 (#732)
Co-authored-by: stainless-app[bot] <142633134+stainless-app[bot]@users.noreply.github.com> Co-authored-by: Alexander Dines <alex@runloop.ai>
1 parent 9f4b49d commit d58250d

34 files changed

Lines changed: 1691 additions & 430 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-
".": "1.5.1"
2+
".": "1.7.0"
33
}

.stats.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 112
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-b493cadf2e3b9658163a6bcf8f51e088dda169f12d68469c4441d17e889f5556.yml
3-
openapi_spec_hash: b27ec3822d88d10efa268f1681fddff3
4-
config_hash: 6c26299fd9ef01fb4713612a9a2ad17c
1+
configured_endpoints: 117
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-15b7fd06098d8cb3639efb3b401a03d7d97a8ab4960b08077aa871f0cacb33d3.yml
3+
openapi_spec_hash: 93ab2fe88f9e57d8f262ad6d1179190e
4+
config_hash: eb28692edd68a6ae95cf92af931c9976

CHANGELOG.md

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

3+
## 1.7.0 (2026-02-05)
4+
5+
Full Changelog: [v1.5.1...v1.7.0](https://github.com/runloopai/api-client-python/compare/v1.5.1...v1.7.0)
6+
7+
### Features
8+
9+
* add api to query devbox usage ([#7296](https://github.com/runloopai/api-client-python/issues/7296)) ([ab903f5](https://github.com/runloopai/api-client-python/commit/ab903f557ecc8be15c8d150068a82dfaaac23f4e))
10+
* adding MCP Config routes ([#7331](https://github.com/runloopai/api-client-python/issues/7331)) ([79d05c0](https://github.com/runloopai/api-client-python/commit/79d05c00f9bb85a458cc300c5b065b6249a16a88))
11+
* **devbox:** add mcp configuration to devbox create ([#7341](https://github.com/runloopai/api-client-python/issues/7341)) ([0b81e31](https://github.com/runloopai/api-client-python/commit/0b81e3151e3df41f667923cac4e714ba6d7ca3bc))
12+
* **devbox:** adding gateway config ([#736](https://github.com/runloopai/api-client-python/issues/736)) ([9f4b49d](https://github.com/runloopai/api-client-python/commit/9f4b49daa13dd3aac5a8ee26a262fd7b5b705ff1))
13+
14+
15+
### Bug Fixes
16+
17+
* **sdk:** fixed pagination for scorer, scenario and network policy list methods ([#731](https://github.com/runloopai/api-client-python/issues/731)) ([d55fceb](https://github.com/runloopai/api-client-python/commit/d55fceb7d42877cd0ac69a934ef300815f371342))
18+
19+
20+
### Chores
21+
22+
* Mark legacy tunnel methods deprecated ([#737](https://github.com/runloopai/api-client-python/issues/737)) ([764b445](https://github.com/runloopai/api-client-python/commit/764b445018ec50db3105c0dd8ea58b02e4690e12))
23+
324
## 1.5.1 (2026-01-30)
425

526
Full Changelog: [v1.5.0...v1.5.1](https://github.com/runloopai/api-client-python/compare/v1.5.0...v1.5.1)

api.md

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ from runloop_api_client.types import (
126126
DevboxExecutionDetailView,
127127
DevboxKillExecutionRequest,
128128
DevboxListView,
129+
DevboxResourceUsageView,
129130
DevboxSendStdInRequest,
130131
DevboxSendStdInResult,
131132
DevboxSnapshotListView,
@@ -158,6 +159,7 @@ Methods:
158159
- <code title="post /v1/devboxes/{id}/read_file_contents">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">read_file_contents</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_read_file_contents_params.py">params</a>) -> str</code>
159160
- <code title="post /v1/devboxes/{id}/remove_tunnel">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">remove_tunnel</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_remove_tunnel_params.py">params</a>) -> object</code>
160161
- <code title="post /v1/devboxes/{id}/resume">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">resume</a>(id) -> <a href="./src/runloop_api_client/types/devbox_view.py">DevboxView</a></code>
162+
- <code title="get /v1/devboxes/{id}/usage">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">retrieve_resource_usage</a>(id) -> <a href="./src/runloop_api_client/types/devbox_resource_usage_view.py">DevboxResourceUsageView</a></code>
161163
- <code title="post /v1/devboxes/{id}/shutdown">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">shutdown</a>(id) -> <a href="./src/runloop_api_client/types/devbox_view.py">DevboxView</a></code>
162164
- <code title="post /v1/devboxes/{id}/snapshot_disk">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">snapshot_disk</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_snapshot_disk_params.py">params</a>) -> <a href="./src/runloop_api_client/types/devbox_snapshot_view.py">DevboxSnapshotView</a></code>
163165
- <code title="post /v1/devboxes/{id}/snapshot_disk_async">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">snapshot_disk_async</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_snapshot_disk_async_params.py">params</a>) -> <a href="./src/runloop_api_client/types/devbox_snapshot_view.py">DevboxSnapshotView</a></code>
@@ -299,7 +301,6 @@ from runloop_api_client.types.scenarios import (
299301
ScorerRetrieveResponse,
300302
ScorerUpdateResponse,
301303
ScorerListResponse,
302-
ScorerValidateResponse,
303304
)
304305
```
305306

@@ -309,7 +310,6 @@ Methods:
309310
- <code title="get /v1/scenarios/scorers/{id}">client.scenarios.scorers.<a href="./src/runloop_api_client/resources/scenarios/scorers.py">retrieve</a>(id) -> <a href="./src/runloop_api_client/types/scenarios/scorer_retrieve_response.py">ScorerRetrieveResponse</a></code>
310311
- <code title="post /v1/scenarios/scorers/{id}">client.scenarios.scorers.<a href="./src/runloop_api_client/resources/scenarios/scorers.py">update</a>(id, \*\*<a href="src/runloop_api_client/types/scenarios/scorer_update_params.py">params</a>) -> <a href="./src/runloop_api_client/types/scenarios/scorer_update_response.py">ScorerUpdateResponse</a></code>
311312
- <code title="get /v1/scenarios/scorers">client.scenarios.scorers.<a href="./src/runloop_api_client/resources/scenarios/scorers.py">list</a>(\*\*<a href="src/runloop_api_client/types/scenarios/scorer_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/scenarios/scorer_list_response.py">SyncScenarioScorersCursorIDPage[ScorerListResponse]</a></code>
312-
- <code title="post /v1/scenarios/scorers/{id}/validate">client.scenarios.scorers.<a href="./src/runloop_api_client/resources/scenarios/scorers.py">validate</a>(id, \*\*<a href="src/runloop_api_client/types/scenarios/scorer_validate_params.py">params</a>) -> <a href="./src/runloop_api_client/types/scenarios/scorer_validate_response.py">ScorerValidateResponse</a></code>
313313

314314
# Objects
315315

@@ -420,3 +420,24 @@ Methods:
420420
- <code title="post /v1/gateway-configs/{id}">client.gateway_configs.<a href="./src/runloop_api_client/resources/gateway_configs.py">update</a>(id, \*\*<a href="src/runloop_api_client/types/gateway_config_update_params.py">params</a>) -> <a href="./src/runloop_api_client/types/gateway_config_view.py">GatewayConfigView</a></code>
421421
- <code title="get /v1/gateway-configs">client.gateway_configs.<a href="./src/runloop_api_client/resources/gateway_configs.py">list</a>(\*\*<a href="src/runloop_api_client/types/gateway_config_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/gateway_config_view.py">SyncGatewayConfigsCursorIDPage[GatewayConfigView]</a></code>
422422
- <code title="post /v1/gateway-configs/{id}/delete">client.gateway_configs.<a href="./src/runloop_api_client/resources/gateway_configs.py">delete</a>(id) -> <a href="./src/runloop_api_client/types/gateway_config_view.py">GatewayConfigView</a></code>
423+
424+
# McpConfigs
425+
426+
Types:
427+
428+
```python
429+
from runloop_api_client.types import (
430+
McpConfigCreateParameters,
431+
McpConfigListView,
432+
McpConfigUpdateParameters,
433+
McpConfigView,
434+
)
435+
```
436+
437+
Methods:
438+
439+
- <code title="post /v1/mcp-configs">client.mcp_configs.<a href="./src/runloop_api_client/resources/mcp_configs.py">create</a>(\*\*<a href="src/runloop_api_client/types/mcp_config_create_params.py">params</a>) -> <a href="./src/runloop_api_client/types/mcp_config_view.py">McpConfigView</a></code>
440+
- <code title="get /v1/mcp-configs/{id}">client.mcp_configs.<a href="./src/runloop_api_client/resources/mcp_configs.py">retrieve</a>(id) -> <a href="./src/runloop_api_client/types/mcp_config_view.py">McpConfigView</a></code>
441+
- <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>
442+
- <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>
443+
- <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>

docs/sdk/types.rst

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,16 +81,14 @@ These TypeDicts define parameters for storage object creation, listing, and down
8181
Scorer Parameters
8282
-----------------
8383

84-
These TypeDicts define parameters for scorer creation, listing, updating, and validation.
84+
These TypeDicts define parameters for scorer creation, listing, and updating.
8585

8686
.. autotypeddict:: runloop_api_client.sdk._types.SDKScorerCreateParams
8787

8888
.. autotypeddict:: runloop_api_client.sdk._types.SDKScorerListParams
8989

9090
.. autotypeddict:: runloop_api_client.sdk._types.SDKScorerUpdateParams
9191

92-
.. autotypeddict:: runloop_api_client.sdk._types.SDKScorerValidateParams
93-
9492
Core Request Options
9593
--------------------
9694

pyproject.toml

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

src/runloop_api_client/_client.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
scenarios,
4040
benchmarks,
4141
blueprints,
42+
mcp_configs,
4243
repositories,
4344
benchmark_jobs,
4445
benchmark_runs,
@@ -50,6 +51,7 @@
5051
from .resources.secrets import SecretsResource, AsyncSecretsResource
5152
from .resources.benchmarks import BenchmarksResource, AsyncBenchmarksResource
5253
from .resources.blueprints import BlueprintsResource, AsyncBlueprintsResource
54+
from .resources.mcp_configs import McpConfigsResource, AsyncMcpConfigsResource
5355
from .resources.repositories import RepositoriesResource, AsyncRepositoriesResource
5456
from .resources.benchmark_jobs import BenchmarkJobsResource, AsyncBenchmarkJobsResource
5557
from .resources.benchmark_runs import BenchmarkRunsResource, AsyncBenchmarkRunsResource
@@ -190,6 +192,12 @@ def gateway_configs(self) -> GatewayConfigsResource:
190192

191193
return GatewayConfigsResource(self)
192194

195+
@cached_property
196+
def mcp_configs(self) -> McpConfigsResource:
197+
from .resources.mcp_configs import McpConfigsResource
198+
199+
return McpConfigsResource(self)
200+
193201
@cached_property
194202
def with_raw_response(self) -> RunloopWithRawResponse:
195203
return RunloopWithRawResponse(self)
@@ -432,6 +440,12 @@ def gateway_configs(self) -> AsyncGatewayConfigsResource:
432440

433441
return AsyncGatewayConfigsResource(self)
434442

443+
@cached_property
444+
def mcp_configs(self) -> AsyncMcpConfigsResource:
445+
from .resources.mcp_configs import AsyncMcpConfigsResource
446+
447+
return AsyncMcpConfigsResource(self)
448+
435449
@cached_property
436450
def with_raw_response(self) -> AsyncRunloopWithRawResponse:
437451
return AsyncRunloopWithRawResponse(self)
@@ -623,6 +637,12 @@ def gateway_configs(self) -> gateway_configs.GatewayConfigsResourceWithRawRespon
623637

624638
return GatewayConfigsResourceWithRawResponse(self._client.gateway_configs)
625639

640+
@cached_property
641+
def mcp_configs(self) -> mcp_configs.McpConfigsResourceWithRawResponse:
642+
from .resources.mcp_configs import McpConfigsResourceWithRawResponse
643+
644+
return McpConfigsResourceWithRawResponse(self._client.mcp_configs)
645+
626646

627647
class AsyncRunloopWithRawResponse:
628648
_client: AsyncRunloop
@@ -702,6 +722,12 @@ def gateway_configs(self) -> gateway_configs.AsyncGatewayConfigsResourceWithRawR
702722

703723
return AsyncGatewayConfigsResourceWithRawResponse(self._client.gateway_configs)
704724

725+
@cached_property
726+
def mcp_configs(self) -> mcp_configs.AsyncMcpConfigsResourceWithRawResponse:
727+
from .resources.mcp_configs import AsyncMcpConfigsResourceWithRawResponse
728+
729+
return AsyncMcpConfigsResourceWithRawResponse(self._client.mcp_configs)
730+
705731

706732
class RunloopWithStreamedResponse:
707733
_client: Runloop
@@ -781,6 +807,12 @@ def gateway_configs(self) -> gateway_configs.GatewayConfigsResourceWithStreaming
781807

782808
return GatewayConfigsResourceWithStreamingResponse(self._client.gateway_configs)
783809

810+
@cached_property
811+
def mcp_configs(self) -> mcp_configs.McpConfigsResourceWithStreamingResponse:
812+
from .resources.mcp_configs import McpConfigsResourceWithStreamingResponse
813+
814+
return McpConfigsResourceWithStreamingResponse(self._client.mcp_configs)
815+
784816

785817
class AsyncRunloopWithStreamedResponse:
786818
_client: AsyncRunloop
@@ -860,6 +892,12 @@ def gateway_configs(self) -> gateway_configs.AsyncGatewayConfigsResourceWithStre
860892

861893
return AsyncGatewayConfigsResourceWithStreamingResponse(self._client.gateway_configs)
862894

895+
@cached_property
896+
def mcp_configs(self) -> mcp_configs.AsyncMcpConfigsResourceWithStreamingResponse:
897+
from .resources.mcp_configs import AsyncMcpConfigsResourceWithStreamingResponse
898+
899+
return AsyncMcpConfigsResourceWithStreamingResponse(self._client.mcp_configs)
900+
863901

864902
Client = Runloop
865903

src/runloop_api_client/_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__ = "runloop_api_client"
4-
__version__ = "1.5.1" # x-release-please-version
4+
__version__ = "1.7.0" # x-release-please-version

src/runloop_api_client/pagination.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
"AsyncNetworkPoliciesCursorIDPage",
3333
"SyncGatewayConfigsCursorIDPage",
3434
"AsyncGatewayConfigsCursorIDPage",
35+
"SyncMcpConfigsCursorIDPage",
36+
"AsyncMcpConfigsCursorIDPage",
3537
]
3638

3739
_T = TypeVar("_T")
@@ -102,6 +104,11 @@ class GatewayConfigsCursorIDPageItem(Protocol):
102104
id: str
103105

104106

107+
@runtime_checkable
108+
class McpConfigsCursorIDPageItem(Protocol):
109+
id: str
110+
111+
105112
class SyncBlueprintsCursorIDPage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
106113
blueprints: List[_T]
107114
has_more: Optional[bool] = None
@@ -984,3 +991,71 @@ def next_page_info(self) -> Optional[PageInfo]:
984991
return None
985992

986993
return PageInfo(params={"starting_after": item.id})
994+
995+
996+
class SyncMcpConfigsCursorIDPage(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
997+
mcp_configs: List[_T]
998+
has_more: Optional[bool] = None
999+
total_count: Optional[int] = None
1000+
1001+
@override
1002+
def _get_page_items(self) -> List[_T]:
1003+
mcp_configs = self.mcp_configs
1004+
if not mcp_configs:
1005+
return []
1006+
return mcp_configs
1007+
1008+
@override
1009+
def has_next_page(self) -> bool:
1010+
has_more = self.has_more
1011+
if has_more is not None and has_more is False:
1012+
return False
1013+
1014+
return super().has_next_page()
1015+
1016+
@override
1017+
def next_page_info(self) -> Optional[PageInfo]:
1018+
mcp_configs = self.mcp_configs
1019+
if not mcp_configs:
1020+
return None
1021+
1022+
item = cast(Any, mcp_configs[-1])
1023+
if not isinstance(item, McpConfigsCursorIDPageItem) or item.id is None: # pyright: ignore[reportUnnecessaryComparison]
1024+
# TODO emit warning log
1025+
return None
1026+
1027+
return PageInfo(params={"starting_after": item.id})
1028+
1029+
1030+
class AsyncMcpConfigsCursorIDPage(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
1031+
mcp_configs: List[_T]
1032+
has_more: Optional[bool] = None
1033+
total_count: Optional[int] = None
1034+
1035+
@override
1036+
def _get_page_items(self) -> List[_T]:
1037+
mcp_configs = self.mcp_configs
1038+
if not mcp_configs:
1039+
return []
1040+
return mcp_configs
1041+
1042+
@override
1043+
def has_next_page(self) -> bool:
1044+
has_more = self.has_more
1045+
if has_more is not None and has_more is False:
1046+
return False
1047+
1048+
return super().has_next_page()
1049+
1050+
@override
1051+
def next_page_info(self) -> Optional[PageInfo]:
1052+
mcp_configs = self.mcp_configs
1053+
if not mcp_configs:
1054+
return None
1055+
1056+
item = cast(Any, mcp_configs[-1])
1057+
if not isinstance(item, McpConfigsCursorIDPageItem) or item.id is None: # pyright: ignore[reportUnnecessaryComparison]
1058+
# TODO emit warning log
1059+
return None
1060+
1061+
return PageInfo(params={"starting_after": item.id})

src/runloop_api_client/resources/__init__.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,14 @@
5656
BlueprintsResourceWithStreamingResponse,
5757
AsyncBlueprintsResourceWithStreamingResponse,
5858
)
59+
from .mcp_configs import (
60+
McpConfigsResource,
61+
AsyncMcpConfigsResource,
62+
McpConfigsResourceWithRawResponse,
63+
AsyncMcpConfigsResourceWithRawResponse,
64+
McpConfigsResourceWithStreamingResponse,
65+
AsyncMcpConfigsResourceWithStreamingResponse,
66+
)
5967
from .repositories import (
6068
RepositoriesResource,
6169
AsyncRepositoriesResource,
@@ -170,4 +178,10 @@
170178
"AsyncGatewayConfigsResourceWithRawResponse",
171179
"GatewayConfigsResourceWithStreamingResponse",
172180
"AsyncGatewayConfigsResourceWithStreamingResponse",
181+
"McpConfigsResource",
182+
"AsyncMcpConfigsResource",
183+
"McpConfigsResourceWithRawResponse",
184+
"AsyncMcpConfigsResourceWithRawResponse",
185+
"McpConfigsResourceWithStreamingResponse",
186+
"AsyncMcpConfigsResourceWithStreamingResponse",
173187
]

0 commit comments

Comments
 (0)