Article
Computer Use 每轮 40 个工具错误,都出在哪里
Orca 的 computer use 第二阶段在 v0.5.11 发布:模型可以观察和操作 macOS 上的其他 app,用的是 AX 树和窗口截图。用了一阵子,我觉得它还不够流畅,不够稳定,交互也比不上 Claude 的 computer use,还得接着打磨。
问题是「不够稳」没法验证。修一个点,自己试两次,感觉好了一点,换个 app 又不行。在动手之前,我先写了一套真机验收,后面每一个改动都拿它来量。
15 个任务
任务分两档。单步 8 项,S1 到 S8:用计算器算 1234 × 5678、在 Finder 里找某个目录按名称排序的最后一个文件、看系统设置里外观是浅色还是深色、用预览数一个 PDF 有几页、列出 Cherry Studio 侧边栏的入口、在 Chrome 里点一个按钮再读结果。多步 7 项,M1 到 M7:用文本编辑写一个三行的待办清单存到指定位置、在 Safari 里填表提交、在 Finder 里新建文件夹再改名、在系统设置里查芯片型号、先在工作区写一个计数器页面再用 Safari 点三次。
每一项都起一个新的 Orca 进程,跑的是真实的 TUI,模型是 deepseek-flash,默认的 auto-edit 模式。

有几条规矩是写 harness 时就定下的:
- 授权只从面板读。 harness 解析 TUI 渲染出来的审批面板,按任务允许的 app 回答,从不根据模型说的话推断「它应该已经有权限了」。面板上的窗口标题是用户的数据,不拿来判断,只认面板的目标行和预览末尾括号里的 bundle id。
- 结果由核验器读真实状态。 文件读内容,界面读 AX 树,读不到 AX 的地方用 OCR。模型说做完了不算数:基线里有一次,S8 的模型点完按钮没有再观察,读了页面源码就说「与截图显示一致」。结果碰巧是对的,但这种「对」不能计入。
- 收拾干净再跑下一项。 新开的窗口关掉,启动的 app 退出,前台 app 和指针位置恢复原状,偏差不超过 0.85 pt;服务和 TUI 进程退干净之后,下一项才开始。
一轮 15 项大约要 10 分钟的 GUI 时间。这段时间里,屏幕和键盘归 Orca,我得离开电脑。
前五次都死在 harness 上
真正拿到第一份干净的基线之前,前五次运行都中断了,每次中断的原因都是 harness 自己:
| 次 | 停在 | 原因 |
|---|---|---|
| 1 | S1 之后 | 关掉计算器的窗口,它就自己退出了,随后的退出调用报错 |
| 2 | S2 | 命令行助手不跑 run loop,读到的前台 app 是旧的;计算器还恢复了上次的显示,让 S1 假通过 |
| 3 | S8 | Chrome 地址栏的下拉框也是一个 AX 窗口,被当成了第二个新窗口 |
| 4 | S8 | 合成的按键继承了前一个 Cmd+L 的 Cmd,about:blank 里的 n 触发了新建窗口;Chrome 也不接收多字符的按键事件 |
| 5 | S8 | Chrome 的状态气泡也是 AX 窗口,被当成了任务窗口 |
这张表我留着,因为它说明了 GUI 自动化难在哪:每一条都不是 Orca 的 bug,可每一条都会让一次验收作废。Orca 自己的驱动后来也踩到了同一类问题,比如 Chrome 新开的窗口和上一扇的尺寸位置一模一样,这个放到窗口边界那篇里讲。
基线
10 月 24 日的两轮完整运行,单步 7/8、7/8,多步 5/7、6/7。
审批已经不是主要摩擦了。第一次跑基线时每轮弹 86 个面板:真实 TUI 里的 computer 审批拿不到解析出来的 bundle id,「本会话允许这个 app」这个选项根本不出现,每一步都要问。修好之后降到每轮 16 个,每个任务对每个 app 只问一次。
两轮的工具错误是 37 个和 40 个,大头集中在三处:
- GUI 一失败就转去 bash。 两轮一共 35 次失败的 bash 调用,主要是
open、open -a和osascript。在 Orca 的沙箱里,这些命令根本够不到别的 app,模型却一次次地试。 list_apps给出的窗口编号用不了。list_apps会列出 app 的离屏辅助窗口,没有标题,也没有对应的 AX 窗口。模型选中它去 observe,得到的是No accessibility window matches the capture window。两轮 15 次。- 系统设置的 AXRaise 报 -25205。 驱动在激活 app 之后无条件执行 AXRaise,系统设置的窗口不支持,整个动作就失败了,哪怕这扇窗本来就在最前面。两轮 14 次,第一轮的 M5 就是因此失败的。
两轮之间的差别也很大。S1 一轮用了 13 次调用,另一轮用了 23 次,区别是模型有没有逐个去点数字键;S4 一轮 2 次,另一轮 25 次,看系统设置那一次 AXRaise 成没成。所以后来定了一条规矩:一个改动至少跑两轮,才下结论。
除了错误,还有几件让我不太舒服的事:模型接管了我自己开着的 Finder 窗口(S3 两轮都是);系统设置的 AXRaise 反复失败之后,它执行了 killall "System Settings",auto-edit 下 bash 免审批,是沙箱让它没生效;M4 点名要用计算器,它直接用 python 算出了 368。
改了什么
可靠性这个子项目对着上面三处错误来,驱动协议从 1 升到 2:

