OpenAmer 是采用 Apache-2.0 许可、优先支持 Windows 的开源桌面 Agent,目标是在用户继续操作电脑时后台执行任务。文章讨论真实桌面自动化的设计取舍,涉及原生窗口、文件选择器和系统对话框等浏览器外场景。
每个“computer use”Agent 演示都在浏览器标签页里运行。真正难的是在一台真实的 Windows 机器上,在用户当前会话的后台操作,既不抢占鼠标指针,也不把正在自动化的应用弄坏。
大多数 Agent 框架都止步于浏览器。它们操控一个无头页面,或者容器里的桌面,然后称之为“computer use”。这种方式能用,直到任务涉及用户自己机器上的真实应用:原生窗口、文件选择器、只有用户自己的配置文件里才有的登录状态,或者操作系统对话框。到了这一步,无头浏览器就无能为力了。
OpenAmer 是一个开源桌面 Agent(Apache-2.0,优先支持 Windows),它的出发点恰好相反:在后台操作真实桌面,同时让用户继续使用电脑。这篇文章讲的是让这件事成为可能的四个设计决策,以及每个决策背后踩过的坑。
自动化 GUI 最直接的办法,就是移动真实鼠标、通过真实键盘输入(SendInput、pyautogui 这一类)。它确实有效,但运行期间,电脑也就没法正常用了:鼠标指针到处跳,你打的字落进了 Agent 当前聚焦的控件里,也没法同时做其他事。
我们采用的是一条后台控制路径:捕获目标窗口的状态,把合成输入发送给它,不与用户争抢物理鼠标指针。用户的会话保留自己的鼠标指针和焦点;Agent 则根据自己看到的实际状态开展工作。难点并不光鲜,却都很具体:
坐标空间。屏幕像素坐标、窗口相对坐标,以及每台显示器各自的 DPI 缩放——如果在一个坐标空间里计算点击位置,却在另一个坐标空间里发送点击,落点就会偏出大约 100px。我们反复踩过这个坑,直到把 DPI 纳入每个坐标的核心信息,而不是事后补上。
焦点。有些原生控件只有在认为自己获得焦点时才接受输入,所以“后台”有时意味着短暂、无感地借用焦点,而不是绝不触碰焦点。
时序。原生对话框会异步出现,所以 Agent 必须等待状态满足条件,比如“这个窗口出现了吗?”,绝不能依赖固定时长的 sleep。
基于截图操作的 Agent 通常运行在一次性的 VM 里:安全、隔离,但也与用户真实的文件、登录状态和应用完全脱节。对个人 Agent 来说,这违背了初衷。它的价值恰恰在于能操作你真正使用的收件箱、代码仓库和浏览器配置文件。
因此,它作为一个进程运行在宿主机上,处于用户自己的会话中,使用用户自己的凭据——不需要 VM 镜像,也不使用远程推理。这涉及安全上的取舍,我们也按这个标准来处理:能力必须明确,并且有清晰边界(没有获得授权的能力根本不会运行);跨越边界的操作会明确呈现给用户,而不是悄悄执行;每个操作都会写入结果台账,记录成功或失败,让 Agent 自己的说法事后可以核查。
“桌面”工作有一半是网页操作,而网页操作需要用户的登录状态。一个全新的无头 Chromium 什么登录状态都没有。因此,Agent 通过 DevTools protocol(CDP)操控真实的 Chrome,使用持久化的浏览器配置文件,继承用户已有的会话——GitHub、某个管理面板、某个内部工具——而不是试图绕过登录限制或验证码。
这里的取舍同样真实存在:这个配置文件承载的是一个正在使用、已经通过身份验证的用户身份,因此,执行浏览器任务时,必须像操作其他已登录会话一样谨慎。我们会在操作前检查登录状态,并对照真实页面验证结果,而不是想当然地认为操作成功了。
桌面 Agent 最有用的一条准则,就是拒绝相信模型自己说的“完成了”。你问模型“成功了吗?”,它会自信地回答,而且经常答错。因此,可核查的单位不是模型的一句话,而是由确定性执行层写入结果台账的一条记录;在必要的地方,还要重新读取现实中的实际状态:文件存在吗?配置文件发生变化了吗?页面上出现那段文字了吗?
“我们已经发布了”毫无价值。“这是 URL,匿名请求获取,HTTP 200,字节数符合预期”才有价值。从文字陈述转向证据,正是其他部分能够安全地无人值守运行的基础。
后台桌面控制不是做个演示的问题,而是一个集成问题:DPI、焦点、异步对话框、已登录的浏览器配置文件,以及一个不把模型的话当作事实的验证层。把这四个设计决策落实好,你就能得到一个在真实机器上完成真实工作的 Agent,同时继续正常使用这台电脑。
代码与文档:openamer/openamer(Apache-2.0,优先支持 Windows,本地运行)。
如果你自动化过真实桌面,最先让你踩坑的是哪个——DPI、焦点,还是异步对话框?我想交流一下各自踩过的坑。
部分评论可能仅对已登录的访客可见。登录后可查看全部评论。
如需采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。