From 70b1ef5a87ad8a36bec9223d2fbbf0b6fa5609b5 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Thu, 2 Apr 2026 23:23:10 +0000
Subject: [PATCH 1/5] codegen metadata
---
.stats.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 9fbd8d524..1990d7c0a 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 116
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-77cfebef736250545ee47fa63d2210f323f096f0cbff4194c4a460a4d0328fd3.yml
-openapi_spec_hash: 33b5de41f43ca91cd3c745b048e68856
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-c3a508fa36d855b159dd7333ecd403c9449f5bea864cd2f9630bea3c983e34a1.yml
+openapi_spec_hash: fc3595ac78e5e050ac0bf1985e643619
config_hash: 6649774d90af30c3559d6a242b6cb4b0
From b7a2ce90183776b620a26732d0831cd902028bee Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 3 Apr 2026 16:26:10 +0000
Subject: [PATCH 2/5] chore(blueprints): deprecate `blueprints.preview()`
method (#8526)
---
.stats.yml | 4 +-
.../resources/blueprints.py | 27 +-
tests/api_resources/test_blueprints.py | 282 +++++++++---------
3 files changed, 169 insertions(+), 144 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 1990d7c0a..9c4d211c6 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 116
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-c3a508fa36d855b159dd7333ecd403c9449f5bea864cd2f9630bea3c983e34a1.yml
-openapi_spec_hash: fc3595ac78e5e050ac0bf1985e643619
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-f7dbf6be046a3a36800422068880c0ad070e3fe818775cf42f66391d98ec4ac1.yml
+openapi_spec_hash: e11e56a256b4c900d3d078005171f3ba
config_hash: 6649774d90af30c3559d6a242b6cb4b0
diff --git a/src/runloop_api_client/resources/blueprints.py b/src/runloop_api_client/resources/blueprints.py
index 7e5b09939..73b15014b 100644
--- a/src/runloop_api_client/resources/blueprints.py
+++ b/src/runloop_api_client/resources/blueprints.py
@@ -2,6 +2,7 @@
from __future__ import annotations
+import typing_extensions
from typing import Dict, Iterable, Optional, TypedDict
import httpx
@@ -669,6 +670,7 @@ def logs(
cast_to=BlueprintBuildLogsListView,
)
+ @typing_extensions.deprecated("deprecated")
def preview(
self,
*,
@@ -1349,6 +1351,7 @@ async def logs(
cast_to=BlueprintBuildLogsListView,
)
+ @typing_extensions.deprecated("deprecated")
async def preview(
self,
*,
@@ -1488,8 +1491,10 @@ def __init__(self, blueprints: BlueprintsResource) -> None:
self.logs = to_raw_response_wrapper(
blueprints.logs,
)
- self.preview = to_raw_response_wrapper(
- blueprints.preview,
+ self.preview = ( # pyright: ignore[reportDeprecated]
+ to_raw_response_wrapper(
+ blueprints.preview, # pyright: ignore[reportDeprecated],
+ )
)
@@ -1518,8 +1523,10 @@ def __init__(self, blueprints: AsyncBlueprintsResource) -> None:
self.logs = async_to_raw_response_wrapper(
blueprints.logs,
)
- self.preview = async_to_raw_response_wrapper(
- blueprints.preview,
+ self.preview = ( # pyright: ignore[reportDeprecated]
+ async_to_raw_response_wrapper(
+ blueprints.preview, # pyright: ignore[reportDeprecated],
+ )
)
@@ -1548,8 +1555,10 @@ def __init__(self, blueprints: BlueprintsResource) -> None:
self.logs = to_streamed_response_wrapper(
blueprints.logs,
)
- self.preview = to_streamed_response_wrapper(
- blueprints.preview,
+ self.preview = ( # pyright: ignore[reportDeprecated]
+ to_streamed_response_wrapper(
+ blueprints.preview, # pyright: ignore[reportDeprecated],
+ )
)
@@ -1578,6 +1587,8 @@ def __init__(self, blueprints: AsyncBlueprintsResource) -> None:
self.logs = async_to_streamed_response_wrapper(
blueprints.logs,
)
- self.preview = async_to_streamed_response_wrapper(
- blueprints.preview,
+ self.preview = ( # pyright: ignore[reportDeprecated]
+ async_to_streamed_response_wrapper(
+ blueprints.preview, # pyright: ignore[reportDeprecated],
+ )
)
diff --git a/tests/api_resources/test_blueprints.py b/tests/api_resources/test_blueprints.py
index 7ae5fada4..8b36a5d3b 100644
--- a/tests/api_resources/test_blueprints.py
+++ b/tests/api_resources/test_blueprints.py
@@ -16,6 +16,8 @@
)
from runloop_api_client.pagination import SyncBlueprintsCursorIDPage, AsyncBlueprintsCursorIDPage
+# pyright: reportDeprecated=false
+
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -394,77 +396,82 @@ def test_path_params_logs(self, client: Runloop) -> None:
@parametrize
def test_method_preview(self, client: Runloop) -> None:
- blueprint = client.blueprints.preview(
- name="name",
- )
+ with pytest.warns(DeprecationWarning):
+ blueprint = client.blueprints.preview(
+ name="name",
+ )
+
assert_matches_type(BlueprintPreviewView, blueprint, path=["response"])
@parametrize
def test_method_preview_with_all_params(self, client: Runloop) -> None:
- blueprint = client.blueprints.preview(
- name="name",
- base_blueprint_id="base_blueprint_id",
- base_blueprint_name="base_blueprint_name",
- build_args={"foo": "string"},
- build_context={
- "object_id": "object_id",
- "type": "object",
- },
- code_mounts=[
- {
- "repo_name": "repo_name",
- "repo_owner": "repo_owner",
- "token": "token",
- "install_command": "install_command",
- }
- ],
- dockerfile="dockerfile",
- file_mounts={"foo": "string"},
- launch_parameters={
- "after_idle": {
- "idle_time_seconds": 0,
- "on_idle": "shutdown",
- },
- "architecture": "x86_64",
- "available_ports": [0],
- "custom_cpu_cores": 0,
- "custom_disk_size": 0,
- "custom_gb_memory": 0,
- "keep_alive_time_seconds": 0,
- "launch_commands": ["string"],
- "network_policy_id": "network_policy_id",
- "required_services": ["string"],
- "resource_size_request": "X_SMALL",
- "user_parameters": {
- "uid": 0,
- "username": "username",
+ with pytest.warns(DeprecationWarning):
+ blueprint = client.blueprints.preview(
+ name="name",
+ base_blueprint_id="base_blueprint_id",
+ base_blueprint_name="base_blueprint_name",
+ build_args={"foo": "string"},
+ build_context={
+ "object_id": "object_id",
+ "type": "object",
},
- },
- metadata={"foo": "string"},
- network_policy_id="network_policy_id",
- secrets={"foo": "string"},
- services=[
- {
- "image": "image",
- "name": "name",
- "credentials": {
- "password": "password",
+ code_mounts=[
+ {
+ "repo_name": "repo_name",
+ "repo_owner": "repo_owner",
+ "token": "token",
+ "install_command": "install_command",
+ }
+ ],
+ dockerfile="dockerfile",
+ file_mounts={"foo": "string"},
+ launch_parameters={
+ "after_idle": {
+ "idle_time_seconds": 0,
+ "on_idle": "shutdown",
+ },
+ "architecture": "x86_64",
+ "available_ports": [0],
+ "custom_cpu_cores": 0,
+ "custom_disk_size": 0,
+ "custom_gb_memory": 0,
+ "keep_alive_time_seconds": 0,
+ "launch_commands": ["string"],
+ "network_policy_id": "network_policy_id",
+ "required_services": ["string"],
+ "resource_size_request": "X_SMALL",
+ "user_parameters": {
+ "uid": 0,
"username": "username",
},
- "env": {"foo": "string"},
- "options": "options",
- "port_mappings": ["string"],
- }
- ],
- system_setup_commands=["string"],
- )
+ },
+ metadata={"foo": "string"},
+ network_policy_id="network_policy_id",
+ secrets={"foo": "string"},
+ services=[
+ {
+ "image": "image",
+ "name": "name",
+ "credentials": {
+ "password": "password",
+ "username": "username",
+ },
+ "env": {"foo": "string"},
+ "options": "options",
+ "port_mappings": ["string"],
+ }
+ ],
+ system_setup_commands=["string"],
+ )
+
assert_matches_type(BlueprintPreviewView, blueprint, path=["response"])
@parametrize
def test_raw_response_preview(self, client: Runloop) -> None:
- response = client.blueprints.with_raw_response.preview(
- name="name",
- )
+ with pytest.warns(DeprecationWarning):
+ response = client.blueprints.with_raw_response.preview(
+ name="name",
+ )
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -473,14 +480,15 @@ def test_raw_response_preview(self, client: Runloop) -> None:
@parametrize
def test_streaming_response_preview(self, client: Runloop) -> None:
- with client.blueprints.with_streaming_response.preview(
- name="name",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ with pytest.warns(DeprecationWarning):
+ with client.blueprints.with_streaming_response.preview(
+ name="name",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- blueprint = response.parse()
- assert_matches_type(BlueprintPreviewView, blueprint, path=["response"])
+ blueprint = response.parse()
+ assert_matches_type(BlueprintPreviewView, blueprint, path=["response"])
assert cast(Any, response.is_closed) is True
@@ -862,77 +870,82 @@ async def test_path_params_logs(self, async_client: AsyncRunloop) -> None:
@parametrize
async def test_method_preview(self, async_client: AsyncRunloop) -> None:
- blueprint = await async_client.blueprints.preview(
- name="name",
- )
+ with pytest.warns(DeprecationWarning):
+ blueprint = await async_client.blueprints.preview(
+ name="name",
+ )
+
assert_matches_type(BlueprintPreviewView, blueprint, path=["response"])
@parametrize
async def test_method_preview_with_all_params(self, async_client: AsyncRunloop) -> None:
- blueprint = await async_client.blueprints.preview(
- name="name",
- base_blueprint_id="base_blueprint_id",
- base_blueprint_name="base_blueprint_name",
- build_args={"foo": "string"},
- build_context={
- "object_id": "object_id",
- "type": "object",
- },
- code_mounts=[
- {
- "repo_name": "repo_name",
- "repo_owner": "repo_owner",
- "token": "token",
- "install_command": "install_command",
- }
- ],
- dockerfile="dockerfile",
- file_mounts={"foo": "string"},
- launch_parameters={
- "after_idle": {
- "idle_time_seconds": 0,
- "on_idle": "shutdown",
- },
- "architecture": "x86_64",
- "available_ports": [0],
- "custom_cpu_cores": 0,
- "custom_disk_size": 0,
- "custom_gb_memory": 0,
- "keep_alive_time_seconds": 0,
- "launch_commands": ["string"],
- "network_policy_id": "network_policy_id",
- "required_services": ["string"],
- "resource_size_request": "X_SMALL",
- "user_parameters": {
- "uid": 0,
- "username": "username",
+ with pytest.warns(DeprecationWarning):
+ blueprint = await async_client.blueprints.preview(
+ name="name",
+ base_blueprint_id="base_blueprint_id",
+ base_blueprint_name="base_blueprint_name",
+ build_args={"foo": "string"},
+ build_context={
+ "object_id": "object_id",
+ "type": "object",
},
- },
- metadata={"foo": "string"},
- network_policy_id="network_policy_id",
- secrets={"foo": "string"},
- services=[
- {
- "image": "image",
- "name": "name",
- "credentials": {
- "password": "password",
+ code_mounts=[
+ {
+ "repo_name": "repo_name",
+ "repo_owner": "repo_owner",
+ "token": "token",
+ "install_command": "install_command",
+ }
+ ],
+ dockerfile="dockerfile",
+ file_mounts={"foo": "string"},
+ launch_parameters={
+ "after_idle": {
+ "idle_time_seconds": 0,
+ "on_idle": "shutdown",
+ },
+ "architecture": "x86_64",
+ "available_ports": [0],
+ "custom_cpu_cores": 0,
+ "custom_disk_size": 0,
+ "custom_gb_memory": 0,
+ "keep_alive_time_seconds": 0,
+ "launch_commands": ["string"],
+ "network_policy_id": "network_policy_id",
+ "required_services": ["string"],
+ "resource_size_request": "X_SMALL",
+ "user_parameters": {
+ "uid": 0,
"username": "username",
},
- "env": {"foo": "string"},
- "options": "options",
- "port_mappings": ["string"],
- }
- ],
- system_setup_commands=["string"],
- )
+ },
+ metadata={"foo": "string"},
+ network_policy_id="network_policy_id",
+ secrets={"foo": "string"},
+ services=[
+ {
+ "image": "image",
+ "name": "name",
+ "credentials": {
+ "password": "password",
+ "username": "username",
+ },
+ "env": {"foo": "string"},
+ "options": "options",
+ "port_mappings": ["string"],
+ }
+ ],
+ system_setup_commands=["string"],
+ )
+
assert_matches_type(BlueprintPreviewView, blueprint, path=["response"])
@parametrize
async def test_raw_response_preview(self, async_client: AsyncRunloop) -> None:
- response = await async_client.blueprints.with_raw_response.preview(
- name="name",
- )
+ with pytest.warns(DeprecationWarning):
+ response = await async_client.blueprints.with_raw_response.preview(
+ name="name",
+ )
assert response.is_closed is True
assert response.http_request.headers.get("X-Stainless-Lang") == "python"
@@ -941,13 +954,14 @@ async def test_raw_response_preview(self, async_client: AsyncRunloop) -> None:
@parametrize
async def test_streaming_response_preview(self, async_client: AsyncRunloop) -> None:
- async with async_client.blueprints.with_streaming_response.preview(
- name="name",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
+ with pytest.warns(DeprecationWarning):
+ async with async_client.blueprints.with_streaming_response.preview(
+ name="name",
+ ) as response:
+ assert not response.is_closed
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- blueprint = await response.parse()
- assert_matches_type(BlueprintPreviewView, blueprint, path=["response"])
+ blueprint = await response.parse()
+ assert_matches_type(BlueprintPreviewView, blueprint, path=["response"])
assert cast(Any, response.is_closed) is True
From b5bfa7d4fad311e07879f8de61aba7df36c8f59a Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 3 Apr 2026 17:18:24 +0000
Subject: [PATCH 3/5] chore: Remove computer and browser use controllers
(#8530)
---
.stats.yml | 8 +-
api.md | 34 -
.../resources/devboxes/__init__.py | 28 -
.../resources/devboxes/browsers.py | 267 --------
.../resources/devboxes/computers.py | 648 ------------------
.../resources/devboxes/devboxes.py | 64 --
.../types/devboxes/__init__.py | 12 -
.../types/devboxes/browser_create_params.py | 13 -
.../types/devboxes/browser_view.py | 29 -
.../types/devboxes/computer_create_params.py | 26 -
.../computer_keyboard_interaction_params.py | 16 -
.../computer_keyboard_interaction_response.py | 15 -
.../computer_mouse_interaction_params.py | 35 -
.../computer_mouse_interaction_response.py | 15 -
.../computer_screen_interaction_params.py | 12 -
.../computer_screen_interaction_response.py | 15 -
.../types/devboxes/computer_view.py | 23 -
tests/api_resources/devboxes/test_browsers.py | 164 -----
.../api_resources/devboxes/test_computers.py | 471 -------------
19 files changed, 4 insertions(+), 1891 deletions(-)
delete mode 100644 src/runloop_api_client/resources/devboxes/browsers.py
delete mode 100644 src/runloop_api_client/resources/devboxes/computers.py
delete mode 100644 src/runloop_api_client/types/devboxes/browser_create_params.py
delete mode 100644 src/runloop_api_client/types/devboxes/browser_view.py
delete mode 100644 src/runloop_api_client/types/devboxes/computer_create_params.py
delete mode 100644 src/runloop_api_client/types/devboxes/computer_keyboard_interaction_params.py
delete mode 100644 src/runloop_api_client/types/devboxes/computer_keyboard_interaction_response.py
delete mode 100644 src/runloop_api_client/types/devboxes/computer_mouse_interaction_params.py
delete mode 100644 src/runloop_api_client/types/devboxes/computer_mouse_interaction_response.py
delete mode 100644 src/runloop_api_client/types/devboxes/computer_screen_interaction_params.py
delete mode 100644 src/runloop_api_client/types/devboxes/computer_screen_interaction_response.py
delete mode 100644 src/runloop_api_client/types/devboxes/computer_view.py
delete mode 100644 tests/api_resources/devboxes/test_browsers.py
delete mode 100644 tests/api_resources/devboxes/test_computers.py
diff --git a/.stats.yml b/.stats.yml
index 9c4d211c6..7863a9862 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 116
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-f7dbf6be046a3a36800422068880c0ad070e3fe818775cf42f66391d98ec4ac1.yml
-openapi_spec_hash: e11e56a256b4c900d3d078005171f3ba
-config_hash: 6649774d90af30c3559d6a242b6cb4b0
+configured_endpoints: 109
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-c2310609d04db8922d1fb4cc7e6174cc4388d9f862998a1223bb0c67d08de58a.yml
+openapi_spec_hash: c61657e61dab41a2ef15177444eac972
+config_hash: ecb1ff09d29b565ed1452b5e0362e64d
diff --git a/api.md b/api.md
index 45195581b..24f4c849e 100644
--- a/api.md
+++ b/api.md
@@ -228,40 +228,6 @@ Methods:
- client.devboxes.disk_snapshots.delete(id) -> object
- client.devboxes.disk_snapshots.query_status(id) -> DevboxSnapshotAsyncStatusView
-## Browsers
-
-Types:
-
-```python
-from runloop_api_client.types.devboxes import BrowserView
-```
-
-Methods:
-
-- client.devboxes.browsers.create(\*\*params) -> BrowserView
-- client.devboxes.browsers.retrieve(id) -> BrowserView
-
-## Computers
-
-Types:
-
-```python
-from runloop_api_client.types.devboxes import (
- ComputerView,
- ComputerKeyboardInteractionResponse,
- ComputerMouseInteractionResponse,
- ComputerScreenInteractionResponse,
-)
-```
-
-Methods:
-
-- client.devboxes.computers.create(\*\*params) -> ComputerView
-- client.devboxes.computers.retrieve(id) -> ComputerView
-- client.devboxes.computers.keyboard_interaction(id, \*\*params) -> ComputerKeyboardInteractionResponse
-- client.devboxes.computers.mouse_interaction(id, \*\*params) -> ComputerMouseInteractionResponse
-- client.devboxes.computers.screen_interaction(id, \*\*params) -> ComputerScreenInteractionResponse
-
## Logs
Types:
diff --git a/src/runloop_api_client/resources/devboxes/__init__.py b/src/runloop_api_client/resources/devboxes/__init__.py
index 164104c7b..a1ada3c44 100644
--- a/src/runloop_api_client/resources/devboxes/__init__.py
+++ b/src/runloop_api_client/resources/devboxes/__init__.py
@@ -8,14 +8,6 @@
LogsResourceWithStreamingResponse,
AsyncLogsResourceWithStreamingResponse,
)
-from .browsers import (
- BrowsersResource,
- AsyncBrowsersResource,
- BrowsersResourceWithRawResponse,
- AsyncBrowsersResourceWithRawResponse,
- BrowsersResourceWithStreamingResponse,
- AsyncBrowsersResourceWithStreamingResponse,
-)
from .devboxes import (
DevboxesResource,
AsyncDevboxesResource,
@@ -24,14 +16,6 @@
DevboxesResourceWithStreamingResponse,
AsyncDevboxesResourceWithStreamingResponse,
)
-from .computers import (
- ComputersResource,
- AsyncComputersResource,
- ComputersResourceWithRawResponse,
- AsyncComputersResourceWithRawResponse,
- ComputersResourceWithStreamingResponse,
- AsyncComputersResourceWithStreamingResponse,
-)
from .executions import (
ExecutionsResource,
AsyncExecutionsResource,
@@ -56,18 +40,6 @@
"AsyncDiskSnapshotsResourceWithRawResponse",
"DiskSnapshotsResourceWithStreamingResponse",
"AsyncDiskSnapshotsResourceWithStreamingResponse",
- "BrowsersResource",
- "AsyncBrowsersResource",
- "BrowsersResourceWithRawResponse",
- "AsyncBrowsersResourceWithRawResponse",
- "BrowsersResourceWithStreamingResponse",
- "AsyncBrowsersResourceWithStreamingResponse",
- "ComputersResource",
- "AsyncComputersResource",
- "ComputersResourceWithRawResponse",
- "AsyncComputersResourceWithRawResponse",
- "ComputersResourceWithStreamingResponse",
- "AsyncComputersResourceWithStreamingResponse",
"LogsResource",
"AsyncLogsResource",
"LogsResourceWithRawResponse",
diff --git a/src/runloop_api_client/resources/devboxes/browsers.py b/src/runloop_api_client/resources/devboxes/browsers.py
deleted file mode 100644
index d2977464b..000000000
--- a/src/runloop_api_client/resources/devboxes/browsers.py
+++ /dev/null
@@ -1,267 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing import Optional
-
-import httpx
-
-from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from ..._utils import path_template, maybe_transform, async_maybe_transform
-from ..._compat import cached_property
-from ..._resource import SyncAPIResource, AsyncAPIResource
-from ..._response import (
- to_raw_response_wrapper,
- to_streamed_response_wrapper,
- async_to_raw_response_wrapper,
- async_to_streamed_response_wrapper,
-)
-from ..._base_client import make_request_options
-from ...types.devboxes import browser_create_params
-from ...types.devboxes.browser_view import BrowserView
-
-__all__ = ["BrowsersResource", "AsyncBrowsersResource"]
-
-
-class BrowsersResource(SyncAPIResource):
- @cached_property
- def with_raw_response(self) -> BrowsersResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/runloopai/api-client-python#accessing-raw-response-data-eg-headers
- """
- return BrowsersResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> BrowsersResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/runloopai/api-client-python#with_streaming_response
- """
- return BrowsersResourceWithStreamingResponse(self)
-
- def create(
- self,
- *,
- name: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- idempotency_key: str | None = None,
- ) -> BrowserView:
- """Create a Devbox that has a managed Browser and begin the boot process.
-
- As part
- of booting the Devbox, the browser will automatically be started with connection
- utilities activated.
-
- Args:
- name: The name to use for the created Devbox with a Browser.
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
-
- idempotency_key: Specify a custom idempotency key for this request
- """
- return self._post(
- "/v1/devboxes/browsers",
- body=maybe_transform({"name": name}, browser_create_params.BrowserCreateParams),
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- idempotency_key=idempotency_key,
- ),
- cast_to=BrowserView,
- )
-
- def retrieve(
- self,
- id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrowserView:
- """
- Get Browser Details.
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return self._get(
- path_template("/v1/devboxes/browsers/{id}", id=id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=BrowserView,
- )
-
-
-class AsyncBrowsersResource(AsyncAPIResource):
- @cached_property
- def with_raw_response(self) -> AsyncBrowsersResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/runloopai/api-client-python#accessing-raw-response-data-eg-headers
- """
- return AsyncBrowsersResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncBrowsersResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/runloopai/api-client-python#with_streaming_response
- """
- return AsyncBrowsersResourceWithStreamingResponse(self)
-
- async def create(
- self,
- *,
- name: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- idempotency_key: str | None = None,
- ) -> BrowserView:
- """Create a Devbox that has a managed Browser and begin the boot process.
-
- As part
- of booting the Devbox, the browser will automatically be started with connection
- utilities activated.
-
- Args:
- name: The name to use for the created Devbox with a Browser.
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
-
- idempotency_key: Specify a custom idempotency key for this request
- """
- return await self._post(
- "/v1/devboxes/browsers",
- body=await async_maybe_transform({"name": name}, browser_create_params.BrowserCreateParams),
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- idempotency_key=idempotency_key,
- ),
- cast_to=BrowserView,
- )
-
- async def retrieve(
- self,
- id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> BrowserView:
- """
- Get Browser Details.
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return await self._get(
- path_template("/v1/devboxes/browsers/{id}", id=id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=BrowserView,
- )
-
-
-class BrowsersResourceWithRawResponse:
- def __init__(self, browsers: BrowsersResource) -> None:
- self._browsers = browsers
-
- self.create = to_raw_response_wrapper(
- browsers.create,
- )
- self.retrieve = to_raw_response_wrapper(
- browsers.retrieve,
- )
-
-
-class AsyncBrowsersResourceWithRawResponse:
- def __init__(self, browsers: AsyncBrowsersResource) -> None:
- self._browsers = browsers
-
- self.create = async_to_raw_response_wrapper(
- browsers.create,
- )
- self.retrieve = async_to_raw_response_wrapper(
- browsers.retrieve,
- )
-
-
-class BrowsersResourceWithStreamingResponse:
- def __init__(self, browsers: BrowsersResource) -> None:
- self._browsers = browsers
-
- self.create = to_streamed_response_wrapper(
- browsers.create,
- )
- self.retrieve = to_streamed_response_wrapper(
- browsers.retrieve,
- )
-
-
-class AsyncBrowsersResourceWithStreamingResponse:
- def __init__(self, browsers: AsyncBrowsersResource) -> None:
- self._browsers = browsers
-
- self.create = async_to_streamed_response_wrapper(
- browsers.create,
- )
- self.retrieve = async_to_streamed_response_wrapper(
- browsers.retrieve,
- )
diff --git a/src/runloop_api_client/resources/devboxes/computers.py b/src/runloop_api_client/resources/devboxes/computers.py
deleted file mode 100644
index 4eddfccc8..000000000
--- a/src/runloop_api_client/resources/devboxes/computers.py
+++ /dev/null
@@ -1,648 +0,0 @@
-# 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
-
-import httpx
-
-from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
-from ..._utils import path_template, maybe_transform, async_maybe_transform
-from ..._compat import cached_property
-from ..._resource import SyncAPIResource, AsyncAPIResource
-from ..._response import (
- to_raw_response_wrapper,
- to_streamed_response_wrapper,
- async_to_raw_response_wrapper,
- async_to_streamed_response_wrapper,
-)
-from ..._base_client import make_request_options
-from ...types.devboxes import (
- computer_create_params,
- computer_mouse_interaction_params,
- computer_screen_interaction_params,
- computer_keyboard_interaction_params,
-)
-from ...types.devboxes.computer_view import ComputerView
-from ...types.devboxes.computer_mouse_interaction_response import ComputerMouseInteractionResponse
-from ...types.devboxes.computer_screen_interaction_response import ComputerScreenInteractionResponse
-from ...types.devboxes.computer_keyboard_interaction_response import ComputerKeyboardInteractionResponse
-
-__all__ = ["ComputersResource", "AsyncComputersResource"]
-
-
-class ComputersResource(SyncAPIResource):
- @cached_property
- def with_raw_response(self) -> ComputersResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/runloopai/api-client-python#accessing-raw-response-data-eg-headers
- """
- return ComputersResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> ComputersResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/runloopai/api-client-python#with_streaming_response
- """
- return ComputersResourceWithStreamingResponse(self)
-
- def create(
- self,
- *,
- display_dimensions: Optional[computer_create_params.DisplayDimensions] | Omit = omit,
- name: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- idempotency_key: str | None = None,
- ) -> ComputerView:
- """Create a Computer and begin the boot process.
-
- The Computer will initially launch
- in the 'provisioning' state while Runloop allocates the necessary
- infrastructure. It will transition to the 'initializing' state while the booted
- Computer runs any Runloop or user defined set up scripts. Finally, the Computer
- will transition to the 'running' state when it is ready for use.
-
- Args:
- display_dimensions: Customize the dimensions of the computer display.
-
- name: The name to use for the created computer.
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
-
- idempotency_key: Specify a custom idempotency key for this request
- """
- return self._post(
- "/v1/devboxes/computers",
- body=maybe_transform(
- {
- "display_dimensions": display_dimensions,
- "name": name,
- },
- computer_create_params.ComputerCreateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- idempotency_key=idempotency_key,
- ),
- cast_to=ComputerView,
- )
-
- def retrieve(
- self,
- id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> ComputerView:
- """
- Get Computer Details.
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return self._get(
- path_template("/v1/devboxes/computers/{id}", id=id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=ComputerView,
- )
-
- def keyboard_interaction(
- self,
- id: str,
- *,
- action: Literal["key", "type"],
- text: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- idempotency_key: str | None = None,
- ) -> ComputerKeyboardInteractionResponse:
- """
- Perform the specified keyboard interaction on the Computer identified by the
- given ID.
-
- Args:
- action: The keyboard action to perform.
-
- text: The text to type or the key (with optional modifier) to press.
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
-
- idempotency_key: Specify a custom idempotency key for this request
- """
- if not id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return self._post(
- path_template("/v1/devboxes/computers/{id}/keyboard_interaction", id=id),
- body=maybe_transform(
- {
- "action": action,
- "text": text,
- },
- computer_keyboard_interaction_params.ComputerKeyboardInteractionParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- idempotency_key=idempotency_key,
- ),
- cast_to=ComputerKeyboardInteractionResponse,
- )
-
- def mouse_interaction(
- self,
- id: str,
- *,
- action: Literal["mouse_move", "left_click", "left_click_drag", "right_click", "middle_click", "double_click"],
- coordinate: Optional[computer_mouse_interaction_params.Coordinate] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- idempotency_key: str | None = None,
- ) -> ComputerMouseInteractionResponse:
- """
- Perform the specified mouse interaction on the Computer identified by the given
- ID.
-
- Args:
- action: The mouse action to perform.
-
- coordinate: The x (pixels from the left) and y (pixels from the top) coordinates for the
- mouse to move or click-drag. Required only by `action=mouse_move` or
- `action=left_click_drag`
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
-
- idempotency_key: Specify a custom idempotency key for this request
- """
- if not id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return self._post(
- path_template("/v1/devboxes/computers/{id}/mouse_interaction", id=id),
- body=maybe_transform(
- {
- "action": action,
- "coordinate": coordinate,
- },
- computer_mouse_interaction_params.ComputerMouseInteractionParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- idempotency_key=idempotency_key,
- ),
- cast_to=ComputerMouseInteractionResponse,
- )
-
- def screen_interaction(
- self,
- id: str,
- *,
- action: Literal["screenshot", "cursor_position"],
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- idempotency_key: str | None = None,
- ) -> ComputerScreenInteractionResponse:
- """
- Perform the specified screen interaction on the Computer identified by the given
- ID.
-
- Args:
- action: The screen action to perform.
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
-
- idempotency_key: Specify a custom idempotency key for this request
- """
- if not id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return self._post(
- path_template("/v1/devboxes/computers/{id}/screen_interaction", id=id),
- body=maybe_transform(
- {"action": action}, computer_screen_interaction_params.ComputerScreenInteractionParams
- ),
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- idempotency_key=idempotency_key,
- ),
- cast_to=ComputerScreenInteractionResponse,
- )
-
-
-class AsyncComputersResource(AsyncAPIResource):
- @cached_property
- def with_raw_response(self) -> AsyncComputersResourceWithRawResponse:
- """
- This property can be used as a prefix for any HTTP method call to return
- the raw response object instead of the parsed content.
-
- For more information, see https://www.github.com/runloopai/api-client-python#accessing-raw-response-data-eg-headers
- """
- return AsyncComputersResourceWithRawResponse(self)
-
- @cached_property
- def with_streaming_response(self) -> AsyncComputersResourceWithStreamingResponse:
- """
- An alternative to `.with_raw_response` that doesn't eagerly read the response body.
-
- For more information, see https://www.github.com/runloopai/api-client-python#with_streaming_response
- """
- return AsyncComputersResourceWithStreamingResponse(self)
-
- async def create(
- self,
- *,
- display_dimensions: Optional[computer_create_params.DisplayDimensions] | Omit = omit,
- name: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- idempotency_key: str | None = None,
- ) -> ComputerView:
- """Create a Computer and begin the boot process.
-
- The Computer will initially launch
- in the 'provisioning' state while Runloop allocates the necessary
- infrastructure. It will transition to the 'initializing' state while the booted
- Computer runs any Runloop or user defined set up scripts. Finally, the Computer
- will transition to the 'running' state when it is ready for use.
-
- Args:
- display_dimensions: Customize the dimensions of the computer display.
-
- name: The name to use for the created computer.
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
-
- idempotency_key: Specify a custom idempotency key for this request
- """
- return await self._post(
- "/v1/devboxes/computers",
- body=await async_maybe_transform(
- {
- "display_dimensions": display_dimensions,
- "name": name,
- },
- computer_create_params.ComputerCreateParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- idempotency_key=idempotency_key,
- ),
- cast_to=ComputerView,
- )
-
- async def retrieve(
- self,
- id: str,
- *,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- ) -> ComputerView:
- """
- Get Computer Details.
-
- Args:
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
- """
- if not id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return await self._get(
- path_template("/v1/devboxes/computers/{id}", id=id),
- options=make_request_options(
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
- ),
- cast_to=ComputerView,
- )
-
- async def keyboard_interaction(
- self,
- id: str,
- *,
- action: Literal["key", "type"],
- text: Optional[str] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- idempotency_key: str | None = None,
- ) -> ComputerKeyboardInteractionResponse:
- """
- Perform the specified keyboard interaction on the Computer identified by the
- given ID.
-
- Args:
- action: The keyboard action to perform.
-
- text: The text to type or the key (with optional modifier) to press.
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
-
- idempotency_key: Specify a custom idempotency key for this request
- """
- if not id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return await self._post(
- path_template("/v1/devboxes/computers/{id}/keyboard_interaction", id=id),
- body=await async_maybe_transform(
- {
- "action": action,
- "text": text,
- },
- computer_keyboard_interaction_params.ComputerKeyboardInteractionParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- idempotency_key=idempotency_key,
- ),
- cast_to=ComputerKeyboardInteractionResponse,
- )
-
- async def mouse_interaction(
- self,
- id: str,
- *,
- action: Literal["mouse_move", "left_click", "left_click_drag", "right_click", "middle_click", "double_click"],
- coordinate: Optional[computer_mouse_interaction_params.Coordinate] | Omit = omit,
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- idempotency_key: str | None = None,
- ) -> ComputerMouseInteractionResponse:
- """
- Perform the specified mouse interaction on the Computer identified by the given
- ID.
-
- Args:
- action: The mouse action to perform.
-
- coordinate: The x (pixels from the left) and y (pixels from the top) coordinates for the
- mouse to move or click-drag. Required only by `action=mouse_move` or
- `action=left_click_drag`
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
-
- idempotency_key: Specify a custom idempotency key for this request
- """
- if not id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return await self._post(
- path_template("/v1/devboxes/computers/{id}/mouse_interaction", id=id),
- body=await async_maybe_transform(
- {
- "action": action,
- "coordinate": coordinate,
- },
- computer_mouse_interaction_params.ComputerMouseInteractionParams,
- ),
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- idempotency_key=idempotency_key,
- ),
- cast_to=ComputerMouseInteractionResponse,
- )
-
- async def screen_interaction(
- self,
- id: str,
- *,
- action: Literal["screenshot", "cursor_position"],
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
- # The extra values given here take precedence over values defined on the client or passed to this method.
- extra_headers: Headers | None = None,
- extra_query: Query | None = None,
- extra_body: Body | None = None,
- timeout: float | httpx.Timeout | None | NotGiven = not_given,
- idempotency_key: str | None = None,
- ) -> ComputerScreenInteractionResponse:
- """
- Perform the specified screen interaction on the Computer identified by the given
- ID.
-
- Args:
- action: The screen action to perform.
-
- extra_headers: Send extra headers
-
- extra_query: Add additional query parameters to the request
-
- extra_body: Add additional JSON properties to the request
-
- timeout: Override the client-level default timeout for this request, in seconds
-
- idempotency_key: Specify a custom idempotency key for this request
- """
- if not id:
- raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
- return await self._post(
- path_template("/v1/devboxes/computers/{id}/screen_interaction", id=id),
- body=await async_maybe_transform(
- {"action": action}, computer_screen_interaction_params.ComputerScreenInteractionParams
- ),
- options=make_request_options(
- extra_headers=extra_headers,
- extra_query=extra_query,
- extra_body=extra_body,
- timeout=timeout,
- idempotency_key=idempotency_key,
- ),
- cast_to=ComputerScreenInteractionResponse,
- )
-
-
-class ComputersResourceWithRawResponse:
- def __init__(self, computers: ComputersResource) -> None:
- self._computers = computers
-
- self.create = to_raw_response_wrapper(
- computers.create,
- )
- self.retrieve = to_raw_response_wrapper(
- computers.retrieve,
- )
- self.keyboard_interaction = to_raw_response_wrapper(
- computers.keyboard_interaction,
- )
- self.mouse_interaction = to_raw_response_wrapper(
- computers.mouse_interaction,
- )
- self.screen_interaction = to_raw_response_wrapper(
- computers.screen_interaction,
- )
-
-
-class AsyncComputersResourceWithRawResponse:
- def __init__(self, computers: AsyncComputersResource) -> None:
- self._computers = computers
-
- self.create = async_to_raw_response_wrapper(
- computers.create,
- )
- self.retrieve = async_to_raw_response_wrapper(
- computers.retrieve,
- )
- self.keyboard_interaction = async_to_raw_response_wrapper(
- computers.keyboard_interaction,
- )
- self.mouse_interaction = async_to_raw_response_wrapper(
- computers.mouse_interaction,
- )
- self.screen_interaction = async_to_raw_response_wrapper(
- computers.screen_interaction,
- )
-
-
-class ComputersResourceWithStreamingResponse:
- def __init__(self, computers: ComputersResource) -> None:
- self._computers = computers
-
- self.create = to_streamed_response_wrapper(
- computers.create,
- )
- self.retrieve = to_streamed_response_wrapper(
- computers.retrieve,
- )
- self.keyboard_interaction = to_streamed_response_wrapper(
- computers.keyboard_interaction,
- )
- self.mouse_interaction = to_streamed_response_wrapper(
- computers.mouse_interaction,
- )
- self.screen_interaction = to_streamed_response_wrapper(
- computers.screen_interaction,
- )
-
-
-class AsyncComputersResourceWithStreamingResponse:
- def __init__(self, computers: AsyncComputersResource) -> None:
- self._computers = computers
-
- self.create = async_to_streamed_response_wrapper(
- computers.create,
- )
- self.retrieve = async_to_streamed_response_wrapper(
- computers.retrieve,
- )
- self.keyboard_interaction = async_to_streamed_response_wrapper(
- computers.keyboard_interaction,
- )
- self.mouse_interaction = async_to_streamed_response_wrapper(
- computers.mouse_interaction,
- )
- self.screen_interaction = async_to_streamed_response_wrapper(
- computers.screen_interaction,
- )
diff --git a/src/runloop_api_client/resources/devboxes/devboxes.py b/src/runloop_api_client/resources/devboxes/devboxes.py
index 3e46b17b6..5db3f18f6 100644
--- a/src/runloop_api_client/resources/devboxes/devboxes.py
+++ b/src/runloop_api_client/resources/devboxes/devboxes.py
@@ -39,23 +39,7 @@
)
from ..._types import Body, Omit, Query, Headers, NotGiven, FileTypes, omit, not_given
from ..._utils import is_given, extract_files, path_template, maybe_transform, deepcopy_minimal, async_maybe_transform
-from .browsers import (
- BrowsersResource,
- AsyncBrowsersResource,
- BrowsersResourceWithRawResponse,
- AsyncBrowsersResourceWithRawResponse,
- BrowsersResourceWithStreamingResponse,
- AsyncBrowsersResourceWithStreamingResponse,
-)
from ..._compat import cached_property
-from .computers import (
- ComputersResource,
- AsyncComputersResource,
- ComputersResourceWithRawResponse,
- AsyncComputersResourceWithRawResponse,
- ComputersResourceWithStreamingResponse,
- AsyncComputersResourceWithStreamingResponse,
-)
from .executions import (
ExecutionsResource,
AsyncExecutionsResource,
@@ -142,14 +126,6 @@ class DevboxesResource(SyncAPIResource):
def disk_snapshots(self) -> DiskSnapshotsResource:
return DiskSnapshotsResource(self._client)
- @cached_property
- def browsers(self) -> BrowsersResource:
- return BrowsersResource(self._client)
-
- @cached_property
- def computers(self) -> ComputersResource:
- return ComputersResource(self._client)
-
@cached_property
def logs(self) -> LogsResource:
return LogsResource(self._client)
@@ -1786,14 +1762,6 @@ class AsyncDevboxesResource(AsyncAPIResource):
def disk_snapshots(self) -> AsyncDiskSnapshotsResource:
return AsyncDiskSnapshotsResource(self._client)
- @cached_property
- def browsers(self) -> AsyncBrowsersResource:
- return AsyncBrowsersResource(self._client)
-
- @cached_property
- def computers(self) -> AsyncComputersResource:
- return AsyncComputersResource(self._client)
-
@cached_property
def logs(self) -> AsyncLogsResource:
return AsyncLogsResource(self._client)
@@ -3507,14 +3475,6 @@ def __init__(self, devboxes: DevboxesResource) -> None:
def disk_snapshots(self) -> DiskSnapshotsResourceWithRawResponse:
return DiskSnapshotsResourceWithRawResponse(self._devboxes.disk_snapshots)
- @cached_property
- def browsers(self) -> BrowsersResourceWithRawResponse:
- return BrowsersResourceWithRawResponse(self._devboxes.browsers)
-
- @cached_property
- def computers(self) -> ComputersResourceWithRawResponse:
- return ComputersResourceWithRawResponse(self._devboxes.computers)
-
@cached_property
def logs(self) -> LogsResourceWithRawResponse:
return LogsResourceWithRawResponse(self._devboxes.logs)
@@ -3608,14 +3568,6 @@ def __init__(self, devboxes: AsyncDevboxesResource) -> None:
def disk_snapshots(self) -> AsyncDiskSnapshotsResourceWithRawResponse:
return AsyncDiskSnapshotsResourceWithRawResponse(self._devboxes.disk_snapshots)
- @cached_property
- def browsers(self) -> AsyncBrowsersResourceWithRawResponse:
- return AsyncBrowsersResourceWithRawResponse(self._devboxes.browsers)
-
- @cached_property
- def computers(self) -> AsyncComputersResourceWithRawResponse:
- return AsyncComputersResourceWithRawResponse(self._devboxes.computers)
-
@cached_property
def logs(self) -> AsyncLogsResourceWithRawResponse:
return AsyncLogsResourceWithRawResponse(self._devboxes.logs)
@@ -3709,14 +3661,6 @@ def __init__(self, devboxes: DevboxesResource) -> None:
def disk_snapshots(self) -> DiskSnapshotsResourceWithStreamingResponse:
return DiskSnapshotsResourceWithStreamingResponse(self._devboxes.disk_snapshots)
- @cached_property
- def browsers(self) -> BrowsersResourceWithStreamingResponse:
- return BrowsersResourceWithStreamingResponse(self._devboxes.browsers)
-
- @cached_property
- def computers(self) -> ComputersResourceWithStreamingResponse:
- return ComputersResourceWithStreamingResponse(self._devboxes.computers)
-
@cached_property
def logs(self) -> LogsResourceWithStreamingResponse:
return LogsResourceWithStreamingResponse(self._devboxes.logs)
@@ -3810,14 +3754,6 @@ def __init__(self, devboxes: AsyncDevboxesResource) -> None:
def disk_snapshots(self) -> AsyncDiskSnapshotsResourceWithStreamingResponse:
return AsyncDiskSnapshotsResourceWithStreamingResponse(self._devboxes.disk_snapshots)
- @cached_property
- def browsers(self) -> AsyncBrowsersResourceWithStreamingResponse:
- return AsyncBrowsersResourceWithStreamingResponse(self._devboxes.browsers)
-
- @cached_property
- def computers(self) -> AsyncComputersResourceWithStreamingResponse:
- return AsyncComputersResourceWithStreamingResponse(self._devboxes.computers)
-
@cached_property
def logs(self) -> AsyncLogsResourceWithStreamingResponse:
return AsyncLogsResourceWithStreamingResponse(self._devboxes.logs)
diff --git a/src/runloop_api_client/types/devboxes/__init__.py b/src/runloop_api_client/types/devboxes/__init__.py
index 0852b4c30..28d607d8d 100644
--- a/src/runloop_api_client/types/devboxes/__init__.py
+++ b/src/runloop_api_client/types/devboxes/__init__.py
@@ -2,13 +2,9 @@
from __future__ import annotations
-from .browser_view import BrowserView as BrowserView
-from .computer_view import ComputerView as ComputerView
from .log_list_params import LogListParams as LogListParams
-from .browser_create_params import BrowserCreateParams as BrowserCreateParams
from .devbox_logs_list_view import DevboxLogsListView as DevboxLogsListView
from .execution_kill_params import ExecutionKillParams as ExecutionKillParams
-from .computer_create_params import ComputerCreateParams as ComputerCreateParams
from .execution_update_chunk import ExecutionUpdateChunk as ExecutionUpdateChunk
from .disk_snapshot_list_params import DiskSnapshotListParams as DiskSnapshotListParams
from .execution_retrieve_params import ExecutionRetrieveParams as ExecutionRetrieveParams
@@ -16,15 +12,7 @@
from .execution_send_std_in_params import ExecutionSendStdInParams as ExecutionSendStdInParams
from .execution_execute_sync_params import ExecutionExecuteSyncParams as ExecutionExecuteSyncParams
from .execution_execute_async_params import ExecutionExecuteAsyncParams as ExecutionExecuteAsyncParams
-from .computer_mouse_interaction_params import ComputerMouseInteractionParams as ComputerMouseInteractionParams
from .devbox_snapshot_async_status_view import DevboxSnapshotAsyncStatusView as DevboxSnapshotAsyncStatusView
-from .computer_screen_interaction_params import ComputerScreenInteractionParams as ComputerScreenInteractionParams
-from .computer_mouse_interaction_response import ComputerMouseInteractionResponse as ComputerMouseInteractionResponse
-from .computer_keyboard_interaction_params import ComputerKeyboardInteractionParams as ComputerKeyboardInteractionParams
-from .computer_screen_interaction_response import ComputerScreenInteractionResponse as ComputerScreenInteractionResponse
-from .computer_keyboard_interaction_response import (
- ComputerKeyboardInteractionResponse as ComputerKeyboardInteractionResponse,
-)
from .execution_stream_stderr_updates_params import (
ExecutionStreamStderrUpdatesParams as ExecutionStreamStderrUpdatesParams,
)
diff --git a/src/runloop_api_client/types/devboxes/browser_create_params.py b/src/runloop_api_client/types/devboxes/browser_create_params.py
deleted file mode 100644
index 523b03be0..000000000
--- a/src/runloop_api_client/types/devboxes/browser_create_params.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# 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 TypedDict
-
-__all__ = ["BrowserCreateParams"]
-
-
-class BrowserCreateParams(TypedDict, total=False):
- name: Optional[str]
- """The name to use for the created Devbox with a Browser."""
diff --git a/src/runloop_api_client/types/devboxes/browser_view.py b/src/runloop_api_client/types/devboxes/browser_view.py
deleted file mode 100644
index 4486d76ec..000000000
--- a/src/runloop_api_client/types/devboxes/browser_view.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from ..._models import BaseModel
-from ..devbox_view import DevboxView
-
-__all__ = ["BrowserView"]
-
-
-class BrowserView(BaseModel):
- """
- A Browser represents a managed implementation of a browser like Chromiumon top of Devboxes. It includes the tunnel to the live screen and the underlying DevboxView.
- """
-
- connection_url: str
- """
- The url to enable remote connection from browser automation tools like
- playwright.
- """
-
- devbox: DevboxView
- """The underlying devbox the browser setup is running on."""
-
- live_view_url: str
- """
- The url to view the browser window and enable user interactions via their own
- browser. You can control the interactivity of the browser by adding or removing
- 'view_only' query parameter. view_only=1 will allow interaction and view_only=0
- will disable interaction.
- """
diff --git a/src/runloop_api_client/types/devboxes/computer_create_params.py b/src/runloop_api_client/types/devboxes/computer_create_params.py
deleted file mode 100644
index c2e32e035..000000000
--- a/src/runloop_api_client/types/devboxes/computer_create_params.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# 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 Required, TypedDict
-
-__all__ = ["ComputerCreateParams", "DisplayDimensions"]
-
-
-class ComputerCreateParams(TypedDict, total=False):
- display_dimensions: Optional[DisplayDimensions]
- """Customize the dimensions of the computer display."""
-
- name: Optional[str]
- """The name to use for the created computer."""
-
-
-class DisplayDimensions(TypedDict, total=False):
- """Customize the dimensions of the computer display."""
-
- display_height_px: Required[int]
- """The height of the display being controlled by the model in pixels."""
-
- display_width_px: Required[int]
- """The width of the display being controlled by the model in pixels."""
diff --git a/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_params.py b/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_params.py
deleted file mode 100644
index c7c2a8f36..000000000
--- a/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_params.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# 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__ = ["ComputerKeyboardInteractionParams"]
-
-
-class ComputerKeyboardInteractionParams(TypedDict, total=False):
- action: Required[Literal["key", "type"]]
- """The keyboard action to perform."""
-
- text: Optional[str]
- """The text to type or the key (with optional modifier) to press."""
diff --git a/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_response.py b/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_response.py
deleted file mode 100644
index 6990bc74a..000000000
--- a/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_response.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Optional
-
-from ..._models import BaseModel
-
-__all__ = ["ComputerKeyboardInteractionResponse"]
-
-
-class ComputerKeyboardInteractionResponse(BaseModel):
- error: Optional[str] = None
-
- latest_screenshot_base64_img: Optional[str] = None
-
- output: Optional[str] = None
diff --git a/src/runloop_api_client/types/devboxes/computer_mouse_interaction_params.py b/src/runloop_api_client/types/devboxes/computer_mouse_interaction_params.py
deleted file mode 100644
index a3a02279d..000000000
--- a/src/runloop_api_client/types/devboxes/computer_mouse_interaction_params.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# 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__ = ["ComputerMouseInteractionParams", "Coordinate"]
-
-
-class ComputerMouseInteractionParams(TypedDict, total=False):
- action: Required[
- Literal["mouse_move", "left_click", "left_click_drag", "right_click", "middle_click", "double_click"]
- ]
- """The mouse action to perform."""
-
- coordinate: Optional[Coordinate]
- """
- The x (pixels from the left) and y (pixels from the top) coordinates for the
- mouse to move or click-drag. Required only by `action=mouse_move` or
- `action=left_click_drag`
- """
-
-
-class Coordinate(TypedDict, total=False):
- """
- The x (pixels from the left) and y (pixels from the top) coordinates for the mouse to move or click-drag. Required only by
- `action=mouse_move` or `action=left_click_drag`
- """
-
- x: Required[int]
- """The x coordinate (pixels from the left) for the mouse to move or click-drag."""
-
- y: Required[int]
- """The y coordinate (pixels from the top) for the mouse to move or click-drag."""
diff --git a/src/runloop_api_client/types/devboxes/computer_mouse_interaction_response.py b/src/runloop_api_client/types/devboxes/computer_mouse_interaction_response.py
deleted file mode 100644
index cbaab9dca..000000000
--- a/src/runloop_api_client/types/devboxes/computer_mouse_interaction_response.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Optional
-
-from ..._models import BaseModel
-
-__all__ = ["ComputerMouseInteractionResponse"]
-
-
-class ComputerMouseInteractionResponse(BaseModel):
- error: Optional[str] = None
-
- latest_screenshot_base64_img: Optional[str] = None
-
- output: Optional[str] = None
diff --git a/src/runloop_api_client/types/devboxes/computer_screen_interaction_params.py b/src/runloop_api_client/types/devboxes/computer_screen_interaction_params.py
deleted file mode 100644
index 8423249b9..000000000
--- a/src/runloop_api_client/types/devboxes/computer_screen_interaction_params.py
+++ /dev/null
@@ -1,12 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-from typing_extensions import Literal, Required, TypedDict
-
-__all__ = ["ComputerScreenInteractionParams"]
-
-
-class ComputerScreenInteractionParams(TypedDict, total=False):
- action: Required[Literal["screenshot", "cursor_position"]]
- """The screen action to perform."""
diff --git a/src/runloop_api_client/types/devboxes/computer_screen_interaction_response.py b/src/runloop_api_client/types/devboxes/computer_screen_interaction_response.py
deleted file mode 100644
index 3ad4cb5cb..000000000
--- a/src/runloop_api_client/types/devboxes/computer_screen_interaction_response.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from typing import Optional
-
-from ..._models import BaseModel
-
-__all__ = ["ComputerScreenInteractionResponse"]
-
-
-class ComputerScreenInteractionResponse(BaseModel):
- error: Optional[str] = None
-
- latest_screenshot_base64_img: Optional[str] = None
-
- output: Optional[str] = None
diff --git a/src/runloop_api_client/types/devboxes/computer_view.py b/src/runloop_api_client/types/devboxes/computer_view.py
deleted file mode 100644
index 4706d44a0..000000000
--- a/src/runloop_api_client/types/devboxes/computer_view.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from ..._models import BaseModel
-from ..devbox_view import DevboxView
-
-__all__ = ["ComputerView"]
-
-
-class ComputerView(BaseModel):
- """
- A Computer represents an implementation of Anthropic Computer usage on top of Devboxes. It includes the tunnel to the live screen and the underlying DevboxView.
- """
-
- devbox: DevboxView
- """The underlying devbox the computer setup is running on."""
-
- live_screen_url: str
- """The http tunnel to connect and view the live screen of the computer.
-
- You can control the interactivity of the browser by adding or removing
- 'view_only' query parameter. view_only=1 will allow interaction and view_only=0
- will disable interaction.
- """
diff --git a/tests/api_resources/devboxes/test_browsers.py b/tests/api_resources/devboxes/test_browsers.py
deleted file mode 100644
index 1e72e079e..000000000
--- a/tests/api_resources/devboxes/test_browsers.py
+++ /dev/null
@@ -1,164 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from tests.utils import assert_matches_type
-from runloop_api_client import Runloop, AsyncRunloop
-from runloop_api_client.types.devboxes import BrowserView
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestBrowsers:
- parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
- @parametrize
- def test_method_create(self, client: Runloop) -> None:
- browser = client.devboxes.browsers.create()
- assert_matches_type(BrowserView, browser, path=["response"])
-
- @parametrize
- def test_method_create_with_all_params(self, client: Runloop) -> None:
- browser = client.devboxes.browsers.create(
- name="name",
- )
- assert_matches_type(BrowserView, browser, path=["response"])
-
- @parametrize
- def test_raw_response_create(self, client: Runloop) -> None:
- response = client.devboxes.browsers.with_raw_response.create()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- browser = response.parse()
- assert_matches_type(BrowserView, browser, path=["response"])
-
- @parametrize
- def test_streaming_response_create(self, client: Runloop) -> None:
- with client.devboxes.browsers.with_streaming_response.create() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- browser = response.parse()
- assert_matches_type(BrowserView, browser, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- def test_method_retrieve(self, client: Runloop) -> None:
- browser = client.devboxes.browsers.retrieve(
- "id",
- )
- assert_matches_type(BrowserView, browser, path=["response"])
-
- @parametrize
- def test_raw_response_retrieve(self, client: Runloop) -> None:
- response = client.devboxes.browsers.with_raw_response.retrieve(
- "id",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- browser = response.parse()
- assert_matches_type(BrowserView, browser, path=["response"])
-
- @parametrize
- def test_streaming_response_retrieve(self, client: Runloop) -> None:
- with client.devboxes.browsers.with_streaming_response.retrieve(
- "id",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- browser = response.parse()
- assert_matches_type(BrowserView, browser, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- def test_path_params_retrieve(self, client: Runloop) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- client.devboxes.browsers.with_raw_response.retrieve(
- "",
- )
-
-
-class TestAsyncBrowsers:
- parametrize = pytest.mark.parametrize(
- "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
- )
-
- @parametrize
- async def test_method_create(self, async_client: AsyncRunloop) -> None:
- browser = await async_client.devboxes.browsers.create()
- assert_matches_type(BrowserView, browser, path=["response"])
-
- @parametrize
- async def test_method_create_with_all_params(self, async_client: AsyncRunloop) -> None:
- browser = await async_client.devboxes.browsers.create(
- name="name",
- )
- assert_matches_type(BrowserView, browser, path=["response"])
-
- @parametrize
- async def test_raw_response_create(self, async_client: AsyncRunloop) -> None:
- response = await async_client.devboxes.browsers.with_raw_response.create()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- browser = await response.parse()
- assert_matches_type(BrowserView, browser, path=["response"])
-
- @parametrize
- async def test_streaming_response_create(self, async_client: AsyncRunloop) -> None:
- async with async_client.devboxes.browsers.with_streaming_response.create() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- browser = await response.parse()
- assert_matches_type(BrowserView, browser, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- async def test_method_retrieve(self, async_client: AsyncRunloop) -> None:
- browser = await async_client.devboxes.browsers.retrieve(
- "id",
- )
- assert_matches_type(BrowserView, browser, path=["response"])
-
- @parametrize
- async def test_raw_response_retrieve(self, async_client: AsyncRunloop) -> None:
- response = await async_client.devboxes.browsers.with_raw_response.retrieve(
- "id",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- browser = await response.parse()
- assert_matches_type(BrowserView, browser, path=["response"])
-
- @parametrize
- async def test_streaming_response_retrieve(self, async_client: AsyncRunloop) -> None:
- async with async_client.devboxes.browsers.with_streaming_response.retrieve(
- "id",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- browser = await response.parse()
- assert_matches_type(BrowserView, browser, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- async def test_path_params_retrieve(self, async_client: AsyncRunloop) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- await async_client.devboxes.browsers.with_raw_response.retrieve(
- "",
- )
diff --git a/tests/api_resources/devboxes/test_computers.py b/tests/api_resources/devboxes/test_computers.py
deleted file mode 100644
index a7cbf4e52..000000000
--- a/tests/api_resources/devboxes/test_computers.py
+++ /dev/null
@@ -1,471 +0,0 @@
-# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
-
-from __future__ import annotations
-
-import os
-from typing import Any, cast
-
-import pytest
-
-from tests.utils import assert_matches_type
-from runloop_api_client import Runloop, AsyncRunloop
-from runloop_api_client.types.devboxes import (
- ComputerView,
- ComputerMouseInteractionResponse,
- ComputerScreenInteractionResponse,
- ComputerKeyboardInteractionResponse,
-)
-
-base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
-
-
-class TestComputers:
- parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"])
-
- @parametrize
- def test_method_create(self, client: Runloop) -> None:
- computer = client.devboxes.computers.create()
- assert_matches_type(ComputerView, computer, path=["response"])
-
- @parametrize
- def test_method_create_with_all_params(self, client: Runloop) -> None:
- computer = client.devboxes.computers.create(
- display_dimensions={
- "display_height_px": 0,
- "display_width_px": 0,
- },
- name="name",
- )
- assert_matches_type(ComputerView, computer, path=["response"])
-
- @parametrize
- def test_raw_response_create(self, client: Runloop) -> None:
- response = client.devboxes.computers.with_raw_response.create()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- computer = response.parse()
- assert_matches_type(ComputerView, computer, path=["response"])
-
- @parametrize
- def test_streaming_response_create(self, client: Runloop) -> None:
- with client.devboxes.computers.with_streaming_response.create() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- computer = response.parse()
- assert_matches_type(ComputerView, computer, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- def test_method_retrieve(self, client: Runloop) -> None:
- computer = client.devboxes.computers.retrieve(
- "id",
- )
- assert_matches_type(ComputerView, computer, path=["response"])
-
- @parametrize
- def test_raw_response_retrieve(self, client: Runloop) -> None:
- response = client.devboxes.computers.with_raw_response.retrieve(
- "id",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- computer = response.parse()
- assert_matches_type(ComputerView, computer, path=["response"])
-
- @parametrize
- def test_streaming_response_retrieve(self, client: Runloop) -> None:
- with client.devboxes.computers.with_streaming_response.retrieve(
- "id",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- computer = response.parse()
- assert_matches_type(ComputerView, computer, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- def test_path_params_retrieve(self, client: Runloop) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- client.devboxes.computers.with_raw_response.retrieve(
- "",
- )
-
- @parametrize
- def test_method_keyboard_interaction(self, client: Runloop) -> None:
- computer = client.devboxes.computers.keyboard_interaction(
- id="id",
- action="key",
- )
- assert_matches_type(ComputerKeyboardInteractionResponse, computer, path=["response"])
-
- @parametrize
- def test_method_keyboard_interaction_with_all_params(self, client: Runloop) -> None:
- computer = client.devboxes.computers.keyboard_interaction(
- id="id",
- action="key",
- text="text",
- )
- assert_matches_type(ComputerKeyboardInteractionResponse, computer, path=["response"])
-
- @parametrize
- def test_raw_response_keyboard_interaction(self, client: Runloop) -> None:
- response = client.devboxes.computers.with_raw_response.keyboard_interaction(
- id="id",
- action="key",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- computer = response.parse()
- assert_matches_type(ComputerKeyboardInteractionResponse, computer, path=["response"])
-
- @parametrize
- def test_streaming_response_keyboard_interaction(self, client: Runloop) -> None:
- with client.devboxes.computers.with_streaming_response.keyboard_interaction(
- id="id",
- action="key",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- computer = response.parse()
- assert_matches_type(ComputerKeyboardInteractionResponse, computer, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- def test_path_params_keyboard_interaction(self, client: Runloop) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- client.devboxes.computers.with_raw_response.keyboard_interaction(
- id="",
- action="key",
- )
-
- @parametrize
- def test_method_mouse_interaction(self, client: Runloop) -> None:
- computer = client.devboxes.computers.mouse_interaction(
- id="id",
- action="mouse_move",
- )
- assert_matches_type(ComputerMouseInteractionResponse, computer, path=["response"])
-
- @parametrize
- def test_method_mouse_interaction_with_all_params(self, client: Runloop) -> None:
- computer = client.devboxes.computers.mouse_interaction(
- id="id",
- action="mouse_move",
- coordinate={
- "x": 0,
- "y": 0,
- },
- )
- assert_matches_type(ComputerMouseInteractionResponse, computer, path=["response"])
-
- @parametrize
- def test_raw_response_mouse_interaction(self, client: Runloop) -> None:
- response = client.devboxes.computers.with_raw_response.mouse_interaction(
- id="id",
- action="mouse_move",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- computer = response.parse()
- assert_matches_type(ComputerMouseInteractionResponse, computer, path=["response"])
-
- @parametrize
- def test_streaming_response_mouse_interaction(self, client: Runloop) -> None:
- with client.devboxes.computers.with_streaming_response.mouse_interaction(
- id="id",
- action="mouse_move",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- computer = response.parse()
- assert_matches_type(ComputerMouseInteractionResponse, computer, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- def test_path_params_mouse_interaction(self, client: Runloop) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- client.devboxes.computers.with_raw_response.mouse_interaction(
- id="",
- action="mouse_move",
- )
-
- @parametrize
- def test_method_screen_interaction(self, client: Runloop) -> None:
- computer = client.devboxes.computers.screen_interaction(
- id="id",
- action="screenshot",
- )
- assert_matches_type(ComputerScreenInteractionResponse, computer, path=["response"])
-
- @parametrize
- def test_raw_response_screen_interaction(self, client: Runloop) -> None:
- response = client.devboxes.computers.with_raw_response.screen_interaction(
- id="id",
- action="screenshot",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- computer = response.parse()
- assert_matches_type(ComputerScreenInteractionResponse, computer, path=["response"])
-
- @parametrize
- def test_streaming_response_screen_interaction(self, client: Runloop) -> None:
- with client.devboxes.computers.with_streaming_response.screen_interaction(
- id="id",
- action="screenshot",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- computer = response.parse()
- assert_matches_type(ComputerScreenInteractionResponse, computer, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- def test_path_params_screen_interaction(self, client: Runloop) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- client.devboxes.computers.with_raw_response.screen_interaction(
- id="",
- action="screenshot",
- )
-
-
-class TestAsyncComputers:
- parametrize = pytest.mark.parametrize(
- "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"]
- )
-
- @parametrize
- async def test_method_create(self, async_client: AsyncRunloop) -> None:
- computer = await async_client.devboxes.computers.create()
- assert_matches_type(ComputerView, computer, path=["response"])
-
- @parametrize
- async def test_method_create_with_all_params(self, async_client: AsyncRunloop) -> None:
- computer = await async_client.devboxes.computers.create(
- display_dimensions={
- "display_height_px": 0,
- "display_width_px": 0,
- },
- name="name",
- )
- assert_matches_type(ComputerView, computer, path=["response"])
-
- @parametrize
- async def test_raw_response_create(self, async_client: AsyncRunloop) -> None:
- response = await async_client.devboxes.computers.with_raw_response.create()
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- computer = await response.parse()
- assert_matches_type(ComputerView, computer, path=["response"])
-
- @parametrize
- async def test_streaming_response_create(self, async_client: AsyncRunloop) -> None:
- async with async_client.devboxes.computers.with_streaming_response.create() as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- computer = await response.parse()
- assert_matches_type(ComputerView, computer, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- async def test_method_retrieve(self, async_client: AsyncRunloop) -> None:
- computer = await async_client.devboxes.computers.retrieve(
- "id",
- )
- assert_matches_type(ComputerView, computer, path=["response"])
-
- @parametrize
- async def test_raw_response_retrieve(self, async_client: AsyncRunloop) -> None:
- response = await async_client.devboxes.computers.with_raw_response.retrieve(
- "id",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- computer = await response.parse()
- assert_matches_type(ComputerView, computer, path=["response"])
-
- @parametrize
- async def test_streaming_response_retrieve(self, async_client: AsyncRunloop) -> None:
- async with async_client.devboxes.computers.with_streaming_response.retrieve(
- "id",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- computer = await response.parse()
- assert_matches_type(ComputerView, computer, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- async def test_path_params_retrieve(self, async_client: AsyncRunloop) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- await async_client.devboxes.computers.with_raw_response.retrieve(
- "",
- )
-
- @parametrize
- async def test_method_keyboard_interaction(self, async_client: AsyncRunloop) -> None:
- computer = await async_client.devboxes.computers.keyboard_interaction(
- id="id",
- action="key",
- )
- assert_matches_type(ComputerKeyboardInteractionResponse, computer, path=["response"])
-
- @parametrize
- async def test_method_keyboard_interaction_with_all_params(self, async_client: AsyncRunloop) -> None:
- computer = await async_client.devboxes.computers.keyboard_interaction(
- id="id",
- action="key",
- text="text",
- )
- assert_matches_type(ComputerKeyboardInteractionResponse, computer, path=["response"])
-
- @parametrize
- async def test_raw_response_keyboard_interaction(self, async_client: AsyncRunloop) -> None:
- response = await async_client.devboxes.computers.with_raw_response.keyboard_interaction(
- id="id",
- action="key",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- computer = await response.parse()
- assert_matches_type(ComputerKeyboardInteractionResponse, computer, path=["response"])
-
- @parametrize
- async def test_streaming_response_keyboard_interaction(self, async_client: AsyncRunloop) -> None:
- async with async_client.devboxes.computers.with_streaming_response.keyboard_interaction(
- id="id",
- action="key",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- computer = await response.parse()
- assert_matches_type(ComputerKeyboardInteractionResponse, computer, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- async def test_path_params_keyboard_interaction(self, async_client: AsyncRunloop) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- await async_client.devboxes.computers.with_raw_response.keyboard_interaction(
- id="",
- action="key",
- )
-
- @parametrize
- async def test_method_mouse_interaction(self, async_client: AsyncRunloop) -> None:
- computer = await async_client.devboxes.computers.mouse_interaction(
- id="id",
- action="mouse_move",
- )
- assert_matches_type(ComputerMouseInteractionResponse, computer, path=["response"])
-
- @parametrize
- async def test_method_mouse_interaction_with_all_params(self, async_client: AsyncRunloop) -> None:
- computer = await async_client.devboxes.computers.mouse_interaction(
- id="id",
- action="mouse_move",
- coordinate={
- "x": 0,
- "y": 0,
- },
- )
- assert_matches_type(ComputerMouseInteractionResponse, computer, path=["response"])
-
- @parametrize
- async def test_raw_response_mouse_interaction(self, async_client: AsyncRunloop) -> None:
- response = await async_client.devboxes.computers.with_raw_response.mouse_interaction(
- id="id",
- action="mouse_move",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- computer = await response.parse()
- assert_matches_type(ComputerMouseInteractionResponse, computer, path=["response"])
-
- @parametrize
- async def test_streaming_response_mouse_interaction(self, async_client: AsyncRunloop) -> None:
- async with async_client.devboxes.computers.with_streaming_response.mouse_interaction(
- id="id",
- action="mouse_move",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- computer = await response.parse()
- assert_matches_type(ComputerMouseInteractionResponse, computer, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- async def test_path_params_mouse_interaction(self, async_client: AsyncRunloop) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- await async_client.devboxes.computers.with_raw_response.mouse_interaction(
- id="",
- action="mouse_move",
- )
-
- @parametrize
- async def test_method_screen_interaction(self, async_client: AsyncRunloop) -> None:
- computer = await async_client.devboxes.computers.screen_interaction(
- id="id",
- action="screenshot",
- )
- assert_matches_type(ComputerScreenInteractionResponse, computer, path=["response"])
-
- @parametrize
- async def test_raw_response_screen_interaction(self, async_client: AsyncRunloop) -> None:
- response = await async_client.devboxes.computers.with_raw_response.screen_interaction(
- id="id",
- action="screenshot",
- )
-
- assert response.is_closed is True
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
- computer = await response.parse()
- assert_matches_type(ComputerScreenInteractionResponse, computer, path=["response"])
-
- @parametrize
- async def test_streaming_response_screen_interaction(self, async_client: AsyncRunloop) -> None:
- async with async_client.devboxes.computers.with_streaming_response.screen_interaction(
- id="id",
- action="screenshot",
- ) as response:
- assert not response.is_closed
- assert response.http_request.headers.get("X-Stainless-Lang") == "python"
-
- computer = await response.parse()
- assert_matches_type(ComputerScreenInteractionResponse, computer, path=["response"])
-
- assert cast(Any, response.is_closed) is True
-
- @parametrize
- async def test_path_params_screen_interaction(self, async_client: AsyncRunloop) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
- await async_client.devboxes.computers.with_raw_response.screen_interaction(
- id="",
- action="screenshot",
- )
From 2b271486e74ba2da1a0ee96b0a8a7187d5b154f3 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 3 Apr 2026 18:31:24 +0000
Subject: [PATCH 4/5] feat: add specific message when a devbox fails due to
missing its health checks (#8535)
---
.stats.yml | 4 ++--
src/runloop_api_client/types/devbox_view.py | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index 7863a9862..791eb0d2e 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 109
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-c2310609d04db8922d1fb4cc7e6174cc4388d9f862998a1223bb0c67d08de58a.yml
-openapi_spec_hash: c61657e61dab41a2ef15177444eac972
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/runloop-ai%2Frunloop-b0d4f639559e78ee64d536a35464cff1ef1928e92c2a32a0384dc887da662ef3.yml
+openapi_spec_hash: a822f02fec32ae89e2bc6a6f95b8845f
config_hash: ecb1ff09d29b565ed1452b5e0362e64d
diff --git a/src/runloop_api_client/types/devbox_view.py b/src/runloop_api_client/types/devbox_view.py
index cdd37cf1f..401f1b073 100644
--- a/src/runloop_api_client/types/devbox_view.py
+++ b/src/runloop_api_client/types/devbox_view.py
@@ -92,7 +92,7 @@ class DevboxView(BaseModel):
a Blueprint.
"""
- failure_reason: Optional[Literal["out_of_memory", "out_of_disk", "execution_failed"]] = None
+ failure_reason: Optional[Literal["out_of_memory", "out_of_disk", "execution_failed", "health_check_failed"]] = None
"""The failure reason if the Devbox failed, if the Devbox has a 'failure' status."""
gateway_specs: Optional[Dict[str, GatewaySpecs]] = None
From 4fd3397ce7be88062f0a70b4f883b8b01d9b4d97 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Fri, 3 Apr 2026 18:32:08 +0000
Subject: [PATCH 5/5] release: 1.16.0
---
.release-please-manifest.json | 2 +-
CHANGELOG.md | 14 ++++++++++++++
pyproject.toml | 2 +-
src/runloop_api_client/_version.py | 2 +-
4 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 7ccfe12c9..bc845f32a 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "1.15.0"
+ ".": "1.16.0"
}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index acce86aad..1da26f72e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,19 @@
# Changelog
+## 1.16.0 (2026-04-03)
+
+Full Changelog: [v1.15.0...v1.16.0](https://github.com/runloopai/api-client-python/compare/v1.15.0...v1.16.0)
+
+### Features
+
+* add specific message when a devbox fails due to missing its health checks ([#8535](https://github.com/runloopai/api-client-python/issues/8535)) ([2b27148](https://github.com/runloopai/api-client-python/commit/2b271486e74ba2da1a0ee96b0a8a7187d5b154f3))
+
+
+### Chores
+
+* **blueprints:** deprecate `blueprints.preview()` method ([#8526](https://github.com/runloopai/api-client-python/issues/8526)) ([b7a2ce9](https://github.com/runloopai/api-client-python/commit/b7a2ce90183776b620a26732d0831cd902028bee))
+* Remove computer and browser use controllers ([#8530](https://github.com/runloopai/api-client-python/issues/8530)) ([b5bfa7d](https://github.com/runloopai/api-client-python/commit/b5bfa7d4fad311e07879f8de61aba7df36c8f59a))
+
## 1.15.0 (2026-04-02)
Full Changelog: [v1.14.1...v1.15.0](https://github.com/runloopai/api-client-python/compare/v1.14.1...v1.15.0)
diff --git a/pyproject.toml b/pyproject.toml
index 87ca14cc9..7c5db1fa5 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "runloop_api_client"
-version = "1.15.0"
+version = "1.16.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 a6ed9953d..9b52bccf6 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.15.0" # x-release-please-version
+__version__ = "1.16.0" # x-release-please-version