pi アーキテクチャ総覧
源码版本v0.73.1
badlogic/pi-mono は TypeScript の monorepo で、5 つの npm パッケージで「統一 LLM API → 汎用 Agent → コーディングアシスタント → ターミナル/ウェブ UI」というスタックを組み上げている。このページで全体図を示し、以降のページで各レイヤーを分解していく。
5 つのパッケージ
| パッケージ | npm 名 | 役割 |
|---|---|---|
ai | @mariozechner/pi-ai | 統一 LLM API。9 つの組み込み provider と自動モデル発見 |
agent | @mariozechner/pi-agent-core | 汎用 Agent。二重 while ループ + ツール実行 |
coding-agent | @mariozechner/pi-coding-agent | コーディングアシスタント CLI。read/bash/edit/write ツール + セッション管理 |
tui | @mariozechner/pi-tui | ターミナル UI ライブラリ。差分レンダリング (differential rendering) + 同期出力 |
web-ui | @mariozechner/pi-web-ui | ウェブチャットコンポーネント。Lit Web Components |
ソースディレクトリ: packages/
レイヤー構成
各レイヤーを一言で
- pi-ai: 9 社の LLM(Anthropic、OpenAI、Google、Bedrock…)を
stream/streamSimpleの 2 関数に統一し、レジストリ (registry) 経由でmodel.apiごとに振り分ける。詳しくは ストリーミングファサード stream。 - pi-agent-core:
Agentクラスが状態を持ち、runLoopの外層で割り込み/キューイングを、内層でツール呼び出しを処理する。ストリーミング + ツールループ。詳しくは 二重 while メインループ。 - pi-coding-agent:
Agentの外側にAgentSessionを被せ、ツール・システムプロンプト・セッション永続化・3 つの実行モードを追加する。詳しくは AgentSession オーケストレーション層。 - pi-tui: 差分レンダリング + DECSET 2026 同期出力でターミナルのちらつきを防ぐ。詳しくは 差分レンダリング TUI クラス。
- pi-web-ui: Lit コンポーネントは自身の
Agentインスタンスを持ち、createStreamFnで CORS プロキシを被せてstreamSimpleを呼ぶ。詳しくは AgentInterface セッションホスト。
レイヤー分割の動機
なぜ一つの大きなパッケージにしないのか? 各レイヤーの消費者が異なるからだ。ウェブコンポーネントは Node の fs に依存すべきでないし、ターミナル UI がウェブの IndexedDB を背負うべきでない。汎用 Agent は「コーディング」という事実を知るべきではない。レイヤーを分ければ、ウェブは pi-agent-core + pi-ai だけ拾って独自 agent を走らせ、コーディングアシスタントのツールセットを飛ばせる。コーディングアシスタント CLI はオーケストレーション (orchestration) ロジックを変えずに UI を切り替えられる(tui モードか rpc モード)。pi-ai を独立パッケージにしたのは、どんなプロジェクトでも統一 LLM API を直接使えるようにするためで、agent という概念に縛られないためだ。
よくある誤解
- 「pi はコーディング agent である」: 正確ではない。
pi-coding-agentは上位アプリケーションで、下層のpi-aiとpi-agent-coreは汎用インフラであり、独立して使える。 - 「UI 層はただのレンダリング」: ウェブもターミナル UI もストリーミングに参加する。ウェブは
Agent.streamFnを差し替えて CORS プロキシを注入し、ターミナルはイベントを購読していつ再描画するかを決める。
推薦する読む順序
まず ストリーミングファサード stream で LLM の呼び出し方を理解し、次に 二重 while メインループ でツールループを見る。続いて AgentSession オーケストレーション層 でコーディングアシスタントがどう組み立てられるかを見て、最後は興味に従って pi-tui か pi-web-ui を選ぶ。