ComputerUse
class ComputerUse()Computer Use functionality for interacting with the desktop environment.
Provides access to mouse, keyboard, screenshot, display, recording, and accessibility operations for automating desktop interactions within a sandbox.
Attributes:
mouseMouse - Mouse operations interface.keyboardKeyboard - Keyboard operations interface.screenshotScreenshot - Screenshot operations interface.displayDisplay - Display operations interface.recordingRecordingService - Screen recording operations interface.accessibilityAccessibility - Accessibility operations interface.
ComputerUse.start
@intercept_errors(message_prefix="Failed to start computer use: ")
@with_instrumentation()
def start(request_timeout: float | None = None) -> ComputerUseStartResponseStarts all computer use processes (Xvfb, xfce4, x11vnc, novnc).
Arguments:
request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
ComputerUseStartResponse- Computer use start response.
Example:
result = sandbox.computer_use.start()
print("Computer use processes started:", result.message)ComputerUse.stop
@intercept_errors(message_prefix="Failed to stop computer use: ")
@with_instrumentation()
def stop(request_timeout: float | None = None) -> ComputerUseStopResponseStops all computer use processes.
Arguments:
request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
ComputerUseStopResponse- Computer use stop response.
Example:
result = sandbox.computer_use.stop()
print("Computer use processes stopped:", result.message)ComputerUse.get_status
@intercept_errors(message_prefix="Failed to get computer use status: ")
@with_instrumentation()
def get_status(
request_timeout: float | None = None) -> ComputerUseStatusResponseGets the status of all computer use processes.
Arguments:
request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
ComputerUseStatusResponse- Status information about all VNC desktop processes.
Example:
response = sandbox.computer_use.get_status()
print("Computer use status:", response.status)ComputerUse.get_process_status
@intercept_errors(message_prefix="Failed to get process status: ")
@with_instrumentation()
def get_process_status(
process_name: str,
request_timeout: float | None = None) -> ProcessStatusResponseGets the status of a specific VNC process.
Arguments:
process_namestr - Name of the process to check.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
ProcessStatusResponse- Status information about the specific process.
Example:
xvfb_status = sandbox.computer_use.get_process_status("xvfb")
no_vnc_status = sandbox.computer_use.get_process_status("novnc")ComputerUse.restart_process
@intercept_errors(message_prefix="Failed to restart process: ")
@with_instrumentation()
def restart_process(
process_name: str,
request_timeout: float | None = None) -> ProcessRestartResponseRestarts a specific VNC process.
Arguments:
process_namestr - Name of the process to restart.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
ProcessRestartResponse- Process restart response.
Example:
result = sandbox.computer_use.restart_process("xfce4")
print("XFCE4 process restarted:", result.message)ComputerUse.get_process_logs
@intercept_errors(message_prefix="Failed to get process logs: ")
@with_instrumentation()
def get_process_logs(
process_name: str,
request_timeout: float | None = None) -> ProcessLogsResponseGets logs for a specific VNC process.
Arguments:
process_namestr - Name of the process to get logs for.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
ProcessLogsResponse- Process logs.
Example:
logs = sandbox.computer_use.get_process_logs("novnc")
print("NoVNC logs:", logs)ComputerUse.get_process_errors
@intercept_errors(message_prefix="Failed to get process errors: ")
@with_instrumentation()
def get_process_errors(
process_name: str,
request_timeout: float | None = None) -> ProcessErrorsResponseGets error logs for a specific VNC process.
Arguments:
process_namestr - Name of the process to get error logs for.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
ProcessErrorsResponse- Process error logs.
Example:
errors = sandbox.computer_use.get_process_errors("x11vnc")
print("X11VNC errors:", errors)Mouse
class Mouse()Mouse operations for computer use functionality.
Mouse.get_position
@intercept_errors(message_prefix="Failed to get mouse position: ")
@with_instrumentation()
def get_position(
request_timeout: float | None = None) -> MousePositionResponseGets the current mouse cursor position.
Arguments:
request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
MousePositionResponse- Current mouse position with x and y coordinates.
Example:
position = sandbox.computer_use.mouse.get_position()
print(f"Mouse is at: {position.x}, {position.y}")Mouse.move
@intercept_errors(message_prefix="Failed to move mouse: ")
@with_instrumentation()
def move(x: int,
y: int,
request_timeout: float | None = None) -> MousePositionResponseMoves the mouse cursor to the specified coordinates.
Arguments:
xint - The x coordinate to move to.yint - The y coordinate to move to.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
MousePositionResponse- Position after move.
Example:
result = sandbox.computer_use.mouse.move(100, 200)
print(f"Mouse moved to: {result.x}, {result.y}")Mouse.down
@intercept_errors(message_prefix="Failed to press mouse button: ")
@with_instrumentation()
def down(x: int | None = None,
y: int | None = None,
button: str = "left",
request_timeout: float | None = None) -> MousePositionResponsePresses and holds a mouse button until a matching up() call.
Coordinates are optional. When both are provided the cursor moves there before the button is pressed; when omitted the button is pressed wherever the cursor already is.
Arguments:
xint | None - Optional x coordinate to move to before pressing.yint | None - Optional y coordinate to move to before pressing.buttonstr - The mouse button to press ('left', 'right', 'middle').request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
MousePositionResponse- Mouse position after the button press.
Example:
# Press at the current cursor position
sandbox.computer_use.mouse.down()
# Move to a point and press the left button, then release it there
sandbox.computer_use.mouse.down(100, 200)
sandbox.computer_use.mouse.up(100, 200)
# Hold modifiers around a drag by using the keyboard endpoints. Release in
# `finally` so a failed press cannot leave Shift stuck down.
sandbox.computer_use.keyboard.down("shift")
try:
sandbox.computer_use.mouse.down(100, 200)
sandbox.computer_use.mouse.up(300, 400)
finally:
sandbox.computer_use.keyboard.up("shift")Mouse.up
@intercept_errors(message_prefix="Failed to release mouse button: ")
@with_instrumentation()
def up(x: int | None = None,
y: int | None = None,
button: str = "left",
request_timeout: float | None = None) -> MousePositionResponseReleases a mouse button that is currently held down.
Coordinates are optional. When both are provided the cursor moves there before the button is released, which is how a press-move-release drag is composed manually.
Arguments:
xint | None - Optional x coordinate to move to before releasing.yint | None - Optional y coordinate to move to before releasing.buttonstr - The mouse button to release ('left', 'right', 'middle').request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
MousePositionResponse- Mouse position after the button release.
Example:
# Release at the current cursor position
sandbox.computer_use.mouse.up()
# Release the right button at a specific point
result = sandbox.computer_use.mouse.up(300, 400, "right")
print(f"Released at: {result.x}, {result.y}")Mouse.click
@intercept_errors(message_prefix="Failed to click mouse: ")
@with_instrumentation()
def click(x: int,
y: int,
button: str = "left",
double: bool = False,
request_timeout: float | None = None,
*,
clicks: int | None = None,
modifiers: list[str] | None = None) -> MouseClickResponseClicks the mouse at the specified coordinates.
Arguments:
xint - The x coordinate to click at.yint - The y coordinate to click at.buttonstr - The mouse button to click ('left', 'right', 'middle').doublebool - Whether to perform a double-click.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.clicksint | None - Explicit number of clicks to perform, from 1 to 10. When bothclicksanddoubleare given,clickswins overdouble, mirroring the API. Omit it to keep thedoublebehavior.modifierslist[str] | None - Modifier keys to hold for the duration of the click. Canonical modifier names are 'ctrl', 'alt', 'shift', and 'cmd'. Common aliases such as 'control', 'option', 'meta', and 'win' are normalized.
Returns:
MouseClickResponse- Click operation result.
Example:
# Single left click
result = sandbox.computer_use.mouse.click(100, 200)
# Double click
double_click = sandbox.computer_use.mouse.click(100, 200, "left", True)
# Right click
right_click = sandbox.computer_use.mouse.click(100, 200, "right")
# Triple click
triple_click = sandbox.computer_use.mouse.click(100, 200, clicks=3)
# Ctrl+click
ctrl_click = sandbox.computer_use.mouse.click(100, 200, modifiers=["ctrl"])Mouse.drag
@intercept_errors(message_prefix="Failed to drag mouse: ")
@with_instrumentation()
def drag(start_x: int,
start_y: int,
end_x: int,
end_y: int,
button: str = "left",
request_timeout: float | None = None,
*,
modifiers: list[str] | None = None) -> MouseDragResponseDrags the mouse from start coordinates to end coordinates.
Arguments:
start_xint - The starting x coordinate.start_yint - The starting y coordinate.end_xint - The ending x coordinate.end_yint - The ending y coordinate.buttonstr - The mouse button to use for dragging.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.modifierslist[str] | None - Modifier keys to hold for the duration of the drag. Canonical modifier names are 'ctrl', 'alt', 'shift', and 'cmd'. Common aliases such as 'control', 'option', 'meta', and 'win' are normalized.
Returns:
MouseDragResponse- Drag operation result.
Example:
result = sandbox.computer_use.mouse.drag(50, 50, 150, 150)
print(f"Drag ended at {result.x}, {result.y}")
# Shift-constrained drag
constrained = sandbox.computer_use.mouse.drag(50, 50, 150, 150, modifiers=["shift"])Mouse.scroll
@intercept_errors(message_prefix="Failed to scroll mouse: ")
@with_instrumentation()
def scroll(x: int,
y: int,
direction: str,
amount: int = 1,
request_timeout: float | None = None,
*,
modifiers: list[str] | None = None) -> boolScrolls the mouse wheel at the specified coordinates.
Arguments:
xint - The x coordinate to scroll at.yint - The y coordinate to scroll at.directionstr - The direction to scroll ('up', 'down', 'left', or 'right').amountint - The amount to scroll.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.modifierslist[str] | None - Modifier keys to hold for the duration of the scroll. Canonical modifier names are 'ctrl', 'alt', 'shift', and 'cmd'. Common aliases such as 'control', 'option', 'meta', and 'win' are normalized.
Returns:
bool- Whether the scroll operation was successful.
Example:
# Scroll up
scroll_up = sandbox.computer_use.mouse.scroll(100, 200, "up", 3)
# Scroll down
scroll_down = sandbox.computer_use.mouse.scroll(100, 200, "down", 5)
# Scroll horizontally
scroll_left = sandbox.computer_use.mouse.scroll(100, 200, "left", 2)
# Ctrl+scroll to zoom
zoom_in = sandbox.computer_use.mouse.scroll(100, 200, "up", 1, modifiers=["ctrl"])Keyboard
class Keyboard()Keyboard operations for computer use functionality.
Keyboard.type
@intercept_errors(message_prefix="Failed to type text: ")
@with_instrumentation()
def type(text: str,
delay: int | None = None,
request_timeout: float | None = None) -> NoneTypes the specified text.
Arguments:
textstr - The text to type.delayint - Delay between characters in milliseconds.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Raises:
DaytonaError- If the type operation fails.
Example:
try:
sandbox.computer_use.keyboard.type("Hello, World!")
print(f"Operation success")
except Exception as e:
print(f"Operation failed: {e}")
# With delay between characters
try:
sandbox.computer_use.keyboard.type("Slow typing", 100)
print(f"Operation success")
except Exception as e:
print(f"Operation failed: {e}")Keyboard.press
@intercept_errors(message_prefix="Failed to press key: ")
@with_instrumentation()
def press(key: str,
modifiers: list[str] | None = None,
request_timeout: float | None = None) -> NonePresses a key with optional modifiers.
Arguments:
keystr - The key to press. Canonical names include 'enter', 'escape', 'tab', letters, digits, unshifted punctuation, function keys, and grammar-safe numpad names such as 'num_plus'. Named keys are case-insensitive, and common aliases such as 'Return' and 'Escape' are normalized.modifierslist[str] - Canonical modifier names are 'ctrl', 'alt', 'shift', and 'cmd'. Common aliases such as 'control', 'option', 'meta', and 'win' are normalized.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Raises:
DaytonaError- If the press operation fails.
Example:
# Press Enter
try:
sandbox.computer_use.keyboard.press("enter")
print(f"Operation success")
except Exception as e:
print(f"Operation failed: {e}")
# Press Ctrl+C
try:
sandbox.computer_use.keyboard.press("c", ["ctrl"])
print(f"Operation success")
# Press Ctrl+Shift+T
try:
sandbox.computer_use.keyboard.press("t", ["ctrl", "shift"])
print(f"Operation success")
except Exception as e:
print(f"Operation failed: {e}")Keyboard.hotkey
@intercept_errors(message_prefix="Failed to press hotkey: ")
@with_instrumentation()
def hotkey(keys: str, request_timeout: float | None = None) -> NonePresses a hotkey combination.
Arguments:
keysstr - A single atomic hotkey chord (e.g., 'ctrl+c', 'alt+tab', 'cmd+shift+t', 'ctrl + c', 'shift'). Uses the same normalized key contract aspress().request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Raises:
DaytonaError- If the hotkey operation fails.
Example:
# Copy
try:
sandbox.computer_use.keyboard.hotkey("ctrl+c")
print(f"Operation success")
except Exception as e:
print(f"Operation failed: {e}")
# Paste
try:
sandbox.computer_use.keyboard.hotkey("ctrl+v")
print(f"Operation success")
except Exception as e:
print(f"Operation failed: {e}")
# Alt+Tab
try:
sandbox.computer_use.keyboard.hotkey("alt+tab")
print(f"Operation success")
except Exception as e:
print(f"Operation failed: {e}")Keyboard.down
@intercept_errors(message_prefix="Failed to press key down: ")
@with_instrumentation()
def down(key: str, request_timeout: float | None = None) -> NonePresses a key and holds it down until a matching up() call.
This is the building block for held modifiers: press the modifier with down(),
perform the mouse or keyboard work, then release it with up().
Arguments:
keystr - The key or modifier to hold. Uses the same normalized key contract aspress(), so 'ctrl', 'shift', 'alt', 'cmd', letters, digits, and named keys are all accepted and case-insensitive.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Raises:
DaytonaError- If the key down operation fails.
Example:
# Hold Shift across several clicks, then release it
try:
sandbox.computer_use.keyboard.down("shift")
sandbox.computer_use.mouse.click(100, 200)
sandbox.computer_use.mouse.click(100, 300)
finally:
sandbox.computer_use.keyboard.up("shift")Keyboard.up
@intercept_errors(message_prefix="Failed to release key: ")
@with_instrumentation()
def up(key: str, request_timeout: float | None = None) -> NoneReleases a key that is currently held down.
Arguments:
keystr - The key or modifier to release. Uses the same normalized key contract aspress().request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Raises:
DaytonaError- If the key up operation fails.
Example:
try:
sandbox.computer_use.keyboard.up("shift")
print(f"Operation success")
except Exception as e:
print(f"Operation failed: {e}")Screenshot
class Screenshot()Screenshot operations for computer use functionality.
Screenshot.take_full_screen
@intercept_errors(message_prefix="Failed to take screenshot: ")
@with_instrumentation()
def take_full_screen(
show_cursor: bool = False,
request_timeout: float | None = None) -> ScreenshotResponseTakes a screenshot of the entire screen.
Arguments:
show_cursorbool - Whether to show the cursor in the screenshot.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
ScreenshotResponse- Screenshot data with base64 encoded image.
Example:
screenshot = sandbox.computer_use.screenshot.take_full_screen()
print(f"Screenshot size: {screenshot.width}x{screenshot.height}")
# With cursor visible
with_cursor = sandbox.computer_use.screenshot.take_full_screen(True)Screenshot.take_region
@intercept_errors(message_prefix="Failed to take region screenshot: ")
@with_instrumentation()
def take_region(region: ScreenshotRegion,
show_cursor: bool = False,
request_timeout: float | None = None) -> ScreenshotResponseTakes a screenshot of a specific region.
Arguments:
regionScreenshotRegion - The region to capture.show_cursorbool - Whether to show the cursor in the screenshot.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
ScreenshotResponse- Screenshot data with base64 encoded image.
Example:
region = ScreenshotRegion(x=100, y=100, width=300, height=200)
screenshot = sandbox.computer_use.screenshot.take_region(region)
print(f"Captured region: {screenshot.region.width}x{screenshot.region.height}")Screenshot.take_compressed
@intercept_errors(message_prefix="Failed to take compressed screenshot: ")
@with_instrumentation()
def take_compressed(
options: ScreenshotOptions | None = None,
request_timeout: float | None = None) -> ScreenshotResponseTakes a compressed screenshot of the entire screen.
Arguments:
optionsScreenshotOptions | None - Compression and display options.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
ScreenshotResponse- Compressed screenshot data.
Example:
# Default compression
screenshot = sandbox.computer_use.screenshot.take_compressed()
# High quality JPEG
jpeg = sandbox.computer_use.screenshot.take_compressed(
ScreenshotOptions(format="jpeg", quality=95, show_cursor=True)
)
# Scaled down PNG
scaled = sandbox.computer_use.screenshot.take_compressed(
ScreenshotOptions(format="png", scale=0.5)
)Screenshot.take_compressed_region
@intercept_errors(
message_prefix="Failed to take compressed region screenshot: ")
@with_instrumentation()
def take_compressed_region(
region: ScreenshotRegion,
options: ScreenshotOptions | None = None,
request_timeout: float | None = None) -> ScreenshotResponseTakes a compressed screenshot of a specific region.
Arguments:
regionScreenshotRegion - The region to capture.optionsScreenshotOptions | None - Compression and display options.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
ScreenshotResponse- Compressed screenshot data.
Example:
region = ScreenshotRegion(x=0, y=0, width=800, height=600)
screenshot = sandbox.computer_use.screenshot.take_compressed_region(
region,
ScreenshotOptions(format="webp", quality=80, show_cursor=True)
)
print(f"Compressed size: {screenshot.size_bytes} bytes")Display
class Display()Display operations for computer use functionality.
Display.get_info
@intercept_errors(message_prefix="Failed to get display info: ")
@with_instrumentation()
def get_info(request_timeout: float | None = None) -> DisplayInfoResponseGets information about the displays.
Arguments:
request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
DisplayInfoResponse- Display information including primary display and all available displays.
Example:
info = sandbox.computer_use.display.get_info()
print(f"Primary display: {info.primary_display.width}x{info.primary_display.height}")
print(f"Total displays: {info.total_displays}")
for i, display in enumerate(info.displays):
print(f"Display {i}: {display.width}x{display.height} at {display.x},{display.y}")Display.get_windows
@intercept_errors(message_prefix="Failed to get windows: ")
@with_instrumentation()
def get_windows(request_timeout: float | None = None) -> WindowsResponseGets the list of open windows.
Arguments:
request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
WindowsResponse- List of open windows with their IDs and titles.
Example:
windows = sandbox.computer_use.display.get_windows()
print(f"Found {windows.count} open windows:")
for window in windows.windows:
print(f"- {window.title} (ID: {window.id})")RecordingService
class RecordingService()Recording operations for computer use functionality.
RecordingService.start
@intercept_errors(message_prefix="Failed to start recording: ")
@with_instrumentation()
def start(label: str | None = None,
request_timeout: float | None = None) -> RecordingStarts a new screen recording session.
Arguments:
labelstr | None - Optional custom label for the recording.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
Recording- Recording start response.
Example:
# Start a recording with a label
recording = sandbox.computer_use.recording.start("my-test-recording")
print(f"Recording started: {recording.id}")
print(f"File: {recording.file_path}")RecordingService.stop
@intercept_errors(message_prefix="Failed to stop recording: ")
@with_instrumentation()
def stop(recording_id: str, request_timeout: float | None = None) -> RecordingStops an active screen recording session.
Arguments:
recording_idstr - The ID of the recording to stop.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
Recording- Recording stop response.
Example:
result = sandbox.computer_use.recording.stop(recording.id)
print(f"Recording stopped: {result.duration_seconds} seconds")
print(f"Saved to: {result.file_path}")RecordingService.list
@intercept_errors(message_prefix="Failed to list recordings: ")
@with_instrumentation()
def list(request_timeout: float | None = None) -> ListRecordingsResponseLists all recordings (active and completed).
Arguments:
request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
ListRecordingsResponse- List of all recordings.
Example:
recordings = sandbox.computer_use.recording.list()
print(f"Found {len(recordings.recordings)} recordings")
for rec in recordings.recordings:
print(f"- {rec.file_name}: {rec.status}")RecordingService.get
@intercept_errors(message_prefix="Failed to get recording: ")
@with_instrumentation()
def get(recording_id: str, request_timeout: float | None = None) -> RecordingGets details of a specific recording by ID.
Arguments:
recording_idstr - The ID of the recording to retrieve.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
Recording- Recording details.
Example:
recording = sandbox.computer_use.recording.get(recording_id)
print(f"Recording: {recording.file_name}")
print(f"Status: {recording.status}")
print(f"Duration: {recording.duration_seconds} seconds")RecordingService.delete
@intercept_errors(message_prefix="Failed to delete recording: ")
@with_instrumentation()
def delete(recording_id: str, request_timeout: float | None = None) -> NoneDeletes a recording by ID.
Arguments:
recording_idstr - The ID of the recording to delete.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Example:
sandbox.computer_use.recording.delete(recording_id)
print("Recording deleted")RecordingService.download
@intercept_errors(message_prefix="Failed to download recording: ")
@with_instrumentation()
def download(recording_id: str, local_path: str) -> NoneDownloads a recording file from the Sandbox and saves it to a local file.
The file is streamed directly to disk without loading the entire content into memory.
Arguments:
recording_idstr - The ID of the recording to download.local_pathstr - Path to save the recording file locally.
Example:
# Download recording to file
sandbox.computer_use.recording.download(recording_id, "local_recording.mp4")
print("Recording downloaded")Accessibility
class Accessibility()Accessibility operations for computer use functionality.
This service exposes thin wrappers over the toolbox AT-SPI accessibility API. Start computer use before calling these methods.
Accessibility.get_tree
@intercept_errors(message_prefix="Failed to get accessibility tree: ")
@with_instrumentation()
def get_tree(
scope: str | None = None,
pid: int | None = None,
max_depth: int | None = None,
request_timeout: float | None = None) -> AccessibilityTreeResponseFetches the AT-SPI accessibility tree.
Arguments:
scopestr | None - Tree scope to inspect:focused,pid, orall.pidint | None - Process ID whenscopeispid.max_depthint | None - Maximum depth to descend. Use0for the root only.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
AccessibilityTreeResponse- Accessibility tree rooted at the requested scope.
Example:
tree = sandbox.computer_use.accessibility.get_tree(scope="all", max_depth=3)
print(tree.root.name)Accessibility.find_nodes
@intercept_errors(message_prefix="Failed to find accessibility nodes: ")
@with_instrumentation()
def find_nodes(
scope: str | None = None,
pid: int | None = None,
role: str | None = None,
name: str | None = None,
name_match: str | None = None,
states: list[str] | None = None,
limit: int | None = None,
request_timeout: float | None = None) -> AccessibilityNodesResponseFinds AT-SPI accessibility nodes matching the provided filters.
Arguments:
scopestr | None - Search scope:focused,pid, orall.pidint | None - Process ID whenscopeispid.rolestr | None - Accessibility role to match, such asbutton.namestr | None - Accessible name to match.name_matchstr | None - Name match mode, such asexactorsubstring.stateslist[str] | None - Required accessibility states.limitint | None - Maximum number of matches. Use0to let the API apply its default.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Returns:
AccessibilityNodesResponse- Matching accessibility nodes.
Example:
buttons = sandbox.computer_use.accessibility.find_nodes(
scope="all",
role="button",
name="Submit",
name_match="substring",
)
print(len(buttons.matches))Accessibility.focus_node
@intercept_errors(message_prefix="Failed to focus accessibility node: ")
@with_instrumentation()
def focus_node(node_id: str, request_timeout: float | None = None) -> NoneFocuses an AT-SPI accessibility node.
Arguments:
node_idstr - Accessibility node ID returned byget_treeorfind_nodes.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Raises:
DaytonaError- If the focus operation fails. API failures may use a more specific subclass.
Example:
sandbox.computer_use.accessibility.focus_node(node.id)Accessibility.invoke_node
@intercept_errors(message_prefix="Failed to invoke accessibility node: ")
@with_instrumentation()
def invoke_node(node_id: str,
action: str | None = None,
request_timeout: float | None = None) -> NoneInvokes an AT-SPI accessibility node action.
Arguments:
node_idstr - Accessibility node ID returned byget_treeorfind_nodes.actionstr | None - Action name to invoke. If omitted, the API invokes the primary action.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Raises:
DaytonaError- If the invoke operation fails. API failures may use a more specific subclass.
Example:
sandbox.computer_use.accessibility.invoke_node(node.id, action="click")Accessibility.set_node_value
@intercept_errors(message_prefix="Failed to set accessibility node value: ")
@with_instrumentation()
def set_node_value(node_id: str,
value: str,
request_timeout: float | None = None) -> NoneSets an AT-SPI accessibility node value.
Arguments:
node_idstr - Accessibility node ID returned byget_treeorfind_nodes.valuestr - Value to write to the node.request_timeoutfloat | None - Optional client-side request timeout in seconds. Client-side only. It bounds how long the SDK waits for the HTTP response and does not cancel the operation on the server. Positive values under 1 second are rounded up to 1 second; 0 disables the client-side timeout and negative values are rejected.
Raises:
DaytonaError- If the value update fails. API failures may use a more specific subclass.
Example:
sandbox.computer_use.accessibility.set_node_value(node.id, "hello")ScreenshotRegion
class ScreenshotRegion(BaseModel)Region coordinates for screenshot operations.
Attributes:
xint - X coordinate of the region.yint - Y coordinate of the region.widthint - Width of the region.heightint - Height of the region.
ScreenshotOptions
class ScreenshotOptions(BaseModel)Options for screenshot compression and display.
Attributes:
show_cursorbool | None - Whether to show the cursor in the screenshot.fmtstr | None - Image format (e.g., 'png', 'jpeg', 'webp').qualityint | None - Compression quality (0-100).scalefloat | None - Scale factor for the screenshot.