Pi統合アーキテクチャ
このドキュメントでは、OpenClawが pi-coding-agent とその兄弟パッケージ(pi-ai、pi-agent-core、pi-tui)をどのように統合し、AIエージェント機能を実現しているかを説明します。
概要
OpenClawはpi SDKを使用して、AIコーディングエージェントをそのメッセージングGatewayアーキテクチャに埋め込んでいます。piをサブプロセスとして起動したりRPCモードを使用したりする代わりに、OpenClawはcreateAgentSession() を通じてpiの AgentSession を直接importしてインスタンス化します。この埋め込み方式により、次の利点が得られます。
- セッションライフサイクルとイベント処理を完全に制御できる
- カスタムツール注入(メッセージング、sandbox、チャンネル固有アクション)
- チャンネル/コンテキストごとのシステムプロンプトカスタマイズ
- 分岐/コンパクション対応のセッション永続化
- フェイルオーバー付きマルチアカウント認証プロファイルローテーション
- providerに依存しないモデル切り替え
パッケージ依存関係
| Package | 目的 |
|---|---|
pi-ai | コアLLM抽象化: Model、streamSimple、メッセージ型、provider API |
pi-agent-core | エージェントループ、tool実行、AgentMessage 型 |
pi-coding-agent | 高レベルSDK: createAgentSession、SessionManager、AuthStorage、ModelRegistry、組み込みツール |
pi-tui | ターミナルUIコンポーネント(OpenClawのローカルTUIモードで使用) |
ファイル構成
src/agents/tools 配下ではなく、プラグイン所有の拡張ディレクトリにあります。たとえば次のものです。
- Discordプラグインのアクションランタイムファイル
- Slackプラグインのアクションランタイムファイル
- Telegramプラグインのアクションランタイムファイル
- WhatsAppプラグインのアクションランタイムファイル
コア統合フロー
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はbashを
exec/processに置き換え、sandbox向けにread/edit/writeをカスタマイズ - OpenClawツール: messaging、browser、canvas、sessions、cron、gateway など
- チャンネルツール: Discord/Telegram/Slack/WhatsApp 固有アクションツール
- ポリシーフィルタリング: ツールをprofile、provider、agent、group、sandbox ポリシーでフィルタリング
- スキーマ正規化: Gemini/OpenAIの癖に合わせてスキーマをクリーンアップ
- AbortSignalラッピング: toolがabort signalを尊重するようラップ
ツール定義アダプター
pi-agent-core のAgentTool は、pi-coding-agent の ToolDefinition と異なる execute シグネチャを持ちます。pi-tool-definition-adapter.ts のアダプターがこれを橋渡しします。
ツール分割戦略
splitSdkTools() はすべてのツールを customTools 経由で渡します。
システムプロンプト構築
システムプロンプトはbuildAgentSystemPrompt()(system-prompt.ts)で構築されます。Tooling、Tool Call Style、安全ガードレール、OpenClaw CLIリファレンス、Skills、Docs、Workspace、Sandbox、Messaging、Reply Tags、Voice、Silent Replies、Heartbeats、Runtime metadata、さらに有効時には Memory と Reactions、および任意のコンテキストファイルと追加システムプロンプト内容を含む完全なプロンプトを組み立てます。サブエージェントで使われる最小プロンプトモード用にはセクションが削減されます。
プロンプトは、セッション作成後に applySystemPromptOverrideToSession() を通じて適用されます。
セッション管理
セッションファイル
セッションはツリー構造(id/parentIdリンク)を持つJSONLファイルです。piのSessionManager が永続化を処理します。
guardSessionManager() でラップし、tool結果の安全性を高めています。
セッションキャッシュ
session-manager-cache.ts は、繰り返しのファイル解析を避けるために SessionManager インスタンスをキャッシュします。
履歴制限
limitHistoryTurns() は、チャンネル種別(DM対グループ)に基づいて会話履歴をトリミングします。
コンパクション
自動コンパクションはコンテキストあふれ時に起動します。一般的なオーバーフローのシグネチャには、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() は手動コンパクションを処理します。
認証とモデル解決
認証プロファイル
OpenClawはproviderごとに複数APIキーを持つ認証プロファイルストアを維持します。モデル解決
フェイルオーバー
FailoverError は、設定されている場合にモデルフォールバックを起動します。
Pi拡張
OpenClawは特殊な動作のためにカスタムpi拡張を読み込みます。コンパクションセーフガード
src/agents/pi-hooks/compaction-safeguard.ts は、適応的トークン予算編成に加え、tool失敗とファイル操作サマリーを含むコンパクションガードレールを追加します。
コンテキスト剪定
src/agents/pi-hooks/context-pruning.ts は、キャッシュTTLベースのコンテキスト剪定を実装します。
ストリーミングとブロック返信
ブロックチャンク化
EmbeddedBlockChunker は、ストリーミングテキストを個別の返信ブロックに分割して管理します。
思考/最終タグの除去
ストリーミング出力は、<think>/<thinking> ブロックを除去し、<final> 内容を抽出するよう処理されます。
返信ディレクティブ
[[media:url]]、[[voice]]、[[reply:id]] のような返信ディレクティブは解析され、抽出されます。
エラー処理
エラー分類
pi-embedded-helpers.ts は、適切に処理できるようエラーを分類します。
思考レベルのフォールバック
思考レベルがサポートされていない場合はフォールバックします。Sandbox統合
sandboxモードが有効な場合、ツールとパスは制約されます。Provider固有の処理
Anthropic
- 拒否マジック文字列の除去
- 連続ロールに対するターン検証
- 厳格な上流Piツールパラメータ検証
Google/Gemini
- プラグイン所有のツールスキーマサニタイズ
OpenAI
- Codexモデル用の
apply_patchツール - 思考レベルのダウングレード処理
TUI統合
OpenClawには、pi-tuiコンポーネントを直接使用するローカルTUIモードもあります。Pi CLIとの主な違い
| Aspect | Pi CLI | OpenClaw Embedded |
|---|---|---|
| Invocation | pi コマンド / RPC | createAgentSession() 経由のSDK |
| Tools | デフォルトのコーディングツール | カスタムOpenClawツールスイート |
| System prompt | AGENTS.md + prompts | チャンネル/コンテキストごとの動的生成 |
| Session storage | ~/.pi/agent/sessions/ | ~/.openclaw/agents/<agentId>/sessions/(または $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/) |
| Auth | 単一の資格情報 | ローテーション付きマルチプロファイル |
| Extensions | ディスクから読み込み | プログラム的 + ディスクパス |
| Event handling | TUIレンダリング | コールバックベース(onBlockReply など) |
今後の検討事項
再設計の可能性がある領域:- ツールシグネチャの整合: 現在は pi-agent-core と pi-coding-agent のシグネチャ間を適応している
- Session manager ラッピング:
guardSessionManagerは安全性を追加するが複雑さも増す - 拡張の読み込み: piの
ResourceLoaderをより直接使える可能性がある - ストリーミングハンドラーの複雑さ:
subscribeEmbeddedPiSessionが大きくなっている - providerの癖: pi側で処理できる可能性のあるprovider固有コードパスが多い
テスト
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-hooks/**/*.test.ts
src/agents/pi-embedded-runner-extraparams.live.test.ts(OPENCLAW_LIVE_TEST=1を有効化)