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 тепер може керувати нативними застосунками без моделі комп’ютерного зору.

Коротко

  • Бібліотека: Rust CLI і бібліотека 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 — це Rust CLI та бібліотека 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);}}); /* chain */ 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)}; /* loop */ 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); /* bars */ 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; /* expanders */ 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Використання комп’ютера OpenAIMicrosoft UFO²
ТипCLI + інструмент бібліотеки CНабір інструментів клієнта APIІнструмент APIПовноцінний агентський фреймворк
Як бачить інтерфейсДерево доступності ОСЗнімки екранаЗнімки екрана або код (PyAutoGUI, Playwright)Гібрид UIA + візуальний аналіз
Вбудована модельНемає, будь-який агентМоделі ClaudeМоделі OpenAILLM, яку можна налаштувати
Платформи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 і наводяться тут із зазначенням авторства та посиланням на оригінальну публікацію.

← До новин

Ще новини

Усі останні новини