list_apps只列 observe 真能用的窗口:逐个和 AX 窗口核对,核对有时间上限,app 不回应 AX 时退回可见的、文档大小的窗口。- 工具说明直接写明:shell 的
open、osascript这类命令在 Orca 的沙箱里够不到别的 app,打开文件和网址请用launch_app的open。 - AXRaise 失败时先看这扇窗是不是已经是主窗口或焦点窗口,是就继续,不是就等 150 ms 再试一次,还不行才报错。
- app 刚启动、还没有窗口时,Command、Control 组合键和 Esc 直接发给 app,模型可以用 Cmd+N 开第一扇窗。
- 每种窗口错误单独一类,消息里带上下一步,比如没有窗口时提示用 Cmd+N 或者
launch_app打开文件。 - 失败预算:同一个 app 在一轮里连续失败 3 次,结果里加一句提示,让模型停下来告诉用户哪里失败了;连续失败 6 次,本轮不再操作这个 app。
结果

可靠性修复之后的两轮,工具错误降到 9 个和 8 个。bash 绕路、对不上 AX 窗口、AXRaise 失败,三类都是 0;每项任务的工具调用中位数从 9 次降到 7 次和 6 次。剩下的错误全是参数小错:键名写成 esc、backspace,list_apps 带了 query,scroll 缺了 target。
成功率却一点没变,还是单步 7/8,多步 5/7 和 6/7。没过的任务换了一批原因:S3 四轮全挂,是模型用了我自己的 Finder 窗口;M3 有一轮,模型中途要求改用 Safari,被拒;M5 有一轮,另一个 app 的窗口盖住了系统设置,遮挡检查正确地拒绝了点击,模型随后要求去操作那个 app,也被拒。
这个子项目的 spec 里,验收标准是写代码之前定好的:工具错误不超过 15 个、AXRaise 错误不超过 2 个、bash 绕路不超过 5 次、多步至少 6/7。没达到的是两条:第 1 轮的多步只有 5/7,M5 没能两轮都过。原因一个是桌面上的遮挡,一个是模型越过了 app 边界,都不是这个子项目改的代码,我没有接着修,验收报告里照实写了这两条没达标。
剩下的失败几乎都出在边界上,所以下一个子项目做窗口边界。那次的第三次验收,单步两轮都是 8/8,多步 6/7 和 7/7。工具错误回到了 14 个和 13 个,多出来的是窗口边界按设计给出的拒绝,其余的只有 6 个和 4 个。
还没做的
计划里还剩两个子项目:速度(计算器这种场景鼓励一次 type 而不是逐个点键,动作之后自动附带精简的观察,少一来一回)和界面(叙述、截图缩略图、屏幕上的指示)。M3 那一轮失败暴露的 Finder 改名,也留给了速度和可靠性这一边。
每次改动之后,我还是会跑两轮这 15 项任务。
Keep Reading