Skip to content

Commit ae5ffd5

Browse files
release: 1.29.0 (#827)
Co-authored-by: stainless-app[bot] <142633134+stainless-app[bot]@users.noreply.github.com>
1 parent e8c3d90 commit ae5ffd5

31 files changed

Lines changed: 577 additions & 81 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.28.0"
2+
".": "1.29.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: 120
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai/runloop-c1b0e0d2c2bf9d7888ddef0cfdfb390458875cd2c1feb48a06fcd06e92105326.yml
3-
openapi_spec_hash: ec61cf6d205251b54e1a6d68d9dd9860
4-
config_hash: 6d102da8b9fcc3d0deb42d7a707e78c6
1+
configured_endpoints: 121
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai/runloop-f8c19bf9329a554bedfbb8678d6d3cb8881a285d27b3d8ba078e2a573b597a17.yml
3+
openapi_spec_hash: 0c3d490050a9bbaa5cb7378bf55e8f37
4+
config_hash: 7afcebea2dd638ed0cf0d5367f820f73

CHANGELOG.md

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

3+
## 1.29.0 (2026-08-20)
4+
5+
Full Changelog: [v1.28.0...v1.29.0](https://github.com/runloopai/api-client-python/compare/v1.28.0...v1.29.0)
6+
7+
### Features
8+
9+
* **axon:** add registry delete endpoint ([#10769](https://github.com/runloopai/api-client-python/issues/10769)) ([c63f011](https://github.com/runloopai/api-client-python/commit/c63f01108d98785b358357e4e65e5e517dd0805e))
10+
* **broker:** plumb Pi protocol selection ([#10256](https://github.com/runloopai/api-client-python/issues/10256)) ([974d52b](https://github.com/runloopai/api-client-python/commit/974d52b8743ceda8a7127e3a3432ce51e71b1bfd))
11+
* **config:** custom_headers on McpConfig/GatewayConfig — persistence, REST, validation, provisioner, OpenAPI ([#11096](https://github.com/runloopai/api-client-python/issues/11096)) ([9482e47](https://github.com/runloopai/api-client-python/commit/9482e475d0ad6e2b1989ee25f66a759fe839065f))
12+
* **converter:** add Helm chart, container image, and enable in dev ([#10405](https://github.com/runloopai/api-client-python/issues/10405)) ([0d5ca34](https://github.com/runloopai/api-client-python/commit/0d5ca3438ac4cbcafdfaf7584042bd78a956e3ae))
13+
* **devbox:** recover resume provisioning failures ([#10597](https://github.com/runloopai/api-client-python/issues/10597)) ([518301e](https://github.com/runloopai/api-client-python/commit/518301e444b95bc5fa73cc0f13be67cf3f750024))
14+
* **gateway:** first-class BASIC auth mechanism ([#11063](https://github.com/runloopai/api-client-python/issues/11063)) ([1f50f93](https://github.com/runloopai/api-client-python/commit/1f50f93c26c6696d2a9f81b1b677eb9b7282601a))
15+
* **mcp:** configurable auth_mechanism on McpConfig, shared shape with gateway ([#11113](https://github.com/runloopai/api-client-python/issues/11113)) ([4dd9edd](https://github.com/runloopai/api-client-python/commit/4dd9edd5abbdfab0466826db8d18cbd2efae7b31))
16+
17+
18+
### Bug Fixes
19+
20+
* **devbox:** make Devbox update API patch-like ([#10582](https://github.com/runloopai/api-client-python/issues/10582)) ([0a74521](https://github.com/runloopai/api-client-python/commit/0a7452145ee6d1689d8635e65f88b8f778a84820))
21+
* **gateway:** reject keyless HEADER auth_mechanism at admission and in looper ([#11120](https://github.com/runloopai/api-client-python/issues/11120)) ([194c060](https://github.com/runloopai/api-client-python/commit/194c060f4c95a85d895fc4e0d701e48b5222646c))
22+
323
## 1.28.0 (2026-07-29)
424

525
Full Changelog: [v1.27.0...v1.28.0](https://github.com/runloopai/api-client-python/compare/v1.27.0...v1.28.0)

api.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ from runloop_api_client.types import (
55
AfterIdle,
66
AgentMount,
77
AgentSource,
8+
AuthMechanism,
89
BrokerMount,
910
CodeMountParameters,
11+
CustomHeader,
1012
LaunchParameters,
1113
LifecycleConfiguration,
1214
LifecycleHooks,
@@ -131,6 +133,7 @@ Methods:
131133
- <code title="post /v1/axons">client.axons.<a href="./src/runloop_api_client/resources/axons/axons.py">create</a>(\*\*<a href="src/runloop_api_client/types/axon_create_params.py">params</a>) -> <a href="./src/runloop_api_client/types/axon_view.py">AxonView</a></code>
132134
- <code title="get /v1/axons/{id}">client.axons.<a href="./src/runloop_api_client/resources/axons/axons.py">retrieve</a>(id) -> <a href="./src/runloop_api_client/types/axon_view.py">AxonView</a></code>
133135
- <code title="get /v1/axons">client.axons.<a href="./src/runloop_api_client/resources/axons/axons.py">list</a>(\*\*<a href="src/runloop_api_client/types/axon_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/axon_view.py">SyncAxonsCursorIDPage[AxonView]</a></code>
136+
- <code title="delete /v1/axons/{id}">client.axons.<a href="./src/runloop_api_client/resources/axons/axons.py">delete</a>(id) -> object</code>
134137
- <code title="post /v1/axons/{id}/publish">client.axons.<a href="./src/runloop_api_client/resources/axons/axons.py">publish</a>(id, \*\*<a href="src/runloop_api_client/types/axon_publish_params.py">params</a>) -> <a href="./src/runloop_api_client/types/publish_result_view.py">PublishResultView</a></code>
135138
- <code title="get /v1/axons/{id}/subscribe/sse">client.axons.<a href="./src/runloop_api_client/resources/axons/axons.py">subscribe_sse</a>(id, \*\*<a href="src/runloop_api_client/types/axon_subscribe_sse_params.py">params</a>) -> <a href="./src/runloop_api_client/types/axon_event_view.py">AxonEventView</a></code>
136139

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.28.0"
3+
version = "1.29.0"
44
description = "The official Python library for the runloop API"
55
dynamic = ["readme"]
66
license = "MIT"

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.28.0" # x-release-please-version
4+
__version__ = "1.29.0" # x-release-please-version

src/runloop_api_client/resources/axons/axons.py

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,46 @@ def list(
210210
model=AxonView,
211211
)
212212

213+
def delete(
214+
self,
215+
id: str,
216+
*,
217+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
218+
# The extra values given here take precedence over values defined on the client or passed to this method.
219+
extra_headers: Headers | None = None,
220+
extra_query: Query | None = None,
221+
extra_body: Body | None = None,
222+
timeout: float | httpx.Timeout | None | NotGiven = not_given,
223+
idempotency_key: str | None = None,
224+
) -> object:
225+
"""
226+
[Beta] Mark an axon deleted.
227+
228+
Args:
229+
extra_headers: Send extra headers
230+
231+
extra_query: Add additional query parameters to the request
232+
233+
extra_body: Add additional JSON properties to the request
234+
235+
timeout: Override the client-level default timeout for this request, in seconds
236+
237+
idempotency_key: Specify a custom idempotency key for this request
238+
"""
239+
if not id:
240+
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
241+
return self._delete(
242+
path_template("/v1/axons/{id}", id=id),
243+
options=make_request_options(
244+
extra_headers=extra_headers,
245+
extra_query=extra_query,
246+
extra_body=extra_body,
247+
timeout=timeout,
248+
idempotency_key=idempotency_key,
249+
),
250+
cast_to=object,
251+
)
252+
213253
def publish(
214254
self,
215255
id: str,
@@ -485,6 +525,46 @@ def list(
485525
model=AxonView,
486526
)
487527

528+
async def delete(
529+
self,
530+
id: str,
531+
*,
532+
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
533+
# The extra values given here take precedence over values defined on the client or passed to this method.
534+
extra_headers: Headers | None = None,
535+
extra_query: Query | None = None,
536+
extra_body: Body | None = None,
537+
timeout: float | httpx.Timeout | None | NotGiven = not_given,
538+
idempotency_key: str | None = None,
539+
) -> object:
540+
"""
541+
[Beta] Mark an axon deleted.
542+
543+
Args:
544+
extra_headers: Send extra headers
545+
546+
extra_query: Add additional query parameters to the request
547+
548+
extra_body: Add additional JSON properties to the request
549+
550+
timeout: Override the client-level default timeout for this request, in seconds
551+
552+
idempotency_key: Specify a custom idempotency key for this request
553+
"""
554+
if not id:
555+
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
556+
return await self._delete(
557+
path_template("/v1/axons/{id}", id=id),
558+
options=make_request_options(
559+
extra_headers=extra_headers,
560+
extra_query=extra_query,
561+
extra_body=extra_body,
562+
timeout=timeout,
563+
idempotency_key=idempotency_key,
564+
),
565+
cast_to=object,
566+
)
567+
488568
async def publish(
489569
self,
490570
id: str,
@@ -607,6 +687,9 @@ def __init__(self, axons: AxonsResource) -> None:
607687
self.list = to_raw_response_wrapper(
608688
axons.list,
609689
)
690+
self.delete = to_raw_response_wrapper(
691+
axons.delete,
692+
)
610693
self.publish = to_raw_response_wrapper(
611694
axons.publish,
612695
)
@@ -636,6 +719,9 @@ def __init__(self, axons: AsyncAxonsResource) -> None:
636719
self.list = async_to_raw_response_wrapper(
637720
axons.list,
638721
)
722+
self.delete = async_to_raw_response_wrapper(
723+
axons.delete,
724+
)
639725
self.publish = async_to_raw_response_wrapper(
640726
axons.publish,
641727
)
@@ -665,6 +751,9 @@ def __init__(self, axons: AxonsResource) -> None:
665751
self.list = to_streamed_response_wrapper(
666752
axons.list,
667753
)
754+
self.delete = to_streamed_response_wrapper(
755+
axons.delete,
756+
)
668757
self.publish = to_streamed_response_wrapper(
669758
axons.publish,
670759
)
@@ -694,6 +783,9 @@ def __init__(self, axons: AsyncAxonsResource) -> None:
694783
self.list = async_to_streamed_response_wrapper(
695784
axons.list,
696785
)
786+
self.delete = async_to_streamed_response_wrapper(
787+
axons.delete,
788+
)
697789
self.publish = async_to_streamed_response_wrapper(
698790
axons.publish,
699791
)

src/runloop_api_client/resources/devboxes/devboxes.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -338,14 +338,17 @@ def update(
338338
timeout: float | httpx.Timeout | None | NotGiven = not_given,
339339
idempotency_key: str | None = None,
340340
) -> DevboxView:
341-
"""
342-
Updates a devbox by doing a complete update the existing name,metadata fields.
343-
It does not patch partial values.
341+
"""Updates the specified Devbox fields.
342+
343+
Omitted fields are left unchanged. An empty
344+
name clears the name, and an empty metadata map clears the metadata.
344345
345346
Args:
346-
metadata: User defined metadata to attach to the devbox for organization.
347+
metadata: User defined metadata to replace the Devbox metadata. Omit to leave unchanged or
348+
set to an empty map to clear it.
347349
348-
name: (Optional) A user specified name to give the Devbox.
350+
name: A user specified name to give the Devbox. Omit to leave unchanged or set to an
351+
empty string to clear it.
349352
350353
extra_headers: Send extra headers
351354
@@ -2188,14 +2191,17 @@ async def update(
21882191
timeout: float | httpx.Timeout | None | NotGiven = not_given,
21892192
idempotency_key: str | None = None,
21902193
) -> DevboxView:
2191-
"""
2192-
Updates a devbox by doing a complete update the existing name,metadata fields.
2193-
It does not patch partial values.
2194+
"""Updates the specified Devbox fields.
2195+
2196+
Omitted fields are left unchanged. An empty
2197+
name clears the name, and an empty metadata map clears the metadata.
21942198
21952199
Args:
2196-
metadata: User defined metadata to attach to the devbox for organization.
2200+
metadata: User defined metadata to replace the Devbox metadata. Omit to leave unchanged or
2201+
set to an empty map to clear it.
21972202
2198-
name: (Optional) A user specified name to give the Devbox.
2203+
name: A user specified name to give the Devbox. Omit to leave unchanged or set to an
2204+
empty string to clear it.
21992205
22002206
extra_headers: Send extra headers
22012207

src/runloop_api_client/resources/gateway_configs.py

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from __future__ import annotations
44

5-
from typing import Optional
5+
from typing import Iterable, Optional
66

77
import httpx
88

@@ -20,6 +20,8 @@
2020
from ..pagination import SyncGatewayConfigsCursorIDPage, AsyncGatewayConfigsCursorIDPage
2121
from .._base_client import AsyncPaginator, make_request_options
2222
from ..types.gateway_config_view import GatewayConfigView
23+
from ..types.shared_params.custom_header import CustomHeader
24+
from ..types.shared_params.auth_mechanism import AuthMechanism
2325

2426
__all__ = ["GatewayConfigsResource", "AsyncGatewayConfigsResource"]
2527

@@ -47,9 +49,10 @@ def with_streaming_response(self) -> GatewayConfigsResourceWithStreamingResponse
4749
def create(
4850
self,
4951
*,
50-
auth_mechanism: gateway_config_create_params.AuthMechanism,
52+
auth_mechanism: AuthMechanism,
5153
endpoint: str,
5254
name: str,
55+
custom_headers: Optional[Iterable[CustomHeader]] | Omit = omit,
5356
description: Optional[str] | Omit = omit,
5457
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
5558
# The extra values given here take precedence over values defined on the client or passed to this method.
@@ -73,6 +76,9 @@ def create(
7376
name: The human-readable name for the GatewayConfig. Must be unique within your
7477
account.
7578
79+
custom_headers: Additional headers applied to proxied requests after the auth mechanism. At most
80+
8 entries.
81+
7682
description: Optional description for this gateway configuration.
7783
7884
extra_headers: Send extra headers
@@ -92,6 +98,7 @@ def create(
9298
"auth_mechanism": auth_mechanism,
9399
"endpoint": endpoint,
94100
"name": name,
101+
"custom_headers": custom_headers,
95102
"description": description,
96103
},
97104
gateway_config_create_params.GatewayConfigCreateParams,
@@ -143,7 +150,8 @@ def update(
143150
self,
144151
id: str,
145152
*,
146-
auth_mechanism: Optional[gateway_config_update_params.AuthMechanism] | Omit = omit,
153+
auth_mechanism: Optional[AuthMechanism] | Omit = omit,
154+
custom_headers: Optional[Iterable[CustomHeader]] | Omit = omit,
147155
description: Optional[str] | Omit = omit,
148156
endpoint: Optional[str] | Omit = omit,
149157
name: Optional[str] | Omit = omit,
@@ -160,8 +168,11 @@ def update(
160168
All fields are optional.
161169
162170
Args:
163-
auth_mechanism: Defines how credentials are applied to HTTP requests when proxying through the
164-
gateway.
171+
auth_mechanism: Defines how the primary credential is applied to requests proxied to the
172+
upstream.
173+
174+
custom_headers: New list of additional headers. Replaces the existing list entirely; use an
175+
empty list to clear all custom headers. At most 8 entries.
165176
166177
description: New description for this gateway configuration.
167178
@@ -186,6 +197,7 @@ def update(
186197
body=maybe_transform(
187198
{
188199
"auth_mechanism": auth_mechanism,
200+
"custom_headers": custom_headers,
189201
"description": description,
190202
"endpoint": endpoint,
191203
"name": name,
@@ -332,9 +344,10 @@ def with_streaming_response(self) -> AsyncGatewayConfigsResourceWithStreamingRes
332344
async def create(
333345
self,
334346
*,
335-
auth_mechanism: gateway_config_create_params.AuthMechanism,
347+
auth_mechanism: AuthMechanism,
336348
endpoint: str,
337349
name: str,
350+
custom_headers: Optional[Iterable[CustomHeader]] | Omit = omit,
338351
description: Optional[str] | Omit = omit,
339352
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
340353
# The extra values given here take precedence over values defined on the client or passed to this method.
@@ -358,6 +371,9 @@ async def create(
358371
name: The human-readable name for the GatewayConfig. Must be unique within your
359372
account.
360373
374+
custom_headers: Additional headers applied to proxied requests after the auth mechanism. At most
375+
8 entries.
376+
361377
description: Optional description for this gateway configuration.
362378
363379
extra_headers: Send extra headers
@@ -377,6 +393,7 @@ async def create(
377393
"auth_mechanism": auth_mechanism,
378394
"endpoint": endpoint,
379395
"name": name,
396+
"custom_headers": custom_headers,
380397
"description": description,
381398
},
382399
gateway_config_create_params.GatewayConfigCreateParams,
@@ -428,7 +445,8 @@ async def update(
428445
self,
429446
id: str,
430447
*,
431-
auth_mechanism: Optional[gateway_config_update_params.AuthMechanism] | Omit = omit,
448+
auth_mechanism: Optional[AuthMechanism] | Omit = omit,
449+
custom_headers: Optional[Iterable[CustomHeader]] | Omit = omit,
432450
description: Optional[str] | Omit = omit,
433451
endpoint: Optional[str] | Omit = omit,
434452
name: Optional[str] | Omit = omit,
@@ -445,8 +463,11 @@ async def update(
445463
All fields are optional.
446464
447465
Args:
448-
auth_mechanism: Defines how credentials are applied to HTTP requests when proxying through the
449-
gateway.
466+
auth_mechanism: Defines how the primary credential is applied to requests proxied to the
467+
upstream.
468+
469+
custom_headers: New list of additional headers. Replaces the existing list entirely; use an
470+
empty list to clear all custom headers. At most 8 entries.
450471
451472
description: New description for this gateway configuration.
452473
@@ -471,6 +492,7 @@ async def update(
471492
body=await async_maybe_transform(
472493
{
473494
"auth_mechanism": auth_mechanism,
495+
"custom_headers": custom_headers,
474496
"description": description,
475497
"endpoint": endpoint,
476498
"name": name,

0 commit comments

Comments
 (0)