Sakhanda Wire
NVDA $204.64 -4.22% MSFT $521.91 -1.55% GOOGL $279.84 -1.40% META $614.99 -1.53% AMZN $240.35 -1.41%
← К новостям

Vercel Labs открыла исходный код agent-desktop для использования компьютера агентами

Vercel Labs выпустила agent-desktop — CLI с открытым исходным кодом для использования компьютера ИИ-агентами в macOS, Windows и Linux. agent-desktop считывает каждое приложение через дерево специальных возможностей операционной системы, а не через скриншоты. Агент получает снимок JSON с ref для каждого элемента, с которым он может взаимодействовать. Версия 1.0.2 вышла 30 октября 2026 года под лицензией Apache-2.0. Для разработчиков это означает, что любой агент для написания кода с поддержкой shell теперь может управлять нативными приложениями без модели компьютерного зрения.

Кратко

  • Библиотека: CLI на Rust и библиотека C. 60 названий команд, 56 рабочих.
  • Работает в: macOS 13+, Windows 10 1809+ или Server 2019+, Ubuntu 24.04+, на x64 и ARM64. Только CPU, GPU не требуется.
  • Производительность: Детерминированные действия с ref, безопасные для повторного выполнения. Отдельного бенчмарка использования компьютера пока нет.
  • Лучший результат: на 78–96% меньше токенов в насыщенных приложениях Electron благодаря обходу скелета (по самоотчётам).

Что такое agent-desktop?

agent-desktop — это CLI на Rust и библиотека C от Vercel Labs для чтения данных о настольных приложениях и управления ими. Это инструмент, который вызывают агенты, а не агент. В него не встроена LLM и у него нет графического интерфейса. Каждая команда выводит один конверт JSON и завершает работу. Цикл наблюдения, действия и проверки остаётся внутри вашего агента.

Как работает agent-desktop?

Каждая команда проходит через фиксированную цепочку. CLI или библиотека C вызывают agent-desktop-core, который обращается к ОС только через трейт PlatformAdapter. Затем отдельный платформенный crate взаимодействует с нативным API специальных возможностей:

  • macOS: AX API
  • Windows: UI Automation
  • Linux: AT-SPI

Core никогда не импортирует платформенный crate. Каждый бинарный файл компилируется для работы ровно с одной ОС.

Снимки и ref

Снимок назначает квалифицированные ref, например @s8f3k2p9:e8. Идентификатор снимка внутри ref делает его самодостаточным. Одиночный @e8 отклоняется с ошибкой INVALID_ARGS. Когда интерфейс меняется, действие возвращает STALE_REF или AMBIGUOUS_TARGET. После этого агент создаёт новый снимок.

Каждая ошибка содержит поле disposition. Агентам следует повторять попытку только если его значение — safe. Разрешение ref является строгим и при ошибке прекращает работу, а не пытается угадать.

Скелет и детализация

Насыщенные приложения могут предоставлять тысячи узлов специальных возможностей. Снимок --skeleton считывает только 3 уровня в глубину. Обрезанные контейнеры сообщают значение children_count и получают ref для детализации. Затем snapshot --root считывает одну область в тот же снимок.

Создатель сообщил о сокращении количества токенов на 78–96% по сравнению с выгрузками полного дерева в Slack, VS Code и Notion. В Apple Maps он сообщил о снижении с 3 811 до 273 токенов на один просмотр. В смоделированной задаче из 52 шагов показатель снизился со 198 тыс. до 31 тыс. токенов. Это данные самоотчётов, а не результаты независимого бенчмарка.

По умолчанию без интерфейса

Действия с ref выполняются через API специальных возможностей без перемещения указателя и захвата фокуса. Благодаря этому агенты могут работать, пока вы продолжаете пользоваться компьютером. Глобальный флаг --headed разрешает физический ввод, когда это необходимо. Каждое действие с ref также автоматически ожидает до 5 000 мс, пока цель не станет видимой, доступной и стабильной.

