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.28.0"
".": "1.29.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: 120
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai/runloop-c1b0e0d2c2bf9d7888ddef0cfdfb390458875cd2c1feb48a06fcd06e92105326.yml
openapi_spec_hash: ec61cf6d205251b54e1a6d68d9dd9860
config_hash: 6d102da8b9fcc3d0deb42d7a707e78c6
configured_endpoints: 121
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai/runloop-f8c19bf9329a554bedfbb8678d6d3cb8881a285d27b3d8ba078e2a573b597a17.yml
openapi_spec_hash: 0c3d490050a9bbaa5cb7378bf55e8f37
config_hash: 7afcebea2dd638ed0cf0d5367f820f73
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,25 @@
# Changelog

## 1.29.0 (2026-08-20)

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

### Features

* **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))
* **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))
* **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))
* **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))
* **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))
* **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))
* **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))


### Bug Fixes

* **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))
* **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))

## 1.28.0 (2026-07-29)

Full Changelog: [v1.27.0...v1.28.0](https://github.com/runloopai/api-client-python/compare/v1.27.0...v1.28.0)
Expand Down
3 changes: 3 additions & 0 deletions api.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ from runloop_api_client.types import (
AfterIdle,
AgentMount,
AgentSource,
AuthMechanism,
BrokerMount,
CodeMountParameters,
CustomHeader,
LaunchParameters,
LifecycleConfiguration,
LifecycleHooks,
Expand Down Expand Up @@ -131,6 +133,7 @@ Methods:
- <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>
- <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>
- <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>
- <code title="delete /v1/axons/{id}">client.axons.<a href="./src/runloop_api_client/resources/axons/axons.py">delete</a>(id) -> object</code>
- <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>
- <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>

Expand Down
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.28.0"
version = "1.29.0"
description = "The official Python library for the runloop API"
dynamic = ["readme"]
license = "MIT"
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.28.0" # x-release-please-version
__version__ = "1.29.0" # x-release-please-version
92 changes: 92 additions & 0 deletions src/runloop_api_client/resources/axons/axons.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,46 @@ def list(
model=AxonView,
)

def delete(
self,
id: str,
*,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
idempotency_key: str | None = None,
) -> object:
"""
[Beta] Mark an axon deleted.

Args:
extra_headers: Send extra headers

extra_query: Add additional query parameters to the request

extra_body: Add additional JSON properties to the request

timeout: Override the client-level default timeout for this request, in seconds

idempotency_key: Specify a custom idempotency key for this request
"""
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return self._delete(
path_template("/v1/axons/{id}", id=id),
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
extra_body=extra_body,
timeout=timeout,
idempotency_key=idempotency_key,
),
cast_to=object,
)

def publish(
self,
id: str,
Expand Down Expand Up @@ -485,6 +525,46 @@ def list(
model=AxonView,
)

async def delete(
self,
id: str,
*,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
extra_headers: Headers | None = None,
extra_query: Query | None = None,
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = not_given,
idempotency_key: str | None = None,
) -> object:
"""
[Beta] Mark an axon deleted.

Args:
extra_headers: Send extra headers

extra_query: Add additional query parameters to the request

extra_body: Add additional JSON properties to the request

timeout: Override the client-level default timeout for this request, in seconds

idempotency_key: Specify a custom idempotency key for this request
"""
if not id:
raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
return await self._delete(
path_template("/v1/axons/{id}", id=id),
options=make_request_options(
extra_headers=extra_headers,
extra_query=extra_query,
extra_body=extra_body,
timeout=timeout,
idempotency_key=idempotency_key,
),
cast_to=object,
)

async def publish(
self,
id: str,
Expand Down Expand Up @@ -607,6 +687,9 @@ def __init__(self, axons: AxonsResource) -> None:
self.list = to_raw_response_wrapper(
axons.list,
)
self.delete = to_raw_response_wrapper(
axons.delete,
)
self.publish = to_raw_response_wrapper(
axons.publish,
)
Expand Down Expand Up @@ -636,6 +719,9 @@ def __init__(self, axons: AsyncAxonsResource) -> None:
self.list = async_to_raw_response_wrapper(
axons.list,
)
self.delete = async_to_raw_response_wrapper(
axons.delete,
)
self.publish = async_to_raw_response_wrapper(
axons.publish,
)
Expand Down Expand Up @@ -665,6 +751,9 @@ def __init__(self, axons: AxonsResource) -> None:
self.list = to_streamed_response_wrapper(
axons.list,
)
self.delete = to_streamed_response_wrapper(
axons.delete,
)
self.publish = to_streamed_response_wrapper(
axons.publish,
)
Expand Down Expand Up @@ -694,6 +783,9 @@ def __init__(self, axons: AsyncAxonsResource) -> None:
self.list = async_to_streamed_response_wrapper(
axons.list,
)
self.delete = async_to_streamed_response_wrapper(
axons.delete,
)
self.publish = async_to_streamed_response_wrapper(
axons.publish,
)
Expand Down
26 changes: 16 additions & 10 deletions src/runloop_api_client/resources/devboxes/devboxes.py
Original file line number Diff line number Diff line change
Expand Up @@ -338,14 +338,17 @@ def update(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
idempotency_key: str | None = None,
) -> DevboxView:
"""
Updates a devbox by doing a complete update the existing name,metadata fields.
It does not patch partial values.
"""Updates the specified Devbox fields.

Omitted fields are left unchanged. An empty
name clears the name, and an empty metadata map clears the metadata.

Args:
metadata: User defined metadata to attach to the devbox for organization.
metadata: User defined metadata to replace the Devbox metadata. Omit to leave unchanged or
set to an empty map to clear it.

name: (Optional) A user specified name to give the Devbox.
name: A user specified name to give the Devbox. Omit to leave unchanged or set to an
empty string to clear it.

extra_headers: Send extra headers

Expand Down Expand Up @@ -2188,14 +2191,17 @@ async def update(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
idempotency_key: str | None = None,
) -> DevboxView:
"""
Updates a devbox by doing a complete update the existing name,metadata fields.
It does not patch partial values.
"""Updates the specified Devbox fields.

Omitted fields are left unchanged. An empty
name clears the name, and an empty metadata map clears the metadata.

Args:
metadata: User defined metadata to attach to the devbox for organization.
metadata: User defined metadata to replace the Devbox metadata. Omit to leave unchanged or
set to an empty map to clear it.

name: (Optional) A user specified name to give the Devbox.
name: A user specified name to give the Devbox. Omit to leave unchanged or set to an
empty string to clear it.

extra_headers: Send extra headers

Expand Down
40 changes: 31 additions & 9 deletions src/runloop_api_client/resources/gateway_configs.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from __future__ import annotations

from typing import Optional
from typing import Iterable, Optional

import httpx

Expand All @@ -20,6 +20,8 @@
from ..pagination import SyncGatewayConfigsCursorIDPage, AsyncGatewayConfigsCursorIDPage
from .._base_client import AsyncPaginator, make_request_options
from ..types.gateway_config_view import GatewayConfigView
from ..types.shared_params.custom_header import CustomHeader
from ..types.shared_params.auth_mechanism import AuthMechanism

__all__ = ["GatewayConfigsResource", "AsyncGatewayConfigsResource"]

Expand Down Expand Up @@ -47,9 +49,10 @@ def with_streaming_response(self) -> GatewayConfigsResourceWithStreamingResponse
def create(
self,
*,
auth_mechanism: gateway_config_create_params.AuthMechanism,
auth_mechanism: AuthMechanism,
endpoint: str,
name: str,
custom_headers: Optional[Iterable[CustomHeader]] | Omit = omit,
description: Optional[str] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
Expand All @@ -73,6 +76,9 @@ def create(
name: The human-readable name for the GatewayConfig. Must be unique within your
account.

custom_headers: Additional headers applied to proxied requests after the auth mechanism. At most
8 entries.

description: Optional description for this gateway configuration.

extra_headers: Send extra headers
Expand All @@ -92,6 +98,7 @@ def create(
"auth_mechanism": auth_mechanism,
"endpoint": endpoint,
"name": name,
"custom_headers": custom_headers,
"description": description,
},
gateway_config_create_params.GatewayConfigCreateParams,
Expand Down Expand Up @@ -143,7 +150,8 @@ def update(
self,
id: str,
*,
auth_mechanism: Optional[gateway_config_update_params.AuthMechanism] | Omit = omit,
auth_mechanism: Optional[AuthMechanism] | Omit = omit,
custom_headers: Optional[Iterable[CustomHeader]] | Omit = omit,
description: Optional[str] | Omit = omit,
endpoint: Optional[str] | Omit = omit,
name: Optional[str] | Omit = omit,
Expand All @@ -160,8 +168,11 @@ def update(
All fields are optional.

Args:
auth_mechanism: Defines how credentials are applied to HTTP requests when proxying through the
gateway.
auth_mechanism: Defines how the primary credential is applied to requests proxied to the
upstream.

custom_headers: New list of additional headers. Replaces the existing list entirely; use an
empty list to clear all custom headers. At most 8 entries.

description: New description for this gateway configuration.

Expand All @@ -186,6 +197,7 @@ def update(
body=maybe_transform(
{
"auth_mechanism": auth_mechanism,
"custom_headers": custom_headers,
"description": description,
"endpoint": endpoint,
"name": name,
Expand Down Expand Up @@ -332,9 +344,10 @@ def with_streaming_response(self) -> AsyncGatewayConfigsResourceWithStreamingRes
async def create(
self,
*,
auth_mechanism: gateway_config_create_params.AuthMechanism,
auth_mechanism: AuthMechanism,
endpoint: str,
name: str,
custom_headers: Optional[Iterable[CustomHeader]] | Omit = omit,
description: Optional[str] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
# The extra values given here take precedence over values defined on the client or passed to this method.
Expand All @@ -358,6 +371,9 @@ async def create(
name: The human-readable name for the GatewayConfig. Must be unique within your
account.

custom_headers: Additional headers applied to proxied requests after the auth mechanism. At most
8 entries.

description: Optional description for this gateway configuration.

extra_headers: Send extra headers
Expand All @@ -377,6 +393,7 @@ async def create(
"auth_mechanism": auth_mechanism,
"endpoint": endpoint,
"name": name,
"custom_headers": custom_headers,
"description": description,
},
gateway_config_create_params.GatewayConfigCreateParams,
Expand Down Expand Up @@ -428,7 +445,8 @@ async def update(
self,
id: str,
*,
auth_mechanism: Optional[gateway_config_update_params.AuthMechanism] | Omit = omit,
auth_mechanism: Optional[AuthMechanism] | Omit = omit,
custom_headers: Optional[Iterable[CustomHeader]] | Omit = omit,
description: Optional[str] | Omit = omit,
endpoint: Optional[str] | Omit = omit,
name: Optional[str] | Omit = omit,
Expand All @@ -445,8 +463,11 @@ async def update(
All fields are optional.

Args:
auth_mechanism: Defines how credentials are applied to HTTP requests when proxying through the
gateway.
auth_mechanism: Defines how the primary credential is applied to requests proxied to the
upstream.

custom_headers: New list of additional headers. Replaces the existing list entirely; use an
empty list to clear all custom headers. At most 8 entries.

description: New description for this gateway configuration.

Expand All @@ -471,6 +492,7 @@ async def update(
body=await async_maybe_transform(
{
"auth_mechanism": auth_mechanism,
"custom_headers": custom_headers,
"description": description,
"endpoint": endpoint,
"name": name,
Expand Down
Loading