跳到主要内容
SecondHome
文章Anthropic(工程博客)· Lance Martin、Gabe Cemaj、Michael Cohen· 原文发布 需代理

Scaling Managed Agents: Decoupling the brain from the hands

策展于 2026年10月30日 · 笔记约 8 分钟读原文 ↗

先把研究对象说清。Managed Agents 是 Claude 平台里的一项托管服务:你交出长周期任务,它在云端替你拉起模型、跑代码、记日志,不必自建 agent 基础设施。这篇官方工程复盘讲它的架构演进,从一处单容器设计长成一套靠少数稳定接口撑住的系统。

作者 Lance Martin、Gabe Cemaj、Michael Cohen 都在 Anthropic 平台团队。文章 4 月发布,10 月中还有修订。篇幅不长,胜在把一次真实重构的动机、败笔和取舍全摊开了,含金量在细节。

站内 10 月 27 日整理过 Latent Space 对平台负责人的访谈,产品视角聊过同一套 Managed Agents。这篇补的是工程账,两份对读刚好拼齐。

为什么要重构

harness 是驱动模型的循环,负责调 Claude、分发工具调用,agent 的发动机。文章的出发点很扎心:harness 里写死的每处补丁,都是对模型短板的假设,而模型在进步,假设会过期。

“harnesses encode assumptions about what Claude can’t do on its own.”

例子非常具体。Claude Sonnet 4.5 感知上下文快满时会提前草草收尾,团队称之为 “context anxiety”(上下文焦虑),对策是在 harness 里加自动重置。同样的 harness 换到 Opus 4.5,毛病自己消失了,重置逻辑成了死重。

假设过期是常态而非意外。所以他们的结论是:实现随便换,接口必须活得久。

设计哲学借了操作系统一笔。几十年前操作系统把硬件虚拟化成进程、文件这类抽象,抽象活得比硬件久:read() 不关心底下是七十年代的磁盘组还是今天的 SSD。Managed Agents 照方抓药,把 agent 虚拟化成三个可独立替换的组件:

  1. session:只追加的事件日志,记下发生过的一切
  2. harness:调模型、转发工具调用的循环
  3. sandbox:模型跑代码、改文件的执行环境

三者互不惊动。原文的表态是对接口形状有主见,对接口背后跑什么没主见。

单容器时代:养了一头宠物

早期实现把三个组件塞进同一个容器。好处实在:文件编辑就是直接系统调用,也省了设计服务边界。

代价是基础设施圈的老问题。宠物是取了名字、亲手照料、死不起的个体;牲口随时可换。耦合设计里,服务器成了宠物:容器一挂,会话跟着丢;容器卡死,得人工救活。

调试尤其狼狈。唯一的观测窗口是 WebSocket 事件流,而 harness 的 bug、事件流丢包、容器掉线,在流上长得一模一样。想定位就得进容器开 shell,偏偏容器里住着用户数据,等于没有调试手段。

还有一宗罪:harness 默认 Claude 要碰的资源就在身边容器里。客户想让 Claude 接自家 VPC,只能把两边网络打通,或把 harness 搬进客户环境去跑。

解耦:大脑、手、会话

解法是把 “大脑”(模型加 harness)与 “手”(沙箱和工具)、“会话”(事件日志)各自变成接口,独立失败,独立替换。

harness 调沙箱像调任何工具:execute(name, input) 送进名字和输入,拿回一个字符串。容器死了,harness 把失败当工具调用错误报给模型;模型要重试,provision({resources}) 拉一只新容器。容器从宠物变成了牲口。

harness 自己也牲口化。会话日志在 harness 外面,崩了不丢状态:wake(sessionId) 重启,getSession(id) 取回事件日志,从最后一个事件续跑。平时循环里靠 emitEvent(id, event) 持久写日志。

安全重构最见功力。耦合设计里,模型生成的不可信代码与凭证同住一个容器,提示注入只要说服模型读自己的环境变量就全盘皆输:攻击者拿到 token,能另开不受限的会话去派活。缩小 token 权限是显见的缓解,但那又是对模型能力的假设,而模型越来越聪明。结构性解法只有一条:token 永远够不到沙箱。

两条落地模式。Git 场景在沙箱初始化时用仓库令牌完成 clone 并接进本地 remote,此后 push 和 pull 都在沙箱内正常工作,agent 全程摸不到令牌。自定义工具走 MCP,OAuth 凭证存在沙箱外的 vault 保险库,模型经专用代理调用,代理按会话取真凭证去调外部服务,harness 对凭证全程无感。

会话不等于上下文窗口

长任务迟早超出模型的上下文窗口。常规手段,压缩摘要、记忆工具、裁掉旧工具结果,全在做不可逆取舍:留什么扔什么,而谁也不知道后面的轮次会用到哪段。

Managed Agents 把会话日志当成活在上下文窗口外的上下文对象。getEvents() 支持按位置切片:从上次读到的地方续读,回退几个事件看某一步的前因,行动前重读相关记录。

取回的事件可以先在 harness 里加工再进模型上下文,比如为 prompt cache 命中率做组织。可恢复存储归会话,怎么管上下文归 harness,分开的理由直白:没人预测得了未来模型要什么上下文工程,接口只保证日志耐用、随时可查。

多脑多手

解耦顺手解决了最早的客户抱怨:harness 不再住在容器里,接客户 VPC 只是多接一双手,网络打通这道工序整个消失。

性能红利更大。旧设计里几个大脑就得几个容器,每个会话先付一遍全套启动成本:clone 仓库、拉起进程、取事件,哪怕这会话根本用不上沙箱。

这笔账落在 TTFT 上,即从接受任务到吐出第一个响应 token 的等待时间,用户体感最直接的延迟。新架构下容器按需才拉,编排层从会话日志取完待处理事件就能开跑。

Anthropic 自报口径:p50 的 TTFT 降了约 60%,p95 降超 90%。没有第三方复核,当方向看就好。

多手这头更有意思。模型得在多个执行环境之间做调度决策,认知负担比单壳操作重。团队坦承早期模型做不了,才先用了单容器;等智力跟上来,单容器反倒成了短板:它一挂,所有手的状态一起丢。

接口的通用性在这里显形:每只手就是一个 execute(name, input),harness 分不清对面是容器、手机还是 Pokémon 模拟器。手不绑脑,脑与脑之间还能互相转手。

“The harness doesn’t know whether the sandbox is a container, a phone, or a Pokémon emulator.”

文章收束在一个定位上:Managed Agents 自称 meta-harness,不预设 Claude 未来需要哪种 harness。Claude Code 是他们自家广泛使用的 harness,任务特化的小 harness 也各有专攻,都得能装进这套接口里,跟着模型一起升级。

站长落点

这篇的正确用法,个人以为是当接口设计清单抄,而非当产品评测读。execute、provision、wake、getEvents 四个签名,加一条凭证纪律:token 永不入沙箱。自建 agent 运行时照这份清单抄,不亏。

TTFT 两个数字是官方自测,没有第三方口径,信一半就好。真正硬的洞察是那条操作系统类比:接口比实现活得久。模型还在涨智商,你今天写进 harness 的每个补丁都在贬值。

大陆访问 anthropic.com 要备代理。服务本身是 Claude 平台的付费功能,大陆读者看架构就好,别急着谈迁移。

持续耕种,欢迎订阅 🌱

RSS全站 ·原创 ·策展 ·雷达;公众号「炼金术」同步更新。