1. 多模型调度为什么需要一个路由骨架
如果你手上同时开着 Claude Code、Cursor、Copilot、Gemini CLI 这几个编码助手,大概率会遇到一个很现实的问题:每个工具都有自己的入口、自己的会话、自己的上下文,任务一多就变成在几个窗口之间来回粘贴。acp-router 想解决的就是这件事——它把自然语言请求当成输入,根据规则判断这次任务该交给哪个编码代理去跑,再通过统一的会话接口把上下文传过去。
它适合谁?适合同时用多个 AI 编码工具、又不想每次手动选运行时的开发者;也适合团队里想把「写单测」「改配置」「查日志」这类任务按类型分给不同代理的场景。核心机制可以理解成「传话游戏」:acpx 驱动会话,在不同代理之间传递任务指令和上下文,而 acp-router 负责决定第一棒交给谁。
但路由骨架搭起来之后,还有一个绕不开的环节:每个代理背后都要有可用的模型通道。如果每个工具单独配一套 Key,管理成本会迅速上升。我这次的做法是让 acp-router 负责「分发决策」,让 TaoToken 负责「统一模型通道」,两边各管一段,骨架就清晰了。下面按可复制的顺序走一遍。
2. TaoToken 前置:统一 Key 与 API 通道
TaoToken 在这里的角色是统一入口:你拿到一个 Key,通过同一个 API 地址去调用不同模型,acp-router 分发到哪个代理,代理侧读的都是这套通道配置。这样路由规则调整时,不用跟着改一堆分散的密钥。
先做两件事。第一,注册并登录后进入控制台,在 API Keys 页面创建一个 Key,复制保存好,后面配置文件里要用。第二,确认你要用的模型在通道里可用,记下模型名,路由规则里会按模型名做匹配。
相关入口我放在这里,按需取用:
- 官网入口:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
- API 地址(配置里填这个):https://taotoken.net/api
- 创建 Key:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite
- 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
注意:API 地址不要带 UTM 参数,配置里只写
https://taotoken.net/api,多余参数可能导致请求路径异常。
Key 拿到后先别急着写路由,用一条最小请求确认通道是通的,这一步能省掉后面大量「到底是路由错了还是 Key 错了」的排查时间。
3. 可复制的路由配置骨架
下面这份配置是骨架性质,字段名按你的 acp-router 版本对齐即可,重点是结构:providers定义通道,routes定义分发规则,default兜底。
# acp-router.config.yaml version: 1 # 统一模型通道:所有代理共用同一套 Key 与 API 地址 providers: taotoken: type: openai-compatible base_url: "https://taotoken.net/api" api_key: "${TAOTOKEN_API_KEY}" # 从环境变量读取,别硬编码 models: - claude-sonnet - gpt-4o - gemini-pro # 路由规则:按任务特征决定交给哪个代理 routes: - name: "code-edit" match: intent: ["edit", "refactor", "fix"] language: ["python", "typescript"] target: "claude-code" provider: "taotoken" model: "claude-sonnet" - name: "quick-qa" match: intent: ["explain", "what-is", "how-to"] target: "gemini-cli" provider: "taotoken" model: "gemini-pro" - name: "long-context" match: tokens_gt: 32000 target: "cursor" provider: "taotoken" model: "gpt-4o" # 兜底:没命中任何规则时走这里 default: target: "opencode" provider: "taotoken" model: "claude-sonnet" # 会话行为 session: mode: "acpx" # 传话游戏模式 spawn_method: "sessions_spawn" context_carry: true # 跨代理传递上下文几个关键点解释一下。base_url统一指向 TaoToken 的 API,代理侧不需要各自维护密钥。api_key用环境变量注入,避免把 Key 写进版本库。routes是按顺序匹配的,越具体的规则越往前放,tokens_gt这种数值条件适合处理长上下文任务。default一定要有,否则未命中规则时请求会直接失败。
环境变量这样设置:
export TAOTOKEN_API_KEY="sk-你的Key"Windows PowerShell 用:
$env:TAOTOKEN_API_KEY="sk-你的Key"配置写完后,先做一次语法校验再启动,很多「路由不生效」其实是 YAML 缩进问题。
4. 验证请求:确认分发真的生效
配置对不对,跑一次就知道。准备两条意图明显不同的请求,看它们是否落到不同代理。
第一条,走代码编辑规则:
curl -X POST http://localhost:8080/route \ -H "Content-Type: application/json" \ -d '{ "input": "帮我重构这段 Python 函数,去掉重复逻辑", "context": {"language": "python"} }'预期返回里target应该是claude-code,model是claude-sonnet,provider是taotoken。
第二条,走快速问答规则:
curl -X POST http://localhost:8080/route \ -H "Content-Type: application/json" \ -d '{ "input": "解释一下什么是闭包", "context": {} }'预期target变成gemini-cli,model是gemini-pro。如果两条请求返回的 target 一样,说明规则没命中,检查intent关键词是否和输入对得上。
再验证一次通道本身是否通,直接打 TaoToken 的接口:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet", "messages": [{"role": "user", "content": "ping"}] }'返回里有正常的choices字段,说明 Key 和通道都没问题。这一步和路由验证分开做,出问题时能快速定位是通道层还是路由层。
5. 本篇常见错排查
路由规则不命中,全部走 default。最常见的原因是match条件写得太窄。比如输入是「重构函数」,但规则里只写了refactor,中文没匹配上。解决办法是把同义表达都列进去,或者先用日志把实际解析出的 intent 打出来看。
401 或鉴权失败。先确认环境变量在当前 shell 里真的生效了,echo $TAOTOKEN_API_KEY看一下。如果配置文件里写的是${TAOTOKEN_API_KEY},要确认加载配置的进程能读到这个变量,后台服务经常读不到交互式 shell 的变量。
请求路径 404。检查base_url是不是写成了带 UTM 的完整链接。配置里只保留https://taotoken.net/api,路径拼接交给客户端。
上下文没传过去。context_carry打开后仍丢失,通常是session.mode没设成acpx。传话游戏模式依赖 acpx 驱动会话,模式不对上下文就断在第一个代理里了。
长上下文任务被短规则截胡。tokens_gt规则要放在通用规则前面,否则短意图规则先命中,长任务永远走不到该去的地方。规则顺序就是优先级,这点和防火墙规则一个道理。
Codex 绑定行为不符合预期。默认走原生 Codex 应用服务器插件,只有显式指定 ACP 或后台生成需要 ACP 时才切换。如果你发现没走 ACP,先确认请求里有没有明确要求。
6. 继续往下接的方向
骨架跑通之后,下一步通常是两件事:一是把路由规则从静态配置改成可热更新的,二是给不同代理加上失败重试和降级。降级这块可以直接复用 TaoToken 的通道——某个模型不可用时,规则里把model换成备选即可,不用动代理侧配置。
如果你主要在做长期编码或 Agent 类任务,建议把 Coding Plan 也接进来统一管理额度:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite
想先在网页里手动验证模型输出、对比不同模型对同一任务的表现,用模型对话页面最快:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite
Key 管理和通道配置都在控制台:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
接入细节和字段说明以文档为准:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
我自己的习惯是每加一条路由规则,就先跑两条意图相反的请求验证分流,确认没问题再往上叠。规则一多,顺序和兜底就是最容易出问题的地方,早验证早省事。