Quick Start
How It Works
| Step | What happens |
|---|---|
| Agent calls a control tool | Tool builds a human-readable action string ("click(320, 480, left)") |
| Approval gate | If no callback is registered, returns "Action denied: …" immediately |
| Backend load | pyautogui is lazy-imported on first use |
| Missing backend | Returns "Computer Use backend unavailable: …" — no exception |
Configuration Options
Every tool returns a string — errors are reported as messages, never raised. Tools:| Tool | Parameters | Approval | Returns |
|---|---|---|---|
computer_screenshot | path: str = "" | Only if path set | "Screenshot captured (WxH)" (+ " and saved to PATH") |
computer_screen_size | — | Never | "WIDTHxHEIGHT" |
computer_move | x: int, y: int | Yes | "Moved to (x, y)" |
computer_click | x: int, y: int, button: str = "left" | Yes | "Clicked (x, y) with BUTTON button" |
computer_type | text: str | Yes | "Typed N characters" or "Typed N of M characters (non-ASCII skipped)" |
computer_key | key: str | Yes | "Pressed KEY" on success, or "Key press failed: empty or invalid key string 'KEY'" when key is empty / whitespace-only |
computer_scroll | direction: str = "down", amount: int = 3 | Yes | "Scrolled DIRECTION by N" on success, or "Scroll failed: invalid direction 'DIRECTION' (expected 'up' or 'down')" when direction is not "up" or "down" |
| Option | Type | Default | Description |
|---|---|---|---|
callback | Optional[Callable[[str], bool]] | None (control denied) | Called with the action string (e.g. "click(100, 200, left)") — return True to allow, False (or raise) to deny |
set_computer_approval sets a process-wide singleton behind a lock. Call it once and every later tool call in the process uses the same gate. Pass None to revoke — control actions then default back to deny.
Common Patterns
Read-only observer — no approval callback, so the agent can look but not touch.Best Practices
Register approval before building the Agent
Register approval before building the Agent
Call
set_computer_approval(...) at process start, before you construct the Agent. Control tools default to deny — an agent that starts without a callback will silently refuse every click, type, key, and scroll.Pattern-match on the action string
Pattern-match on the action string
The callback receives a stable, human-readable action string like
click(320, 480, left) or type('hello'). Pattern-match on this — the tool name is not passed separately.Surface the non-ASCII typing message
Surface the non-ASCII typing message
Emoji, accented letters, and other non-printable characters are dropped by the backend.
computer_type reports "Typed N of M characters (non-ASCII skipped)" when this happens — surface that message to the user rather than assuming the whole string was typed.Screenshots without a path are ungated
Screenshots without a path are ungated
computer_screenshot() with no path is read-only and ungated. computer_screenshot(path="/tmp/x.png") writes to disk and goes through the approval gate as screenshot_save('/tmp/x.png') — an agent cannot overwrite arbitrary files without approval.Invalid keys and directions are rejected, not silently normalised
Invalid keys and directions are rejected, not silently normalised
computer_key("") returns "Key press failed: empty or invalid key string ''" — the backend is never called. computer_scroll(direction="sideways") returns "Scroll failed: invalid direction 'sideways' (expected 'up' or 'down')" — it does not default to "down". If your callback pattern-matches on the return string, handle these failure prefixes explicitly.Expect no-ops in headless or CI environments
Expect no-ops in headless or CI environments
A missing display returns the same
"Computer Use backend unavailable: ..." message as a missing package. On Linux pyautogui needs an X11 display; in CI containers and on headless boxes these tools no-op — don’t gate business logic on their success.Related
Approval
Broader human-in-the-loop approval patterns for gating agent tool calls.
Allowed Tools
Restrict which tools an agent is permitted to call.

