File Editing APIs for LLMs

Claude Code など agentic な coding assistant たちは LLM にどうやって、つまりどんな API で、コードを書かせているのか。オープンソースな類似品 OpenAI Codex , Roo CodeBlock Project Goose のコードを眺め、ついでに大手 LLM 業者の資料も冷やかす。

Prompts

まずプロンプト。System prompt はあるが、それ以外は基本的にユーザの入力を丸ごと渡しているようである。System prompt はたとえば OpenAI Codex は これ, 次バージョンになると思われる Codex-rs は これ. Block の開発している Goose は これ.

特に Codex(-rs) のプロンプトはコードの書き換えに apply_patch を使うよう指示しているのが特徴的。

Tools - apply_patch for GPT-4.1

ツール。先に書いたように、Codex は apply_patch というツールを使う。apply-patch の利用は GPT-4.1 Prompting Guide が推奨している

Developers have provided us feedback that accurate and well-formed diff generation is a critical capability to power coding-related tasks. To this end, the GPT-4.1 family features substantially improved diff capabilities relative to previous GPT models. Moreover, while GPT-4.1 has strong performance generating diffs of any format given clear instructions and examples, we open-source here one recommended diff format, on which the model has been extensively trained.

というわけで GPT-4.1 は所定のフォーマットで diff を出力できるよう post-train されている。Codex はこのガイドに掲載されている Python の diff 適用アルゴリズムをTypeScript (および Rust) に移植して使っている。(ex. apply-patch.ts)

Roo Code も codex と同じく apply_patch … ではなく、よく似た apply_diff を実装していた。(ただし tool description によると apply_patch 推奨の unified diff ではなく conflict marker を要求している。) この apply_diff tool は以前から使っている様子。OpenAI のいう “Developers have provided us feedback” の出所はこうした大手 agentic coding tool なのだろう。

Tools - “Full Context Mode” for GPT-4.1

apply-patch とは別に、Codex は実験的な “full context mode” を持っている。 --fullcontext フラグ。

コメント によると:

Launch in “full-context” mode which loads the entire repository into context and applies a batch of edits in one go. Incompatible with all other flags, except for –model.

この “full context mode” では apply_patch tool のかわりに structured output を使う: 出力 schema の EditedFilesSchemafile_ops.ts に定義されている。長いので引用しないが、{ファイルの新しいコンテンツ or ファイル移動 or ファイル削除} のリストを返すような構造。つまり全ての編集を一撃で返させている。

素人目にこのアプローチが良い理由はわからない。いずれにせよ apply_patch が専用に train されたなら EditedFilesSchema も絶賛 train 中だと考えるのが自然だろう。いきなりやらせるにはやや無理がありそうだし。

Full-context mode を選ぶとモデルは自動的に GPT-4.1 が選ばれる。これも専用の post-training の可能性を示唆している。

Tools - Text Editor Tool

Anthropic Claude はテキスト編集のために built-in のツールをサポートしている: Text editor tool - Anthropic

このツールは Claude 3.5 のあたらしいやつ (aka 3.6) で導入され、3.7 で強化された。以下のようなコマンドを内包している。

  • view - ファイルの中身を返す。行数で範囲指定もできる。
  • str_replace - 文字列置き換え。(複数マッチしたらどうすんの?)
  • create - 新しいファイルをつくる (衝突したらどうすんの?)
  • insert - 文字列書き足し
  • undo_edit - アンドゥ

この tool は built-in なのでフラグを立てるだけで使える。tool description などを context に詰めてやる必要はない。表面的には普通の tool と同じ扱いで仕様にもばらつきを許している apply_patch とは対象的である。

コードがないので確認はできないが, 常識的に考えて Claude Code はこの “text editor tool” を使っているのだろう。GPT-4.1 の apply_patch 同様 text editor tool もわざわざ post-train されているのだから、使わないと勿体ない。

これらのツールは SWE-Agent paper の提唱する “AI Computer Interface” そのものだった。先の論文は LLM が「使いやすい」インターフェイスを考えようと主張していたが、LLM がそれを post-training によって内包してしまった。こうなると使いやすいも何もない。練習してるんだから。

なお Goose の “developer extension” は このツールをほぼそのまま実装している。 が、特に Claude の built-in tool を指定している様子は見られないし、そもそも Claude 以外でも動作することになっている。でも tool の description はあっさりしたもので、Claude はともかく他のモデルにとって親切とはいいにくい。

感想

これを調べてみようと思ったきっかけはオープンソースの Claude Code 代替品を探した折に Goose を見つけたからだった。

Goose は Claude Code とおなじく CLI で動き、Cline / Roo Code のような VS Code 拡張より個人的には馴染みが良い。それに Claude 以外のモデルも使える。また VC-funded な AI startup でなく AI 無関係な Block が開発しておりカネの匂いがしないのも良い。

ただ使う側の問題として Claude Code のような proprietary な製品と比べあまり性能が劣ると困るし、Model agnostic のアプローチがどのくらい現実的なのかも未知数だった。そこで実際にさわって感触をみる傍ら、実装も眺めてみることにしたのだった。

印象としては…

Model Agnostic なアプローチ: なんとなくダメそう。なぜなら LLM 業者や、同じ業者内でもモデルの種類によって得意なコード編集ツールが違うから。

一方でオープンソースの Goose は Claude text editor tool 互換の tool しか提供せず apply_patch がないし、逆に Cline 系列は apply_patch (apply_diff) だけで src_replace とかが無い。それでもなんとなく動いている。

根本的に apply_diffstr_replace もやっていることは文字列置き換えで、apply_diff は行単位、str_replace は文字単位という違い。賢いモデルたちはそのくらいの違いならある程度は吸収できていそうではある。ただ native support しているものを使える方が堅牢性は高まるはずだよね。

Claude Sonnet 3.x と GPT-4.1 以外のモデル: 表面的にみるとコード編集とか全然できなそうじゃない? Gemini 2.5 や DeepSeek V3/R1 は OpenRouter で人気があり、これらは Cline / Roo Code ユーザなど vibe coding の皆さんに人気だと (r/ChatGPTCoding の風潮などから) 解釈しているのだが、どうなっているのだろう。

たとえば auto complete にだけ使われていて agentic 用途では claude や GPT が使われいる、賢さによってねじ伏せている、積極的にアピールしていないだけで apply_patch の pre-/post-training をしている、などなど可能性は色々考えられるが、実際のところはどうなのだろうねえ。

ツールの流動性: “full-context-mode” のような実験をみるに、まだどのような tooling が agentic coding に効果的な のか OpenAI のようなモデル業者ですらわかっていない。仮に apply_diff と Claude text editing は似たようなものだとしても、後続のモデルが EditedFilesSchema のように novel な tool をサポートしてくることはいかにもありそう。

なので model-agnostic agent を作ってる人々はきちんとキャッチアップする必要がある。現状は Goose もRoo Code も tool は固定されていて、モデルにあわせて調整とかしてない。してくれ。

自分: 特段 heavy vibe coder というわけではなくひやかしているだけので、しばらく Claude Code と Goose を行ったり来たりしつつ OSS の新星 agentic coder が綺羅星のように降ってこないかなーと空を仰ぎ待ちたいと思います。