From b3a0a91b5463e47787cce33aa6ad803446e41ecd Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 21:11:10 +0000 Subject: [PATCH 1/8] feat(api): add codex broker mount protocol and axon attach enum value (#10186) --- .stats.yml | 4 ++-- src/runloop_api_client/types/shared/broker_mount.py | 6 +++--- src/runloop_api_client/types/shared_params/broker_mount.py | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.stats.yml b/.stats.yml index 3b0452793..1ebafa98a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 119 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai/runloop-99b4be5cc4cd6f2e1cfd71d5a9ec5409dd9293fe6084833da76f178010bfdcab.yml -openapi_spec_hash: 4760825b37e131da53c88bf893b60937 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai/runloop-0c2afaabf6aab84a49eaf4f94efa48a70afe47a73c6a684f38c0909a8f6ae15b.yml +openapi_spec_hash: cf9b348173a796db0252c59468a464f7 config_hash: 9f32651e6269089b5d6c33594b992232 diff --git a/src/runloop_api_client/types/shared/broker_mount.py b/src/runloop_api_client/types/shared/broker_mount.py index ed518c632..adf49c04a 100644 --- a/src/runloop_api_client/types/shared/broker_mount.py +++ b/src/runloop_api_client/types/shared/broker_mount.py @@ -17,16 +17,16 @@ class BrokerMount(BaseModel): agent_binary: Optional[str] = None """Binary to launch the agent (e.g., 'opencode'). - Used by protocols that launch a subprocess (acp, claude_json). + Used by protocols that launch a subprocess (acp, claude_json, codex_json). """ launch_args: Optional[List[str]] = None """Arguments to pass to the agent command (e.g., ['acp']). - Used by protocols that launch a subprocess (acp, claude_json). + Used by protocols that launch a subprocess (acp, claude_json, codex_json). """ - protocol: Optional[Literal["acp", "claude_json"]] = None + protocol: Optional[Literal["acp", "claude_json", "codex_json"]] = None """The protocol used by the broker to deliver events to the agent.""" working_directory: Optional[str] = None diff --git a/src/runloop_api_client/types/shared_params/broker_mount.py b/src/runloop_api_client/types/shared_params/broker_mount.py index 233ae0095..e62bd59e5 100644 --- a/src/runloop_api_client/types/shared_params/broker_mount.py +++ b/src/runloop_api_client/types/shared_params/broker_mount.py @@ -19,16 +19,16 @@ class BrokerMount(TypedDict, total=False): agent_binary: Optional[str] """Binary to launch the agent (e.g., 'opencode'). - Used by protocols that launch a subprocess (acp, claude_json). + Used by protocols that launch a subprocess (acp, claude_json, codex_json). """ launch_args: Optional[SequenceNotStr[str]] """Arguments to pass to the agent command (e.g., ['acp']). - Used by protocols that launch a subprocess (acp, claude_json). + Used by protocols that launch a subprocess (acp, claude_json, codex_json). """ - protocol: Optional[Literal["acp", "claude_json"]] + protocol: Optional[Literal["acp", "claude_json", "codex_json"]] """The protocol used by the broker to deliver events to the agent.""" working_directory: Optional[str] From a5b61f3b981d74f4707d132513d59beb4bdb33c2 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 02:02:27 +0000 Subject: [PATCH 2/8] fix(internal): resolve build failures --- scripts/lint | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/lint b/scripts/lint index b6390e3ae..d52c11733 100755 --- a/scripts/lint +++ b/scripts/lint @@ -5,7 +5,7 @@ set -e cd "$(dirname "$0")/.." echo "==> Running pyright" -uv run pyright +uv run pyright -p . echo "==> Running mypy" uv run mypy . From f6cc5b714771564aaa7c5424b21fbd3c87286306 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 17:47:00 +0000 Subject: [PATCH 3/8] feat(devbox): rename scheduled -> queued (#10217) --- .stats.yml | 4 ++-- src/runloop_api_client/resources/devboxes/devboxes.py | 2 ++ src/runloop_api_client/types/devbox_list_params.py | 1 + src/runloop_api_client/types/devbox_view.py | 7 +++++-- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1ebafa98a..eea97414d 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 119 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai/runloop-0c2afaabf6aab84a49eaf4f94efa48a70afe47a73c6a684f38c0909a8f6ae15b.yml -openapi_spec_hash: cf9b348173a796db0252c59468a464f7 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai/runloop-b5badb6102d613aecce0a0297348c441712c818729f6251970808e9abf494aee.yml +openapi_spec_hash: 3634342312dab3641c1f26a54b448dd2 config_hash: 9f32651e6269089b5d6c33594b992232 diff --git a/src/runloop_api_client/resources/devboxes/devboxes.py b/src/runloop_api_client/resources/devboxes/devboxes.py index f919a2147..f100014f8 100644 --- a/src/runloop_api_client/resources/devboxes/devboxes.py +++ b/src/runloop_api_client/resources/devboxes/devboxes.py @@ -531,6 +531,7 @@ def list( starting_after: str | Omit = omit, status: Literal[ "scheduled", + "queued", "provisioning", "initializing", "running", @@ -2204,6 +2205,7 @@ def list( starting_after: str | Omit = omit, status: Literal[ "scheduled", + "queued", "provisioning", "initializing", "running", diff --git a/src/runloop_api_client/types/devbox_list_params.py b/src/runloop_api_client/types/devbox_list_params.py index f845a53b6..e2ad60f94 100644 --- a/src/runloop_api_client/types/devbox_list_params.py +++ b/src/runloop_api_client/types/devbox_list_params.py @@ -22,6 +22,7 @@ class DevboxListParams(TypedDict, total=False): status: Literal[ "scheduled", + "queued", "provisioning", "initializing", "running", diff --git a/src/runloop_api_client/types/devbox_view.py b/src/runloop_api_client/types/devbox_view.py index 726f14e72..49ffc1ec8 100644 --- a/src/runloop_api_client/types/devbox_view.py +++ b/src/runloop_api_client/types/devbox_view.py @@ -14,6 +14,7 @@ class StateTransition(BaseModel): status: Optional[ Literal[ "scheduled", + "queued", "provisioning", "initializing", "running", @@ -26,8 +27,9 @@ class StateTransition(BaseModel): ] = None """The status of the Devbox. - scheduled: The Devbox is scheduled to run but infrastructure allocation has not - started yet. provisioning: Runloop is allocating and booting the necessary + scheduled: Deprecated. The Devbox is waiting for infrastructure allocation to + start. Use queued. queued: The Devbox is waiting for infrastructure allocation + to start. provisioning: Runloop is allocating and booting the necessary infrastructure resources. initializing: Runloop defined boot scripts are running to enable the environment for interaction. running: The Devbox is ready for interaction. suspending: The Devbox disk is being snapshotted as part of @@ -90,6 +92,7 @@ class DevboxView(BaseModel): status: Literal[ "scheduled", + "queued", "provisioning", "initializing", "running", From 6a762cb53fbf1b6a2d113874227d0b68caa979dc Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 22:18:36 +0000 Subject: [PATCH 4/8] feat(stlc): configurable CI runner and private-production-repo support in workflow templates --- .github/workflows/ci.yml | 6 +++--- uv.lock | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3db832c9d..87c5aabb0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: lint: timeout-minutes: 10 name: lint - runs-on: ${{ github.repository == 'stainless-sdks/runloop-python' && 'depot-ubuntu-24.04' || 'ubuntu-slim' }} + runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-slim' }} if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata') steps: - uses: runloopai/checkout@main @@ -44,7 +44,7 @@ jobs: permissions: contents: read id-token: write - runs-on: ${{ github.repository == 'stainless-sdks/runloop-python' && 'depot-ubuntu-24.04' || 'ubuntu-slim' }} + runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-slim' }} steps: - uses: runloopai/checkout@main @@ -81,7 +81,7 @@ jobs: test: timeout-minutes: 10 name: test - runs-on: ${{ github.repository == 'stainless-sdks/runloop-python' && 'depot-ubuntu-24.04' || 'ubuntu-slim' }} + runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-slim' }} if: github.event_name == 'push' || github.event.pull_request.head.repo.fork steps: - uses: runloopai/checkout@main diff --git a/uv.lock b/uv.lock index a35165b2c..8e67d0307 100644 --- a/uv.lock +++ b/uv.lock @@ -2422,7 +2422,7 @@ wheels = [ [[package]] name = "runloop-api-client" -version = "1.20.2" +version = "1.23.3" source = { editable = "." } dependencies = [ { name = "anyio" }, From 4a401768ae50e1047d4c6f80384c059112299463 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 21 Jul 2026 21:10:33 +0000 Subject: [PATCH 5/8] fix(mux): uniform id/name search across list endpoints, close cross-tenant IDOR (#10267) --- .stats.yml | 4 ++-- .../resources/axons/axons.py | 8 +++++++ .../resources/benchmark_jobs.py | 8 +++++++ .../resources/benchmark_runs.py | 16 +++++++++++++ .../resources/benchmarks.py | 24 +++++++++++++++++++ .../resources/gateway_configs.py | 8 +++++++ .../resources/mcp_configs.py | 8 +++++++ .../resources/network_policies.py | 8 +++++++ .../resources/scenarios/runs.py | 8 +++++++ .../resources/scenarios/scenarios.py | 16 +++++++++++++ .../resources/scenarios/scorers.py | 8 +++++++ .../types/axon_list_params.py | 3 +++ .../types/benchmark_job_list_params.py | 3 +++ .../types/benchmark_list_params.py | 3 +++ .../types/benchmark_list_public_params.py | 6 +++++ .../types/benchmark_run_list_params.py | 3 +++ ...benchmark_run_list_scenario_runs_params.py | 3 +++ .../types/gateway_config_list_params.py | 3 +++ .../types/mcp_config_list_params.py | 3 +++ .../types/network_policy_list_params.py | 3 +++ .../types/scenario_list_params.py | 3 +++ .../types/scenario_list_public_params.py | 3 +++ .../types/scenarios/run_list_params.py | 3 +++ .../types/scenarios/scorer_list_params.py | 3 +++ tests/api_resources/scenarios/test_runs.py | 2 ++ tests/api_resources/scenarios/test_scorers.py | 2 ++ tests/api_resources/test_axons.py | 2 ++ tests/api_resources/test_benchmark_jobs.py | 2 ++ tests/api_resources/test_benchmark_runs.py | 4 ++++ tests/api_resources/test_benchmarks.py | 6 +++++ tests/api_resources/test_gateway_configs.py | 2 ++ tests/api_resources/test_mcp_configs.py | 2 ++ tests/api_resources/test_network_policies.py | 2 ++ tests/api_resources/test_scenarios.py | 4 ++++ 34 files changed, 184 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index eea97414d..20e8ceaa7 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 119 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai/runloop-b5badb6102d613aecce0a0297348c441712c818729f6251970808e9abf494aee.yml -openapi_spec_hash: 3634342312dab3641c1f26a54b448dd2 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai/runloop-0e8f05634e48dcbabeafbb1ab71297b2c506f028ffc92a1f01767147e1244a77.yml +openapi_spec_hash: 46d01fb341301ea07b9860151d9043f7 config_hash: 9f32651e6269089b5d6c33594b992232 diff --git a/src/runloop_api_client/resources/axons/axons.py b/src/runloop_api_client/resources/axons/axons.py index 9387bc0c9..fba62a339 100644 --- a/src/runloop_api_client/resources/axons/axons.py +++ b/src/runloop_api_client/resources/axons/axons.py @@ -153,6 +153,7 @@ def list( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -174,6 +175,8 @@ def list( name: Filter by axon name (prefix match supported). + search: Search by axon ID or name. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -198,6 +201,7 @@ def list( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, }, axon_list_params.AxonListParams, @@ -424,6 +428,7 @@ def list( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -445,6 +450,8 @@ def list( name: Filter by axon name (prefix match supported). + search: Search by axon ID or name. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -469,6 +476,7 @@ def list( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, }, axon_list_params.AxonListParams, diff --git a/src/runloop_api_client/resources/benchmark_jobs.py b/src/runloop_api_client/resources/benchmark_jobs.py index e57e58c33..57dc8b5cd 100644 --- a/src/runloop_api_client/resources/benchmark_jobs.py +++ b/src/runloop_api_client/resources/benchmark_jobs.py @@ -134,6 +134,7 @@ def list( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -153,6 +154,8 @@ def list( name: Filter by name + search: Search by benchmark job ID or name. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -175,6 +178,7 @@ def list( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, }, benchmark_job_list_params.BenchmarkJobListParams, @@ -294,6 +298,7 @@ async def list( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -313,6 +318,8 @@ async def list( name: Filter by name + search: Search by benchmark job ID or name. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -335,6 +342,7 @@ async def list( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, }, benchmark_job_list_params.BenchmarkJobListParams, diff --git a/src/runloop_api_client/resources/benchmark_runs.py b/src/runloop_api_client/resources/benchmark_runs.py index 66513a855..075246c30 100644 --- a/src/runloop_api_client/resources/benchmark_runs.py +++ b/src/runloop_api_client/resources/benchmark_runs.py @@ -85,6 +85,7 @@ def list( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: 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. @@ -107,6 +108,8 @@ def list( name: Filter by name + search: Search by benchmark run ID or name. + starting_after: Load the next page of data starting after the item with the given ID. state: Filter by state @@ -133,6 +136,7 @@ def list( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, "state": state, }, @@ -231,6 +235,7 @@ def list_scenario_runs( *, include_total_count: bool | Omit = omit, limit: int | Omit = omit, + search: str | Omit = omit, starting_after: str | Omit = omit, state: Literal["running", "scoring", "scored", "completed", "canceled", "timeout", "failed"] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -249,6 +254,8 @@ def list_scenario_runs( limit: The limit of items to return. Default is 20. Max is 5000. + search: Search by scenario run ID or name. + starting_after: Load the next page of data starting after the item with the given ID. state: Filter by Scenario Run state @@ -275,6 +282,7 @@ def list_scenario_runs( { "include_total_count": include_total_count, "limit": limit, + "search": search, "starting_after": starting_after, "state": state, }, @@ -345,6 +353,7 @@ def list( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: 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. @@ -367,6 +376,8 @@ def list( name: Filter by name + search: Search by benchmark run ID or name. + starting_after: Load the next page of data starting after the item with the given ID. state: Filter by state @@ -393,6 +404,7 @@ def list( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, "state": state, }, @@ -491,6 +503,7 @@ def list_scenario_runs( *, include_total_count: bool | Omit = omit, limit: int | Omit = omit, + search: str | Omit = omit, starting_after: str | Omit = omit, state: Literal["running", "scoring", "scored", "completed", "canceled", "timeout", "failed"] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -509,6 +522,8 @@ def list_scenario_runs( limit: The limit of items to return. Default is 20. Max is 5000. + search: Search by scenario run ID or name. + starting_after: Load the next page of data starting after the item with the given ID. state: Filter by Scenario Run state @@ -535,6 +550,7 @@ def list_scenario_runs( { "include_total_count": include_total_count, "limit": limit, + "search": search, "starting_after": starting_after, "state": state, }, diff --git a/src/runloop_api_client/resources/benchmarks.py b/src/runloop_api_client/resources/benchmarks.py index ca5442f52..7ee045266 100644 --- a/src/runloop_api_client/resources/benchmarks.py +++ b/src/runloop_api_client/resources/benchmarks.py @@ -247,6 +247,7 @@ def list( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -266,6 +267,8 @@ def list( name: Filter by name + search: Search by benchmark ID or name. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -289,6 +292,7 @@ def list( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, }, benchmark_list_params.BenchmarkListParams, @@ -351,6 +355,8 @@ def list_public( *, include_total_count: bool | Omit = omit, limit: int | Omit = omit, + name: str | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -368,6 +374,10 @@ def list_public( limit: The limit of items to return. Default is 20. Max is 5000. + name: Filter by name + + search: Search by benchmark ID or name. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -390,6 +400,8 @@ def list_public( { "include_total_count": include_total_count, "limit": limit, + "name": name, + "search": search, "starting_after": starting_after, }, benchmark_list_public_params.BenchmarkListPublicParams, @@ -722,6 +734,7 @@ def list( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -741,6 +754,8 @@ def list( name: Filter by name + search: Search by benchmark ID or name. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -764,6 +779,7 @@ def list( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, }, benchmark_list_params.BenchmarkListParams, @@ -826,6 +842,8 @@ def list_public( *, include_total_count: bool | Omit = omit, limit: int | Omit = omit, + name: str | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -843,6 +861,10 @@ def list_public( limit: The limit of items to return. Default is 20. Max is 5000. + name: Filter by name + + search: Search by benchmark ID or name. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -865,6 +887,8 @@ def list_public( { "include_total_count": include_total_count, "limit": limit, + "name": name, + "search": search, "starting_after": starting_after, }, benchmark_list_public_params.BenchmarkListPublicParams, diff --git a/src/runloop_api_client/resources/gateway_configs.py b/src/runloop_api_client/resources/gateway_configs.py index 799e730a6..34f0989cf 100644 --- a/src/runloop_api_client/resources/gateway_configs.py +++ b/src/runloop_api_client/resources/gateway_configs.py @@ -209,6 +209,7 @@ def list( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -231,6 +232,8 @@ def list( name: Filter by name (partial match supported). + search: Search by gateway config ID or name. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -255,6 +258,7 @@ def list( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, }, gateway_config_list_params.GatewayConfigListParams, @@ -490,6 +494,7 @@ def list( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -512,6 +517,8 @@ def list( name: Filter by name (partial match supported). + search: Search by gateway config ID or name. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -536,6 +543,7 @@ def list( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, }, gateway_config_list_params.GatewayConfigListParams, diff --git a/src/runloop_api_client/resources/mcp_configs.py b/src/runloop_api_client/resources/mcp_configs.py index b097db18b..e96647c9c 100644 --- a/src/runloop_api_client/resources/mcp_configs.py +++ b/src/runloop_api_client/resources/mcp_configs.py @@ -211,6 +211,7 @@ def list( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -232,6 +233,8 @@ def list( name: Filter by name (prefix match supported). + search: Search by MCP config ID or name. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -256,6 +259,7 @@ def list( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, }, mcp_config_list_params.McpConfigListParams, @@ -493,6 +497,7 @@ def list( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -514,6 +519,8 @@ def list( name: Filter by name (prefix match supported). + search: Search by MCP config ID or name. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -538,6 +545,7 @@ def list( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, }, mcp_config_list_params.McpConfigListParams, diff --git a/src/runloop_api_client/resources/network_policies.py b/src/runloop_api_client/resources/network_policies.py index 7ba7abd9e..d350f843d 100644 --- a/src/runloop_api_client/resources/network_policies.py +++ b/src/runloop_api_client/resources/network_policies.py @@ -238,6 +238,7 @@ def list( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -259,6 +260,8 @@ def list( name: Filter by name (partial match supported). + search: Search by network policy ID or name. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -283,6 +286,7 @@ def list( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, }, network_policy_list_params.NetworkPolicyListParams, @@ -547,6 +551,7 @@ def list( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -568,6 +573,8 @@ def list( name: Filter by name (partial match supported). + search: Search by network policy ID or name. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -592,6 +599,7 @@ def list( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, }, network_policy_list_params.NetworkPolicyListParams, diff --git a/src/runloop_api_client/resources/scenarios/runs.py b/src/runloop_api_client/resources/scenarios/runs.py index 67c5c4428..cb2e15be0 100644 --- a/src/runloop_api_client/resources/scenarios/runs.py +++ b/src/runloop_api_client/resources/scenarios/runs.py @@ -94,6 +94,7 @@ def list( limit: int | Omit = omit, name: str | Omit = omit, scenario_id: str | Omit = omit, + search: 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. @@ -118,6 +119,8 @@ def list( scenario_id: Filter runs associated to Scenario given ID + search: Search by scenario run ID or name. + starting_after: Load the next page of data starting after the item with the given ID. state: Filter by state @@ -145,6 +148,7 @@ def list( "limit": limit, "name": name, "scenario_id": scenario_id, + "search": search, "starting_after": starting_after, "state": state, }, @@ -519,6 +523,7 @@ def list( limit: int | Omit = omit, name: str | Omit = omit, scenario_id: str | Omit = omit, + search: 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. @@ -543,6 +548,8 @@ def list( scenario_id: Filter runs associated to Scenario given ID + search: Search by scenario run ID or name. + starting_after: Load the next page of data starting after the item with the given ID. state: Filter by state @@ -570,6 +577,7 @@ def list( "limit": limit, "name": name, "scenario_id": scenario_id, + "search": search, "starting_after": starting_after, "state": state, }, diff --git a/src/runloop_api_client/resources/scenarios/scenarios.py b/src/runloop_api_client/resources/scenarios/scenarios.py index 084fab761..c29613894 100644 --- a/src/runloop_api_client/resources/scenarios/scenarios.py +++ b/src/runloop_api_client/resources/scenarios/scenarios.py @@ -303,6 +303,7 @@ def list( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: str | Omit = omit, starting_after: str | Omit = omit, validation_type: str | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -325,6 +326,8 @@ def list( name: Query for Scenarios with a given name. + search: Search by scenario ID or name. + starting_after: Load the next page of data starting after the item with the given ID. validation_type: Filter by validation type @@ -351,6 +354,7 @@ def list( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, "validation_type": validation_type, }, @@ -408,6 +412,7 @@ def list_public( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -427,6 +432,8 @@ def list_public( name: Query for Scenarios with a given name. + search: Search by scenario ID or name. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -450,6 +457,7 @@ def list_public( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, }, scenario_list_public_params.ScenarioListPublicParams, @@ -827,6 +835,7 @@ def list( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: str | Omit = omit, starting_after: str | Omit = omit, validation_type: str | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -849,6 +858,8 @@ def list( name: Query for Scenarios with a given name. + search: Search by scenario ID or name. + starting_after: Load the next page of data starting after the item with the given ID. validation_type: Filter by validation type @@ -875,6 +886,7 @@ def list( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, "validation_type": validation_type, }, @@ -932,6 +944,7 @@ def list_public( include_total_count: bool | Omit = omit, limit: int | Omit = omit, name: str | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -951,6 +964,8 @@ def list_public( name: Query for Scenarios with a given name. + search: Search by scenario ID or name. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -974,6 +989,7 @@ def list_public( "include_total_count": include_total_count, "limit": limit, "name": name, + "search": search, "starting_after": starting_after, }, scenario_list_public_params.ScenarioListPublicParams, diff --git a/src/runloop_api_client/resources/scenarios/scorers.py b/src/runloop_api_client/resources/scenarios/scorers.py index 1472d86af..599949a17 100644 --- a/src/runloop_api_client/resources/scenarios/scorers.py +++ b/src/runloop_api_client/resources/scenarios/scorers.py @@ -188,6 +188,7 @@ def list( *, include_total_count: bool | Omit = omit, limit: int | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -205,6 +206,8 @@ def list( limit: The limit of items to return. Default is 20. Max is 5000. + search: Search by scenario scorer ID or type. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -227,6 +230,7 @@ def list( { "include_total_count": include_total_count, "limit": limit, + "search": search, "starting_after": starting_after, }, scorer_list_params.ScorerListParams, @@ -399,6 +403,7 @@ def list( *, include_total_count: bool | Omit = omit, limit: int | Omit = omit, + search: str | Omit = omit, starting_after: 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. @@ -416,6 +421,8 @@ def list( limit: The limit of items to return. Default is 20. Max is 5000. + search: Search by scenario scorer ID or type. + starting_after: Load the next page of data starting after the item with the given ID. extra_headers: Send extra headers @@ -438,6 +445,7 @@ def list( { "include_total_count": include_total_count, "limit": limit, + "search": search, "starting_after": starting_after, }, scorer_list_params.ScorerListParams, diff --git a/src/runloop_api_client/types/axon_list_params.py b/src/runloop_api_client/types/axon_list_params.py index dbe4cdb80..7ae12827c 100644 --- a/src/runloop_api_client/types/axon_list_params.py +++ b/src/runloop_api_client/types/axon_list_params.py @@ -23,5 +23,8 @@ class AxonListParams(TypedDict, total=False): name: str """Filter by axon name (prefix match supported).""" + search: str + """Search by axon ID or name.""" + starting_after: str """Load the next page of data starting after the item with the given ID.""" diff --git a/src/runloop_api_client/types/benchmark_job_list_params.py b/src/runloop_api_client/types/benchmark_job_list_params.py index 9ab17e8eb..fd68abd44 100644 --- a/src/runloop_api_client/types/benchmark_job_list_params.py +++ b/src/runloop_api_client/types/benchmark_job_list_params.py @@ -20,5 +20,8 @@ class BenchmarkJobListParams(TypedDict, total=False): name: str """Filter by name""" + search: str + """Search by benchmark job ID or name.""" + starting_after: str """Load the next page of data starting after the item with the given ID.""" diff --git a/src/runloop_api_client/types/benchmark_list_params.py b/src/runloop_api_client/types/benchmark_list_params.py index d8be9aeca..650c93ca3 100644 --- a/src/runloop_api_client/types/benchmark_list_params.py +++ b/src/runloop_api_client/types/benchmark_list_params.py @@ -20,5 +20,8 @@ class BenchmarkListParams(TypedDict, total=False): name: str """Filter by name""" + search: str + """Search by benchmark ID or name.""" + starting_after: str """Load the next page of data starting after the item with the given ID.""" diff --git a/src/runloop_api_client/types/benchmark_list_public_params.py b/src/runloop_api_client/types/benchmark_list_public_params.py index 9be7ffdf4..de7426686 100644 --- a/src/runloop_api_client/types/benchmark_list_public_params.py +++ b/src/runloop_api_client/types/benchmark_list_public_params.py @@ -17,5 +17,11 @@ class BenchmarkListPublicParams(TypedDict, total=False): limit: int """The limit of items to return. Default is 20. Max is 5000.""" + name: str + """Filter by name""" + + search: str + """Search by benchmark ID or name.""" + starting_after: str """Load the next page of data starting after the item with the given ID.""" 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 73106e240..697d9db1f 100644 --- a/src/runloop_api_client/types/benchmark_run_list_params.py +++ b/src/runloop_api_client/types/benchmark_run_list_params.py @@ -23,6 +23,9 @@ class BenchmarkRunListParams(TypedDict, total=False): name: str """Filter by name""" + search: str + """Search by benchmark run ID or name.""" + starting_after: str """Load the next page of data starting after the item with the given ID.""" diff --git a/src/runloop_api_client/types/benchmark_run_list_scenario_runs_params.py b/src/runloop_api_client/types/benchmark_run_list_scenario_runs_params.py index dddfa256a..ac626e6a8 100644 --- a/src/runloop_api_client/types/benchmark_run_list_scenario_runs_params.py +++ b/src/runloop_api_client/types/benchmark_run_list_scenario_runs_params.py @@ -17,6 +17,9 @@ class BenchmarkRunListScenarioRunsParams(TypedDict, total=False): limit: int """The limit of items to return. Default is 20. Max is 5000.""" + search: str + """Search by scenario run ID or name.""" + starting_after: str """Load the next page of data starting after the item with the given ID.""" diff --git a/src/runloop_api_client/types/gateway_config_list_params.py b/src/runloop_api_client/types/gateway_config_list_params.py index ef69f83b4..58c431c75 100644 --- a/src/runloop_api_client/types/gateway_config_list_params.py +++ b/src/runloop_api_client/types/gateway_config_list_params.py @@ -23,5 +23,8 @@ class GatewayConfigListParams(TypedDict, total=False): name: str """Filter by name (partial match supported).""" + search: str + """Search by gateway config ID or name.""" + starting_after: str """Load the next page of data starting after the item with the given ID.""" diff --git a/src/runloop_api_client/types/mcp_config_list_params.py b/src/runloop_api_client/types/mcp_config_list_params.py index 684de89ec..782c1b4ca 100644 --- a/src/runloop_api_client/types/mcp_config_list_params.py +++ b/src/runloop_api_client/types/mcp_config_list_params.py @@ -23,5 +23,8 @@ class McpConfigListParams(TypedDict, total=False): name: str """Filter by name (prefix match supported).""" + search: str + """Search by MCP config ID or name.""" + starting_after: str """Load the next page of data starting after the item with the given ID.""" diff --git a/src/runloop_api_client/types/network_policy_list_params.py b/src/runloop_api_client/types/network_policy_list_params.py index cdbc84f1a..ee8643b5c 100644 --- a/src/runloop_api_client/types/network_policy_list_params.py +++ b/src/runloop_api_client/types/network_policy_list_params.py @@ -23,5 +23,8 @@ class NetworkPolicyListParams(TypedDict, total=False): name: str """Filter by name (partial match supported).""" + search: str + """Search by network policy ID or name.""" + starting_after: str """Load the next page of data starting after the item with the given ID.""" diff --git a/src/runloop_api_client/types/scenario_list_params.py b/src/runloop_api_client/types/scenario_list_params.py index 3d34d711a..cdc21050e 100644 --- a/src/runloop_api_client/types/scenario_list_params.py +++ b/src/runloop_api_client/types/scenario_list_params.py @@ -23,6 +23,9 @@ class ScenarioListParams(TypedDict, total=False): name: str """Query for Scenarios with a given name.""" + search: str + """Search by scenario ID or name.""" + starting_after: str """Load the next page of data starting after the item with the given ID.""" diff --git a/src/runloop_api_client/types/scenario_list_public_params.py b/src/runloop_api_client/types/scenario_list_public_params.py index a2e71da64..a1714d8a5 100644 --- a/src/runloop_api_client/types/scenario_list_public_params.py +++ b/src/runloop_api_client/types/scenario_list_public_params.py @@ -20,5 +20,8 @@ class ScenarioListPublicParams(TypedDict, total=False): name: str """Query for Scenarios with a given name.""" + search: str + """Search by scenario ID or name.""" + starting_after: str """Load the next page of data starting after the item with the given ID.""" diff --git a/src/runloop_api_client/types/scenarios/run_list_params.py b/src/runloop_api_client/types/scenarios/run_list_params.py index 6e7373a07..d2de9e951 100644 --- a/src/runloop_api_client/types/scenarios/run_list_params.py +++ b/src/runloop_api_client/types/scenarios/run_list_params.py @@ -26,6 +26,9 @@ class RunListParams(TypedDict, total=False): scenario_id: str """Filter runs associated to Scenario given ID""" + search: str + """Search by scenario run ID or name.""" + starting_after: str """Load the next page of data starting after the item with the given ID.""" diff --git a/src/runloop_api_client/types/scenarios/scorer_list_params.py b/src/runloop_api_client/types/scenarios/scorer_list_params.py index a387f1a86..4ae433725 100644 --- a/src/runloop_api_client/types/scenarios/scorer_list_params.py +++ b/src/runloop_api_client/types/scenarios/scorer_list_params.py @@ -17,5 +17,8 @@ class ScorerListParams(TypedDict, total=False): limit: int """The limit of items to return. Default is 20. Max is 5000.""" + search: str + """Search by scenario scorer ID or type.""" + starting_after: str """Load the next page of data starting after the item with the given ID.""" diff --git a/tests/api_resources/scenarios/test_runs.py b/tests/api_resources/scenarios/test_runs.py index 429a815ee..ec3871b27 100644 --- a/tests/api_resources/scenarios/test_runs.py +++ b/tests/api_resources/scenarios/test_runs.py @@ -77,6 +77,7 @@ def test_method_list_with_all_params(self, client: Runloop) -> None: limit=0, name="name", scenario_id="scenario_id", + search="search", starting_after="starting_after", state="state", ) @@ -329,6 +330,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncRunloop) -> limit=0, name="name", scenario_id="scenario_id", + search="search", starting_after="starting_after", state="state", ) diff --git a/tests/api_resources/scenarios/test_scorers.py b/tests/api_resources/scenarios/test_scorers.py index cd15e860d..c7cbbe555 100644 --- a/tests/api_resources/scenarios/test_scorers.py +++ b/tests/api_resources/scenarios/test_scorers.py @@ -151,6 +151,7 @@ def test_method_list_with_all_params(self, client: Runloop) -> None: scorer = client.scenarios.scorers.list( include_total_count=True, limit=0, + search="search", starting_after="starting_after", ) assert_matches_type(SyncScenarioScorersCursorIDPage[ScorerListResponse], scorer, path=["response"]) @@ -309,6 +310,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncRunloop) -> scorer = await async_client.scenarios.scorers.list( include_total_count=True, limit=0, + search="search", starting_after="starting_after", ) assert_matches_type(AsyncScenarioScorersCursorIDPage[ScorerListResponse], scorer, path=["response"]) diff --git a/tests/api_resources/test_axons.py b/tests/api_resources/test_axons.py index 540fc4baa..8764443bb 100644 --- a/tests/api_resources/test_axons.py +++ b/tests/api_resources/test_axons.py @@ -103,6 +103,7 @@ def test_method_list_with_all_params(self, client: Runloop) -> None: include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", ) assert_matches_type(SyncAxonsCursorIDPage[AxonView], axon, path=["response"]) @@ -314,6 +315,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncRunloop) -> include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", ) assert_matches_type(AsyncAxonsCursorIDPage[AxonView], axon, path=["response"]) diff --git a/tests/api_resources/test_benchmark_jobs.py b/tests/api_resources/test_benchmark_jobs.py index 9b577a0c2..e109ad8dc 100644 --- a/tests/api_resources/test_benchmark_jobs.py +++ b/tests/api_resources/test_benchmark_jobs.py @@ -105,6 +105,7 @@ def test_method_list_with_all_params(self, client: Runloop) -> None: include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", ) assert_matches_type(BenchmarkJobListView, benchmark_job, path=["response"]) @@ -220,6 +221,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncRunloop) -> include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", ) assert_matches_type(BenchmarkJobListView, benchmark_job, path=["response"]) diff --git a/tests/api_resources/test_benchmark_runs.py b/tests/api_resources/test_benchmark_runs.py index 68e0df609..3ce64b8eb 100644 --- a/tests/api_resources/test_benchmark_runs.py +++ b/tests/api_resources/test_benchmark_runs.py @@ -71,6 +71,7 @@ def test_method_list_with_all_params(self, client: Runloop) -> None: include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", state="state", ) @@ -185,6 +186,7 @@ def test_method_list_scenario_runs_with_all_params(self, client: Runloop) -> Non id="id", include_total_count=True, limit=0, + search="search", starting_after="starting_after", state="running", ) @@ -277,6 +279,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncRunloop) -> include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", state="state", ) @@ -391,6 +394,7 @@ async def test_method_list_scenario_runs_with_all_params(self, async_client: Asy id="id", include_total_count=True, limit=0, + search="search", starting_after="starting_after", state="running", ) diff --git a/tests/api_resources/test_benchmarks.py b/tests/api_resources/test_benchmarks.py index 4728cbce5..f6de5f2af 100644 --- a/tests/api_resources/test_benchmarks.py +++ b/tests/api_resources/test_benchmarks.py @@ -167,6 +167,7 @@ def test_method_list_with_all_params(self, client: Runloop) -> None: include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", ) assert_matches_type(SyncBenchmarksCursorIDPage[BenchmarkView], benchmark, path=["response"]) @@ -248,6 +249,8 @@ def test_method_list_public_with_all_params(self, client: Runloop) -> None: benchmark = client.benchmarks.list_public( include_total_count=True, limit=0, + name="name", + search="search", starting_after="starting_after", ) assert_matches_type(SyncBenchmarksCursorIDPage[BenchmarkView], benchmark, path=["response"]) @@ -557,6 +560,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncRunloop) -> include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", ) assert_matches_type(AsyncBenchmarksCursorIDPage[BenchmarkView], benchmark, path=["response"]) @@ -638,6 +642,8 @@ async def test_method_list_public_with_all_params(self, async_client: AsyncRunlo benchmark = await async_client.benchmarks.list_public( include_total_count=True, limit=0, + name="name", + search="search", starting_after="starting_after", ) assert_matches_type(AsyncBenchmarksCursorIDPage[BenchmarkView], benchmark, path=["response"]) diff --git a/tests/api_resources/test_gateway_configs.py b/tests/api_resources/test_gateway_configs.py index 5a60422dd..64e35b11f 100644 --- a/tests/api_resources/test_gateway_configs.py +++ b/tests/api_resources/test_gateway_configs.py @@ -172,6 +172,7 @@ def test_method_list_with_all_params(self, client: Runloop) -> None: include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", ) assert_matches_type(SyncGatewayConfigsCursorIDPage[GatewayConfigView], gateway_config, path=["response"]) @@ -392,6 +393,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncRunloop) -> include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", ) assert_matches_type(AsyncGatewayConfigsCursorIDPage[GatewayConfigView], gateway_config, path=["response"]) diff --git a/tests/api_resources/test_mcp_configs.py b/tests/api_resources/test_mcp_configs.py index ea6ed337c..2e85d3d45 100644 --- a/tests/api_resources/test_mcp_configs.py +++ b/tests/api_resources/test_mcp_configs.py @@ -166,6 +166,7 @@ def test_method_list_with_all_params(self, client: Runloop) -> None: include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", ) assert_matches_type(SyncMcpConfigsCursorIDPage[McpConfigView], mcp_config, path=["response"]) @@ -380,6 +381,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncRunloop) -> include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", ) assert_matches_type(AsyncMcpConfigsCursorIDPage[McpConfigView], mcp_config, path=["response"]) diff --git a/tests/api_resources/test_network_policies.py b/tests/api_resources/test_network_policies.py index e7b5fb038..29b1073dd 100644 --- a/tests/api_resources/test_network_policies.py +++ b/tests/api_resources/test_network_policies.py @@ -166,6 +166,7 @@ def test_method_list_with_all_params(self, client: Runloop) -> None: include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", ) assert_matches_type(SyncNetworkPoliciesCursorIDPage[NetworkPolicyView], network_policy, path=["response"]) @@ -380,6 +381,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncRunloop) -> include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", ) assert_matches_type(AsyncNetworkPoliciesCursorIDPage[NetworkPolicyView], network_policy, path=["response"]) diff --git a/tests/api_resources/test_scenarios.py b/tests/api_resources/test_scenarios.py index 157f6877a..59ab6c634 100644 --- a/tests/api_resources/test_scenarios.py +++ b/tests/api_resources/test_scenarios.py @@ -325,6 +325,7 @@ def test_method_list_with_all_params(self, client: Runloop) -> None: include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", validation_type="validation_type", ) @@ -399,6 +400,7 @@ def test_method_list_public_with_all_params(self, client: Runloop) -> None: include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", ) assert_matches_type(SyncScenariosCursorIDPage[ScenarioView], scenario, path=["response"]) @@ -821,6 +823,7 @@ async def test_method_list_with_all_params(self, async_client: AsyncRunloop) -> include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", validation_type="validation_type", ) @@ -895,6 +898,7 @@ async def test_method_list_public_with_all_params(self, async_client: AsyncRunlo include_total_count=True, limit=0, name="name", + search="search", starting_after="starting_after", ) assert_matches_type(AsyncScenariosCursorIDPage[ScenarioView], scenario, path=["response"]) From b77a065422042d3a7717c02208e16b72fdddc5e3 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 19:55:59 +0000 Subject: [PATCH 6/8] feat(mux): expose CIDR egress rules on the network policy API (#10269) --- .stats.yml | 6 +-- api.md | 2 + .../resources/network_policies.py | 25 +++++++++- src/runloop_api_client/types/__init__.py | 4 ++ src/runloop_api_client/types/allowed_cidr.py | 21 ++++++++ .../types/allowed_cidr_param.py | 23 +++++++++ .../types/network_policy_create_params.py | 10 +++- .../types/network_policy_update_params.py | 9 +++- .../types/network_policy_view.py | 7 +++ src/runloop_api_client/types/port_rule.py | 24 ++++++++++ .../types/port_rule_param.py | 24 ++++++++++ tests/api_resources/test_network_policies.py | 48 +++++++++++++++++++ 12 files changed, 197 insertions(+), 6 deletions(-) create mode 100644 src/runloop_api_client/types/allowed_cidr.py create mode 100644 src/runloop_api_client/types/allowed_cidr_param.py create mode 100644 src/runloop_api_client/types/port_rule.py create mode 100644 src/runloop_api_client/types/port_rule_param.py diff --git a/.stats.yml b/.stats.yml index 20e8ceaa7..17a55d07f 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 119 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai/runloop-0e8f05634e48dcbabeafbb1ab71297b2c506f028ffc92a1f01767147e1244a77.yml -openapi_spec_hash: 46d01fb341301ea07b9860151d9043f7 -config_hash: 9f32651e6269089b5d6c33594b992232 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai/runloop-53098c6f2c4d6e31f36a6975b3f7f504ad3f8fbe5a209dac9b2304afcd053a77.yml +openapi_spec_hash: 05dcd360988cd1044b6a7ab03933a5ef +config_hash: 218b8d25038e627faab98532392ee9a0 diff --git a/api.md b/api.md index 2f3ddb2f8..b7db70b09 100644 --- a/api.md +++ b/api.md @@ -419,10 +419,12 @@ Types: ```python from runloop_api_client.types import ( + AllowedCidr, NetworkPolicyCreateParameters, NetworkPolicyListView, NetworkPolicyUpdateParameters, NetworkPolicyView, + PortRule, ) ``` diff --git a/src/runloop_api_client/resources/network_policies.py b/src/runloop_api_client/resources/network_policies.py index d350f843d..51a184ccf 100644 --- a/src/runloop_api_client/resources/network_policies.py +++ b/src/runloop_api_client/resources/network_policies.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import Optional +from typing import Iterable, Optional import httpx @@ -19,6 +19,7 @@ ) from ..pagination import SyncNetworkPoliciesCursorIDPage, AsyncNetworkPoliciesCursorIDPage from .._base_client import AsyncPaginator, make_request_options +from ..types.allowed_cidr_param import AllowedCidrParam from ..types.network_policy_view import NetworkPolicyView __all__ = ["NetworkPoliciesResource", "AsyncNetworkPoliciesResource"] @@ -52,6 +53,7 @@ def create( allow_all: Optional[bool] | Omit = omit, allow_devbox_to_devbox: Optional[bool] | Omit = omit, allow_mcp_gateway: Optional[bool] | Omit = omit, + allowed_cidrs: Optional[Iterable[AllowedCidrParam]] | Omit = omit, allowed_hostnames: Optional[SequenceNotStr[str]] | Omit = omit, description: Optional[str] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -84,6 +86,10 @@ def create( allow_mcp_gateway: (Optional) If true, allows devbox egress to the MCP hub for MCP server access. Defaults to false. + allowed_cidrs: (Optional) IPv4 CIDR-based allow list with optional port restrictions, additive + with allowed_hostnames. Example: [{'cidr': '10.12.0.0/16', 'ports': [{'port': + 443}]}]. + allowed_hostnames: (Optional) DNS-based allow list with wildcard support. Examples: ['github.com', '*.npmjs.org']. @@ -108,6 +114,7 @@ def create( "allow_all": allow_all, "allow_devbox_to_devbox": allow_devbox_to_devbox, "allow_mcp_gateway": allow_mcp_gateway, + "allowed_cidrs": allowed_cidrs, "allowed_hostnames": allowed_hostnames, "description": description, }, @@ -164,6 +171,7 @@ def update( allow_all: Optional[bool] | Omit = omit, allow_devbox_to_devbox: Optional[bool] | Omit = omit, allow_mcp_gateway: Optional[bool] | Omit = omit, + allowed_cidrs: Optional[Iterable[AllowedCidrParam]] | Omit = omit, allowed_hostnames: Optional[SequenceNotStr[str]] | Omit = omit, description: Optional[str] | Omit = omit, name: Optional[str] | Omit = omit, @@ -188,6 +196,9 @@ def update( allow_mcp_gateway: If true, allows devbox egress to the MCP hub. + allowed_cidrs: Updated IPv4 CIDR-based allow list with optional port restrictions, additive + with allowed_hostnames. + allowed_hostnames: Updated DNS-based allow list with wildcard support. Examples: ['github.com', '*.npmjs.org']. @@ -215,6 +226,7 @@ def update( "allow_all": allow_all, "allow_devbox_to_devbox": allow_devbox_to_devbox, "allow_mcp_gateway": allow_mcp_gateway, + "allowed_cidrs": allowed_cidrs, "allowed_hostnames": allowed_hostnames, "description": description, "name": name, @@ -365,6 +377,7 @@ async def create( allow_all: Optional[bool] | Omit = omit, allow_devbox_to_devbox: Optional[bool] | Omit = omit, allow_mcp_gateway: Optional[bool] | Omit = omit, + allowed_cidrs: Optional[Iterable[AllowedCidrParam]] | Omit = omit, allowed_hostnames: Optional[SequenceNotStr[str]] | Omit = omit, description: Optional[str] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -397,6 +410,10 @@ async def create( allow_mcp_gateway: (Optional) If true, allows devbox egress to the MCP hub for MCP server access. Defaults to false. + allowed_cidrs: (Optional) IPv4 CIDR-based allow list with optional port restrictions, additive + with allowed_hostnames. Example: [{'cidr': '10.12.0.0/16', 'ports': [{'port': + 443}]}]. + allowed_hostnames: (Optional) DNS-based allow list with wildcard support. Examples: ['github.com', '*.npmjs.org']. @@ -421,6 +438,7 @@ async def create( "allow_all": allow_all, "allow_devbox_to_devbox": allow_devbox_to_devbox, "allow_mcp_gateway": allow_mcp_gateway, + "allowed_cidrs": allowed_cidrs, "allowed_hostnames": allowed_hostnames, "description": description, }, @@ -477,6 +495,7 @@ async def update( allow_all: Optional[bool] | Omit = omit, allow_devbox_to_devbox: Optional[bool] | Omit = omit, allow_mcp_gateway: Optional[bool] | Omit = omit, + allowed_cidrs: Optional[Iterable[AllowedCidrParam]] | Omit = omit, allowed_hostnames: Optional[SequenceNotStr[str]] | Omit = omit, description: Optional[str] | Omit = omit, name: Optional[str] | Omit = omit, @@ -501,6 +520,9 @@ async def update( allow_mcp_gateway: If true, allows devbox egress to the MCP hub. + allowed_cidrs: Updated IPv4 CIDR-based allow list with optional port restrictions, additive + with allowed_hostnames. + allowed_hostnames: Updated DNS-based allow list with wildcard support. Examples: ['github.com', '*.npmjs.org']. @@ -528,6 +550,7 @@ async def update( "allow_all": allow_all, "allow_devbox_to_devbox": allow_devbox_to_devbox, "allow_mcp_gateway": allow_mcp_gateway, + "allowed_cidrs": allowed_cidrs, "allowed_hostnames": allowed_hostnames, "description": description, "name": name, diff --git a/src/runloop_api_client/types/__init__.py b/src/runloop_api_client/types/__init__.py index 3f36e4cc2..4abd94f92 100644 --- a/src/runloop_api_client/types/__init__.py +++ b/src/runloop_api_client/types/__init__.py @@ -17,12 +17,14 @@ LifecycleConfiguration as LifecycleConfiguration, ) from .axon_view import AxonView as AxonView +from .port_rule import PortRule as PortRule from .agent_view import AgentView as AgentView from .devbox_view import DevboxView as DevboxView from .object_view import ObjectView as ObjectView from .secret_view import SecretView as SecretView from .tunnel_view import TunnelView as TunnelView from .account_view import AccountView as AccountView +from .allowed_cidr import AllowedCidr as AllowedCidr from .input_context import InputContext as InputContext from .scenario_view import ScenarioView as ScenarioView from .axon_list_view import AxonListView as AxonListView @@ -31,6 +33,7 @@ from .agent_list_view import AgentListView as AgentListView from .axon_event_view import AxonEventView as AxonEventView from .mcp_config_view import McpConfigView as McpConfigView +from .port_rule_param import PortRuleParam as PortRuleParam from .pty_tunnel_view import PtyTunnelView as PtyTunnelView from .axon_list_params import AxonListParams as AxonListParams from .devbox_list_view import DevboxListView as DevboxListView @@ -42,6 +45,7 @@ from .secret_list_view import SecretListView as SecretListView from .agent_list_params import AgentListParams as AgentListParams from .scenario_run_view import ScenarioRunView as ScenarioRunView +from .allowed_cidr_param import AllowedCidrParam as AllowedCidrParam from .axon_create_params import AxonCreateParams as AxonCreateParams from .benchmark_job_view import BenchmarkJobView as BenchmarkJobView from .benchmark_run_view import BenchmarkRunView as BenchmarkRunView diff --git a/src/runloop_api_client/types/allowed_cidr.py b/src/runloop_api_client/types/allowed_cidr.py new file mode 100644 index 000000000..8688f052d --- /dev/null +++ b/src/runloop_api_client/types/allowed_cidr.py @@ -0,0 +1,21 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List, Optional + +from .._models import BaseModel +from .port_rule import PortRule + +__all__ = ["AllowedCidr"] + + +class AllowedCidr(BaseModel): + """A CIDR-based egress allow rule with optional port restrictions.""" + + cidr: str + """IPv4 CIDR block in canonical form (host bits zero), e.g. '10.12.0.0/16'.""" + + ports: Optional[List[PortRule]] = None + """(Optional) Ports allowed for this CIDR. + + Empty or omitted means all ports and protocols. + """ diff --git a/src/runloop_api_client/types/allowed_cidr_param.py b/src/runloop_api_client/types/allowed_cidr_param.py new file mode 100644 index 000000000..fa37c10cd --- /dev/null +++ b/src/runloop_api_client/types/allowed_cidr_param.py @@ -0,0 +1,23 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Iterable, Optional +from typing_extensions import Required, TypedDict + +from .port_rule_param import PortRuleParam + +__all__ = ["AllowedCidrParam"] + + +class AllowedCidrParam(TypedDict, total=False): + """A CIDR-based egress allow rule with optional port restrictions.""" + + cidr: Required[str] + """IPv4 CIDR block in canonical form (host bits zero), e.g. '10.12.0.0/16'.""" + + ports: Optional[Iterable[PortRuleParam]] + """(Optional) Ports allowed for this CIDR. + + Empty or omitted means all ports and protocols. + """ diff --git a/src/runloop_api_client/types/network_policy_create_params.py b/src/runloop_api_client/types/network_policy_create_params.py index 0d8b1de2a..78a09f83f 100644 --- a/src/runloop_api_client/types/network_policy_create_params.py +++ b/src/runloop_api_client/types/network_policy_create_params.py @@ -2,10 +2,11 @@ from __future__ import annotations -from typing import Optional +from typing import Iterable, Optional from typing_extensions import Required, TypedDict from .._types import SequenceNotStr +from .allowed_cidr_param import AllowedCidrParam __all__ = ["NetworkPolicyCreateParams"] @@ -42,6 +43,13 @@ class NetworkPolicyCreateParams(TypedDict, total=False): Defaults to false. """ + allowed_cidrs: Optional[Iterable[AllowedCidrParam]] + """ + (Optional) IPv4 CIDR-based allow list with optional port restrictions, additive + with allowed_hostnames. Example: [{'cidr': '10.12.0.0/16', 'ports': [{'port': + 443}]}]. + """ + allowed_hostnames: Optional[SequenceNotStr[str]] """(Optional) DNS-based allow list with wildcard support. diff --git a/src/runloop_api_client/types/network_policy_update_params.py b/src/runloop_api_client/types/network_policy_update_params.py index 0a622ca3e..7f0932346 100644 --- a/src/runloop_api_client/types/network_policy_update_params.py +++ b/src/runloop_api_client/types/network_policy_update_params.py @@ -2,10 +2,11 @@ from __future__ import annotations -from typing import Optional +from typing import Iterable, Optional from typing_extensions import TypedDict from .._types import SequenceNotStr +from .allowed_cidr_param import AllowedCidrParam __all__ = ["NetworkPolicyUpdateParams"] @@ -23,6 +24,12 @@ class NetworkPolicyUpdateParams(TypedDict, total=False): allow_mcp_gateway: Optional[bool] """If true, allows devbox egress to the MCP hub.""" + allowed_cidrs: Optional[Iterable[AllowedCidrParam]] + """ + Updated IPv4 CIDR-based allow list with optional port restrictions, additive + with allowed_hostnames. + """ + allowed_hostnames: Optional[SequenceNotStr[str]] """Updated DNS-based allow list with wildcard support. diff --git a/src/runloop_api_client/types/network_policy_view.py b/src/runloop_api_client/types/network_policy_view.py index 0c3e25728..778375ebb 100644 --- a/src/runloop_api_client/types/network_policy_view.py +++ b/src/runloop_api_client/types/network_policy_view.py @@ -3,6 +3,7 @@ from typing import List, Optional from .._models import BaseModel +from .allowed_cidr import AllowedCidr __all__ = ["NetworkPolicyView", "Egress"] @@ -25,6 +26,12 @@ class Egress(BaseModel): allow_mcp_gateway: bool """If true, allows devbox egress to the MCP hub for MCP server access.""" + allowed_cidrs: List[AllowedCidr] + """ + CIDR-based allow list with optional port restrictions, additive with + allowed_hostnames. + """ + allowed_hostnames: List[str] """DNS-based allow list with wildcard support. diff --git a/src/runloop_api_client/types/port_rule.py b/src/runloop_api_client/types/port_rule.py new file mode 100644 index 000000000..8b9737161 --- /dev/null +++ b/src/runloop_api_client/types/port_rule.py @@ -0,0 +1,24 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import Optional +from typing_extensions import Literal + +from .._models import BaseModel + +__all__ = ["PortRule"] + + +class PortRule(BaseModel): + """A port or port range allowed for a CIDR egress rule.""" + + port: int + """The allowed port (1-65535), or the start of a port range.""" + + end_port: Optional[int] = None + """(Optional) Inclusive end of the port range (port-65535). + + Omit for a single port. + """ + + protocol: Optional[Literal["TCP", "UDP"]] = None + """L4 protocol for a port rule.""" diff --git a/src/runloop_api_client/types/port_rule_param.py b/src/runloop_api_client/types/port_rule_param.py new file mode 100644 index 000000000..1c7be58a6 --- /dev/null +++ b/src/runloop_api_client/types/port_rule_param.py @@ -0,0 +1,24 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Optional +from typing_extensions import Literal, Required, TypedDict + +__all__ = ["PortRuleParam"] + + +class PortRuleParam(TypedDict, total=False): + """A port or port range allowed for a CIDR egress rule.""" + + port: Required[int] + """The allowed port (1-65535), or the start of a port range.""" + + end_port: Optional[int] + """(Optional) Inclusive end of the port range (port-65535). + + Omit for a single port. + """ + + protocol: Optional[Literal["TCP", "UDP"]] + """L4 protocol for a port rule.""" diff --git a/tests/api_resources/test_network_policies.py b/tests/api_resources/test_network_policies.py index 29b1073dd..63c27b599 100644 --- a/tests/api_resources/test_network_policies.py +++ b/tests/api_resources/test_network_policies.py @@ -35,6 +35,18 @@ def test_method_create_with_all_params(self, client: Runloop) -> None: allow_all=True, allow_devbox_to_devbox=True, allow_mcp_gateway=True, + allowed_cidrs=[ + { + "cidr": "cidr", + "ports": [ + { + "port": 0, + "end_port": 0, + "protocol": "TCP", + } + ], + } + ], allowed_hostnames=["string"], description="description", ) @@ -117,6 +129,18 @@ def test_method_update_with_all_params(self, client: Runloop) -> None: allow_all=True, allow_devbox_to_devbox=True, allow_mcp_gateway=True, + allowed_cidrs=[ + { + "cidr": "cidr", + "ports": [ + { + "port": 0, + "end_port": 0, + "protocol": "TCP", + } + ], + } + ], allowed_hostnames=["string"], description="description", name="name", @@ -250,6 +274,18 @@ async def test_method_create_with_all_params(self, async_client: AsyncRunloop) - allow_all=True, allow_devbox_to_devbox=True, allow_mcp_gateway=True, + allowed_cidrs=[ + { + "cidr": "cidr", + "ports": [ + { + "port": 0, + "end_port": 0, + "protocol": "TCP", + } + ], + } + ], allowed_hostnames=["string"], description="description", ) @@ -332,6 +368,18 @@ async def test_method_update_with_all_params(self, async_client: AsyncRunloop) - allow_all=True, allow_devbox_to_devbox=True, allow_mcp_gateway=True, + allowed_cidrs=[ + { + "cidr": "cidr", + "ports": [ + { + "port": 0, + "end_port": 0, + "protocol": "TCP", + } + ], + } + ], allowed_hostnames=["string"], description="description", name="name", From c04239892931cd1b80d926af8664a461ea426aab Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 22:15:42 +0000 Subject: [PATCH 7/8] feat(network): add allow_runloop_mirrors egress flag to network policies (#10350) --- .stats.yml | 4 ++-- .../resources/network_policies.py | 20 +++++++++++++++++++ .../types/network_policy_create_params.py | 6 ++++++ .../types/network_policy_update_params.py | 6 ++++++ .../types/network_policy_view.py | 6 ++++++ tests/api_resources/test_network_policies.py | 4 ++++ 6 files changed, 44 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 17a55d07f..4e9c9d433 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 119 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai/runloop-53098c6f2c4d6e31f36a6975b3f7f504ad3f8fbe5a209dac9b2304afcd053a77.yml -openapi_spec_hash: 05dcd360988cd1044b6a7ab03933a5ef +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai/runloop-0b7cd0c2fc193b18189cd7f44cf45ece7726b5d485fb72577f7d235266432ea0.yml +openapi_spec_hash: 78c340dbfb9d3d58b24ef318fc2a657b config_hash: 218b8d25038e627faab98532392ee9a0 diff --git a/src/runloop_api_client/resources/network_policies.py b/src/runloop_api_client/resources/network_policies.py index 51a184ccf..b02062311 100644 --- a/src/runloop_api_client/resources/network_policies.py +++ b/src/runloop_api_client/resources/network_policies.py @@ -53,6 +53,7 @@ def create( allow_all: Optional[bool] | Omit = omit, allow_devbox_to_devbox: Optional[bool] | Omit = omit, allow_mcp_gateway: Optional[bool] | Omit = omit, + allow_runloop_mirrors: Optional[bool] | Omit = omit, allowed_cidrs: Optional[Iterable[AllowedCidrParam]] | Omit = omit, allowed_hostnames: Optional[SequenceNotStr[str]] | Omit = omit, description: Optional[str] | Omit = omit, @@ -86,6 +87,9 @@ def create( allow_mcp_gateway: (Optional) If true, allows devbox egress to the MCP hub for MCP server access. Defaults to false. + allow_runloop_mirrors: (Optional) If true, allows devbox egress to Runloop's package/image registry + mirrors. Defaults to false. Implicitly allowed when allow_all is true. + allowed_cidrs: (Optional) IPv4 CIDR-based allow list with optional port restrictions, additive with allowed_hostnames. Example: [{'cidr': '10.12.0.0/16', 'ports': [{'port': 443}]}]. @@ -114,6 +118,7 @@ def create( "allow_all": allow_all, "allow_devbox_to_devbox": allow_devbox_to_devbox, "allow_mcp_gateway": allow_mcp_gateway, + "allow_runloop_mirrors": allow_runloop_mirrors, "allowed_cidrs": allowed_cidrs, "allowed_hostnames": allowed_hostnames, "description": description, @@ -171,6 +176,7 @@ def update( allow_all: Optional[bool] | Omit = omit, allow_devbox_to_devbox: Optional[bool] | Omit = omit, allow_mcp_gateway: Optional[bool] | Omit = omit, + allow_runloop_mirrors: Optional[bool] | Omit = omit, allowed_cidrs: Optional[Iterable[AllowedCidrParam]] | Omit = omit, allowed_hostnames: Optional[SequenceNotStr[str]] | Omit = omit, description: Optional[str] | Omit = omit, @@ -196,6 +202,9 @@ def update( allow_mcp_gateway: If true, allows devbox egress to the MCP hub. + allow_runloop_mirrors: If true, allows devbox egress to Runloop's package/image registry mirrors. + Implicitly allowed when allow_all is true. + allowed_cidrs: Updated IPv4 CIDR-based allow list with optional port restrictions, additive with allowed_hostnames. @@ -226,6 +235,7 @@ def update( "allow_all": allow_all, "allow_devbox_to_devbox": allow_devbox_to_devbox, "allow_mcp_gateway": allow_mcp_gateway, + "allow_runloop_mirrors": allow_runloop_mirrors, "allowed_cidrs": allowed_cidrs, "allowed_hostnames": allowed_hostnames, "description": description, @@ -377,6 +387,7 @@ async def create( allow_all: Optional[bool] | Omit = omit, allow_devbox_to_devbox: Optional[bool] | Omit = omit, allow_mcp_gateway: Optional[bool] | Omit = omit, + allow_runloop_mirrors: Optional[bool] | Omit = omit, allowed_cidrs: Optional[Iterable[AllowedCidrParam]] | Omit = omit, allowed_hostnames: Optional[SequenceNotStr[str]] | Omit = omit, description: Optional[str] | Omit = omit, @@ -410,6 +421,9 @@ async def create( allow_mcp_gateway: (Optional) If true, allows devbox egress to the MCP hub for MCP server access. Defaults to false. + allow_runloop_mirrors: (Optional) If true, allows devbox egress to Runloop's package/image registry + mirrors. Defaults to false. Implicitly allowed when allow_all is true. + allowed_cidrs: (Optional) IPv4 CIDR-based allow list with optional port restrictions, additive with allowed_hostnames. Example: [{'cidr': '10.12.0.0/16', 'ports': [{'port': 443}]}]. @@ -438,6 +452,7 @@ async def create( "allow_all": allow_all, "allow_devbox_to_devbox": allow_devbox_to_devbox, "allow_mcp_gateway": allow_mcp_gateway, + "allow_runloop_mirrors": allow_runloop_mirrors, "allowed_cidrs": allowed_cidrs, "allowed_hostnames": allowed_hostnames, "description": description, @@ -495,6 +510,7 @@ async def update( allow_all: Optional[bool] | Omit = omit, allow_devbox_to_devbox: Optional[bool] | Omit = omit, allow_mcp_gateway: Optional[bool] | Omit = omit, + allow_runloop_mirrors: Optional[bool] | Omit = omit, allowed_cidrs: Optional[Iterable[AllowedCidrParam]] | Omit = omit, allowed_hostnames: Optional[SequenceNotStr[str]] | Omit = omit, description: Optional[str] | Omit = omit, @@ -520,6 +536,9 @@ async def update( allow_mcp_gateway: If true, allows devbox egress to the MCP hub. + allow_runloop_mirrors: If true, allows devbox egress to Runloop's package/image registry mirrors. + Implicitly allowed when allow_all is true. + allowed_cidrs: Updated IPv4 CIDR-based allow list with optional port restrictions, additive with allowed_hostnames. @@ -550,6 +569,7 @@ async def update( "allow_all": allow_all, "allow_devbox_to_devbox": allow_devbox_to_devbox, "allow_mcp_gateway": allow_mcp_gateway, + "allow_runloop_mirrors": allow_runloop_mirrors, "allowed_cidrs": allowed_cidrs, "allowed_hostnames": allowed_hostnames, "description": description, diff --git a/src/runloop_api_client/types/network_policy_create_params.py b/src/runloop_api_client/types/network_policy_create_params.py index 78a09f83f..48b49f456 100644 --- a/src/runloop_api_client/types/network_policy_create_params.py +++ b/src/runloop_api_client/types/network_policy_create_params.py @@ -43,6 +43,12 @@ class NetworkPolicyCreateParams(TypedDict, total=False): Defaults to false. """ + allow_runloop_mirrors: Optional[bool] + """ + (Optional) If true, allows devbox egress to Runloop's package/image registry + mirrors. Defaults to false. Implicitly allowed when allow_all is true. + """ + allowed_cidrs: Optional[Iterable[AllowedCidrParam]] """ (Optional) IPv4 CIDR-based allow list with optional port restrictions, additive diff --git a/src/runloop_api_client/types/network_policy_update_params.py b/src/runloop_api_client/types/network_policy_update_params.py index 7f0932346..0bfca295f 100644 --- a/src/runloop_api_client/types/network_policy_update_params.py +++ b/src/runloop_api_client/types/network_policy_update_params.py @@ -24,6 +24,12 @@ class NetworkPolicyUpdateParams(TypedDict, total=False): allow_mcp_gateway: Optional[bool] """If true, allows devbox egress to the MCP hub.""" + allow_runloop_mirrors: Optional[bool] + """If true, allows devbox egress to Runloop's package/image registry mirrors. + + Implicitly allowed when allow_all is true. + """ + allowed_cidrs: Optional[Iterable[AllowedCidrParam]] """ Updated IPv4 CIDR-based allow list with optional port restrictions, additive diff --git a/src/runloop_api_client/types/network_policy_view.py b/src/runloop_api_client/types/network_policy_view.py index 778375ebb..aa6395e5a 100644 --- a/src/runloop_api_client/types/network_policy_view.py +++ b/src/runloop_api_client/types/network_policy_view.py @@ -26,6 +26,12 @@ class Egress(BaseModel): allow_mcp_gateway: bool """If true, allows devbox egress to the MCP hub for MCP server access.""" + allow_runloop_mirrors: bool + """If true, allows devbox egress to Runloop's package/image registry mirrors. + + Implicitly allowed when allow_all is true. + """ + allowed_cidrs: List[AllowedCidr] """ CIDR-based allow list with optional port restrictions, additive with diff --git a/tests/api_resources/test_network_policies.py b/tests/api_resources/test_network_policies.py index 63c27b599..fb70f4069 100644 --- a/tests/api_resources/test_network_policies.py +++ b/tests/api_resources/test_network_policies.py @@ -35,6 +35,7 @@ def test_method_create_with_all_params(self, client: Runloop) -> None: allow_all=True, allow_devbox_to_devbox=True, allow_mcp_gateway=True, + allow_runloop_mirrors=True, allowed_cidrs=[ { "cidr": "cidr", @@ -129,6 +130,7 @@ def test_method_update_with_all_params(self, client: Runloop) -> None: allow_all=True, allow_devbox_to_devbox=True, allow_mcp_gateway=True, + allow_runloop_mirrors=True, allowed_cidrs=[ { "cidr": "cidr", @@ -274,6 +276,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncRunloop) - allow_all=True, allow_devbox_to_devbox=True, allow_mcp_gateway=True, + allow_runloop_mirrors=True, allowed_cidrs=[ { "cidr": "cidr", @@ -368,6 +371,7 @@ async def test_method_update_with_all_params(self, async_client: AsyncRunloop) - allow_all=True, allow_devbox_to_devbox=True, allow_mcp_gateway=True, + allow_runloop_mirrors=True, allowed_cidrs=[ { "cidr": "cidr", From 16c6898f47b8ab6f791fbea7cf647386fb532954 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 22:19:25 +0000 Subject: [PATCH 8/8] release: 1.24.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 20 ++++++++++++++++++++ pyproject.toml | 2 +- src/runloop_api_client/_version.py | 2 +- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 75baea2d1..bfaab56f6 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "1.23.3" + ".": "1.24.0" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 462953953..de0a6c03f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Changelog +## 1.24.0 (2026-07-22) + +Full Changelog: [v1.23.3...v1.24.0](https://github.com/runloopai/api-client-python/compare/v1.23.3...v1.24.0) + +### Features + +* add HTTP/2 load testing infrastructure ([#819](https://github.com/runloopai/api-client-python/issues/819)) ([4ef3c65](https://github.com/runloopai/api-client-python/commit/4ef3c65a2643a093f6589a45428ebd4f1a2bf79e)) +* **api:** add codex broker mount protocol and axon attach enum value ([#10186](https://github.com/runloopai/api-client-python/issues/10186)) ([b3a0a91](https://github.com/runloopai/api-client-python/commit/b3a0a91b5463e47787cce33aa6ad803446e41ecd)) +* **devbox:** rename scheduled -> queued ([#10217](https://github.com/runloopai/api-client-python/issues/10217)) ([f6cc5b7](https://github.com/runloopai/api-client-python/commit/f6cc5b714771564aaa7c5424b21fbd3c87286306)) +* **loadtest:** add pool_check.py to verify shared sync connection pool ([#822](https://github.com/runloopai/api-client-python/issues/822)) ([0000c52](https://github.com/runloopai/api-client-python/commit/0000c52205bb8942942b8dec9f91972e89eebafb)) +* **mux:** expose CIDR egress rules on the network policy API ([#10269](https://github.com/runloopai/api-client-python/issues/10269)) ([b77a065](https://github.com/runloopai/api-client-python/commit/b77a065422042d3a7717c02208e16b72fdddc5e3)) +* **network:** add allow_runloop_mirrors egress flag to network policies ([#10350](https://github.com/runloopai/api-client-python/issues/10350)) ([c042398](https://github.com/runloopai/api-client-python/commit/c04239892931cd1b80d926af8664a461ea426aab)) +* **stlc:** configurable CI runner and private-production-repo support in workflow templates ([6a762cb](https://github.com/runloopai/api-client-python/commit/6a762cb53fbf1b6a2d113874227d0b68caa979dc)) + + +### Bug Fixes + +* **internal:** resolve build failures ([a5b61f3](https://github.com/runloopai/api-client-python/commit/a5b61f3b981d74f4707d132513d59beb4bdb33c2)) +* **mux:** uniform id/name search across list endpoints, close cross-tenant IDOR ([#10267](https://github.com/runloopai/api-client-python/issues/10267)) ([4a40176](https://github.com/runloopai/api-client-python/commit/4a401768ae50e1047d4c6f80384c059112299463)) + ## 1.23.3 (2026-07-10) Full Changelog: [v1.23.2...v1.23.3](https://github.com/runloopai/api-client-python/compare/v1.23.2...v1.23.3) diff --git a/pyproject.toml b/pyproject.toml index c15f2287b..77d099e9e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "runloop_api_client" -version = "1.23.3" +version = "1.24.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 6d0c2b60b..5e32f9066 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.23.3" # x-release-please-version +__version__ = "1.24.0" # x-release-please-version