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.14.1"
".": "1.15.0"
}
4 changes: 2 additions & 2 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -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-77cfebef736250545ee47fa63d2210f323f096f0cbff4194c4a460a4d0328fd3.yml
openapi_spec_hash: 33b5de41f43ca91cd3c745b048e68856
config_hash: 6649774d90af30c3559d6a242b6cb4b0
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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)
Expand Down
2 changes: 1 addition & 1 deletion api.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ Methods:
- <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="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_event_view.py">AxonEventView</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>

## Sql

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.14.1"
version = "1.15.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.14.1" # x-release-please-version
__version__ = "1.15.0" # x-release-please-version
26 changes: 23 additions & 3 deletions src/runloop_api_client/resources/axons/axons.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand All @@ -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
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand All @@ -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
Expand All @@ -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,
Expand Down
8 changes: 8 additions & 0 deletions src/runloop_api_client/resources/benchmark_runs.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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
Expand All @@ -131,6 +134,7 @@ def list(
"limit": limit,
"name": name,
"starting_after": starting_after,
"state": state,
},
benchmark_run_list_params.BenchmarkRunListParams,
),
Expand Down Expand Up @@ -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,
Expand All @@ -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
Expand All @@ -387,6 +394,7 @@ def list(
"limit": limit,
"name": name,
"starting_after": starting_after,
"state": state,
},
benchmark_run_list_params.BenchmarkRunListParams,
),
Expand Down
1 change: 1 addition & 0 deletions src/runloop_api_client/types/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
16 changes: 16 additions & 0 deletions src/runloop_api_client/types/axon_subscribe_sse_params.py
Original file line number Diff line number Diff line change
@@ -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.
"""
3 changes: 3 additions & 0 deletions src/runloop_api_client/types/benchmark_run_list_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"""
32 changes: 24 additions & 8 deletions tests/api_resources/test_axons.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"
Expand All @@ -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="",
)


Expand Down Expand Up @@ -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"
Expand All @@ -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"
Expand All @@ -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="",
)
2 changes: 2 additions & 0 deletions tests/api_resources/test_benchmark_runs.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"])

Expand Down Expand Up @@ -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"])

Expand Down