用终端写代码的人,大概率都听过Aider。它不是那种轻度补全插件,而是真正意义上的AI配对编程工具——你坐在命令行里,把需求丢给它,它读取你的整个代码仓库,改文件、跑测试、提交commit,一套流程全在终端里闭环。更关键的是,Aider支持自定义API,你完全可以把模型源换成自己手里的接口,或者接上本地跑的模型。这篇文章就围绕"自定义API配置"这条主线,把从安装到接入的完整过程讲透,包含环境变量、配置文件、本地模型接入和我实际踩过的坑。适合想在终端里用AI改代码的开发者,也适合那些已经装了Aider、但想换模型源或改接口地址的朋友。
Aider的核心设计我很喜欢:它把AI改代码这件事融进了标准git工作流。每次修改它会给出diff,确认后才写入文件,然后自动commit。出了任何问题,一条git revert就能回到之前的状态。这个机制让它和那些只在对话框里吐代码片段的工具完全不一样,也让我这种习惯命令行的人用起来非常顺手。
1. Aider是什么?为什么要在终端里做AI配对编程
1.1 先搞清楚它解决的问题
传统AI编程工具大多是IDE插件形态,比如在编辑器右侧开个对话框,把代码贴进去问,再把生成的代码复制回来。这种模式的问题在于:上下文是断裂的,AI看不到完整的项目结构,改完的代码还要手动粘贴、手动测试、手动提交。
Aider的思路是反过来的。它直接运行在你的项目目录里,启动时就会读取仓库里的文件,你能通过命令把指定文件加入"会话上下文"。当你说"帮我修一下登录接口的鉴权逻辑",它会自己定位相关文件、给出修改方案、等你确认后落地修改,最后打上commit。全程你只需要看它在终端里做了什么,然后说"同意"或"改一下"。
1.2 为什么我最终选型它
选Aider而不是其他工具,我有几个实际考量。第一,它纯命令行,SSH到服务器上、或者在一台只有终端的机器上也能用。第二,它和git深度绑定,天然适合我的工作流——我所有项目都在git里,Aider的每次改动都有记录,出了问题回滚很方便。第三,它支持自定义API,我可以按需切换不同的模型服务,今天用开源模型跑日常重构,明天换更强的模型做复杂逻辑设计,灵活度很高。
第四点可能被很多人忽略:Aider有一套"代码编辑协议",它不只是让模型输出代码,而是让模型返回针对具体文件的编辑指令,Aider再把这些指令应用到文件上。这比大段大段重写文件要稳得多,diff更小,误伤更少。
1.3 自定义API到底自定义了什么
所谓"自定义API",拆开来看就三件事:
- 模型:用哪个模型(比如gpt-4o、claude-sonnet、本地跑的qwen2.5-coder)。
- 接口地址:模型服务从哪里调(官方接口、某个兼容OpenAI格式的网关、本地的Ollama)。
- 调用参数:上下文窗口、温度、每次请求消耗的token上限等。
这三件事在Aider里都有对应的配置开关。理解了这三层,后面所有的配置操作就都顺理成章了。
2. 环境准备与安装:先把基础打牢
2.1 前置条件
Aider本质是一个Python命令行工具,所以最硬性的要求就是Python环境。实测下来,Python 3.9到3.12都能正常跑,但推荐3.11或3.12,兼容性最好。git是另一个必需品,因为Aider的整个工作流建立在git之上。如果没有git,Aider也能启动,但没法commit,等于废了一半武功。
操作系统上,Linux、macOS、Windows(WSL或Git Bash)都行。我主力在macOS和Linux服务器上跑,Windows下建议用WSL,避免一些路径和编码上莫名其妙的坑。
2.2 安装方式
最直接的方式是pip安装:
pip install aider-chat如果你像我一样不想污染系统Python环境,用虚拟环境或者pipx都行:
pipx install aider-chat装完之后验证一下:
aider --version能输出版本号就说明基础环境没问题。顺便说一句,Aider的更新频率还挺高的,隔一段时间就check一次新版本。升级直接用:
pip install --upgrade aider-chat2.3 准备工作区
建议单独搞一个测试仓库来跑通整个流程,别一上来就在生产项目里折腾。我是这么做的:
mkdir aider-demo cd aider-demo git init echo "print('hello')" > main.py git add . git commit -m "init"一个干净的git仓库是Aider最好的试验场。后面所有配置都能在这个环境里反复验证,不怕改坏东西。
3. 自定义API配置的核心思路:环境变量与配置文件的优先级
3.1 Aider怎么识别模型源
Aider启动时,会按照内部逻辑去识别你要用哪家的模型。它的模型名带前缀,比如gpt-4o、claude-sonnet-4-20250514、ollama/qwen2.5-coder:14b,前缀决定了走哪套API协议。
- 不带前缀或带
openai/前缀的,走OpenAI兼容协议。 - 带
anthropic/前缀的,走Anthropic协议。 - 带
ollama/前缀的,走Ollama本地协议。 - 还有
azure/、bedrock/、vertex_ai/等,对应不同云平台。
理解了这套命名规则,自定义API就清楚多了:你要做的无非是告诉Aider"用什么模型名"和"模型服务的地址在哪"。
3.2 环境变量是最高优先级
Aider的配置读取顺序大致是这样的:环境变量优先于配置文件,配置文件优先于默认值。--xxx这种命令行参数本质上也是设置配置项,它们的优先级高于环境变量。
所以,当你发现配置不生效时,先想想是不是环境变量或者命令行参数把配置文件里的值盖掉了。这是我最常遇到的坑之一。
核心环境变量就这几个:
| 环境变量 | 作用 |
|---|---|
OPENAI_API_KEY | OpenAPI兼容服务的密钥 |
OPENAI_API_BASE | OpenAI兼容服务的接口地址,格式一般是https://host/v1 |
ANTHROPIC_API_KEY | Anthropic服务的密钥 |
ANTHROPIC_API_BASE | Anthropic服务的接口地址 |
OLLAMA_API_BASE | Ollama服务的地址,默认http://localhost:11434 |
设置方式就是常规的export,或者写到shell配置文件里:
export OPENAI_API_KEY="sk-你的密钥" export OPENAI_API_BASE="https://你的接口地址/v1"这里有个细节必须强调:OPENAI_API_BASE结尾的/v1,不同的服务要求不一样。有的服务商给的地址本身就带/v1,有的不带。Aider在拼接请求路径时,如果发现基础地址不含/v1,它有时会自己补上,但这不一定可靠。我自己的经验是:严格按照服务商给的地址填,别自作主张加/v1,也别自作主张去掉。一般服务商的文档里会明确说"Base URL填什么"。
3.3 配置文件:把常用参数固化下来
每次启动都敲一堆环境变量太烦了。Aider支持.aider.conf.yml文件,放在当前目录、家目录都行。如果当前目录有,就用当前的;否则去家目录找。
我的家目录.aider.conf.yml大概长这样:
model: gpt-4o openai-api-base: https://你的接口地址/v1 auto-commits: true pretty: true这些配置项的含义很直白:model指定默认模型,openai-api-base指定接口地址,auto-commits让Aider在修改完文件后自动commit,pretty开启彩色输出。
还有一个文件名容易搞混:Aider还支持.env文件,这个文件里可以放环境变量。放在项目根目录下,Aider启动时会自动加载。我通常在.env里放密钥,在.aider.conf.yml里放非敏感的配置项,两者职责分开,也方便把.env加进.gitignore。
4. 接入自定义API的完整配置实战
4.1 场景一:接OpenAI官方接口
这是最简单的场景。安装完Aider后,设置好密钥就能直接跑:
export OPENAI_API_KEY="sk-你的密钥" aider如果你用的是gpt-4o这类默认模型,到这里就结束了。Aider会自动用环境变量里的密钥和官方地址通信。
如果你想指定模型,命令行加--model参数:
aider --model gpt-4o或者在配置文件里写死。我个人习惯在配置文件里设定默认模型,命令行参数留给临时切换场景用。
4.2 场景二:接OpenAI兼容的自定义接口
这是"自定义API"最典型的场景。你手里有一个提供OpenAI格式接口的服务,地址是https://api.example.com/v1,密钥是sk-custom-key,想用gpt-4o这个模型。配置方式如下:
export OPENAI_API_KEY="sk-custom-key" export OPENAI_API_BASE="https://api.example.com/v1" aider --model gpt-4o三步走:设密钥、设地址、指定模型。就这么简单。但我实际用下来有几个提醒:
第一,先确认接口的模型名。有的服务虽然兼容OpenAI格式,但内部模型名不叫gpt-4o,叫别的。这时候如果还传gpt-4o,服务端会报模型不存在。解决方式也很简单——用curl手动打一次接口,看它能接受什么模型名:
curl https://api.example.com/v1/models \ -H "Authorization: Bearer sk-custom-key"会返回这个服务支持的模型列表,照着填就行。
第二,别忽略网络连通性。如果接口地址配了但死活连不上,先自己curl一下,看是地址不对、密钥不对,还是服务本身down了。把问题定位在Aider之外,能省很多排查时间。
第三,端到端验证。配置好之后,启动Aider先让它做个最简单的操作,比如问一句"这个仓库里有什么文件",看看能不能正常返回。这一步过了,再谈复杂的代码修改。
4.3 场景三:用模型配置表微调参数
有些模型比较特殊,Aider可能不认识它的上下文窗口大小,导致发送超出限制的请求,报一些奇怪的错。这时候就需要模型配置表。
Aider支持通过--model-settings-file指定一个JSON文件,详细描述某个模型的参数。我的model_settings.json长这样:
{ "my-custom-model": { "model": "my-custom-model", "edit_format": "diff", "use_repo_map": true, "reminder": "请以简洁的方式修改代码。", "max_tokens": 8192, "caches": false, "use_system_prompt": true } }然后启动时带上:
aider --model my-custom-model --model-settings-file model_settings.jsonedit_format是Aider用来决定怎么让模型输出代码修改格式的关键参数,有diff、whole、udiff等取值。如果你的自定义模型在代码修改时表现不佳,问题往往出在这里。diff适合大多数模型,whole是让模型输出整个文件,适合一些不擅长生成diff的小模型。
max_tokens对应模型单次输出的最大token数,如果模型输出到一半被截断,很可能就是这个值设小了。一般代码生成任务,建议至少给4096以上。
4.4 模型名、地址、密钥的优先级排查
配置多了之后,最容易遇到的问题就是"我改了配置为什么没生效"。这里分享一个排查思路:
先用aider --verbose启动,Aider会在启动日志里打印它识别到的配置信息。比如它用的哪个模型、哪个API地址、读的哪个配置文件。一眼就能看出来配置有没有生效。
我遇到过的情况:我在项目目录放了一个.aider.conf.yml,里面写了模型A,但家目录的配置文件写了模型B。Aider优先读当前目录的,这个没问题。问题是我还在shell里export了OPENAI_API_KEY,导致某个环境变量意外覆盖了另一处配置,行为就变得很奇怪。后来我统一了配置源:密钥放.env,模型和参数放.aider.conf.yml,命令行参数只做人话级别的临时覆盖,整个配置体系就稳定多了。
5. 接入本地模型:让数据不出服务器
5.1 为什么接本地模型
很多人玩Aider到一定程度,就会开始琢磨本地模型。原因不外乎几个:数据敏感不想出内网、API费用太高想省钱、团队的开发环境不允许访问外部服务。本地模型方案里,我用得最多的是Ollama,因为它部署简单、模型管理方便,而且对Aider支持得很好。
5.2 安装Ollama并拉取模型
先装Ollama,它支持Linux、macOS、Windows。装完确认服务在跑:
ollama --version然后拉取一个适合编程的模型。我推荐qwen2.5-coder系列,它在代码任务上的表现非常稳。14B参数版本是个不错的起点,显存8GB以上就能跑;配置更好的机器可以上32B版本:
ollama pull qwen2.5-coder:14b拉取完成后,确认模型能正常对话:
ollama run qwen2.5-coder:14b5.3 让Aider用上本地模型
Aider接入Ollama的方式是模型名前加ollama/前缀:
aider --model ollama/qwen2.5-coder:14b就这么一句,Aider就会自动去找默认的http://localhost:11434地址。如果你的Ollama跑在别的机器上,设置OLLAMA_API_BASE:
export OLLAMA_API_BASE="http://192.168.1.100:11434" aider --model ollama/qwen2.5-coder:14b我第一次跑通的时候还是很兴奋的——一个完全跑在内网的编程AI,改代码、提交commit,一条龙。对于代码不能出内网环境的朋友,这个方案几乎是唯一解。
5.4 本地模型的调优经验
本地模型和云端模型在Aider里的体验差距主要在三方面。首先是速度,小模型响应快但质量一般,大模型质量好但速度慢。14B的qwen2.5-coder在我的机器上大概每秒钟生成20-30个token,改一个小函数问题不大,但重构多个文件时就有点煎熬。
其次是上下文长度。本地模型需要足够的context才能看完一个完整项目,所以拉模型时尽量选支持长上下文的版本。qwen2.5-coder的32B版本支持128K上下文,14B版本是64K左右。如果项目文件很大,Aider的repo map机制会先压缩项目结构,只把关键信息发给模型。这个机制在本地模型上尤其重要,因为它能在上下文有限的情况下,尽可能让模型理解项目全貌。
第三是edit_format的选择。小的本地模型在生成diff格式时偶尔会出错,经常出现代码缩进混乱、文件截断的问题。遇到这种情况,我给这些本地模型配置了whole格式,让它们直接输出整个文件内容,Aider再用新文件覆盖旧文件。虽然token消耗大一点,但胜在稳定。
6. 实操记录:三次实战把配置彻底跑通
6.1 第一次:基本对话验证
配置完API之后,我第一次启动Aider就干了一件事:让它解释仓库里的代码。这是在验证配置链路是否畅通。
aider启动后,Aider进入交互界面,我输入:
请解释一下main.py这个文件做了什么Aider读取文件,给出解释。这一步跑通,说明密钥、地址、模型三者都正常。我当时卡在地址多了一个/v1的问题上,服务端一直返回404,查了半天才发现是这个细节。从那以后我每次配置新服务,都会先用curl确认一下地址。
6.2 第二次:让它实际改代码
确认基础链路没问题后,我让Aider做一次真实的代码修改。我在仓库里准备了一个简单的Python函数:
def calculate_total(prices): total = 0 for p in prices: total += p return total然后对Aider说:
给calculate_total函数加上类型注解,并写一行docstringAider会先展示要修改的diff,我确认后它写入文件并自动commit。整个过程非常流畅。这里有个细节:Aider默认只会修改你明确加入会话的文件,或者它认为相关的文件。如果你修改的文件不在git里,它还会提醒你。
6.3 第三次:多个文件联动修改
Aider真正的威力在跨文件修改。我准备了一个小的todo应用,一个文件管数据存储,一个文件管命令行交互,让它给整个程序加一个新的命令。
这种场景下,Aider会利用repo map分析项目结构,自己决定改哪些文件。整个过程它会在终端里分步展示,我只需要在关键节点确认。实际体验下来,在代码结构清晰的小项目里,Aider的多文件修改成功率相当高;但项目太大、代码太乱时,它也会迷路,这时候就需要你手动指定文件:
/add src/utils.py把相关文件加入上下文,再告诉它你的需求。
6.4 关于git工作流的体会
Aider自动commit的设计,一开始我觉得有点啰嗦——改一次就commit一次,历史会很碎。但用久了才发现这是优点。它相当于给AI的每次修改都做了存档,哪天AI改崩了,直接找到它commit之前的那条记录,一条git revert就恢复了。对比在IDE插件里乱改一气没有版本记录的情况,这种安全感是实打实的。
如果你不想让Aider自动commit,可以在启动时加--no-auto-commits,这样它只改文件,提交动作由你自己控制。
7. 常见问题与排查技巧实录
7.1 连接超时或401认证失败
这是配置自定义API时遇到最多的问题。先说401,这基本就是密钥不对或者密钥格式不对。Aider对密钥格式比较敏感,如果你复制密钥时多了一个空格,或者把换行符带进去了,都会认证失败。我的习惯是设置完成后,先用echo $OPENAI_API_KEY看一眼值是否正常,再启动Aider。
连接超时的话,分几种情况:本地网络本身有问题、接口地址不可达、接口地址太慢响应。先用curl确认地址可达性:
curl https://你的接口地址/v1/models \ -H "Authorization: Bearer 你的密钥"如果curl正常而Aider不通,看看是不是代理环境变量干扰了它。某些系统里设置了HTTP_PROXY、HTTPS_PROXY环境变量,命令行工具会默认走代理,导致请求被代理拦截。这种情况在服务器环境下尤其常见,排查方式就是用--no-proxy关掉Aider的代理支持,或者在环境变量里清掉代理配置再试。
注意:不要在公共网络环境里随意设置代理变量,也不要用来访问不合规的渠道。保持网络环境干净,能省掉大量莫名其妙的问题。
7.2 模型名不对导致报错
Aider启动时会尝试获取模型信息,如果模型名不存在,会直接报错退出。解决方法就是前面说的,先查接口支持的模型列表。还有一种情况是模型名存在,但Aider不认识它的参数规格(比如上下文窗口),导致请求构造错误。这个可以通过--model-settings-file手动指定参数来解决。
7.3 上下文窗口不足
项目大了之后,Aider发送给模型的内容可能会超过模型的上下文窗口,报错信息里通常会出现"maximum context length"之类的字眼。
解决办法有几个思路。第一,把不需要的文件从会话里移除,用/drop命令。第二,善用repo map,它会让Aider只发送项目结构摘要而不是全量代码。第三,换上下文更大的模型,或者在模型配置表里调大max_tokens。第四,用--no-auto-comments之类的方式减少无关内容进入上下文。
我自己最常用的组合是:先/add指定本次要改的文件,再用/drop把无关的排除掉,把上下文控制在模型能力范围之内。这比无脑换大模型要经济得多。
7.4 终端显示乱码或中文输出异常
Aider有一些互动界面元素依赖终端能力。如果在SSH里或者某些minimal终端下出现显示错乱,可以尝试:
aider --no-pretty关掉彩色输出和漂亮排版,回到纯文本模式,兼容性会好很多。另外,终端编码一般用UTF-8,遇到中文乱码先检查系统locale。
7.5 配置文件没生效
这个问题排查很简单,上--verbose看启动日志。Aider会把它读到的配置文件路径和主要配置项打印出来。我见过的情况有:配置文件名写错(.aider.conf.yml写成了.aider.config.yml)、配置项缩进不对(YAML格式要求严格)、配置文件路径放错(放到了不是当前目录也不是家目录的地方)。还有一个常见坑:配置文件里写了model,但命令行启动时又传了--model,结果是命令行参数覆盖了配置文件,看起来就像配置没生效。
8. 几点实打实的使用建议
Aider这套工具,配置本身不难,难的是把它融入自己的工作流。我用了一段时间之后,有几个体会比较深。
第一,把Aider当成结对编程的搭档,而不是命令行版的ChatGPT。它的价值在于帮你动手改代码,而不只是提供思路。一次只让它做一个具体的小任务,比一口气丢给它一个大需求要靠谱得多。大需求拆成小步,每步都确认diff,效果会好很多。
第二,在干净仓库里先练手。别上来就在重要项目里折腾,先在测试仓库里把它能做什么、不能做什么摸清楚。特别是本地模型,有些模型对中文理解一般,有些模型生成代码时容易重复,这些都要在测试环境里提前了解,免得真项目里手忙脚乱。
第三,配置要成体系。密钥放.env,参数放.aider.conf.yml,临时切换用命令行参数。三个层次各管各的,出了问题也好定位。我以前把什么东西都往shell配置文件里塞,结果换台机器就忘了一堆export,现在统一到配置文件和.env里,换机器只需要同步这两个文件。
第四,模型的选择要跟着任务走。在Aider里切换模型非常方便,我是这么分工的:日常重构和小功能用本地模型,成本为零;复杂的架构设计、跨文件大规模改动,用云端更强的模型。两个模型搭配着用,体验和费用都能兼顾。
我也必须坦诚地说,Aider不是万能的。它最适合的场景是代码结构清晰、有测试覆盖的项目;如果是历史包袱重、到处都是隐性耦合的遗留代码,AI改起来一样容易翻车。但即便如此,它已经是我日常开发里离不开的工具了。配置好自定义API之后,它就彻底长在了你的终端里,随叫随到。