
2026/02/01 18:33
**オピニオン・ドリブンで最小限に設計したコーディングエージェント構築から学んだこと**
RSS: https://news.ycombinator.com/rss
要約▶
<|channel|>final <|constrain|>## Japanese Translation:
改善された概要
pi は、以下の4つのコアパッケージで構成される軽量なコードエージェントハーネスです:
-
– Anthropic、OpenAI、Google、xAI、Groq、Cerebras、OpenRouter などをサポートする統一 LLM API。プロバイダー固有の挙動を標準化し、ストリーム処理とツール呼び出し(TypeBox スキーマ付き)を提供します。また、トークン使用量/コストの追跡、abort シグナルへの対応、増分 JSON の解析、およびpi-ai
タグによるコンテキストハンドオフを行い、セッション中にプロバイダーを切り替えることができます。<thinking> -
– ツール実行、結果のLLMへのフィードバック、メッセージキュー管理、UI統合用イベント発火、およびpi-agent-core
ステートクラスの公開を行うイベント駆動型ループです。ハードなステップ制限はなく、外部ファイル(Agent
、TODO.md
)やツール(tmux)による計画に依存します。PLAN.md -
– 差分更新で効率的に描画し、ANSI エスケープコードを使用する保持モードのターミナルUIフレームワークです。エディタ、Markdown レンダラー、自動補完などのコンポーネントが含まれます。pi-tui -
CLI (
) – 上記パッケージをラップし、4つのコアツール(pi-coding-agent
、read
、write
、edit
)をリストした簡潔なシステムプロンプト(約1000トークン)を提供します。ファイル操作に関するガイドラインも含み、重い設定なしでエージェントを起動できます。bash
ハーネスはデフォルトで YOLO モード(制限のないファイルシステムアクセス、安全機構無し)で実行されますが、CLI フラグでコンテナや限定ツールセットに制約することも可能です。組み込みの to‑dos、計画モード、MCP サポート、バックグラウンド bash、サブエージェントなどの上位レベル機能は意図的に省略し、ユーザーが外部で管理できるよう設計しています。
pi は Claude Opus 4.5 を用いて Terminal‑Bench 2.0 でベンチマークされ、競争力のあるリーダーボードスコアを達成しました。最小限かつ可観測なワークフローを維持しながら、将来の更新ではワークフローの簡素化、ストリームツール結果の有効化、コンテナ化または制限付きツールモードの探索が計画されています。これにより、フレームワークは高速プロトタイピング、内部ツール開発、研究プロジェクト向けにシンプルで柔軟なままであり、可観測性を重視した環境に適しています。
本文
2025‑11‑30
少ししかないが、私のものだ
pi‑ai と pi‑agent-core
そこにある。
四つの光…API
コンテキストハンドオフ
我々は多モデル世界で生きている
構造化されたツール結果分割
最小限のエージェントスキャフォールド
pi‑tui
二種類のTUI
保持モード UIDifferential レンダリング
pi‑coding-agent
まとめ
背景
過去三年間、私はLLMを補助的なコーディングに利用してきました。もしこの記事を読んでいるなら、あなたも同じ進化の道を歩んだことでしょう:ChatGPT へコードをコピー&ペースト → Copilot のオートコンプリート(うまく機能しない)→ Cursor → Claude Code、Codex、Amp、Droid、opencode など新しいコーディングエージェントのハーネス。
私は主に Claude Code を使用していました。4 月に Cursor を一年半試した後、最初に手に入れたものです。当時は非常にシンプルで私のワークフローにピッタリでした。しかし最近では Claude Code は機能が多すぎて 80 % が不要になり、リリースごとにシステムプロンプトやツールが変わるためワークフローが壊れます。しかもちらつきがあります。
長年にわたりさまざまな複雑なエージェント(例:ブラウザ内で動く Sitegeist)を構築してきました。その中で「コンテキストエンジニアリング」が極めて重要だと学びました。モデルに渡すコンテキストを正確に制御することで、特にコード生成時の出力が向上します。既存ハーネスは背後で注入した情報を UI に表示せず、設定が難しいです。
さらに、入力・出力などインタラクションの各側面を自動化し、セッション形式を簡潔に文書化できるようにしたいと考えました。多くのハーネスは API がオーガニックに進化して重たく、開発者体験が悪化しています。
自己構築の理由
自分でコードを書くことで「何を必要か」を明確にできるので、以下のモジュールを作成しました:
| モジュール | 役割 |
|---|---|
| pi‑ai | 複数プロバイダー(Anthropic, OpenAI, Google, xAI, Groq 等)を統一した LLM API。ストリーミング、ツール呼び出し、思考/推論サポート、トークン・コスト追跡。 |
| pi‑agent-core | ツール実行・検証・イベントストリーミングを扱うエージェントループ。 |
| pi‑tui | 差分レンダリングと同期出力でフリッカーのないターミナル UI フレームワーク。 |
| pi‑coding-agent | CLI で統合し、セッション管理・カスタムツール・テーマ・プロジェクトコンテキストを提供。 |
「必要なものだけ作る」という哲学に基づき、不要な機能は実装していません。
pi‑ai
pi‑ai は 4 つの主要 API(OpenAI Completions/Responses, Anthropic Messages, Google Gemini)を抽象化します。プロバイダー固有の挙動(例:
store, max_tokens, reasoning_effort など)をラップし、テストスイートで画像入力・推論トレース・ツール呼び出しを検証しています。
コンテキストハンドオフ
プロバイダー間のコンテキストは「思考トレース」を
<thinking></thinking> タグ付きで転送します。以下は例です:
import { getModel, complete, Context } from '@mariozechner/pi-ai'; const claude = getModel('anthropic', 'claude-sonnet-4-5'); let context: Context = { messages: [] }; context.messages.push({ role: 'user', content: 'What is 25 * 18?' }); const claudeResponse = await complete(claude, context, { thinkingEnabled: true }); context.messages.push(claudeResponse); const gpt = getModel('openai', 'gpt-5.1-codex'); context.messages.push({ role: 'user', content: 'Is that correct?' }); const gptResponse = await complete(gpt, context);
ストリーミング & アボート
const model = getModel('openai', 'gpt-5.1-codex'); const controller = new AbortController(); setTimeout(() => controller.abort(), 2000); for await (const event of stream(model, { messages: [{ role: 'user', content: 'Write a long story' }] }, { signal: controller.signal })) { if (event.type === 'text_delta') process.stdout.write(event.delta); }
ツール結果の分離
ツールは LLM 用テキストと UI 表示用データを同時に返せます。例:
const weatherTool: AgentTool<typeof weatherSchema, { temp: number }> = { name: 'get_weather', parameters: weatherSchema, execute: async (_, args) => ({ output: `Temperature in ${args.city}: ${Math.round(Math.random() * 30)}°C`, details: { temp: Math.round(Math.random() * 30) } }) };
pi‑agent-core
エージェントループは「メッセージ → ツール呼び出し → 結果を LLM に戻す」まで自動で繰り返します。最大ステップ制御は実装していませんが、必要なら
Agent クラスに追加できます。
pi‑tui
差分レンダリングアルゴリズム:
- 初回:全行を書き出す
- 幅変更時:スクリーンをクリアして再描画
- 通常更新:最初に変わった行まで移動し、そこから再描画
フリッカー防止のため、CSI
?2026h / ?2026l で出力をバッファリングします。Ghostty や iTerm2 では完全にフリックレスです。
pi‑coding-agent
- Windows, Linux, macOS(Node.js があれば)
- マルチプロバイダー・モデル切替
- セッション管理:続行、再開、ブランチ
- プロジェクトコンテキストファイル(AGENTS.md)を階層的にロード
- スラッシュコマンドで共通操作
- カスタムテーマ & ライブリロード
- エディタ:ファイル検索・パス補完・ドラッグ&ドロップ・複数行貼り付け
- 画像サポート(ビジョン対応モデル)
- HTML 出力、ヘッドレス JSON ストリーミング
- コスト・トークン追跡
システムプロンプト(例)
You are an expert coding assistant. You help users with coding tasks by reading files, executing commands, editing code, and writing new files. ... Documentation: /path/to/README.md
ツール定義
- read – ファイル読み取り
- write – 書き込み(新規または上書き)
- edit – 正確なテキスト置換
- bash – シェルコマンド実行
省略した機能
| 機能 | 理由 |
|---|---|
| to‑do リスト | モデルが状態を追跡するのは混乱を招く。ファイルで管理。 |
| 計画モード | セッション間でファイルに書き出すことで可視化可能。 |
| MCP サポート | コンテキストオーバーヘッドが大きい。CLI ツール+README で代替。 |
| バックグラウンド Bash | プロセス管理が複雑。tmux を推奨。 |
| サブエージェント | 視認性が低く、デバッグ難易度増。必要なら自前で で起動。 |
ベンチマーク
Terminal‑Bench 2.0 により Claude Opus 4.5 と他ハーネス(Codex, Cursor, Windsurf 等)を比較。結果は 2025年12月現在のリーダーボードに掲載されています。
まとめ
pi は「必要最低限」で構築したエージェントハーネスです。コンテキスト制御、差分レンダリング、ツール結果分離などを実装し、日々の作業で高い信頼性と速度を提供しています。追加機能(圧縮・ツール結果ストリーム等)は検討中ですが、現時点では十分です。
貢献歓迎ですが、プロジェクトは集中管理を重視します。要件に合わない場合はフォークしていただければ幸いです。ご質問やフィードバックはお気軽にどうぞ。