Дайджесты новостей
Иерархическое дерево доступности операционной системы вместо пиксельного скриншота экрана

Agent Desktop: управление компьютером через дерево доступности вместо постоянных скриншотов

Первая волна систем автономного управления компьютером (Computer-Use Agents), вроде Claude Computer Use или Operator, произвела сильное визуальное впечатление. Модель сама открывает калькулятор, вбивает числа, водит курсором по экрану и нажимает на кнопки. Но любой, кто пытался внедрить этот скриншотный подход в реальные бизнес-процессы компании, моментально сталкивался с жесткими ограничениями.

Работал этот контур до неприличия медленно: на каждый чих модель делает полноэкранный снимок в разрешении 4K, скармливает его тяжелой мультимодальной нейросети, запускает оптическое распознавание текста (OCR), пытается вычислить координаты кнопки в пикселях и эмулирует перемещение мыши. Задержка между действиями растягивалась до 5–8 секунд, счет за токены улетал в стратосферу, а малейшее смещение окна или изменение системного масштабирования (DPI) приводило к промахам курсора. К тому же бот намертво блокировал физическую мышь пользователя.

Архитектура Agent Desktop совершает в этой области настоящий технологический переворот. Вместо того чтобы мучительно разглядывать пиксели монитора через дорогое компьютерное зрение, система обращается напрямую к системному дереву доступности операционной системы (Accessibility API). О том, сколько стоит внедрение компьютерных агентов бизнесу, мы подробно писали в разборе Агенты за рабочим столом: как режим Computer Use автоматизирует десктопные программы и сколько это стоит бизнесу.

Как устроено системное дерево доступности

В каждой современной операционной системе — будь то Windows UI Automation, macOS Accessibility API или Linux AT-SPI — под капотом графического интерфейса живет параллельная структура данных. Изначально ее создавали для программ чтения с экрана (screen readers), помогающих незрячим пользователям ориентироваться в софте.

Для операционной системы окно программы — это не набор цветных точек, а строгое иерархическое дерево объектов. У каждого элемента есть четкие машиночитаемые атрибуты:

  • Роль: кнопка (button), текстовое поле ввода (text_field), выпадающий список (combobox), чекбокс (checkbox);
  • Имя и идентификатор: понятная текстовая метка (name="Сохранить как...", id="btn_submit");
  • Состояние: активно ли поле (focused=True), доступна ли кнопка (disabled=False), раскрыто ли меню (expanded=True);
  • Поддерживаемые системные действия: вызов события клика, установка текста, переключение флага.

Агенту больше не нужно угадывать координаты кнопки «Оплатить счет». Он запрашивает снимок дерева активного окна, получает компактную текстовую структуру и отправляет операционной системе команду прямого программного вызова: element.invoke(). Нативное системное событие срабатывает за 15 миллисекунд без всякого перемещения физического курсора мыши.

Сравнение на пальцах: зрение против Accessibility API

Цифры производительности показывают колоссальное преимущество архитектуры Agent Desktop над скриншотным подходом:

  1. Расход токенов: текстовое дерево доступности сложного окна бухгалтерской программы или ERP-системы занимает от 400 до 1 200 токенов. Для сравнения: один 4K-скриншот в формате Claude Vision сжигает от 2 500 до 4 000 токенов на каждый шаг. Экономия квот достигает 70–80%.
  2. Скорость реакции (Action Latency): цикл скриншотного клика длится 4,5–8 секунд. Вызов системного метода через Accessibility API отрабатывает за 0,3–0,6 секунды — ускорение в 10–15 раз!
  3. Точность позиционирования: попадание по элементам составляет 99,8% против 74–82% у компьютерного зрения, которое постоянно путает мелкие иконки в плотных таблицах.

Вот пример концептуального моста на Python, считывающего системное дерево и выполняющего программные действия:

from typing import Dict, Any, List

class DesktopAccessibilityBridge:
    def __init__(self, target_process: str):
        self.app_name = target_process

    def dump_window_tree(self) -> Dict[str, Any]:
        # Получаем структурированный снимок окна через системный API ОС
        return {
            "app": self.app_name,
            "window_title": "1С: Предприятие — Продажи",
            "controls": [
                {"uid": "grid_table", "type": "DataGrid", "rows_count": 42},
                {"uid": "btn_recalc", "type": "Button", "label": "Пересчитать", "state": "enabled"},
                {"uid": "input_discount", "type": "TextBox", "label": "Скидка (%)", "value": "0"},
                {"uid": "btn_post", "type": "Button", "label": "Провести документ", "state": "enabled"}
            ]
        }

    def trigger_action(self, control_uid: str, action: str = "invoke") -> bool:
        # Прямой системный вызов без захвата координат физического курсора
        print(f"[OS Event] Выполняем {action} для элемента: {control_uid}")
        return True

А вот как выглядит логика агента, который выбирает нужный элемент из полученного JSON и вносит данные:

def run_headless_agent_step():
    bridge = DesktopAccessibilityBridge("EnterpriseERP.exe")
    tree = bridge.dump_window_tree()

    # Модель анализирует дерево и моментально выбирает действие
    action_decision = {
        "target_uid": "input_discount",
        "new_value": "15",
        "next_button": "btn_recalc"
    }

    print(f"Обнаружено окно: {tree['window_title']}")
    # Применяем значение и нажимаем пересчет в фоне
    bridge.trigger_action(action_decision["target_uid"], action="set_value")
    bridge.trigger_action(action_decision["next_button"], action="invoke")
    print("Документ успешно пересчитан в фоновом режиме.")

if __name__ == "__main__":
    run_headless_agent_step()

Фоновая работа без захвата мыши

Еще одно важнейшее практическое преимущество Agent Desktop — работа в параллельном потоке (Headless / Background Operation).

Когда скриншотный бот берет управление на себя, ты не можешь даже пошевелить мышью: любое случайное движение руки сбивает прицел нейросети. С Agent Desktop всё иначе: системные события отправляются напрямую в дескриптор целевого окна.

Окно может быть свернуто, находиться на втором виртуальном рабочем столе или быть перекрыто другими программами. Ты спокойно общаешься в Telegram или пишешь код, пока агент в фоне заполняет строки в корпоративной базе данных. О том, как крупные корпорации строят сложные мультиагентные контуры, можно прочитать в статье Архитектура агентных приложений: как энтерпрайз развертывает мультиагентные системы.

Где пока остаются слепые зоны

Несмотря на очевидное инженерное превосходство, у дерева доступности есть две уязвимости.

Первая — нестандартный интерфейсный софт. Если программа написана на Canvas (как сложные графические редакторы) или на старых игровых библиотеках без поддержки accessibility, она представляет собой для ОС сплошное белое пятно. В таких случаях архитектура Agent Desktop переключается в гибридный режим, вызывая компьютерное зрение как аварийный шлюз.

Вторая — безопасность. Доступ к Accessibility API позволяет читать содержимое окон соседних программ, что требует строгой выдачи прав суперпользователя в операционной системе.

Но для корпоративной автоматизации десктопных программ выбор очевиден: эпоха слепого скриншотного управления стремительно уступает место чистому, быстрому и дешевому коду системных событий.