GitHub Copilot NESの内部実装が公開、そして続・AIエディタ戦争

Copilot NESとは

Copilot NES(Next Edit Suggestions)は2025年2月にリリースされたGitHub Copilotの内部機能です。コードの変更に連動して必要となる次の編集を予測し、タブキーを押しているだけで複数箇所にわたる修正を提案してくれます。通常のコード補完がカーソル位置の続きのコードを予測するのに対して、Copilot NESは「エディタ上の編集操作」の単位で続きを予測して補完します。

GitHub Next | Copilot Next Edit Suggestions
GitHub Next Project: Can we improve Copilot code completion by suggesting the next logical change, wherever it is in your project?

この仕組みはCopilot NESの元ネタであるCursor Tab(Copilot++)によって実用化されましたが、Cursorはプロプライエタリなソフトウェアなので内部の詳細が分かりませんでした。

しかし最近マイクロソフトはCopilot Chat拡張のソースコードをMITライセンスで公開しました。これによってCopilot NESの内部実装が明らかになりました。公開されたのはCopilot拡張本体ではなくCopilot Chat拡張の方です。

Open Source AI Editor: First Milestone
We are open sourcing the GitHub Copilot Chat extension. It’s the first milestone in making VS Code an open source AI editor.
GitHub - microsoft/vscode-copilot-chat: Copilot Chat extension for VS Code
Copilot Chat extension for VS Code. Contribute to microsoft/vscode-copilot-chat development by creating an account on GitHub.

このリポジトリは、Copilot NESやCursor Tabのような機能を開発したい人の参考になるはずです。

どのような仕組みか

Copilot NESはユーザーのエディタ上の「操作履歴」を記録します。操作履歴のデータを専用モデルに送信して「続きの操作」を推論します。これはカーソルをどこに移動して、コードをどう変更するのかというマルチステップのコマンドを返します。

Copilot NESはその結果を受け取り、ユーザーに補完結果としてリアルタイムで表示します。ユーザーは次の補完をタブキーで受け入れることで連続した編集操作を行えます。

内部アーキテクチャ

Copilot NESは内部的には「InlineEdit」というモジュール名で呼ばれます。これはCmd-kで対話実行してファイル編集をするCopilot Chatの機能 InlineChatとは別物です。

InlineEditから呼び出され、モデルによる推論を行うのが「Xtab」というモジュールです。Xtabは現在のファイル内容、カーソル位置、編集履歴などを組み合わせてプロンプトを作成し、AIモデルに送信してコード編集の提案を取得します。

このモデルの名前は「xtab-4o-mini-finetuned」です。gpt-4o-miniをNES用にファインチューニングしたモデルだと思います。

この記録された編集履歴の例がリポジトリのテストコードにあります。編集の時系列の変更をオブジェクトにしたものです。

これが以下のようなテキスト形式のdiffに変換され送信されます。

"  147 147 			commandsWithArgs.set(commandId, argumentsSchema);
  148 148 		}
+     149 
+     150 		
  149 151 
  150 152 		const searchableCommands: Searchables<Command>[] = [];
  151 153 
---
  148 148 		}
  149 149 
- 150     		
+     150 		function findVscodeDiff(schema: any, path: string[] = []): void {
  151 151 
  152 152 		const searchableCommands: Searchables<Command>[] = [];
  153 153 
---

モデルのレスポンスに<EDIT>...</EDIT><INSERT>...</INSERT>などで囲まれたソースコードが含まれます。Xtabはこれをパースしてファイルに適用します。

<INSERT>  
console.log('新しいコード');  
</INSERT> 
<EDIT>  
function updatedFunction() {  
    return 'updated code';  
}  
</EDIT> 

おわりに:続・AIエディタ戦争

先日マイクロソフトがフォークエディタ向けに拡張機能のライセンス制限を強めた話を書きました。筆者はマイクロソフトがCopilot ChatをOSS化した動機もこの「AIエディタの開発競争」の大きな流れの中にあると思っています。

【今週の話題】AIエディタ戦争
マイクロソフトがVSCodeフォークエディタ上での自社拡張をブロック マイクロソフトは、CursorやWindsurfなどのフォークエディタで自社開発のVSCode拡張機能(C++やC#など)の使用を制限しました。 Has the VSCode C/C++ Extension been blocked? · Issue #2976 · getcursor/cursorWhile coding just now I got this msg: The C/C++ extension may be used only with Microsoft Visual Studio, Visual Studio for Mac, Visual Studio Code, Azure DevOps, Team Foundation Server,

今回のGitHub Copilotのソースコード公開がそれほど大きな変化かというとそうでもありません。推論の主体はサーバーサイド側にありますし、もともとVSCode拡張はユーザーにはパッケージングされたJavaScriptコードを配布する形態なので中身を解析することは自由にできました。またVSCode本体もOSSですが、マイクロソフトが提供するビルドの中身すべてが公開されているわけではありません。

CursorやWindsurfがVSCodeをフォークした理由は、既存の拡張機能の枠組みでは実現できない体験を開発するためとしています。もちろん、さらなるフォーク製品でビジネスを簡単にコピーされるのを避けるという都合もあるのでしょうが、VSCodeのアーキテクチャ上フォークをせざるを得なかったというのはある程度理解できます。GitHub Copilot Chatも同じ段階にあるのではないでしょうか。つまりはAIエディタの体験を向上するためにVSCode本体に密結合する必要があると判断されたということです。

一方、これによって割を食いそうなのはVSCode拡張のサンドボックス内で無邪気に遊んでいたClineやRoo Codeのようなサードパーティです。GitHub Copilot Chatがエディタに統合され、自由に内部APIを使えるようになると、それを拡張APIとして利用できるようにしてもらわないとこれらは同じ機能が作れなくなります。

直近では「OpenAIの買収提案合意か」の報道があったWindsurfへ、Anthropicが企業提供していたAPI利用を取り下げたという一件もありました(重要なのは買収が締結されたという事実はまだ確認されていないことです)。

Anthropic co-founder on cutting access to Windsurf: ‘It would be odd for us to sell Claude to OpenAI’ | TechCrunch
Anthropic’s Jared Kaplan said the company largely cut Windsurf’s direct access to Anthropic’s Claude AI models because of rumors OpenAI is acquiring the startup.

そして現在の業界はClaude CodeをつかったAgentic Codingが全盛です。モデルプロバイダも巻き込んで、AIエディタ戦争の行方はますます目が離せないものへとなってゆくでしょう。

Subscribe to laiso

Sign up now to get access to the library of members-only issues.
Jamie Larson
Subscribe