如果你和我一样,第一次把aider装好后,习惯性地敲下aider --model deepseek/deepseek-chat,然后看到满屏的api error: 400 the supported api model names are deepseek-flash, deepseek-v4,估计也会愣住几秒。明明 API 密钥没错、网络没问题,为什么模型名称反而不认?这个报错恰恰是很多终端 AI 配对编程新手遇到的第一个坎。
Aider 是当前终端里相当能打的 AI 配对编程工具,它不依赖图形界面,直接在命令行里和你对话、改代码、跑测试、提交 Git。它的魅力在于:把 AI 当成一个真正的结对编程伙伴,而不是一个聊天框。但前提是,你得先把自定义 API 配好。默认情况下 Aider 绑定的是 OpenAI 那一套,可实际使用中,很多人用的是 DeepSeek、智谱、通义千问,甚至是本地 Ollama 模型。这篇文章就是把我这几周折腾 Aider 自定义 API 配置的完整过程、踩坑记录和几个好用的进阶技巧全部分享出来。无论你是想接国内大模型,还是想用本地模型节省成本,这篇文章都适用。
1. 为什么终端里的 AI 配对编程值得一试
1.1 从“人机对话”到“人机结对”的转变
大多数人第一次接触 AI 编程,用的是网页版聊天工具:把代码粘进去,让它给建议,再复制回来。这种方式不是不行,只是来回切换非常割裂。上下文稍微长一点,窗口就乱了;改起文件来,还要手动跟踪哪些地方已经改过、哪些没有改。Aider 这种终端工具解决的核心问题,就是把 AI 直接拉进你的开发流程里。
Aider 会监控当前 Git 仓库的文件变更,读取相关文件内容作为上下文,然后直接编辑你的代码文件。你不需要复制粘贴,它会通过命令自动修改文件,并且为每次修改生成一条符合规范的 Git 提交信息。你只需要在终端里跟它说“把刚才那个接口的异常处理加上”,它就会去改代码、跑测试、提交。整个过程都在终端里完成,不离开键盘。
1.2 默认模型之外的选择:自定义 API 是刚需
Aider 官方开箱支持的模型很多,OpenAI、Anthropic 这些国际厂商自然是首选。但实际用起来,有三个现实问题会逼着你去配置自定义 API:
第一是成本。OpenAI 的模型确实强,但如果是个人项目、高频迭代,账单涨得很快。反观 DeepSeek、智谱 GLM 这类模型,API 价格低得多,有时候只有前者的零头。第二是数据安全。不少公司的代码是不允许外发给境外大模型的,但内网又希望用上 AI 编程能力,这时候就得接私有化部署的模型或者本地 Ollama。第三是稳定性。某些模型服务的接口地址、模型名称会随版本变化,官方 Aider 模板的默认值可能已经过时,你列出的supported api model names are deepseek-flash, deepseek-v4就是典型例子。
1.3 Aider 自定义 API 的底层逻辑
在深入配置之前,先理解 Aider 是怎么跟模型打交道的。Aider 本身不关心你用的是哪家模型,它只认两类协议:OpenAI 兼容的chat/completions接口,以及 Anthropic 的接口。绝大多数国产模型和本地模型都提供 OpenAI 兼容端点,所以核心配置只有三件事:API 地址(Base URL)、模型名称(Model Name)、API 密钥(API Key)。
Aider 内部的配置架构是分层的:启动参数优先于环境变量,环境变量优先于配置文件,配置文件优先于.env文件。理解了这一层,你就明白为什么有时候改了.env却没生效——很可能被某个环境变量覆盖了,这就是后面排查问题的关键思路。
2. 配置前的准备:环境、仓库与三要素
2.1 安装 Aider 的两种方式
Aider 是基于 Python 的命令行工具,安装方式很简单,但我更推荐用pipx,而不是直接pip install。原因是pipx会为 Aider 创建独立的虚拟环境,避免污染系统 Python 的依赖。
没有pipx的话,先装一个:
python3 -m pip install --user pipx python3 -m pipx ensurepath然后安装 Aider:
pipx install aider-install aider-install如果不想折腾pipx,直接用:
python3 -m pip install -U aider-chat装完验证一下版本:
aider --version只要能输出版本号,安装就算完成了。我测试时用的是较新的版本,功能上已经内置了大量模型供应商的前缀支持,这一点后面会用到。
2.2 准备一个非空的 Git 仓库
Aider 的运作高度依赖 Git。它会把整个代码库的 diff 状态当作工作记忆,没有 Git 仓库,Aider 很难判断改了什么、该提交什么。所以使用 Aider 前,必须确保当前目录是一个已经初始化并且至少有一次提交的仓库。
如果你刚好在一个新目录里,可以这么做:
git init git add . git commit -m "init"这一步不需要规范,只要让仓库有一个初始提交即可。Aider 在启动时如果检测不到 Git 仓库,会主动提示你是否要初始化,但建议自己先准备好,省去交互确认的麻烦。
2.3 记录 API 的三要素:地址、模型名、密钥
这地方特别容易马虎。每个模型服务的“三要素”长得不一样,拿 DeepSeek 举例,Base URL 通常是https://api.deepseek.com/v1,模型名是deepseek-chat或deepseek-reasoner,API Key 是一串sk-开头的字符串。再比如智谱,Base URL 是https://open.bigmodel.cn/api/paas/v4,模型名是glm-4-plus这种格式。而本地 Ollama,Base URL 是http://localhost:11434/v1,模型名取决于你本地拉取的是哪个模型。
我建议在配置前先建一个笔记,把这三个信息写下来:
| 提供商 | Base URL | 模型名示例 | 密钥获取位置 |
|---|---|---|---|
| DeepSeek | https://api.deepseek.com/v1 | deepseek-chat、deepseek-reasoner | 开放平台控制台 |
| 智谱 GLM | https://open.bigmodel.cn/api/paas/v4 | glm-4-plus、glm-4-flash | 开放平台控制台 |
| Ollama | http://localhost:11434/v1 | qwen2.5-coder:14b等 | 本地无需密钥 |
| 任意 OpenAI 兼容服务 | 取决于服务商 | 取决于部署模型 | 服务商控制台 |
注意,我这里写的模型名只是示例。像你实际遇到的那个 400 错误提示the supported api model names are deepseek-flash, deepseek-v4,说明该平台的模型名称可能已经更新,你在笔记里必须以官方文档最新清单为准。
3. 四种配置自定义 API 的方式,以及各自适合谁
3.1 方式一:启动参数,适合临时验证
最快的接入方式是直接在命令行后面接参数。Aider 提供了一个通用的 OpenAI 兼容入口:
aider \ --model openai/deepseek-chat \ --openai-api-base https://api.deepseek.com/v1 \ --openai-api-key sk-你的密钥这里用openai/前缀是告诉 Aider 走 OpenAI 兼容协议,后面再接真实模型名。--openai-api-base用来覆盖 API 地址,--openai-api-key用来传入密钥。
这种方式的优点是立竿见影,适合第一次验证配置是否有效。缺点也同样明显:每次启动都要敲一长串参数,而且密钥会出现在 shell 历史记录里,有一定安全风险。所以我只把它作为连通性测试手段,不适合日常使用。
3.2 方式二:环境变量,最推荐的长期方案
Aider 官方对很多主流模型做了适配,你在启动时可以直接用厂商前缀指定模型,比如deepseek/deepseek-chat、glm/glm-4-plus、ollama/qwen2.5-coder。与此同时,它也会读取对应的环境变量来自动获取密钥,最典型的就是:
export DEEPSEEK_API_KEY="sk-你的密钥" aider --model deepseek/deepseek-chat如果不想每次开终端都重新 export 一遍,就把这些变量写进 shell 配置文件。以bash为例,编辑~/.bashrc或~/.zshrc:
echo 'export DEEPSEEK_API_KEY="sk-你的密钥"' >> ~/.bashrc source ~/.bashrc环境变量的好处是“一次配置,到处生效”,而且不显式出现在命令行里。Aider 启动时会自动检测当前环境,存在对应密钥就免去人工指定。缺点是你需要知道 Aider 对某个模型具体约定的是哪个环境变量名,好在大多数情况下命名规则很直觉,比如GLM_API_KEY、OLLAMA_API_BASE。
3.3 方式三:配置文件,适合项目级固化
Aider 支持使用.aider.conf.yml文件作为配置。这个文件可以放在用户主目录作为全局配置,也可以放在具体项目目录里作为项目级覆盖。它的键名和命令行参数一一对应,只不过把命令行参数的短横线都换成下划线。
比如你用命令行是这样启动的:
aider --model deepseek/deepseek-chat --deepseek-api-key sk-xxx那么在.aider.conf.yml里就写成:
model: deepseek/deepseek-chat deepseek-api-key: sk-xxx如果接的是任意 OpenAI 兼容服务,则写:
model: openai/custom-model openai-api-base: http://127.0.0.1:8000/v1 openai-api-key: sk-local-key配置文件的好处是可以把一套完整参数固化下来,团队里其他人 clone 项目后按需微调就能用。但注意不要在公开仓库里提交真实密钥,建议把.aider.conf.yml中加入.gitignore。
3.4 方式四:.env 文件,让密钥和配置分离
如果你不想把密钥写进 YAML 文件,Aider 还支持加载.env文件。这个文件通常放在项目目录下,内容长这样:
DEEPSEEK_API_KEY=sk-xxx OPENAI_API_KEY=sk-xxx OPENAI_API_BASE=https://api.deepseek.com/v1Aider 启动时会自动读取当前目录下的.env文件并把变量注入环境。这种方式最大的价值是让密钥与配置文件分离,你甚至可以把.aider.conf.yml提交到代码仓库,而.env永远留在本地。两者配合,既保留了配置的可移植性,又不泄露敏感信息。
3.5 四种方式的优先级与选择建议
用一张表总结它们的关系:
| 配置方式 | 优先级 | 适用场景 | 注意事项 |
|---|---|---|---|
| 启动参数 | 最高 | 临时调试、一次性验证 | 密钥会进 shell 历史 |
| 环境变量 | 较高 | 个人日常长期使用 | 注意 shell 配置持久化 |
| 配置文件 | 中等 | 项目级固化参数 | 不要提交真实密钥 |
.env文件 | 较低 | 密钥与配置分离 | 必须加入.gitignore |
优先级从高到低是:启动参数 > 环境变量 > 配置文件 >.env文件。实际排查问题时,如果配置不生效,优先怀疑是不是高优先级的地方残留了旧值。
4. 实战配置模板:DeepSeek、智谱、本地 Ollama
4.1 DeepSeek:目前性价比最高的选择
DeepSeek 在代码生成和推理上的表现不错,价格又低,是很多个人开发者的第一选择。配置流程分三步:
第一步,去 DeepSeek 开放平台注册账号并创建 API Key。创建后的密钥只展示一次,记得先存到本地笔记。
第二步,确认模型名。你踩到的 400 错误已经说明平台返回的可用模型名是deepseek-flash和deepseek-v4这一批,建议以平台控制台的实时文档为准。登录后台,打开 API 文档页面,看“模型列表”部分,把当前可用的模型名记下来。
第三步,配置并启动:
export DEEPSEEK_API_KEY="sk-你的密钥" aider --model deepseek/deepseek-v4这里我用deepseek/deepseek-v4只是举例。如果 Aider 内置的deepseek前缀识别不了这个新模型名,就用万能 OpenAI 兼容方式:
export OPENAI_API_KEY="sk-你的密钥" export OPENAI_API_BASE="https://api.deepseek.com/v1" aider --model openai/deepseek-v4这种方式等于直接把 DeepSeek 当成一个标准 OpenAI 接口来用,兼容性最好。
4.2 智谱 GLM:国内部署和团队协作常用
智谱的 GLM 系列在中文场景理解上很稳,而且同样自带 OpenAI 兼容接口。配置时我一般这样写:
export GLM_API_KEY="你的智谱密钥" aider --model glm/glm-4-plus如果 Aider 没有收录你用的那个新模型名,同样可以用通用方式:
export OPENAI_API_KEY="你的智谱密钥" export OPENAI_API_BASE="https://open.bigmodel.cn/api/paas/v4" aider --model openai/glm-4-plus注意智谱的 Base URL 和其他家不太一样,路径里带了/api/paas/v4而不是单纯的/v1。这里最容易出错,少写一层路径就会一直报 404 或路由错误。我建议配置完后先用一条最简单的请求测试接口通不通,可以用curl:
curl https://open.bigmodel.cn/api/paas/v4/chat/completions \ -H "Authorization: Bearer 你的智谱密钥" \ -H "Content-Type: application/json" \ -d '{"model":"glm-4-plus","messages":[{"role":"user","content":"ping"}]}'能正常返回内容,说明 Base URL 和模型名都没问题,再启动 Aider 就不会被接口层的问题干扰。
4.3 本地 Ollama:完全离线,零 API 成本
本地模型最大的优势是私有、免费、无限量。Ollama 是目前最容易上手的本地模型运行工具。先安装并启动 Ollama,然后拉取一个代码能力不错的模型:
ollama pull qwen2.5-coder:14b拉取完成后,直接用 Aider 连:
export OLLAMA_API_BASE="http://localhost:11434" aider --model ollama/qwen2.5-coder:14b或者用 OpenAI 兼容方式:
export OPENAI_API_BASE="http://localhost:11434/v1" aider --model openai/qwen2.5-coder:14b本地模型的好处是不用担心密钥泄漏和额度用尽,但缺点也很突出:模型参数量小,指令跟随能力不如云端大模型。用 Aider 时,建议选择专门的代码模型,比如qwen2.5-coder、deepseek-coder这类训练时强化过代码能力的版本。
4.4 任意 OpenAI 兼容服务的万能模板
如果你用的模型不在 Aider 预设列表里,记住这份万能模板,几乎可以覆盖所有情况:
aider \ --model openai/你的模型名 \ --openai-api-base http://你的服务地址/v1 \ --openai-api-key 你的密钥这个模板的核心逻辑就是把 Aider 对模型的识别统一到openai/前缀下。无论是团队内部部署的 vLLM 服务,还是某个云厂商的兼容网关,只要它提供/chat/completions接口,填进去就能用。
5. 接入自定义 API 后最常见的报错与排查链路
5.1 400 错误:模型名称与 API 端点不匹配
api error: 400 the supported api model names are deepseek-flash, deepseek-v4这一类报错,是接口层面返回的最直白的错误。它告诉你:请求发过去了,但模型名不在服务端允许的清单里。
遇到这种报错,我的排查链路是固定的:
第一步,检查模型名是否和当前 API 端点匹配。很多人会犯一个错误:拿着 Aider 文档里写的老模型名,去请求一个已经更新模型清单的新接口。两边的“信息版本”不同步,就会出现这种 400。你只需要回到模型服务商的官网确认当前支持的模型清单,把模型名替换成清单里的名字即可。
第二步,确认模型名没有拼写错误。注意大小写和连字符,deepseek-v4和deepseek_v4可能是两个完全不同的字符串。
第三步,如果模型名确实没问题,就用--verbose参数启动 Aider,查看实际发送的请求头和请求体。你会在日志里看到最终传给 API 的model字段值,核对一下它和你以为的配置是否一致:
aider --model openai/deepseek-v4 --openai-api-base https://api.deepseek.com/v1 --verbose重点看日志里有没有出现你预期之外的配置覆盖,比如环境变量里残留了旧的模型名。
5.2 401 认证失败:密钥格式、换行和隐藏字符
四百的错误解决后,下一个高频问题是 401。这个报错说明请求能到达服务端,但密钥不被接受。常见原因有三个:
第一个是密钥过期或者在平台被删除。尤其是用 DeepSeek 这类平台,旧密钥删除后不会主动通知,只有在请求时才报错。
第二个是密钥带了多余的引号或换行。如果你把密钥写进.env文件时不小心用了DEEPSEEK_API_KEY = "sk-xxx"这种多空格的写法,读取到的字符串可能包含空格,导致鉴权失败。.env文件的正确写法是DEEPSEEK_API_KEY=sk-xxx,等号两边不要留空格。
第三个是export的时候密钥中间混入了不可见字符,尤其是在 Windows 下编辑过文件再拿到 Linux 终端里用,行尾的\r会让整个字符串看起来对、实际错。建议在终端里执行:
echo "$DEEPSEEK_API_KEY" | xxd | head检查密钥末尾有没有多出0a0d之类的怪异字节。
5.3 连接失败或超时:Base URL 写错层级的经典教训
连接超时、Connection refused、404 这类错误,十有八九是 Base URL 的路径层级不对。OpenAI 兼容接口的标准路径是{base_url}/chat/completions。举例来说,如果服务商给的调用地址是https://api.deepseek.com/chat/completions,那 Base URL 就是https://api.deepseek.com,不是https://api.deepseek.com/v1。如果你填的 Base URL 多了个/v1,最终请求会变成https://api.deepseek.com/v1/chat/completions,于是 404。
反过来也一样,如果服务商给出的地址是https://open.bigmodel.cn/api/paas/v4/chat/completions,那 Base URL 就必须包含/api/paas/v4这段前缀。多一层不行,少一层也不行。
实在搞不清的话,把那两种可能的 Base URL 分别用curl快速测一遍,能返回正常结果的那个就是对的。
5.4 模型行为不正常:不是所有模型都能当配对编程伙伴
排除了所有网络和协议问题后,还有一层更隐蔽的问题:Aider 能连上模型,但模型乱改代码、不遵守指令,甚至编造文件名。这不是 Aider 的 bug,而是模型本身的指令跟随能力不足。
Aider 本质上依赖模型的工具调用和代码编辑能力。它对模型的要求其实很高,模型必须能理解“在哪个文件、哪个位置、做什么修改”这一类结构化指令。如果模型只是通用聊天模型而不是专门的代码模型,表现就会很差。
建议在选择自定义模型时,优先选满足两个条件的:一是训练数据中包含大量代码,二是明确支持 tool calling / function calling 协议。像qwen2.5-coder、deepseek-coder、glm-4这类模型都是经过大量代码数据训练的,表现更稳。你可以在 Aider 启动后先让它做一个小任务,比如“在 README.md 末尾加一行说明文字”,观察它是否能正确修改文件。如果这都做不到,就放弃这个模型,换一个更偏向代码能力的。
6. 让 Aider 真正好用的几个高级细节
6.1 配置模型别名,避免每次敲一长串
如果你在多个模型之间切换,推荐在.aider.conf.yml里配置一个便捷入口。比如你经常用 DeepSeek,可以这样写:
model: deepseek/deepseek-v4这样每次启动只需要敲aider,Aider 会自动读取配置。想临时切到别的模型,再用命令行参数覆盖即可:
aider --model ollama/qwen2.5-coder:14b这种“配置文件设默认,命令行做切换”的组合,是我实际使用下来最顺手的模式。
6.2 利用 Git 历史构建稳定的上下文
Aider 的上下文机制和 Git 深度绑定。它会把当前 Git 仓库的最近提交记录、文件变更、diff 作为上下文传给模型。这意味着你的 Git 提交习惯直接影响 AI 的理解质量。
使用 Aider 时,建议保持小而频繁的提交。每个提交只涉及一个逻辑改动,提交信息写清楚。这样 Aider 才能准确理解你“现在这句话”对应的改动范围。如果一次提交塞了几十个文件,里面还混杂着格式调整和逻辑改动,AI 很容易被无关 diff 带偏。
配合 Git 的另一个技巧是,在让 Aider 改代码之前,先用/add明确把相关文件加入会话。Aider 不会自动读整个仓库,它只会读取你显式添加或它推断需要的文件。文件越精准,上下文越干净,模型表现越好。
6.3 在终端复用器里运行,配合后台长任务
Aider 是纯终端工具,非常适合跑在 tmux 里面。tmux 这类终端复用器的价值是:你可以在一个窗口开 Aider 做配对编程,在另一个窗口跑测试服务,在第三个窗口看日志。Aider 跑在后台不会因为 SSH 断开而终止,随时切回来继续对话。
我在配置完成后给 Aider 写了一个 tmux 会话启动脚本:
tmux new-session -d -s dev tmux send-keys -t dev:0 "aider --model deepseek/deepseek-v4" Enter tmux split-window -h -t dev:0 tmux send-keys -t dev:0 "npm run dev" Enter tmux attach -t dev这样一打开终端就是完整的开发环境,左边是 AI 配对编程,右边是实时开发服务,效率提升很明显。
6.4 Aider 自带的编辑格式参数也值得调
Aider 支持通过--edit-format参数控制它编辑代码的方式。我用下来,默认的编辑格式在大多数模型上表现都不错,但如果你接入的模型比较特殊,可以试试切换不同的编辑格式。遇到模型频繁改坏文件结构时,换一种编辑格式往往能救回来。
可以直接在启动时指定:
aider --edit-format diff如果模型的 edit 格式支持不完整,可以尝试--no-auto-commits,让 Aider 在修改后不要自动提交,而是先人工 review diff,确认没问题再手动提交。这个参数在刚接入不熟悉的模型时非常有必要,相当于给 AI 加了一道人工审核闸门。
6.5 密钥泄漏的防范:让 .env 文件永远留在本地
最后说一个安全和卫生层面的习惯。Aider 配置一旦正常跑通,很多人就会松懈,顺手把.env文件提交到 Git。这是非常危险的,尤其当你的仓库是公开仓库,密钥会立刻被抓取。
我现在的做法是,在项目根目录写一个.gitignore,强制排除敏感文件:
.env .aider.conf.yml.env文件只存在于本地,Aider 启动时自动加载;.aider.conf.yml里只写模型名和 Base URL 这类非敏感配置,密钥一律不写进 YAML。这样即使有人拿到了配置文件,也拿不到密钥。
如果你的密钥已经不小心泄漏过一次,果断去平台重新生成一个,然后把旧密钥从所有配置文件里替换掉。不要抱有“应该没人发现”的侥幸心理。
配置 Aider 自定义 API 这件事,说难不难,说简单也有不少细节。只要抓住三要素——Base URL、模型名、API Key,再顺着配置文件优先级去排查,绝大部分问题都能在十分钟内解决。我在实际使用中最深的体会是:Aider 这类工具的价值不在于它有多智能,而在于它把 AI 的能力嵌入了 Git 工作流里,让每一次修改都有迹可循、可回滚、可审查。这也提醒我,接入模型时不要光看模型能力强不强,更要看它能不能稳定地遵循编辑指令。找一个听话的模型,配一套清晰的 API 参数,剩下的就可以放心交给终端里的这个结对伙伴了。