编码Agent不必活在完整Linux里 camelAI三次重构走向Durable Object与显式方法
大多数编码Agent默认活在完整Linux虚拟机或容器沙箱里。它们被训练去伸手拿bash,于是基础设施也跟着变成“每用户一台始终在线的机器+挂载磁盘”。camelAI刚开始也是这样,直到成本数字把团队逼到墙角:用户量目标一旦上来,真实机器和真实磁盘的扩展就会变成不可承受的开销。
我起初认为Agent的能力边界就等于操作系统的能力边界,去掉bash等于阉割。后来三次完整重构走完,才看清另一条路:把Agent从“能执行任何命令的通用环境”改成“只能调用我们显式提供的方法”,反而让产品更聚焦、更便宜、对小模型也更友好。整套代码已经开源,路径清晰可见。
第零步:完整VM时代的沉重底座
最初直接挂在Claude Code harness上,它强依赖完整虚拟机。试过多家VM提供商,没有一家同时满足持久化和性能要求,于是自己搭了一套容器服务。服务能跑,但每个用户始终在线的VM加上快速挂载盘,成本线性上涨。扩展意味着扩展真实硬件,而不是扩展代码。与其在编排上玩花活,不如从根上设计“不需要VM”。
第一步:把Agent的大脑从VM里抽出来
Claude Code harness和VM绑得太死,第一步是自建harness。底层用了Mario Zechner开源的pi库——高层假设有正常操作系统,但低层只提供Agent循环和状态管理,不关心运行位置。直接导入低层,在Cloudflare Durable Object里跑起来。
Durable Object是边缘上的小状态计算实例,每个聊天线程一个,离用户更近,延迟自然下降。此时VM还在,但Agent已经住在外面,远程调用VM执行命令。Anthropic把这种拆分叫“大脑与手”。好处立刻出现:
- Agent可以在VM还没醒的时候就开始回复。
- 不需要命令时,VM可以继续睡,甚至根本不启动。
- 一个大脑可以同时操控多双手(多个项目)。
每个项目配一台VM做执行,再配一个通过Cloudflare Artifacts程序化创建的git仓库。Agent自己几乎感觉不到自己不在VM里,bash依然可用。可成本问题一点没解决——每用户仍然有一台VM。
第二步:彻底拿掉VM,文件系统变成数据库
项目结构保留,背后的VM直接砍掉。文件系统搬进Durable Object的SQLite(10 GB上限),大文件落到R2,SQLite里只存指针。这套机制大量复用了Cloudflare agents团队的Shell实验代码。对Agent来说,它看到的还是普通文件系统;底层却是存储数据,而不是必须保持存活的基础设施。版本历史继续走Artifacts,不用自己托管git服务器。
持久化从“机器在线”变成了“数据在库”,扩展压力瞬间从硬件变成了Cloudflare的存储层。
第三步:连bash一起拿掉,换成JavaScript与显式方法
这是最决绝的一步。编码Agent被训练成“有事就bash”,bash也是所有人跑完整VM的根本原因。可bash加网络访问意味着必须把凭证塞进沙箱,代理认证越来越hacky,也越来越难强制执行。
于是直接移除。Agent改写JavaScript,通过Code Mode和Cloudflare动态Worker加载器执行。每次执行都是一个全新的V8 isolate,启动毫秒级,内存只有几MB。沙箱预加载用户的数据连接和平台所有能力方法,凭证永远不进沙箱——Agent调用连接方法,认证在我们这边完成。
真正用bash干的事情,大半是文件操作。原生提供read、write、edit,再自己实现grep和glob,已经覆盖八成。剩下的特定命令全部变成显式方法:
- wrangler deploy变成完全可控的deploy_project,部署发生时可以精准挂钩,自动打开实时预览。以前只能靠嗅探流量猜测。
- 用户应用构建和Python notebook运行,仍然需要短暂Linux容器(Vite/Tailwind/React Router依赖bun install,Worker内存128 MB和CPU份额不够),通过Cloudflare Sandbox SDK秒级启动、拷贝、执行、销毁。
必须提前预判Agent需要什么能力。听起来限制,实际却是好事:逼着团队认真想用户真正在做什么,然后给它一等公民路径,而不是让Agent自己临时拼凑。额外收获是,开放式bash环境对小模型很不友好,显式方法集合反而让它们表现明显更好——保持运行成本足够低,本来就是这套架构的核心目标。
三次重构后的真实账本
| 维度 | 完整VM + bash | 大脑在外 + 远程VM | Durable Object + 显式JS方法 |
|---|---|---|---|
| 每用户成本 | 始终在线机器 + 挂载盘,线性上涨 | 仍需VM,成本未降 | 按执行计费,量级下降 |
| 延迟 | 启动与路由开销大 | Agent可先响应,VM后醒 | 边缘就近,整体最低 |
| 扩展方式 | 扩真实硬件 | 仍受VM数量限制 | Cloudflare负责,无外部容器服务 |
| 能力边界 | 任意bash,凭证难管 | 同左 | 只做显式方法,强制产品聚焦 |
| 小模型友好度 | 开放环境易迷失 | 同左 | 约束动作后表现提升 |
最终栈变成:Durable Object跑Agent和文件系统,R2扛大文件,Artifacts管git历史,pi做harness,Code Mode + 动态Worker做执行。部署方式和其他Cloudflare应用一模一样。用户侧照样构建、部署全栈应用,Agent照样读、写、搜、部署,感知不到底层已经换了血。
这套路径把“编码Agent必须活在完整操作系统”的默认假设拆开了。显式方法听起来像限制,实际上是把即兴发挥的空间收成了可控的产品能力。当你下一次设计Agent运行时,先问自己:真正需要通用bash的场景有多少?有多少其实可以变成一个干净、可观测、可挂钩的方法?
你现在的Agent基础设施里,哪一块如果改成“显式方法 + 边缘状态”,会立刻砍掉最多常驻成本?欢迎直接聊。
我是紫微AI,在做一个「人格操作系统(ZPF)」。后面会持续分享AI Agent和系统实验。感兴趣可以关注,我们下期见。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)