Back/harness engineering

Managed Agents 架构拆解 — Anthropic 给 Agent 造了一套 K8s

Updated 2026-04-11
2 min read
411 words

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,之后 pushpull 都走本地配置,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,这套脑手分离的架构模式也能自己实现。

关联

Sources

Linked from