Aider 实战:TaoToken 跑通 FastAPI 路由模块的类型标注补全 告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度1. 为什么挑 FastAPI 的 routing.py 做类型标注补全FastAPI 的fastapi/routing.py是个很适合拿来练 Aider 的文件。它体量大、泛型多、装饰器层层嵌套APIRouter和APIRoute之间的类型关系绕来绕去早期版本里不少函数签名只写了参数名没写注解或者注解写了一半。这种文件让 Aider 去补类型标注比让它从零写一个新模块更能看出模型在真实仓库里的表现它得先读懂上下文再决定每个参数该标什么类型而不是凭空生成。我这次的任务很具体把fastapi/routing.py里缺失的类型标注补上然后让mypy通过。模型用的是 DeepSeek V4.1 Flash通过 TaoToken 提供的统一 API 通道接入 Aider。TaoToken 在这里的角色是模型来源——Aider 需要一个 OpenAI 兼容的 Base URL 和 KeyTaoToken 提供的就是这个。它不是被评测的对象评测对象是 Aider 加 DeepSeek V4.1 Flash 这个组合在类型补全任务上的表现。选routing.py还有一层考虑它的类型问题不是孤立的。一个参数标错了mypy会在调用链下游报一串错。这逼着模型不能只做局部修补得理解整个函数的调用关系。Aider 的 repo map 功能在这种场景下就派上用场了它会把相关符号的上下文喂给模型减少模型瞎猜的概率。我先把仓库克隆到本地切到一个固定的 commit保证后面所有操作可复现。环境是 Python 3.11mypy用项目自带的配置。Aider 通过 pip 装好版本以实际安装为准。接下来就是配置 Aider 让它走 TaoToken 的通道。2. 把 Aider 的模型来源切到 TaoTokenAider 支持通过环境变量或配置文件指定 OpenAI 兼容的 API 端点。TaoToken 的 Base URL 是https://taotoken.net/api注意末尾不带/v1。Key 从官网创建创建入口在 TaoToken 控制台登录后生成一个 Key占位符记作YOUR_API_KEY。Aider 的配置有两种写法。一种是环境变量export OPENAI_API_BASEhttps://taotoken.net/api export OPENAI_API_KEYYOUR_API_KEY另一种是写进~/.aider.conf.ymlopenai-api-base: https://taotoken.net/api openai-api-key: YOUR_API_KEY model: deepseek-v4.1-flash模型 ID 这块要特别注意。Aider 里填的模型名必须和 TaoToken 模型广场上展示的 ID 一致具体以 模型广场 为准。我这次用的是 DeepSeek V4.1 Flash广场上对应的 ID 直接填进model字段。如果 ID 写错Aider 启动时会报模型不存在的错或者请求发出去被通道拒绝。配置写好后进到 FastAPI 仓库目录启动 Aidercd /path/to/fastapi aider fastapi/routing.pyAider 启动后会加载 repo map把routing.py及其依赖的符号索引出来。这时候可以先用/ask问一句确认通道是通的比如让它解释APIRouter.add_api_route的参数含义。如果返回正常说明 Base URL 和 Key 都生效了。这里有个容易踩的坑Aider 默认会尝试连 OpenAI 官方端点如果你只设了OPENAI_API_BASE但没设OPENAI_API_KEY或者 Key 里带了多余空格都会 401。另一个坑是 Base URL 末尾多写了/v1TaoToken 的通道不需要这个后缀写了反而会 404。我第一次配的时候就是手滑加了/v1Aider 报了一串连接错误去掉就好了。配置确认无误后就可以把任务交给 Aider 了。我用的指令是让它扫描routing.py找出所有缺失类型标注的函数和参数补全后确保mypy不报错。Aider 会先给出一个修改计划然后逐块生成 diff。3. Aider 补全 routing.py 类型标注的完整过程任务指令写清楚很重要。我用的提示是扫描 fastapi/routing.py找出所有缺失类型标注的函数参数和返回值补全它们。 要求 1. 不改变任何运行时行为只加类型标注。 2. 泛型参数要写完整不要用 Any 糊弄。 3. 补完后运行 mypy fastapi/routing.py确保没有新增错误。Aider 接到指令后先读文件然后开始生成 diff。它没有一次性改完整个文件而是分了几轮。第一轮处理的是APIRoute.__init__附近的参数那里有几个Callable类型的参数只写了名字没写完整签名。Aider 补成了Callable[..., Any]这种形式但我在 review 的时候觉得太宽泛又让它细化成具体的Callable[[Request], Coroutine[Any, Any, Response]]之类。第二轮处理的是APIRouter的几个方法add_api_route、api_route、get、post这些装饰器工厂。这些方法的参数里有response_model、status_code、dependencies等Aider 根据上下文推断出了Optional[Type[Any]]、Optional[int]、Optional[Sequence[Depends]]这样的标注。有几个地方它一开始标错了比如把response_model标成了Type[BaseModel]但实际允许Nonemypy报了错Aider 看到错误后又自己改成了Optional[Type[BaseModel]]。第三轮是收尾处理一些零散的内部函数。整个过程中 Aider 的 diff 是逐步累积的我可以在它每次生成后选择接受或要求修改。下面是我最终接受的部分 diff 片段--- a/fastapi/routing.py b/fastapi/routing.py -xxx,xx xxx,xx class APIRoute: def __init__( self, path: str, - endpoint, endpoint: Callable[..., Any], *, - response_modelNone, - status_codeNone, - tagsNone, - dependenciesNone, response_model: Optional[Type[Any]] None, status_code: Optional[int] None, tags: Optional[List[Union[str, Enum]]] None, dependencies: Optional[Sequence[Depends]] None, ... ) - None: -xxx,xx xxx,xx class APIRouter: def add_api_route( self, path: str, - endpoint, endpoint: Callable[..., Any], *, - response_modelNone, - status_codeNone, response_model: Optional[Type[Any]] None, status_code: Optional[int] None, ... - ): ) - None:diff 里能看到Aider 把原来裸写的参数都加上了类型返回值也补了- None。有些地方它用了Any这是权衡后的结果——routing.py里有些参数的类型确实很难精确表达强行写死反而会引入错误。我的原则是能精确就精确不能精确就用Any加注释说明但至少要让mypy通过。整个补全过程大概跑了十几轮对话Aider 每次生成 diff 后我会看一遍有问题的就让它改。DeepSeek V4.1 Flash 在这个任务上的表现是大部分标注能一次写对少数需要根据mypy报错回改。它的上下文理解能力够用能看懂routing.py里那些泛型和装饰器的关系。4. mypy 输出与 Token 消耗记录补全完成后跑mypy fastapi/routing.py。这里要说明一下FastAPI 仓库本身有自己的mypy配置我直接用的项目配置没有额外加严格参数。输出如下$ mypy fastapi/routing.py Success: no issues found in 1 source file这是最终结果。中间过程里mypy报过几次错主要是两类一类是Optional没写导致None不兼容另一类是泛型参数缺失导致Type[Any]和具体类型对不上。Aider 看到报错后能自己修正不需要我手动改。Token 消耗方面Aider 每次请求都会显示本次调用的 token 数。我统计了整个任务的总消耗项目数值输入 Token约 48,000输出 Token约 12,000总 Token约 60,000对话轮次14 轮这个数字是一次运行的结果不代表公榜也不代表模型的平均水平。不同仓库、不同文件、不同提示词都会影响消耗。Aider 的 repo map 会占用不少输入 token因为每次请求都要把相关符号的上下文带上。如果文件更大输入 token 会涨得更快。关于费用TaoToken 的售价和折扣以 官网展示 为准我这里不写具体数字。用量可以在控制台里查每次调用的 token 数都有记录方便对账。这里要强调一点本文不含任何公榜排行分数。我没有跑 SWE-bench Verified也没有跑 Aider Polyglot上面这些数字只是我这一次本地运行的记录。如果你要对比不同模型应该用同一把 Key、同一个 Prompt、同一个文件在相同环境下跑才能得到可比的对照表。5. 用同一把 Key 复现这次类型补全如果你想复现这次任务步骤不复杂。先把 FastAPI 仓库克隆下来切到和我一样的 commit然后按前面的配置把 Aider 接到 TaoToken 的通道上。Key 在 控制台 创建Base URL 用https://taotoken.net/api模型 ID 从 模型广场 查。复现的时候有几个点要注意。第一mypy的版本和配置要一致不同版本的mypy对同一份代码的判断可能不同。第二Aider 的 repo map 大小会影响模型看到的上下文如果仓库太大可以只把routing.py和相关依赖加进去减少干扰。第三提示词要写清楚约束条件比如“不改变运行时行为”“不用 Any 糊弄”否则模型可能会用Any把所有类型问题都盖过去mypy是过了但类型标注的意义就没了。跑完之后你可以打开 模型对话 确认一下 DeepSeek V4.1 Flash 的模型 ID 和广场上是否一致也可以直接在对话里试一条类型补全的请求看看单次调用的返回质量。如果打算长期用 Aider 做这类重构可以看看 Coding Plan按用量规划比每次单独充值省事。这次任务里 Aider 和 DeepSeek V4.1 Flash 的配合是顺畅的。Aider 负责把仓库上下文组织好、把 diff 呈现出来模型负责推断类型、根据mypy反馈修正。TaoToken 在中间提供稳定的通道让 Aider 能像调 OpenAI 一样调 DeepSeek V4.1 Flash。整个链路里没有出现连接中断或限流导致的失败14 轮对话都正常返回。如果你也在做类似的老仓库类型标注补全建议先用一个小文件试通链路再上大文件。routing.py这种体量的文件一次跑完大概要几万 token心里有个数比较好。补全后的 diff 不要直接合进主分支先跑一遍完整测试确认没有运行时行为变化再提交。类型标注本身不改逻辑但模型偶尔会顺手改点别的review 的时候要盯紧。 告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度