Pi統合アーキテクチャ
このドキュメントでは、OpenClawが pi-coding-agent とその兄弟パッケージ(pi-ai、pi-agent-core、pi-tui)をどのように統合してAI agent機能を実現しているかを説明します。
概要
OpenClawは、メッセージングGatewayアーキテクチャ内にAI coding agentを埋め込むためにpi SDKを使用します。piをsubprocessとして起動したりRPC modeを使ったりする代わりに、OpenClawはcreateAgentSession() を介してpiの AgentSession を直接importしてインスタンス化します。この埋め込み方式には次の利点があります。
- sessionライフサイクルとevent handlingを完全に制御できる
- カスタムtool注入(messaging、sandbox、channel固有action)
- channel/contextごとのsystem promptカスタマイズ
- branching/compactionを備えたsession永続化
- failover付きのmulti-account auth profile rotation
- providerに依存しないmodel切り替え
パッケージ依存関係
| Package | 用途 |
|---|---|
pi-ai | コアLLM抽象化: Model、streamSimple、message型、provider API |
pi-agent-core | agent loop、tool execution、AgentMessage 型 |
pi-coding-agent | 高レベルSDK: createAgentSession、SessionManager、AuthStorage、ModelRegistry、組み込みtools |
pi-tui | ターミナルUIコンポーネント(OpenClawのローカルTUI modeで使用) |
ファイル構成
src/agents/tools 配下ではなくplugin所有のextension directoryにあります。たとえば次のものです。
- Discord plugin action runtimeファイル
- Slack plugin action runtimeファイル
- Telegram plugin action runtimeファイル
- WhatsApp plugin action runtimeファイル
コア統合フロー
1. 埋め込みagentの実行
メインエントリーはpi-embedded-runner/run.ts 内の runEmbeddedPiAgent() です。
2. Session作成
runEmbeddedPiAgent() から呼ばれる runEmbeddedAttempt() の内部では、pi SDKが使われます。
3. Event購読
subscribeEmbeddedPiSession() はpiの AgentSession eventを購読します。
message_start/message_end/message_update(streaming text/thinking)tool_execution_start/tool_execution_update/tool_execution_endturn_start/turn_endagent_start/agent_endauto_compaction_start/auto_compaction_end
4. Prompting
セットアップ後、sessionへpromptが送られます。images 経由で渡します。古いhistory turnを再走査してimage payloadを再注入することはありません。
Toolアーキテクチャ
Toolパイプライン
- Base Tools: piの
codingTools(read、bash、edit、write) - Custom Replacements: OpenClawがbashを
exec/processに置き換え、read/edit/writeをsandbox向けにカスタマイズ - OpenClaw Tools: messaging、browser、canvas、sessions、cron、gatewayなど
- Channel Tools: Discord/Telegram/Slack/WhatsApp固有action tool
- Policy Filtering: profile、provider、agent、group、sandbox policyでtoolsをフィルタリング
- Schema Normalization: Gemini/OpenAIの癖に合わせてschemaを整形
- AbortSignal Wrapping: abort signalを尊重するようtoolをラップ
Tool Definition Adapter
pi-agent-coreのAgentTool は、pi-coding-agentの ToolDefinition と execute シグネチャが異なります。pi-tool-definition-adapter.ts のadapterがこれを橋渡しします。
Tool Split戦略
splitSdkTools() はすべてのtoolを customTools 経由で渡します。
System Prompt構築
system promptはbuildAgentSystemPrompt()(system-prompt.ts)で構築されます。Tooling、Tool Call Style、Safety guardrail、OpenClaw CLI reference、Skills、Docs、Workspace、Sandbox、Messaging、Reply Tags、Voice、Silent Replies、Heartbeats、Runtime metadata、さらに有効時にはMemoryとReactions、任意のcontext fileと追加system prompt contentを含む完全なpromptを組み立てます。sectionはsubagentで使われるminimal prompt mode向けに削減されます。
promptはsession作成後に applySystemPromptOverrideToSession() を介して適用されます。
Session管理
Sessionファイル
sessionはtree構造(id/parentIdリンク)を持つJSONLファイルです。piのSessionManager が永続化を処理します。
guardSessionManager() でラップし、tool resultの安全性を高めています。
Sessionキャッシュ
session-manager-cache.ts は、ファイルの再解析を避けるためにSessionManagerインスタンスをキャッシュします。
履歴制限
limitHistoryTurns() は、channel種別(DM対group)に応じて会話履歴を切り詰めます。
Compaction
auto-compactionはcontext overflow時に発動します。一般的なoverflowシグネチャにはrequest_too_large、context length exceeded、input exceeds the maximum number of tokens、input token count exceeds the maximum number of input tokens、input is too long for the model、ollama error: context length exceeded があります。compactEmbeddedPiSessionDirect() が手動
compactionを処理します。
認証とModel解決
Auth Profile
OpenClawは、providerごとに複数のAPI keyを持つauth profileストアを維持します。Model解決
Failover
FailoverError は、設定されている場合にmodel fallbackを発動します。
Pi extension
OpenClawは、特化した動作のためにカスタムpi extensionを読み込みます。Compaction Safeguard
src/agents/pi-hooks/compaction-safeguard.ts は、adaptive token budgetingとtool failureおよびfile operation summaryを含むcompaction guardrailを追加します。
Context Pruning
src/agents/pi-hooks/context-pruning.ts は、cache-TTLベースのcontext pruningを実装します。
StreamingとBlock Reply
Block Chunking
EmbeddedBlockChunker は、streaming textを個別のreply blockへまとめる処理を行います。
Thinking/Final tag除去
streaming出力は、<think>/<thinking> blockを除去し、<final> contentを抽出するよう処理されます。
Reply Directive
[[media:url]]、[[voice]]、[[reply:id]] などのreply directiveは解析され、抽出されます。
Error Handling
Error分類
pi-embedded-helpers.ts は、適切に処理するためにerrorを分類します。
Thinking Level fallback
thinking levelが未対応の場合はfallbackします。Sandbox統合
sandbox modeが有効なときは、toolとpathが制約されます。Provider固有の処理
Anthropic
- refusal magic stringの除去
- 連続role向けturn検証
- Claude Code parameter互換性
Google/Gemini
- plugin所有のtool schema sanitization
OpenAI
- Codex model向け
apply_patchtool - thinking level downgrade処理
TUI統合
OpenClawには、pi-tuiコンポーネントを直接使うローカルTUI modeもあります。Pi CLIとの主な違い
| Aspect | Pi CLI | OpenClaw Embedded |
|---|---|---|
| Invocation | pi command / RPC | createAgentSession() 経由のSDK |
| Tools | デフォルトcoding tools | カスタムOpenClaw toolスイート |
| System prompt | AGENTS.md + prompts | channel/contextごとに動的 |
| Session storage | ~/.pi/agent/sessions/ | ~/.openclaw/agents/<agentId>/sessions/(または $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/) |
| Auth | 単一資格情報 | rotation付きmulti-profile |
| Extensions | ディスクから読み込み | プログラム的指定 + ディスクpath |
| Event handling | TUI描画 | callbackベース(onBlockReplyなど) |
今後の検討事項
将来的に再設計の可能性がある領域:- Toolシグネチャ整合: 現在はpi-agent-coreとpi-coding-agentのシグネチャをadapterで橋渡ししている
- Session managerラップ:
guardSessionManagerは安全性を追加する一方で複雑さも増している - Extension読み込み: piの
ResourceLoaderをより直接使える可能性がある - Streaming handlerの複雑化:
subscribeEmbeddedPiSessionが大きくなってきている - Providerの癖: 多くのprovider固有コードパスがあり、pi側で処理できる可能性がある
テスト
Pi統合のカバレッジは次のsuiteにまたがっています。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-hooks/**/*.test.ts
src/agents/pi-embedded-runner-extraparams.live.test.ts(OPENCLAW_LIVE_TEST=1を有効化)