00:00:00(アップビートな音楽)
00:00:01Cloudflareが最近「Dynamic Workers」を発表しました。
00:00:04これは、より低レイヤーのWorkerプリミティブで、
00:00:06既存のWorkerからプログラムで作成することができます。
00:00:09V8 isolates上で動作するため、従来のコンテナよりも
00:00:12100倍高速で、メモリ効率も非常に優れています。
00:00:16そして、非常に低コストであるため、
00:00:18必要な分だけいくらでも生成することが可能です。
00:00:20AI生成コードの実行や開発プレビュー、
00:00:23カスタムオートメーションなど、用途は多岐にわたります。
00:00:25公式には、その気になれば毎秒100万個もの
00:00:29Dynamic Workersを起動できるとまで言われています。
00:00:31しかし、JavaScriptしか動かせないという点は、
00:00:33活用の幅を制限してしまうのでしょうか?
00:00:36チャンネル登録をして、一緒に確かめていきましょう。
00:00:37(アップビートな音楽)
00:00:40昨年、Cloudflare Sandboxesについての動画を公開しました。
00:00:44これは、Durable Object上で動作する
00:00:47短寿命のLinuxコンテナのようなものです。
00:00:49もし今の説明がピンと来ない場合は、
00:00:50ぜひそちらの動画もチェックしてみてください。
00:00:52ファイルシステムを備え、ほぼ全ての言語や
00:00:55バイナリを実行できるフルOSコンテナが必要なら、
00:00:59それが最適です。
00:01:01しかし、より高速なもの、
00:01:03正確には「はるかに高速で軽量」なものを求め、
00:01:06通常のWorkerと同じ制限内で
00:01:09無制限の並列サンドボックスを実行したいのであれば、
00:01:12Dynamic Workerの出番かもしれません。
00:01:15では、セットアップ方法を見ていきましょう。
00:01:16こちらがWranglerで作成した基本的なWorkerです。
00:01:19TypeScriptのエラーが出ていますが、
00:01:21恐らく「wrangler types」を実行し忘れたのでしょう。
00:01:23さて、Wranglerの設定ファイルに、
00:01:26「worker_loaders」という配列を追加し、
00:01:28「loader」というバインディングを設定しました。
00:01:30名前は何でも構いませんが、
00:01:32慣習に従って「loader」にしています。
00:01:34このバインディングによって、
00:01:37他のWorkerを作成・制御できるようになります。
00:01:38更新したコードでは、新しいWorkerの定数を定義し、
00:01:42loaderバインディングを以下の値で使用しています。
00:01:45これは、ネストされたWorkerのための
00:01:49Wrangler設定ファイルのようなものだと考えてください。
00:01:50「compatibility_date」で使用する
00:01:53ランタイムのバージョンを指定し、
00:01:55こちらが実行されるコードになります。
00:01:57ご覧の通り、コード自体は
00:01:59通常のWorkerと非常によく似ています。
00:02:00fetch関数があり、
00:02:02request、env、contextを引数に取ります。
00:02:05ここでは単に、サンドボックスから
00:02:06「Hello World」とレスポンスを返しているだけです。
00:02:08その後、全てのネットワークアクセスを遮断し、
00:02:10親Workerからのリクエストを引数としてfetchを実行し、
00:02:13その結果を返しています。
00:02:16ローカルで実行し、localhostをcurlで叩くと、
00:02:19サンドボックスからの挨拶が表示されるはずです。
00:02:21しかし、同じcurlリクエストをもう一度送ると、
00:02:24エラーが発生します。
00:02:24これは、現時点ではリクエストのたびに
00:02:26新しいWorkerをロードしているからです。
00:02:28代わりに、既存のWorkerを取得するようにしましょう。
00:02:31「worker-1」という名前を付け、
00:02:33非同期関数としてコードを実行します。
00:02:35これで、curlを叩くとメッセージが表示され、
00:02:38再度実行しても、既存の「worker-1」の
00:02:41サンドボックスから情報が取得されます。
00:02:43今お見せしたのは
00:02:45もちろん非常にシンプルな例ですが、
00:02:47Dynamic Workersではさらに高度なことが可能です。
00:02:50例えば、カスタムバインディングを定義したり、
00:02:52この「chatroom.post」のようにスタブを作成して、
00:02:55Cap'n Proto経由でWorkerと通信させたりできます。
00:02:57これについては以前動画で紹介しましたので、
00:02:59興味がある方はぜひご覧ください。
00:03:00Honoのようなnpm依存関係を利用し、
00:03:03「createWorker」関数でバンドルすることもできます。
00:03:05さらには、外部へのリクエストをインターセプトして、
00:03:08認証情報を注入するといったことも可能です。
00:03:10しかし、Dynamic Workersを使う大きな理由の一つは、
00:03:13AIエージェントが生成したコードを実行することにあります。
00:03:17実際に試してみましょう。
00:03:18これはE2Bのクックブックにあるコードで、
00:03:21AnthropicのSDKを使ってClaude 3.5 Sonnetを動かします。
00:03:25特定のシステムプロンプトと、Jupyter Notebookで
00:03:28Pythonを実行するためのカスタムツールを使用します。
00:03:31仕組みとしては、カスタムツールの使用を検知すると、
00:03:33それをE2Bのサンドボックス内で
00:03:34実行するというものです。こちらがそのコードです。
00:03:40ここでは、モンテカルロ法を用いて
00:03:421,000回の反復で円周率を計算するという
00:03:46非常に具体的なプロンプトを与えています。
00:03:47ファイルシステムにアクセスできるため、
00:03:50PNG画像を作成して保存し、
00:03:52ユーザーがダウンロードできるようにするといった
00:03:54処理も可能です。
00:03:56残念ながら、Dynamic Workersには
00:03:58直接的なファイルシステムはありません。
00:04:00シェルライブラリを使って
00:04:02仮想的なものを作ることはできますが、
00:04:04Worker経由で動作しているため、
00:04:06R2バケット(Cloudflare版のS3)などの
00:04:08情報を渡してあげれば、
00:04:11そこに画像を保存することができます。
00:04:12では、E2Bのものと似た構成の
00:04:14こちらのコードを見てみましょう。
00:04:16まず、使用されているシステムプロンプトがあります。
00:04:19そしてカスタムのPython実行ツールですが、
00:04:22今回はJupyter Notebookを使わずに
00:04:25可視化用のSVGを生成するようにしています。
00:04:28こちらがWorkerのコードで、JavaScriptだけでなく
00:04:30Pythonも実行できるようになっています。
00:04:33ここではClaude Sonnetを使用していますね。
00:04:35これが使用されるプロンプトです。
00:04:37エージェントのコードがサンドボックスで実行され、
00:04:41そのレスポンスが
00:04:43メインのWorkerに戻されます。
00:04:45メインWorkerは内容からSVGコードを探し出し、
00:04:47それをR2に保存します。
00:04:49URLにアクセスすると、少し時間はかかりますが、
00:04:51Claudeからの関連情報を含む
00:04:53ページが生成されます。
00:04:55下にスクロールすると、
00:04:56R2から読み込まれたSVGが表示されています。
00:05:01E2Bの例とは見た目がかなり違いますが、
00:05:03Claude Sonnetが正しい情報を出力したと
00:05:04信じることにしましょう。
00:05:06先ほど、Dynamic Workersをプログラムで
00:05:09好きなだけ生成できると言いましたが、
00:05:13このようなコードで実現できます。
00:05:16APIからの値に基づいて、新しいWorkerを
00:05:19作成するためのforループです。
00:05:21Workerが既に存在するかどうかもチェックし、
00:05:23存在すれば再利用します。
00:05:25実行されるコードは、基本的にはログ出力と、
00:05:27forループのインデックスに基づいた
00:05:29固有のIDを返すレスポンスです。
00:05:32このコードを動かして、
00:05:3450個の新しいDynamic Workersを生成してみます。
00:05:36全て瞬時に作成されました。非常に速いです。
00:05:41次は10,000個で試してみましょう。
00:05:43自分のマシンが火を噴かないように、
00:05:44ローカルではなく、
00:05:46親WorkerをCloudflareにデプロイして、
00:05:49彼らのインフラを利用します。
00:05:50それでは、10,000個の異なるWorkerを生成します。
00:05:53Enterキーを押すと、とんでもない速さで作成されました。
00:05:56ここには30個ずつのページが表示されており、
00:05:59次々と進んで各WorkerのIDを確認できます。
00:06:03進めば進むほど、新しいページが現れます。
00:06:05特定のWorker、例えば「worker-1156」と
00:06:07通信することもでき、
00:06:09「Hello from worker-1156」と返ってきます。
00:06:12以上、Dynamic Workersの簡単な概要でした。
00:06:15既にCloudflareのCode Modeや、
00:06:18LLM生成アプリを実行するZiteなどで使われています。
00:06:21ただ一つ注意点として、現在は無料ですが
00:06:24永遠に無料というわけではありません。
00:06:25毎秒100万個の実行が可能だとしても、
00:06:28相当な資金力がない限りは、
00:06:30少し様子を見たほうがいいかもしれませんね。
00:06:32Cloudflare関連で言えば、
00:06:34v0やLovableのようなアプリジェネレーターを構築できる
00:06:38オープンソースの「Vibe SDK」についても知りたい方は、
00:06:42ぜひ次の動画をチェックしてください。