1. 先分清 401 是哪个环节报的:网关、上游还是浏览器
LiteLLM 网关代理报 401 时,第一反应不要急着改 Key。401 本身只代表“这个请求没有被身份认证接受”,但同样一个 401,可能来自三个完全不同的位置:
- LiteLLM 向某个模型供应商发起请求时,供应商返回 401;
- LiteLLM 自身的 Virtual Key 校验失败,也就是客户端传给网关的 Key 不对;
- 你在测试工具里填的 Base URL 或 Key 根本还没到 LiteLLM,就被前端或代理拦截了。
原文里讲的是“用 LiteLLM 网关代理统一管理大模型”,排障视角也应该沿用这条链路:先看网关日志,确认 401 发生在哪一跳。大多数情况下,问题出在model_list里的api_key和api_base没有对齐。比如你填了一个官方 Key,但api_base指向旧版地址;或者 Key 复制时夹带空格;再或者模型名没对上,LiteLLM 走了一个错误的上游通道。
TaoToken 的做法是把上游这一跳简化:在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建一把 Key,然后在 LiteLLM 的model_list里把api_base填成https://taotoken.net/api,api_key填这把新 Key。这样网关对上只有一条固定的认证路径,不在上游换一个模型就换一套 Key 信息,401 的排查范围就大大缩小。
2. 动手前先确认三件事:Key、Base URL、模型 ID
2.1 在 TaoToken 创建你的上游 Key
先打开 TaoToken,注册登录后进入控制台,找到 API Keys 页面创建一把 Key。这个动作对应原文里“去各模型官网申请 Key”的那一步,只不过现在只需要在这里完成一次,后面不管接 Claude、GPT 还是其他模型,都不需要再每家跑一遍。
创建出来的 Key 形如比较长的一段随机字符串,复制后先存到本地临时文件里待用。后面所有配置里的api_key字段,都填这一把 Key,不要混用其他渠道的 Key。
2.2 Base URL 只填一行
TaoToken 的统一接口地址是:
https://taotoken.net/api注意末尾没有/v1。这个地址是填进工具或配置文件里的,不是用来在浏览器里打开的。打开官网用的是https://taotoken.net/?utm_source=taotoken_aicg_blog_end,两者不要搞混。
LiteLLM 里配置api_base时,也填上面这一行。原文里你在每个模型供应商的控制台复制各自的 Base URL,现在统一收敛成这一条。
2.3 模型 ID 以模型广场为准
模型 ID 不要凭记忆写。你记得的claude-xxx或gpt-xxx版本号,跟 TaoToken 模型广场里当前挂出来的 ID 不一定一致。正确做法是:
- 打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end;
- 进入模型广场,找到你要用的模型;
- 把页面上的模型 ID 原样复制下来,再填进 LiteLLM 的
model_list。
这一步看似简单,但实际上很多 401 是这么来的:模型 ID 写错,LiteLLM 把这个请求路由到了一个不存在的上游地址,对方直接回 401 或 404。
3. 修改 LiteLLM 的 model_list,让网关统一走 TaoToken
3.1 先看原来的配置哪里不对
原文的典型config.yaml大致是这种结构:
model_list: - model_name: claude-3-5-sonnet litellm_params: model: anthropic/claude-3-5-sonnet api_key: sk-ant-xxxx api_base: https://api.anthropic.com这种配置没有错,但维护成本高:每接一个模型,就要去对应平台申请 Key、查 Base URL、确认模型版本号。某一个 Key 过期或没额度时,LiteLLM 会把它封装成一个上游 401 返回给你的调用方。你还要去翻日志判断到底是 Anthropic 拒了还是 Azure 拒了。
改法是把litellm_params里的api_key和api_base统一指向 TaoToken:
model_list: - model_name: claude-3-5-sonnet litellm_params: model: claude-3-5-sonnet api_key: YOUR_API_KEY api_base: https://taotoken.net/api - model_name: gpt-4o litellm_params: model: gpt-4o api_key: YOUR_API_KEY api_base: https://taotoken.net/api这里的YOUR_API_KEY就是从 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建出来的那把 Key。model字段填模型广场上显示的 ID,model_name是你在 LiteLLM 里自定义的对外名称,可以按自己的习惯起,但建议跟上游 ID 保持一致,省得排查时多绕一层。
3.2 统一认证通道后,401 的含义变简单了
原来的 401 可能是“Anthropic 说你的 Key 无效”“OpenAI 说你的 Key 额度不足”“Azure 说你的 endpoint 不存在”,各种原因混在一起。现在所有上游请求都从同一把 TaoToken Key 走,网关层收到的 401 只剩两种情况:
YOUR_API_KEY本身没创建成功或复制漏字符;- 模型 ID 不在 TaoToken 当前支持列表里。
这两种情况都很好验证:去模型广场看一眼,或者直接换一个模型 ID 再试。
3.3 LiteLLM 的 Virtual Key 也可以照常开
如果你原本用 LiteLLM 的 Virtual Key 功能给不同业务线分发 Key,这部分不需要改动。LiteLLM 里生成的 virtual key 是给下游调用方用的,TaoToken 的 Key 是 LiteLLM 上游用的,两者是独立维度。原文里“用网关统一管理模型”的设计不变,只是上游从多供应商收敛到 TaoToken 单一通道。
4. 同步修改客户端配置:别让 401 卡在最后一跳
LiteLLM 本身跑通了还不够。你实际调 LiteLLM 的工具(OpenAI SDK、Claude Code、Codex 等)如果还指着旧地址,请求根本到不了网关。
4.1 如果你用 OpenAI SDK 调 LiteLLM
from openai import OpenAI client = OpenAI( api_key="sk-your-litellm-virtual-key", base_url="http://localhost:4000/v1", ) response = client.chat.completions.create( model="claude-3-5-sonnet", messages=[{"role": "user", "content": "你好"}], ) print(response.choices[0].message.content)这里base_url指向你本地 LiteLLM 网关地址,跟 TaoToken 没关系。TaoToken 的地址只出现在 LiteLLM 的config.yaml里,不要串。
4.2 如果你用 curl 直接验证 LiteLLM
curl http://localhost:4000/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-your-litellm-virtual-key" \ -d '{ "model": "claude-3-5-sonnet", "messages": [{"role": "user", "content": "你好"}] }'这一步能确认:客户端到 LiteLLM 是通的、LiteLLM 到 TaoToken 是通的。如果 curl 直连 LiteLLM 成功但里层依然报 401,再看下一步。
5. 验证与排障:用最小请求把 401 切成两段
5.1 先绕过 LiteLLM,直连 TaoToken
排障的关键是缩小范围。先用 curl 直连 TaoToken,确认这把 Key 本身没问题:
curl https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d '{ "model": "claude-3-5-sonnet", "messages": [{"role": "user", "content": "你好"}] }'注意了,这里仍然用https://taotoken.net/api作为 Base URL,加上/v1/chat/completions是补全的路径。如果你收到正常的模型回复,说明 Key、Base URL、模型 ID 三者都没问题,问题一定在 LiteLLM 配置。
如果这里就报 401,回 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 检查两件事:Key 是否复制完整,模型 ID 是否跟模型广场上的完全一致。很多人会在复制时漏掉末尾字符,尤其 Key 是以“-”结尾时特别容易少一位。
5.2 再看 LiteLLM 这一层
直连 TaoToken 成功后,再启动 LiteLLM,用同样的模型发一次请求。如果 LiteLLM 返回 401,查看 LiteLLM 的启动日志,重点看它实际请求的上游地址是https://taotoken.net/api还是旧的官方地址。有时候config.yaml改了但进程没重启,LiteLLM 还在用旧配置跑。
5.3 401 之外容易连着出现的两个错
405 Method Not Allowed:检查请求方法是不是 POST,有些网关配置里路由只开放了 POST。
404 Not Found:很有可能是 Base URL 末尾加了/v1,导致实际请求变成https://taotoken.net/api/v1/v1/chat/completions,路径不匹配。TaoToken 的 Base URL 就是https://taotoken.net/api,不要在配置里再拼一个/v1。
6. 跑通之后去控制台对一下这次调用
LiteLLM 网关代理报 401 的排障流程走到这里,基本已经收尾。建议配置保存后,先在 TaoToken 模型对话 里用同一把 Key 发一条测试消息,确认模型 ID 确实能用。注意这一步用的还是YOUR_API_KEY,不是 LiteLLM 里的 virtual key,目的是把上游问题彻底排除掉。
确认上游正常后,再回到 LiteLLM 网关发一次请求,看控制台是否记上了这次调用。用量记录能帮你判断请求到底有没有打到 TaoToken:有记录,说明网关路由没问题;没记录,说明请求在 LiteLLM 这层就被拦下来了。跨多台机器共用网关权限的话,可以把每个业务线的 Key 分开创建,这样 401 出现时能直接看出是哪条业务线的 Key 出了问题,而不是一把 Key 被多台机器共用后谁也说不清。
如果想给长期写代码的场景做个固定预算,可以打开 Coding Plan 看套餐是否匹配当前用量。现有的 Key 管理入口在 控制台 API Keys,以后新增模型或轮换 Key 都从这里操作。Claude Code 等工具的具体接入参数,参考 接入文档,里面环境变量和配置文件给的是可直接复制的写法,跟这次 LiteLLM 的思路一致:Base URL 填https://taotoken.net/api,Key 填YOUR_API_KEY,模型 ID 以模型广场为准。
我的个人建议是:不要在 401 出现时才去翻 Key。平时就把这串对应关系固定下来——TaoToken 的 Key 只放进网关或工具配置里,模型 ID 写进代码前先去模型广场复制,Base URL 永远保持https://taotoken.net/api。三样东西一一对应,绝大多数 401 根本不会出现。