Pi 整合架構
本文件描述 OpenClaw 如何與 pi-coding-agent 及其兄弟套件(pi-ai、pi-agent-core、pi-tui)整合以支援其 AI 代理能力。
概述
OpenClaw 使用 pi SDK 將 AI 編碼代理嵌入到其訊息網關架構中。OpenClaw 不是生成 pi 作為子進程或使用 RPC 模式,而是直接導入並透過createAgentSession() 實例化 pi 的 AgentSession。此嵌入式方法提供:
- 對會話生命週期和事件處理的完全控制
- 自訂工具注入(訊息、沙盒、頻道特定操作)
- 系統提示詞按頻道/上下文自訂
- 具有分支/壓縮支援的會話持續性
- 具有容錯轉移的多帳戶認證檔案輪換
- 提供商不知道的模型交換
套件相依性
| 套件 | 目的 |
|---|---|
pi-ai | 核心 LLM 抽象:Model、streamSimple、訊息類型、提供商 API |
pi-agent-core | 代理迴圈、工具執行、AgentMessage 類型 |
pi-coding-agent | 高階 SDK:createAgentSession、SessionManager、AuthStorage、ModelRegistry、內建工具 |
pi-tui | 終端機 UI 元件(在 OpenClaw 的本地 TUI 模式中使用) |
檔案結構
核心整合流
1. 執行嵌入式代理
主入口點是pi-embedded-runner/run.ts 中的 runEmbeddedPiAgent():
2. 會話建立
在runEmbeddedAttempt()(由 runEmbeddedPiAgent() 呼叫)內,使用 pi SDK:
3. 事件訂閱
subscribeEmbeddedPiSession() 訂閱 pi 的 AgentSession 事件:
message_start/message_end/message_update(串流文本/思考)tool_execution_start/tool_execution_update/tool_execution_endturn_start/turn_endagent_start/agent_endauto_compaction_start/auto_compaction_end
4. 提示詞
設定後,會話被提示:images 傳遞。它不會重新掃描舊版歷史轉向以重新注入影像負載。
工具架構
工具管道
- 基本工具:pi 的
codingTools(read、bash、edit、write) - 自訂替換:OpenClaw 使用
exec/process替換 bash,為沙盒自訂 read/edit/write - OpenClaw 工具:訊息、瀏覽器、畫布、會話、cron、網關等
- 頻道工具:Discord/Telegram/Slack/WhatsApp 特定操作工具
- 原則篩選:工具按檔案、提供商、代理、群組、沙盒原則篩選
- 架構規範化:為 Gemini/OpenAI 怪癖清理架構
- AbortSignal 包裝:包裝工具以尊重中止信號
工具定義適配器
pi-agent-core 的AgentTool 具有與 pi-coding-agent 的 ToolDefinition 不同的 execute 簽章。pi-tool-definition-adapter.ts 中的適配器橋接:
工具分割策略
splitSdkTools() 通過 customTools 傳遞所有工具:
系統提示詞構造
系統提示詞在buildAgentSystemPrompt()(system-prompt.ts)中構建。它組裝一個完整提示詞,包含工具、工具呼叫風格、安全護欄、OpenClaw CLI 參考、技能、文件、工作區、沙盒、訊息、回覆標籤、語音、無聲回覆、心跳、運行時元數據、加記憶體和反應(啟用時)、加選擇性上下文檔案和額外系統提示詞內容。對子代理使用的最小提示詞模式調整部分。
提示詞在會話建立後通過 applySystemPromptOverrideToSession() 應用:
會話管理
會話檔案
會話是具有樹結構(id/parentId 連結)的 JSONL 檔案。Pi 的SessionManager 處理持續性:
guardSessionManager() 包裝此以確保工具結果安全。
會話快取
session-manager-cache.ts 快取 SessionManager 實例以避免重複檔案解析:
歷史限制
limitHistoryTurns() 根據頻道類型(DM vs 群組)修剪對話歷史。
壓縮
自動壓縮在上下文溢位時觸發。compactEmbeddedPiSessionDirect() 處理手動壓縮:
認證和模型解析
認證檔案
OpenClaw 維護認證檔案儲存,每個提供商有多個 API 金鑰:模型解析
容錯轉移
FailoverError 在配置時觸發模型降級:
Pi 延伸
OpenClaw 加載自訂 pi 延伸以實現專門行為:壓縮保護
src/agents/pi-extensions/compaction-safeguard.ts 添加壓縮護欄,包括自適應 token 預算加工具失敗和檔案操作摘要:
上下文修剪
src/agents/pi-extensions/context-pruning.ts 實作快取 TTL 基礎上下文修剪:
串流和塊回覆
塊分塊
EmbeddedBlockChunker 管理串流文本到離散回覆塊:
思考/最終標籤剝離
串流輸出被處理以剝離<think>/<thinking> 塊和提取 <final> 內容:
回覆指示
回覆指示如[[media:url]]、[[voice]]、[[reply:id]] 被解析和提取:
錯誤處理
錯誤分類
pi-embedded-helpers.ts 分類錯誤以適當處理:
思考層級降級
如果思考層級不受支援,它會降級:沙盒整合
啟用沙盒模式後,工具和路徑受限:提供商特定處理
Anthropic
- 拒絕魔法字符串清理
- 連續角色轉向驗證
- Claude Code 參數相容性
Google/Gemini
- 轉向順序修復(
applyGoogleTurnOrderingFix) - 工具架構清理(
sanitizeToolsForGoogle) - 會話歷史清理(
sanitizeSessionHistory)
OpenAI
- Codex 模型的
apply_patch工具 - 思考層級降級處理
TUI 整合
OpenClaw 也有直接使用 pi-tui 元件的本地 TUI 模式:Pi CLI 的關鍵差異
| 方面 | Pi CLI | OpenClaw 嵌入式 |
|---|---|---|
| 調用 | pi 命令 / RPC | SDK 通過 createAgentSession() |
| 工具 | 預設編碼工具 | 自訂 OpenClaw 工具套件 |
| 系統提示詞 | AGENTS.md + 提示詞 | 按頻道/上下文動態 |
| 會話儲存 | ~/.pi/agent/sessions/ | ~/.openclaw/agents/<agentId>/sessions/(或 $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/) |
| 認證 | 單一認證 | 具有輪換的多檔案 |
| 延伸 | 從磁碟加載 | 程式設計加磁碟路徑 |
| 事件處理 | TUI 呈現 | 回呼基礎(onBlockReply 等) |
未來考慮
潛在重做的領域:- 工具簽章對齊:目前在 pi-agent-core 和 pi-coding-agent 簽章間調整
- 會話管理器包裝:
guardSessionManager添加安全性但增加複雜性 - 延伸加載:可以更直接地使用 pi 的
ResourceLoader - 串流處理程式複雜性:
subscribeEmbeddedPiSession已變大 - 提供商怪癖:許多提供商特定代碼路徑 pi 可能能夠處理
測試
Pi 整合涵蓋範圍跨越這些套件:src/agents/pi-*.test.tssrc/agents/pi-auth-json.test.tssrc/agents/pi-embedded-*.test.tssrc/agents/pi-embedded-helpers*.test.tssrc/agents/pi-embedded-runner*.test.tssrc/agents/pi-embedded-runner/**/*.test.tssrc/agents/pi-embedded-subscribe*.test.tssrc/agents/pi-tools*.test.tssrc/agents/pi-tool-definition-adapter*.test.tssrc/agents/pi-settings.test.tssrc/agents/pi-extensions/**/*.test.ts
src/agents/pi-embedded-runner-extraparams.live.test.ts(啟用OPENCLAW_LIVE_TEST=1)