From 08e6a2543fbac1d20d2f8c1c51b34c989a622003 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Wed, 1 Apr 2026 22:42:30 +0000
Subject: [PATCH 1/3] feat(benchmark-runs): add state filter and multi-value
benchmark_id support to listBenchmarkRuns (#8480)
---
.stats.yml | 4 ++--
src/runloop_api_client/resources/benchmark_runs.py | 8 ++++++++
src/runloop_api_client/types/benchmark_run_list_params.py | 3 +++
tests/api_resources/test_benchmark_runs.py | 2 ++
4 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 8eb4b3559..f073b28c0 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 116
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-c33fa67077f6f9cc8cb6d82a71657693f7288e1eff48b7b94099f2f11966b67b.yml
-openapi_spec_hash: 4329105152eb16bc5d2063038603ea61
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-8ea4486cd6de6410a6648545710d617f175994f8d12753783585029ce22c225c.yml
+openapi_spec_hash: fcb07ce127f4290f1dac51db130365aa
config_hash: 6649774d90af30c3559d6a242b6cb4b0
diff --git a/src/runloop_api_client/resources/benchmark_runs.py b/src/runloop_api_client/resources/benchmark_runs.py
index 27e327d3d..66513a855 100644
--- a/src/runloop_api_client/resources/benchmark_runs.py
+++ b/src/runloop_api_client/resources/benchmark_runs.py
@@ -86,6 +86,7 @@ def list(
limit: int | Omit = omit,
name: str | Omit = omit,
starting_after: str | Omit = omit,
+ state: 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.
extra_headers: Headers | None = None,
@@ -108,6 +109,8 @@ def list(
starting_after: Load the next page of data starting after the item with the given ID.
+ state: Filter by state
+
extra_headers: Send extra headers
extra_query: Add additional query parameters to the request
@@ -131,6 +134,7 @@ def list(
"limit": limit,
"name": name,
"starting_after": starting_after,
+ "state": state,
},
benchmark_run_list_params.BenchmarkRunListParams,
),
@@ -342,6 +346,7 @@ def list(
limit: int | Omit = omit,
name: str | Omit = omit,
starting_after: str | Omit = omit,
+ state: 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.
extra_headers: Headers | None = None,
@@ -364,6 +369,8 @@ def list(
starting_after: Load the next page of data starting after the item with the given ID.
+ state: Filter by state
+
extra_headers: Send extra headers
extra_query: Add additional query parameters to the request
@@ -387,6 +394,7 @@ def list(
"limit": limit,
"name": name,
"starting_after": starting_after,
+ "state": state,
},
benchmark_run_list_params.BenchmarkRunListParams,
),
diff --git a/src/runloop_api_client/types/benchmark_run_list_params.py b/src/runloop_api_client/types/benchmark_run_list_params.py
index 4f4c8a550..73106e240 100644
--- a/src/runloop_api_client/types/benchmark_run_list_params.py
+++ b/src/runloop_api_client/types/benchmark_run_list_params.py
@@ -25,3 +25,6 @@ class BenchmarkRunListParams(TypedDict, total=False):
starting_after: str
"""Load the next page of data starting after the item with the given ID."""
+
+ state: str
+ """Filter by state"""
diff --git a/tests/api_resources/test_benchmark_runs.py b/tests/api_resources/test_benchmark_runs.py
index 5e8709aff..68e0df609 100644
--- a/tests/api_resources/test_benchmark_runs.py
+++ b/tests/api_resources/test_benchmark_runs.py
@@ -72,6 +72,7 @@ def test_method_list_with_all_params(self, client: Runloop) -> None:
limit=0,
name="name",
starting_after="starting_after",
+ state="state",
)
assert_matches_type(SyncBenchmarkRunsCursorIDPage[BenchmarkRunView], benchmark_run, path=["response"])
@@ -277,6 +278,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncRunloop) ->
limit=0,
name="name",
starting_after="starting_after",
+ state="state",
)
assert_matches_type(AsyncBenchmarkRunsCursorIDPage[BenchmarkRunView], benchmark_run, path=["response"])
From 454cce48cf22ba3466f4063d58af4650b9b84322 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 2 Apr 2026 02:59:31 +0000
Subject: [PATCH 2/3] fix: Add after_sequence param to axon subscribe (#8497)
---
.stats.yml | 4 +--
api.md | 2 +-
.../resources/axons/axons.py | 26 +++++++++++++--
src/runloop_api_client/types/__init__.py | 1 +
.../types/axon_subscribe_sse_params.py | 16 ++++++++++
tests/api_resources/test_axons.py | 32 ++++++++++++++-----
6 files changed, 67 insertions(+), 14 deletions(-)
create mode 100644 src/runloop_api_client/types/axon_subscribe_sse_params.py
diff --git a/.stats.yml b/.stats.yml
index f073b28c0..9fbd8d524 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 116
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-8ea4486cd6de6410a6648545710d617f175994f8d12753783585029ce22c225c.yml
-openapi_spec_hash: fcb07ce127f4290f1dac51db130365aa
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-77cfebef736250545ee47fa63d2210f323f096f0cbff4194c4a460a4d0328fd3.yml
+openapi_spec_hash: 33b5de41f43ca91cd3c745b048e68856
config_hash: 6649774d90af30c3559d6a242b6cb4b0
diff --git a/api.md b/api.md
index 135eb6e8f..45195581b 100644
--- a/api.md
+++ b/api.md
@@ -109,7 +109,7 @@ Methods:
- client.axons.retrieve(id) -> AxonView
- client.axons.list(\*\*params) -> SyncAxonsCursorIDPage[AxonView]
- client.axons.publish(id, \*\*params) -> PublishResultView
-- client.axons.subscribe_sse(id) -> AxonEventView
+- client.axons.subscribe_sse(id, \*\*params) -> AxonEventView
## Sql
diff --git a/src/runloop_api_client/resources/axons/axons.py b/src/runloop_api_client/resources/axons/axons.py
index 54f4cb9ff..977d2dd93 100644
--- a/src/runloop_api_client/resources/axons/axons.py
+++ b/src/runloop_api_client/resources/axons/axons.py
@@ -15,7 +15,7 @@
SqlResourceWithStreamingResponse,
AsyncSqlResourceWithStreamingResponse,
)
-from ...types import axon_list_params, axon_create_params, axon_publish_params
+from ...types import axon_list_params, axon_create_params, axon_publish_params, axon_subscribe_sse_params
from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
from ..._utils import path_template, maybe_transform, async_maybe_transform
from ..._compat import cached_property
@@ -259,6 +259,7 @@ def subscribe_sse(
self,
id: str,
*,
+ after_sequence: int | 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.
extra_headers: Headers | None = None,
@@ -270,6 +271,9 @@ def subscribe_sse(
[Beta] Subscribe to an axon event stream via server-sent events.
Args:
+ after_sequence: Sequence number after which to start streaming. Events with sequence > this
+ value are returned. If unset, replay from the beginning.
+
extra_headers: Send extra headers
extra_query: Add additional query parameters to the request
@@ -285,7 +289,13 @@ def subscribe_sse(
return self._get(
path_template("/v1/axons/{id}/subscribe/sse", id=id),
options=make_request_options(
- extra_headers=merged_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ extra_headers=merged_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=maybe_transform(
+ {"after_sequence": after_sequence}, axon_subscribe_sse_params.AxonSubscribeSseParams
+ ),
),
cast_to=AxonEventView,
stream=True,
@@ -516,6 +526,7 @@ async def subscribe_sse(
self,
id: str,
*,
+ after_sequence: int | 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.
extra_headers: Headers | None = None,
@@ -527,6 +538,9 @@ async def subscribe_sse(
[Beta] Subscribe to an axon event stream via server-sent events.
Args:
+ after_sequence: Sequence number after which to start streaming. Events with sequence > this
+ value are returned. If unset, replay from the beginning.
+
extra_headers: Send extra headers
extra_query: Add additional query parameters to the request
@@ -542,7 +556,13 @@ async def subscribe_sse(
return await self._get(
path_template("/v1/axons/{id}/subscribe/sse", id=id),
options=make_request_options(
- extra_headers=merged_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
+ extra_headers=merged_headers,
+ extra_query=extra_query,
+ extra_body=extra_body,
+ timeout=timeout,
+ query=await async_maybe_transform(
+ {"after_sequence": after_sequence}, axon_subscribe_sse_params.AxonSubscribeSseParams
+ ),
),
cast_to=AxonEventView,
stream=True,
diff --git a/src/runloop_api_client/types/__init__.py b/src/runloop_api_client/types/__init__.py
index 185e66268..da2236119 100644
--- a/src/runloop_api_client/types/__init__.py
+++ b/src/runloop_api_client/types/__init__.py
@@ -82,6 +82,7 @@
from .mcp_config_update_params import McpConfigUpdateParams as McpConfigUpdateParams
from .network_policy_list_view import NetworkPolicyListView as NetworkPolicyListView
from .object_download_url_view import ObjectDownloadURLView as ObjectDownloadURLView
+from .axon_subscribe_sse_params import AxonSubscribeSseParams as AxonSubscribeSseParams
from .benchmark_job_list_params import BenchmarkJobListParams as BenchmarkJobListParams
from .benchmark_run_list_params import BenchmarkRunListParams as BenchmarkRunListParams
from .devbox_send_std_in_result import DevboxSendStdInResult as DevboxSendStdInResult
diff --git a/src/runloop_api_client/types/axon_subscribe_sse_params.py b/src/runloop_api_client/types/axon_subscribe_sse_params.py
new file mode 100644
index 000000000..7a141b257
--- /dev/null
+++ b/src/runloop_api_client/types/axon_subscribe_sse_params.py
@@ -0,0 +1,16 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import TypedDict
+
+__all__ = ["AxonSubscribeSseParams"]
+
+
+class AxonSubscribeSseParams(TypedDict, total=False):
+ after_sequence: int
+ """Sequence number after which to start streaming.
+
+ Events with sequence > this value are returned. If unset, replay from the
+ beginning.
+ """
diff --git a/tests/api_resources/test_axons.py b/tests/api_resources/test_axons.py
index ab076037a..540fc4baa 100644
--- a/tests/api_resources/test_axons.py
+++ b/tests/api_resources/test_axons.py
@@ -184,14 +184,22 @@ def test_path_params_publish(self, client: Runloop) -> None:
@parametrize
def test_method_subscribe_sse(self, client: Runloop) -> None:
axon_stream = client.axons.subscribe_sse(
- "id",
+ id="id",
+ )
+ axon_stream.response.close()
+
+ @parametrize
+ def test_method_subscribe_sse_with_all_params(self, client: Runloop) -> None:
+ axon_stream = client.axons.subscribe_sse(
+ id="id",
+ after_sequence=0,
)
axon_stream.response.close()
@parametrize
def test_raw_response_subscribe_sse(self, client: Runloop) -> None:
response = client.axons.with_raw_response.subscribe_sse(
- "id",
+ id="id",
)
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -201,7 +209,7 @@ def test_raw_response_subscribe_sse(self, client: Runloop) -> None:
@parametrize
def test_streaming_response_subscribe_sse(self, client: Runloop) -> None:
with client.axons.with_streaming_response.subscribe_sse(
- "id",
+ id="id",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -215,7 +223,7 @@ def test_streaming_response_subscribe_sse(self, client: Runloop) -> None:
def test_path_params_subscribe_sse(self, client: Runloop) -> None:
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
client.axons.with_raw_response.subscribe_sse(
- "",
+ id="",
)
@@ -387,14 +395,22 @@ async def test_path_params_publish(self, async_client: AsyncRunloop) -> None:
@parametrize
async def test_method_subscribe_sse(self, async_client: AsyncRunloop) -> None:
axon_stream = await async_client.axons.subscribe_sse(
- "id",
+ id="id",
+ )
+ await axon_stream.response.aclose()
+
+ @parametrize
+ async def test_method_subscribe_sse_with_all_params(self, async_client: AsyncRunloop) -> None:
+ axon_stream = await async_client.axons.subscribe_sse(
+ id="id",
+ after_sequence=0,
)
await axon_stream.response.aclose()
@parametrize
async def test_raw_response_subscribe_sse(self, async_client: AsyncRunloop) -> None:
response = await async_client.axons.with_raw_response.subscribe_sse(
- "id",
+ id="id",
)
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -404,7 +420,7 @@ async def test_raw_response_subscribe_sse(self, async_client: AsyncRunloop) -> N
@parametrize
async def test_streaming_response_subscribe_sse(self, async_client: AsyncRunloop) -> None:
async with async_client.axons.with_streaming_response.subscribe_sse(
- "id",
+ id="id",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -418,5 +434,5 @@ async def test_streaming_response_subscribe_sse(self, async_client: AsyncRunloop
async def test_path_params_subscribe_sse(self, async_client: AsyncRunloop) -> None:
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
await async_client.axons.with_raw_response.subscribe_sse(
- "",
+ id="",
)
From f623136e7f22b2a17bc4773e8ba694f15bbc822d Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 2 Apr 2026 02:59:53 +0000
Subject: [PATCH 3/3] release: 1.15.0
---
.release-please-manifest.json | 2 +-
CHANGELOG.md | 13 +++++++++++++
pyproject.toml | 2 +-
src/runloop_api_client/_version.py | 2 +-
4 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index a780111df..7ccfe12c9 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "1.14.1"
+ ".": "1.15.0"
}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bbd58820a..acce86aad 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,18 @@
# Changelog
+## 1.15.0 (2026-04-02)
+
+Full Changelog: [v1.14.1...v1.15.0](https://github.com/runloopai/api-client-python/compare/v1.14.1...v1.15.0)
+
+### Features
+
+* **benchmark-runs:** add state filter and multi-value benchmark_id support to listBenchmarkRuns ([#8480](https://github.com/runloopai/api-client-python/issues/8480)) ([08e6a25](https://github.com/runloopai/api-client-python/commit/08e6a2543fbac1d20d2f8c1c51b34c989a622003))
+
+
+### Bug Fixes
+
+* Add after_sequence param to axon subscribe ([#8497](https://github.com/runloopai/api-client-python/issues/8497)) ([454cce4](https://github.com/runloopai/api-client-python/commit/454cce48cf22ba3466f4063d58af4650b9b84322))
+
## 1.14.1 (2026-04-01)
Full Changelog: [v1.14.0...v1.14.1](https://github.com/runloopai/api-client-python/compare/v1.14.0...v1.14.1)
diff --git a/pyproject.toml b/pyproject.toml
index 6ca424c4e..87ca14cc9 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "runloop_api_client"
-version = "1.14.1"
+version = "1.15.0"
description = "The official Python library for the runloop API"
dynamic = ["readme"]
license = "MIT"
diff --git a/src/runloop_api_client/_version.py b/src/runloop_api_client/_version.py
index 0640f31e8..a6ed9953d 100644
--- a/src/runloop_api_client/_version.py
+++ b/src/runloop_api_client/_version.py
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
__title__ = "runloop_api_client"
-__version__ = "1.14.1" # x-release-please-version
+__version__ = "1.15.0" # x-release-please-version