1. 为什么要在 OpenClaw 和 LiteLLM 之间插一层 TaoToken
如果你已经在用 OpenClaw 做本地 Agent,又用 LiteLLM 当统一网关,那你大概率遇到过这个场景:手里有七八个模型要切换,每个模型背后是不同厂商的 Key、不同的 base_url、不同的计费口径。OpenClaw 侧只认一个 OpenAI 兼容入口,LiteLLM 负责把请求分发出去,但分发出去之后,每个 provider 的 Key 管理、额度监控、路由回退还是散的。
我试过把每个厂商的 Key 直接写进 LiteLLM 的model_list,短期能跑,长期维护很痛苦:换一个 Key 要改配置重启,加一个模型要重新对一遍 base_url,团队里谁用了多少 token 也说不清。这时候把 TaoToken 作为统一 Key/API 通道接进 LiteLLM,就变成一个很自然的选择——LiteLLM 只认一个api_base和一个api_key,OpenClaw 侧完全无感,模型路由、回退、限流这些逻辑仍然留在 LiteLLM 里。
这篇面向的是已经跑通 OpenClaw + LiteLLM 的开发者,重点不是教你从零装 LiteLLM,而是给出一个可以直接复制的config.yaml骨架,把 TaoToken 作为统一通道接进去,再用一条 curl 确认 OpenClaw 的请求确实经 LiteLLM 落到了 TaoToken。适合谁:手里有多个模型要路由、又不想在每个 provider 上重复配 Key 的人;已经在用 LiteLLM 但 Key 管理混乱的人;想让 OpenClaw 的模型调用走一条可观测通道的人。
核心检索词先摆出来:OpenClaw 接 LiteLLM 统一网关、LiteLLM config.yaml 骨架、TaoToken 统一 Key 通道、多模型路由。下面从配置骨架开始,一步步落到验证。
2. TaoToken 前置:拿到统一 Key 和 API 地址
在写config.yaml之前,先把 TaoToken 侧的接入信息准备好。你需要两样东西:一个 API Key,一个 API base 地址。
API base 用https://taotoken.net/api,注意这里不加任何查询参数,LiteLLM 的api_base字段直接填这个。API Key 在控制台的 API Keys 页面创建,创建后复制出来,后面在config.yaml里通过环境变量引用,不要硬编码进文件。
创建 Key 的入口在这里:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite
如果你还没注册,官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,注册后在控制台里能看到 Key 管理和用量面板。控制台地址:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
拿到 Key 之后,先别急着写 LiteLLM 配置,用一条最朴素的 curl 确认这个 Key 和 base 地址是通的:
export TAOTOKEN_API_KEY="sk-你的key" curl -s https://taotoken.net/api/v1/models \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" | head -c 500如果返回一个模型列表的 JSON,说明 Key 和 base 都没问题。这一步很关键,因为后面 LiteLLM 报错时,你要能区分是 LiteLLM 配置问题还是 TaoToken 通道问题。如果这一步就 401,先回控制台确认 Key 有没有复制完整、有没有被禁用。
注意:
api_base填https://taotoken.net/api,LiteLLM 内部会自己拼/v1/chat/completions这类路径,不要手动写成https://taotoken.net/api/v1,否则会出现路径重复。
模型对话的入口在这里,可以用来对照模型名:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite
3. 可复制配置:LiteLLM config.yaml 骨架
现在进入正题。LiteLLM 的配置文件核心是model_list,每一项是一个model_name(OpenClaw 侧看到的名字)加一组litellm_params(实际路由参数)。把 TaoToken 作为统一通道,意味着所有 provider 的api_base都指向 TaoToken,api_key都引用同一个环境变量。
先看完整骨架,文件名建议叫litellm_config.yaml:
model_list: # 统一走 TaoToken 通道的 GPT 系列 - model_name: gpt-4o litellm_params: model: openai/gpt-4o api_base: https://taotoken.net/api api_key: os.environ/TAOTOKEN_API_KEY # Claude 系列,同样走 TaoToken - model_name: claude-sonnet litellm_params: model: anthropic/claude-sonnet-4-20250514 api_base: https://taotoken.net/api api_key: os.environ/TAOTOKEN_API_KEY # DeepSeek 系列 - model_name: deepseek-chat litellm_params: model: deepseek/deepseek-chat api_base: https://taotoken.net/api api_key: os.environ/TAOTOKEN_API_KEY # 同一个逻辑模型配多个后端,做负载均衡 - model_name: gpt-4o-lb litellm_params: model: openai/gpt-4o api_base: https://taotoken.net/api api_key: os.environ/TAOTOKEN_API_KEY rpm: 600 - model_name: gpt-4o-lb litellm_params: model: openai/gpt-4o-mini api_base: https://taotoken.net/api api_key: os.environ/TAOTOKEN_API_KEY rpm: 600 litellm_settings: drop_params: true set_verbose: false general_settings: master_key: os.environ/LITELLM_MASTER_KEY几个关键点逐个说清楚。
model_name是 OpenClaw 侧调用的名字,litellm_params.model是 LiteLLM 内部识别的 provider 前缀加模型名。openai/、anthropic/、deepseek/这些前缀告诉 LiteLLM 用哪套请求格式去拼 payload,但api_base统一指向 TaoToken,所以实际请求都落到同一条通道上。
api_key: os.environ/TAOTOKEN_API_KEY是 LiteLLM 的环境变量引用语法,冒号后面直接写os.environ/变量名,不要加引号包整个表达式。这样 Key 不落盘,换 Key 只需要改环境变量重启进程。
gpt-4o-lb那两项演示了负载均衡:同一个model_name出现两次,LiteLLM 会在两个后端之间轮询。这里两个后端都走 TaoToken,但模型不同,实际效果是把请求分散到不同模型上。如果你有多个 TaoToken Key,也可以在这里配多个api_key做 Key 级轮询。
litellm_settings.drop_params: true建议打开,因为不同 provider 对参数支持不一致,OpenClaw 传过来的某些字段可能不被某个模型接受,drop 掉比报错好。
general_settings.master_key是 LiteLLM 自己的入口鉴权 Key,OpenClaw 侧用这个 Key 访问 LiteLLM,跟 TaoToken 的 Key 是两回事,别混。
启动 LiteLLM 代理:
export TAOTOKEN_API_KEY="sk-你的key" export LITELLM_MASTER_KEY="sk-litellm-master-key" litellm --config litellm_config.yaml --port 4000如果你用 Docker,把环境变量通过-e传进去,配置文件挂载到容器里:
docker run -p 4000:4000 \ -e TAOTOKEN_API_KEY="sk-你的key" \ -e LITELLM_MASTER_KEY="sk-litellm-master-key" \ -v $(pwd)/litellm_config.yaml:/app/config.yaml \ ghcr.io/berriai/litellm:main-latest \ --config /app/config.yaml --port 4000启动日志里会打印加载了哪些 model_name,确认gpt-4o、claude-sonnet、deepseek-chat都在列表里。如果某个模型没加载,多半是 YAML 缩进问题,LiteLLM 对缩进敏感,model_name和litellm_params必须同级。
4. OpenClaw 侧接入与 curl 验证
LiteLLM 起来之后,OpenClaw 侧只需要把它当成一个 OpenAI 兼容 provider。配置文件在~/.openclaw/config.json,加一个 provider:
{ "models": { "providers": { "litellm": { "baseUrl": "http://localhost:4000/v1", "apiKey": "sk-litellm-master-key" } } } }baseUrl指向 LiteLLM 的/v1,apiKey填 LiteLLM 的 master key,不是 TaoToken 的 Key。设默认模型:
openclaw models default set litellm/gpt-4o现在做验证。先直接打 LiteLLM,确认它能把请求转发到 TaoToken:
curl -s http://localhost:4000/v1/chat/completions \ -H "Authorization: Bearer sk-litellm-master-key" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o", "messages": [{"role": "user", "content": "只回复两个字:通了"}], "max_tokens": 20 }'预期返回一个标准的 OpenAI 格式响应,choices[0].message.content里是模型回复。如果返回 200 且有内容,说明 LiteLLM 到 TaoToken 这一段通了。
再验证 OpenClaw 侧。用 OpenClaw 发一条请求,同时观察 LiteLLM 的日志:
openclaw chat --model litellm/gpt-4o --message "ping"LiteLLM 日志里应该出现一条POST /v1/chat/completions记录,并且能看到它路由到了gpt-4o这个 model_name。如果日志里显示的是claude-sonnet或别的模型,说明 OpenClaw 侧的默认模型没设对,回去检查openclaw models default set那一步。
成功的结果长这样:OpenClaw 返回模型回复,LiteLLM 日志显示请求经过,TaoToken 控制台的用量面板里能看到这次调用的 token 计数。三个地方都对上,链路就完整了。
提示:验证阶段建议把 LiteLLM 的
set_verbose临时设为true,能看到完整的请求转发细节,确认api_base确实是https://taotoken.net/api。验证完再关掉,避免日志刷屏。
5. 本篇常见错排查
配置跑不通的时候,按下面几个方向查,基本能覆盖大部分情况。
LiteLLM 启动就报 YAML 解析错误。最常见的是缩进用了 Tab,YAML 只认空格。另外api_key: os.environ/TAOTOKEN_API_KEY这一行不要写成api_key: "os.environ/TAOTOKEN_API_KEY",加了引号 LiteLLM 会当成字面字符串,不会去读环境变量。
请求返回 401。分两种:如果 LiteLLM 日志显示请求根本没发出去,是 OpenClaw 到 LiteLLM 的 master key 不对;如果 LiteLLM 日志显示转发了但返回 401,是 TaoToken 的 Key 不对或环境变量没传进 LiteLLM 进程。用echo $TAOTOKEN_API_KEY确认变量在当前 shell 里存在,Docker 场景确认-e传了。
请求返回 404 或路径错误。检查api_base是不是写成了https://taotoken.net/api/v1。LiteLLM 会自己拼/v1/chat/completions,你多写一层/v1就变成/api/v1/v1/chat/completions。正确写法是https://taotoken.net/api。
模型路由错误,OpenClaw 要 gpt-4o 却走了别的模型。确认model_name和 OpenClaw 里用的名字完全一致,大小写敏感。openclaw models default set litellm/gpt-4o里的gpt-4o必须和config.yaml里的model_name对得上。另外检查 LiteLLM 日志里的路由记录,看它实际选了哪个后端。
负载均衡没生效,请求全打到一个后端。LiteLLM 的轮询是按请求计的,短时间发几条可能看起来像没轮询。多发几条再看日志。另外确认两个后端的model_name拼写完全一致,差一个字符就会被当成两个不同的模型。
TaoToken 控制台看不到用量。用量有延迟,通常几十秒到几分钟。如果长时间看不到,先确认 curl 直连 TaoToken 那一步有没有成功,直连都不通的话,LiteLLM 这层更不可能通。
排障相关的入口放在这里,接入文档可以对照参数说明:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
6. 长期编码场景:把 Coding Plan 接进同一条通道
如果你用 OpenClaw 主要是做长期编码、跑 Agent 任务,那 LiteLLM 这层统一网关的价值会更明显:白天用 GPT 系列写代码,晚上跑批量任务切到更便宜的模型,中间不用改 OpenClaw 任何配置,只改 LiteLLM 的model_name映射就行。
这种长期高频场景,建议单独看一下 Coding Plan 的额度策略,把编码类请求和实验类请求分开走不同的 Key,用量面板里也好区分:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite
如果你用的是 Claude Code 这类工具,Anthropic 兼容通道的接入方式在这里:https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude_code&utm_campaign=rewrite
回到配置本身,长期跑的话有两个小调整值得做。一是把rpm限流加上,避免某个 Agent 失控刷爆额度;二是把litellm_settings里的num_retries设成 2 到 3,TaoToken 通道偶发超时的时候 LiteLLM 会自动重试,OpenClaw 侧无感。这两项加完,整套 OpenClaw + LiteLLM + TaoToken 的链路就算稳了。