Managed Agents 架构拆解 — Anthropic 给 Agent 造了一套 K8s
来源:Feisky 编译自 Anthropic 工程博客
核心论点
Managed Agents 就是 Agent 领域的 Kubernetes。
K8s 把硬件虚拟化成抽象层(Pod、Service、PersistentVolume),Managed Agents 把 Agent 的核心组件虚拟化成接口(session、harness、sandbox)。接口固定,实现自由替换。
解决的问题
跑过长时间 Agent 任务的人都碰过这些事:
- Agent 跑着跑着容器挂了,session 没了,只能从头来
- session 卡死了想调试,Harness、sandbox、session 全在一个容器里,根本分不清问题出在哪
- 上下文窗口满了,压缩还是丢弃,怎么选都可能踩坑
K8s 十年前解决的是同一类问题:组件耦合、状态丢失、扩展困难。
三大核心接口
Managed Agents 把 Agent 核心组件虚拟化成三个接口:
| 接口 | 作用 | K8s 类比 |
|---|---|---|
| session | 发生了什么的完整事件日志 | PersistentVolume |
| harness | 调用 Claude 和路由工具调用的循环 | Pod(无状态计算单元) |
| sandbox | Claude 跑代码和编辑文件的执行环境 | 容器运行时 |
每个组件可以独立替换,互不干扰。
别养宠物(Pets vs Cattle)
最初的设计问题
把所有 Agent 组件塞进一个容器:
- 容器挂了,session 就没了
- 容器卡住了,得想办法把它救活
- 调试困难,因为容器里有用户数据
这就是在养宠物(Pet)——精心照料的单台服务器,挂了就得抢救。
解法:把大脑从手上拆下来
大脑(Claude 和 Harness)从手(sandbox)和记忆(session 日志)上拆开:
- Harness 不再住在容器里
- 它像调用其他工具一样调用容器:
execute(name, input) → string - 容器变成了 Cattle,挂了就挂了
- Harness 把失败当作工具调用错误传回给 Claude
- Claude 决定要不要重试
- 重试的话,
provision({resources})拉一个新的就行
不用再抢救挂掉的容器了。
Harness 也是 Cattle
- session 日志在外部
- Harness 里没有任何需要在崩溃中存活的状态
- 挂了?
wake(sessionId)启动一个新的 getSession(id)拿回事件日志,从最后一个事件继续
安全架构
之前的问题
所有东西耦合在一个容器里:
- Claude 生成的不可信代码和凭证跑在同一个环境中
- 一次成功的 prompt injection 只需要说服 Claude 读一下自己的环境变量
- 拿到 token 之后,攻击者可以开新 session 干什么都行
结构性解法
让 token 在 sandbox 里根本不可达:
| 场景 | 解法 |
|---|---|
| Git 仓库 | sandbox 初始化时用 token 克隆仓库并写入本地 git remote,之后 push 和 pull 都走本地配置,Agent 从头到尾碰不到 token |
| 自定义工具 | 走 MCP,OAuth token 存在安全保险箱里 |
| 外部服务 | Claude 通过专用代理调用 MCP 工具,代理根据 session 拿到对应的凭证再调外部服务 |
整个链路里,Harness 不接触任何凭证。
Session 不是上下文窗口
传统方法的问题
长时间任务经常超出上下文窗口:
- compaction:把上下文压缩成摘要
- memory 工具:把信息写到文件
- context trimming:选择性地删掉旧的工具结果
共同软肋: 很难预判未来哪些 token 会被用到,删错了就回不来了。
Managed Agents 的解法
把上下文存在 sandbox 外面:
- session 日志是持久化的
- 通过
getEvents()接口让大脑按位置切片查询事件流 - 可以从上次读到的地方继续往下读
- 也可以倒回某个时刻前几个事件看看当时的背景
- 或者在执行某个操作前重新读一遍相关上下文
类比: session 就是 PersistentVolume,数据在那里,不管哪个 Pod 来挂载都能用。
多脑多手
多脑优化
之前: 每启动一个 session 就要起一个容器,克隆仓库、启动进程、拉取待处理事件,全卡在 TTFT(Time to First Token)上。
拆开之后:
- 容器只在需要时才通过工具调用启动
- 不需要 sandbox 的 session 直接跳过容器初始化
- 推理在编排层拉到 session 事件后就开始
效果:
- p50 TTFT 下降约 60%
- p95 下降超过 90%
多手架构
- 每只手就是一个工具调用:
execute(name, input) → string - 名字和输入进去,字符串出来
- 这个接口能接任何自定义工具、任何 MCP 服务器、Anthropic 自己的内置工具
- Harness 不知道也不关心 sandbox 到底是一个容器、一部手机,还是一个宝可梦模拟器
因为手不绑定任何特定的脑,多个 Agent 之间可以互相传递工具。
内测数据
在结构化文件生成任务上(根据 API schema 自动生成 SDK 代码和文档):
- 相比标准的 prompting 循环
- 任务成功率最高提升了 10 个百分点
- 难题上增益最大
写在最后
Managed Agents 在做的事:
- 不规定 Harness 怎么写
- 把 Agent 的核心组件虚拟化成接口
- 接口固定,实现自由替换
差异:
- K8s 是开源的,CNCF 社区驱动
- Managed Agents 是 Anthropic 的托管服务,目前只服务 Claude 生态
但设计理念是通用的: 即使不用 Managed Agents,这套脑手分离的架构模式也能自己实现。
关联
- harness-engineering/overview — Harness Engineering 概览
- harness-engineering/three-scaling-dimensions — 三个 Scaling 维度
- claude-code/overview — Claude Code
- ai-ecosystem/overview — AI 生态系统