1. 多模型 Key 散落一地,OpenClaw 切模型切到崩溃
如果你同时用 Qwen、DeepSeek、Claude、GPT 这几家模型,大概率经历过这种场面:每个供应商一个控制台,每个控制台一套 Key,Key 还要分环境变量、分项目、分测试和生产。等到 OpenClaw 这类 Agent 工具要切模型时,你得先翻出对应供应商的 Key,再改一遍配置文件,重启网关,然后祈祷没写错缩进。
LiteLLM 的价值就在这里:它把不同供应商的模型统一成 OpenAI 兼容接口,你只需要面对一个baseUrl和一个master_key。OpenClaw 则负责把 Agent 的模型调用指向这个统一入口。两者组合之后,多模型切换从「改三家配置」变成「改一行 model 名」。
但真正落地时还有一层没解决:LiteLLM 背后那堆供应商 Key 依然散落在环境变量里,每接一个新模型就要新增一个 Key,团队协作时还要把 Key 传来传去。这篇要做的,是用 TaoToken 的统一 Key 和 API 通道,把 LiteLLM 的model_list收敛成一套凭证,再让 OpenClaw 通过 LiteLLM 完成模型切换。适合正在搭多模型 Agent、被 Key 管理折磨过的开发者。
2. TaoToken 前置:把供应商 Key 收敛成一套
TaoToken 在这里扮演的角色是「统一 API 通道」。你不需要为每个模型单独申请和保管 Key,而是用一套 TaoToken 的 Key,通过它的 API 地址访问不同模型。LiteLLM 的model_list里每个条目都指向 TaoToken 的api_base,api_key统一读同一个环境变量。
这样做的好处很直接:新增模型时只改model字段,不用再去找新供应商的 Key;团队共享时只发一个 Key;轮换凭证时只改一处。对于 OpenClaw 这种需要频繁切换模型的场景,配置复杂度从 O(n) 降到 O(1)。
需要提前准备的东西:
- 一个 TaoToken 账号,拿到 API Key
- 本机装好 Python 3.9+ 和 pip
- 装好 OpenClaw(后面会给配置骨架)
- 可选:Docker,用于后面做用量持久化
TaoToken 的 API 入口是https://taotoken.net/api,兼容 OpenAI 的/v1/chat/completions格式。你可以在控制台里创建 Key,建议按用途分多个 Key,比如一个给 LiteLLM 用,一个给本地调试用,方便后面排查问题时隔离。
3. 可复制配置:LiteLLM 接 TaoToken + OpenClaw 骨架
3.1 安装 LiteLLM
最省事的方式是 pip 直接装:
pip3 install litellm装完之后确认版本:
litellm --version如果你打算用 Docker 部署(后面做用量持久化会用到),可以跳过这步,直接用镜像。
3.2 写 LiteLLM 配置
新建litellm_config.yaml,核心是把每个模型的api_base指向 TaoToken,api_key统一读环境变量:
model_list: - model_name: qwen-plus litellm_params: model: openai/qwen-plus api_key: os.environ/TAOTOKEN_API_KEY api_base: https://taotoken.net/api/v1 - model_name: deepseek-chat litellm_params: model: openai/deepseek-chat api_key: os.environ/TAOTOKEN_API_KEY api_base: https://taotoken.net/api/v1 - model_name: claude-sonnet litellm_params: model: openai/claude-sonnet api_key: os.environ/TAOTOKEN_API_KEY api_base: https://taotoken.net/api/v1 general_settings: master_key: sk-litellm-local-2024几个关键点说明一下。model字段用openai/前缀,是因为 TaoToken 走的是 OpenAI 兼容协议,LiteLLM 会按 OpenAI 格式发请求。model_name是你自己起的别名,OpenClaw 里引用的就是这个名字,可以随便改,但两边要一致。master_key是 LiteLLM 自己的准入凭证,跟 TaoToken 的 Key 是两回事,客户端连 LiteLLM 时用这个。
设置环境变量:
export TAOTOKEN_API_KEY="你的 TaoToken Key"3.3 启动 LiteLLM
litellm --config litellm_config.yaml --port 4000看到Uvicorn running on http://0.0.0.0:4000就说明起来了。如果报model not found,先检查model_list里的model_name有没有拼错。
3.4 OpenClaw 侧配置骨架
OpenClaw 的配置文件在~/.openclaw/openclaw.json。核心是把 provider 指向本地 LiteLLM,模型 id 跟 LiteLLM 的model_name对齐:
{ "models": { "mode": "merge", "providers": { "litellm": { "baseUrl": "http://localhost:4000/v1", "apiKey": "sk-litellm-local-2024", "api": "openai-completions", "models": [ { "id": "qwen-plus", "name": "Qwen-Plus" }, { "id": "deepseek-chat", "name": "DeepSeek-Chat" }, { "id": "claude-sonnet", "name": "Claude-Sonnet" } ] } } }, "agents": { "defaults": { "model": { "primary": "litellm/qwen-plus" }, "models": { "litellm/qwen-plus": {}, "litellm/deepseek-chat": {}, "litellm/claude-sonnet": {} } } } }apiKey填的是 LiteLLM 的master_key,不是 TaoToken 的 Key。models数组里的id必须跟litellm_config.yaml里的model_name完全一致,否则 OpenClaw 会报模型不存在。agents.defaults.models里列出所有可切换的模型,OpenClaw 的切换命令才能识别。
改完重启网关:
openclaw gateway restart4. 验证请求:从 curl 到 OpenClaw 切换
4.1 先验证 LiteLLM 通道
用 curl 直接打 LiteLLM,确认它能正确转发到 TaoToken:
curl http://localhost:4000/v1/chat/completions \ -H "Authorization: Bearer sk-litellm-local-2024" \ -H "Content-Type: application/json" \ -d '{ "model": "qwen-plus", "messages": [{"role": "user", "content": "用一句话说明你是什么模型"}] }'正常返回会带choices[0].message.content,model字段显示qwen-plus。如果返回 401,检查Authorization里的值是不是跟master_key一致;如果返回 500 且提示上游错误,检查TAOTOKEN_API_KEY有没有 export 成功。
4.2 验证模型切换
把model换成deepseek-chat再打一次:
curl http://localhost:4000/v1/chat/completions \ -H "Authorization: Bearer sk-litellm-local-2024" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-chat", "messages": [{"role": "user", "content": "用一句话说明你是什么模型"}] }'两次请求用的是同一个 Key、同一个api_base,只有model字段不同。这就是统一 Key 的核心价值:切换模型不需要换凭证。
4.3 OpenClaw 侧切换
在 OpenClaw 里查看当前模型:
openclaw model current切换模型:
openclaw model switch litellm/deepseek-chat再确认一次:
openclaw model current然后发一条测试消息,看返回内容是否来自新模型。如果切换后报model not found,大概率是openclaw.json里models数组的id跟 LiteLLM 的model_name不一致,或者agents.defaults.models里没列出这个模型。
4.4 用量监控
LiteLLM 默认把用量记在内存里,重启就丢。要长期看 token 消耗,得接 PostgreSQL。先建网络和数据库:
docker network create litellm-network docker run -d \ --name litellm-postgres \ --network litellm-network \ -e POSTGRES_USER=litellm \ -e POSTGRES_PASSWORD=litellm123 \ -e POSTGRES_DB=litellm \ -p 5432:5432 \ -v litellm-postgres-data:/var/lib/postgresql/data \ --restart unless-stopped \ postgres:15然后在litellm_config.yaml的general_settings里加一行:
general_settings: master_key: sk-litellm-local-2024 database_url: postgresql://litellm:litellm123@litellm-postgres:5432/litellm用 Docker 起 LiteLLM:
docker run -d \ --name litellm-proxy \ --network litellm-network \ -p 4000:4000 \ -e TAOTOKEN_API_KEY="你的 TaoToken Key" \ -e DATABASE_URL="postgresql://litellm:litellm123@litellm-postgres:5432/litellm" \ -e LITELLM_MASTER_KEY="sk-litellm-local-2024" \ -e UI_USERNAME="admin" \ -e UI_PASSWORD="admin123" \ -v ./litellm_config.yaml:/app/config.yaml \ --restart unless-stopped \ ghcr.io/berriai/litellm:main-latest \ --config /app/config.yaml --port 4000打开http://localhost:4000/ui,用admin/admin123登录,在 Usage 页面就能看到每个模型的 token 消耗和请求次数。这里的数据是按model_name聚合的,所以你能清楚看到 Qwen 和 DeepSeek 各用了多少。
5. 本篇常见错排查
报错一:AuthenticationError: Invalid API key
先分清是哪一层的 Key 错了。客户端连 LiteLLM 用的是master_key,LiteLLM 连 TaoToken 用的是TAOTOKEN_API_KEY。如果 curl 返回 401,检查Authorization头;如果 LiteLLM 日志里报上游 401,检查环境变量有没有传进容器。Docker 部署时-e TAOTOKEN_API_KEY=...不能漏。
报错二:model not found
三个地方要对齐:litellm_config.yaml的model_name、openclaw.json里models[].id、agents.defaults.models的键名。任何一处不一致都会报这个错。建议先用 curl 确认 LiteLLM 能识别这个模型名,再去查 OpenClaw 配置。
报错三:OpenClaw 切换后仍走旧模型
openclaw gateway restart之后配置才生效。如果重启了还不行,检查openclaw.json里models.mode是不是merge,如果是replace可能会覆盖掉其他 provider 的配置。另外agents.defaults.model.primary只是默认值,切换命令会覆盖它,但重启后可能回到默认,需要重新切。
报错四:Docker 里 LiteLLM 连不上 Postgres
两个容器要在同一个 network 里,database_url里的 host 用容器名litellm-postgres,不是localhost。如果 Postgres 还没起来就启动 LiteLLM,LiteLLM 会报连接失败,等几秒重启一下 LiteLLM 容器即可。
报错五:用量页面空白
database_url没配或者配错时,LiteLLM 不会报错,只是不写库。检查general_settings里有没有database_url,以及 Docker 启动时DATABASE_URL环境变量有没有传。两个地方都配了的话,以环境变量为准。
6. 后续怎么扩展
这套结构搭好之后,加新模型只需要在litellm_config.yaml的model_list里加一段,api_key和api_base照抄现有的,然后在openclaw.json的models数组和agents.defaults.models里各加一行,重启网关就能用。整个过程不涉及新供应商的 Key 申请,也不用改 OpenClaw 的 provider 配置。
如果你想让 OpenClaw 的 Agent 在不同任务里自动选模型,可以在agents.defaults.models里给每个模型加权重或标签,OpenClaw 支持按任务类型路由。LiteLLM 侧也可以配 fallback,比如qwen-plus超时自动切deepseek-chat,这部分在litellm_params里加fallbacks字段就行。
需要创建和管理 TaoToken 的 Key,可以直接进控制台操作:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
API Key 的创建入口在这里:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite
LiteLLM 接入的完整参数说明可以对照文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
如果你还没决定用哪个模型,可以先在模型对话页面试一下再写进配置:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite
长期跑 Agent 任务的话,Coding Plan 的额度模型比按量计费更划算,适合 OpenClaw 这种高频调用的场景:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite