Skip to content

Hermes Agent + CUA Driver — 开源 AI Agent 的后台桌面控制

开源 AI Agent Hermes Agent 集成 CUA Driver,实现了在 macOS 上后台操控原生应用——光标不动、窗口不抢、Space 不切,你和 AI 真正并行工作。支持任意模型(Claude/GPT/Gemini/本地开源),零遥测,MIT 协议。


目录


行业背景:Computer Use 的竞赛与锁

所有主要 AI 实验室都在做 Computer Use(计算机操控):

公司 产品 形态
Anthropic Claude Computer Use API(给截图 → 返回点击坐标,需自建循环)
OpenAI Operator / Codex 闭源消费产品 + 后台浏览器操控
Google Gemini in Workspace 嵌入 Docs/Sheets/Gmail/Calendar
Microsoft Copilot Studio 闭源平台
Salesforce Agent Force 闭源平台

共同问题:全部带有 vendor lock-in。Anthropic 的 schema 是专有的,OpenAI 的 Operator 是闭源的,Google/Microsoft 绑定各自的生态。而且它们提供的是模型能力而非基础设施——你仍需自己搭建沙箱、审批层、上下文管理、Token 优化。


两个开源项目:Hermes Agent + CUA

Hermes Agent(Nous Research)

定位:自改进的自主 AI Agent
核心能力:
  - 内置学习循环(从经验中创建 Skills)
  - 跨平台触达(Telegram/Discord/CLI)
  - 多模型支持(Claude/GPT/Gemini/本地模型)
  - $5 VPS 即可运行
  - 零遥测,MIT 协议
GitHub: github.com/NousResearch/hermes-agent

CUA / TrickUA(Y Combinator S25)

定位:Computer Use Agent 的基础设施层
使命:构建训练和评估 AI Agent 操控完整操作系统的基础设施
组成:
  - Loom    → Apple Silicon 虚拟机管理(97% 原生性能)
  - CUA Driver → macOS 后台输入驱动(本视频核心)
  - Set of Mark → 视觉定位库
  - MCP Server → 协议边界,任何 MCP 客户端可接入
  - CUA Bench  → 基准测试工具
协议:MIT 开源
GitHub: github.com/trycua/cua

关键洞察:模型已不是瓶颈,基准测试、沙箱、基础设施才是。TrickUA 做的就是后者。


CUA 技术栈拆解

+----------------------------------------------------------+
|  Hermes Agent(大脑)                                     |
|  LLM 推理 / 记忆 / Skills / 多平台消息                    |
+----------------------------------------------------------+
|                    MCP over stdio                         |
+----------------------------------------------------------+
|  computer_use toolset(封装层)                            |
|  capture / click / type / key / scroll / drag / focus    |
+----------------------------------------------------------+
|  CUA Driver(驱动层)                                      |
|  SkyLight SPI 输入注入 + AX Tree 监控                     |
+----------------------------------------------------------+
|  Set of Mark(视觉定位层)                                  |
|  YOLO 图标检测 + EasyOCR + Metal Shader                   |
+----------------------------------------------------------+
|  macOS(目标系统)                                         |
|  原生应用:Mail / Safari / VS Code / Notion / ...          |
+----------------------------------------------------------+

CUA Driver:为什么不是普通自动化

朴素方案的问题:CGEventPost

CGEventPost(传统方案):
  注入事件到全局 HID 事件流
  ↓
  光标移动到坐标 → 窗口跳到前台 → Space 切换
  → 键盘焦点改变 → 前台应用改变
  → 你无法同时使用电脑

  对一次性脚本:可以忍受
  对并行工作 Agent:完全不可用

CUA Driver 的方案:SkyLight 私有 SPI

CUA Driver 方案:
  使用 SkyLight 私有 SPI 直接投递到目标进程
  ↓
  SLEventPostToPid()       → 按进程 ID 投递事件
  SLPSPostEventRecordTo()  → 投递结构化事件记录
  ↓
  目标应用收到点击/输入/滚动/拖拽(和用户操作一样)
  但 macOS 不视为全局事件
  ↓
  光标不动 ✓  窗口不变 ✓  Space 不切 ✓
  你和 Agent 真正并行工作

第三个 SPI:AX Tree 监控

