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つ割り当てています。
一般的なクラウドサービスは、銀行で整理券を取るようなものです。呼ばれるたびに担当者が変わるため、事情を最初から説明し直さなければなりません。Durable Object は、専用の引き出しを持つ固定の担当者に近い仕組みです。戻るたびに同じ担当者が応対し、引き出しには前回のデータも残っています。
この段階では、仮想マシンはまだ残っています。ただし、AIエージェント本体はそこにいません。コマンドを実行するときだけ、仮想マシンをリモートで呼び出します。Anthropic も、自社のマネージド AIエージェントを同様に説明しています。頭脳と手を分離する設計です。
利点は3つあります。AIエージェントはマシンの起動を待たずに応答できます。AIエージェントが作業している間もマシンを休眠させられ、コマンドが不要な対話では一度も起動しません。さらに、1つの頭脳から複数の手を指揮し、複数のマシンを同時に操作できます。
プロダクト内では、この「手」をプロジェクトと呼びます。プロジェクトごとに仮想マシンと git リポジトリを用意し、Cloudflare Artifacts を使ってコードから直接生成します。独自の git サーバーは不要です。この段階でもAIエージェントはコマンドラインを使えるため、仮想マシンの外へ移ったことをほぼ意識しません。
ディスクを廃止 — ファイルをDBへ移し、ストレージと常時稼働コストを削減
次のバージョンでは仮想マシンを外し、プロジェクト構造は維持しました。ファイルシステムを Durable Object 内へ移し、大きなファイルは Cloudflare R2、つまり Cloudflare のオブジェクトストレージへ保存します。
この仕組みには既存の実装があります。Cloudflare の Agents チームが開発した @cloudflare/shell です。「実験的な Worker サンドボックス実行・ファイルシステムランタイム」と説明されており、camelAI はそのコードを広範囲に再利用しています。
Durable Object のストレージは、もともと SQLite データベースです。1インスタンスの上限は 10 GB で、各行にもサイズ制限があります。そのため、小さなファイルは1行に直接保存します。約 1.5 MB を超えるファイルは Cloudflare R2 に書き込み、データベースの行にはポインターだけを残します。AIエージェントからは通常のファイルシステムに見えますが、実体はテーブルとオブジェクトストレージです。
workspace-filesystem-do.tsでは、しきい値が定数として固定されています。DEFAULT_INLINE_THRESHOLD = 1_500_000、つまり 150 万バイトです。- Cloudflare 公式ドキュメントによると、SQLite 版 Durable Object は1インスタンスあたり最大 10 GB(有料プラン)、1行あたり最大 2 MB です。1.5 MB というしきい値は、2 MB の上限に余裕を持たせた設定で、恣意的な数字ではありません。
仮想マシン時代に「ファイルが残る」のは、マシンとディスクを維持するために費用を払い続けていたからです。現在は、データそのものを保存することでファイルが残ります。データの保管は安い。マシンの待機は高い。この差が、第2段階で削減したコストの本質です。
バージョン履歴には引き続き Artifacts を使い、各プロジェクトに完全な git 履歴を保持します。
コマンドラインを外す — JavaScript から固定メソッドを呼び出す設計へ
コマンドラインを外す第3段階は、3つの中で最も大胆です。camelAI 自身もそう認めています。
コマンドラインの問題は、コストだけではありません。AIエージェントがコマンドを実行でき、インターネットにも接続できるなら、仕事をさせるためにデータベースのパスワードや API キーなどの認証情報を渡す必要があります。同社は、認証付きプロキシ URL で認証情報を外側に隔離しようとしました。しかし実装は次第に粗雑になり、安全性の保証も難しくなったといいます。
そこで、日常のコマンドラインを外しました。AIエージェントは JavaScript を書き、そのコードを Cloudflare の Cloudflare Code Mode で実行します。ツールを1回ずつ呼ぶのではなく、必要な処理をコードとしてまとめ、一度に実行する方式です。実行ごとに新しい V8 isolate を起動します。
V8 isolate は新しいコンピューターではありません。起動済みのブラウザで新しいタブを開くようなものです。数ミリ秒で立ち上がり、使用メモリは数 MB。処理後は閉じ、次回はクリーンな環境を新たに開きます。一方、Cloudflare 公式の説明では、コンテナの起動には数百ミリ秒かかり、数百 MB のメモリを使います。
認証情報をサンドボックス外へ隔離
サンドボックスには、そのユーザーのデータ接続先と、プラットフォームの全機能を扱うメソッドがあらかじめ用意されています。認証情報はサンドボックスに入りません。AIエージェントが接続用メソッドを呼ぶと、認証はプラットフォーム側で行われます。キーがAIエージェントの触れられる場所に現れることはありません。
コマンドライン廃止で失う能力
AIエージェントがコマンドラインで行う作業の大半は、ディレクトリの一覧表示、ファイルの読み書きや編集、内容の検索などのファイル操作です。これらはネイティブツールで代替し、約8割をカバーしました。残る約2割は、用途ごとのコマンドを明示的なメソッドへ置き換えています。
左側の「何でも実行可能」という自由度こそ、置き換えられたものです。今後、AIエージェントが実行できる処理は、チームが事前に右側の64個へ実装しておく必要があります。
- 公開説明では「read、write、edit に、独自実装の grep と glob を追加」とされています。しかしコード上は実際には7個です。
read/write/edit/ls/grep/find/delete。lsとdeleteが追加され、glob はコード上でfindと呼ばれています。 - メソッドを収録する
code-mode-tools.tsは 4632 行あり、64個のメソッドを登録しています。deploy_projectやrun_notebookといったプラットフォーム固有の処理に加え、WebSearchやTodoWriteなど、ハーネスに組み込まれた汎用ツールもあります。 - サンドボックスには
tools.search()もあります。AIエージェントはキーワードでツールを検索し、tools.describe()で引数を確認できます。64個すべての説明を最初からコンテキストへ詰め込む必要はありません。 - システムプロンプトには厳格な規定があります。create-worker、wrangler、パッケージマネージャーのコマンドを、スキャフォールディング、ビルド、デプロイに使うことを禁止しています。モデルが身につけた従来の習慣を明示的に封じています。
違いが最もよく分かるのはデプロイです。以前、AIエージェントはプロキシ経由で wrangler deploy を実行していました。プラットフォーム側はプロキシ通信を監視し、どのセッションがデプロイしたのか推測するしかありません。現在は、プラットフォームが完全に制御する deploy_project メソッドです。デプロイの発生時刻を正確に把握できるため、フックを設定し、完了後にプレビューを自動表示できます。
数桁のコスト削減、高速応答、認証情報の隔離、全面オープンソース化
3段階の刷新で、主に4つの成果を得ました。
コスト:稼働時間課金から実行回数課金へ
仮想マシンやコンテナは、起動している限りメモリとディスクに料金が発生します。誰も使っていなくても同じです。isolate は呼び出されたときだけ起動し、処理後に消えます。実行していない時間には存在せず、料金も発生しません。スケーリングのために実マシンや実ディスクを増やす必要もなくなります。
同社の比較では、数千回の実行コストは、自社が評価したコンテナサービスを数分間動かす費用とほぼ同じだといいます。確認可能なのは Cloudflare 側の公式数値です。2026 年 3 月 24 日に公開された Dynamic Workers のブログに基づきます。
ただし、刷新前後を比較する具体的な収支は一切示されていません。結論には「数桁安くなった」とありますが、「以前は月額いくらで、現在はいくらか」という数字は最後まで登場しません。camelAI による一方的な主張で、読者は検証できません。
レイテンシー:最寄りのデータセンターで稼働
AIエージェントは Cloudflare のエッジで動くため、リクエストを中央の仮想マシンへ迂回させる必要がありません。仮想マシンの起動も待たず、ユーザーの入力直後から応答を始められます。
安全性と低コストモデル:認証情報を隔離し、ツール境界を明確化
認証情報はサンドボックスに入りません。認証はプラットフォーム側で行われ、AIエージェントがキーを持つことはありません。
コマンドラインはオープンな環境です。何でも実行できるため、低コストモデルは試行錯誤を繰り返し、遠回りしたり停止したりしがちです。境界の明確な少数のメソッドへ置き換えると、低コストモデルでも明らかに扱いやすくなったと同社は説明しています。これはモデル費用の削減に直結します。プロダクトを安価に運用することが、このアーキテクチャ全体の目的だからです。
この点にも公開数値はありません。リポジトリには実モデルを使うテストファイルが 52 個あり、camel-free- を名前に含むファイル群もあります。無料プラン向けの低コストモデル用に見えますが、公開ベンチマーク結果はありません。
コードを全面オープンソース化
camelAI のリポジトリは 7 月 24 日、MIT ライセンスでオープンソース化されました。URL は github.com/qaml-ai/camelAI です。本稿で紹介した仕組みは、すべて対応するファイルを確認できます。「検証済み」の内容も、この方法で調べました。
Linux が残る3領域 — アプリ構築、データ分析、DB照会
ユーザーのアプリをビルドするには、コンテナが必要です。この処理にはLinuxが不可欠です。ユーザーのアプリは Vite、Tailwind、React Router で構成され、依存関係を追加するには bun install を実行しなければなりません。
ビルド成果物自体が Worker なので、Worker 内でのビルドも検討しました。しかし Cloudflare の対応は十分ではありません。また、Worker のメモリは 128 MB、CPU は1基の数分の1に限られます。ビルドは遅く、多くのプロジェクトがメモリ不足になります。(128 MB という値は当サイトが公式ドキュメントで確認済みです。無料・有料プランとも同じです。)
そこで、ビルド時だけコンテナを起動します。プロジェクトをコピーし、処理を実行し、成果物を回収して停止します。notebook も同じです。Linux は引き続き使いますが、本当に必要な数秒間だけです。
公開説明ではコンテナは2種類ですが、本番環境の設定ファイルには実際には3種類あります。第3のコンテナは SQL クエリとデータエクスポート専用で、ブログでは触れられていません。コードコメントには、このコンテナでユーザーコードを実行しないと明記されています。
| コンテナ | 用途 | 仕様 | 最大数 | 休眠まで |
|---|---|---|---|---|
| ビルドサンドボックス | bun install とフロントエンドビルド | 2 vCPU · 8 GiB | 100 | 2 分 |
| 分析サンドボックス | notebook、shell、DuckDB の実行 | 2 vCPU · 8 GiB | 100 | 5 分 |
| 照会サンドボックス | SQL クエリとエクスポート(未公表) | 0.5 vCPU · 4 GiB | 25 | 2 分 |
データはリポジトリの本番設定ファイルと container-sizing.ts に基づきます。
休眠までの時間を2〜5分に短縮した理由は、コードコメントに書かれています。メモリとディスクは「プロビジョニング量」に応じて課金され、コンテナが起動している限り料金が発生します。実使用量で課金されるのは CPU だけです。何もしていないコンテナでも、起動中は費用がかかります。常時稼働する仮想マシンを廃止した理由も同じです。違うのは規模だけです。
「bash を削除」しても、コードには抜け道が残る
リポジトリには analysis_exec というメソッドが残っています。分析コンテナ内で shell コマンドを実行できるものです。ツール説明には、run_notebook では対応できないデータ処理の「非常口」と明記されています。
厳密には、コマンドラインがシステムから完全に消えたわけではありません。AIエージェントの日常的な作業環境から外され、特定のコンテナを通り、用途も限定された狭い実行経路に変わりました。「AIエージェントがいつでも bash を使える」状態とは別物ですが、文字どおりの「削除」でもありません。
AIエージェントは自力で道を探せない — 必要な能力をチームが先回り
camelAI 自身もこの問題を率直に挙げています。コマンドラインがあれば、AIエージェントは未知の状況でも自力で解決策を探せます。現在は、足りない能力があるたびに、チームが新たなメソッドを追加しなければなりません。
率直に言えば、欠点は AIエージェントに必要なものを事前に予測しなければならないことです。bash があれば、自力で方法を探せます。今は能力が不足していれば、私たちが追加する必要があります。
Miguel Salinas、camelAI CTO
一方で、同社はこの制約がプロダクトに良い影響を与えると考えています。ユーザーが実際に何をしているのかをチームが考え、その作業に正規の経路を用意するよう促すからです。AIエージェントの即興任せにはなりません。
もう1つ、語られていない代償
当サイトは、同社が独自実装した grep のコードも確認しました。ディレクトリ内の各ファイルを読み込み、JavaScript で1行ずつ走査します。最大 2 万ファイルを検索し、デフォルトでは 100 件の一致を返します。500 文字を超える行は切り詰められます。
ripgrep のような検索専用ツールは、コンパイル済みプログラムがディスクを直接並列走査します。両者は同じ性能水準ではありません。小規模なプロジェクトでは差が見えにくくても、リポジトリが大きくなった場合にどうなるのか。公開資料では説明されていません。
AIエージェントに必要なのは「コンピューター」ではなかった
業界の標準的な発想は、人間のプログラマーと同じ作業環境を AIエージェントにも再現することです。マシン、ファイルシステム、コマンドラインを用意します。人間のプログラマーがそう働いているからです。
camelAI は、この環境を1つずつ解体しました。その結果、AIエージェントが本当に必要とするのは、正確に定義された機能インターフェースだと分かりました。ファイル操作が必要なら7個のツールを与える。デプロイが必要なら専用メソッドを与える。その下に本物のコンピューターがあるかどうかを、AIエージェントが知る必要はありません。
同社の手順自体が、再利用可能な方法論です。まず AIエージェントを環境から切り離し、次に状態をマシンからデータへ移す。最後に、開放的な能力を境界のあるインターフェースへ絞り込む。各段階の効果を個別に検証でき、個別にロールバックもできます。一度に全面刷新するより、はるかにリスクを抑えられます。
ユーザーから見れば、何も変わっていません。AIエージェントにアプリを構築させ、アクセス可能な URL へデプロイできます。ファイルの読み書きや検索、公開も従来どおりです。4カ月余り前の「全ユーザーに永続的なコンピューターがある」という約束も変わっていません。ただし、その「コンピューター」の実体は、データベースのテーブルと使い捨てのサンドボックスになりました。
今すぐ同じ構成を作るには、越えられない壁がある
Cloudflare Artifacts は現在もクローズドテスト中です。公式ドキュメント(最終更新 2026 年 5 月 5 日)では、アクセス権を申請するフォームへの記入が必要とされています。このアーキテクチャでバージョン履歴を担う部分には、まだ一般公開された入口がありません。
もう1点は参入障壁ではありませんが、事前に知っておくべきです。@cloudflare/shell 自身が「実験的」と説明されています。このパッケージは 2026 年 3 月 13 日に初公開され、7 月 23 日までに 19 バージョンがリリースされました。最新版は 0.4.3 ですが、camelAI は 0.3.7 に固定しています。4カ月余りで 19 バージョンという更新頻度からも、基盤が今なお大きく変化していることが分かります。
すぐ利用できるのはコードそのものです。camelAI のリポジトリは 7 月 24 日に MIT ライセンスでオープンソース化され、各仕組みに対応するファイルを確認できます。
workers/main/src/chat-thread-do.ts は Durable Object 上で動く AIエージェントのメインループ(第1段階)。workspace-filesystem-do.ts はデータベース型ファイルシステムで、冒頭に 1.5 MB のしきい値があります(第2段階)。code-mode-tools.ts にはコマンドラインを置き換える64個のメソッドがあります(第3段階)。pi-container-tools.ts には7個のファイルツールがあり、ファイルを1行ずつ走査する grep もここにあります。camelAI、プログラミングAIエージェントを支える Linux 環境を全面撤去—3段階で実現、コードはすべてオープンソース
camelAI の CTO がアーキテクチャの全容を公開しました。AIエージェントを移し、ディスクをデータベースに置き換え、コマンドラインを外すまでを図解します。
↓ 1ページで読了 · 動く図解付き
camelAI は AI プログラミングアシスタントです。チャット欄で作りたいものを伝えると、コードを書き、依存関係を導入し、アクセス可能な URL にプロジェクトをデプロイします。もともとの売りは「ユーザーごとに永続的な Linux 環境を1台用意する」ことでした。Linux 仮想マシンとは、クラウド上に分離して設けた小さなコンピュータです。専用のディスクとコマンドラインを備え、稼働している限り料金が発生します。
問題はコスト構造です。ユーザーごとに常時稼働するマシンと高速ディスクを用意すると、利用者の増加に合わせて、実際のマシンとディスクも増設しなければなりません。
概念図です。原文に具体的な時間は示されていません。2本の時間差が、仮想マシン方式で余分に支払うコストです。そこで同社はスケジューリングを改善するのではなく、「そもそも仮想マシンは不要」という前提で設計をやり直しました。
仮想マシンには3つの要素がありました。AIエージェント本体、プロジェクトファイル、コマンドラインです。3回の再設計でこれらを一つずつ外し、そのたびに、従来の役割を何が引き継ぐのかを決めました。
第1段階で解消したのは遅延だけで、マシンはまだ残っていました。第2段階では常駐マシンとディスクのコストをまとめて削減しましたが、AIエージェントの処理に必要な計算資源は分単位で課金されます。計算コストに手を入れたのは第3段階です。各段階は個別に検証でき、個別にロールバックできます。
仮想マシンを外した後、ファイルシステムは Durable Object に移りました。Durable Object は Cloudflare が提供する小型のコンピューティングインスタンスです。専用ストレージを備え、ユーザーに最も近いデータセンターで起動します。チャットセッションごとに1つ割り当てられ、そのストレージ自体が SQLite データベースになっています。
稼働中だけファイルを保持
未使用でも課金
data.csv → 1.5 MB 超はポインタのみ
本体は Cloudflare R2 オブジェクトストレージへ
ここでの要点は、「ファイルが残る」仕組みの違いです。仮想マシン時代は、料金を払い続けてマシンを維持することでファイルを残していました。現在は、データそのものを保存することでファイルが残ります。データは保存しておくだけなら計算コストがかかりませんが、マシンは待機中でも料金が発生します。
コマンドラインを外した理由は、コスト削減だけではありません。AIエージェントがコマンドを実行し、インターネットにも接続できる環境では、実用的な作業を任せるために、データベースのパスワードや API キーなどの認証情報を渡す必要があります。camelAI は認証付きプロキシ URL で遮断する方法も試しましたが、実装は次第に継ぎはぎになったといいます。
そこで、コマンドラインをAIエージェントから直接外しました。代わりにAIエージェントが JavaScript を書き、実行のたびに新しい V8 isolate を立ち上げます。V8 isolate は、同一プロセス内に分離された小さな実行環境です。数ミリ秒で起動し、消費メモリは数 MB。処理後は破棄されます。すでに開いているブラウザに新しいタブを追加するイメージに近いでしょう。認証情報はサンドボックスに入らず、認証処理はプラットフォーム側で行われます。
本サイトがコードを確認したところ、公開説明と異なる点が2つありました。ファイルツールは実際には7個ですが、公開説明では5個しか触れていません。また、メソッドを登録するファイルには64個が登録されていました。
コンテナは起動している限り、誰も使っていなくてもメモリとディスクの料金が発生します。一方、isolate は呼び出されたときだけ起動し、処理後は消えます。camelAI によると、数千回の実行コストは、同社が評価したコンテナサービスを数分間動かす費用とほぼ同じです。ただし、第三者による検証はありません。
さらに2つの留保があります。リポジトリには、分析用コンテナ内で shell を実行できるメソッドが残っています。コメントには「非常口」と明記されています。つまり、コマンド実行機能がシステム全体から消えたわけではなく、AIエージェントの日常的な作業領域から外されたにすぎません。また、独自実装の grep は JavaScript でファイルを1行ずつ走査する方式で、上限は2万行です。専用に最適化された検索ツールとは性能の次元が異なります。リポジトリが大きくなった際のコストについて、原文は説明していません。同じ構成を再現するうえで、もう一つ越えられない壁もあります。バージョン履歴を管理する Cloudflare Artifacts は現在もクローズドテスト中で、利用には申請フォームへの記入が必要です。
わずかな時間。
課金は止まりません。
コマンド実行時
だけ起こします。
埋め込まれた境界値
マシンの常駐は高い。
- × 想定外のコマンドを
自由に実行 - × あらゆる認証情報に接触
7個のファイルツールで
bash 全体を代替
アプリのビルド、分析の実行、
データベース照会。
