OpenClaw 的核心引擎——從週末小專案到驅動萬人使用的 AI Agent 框架
Pi(全稱 pi-coding-agent)是由奧地利開發者 Mario Zechner(badlogic)開發的開源 AI Agent Toolkit,以 MIT 授權發布。它不只是一個終端工具,而是一套完整的 AI Agent 基礎設施——從統一 LLM API 到 Session 管理、工具執行、Token 壓縮,一應俱全。
Pi 的官方網站幽默地命名為 shittycodingagent.ai,但實際上它已成為 OpenClaw 等大型專案的核心引擎,每天服務全球數萬名用戶。
🦞 關鍵事實:OpenClaw 在 package.json 中直接將 Pi 的四個套件列為核心依賴(版本 0.55.0),Pi 不是插件,而是 OpenClaw 的地基。
Pi 以 Monorepo 形式管理,儲存庫位於 github.com/badlogic/pi-mono,包含七個獨立套件,各自解決 AI Agent 開發的不同面向。
| 套件名稱 | 功能說明 | OpenClaw 用途 |
|---|---|---|
| @mariozechner/pi-ai | 統一多 Provider LLM API(OpenAI、Anthropic、Google 等),提供 complete、streamSimple 等核心函式 |
✅ 所有 LLM 呼叫的底層,Model Fallback 機制 |
| @mariozechner/pi-coding-agent | 互動式 Coding Agent CLI,含 Session 管理、工具集(read/write/edit/bash)、Token 估算、摘要壓縮 | ✅ Session 狀態管理、Agent 工具執行核心 |
| @mariozechner/pi-agent-core | Agent 執行框架,處理 tool calling 迴圈與狀態機 | ✅ Agentic Loop 的執行引擎 |
| @mariozechner/pi-tui | 終端 UI 函式庫,採用差分渲染技術 | ✅ CLI 介面渲染 |
| @mariozechner/pi-mom | Slack Bot,將訊息委派給 Pi Coding Agent 處理 | — 獨立使用 |
| @mariozechner/pi-web-ui | Web Components 形式的 AI 聊天介面元件庫 | — 獨立使用 |
| @mariozechner/pi-pods | 管理 vLLM GPU Pod 部署的 CLI 工具 | — 獨立使用 |
透過分析 OpenClaw 的 dist/pi-embedded-BDhvoWGL.js,可以清楚看到 Pi 在 OpenClaw 中扮演的角色——它不是插件,而是骨幹。
pi-ai 的 complete()、streamSimple() 是 OpenClaw 所有 LLM 呼叫的底層函式,無論用戶設定的是 Claude、GPT 還是 Gemini,都走同一條路徑。
SessionManager(來自 pi-coding-agent)負責維護對話歷史,讓用戶在重啟 OpenClaw 後仍能延續對話。同時管理 Session 版本控制與 transcript 檔案。
codingTools、createReadTool、createWriteTool、createEditTool 直接提供了 OpenClaw 的 Read/Write/Edit 工具實作基礎,讓 AI 能夠操作本機檔案系統。
當對話 Context 過長時,generateSummary() 和 estimateTokens() 負責壓縮舊訊息為摘要,避免超出 LLM 的 Context Window 限制。
ModelRegistry 和 AuthStorage 負責探索可用模型、管理認證資訊,讓 OpenClaw 能動態切換不同 LLM Provider 和帳戶。
createAgentSession() 建立完整的 Agent 執行環境,包含工具綁定、系統提示注入、資源載入(DefaultResourceLoader)等,是每次 AI 回應的起點。
OpenClaw 採用清晰的分層設計,Pi 位於中間層,承上啟下:
分工原則:Pi 負責「跟 LLM 說話」和「管理對話狀態」;OpenClaw 負責「接收人類訊息」和「決定怎麼回應」。兩者深度整合,不是鬆散的插件關係。
每次你向 OpenClaw 發送訊息,背後都會觸發一個由 Pi 引擎驅動的 Agentic Loop。以下是完整流程:
Gateway 接收到 Telegram 訊息後,SessionManager(pi-coding-agent)載入對應的對話歷史,確保 AI 記得之前說過什麼。
注入系統提示(SOUL.md、AGENTS.md、Skills)、記憶檔案、工作區快照。若 Context 過長,generateSummary() 自動壓縮舊訊息。
透過 streamSimple() 呼叫 LLM,支援串流輸出。若主 Provider 失敗,runWithModelFallback() 自動切換備援模型。
// pi-ai 核心呼叫
import { complete, streamSimple } from "@mariozechner/pi-ai";
const result = await streamSimple(model, {
messages, // 對話歷史
tools, // 可用工具清單
system // 系統提示
});
LLM 若呼叫工具(exec、read、web_fetch 等),OpenClaw 執行工具後將結果附加到訊息串,再次呼叫 LLM。此迴圈持續到 LLM 不再呼叫工具為止。
// Agentic Loop 核心邏輯(簡化)
while (true) {
const response = await streamSimple(model, { messages });
if (!response.toolCalls?.length) break; // 沒有工具呼叫 → 結束
for (const call of response.toolCalls) {
const result = await executeTool(call); // 執行工具
messages.push({ role: "tool", content: result }); // 回饋
}
}
最終回應透過 OpenClaw 的 Channel 層送回 Telegram/Discord 等平台,Session 狀態由 SessionManager 持久化到磁碟。
🛡️ Loop 防護:OpenClaw 內建 Tool Loop Detection,追蹤最近 30 次工具呼叫的模式。若偵測到重複呼叫(警告門檻:10次,熔斷門檻:30次),會強制中斷迴圈,防止無限循環。
Pi 不只是 OpenClaw 的內部元件,你也可以獨立安裝並使用它作為 Coding Agent CLI:
# 安裝
npm install -g @mariozechner/pi-coding-agent
# 基本使用
pi '幫我分析這個專案的結構'
# 非互動模式
pi -p 'Summarize src/'
# 指定 Provider 和 Model
pi --provider anthropic --model claude-sonnet-4-5 -p 'Your task'
pi --provider openai --model gpt-4o-mini -p 'Your task'
pi --provider google --model gemini-2.0-flash -p 'Your task'