生成模型:Claude Opus 4.6 (anthropic/claude-opus-4-6) Token 消耗:输入 ~350,000 tokens,输出 ~28,000 tokens(本章合计)
在前几章中,我们了解了 Gateway 如何接收消息、路由到正确的会话、以及通道层如何处理消息的入站和出站。但真正的"AI 对话"发生在哪里?答案是 Pi Agent 运行时。Pi Agent 是 OpenClaw 中负责与大语言模型(LLM)交互的核心引擎——它构建对话上下文、发送请求到模型提供者、处理流式回复、执行工具调用,并将最终结果返回给 Gateway。
衍生解释:Pi Agent 是 OpenClaw 的 AI 推理运行时,源自 Mario Zechner 开发的 pi-agent-core 库。它实现了 LLM 的 RPC 调用模式,负责管理对话上下文、工具调用和响应流式传输。可以类比为一个"AI 对话引擎"——就像浏览器中的 JavaScript 引擎负责执行代码一样,Pi Agent 负责执行 AI 对话的每一轮。
7.1.1 @mariozechner/pi-agent-core / pi-ai / pi-coding-agent 依赖分析
OpenClaw 的 Agent 运行时构建在三个关键的外部包之上:
@mariozechner/pi-agent-core
提供 LLM 对话循环、消息格式化、工具调用协议、会话持久化
对接各个 LLM 提供者的 API(Anthropic、OpenAI、Google 等)
提供代码执行、文件操作、终端交互等编程工具的底层实现
这三个包形成了层次化的依赖关系:
OpenClaw 的 Agent 代码 (src/agents/)
├── @mariozechner/pi-agent-core ← 对话循环引擎
│ └── pi-ai ← LLM API 适配层
└── pi-coding-agent ← 编程工具底层
pi-agent-core 定义了 Agent 运行时的核心抽象:
Session(会话)——对话历史的持久化容器,存储为 JSONL 文件
Tool(工具)——Agent 可以调用的外部能力,使用 JSON Schema 定义输入输出
Provider(提供者)——LLM API 的统一接口,支持流式和非流式调用
Extension(扩展)——在对话循环的特定阶段注入自定义逻辑的钩子
OpenClaw 并不直接使用这些包的高级 API,而是通过嵌入模式深度集成它们,在 src/agents/ 目录下构建了自己的运行时封装层。
7.1.2 RPC 模式 vs 嵌入模式
Pi Agent 支持两种运行模式:
在 RPC 模式下,Pi Agent 作为一个独立的子进程运行。Gateway 通过标准输入/输出(stdin/stdout)或 HTTP 与其通信:
这种模式的优点是进程隔离——Agent 崩溃不会影响 Gateway。但缺点是跨进程通信的开销较大,且无法直接共享内存中的状态。
在嵌入模式下,Pi Agent 的代码直接在 Gateway 进程内运行。这是 OpenClaw 当前的默认模式:
嵌入模式的优点:
共享状态——可以直接访问 Gateway 的配置、会话存储和事件系统
在 OpenClaw 的源码中,isCliProvider 函数用于判断是否需要以独立 CLI 进程(RPC 模式)运行:
大多数提供者(Anthropic、OpenAI、Google 等)使用嵌入模式,只有少数特殊提供者(如 Claude CLI、Codex)使用 RPC 模式。
7.1.3 Agent 入口文件层次
OpenClaw 的 Agent 入口文件采用了层层剥洋葱的结构,从高级到低级依次为:
第一层:pi-embedded.ts——纯粹的重导出文件,提供稳定的公共 API:
第二层:pi-embedded-runner.ts——聚合层,将分散在子目录中的实现统一导出:
第三层:pi-embedded-runner/ 子目录——实际实现所在。其中最核心的是 run.ts,它包含了 runEmbeddedPiAgent 函数——整个 Agent 循环的入口点。
Agent 运行的输入输出由以下类型定义:
这些类型体现了 OpenClaw 对 Agent 运行结果的完整建模——不仅包含回复文本,还包含执行耗时、Token 用量、是否被中止、是否出错等元信息,为上层的用量统计和错误恢复提供了必要的数据。
Pi Agent 是 OpenClaw 的 AI 对话引擎,构建在 pi-agent-core、pi-ai、pi-coding-agent 三个外部库之上。
Agent 运行支持 RPC 模式(独立子进程)和嵌入模式(同进程),OpenClaw 默认使用嵌入模式以获得零序列化开销和共享状态的优势。
Agent 入口代码采用三层结构:公共 API 导出层 → 模块聚合层 → 子目录实现层,核心函数是 runEmbeddedPiAgent()。
EmbeddedPiRunResult 类型完整建模了 Agent 运行的所有输出,包括回复内容、元数据、错误信息和用量统计。