GitHubはAIエージェント向けではない(だからCloudflareは自社で構築した)

BBetter Stack
Computing/SoftwareSmall Business/StartupsInternet Technology

Transcript

00:00:00Cloudflareは「Artifacts」というものを開発中です。これは分散ファイルシステムで、
00:00:05Git互換であり、エージェント向けに構築されています。プログラムによって作成、フォーク、
00:00:10あるいは削除が何千ものリポジトリに対して行えます。規模の大小に関わらず、例えば並列的な
00:00:15PRレビューや大規模コードベースの自動リファクタリング、セッションごとのエージェントワークスペースなどに使えます。
00:00:20しかし、Durable Objects上に構築されているとなると、JavaScriptを使う必要があり、
00:00:25Gitを実行するためのシェルコマンドにはアクセスできないのでしょうか?
00:00:28チャンネル登録して確認してみましょう!
00:00:33GitHubは人間用に構築されており、エージェント用ではありません。そのため、フォロワーが
00:00:37議論を始めるといったソーシャルな側面はエージェントには不要です。しかしエージェントはGitに非常に長けており、
00:00:42学習データにも含まれています。
00:00:43そこでCloudflareは、Zigで基本的なGit実装を構築し、それをWasmにコンパイルして
00:00:49Durable Object上に配置し、Gitサーバーとして機能させています。
00:00:52一方、クライアント自体は自由です。Worker内でisomorphic-gitを使用したり、
00:00:57GitプロトコルやHTTPクライアントを使用すれば、JavaScriptを使わない環境からでも
00:01:03接続することが可能です。
00:01:05残念ながら、この録画時点ではArtifactsはプライベートベータ版のため、
00:01:10私自身はアクセスできません。ですが、ドキュメントが豊富に公開されているため、
00:01:15ドキュメント内のコードを使ってデモを作成することはできます。パブリックベータが公開されたら、
00:01:19私のコードが実際に動くか試してみてください。
00:01:20今回作成するのは、特定のレポジトリに対するタスクリストを受け取り、
00:01:24レポジトリを何度もフォークしてタスクを並列実行するツールです。
00:01:29各タスクは、Durable Object上のCloudレポジトリ内のArtifactで個別に実行されます。
00:01:34仕組みを見てみましょう。
00:01:35まず、Artifactsの「Workersの始め方」ドキュメントに従って進めました。
00:01:39このコマンドを使用して、コマンド後のテキストはプロジェクト名であり、
00:01:44何でも好きな名前で構いません。
00:01:45すべての手順を完了すると、このような基本的なWorkerコードが得られます。
00:01:49Artifacts用のWorkerは、REST APIを使うよりもパフォーマンスが少し向上します。なぜなら
00:01:53ネットワークの往復回数が減るからです。
00:01:55その後、Artifactsのバインディングをwrangler.jsoncまたはtomlファイルに追加し、
00:02:00型情報を再生成する必要があります。
00:02:02ドキュメントでは新しいレポジトリを作成することに焦点を当てているため、Artifactsバインディングの
00:02:07createメソッドとレポジトリ名を使用しています。
00:02:09名前を作成すると、トークンとリモートURLが返されます。
00:02:13リモートはArtifactの場所を指し、トークンまたは認証トークンは
00:02:17それへのアクセス権を与えるために必要です。
00:02:18もちろん、リモートURLとトークンを使ってGitプロトコルを利用し、
00:02:22Artifactとやり取りすることができます。
00:02:23しかし、今回は少し違うことを行います。
00:02:25ArtifactsのDurable Object内で新しいレポジトリを作成する代わりに、まずは
00:02:29「baseline」という名前のレポジトリが存在するか確認します。
00:02:31もし存在しなければ、既存のGitレポジトリをインポートし、
00:02:35名前を「baseline」として設定し、その値を返します。
00:02:39もちろん、WorkersバインディングのAPIドキュメントを確認すれば、
00:02:43importメソッドに追加できる他のパラメータも確認できます。
00:02:45既存のレポジトリを返した後は、非常にクールなことが
00:02:49できるようになります。
00:02:50レポジトリに対して実行したいタスクはここに記載します。現在はハードコードしていますが、
00:02:53これは入力フォームや何らかのUIから受け取ることも可能です。
00:02:56Workerのデフォルトエクスポート内では、Anthropic SDKと
00:03:00先ほどのbaselineレポジトリを読み込んでいます。
00:03:02すべてのタスクをループ処理し、ここでレポジトリを
00:03:06指定した名前でフォークしています。
00:03:07次にこの関数ですが、詳細は後ほど解説します。これはフォークしたレポジトリ内でタスクを実行し、
00:03:10エージェントにコード変更を行わせ、その要約を返します。
00:03:15つまり、エージェントの最後の発言を取得します。ループのたびに、この
00:03:19情報を返します。
00:03:20タスク名、フォーク名、リモートURL、そしてトークンを返します。
00:03:23そうすることで、変更内容が適切か確認したいときにいつでもアクセスでき、
00:03:27何が行われたかの要約も確認できます。
00:03:28現時点では、Workersバインディングにはpull、commit、pushの機能がありません。
00:03:33そのため、私のコードではisomorphic-gitを使って実装し、インメモリのストレージシステムを
00:03:38使って一時的に変更を保存するようにしました。
00:03:39エージェント側のコードでは、インメモリでファイルシステムを作成し、
00:03:43エージェントに対して関連する変更を行い、コードをコミットするように指示する
00:03:47システムプロンプトを設定しています。
00:03:48提供されたリモートURLとトークンを使用してフォークしたレポジトリをクローンし、
00:03:51ツールを定義します。具体的には、read、write、commitです。
00:03:52ここではモデルを選択し、システムプロンプトを与え、
00:03:55タスクをユーザーメッセージとして渡しています。
00:03:59コードの残りは標準的なエージェントループです。
00:04:00ツール呼び出しがあれば推論を停止し、ツールを実行します。今回の場合、read、write、
00:04:02あるいはcommitです。commitは、完了後にコードをプッシュする処理も含まれています。
00:04:07Artifactを持つことの利点は、すべてのコードがDurable Object内に存在し、
00:04:10オブジェクトのSQLiteデータベースに保存されることです。もしDurable Objectがダウンしても、
00:04:14復旧した際にSQLiteデータベースから情報をいつでも取得できます。
00:04:20そしてその下で、ツール呼び出し後のモデルの推論を継続し、
00:04:23最後にモデルからの最新のメッセージを返します。
00:04:27実際にコードを実行できない状態で、すべてを視覚化するのは難しいかもしれませんが、
00:04:29Artifactsで何ができるか、その可能性を感じ取っていただければ幸いです。
00:04:32Artifacts内で起こっているすべての変更を視覚的に確認できるUIがあり、
00:04:37個別のエージェントやオーケストレーターエージェントと通信して、
00:04:38各レポジトリに変更を加える姿を想像してみてください。
00:04:42オーケストレーターエージェントについて言えば、単一のWorkerで
00:04:46すべての変更を調整し、レビュアーエージェントが確認を終えた後に
00:04:48メインレポジトリにマージさせることも可能です。
00:04:52さらにArtifactsとダイナミックWorkerを組み合わせれば、
00:04:56エージェントが変更したコードを実行して正しく動作するか確認することもできます。
00:04:57JavaScript以外のコードであれば、Cloudflareサンドボックスを使って
00:05:02好きな言語を実行したり、シェルコマンドさえも走らせることができます。
00:05:03さらにCloudflare Browserオプションを使えば、Puppeteerでブラウザを立ち上げ、
00:05:07フロントエンドの変更が意図通りかモデルに確認させることも可能です。
00:05:09Artifactsをまだ実行できないにもかかわらず、その可能性を考えるのは非常に楽しいです。
00:05:13ただ1点気づいたのは、git diffコマンドが存在しないことです。
00:05:18WorkerバインディングのAPIにも、isomorphic-gitにも公開されていません。
00:05:21そのため、git diffを行う唯一の方法はGitプロトコルを経由することかもしれません。将来的に追加される可能性もあります。
00:05:22いずれにせよ、現時点でGitプロトコルを使わずにdiffを取得するなら、
00:05:25isomorphic-gitのgit logを使ってGitツリーを辿り、
00:05:30ツリーの中を歩いて違いを比較するしかないでしょう。
00:05:35ともあれ、これはCloudflareからの非常にクールなリリースだと思います。
00:05:36他にもS3ファイル、ZeroFS、JuiceFSといったファイルシステムツールは既に存在しますが、
00:05:40これらはGit互換ではありません。Git互換であることは非常にクールな特徴であり、
00:05:45よりエージェントフレンドリーと言えます。
00:05:46S3に関連して、ローカルマシンで実行する方法を知りたい方は、
00:05:50Joshがその方法を解説しているこの動画をチェックしてみてください。
00:05:55既に存在しますが、それらの選択肢はGit互換ではないと思います。Git互換であることは非常にクールな機能であり、
00:05:59よりエージェントフレンドリーです。
00:06:01S3の話ついでに、もしS3をローカル環境で動かしてみたいなら、
00:06:05その正確な方法を解説しているJoshの動画をチェックしてみてください。