Trace a command</button><button class="b g" id="ad-step">Шаг</button></div> </div> <div class="pane" data-p="1"> <p class="lead">Сопоставьте, детализируйте, выполните действие, проверьте. Нажмите на шаг. Пример вывода сокращён из официальной документации (калькулятор GNOME).</p> <div class="steps" id="ad-steps"> <div class="st on" data-s="0"><i>1</i><b>Скелет</b></div> <div class="st" data-s="1"><i>2</i><b>Детализация</b></div> <div class="st" data-s="2"><i>3</i><b>Действие</b></div> <div class="st" data-s="3"><i>4</i><b>Проверка</b></div> </div> <pre id="ad-code"></pre> <p class="note" id="ad-note"></p> <div class="btns"><button class="b" id="ad-next">Следующий шаг →</button></div> </div> <div class="pane" data-p="2"> <p class="lead">Данные создателя о детализации скелета рядом с задокументированной стоимостью скриншота Anthropic.</p> <div class="bars" id="ad-bars"> <div class="grp">Apple Maps, токены на один просмотр (самоотчёт)</div> <div class="bar"><div class="lb"><span>Снимок всего окна</span><em>3 811</em></div><div class="trk"><div class="fill" data-w="100" style="background:#ededed">3 811</div></div></div> <div class="bar"><div class="lb"><span>Скелет, затем детализация</span><em>273</em></div><div class="trk"><div class="fill" data-w="7.2" style="background:#0070f3"></div></div></div> <div class="grp">Смоделированная задача из 52 шагов, всего токенов (самоотчёт)</div> <div class="bar"><div class="lb"><span>Полное окно на каждом шаге</span><em>198k</em></div><div class="trk"><div class="fill" data-w="100" style="background:#ededed">198k</div></div></div> <div class="bar"><div class="lb"><span>Скелет, затем детализация</span><em>31k</em></div><div class="trk"><div class="fill" data-w="15.7" style="background:#0070f3">31k</div></div></div> <div class="grp">Справочно: использование компьютера на основе пикселей</div> <div class="bar"><div class="lb"><span>Один скриншот Claude для использования компьютера (документация Anthropic)</span><em>~1 000–1 800</em></div><div class="trk"><div class="fill" data-w="47" style="background:#f5a623">~1,8k макс.</div></div></div> </div> <div class="btns"><button class="b g" id="ad-replay">↻ Повторить</button></div> <p class="note" style="margin-top:10px!important">Создатель также сообщает об экономии 78–96% в Slack, VS Code и Notion. Независимого бенчмарка пока нет.</p> </div> <div class="pane" data-p="3"> <p class="lead">Одинаковые 60 названий команд на всех платформах. Нажмите на платформу, чтобы увидеть требования.</p> <div class="os"> <div class="oc"><h4>macOS</h4><div class="api">AX API</div><div class="more">macOS 13+, Intel или Apple Silicon. Предоставьте разрешение на специальные возможности с помощью <code>permissions --guide</code>. Работа с shell пока планируется.</div></div> <div class="oc"><h4>Windows</h4><div class="api">UI Automation</div><div class="more">Windows 10 1809+ или Server 2019+, x64 или ARM64. Для приложений на уровне целостности вашего терминала разрешение не требуется. Приложения с более высоким уровнем целостности отклоняют ввод.</div></div> <div class="oc"><h4>Linux</h4><div class="api">AT-SPI</div><div class="more">Ubuntu 24.04+, glibc не ниже 2.35, x86_64 или aarch64. Требуется <code>at-spi2-core</code>. Для ввода мышью и наложения курсора нужен X11.</div></div> </div> <pre style="min-height:0;margin-top:14px!important"><span class="c"># одна установка для всех 3</span> <span class="k">npm</span> install -g agent-desktop <span class="k">agent-desktop</span> skills get desktop</pre> </div> <div class="pane" data-p="4"> <p class="lead">Где он уступает. Нажмите, чтобы развернуть.</p> <div class="lim"> <div class="li"><b><span class="x">!</span>Нет дерева — нет зрения</b><div class="more">Инструмент считывает деревья специальных возможностей и никогда не сопоставляет пиксели. Интерфейс, который не публикует дерево, для него невидим.</div></div> <div class="li"><b><span class="x">!</span>Параллельная работа с арендой</b><div class="more">Курсоры нескольких агентов существуют только для отображения. Общая для компьютера аренда взаимодействия всё равно сериализует физический ввод. Семантические действия без интерфейса полностью обходятся без указателя.</div></div> <div class="li"><b><span class="x">!</span>Медленные холодные приложения Electron</b><div class="more">Холодному приложению Chromium или Electron может потребоваться от 10 до 25 секунд, чтобы предоставить своё веб-дерево.</div></div> <div class="li"><b><span class="x">!</span>Закрытые данные в выводе</b><div class="more">Снимки, данные буфера обмена и скриншоты могут содержать закрытое содержимое рабочего стола. Не помещайте их в общедоступные журналы.</div></div> </div> </div> <div class="ft"><span>Источники: github.com/vercel-labs/agent-desktop · agent-browser.dev/desktop · документация Anthropic</span><span class="mtp">© Marktechpost</span></div> </div> <script> (function(){ var R=document.getElementById('mtp-ad'); function rs(){try{parent.postMessage({mtpH:R.offsetHeight+40},'*')}catch(e){}} var tabs=R.querySelectorAll('.tab'),panes=R.querySelectorAll('.pane'); tabs.forEach(function(t){t.onclick=function(){tabs.forEach(function(x){x.classList.remove('on')});panes.forEach(function(x){x.classList.remove('on')});t.classList.add('on');var p=R.querySelector('[data-p="'+t.dataset.t+'"]');p.classList.add('on');if(t.dataset.t==='2')bars();setTimeout(rs,60);}}); /* цепочка */ var L=R.querySelectorAll('#ad-chain .layer'),ci=-1,tm=null; function lite(i){L.forEach(function(x,j){x.classList.toggle('lit',j===i)})} R.querySelector('#ad-step').onclick=function(){clearInterval(tm);ci=(ci+1)%L.length;lite(ci)}; R.querySelector('#ad-play').onclick=function(){clearInterval(tm);ci=-1;tm=setInterval(function(){ci++;if(ci>=L.length){clearInterval(tm);L.forEach(function(x){x.classList.add('lit')});return}lite(ci)},450)}; /* цикл */ var S=[ ['<span class="c"># 1. сопоставить плотное окно: глубина ограничена 3 уровнями</span>\n<span class="k">agent-desktop</span> snapshot --app gnome-calculator --skeleton -i --compact\n\n{ "snapshot_id": <span class="s">"s2txcl95uvubmn"</span>, "ref_count": 2,\n "children": [\n { "role": "group", "ref_id": <span class="s">"@s2txcl95uvubmn:e1"</span>, "children_count": 2 },\n { "role": "group", "ref_id": <span class="s">"@s2txcl95uvubmn:e2"</span>, "children_count": 1 } ] }','Считываются только верхние уровни. Обрезанные контейнеры содержат children_count и ref для детализации.'], ['<span class="c"># 2. детализировать одну область по ref</span>\n<span class="k">agent-desktop</span> snapshot --root @s2txcl95uvubmn:e1 -i --compact\n\n{ "snapshot_id": <span class="s">"s2txcl95uvubmn"</span>, "ref_count": 33,\n "children": [\n { "role": "button", "name": "C", "ref_id": <span class="s">"@s2txcl95uvubmn:e8"</span> },\n { "role": "button", "name": "7", "ref_id": <span class="s">"@s2txcl95uvubmn:e11"</span>,\n "available_actions": ["Click","SetFocus"] } ] }','Новые ref присоединяются к тому же снимку. Стоимость зависит от области, а не от всего окна.'], ['<span class="c"># 3. выполнить действие с квалифицированным ref: без интерфейса, указатель остаётся на месте</span>\n<span class="k">agent-desktop</span> click @s2txcl95uvubmn:e11\n\n<span class="c"># одиночный ref отклоняется</span>\n<span class="k">agent-desktop</span> click @e11\n{ "ok": false, "error": { "code": <span class="s">"INVALID_ARGS"</span> } }','Автоматическое ожидание удерживает действие до 5 000 мс, пока цель не станет видимой, доступной и стабильной.'], ['<span class="c"># 4. проверить: успешное выполнение не доказывает, что интерфейс изменился</span>\n<span class="k">agent-desktop</span> wait --element @s2txcl95uvubmn:e6 --predicate value --value 7\n\n<span class="c"># устарел после повторной детализации?</span>\n{ "code": <span class="s">"STALE_REF"</span>,\n "disposition": { "delivery": "not_delivered", "retry": <span class="s">"safe"</span> } }','Ошибки сообщают, безопасно ли повторять попытку. При STALE_REF снова создайте снимок и повторите действие.']]; var si=0,code=R.querySelector('#ad-code'),note=R.querySelector('#ad-note'),st=R.querySelectorAll('.st'); function show(i){si=i;st.forEach(function(x,j){x.classList.toggle('on',j===i)});code.style.opacity=0;setTimeout(function(){code.innerHTML=S[i][0];note.textContent=S[i][1];code.style.opacity=1;rs()},150)} code.style.transition='opacity .15s'; st.forEach(function(x){x.onclick=function(){show(+x.dataset.s)}}); R.querySelector('#ad-next').onclick=function(){show((si+1)%4)}; show(0); /* полосы */ function bars(){var f=R.querySelectorAll('#ad-bars .fill');f.forEach(function(x){x.style.transition='none';x.style.width='0'});void R.offsetWidth;setTimeout(function(){f.forEach(function(x,i){x.style.transition='width 1.1s cubic-bezier(.2,.8,.2,1) '+(i*0.12)+'s';x.style.width=x.dataset.w+'%'})},30)} R.querySelector('#ad-replay').onclick=bars; /* раскрывающиеся элементы */ R.querySelectorAll('.oc,.li').forEach(function(x){x.onclick=function(){x.classList.toggle('on');setTimeout(rs,380)}}); window.addEventListener('load',rs);setTimeout(function(){R.querySelector('#ad-play').click()},700);window.addEventListener('resize',rs);setTimeout(rs,300); })(); </script> </body></html>" style="width:100%;max-width:880px;height:600px;border:0;display:block;margin:0 auto;background:transparent;" loading="lazy">

