agentd 深度解析:把桌面 OS 变成 Agent 的 HTTP API,以及它留下的三个好问题
agentd 深度解析:把桌面 OS 变成 Agent 的 HTTP API,以及它留下的三个好问题
让 Agent 会用鼠标键盘不难。难的是它点错之后,你能知道它点了什么。
这篇文章要聊的 agentd,和这几天写过的项目不太一样:它只有 45 stars、3 forks、4 个 open issue,最后一次提交停在 2025 年 5 月 29 日——到现在一年零四个月。没有 release,没有 CI 徽章,README 里的文档链接指向 docs.hub.agentsea.ai。
所以先说清楚定位:这不是一篇"推荐你用"的文章。 它更像一份设计案例——一个早期就对准"让 AI 操作桌面"这个问题的项目,在 2024 年初就把 VM 镜像、HTTP API 和动作录制三件事凑齐了。它停下来之后,这三个决定依然值得拿出来看,因为它们正好是今天 computer use 类产品最容易做错的地方。
先看它到底做了什么。
本文提纲
- 它是什么:把桌面变成一组 HTTP 端点
- 设计决定一:以 VM 为边界,而不是在你的机器上开权限
- 设计决定二:扁平 API,而不是会话协议
- 设计决定三:录制即审计
- 生态位置:AgentDesk、surfkit,以及这个组织的重心转移
- 如果你今天就要这个能力:三条路线与取舍
它是什么:把桌面变成一组 HTTP 端点
它自我描述只有一行:
AgentDmakes a desktop OS accessible to AI agents by exposing an HTTP API.
展开就是:在一台 Ubuntu 22.04 机器上跑一个守护进程,通过 HTTP 暴露鼠标、键盘、浏览器、截图四类能力,让 Agent 像操作 GUI 一样操作这台机器。更高的抽象层留给另一个项目 AgentDesk(226 stars,"A desktop for AI agents")。
它的分发方式很能说明设计意图:它不主要靠 pip 安装,而是发虚拟机镜像。
- QEMU:
agentd-jammy.qcow2 - AWS:公开 AMI
ami-01a893c1530453073 - GCE:公开镜像
ubuntu-22-04-20240208044623 - 自建:
curl -sSL https://raw.githubusercontent.com/agentsea/agentd/main/remote_install.sh | sudo bash
起一台 QEMU 虚拟机的命令是这样的(注意端口转发):
qemu-system-x86_64 -nographic -hda ./agentd-jammy.qcow2 \
-m 4G -smp 2 -netdev user,id=vmnet,hostfwd=tcp::6080-:6080,hostfwd=tcp::8000-:8000,hostfwd=tcp::2222-:22 \
-device e1000,netdev=vmnet -cdrom cidata.iso8000 是 API,22(映射到宿主 2222)是给你 SSH 进去看的,6080 是留给图形界面的通道。用户和 SSH key 通过 cloud-init 注入,不需要手动配置系统:
#cloud-config
users:
- name: agentsea
sudo: ['ALL=(ALL) NOPASSWD:ALL']
groups: sudo
ssh_authorized_keys:
- your-ssh-public-key设计决定一:以 VM 为边界,而不是在你的机器上开权限
这是我今天最想强调的一点,因为它和这几天的几条新闻正好形成对照。
同一个问题——"怎么让 Agent 操作图形界面"——2026 年有几种答案。Octop 直接在控制台里做远程桌面,把你自己的宿主机桌面暴露给 Agent;Claude Code Mods 让插件能画界面、甚至起进程(而且明确不在沙箱里);云厂商的方案大多是把 browser/computer use 做成托管服务。
agentd 的答案更保守也更干净:不给你的机器开权限,而是把一台一次性虚拟机交给 Agent。
- 它是可抛弃的:跑坏了就删掉重建,你的开发机不受影响;
- 它是可重建的:镜像是打包产物(仓库里有
make pack),环境漂移被消掉; - 它是可审计的:因为一切都在那台虚拟机里发生,你的宿主机只是 SSH 进去旁观。
代价也很清楚:重。 要给 Agent 分配几 GB 内存和一块磁盘,启动要几十秒;而且它的镜像是 2024 年的 Ubuntu 22.04(jammy),今天看已经偏旧。但在"Agent 操作失误的爆炸半径"这个维度上,VM 边界是比"在宿主机加审批弹窗"强得多的默认值——审批靠你盯着,VM 靠物理隔离。
设计决定二:扁平 API,而不是会话协议
它的 HTTP 面非常"笨",笨得刚好适合 Agent:
| 类别 | 端点 |
|---|---|
| 健康检查 | GET /health |
| 鼠标 | GET /mouse_coordinates、POST /move_mouse、POST /click、POST /double_click、POST /drag_mouse、POST /scroll |
| 键盘 | POST /type_text、POST /press_key |
| 浏览器 | POST /open_url(Chromium 系) |
| 屏幕 | POST /screenshot(返回 base64 图片) |
每个端点都是无状态的一次调用:给坐标、给文本、给按键,返回 {"status": "success"} 或错误信息。没有 session、没有"先建立通道再协商能力"的握手,也没有需要保持的长连接。
为什么这值得单独说?因为它把最难的部分留给了模型,而不是协议。Agent 要做的是"看截图 → 决定点哪里 → 点 → 再看截图"这个循环,如果协议本身还需要维护状态机和重连逻辑,模型每一次决策都要额外承担协议复杂度。扁平的 REST 端点意味着:任何能发 HTTP 请求的 Agent 框架都能立刻上手,不需要为它写 SDK。
这也是它的局限:POST /open_url 只负责开一个 URL,页面里的元素识别、等待加载、处理弹窗,全都得靠调用方自己看截图判断。它提供的是"手和眼",不是"理解"。
设计决定三:录制即审计
这是整个 README 里我最喜欢的一部分,也是它比同时代很多 demo 想得更远的地方——它内置了一个动作录制子系统:
| 端点 | 作用 |
|---|---|
POST /recordings |
开始一次录制会话 |
GET /recordings |
列出所有录制 |
POST /recordings/{session_id}/stop |
停止并保存 |
GET /recordings/{session_id} |
查看某次录制信息 |
GET /recordings/{session_id}/event/{event_id} |
取出单个事件 |
DELETE /recordings/{session_id}/event/{event_id} |
删除单个事件 |
GET /recordings/{session_id}/actions |
取出该会话的全部动作 |
GET /active_sessions |
列出所有活跃录制会话 |
把这件事想清楚:computer use 最大的工程难题不是"怎么点对",而是"点错之后怎么复盘"。 一次失败的自动化任务,如果你只有最终截图,几乎无法定位是哪一步偏了;有了逐事件的动作流,你能像看飞行记录仪一样回放"第 7 步点在了弹窗关闭按钮上,于是后面全错"。
而且它把事件删除也做成了 API——这暗示了一个工作流:录完之后由人去删掉误操作或含敏感数据的片段,再把这批动作当作训练/演示数据留下来。这个思路放到今天,正好对应"从真实操作里蒸馏技能"那类自进化方向。
它还提供了开发侧的打包与运行入口:
make pack # 重新打包一套镜像
make run-jammy # 从仓库直接跑起来生态位置:AgentDesk、surfkit,以及这个组织的重心转移
agentd 不是孤立的。同一个组织(AgentSea)里有一套围绕 computer use 的布局:
- agentdesk(226 stars)——"A desktop for AI agents",是 agentd 之上更高层的桌面抽象,agentd 的 README 直接推荐"想要更高层接口就用它";
- surfkit(196 stars)——"A toolkit for building computer use AI agents",也就是往上再一层的 Agent 框架;
- 更早还有
taskara(任务管理,16 stars)、nebulous(分布式容器编排,54 stars)等。
分层其实很清晰:agentd 是"手和眼"(设备层)→ AgentDesk 是"桌面"(界面抽象)→ surfkit 是"会用桌面的 Agent"(框架层)。
但要注意现实:这三个仓库的最后提交分别停在 2025 年 5 月、7 月和 6 月。而这个组织并没有停下——它把重心转到了别处,最新活跃的仓库是 nautilo(170 stars,2026-10-03 仍有提交,自我描述是"AI goes multiplayer,一个人和机器共存的自托管工作空间"),以及 flashbacker(Claude Code 会话状态管理,57 stars)、documentor 等。
所以对 agentd 的结论应该是:当作设计参考读,不要当生产依赖用。 依赖一个 16 个月没更新、4 个 open issue 悬着、只支持 Ubuntu 22.04 云镜像的守护进程,风险不在代码质量,而在没人接安全补丁。
如果你今天就要这个能力:三条路线与取舍
agentd 提出的问题今天依然成立,只是可选答案变多了。按"隔离强度"排序:
路线一:自己搭一台 VM,跑截图 + 输入 API。 也就是 agentd 的思路,但用你自己维护的镜像。适合需要长期跑批量 GUI 任务的团队。成本是镜像维护和启动时间,收益是爆炸半径最小、可随时重建。
路线二:用现成平台的远程桌面/浏览器能力。 比如 Octop 控制台里的 remote desktop 和 Browser AI+、各家云厂商的托管 computer use。省掉镜像维护,代价是你把宿主环境的操作权交给平台,且要审它的权限模型(Octop 的远程桌面同样意味着 Agent 可以操作宿主机)。
路线三:只做浏览器,不做桌面。 如果你的目标 90% 是网页表单、截图、抓取,CDP 直连的浏览器自动化(比如 agentd 同门的 octop-browser,或者任何基于 CDP 的方案)比整套桌面控制轻一个量级,也更稳。
一条判断标准:先问"它操作失误的后果由谁承担"。 如果后果是"你的开发机被改乱",就必须走路线一;如果只是"一次网页任务失败重跑",路线三足够。
参考链接
- GitHub: AgentSea/agentd — 45 stars,MIT,最后提交 2025-05-29
- agentd 文档 — 官方文档站(README 中链接)
- 演示视频 — README 中的 Demo
- AgentDesk — 226 stars,agentd 之上的桌面抽象
- surfkit — 196 stars,computer use Agent 工具包
- nautilo — 该组织当前活跃项目(170 stars,2026-10 仍在提交)
- AgentSea 组织仓库列表 — 48 个公开仓库的分布
- Octop 的远程桌面与浏览器能力 — 同类问题的"平台化"答案
- Claude Code Mods — 另一种思路:让插件在进程内改行为(并明确不在沙箱内)
- Cloud-init 文档 — agentd 用注入用户与 SSH key 的机制
让 Agent 操作 GUI,你更愿意给它一台虚拟机,还是在宿主机上加审批?评论区聊聊你的底线,觉得这种"考古式设计分析"有用就点个赞。
作者: itech001 来源: 公众号:AI人工智能时代(the-ai-era) 网站: https://www.theaiera.top/ 关注每日最新AI新闻和技术博客,主页有更多的文章的AI 技术参考:https://www.theaiera.top
本文首发于 AI人工智能时代,转载请注明出处。