Key Takeaway

Cloudflareが開発したGit互換の分散ファイルシステムArtifactsは、Durable Objects上でのエージェントによる並列リポジトリ操作とデータ永続化を可能にし、人間向けのGitHubに代わるAI特化型のワークスペースを提供する。

Highlights

CloudflareのArtifactsは、AIエージェントによる数千ものリポジトリ操作を可能にするGit互換の分散ファイルシステムである。

GitHubは人間向けに設計されているが、ArtifactsはDurable Objects上に構築され、エージェント特有の並列ワークスペースや自動リファクタリングに最適化されている。

Gitプロトコルおよびisomorphic-gitを使用することで、JavaScript以外の環境からもArtifactsへ接続可能である。

各ArtifactのデータはDurable ObjectのSQLiteデータベースに保存され、障害発生時も永続的な状態復元を実現する。

既存のファイルシステムツールと異なり、Git互換性を備えることでAIエージェントの学習データとの親和性が高い。

Timeline

Artifactsの目的と技術的背景

  • Artifactsはプログラムによる数千のリポジトリ操作を可能にするGit互換ファイルシステムである。
  • GitHubのソーシャル機能はAIエージェントに不要であるため、エージェント操作に特化した環境が構築された。
  • Zigで実装したGitサーバーをWasmにコンパイルし、Durable Objects上で動作させる仕組みである。

