
1. 多模型项目里Key 管理为什么总在拖后腿如果你手上有三四个模型供应商的 Key又同时跑着几个 Agent 或编码助手大概率遇到过这种局面每个工具各配一套环境变量换一个模型就要改一遍配置某个 Key 额度用完了还得挨个文件翻。LiteLLM 的定位正好卡在这个痛点上——它是一个统一的 LLM 调用网关对外暴露 OpenAI 兼容接口对内把不同供应商的模型聚合成一个model_name再配合路由、重试、冷却、成本跟踪这些扩展能力把「多模型」这件事收敛成一份配置。而 TaoToken 提供的是统一 Key 通道一个 Key 就能访问多家模型接口地址是https://taotoken.net/api兼容 OpenAI 的/v1/chat/completions协议。把 LiteLLM 架在 TaoToken 前面等于让 LiteLLM 负责路由策略和可观测性TaoToken 负责上游通道和密钥集中两边各管一段配置量反而比直连多个供应商更小。这篇面向的是需要多模型路由与密钥集中管理的开发者交付两份可直接复制的配置LiteLLM 的config.yaml骨架以及编码工具侧的settings.json片段最后给出启动后验证路由与鉴权的具体动作。全程不需要你改 LiteLLM 源码扩展能力都通过配置和回调挂载。2. 前置准备TaoToken 统一 Key 与 LiteLLM 安装2.1 拿到统一 Key 和接入地址先在 TaoToken 控制台创建一个 API Key这个 Key 就是后面 LiteLLM 配置里唯一的凭据来源。控制台入口在 console创建完记得复制保存页面关闭后不再完整显示。接入地址固定为https://taotoken.net/api注意这里不带任何查询参数LiteLLM 的api_base直接写这个值即可。如果你用的是 OpenAI SDK 风格的客户端通常还需要在末尾补/v1但 LiteLLM 的openai/provider 会自动处理路径拼接写根地址更稳妥。2.2 安装 LiteLLM 与代理服务LiteLLM 有两种用法作为 Python 库嵌入代码或作为独立代理服务启动。多模型路由和统一 Key 场景更适合后者因为代理模式支持config.yaml热加载编码工具只要指向本地代理端口就行。pip install litellm[proxy]装完后确认版本路由策略和回调接口在不同版本间有差异建议用较新的稳定版litellm --version2.3 环境变量约定不要把 Key 硬编码进config.yaml。LiteLLM 支持os.environ/VAR_NAME语法读取环境变量这样配置文件可以进版本库密钥留在本地或密钥管理服务里。export TAOTOKEN_API_KEYsk-你的统一Key如果你在 Windows 上用 PowerShell对应写法是$env:TAOTOKEN_API_KEYsk-...。这一步做完后面的配置才有意义。3. 可复制配置config.yaml 骨架与 settings.json 片段3.1 config.yaml 最小可用骨架下面这份配置把 TaoToken 作为唯一上游通过model_name暴露两个逻辑模型名实际都走同一个api_base。model字段用openai/前缀表示按 OpenAI 兼容协议调用。model_list: - model_name: tao-fast litellm_params: model: openai/deepseek-chat api_base: https://taotoken.net/api api_key: os.environ/TAOTOKEN_API_KEY rpm: 600 - model_name: tao-reason litellm_params: model: openai/claude-sonnet-4-20250514 api_base: https://taotoken.net/api api_key: os.environ/TAOTOKEN_API_KEY rpm: 300 router_settings: routing_strategy: simple-shuffle num_retries: 3 retry_after: 2 allowed_fails: 3 cooldown_time: 30 enable_pre_call_checks: true litellm_settings: drop_params: true cache: true cache_params: type: local ttl: 600 general_settings: master_key: sk-local-master port: 4000几个参数值得单独说。routing_strategy: simple-shuffle是生产环境推荐值按 RPM/TPM 加权选择部署性能开销最小。drop_params: true会丢弃上游不支持的参数避免因为某个模型不认top_p之类字段直接报 400。enable_pre_call_checks: true打开预调用检查请求发出前先过滤上下文窗口不够的部署。3.2 多部署与权重路由如果你在 TaoToken 侧对同一模型开了多个通道或者想给不同模型名分配不同权重可以这样写model_list: - model_name: tao-fast litellm_params: model: openai/deepseek-chat api_base: https://taotoken.net/api api_key: os.environ/TAOTOKEN_API_KEY weight: 9 - model_name: tao-fast litellm_params: model: openai/qwen-plus api_base: https://taotoken.net/api api_key: os.environ/TAOTOKEN_API_KEY weight: 1同一个model_name下挂两个部署weight决定被选中的概率。实测下来这种写法适合灰度切换新模型先给 1 成流量观察回调里的失败率和成本再逐步调高权重。3.3 编码工具侧 settings.json 片段如果你用的是 Claude Code 这类读取settings.json的工具把上游指向本地 LiteLLM 代理即可。注意这里指向的是 LiteLLM 的端口不是 TaoToken 地址因为路由和鉴权已经由 LiteLLM 接管。{ env: { ANTHROPIC_BASE_URL: http://127.0.0.1:4000, ANTHROPIC_AUTH_TOKEN: sk-local-master, ANTHROPIC_MODEL: tao-reason, ANTHROPIC_SMALL_FAST_MODEL: tao-fast } }ANTHROPIC_AUTH_TOKEN填的是config.yaml里的master_key不是 TaoToken 的 Key。这样编码工具只认本地代理换模型、换通道都在 LiteLLM 侧完成工具配置不用动。关于 Claude Code 的接入细节可以参考 ClaudeCodeAnthropic 文档。3.4 挂载自定义回调做成本跟踪LiteLLM 的扩展能力里回调是最实用的一环。新建一个custom_logger.pyimport litellm from litellm.integrations.custom_logger import CustomLogger class CostTracker(CustomLogger): def log_success_event(self, kwargs, response_obj, start_time, end_time): params kwargs.get(litellm_params, {}) print( model, params.get(model), api_base, params.get(api_base), cost, kwargs.get(response_cost), ) def log_failure_event(self, kwargs, response_obj, start_time, end_time): print(failure kwargs, kwargs.get(litellm_params)) litellm.callbacks [CostTracker()]然后在config.yaml里引用litellm_settings: callbacks: custom_logger.CostTracker启动时 LiteLLM 会加载这个模块每次请求成功或失败都会打印模型名、上游地址和成本。成本字段依赖 LiteLLM 内置的价格表如果某个模型不在表里response_cost会是None这时可以在model_info里补base_model指向一个已知价格的模型。4. 启动与验证确认路由和鉴权真的生效4.1 启动代理litellm --config config.yaml --detailed_debug--detailed_debug会打印路由决策过程第一次调试建议加上确认请求确实走了你配置的model_name。看到Uvicorn running on http://0.0.0.0:4000就说明起来了。4.2 验证鉴权先用错误的 Key 打一次确认鉴权层拦截生效curl -s http://127.0.0.1:4000/v1/chat/completions \ -H Authorization: Bearer wrong-key \ -H Content-Type: application/json \ -d {model:tao-fast,messages:[{role:user,content:hi}]}预期返回 401 或invalid api key之类的错误。如果这个请求成功了说明master_key没生效检查general_settings缩进是否正确。再用正确的 Key 验证curl -s http://127.0.0.1:4000/v1/chat/completions \ -H Authorization: Bearer sk-local-master \ -H Content-Type: application/json \ -d {model:tao-fast,messages:[{role:user,content:用一句话说明你是什么模型}]}返回体里应该有choices[0].message.content同时终端会打印回调里的model和cost。这一步同时验证了三件事本地鉴权通过、路由选中了tao-fast、TaoToken 上游返回正常。4.3 验证路由切换把请求里的model换成tao-reason再打一次。观察--detailed_debug输出应该能看到路由层选择了另一个部署。如果你配了权重连续打十次tao-fast统计回调日志里两个上游模型的出现次数比例应该接近 9:1。4.4 验证预调用检查构造一个超长messages超过某个部署的上下文窗口看 LiteLLM 是否自动跳过该部署。如果所有部署都装不下会返回明确的上下文超限错误而不是把请求发出去再被上游拒绝。这个能力在多模型混用时很关键能省掉一轮无效请求。5. 本篇常见错排查5.1 401 与鉴权失败最常见的原因是master_key和客户端传的 token 不一致。LiteLLM 的master_key是代理层凭据TaoToken 的 Key 是上游凭据两者不能混用。另一个坑是api_key: os.environ/TAOTOKEN_API_KEY写成了os.environ:TAOTOKEN_API_KEY冒号和斜杠写错会导致读取失败启动日志里会有Environment variable not found提示。5.2 模型名不匹配model_name是 LiteLLM 对外的逻辑名litellm_params.model才是真正发给上游的模型标识。客户端请求里必须用model_name写错会返回model not found。如果你不确定 TaoToken 侧支持哪些模型标识可以在 模型对话 页面直接试确认能跑通再写进配置。5.3 参数被上游拒绝不同模型对temperature、top_p、max_tokens的接受范围不一样。drop_params: true能挡掉大部分不支持的字段但如果某个参数是必填且取值超范围还是会被上游拒。排查时打开--detailed_debug看 LiteLLM 实际发出的请求体对比上游返回的错误信息。5.4 回调不触发litellm_settings.callbacks里写的是模块路径不是文件路径。如果custom_logger.py不在启动目录下需要保证它在 Python 的sys.path里或者用完整包路径。另外回调里的异常会被 LiteLLM 吞掉不会中断请求所以打印没出来时先确认模块是否真的被导入可以在文件顶部加一行print(callback loaded)验证。5.5 冷却与重试的副作用allowed_fails: 3配合cooldown_time: 30在单部署场景下要小心如果只有一个部署失败三次后它会被冷却期间所有请求都会失败。多部署场景下这个机制才有意义。另外num_retries设太大遇到持续 429 会放大请求量建议配合retry_after一起用给上游留恢复时间。6. 把统一 Key 通道接进你的日常工具链配置跑通之后日常使用其实就两件事保持 LiteLLM 代理常驻把各个工具的 base_url 指向http://127.0.0.1:4000。编码类工具适合走 Coding Plan 的额度池把tao-fast和tao-reason分别映射到轻量和重载任务上成本曲线会好看很多。如果你需要给团队分发 Key不要在 LiteLLM 里共享master_key而是用 API Keys 页面生成多个子 Key在 LiteLLM 的general_settings里配置多 Key 校验这样每个人的用量和权限都能单独控制。接入协议和字段说明以 接入文档 为准遇到路由或鉴权报错时对照文档里的错误码表排查比盲改配置快得多。