🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
1. 先明确目标:让 Aider 把 mypy 报错一条条消掉
这篇要做的任务很具体:挑一个小型 Python 仓库,用 Aider 作为编码 Agent,让它在 mypy 的类型报错驱动下补齐类型标注,最后同时跑通 mypy 和 pytest。适合已经用过 Aider 或类似命令行编码工具、但还没把它接进「类型检查闭环」的人。核心思路是把 mypy 当成任务清单生成器:先跑一遍拿到报错,把报错喂给 Aider,让它改代码,再跑 mypy 和 pytest 验证,循环到干净为止。
Aider 本身是一个跑在终端里的结对编程工具,它会把仓库文件读进上下文,按你的指令直接改文件,并自动生成 git commit。它默认支持多种模型供应商,也允许你自定义 OpenAI 兼容的 Base URL。TaoToken 在这里的角色就是默认供应商:你打开官网创建 Key,把 Aider 的 Base URL 指向 TaoToken 的 API 地址,之后 Aider 的所有模型调用都走这条链路。这样你不需要在本地维护多套供应商配置,换模型时只改一个模型名。
我选了一个约 800 行的小型 Python 仓库做演示,结构是 src/ 放业务代码、tests/ 放 pytest 用例,仓库里已经配好 mypy.ini。初始状态下 mypy 会报十几条 Missing type annotation 和 Incompatible return value type。目标产物有三样:一份 Aider 启动命令、一份模型选择说明、一份修复前后 mypy 输出对比。下面按操作顺序展开。
2. 环境准备与 Aider 启动命令
2.1 安装与仓库初始化
先确认 Python 版本和虚拟环境。Aider 通过 pip 安装,建议装在独立虚拟环境里,避免污染系统包。
python3 -m venv .venv
source .venv/bin/activate
pip install aider-chat mypy pytest
进入你的目标仓库,确认 git 状态干净。Aider 默认会在每次修改后自动提交,如果工作区有未提交改动,它可能把无关变更一起卷进 commit。所以先提交或 stash。
cd your-python-repo
git status
git add -A && git commit -m "chore: baseline before mypy fix"
2.2 先跑一遍 mypy,拿到基线报错
在让 Aider 动手之前,必须自己先跑一次 mypy,把输出存下来。这既是任务清单,也是后面做前后对比的基线。
mypy src/ --config-file mypy.ini | tee mypy_before.txt
典型输出长这样:
src/orders.py:14: error: Function is missing a return type annotation [no-untyped-def]
src/orders.py:22: error: Function is missing a type annotation for one or more arguments [no-untyped-def]
src/pricing.py:31: error: Incompatible return value type (got "float | None", expected "float") [return-value]
src/pricing.py:47: error: Argument 1 to "apply_discount" has incompatible type "str"; expected "float" [arg-type]
Found 4 errors in 2 files (checked 6 source files)
把这份输出留着,后面 Aider 改完再跑一次,直接 diff 就能看出它到底修了什么。
2.3 Aider 启动命令
Aider 的启动方式决定了它读哪些文件、用哪个模型。针对 mypy 修复这个任务,我用的命令是:
aider --model openai/deepseek-chat \
--openai-api-base https://taotoken.net/api \
--openai-api-key $T AOTOKEN_API_KEY \
--no-auto-commits \
src/orders.py src/pricing.py
几个参数值得说明。--model 指定模型名,格式是 供应商前缀/模型名,走 OpenAI 兼容接口时前缀用 openai/。--openai-api-base 把请求指向 TaoToken 的 API 地址,注意这里不带任何查询参数。--openai-api-key 从环境变量读取,不要把 Key 写进命令历史。--no-auto-commits 是我个人的习惯:mypy 修复往往要来回几轮,让 Aider 每轮都自动提交会把 git 历史弄得很碎,我宁愿自己控制提交时机。最后把要改的文件显式列出来,Aider 会优先把它们放进上下文,减少它去翻无关文件。
如果你希望 Aider 自动提交,去掉 --no-auto-commits 即可。启动后 Aider 会进入交互式会话,你可以在里面直接输入指令。
3. TaoToken 接入与配置
3.1 创建 Key 并写入环境变量
打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_generate&utm_content=aider-mypy 注册并登录,进入控制台创建 API Key。创建后立刻复制,页面通常只显示一次。然后写进环境变量:
export TAOTOKEN_API_KEY="sk-你的key"
注意上面 Aider 命令里我写的是 $ TAOTOKEN_API_KEY,实际执行时中间不能有空格,正确写法是 $TAOTOKEN_API_KEY。这是我在终端里踩过的坑:复制粘贴时不小心带了个空格,Aider 拿到的是空字符串,报 401,排查了半天才发现是变量展开失败。
3.2 用配置文件固化 Base URL
每次启动都敲一长串参数很烦,Aider 支持配置文件。在仓库根目录或用户目录建 .aider.conf.yml:
openai-api-base: https://taotoken.net/api
openai-api-key: env:TAOTOKEN_API_KEY
model: openai/deepseek-chat
no-auto-commits: true
这样启动时只要 aider src/orders.py src/pricing.py 就行。env: 前缀告诉 Aider 从环境变量读 Key,避免明文落盘。配置文件里的 Base URL 同样不带查询参数,保持干净。
3.3 验证链路是否通
在正式让 Aider 改代码前,先用一条最小指令确认模型能响应。启动 Aider 后输入:
请只回复 "ok",不要改任何文件。
如果模型正常返回,说明 Base URL、Key、模型名三者都对。如果报 401,检查 Key 是否过期或复制完整;如果报 404,多半是模型名写错,或者 Base URL 多带了路径。TaoToken 的 API 地址就是 https://taotoken.net/api,不要在后面追加 /v1 之类,Aider 会自己拼。
模型选择上,我这次用的是 deepseek-chat,原因是它在代码修改任务上指令跟随比较稳,且成本可控。如果你要处理更复杂的类型推断,可以换成能力更强的模型,具体可用模型列表和价格以官网为准。切换时只改 --model 或配置文件里的 model 字段,Base URL 和 Key 都不用动,这就是把 TaoToken 设为默认供应商的好处。
4. 让 Aider 按 mypy 报错修复,并验证结果
4.1 把报错喂给 Aider
在 Aider 会话里,直接把 mypy 的输出贴进去,配上明确指令:
下面是 mypy 的报错,请逐个修复 src/orders.py 和 src/pricing.py 中的类型问题。
要求:只补类型标注和必要的类型收窄,不要改变函数行为,不要改测试文件。
src/orders.py:14: error: Function is missing a return type annotation
src/orders.py:22: error: Function is missing a type annotation for one or more arguments
src/pricing.py:31: error: Incompatible return value type (got "float | None", expected "float")
src/pricing.py:47: error: Argument 1 to "apply_discount" has incompatible type "str"; expected "float"
Aider 会读取这两个文件,生成 diff,并在终端里展示它打算做的修改。你可以逐条确认,也可以直接让它应用。这里的关键是「不要改变函数行为」这句约束:mypy 修复很容易诱导模型顺手重构,比如把 float | None 直接改成 float 而不处理 None 分支,那就会引入运行时 bug。明确约束能减少这类越界。
4.2 修复前后 mypy 输出对比
Aider 应用修改后,退出会话或另开终端,重新跑 mypy:
mypy src/ --config-file mypy.ini | tee mypy_after.txt
diff mypy_before.txt mypy_after.txt
修复前的输出是 4 条 error,修复后理想情况是:
Success: no issues found in 6 source files
如果还有残留,把新的报错再贴回 Aider,继续下一轮。我这次跑了两轮:第一轮 Aider 修掉了 orders.py 的两条缺失标注,但 pricing.py 的 float | None 它只是把返回类型改成了 float | None,没有真正解决调用方的期望。第二轮我把「调用方期望 float,请在函数内部处理 None 分支」这条约束补上,它才加了 if value is None: return 0.0 之类的收窄逻辑。这说明报错信息越具体,Aider 修得越准。
4.3 跑 pytest 确认行为没坏
类型检查通过不代表逻辑没坏。紧接着跑测试:
pytest -q
预期输出类似:
...... [100%]
6 passed in 0.42s
如果 pytest 挂了,说明 Aider 的修改动了行为。这时候用 git diff 看它改了什么,定位到具体函数,把失败用例的输出贴回 Aider,让它在不改变测试期望的前提下修正实现。我遇到过一次它把 apply_discount 的参数从 str 改成 float 后,调用方传的还是字符串,pytest 直接报类型转换错误,补上调用方的转换就恢复了。
4.4 失败分支怎么处理
几种常见失败:一是 Aider 反复改不对同一个报错,这时候别硬循环,手动把那个函数改掉,再让 Aider 处理剩下的;二是 mypy 通过但 pytest 失败,优先保 pytest,因为类型标注是辅助,行为正确才是底线;三是模型返回超时或限流,检查 TaoToken 控制台的用量和额度,必要时换一个当前可用的模型。所有可用模型和配额以官网为准,不要凭记忆假设某个模型一定可用。
5. 限制、成本与模型选择
这套流程有几个明确的边界。第一,mypy 只能发现静态类型问题,运行时才暴露的 bug 它管不了,所以 pytest 不能省。第二,Aider 的修改质量高度依赖报错信息的完整度,如果你只贴一行 Found 4 errors 而不贴具体位置,它基本无从下手。第三,对于用了大量动态特性(比如 **kwargs 透传、元编程)的仓库,mypy 报错可能本身就是误报,这时候强行补标注反而会让代码变丑,需要判断哪些报错值得修。
成本方面,Aider 每轮都会把相关文件读进上下文,仓库越大、文件越多,token 消耗越高。控制成本的办法是显式指定要改的文件,而不是让它自己去找。模型选择上,简单标注补齐用轻量模型就够,涉及复杂类型收窄或泛型推断时再换更强的模型。TaoToken 把供应商收敛成一个 Base URL,切换模型只改一个字段,这让「按任务难度选模型」变得可行。具体模型清单、计费方式和额度限制,以官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_generate&utm_content=aider-mypy 和控制台为准。
最后给一个实用技巧:把 mypy 和 pytest 串成一条命令,每次 Aider 改完直接跑,省得来回切终端。
mypy src/ --config-file mypy.ini && pytest -q
两个都过,这一轮就算收工;任何一个挂,把输出贴回 Aider 继续。整个闭环跑顺之后,你会发现类型标注这件事从「手动一条条补」变成了「贴报错、等修改、跑验证」的机械流程,Aider 负责改,mypy 和 pytest 负责判卷。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度




被折叠的 条评论
为什么被折叠?



