Anthropic《Scaling Managed Agents: Decoupling the brain from the hands》深度解读¶
这篇文章到底在讲什么¶
一句话先说结论:
Anthropic 这篇文章表面上是在介绍 Claude Managed Agents 的工程设计,但更深层其实是在回答一个更通用的问题:
当模型能力持续变强时,Agent 系统应该把什么设计成稳定层,什么设计成可替换层?
Anthropic 给出的答案是:
- 不要把某一代模型的“补丁式 harness 技巧”当成长期架构;
- 要把
session、harness、sandbox/tools之间的接口设计成更稳定的一层; - 用“接口稳定、内部可替换”的方式,让系统能随着模型能力变化而持续演进。
所以,这不是一篇单纯的产品介绍文,而是一篇非常典型的“Agent 平台架构方法论”文章。
先建立一个总心智模型¶
Anthropic 在文中把一个 Agent 系统拆成了三块:
-
Brain(脑)
- Claude + harness
- 负责推理、规划、决定下一步做什么、把工具调用路由出去 -
Hands(手)
- sandbox、tools、MCP、执行环境
- 负责真正去运行命令、读写文件、访问外部服务 -
Session(会话)
- append-only 的事件日志
- 负责持久化记录整个任务发生过什么,以支持恢复、审计、回放、异步执行
文章核心就是一句:
把脑、手、会话彻底解耦。
为什么 Anthropic 认为旧设计有问题¶
他们最开始把 session、harness、sandbox 都放进同一个容器里。
这看起来很自然,因为:
- 文件编辑是本地 syscall,简单;
- 没有额外服务边界,开发快;
- 所有东西都在一起,似乎更“顺手”。
但它很快带来了三个结构性问题。
1)容器变成了“pet”,不是“cattle”¶
文章用了经典的基础设施比喻:pet vs cattle。
- pet:一个不能丢、要人工照料的个体
- cattle:可替换、坏了就丢、重新拉起即可
旧设计的问题是:
- 容器一挂,session 也跟着丢;
- 容器卡住时,必须人工排查;
- 整个系统依赖某个具体容器还活着。
也就是说,原本应该是“可替换执行环境”的容器,被设计成了承载关键状态的单点。
这不是小 bug,而是状态边界放错了位置。
2)故障定位非常差¶
他们说自己的主要观察窗口只有 WebSocket 事件流。
但问题在于:
- harness 出 bug,
- 网络掉包,
- 容器离线,
这些在事件流上看起来都很像。
于是工程师为了定位问题,只能进入容器排查。但容器里往往又有用户数据,这在安全与运维上都非常别扭。
所以旧架构不仅脆,而且难 debug。
3)harness 默认假设资源和自己在一起¶
这是文章里特别重要但很容易被忽略的一点。
旧 harness 隐含了一个假设:Claude 要操作的东西就在当前容器里。
这个假设在内部玩 demo 时没问题,但一旦客户说:
“我的资源在自己的 VPC 里,你来接入吧。”
问题就来了。
于是客户只能:
- 和 Anthropic 网络打通,或者
- 直接在自己的环境里跑 Anthropic 的 harness
这说明一个很深的问题:
系统把“执行资源的位置”写死进了 harness 设计里。
一旦要跨网络边界、跨安全域,这种耦合就会变成产品扩展障碍。
新架构的核心思想:把脑从手里拆出来¶
Anthropic 最关键的决策是:
让 harness 不再住在容器里,而是把容器也看成工具的一种。
也就是:
- Brain 负责思考和编排;
- Hands 负责执行;
- Session 负责记录。
它们三者之间通过小而稳定的接口协作。
Hands 的统一抽象:execute(name, input) -> string¶
这是全篇最重要的抽象之一。
Anthropic 的意思不是“容器是特殊东西”,而是:
容器、工具、MCP 服务、本地执行环境,本质上都可以被视作一种 hand。
只要接口统一成:
execute(name, input) -> string
那么 Brain 就不需要知道对面到底是什么:
- 一个 Linux 容器,
- 一个 MCP server,
- 一个客户 VPC 里的服务,
- 甚至未来别的执行环境。
这背后的工程价值非常大:
- 能力接入方式统一;
- 底层实现可替换;
- 扩展新 hand 的成本低;
- Brain 的编排逻辑不会被基础设施细节污染。
这是典型的平台抽象思路:
上层稳定的是“能力接口”,不是具体实现。
容器也变成 cattle¶
因为容器不再承载核心 session 状态,所以容器挂了不再是灾难。
Brain 只会把它看成一次 tool-call failure。
如果 Claude 认为值得重试,就重新:
provision({resources})
拉起一个新容器即可。
这非常像云原生里“无状态工作节点 + 外部状态存储”的思路。
真正重要的状态不在容器本地,而在系统外部的 durable layer。
文章最深的一层:Session 不是 Claude 的上下文窗口¶
这是我认为最值得反复理解的一句。
在很多 Agent 系统里,大家会不自觉把“session”理解成:
- 当前 messages 列表
- 当前 prompt history
- 当前上下文窗口里那堆 token
Anthropic 说:不是。
他们把 session 定义成 append-only durable log¶
也就是:
- 所有事件都写入 session;
- session 持久化存在于 harness 外部;
- Claude 的上下文窗口只是“读取 session 的一个临时视图”。
这意味着:
- 完整历史不受 context window 限制;
- harness 崩了也不丢任务过程;
- 可以回放、审计、重建现场;
- 可以针对需要只取一部分历史重新喂给模型。
getEvents() 的意义¶
文章里说 Brain 可以通过 getEvents() 读取 session 中的事件切片。
这很关键,因为它把 context 从“直接塞满 prompt”升级成了“可检索对象”。
你可以:
- 从上次读到的位置继续读;
- 回退几个事件看前因后果;
- 在某个动作前重读上下文;
- 只取相关片段,而不是把全部历史再喂一遍。
这本质上是在说:
Session 是系统级状态;Context window 只是消费 Session 的一种方式。
这个抽象带来的好处远不止节省 token,而是让系统具备真正的长时程可恢复能力。
为什么文章反复强调“harness 假设会过时”¶
这篇文章的思想起点,其实来自 Anthropic 在过去 Agent 工程里的一个经验:
很多 harness 技巧,本质上是针对当前模型缺点打的工程补丁。模型变强后,它们会过时。
他们举的例子是“context anxiety”。
什么是 context anxiety¶
在之前的文章《Harness design for long-running application development》里,Anthropic 发现:
- Claude Sonnet 4.5 在上下文快满时,会出现一种“想赶紧收尾”的倾向;
- 为了缓解这个问题,他们设计了 context resets;
- 即清空上下文窗口,用结构化 handoff 让新 agent 接着干。
但到了 Claude Opus 4.5,他们发现这个问题基本消失了。
于是原来的 context resets 反而变成了:
- 额外 orchestration 复杂度
- 额外 token 开销
- 额外 latency
- 额外系统负担
也就是文章中的那个词:dead weight。
这件事真正说明了什么¶
说明你不能把“为了弥补某代模型弱点而加入的工程技巧”直接写死进系统主干。
否则模型能力一变,这些技巧就会从优化,变成包袱。
所以 Anthropic 的方法是:
- 允许 harness 持续变化;
- 但要让 session / sandbox / tool interface 这些更外层抽象尽量稳定。
一句话:
把易腐烂的东西放在可替换层,把长寿命的东西做成接口层。
这是这篇文章最强的方法论价值。
Harness 如何变成“可恢复的 cattle”¶
旧设计里,如果 harness 出问题,整个 agent 很难恢复。
新设计里,Anthropic 让 harness 也变成了可替换组件。
因为:
- session log 在 harness 外部;
- harness 不再需要自己保存完整状态;
- 只要用
wake(sessionId)、getSession(id)读回事件流,就能从上次位置继续执行; - 运行中持续
emitEvent(id, event),确保整个过程有 durable record。
这相当于把 harness 从“有记忆的脆弱进程”改造成了“无状态编排器”。
这很像分布式系统里的一个成熟思想:
- 不追求组件永不失败;
- 追求组件失败后,能以低成本恢复语义连续性。
对于长任务 Agent,这比“尽量别挂”更重要。
安全设计:真正的边界不是容器,而是凭证位置¶
文章里还有一个非常强的工程点:
如果 Claude 生成的不可信代码和凭证在同一个执行环境里,那么 prompt injection 的后果会非常严重。
因为一旦攻击者诱导 Claude 读取环境变量,拿到 token,就可能:
- 启动新的 session;
- 扩大调用范围;
- 对外部系统做更深的操作。
Anthropic 的做法不是简单说“缩小 token 权限”,而是做了结构性隔离:
1)Git 凭证不暴露给 Agent¶
他们把 repo token 用在 sandbox 初始化时:
- clone 仓库;
- 配置 git remote;
这样 agent 在 sandbox 里可以正常 git pull / git push,
但并不会直接拿到底层 token。
2)MCP / OAuth 凭证放进 vault¶
对于自定义工具:
- Claude 调 MCP 工具时,先经过 proxy;
- proxy 拿 session token 去 vault 取对应凭证;
- 再代替 Agent 调外部服务;
- harness 本身也不直接看到凭证。
这层设计真正想说明什么¶
Agent 系统里最危险的不是“模型会不会胡说”,而是:
执行面是否能直接摸到原始秘密。
Anthropic 的答案是:
- 执行环境尽量无凭证;
- 凭证放在更外层的受控代理里;
- 给 Agent 的不是秘密本身,而是受限能力。
这是非常值得借鉴的安全思路。
性能收益为什么这么大:不是模型更快,而是架构更对¶
文章里给了一个很亮眼的数据:
- p50 TTFT 下降约 60%
- p95 TTFT 下降超过 90%
这里的 TTFT 指的是:从任务开始,到产出第一个 token 的时间。
为什么旧设计慢¶
因为旧设计相当于:
- 每个 session 一上来就得准备容器;
- clone repo;
- 拉取待处理事件;
- 启动整个执行环境;
- 哪怕它此时只是想先思考一下。
这等于把“可能之后才需要的资源”提前绑定到了启动路径上。
为什么新设计快¶
新架构把容器推迟成“按需 provision”。
所以:
- 不需要 hand 的 session,不用等容器;
- Brain 可以先开始推理;
- 只有真的要执行时,才去拉起 hand。
这说明很多 Agent 系统的性能问题,不是模型慢,而是生命周期设计错了。
一句话总结这部分:
最有效的性能优化,常常来自资源延迟绑定,而不是局部微调。
Many brains, many hands:这不是扩容,而是系统级升级¶
Anthropic 最后提出两个方向:
1)Many brains¶
当 harness 变成 stateless 组件后:
- 你可以更容易横向扩展多个 brain;
- 一个任务不再强绑定到某个具体容器;
- 更容易恢复、接力、扩缩容。
2)Many hands¶
当 hand 被统一抽象成工具后:
- 一个 brain 可以调多个执行环境;
- Claude 不必局限在一个 shell 里工作;
- 不同 hand 可以来自不同网络、不同安全域、不同类型的工具系统;
- 甚至 brains 之间还能传递 hands。
这一点非常重要。
因为它意味着 Agent 平台不再是“一个模型 + 一个终端”的设计,而是逐渐变成:
- 多 brain 协作
- 多 hand 执行
- session 作为共享事实底座
这更接近未来真正的 Agent 平台形态。
把产品文档和工程文章对起来看¶
Anthropic 的官方文档里把 Claude Managed Agents 定义为:
- pre-built, configurable agent harness
- 运行在 managed infrastructure 上
- 适合 long-running tasks 和 asynchronous work
- 核心概念包括:agent、environment、session、events
如果只看文档,你会觉得它主要是在卖一个“托管 Agent 运行时产品”。
但结合工程文章去看,会发现文档里的对象其实就是架构抽象的产品化映射:
agent:Brain 的定义边界(模型、system prompt、tools、skills)environment:Hands 的运行模板(容器、网络、预装包)session:持久任务实例events:对外暴露的过程流
也就是说:
产品对象模型,正是工程抽象的 API 化结果。
这说明 Anthropic 不是先有一堆功能再包装成 API,而是先想清楚哪些对象该成为系统的一等公民。
普通软件工程师真正该学到什么¶
如果你不是要复刻 Anthropic 的平台,而是想做自己的 Agent 系统,这篇文章最值得带走的是下面 6 条。
1)先设计状态边界,再设计 prompt 技巧¶
不要一上来就沉迷:
- prompt 怎么写
- tool description 怎么调
- planner 怎么 hack
更应该先定义:
- session 存什么
- event 怎么记
- 失败怎么恢复
- 执行环境怎么隔离
- 哪些东西是 durable state
2)把 session 设计成日志,而不是消息数组¶
如果 session 只是 messages list,那么:
- 恢复困难
- 审计困难
- 回放困难
- 长任务很容易被 context window 限制住
更好的方式是:
- 把 session 做成可切片、可回放、可外部存储的事件流。
3)把模型特定补丁放进易替换层¶
像:
- context reset
- compaction 策略
- tool forcing
- retry heuristic
- prompt hack
这些都可能随着模型进步而过时。
所以它们应该是 policy / middleware / adapter,而不是平台最稳定的核心层。
4)把控制面和执行面分开¶
控制面负责:
- 思考
- 规划
- 路由
- 决策
执行面负责:
- 跑命令
- 调 API
- 操作文件
- 接触外部环境
这会带来:
- 更清晰的权限边界
- 更容易的故障定位
- 更好的可替换性
5)把凭证设计成“代理能力”,而不是“裸露秘密”¶
如果 agent 所在环境直接拿到真实 token,那么 prompt injection 的上限会非常高。
更稳的方式是:
- sandbox 不直接持有秘密;
- 通过 vault / proxy / scoped capability 访问外部资源。
6)评估架构时问一句:模型变强后,这层会不会变成 dead weight?¶
这是这篇文章非常成熟的一个判断标准。
任何你今天为了弥补模型不足而加的工程技巧,都应该问:
- 明天模型更强时,这还值不值得保留?
- 如果不值得保留,移除成本高不高?
如果移除成本很高,说明你把短寿命策略写进了长寿命架构。
我对这篇文章的最终理解¶
如果只用一句话总结:
Anthropic 在做的不是一个“更会调工具的 Claude”,而是一个“让 Agent 系统能持续适应未来模型能力变化”的架构底座。
它真正解决的不是“怎么让模型去跑命令”,而是:
- 怎么让 session 持久可靠;
- 怎么让 harness 可替换、可恢复;
- 怎么让 hands 可自由扩展;
- 怎么让安全边界不随着 Agent 更强而崩掉;
- 怎么让今天的 harness 技巧不会绑死明天的系统演进。
所以这篇文章最值得学的,不是某几个 API 名字,而是它背后的设计顺序:
- 先稳定接口;
- 再允许内部演化;
- 先把状态和执行边界分清;
- 再去做 prompt / harness 优化;
- 默认承认模型会变强,因此系统要为“旧补丁过期”留好空间。
这其实已经不是“小技巧”,而是很成熟的 Agent 平台工程观。
适合你记住的 5 句话¶
- Session 不是上下文窗口,Session 是可恢复的外部事件日志。
- Harness 会过时,接口比 Harness 更应该稳定。
- Brain 负责思考,Hands 负责执行,二者不要绑死。
- 真正的安全边界不只是容器隔离,而是凭证不要落到执行面。
- 很多性能优化来自资源延迟绑定,而不是单纯让模型更快。
可继续延伸阅读的方向¶
如果你想把这篇文章吃得更透,建议继续串读这几类内容:
-
Anthropic 早期关于 harness / context engineering 的文章
- 理解为什么他们会得出“补丁会过时”的结论 -
事件溯源(event sourcing)和控制面/执行面分离
- 能更好理解 session log 和 brain/hands 分层 -
面向 Agent 的安全设计
- prompt injection、vault、scoped capability、proxy execution -
Many-brains / many-hands 的调度问题
- 这会自然延伸到 multi-agent orchestration 的设计空间
参考来源¶
已直接查看的主要来源:
-
Anthropic Engineering
- https://www.anthropic.com/engineering/managed-agents
- 标题:Scaling Managed Agents: Decoupling the brain from the hands -
Claude API Docs
- https://platform.claude.com/docs/en/managed-agents/overview
- 标题:Claude Managed Agents overview -
Anthropic Engineering
- https://www.anthropic.com/engineering/harness-design-long-running-apps
- 标题:Harness design for long-running application development
最后一句¶
如果你把这篇文章只读成“Anthropic 推了个托管 Agent 产品”,那只看到了表层。
如果你把它读成:
在模型能力持续上升的前提下,Agent 平台该如何设计稳定接口、易腐策略层、状态边界与安全边界,
那就读到了它真正有价值的地方。