Build dossier · 20

工程深度23 分钟阅读

可替换 Agent Platform:控制面、运行时与执行面的分层设计

理想的 Agent Platform 不追求包办一切,而是让控制面、Runtime、耐久编排、执行面与制品流各自拥有唯一职责。

#Agent Platform · #AI Agent · #系统架构 · #可替换性2026/LEARNING-AGENT-PLATFORM

可以。把我们前面聊过的 Codex / Pi / OpenClaw / Hermes / MCP / ACP / A2A / Memory / Sandbox / Durable Execution 全部放到一起以后,我认为当前最理想的方案不是:

“找一个最强 Agent 框架。”

而是:

搭一个 Agent Platform,把 Agent Runtime 本身设计成可替换组件。

截至 2026 年 9 月,我会倾向下面这套。


1. 我心中的“理想 Agent Stack”

可替换 Agent Platform 的控制面、运行时与执行面
原对话中的主架构图已重绘为 SVG;正文、代码与其余推导保持原貌。

这套架构最核心的思想是:

1. 我心中的“理想 Agent Stack”的分层或流程图
1. 我心中的“理想 Agent Stack”

每层职责独立。


2. 如果真让我今天开工,我会怎么选

我会选择:

层 推荐
主语言 TypeScript
Agent Harness 自己写轻量 Core,参考 Pi/Codex
Coding Agent Codex / Pi-compatible adapter
Client Protocol ACP
Tool Protocol MCP
Agent Protocol A2A 1.0
Durable Execution Temporal
Agent Graph 自己的状态机;复杂场景可 LangGraph
Primary DB PostgreSQL
Cache/Event Redis
Artifact S3-compatible storage
Memory Graphiti + PostgreSQL/vector search
Persistent Agent 可以借鉴 Letta
Sandbox Daytona 或 E2B
IAM OIDC/OAuth + capability token
Policy 自己的 Policy Engine
Observability OpenTelemetry + Langfuse
Eval deterministic verifier + LLM judge
Gateway 自己做,借鉴 OpenClaw
Deployment Docker/Kubernetes
Messaging Kafka/NATS 可选
Model Multi-provider Model Router

但里面有一个非常重要的选择:

我不会直接把 LangGraph 当整个系统的核心。

也不会:

Everything = OpenClaw

或者:

Everything = Temporal

或者:

Everything = Letta

我会让它们各自在自己擅长的层工作。


3. 最底层应该是 Sandbox,而不是 Agent

很多人会先写:

const agent = new Agent(...)

我的设计反过来。

一个 Task 首先创建:

Workspace

例如:

interface Workspace {
  id: string;

  filesystem: FileSystem;
  sandbox: Sandbox;

  repo?: Repository;

  environment: Environment;

  capabilities: Capability[];

  secrets: SecretLease[];
}

然后:

3. 最底层应该是 Sandbox,而不是 Agent的架构或流程图
3. 最底层应该是 Sandbox,而不是 Agent

不是:

3. 最底层应该是 Sandbox,而不是 Agent的架构或流程图
3. 最底层应该是 Sandbox,而不是 Agent

4. Sandbox:我目前倾向 Daytona

Daytona 现在已经把 sandbox 做得非常接近我们前面讨论的:

Agent Computer

它给每个 sandbox 独立 kernel、filesystem、network stack、CPU/RAM/disk,并同时提供 Linux container、Linux VM、Windows、GPU 等运行形态。还支持 snapshot / pause / resume 等能力。

于是 Agent 不应该获得:

shell()

而应该获得:

workspace.shell.exec()

例如:

4. Sandbox:我目前倾向 Daytona的架构或流程图
4. Sandbox:我目前倾向 Daytona

另一个:

4. Sandbox:我目前倾向 Daytona的架构或流程图
4. Sandbox:我目前倾向 Daytona

互不影响。

E2B 也很好,而且目前已经直接集成到 OpenAI Agents SDK,可提供隔离执行、持久 workspace state、parallel sandbox 等能力。

我的选择:

4. Sandbox:我目前倾向 Daytona的架构或流程图
4. Sandbox:我目前倾向 Daytona

5. Workspace 应该支持 fork

