1. OpenClaw 配置文件到底改哪里:auth.json 与 Base URL 的常见坑
OpenClaw 是一个本地部署的 AI Agent 运行框架,你可以把它理解成一个「调度中枢」:它自己不产出模型能力,而是通过配置文件去对接各家大模型服务,再把对话、工具调用、子任务分发给对应的 provider。它适合谁?适合想在本地跑 Agent、又不想被单一模型厂商锁死的开发者。而它最容易让人卡住的地方,恰恰不是代码逻辑,而是配置文件——尤其是auth.json和models.providers里的baseUrl。
我见过太多人第一次跑 OpenClaw,命令敲下去直接报401 Unauthorized,或者更隐蔽的local proxy failed,然后开始怀疑是不是网络问题、是不是版本问题,折腾半天,最后发现只是auth.json里的mode写错了,或者baseUrl多了一个/v1。这类问题的共同点是:报错信息不会直接告诉你「你配置写错了」,它只会给你一个笼统的失败。
OpenClaw 的配置体系分两层。第一层是auth.json,它管的是「身份」——你用哪个 provider、用什么认证方式(api_key还是 OAuth)、密钥存在哪。第二层是主配置里的models.providers,它管的是「怎么连」——baseUrl指向哪个端点、api字段声明用哪种协议(openai-completions还是anthropic)、模型列表怎么声明。这两层必须对齐:auth.json里声明了anthropic:default,主配置里却只配了openai-completions的 provider,那启动时就会找不到匹配的认证档案。
还有一个高频陷阱是baseUrl的路径拼接。很多兼容 OpenAI 协议的服务,端点要么是https://xxx/v1,要么是https://xxx/compatible-mode/v1,OpenClaw 在请求时会自己在后面拼/chat/completions。如果你在baseUrl里手滑写成了完整的.../v1/chat/completions,那最终请求路径就会变成.../v1/chat/completions/chat/completions,返回 404 或者一个看不懂的 HTML 错误页。这个坑我在阿里百炼和 LongCat 的配置里都踩过,排查时盯着日志里的完整 URL 看,一眼就能发现。
所以这篇的核心思路是:先把auth.json和baseUrl这两处改对,再谈连通性验证。下面我会先讲清楚 TaoToken 在这套体系里扮演什么角色,然后给你可以直接复制的配置片段,最后用一张报错对照表帮你定位问题。
2. TaoToken 在 OpenClaw 配置里的定位与前置准备
TaoToken 在这里的角色,是一个「统一入口」。你不需要为每个模型厂商单独维护一套密钥和端点,而是把 OpenClaw 的 provider 指向 TaoToken 的 API 地址,用一把 Key 去调用它背后聚合的模型。对 OpenClaw 这种需要频繁切换模型做对比、跑 Agent 任务的场景来说,这能省掉大量改配置的时间。
前置准备只有三件事。第一,拿到你的 API Key。登录官网后进入控制台,在 API Keys 页面创建一个新 Key,复制出来。这个 Key 只会完整显示一次,建议先存到密码管理器里。第二,确认你要用的模型 ID。TaoToken 的模型列表可以在文档里查到,比如你想用 Claude 系列做 coding,就记下对应的模型标识;想用通用对话模型,就记下另一个。第三,确认你的 OpenClaw 版本。用openclaw -h看一眼版本号,2026.1 之后的版本配置结构基本一致,如果你是很老的版本,models.providers的字段名可能有差异。
这里要强调一个概念:OpenClaw 的auth.json和主配置是分离的。auth.json通常位于~/.openclaw/auth.json,它只记录「有哪些认证档案」,不存具体的 Key 值(Key 值存在主配置的 provider 里,或者通过环境变量注入)。很多人误以为把 Key 写进auth.json就完事了,结果主配置里apiKey字段空着,请求自然失败。正确的做法是:auth.json声明档案,主配置的models.providers.<name>.apiKey填真实 Key。
另外,TaoToken 的 API 地址是https://taotoken.net/api,注意这个地址不带任何路径后缀。你在baseUrl里就写这个,OpenClaw 会自己拼接后续路径。如果你看到文档里写的是https://taotoken.net/api/v1,那要确认你的 OpenClaw 版本是否会重复拼接——稳妥起见,先用不带/v1的地址测一次,报 404 再加。
提示:创建 Key 之后,先用
curl单独测一次,确认 Key 本身有效,再去改 OpenClaw 配置。这样能把「Key 无效」和「配置写错」两类问题分开,排查效率高很多。
3. 可复制的 auth.json 与 Base URL 配置片段
这一节给你可以直接抄的配置。先看auth.json。它的作用是告诉 OpenClaw:我有一个叫taotoken:default的认证档案,provider 类型是openai(因为 TaoToken 走 OpenAI 兼容协议),认证模式是api_key。
{ "profiles": { "taotoken:default": { "provider": "openai", "mode": "api_key" } } }注意provider字段这里写openai,不是taotoken。因为 OpenClaw 内部是按协议类型来匹配的,TaoToken 兼容 OpenAI 的chat/completions协议,所以归到openai这一类。如果你写成anthropic,OpenClaw 会按 Anthropic 的消息格式去发请求,TaoToken 那边可能不认,直接返回格式错误。
接下来是主配置里的models.providers片段。假设你的主配置文件是~/.openclaw/config.json,在models节点下这样写:
{ "models": { "mode": "merge", "providers": { "taotoken": { "baseUrl": "https://taotoken.net/api", "apiKey": "你的TaoTokenKey", "api": "openai-completions", "models": [ { "id": "claude-sonnet-4-5", "name": "claude-sonnet-4-5", "reasoning": false, "input": ["text"], "contextWindow": 200000, "maxTokens": 8192 } ] } } } }这里有几个字段要盯紧。baseUrl就是https://taotoken.net/api,不要加/v1,不要加/chat/completions。api字段写openai-completions,这是 OpenClaw 识别协议的关键。apiKey填你刚才创建的真实 Key。models数组里,id是你要调用的模型标识,必须和 TaoToken 文档里的一致,写错了会返回「模型不存在」。
然后agents.defaults.model.primary要指向这个 provider 下的模型,格式是provider名/模型id:
{ "agents": { "defaults": { "model": { "primary": "taotoken/claude-sonnet-4-5" } } } }如果你之前配过阿里百炼或 LongCat,mode是merge的话,新 provider 会合并进去,不会覆盖旧的。但primary只能有一个,改这里就切换了默认模型。改完配置后,OpenClaw 需要重启才能生效,用openclaw restart或者直接 kill 掉进程重跑。
注意:
auth.json里的档案名taotoken:default和主配置里的 provider 名taotoken不需要完全一致,但agents.defaults.model.primary里的前缀必须和models.providers下的 key 一致。我建议统一用taotoken这个 key,减少心智负担。
4. 连通性验证:从 curl 到 OpenClaw 实际请求
配置写完,先别急着在 OpenClaw 里跑复杂任务。用curl做一次最小验证,确认 Key 和端点都通。命令如下:
curl -s -X POST https://taotoken.net/api/chat/completions \ -H "Authorization: Bearer 你的TaoTokenKey" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 16 }'如果返回一个包含choices数组的 JSON,说明 Key 和端点都没问题。如果返回401,检查 Key 是否复制完整、有没有多余空格。如果返回404,检查 URL 是不是写成了https://taotoken.net/api/v1/chat/completions——TaoToken 的端点是https://taotoken.net/api/chat/completions,中间没有v1。
curl通了之后,再回到 OpenClaw 里验证。启动 OpenClaw,发一条最简单的消息,比如「你好」。如果配置正确,你会看到模型正常回复。如果报错,打开日志看完整请求 URL。OpenClaw 的日志一般在~/.openclaw/logs/下,找最新的那个文件,搜索POST关键字,看它实际请求的地址是什么。这一步能帮你快速定位是baseUrl拼接问题还是认证问题。
我实测下来,最常见的成功路径是:curl直接通 → OpenClaw 配置里baseUrl不带/v1→api字段写openai-completions→primary指向taotoken/模型id。这四步对齐,基本一次过。如果curl通但 OpenClaw 不通,九成是auth.json的provider类型写错了,或者apiKey字段没填。
还有一个验证技巧:在 OpenClaw 里临时把maxConcurrent调成 1,避免并发请求干扰日志。等确认单条请求通了,再调回去。这个在排查local proxy failed类错误时特别有用,因为并发场景下日志会混在一起,很难看清是哪条请求失败。
5. 报错对照表:401、local proxy failed、reading choices 怎么排
这一节把常见报错和原因列成表,你对着查就行。
| 报错信息 | 大概率原因 | 排查动作 |
|---|---|---|
401 Unauthorized | Key 无效、Key 没填、auth.json的mode不是api_key | 用 curl 单独测 Key;检查主配置apiKey字段是否为空 |
local proxy failed | baseUrl指向了本地地址或不可达地址;端口被占用 | 确认baseUrl是https://taotoken.net/api;检查gateway.port是否冲突 |
reading choices相关错误 | 返回体不是标准 OpenAI 格式,通常是端点路径错了 | 检查baseUrl是否多写了/v1或/chat/completions |
OAuth相关报错 | auth.json里mode写成了oauth但没走授权流程 | 改成api_key,或按文档重新走 OAuth |
model not found | 模型id拼写错误,或该模型未在 TaoToken 开通 | 对照文档核对模型 ID;确认账号权限 |
context length exceeded | contextWindow设置过大,实际模型不支持 | 把contextWindow调小到模型实际支持的值 |
重点说local proxy failed。这个报错容易误导人,以为是网络代理问题。实际上在 OpenClaw 里,它更多是指「本地 gateway 转发失败」。常见触发场景是:gateway.mode设成了local,但bind地址和实际监听不一致,或者gateway.port被其他进程占了。排查方法是先看gateway节点,确认port是 18789(默认值),bind是loopback。如果端口冲突,换一个端口,同时确保baseUrl不受影响——baseUrl是外部 API 地址,和 gateway 端口是两回事,别改混了。
reading choices这个报错通常出现在日志里,完整信息可能是error reading choices from response。它的根因是 OpenClaw 期望收到{"choices": [...]}结构,但实际收到的可能是 HTML 错误页或者别的 JSON 结构。这时候去看curl返回的原始内容,如果是一段 HTML,说明端点路径错了;如果是{"error": ...},说明认证或模型参数有问题。
还有一个隐蔽的坑:auth.json里如果同时存在多个 profile,OpenClaw 会按某种优先级选。如果你之前配过anthropic:default,又加了taotoken:default,但primary指向的模型前缀是taotoken,那它会去找taotoken对应的认证档案。如果找不到,就会回退到默认档案,导致认证失败。稳妥做法是:auth.json里只保留你当前要用的那个 profile,或者确保每个 provider 都有对应的 profile。
6. 把配置固化下来:长期使用与后续接入建议
配置调通之后,建议做两件事把它固化。第一,把auth.json和主配置里的models.providers片段单独备份一份,放到版本控制里(注意别把真实 Key 提交上去,用占位符)。这样下次换机器或者重装,直接复制粘贴,不用重新踩坑。第二,把curl验证命令写成一个 shell 脚本,每次改完配置先跑一遍,确认端点通再启动 OpenClaw。
如果你后续要接入更多模型,比如想在 OpenClaw 里同时用 Claude 和另一个模型做对比,只需要在models.providers.taotoken.models数组里加一项,然后在agents.defaults.models里注册一下。不用改baseUrl,也不用改auth.json,因为都走同一个 provider。这就是统一入口的好处——配置的增量成本很低。
对于长期跑 coding 任务或者 Agent 工作流的场景,可以考虑用 Coding Plan 来管理调用额度,避免频繁手动换 Key。接入文档里有完整的端点说明和模型列表,遇到不确定的模型 ID 先去那里查。如果你只是想先验证某个模型的效果,可以直接在模型对话页面里试,确认输出符合预期再写进 OpenClaw 配置,这样能减少无效配置的次数。
最后提醒一句:OpenClaw 的配置文件是 JSON 格式,手写容易漏逗号或者多逗号。改完用python -m json.tool ~/.openclaw/config.json校验一下语法,能省掉很多「配置看起来对但就是报错」的时间。这个习惯我保持了很长时间,几乎每次改配置都会跑一遍,比对着报错猜原因快得多。