Agent-desktop: AI-агенты получают доступ к любому десктопному приложению
Agent-desktop: AI-агенты получают доступ к любому десктопному приложению
Представьте: AI-агент открывает Safari, находит нужный раздел в настройках, заполняет форму и нажимает «Сохранить» — всё это без единого скриншота, без распознавания пикселей и без браузера. Проект agent-desktop, набравший 93 балла на Hacker News, делает именно это — даёт языковым моделям структурированный доступ к любому приложению на десктопе через accessibility tree операционной системы.
Что такое agent-desktop
Agent-desktop — это нативный CLI-инструмент на Rust для автоматизации десктопных приложений, спроектированный специально для AI-агентов. Вместо того чтобы делать скриншот экрана и пытаться распознать элементы интерфейса через компьютерное зрение, инструмент обращается напрямую к системному accessibility API — тому самому, который используют скринридеры для людей с нарушениями зрения. Результат — структурированный JSON с детерминированными ссылками на каждый элемент интерфейса, которые можно кликать, заполнять и читать без единого пикселя.
Проект написал разработчик под ником lahfir и выложил на GitHub под лицензией Apache 2.0. На данный момент репозиторий собрал более 400 звёзд, а последняя версия 0.1.13 включает 53 команды и FFI-биндинги для пяти платформ.
Почему accessibility tree, а не скриншоты
Подход на основе скриншотов — стандарт для таких инструментов, как Computer Use от Anthropic или Operator от OpenAI. Проблема в том, что скриншот — это 400+ токенов на кадр, неточная локализация элементов и постоянная необходимость переснимать после каждого действия. Один из комментаторов на Hacker News, TheFragenTaken, сформулировал это так: «Я давно думаю, почему все эти инструменты работают со скриншотами, а не с accessibility tree — для меня последнее всегда казалось очевидным выбором, ведь это структурированные данные».
Accessibility tree — это иерархия объектов, которую операционная система строит для каждого открытого окна. У каждого элемента есть роль (кнопка, текстовое поле, меню), имя, значение и координаты. Agent-desktop превращает эту иерархию в компактный JSON с уникальными ссылками вида @e1, @e5, @e12 — и дальше AI-агент работает с ними как с идентификаторами в API.
Для плотных приложений вроде Slack или VS Code, где accessibility tree может содержать тысячи узлов, инструмент предлагает progressive skeleton traversal — двухфазный подход, который сначала строит поверхностную карту глубиной в 3 уровня (экономя 78–96% токенов), а затем позволяет «провалиться» в нужный регион по клику. Агент видит сокращённое дерево, выбирает интересующий контейнер, получает подробную информацию только о его содержимом — и действует точечно.
Архитектура и технические детали
Инструмент состоит из нескольких Rust-крейтов: ядро с абстрактным интерфейсом PlatformAdapter, платформенные адаптеры (пока полноценно реализован только macOS) и бинарник CLI. На macOS используется AXUIElement API — тот же, что задействует VoiceOver. Каждое действие сначала пробует чистый accessibility API, и только если тот не сработал (например, Chromium-приложения иногда лгут о результате нажатия), откатывается на CGEvent — системный уровень синтеза ввода.
Особый интерес вызывает реализация для Electron-приложений. Chromium-рендер возвращает kAXErrorSuccess для действий вроде AXPress, но при этом не вызывает DOM-обработчики — кнопка визуально «нажимается», а событие не доходит. Agent-desktop обнаруживает такие элементы через обход祖先ов к AXWebArea, проверяет реальный эффект действия сравнением указателей фокусированного элемента до и после, и при необходимости эскалирует до CGClick. Это нетривиальная инженерия, о которой редко пишут в документации к подобным инструментам.
Система ссылок (RefMap) хранит маппинг между человекочитаемыми @eN и реальными элементами accessibility tree в файле ~/.agent-desktop/last_refmap.json. При каждом новом снапшоте ссылки обновляются — если элемент исчез (окно закрылось, вкладка переключилась), агент получает ошибку STALE_REF с подсказкой переснять состояние. Файл ограничен 1 МБ, чтобы не разрастаться при работе с массивными приложениями.
Workflow AI-агента
Базовый цикл работы агента выглядит так: снапшот → решение → действие → снапшот → решение → действие. Сначала агент получает карту элементов целевого приложения, затем анализирует её и выбирает действие, выполняет его и проверяет результат новым снапшотом.
Для сложных приложений используется расширенный вариант с progressive skeleton traversal. Команда snapshot --skeleton --app Slack -i --compact даёт поверхностную карту, где у контейнеров указано количество дочерних элементов, но сами они «свёрнуты». Найдя нужный регион — например, список каналов — агент делает drill-down командой snapshot --root @e3, получает детальную информацию только об этом поддереве, взаимодействует с элементами, а затем проверяет результат повторным drill-down.
Среди 53 команд — не только базовые клик и ввод текста, но и работа с уведомлениями macOS (читать, фильтровать, нажимать кнопки в нотификациях), управление окнами (перемещение, ресайз, минимизация), перетаскивание между элементами, работа с буфером обмена и многоступенчатый скроллинг с 10-шаговой цепочкой fallback-стратегий.
FFI-биндинги и интеграция с языками
Начиная с версии 0.1.13 вместе с CLI поставляется C-ABI динамическая библиотека libagent_desktop_ffi для пяти платформ: macOS arm64 и x86_64, Linux x86_64 и arm64, Windows x86_64. Это значит, что вместо того, чтобы форкать CLI-процесс на каждую команду, можно загрузить библиотеку через ctypes в Python, FFI в Ruby или dlopen в Go — и вызывать функции напрямую, in-process.
Библиотека следует строгим правилам безопасности: panic-unwind перехватывается на границе C-ABI, каждый поток проверяется на принадлежность к main thread (критично для macOS, где accessibility API потоконебезопасен), а владение нативными хэндлами — single-owner, с занулением при освобождении, чтобы двойной вызов destroy был детерминирован и безопасен.
Ограничения и текущее состояние
Главное ограничение — на данный момент полноценно работает только macOS. Windows и Linux имеют заглушки (stubs), готовые к реализации, но пока не функциональные. Это вызвало немало разочарованных комментариев на Hacker News: «Looks interesting but like every single one of these computer use apps I've seen, it's macOS only. Does anyone know of a linux one?» — написал пользователь esperent.
Второе ограничение — инструмент работает только с приложениями, которые корректно реализуют accessibility tree. Кастомные GUI-фреймворки, рисующие напрямую в GPU (Capy для Zig, egui для Rust, Dear ImGui для C++), не предоставляют accessibility-информации — для них agent-desktop бесполезен. Зато любые нативные приложения (Finder, Safari, System Settings, Xcode), а также Electron-приложения (Slack, VS Code, Notion) работают из коробки.
Также инструмент требует granting Accessibility-разрешений в macOS — без них операционная система не даст доступ к дереву элементов других приложений. Команда agent-desktop permissions --request вызывает системный диалог для предоставления нужных прав.
Контекст: экосистема desktop automation для AI
Agent-desktop появился не в вакууме. В конце 2024 года Anthropic представила Computer Use — возможность Claude управлять курсором и клавиатурой через скриншоты. OpenAI ответила Operator, Google — Mariner. Все три подхода основаны на визуальном распознавании интерфейса: модель «видит» экран и принимает решение, куда кликнуть.
Параллельно развивался подход на основе accessibility API. В январе 2025 года OpenAI приобрела MultiOn — стартап, специализировавшийся на веб-автоматизации через DOM. Проекты вроде OpenAdapt и OmniParser пытались комбинировать оба подхода. Agent-desktop позиционирует себя как «чистый» accessibility-first вариант — без скриншотов вообще, с максимальной экономией токенов и детерминированной идентификацией элементов.
Интересно, что один из комментаторов на HN, _crowecawcaw, рассказал, что создал «почти такой же инструмент под тем же именем» (agent-desktop.dev) — и видел ещё пару похожих проектов. Это подтверждает, что направление accessibility-first desktop automation созрело, и несколько команд пришли к одному и тому же решению независимо.
Часто задаваемые вопросы
Чем agent-desktop отличается от Computer Use от Anthropic?
Computer Use работает через скриншоты: модель получает изображение экрана и должна визуально определить, куда кликнуть. Agent-desktop использует accessibility tree — структурированные данные с точными идентификаторами элементов. Это экономит токены (нет нужды передавать картинки), повышает точность (нет ошибок распознавания) и даёт детерминированные ссылки для повторных действий. Но Computer Use кроссплатформенный по своей природе, тогда как agent-desktop пока ограничен macOS.
Можно ли использовать agent-desktop для веб-автоматизации?
Технически да — через нативные окна браузера. Инструмент видит элементы веб-страниц, которые браузер экспортирует в accessibility tree (Chromium и WebKit делают это корректно). Но для чисто веб-задач проще использовать Playwright или Puppeteer, работающие напрямую с DOM. Сила agent-desktop — в автоматизации нативных десктопных приложений, у которых нет API: файловые менеджеры, системные настройки, десктопные мессенджеры, IDE.
Насколько безопасно давать AI-агенту доступ к accessibility tree?
Инструмент запрашивает стандартное Accessibility-разрешение macOS и хранит refmap-файл с правами 0o600 (только владелец). Агент может делать только то, что позволяет accessibility API — это те же действия, которые доступны через клавиатуру и мышь. Риск аналогичен любому инструменту RPA: агенту нужны чёткие инструкции и ограничение области действий. Для продакшена рекомендуется запускать агента в изолированном пользовательском аккаунте.
Итог
Agent-desktop — один из самых продуманных инструментов для десктопной автоматизации через AI, который я видел за последний год. Решение отказаться от скриншотов в пользу accessibility tree — не просто технический выбор, а архитектурный: он определяет скорость, точность и стоимость каждого действия агента. Progressive skeleton traversal решает проблему «бесконечных» деревьев в сложных приложениях, а FFI-биндинги открывают путь к интеграции с любым языком программирования.
Ограничение одной платформой — серьёзный минус, но архитектура с абстрактным PlatformAdapter и готовыми стабами для Windows/Linux показывает, что автор планирует кроссплатформенность. Если вы строите AI-агентов, которым нужно взаимодействовать с десктопными приложениями — это стоит попробовать. Установите через npm install -g agent-desktop, дайте Accessibility-разрешения и попробуйте agent-desktop snapshot --app Finder -i — увидеть структурированную карту интерфейса Finder в терминале действительно впечатляет.