Anthropic Managed Agents vs Vyane — 架构对照
原始 research campaign 输出,来自 managed agents vs vyane。这页保留报告结构和运行痕迹,正式文章会在写作区重写。
Anthropic Managed Agents vs Vyane — 架构对照
- Date: 2026-05-13
- Status: Research(一次性对照笔记,不是 ADR)
- Trigger: 小天fotos 抖音/YouTube 视频《比 Openclaw 更好!我发现了多 Agent 协作架构的版本答案!》(2026-05-11 发布,11:25)
- Anthropic 原文: Scaling Managed Agents: Decoupling the brain from the hands(2026-04-08)
- 视频源: YouTube 4kgkYAGPuD0、抖音 m4SLJwQVGDE
- 作者备注: 视频和 Anthropic 博客讲的是同一件事的两个面,本报告把两者落到具体源码证据,再与 Vyane 现有架构 ADR-003 v2 / ADR-010 做对照
0. 为什么写这份报告
视频 up 主声称 Anthropic 的 Managed Agents 是「当下版本的答案」,并在一周内本地复刻了一遍。Maple 看完后晕,问两件事:
- 这套架构和 Meridian / Vyane 现有的设计有没有关联?
- 视频里反复提到的 Claude SDK 源码到底是什么形状?
本报告把视频里的关键论点、Anthropic 博客的核心接口设计、两个公开 SDK 仓库的真实代码逐一落实,再做 Vyane 字段级映射。最终结论先给在这里:Vyane ADR-003 v2 的四层模型与 Anthropic 的接口哲学是同构的;真正可以马上落地学习的只有 SessionStore 6 方法 Protocol + fork_session 能力,其他都是方向印证。
1. 视频原文要点
| 字段 | 值 |
|---|---|
| 标题 | 比 Openclaw 更好!我发现了多 Agent 协作架构的版本答案! |
| 作者 | 小天fotos |
| 时长 | 685 秒(11:25) |
| 发布 | 2026-05-11 |
| 播放 | 9,284 / 点赞 425 / 评论 59(截至抓取时) |
视频核心叙事顺序:
- 春节他做的「5 只小龙虾协同开发」全网爆火,但他自己知道架构「太蹩脚」——养着养着就死,因为模型/记忆/本地环境绑死,是「宠物」不是「牛马」。
- 2026-04-08 Anthropic 发了《Decoupling the brain from the hands》一文,他认为这就是版本答案:把大模型规划决策(brain)和执行代码 sandbox(hands)彻底解耦。
- 他翻 SDK 源码,发现
beta目录下 6 个模块:agents / environments / sessions / skills / memory_stores / vaults,都是云端 API 包裹。 - 在
agents类里看到coordinator字段——「不干活的指挥官」,最多 20 个 agent 花名册,每个独立 prompt/工具/MCP。 - agent ≠ session:agent 是静态模板(“我是谁”),session 是动态实例(“我在干什么”),memory store 挂载到 session 上。
- 2026-04-19 Claude Agent SDK Python 仓库合并了 SessionStore PR,记忆从本地搬到云端 Redis,agent 彻底无状态。
- 他自己抽出来的「四层解耦」(与 Vyane 的四层不是同一种切法):
- L1 Brain / Hands 解耦
- L2 sandbox 解耦
- L3 session 作为「记忆树」,可 fork / 回滚 / 克隆
- L4 SessionStore 云端记忆,agent 完全无状态
- 一周复刻:agent sandbox + SessionStore + 静态编排器跑起来了,结果评估模块未做。harness 塞在 worker(Docker)里,worker 内可以是 Claude Code、Codex 或 Pi。任务图调度可做编码-review-测试管道,也可做 deep research 流。每个节点独立上下文 = 不同节点可以用不同模型。
- 下一步接腾讯 Kube Sandbox(4 月底开源),毫秒级启动取代 Docker。
- 结尾批判:国产厂商还在卷 token 单价,海外(Palantir AIP / Anthropic Managed Agents / OpenAI Frontier)已把 agent 做成企业基础设施。下期想讲 FDE。
2. Anthropic 博客核心论点
“We’re opinionated about the shape of these interfaces, not about what runs behind them.”
核心动机:旧的 harness 里写满了「Claude 这个版本暂时做不到 X」的补丁。模型一升级,这些补丁立刻变成 dead weight(博客原文举例:针对 Sonnet 4.5 的 context anxiety 修复在升级到 Opus 4.5 后失效)。
三个最小接口:
| 组件 | 接口签名 | 职责 |
|---|---|---|
| Hands | execute(name, input) → string |
统一工具调用(容器 / MCP / 自定义工具都套在里面) |
| Session | emitEvent(id, event) / getSession(id) / getEvents() |
事件流持久化 + 切片查询 |
| Harness | wake(sessionId) |
无状态,挂了从 session 复活 |
安全边界(博客的关键设计原则):
“Tokens are never reachable from the sandbox running Claude-generated code.”
两条凭证隔离路径:
- Bundle 认证:sandbox 初始化时 Anthropic 用 access token 帮 clone 好 repo,sandbox 内
git push/pull只看到 local git,永远拿不到 token。 - Vault + MCP proxy:OAuth tokens 存外部 vault,harness 走 proxy 调 MCP,proxy 从 vault 取凭证。
故障模型:
- 容器当「牛马」:崩了直接杀,harness 把它当成
tool-call error,Claude 自己决定要不要重试。 - Harness 当「牛马」:无状态,挂了
wake(sessionId)重启,靠getEvents()复活上下文。
量化收益(博客原文):TTFT p50 降约 60%,p95 降 >90%。原因是不用等容器 provision,推理立刻开始。
3. 实仓证据(两个 SDK 仓库)
视频里 up 主混着说了两个仓库的代码,所以听着晕。实际上是两件不同的东西:
| 仓库 | 角色 | 视频里对应 |
|---|---|---|
anthropics/anthropic-sdk-python |
云端 Managed Agents 的 API 客户端(调 Anthropic 服务器) | “beta 目录 6 模块”、“agent 类里的 coordinator” |
anthropics/claude-agent-sdk-python |
本地 Claude Code 的 agent SDK(你本机调 CC 用) | “4-19 SessionStore PR”、“fork / 克隆 / 回滚” |
3.1 anthropic-sdk-python 的 beta 模块
路径 src/anthropic/resources/beta/ 下确认存在 6 个目录 + 配套类型文件:
src/anthropic/resources/beta/
├── agents/
├── environments/
├── memory_stores/
├── messages/
├── sessions/
├── skills/
├── vaults/
├── beta.py
├── files.py
├── models.py
├── user_profiles.py
└── webhooks.py
配套类型在 src/anthropic/types/beta/,命名前缀 beta_managed_agents_*:
beta_managed_agents_agent.pybeta_managed_agents_skill_params.pybeta_managed_agents_mcp_toolset_params.pybeta_managed_agents_mcp_toolset_default_config_params.pybeta_managed_agents_mcp_tool_config_params.pysessions/beta_managed_agents_send_session_events.pysessions/beta_managed_agents_stream_session_thread_events.pysessions/beta_managed_agents_session_thread_usage.pysessions/beta_managed_agents_unknown_error.pysessions/beta_managed_agents_user_define_outcome_event_params.py
视频里说的「agent 类里 coordinator 字段、最多 20 个 agent 花名册」没有公开 source 验证——beta_managed_agents_agent.py 是云端 API 的类型反射,具体 schema 字段需要再翻一次 git history(或等 Anthropic 公开文档)。本报告暂不深入。
3.2 claude-agent-sdk-python 的 SessionStore
src/claude_agent_sdk/_internal/ 下与 session 相关的文件:
_internal/
├── sessions.py
├── session_store.py ← 视频说的"那个东西"
├── session_store_validation.py
├── session_resume.py
├── session_mutations.py
├── session_summary.py
├── session_import.py
└── transcript_mirror_batcher.py
SessionStore 是一个 6 方法 Protocol(在 types.py 定义,实现样本在 session_store.py 的 InMemorySessionStore):
class SessionStore:
async def append(key: SessionKey, entries: list[SessionStoreEntry]) -> None
async def load(key: SessionKey) -> list[SessionStoreEntry] | None
async def list_sessions(project_key: str) -> list[SessionStoreListEntry]
async def list_session_summaries(project_key: str) -> list[SessionSummaryEntry]
async def delete(key: SessionKey) -> None
async def list_subkeys(key: SessionListSubkeysKey) -> list[str]
SessionKey 是复合键:
SessionKey = {
"project_key": str,
"session_id": str,
"subpath": str | None, # 子 agent transcript 用
}
examples/session_stores/ 下有三个参考实现:
- redis_session_store.py
- s3_session_store.py
- Postgres 版本
3.3 SessionStore 相关 PR 时间线
视频里说的「4-19 那条恐怖的 PR」对应 PR #837。完整的 SessionStore 演进时间线:
| Date | PR | 标题 |
|---|---|---|
| 2026-03-12 | #668 | feat: add rename_session |
| 2026-03-12 | #670 | feat: add tag_session with Unicode sanitization |
| 2026-03-20 | #667 | feat: add tag/created_at to SDKSessionInfo + get_session_info |
| 2026-03-26 | #744 | feat: add fork_session, delete_session, and offset pagination |
| 2026-03-28 | #750 | feat: add session_id option to ClaudeAgentOptions |
| 2026-04-14 | #805 | feat: delete_session() cascades subagent transcript dir |
| 2026-04-16 | #825 | feat: add list_subagents and get_subagent_messages session helpers |
| 2026-04-17 | #804 | feat(types): add top-level skills option to ClaudeAgentOptions |
| 2026-04-17 | #841 | feat(examples): S3, Redis, Postgres SessionStore reference adapters |
| 2026-04-19 | #837 | feat: SessionStore adapter — TS parity (protocol, mirror, resume, helpers) ← 视频聚焦点 |
| 2026-04-19 | #842 | feat(examples): S3, Redis, Postgres SessionStore reference adapters(second pass) |
| 2026-04-21 | #847 | feat: SessionStore.list_session_summaries — batch summary fetch for list-all |
| 2026-04-22 | #857 | sdk(session_store): bounded retry on mirror append + uuid idempotency docs |
| 2026-04-22 | #858 | feat(session_store): add import_session_to_store() for local→store replay |
| 2026-05-03 | #905 | feat(session_store): add session_store_flush option for eager mirroring |
值得注意:视频里强调的「session 作为记忆树,可 fork / 回滚 / 克隆」对应 PR #744(2026-03-26),早于 SessionStore Protocol 本身(PR #837)。换言之 fork 是先于持久化存在的能力,先有 fork,再有把 forked 的 session 镜像到云的 SessionStore。
4. Vyane 字段级对照
把视频/Anthropic 的术语换成 Vyane 自己的术语,对齐就清楚了。
4.1 概念映射表
| Anthropic / 视频 | Vyane 现有概念 | 出处 |
|---|---|---|
| Brain(Claude + harness) | AgentRun + RuntimeAdapter | ADR-003 v2 §3 |
Hands(sandbox / tools,execute()) |
Tool + ToolGrant + RuntimeAdapter | ADR-003 v2 §3 |
| Session(事件流持久层) | Session + Event(SQLite 已落地) | daemon/events/schema.py |
wake(sessionId) 无状态 harness |
I-3「Session 不绑 Model/Runtime」+ I-2「AgentRun 一个 subprocess」 | ADR-003 v2 §4 |
| 容器是牛马(崩了重拉) | Q4「每个 AgentRun 独立 subprocess 强隔离」 | ADR-003 v2 §5 Q4 |
| Coordinator agent | Yi 当主沟通 + 短期 AgentRun 池 | ADR-010 D1 |
| agent ≠ session(静态模板 vs 动态实例) | Agent : AgentRun = class : object | ADR-010 D1 |
| SessionStore(Redis 云端) | SessionMapping(本地 daemon) | daemon/session_manager.py |
bundle 认证 / vault + MCP proxy |
(Vyane 当前缺失,见 §6) | — |
Skill 模块 |
.agents/skills/ 但未升一等概念 |
(ADR 未建模) |
Environment 模块 |
Runtime + subprocess 隔离 | ADR-003 v2 §3 |
4.2 "四层"不是同一种切法
| up 主的「四层解耦」 | Vyane 的「四层模型」 |
|---|---|
| L1 Brain / Hands | — |
| L2 sandbox | — |
| L3 session 记忆树 | — |
| L4 SessionStore 云端记忆 | — |
| — | Identity 层(Role / Agent) |
| — | Orchestration 层(Task / Workflow) |
| — | Resource 层(Model / Runtime / Tool / ToolGrant / MemoryStore / Policy / …) |
| — | Execution 层(Session / AgentRun / Event / Artifact / Message) |
up 主的「四层」本质是 Execution 层内部的子结构。把他的 L1-L4 重新归到 Vyane 的层位上:
- L1(Brain / Hands)= Vyane 的 Resource 层 + Execution 层
- L2(sandbox)= Vyane 的 Runtime(具体一个
BaseAdapter子类) - L3(session 记忆树)= Vyane 的 Session + AgentRun 关系
- L4(SessionStore)= Vyane 的 SessionMapping(持久化)
两个口径不冲突,但 Vyane 的切法把 Identity 和 Orchestration 也独立成层,up 主没有显式建模这两层(他用「coordinator agent」吃掉了 Orchestration,没有独立的 Task 概念)。
5. 三件值得学的(按价值排序)
L1. SessionStore Protocol 直接抄签名
动作:把 Vyane 的 daemon/session_manager.py 中 SessionMapping 重做一遍,对齐 6 方法 Protocol:
class SessionStore(Protocol):
async def append(key, entries) -> None
async def load(key) -> list[entries] | None
async def list_sessions(project_key) -> [...]
async def list_session_summaries(project_key) -> [...]
async def delete(key) -> None
async def list_subkeys(key) -> list[str]
键结构也照搬:{project_key, session_id, subpath},subpath 给子 agent transcript 用,跟 Vyane 的「Task : AgentRun = 1 : N」天然对得上。
双向价值:
- 未来 Vyane 可以作为远程 SessionStore 接 Claude Code,让 Maple 的 CC 跨设备 resume 不用自己造轮子。
- 也可以反过来把 Anthropic 云端 SessionStore 当 Vyane 的存储后端选项之一。
参考代码:直接读 redis_session_store.py(最简单的网络存储实现)。
L2. fork_session 能力 Vyane 还没有
up 主原话:「agent 在搜完代码库的最聪明状态点,fork 一个出来跑其他任务,永远都知道 agent 最聪明的状态是什么,并且时刻能回滚或复制这个状态。」
Anthropic 在 PR #744(2026-03-26)已合并:fork_session(session_id, at_offset?)。
Vyane 当前形态:Worker 池里 session 是单向流水,没有 fork API。ADR-003 v2 §Q4 决定「Worker 池改造为 session 池」时,把 fork(session_id, at_offset) 一起加进去几乎是免费的。
典型场景:
- 编排者 agent 探索完代码库 → fork 出 3 个子 session 并行尝试不同实现 → 汇总最优解。
- Maple 自己用 Yi 调试一个长 session,调到一半想尝试不同方向,fork 出来跑分支,不污染主线。
L3. anthropic-sdk-python beta 模块作为「未来契约」跟踪
Vyane 当前是个人 daemon,不需要追 anthropic-sdk-python beta API 的实现。但 Vyane 自己的 dataclass 命名应该与这套契约对齐,因为 Anthropic 在给云端 Managed Agents 打的就是这套接口形状。
对照 Vyane 现有 ADR-003 v2 的 20 个概念,缺三个:
| Anthropic 模块 | Vyane 当前 | 缺口分析 |
|---|---|---|
vaults |
无 | 真正的安全边界缺失。security.py 只做扫描,没有凭证抽离层。 |
skills |
.agents/skills/ 文件目录 |
未升一等概念,没进 ADR-003 v2 的 20 概念表 |
environments |
Runtime 子类隐式覆盖 | Anthropic 的 Environment ≈ Runtime + 网络策略 + 资源配额,比 Vyane 的 Runtime 多了运行环境约束 |
6. Vault 缺口分析(最值得补的一块)
Vyane ADR-003 v2 的 20 个概念里没有 Vault。这是当前 Vyane 真正的安全边界缺口。
Anthropic Managed Agents 的 vault 设计:
“OAuth tokens stored in external vault, harness calls MCP via a dedicated proxy, proxy fetches credentials from vault. Tokens are never reachable from the sandbox running Claude-generated code.”
Vyane 当前实践:
security.py:做 prompt injection 和凭证泄露的扫描(detect),不做抽离(prevent reachability)ToolGrant:声明工具权限,但凭证本身仍在 subprocess 环境变量里可见- Claude Code / Codex / Gemini CLI 都直接读
~/.config/*或环境变量,凭证暴露给跑 AI 生成代码的 subprocess
风险:prompt injection 让 AI 读环境变量 → 拿到 GitHub PAT / Linear API key / 1Password service token → 泄露或滥用。Maple 的 feedback_op_service_account.md 已经走 1Password service account 减少交互弹窗,但 token 本身仍在 subprocess 可达范围内(注:相对路径在 docs/research/ 下,memory 在仓根 memory/)。
Vault 抽象的形状(参考 Anthropic):
class Vault(Protocol):
async def get_secret(name: str, requester: AgentRunRef) -> str: ...
async def has_access(name: str, requester: AgentRunRef) -> bool: ...
class MCPProxy:
"""Sits between AgentRun and MCP server.
AgentRun never sees the actual token; the proxy fetches it from Vault
per request and forwards an authenticated call.
"""
Vyane 落地路径:
- 现有
tools/op-secret.sh+ 1Password service account 是 vault 的雏形,但缺一个 Python API 层 - ADR-003 v2 的 Tier 2 优先级里加 Vault,与 Artifact / Message 并列
- MCP proxy 模式可借鉴 Anthropic 的「专用 proxy」设计,但短期 Vyane 个人场景可简化为「凭证请求审计 + token 不入 subprocess env」
7. 不需要学的(Vyane 已经做得更对)
| up 主的痛点 / Anthropic 的设计 | Vyane 状态 |
|---|---|
| 解耦 brain / hands / session | I-3 从 v1 就锁了 |
| 多模型协调 | vyane_broadcast / vyane_collaborate / 17 个 CLI 子命令已 ship |
| 容器即牛马(Docker 启动慢) | Q4 选了 subprocess,比 Docker 更轻 |
| 接腾讯 Kube Sandbox(毫秒级) | 优先级低,subprocess 已够用 |
| 多 runtime gateway | 已接 6 个 adapter(codex/gemini/claude/ollama/aliyun/opencode) |
| 任务图调度(编码-review-测试管道) | workflow.py pipeline 已支持串行 + 并行 |
| coordinator agent | Yi 就是这个角色,ADR-010 D1 已锁定 |
8. 行动建议
立即可做(不阻塞当前迭代)
- 跟踪 claude-agent-sdk-python 的 SessionStore 演进(每 2 周扫一次 merged PR)
- 跟踪 anthropic-sdk-python 的
beta/agents、beta/sessions、beta/vaultsschema 变化
等下次 Worker 池改造时一起做
- 对齐 SessionStore Protocol:
daemon/session_manager.py重做接口,键结构改{project_key, session_id, subpath} - 加
fork_session(session_id, at_offset)API:为 Workflow DAG 编排做基础
Tier 2 优先级
- 新增 Vault 概念:在 ADR-003 v2 的 20 概念表中加 Vault(与 Artifact / Message 并列),先做 dataclass + 1Password 后端
- MCP proxy 模式:为 Vault 配套,让 token 不进 subprocess env
不做(明确排除)
- 不复刻 Anthropic 的云端 Managed Agents 全套(Vyane 是个人 daemon,不需要云端 API)
- 不切换到 Kube Sandbox(subprocess 已够用)
- 不新增
coordinator agent概念(Yi 已经是了,ADR-010 D1 锁定)
9. 一句话总结
视频 up 主追的「四层解耦」是 Vyane ADR-003 v2 早就走过的路。真正能马上学的只有一件事:把 SessionStore Protocol 的 6 方法签名抄过来,下一次 Worker 池改造时一起做,配套加 fork_session。其他都是方向印证,不是新工作。
Vault 是 Vyane ADR 真正缺的一块,但优先级跟 Tier 2 一致,不阻塞当前迭代。
附录 A. 视频转录原文(关键段落)
「我在本地复刻了一个 anthropic 的 managed agents,现在我一声令下,无数的 agent 的大军就会同时待命,分工合作为我完成任务。」
「Anthropic 为了弥补模型的记忆缺陷,他们的工程师曾吭哧吭哧的写了几千行复杂的 Harness,结果新模型一发布,变聪明了,以前那些精妙的代码补丁瞬间沦为了毫无价值的垃圾。」
「以前大家没结耦,模型、记忆和本地的环境就死死的绑在一起,这等于你把 agent 当宠物去养,他只要跑错一行配置,或者记忆越来越多,又或者环境被污染,系统就会越来越难用,甚至得重装。」
「这个 SDK 的代码里有个藏着十分深的 beta 目录,里面藏着一整套 managed agents 的基础架构。Beta 目录下有 6 个模块:agents、environments、sessions、skills、memory stores、vaults。」
「session 和 agent 是两个完全不同的实体。agent 是静态的,你可以定义它用什么工具、用什么模型、用什么系统提示词,它就是一个模板。而 session 是动态的,你把 agent 拉起来跑,跑出来的对话、线程、记忆、挂载的文件,全是属于 session 的。」
「我在 claude agent 的 SDK 的 Python 代码库里头,我发现了一条极为恐怖的 PR 时间线。有一个叫 session store 的东西,在 4 月 19 日正式被合并了。从此呢,记忆从本地搬到了云端。」
完整转录见 video-insight 抓取日志(2026-05-13)。