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