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/.stats.yml b/.stats.yml index 8eb4b3559..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-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 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/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/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 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/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/__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/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_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="", ) 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"])