ホームへ戻る

AI coding infrastructure

GitHub、エージェントを活用してCopilotランタイムを83万行のRustに書き換え、クライアントごとのNode.jsコストを排除

Copilotの共有エージェントランタイムがTypeScript/Node.jsからネイティブRustへ移行し、C ABIを介して6言語のSDKに直接組み込めるようになった。GitHubの負荷テストではセッションスループットが毎秒120件に向上したが、この数値はモデル推論とネットワーク遅延を除外した社内テストに基づく。

Himesh23 · CC BY-SA 4.0 · Image source
zh-Hant

GitHubは、Copilotエージェントランタイムの移行記録をすべて公開した。1人の主担当エンジニアが約14週間半にわたり、Copilot app、CLI、多数のサブエージェントを活用し、128件の段階的なPRを通じて、継続的に進化するTypeScriptシステムを、本番環境向けRustコード832,378行へと書き換えた。これとは別に、約46万9,000行のRustユニットテストと17万5,000行のエンドツーエンドTypeScriptテストも維持されている。この期間中、メインブランチからは135バージョンがリリースされ、最後に一括で切り替える方式は避けられた。

旧アーキテクチャでは、各言語のSDKがCLIサブプロセスを起動し、JSON-RPCを使ってNode.js/V8上のエージェントループを呼び出していた。そのため、クライアントごとにプロセスが1つ増え、プロセス間I/Oが発生し、最低でも約100 MBのワーキングセットが必要だった。新バージョンではTUIとランタイムを分離。ネイティブライブラリが十数個ほどの固定C ABIエントリーポイントを介してJSON-RPCを受け渡し、TypeScript、Python、Go、C#、Java、Rustからインプロセスで読み込めるようになった。アウトオブプロセスモードも引き続き利用できる。SDKの公開変更履歴からは、Node.js、Python、Go、Rustに実験的なFFI transportが先行導入され、Javaでもプラットフォーム別のネイティブパッケージが採用されたことが確認できる。

GitHubは、ローカルで動作し、固定された短い応答を返す決定論的なチャットサーバーを使用して、モデル推論時間とネットワーク時間を除外した。1,000件の単一ターン・セッションライフサイクルテストでは、旧バージョンが毎秒7.55件、Rustのアウトオブプロセス版が57.45件、インプロセス版が120件を完了した。また、10クライアントによって増加したプライベート常駐メモリは、1,383 MBから126 MBへ減少した。これはサービスフレームワークのオーバーヘッドを示すものであり、実際のCopilotの応答速度を表すものではない。さらに、同時期にほかの変更も加えられていたため、この改善をプログラミング言語だけの効果とみなすことはできない。

エンジニアリングチームにとって、より注目すべきなのは検証方法だ。エージェントがコードの大半を生成し、合計で約1,363億token、モデル利用料の公称額で約12万ドルを消費した。しかし9月14日時点でも、マージ済みでコンパイル可能なコードから、シリアライズ、イベント順序、ライフサイクルに関するものを含む数十件のリグレッションが見つかっていた。そのためGitHubは、テスト、互換性ベースライン、免除ラベルについて、書き換えを実装する同一のエージェントが独自に基準を緩和できないようにすべきだと主張している。次に注視すべき点は、SDK v2のネイティブバイナリパッケージング、クロスプラットフォームでのバージョン固定、そしてモデル遅延を含む実環境におけるマルチテナント運用上の効果だ。

出典

  1. Migrating the GitHub Copilot runtime to Rust, using Copilot
  2. Copilot SDK changelog
  3. Copilot SDK native bundling strategy