Coding Agents — 「对世界采取动作」分支里最成熟的一支
这条分支在货架里的位置: 总纲把这 189 个库的共性讲成一句话——「把一个只 会吐文本的 LLM,包成能在循环里感知-动作、能被放心运营的程序」。围绕这条共性分出 6 条分支,本章是其中**分支 B「对世界采取动作」**里被拆得最透的一支:当那个「动作」是改一个真实代码库时,LLM 文本怎么可靠地变成对磁盘文件的精确编辑。 别的分支只是把「动作」换成查文档 / 控浏览器 / 搭流程——内核同源,但编码 agent 把「意图→精确落盘」这一环逼到了极致,所以最值得先读。
30 秒导读: 这一档库都在干同一件事——让 LLM 可靠地改一个真实的代码库。难点从来不是「调用模型」,而是四个工程问题:① 该改哪(怎么给模型看代码上下文)、② 把模型说的改动精确落到磁盘文件、③ 改错了怎么恢复、④ 一个大任务跑很久怎么管。本章把 19 个库横过来切,告诉你这四个问题各有哪几种流派、各自的代表作、以及整个领域在往哪走。读完你应该能自己画出这张地图。
怎么读本章: 正文是给人读的白话综述,不出现路径行号。每个论断后面挂一个脚注
[^x],精确的仓库/路径:行+ 符号名都在脚注里;对比矩阵则单开一列「代码锚点」放引用。人读正文,agent 读脚注 / 锚点列。
1. 这条分支要解决什么(第一性原理)
承上:整个货架的共性是「给只会说话的 LLM 装手脚,让它能对世界采取动作」。本分支把「动作」锁 死成**「改代码」**——这恰好是最难、也最能看清工程取舍的一种动作,因为「改对一个文件」比「点一个按钮」要求高得多:差一个缩进就落盘失败。
假设你在一个几百个文件的项目里,想让 AI 帮你加个功能。把整个项目贴进聊天窗口不现实(太大),AI 给你的代码你还得手动对齐、复制粘贴到正确位置。一个「编码 agent」就是替你把这两件苦工自动化的程序。
把它拆开,所有编码 agent 都在解四个子问题:
| 子问题 | 白话 | 难在哪 |
|---|---|---|
| 代码上下文 | 该让模型看哪些代码? | 仓库装不进上下文窗口 |
| 编辑落盘 | 「把这段换成那段」怎么打到文件上? | 模型给的旧代码几乎从不和文件一字不差 |
| 错误恢复 | 对不上 / 跑测试报错怎么办? | 不能静默吞,也不能死循环 |
| 长任务管理 | 改十个文件、跑半小时怎么不跑飞? | 上下文会爆、会偏题、会忘 |
一句话直觉: 模型负责「理解需求、想出改动」,确定性代码负责「把改动精确落盘、挑相关上下文、出错重试」。一个编码 agent 的工程价值,几乎全在后半句。本章 §2–§3 主要围绕编辑落盘和代码上下文这两条主轴展开,因为它们的流派分化最清楚、最能体现各库的取舍。
形态上,这 19 个库落在三种壳子里:CLI / 终端(aider、codex、crush、gemini-cli、qwen-code、plandex、gptme、pi、oh-my-pi、ra-aid、kilocode、openwork)、IDE 扩展(cline、continue、tabby)、Neovim 插件(avante-nvim、codecompanion-nvim)。还有两个特例:tabby 其实是代码补全服务 器(不做 agentic 编辑),auto-code-rover 是面向 SWE-bench 的研究型程序修复 agent。
2. 流派一:编辑怎么落盘(本分支的灵魂)
这是分化最剧烈的一条主轴。「模型描述一处改动,程序把它打到文件上」——光这一步就长出了五个流派。
怎么读这张图: 从左到右是「模型负责精确」的程度递增。最左边模型只管出意图、程序兜底容错;越往右越依赖模型自己给出能精确定位的编辑。最下面单列的⑤换了一套思路——不匹配文本,靠结构 / 锚点定位。
模型只出意图 ────────────────────────────────► 模型自己给精确定位
程序兜底容错 运行时只做执行
┌──────────┐ ┌──────────┐ ┌──────────────┐ ┌──────────────┐
│ ① 整文件 │──►│ ② 文本 │──►│ ③ 结构化工具 │──►│ ④ 第二个模型 │
│ 重写 │ │ diff 块 │ │ 调用 │ │ 来 apply │
│whole file│ │SEARCH/ │ │str_replace / │ │ apply model │
│ │ │REPLACE │ │ apply_patch │ │ fast-apply │
└──────────┘ └──────────┘ └──────────────┘ └──────────────┘
┌────────────────────────────────────────────────────────────────┐
│ ⑤ 结构 / 锚点定位(不匹配文本):tree-sitter 引用 / hash anchor │
└────────────────────────────────────────────────────────────────┘
下面逐个流派接地。关键洞察:无论哪个流派,只 要模型给的是「一段要被找到的旧文本」,就绕不开模糊匹配——这是②③⑤共同的暗线(见 §2.6)。
2.1 整文件重写(whole file)
最朴素:让 LLM 把整个文件重写一遍,程序直接覆盖写盘。简单、不会「对不上」,但浪费 token、还容易误删没动的代码。
- aider 把整文件重写做成一个独立 coder,并且它是模型设置里的默认格式——弱模型用它最稳。1 详见子库 doc aider/04-loop-and-git.md §4.6。
- plandex 在需要时走「重建整文件」路径,有专门的整文件提示模板。2
- cline 的整文件写工具(
write_to_file)同样直接覆盖,创建新文件或大段重写时用它。3