_AXObserverAddNotificationAndCheckRemote():
  - 监控非前台应用的无障碍通知
  - 关键能力:即使窗口被遮挡/隐藏,AX Tree 仍然活跃
  - 解决 Electron 应用(Notion/Linear/Slack/VS Code)的
    隐藏窗口 AX Tree 坍塌问题

性能特征

事件路由延迟:5-20ms(vs HID 直投 <1ms)
Agent 每次动作间隔:数百毫秒(模型推理时间)
  → 5-20ms 延迟完全不可感知
  → 瓶颈在推理,不在事件路由

Set of Mark:让 Computer Use 从脆弱变可靠

问题:坐标猜测

朴素 Computer Use 流程:
  截图 → 模型看像素 → 猜坐标 → 点击
  ↓
  有时点对,有时点错
  UI 偏移 12 像素(通知横幅?)→ 全错
  → 大量开发者因此认为 Computer Use 不成熟

解决方案:结构化元素地图

Set of Mark 流程:
  截图 → 视觉管线处理 → 生成编号元素地图
  ↓
  [1] 菜单栏: Apple
  [2] 菜单栏: Mail
  [3] 按钮: 新建邮件
  [4] 文本框: 搜索
  [5] 侧边栏: 收件箱 (14)
  [6] 侧边栏: 已发送
  ...
  ↓
  模型说:"click element 5"(而不是猜坐标)
  Driver 查地图 → 解析精确坐标 → 执行点击

SOM 的两个底层技术

1. YOLO 目标检测模型
   - You Only Look Once → 单次前向传播识别+定位
   - 扫描截图中的 UI 原语:按钮/复选框/图标/开关/滑块
   - 针对 UI 元素微调

2. EasyOCR 文本识别
   - 识别元素上的文字标签
   - 通过 Metal Performance Shaders 针对 Apple Silicon 优化
   - 结合 YOLO 输出 → 每个元素 = 编号 + 标签 + 类型 + 坐标

Agent 循环

capture(mode="som")
  → 返回带编号叠加层的截图 + AX Tree 索引
  → 模型读取元素地图 → 选择操作目标
  → click(element=14)
  → Driver 解析 element 14 → 执行点击
  → capture() 验证结果 → 规划下一步

关键:SOM 索引仅在下次 capture 前有效
  → 每次状态变更后必须重新 capture
  → 这不是 bug,是设计(防止过期索引导致错误操作)

五个实际用例

1. 邮件分类(不开邮箱)

你说:"整理收件箱,标记紧急邮件,总结内容,起草回复"
Agent:
  - 后台打开 Mail → SOM 导航侧边栏和邮件列表
  - 通过 AX Tree 读取邮件正文
  - 生成结构化摘要 → 推送到 Telegram
  - 草拟回复等你审批

关键:不需要 Gmail OAuth / API 权限
      适用于任何原生邮件客户端

2. YouTube 发布(不碰浏览器)

你给:视频文件 + 标题 + 描述 + 标签 + 定时发布时间
Agent:
  - 后台打开 Safari → YouTube Studio
  - 完整走上传流程:填标题/贴描述/加标签/设缩略图/配置可见性
  - 危险操作前弹出确认

关键:不需要 YouTube API Key / 第三方工具

3. 发票处理(自动录入会计软件)

你给:PDF 发票文件夹
Agent:
  - 读取每份 PDF(视觉能力提取字段)
  - 打开会计软件 → SOM 导航到录入界面
  - 逐字段填写:供应商/发票号/日期/行项目/金额
  - 保存记录

关键:适用于任何原生 Mac 会计软件,不需要 API/导出格式支持

4. 仪表盘监控(定时巡检)

你设:每 30 分钟检查某个内部工具
Agent(cron 触发):
  - capture 目标应用 → 读取数值
  - 与基线对比 → 超阈值则发告警
  - 正常则继续休眠

关键:适用于无 API / 无 Webhook / 无监控集成的内部工具
      只要人能读屏幕,Agent 就能监控

5. 社交媒体调度(跨平台发布)

你给:内容日历 + 草稿 + 素材 + 目标平台
Agent:
  - 后台打开各平台(Safari / 原生 App)
  - 导航到发布界面 → 填写内容 → 附加素材
  - 定时或立即发布(每次需你确认)

