不看截图,读结构:Vercel 的 agent-desktop 怎样让 agent 操作桌面应用
Vercel Labs 开源 agent-desktop:不靠截图,而是读操作系统的无障碍树,让 agent 按编号操作桌面应用;省 token 的数字为作者自报,暂无独立基准。
两种做法
让 AI 操作电脑,大致有两种做法。
第一种是"看"。每一步先截一张屏幕截图,交给模型,模型判断按钮在哪里,再算出坐标去点。
第二种是"读"。不截图,而是向操作系统要一份界面的结构清单:这个窗口里有哪些按钮、哪些输入框、它们叫什么名字、能做什么动作。模型读清单,按编号去点。
第一种做法很直观,人就是这样用电脑的。但它有两个问题:一是截图很费 token,二是坐标容易点偏。
第二种做法用到的那份"清单",有一个专门的名字,叫做无障碍树(accessibility tree)。
据 MarkTechPost 报道,2026-10-30,Vercel Labs 发布了 agent-desktop 的 v1.0.2 版本,走的就是第二条路。
这篇文章介绍它是怎么工作的。
什么是无障碍树
无障碍树本来不是给 AI 准备的。
视障用户使用电脑,要靠读屏软件把界面念出来。为了让读屏软件知道屏幕上有什么,操作系统会为每个应用维护一棵树:窗口下面是面板,面板下面是按钮、列表、文本框,每个节点都标明了角色(role)和名称(name)。
三大操作系统都有这套接口。macOS 叫 AX API,Windows 叫 UI Automation,Linux 桌面一般用 AT-SPI。
打个比方,截图像是一张房间的照片,你得自己从照片里找出门在哪里;无障碍树则像一张标好门牌号的平面图,门在哪里、叫什么,直接写在上面。
对 agent 来说,平面图显然比照片好用。
agent-desktop 是什么
根据仓库说明,agent-desktop 是一个 Rust 写的命令行工具,同时提供一个 C 语言的库,采用 Apache-2.0 许可证。
它支持的平台如下(据官方仓库)。
| 系统 | 版本要求 | 底层接口 |
|---|---|---|
| macOS | 13 及以上 | AX API |
| Windows | 10 1809 及以上,或 Server 2019 及以上 | UI Automation |
| Linux | Ubuntu 24.04 及以上 | AT-SPI |
x64 和 ARM64 都支持,只用 CPU。
它一共有 60 个命令名,其中 56 个可以正常使用。另外四个(key-down、key-up、mouse-down、mouse-up)暂时拒绝执行,要等有了能可靠松开按键的守护进程才开放。
要注意,agent-desktop 本身不带模型,也不是一个 agent。它只负责两件事:把界面读成 JSON,以及按照指令去操作界面。"思考"这一步,仍然留在你自己的 agent 里。
一个循环:看、做、再看
它的基本用法是一个三步循环。
agent-desktop snapshot --app Finder -i
agent-desktop click @s8f3k2p9:e8
agent-desktop snapshot --app Finder -i
第一步,snapshot 读取某个应用的界面,返回一个 JSON。里面每一个可以操作的元素,都带一个编号(ref)。
第二步,agent 根据编号去操作,比如点击。
第三步,再读一次界面,确认操作有没有生效。
整个过程不做像素匹配,也不需要知道坐标。
编号为什么这么长
上面那个编号 @s8f3k2p9:e8,看上去有点啰嗦。为什么不直接写 @e8?
因为它由两部分组成:冒号前面是这次快照的 ID,后面才是元素编号。
界面是会变的。你读完界面以后,可能弹出一个对话框,列表多了一行,原来的第 8 个元素已经不是你想点的那个了。如果编号不绑定快照,agent 就可能点错。
所以,agent-desktop 的规定是:编号属于它所在的快照。只写 @e8,会直接被拒绝,返回 INVALID_ARGS 错误。
如果界面已经变了,操作会返回 STALE_REF(编号过期)或 AMBIGUOUS_TARGET(目标不明确)。这时候正确的做法是重新读一次界面,用新的编号。
这就好比门牌号前面还要加上地图的版本号。拿着旧地图上的门牌号去敲门,系统会告诉你:地图过期了,请换一张新的。
另外几个设计也值得一提。
(1)错误信息里带有一个"处置建议"(disposition),只有它标明 safe 的时候,才建议重试。这样 agent 不会对着一个危险操作反复重试。
(2)默认是无头模式(headless),通过无障碍接口操作,不移动鼠标,也不抢焦点。你可以一边让 agent 干活,一边自己用电脑。如果确实需要真实的鼠标键盘输入,要加 --headed 参数。
(3)基于编号的操作会自动等待元素就绪,最长 5,000 毫秒。
省 token 的办法
前面说过,截图很费 token。到底费多少?
据 MarkTechPost 引述 Anthropic 的文档,口径是:一张截图大约 1,000 到 1,800 个 token,computer use 的工具定义本身大约 4,500 个 token。
无障碍树也有自己的问题:复杂的应用,树会非常大,全部读出来同样很费 token。
agent-desktop 的办法是"先看目录,再翻章节"。
--skeleton 参数只读取 3 层,每个节点附上子元素的数量(children_count)和一个可以继续展开的编号。agent 先看清楚大致结构,再用 snapshot --root 展开它关心的那一部分。
作者自报的效果是:和读取完整的无障碍树相比,在 Slack、VS Code、Notion 上,token 减少了 78% 到 96%;Apple Maps 的一次读取从 3,811 个 token 降到 273 个;一个模拟的 52 步任务,从 198k 降到 31k。
要提醒的是,这些都是作者自己测的,目前还没有独立的基准测试。而且它比的是"全树"和"骨架",不是和截图比,两边口径不同,不能直接拿来相减。
(站内写过的 Mage-VL-Cowork 里,无障碍树通道在蒸馏训练时反而拖累了学生模型,那是训练阶段的结论,和这里推理时直接读树不是一回事。)
怎么上手
安装很简单,用 npm 就可以。
npm install -g agent-desktop
agent-desktop permissions --guide
agent-desktop skills get desktop
第二行是在 macOS 上引导你打开辅助功能权限。第三行会输出一份和当前版本配套的使用说明,可以直接交给 agent 阅读,告诉它循环怎么走、编号怎么用、什么时候重试。
如果要操作的是 Electron 应用,可以用 launch --cdp 启动,把它交给同一团队的 agent-browser 处理。Electron 应用本质上是网页,用浏览器的办法控制更合适。
局限
这条路线有一个明显的边界:没有无障碍树的应用,它就够不着。
有些应用自己画界面,没有向系统提供结构信息;有些游戏、远程桌面、画布类应用也是如此。对于这些应用,"看截图"仍然是唯一的办法。
另外,仓库也提醒,快照、剪贴板读取、截图、命令输出和调试文件里都可能含有私人内容,不要把它们放进公开的日志或上传。
小结
过去,computer use 常见的做法是让模型"看屏幕"。agent-desktop 提醒我们,操作系统里早就有一份现成的界面说明书,只是一直是给读屏软件用的。
它不是要取代截图,而是让 agent 在能读结构的时候,先读结构。
那么,以后的桌面应用,会不会像网页重视 SEO 一样,开始重视自己的无障碍树?
(完)
来源:vercel-labs/agent-desktop 仓库 README 与发布记录;MarkTechPost 报道(2026-10-31)。命令数、平台支持与 token 节省比例均为作者自报,比较对象是读取完整无障碍树,不是截图,暂无独立基准;Anthropic 每张截图与工具集的 token 口径据 MarkTechPost 引述 Anthropic 文档,与前者口径不同,未作换算;“看”与“读”的对比为作者看法。