Как это сравнивается с использованием компьютера на основе пикселей?

Инструменты использования компьютера на стороне модели работают со скриншотами и координатами пикселей. В документации Anthropic указано, что каждый скриншот стоит примерно 1 000–1 800 входных токенов. Определение её инструментария добавляет около 4 500 входных токенов на запрос. Аналогичный инструмент OpenAI возвращает действия нажатия, ввода текста и прокрутки, которые выполняет ваш код.

agent-desktop не зависит от модели и возвращает структуру, а не изображения. UFO² от Microsoft также использует UI Automation, но поставляется как полноценный агент для Windows.

Возможностьagent-desktop (Vercel Labs)Claude computer useOpenAI computer useMicrosoft UFO²
ТипИнструмент CLI + библиотека CНабор инструментов APIИнструмент APIПолноценный агентский фреймворк
Как видит интерфейсДерево специальных возможностей ОССкриншотыСкриншоты или код (PyAutoGUI, Playwright)Гибрид UIA и визуального анализа
Встроенная модельНет, любой агентМодели ClaudeМодели OpenAIНастраиваемая LLM
ПлатформыmacOS, Windows, LinuxЛюбая размещённая вами среда (пример: Linux Docker)Размещённый вами браузер или рабочий столWindows (UFO²)
Перемещает курсорНет, по умолчанию без интерфейсаДа, нажатия по пикселямДа, нажатия по пикселямДействия через GUI и API
Стоимость одного просмотра в токенах273 (скелет Apple Maps, самоотчёт)~1 000–1 800 на скриншотНе раскрытаНе раскрыта
ЛицензияApache-2.0Проприетарный APIПроприетарный APIMIT
ЦенаБесплатноСтандартная тарификация токеновСтандартная тарификация токеновБесплатно (плюс расходы на LLM)