关键:不需要各平台 API / 浏览器扩展
      危险操作走审批层,不是无监督发布

共同点:不需要 API、不需要浏览器扩展、不需要软件厂商支持自动化。只要人能操作的界面,Agent 就能操作。


Token 经济学:从 60 万降到 3 万

问题

每次 capture → 截图进入上下文
Anthropic 定价:每张图 ≈ 1,500 tokens(固定费率)
20 步操作 × 3 张截图/步(前/后/验证)= ~60 张图
  → 60 × 1,500 = 90,000 tokens(仅截图)
朴素实现(无优化):20 步会话 ≈ 600,000 tokens
  → 那不是工作流,那是账单

Hermes 的四层优化

+---------------------------+------------------------------------------+
| 层 1:截图驱逐            | 仅保留最近 3 张截图在上下文中              |
|                           | 旧截图替换为 "[screenshot removed]"       |
+---------------------------+------------------------------------------+
| 层 2:客户端压缩修剪      | 多模态工具结果中,仅删除图片部分           |
|                           | 保留文本(元素索引/操作确认/提取数据)     |
+---------------------------+------------------------------------------+
| 层 3:图像感知 Token 估算 | 按 Anthropic 固定费率(~1500 tokens/图)   |
|                           | 而非 base64 字符长度估算                   |
|                           | 避免过早触发压缩                           |
+---------------------------+------------------------------------------+
| 层 4:服务端上下文清理    | 启用 Anthropic API 的                      |
|                           | clear_tool_uses 标志                      |
|                           | 服务端主动清除旧工具结果                   |
+---------------------------+------------------------------------------+

结果:20 步会话从 ~600K 降至 ~30K tokens(降低 ~20 倍)
      1568×900 分辨率,当前 Claude 定价 → 日常可持续使用
      本地模型 → Token 成本为零

模型无关性设计

为什么重要

Anthropic Computer Use → 专有 schema,绑定 Claude API
OpenAI Codex → 专有工具约定,绑定 OpenAI API
  → 换模型 = 重写代码

Hermes → 统一工具集,协议翻译层
  → 换模型 = 一条命令:hermes model <provider>/<model>

兼容矩阵

模型 视觉能力 支持情况 备注
Claude Sonnet/Opus 完整支持 最佳体验,SOM + 原始坐标
OpenRouter(200+ 模型) 完整支持 多部件工具消息
GPT-4 / GPT-5 完整支持 同上
本地 vLLM / LM Studio 完整支持 需支持多部件工具内容
纯文本模型 降级支持 mode="ax" 仅用 AX Tree

纯文本模型的降级方案

mode="ax"(Accessibility Tree Only):
  - Agent 不接收截图
  - CUA Driver 读取完整 AX Tree → 返回结构化文本
  - Agent 通过读取元素标签/角色/值导航
  - 性能不如视觉模式,但对结构良好的原生应用可用
  - Token 成本极低(无图片)

已知限制与风险

1. 平台限制:仅 macOS

CUA Driver 依赖 Apple 私有 SPI → 仅 macOS
Linux VPS(Hermes 最常见部署方式)→ 不可用
跨平台 GUI 自动化 → 用 browser toolset 替代

对于需要操控原生桌面应用 → 必须有 Mac

2. 私有 SPI 依赖风险

SkyLight 是 Apple 私有框架,无公开 API 承诺
历史表现:跨多代 macOS 稳定,TrickUA 团队跟踪维护
风险:未来 macOS 更新可能破坏 SPI 符号

缓解:HERMES_CUA_DRIVER_VERSION 环境变量锁定版本
      生产环境建议必须设置

3. 当前 macOS Tahoe Bug

macOS 26.4.1:ScreenCaptureKit 截图失败(SCStream 错误)
Workaround:mode="ax" 切换到 AX Tree 模式
影响:失去 SOM 视觉定位层,回退到纯文本导航

4. 安全约束

硬性阻止:
  - 系统快捷键(注销/锁屏/强制清空回收站)
  - 危险 shell 模式(curl | bash, sudo rm -rf)
  - macOS 权限对话框
  - 密码输入

设计约束:
  - SOM 索引仅在下次 capture 前有效
  - 工作流必须围绕紧密的 观察→行动→验证 循环
  - 不能「先规划一串操作再顺序执行」

参考资料

相关笔记