From ee5d5773d408ac8e61101fd0187ec071709bebab Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 19 Feb 2026 18:25:42 +0000
Subject: [PATCH 1/4] chore: format all `api.md` files
---
scripts/format | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scripts/format b/scripts/format
index 3f910b784..c8e1f69d2 100755
--- a/scripts/format
+++ b/scripts/format
@@ -11,4 +11,4 @@ uv run ruff check --fix .
uv run ruff format
echo "==> Formatting docs"
-uv run python scripts/utils/ruffen-docs.py README.md api.md README-SDK.md
+uv run python scripts/utils/ruffen-docs.py README.md $(find . -type f -name api.md)
From 8b16ebe7aba9f96592f03ed2844211209b35d9e6 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 19 Feb 2026 01:44:10 +0000
Subject: [PATCH 2/4] refactor: deprecate and make Nullable total_count and
remaining_count of ListViews (#7533)
---
.stats.yml | 4 +--
api.md | 2 +-
.../resources/devboxes/devboxes.py | 17 ++++++++--
src/runloop_api_client/types/__init__.py | 1 +
.../types/agent_list_view.py | 16 +++++++---
.../types/benchmark_job_list_view.py | 6 ++--
.../types/benchmark_run_list_view.py | 8 ++---
.../types/blueprint_list_view.py | 6 ++--
.../types/devbox_list_view.py | 6 ++--
.../types/devbox_shutdown_params.py | 12 +++++++
.../types/devbox_snapshot_list_view.py | 8 ++---
.../types/gateway_config_list_view.py | 9 ++++--
.../types/mcp_config_list_view.py | 9 ++++--
.../types/network_policy_list_view.py | 9 ++++--
.../types/object_list_view.py | 16 +++++++---
.../types/repository_connection_list_view.py | 8 ++---
.../types/scenario_definition_list_view.py | 8 ++---
.../types/scenario_run_list_view.py | 8 ++---
src/runloop_api_client/types/scenario_view.py | 3 ++
.../types/secret_list_view.py | 18 +++++++----
tests/api_resources/test_devboxes.py | 32 ++++++++++++++-----
21 files changed, 139 insertions(+), 67 deletions(-)
create mode 100644 src/runloop_api_client/types/devbox_shutdown_params.py
diff --git a/.stats.yml b/.stats.yml
index 3e985df2f..44040dae9 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 117
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-c8d61a0c8b88fa30666ba021d1239eb0d549902354513c4741e9216bcbfa8e6d.yml
-openapi_spec_hash: 433e6fb4ce076012b696f69ae7596c67
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-8704a652545c3831c8b7e246ec17f1a626b59911eb5701ddc922ca6cae1c8d57.yml
+openapi_spec_hash: e609bc5ed3fdce498bc7d16921bbba5e
config_hash: eb28692edd68a6ae95cf92af931c9976
diff --git a/api.md b/api.md
index 6cbe1e604..2c8438e72 100644
--- a/api.md
+++ b/api.md
@@ -160,7 +160,7 @@ Methods:
- client.devboxes.remove_tunnel(id, \*\*params) -> object
- client.devboxes.resume(id) -> DevboxView
- client.devboxes.retrieve_resource_usage(id) -> DevboxResourceUsageView
-- client.devboxes.shutdown(id) -> DevboxView
+- client.devboxes.shutdown(id, \*\*params) -> DevboxView
- client.devboxes.snapshot_disk(id, \*\*params) -> DevboxSnapshotView
- client.devboxes.snapshot_disk_async(id, \*\*params) -> DevboxSnapshotView
- client.devboxes.suspend(id) -> DevboxView
diff --git a/src/runloop_api_client/resources/devboxes/devboxes.py b/src/runloop_api_client/resources/devboxes/devboxes.py
index 79ac29f11..84a286521 100644
--- a/src/runloop_api_client/resources/devboxes/devboxes.py
+++ b/src/runloop_api_client/resources/devboxes/devboxes.py
@@ -24,6 +24,7 @@
devbox_create_params,
devbox_update_params,
devbox_execute_params,
+ devbox_shutdown_params,
devbox_upload_file_params,
devbox_execute_sync_params,
devbox_create_tunnel_params,
@@ -1415,6 +1416,7 @@ def shutdown(
self,
id: str,
*,
+ force: 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,
@@ -1427,9 +1429,13 @@ def shutdown(
This will permanently stop the Devbox. If you want to
save the state of the Devbox, you should take a snapshot before shutting down or
- should suspend the Devbox instead of shutting down.
+ should suspend the Devbox instead of shutting down. If the Devbox has any
+ in-progress snapshots, the shutdown will be rejected with a 409 Conflict unless
+ force=true is specified.
Args:
+ force: If true, force shutdown even if snapshots are in progress. Defaults to false.
+
extra_headers: Send extra headers
extra_query: Add additional query parameters to the request
@@ -1450,6 +1456,7 @@ def shutdown(
extra_body=extra_body,
timeout=timeout,
idempotency_key=idempotency_key,
+ query=maybe_transform({"force": force}, devbox_shutdown_params.DevboxShutdownParams),
),
cast_to=DevboxView,
)
@@ -3077,6 +3084,7 @@ async def shutdown(
self,
id: str,
*,
+ force: 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,
@@ -3089,9 +3097,13 @@ async def shutdown(
This will permanently stop the Devbox. If you want to
save the state of the Devbox, you should take a snapshot before shutting down or
- should suspend the Devbox instead of shutting down.
+ should suspend the Devbox instead of shutting down. If the Devbox has any
+ in-progress snapshots, the shutdown will be rejected with a 409 Conflict unless
+ force=true is specified.
Args:
+ force: If true, force shutdown even if snapshots are in progress. Defaults to false.
+
extra_headers: Send extra headers
extra_query: Add additional query parameters to the request
@@ -3112,6 +3124,7 @@ async def shutdown(
extra_body=extra_body,
timeout=timeout,
idempotency_key=idempotency_key,
+ query=await async_maybe_transform({"force": force}, devbox_shutdown_params.DevboxShutdownParams),
),
cast_to=DevboxView,
)
diff --git a/src/runloop_api_client/types/__init__.py b/src/runloop_api_client/types/__init__.py
index e6543484f..2cd10b43d 100644
--- a/src/runloop_api_client/types/__init__.py
+++ b/src/runloop_api_client/types/__init__.py
@@ -55,6 +55,7 @@
from .blueprint_list_params import BlueprintListParams as BlueprintListParams
from .devbox_execute_params import DevboxExecuteParams as DevboxExecuteParams
from .blueprint_preview_view import BlueprintPreviewView as BlueprintPreviewView
+from .devbox_shutdown_params import DevboxShutdownParams as DevboxShutdownParams
from .mcp_config_list_params import McpConfigListParams as McpConfigListParams
from .object_download_params import ObjectDownloadParams as ObjectDownloadParams
from .repository_list_params import RepositoryListParams as RepositoryListParams
diff --git a/src/runloop_api_client/types/agent_list_view.py b/src/runloop_api_client/types/agent_list_view.py
index bfb1560e1..9e57a9769 100644
--- a/src/runloop_api_client/types/agent_list_view.py
+++ b/src/runloop_api_client/types/agent_list_view.py
@@ -1,6 +1,6 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List
+from typing import List, Optional
from .._models import BaseModel
from .agent_view import AgentView
@@ -17,8 +17,14 @@ class AgentListView(BaseModel):
has_more: bool
"""Whether there are more Agents to fetch."""
- remaining_count: int
- """The count of remaining Agents."""
+ remaining_count: Optional[int] = None
+ """The count of remaining Agents.
- total_count: int
- """The total count of Agents."""
+ Deprecated: will be removed in a future breaking change.
+ """
+
+ total_count: Optional[int] = None
+ """The total count of Agents.
+
+ Deprecated: will be removed in a future breaking change.
+ """
diff --git a/src/runloop_api_client/types/benchmark_job_list_view.py b/src/runloop_api_client/types/benchmark_job_list_view.py
index 5090fe8e8..f0e1da7d0 100644
--- a/src/runloop_api_client/types/benchmark_job_list_view.py
+++ b/src/runloop_api_client/types/benchmark_job_list_view.py
@@ -1,6 +1,6 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List
+from typing import List, Optional
from .._models import BaseModel
from .benchmark_job_view import BenchmarkJobView
@@ -14,6 +14,6 @@ class BenchmarkJobListView(BaseModel):
jobs: List[BenchmarkJobView]
"""List of BenchmarkJobs matching filter."""
- remaining_count: int
+ remaining_count: Optional[int] = None
- total_count: int
+ total_count: Optional[int] = None
diff --git a/src/runloop_api_client/types/benchmark_run_list_view.py b/src/runloop_api_client/types/benchmark_run_list_view.py
index 0d0ca11e1..e85506bab 100644
--- a/src/runloop_api_client/types/benchmark_run_list_view.py
+++ b/src/runloop_api_client/types/benchmark_run_list_view.py
@@ -1,6 +1,6 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List
+from typing import List, Optional
from .._models import BaseModel
from .benchmark_run_view import BenchmarkRunView
@@ -11,9 +11,9 @@
class BenchmarkRunListView(BaseModel):
has_more: bool
- remaining_count: int
-
runs: List[BenchmarkRunView]
"""List of BenchmarkRuns matching filter."""
- total_count: int
+ remaining_count: Optional[int] = None
+
+ total_count: Optional[int] = None
diff --git a/src/runloop_api_client/types/blueprint_list_view.py b/src/runloop_api_client/types/blueprint_list_view.py
index ba7c6066f..7d97314f5 100644
--- a/src/runloop_api_client/types/blueprint_list_view.py
+++ b/src/runloop_api_client/types/blueprint_list_view.py
@@ -1,6 +1,6 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List
+from typing import List, Optional
from .._models import BaseModel
from .blueprint_view import BlueprintView
@@ -14,6 +14,6 @@ class BlueprintListView(BaseModel):
has_more: bool
- remaining_count: int
+ remaining_count: Optional[int] = None
- total_count: int
+ total_count: Optional[int] = None
diff --git a/src/runloop_api_client/types/devbox_list_view.py b/src/runloop_api_client/types/devbox_list_view.py
index f4f266240..6bd522ee5 100644
--- a/src/runloop_api_client/types/devbox_list_view.py
+++ b/src/runloop_api_client/types/devbox_list_view.py
@@ -1,6 +1,6 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List
+from typing import List, Optional
from .._models import BaseModel
from .devbox_view import DevboxView
@@ -14,6 +14,6 @@ class DevboxListView(BaseModel):
has_more: bool
- remaining_count: int
+ remaining_count: Optional[int] = None
- total_count: int
+ total_count: Optional[int] = None
diff --git a/src/runloop_api_client/types/devbox_shutdown_params.py b/src/runloop_api_client/types/devbox_shutdown_params.py
new file mode 100644
index 000000000..1a6af9336
--- /dev/null
+++ b/src/runloop_api_client/types/devbox_shutdown_params.py
@@ -0,0 +1,12 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import TypedDict
+
+__all__ = ["DevboxShutdownParams"]
+
+
+class DevboxShutdownParams(TypedDict, total=False):
+ force: str
+ """If true, force shutdown even if snapshots are in progress. Defaults to false."""
diff --git a/src/runloop_api_client/types/devbox_snapshot_list_view.py b/src/runloop_api_client/types/devbox_snapshot_list_view.py
index 3e687f0cc..ca54f2eb1 100644
--- a/src/runloop_api_client/types/devbox_snapshot_list_view.py
+++ b/src/runloop_api_client/types/devbox_snapshot_list_view.py
@@ -1,6 +1,6 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List
+from typing import List, Optional
from .._models import BaseModel
from .devbox_snapshot_view import DevboxSnapshotView
@@ -11,9 +11,9 @@
class DevboxSnapshotListView(BaseModel):
has_more: bool
- remaining_count: int
-
snapshots: List[DevboxSnapshotView]
"""List of snapshots matching filter."""
- total_count: int
+ remaining_count: Optional[int] = None
+
+ total_count: Optional[int] = None
diff --git a/src/runloop_api_client/types/gateway_config_list_view.py b/src/runloop_api_client/types/gateway_config_list_view.py
index 77fce4455..05511971f 100644
--- a/src/runloop_api_client/types/gateway_config_list_view.py
+++ b/src/runloop_api_client/types/gateway_config_list_view.py
@@ -1,6 +1,6 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List
+from typing import List, Optional
from .._models import BaseModel
from .gateway_config_view import GatewayConfigView
@@ -17,5 +17,8 @@ class GatewayConfigListView(BaseModel):
has_more: bool
"""Whether there are more results available beyond this page."""
- total_count: int
- """Total count of GatewayConfigs that match the query."""
+ total_count: Optional[int] = None
+ """Total count of GatewayConfigs that match the query.
+
+ Deprecated: will be removed in a future breaking change.
+ """
diff --git a/src/runloop_api_client/types/mcp_config_list_view.py b/src/runloop_api_client/types/mcp_config_list_view.py
index 72075a255..4992698c5 100644
--- a/src/runloop_api_client/types/mcp_config_list_view.py
+++ b/src/runloop_api_client/types/mcp_config_list_view.py
@@ -1,6 +1,6 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List
+from typing import List, Optional
from .._models import BaseModel
from .mcp_config_view import McpConfigView
@@ -17,5 +17,8 @@ class McpConfigListView(BaseModel):
mcp_configs: List[McpConfigView]
"""The list of McpConfigs."""
- total_count: int
- """Total count of McpConfigs that match the query."""
+ total_count: Optional[int] = None
+ """Total count of McpConfigs that match the query.
+
+ Deprecated: will be removed in a future breaking change.
+ """
diff --git a/src/runloop_api_client/types/network_policy_list_view.py b/src/runloop_api_client/types/network_policy_list_view.py
index 17bc7868f..ba031d0a9 100644
--- a/src/runloop_api_client/types/network_policy_list_view.py
+++ b/src/runloop_api_client/types/network_policy_list_view.py
@@ -1,6 +1,6 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List
+from typing import List, Optional
from .._models import BaseModel
from .network_policy_view import NetworkPolicyView
@@ -17,5 +17,8 @@ class NetworkPolicyListView(BaseModel):
network_policies: List[NetworkPolicyView]
"""The list of NetworkPolicies."""
- total_count: int
- """Total count of items in this response."""
+ total_count: Optional[int] = None
+ """Total count of items in this response.
+
+ Deprecated: will be removed in a future breaking change.
+ """
diff --git a/src/runloop_api_client/types/object_list_view.py b/src/runloop_api_client/types/object_list_view.py
index cfd546c0c..689c0899b 100644
--- a/src/runloop_api_client/types/object_list_view.py
+++ b/src/runloop_api_client/types/object_list_view.py
@@ -1,6 +1,6 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List
+from typing import List, Optional
from .._models import BaseModel
from .object_view import ObjectView
@@ -17,8 +17,14 @@ class ObjectListView(BaseModel):
objects: List[ObjectView]
"""List of Object entities."""
- remaining_count: int
- """Number of Objects remaining after this page."""
+ remaining_count: Optional[int] = None
+ """Number of Objects remaining after this page.
- total_count: int
- """Total number of Objects across all pages."""
+ Deprecated: will be removed in a future breaking change.
+ """
+
+ total_count: Optional[int] = None
+ """Total number of Objects across all pages.
+
+ Deprecated: will be removed in a future breaking change.
+ """
diff --git a/src/runloop_api_client/types/repository_connection_list_view.py b/src/runloop_api_client/types/repository_connection_list_view.py
index 8085c4718..eea040bc4 100644
--- a/src/runloop_api_client/types/repository_connection_list_view.py
+++ b/src/runloop_api_client/types/repository_connection_list_view.py
@@ -1,6 +1,6 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List
+from typing import List, Optional
from .._models import BaseModel
from .repository_connection_view import RepositoryConnectionView
@@ -11,9 +11,9 @@
class RepositoryConnectionListView(BaseModel):
has_more: bool
- remaining_count: int
-
repositories: List[RepositoryConnectionView]
"""List of repositories matching filter."""
- total_count: int
+ remaining_count: Optional[int] = None
+
+ total_count: Optional[int] = None
diff --git a/src/runloop_api_client/types/scenario_definition_list_view.py b/src/runloop_api_client/types/scenario_definition_list_view.py
index 5aa4ac3e4..f39cf1ed9 100644
--- a/src/runloop_api_client/types/scenario_definition_list_view.py
+++ b/src/runloop_api_client/types/scenario_definition_list_view.py
@@ -1,6 +1,6 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List
+from typing import List, Optional
from .._models import BaseModel
from .scenario_view import ScenarioView
@@ -11,9 +11,9 @@
class ScenarioDefinitionListView(BaseModel):
has_more: bool
- remaining_count: int
-
scenarios: List[ScenarioView]
"""List of Scenarios matching filter."""
- total_count: int
+ remaining_count: Optional[int] = None
+
+ total_count: Optional[int] = None
diff --git a/src/runloop_api_client/types/scenario_run_list_view.py b/src/runloop_api_client/types/scenario_run_list_view.py
index db0d16d31..142292dda 100644
--- a/src/runloop_api_client/types/scenario_run_list_view.py
+++ b/src/runloop_api_client/types/scenario_run_list_view.py
@@ -1,6 +1,6 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List
+from typing import List, Optional
from .._models import BaseModel
from .scenario_run_view import ScenarioRunView
@@ -11,9 +11,9 @@
class ScenarioRunListView(BaseModel):
has_more: bool
- remaining_count: int
-
runs: List[ScenarioRunView]
"""List of ScenarioRuns matching filter."""
- total_count: int
+ remaining_count: Optional[int] = None
+
+ total_count: Optional[int] = None
diff --git a/src/runloop_api_client/types/scenario_view.py b/src/runloop_api_client/types/scenario_view.py
index 4604bd957..6685bbce2 100644
--- a/src/runloop_api_client/types/scenario_view.py
+++ b/src/runloop_api_client/types/scenario_view.py
@@ -31,6 +31,9 @@ class ScenarioView(BaseModel):
scoring_contract: ScoringContract
"""The scoring contract for the Scenario."""
+ status: str
+ """The state of the scenario."""
+
environment: Optional[ScenarioEnvironment] = None
"""The Environment in which the Scenario is run."""
diff --git a/src/runloop_api_client/types/secret_list_view.py b/src/runloop_api_client/types/secret_list_view.py
index 4d66fa2e4..2f10bae2c 100644
--- a/src/runloop_api_client/types/secret_list_view.py
+++ b/src/runloop_api_client/types/secret_list_view.py
@@ -1,6 +1,6 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-from typing import List
+from typing import List, Optional
from .._models import BaseModel
from .secret_view import SecretView
@@ -14,11 +14,17 @@ class SecretListView(BaseModel):
has_more: bool
"""True if there are more results available beyond this page."""
- remaining_count: int
- """Number of Secrets remaining after this page."""
-
secrets: List[SecretView]
"""List of Secret objects. Values are omitted for security."""
- total_count: int
- """Total number of Secrets across all pages."""
+ remaining_count: Optional[int] = None
+ """Number of Secrets remaining after this page.
+
+ Deprecated: will be removed in a future breaking change.
+ """
+
+ total_count: Optional[int] = None
+ """Total number of Secrets across all pages.
+
+ Deprecated: will be removed in a future breaking change.
+ """
diff --git a/tests/api_resources/test_devboxes.py b/tests/api_resources/test_devboxes.py
index eef022a71..12c9f5187 100644
--- a/tests/api_resources/test_devboxes.py
+++ b/tests/api_resources/test_devboxes.py
@@ -893,14 +893,22 @@ def test_path_params_retrieve_resource_usage(self, client: Runloop) -> None:
@parametrize
def test_method_shutdown(self, client: Runloop) -> None:
devbox = client.devboxes.shutdown(
- "id",
+ id="id",
+ )
+ assert_matches_type(DevboxView, devbox, path=["response"])
+
+ @parametrize
+ def test_method_shutdown_with_all_params(self, client: Runloop) -> None:
+ devbox = client.devboxes.shutdown(
+ id="id",
+ force="force",
)
assert_matches_type(DevboxView, devbox, path=["response"])
@parametrize
def test_raw_response_shutdown(self, client: Runloop) -> None:
response = client.devboxes.with_raw_response.shutdown(
- "id",
+ id="id",
)
assert response.is_closed is True
@@ -911,7 +919,7 @@ def test_raw_response_shutdown(self, client: Runloop) -> None:
@parametrize
def test_streaming_response_shutdown(self, client: Runloop) -> None:
with client.devboxes.with_streaming_response.shutdown(
- "id",
+ id="id",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -925,7 +933,7 @@ def test_streaming_response_shutdown(self, client: Runloop) -> None:
def test_path_params_shutdown(self, client: Runloop) -> None:
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
client.devboxes.with_raw_response.shutdown(
- "",
+ id="",
)
@parametrize
@@ -2549,14 +2557,22 @@ async def test_path_params_retrieve_resource_usage(self, async_client: AsyncRunl
@parametrize
async def test_method_shutdown(self, async_client: AsyncRunloop) -> None:
devbox = await async_client.devboxes.shutdown(
- "id",
+ id="id",
+ )
+ assert_matches_type(DevboxView, devbox, path=["response"])
+
+ @parametrize
+ async def test_method_shutdown_with_all_params(self, async_client: AsyncRunloop) -> None:
+ devbox = await async_client.devboxes.shutdown(
+ id="id",
+ force="force",
)
assert_matches_type(DevboxView, devbox, path=["response"])
@parametrize
async def test_raw_response_shutdown(self, async_client: AsyncRunloop) -> None:
response = await async_client.devboxes.with_raw_response.shutdown(
- "id",
+ id="id",
)
assert response.is_closed is True
@@ -2567,7 +2583,7 @@ async def test_raw_response_shutdown(self, async_client: AsyncRunloop) -> None:
@parametrize
async def test_streaming_response_shutdown(self, async_client: AsyncRunloop) -> None:
async with async_client.devboxes.with_streaming_response.shutdown(
- "id",
+ id="id",
) as response:
assert not response.is_closed
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -2581,7 +2597,7 @@ async def test_streaming_response_shutdown(self, async_client: AsyncRunloop) ->
async def test_path_params_shutdown(self, async_client: AsyncRunloop) -> None:
with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
await async_client.devboxes.with_raw_response.shutdown(
- "",
+ id="",
)
@parametrize
From e6e5208c19360f24f10b3c0da84119f7eb356bb1 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 20 Feb 2026 01:02:11 +0000
Subject: [PATCH 3/4] chore(scenarios): make scenario status enum instead of
string (#7552)
---
.stats.yml | 4 ++--
src/runloop_api_client/types/scenario_view.py | 7 +++++--
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 44040dae9..27e05a0be 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 117
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-8704a652545c3831c8b7e246ec17f1a626b59911eb5701ddc922ca6cae1c8d57.yml
-openapi_spec_hash: e609bc5ed3fdce498bc7d16921bbba5e
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-1ee005e7d8f97067abb96c6a38af53b69d362f2511ca775a9b78580a9643c253.yml
+openapi_spec_hash: 9c54d19abf7993fd55714759f3265f9c
config_hash: eb28692edd68a6ae95cf92af931c9976
diff --git a/src/runloop_api_client/types/scenario_view.py b/src/runloop_api_client/types/scenario_view.py
index 6685bbce2..3bb470708 100644
--- a/src/runloop_api_client/types/scenario_view.py
+++ b/src/runloop_api_client/types/scenario_view.py
@@ -31,8 +31,11 @@ class ScenarioView(BaseModel):
scoring_contract: ScoringContract
"""The scoring contract for the Scenario."""
- status: str
- """The state of the scenario."""
+ status: Literal["active", "archived"]
+ """Whether the scenario is active or archived.
+
+ Archived scenarios are excluded from listings and cannot be updated.
+ """
environment: Optional[ScenarioEnvironment] = None
"""The Environment in which the Scenario is run."""
From 568b9e2b29773000fedc2cd38b72851212a84453 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 20 Feb 2026 01:02:31 +0000
Subject: [PATCH 4/4] release: 1.8.1
---
.release-please-manifest.json | 2 +-
CHANGELOG.md | 15 +++++++++++++++
pyproject.toml | 2 +-
src/runloop_api_client/_version.py | 2 +-
4 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index c523ce19f..7e334b0f0 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "1.8.0"
+ ".": "1.8.1"
}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 78604da88..21b6ee1db 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,20 @@
# Changelog
+## 1.8.1 (2026-02-20)
+
+Full Changelog: [v1.8.0...v1.8.1](https://github.com/runloopai/api-client-python/compare/v1.8.0...v1.8.1)
+
+### Chores
+
+* **benchmarks:** removed scorer ([#740](https://github.com/runloopai/api-client-python/issues/740)) ([1033264](https://github.com/runloopai/api-client-python/commit/1033264b0ed34cc47e2e16cac3ae5986f2a4e381))
+* format all `api.md` files ([ee5d577](https://github.com/runloopai/api-client-python/commit/ee5d5773d408ac8e61101fd0187ec071709bebab))
+* **scenarios:** make scenario status enum instead of string ([#7552](https://github.com/runloopai/api-client-python/issues/7552)) ([e6e5208](https://github.com/runloopai/api-client-python/commit/e6e5208c19360f24f10b3c0da84119f7eb356bb1))
+
+
+### Refactors
+
+* deprecate and make Nullable total_count and remaining_count of ListViews ([#7533](https://github.com/runloopai/api-client-python/issues/7533)) ([8b16ebe](https://github.com/runloopai/api-client-python/commit/8b16ebe7aba9f96592f03ed2844211209b35d9e6))
+
## 1.8.0 (2026-02-12)
Full Changelog: [v1.7.0...v1.8.0](https://github.com/runloopai/api-client-python/compare/v1.7.0...v1.8.0)
diff --git a/pyproject.toml b/pyproject.toml
index c872715e3..2e23bfe7f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "runloop_api_client"
-version = "1.8.0"
+version = "1.8.1"
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 da91dc1ce..034a79f4c 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.8.0" # x-release-please-version
+__version__ = "1.8.1" # x-release-please-version