Как установить и использовать agent-desktop?

Установите пакет с помощью npm install -g agent-desktop. Bun, Yarn и pnpm также поддерживаются. Пакет включает нативные бинарные файлы для x64 и ARM64.

  • macOS: предоставьте разрешение на специальные возможности с помощью agent-desktop permissions --guide.
  • Windows: для приложений на уровне целостности вашего терминала разрешение не требуется.
  • Linux: требуется графическая сессия с at-spi2-core.

Агенты узнают об инструменте из встроенной документации с помощью agent-desktop skills get desktop. Навык также представлен на skills.sh. Библиотека C позволяет приложениям на Python, Swift, Go, Ruby и Node вызывать его внутри процесса. Для веб-содержимого Electron команда launch --cdp открывает порт DevTools для agent-browser.

Основные выводы

  • agent-desktop предоставляет любому агенту возможность использовать компьютер через деревья специальных возможностей ОС.
  • Инструмент работает в macOS, Windows и Linux, на x64 и ARM64, под лицензией Apache-2.0.
  • Действия с ref без интерфейса никогда не перемещают указатель и не перехватывают фокус.
  • Снимки скелета сокращают количество токенов на 78–96% (по самоотчётам).
  • Приложения без дерева специальных возможностей остаются недоступными.

Посетите репозиторий GitHub, документацию и пакет npm. Также подписывайтесь на нас в Twitter и не забудьте присоединиться к нашему сабреддиту о машинном обучении с аудиторией более 150 тыс. и подписаться на нашу рассылку. Стоп! Вы есть в Telegram? Теперь к нам можно присоединиться и в Telegram.

Хотите сотрудничать с нами для продвижения своего репозитория GitHub, страницы Hugging Face, выпуска продукта, вебинара и т. д.? Свяжитесь с нами

Переведено автоматически с английского. Оригинал статьи — по ссылке ниже.

Впервые опубликовано изданием MarkTechPost

Читать оригинал на MarkTechPost ↗

Текст и изображения принадлежат MarkTechPost и приводятся здесь с указанием авторства и ссылкой на оригинальную публикацию.

← К новостям

Ещё новости

Все последние новости