camelAI、AIエージェントを仮想マシンから Cloudflare エッジへ移行
- 多くのチームは AIエージェントを完全な Linux 仮想マシン上で動かしています。camelAI も当初は同じでしたが、コストを試算した結果、マシンそのものを解体しました。
- 解体は3段階です。まず AIエージェントを移し、次にファイルをデータベースへ移し、最後にコマンドラインを通常の実行環境から外しました。ユーザー体験は変わっていません。
- 最も大胆なのは、コマンドラインを外した第3段階です。ただし、コードを見ると限定的な実行経路は残されています。
ユーザーごとに常時稼働マシンと高速ディスク — 想定規模では採算が合わない
これは camelAI の CTO、Miguel Salinas が執筆したアーキテクチャ刷新の振り返りです。同社は独立した仮想マシン上で動いていた AIエージェントを全面的に作り直し、Cloudflare Durable Object 上の軽量アーキテクチャへ移行しました。その結果、コストとレイテンシーは大幅に低下したといいます。刷新は3段階で行われ、コードは 7 月 24 日に全面オープンソース化されました。各機構の実装をリポジトリで確認できます。
camelAI を知らない方はこちら
camelAI は、3人のチームが開発する AI プログラミングアシスタントです。Illiana Reed がプロダクト、Miguel Salinas が技術、Isabella がオペレーションを担当しています。
チャット欄で作りたいものを伝えると、コードを書き、依存関係を導入し、プロジェクトを起動。最後はアクセス可能な URL へデプロイします。データベースや数十種類の外部サービスにも接続でき、Pythonノートブックの実行やダッシュボード作成にも対応します。
公式サイトでは「自分専用のコンピューターに住む AI ソフトウェアエンジニア」と紹介されています。その「コンピューター」とは、ユーザーごとに割り当てられた Linux 仮想マシンです。本稿で解体されるのは、まさにこれです。
多くのチームは、完全な Linux 仮想マシンやコンテナサンドボックスで AIエージェントを動かしています。camelAI も当初は同じでした。
問題はコスト構造です。ユーザーごとに常時稼働するマシンを用意し、ファイル保存用の高速ディスクも接続する必要があります。ユーザーが増えれば、物理マシンとディスクも増設しなければなりません。同社が想定するユーザー規模では、この方法は成り立ちませんでした。
難しいのは、AIエージェントが Linux 上で動くことを前提としている点です。問題にぶつかると bash を呼び出すよう学習されています。camelAI が当初使っていたのは Claude Code のハーネスで、実行には完全な仮想マシンが必要でした。ハーネスとは、モデルの外側を包むプログラムです。対話ループ、ツール、状態を管理します。
そこで同社は、仮想マシンの効率的なスケジューリングを考えるのではなく、「そもそも仮想マシンは不要」という前提で設計をやり直しました。
4カ月余り前、camelAI の CEO、Illiana Reed はブログの冒頭で「camelAI の全ユーザーには、永続的なコンピューター、つまり本物の Linux 環境がある」と述べ、これをプロダクトの中核的な約束としていました。その記事では、Modal、Cloudflare Containers、Fly.io の Sprites を試したものの要件に合わず、最終的に1週間で独自のコンテナサービスを構築した経緯を説明しています。今回 Miguel はこう書いています。「記事は今も公開しているが、そのインフラでは1台も動かしていない」。
仮想マシンの中には、AIエージェント本体、プロジェクトファイル、コマンドラインという3つの要素がありました。3回の刷新では、それらを1つずつ移しています。移すたびに、それまでの役割を誰が担うのかを決めなければなりませんでした。
AIエージェント本体を移す — 応答は高速化、マシンは残る
Claude Code のハーネスは仮想マシンと切り離せません。そこで最初に、独自のハーネスを実装しました。
基盤に採用したのは pi です。Mario Zechner が開発する、MIT ライセンスのオープンソース AIエージェントツールキットで、GitHub では 8.1 万 star を獲得しています。pi は単一のプログラムではなく、複数のライブラリで構成されています。最上位層のコマンドラインツールは、OS上での動作を前提とします。一方、下層は対話ループや状態管理など、AIエージェントの基本部品だけを提供し、実行場所を問いません。camelAI は pi のコードを1行も変更せず、下位2層だけを利用しました。
camelAI の package.json にあるのは @earendil-works/pi-agent-core と @earendil-works/pi-ai(いずれも 0.80.6 版)だけです。OS の存在を前提とするコマンドライン層、pi-coding-agent は含まれていません。
新しいハーネスは、1つの Durable Object 内で動きます。Durable Object は Cloudflare の小型コンピュートインスタンスです。専用ストレージを備え、ユーザーに最も近いデータセンターで起動します。camelAI はチャットセッションごとに1つ割り当てています。
