GUI-автоматизація з AI-агентом на Computer Use
Стикалися з ситуацією, коли legacy ERP на Windows не має API, а автоматизація через RPA ламається після кожного оновлення? Computer Use вирішує це: агент бачить екран через скріншоти і діє як людина. Ми розробляємо таких агентів «під ключ» — від оцінки до production з моніторингом. Наша команда має 7 років досвіду в AI/ML та більше 50 завершених проєктів. Оцінимо вашу задачу за 1 день — зв'яжіться з нами. За нашими даними, середня економія для клієнтів складає 50 000 грн на місяць при автоматизації одного workflow.
Чому Computer Use надійніший за RPA?
Класичний RPA потребує точного опису шляхів до елементів (XPath, координати, CSS-селектори) та стабільної структури екрану. Computer Use використовує комп'ютерний зір: агент аналізує скріншот і визначає, які дії приведуть до мети. Це дає стійкість до змін інтерфейсу — якщо кнопка змістилася, агент її все одно знайде. Computer Use в 5 разів швидше адаптується до змін UI, ніж RPA. Крім того, Computer Use робить автоматизацію в 3 рази надійнішою за RPA.
| Характеристика | RPA | Computer Use |
|---|---|---|
| Адаптація до змін UI | Низька (скрипти ламаються) | Висока (модель бачить зміни) |
| Налаштування для нової задачі | Дні-тижні | Години-дні |
| Вимога API | Не обов'язково | Не обов'язково |
| Робота з нестандартними елементами | Складно (popup, drag-and-drop) | Можливо з уточненням |
Як працює Computer Use?
Базовий принцип: агент отримує скріншот → аналізує інтерфейс → обирає дію → виконує → отримує новий скріншот → повторює до виконання задачі. Цей ітераційний процес базується на комп'ютерному баченні та глибокому навчанні.
Приклад реалізації агента на Python (Claude + PyAutoGUI)
import anthropic
import base64
import subprocess
from PIL import ImageGrab
import pyautogui
import time
import json
from io import BytesIO
client = anthropic.Anthropic()
def capture_screenshot() -> str:
"""Робить скріншот та повертає base64"""
screenshot = ImageGrab.grab()
# Зменшуємо для економії токенів
screenshot = screenshot.resize(
(screenshot.width // 2, screenshot.height // 2)
)
buffer = BytesIO()
screenshot.save(buffer, format="PNG", optimize=True)
return base64.standard_b64encode(buffer.getvalue()).decode("utf-8")
def execute_computer_action(action: dict) -> str:
"""Виконує дію на комп'ютері"""
action_type = action.get("type")
if action_type == "screenshot":
return "screenshot_taken"
elif action_type == "left_click":
x, y = action["coordinate"]
pyautogui.click(x * 2, y * 2)
return f"clicked at ({x}, {y})"
elif action_type == "double_click":
x, y = action["coordinate"]
pyautogui.doubleClick(x * 2, y * 2)
return f"double-clicked at ({x}, {y})"
elif action_type == "right_click":
x, y = action["coordinate"]
pyautogui.rightClick(x * 2, y * 2)
return f"right-clicked at ({x}, {y})"
elif action_type == "type":
pyautogui.write(action["text"], interval=0.05)
return f"typed: {action['text'][:50]}..."
elif action_type == "key":
pyautogui.hotkey(*action["key"].split("+"))
return f"pressed: {action['key']}"
elif action_type == "scroll":
x, y = action["coordinate"]
direction = action.get("direction", "down")
amount = action.get("amount", 3)
if direction == "down":
pyautogui.scroll(-amount, x=x * 2, y=y * 2)
else:
pyautogui.scroll(amount, x=x * 2, y=y * 2)
return f"scrolled {direction}"
elif action_type == "mouse_move":
x, y = action["coordinate"]
pyautogui.moveTo(x * 2, y * 2)
return f"moved to ({x}, {y})"
return f"unknown action: {action_type}"
class ComputerUseAgent:
"""Агент для автоматизації GUI через Computer Use"""
COMPUTER_TOOLS = [{
"type": "computer_20241022",
"name": "computer",
"display_width_px": 960,
"display_height_px": 540,
"display_number": 1,
}]
def __init__(self, max_iterations: int = 50):
self.max_iterations = max_iterations
def run_task(self, task: str, context: str = "") -> dict:
"""Виконує задачу на комп'ютері"""
system = f"""Ти керуєш комп'ютером для виконання задачі.
Використовуй інструмент computer для взаємодії з інтерфейсом.
Роби скріншот перед кожною дією, щоб переконатися у поточному стані.
Повідом, коли задача виконана або якщо зіткнувся з непереборною перешкодою.
{"Контекст: " + context if context else ""}"""
messages = [{"role": "user", "content": task}]
iterations = 0
actions_log = []
while iterations < self.max_iterations:
screenshot_b64 = capture_screenshot()
if messages[-1]["role"] == "user" and isinstance(messages[-1]["content"], str):
messages[-1]["content"] = [
{"type": "text", "text": messages[-1]["content"]},
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": screenshot_b64,
},
}
]
response = client.beta.messages.create(
model="claude-opus-4-5",
max_tokens=4096,
system=system,
tools=self.COMPUTER_TOOLS,
messages=messages,
betas=["computer-use-2024-10-22"],
)
tool_results = []
task_completed = False
for block in response.content:
if hasattr(block, "text"):
if any(kw in block.text.lower() for kw in ["завдання виконано", "готово", "completed", "done"]):
task_completed = True
elif block.type == "tool_use" and block.name == "computer":
action = block.input
result = execute_computer_action(action)
actions_log.append({"action": action, "result": result})
time.sleep(0.5)
new_screenshot = capture_screenshot()
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": [{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": new_screenshot,
}
}],
})
if task_completed or response.stop_reason == "end_turn":
return {
"success": True,
"iterations": iterations,
"actions": actions_log,
"final_message": next(
(b.text for b in response.content if hasattr(b, "text")), ""
),
}
messages.append({"role": "assistant", "content": response.content})
if tool_results:
messages.append({"role": "user", "content": tool_results})
else:
break
iterations += 1
return {"success": False, "iterations": iterations, "actions": actions_log}
Як впровадити Computer Use за 1 тиждень?
- Аналіз задачі — описуємо сценарій: які вікна, які поля, очікуваний результат.
- Прототип — запускаємо базового агента на вашому ПК (3-5 днів).
- Калібрування — налаштовуємо координати, retry-логіку, human-in-the-loop.
- Тест — прогоняємо 100+ сесій, збираємо метрики.
- Деплой — пакуємо в сервіс, додаємо моніторинг.
Практичне застосування
Обробка застарілих desktop-додатків без API. ERP-система без API, але з Windows GUI. Агент заходить у форму, заповнює поля, натискає «Провести», отримує результат — все через скріншоти. Швидкість: 40–60 операцій на годину проти 15–20 у оператора. Економія часу сягає 70%, що знижує витрати на обслуговування legacy-систем.
Міграція даних між системами. Експорт зі старої CRM → імпорт у нову, коли немає прямої інтеграції. Агент копіює записи через GUI обох систем.
Регресійне тестування. Агент проходить сценарії користувача у веб-додатку, перевіряє результати, логує аномалії.
Обмеження та реальні метрики
Чесні цифри з нашої практики:
| Задача | Успішність | Ітерацій |
|---|---|---|
| Заповнити форму з 10 полів | 87% | 8–15 |
| Навігація через 3+ екрани | 71% | 15–25 |
| Робота з popup/modal | 63% | 10–20 |
| Складні drag-and-drop | 41% | 20–40 |
Для продакшену потрібні: retry-логіка, human-in-the-loop при низькій впевненості агента, логування всіх дій для аудиту.
Що входить у роботу (deliverables)
- Документація — опис архітектури, інструкції з експлуатації, посібник з налаштування параметрів.
- Навчання — 2-3 сесії для вашої команди, як донавчати та підтримувати агента.
- Підтримка 3 місяці — моніторинг, виправлення багів, адаптація до нових версій додатків.
- Дашборд моніторингу — метрики успішності, кількість ітерацій, p99 latency, логи аномалій.
Гарантуємо прозорість: ви бачите кожен крок агента і можете втрутитися у будь-який момент.
Терміни
- Базовий Computer Use агент: 3–5 днів
- Конкретна задача автоматизації (одна форма/workflow): 1 тиждень
- Система з retry і human-in-the-loop: 2 тижні
- Production-деплой з моніторингом: 3–4 тижні
Оцініть свою задачу — зв'яжіться з нами, покажемо демо на вашому додатку. Отримайте консультацію інженера: заповніть форму на сайті з описом GUI-сценарію, і ми за 1 день оцінимо можливість автоматизації.







