1. 启动 Openclaw 前最容易踩的坑:Base URL 没改对
Openclaw 是一个把大模型能力接进本地工作流的开源工具,能跑对话、能挂 Agent、也能做代码补全,适合想在自己机器上折腾 AI 工作台的开发者。它本身不绑定某一家模型服务,靠的就是配置文件里的 Base URL 和 API Key 去指向一个兼容 OpenAI 协议的端点。问题恰恰出在这里:很多人装完 Openclaw 直接openclaw start,结果终端刷出一片 401,或者卡在local proxy failed,折腾半小时才发现是默认端点根本连不通。
我见过最多的场景是这样的:开发者从旧项目迁移过来,~/.openclaw/config.json里还留着上一套服务的地址,Key 也过期了,但 Openclaw 启动时不会主动告诉你「这个地址是错的」,它只会安静地加载配置,然后在第一次请求时抛一个reading choices相关的解析错误。你以为是模型挂了,其实是响应体压根不是预期的 JSON 结构。
所以这篇的核心就一件事:在正式启动 Openclaw 之前,把 Base URL 改到 TaoToken,把 Key 配对,然后用一次最小请求验证通道。顺序不能反,先验证再启动,比启动后对着报错猜要省事得多。下面我会给出可直接复制的配置片段、启动命令,以及验证连通性的具体动作。整套流程我自己在 Ubuntu 和 WSL 上都跑过,路径和字段名以 Openclaw 当前版本为准,你照着改就行。
需要提前说明的是,TaoToken 在这里扮演的是「统一入口」的角色——你不需要在 Openclaw 里为每个模型单独配一套鉴权,只要把 Base URL 指向它,Key 用同一个,模型 ID 按需切换。这对经常在 Claude、GPT、国产模型之间来回切的人来说,能省掉大量重复配置。官网在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 端点是 https://taotoken.net/api ,注意这个地址后面不加任何路径后缀,Openclaw 会自己拼/v1/chat/completions。
2. TaoToken 前置准备:Key、端点与模型 ID 三件套
在动 Openclaw 的配置文件之前,先把三样东西拿到手:Base URL、API Key、Model ID。这三件套缺一个,后面都会报错,而且报错信息往往指向别的地方,容易误导。
Base URL 就是https://taotoken.net/api。这里有个细节要强调:很多教程会让你填https://taotoken.net/api/v1,但在 Openclaw 里不要带/v1,因为 Openclaw 的 provider 层会自己补版本路径。你填了/v1,最终请求会变成/v1/v1/chat/completions,直接 404。这个坑我在迁移时踩过,终端只显示unexpected status 404,不告诉你路径重复了。
API Key 的获取入口在控制台的 API Keys 页面,地址是 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 。进去之后新建一个 Key,复制出来先存到临时文件里,因为页面刷新后就不再完整显示了。Key 的格式通常是一串以sk-开头的字符串,长度比较长,复制时注意别漏字符。
Model ID 这块,Openclaw 的配置里叫model字段。如果你不确定该填什么,可以先到模型对话页面 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 里看看当前可用的模型列表,页面上会显示每个模型的调用名。常见的比如claude-sonnet-4-5、gpt-4o这类,直接抄过来用。注意大小写和连字符,claude-sonnet-4.5和claude-sonnet-4-5在有些端点上是两个不同的东西。
把这三样东西准备好之后,建议先在终端里用 curl 做一次裸请求,确认 Key 本身是有效的,再去改 Openclaw 的配置。这样能把「Key 无效」和「Openclaw 配置错误」两类问题分开,排查起来快很多。curl 命令长这样:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的Key" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 16 }'如果返回的 JSON 里有choices字段,说明 Key 和端点都没问题,可以进入下一步。如果返回 401,那就是 Key 错了或者没带上Bearer前缀;如果返回 404,检查一下 URL 里是不是多写了/v1。这一步花两分钟,能省掉后面半小时的瞎猜。
3. 可复制配置:Openclaw 的 config.json 与 settings 片段
Openclaw 的配置分两层:全局配置在~/.openclaw/config.json,项目级配置在项目根目录的.openclaw/settings.json。全局配置管 provider 和默认模型,项目级配置管这个项目用哪个模型、温度多少。启动前要改的主要是全局配置里的 provider 段。
先看全局配置的完整结构。用编辑器打开~/.openclaw/config.json,找到providers字段,改成下面这样:
{ "providers": { "taotoken": { "type": "openai-compatible", "baseURL": "https://taotoken.net/api", "apiKey": "sk-你的Key", "models": { "claude-sonnet-4-5": { "id": "claude-sonnet-4-5", "contextWindow": 200000 }, "gpt-4o": { "id": "gpt-4o", "contextWindow": 128000 } } } }, "defaultProvider": "taotoken", "defaultModel": "claude-sonnet-4-5" }几个字段要解释一下。type必须是openai-compatible,因为 TaoToken 走的是 OpenAI 协议,Openclaw 用这个类型去解析响应。baseURL就是前面说的https://taotoken.net/api,不带/v1。apiKey直接填你复制的 Key,注意 JSON 里字符串要用双引号,Key 里如果有特殊字符也不用转义,正常粘贴即可。models里列的是你打算用的模型,id要和 TaoToken 侧的调用名一致,contextWindow是给 Openclaw 做上下文裁剪用的,填大了不会报错,填小了会提前截断对话。
如果你用的是项目级配置,.openclaw/settings.json里可以只写覆盖项,比如:
{ "provider": "taotoken", "model": "gpt-4o", "temperature": 0.3, "maxTokens": 4096 }这样全局默认用 Claude,这个项目单独用 GPT-4o,互不影响。改完配置后,别急着openclaw start,先跑一次配置校验命令:
openclaw config validate这个命令会检查 JSON 语法、必填字段、以及 baseURL 是否可达。如果输出config is valid,说明结构没问题。如果报unknown provider type,检查type字段是不是拼错了;如果报baseURL unreachable,那就是网络层的问题,先确认能不能 curl 通。
还有一个容易忽略的点:Openclaw 有些版本会把 Key 存在系统 keyring 里,而不是明文写在 config.json。如果你在 config.json 里写了apiKey但启动后仍然 401,可能是 keyring 里有一份旧的覆盖了。这时候用openclaw auth list看看当前生效的凭证来源,必要时用openclaw auth set taotoken sk-你的Key重新写入。
4. 验证请求:用最小对话确认通道连通
配置改完、校验通过,接下来做一次最小请求验证。这一步的目的是在正式启动 Openclaw 的完整服务之前,确认「配置 → 端点 → 鉴权 → 响应解析」这条链路是通的。Openclaw 提供了一个openclaw chat子命令,可以直接在终端里发一条消息,不走完整的服务启动流程。
命令是这样的:
openclaw chat --provider taotoken --model claude-sonnet-4-5 --message "只回复两个字:通了"如果一切正常,终端会打印出模型的回复,类似:
通了同时你会看到一行统计信息,包含tokens used和latency。这说明 Base URL、Key、Model ID 三件套都对上了,Openclaw 也正确解析了响应里的choices字段。
如果这一步失败,报错信息会直接告诉你卡在哪一环。我整理了几种常见输出和对应原因:
| 终端输出 | 含义 | 处理方向 |
|---|---|---|
401 Unauthorized | Key 无效或未带上 | 检查Bearer前缀和 Key 是否过期 |
404 Not Found | 路径重复或模型名错 | 确认 baseURL 不带/v1,模型 ID 拼写正确 |
local proxy failed | 本地代理层拦截 | 检查环境变量里的代理设置,临时 unset |
error reading choices | 响应结构非预期 | 多半是端点返回了 HTML 错误页,curl 复现看原始响应 |
context deadline exceeded | 超时 | 网络慢或端点不可达,先 curl 测延迟 |
验证通过之后,再启动完整服务:
openclaw start --config ~/.openclaw/config.json启动日志里会打印当前加载的 provider 和默认模型,确认显示的是taotoken和你要的模型 ID,就说明整条链路已经就绪。这时候再去用 Openclaw 的对话界面或 Agent 功能,就不会在第一次请求时才发现配置问题。
5. 常见报错排查:401、local proxy failed 与 reading choices
即使按上面的步骤走,还是可能遇到几种典型报错。这一节把每个报错的完整排查路径写清楚,你对着终端输出逐条比对就行。
先说 401。这个最直接,就是鉴权没过。但 401 有两种情况:一种是 Key 本身无效,另一种是 Key 有效但没被正确发送。先确认 config.json 里的apiKey字段没有多余空格,JSON 里字符串前后的空格会被当成 Key 的一部分。然后确认 Openclaw 没有从环境变量里读到一个空的OPENAI_API_KEY覆盖掉配置。用env | grep -i api_key看一下,如果有空值,unset OPENAI_API_KEY再试。如果还不行,去控制台重新生成一个 Key,用 curl 单独测一次,排除 Key 本身的问题。
再说local proxy failed。这个报错和 TaoToken 无关,是 Openclaw 在启动时尝试走本地代理端口,但那个端口没起来或者被占用。常见原因是之前有一次 Openclaw 异常退出,代理进程残留了。处理方式是先openclaw stop清理,再ps aux | grep openclaw确认没有残留进程,然后重新openclaw start。如果系统里设了HTTP_PROXY或HTTPS_PROXY环境变量,Openclaw 会尝试走那个代理,但代理本身不可达时就会报这个错。临时unset HTTP_PROXY HTTPS_PROXY再启动,能排除这类干扰。
error reading choices这个报错最有迷惑性,因为它看起来像是模型返回了奇怪的东西,实际上是 Openclaw 拿到的响应根本不是 JSON。最常见的原因是 baseURL 写成了https://taotoken.net/api/v1,请求打到了/v1/v1/chat/completions,服务端返回一个 HTML 的 404 页面,Openclaw 尝试按 JSON 解析就失败了。另一个原因是 Key 无效时,某些网关会返回一个 HTML 的登录页而不是 JSON 错误体。排查方法很简单:把 Openclaw 配置里的 baseURL 和 Key 原样复制到 curl 命令里跑一次,看返回的是不是 JSON。如果是 HTML,问题就在端点或鉴权,不在 Openclaw。
还有一种情况是 OAuth 相关的报错,比如OAuth token expired。Openclaw 某些版本支持 OAuth 登录方式,如果你之前用 OAuth 配过别的 provider,切换时可能残留了 token。用openclaw auth list看一下当前有哪些凭证,把不需要的openclaw auth remove <provider>删掉,只保留 taotoken 的 Key 认证。
排查完这些,如果还是有问题,最有效的动作是打开 Openclaw 的 debug 日志:
openclaw start --log-level debug 2>&1 | tee openclaw-debug.log日志里会打印每一次 HTTP 请求的完整 URL、请求头和响应状态码,对照着看就能定位到具体是哪一步断了。
6. 长期编码与 Agent 场景:把通道固定下来
通道验证通过、Openclaw 能正常跑起来之后,如果你打算长期用它做编码或 Agent 任务,建议把配置再固化一下,避免每次换项目都要重新调。
第一件事是把默认模型设成你用得最顺的那个。在~/.openclaw/config.json里把defaultModel改成你的主力模型,这样新项目不用单独配就能直接用。第二件事是给常用模型配好contextWindow,Openclaw 在做长对话时会根据这个值决定什么时候裁剪历史,填准确了能避免上下文被意外截断。
如果你经常在多个模型之间切换做对比,可以在项目级settings.json里写多套 profile,用openclaw chat --profile <name>切换。比如一套用 Claude 做代码审查,一套用 GPT-4o 做文档生成,配置分开管理,互不干扰。
对于 Agent 类的长任务,建议把maxTokens设大一些,同时确认 TaoToken 侧的模型支持你要的上下文长度。Agent 任务往往一次要读很多文件、跑很多轮工具调用,token 消耗比普通对话大得多。这时候可以到 Coding Plan 页面 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 看看有没有适合长期编码场景的方案,把额度固定下来,比按次调用省心。
最后一个小技巧:把验证命令写成一个 shell 脚本,每次改完配置先跑一遍再启动。脚本内容就是前面那条openclaw chat加一个退出码判断,通了就继续,不通就停下来看日志。这样能把「配置错误」挡在启动之前,而不是等 Openclaw 跑起来、Agent 开始执行任务了才发现通道断了。整套流程跑顺之后,迁移或换端点就是改一行 baseURL 的事,不会再手忙脚乱。