这是我认为非常值得做,但现在很多 Agent 系统做得还不够好的一点。

例如一个 Bug:

Fix authentication race condition

主 Agent 可以:

5. Workspace 应该支持 fork的架构或流程图
5. Workspace 应该支持 fork

然后比较:

5. Workspace 应该支持 fork的分层或流程图
5. Workspace 应该支持 fork

选择最优。

这比:

5. Workspace 应该支持 fork的分层或流程图
5. Workspace 应该支持 fork

高级很多。


6. Agent Runtime 我反而建议自己写“小”

这里我会学 Pi,而不是上来 LangGraph。

Agent Core 应该非常薄:

interface AgentRuntime {

  run(
    task: Task,
    context: AgentContext
  ): AsyncIterable<AgentEvent>;

}

内部核心只有:

6. Agent Runtime 我反而建议自己写“小”的架构或流程图
6. Agent Runtime 我反而建议自己写“小”

就是:

while (!completed) {

  const context =
    await contextEngine.build(state);

  const output =
    await model.generate(context);

  for (const action of output.actions) {

    const decision =
      await policy.evaluate(action);

    const result =
      await toolRuntime.execute(
        action,
        workspace
      );

    state.apply(result);
  }
}

整个核心最好:

几千行

而不是几十万行。


7. Model 绝不能直接绑定 Agent

设计:

7. Model 绝不能直接绑定 Agent的架构或流程图
7. Model 绝不能直接绑定 Agent

例如:

type ModelRole =
  | "fast"
  | "reasoning"
  | "coding"
  | "vision"
  | "review"
  | "summarization";

然后:

7. Model 绝不能直接绑定 Agent的架构或流程图
7. Model 绝不能直接绑定 Agent

这样才能真正控制:

cost
latency
reliability

8. Agent 不直接拥有 Tool

这是一个非常重要的设计。

不要:

agent.tools = [
  shell,
  github,
  database
]

而应该:

8. Agent 不直接拥有 Tool的架构或流程图
8. Agent 不直接拥有 Tool

比如:

8. Agent 不直接拥有 Tool的分层或流程图
8. Agent 不直接拥有 Tool

Worker:

filesystem.read
filesystem.write
shell.execute

Release Agent:

filesystem.read
git.commit
git.push

每个 Agent 最小权限。


9. MCP 就放在 Tool Runtime 里面

截至 2026 年 7 月,MCP 最新规范已经进一步向一个更加干净的 protocol core 演化,包括 stateless core、MRTR、header routing、authorization hardening、extensions 等。

所以内部工具:

Builtin Tool

和外部:

MCP Tool

应该对 Agent 完全透明。

例如:

9. MCP 就放在 Tool Runtime 里面的架构或流程图
9. MCP 就放在 Tool Runtime 里面

Agent 看起来都是:

tool.call()

10. Tool Schema 不应该全部进入 Context

300 个 MCP tools 全塞进去是错误的。

应该有:

Tool Discovery Layer

流程:

10. Tool Schema 不应该全部进入 Context的架构或流程图
10. Tool Schema 不应该全部进入 Context

例如:

10. Tool Schema 不应该全部进入 Context的架构或流程图
10. Tool Schema 不应该全部进入 Context

而不是把:

10. Tool Schema 不应该全部进入 Context的分层或流程图
10. Tool Schema 不应该全部进入 Context

也塞进去。


11. Context Engine 要作为独立服务

我认为未来优秀 Agent 系统里最核心的组件之一不是 Agent Loop,而是:

Context Engine

接口类似:

interface ContextEngine {

  build(
    task: Task,
    agent: Agent,
    budget: TokenBudget
  ): Promise<ModelContext>;

}

它从:

11. Context Engine 要作为独立服务的架构或流程图
11. Context Engine 要作为独立服务

这里要负责:

11. Context Engine 要作为独立服务的分层或流程图
11. Context Engine 要作为独立服务

12. Memory 应该拆成四种

不要:

memory = vector database

我建议:

12. Memory 应该拆成四种的架构或流程图
12. Memory 应该拆成四种

Working Memory

当前 task:

Working Memory的分层或流程图
Working Memory

存在:

Agent State

Episodic Memory

