1. 为什么我要把 OpenClaw 接到统一 Key 通道
OpenClaw 是一个可以跑在自己服务器上的本地数字助手,能读写文件、执行命令、调用工具、定时跑任务,适合已经有一台常开机器、想让 AI 帮自己维护站点或处理日常杂活的开发者。它本身不绑定某一家模型,而是通过config.toml里的models.providers声明式地接入任意兼容 OpenAI 协议的端点。这意味着你装好 OpenClaw 之后,真正决定体验好坏的不是软件本身,而是你给它接的那条模型通道。
我最初用的是某家云厂商的兼容端点,跑了两周发现两个问题:一是换模型要改一堆字段,二是不同模型的 Key 分散在各家控制台,管理起来很碎。后来我把 OpenClaw 的模型出口统一指向 TaoToken,一个 Key 就能在多个模型之间切换,config.toml里只保留一个 provider 块,维护成本直接降下来。这篇就把我从零到跑通的完整配置骨架、接入片段、验证动作和踩过的报错整理出来,你照着改就能用。
适合谁看:已经装好 OpenClaw、能进到配置目录、想接一条统一 Key 通道的开发者。如果你还没装 OpenClaw,建议先把二进制跑起来再回来配模型,否则排查问题时变量太多。
2. TaoToken 前置准备:拿 Key 与确认端点
在动config.toml之前,先把两样东西准备好:API Key 和 base URL。TaoToken 的接入地址是https://taotoken.net/api,兼容 OpenAI 的chat/completions协议,所以 OpenClaw 里api字段填openai-completions即可。
拿 Key 的路径是进控制台创建,具体入口在 TaoToken API Keys。创建后复制那串sk-开头的字符串,注意只显示一次,丢了就重新建一个。如果你还不确定要接哪个模型,可以先在 模型对话 里试几句,确认通道通不通再写进配置。
注意:Key 不要直接提交进 Git。OpenClaw 的配置支持从环境变量读取,后面我会给一个用
env引用的写法,比硬编码安全。
端点确认这一步很多人跳过,结果配完一直 401。你可以先用 curl 打一发,确认 Key 和地址都对:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "ping"}] }'返回里带choices就说明通道没问题,接下来配 OpenClaw 只是把这套东西翻译成 TOML。
3. 可复制的 config.toml 骨架与 TaoToken 接入片段
OpenClaw 的配置分几大块:models管模型出口,agents管默认用哪个模型,gateway管本地 HTTP 服务,tools和commands管能力开关。下面这份骨架是我实际在用的,把providers部分换成 TaoToken 即可。
# ~/.openclaw/config.toml [models] mode = "merge" [models.providers.taotoken] baseUrl = "https://taotoken.net/api/v1" apiKey = "${TAOTOKEN_API_KEY}" api = "openai-completions" [[models.providers.taotoken.models]] id = "gpt-4o-mini" name = "GPT-4o mini" reasoning = false contextWindow = 128000 maxTokens = 16384 [[models.providers.taotoken.models]] id = "claude-3-5-sonnet" name = "Claude 3.5 Sonnet" reasoning = true contextWindow = 200000 maxTokens = 8192 [[models.providers.taotoken.models]] id = "deepseek-chat" name = "DeepSeek Chat" reasoning = false contextWindow = 64000 maxTokens = 8192 [agents.defaults.model] primary = "taotoken/gpt-4o-mini" [gateway] mode = "local" port = 18789 bind = "loopback" [gateway.auth] mode = "token" token = "${OPENCLAW_GATEWAY_TOKEN}" [gateway.http.endpoints.chatCompletions] enabled = true [commands] native = "auto" nativeSkills = "auto" restart = true ownerDisplay = "raw"几个关键点解释一下。mode = "merge"表示这份配置和默认配置合并,而不是覆盖,这样你只写差异部分就行。apiKey用${TAOTOKEN_API_KEY}引用环境变量,启动前export一下即可,避免明文落盘。agents.defaults.model.primary的格式是provider/modelId,这里写taotoken/gpt-4o-mini,要和上面 provider 名、model id 严格对应,大小写错了会报找不到模型。
如果你之前接过别的 provider,mode = "merge"下可以同时保留多个 provider 块,切换时只改primary一行。这也是我最后选统一通道的原因:换模型不动结构,只动一个字符串。
环境变量在启动脚本里导出:
export TAOTOKEN_API_KEY="sk-你的key" export OPENCLAW_GATEWAY_TOKEN="自己生成的一串随机token" openclaw startOPENCLAW_GATEWAY_TOKEN是本地 gateway 的鉴权 token,和模型 Key 是两回事,别混用。生成方式随便,openssl rand -hex 24就行。
4. 启动后验证配置生效的具体动作
配置写完不代表生效,OpenClaw 启动时会做一次 schema 校验,字段名错了会直接拒绝启动。所以第一步是看启动日志有没有报错:
openclaw start --log-level debug日志里会打印加载了哪些 provider、默认模型是哪个。看到provider=taotoken model=gpt-4o-mini这类字样,说明配置被正确解析了。如果只看到默认 provider,说明你的merge没生效或者字段层级写错了。
第二步是打本地 gateway 的 chatCompletions 端点,验证整条链路通:
curl -s http://127.0.0.1:18789/v1/chat/completions \ -H "Authorization: Bearer $OPENCLAW_GATEWAY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "model": "taotoken/gpt-4o-mini", "messages": [{"role": "user", "content": "用一句话说明你当前使用的模型"}] }'返回正常的话,说明 OpenClaw 已经把请求转发到 TaoToken 并拿回了结果。这一步能过,基本就通了。如果返回 401,是 gateway token 不对;返回 404,是端点没开或者路径写错;返回 502,多半是上游模型通道的问题,回去用第 2 节的 curl 再确认一次。
第三步是让 agent 实际跑一个带工具的任务,比如让它读一个本地文件。这一步验证的是模型和工具调用的配合,有些模型对 function calling 支持不好,会在这一步暴露。我实测下来,gpt-4o-mini和claude-3-5-sonnet在 OpenClaw 的工具调用上都比较稳,deepseek-chat偶尔会把参数拼错,需要重试。
5. 本篇常见报错排查
配 OpenClaw 接统一通道,报错基本集中在四类,我按遇到频率排一下。
第一类是unknown provider "taotoken"。这通常是[models.providers.taotoken]这一层的表名和primary里的前缀不一致,或者 TOML 缩进把 provider 块塞进了别的表下面。检查方法是看primary的斜杠前半段,必须和 provider 表名逐字符相同。
第二类是401 invalid api key。先确认环境变量在启动进程里可见,openclaw如果是 systemd 拉起的,export写在 shell 里没用,要写进 unit 的Environment=。再确认 Key 没有多余空格,复制时容易带上换行。
第三类是model not found。models.providers.taotoken.models数组里的id必须和上游真实模型名一致,name只是显示用。如果你在 TaoToken 侧看到的模型名和配置里写的不一样,以实际调用成功的那个为准。
第四类是 gateway 起来了但 curl 连不上。bind = "loopback"只监听 127.0.0.1,如果你从别的机器访问,要么改 bind,要么走 SSH 隧道。端口被占用也会导致启动失败,日志里会写address already in use,换个端口即可。
提示:改完配置一定要重启进程,OpenClaw 不会热加载
config.toml。commands.restart = true只是允许 agent 触发重启,不是自动重载。
6. 长期跑编码任务时的通道选择
如果你只是偶尔让 OpenClaw 查个天气、写段脚本,按上面的配置接一个通用模型就够了。但如果你打算让它长期跑编码、重构、批量改文件这类任务,token 消耗会明显上去,这时候通道的稳定性和成本就变成主要矛盾。我自己的做法是日常对话用轻量模型,编码任务切到专门的编码通道,配置里保留两个 provider 块,靠primary一行切换。
需要长期跑编码或 Agent 任务的,可以看下 Coding Plan,它针对高频调用做了优化,比按量计费更适合常开场景。接入方式和我上面写的完全一样,只是把baseUrl和 Key 换成对应的即可,config.toml结构不用动。
配置这件事,跑通一次之后就是复制粘贴。真正花时间的是排查那几类报错,把日志看仔细,大部分问题都能定位到具体字段。我现在的config.toml已经稳定跑了几个月,中间只改过primary那一行来换模型,其余部分没动过。