post cover

用 LLM 构建一个编码代理:Simon Willison 的 llm-coding-agent 实践(2026-07-03)


本文为翻译/转载,原文使用 CC BY-NC-SA 4.0 协议发布。 原文作者:Simon Willison 原文标题:Release: llm-coding-agent 0.1a0 原文链接:https://simonwillison.net/2026/Jul/2/llm-coding-agent/ 原文发布:2026-07-02 本博客不参与任何商业变现(含 ads / 付费 / affiliate),本译文遵循 CC BY-NC-SA 4.0 条款发布。

【译者按】

本文是 Simon Willison 在 2026 年 7 月 2 日发布的一篇”快文”(beat),记录了他如何利用 Claude Code(Fable 5)结合自身的 LLM 框架,在极短时间内从零构建出一个原型编码代理。这类”全自动写代码代理”话题近来在中文圈同样热度极高——Cursor、Claude Code、GitHub Copilot Agent 等工具正快速迭代。Simon 的特别之处在于:他不是在讨论某个商业产品的使用技巧,而是从库的底层出发,自己用 LLM 构建了一个代理框架,并完整公开了整个流程。对于中文圈想要理解 AI 编码代理底层原理、以及如何在自己的工具链中定制类似能力的开发者来说,这是一份难得的实操参考。


【正文】

又是一个 Fable 5 的实验。随着我的 LLM 库 逐渐演变成一个更像代理框架的东西,是时候看看用它构建一个简单的编码代理会是什么样子了。

我用 python-lib-template-repository 这个 GitHub 模板仓库启动了一个新的 Python 库,然后运行了以下两个提示词(这里是 Claude Code for web 的完整记录):

给这个项目写一个 spec.md —— 它将依赖 PyPI 上最新的 “llm” alpha 版本,并实现一个 Claude Code 风格的编码代理,配备用于读写文件和执行命令的工具。

然后:

将 spec 提交,然后用红/绿 TDD 方式在一系列合理的提交中构建它(每次提交都有通过的测试和更新后的文档)—— 偶尔用你环境中的 OpenAI API key 手动测试一下。

这里有 spec 文件生成的 README 文件以及提交序列

我已经把 slop-alpha 版本发布到了 PyPI,所以你可以这样运行这个新代理:

uvx --prerelease=allow --with llm-coding-agent llm code

对于一个初版来说,它表现得相当不错!以下是(由 Fable 编写的)README,其中列出的使用方式包括 llm code --yolollm code --allow "pytest*" --allow "git diff*" 等。

它还提供了一个 Python API,基于一个 CodingAgent(model="gpt-5.5", root="/path", approve=True).run("Fix the failing test in tests/test_parser.py") 类——我并没有要求这个,但看到它被实现出来我很高兴。

以下是它实现的工具集,通过 uvx ... llm tools 列出:

CodingTools_edit_file(path: str, old_string: str, new_string: str, replace_all: bool = False) -> str

在文件中替换一个精确字符串。old_string 必须与文件内容完全匹配(包括空白字符),并且必须标识一个唯一位置(除非 replace_all 为 true)。返回变更的 diff 以便验证。

CodingTools_execute_command(command: str, timeout: int = 120) -> str

在会话根目录下执行一条 shell 命令。返回合并的 stdout 和 stderr 后跟退出码行。timeout 以秒为单位(最大 600);超时时整个进程树将被杀死。

CodingTools_list_files(pattern: str = '**/*', path: str = '.') -> str

按照 glob 模式列出文件,最新的排在前面。跳过隐藏目录、node_modules、__pycache__ 以及(在 git 仓库中).gitignore 覆盖的任何路径。最多返回 200 条相对于搜索目录的路径。

CodingTools_read_file(path: str, offset: int = 0, limit: int = 2000) -> str

读取文本文件,像 cat -n 一样返回带行号的输出。路径相对于会话根目录。使用 offset(从 0 开始的首行)和 limit(最大行数)来分页读取过大的文件。

CodingTools_search_files(pattern: str, path: str = '.', glob: str = None, max_results: int = 100) -> str

在文件内容中搜索正则表达式。返回格式为 path:line_number:line 的匹配项,上限为 max_results。使用 glob(如 "*.py")限制搜索范围。

CodingTools_write_file(path: str, content: str) -> str

用给定内容创建或覆盖文件。必要时创建父目录。修改现有文件时建议优先使用 edit_file


我用 llm code --yolo 试了试,然后给出提示:

mkdir /tmp/demo,然后在该文件夹中创建一个简单的 SwiftUI CLI 应用,用 ASCII 艺术显示时间

这是记录,GPT-5.5 在推理过程中指出”SwiftUI 不适合真正的 CLI”,然后构建了一个运行 swift run AsciiTime 时输出以下内容的应用:

      █    █████         ████     █             █     ███
     ██    █        █        █   ██      █     ██    █   █
      █    ████           ███     █             █       █
      █        █    █        █    █      █      █      █
     ███   ████          ████    ███           ███   █████

【译者注】

  1. Fable 5:即 Anthropic 的 Claude Fable 5 模型,是 Claude 系列的最新一代,具备强大的代码生成和推理能力。“Fable 5”在这个上下文中是 Claude Code for web 使用的底层模型。
  2. Slop-alpha(半成品 alpha):Simon 自嘲的说法,“slop”在 AI 圈指快速生成的低质量内容,这里带有自嘲意味。
  3. uvx:Python 生态中快速运行包的工具,类似于 npx,是 uv 包管理器的一部分。
  4. TDD(测试驱动开发):先写测试(红),再实现代码使其通过(绿),最后重构——Simon 的提示词巧妙地让 AI 遵循了这一工程实践。
  5. 值得注意的是,Simon 构建的这套工具(edit_file/execute_command/read_file/search_files/write_file/list_files)与 Claude Code、Cursor 等商业产品内部的工具集高度相似,说明这类”文件系统 + shell 执行”的工具范式正在成为编码代理的标准模式。

【延伸阅读】