发生过什么:

2026-09-01
修过 payment race condition
最终是 Redis lock 导致

Semantic Memory

事实:

project backend = NestJS
database = PostgreSQL
deploy = AWS

Procedural Memory

经验:

Procedural Memory的分层或流程图
Procedural Memory

也就是:

Skills

13. 我会使用 Graphiti 管“事实世界”

Graphiti 最大价值不是普通 graph RAG,而是:

temporal facts

它能维护:

事实何时成立
何时失效
来源是什么

并结合 semantic、full-text 和 graph retrieval。官方定义就是 temporal Context Graph。

比如:

13. 我会使用 Graphiti 管“事实世界”的架构或流程图
13. 我会使用 Graphiti 管“事实世界”

比:

vectorDB:
Alice Google
Alice OpenAI

靠谱得多。


14. Letta 思想则适合“长期人格 Agent”

如果是类似 Hermes/OpenClaw 的个人 Agent:

14. Letta 思想则适合“长期人格 Agent”的分层或流程图
14. Letta 思想则适合“长期人格 Agent”

我会借鉴 Letta。

Letta 在 2026 年 8 月发布的 Agents SDK 就明确把 Agent 定义成持久、stateful 的实体:它可以跨机器运行,同时保留 identity、long-term experience 和 memory。

所以:

Coding Task Agent

和:

My Personal Agent

不应该完全是同一个生命周期。

前者:

ephemeral

后者:

persistent identity

15. Durable Execution:我会选 Temporal 做最底层保证

这里我的倾向很明确。

如果任务可能:

15. Durable Execution:我会选 Temporal 做最底层保证的分层或流程图
15. Durable Execution:我会选 Temporal 做最底层保证

就进入:

Temporal

因为 Temporal 的核心保证就是 workflow 即使遇到 crash、network failure、infrastructure outage,也能够恢复执行。官方现在也明确把 AI agents 列为这种 durable workload。

所以:

15. Durable Execution:我会选 Temporal 做最底层保证的架构或流程图
15. Durable Execution:我会选 Temporal 做最底层保证

或者:

15. Durable Execution:我会选 Temporal 做最底层保证的架构或流程图
15. Durable Execution:我会选 Temporal 做最底层保证

16. 为什么我不直接“全部 LangGraph”

LangGraph非常适合:

16. 为什么我不直接“全部 LangGraph”的分层或流程图
16. 为什么我不直接“全部 LangGraph”

现在它已经明确提供 durable execution、streaming、persistence、memory 和 HITL。

例如:

16. 为什么我不直接“全部 LangGraph”的架构或流程图
16. 为什么我不直接“全部 LangGraph”

它很舒服。

但如果:

16. 为什么我不直接“全部 LangGraph”的分层或流程图
16. 为什么我不直接“全部 LangGraph”

我还是更愿意:

Temporal

做外层 durable workflow。

所以:

16. 为什么我不直接“全部 LangGraph”的架构或流程图
16. 为什么我不直接“全部 LangGraph”

而不是:

LangGraph = entire backend

17. 一个理想 Task 的执行过程

假设用户说:

“帮我给项目增加 Stripe subscription,然后开 PR。”

完整流程应该是:

17. 一个理想 Task 的执行过程的架构或流程图
17. 一个理想 Task 的执行过程

注意:

模型不是控制整个业务生命周期。

Temporal 是。


18. 关键结果应该叫 Artifact,而不是 Message

这是我很推荐的设计。

不要:

Planner agent:
"我觉得可以这么做……"

然后 Worker 靠自然语言读。

改成:

interface PlanArtifact {

  goal: string;

  files: FileChange[];

  constraints: Constraint[];

  validation: TestPlan[];

}

然后:

18. 关键结果应该叫 Artifact,而不是 Message的架构或流程图
18. 关键结果应该叫 Artifact,而不是 Message

Coder:

PatchArtifact

Tester:

TestArtifact

Reviewer:

ReviewArtifact

最终:

18. 关键结果应该叫 Artifact,而不是 Message的架构或流程图
18. 关键结果应该叫 Artifact,而不是 Message

这样整个系统才:

18. 关键结果应该叫 Artifact,而不是 Message的分层或流程图
18. 关键结果应该叫 Artifact,而不是 Message

19. Multi-Agent 我不会做“Agent 聊天群”

不要:

19. Multi-Agent 我不会做“Agent 聊天群”的分层或流程图
19. Multi-Agent 我不会做“Agent 聊天群”

很浪费 token。

用:

Blackboard / Artifact Store

更合理:

19. Multi-Agent 我不会做“Agent 聊天群”的架构或流程图
19. Multi-Agent 我不会做“Agent 聊天群”

Agent之间主要交换:

structured artifacts

而不是聊天历史。


20. A2A 只用于真正独立的 Agent

这个边界特别重要。

当前 A2A 1.0 的定位已经非常明确:用于不同、甚至内部完全 opaque 的 agent systems 之间发现能力、委派任务和交换结果。

所以:

同一个 runtime 的 subagent

不用 A2A。

直接:

spawnAgent()

即可。

而:

你的公司 Agent
     ↓
外部 Legal Agent

才:

A2A

所以:

20. A2A 只用于真正独立的 Agent的分层或流程图
20. A2A 只用于真正独立的 Agent

21. ACP 则放在 UI 边界

对于 coding:

21. ACP 则放在 UI 边界的分层或流程图
21. ACP 则放在 UI 边界

Agent 不应该为每一个 UI 实现协议。

统一:

21. ACP 则放在 UI 边界的架构或流程图
21. ACP 则放在 UI 边界

ACP现在本身就是为了消除 editor × agent 的 N×M 集成问题,并且明确类似 LSP。

这样:

21. ACP 则放在 UI 边界的架构或流程图
21. ACP 则放在 UI 边界

22. Gateway 层我会借鉴 OpenClaw,但不把 OpenClaw 当 Kernel

Gateway负责:

22. Gateway 层我会借鉴 OpenClaw,但不把 OpenClaw 当 Kernel的分层或流程图
22. Gateway 层我会借鉴 OpenClaw,但不把 OpenClaw 当 Kernel

例如:

22. Gateway 层我会借鉴 OpenClaw,但不把 OpenClaw 当 Kernel的架构或流程图
22. Gateway 层我会借鉴 OpenClaw,但不把 OpenClaw 当 Kernel

然后 Gateway 后面才是:

Agent Platform

这样未来换:

22. Gateway 层我会借鉴 OpenClaw,但不把 OpenClaw 当 Kernel的分层或流程图
22. Gateway 层我会借鉴 OpenClaw,但不把 OpenClaw 当 Kernel

都可以。


23. Security 我会独立出 Policy Engine

任何 tool execution:

23. Security 我会独立出 Policy Engine的架构或流程图
23. Security 我会独立出 Policy Engine

然后:

23. Security 我会独立出 Policy Engine的架构或流程图
23. Security 我会独立出 Policy Engine

不能:

LLM 自己决定风险

24. Secrets 也不能直接暴露给 Agent

错误:

process.env.AWS_SECRET

然后模型:

可以看到 credential

正确:

24. Secrets 也不能直接暴露给 Agent的架构或流程图
24. Secrets 也不能直接暴露给 Agent

甚至 Agent 根本看不到 secret:

24. Secrets 也不能直接暴露给 Agent的分层或流程图
24. Secrets 也不能直接暴露给 Agent

这是最理想。


25. Agent IAM 最终应该是 Capability-Based

例如:

25. Agent IAM 最终应该是 Capability-Based的分层或流程图
25. Agent IAM 最终应该是 Capability-Based

它派生 Reviewer:

25. Agent IAM 最终应该是 Capability-Based的分层或流程图
25. Agent IAM 最终应该是 Capability-Based

不能 write。

Main Agent派生 Deployment Agent:

deploy:staging

也没有:

deploy:production

只有用户批准后:

25. Agent IAM 最终应该是 Capability-Based的分层或流程图
25. Agent IAM 最终应该是 Capability-Based

这才是我认为成熟 Agent OS 应该有的安全模型。


26. Event Store 必须是一等公民

所有东西变成 event:

26. Event Store 必须是一等公民的分层或流程图
26. Event Store 必须是一等公民

例如:

26. Event Store 必须是一等公民的架构或流程图
26. Event Store 必须是一等公民

这样一个 Agent 的全部生命周期:

可以 replay
可以 debug
可以 audit

27. Observability:OpenTelemetry + Langfuse

我不会让 Langfuse成为 Runtime dependency。

Runtime只输出:

OpenTelemetry

例如:

27. Observability:OpenTelemetry + Langfuse的架构或流程图
27. Observability:OpenTelemetry + Langfuse

然后 exporter:

27. Observability:OpenTelemetry + Langfuse的架构或流程图
27. Observability:OpenTelemetry + Langfuse

Langfuse 当前非常适合 agent trace:它会记录 LLM calls、tool invocation、retrieval、control-flow steps,并提供 evaluation/cost/latency 分析。

其 2026 年 v4 甚至进一步优化到直接查询和评估每个 agent step/tool execution。


28. Verifier 必须独立于 Generator

这个是整个系统最重要的质量设计之一。

不要:

28. Verifier 必须独立于 Generator的分层或流程图
28. Verifier 必须独立于 Generator

而应该:

28. Verifier 必须独立于 Generator的架构或流程图
28. Verifier 必须独立于 Generator

最终:

confidence

来自:

evidence

而不是模型自己说。


29. Model Judge 应该放最后

Verifier优先级:

29. Model Judge 应该放最后的分层或流程图
29. Model Judge 应该放最后

例如:

TypeScript code

先:

29. Model Judge 应该放最后的分层或流程图
29. Model Judge 应该放最后

最后才:

Reviewer Model

不要反过来。


30. Scheduler 最好也不是 Agent 自己 sleep

错误:

await sleep(86400000);

Agent:

一天后检查

正确:

Temporal Timer
Cron
Event trigger

流程:

30. Scheduler 最好也不是 Agent 自己 sleep的架构或流程图
30. Scheduler 最好也不是 Agent 自己 sleep

Agent 本身保持:

event-driven

31. Personal Agent 与 Worker Agent 要分离

我会定义两种核心 Agent:

Persistent Agent

Persistent Agent的分层或流程图
Persistent Agent

类似:

Hermes
Letta
OpenClaw assistant

生命周期:

months / years

Ephemeral Worker

task scoped
minimal permissions
minimal context

例如:

Ephemeral Worker的分层或流程图
Ephemeral Worker

生命周期:

seconds / minutes

结构:

Ephemeral Worker的架构或流程图
Ephemeral Worker

这比一个 Agent 包办所有事合理得多。


32. 也就是说 OpenClaw/Hermes 最终应该在这一层

32. 也就是说 OpenClaw/Hermes 最终应该在这一层的架构或流程图
32. 也就是说 OpenClaw/Hermes 最终应该在这一层

不是:

OpenClaw
   =
所有 execution runtime

33. 最终的协议关系会非常漂亮

建议你记住:

33. 最终的协议关系会非常漂亮的架构或流程图
33. 最终的协议关系会非常漂亮

我目前认为:

ACP + MCP + A2A

是一个非常值得押注的协议组合。

其中 A2A 当前已经进入 Linux Foundation / Agentic AI Foundation 体系,并明确定位成与 MCP 互补的 horizontal orchestration layer。


34. 整套系统的数据模型

如果我自己做,核心对象大概就是:

User

Identity

AgentDefinition

AgentInstance

Task

Run

Workspace

Capability

Tool

Skill

Memory

Artifact

Event

Approval

Checkpoint

关系:

34. 整套系统的数据模型的架构或流程图
34. 整套系统的数据模型

35. 最关键的是 AgentDefinition 和 AgentInstance 分开

类似:

Docker Image
vs
Container

定义:

AgentDefinition {
  role
  instructions
  modelPolicy
  capabilities
  skills
}

实例:

AgentInstance {
  id
  definitionId
  taskId
  state
  workspace
  model
}

于是:

ReviewerDefinition

可以创建:

Reviewer #123
Reviewer #124
Reviewer #125

这其实就是:

Agent as Process

36. Scheduler 就像 OS Scheduler

Control Plane:

36. Scheduler 就像 OS Scheduler的架构或流程图
36. Scheduler 就像 OS Scheduler

