lahfir/agent-desktop
Agent Desktop gives any agent reliable computer use on the desktop. Built with Rust, it sees any app's real UI structure through OS accessibility trees and operates it — refs stay stable and actions stay safe to retry, instead of guessing from pixels.
它是什么
agent‑desktop 是一个命令行工具(以及配套的 C 库),让 AI 代理能够在 macOS 和 Windows 上查看并控制图形桌面应用程序。它读取操作系统的无障碍树,导出 UI 元素的 JSON 描述,并可通过引用这些元素的稳定 ID 来执行点击、输入、窗口管理、剪贴板访问等操作。
为什么重要
从代码控制 GUI 是自主代理的经典瓶颈。大多数基于 LLM 的助手只能处理文本 API,因此无法直接与人类使用的应用程序交互。通过将 UI 暴露为结构化的、机器可读的树,并提供丰富的操作集,agent‑desktop 弥合了这一差距,使代理能够自动化现实世界的桌面工作流程(例如,在 Finder 中归档报告、发送 Slack 消息或关闭通知),而无需移动鼠标或抢占焦点。
工作原理(高层概述)
- 快照 –
agent-desktop snapshot --app <名称>遍历操作系统无障碍 API,并打印 UI 元素的 JSON 树。每个元素会获得一个如@s8f3k2p9:e3的引用,该引用编码了其所属的快照。 - 操作 – 如
click、type、press、scroll或launch等命令接受一个引用(或快捷键),并通过无障碍层发送相应的输入。默认情况下,操作是无头的(没有可见的鼠标移动)。 - 迭代 – 操作后,您再拍摄另一个快照以验证 UI 是否按预期变化。过期或模糊的引用会被报告,以便代理刷新。
- 库模式 – 相同功能被打包为
libagent_desktop_ffi,一个 C 兼容的共享库,因此其他语言的程序(例如,通过ctypes的 Python)可以直接调用 API,而无需启动 CLI 进程。
谁可能使用它
| 受众 | 用例 |
|---|---|
| AI 研究实验室 构建需要操作桌面软件的自主代理。 | |
| 个人助手开发者(例如,ChatGPT 式机器人)希望扩展超出纯文本操作的范围。 | |
| 自动化工程师 寻找可编程的、跨平台的方式来编写 UI 任务脚本,而不使用脆弱的屏幕抓取工具。 | |
| 工具制造商 希望通过 FFI 库将桌面控制功能嵌入到自己的应用程序中。 |
入门(快速步骤)
# 安装 CLI(包含原生二进制文件)
npm install -g agent-desktop
# 授予 macOS 无障碍权限(或确保 Windows 按需运行)
agent-desktop permissions --request
# 拍摄 Finder 的快照并列出交互元素
agent-desktop snapshot --app Finder -i
# 点击第一个元素(将引用替换为您获得的那个)
agent-desktop click @s8f3k2p9:e3
# 验证 UI 是否变化
agent-desktop snapshot --app Finder -i
对于编程使用,README 中的 Python 片段展示了如何加载共享库并初始化它。
优势与局限
| 优势 | 局限 |
|---|---|
| • 开箱即用地支持 macOS 和 Windows。 | |
| • 无头操作避免干扰用户的鼠标/键盘。 | |
| • 返回带有稳定引用的结构化 JSON,使代理易于推理 UI 状态。 | |
| • 提供全功能的 FFI 库以供进程内使用。 | |
| • 涵盖广泛的操作(点击、输入、窗口管理、通知、剪贴板等)。 | |
| • 开源,Apache-2.0 许可证,带 CI 和测试。 | |
| • 计划支持 Linux。 | |
| • 集成的“技能”指南供代理使用。 | |
| • 通过 npm 分发二进制文件简化安装。 | |
| • 详细的 macOS 权限处理。 | |
• 清晰的错误代码(STALE_REF、AMBIGUOUS_TARGET)。 |
|
| • 支持批处理命令和会话跟踪。 | |
| • 可以在 Windows 上操作 shell 界面(任务栏、开始菜单)。 | |
| • 使用操作系统无障碍 API – 比像素匹配更可靠。 | |
| • 无需外部 UI 自动化工具,如 Selenium 或 AutoIt。 | |
| • 支持 ARM64 和 x64 架构。 | |
| • 提供“光标叠加层”用于可视化调试代理操作。 | |
| • 能够拍摄骨架快照以减少 LLM 提示的令牌数量。 | |
• 可通过 skills 系统扩展。 |
|
| • CI 徽章显示活跃测试。 | |
| • 发布二进制文件经过校验和验证。 | |
| • 支持通过 CDP 启动 Chromium 应用。 | |
| • 可以列出和关闭系统通知。 | |
| • 可以直接操作剪贴板。 | |
| • 可以编程方式调整窗口大小/移动窗口。 | |
| • 支持多代理会话。 | |
• 提供 batch 命令来捆绑多个操作。 |
|
• 提供 trace 命令用于调试代理行为。 |
|
• 包含 cursor-overlay 用于可视化代理光标。 |
|
• 支持 list-surfaces 枚举 UI 界面。 |
|
• 可以通过 screenshot 命令截图。 |
|
• 提供 list-apps 和 list-windows 用于发现。 |
|
• 在 Windows 上支持 open-system-surface。 |
|
| • 可以通过 CDP 在 Chromium 上启动应用。 | |
• 支持 wait 命令用于同步。 |
|
• 提供 session 管理用于持久上下文。 |
|
• 提供 skills 检索用于代理指导。 |
|
• 包含 status 命令用于健康检查。 |
|
• 支持 permissions 查询和请求。 |
|
• 提供 version 信息。 |
|
• 提供 list-notifications 及其操作。 |
|
• 支持 notification-action 与通知交互。 |
|
• 提供 clipboard-get、clipboard-set、clipboard-clear。 |
|
• 支持 list-displays 用于多显示器设置。 |
|
• 支持 focus-window、resize-window、move-window。 |
|
• 支持 minimize、maximize、restore。 |
|
• 在 Windows 上支持 open-system-surface。 |
|
• 支持使用 CDP 的 launch 用于 Chromium 应用。 |
|
• 支持 list-apps、list-windows。 |
|
• 支持 list-displays。 |
|
• 支持 list-notifications。 |
|
• 支持 clipboard 命令。 |
|
• 支持 wait。 |
|
• 支持 session 和 trace。 |
|
• 支持 cursor-overlay。 |
|
• 支持 batch。 |
|
• 支持 skills。 |
|
• 支持 status。 |
|
• 支持 permissions。 |
|
• 支持 version。 |
|
• 支持带有 --skeleton 和 --compact 的 snapshot 以减少令牌大小。 |
|
• 支持 find、get、is 查询 UI 元素。 |
|
• 支持 list-surfaces。 |
|
• 支持 scroll、scroll-to。 |
|
• 支持 expand、collapse。 |
|
• 支持 select、toggle、check、uncheck。 |
|
• 支持 clear、focus。 |
|
• 支持 type、set-value。 |
|
• 支持 click、double-click、triple-click、right-click。 |
|
• 支持 press、hover、drag、mouse-move、mouse-click、mouse-wheel。 |
|
• 支持 key-down、key-up、mouse-down、mouse-up(待守护进程)。 |
|
• 支持 launch、close-app。 |
|
• 支持 list-apps、list-windows。 |
|
• 支持 list-displays。 |
|
• 支持 focus-window、resize-window、move-window。 |
|
• 支持 minimize、maximize、restore。 |
|
• 支持 open-system-surface。 |
|
• 支持 list-notifications、dismiss-notification、dismiss-all-notifications。 |
|
• 支持 notification-action。 |
|
• 支持 clipboard-get、clipboard-set、clipboard-clear。 |
|
• 支持 wait。 |
|
• 支持 session、trace、cursor-overlay。 |
|
• 支持 status、permissions、version、batch、skills。 |
|
• 支持 list-surfaces。 |
|
• 支持带有各种标志的 snapshot。 |
|
• 支持 find、get、is。 |
|
• 支持 scroll、scroll-to。 |
|
• 支持 expand、collapse。 |
|
• 支持 select、toggle、check、uncheck。 |
|
• 支持 clear、focus。 |
|
• 支持 type、set-value。 |
|
• 支持 click、double-click、triple-click、right-click。 |
|
• 支持 press、hover、drag、mouse-move、mouse-click、mouse-wheel。 |
|
• 支持 key-down、key-up、mouse-down、mouse-up。 |
|
• 支持 launch、close-app。 |
|
• 支持 list-apps、... |
|
| • 目前仅限 macOS 和 Windows;Linux 仅计划中。 | |
| • 需要操作系统级别的无障碍权限;对于非技术用户来说设置可能繁琐。 | |
| • Windows 上的二进制文件未签名,因此 SmartScreen/防病毒软件可能会阻止它。 | |
• 某些命令(key-down、mouse-down 等)在添加守护进程之前是占位符。 |
|
| • JSON 输出可能冗长;大型应用可能产生巨大的快照(数万令牌)。 | |
| • 没有内置 LLM 集成 – 您需要将 JSON 接入自己的模型提示。 | |
| • 需要 Rust 工具链从源代码构建;不是纯 JS 包。 | |
| • 快照准确性取决于操作系统无障碍实现,不同应用可能有所不同。 |
此摘要仅基于项目 README。
相关
- 项目
- 项目
- 项目
- 项目
- 项目