Skip to content

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-aipi-agent-core は汎用インフラであり、独立して使える。
  • 「UI 層はただのレンダリング」: ウェブもターミナル UI もストリーミングに参加する。ウェブは Agent.streamFn を差し替えて CORS プロキシを注入し、ターミナルはイベントを購読していつ再描画するかを決める。

推薦する読む順序

まず ストリーミングファサード stream で LLM の呼び出し方を理解し、次に 二重 while メインループ でツールループを見る。続いて AgentSession オーケストレーション層 でコーディングアシスタントがどう組み立てられるかを見て、最後は興味に従って pi-tuipi-web-ui を選ぶ。