考虑:

36. Scheduler 就像 OS Scheduler的分层或流程图
36. Scheduler 就像 OS Scheduler

然后调度 Agent。

这才真正接近:

Agent OS

37. 最终我会把整个平台分成 Control Plane / Data Plane

这个来自 Kubernetes,也是我觉得最合适的架构。

Control Plane

Control Plane的分层或流程图
Control Plane

负责:

decide

Execution Plane

Execution Plane的分层或流程图
Execution Plane

负责:

execute

结构:

Execution Plane的架构或流程图
Execution Plane

38. 如果是个人开发者,我不会第一天全部实现

“最理想架构”和“第一版应该怎么做”是两回事。

我会分四阶段。

V1

V1的分层或流程图
V1

先实现:

V1的分层或流程图
V1

V2

加:

V2的分层或流程图
V2

此时已经:

production capable

V3

加:

V3的分层或流程图
V3

开始拥有:

长期智能

V4

加:

V4的分层或流程图
V4

这时候才真正:

Agent Platform / Agent OS

39. 如果只能选一个我认为“最佳组合”

我会这样定:

39. 如果只能选一个我认为“最佳组合”的架构或流程图
39. 如果只能选一个我认为“最佳组合”

这就是我目前认为最干净的一套。


40. 为什么不是直接采用 OpenClaw + Codex + LangGraph + Letta 全堆起来?

因为那样会产生:

40. 为什么不是直接采用 OpenClaw + Codex + LangGraph + Letta 全堆起来?的分层或流程图
40. 为什么不是直接采用 OpenClaw + Codex + LangGraph + Letta 全堆起来?

典型结果:

谁才是真实状态?

所以核心原则是:

同一种职责只允许一个 canonical owner。

例如:

40. 为什么不是直接采用 OpenClaw + Codex + LangGraph + Letta 全堆起来?的架构或流程图
40. 为什么不是直接采用 OpenClaw + Codex + LangGraph + Letta 全堆起来?

不要重复。


41. 这是整个架构最重要的一张“职责表”

问题 谁负责
Agent 下一步做什么? LLM
Agent 如何循环? Agent Runtime
Agent 正在执行到哪里? Temporal
当前 Task 状态? PostgreSQL
Agent 长期记得什么? Memory
Agent 看哪些上下文? Context Engine
Agent 能用什么? Capability Registry
Agent 是否允许执行? Policy Engine
命令在哪里运行? Sandbox
外部 Tool 怎么接? MCP
其他 Agent 怎么接? A2A
IDE 怎么接 Agent? ACP
谁在操作? Identity/IAM
如何恢复? Checkpoint / Temporal
如何验证正确性? Verifier
如何 Debug? OTel / Langfuse
Agent 如何主动工作? Event/Scheduler
Agent之间交换什么? Artifact

只要这张表不混乱,整个系统基本不会失控。


42. 最终形态其实已经很像“AI Kubernetes + Temporal + Unix”

我会用三个系统来理解:

Unix

提供:

Unix的分层或流程图
Unix

映射:

Unix的分层或流程图
Unix

Kubernetes

提供:

Kubernetes的分层或流程图
Kubernetes

映射:

Kubernetes的分层或流程图
Kubernetes

Temporal

提供:

Temporal的分层或流程图
Temporal

映射:

Long-running Agent Task

所以一个真正理想的 Agent OS,其实可以概括为:

Temporal的分层或流程图
Temporal

再在边界上放:

ACP / MCP / A2A

再给它:

Graphiti-style memory

这基本就是我认为目前理论上最漂亮、而且今天大部分组件已经能实际搭出来的体系。


最后一个非常重要的判断

如果你真准备自己做,我认为最大的错误会是:

“先实现一个万能 Agent。”

更正确的起点是:

最后一个非常重要的判断的分层或流程图
最后一个非常重要的判断

然后 Agent 本身只是这个系统中一种:

probabilistic worker

一旦这么设计,未来接:

最后一个非常重要的判断的分层或流程图
最后一个非常重要的判断

都只是 adapter,而不是重写系统。

这就是我目前认为最理想的 Agent OS / Agent Cloud 架构。