06 — Auto 模型路由:动态选择模型与推理级别
Auto 模型路由:动态选择模型与推理级别
学习目标
理解 CodeWhale 的 Auto 模式:通过一次廉价的 Flash 预调用动态选择模型与推理级别,以及路由失败时的回退策略。
前置知识
- 多模型适配架构 — 统一抽象层、认证策略与故障转移
- 声明式 Provider 注册表 — Provider 注册与路由通用模式
下文假设你已理解上述概念,直接聚焦 CodeWhale 的具体实现。
项目实践
工作原理
--model auto 是 CodeWhale 的默认模式。它在每轮实际请求前执行一次轻量路由:
路由决策
路由调用分析:
- 最新请求的内容
- 近期上下文中积累的 turn 状态
决策结果:
| 任务类型 | 选择模型 | 推理级别 |
|---|---|---|
| 短/简单问题 | deepseek-v4-flash | off |
| 编码任务 | deepseek-v4-pro | high |
| 调试/架构 | deepseek-v4-pro | max |
| 安全审查 | deepseek-v4-pro | high |
| 模糊多步任务 | deepseek-v4-pro | high |
失败回退
如果路由调用失败(网络超时、API 错误)或返回无效答案:
- 回退到本地启发式策略
- 本地启发式基于请求长度和关键词复杂度判断
- 子 Agent 继承父的 Auto 模式,除非显式指定模型
关键属性
- Auto 是本地概念:上游 API 从不收到
model: "auto"——只收到具体的模型和推理级别 - 成本追踪对实际模型计费:Flash 路由调用的成本独立计算,实际响应按实际模型计费
- TUI 显示路由路径:用户可以在 UI 中看到模型选择了什么以及为什么
- 手动覆盖:
Shift+Tab在 TUI 中手动切换推理级别(off → high → max) - 固定模型用于基准测试:需要可重复基准测试、严格成本上限或特定 provider/model 映射时,使用固定模型
实现入口
路由逻辑在 resolve_cli_auto_route() 函数中实现(crates/tui/src/main.rs),CLI 和 ACP 服务器都调用此函数。
问题与规避
陷阱:路由调用本身消耗成本
每次 turn 额外一次 Flash 调用,成本约 $0.14/M input × 几百 tokens ≈ $0.00005。
规避:对于高频简单查询(如”解释这行代码”),路由成本可能接近实际响应成本。CodeWhale 的路由调用极简——只发送最新请求和少量上下文,控制 token 消耗。
陷阱:路由决策不准确
Flash 模型的路由判断可能不如 Pro 准确,导致简单任务用了 Pro 或复杂任务用了 Flash。
规避:路由的代价是有限的——如果 Flash 不足以处理被升级的任务,用户可以在下一轮用 --model 或 /model 手动覆盖。
陷阱:子 Agent 的成本累积
每个子 Agent 都继承 Auto 模式,如果父 Agent 同时打开 10 个子 Agent,每个都做一次路由调用。
规避:子 Agent 的路由调用使用 Flash(最低成本),且路由结果倾向于对子 Agent 使用更经济的配置。并发上限(10/20)也限制了累积成本。
设计取舍
Auto vs 固定模型
| 维度 | Auto 模式 | 固定模型 |
|---|---|---|
| 成本 | 优化——简单任务用便宜模型 | 固定——每轮相同成本 |
| 可重复性 | 低——路由决策可能变化 | 高——每次相同模型 |
| 延迟 | 略高——额外一次路由调用 | 最低——直接调用 |
| 适合场景 | 日常使用,任务类型多样 | 基准测试、成本上限、调试 |
为什么选 Flash 做路由
Flash 的输入价格 $0.14/M tokens 是 Pro 的 1/3,且 thinking off 时延迟极低。一次几百 token 的路由调用成本不到 $0.0001,远低于 Pro 路由调用的成本。
为什么是两级模型而非三级
当前只有 deepseek-v4-flash 和 deepseek-v4-pro。未来如果增加中间级别(如 deepseek-v4-plus),路由逻辑需要扩展决策树,但核心架构(轻量预调用 + 动态选择)保持不变。
参考来源
- CodeWhale README “Auto Mode” 章节
crates/tui/src/main.rs—resolve_cli_auto_route()函数- DeepSeek 定价页面: https://api-docs.deepseek.com/zh-cn/quick_start/pricing