OpenClaw 集成了 pi-coding-agent 及其配套包来驱动 AI Agent 能力。本文深度解析这套嵌入式架构的设计原理。
核心设计:嵌入式而非子进程
OpenClaw 直接导入并实例化 pi 的 AgentSession(通过 createAgentSession()),而不是将 pi 作为子进程或 RPC 模式调用。这种嵌入式方案带来了:
- 完整的 Session 生命周期控制和事件处理
- 自定义工具注入(消息、沙箱、频道专属操作)
- 按频道/上下文动态定制系统提示
- Session 持久化,支持分支和压缩
- 多账号认证轮换和故障转移
- 模型无关的提供商切换
依赖包结构
| 包 | 用途 |
|---|---|
pi-ai | 核心 LLM 抽象:Model、streamSimple、消息类型、提供商 API |
pi-agent-core | Agent 循环、工具执行、AgentMessage 类型 |
pi-coding-agent | 高级 SDK:createAgentSession、SessionManager、AuthStorage、内置工具 |
pi-tui | 终端 UI 组件(用于 OpenClaw 本地 TUI 模式) |
核心集成流程
1. 运行嵌入式 Agent
typescript
import { runEmbeddedPiAgent } from "./agents/pi-embedded-runner.js";
const result = await runEmbeddedPiAgent({
sessionId: "user-123",
sessionKey: "main:whatsapp:+1234567890",
sessionFile: "/path/to/session.jsonl",
workspaceDir: "/path/to/workspace",
config: openclawConfig,
prompt: "你好,今天天气怎么样?",
provider: "anthropic",
model: "claude-sonnet-4-20250514",
timeoutMs: 120_000,
runId: "run-abc",
onBlockReply: async (payload) => {
await sendToChannel(payload.text, payload.mediaUrls);
},
});2. Session 创建
typescript
const { session } = await createAgentSession({
cwd: resolvedWorkspace,
agentDir,
authStorage: params.authStorage,
modelRegistry: params.modelRegistry,
model: params.model,
thinkingLevel: mapThinkingLevel(params.thinkLevel),
tools: builtInTools,
customTools: allCustomTools,
sessionManager,
});
applySystemPromptOverrideToSession(session, systemPromptOverride);3. 事件订阅
typescript
const subscription = subscribeEmbeddedPiSession({
session: activeSession,
runId: params.runId,
onBlockReply: params.onBlockReply,
onPartialReply: params.onPartialReply,
onAgentEvent: params.onAgentEvent,
});处理的事件包括:
message_start/end/update(文本和思考流式传输)tool_execution_start/update/endturn_start/endagent_start/endauto_compaction_start/end
工具架构:五级流水线
1. 基础工具(pi 的 codingTools:read/bash/edit/write)
↓
2. 自定义替换(OpenClaw 替换 bash 为 exec/process,自定义 read/edit/write 支持沙箱)
↓
3. OpenClaw 专属工具(messaging/browser/canvas/sessions/cron/gateway 等)
↓
4. 频道工具(Discord/Telegram/Slack/WhatsApp 特定操作)
↓
5. 策略过滤(按 profile/provider/agent/group/sandbox 策略过滤)
工具分发策略
splitSdkTools() 将所有工具通过 customTools 传递:
typescript
export function splitSdkTools(options) {
return {
builtInTools: [], // 空,我们覆盖所有工具
customTools: toToolDefinitions(options.tools),
};
}这确保 OpenClaw 的策略过滤、沙箱集成和扩展工具集在所有提供商中保持一致。
认证与模型解析
多认证配置文件
OpenClaw 为每个提供商维护多个 API Key 的认证配置:
typescript
const authStore = ensureAuthProfileStore(agentDir, { allowKeychainPrompt: false });
const profileOrder = resolveAuthProfileOrder({ cfg, store: authStore, provider, preferredProfile });故障时自动轮换,带冷却时间追踪:
typescript
await markAuthProfileFailure({ store, profileId, reason });
const rotated = await advanceAuthProfile();故障转移
FailoverError 在配置时触发模型回退:
typescript
if (fallbackConfigured && isFailoverErrorMessage(errorText)) {
throw new FailoverError(errorText, {
reason: "auth" | "rate_limit" | "quota" | "timeout",
provider, model: modelId, profileId,
});
}流式回复与分块
Block 分块
EmbeddedBlockChunker 将流式文本切割为独立的回复块:
typescript
const blockChunker = blockChunking ? new EmbeddedBlockChunker(blockChunking) : null;思考/最终标签剥离
流式输出会自动处理 <think>...</think> 块,并提取 <final>...</final> 内容:
typescript
const stripBlockTags = (text: string, state: { thinking: boolean; final: boolean }) => {
// 剥离 <think>...</think> 内容
// 如果启用 enforceFinalTag,只返回 <final>...</final> 内容
};回复指令
[[media:url]]、[[voice]]、[[reply:id]] 等指令被自动解析:
typescript
const { text, mediaUrls, audioAsVoice, replyToId } = consumeReplyDirectives(chunk);与 Pi CLI 的关键区别
| 方面 | Pi CLI | OpenClaw 嵌入式 |
|---|---|---|
| 调用方式 | pi 命令 / RPC | 通过 SDK 的 createAgentSession() |
| 工具集 | 默认编码工具 | OpenClaw 自定义工具套件 |
| 系统提示 | AGENTS.md + 提示词 | 按频道/上下文动态生成 |
| Session 存储 | ~/.pi/agent/sessions/ | ~/.openclaw/agents/<agentId>/sessions/ |
| 认证 | 单一凭证 | 多配置文件轮换 |
| 扩展 | 从磁盘加载 | 编程式 + 磁盘路径混合 |
| 事件处理 | TUI 渲染 | 基于回调(onBlockReply 等) |
各提供商特殊处理
| 提供商 | 特殊处理 |
|---|---|
| Anthropic | 拒绝魔法字符串清理、连续角色校验、Claude Code 参数兼容 |
| Google/Gemini | 对话顺序修复、工具 Schema 净化、Session 历史净化 |
| OpenAI | apply_patch 工具支持 Codex 模型、思考级别降级处理 |
原文:Pi Integration Architecture - OpenClaw | 来源:OpenClaw 官方文档