Simon Willison · 博客

llm-coding-agent 0.1a0

llm-coding-agent 0.1a0

二〇二六年八月二十六日 · 英文原文

llm-coding-agent 0.1a0 发布,基于 Fable 5 和 PyPI 上的 llm alpha 版本构建,实现了一个 Claude Code 风格的 coding agent。该 agent 包含 CodingTools_edit_file、CodingTools_execute_command、CodingTools_list_files、CodingTools_read_file、CodingTools_search_files、CodingTools_write_file 等工具,支持通过 uvx --prerelease=allow --with llm-coding-agent llm code 运行。测试中,agent 使用 GPT-5.5 模型在 /tmp/demo 目录下创建了一个 SwiftUI CLI 应用 AsciiTime,以 ASCII 艺术形式显示时间。

发布:llm-coding-agent 0.1a0 又一个 Fable 5 实验。既然我的 LLM 库已经演变成一个更偏向 agent 框架的东西,是时候看看基于它构建的简单 coding agent 会是什么样子了。我用我的 python-lib-template-repository GitHub 模板仓库创建了一个新的 Python 库,然后运行了以下两个 prompt(这里是 Claude Code 的网页转录):为这个项目编写一个 spec.md——它将依赖 PyPI 上最新的 "llm" alpha 版本,并实现一个 Claude Code 风格的 coding agent,包含用于读取和编辑文件以及执行命令的工具。然后:提交 spec,接着通过一系列合理的提交(每个提交都有通过的测试和更新的文档)使用红绿 TDD 来构建它——偶尔使用你环境中的 OpenAI API 密钥手动测试它。这是 spec、生成的 README 文件以及提交序列。我已经将一个 slop-alpha 版本发布到了 PyPI,所以你可以像这样运行新的 agent:uvx --prerelease=allow --with llm-coding-agent llm code。作为首次尝试,效果相当不错!这是(Fable 编写的)README,其中列出了诸如 llm code --yolo 和 llm code --allow "pytest*" --allow "git diff*" 之类的用法。它还展示了一个基于 CodingAgent(model="gpt-5.5", root="/path", approve=True).run("Fix the failing test in tests/test_parser.py") 类的 Python API,这个类我并没有要求,但很高兴看到它被实现了。这是它实现的工具集,通过 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,后跟一行 Exit code。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 然后输入 prompt 来尝试它:mkdir /tmp/demo 然后在该文件夹中创建一个简单的 SwiftUI CLI 应用,用于以 ASCII 艺术形式显示时间。这是转录,其中 GPT-5.5 的推理指出 "SwiftUI isn't suitable for a true CLI",然后构建了一个在 swift run 时输出以下内容的应用 AsciiTime:█ █████ ████ █ █ ███ ██ █ █ █ ██ █ ██ █ █ █ ████ ███ █ █ █ █ █ █ █ █ █ █ █ ███ ████ ████ ███ ███ █████ 标签:projects, ai, generative-ai, llm, llm-tool-use, coding-agents, claude-code, claude-mythos-fable

译自 Simon Willison · 博客 · 录于 二〇二六年八月二十六日