
aider 脚本化编程实战指南用--message与 Python API 把 AI 结对编程接入自动化流水线【免费下载链接】aideraider is AI pair programming in your terminal项目地址: https://gitcode.com/GitHub_Trending/ai/aideraider 是一个在终端里运行的 AI 结对编程工具它的价值不只停留在交互式聊天。通过命令行参数或 Python API你可以把「读懂需求 → 修改文件 → 生成提交」这条完整链路封装成单次可调用的函数级入口进而放进 shell 脚本、批处理任务与 CI/CD 流程。本篇以仓库内文档 scripting.md 为主线结合 base_coder.py 等源码实现完整讲解命令行与 Python 两条脚本化路径、每个关键参数的真实含义与底层行为以及对应的仓库级证据与测试用例。读完后你将能写出一键改造多个文件、无人值守批处理乃至程序化调用的完整脚本。两条脚本化路径概览aider 的脚本化能力只有两个入口都围绕「一次调用完成一件开发任务」展开命令行路径aider进程接收--message自然语言指令执行完唯一一件工作编辑文件后自动退出适合 shell 脚本、for循环批处理与 CI 任务Python 路径在进程内创建Coder对象多次调用coder.run(...)连续下达指令适合需要在同一进程内做状态管理、串联多轮修改的复杂编排。两条路径共享同一套底层实现main.py解析命令行后本质上调用的是Coder.create(...)coder.run(with_message...)这一点可以从 main.py 的调用链得到印证。理解这一点你在两条路径间迁移心智成本几乎为零。命令行脚本化单指令、自动退出、零交互--message一次指令完成一次修改aider 接受--message别名--msg、-m参数传入一段自然语言指令。它只会执行这一件事应用对文件的修改后退出进程不再进入交互式聊天aider --message make a script that prints hello hello.js核心特征是单次执行、自动退出没有这条参数时 aider 会进入循环读取用户输入的 REPL 式聊天一旦给出--message主流程在 main.py 中执行coder.run(with_messageargs.message)后即触发exit事件并返回不会停留在交互状态。这意味着它可以安全地出现在Makefile、package.jsonscripts 或其他自动化流程里无需任何人工应答。shell 批处理把同一条指令应用到大量文件把--message与 shell 循环组合就能批量对一组文件施加同一改造指令for FILE in *.py ; do aider --message add descriptive docstrings to all the functions $FILE done每次循环独立启动一个 aider 进程针对单个文件执行「加注释、编辑、自动提交」的完整任务再退出。注意每轮都是新的 LLM 会话彼此没有记忆因此适合对无状态、可独立完成的批量改造如果任务之间存在依赖关系或需要共享上下文应改用下面介绍的 Python 路径在同一个会话内连续执行。用于脚本化的核心参数完整参数以aider --help输出为准仓库内权威清单见 options.md。其中对脚本化最关键的参数如下默认值与环境变量名均已验证参数作用默认值环境变量--stream, --no-stream是否流式输出回复TrueAIDER_STREAM--message COMMAND--msg、-m发送单条消息给模型处理完回复后退出关闭聊天模式—AIDER_MESSAGE--message-file MESSAGE_FILE-f从指定文件读取要发送的消息内容处理后退出—AIDER_MESSAGE_FILE--yes对所有确认一律回答 yes无人值守必需—AIDER_YES--auto-commits, --no-auto-commits开启/关闭对模型改动的自动 git 提交TrueAIDER_AUTO_COMMITS--dirty-commits, --no-dirty-commits开启/关闭「仓库处于 dirty 状态时先提交再操作」TrueAIDER_DIRTY_COMMITS--dry-run, --no-dry-run试运行不实际修改任何文件FalseAIDER_DRY_RUN--commit用一条合适的提交信息提交所有待提交改动后退出—AIDER_COMMIT命令行原文档中的参数速查块如下脚本化场景可直接复制使用--stream, --no-stream Enable/disable streaming responses (default: True) [env var: AIDER_STREAM] --message COMMAND, --msg COMMAND, -m COMMAND Specify a single message to send GPT, process reply then exit (disables chat mode) [env var: AIDER_MESSAGE] --message-file MESSAGE_FILE, -f MESSAGE_FILE Specify a file containing the message to send GPT, process reply, then exit (disables chat mode) [env var: AIDER_MESSAGE_FILE] --yes Always say yes to every confirmation [env var: AIDER_YES] --auto-commits, --no-auto-commits Enable/disable auto commit of GPT changes (default: True) [env var: AIDER_AUTO_COMMITS] --dirty-commits, --no-dirty-commits Enable/disable commits when repo is found dirty (default: True) [env var: AIDER_DIRTY_COMMITS] --dry-run, --no-dry-run Perform a dry run without modifying files (default: False) [env var: AIDER_DRY_RUN] --commit Commit all pending changes with a suitable commit message, then exit [env var: AIDER_COMMIT]参数组合的实战套路在无人值守场景通常需要把「不打断 可回滚 独立提交」组合起来常见的三种配方# 1. 无确认、不流式跑完即退 aider --message fix the typo in the docstring --yes --no-stream utils.py # 2. 试运行先验证模型会改哪些文件不真正落地 aider --message refactor this function --dry-run --yes refactor.py # 3. 只做提交对当前工作区所有待提交改动自动生成提交信息 aider --commit--yes脚本没有任何交互终端来回答Are you sure?之类的确认因此自动任务必须携带--yes等价环境变量AIDER_YES。它对应的底层行为可在 io.py 中看到InputOutput构造函数接收yes参数确认逻辑中self.yes is True时直接返回「y/yes」而不再等待键盘输入。--dry-run默认False。开启后模型照常产出编辑意图但不真正写文件在 main.py 中连--commit也会被显式跳过并提示Dry run enabled, skipping commit.非常适合在 CI 里做「只审不改」的变更预演。--commit单独使用时不发任何消息仅对仓库内所有 pending 改动调用cmd_commit()生成一条合适的提交信息后退出可视为把「提交信息生成」也脚本化。git 自动提交语义--auto-commits默认开决定模型完成文件修改后是否自动 git 提交--dirty-commits默认开决定仓库在任务开始前若已有未提交改动是否先做一个提交以隔离模型本次改动。批处理多条脚本时建议保持二者开启让每条指令的产出形成独立、可回溯的提交。长指令用--message-file而非拼接命令行当指令文本较长、含换行或多行上下文时把它写进文件再读取是更工程化的做法cat task.txt EOF Look at the module structure. Then add descriptive docstrings to every public function and a module-level docstring at the top. EOF aider --message-file task.txt --yes src/源码路径 main.py 显示--message-file会把文件内容用io.read_text()读出并交给同一个coder.run(with_message...)行为与--message完全一致只是消息来源从命令行参数变为文件。所有AIDER_*环境变量都支持通过export或配置文件如 sample.env、dotenv.md 所述机制注入便于把密钥与策略性开关从命令行中剥离。Python 脚本化在同一会话内连续驱动 Coder命令行方案每执行一条指令就启动一个新进程、丢失全部上下文。如果希望在同一进程中连续下达多轮指令、共享历史与文件状态aider 提供了 Python APIfrom aider.coders import Coder from aider.models import Model # 要加入聊天的文件列表 fnames [greeting.py] model Model(gpt-4-turbo) # 创建 coder 对象 coder Coder.create(main_modelmodel, fnamesfnames) # 对上述文件执行一条指令后返回 coder.run(make a script that prints hello world) # 再发一条指令共享同一上下文 coder.run(make it say goodbye) # 聊天内的 / 命令同样可以直接调用 coder.run(/tokens)模型对象Model(...)做了什么Model(gpt-4-turbo)负责把字符串模型名解析为带完整元数据的模型对象。从 models.py 的Model.__init__可知它首先经过MODEL_ALIASES做别名归一化例如4o、sonnet等短别名会映射到真实模型名后续还承载 edit_format、上下文窗口、价格信息等能力查询。示例中的gpt-4-turbo是文档写作时的模型当前仓库代码中DEFAULT_MODEL_NAME常量为gpt-4o见 models.py若未显式指定模型Coder.create会回退到该默认值请根据你实际配置的可用模型选择名称。Coder.create(...)按编辑格式分发具体实现Coder是一个按「编辑格式」分发的门面类。类方法 create() 会若未传main_model则取from_coder的模型或默认模型Model(DEFAULT_MODEL_NAME)解析edit_formatcode视为不指定缺省使用主模型的默认编辑格式遍历aider/coders/__init__.py注册的所有 coder 子类找到edit_format匹配的那个并实例化返回找不到则抛出UnknownEditFormat支持from_coder克隆现有会话连同fnames、历史消息、commands、文件监视器一起迁移必要时先做历史摘要压缩。因此create()是第一推荐入口你无需关心底层具体使用 wholefile、udiff 还是 editblock 格式全部由模型元数据自动决定。coder.run(...)一条消息一次往返实例上最重要的是 run()def run(self, with_messageNone, preprocTrue): try: if with_message: self.io.user_input(with_message) self.run_one(with_message, preproc) return self.partial_response_content # 未传消息 - 进入交互式 get_input 循环 while True: ...关键语义传with_message时执行单条指令并直接返回模型回复文本partial_response_content不进入输入循环这正是 Python 脚本化的核心契约不传参数时退化为完整的交互式 REPL与终端体验一致/命令可直接执行coder.run(/tokens)这类调用会命中 commands 分发逻辑方便在脚本中随时查询 token 用量等会话状态。仓库测试 test_scripting.py 给出了同构的可运行验证它 mock 掉Coder.send创建一个Model(gpt-4-turbo)与greeting.py文件依次调用coder.run(make a script that prints hello world)和coder.run(make it say goodbye)断言send恰好被调用两次且两次返回值均为partial_response_content的内容——证实了「同一对象可连续多次 run、每次返回回复文本」的脚本化用法。自动应答构造InputOutput(yesTrue)无人值守时会话内也会出现各种确认弹窗。Python 侧不需要命令行参数而是直接构造一个「永远自动确认」的 I/O 对象传入createfrom aider.io import InputOutput io InputOutput(yesTrue) # ... coder Coder.create(main_modelmodel, fnamesfnames, ioio)从 io.py 的实现可以确认yesTrue时所有 confirm 类询问都会被短路为肯定回答self.yes is True分支直接返回y/yes避免脚本在交互确认处挂起。传入create后即可覆盖默认的InputOutput。提示Coder.create()的首个形参是main_model见 base_coder.py。虽然示例中也有以create(modelmodel, ...)形式出现的写法但为与当前签名保持一致、避免关键字落入**kwargs产生歧义建议始终显式写作create(main_modelmodel, fnames..., io...)。Coder构造参数速览Coder.__init__见 base_coder.py在create之上还暴露了一批可供编排的细节参数与命令行选项一一对应fnames/read_only_fnames进入聊天可编辑与只读参考的文件集合文件不存在时会被自动touch创建被.gitignore/.aiderignore命中的文件会被跳过auto_commitsTrue、dirty_commitsTrue对应--auto-commits/--dirty-commits且auto_commitsFalse时dirty_commits会被强制置否dry_runFalse对应--dry-run试运行不落盘map_tokens1024repo-map 的 token 预算设为 0 则关闭仓库地图streamTrue、use_gitTrue、show_diffsFalse、auto_lintTrue、auto_testFalse、test_cmdNone分别对应流式、git 集成、diff 展示、自动 lint/测试等行为restore_chat_historyFalse从聊天历史文件恢复上次对话。这些参数在 main.py 中被逐一从命令行参数灌入Coder.create因此两条路径在配置语义上是完全打通的。可编排性示例脚本内多文件、多轮 试运行门禁from aider.coders import Coder from aider.io import InputOutput from aider.models import Model fnames [api_server.py, api_server_test.py] io InputOutput(yesTrue) # 自动确认无人值守 model Model(gpt-4-turbo) # 换成你实际可用的模型名 coder Coder.create(main_modelmodel, fnamesfnames, ioio, auto_commitsTrue, dirty_commitsTrue) reply coder.run(add input validation for all public endpoints) print(reply) reply coder.run(update the tests to cover the new validation logic) print(reply)若把dry_runTrue传进去则模型会给出改动方案但不会真实修改适合先评审再放行。底层链路命令行与 Python 如何殊途同归要真正用好脚本化值得理解一次「消息执行」在进程内经历了什么。以aider --message ...为例可追踪到如下证据链main.py命中args.message分支先把消息写入输入历史随后coder.run(with_messageargs.message)完成后记录exit reasonCompleted --message并返回coder来自Coder.create(...)main.py 汇总fnames、auto_commits、dry_run、stream、map_tokens等全部参数依据edit_format分发到具体 coder 子类run() 收到with_message后调用run_one()完成「组装上下文 → 调用模型 → 解析编辑 → 落盘/提交」的完整流程并把模型最终回复存入partial_response_content返回。所以命令行--message本质上是「临时构造一个Coder后调用一次run(with_message)」与 Python 脚本中连续coder.run(...)走的是同一套编辑与提交管线。理解了这条链路你就能在「临时用一次」与「程序化复用」之间平滑切换。适用前提与稳定性边界需要已配置可用的模型 API脚本执行依赖真实模型调用需按 llms 或 config/options.md 中对应厂商章节配置好密钥与端点否则进程会因鉴权失败退出。git 提交语义依赖仓库环境自动提交auto_commits/dirty_commits与--commit需要目标目录处于 git 仓库中use_gitFalse或非 git 目录下只会产生文件编辑而不会产生提交。Python 脚本化 API 为实验性接口原文档明确声明——Python 脚本化 API 未获正式支持与文档化承诺未来版本可能在不提供向后兼容的情况下变更The python scripting API is not officially supported or documented, and could change in future releases without providing backwards compatibility.因此若追求长期稳定优先使用命令行参数--message/--message-file及各类AIDER_*环境变量Python API 更适合需要会话内多轮编排的脚本并应在升级版本后重新回归验证。结语aider 的脚本化能力可以概括为一句话把一次交互式结对变成一次可编程调用。命令行侧用--message/--message-file加--yes、--auto-commits、--dry-run等开关适合 shell 循环与 CI 的一次性任务Python 侧用Coder.create()coder.run()InputOutput(yesTrue)可在单一进程内连续执行多轮指令并读取每次回复。两者共用 base_coder.py 中的run()管线行为一致、可互相印证。实际使用时请以aider --help与 options.md 的实时输出为准并留意 Python API 的实验性边界——从「批处理自动化」到「程序内 AI 编码引擎」你需要的全部入口都已在这里。【免费下载链接】aideraider is AI pair programming in your terminal项目地址: https://gitcode.com/GitHub_Trending/ai/aider创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考