title: "Computer Use в 2026: Anthropic Claude Opus 4.6, OpenAI Operator/CUA и стек GUI-автоматизации" slug: computer-use-anthropic-xdotool-2026-ru date: 2026-02-26 lang: ru
Computer Use в 2026: Anthropic Claude Opus 4.6, OpenAI Operator/CUA и стек GUI-автоматизации
Ключевые факты
- Текущие модели Anthropic с computer use: Claude Opus 4.6, Claude Sonnet 4.6, Claude Opus 4.5, Claude Sonnet 4.5, Claude Haiku 4.5, все Claude 4 модели и Claude Sonnet 3.7
- Версии инструментов:
computer_20251124(Opus 4.6, Sonnet 4.6, Opus 4.5) иcomputer_20250124(все остальные поддерживаемые модели) - Бета-флаги:
computer-use-2025-11-24для последней версии инструмента,computer-use-2025-01-24для более старых моделей - Типы действий скриншота:
screenshot,left_click,right_click,middle_click,double_click,triple_click,type,key,scroll,mouse_move,left_click_drag,left_mouse_down,left_mouse_up,hold_key,wait - Действие масштабирования: Доступно только в
computer_20251124(Opus 4.6, Opus 4.5); требуетenable_zoom: trueв определении инструмента - Ограничения разрешения скриншота: Максимум 1568 пикселей по длинному краю, примерно 1,15 мегапикселя в сумме (1512×982 → ~1330×864)
- Требование масштабирования координат: Требуется, когда фактическое разрешение экрана отличается от предполагаемых Claude размеров дисплея
- Overhead системного промпта: 466-499 токенов, добавляемых автоматически для бета-версии computer use
- Стоимость определения инструмента: 735 токенов за определение инструмента computer use (Claude 4.x и Sonnet 3.7)
- Модель ценообразования: Стандартное ценообразование tool use + стоимость токенов видения для скриншотов
- Совместимость версий xdotool: Работает со стандартным xdotool на X11; Wayland требует альтернативных библиотек автоматизации
- Поддерживаемые серверы дисплея: X11 (полная поддержка через xdotool), Wayland (требует native инструментов Wayland, не xdotool), macOS/Windows (через pyautogui)
- Требование изоляции безопасности: Docker-контейнеры или виртуальные машины настоятельно рекомендуются; нет покрытия ZDR для бета-версии
- Риск prompt injection: Claude может следовать инструкциям, найденным в скриншотах или веб-контенте, потенциально конфликтуя с инструкциями пользователя
- Шлюзы подтверждения человеком: Требуются для финансовых транзакций, входов в учетные записи, необратимых операций с данными и согласия с условиями обслуживания
- Паттерн Docker-изоляции: Непривилегированный пользователь,
--network none,--read-onlyфайловая система, ограничения памяти/CPU, tmpfs для временных файлов - Песочница E2B Desktop: На базе Firecracker microVMs, <200ms время запуска, изоляция на уровне ядра для мультитенантных развертываний
- Задержки выполнения действий: 100-500ms рекомендуется между действиями для разрешения обновлений UI и загрузки страниц
- Максимум итераций: Реализуйте жесткие ограничения (обычно 10-50) для предотвращения неконтролируемых затрат API в циклах агента
- Производительность бенчмарков: 72,7% на бенчмарке OSWorld (Claude Opus 4.6), state-of-the-art среди одноагентных систем на WebArena
Что такое Computer Use
Computer use — это основанная на видении возможность GUI-автоматизации Anthropic, которая позволяет Claude взаимодействовать с окружением рабочего стола через цикл screenshot-action. Вместо вызова структурированных API, Claude воспринимает экран компьютера как человек — анализируя пиксели, определяя интерактивные элементы и выполняя действия мыши и клавиатуры на основе визуального понимания.
Основной цикл работает следующим образом:
- Захват скриншота: Текущее состояние дисплея захватывается как изображение PNG или JPEG
- Анализ видения: Скриншот отправляется Claude вместе с инструкциями задачи пользователя
- Решение о действии: Claude анализирует визуальное состояние, рассуждает о следующих шагах и запрашивает конкретное действие (клик по координатам, ввод текста, нажатие клавиши, прокрутка)
- Выполнение действия: Ваше приложение выполняет запрошенное действие в вычислительной среде (через xdotool, pyautogui, Playwright или E2B)
- Обновление состояния: Новый скриншот захватывается, показывающий результат действия
- Продолжение цикла: Шаги 2-5 повторяются до тех пор, пока Claude не определит, что задача выполнена, или не достигнет лимитов итераций
Claude не выполняет действия напрямую. Инструмент computer use — это инструмент без схемы, где Claude запрашивает действия как структурированный JSON, а ваше приложение отвечает за преобразование этих запросов в фактические системные вызовы. Эта архитектура обеспечивает контроль над песочницей, политиками безопасности и окружениями выполнения.
Фреймворк решений
Computer Use vs Playwright vs RPA vs Browser-use
| Технология | Лучше всего для | Сильные стороны | Слабые стороны |
|---|---|---|---|
| Anthropic Computer Use | Десктопные приложения, legacy UI без API, кроссприложенческие рабочие потоки, автоматизация Linux-серверов | Работает на любом визуальном интерфейсе; адаптируется к изменениям UI; обрабатывает приложения без DOM/API | Высокая задержка (секунды за действие); дорого (токены видения); требует VM/контейнер-изоляции |
| Playwright/Selenium | Современные веб-приложения со стабильной структурой DOM, тестирование CI/CD, критичная по производительности автоматизация | Быстро (миллисекунды); дешево; точные селекторы DOM; перехват сетевых запросов; параллельное выполнение | Ломается при изменениях DOM; требует поддержку при обновлениях UI; ограничено браузерами |
| Traditional RPA (UiPath, Automation Anywhere) | Автоматизация enterprise-процессов с человеческим контролем, регулируемые отрасли, требующие аудит-следов | Enterprise-поддержка; визуальные конструкторы рабочих потоков; функции соответствия; встроенный OCR | Дорогое лицензирование; хрупкая автоматизация на основе координат; привязка к поставщику |
| OpenAI CUA / Operator | Потребительские браузерные задачи, веб-исследования, заполнение форм, e-commerce рабочие потоки | Cloud-управляемое (без локальной настройки); встроенные подтверждения безопасности; интеграции с партнерами (DoorDash, OpenTable) | Только браузер; нет доступа к приложениям рабочего стола; нет локальной файловой системы; API еще не публично доступен |
| Browser-use (Playwright + LLM) | Автоматизация веб где структура DOM часто меняется, адаптивный скрейпинг, многошаговые исследовательские рабочие потоки | Комбинирует скорость Playwright с рассуждениями LLM; дешевле, чем полный computer use; может использовать селекторы DOM когда доступны | Ограничено браузером; все еще использует токены видения; требует настройку Playwright |
Дерево решений:
- Нужно автоматизировать десктопные приложения или терминал? → Anthropic Computer Use
- Браузерная задача со стабильной структурой DOM? → Playwright
- Браузерная задача с часто меняющимся DOM? → Browser-use или OpenAI CUA
- Многоприложенческий рабочий поток (браузер + рабочий стол + терминал)? → Anthropic Computer Use
- Потребительский продукт, требующий нулевой локальной настройки? → OpenAI Operator (когда API доступен)
- Нужно максимально быстрое выполнение? → Playwright
- Нужна минимальная стоимость? → Playwright
- Нужна максимальная гибкость и адаптация к изменениям UI? → Anthropic Computer Use или OpenAI CUA
Таблица справочников параметров
Определение инструмента Computer Use
| Параметр | Тип | Требуется | Значение/Примечания |
|---|---|---|---|
type |
строка | Да | computer_20251124 (Opus 4.6, Sonnet 4.6, Opus 4.5) или computer_20250124 (другие модели) |
name |
строка | Да | Должно быть "computer" |
display_width_px |
целое число | Да | Ширина дисплея в пикселях (например, 1024, 1280, 1920). Должна соответствовать фактической ширине вашего дисплея/скриншота. |
display_height_px |
целое число | Да | Высота дисплея в пикселях (например, 768, 800, 1080). Должна соответствовать фактической высоте вашего дисплея/скриншота. |
display_number |
целое число | Нет | Номер дисплея X11 (например, 1 для :1). Помогает xdotool нацелиться на правильный дисплей. |
enable_zoom |
логическое | Нет | Установите в true для включения действия zoom (только для computer_20251124). По умолчанию: false. |
Параметры запроса API
| Параметр | Тип | Требуется | Значение/Примечания |
|---|---|---|---|
model |
строка | Да | claude-opus-4-6, claude-sonnet-4-6, claude-opus-4-5 и т.д. |
max_tokens |
целое число | Да | 1024-4096 типично для computer use (Opus 4.6 поддерживает до 128K выходных токенов) |
tools |
массив | Да | Массив определений инструментов включая инструмент computer use |
messages |
массив | Да | История разговора с ролями user/assistant |
betas |
массив | Да | ["computer-use-2025-11-24"] или ["computer-use-2025-01-24"] |
thinking |
объект | Нет | {"type": "enabled", "budget_tokens": 1024} для Claude Sonnet 3.7 и Claude 4 моделей |
Параметры входа действия
| Действие | Параметры | Пример |
|---|---|---|
screenshot |
Нет | {"action": "screenshot"} |
left_click |
coordinate: [x, y] |
{"action": "left_click", "coordinate": [500, 300]} |
type |
text: string |
{"action": "type", "text": "Hello, world!"} |
key |
key: string |
{"action": "key", "key": "ctrl+s"} |
scroll |
coordinate: [x, y], scroll_direction: "up"\|"down"\|"left"\|"right", scroll_amount: integer |
{"action": "scroll", "coordinate": [500, 400], "scroll_direction": "down", "scroll_amount": 3} |
zoom |
region: [x1, y1, x2, y2] |
{"action": "zoom", "region": [100, 200, 400, 350]} (только computer_20251124) |
left_click (с модификатором) |
coordinate: [x, y], text: "shift"\|"ctrl"\|"alt"\|"super" |
{"action": "left_click", "coordinate": [500, 300], "text": "shift"} |
Типичные ошибки
1. Несоответствие масштабирования координат
Проблема: Клики Claude по координатам промахиваются мимо целей, потому что скриншоты уменьшаются API, но координаты не масштабируются обратно для выполнения.
❌ Неправильно:
screenshot = capture_screenshot(width=1920, height=1080)
send_to_claude(screenshot) # API уменьшает до ~1330x864
# Claude возвращает координаты в уменьшенном пространстве
execute_click(x=640, y=400) # Клик в неправильном месте в пространстве 1920x1080
✅ Правильно:
scale = get_scale_factor(1920, 1080) # Возвращает ~0.69
scaled_width = int(1920 * scale) # 1330
scaled_height = int(1080 * scale) # 750
screenshot = capture_and_resize(scaled_width, scaled_height)
send_to_claude(screenshot)
# Claude возвращает координаты в масштабированном пространстве
screen_x = x / scale # Масштабируем обратно в пространство экрана
screen_y = y / scale
execute_click(screen_x, screen_y)
Воздействие: Высокая частота отказов при клик-действиях, Claude повторно кликает по неправильным элементам.
2. Отсутствие задержек действий
Проблема: Выполнение действий слишком быстро без ожидания обновлений UI приводит к тому, что Claude анализирует устаревшие скриншоты и принимает неправильные решения.
❌ Неправильно:
execute_action(action)
screenshot = take_screenshot() # Захвачен до обновления UI
send_to_claude(screenshot)
✅ Правильно:
execute_action(action)
time.sleep(0.5) # Разрешаем UI стабилизироваться
try:
page.wait_for_load_state("networkidle", timeout=3000)
except TimeoutError:
pass # Не все действия вызывают навигацию
screenshot = take_screenshot()
send_to_claude(screenshot)
Воздействие: Claude видит старое состояние UI, принимает решения на основе устаревшей информации, застревает в циклах, пытаясь выполнить уже выполненные действия.
3. Отсутствие лимита итераций в цикле агента
Проблема: Цикл агента работает бесконечно, если Claude застревает или не распознает завершение задачи, вызывая неконтролируемые затраты API.
❌ Неправильно:
while True:
response = client.beta.messages.create(...)
if response.stop_reason == "end_turn":
break
execute_tools(response)
✅ Правильно:
MAX_ITERATIONS = 30
for iteration in range(MAX_ITERATIONS):
response = client.beta.messages.create(...)
if response.stop_reason == "end_turn":
break
execute_tools(response)
else:
log_error(f"Max iterations ({MAX_ITERATIONS}) reached without completion")
Воздействие: Потенциальные сотни долларов затрат API, если цикл работает без контроля; задача никогда не завершается.
4. Запуск без песочницы
Проблема: Выполнение computer use на host-системе без изоляции раскрывает production-учетные данные, позволяет prompt injection экспортировать данные и разрешает необратимые деструктивные действия.
❌ Неправильно:
# Запуск непосредственно на хост-машине с доступом к ~/.ssh, ~/.aws, production БД
execute_computer_action(action)
✅ Правильно:
docker run -d \
--network none \
--read-only \
--memory 2g \
--cpus 2 \
--tmpfs /tmp \
--tmpfs /home/agent \
-e AGENT_TASK="$task" \
computer-use-sandbox:latest
Воздействие: Критический риск безопасности — кража учетных данных, экспортирование данных, случайное удаление production-данных.
5. Отсутствие обработки ошибок инструментов
Проблема: Когда захват скриншота не удается или действия ошибаются, возврат пустых/null результатов разрушает цикл рассуждений Claude.
❌ Неправильно:
try:
screenshot = capture_screenshot()
except Exception:
screenshot = None # Claude получает null, не может рассуждать об ошибке
✅ Правильно:
try:
screenshot = capture_screenshot()
return {"type": "image", "source": {"type": "base64", "data": screenshot}}
except Exception as e:
return {
"type": "tool_result",
"tool_use_id": tool_id,
"content": f"Error: Failed to capture screenshot. {str(e)}",
"is_error": True
}
Воздействие: Claude не может диагностировать или восстановиться после отказов; цикл завершается преждевременно или производит бессмысленные ответы.
Реализация Anthropic Computer Use
Структура вызова API
Полный вызов API computer use включает модель, массив инструментов, сообщения, флаг бета и опциональную конфигурацию thinking:
import anthropic
client = anthropic.Anthropic()
response = client.beta.messages.create(
model="claude-opus-4-6",
max_tokens=4096,
tools=[
{
"type": "computer_20251124",
"name": "computer",
"display_width_px": 1280,
"display_height_px": 800,
"display_number": 1,
},
{
"type": "text_editor_20250728",
"name": "str_replace_based_edit_tool",
},
{
"type": "bash_20250124",
"name": "bash",
}
],
messages=[
{"role": "user", "content": "Open Firefox and navigate to https://example.com"}
],
betas=["computer-use-2025-11-24"],
)
Захват скриншота
Захватите текущее состояние дисплея, используя scrot (X11), PIL/pyautogui (кроссплатформенно) или встроенный API скриншота E2B:
import base64
import subprocess
def take_screenshot() -> str:
"""Capture current screen state as base64-encoded PNG."""
result = subprocess.run(
["scrot", "-", "-q", "80"],
capture_output=True,
check=True
)
return base64.standard_b64encode(result.stdout).decode("utf-8")
С масштабированием координат:
import math
from PIL import ImageGrab
def get_scale_factor(width: int, height: int) -> float:
"""Calculate scale factor to meet API constraints."""
long_edge = max(width, height)
total_pixels = width * height
long_edge_scale = 1568 / long_edge
total_pixels_scale = math.sqrt(1_150_000 / total_pixels)
return min(1.0, long_edge_scale, total_pixels_scale)
def take_scaled_screenshot(width: int, height: int) -> tuple[str, float]:
"""Capture and resize screenshot, return base64 PNG and scale factor."""
screenshot = ImageGrab.grab()
scale = get_scale_factor(width, height)
scaled_width = int(width * scale)
scaled_height = int(height * scale)
resized = screenshot.resize((scaled_width, scaled_height))
buffer = io.BytesIO()
resized.save(buffer, format="PNG")
b64_data = base64.b64encode(buffer.getvalue()).decode("utf-8")
return b64_data, scale
Выполнение действий
Преобразуйте запросы действий Claude в системные вызовы. Слой выполнения должен обрабатывать все типы действий, возвращаемые Claude:
import subprocess
import time
from typing import Optional
def execute_computer_action(action: dict, scale: float = 1.0) -> Optional[str]:
"""
Execute a computer action returned by Claude.
Returns screenshot b64 if action was 'screenshot', otherwise None.
"""
action_type = action["action"]
if action_type == "screenshot":
screenshot_b64, _ = take_scaled_screenshot(SCREEN_WIDTH, SCREEN_HEIGHT)
return screenshot_b64
elif action_type == "left_click":
x, y = action["coordinate"]
# Scale coordinates back to screen space
screen_x = int(x / scale)
screen_y = int(y / scale)
subprocess.run(["xdotool", "mousemove", "--sync", str(screen_x), str(screen_y)], check=True)
subprocess.run(["xdotool", "click", "1"], check=True)
elif action_type == "type":
subprocess.run(
["xdotool", "type", "--clearmodifiers", "--delay", "30", action["text"]],
check=True
)
elif action_type == "key":
subprocess.run(
["xdotool", "key", "--clearmodifiers", action["key"]],
check=True
)
elif action_type == "scroll":
x, y = action["coordinate"]
screen_x = int(x / scale)
screen_y = int(y / scale)
direction = action.get("scroll_direction", "down")
amount = action.get("scroll_amount", 3)
subprocess.run(["xdotool", "mousemove", "--sync", str(screen_x), str(screen_y)], check=True)
button = "4" if direction == "up" else "5"
for _ in range(amount):
subprocess.run(["xdotool", "click", button], check=True)
return None
Цикл агента
Цикл агента обрабатывает разговор с Claude, выполняет запросы инструментов и возвращает результаты до завершения задачи:
def run_computer_use_agent(task: str, max_iterations: int = 30) -> str:
"""
Main agent loop. Runs until Claude signals completion or max_iterations reached.
Returns summary of what was accomplished.
"""
tools = [
{
"type": "computer_20251124",
"name": "computer",
"display_width_px": SCREEN_WIDTH,
"display_height_px": SCREEN_HEIGHT,
"display_number": 1,
},
]
messages = [{"role": "user", "content": task}]
screenshot_b64, scale = take_scaled_screenshot(SCREEN_WIDTH, SCREEN_HEIGHT)
for iteration in range(max_iterations):
response = client.beta.messages.create(
model="claude-opus-4-6",
max_tokens=4096,
tools=tools,
messages=messages,
betas=["computer-use-2025-11-24"],
)
assistant_content = response.content
messages.append({"role": "assistant", "content": assistant_content})
if response.stop_reason == "end_turn":
for block in response.content:
if hasattr(block, "text"):
return block.text
return "Task completed."
tool_results = []
for block in response.content:
if block.type != "tool_use":
continue
tool_input = block.input
result_screenshot = execute_computer_action(tool_input, scale)
time.sleep(0.5) # Allow UI to settle
if result_screenshot:
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": result_screenshot,
},
}
],
})
else:
screenshot_b64, scale = take_scaled_screenshot(SCREEN_WIDTH, SCREEN_HEIGHT)
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": screenshot_b64,
},
}
],
})
if tool_results:
messages.append({"role": "user", "content": tool_results})
return f"Reached max iterations ({max_iterations}) without completing task."
Интеграция xdotool
Основы X11 автоматизации
xdotool — это утилита X11 автоматизации, которая синтезирует события клавиатуры и мыши на уровне X-сервера. Это стандартный бэкенд выполнения для reference-реализации Anthropic и работает надежно на Linux-системах, работающих на X11 (не Wayland).
Ключевые команды xdotool:
# Переместить мышь на координаты (--sync ожидает завершения X события)
xdotool mousemove --sync 640 400
# Клик кнопками: 1=левый, 2=средний, 3=правый, 4=прокрутка-вверх, 5=прокрутка-вниз
xdotool click 1
# Ввести текст с задержкой между символами (предотвращает потерю нажатий)
xdotool type --clearmodifiers --delay 30 "hello world"
# Нажать комбинацию клавиш (X11 keysym имена)
xdotool key ctrl+c
xdotool key Return
xdotool key Escape
# Найти окно по имени и активировать его
xdotool search --name "Firefox" windowactivate --sync
# Получить текущую позицию мыши
xdotool getmouselocation
Имитация клавиш
Используйте xdotool key для клавиатурных ярлыков и xdotool type для ввода текста. Всегда используйте --clearmodifiers для освобождения клавиш модификаторов, которые могут быть застрявшими:
def press_key(key: str):
"""Press a key or key combination."""
subprocess.run(["xdotool", "key", "--clearmodifiers", key], check=True)
def type_text(text: str):
"""Type text with delay between characters."""
subprocess.run(
["xdotool", "type", "--clearmodifiers", "--delay", "30", text],
check=True
)
Часто используемые сопоставления клавиш:
| Имя клавиши | xdotool Keysym |
|---|---|
| Enter | Return |
| Escape | Escape |
| Tab | Tab |
| Ctrl+C | ctrl+c |
| Ctrl+V | ctrl+v |
| Ctrl+Shift+T | ctrl+shift+t |
| Alt+F4 | alt+F4 |
Управление окнами
xdotool может находить, фокусировать и манипулировать окнами:
# Найти окно по шаблону имени
xdotool search --name "Firefox"
# Активировать (сфокусировать) окно
xdotool windowactivate --sync <window_id>
# Получить ID активного окна
xdotool getactivewindow
# Переместить окно на определенную позицию
xdotool windowmove <window_id> 0 0
# Изменить размер окна
xdotool windowsize <window_id> 1280 800
# Минимизировать окно
xdotool windowminimize <window_id>
Пример использования в Python:
def focus_firefox():
"""Find Firefox window and bring it to front."""
result = subprocess.run(
["xdotool", "search", "--name", "Firefox"],
capture_output=True,
text=True
)
if result.stdout.strip():
window_id = result.stdout.strip().split()[0]
subprocess.run(
["xdotool", "windowactivate", "--sync", window_id],
check=True
)
Совместимость Wayland
Важно: xdotool не работает на Wayland. Для систем Wayland используйте:
- ydotool: Альтернатива Wayland xdotool (требует прав root или uinput)
- wtype: Инструмент ввода текста Wayland
- pyautogui: Кроссплатформенная библиотека, которая работает на Wayland (использует evdev на Linux)
# Пример ydotool (Wayland)
ydotool mousemove --absolute 640 400
ydotool click 1
ydotool type "hello world"
Production-настройка
Конфигурация VNC/Display-сервера
Для server-side computer use без физического монитора установите virtual framebuffer (Xvfb) и опциональный VNC-сервер для удаленного просмотра:
# Установить зависимости
apt-get update && apt-get install -y \
xvfb x11-utils xdotool scrot fluxbox \
firefox-esr python3 python3-pip \
tightvncserver x11vnc
# Запустить virtual display размером 1280x800 с 24-битным цветом
Xvfb :99 -screen 0 1280x800x24 -ac +extension GLX &
export DISPLAY=:99
# Запустить легкий window manager (требуется для некоторых приложений)
DISPLAY=:99 fluxbox &
# Опционально: Запустить VNC-сервер для удаленного просмотра
x11vnc -display :99 -nopw -listen 0.0.0.0 -forever &
# Запустить браузер в virtual display
DISPLAY=:99 firefox --no-sandbox &
Программатическое управление virtual display:
import subprocess
import os
import atexit
class VirtualDisplay:
def __init__(self, display_num: int = 99, width: int = 1280, height: int = 800):
self.display_num = display_num
self.width = width
self.height = height
self.xvfb_process = None
def start(self):
self.xvfb_process = subprocess.Popen([
"Xvfb", f":{self.display_num}",
"-screen", "0", f"{self.width}x{self.height}x24",
"-ac",
"+extension", "GLX",
])
os.environ["DISPLAY"] = f":{self.display_num}"
time.sleep(1) # Give Xvfb time to initialize
atexit.register(self.stop)
return self
def stop(self):
if self.xvfb_process:
self.xvfb_process.terminate()
self.xvfb_process.wait()
def __enter__(self):
return self.start()
def __exit__(self, *args):
self.stop()
Настройка Docker-контейнера
Создайте безопасный, изолированный контейнер для выполнения computer use:
FROM ubuntu:22.04
# Установить системные зависимости
RUN apt-get update && apt-get install -y \
xvfb x11-utils xdotool scrot fluxbox \
firefox-esr python3 python3-pip \
&& rm -rf /var/lib/apt/lists/*
# Создать непривилегированного пользователя для агента
RUN useradd -m -s /bin/bash agent
# Переключиться на непривилегированного пользователя
USER agent
WORKDIR /home/agent
# Установить Python-зависимости
COPY --chown=agent:agent requirements.txt .
RUN pip3 install --no-cache-dir -r requirements.txt
# Скопировать код агента
COPY --chown=agent:agent agent.py .
ENV DISPLAY=:99
CMD ["bash", "-c", "Xvfb :99 -screen 0 1280x800x24 & sleep 1 && python3 agent.py"]
Запустите со строгими ограничениями безопасности:
docker run -d \
--name computer-use-agent \
--network none \
--read-only \
--memory 2g \
--cpus 2 \
--tmpfs /tmp \
--tmpfs /home/agent \
-e ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY" \
-e AGENT_TASK="Open Firefox and navigate to https://example.com" \
computer-use-sandbox:latest
Стратегии изоляции безопасности
1. Сетевая изоляция:
# Нет сетевого доступа по умолчанию
--network none
# Allowlist специфических доменов через прокси
--network custom-net \
-e HTTP_PROXY=http://filtering-proxy:3128
2. Ограничения файловой системы:
# Read-only корневая файловая система
--read-only
# Tmpfs для записываемых директорий
--tmpfs /tmp \
--tmpfs /home/agent \
--tmpfs /var/run
3. Лимиты ресурсов:
# Предотвратить истощение ресурсов
--memory 2g \
--memory-swap 2g \
--cpus 2 \
--pids-limit 100
4. Шлюзы подтверждения человеком:
DANGEROUS_ACTIONS = {
"submit": "Form submission",
"purchase": "Financial transaction",
"delete": "Data deletion",
"send": "Communication sent",
}
def requires_confirmation(action: dict, screenshot_b64: str) -> bool:
"""Check if action requires human confirmation."""
# Simple keyword check (could add OCR for button text)
for keyword in DANGEROUS_ACTIONS:
if keyword in str(action).lower():
return True
return False
def get_human_confirmation(action: dict, reason: str) -> bool:
"""Ask human to confirm dangerous action."""
print(f"\n[CONFIRMATION REQUIRED] {reason}")
print(f"Action: {action}")
response = input("Proceed? (yes/no): ").strip().lower()
return response in ("yes", "y")
5. E2B Desktop Sandbox:
Для многотенантных production-развертываний используйте E2B's управляемые Firecracker-based microVMs:
from e2b_desktop import Desktop
async def run_with_e2b_sandbox(task: str) -> str:
"""Run computer use task in E2B Desktop sandbox."""
async with Desktop() as desktop:
screenshot = await desktop.screenshot()
messages = [{"role": "user", "content": task}]
for iteration in range(30):
response = client.beta.messages.create(
model="claude-opus-4-6",
max_tokens=4096,
tools=[{
"type": "computer_20251124",
"name": "computer",
"display_width_px": 1280,
"display_height_px": 800,
}],
messages=messages,
betas=["computer-use-2025-11-24"],
)
if response.stop_reason == "end_turn":
break
for block in response.content:
if block.type != "tool_use":
continue
action = block.input
action_type = action["action"]
if action_type == "left_click":
x, y = action["coordinate"]
await desktop.left_click(x, y)
elif action_type == "type":
await desktop.type(action["text"])
elif action_type == "key":
await desktop.key(action["key"])
screenshot = await desktop.screenshot()
return "Task completed in E2B sandbox."
Производительность и бенчмарки
Примечание: Приведённые ниже цифры являются иллюстративными оценками на основе типичных production-конфигураций, а не измерениями конкретной системы.
Характеристики задержки
Computer use включает несколько последовательных операций, которые способствуют общей задержке:
- Захват скриншота: 50-200ms в зависимости от разрешения и сжатия
- Передача по сети: 100-500ms для загрузки скриншота в API Anthropic
- Inference модели: 2-10 секунд для анализа Claude скриншота и планирования действия (варьируется в зависимости от бюджета thinking и сложности задачи)
- Выполнение действия: 50-300ms для операций мыши/клавиатуры
- Задержка обновления UI: 100-1000ms для ответа приложений на действия
Типичная end-to-end задержка за итерацию: 3-12 секунд от выполнения действия до следующего решения о действии.
Оценки стоимости
Затраты на токены computer use состоят из overhead системного промпта, определений инструментов, токенов изображения скриншота и текстовых токенов:
- Overhead системного промпта: ~466-499 токенов (добавляется автоматически)
- Определение инструмента computer use: 735 токенов
- Токены скриншота:
(width × height) / 750за изображение- Скриншот 1280×800: ~1,365 токенов
- Скриншот 1920×1080 (уменьшен до ~1330×864): ~1,528 токенов
- Текстовые токены: ~1,500-3,000 за итерацию (история + рассуждения + действие)
Типичная стоимость итерации с Claude Opus 4.6 (разрешение 1280×800):
- Input: ~3,500 токенов (скриншот + история + системный промпт) × $15/MTok = $0.0525
- Output: ~500 токенов × $75/MTok = $0.0375
- Total за итерацию: ~$0.09
Задача в 20 итераций: ~$1.80 затрат API с Opus 4.6.
Стратегии снижения стоимости:
- Используйте Claude Sonnet 4.6 для более простых задач (примерно 1/5 стоимости Opus 4.6)
- Сократите разрешение скриншота (1024×768 вместо 1920×1080)
- Используйте JPEG сжатие с quality=75 для снижения количества токенов изображения
- Реализуйте кеширование для повторяющихся скриншотов (если применимо)
- Группируйте независимые действия когда возможно
Ограничения пропускной способности
Computer use по своей природе последовательный — каждое действие зависит от наблюдения результата предыдущего действия. Это ограничивает пропускную способность в сравнении с параллельной API-автоматизацией:
- Последовательное выполнение: Не может параллелизировать внутри одной задачи
- Ограничения частоты API: Применяются стандартные ограничения частоты Anthropic
- Отзывчивость UI: Некоторые приложения требуют секунды для обработки действий
Для сценариев высокой пропускной способности, требующих сотни операций в минуту, traditional automation (Playwright, Selenium) остается более уместным.
Производительность бенчмарков
Claude Opus 4.6 достигает state-of-the-art результатов на бенчмарках computer use:
- OSWorld: 72,7% завершение задач (в сравнении с 66,3% для Opus 4.5)
- WebArena: State-of-the-art среди одноагентных систем для автономной навигации по веб
Эти бенчмарки измеряют завершение задач в реальном мире во множественном разнообразии десктопных и веб-приложений, включая многошаговые рабочие потоки, требующие навигации, заполнения форм, управления файлами и взаимодействия с приложениями.