ArtifactsはGitの操作を自動化し、並列的なPRレビューや大規模な自動リファクタリングを可能にする。CloudflareはGitの基本機能をZig言語で実装し、それをWasm経由でDurable Object内に配置することで、JavaScript環境だけでなくGitプロトコルを利用できるあらゆるクライアントからの接続を実現した。

Artifactsを用いた並列タスク実行の構成

  • Worker内でArtifactsバインディングを使用してレポジトリの作成やインポートを行う。
  • 各タスクを別々のフォークで並列実行し、変更内容をリモートURLとトークンで管理する。
  • pullやpushがバインディングに未実装な部分はisomorphic-gitを用いてインメモリで補完する。

レポジトリのベースラインからタスクごとにフォークを作成し、AIエージェントがコードの読み書きやコミットを行うループを構成する。SQLiteベースのストレージにより、エージェントの推論プロセス中の状態を維持できる。APIの制約に対してはisomorphic-gitを組み合わせることで実用的なワークフローを構築している。

運用の可能性と今後の課題

  • Durable Object内のSQLiteデータベースがコード変更の永続性を保証する。
  • オーケストレーターと実行環境を組み合わせることで、検証まで含めた自動化が期待できる。
  • 現時点ではgit diffコマンドが公開されていないため、Gitツリーを辿るなどの代替手段が必要である。

Artifactsはコードの実行、ブラウザを用いたフロントエンド検証、複数エージェントの連携など、高度なエージェントワークフローを単一のWorkerで完結させる可能性を持つ。既存のS3系ツールにはないGit互換性が、AIエージェントの利便性を大きく向上させる。

Community Posts

View all posts