Claude CodeのようなAIコーディングエージェントに、Google DriveやSlackなど外部ツールを何個も繋いだことがある人なら、心当たりがあるかもしれない。繋ぐツールを増やすほど応答が遅くなり、長い会話の途中で前の指示を忘れたように挙動が変わる。ターミナル型のAIコーディングエージェント「Pi」が2026年10月に1.0になり、この重さの原因そのものに手を付けた機能「Codemode」を搭載した。やっていることは単純で、ツールの実行結果をモデルの外で処理してから、絞り込んだ結果だけをモデルに渡す。
ツールを増やすとなぜ重くなるか
AIエージェントにツールを1つ繋ぐと、そのツールが何をするものかという説明(定義)が、会話の文脈に読み込まれる。ツールを呼び出せば、その実行結果も文脈に加わる。ツールが増えるほど、この定義と結果の量がそのまま積み重なっていく。
Anthropicは2025年11月、この積み重なりを具体的な作業で説明している。2時間の商談の文字起こしをGoogle Driveから取得し、Salesforceに登録する作業を例に挙げている。文字起こしの中身は「取得」で一度モデルを通り、「登録」のためにモデルがもう一度それを書き写す形で、もう一度通る。
Anthropicのエンジニアリング記事によれば、この往復だけで追加50,000トークンほどになり得る。ツールが数千個あるような環境では、リクエストを読む前に数十万トークンを処理することになるという。自分が実際に困っていたのは「ツールの多さ」そのものではなく、「結果がモデルを何度も往復する構造」だったと分かり、問題の輪郭がはっきりした。この往復を減らす方法は、すでに示されていた。
解決策はすでに示されていた
Anthropicは同じ記事で、解き方も示している。ツールをモデルに直接呼ばせるのではなく、コードから呼べるAPIとして渡す方法だ。ツールをファイルシステム上の関数のように置いておき、エージェントは必要な関数だけを読み込んでスクリプトを書く。文字起こしの取得と登録は、このスクリプトの中で完結し、文字起こしの中身そのものはモデルの文脈を通らない。
Anthropicが示した例では、このやり方でトークン数は150,000から2,000まで減り、時間とコストで98.7%の削減になったという。1 商談データを1万行のスプレッドシートに広げても、エージェントはスクリプトの中で必要な数行だけに絞り込んでからモデルへ返せる。ただしこの数値はこの1例でのもので、ツールの種類や処理内容が変われば削減の比率も変わる。
この設計はAnthropicの提案にとどまらず、実装に落とし込んだエージェントが出てきている。その1つがターミナル型コーディングエージェント「Pi」だ。開発元Earendilは、週に数十万人が使っていると発表している。独立した利用統計ではなく、Earendil自身の申告になる。Earendilは2026年10月1日、この設計を「Codemode」という標準機能として1.0に組み込んだ。
コードはどこで動いているのか
ここで気になるのは、モデルに自由にコードを書かせて実行する、という話の安全性だ。好きなコードを書けるなら、ファイルを消したり外部にデータを送ったりできてしまわないか。
Piの公式ドキュメントを読むと、答えはむしろ逆だった。Codemodeが書いたJavaScriptは、QuickJSという隔離されたサンドボックスの中で動く。Node.jsの標準APIもファイルシステムもネットワークも、タイマーさえも直接は使えない。外部とやり取りする窓口は、スクリプトに渡されるtoolsとmodelsという2つのオブジェクトだけに絞られている。
サンドボックスには、数値で区切られた上限もある。
| 項目 | 上限 |
|---|---|
| VMのメモリ | 256MB |
| 出力の既定上限 | 10,000トークン |
| 1スクリプトの出力上限 | 16,777,216文字、またはtext()・image()・console呼び出し100,000回 |
| 同時に生存できるワーカー数(既定) | 2 |
| モデル呼び出しの同時実行数 | 4 |
上限を超えるとエラーになるため、大きなデータをサンドボックス内に溜め込まず絞り込んでから返す書き方が前提になる。この記事が当てはまるのは、Pi 1.0のCodemodeを素の設定で使う場合だ。PI_CODEMODE_MAX_WORKERSなどの環境変数で変えられる値も一部ある。
自分は「モデルがコードを書いて実行する」と聞いて、自由度が上がる話を想像していた。読み進めると逆で、Codemodeは従来のツール呼び出しより狭い場所にコードを閉じ込める設計だった。この閉じ込めがあるからこそ、結果をモデルへ返す前にスクリプト側で安全に絞り込める。では、この閉じ込められた場所で、具体的に何ができるのか。
サンドボックスの中でできること
toolsとmodelsという窓口の中身を見ると、単にツールを呼べるだけではないと分かる。公式ドキュメントのコード例では、複数件のメッセージをまとめて感情・緊急度で分類するスクリプトが示されている。
const jev = await models.getModelOfType("classifier", "typesafe", "jev-latest");
const results = await Promise.all(messages.map((message) =>
models.classify(jev, {
state: { message },
questions: {
sentiment: { type: "choice", instructions: "顧客の感情は?",
criteria: { positive: "満足", negative: "不満", neutral: "中立" } },
urgency: { type: "score", instructions: "返信の緊急度は?",
criteria: ["不要", "今週中", "本日中"] },
},
})));
return results.map((r, i) => r.stopReason === "stop"
? { message: messages[i], sentiment: r.answers.sentiment.choice, urgency: r.answers.urgency.score }
: { message: messages[i], error: r.errorMessage });
models.classify()は画像入力にも対応していて、画像を受け付ける分類器ならtools.read()で読んだ画像ファイルをそのまま渡せる。このスクリプトが実際にファイルを読んだり分類モデルを呼んだりできるのは、toolsとmodelsという渡された窓口を通したときだけだ。スクリプト自身がその外に出ることはない。
この分類処理全体を通じて、メインのモデルは個々のメッセージや画像を一度も見ていない。モデルに届くのはreturnで返された、整理済みの一覧だけになる。画像生成モデルを呼ぶmodels.generateImages()も同じ仕組みだ。生成した画像は、サンドボックス内のimage()で表示されるまでモデルの文脈を通らない。
ツールを並列に呼ぶPromise.all()、途中経過を次の呼び出しへ引き継ぐstore()・load()、使えるツールを検索するsearchTools()も同じサンドボックスの中で使える。「コードを書かせる」という話が、実際には「結果をモデルから遠ざける」話になっていた。ここまでの仕組みが分かれば、あとは手元で動かしてみるだけになる。
今すぐ試せるのか
Pi 1.0はMITライセンスで、次のコマンドでインストールできる。Codemodeは1.0の標準機能で、追加の設定なしに使える。
- Unix系:
curl -fsSL https://pi.dev/install.sh | sh - Windows:
powershell -c "irm https://pi.dev/install.ps1 | iex"
同じ日に公開された「Pi Durable」は、長時間稼働するエージェントアプリ向けの実験的パッケージで、まだ安定版ではない。
まとめ
AIコーディングエージェントが重くなる原因は、ツールの定義と実行結果がそのままモデルの文脈に積み重なる構造にある。Anthropicは2025年11月、ツールをコードから呼べるAPIとして渡し、結果をモデルの外で絞り込んでから返す設計を示した。ある例では、150,000トークンかかっていた処理を2,000トークンまで減らしている。
Piは2026年10月、この設計を「Codemode」として1.0に組み込んだ。コードが動く場所をQuickJSサンドボックスに閉じ込めたうえで、分類器や画像生成モデルまでtoolsとmodelsという窓口から直接呼べるようにした。メインのモデルは画像やメッセージの中身を一度も見ないまま、整理された結果だけを受け取れる。
Footnotes
-
Google DriveからSalesforceへ2時間の商談の文字起こしを転記する例での数値。Anthropicのエンジニアリング記事による。 ↩
コメント
気づきや感想をどうぞ記事への補足や、読んで考えたことをお寄せください。個人情報や、他の人を傷つける内容の投稿はお控えください。
投稿にはGoogleログインが必要です。
Googleでログイン投稿にはGoogleアカウントの表示名が公開されます。メールアドレスは取得・公開しません。
コメントを読み込んでいます…