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.7.0"
".": "1.8.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: 117
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-15b7fd06098d8cb3639efb3b401a03d7d97a8ab4960b08077aa871f0cacb33d3.yml
openapi_spec_hash: 93ab2fe88f9e57d8f262ad6d1179190e
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-c8d61a0c8b88fa30666ba021d1239eb0d549902354513c4741e9216bcbfa8e6d.yml
openapi_spec_hash: 433e6fb4ce076012b696f69ae7596c67
config_hash: eb28692edd68a6ae95cf92af931c9976
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,25 @@
# Changelog

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

### Features

* **benchmarks:** scenario scoring timeout ([#7300](https://github.com/runloopai/api-client-python/issues/7300)) ([6615183](https://github.com/runloopai/api-client-python/commit/661518379a6d197127014932c0a015757e77aa0d))
* **devbox:** expose snapshot size (in bytes) ([#7444](https://github.com/runloopai/api-client-python/issues/7444)) ([b25c3f7](https://github.com/runloopai/api-client-python/commit/b25c3f772c62465cf6bb7fa34e7bc57c601eeb28))


### Bug Fixes

* remove duplicate operationId createDevboxTunnel in openapi ([#7397](https://github.com/runloopai/api-client-python/issues/7397)) ([bb2cd8f](https://github.com/runloopai/api-client-python/commit/bb2cd8f4248cc763966a66372e62c1d90e2aa626))


### Chores

* **internal:** bump dependencies ([94e6c44](https://github.com/runloopai/api-client-python/commit/94e6c44f2b398fc498ae96c5b3e8e62da2b8bdf9))
* **internal:** fix lint error on Python 3.14 ([37ab1b7](https://github.com/runloopai/api-client-python/commit/37ab1b7dbe3b852e9062d6a547510c8d38ee2c35))

## 1.7.0 (2026-02-05)

Full Changelog: [v1.5.1...v1.7.0](https://github.com/runloopai/api-client-python/compare/v1.5.1...v1.7.0)
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.7.0"
version = "1.8.0"
description = "The official Python library for the runloop API"
dynamic = ["readme"]
license = "MIT"
Expand Down
33 changes: 9 additions & 24 deletions requirements-dev.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,18 @@
-e .
annotated-types==0.7.0
# via pydantic
anyio==4.12.0
anyio==4.12.1
# via
# httpx
# runloop-api-client
backports-asyncio-runner==1.2.0 ; python_full_version < '3.11'
# via pytest-asyncio
certifi==2025.11.12
certifi==2026.1.4
# via
# httpcore
# httpx
colorama==0.4.6 ; sys_platform == 'win32'
# via pytest
coverage==7.10.7 ; python_full_version < '3.10'
# via pytest-cov
coverage==7.13.0 ; python_full_version >= '3.10'
# via pytest-cov
dirty-equals==0.11
distro==1.9.0
# via runloop-api-client
Expand All @@ -40,7 +36,7 @@ idna==3.11
# via
# anyio
# httpx
importlib-metadata==8.7.0
importlib-metadata==8.7.1
iniconfig==2.1.0 ; python_full_version < '3.10'
# via pytest
iniconfig==2.3.0 ; python_full_version >= '3.10'
Expand All @@ -54,16 +50,14 @@ mdurl==0.1.2
mypy==1.17.0
mypy-extensions==1.1.0
# via mypy
nodeenv==1.9.1
nodeenv==1.10.0
# via pyright
packaging==25.0
# via pytest
pathspec==0.12.1
pathspec==1.0.3
# via mypy
pluggy==1.6.0
# via
# pytest
# pytest-cov
# via pytest
pydantic==2.12.5
# via runloop-api-client
pydantic-core==2.41.5
Expand All @@ -76,34 +70,27 @@ pyright==1.1.399
pytest==8.4.2 ; python_full_version < '3.10'
# via
# pytest-asyncio
# pytest-cov
# pytest-timeout
# pytest-xdist
pytest==9.0.2 ; python_full_version >= '3.10'
# via
# pytest-asyncio
# pytest-cov
# pytest-timeout
# pytest-xdist
pytest-asyncio==1.2.0 ; python_full_version < '3.10'
pytest-asyncio==1.3.0 ; python_full_version >= '3.10'
pytest-cov==7.0.0
pytest-timeout==2.4.0
pytest-xdist==3.8.0
python-dateutil==2.9.0.post0 ; python_full_version < '3.10'
# via time-machine
respx==0.22.0
rich==14.2.0
ruff==0.14.9
ruff==0.14.13
six==1.17.0 ; python_full_version < '3.10'
# via python-dateutil
sniffio==1.3.1
# via runloop-api-client
time-machine==2.19.0 ; python_full_version < '3.10'
time-machine==3.1.0 ; python_full_version >= '3.10'
tomli==2.3.0 ; python_full_version <= '3.11'
time-machine==3.2.0 ; python_full_version >= '3.10'
tomli==2.4.0 ; python_full_version < '3.11'
# via
# coverage
# mypy
# pytest
typing-extensions==4.15.0
Expand All @@ -119,7 +106,5 @@ typing-extensions==4.15.0
# typing-inspection
typing-inspection==0.4.2
# via pydantic
uuid-utils==0.12.0
# via runloop-api-client
zipp==3.23.0
# via importlib-metadata
2 changes: 1 addition & 1 deletion src/runloop_api_client/_utils/_compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def is_union(tp: Optional[Type[Any]]) -> bool:
else:
import types

return tp is Union or tp is types.UnionType
return tp is Union or tp is types.UnionType # type: ignore[comparison-overlap]


def is_typeddict(tp: Type[Any]) -> bool:
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.7.0" # x-release-please-version
__version__ = "1.8.0" # x-release-please-version
8 changes: 4 additions & 4 deletions src/runloop_api_client/resources/devboxes/devboxes.py
Original file line number Diff line number Diff line change
Expand Up @@ -814,11 +814,11 @@ def enable_tunnel(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
idempotency_key: str | None = None,
) -> TunnelView:
"""Create a V2 tunnel for an existing running Devbox.
"""Enable a V2 tunnel for an existing running Devbox.

Tunnels provide encrypted
URL-based access to the Devbox without exposing internal IDs. The tunnel URL
format is: https://{port}-{tunnel_key}.tunnel.runloop.ai
format is: https://&#123;port&#125;-&#123;tunnel_key&#125;.tunnel.runloop.ai

Each Devbox can have one tunnel.

Expand Down Expand Up @@ -2473,11 +2473,11 @@ async def enable_tunnel(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
idempotency_key: str | None = None,
) -> TunnelView:
"""Create a V2 tunnel for an existing running Devbox.
"""Enable a V2 tunnel for an existing running Devbox.

Tunnels provide encrypted
URL-based access to the Devbox without exposing internal IDs. The tunnel URL
format is: https://{port}-{tunnel_key}.tunnel.runloop.ai
format is: https://&#123;port&#125;-&#123;tunnel_key&#125;.tunnel.runloop.ai

Each Devbox can have one tunnel.

Expand Down
16 changes: 16 additions & 0 deletions src/runloop_api_client/resources/scenarios/scenarios.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ def create(
reference_output: Optional[str] | Omit = omit,
required_environment_variables: Optional[SequenceNotStr[str]] | Omit = omit,
required_secret_names: Optional[SequenceNotStr[str]] | Omit = omit,
scorer_timeout_sec: Optional[int] | Omit = omit,
validation_type: Optional[Literal["UNSPECIFIED", "FORWARD", "REVERSE", "EVALUATION"]] | 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 Down Expand Up @@ -129,6 +130,8 @@ def create(
secret name). If these secrets are not provided or the mapping is incorrect, the
scenario will fail to start.

scorer_timeout_sec: Timeout for scoring in seconds. Default 30 minutes (1800s).

validation_type: Validation strategy.

extra_headers: Send extra headers
Expand All @@ -153,6 +156,7 @@ def create(
"reference_output": reference_output,
"required_environment_variables": required_environment_variables,
"required_secret_names": required_secret_names,
"scorer_timeout_sec": scorer_timeout_sec,
"validation_type": validation_type,
},
scenario_create_params.ScenarioCreateParams,
Expand Down Expand Up @@ -211,6 +215,7 @@ def update(
reference_output: Optional[str] | Omit = omit,
required_environment_variables: Optional[SequenceNotStr[str]] | Omit = omit,
required_secret_names: Optional[SequenceNotStr[str]] | Omit = omit,
scorer_timeout_sec: Optional[int] | Omit = omit,
scoring_contract: Optional[ScoringContractUpdateParam] | Omit = omit,
validation_type: Optional[Literal["UNSPECIFIED", "FORWARD", "REVERSE", "EVALUATION"]] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
Expand Down Expand Up @@ -244,6 +249,8 @@ def update(

required_secret_names: Secrets required to run the scenario. Pass in empty list to clear.

scorer_timeout_sec: Timeout for scoring in seconds. Default 30 minutes (1800s).

scoring_contract: The scoring contract for the Scenario.

validation_type: Validation strategy. Pass in empty string to clear.
Expand Down Expand Up @@ -271,6 +278,7 @@ def update(
"reference_output": reference_output,
"required_environment_variables": required_environment_variables,
"required_secret_names": required_secret_names,
"scorer_timeout_sec": scorer_timeout_sec,
"scoring_contract": scoring_contract,
"validation_type": validation_type,
},
Expand Down Expand Up @@ -556,6 +564,7 @@ async def create(
reference_output: Optional[str] | Omit = omit,
required_environment_variables: Optional[SequenceNotStr[str]] | Omit = omit,
required_secret_names: Optional[SequenceNotStr[str]] | Omit = omit,
scorer_timeout_sec: Optional[int] | Omit = omit,
validation_type: Optional[Literal["UNSPECIFIED", "FORWARD", "REVERSE", "EVALUATION"]] | 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 Down Expand Up @@ -591,6 +600,8 @@ async def create(
secret name). If these secrets are not provided or the mapping is incorrect, the
scenario will fail to start.

scorer_timeout_sec: Timeout for scoring in seconds. Default 30 minutes (1800s).

validation_type: Validation strategy.

extra_headers: Send extra headers
Expand All @@ -615,6 +626,7 @@ async def create(
"reference_output": reference_output,
"required_environment_variables": required_environment_variables,
"required_secret_names": required_secret_names,
"scorer_timeout_sec": scorer_timeout_sec,
"validation_type": validation_type,
},
scenario_create_params.ScenarioCreateParams,
Expand Down Expand Up @@ -673,6 +685,7 @@ async def update(
reference_output: Optional[str] | Omit = omit,
required_environment_variables: Optional[SequenceNotStr[str]] | Omit = omit,
required_secret_names: Optional[SequenceNotStr[str]] | Omit = omit,
scorer_timeout_sec: Optional[int] | Omit = omit,
scoring_contract: Optional[ScoringContractUpdateParam] | Omit = omit,
validation_type: Optional[Literal["UNSPECIFIED", "FORWARD", "REVERSE", "EVALUATION"]] | Omit = omit,
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
Expand Down Expand Up @@ -706,6 +719,8 @@ async def update(

required_secret_names: Secrets required to run the scenario. Pass in empty list to clear.

scorer_timeout_sec: Timeout for scoring in seconds. Default 30 minutes (1800s).

scoring_contract: The scoring contract for the Scenario.

validation_type: Validation strategy. Pass in empty string to clear.
Expand Down Expand Up @@ -733,6 +748,7 @@ async def update(
"reference_output": reference_output,
"required_environment_variables": required_environment_variables,
"required_secret_names": required_secret_names,
"scorer_timeout_sec": scorer_timeout_sec,
"scoring_contract": scoring_contract,
"validation_type": validation_type,
},
Expand Down
3 changes: 3 additions & 0 deletions src/runloop_api_client/types/devbox_snapshot_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,8 @@ class DevboxSnapshotView(BaseModel):
name: Optional[str] = None
"""(Optional) The custom name of the snapshot."""

size_bytes: Optional[int] = None
"""(Optional) The size of the snapshot in bytes, relative to the base blueprint."""

source_blueprint_id: Optional[str] = None
"""(Optional) The source Blueprint ID this snapshot was created from."""
3 changes: 3 additions & 0 deletions src/runloop_api_client/types/scenario_create_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,8 @@ class ScenarioCreateParams(TypedDict, total=False):
scenario will fail to start.
"""

scorer_timeout_sec: Optional[int]
"""Timeout for scoring in seconds. Default 30 minutes (1800s)."""

validation_type: Optional[Literal["UNSPECIFIED", "FORWARD", "REVERSE", "EVALUATION"]]
"""Validation strategy."""
3 changes: 3 additions & 0 deletions src/runloop_api_client/types/scenario_update_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ class ScenarioUpdateParams(TypedDict, total=False):
required_secret_names: Optional[SequenceNotStr[str]]
"""Secrets required to run the scenario. Pass in empty list to clear."""

scorer_timeout_sec: Optional[int]
"""Timeout for scoring in seconds. Default 30 minutes (1800s)."""

scoring_contract: Optional[ScoringContractUpdateParam]
"""The scoring contract for the Scenario."""

Expand Down
3 changes: 3 additions & 0 deletions src/runloop_api_client/types/scenario_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,5 +57,8 @@ class ScenarioView(BaseModel):
If any required secrets are missing, the scenario will fail to start.
"""

scorer_timeout_sec: Optional[int] = None
"""Timeout for scoring in seconds. Default 30 minutes (1800s)."""

validation_type: Optional[Literal["UNSPECIFIED", "FORWARD", "REVERSE", "EVALUATION"]] = None
"""Validation strategy."""
4 changes: 4 additions & 0 deletions tests/api_resources/test_scenarios.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ def test_method_create_with_all_params(self, client: Runloop) -> None:
reference_output="reference_output",
required_environment_variables=["string"],
required_secret_names=["string"],
scorer_timeout_sec=0,
validation_type="UNSPECIFIED",
)
assert_matches_type(ScenarioView, scenario, path=["response"])
Expand Down Expand Up @@ -232,6 +233,7 @@ def test_method_update_with_all_params(self, client: Runloop) -> None:
reference_output="reference_output",
required_environment_variables=["string"],
required_secret_names=["string"],
scorer_timeout_sec=0,
scoring_contract={
"scoring_function_parameters": [
{
Expand Down Expand Up @@ -502,6 +504,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncRunloop) -
reference_output="reference_output",
required_environment_variables=["string"],
required_secret_names=["string"],
scorer_timeout_sec=0,
validation_type="UNSPECIFIED",
)
assert_matches_type(ScenarioView, scenario, path=["response"])
Expand Down Expand Up @@ -641,6 +644,7 @@ async def test_method_update_with_all_params(self, async_client: AsyncRunloop) -
reference_output="reference_output",
required_environment_variables=["string"],
required_secret_names=["string"],
scorer_timeout_sec=0,
scoring_contract={
"scoring_function_parameters": [
{
Expand Down
Loading