1. npm 安装 OpenClaw 后 401 报错:先搞清楚这个错误在说什么
你按官方文档在 Windows 上用 npm 装好了 OpenClaw,openclaw --version能正常输出版本号,openclaw onboard向导也走完了,结果第一次发请求就甩回来一个 401。这个场景我见过太多次,绝大多数情况下不是你的 Key 填错了,而是 endpoint 根本没指向你配置的那个通道。
401 在 HTTP 语义里是 Unauthorized,直译就是「未授权」。但落到 OpenClaw 这类 CLI 工具上,它实际可能对应三种完全不同的情况:第一种是请求确实发出去了,但目标服务端不认识你带的 Key;第二种是请求压根没走到你期望的服务端,被发到了默认的官方地址,而那个地址没有你的凭证;第三种是环境变量和配置文件里各写了一份 endpoint,运行时读到了错的那份。这三种情况报错信息可能长得一模一样,都是 401,但排查路径完全不同。
OpenClaw 的配置体系有个特点:它同时支持环境变量和本地配置文件两条线。环境变量优先级通常更高,但不同版本、不同启动方式(直接命令行 vs 通过 npm script vs 通过 IDE 插件)读取顺序会有差异。这就导致一个很隐蔽的坑——你在配置文件里改好了 endpoint,但 shell 里残留了一个旧的环境变量,运行时环境变量覆盖了配置文件,请求还是发到老地址。
这篇记录聚焦的就是这个场景:npm 全局安装 OpenClaw 之后,首次调用返回 401,怎么从环境变量和配置文件两条线把 endpoint 指向问题定位出来,最后给出可复制的配置片段和一次 curl 验证动作,确认请求是否已经走通统一 Key/API 通道。适合已经装完 OpenClaw、正在配 Key 阶段卡住的人,也适合之前配通过、换了环境后突然 401 的人。
核心检索词先摆出来:OpenClaw 401 报错排查、OpenClaw endpoint 配置、npm 安装 OpenClaw 后 API Key 无效。这三个词基本覆盖了你遇到问题时会去搜的方向。
在动手改任何东西之前,先做一件事:把当前生效的配置完整打印出来。很多人一看到 401 就急着去改 Key,结果改了半天发现改的是没被读取的那份文件。先看清楚运行时到底读到了什么,比盲目试错高效得多。下面从环境变量这条线开始拆。
2. 从环境变量与配置文件两条线定位 endpoint 指向问题
2.1 环境变量这条线怎么查
OpenClaw 读取的 API 相关环境变量通常有几个命名习惯,常见的是带OPENCLAW_前缀或者OPENAI_前缀的变体。你在 PowerShell 里可以先做一次全量扫描:
Get-ChildItem Env: | Where-Object { $_.Name -match "OPENCLAW|OPENAI|API_KEY|BASE_URL|ENDPOINT" } | Format-Table -AutoSize这条命令会把当前会话里所有跟 API 配置沾边的环境变量列出来。重点看三个东西:BASE_URL或ENDPOINT指向哪里、API_KEY的值是不是你刚申请的那串、有没有多个变量互相冲突。
如果你在 bash 或 zsh 环境下,等价命令是:
env | grep -Ei "openclaw|openai|api_key|base_url|endpoint"实测下来,最常见的 401 来源就是这里残留了一个指向默认官方地址的BASE_URL。比如你之前装过别的工具,它往系统环境变量里写了一个OPENAI_BASE_URL=https://api.openai.com/v1,OpenClaw 启动时读到了这个,于是请求发去了官方地址,而你的 Key 是给统一通道申请的,官方自然不认,返回 401。
找到可疑变量后,临时清掉再测一次:
Remove-Item Env:\OPENAI_BASE_URL -ErrorAction SilentlyContinue注意这只是清当前会话,要永久生效得去系统环境变量设置里删,或者改用户级变量。清完之后重新跑一次 OpenClaw 的调用命令,如果 401 消失,说明问题就在环境变量这条线上。
2.2 配置文件这条线怎么查
OpenClaw 的配置文件一般放在用户目录下的隐藏文件夹里,Windows 上常见路径是%USERPROFILE%\.openclaw\或%APPDATA%\openclaw\,macOS/Linux 上是~/.openclaw/或~/.config/openclaw/。具体文件名可能是config.json、settings.json或config.toml,取决于版本。
先定位文件:
Get-ChildItem -Path $env:USERPROFILE -Recurse -Filter "*openclaw*" -Directory -ErrorAction SilentlyContinue | Select-Object FullName找到目录后进去看配置文件内容。一个典型的配置片段长这样:
{ "api": { "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的统一Key", "model": "claude-sonnet-4-20250514" } }这里三个字段缺一不可:baseUrl决定请求发去哪,apiKey决定服务端认不认你,model决定调用哪个模型。401 排查时,先确认baseUrl是不是你要指向的地址,再确认apiKey有没有多余空格或换行——从网页复制 Key 时经常带一个尾部换行,肉眼看不出来但服务端会判定无效。
如果你用的是 TOML 格式的配置,结构类似:
[api] base_url = "https://taotoken.net/api" api_key = "sk-你的统一Key" model = "claude-sonnet-4-20250514"两条线都查完之后,做一个交叉比对:环境变量里的 endpoint 和配置文件里的 endpoint 是否一致?如果不一致,运行时到底读了哪个?这个问题的答案取决于 OpenClaw 的加载顺序,通常环境变量优先。所以最稳妥的做法是让两条线指向同一个地址,避免歧义。
2.3 两条线的优先级与冲突处理
我试过的一个典型坑:配置文件里写的是统一通道地址,但系统环境变量里有一个更早设置的默认地址,OpenClaw 启动时环境变量覆盖了配置文件,请求发去了默认地址,401。当时查了半天配置文件都没问题,最后用上面那条Get-ChildItem Env:命令才揪出来。
处理原则很简单:要么把环境变量清干净,只靠配置文件;要么把环境变量设成和配置文件一致,双保险。不推荐两条线指向不同地址,那是给自己埋雷。
如果你需要长期使用统一通道,建议在系统环境变量里显式设置一份,同时配置文件里也写一份,两者保持一致。这样无论 OpenClaw 以哪种方式启动,读到的都是正确地址。
3. 可复制的 endpoint 配置片段与统一 Key 接入
3.1 配置文件完整片段
下面这份 JSON 配置可以直接复制,把apiKey换成你自己的统一 Key 即可。路径按你实际的配置文件位置来,Windows 上通常是%USERPROFILE%\.openclaw\config.json:
{ "api": { "baseUrl": "https://taotoken.net/api", "apiKey": "sk-替换成你的统一Key", "model": "claude-sonnet-4-20250514", "timeout": 60000 }, "logging": { "level": "info" } }几个字段说明一下。baseUrl结尾不要带斜杠,带斜杠有些版本会拼出双斜杠导致路径异常。apiKey从统一控制台复制后,建议在编辑器里粘贴一次再复制,避免隐藏字符。model填你实际要用的模型 ID,不同模型 ID 写错会返回 404 而不是 401,但排查时容易混淆。timeout给 60 秒,长回复场景够用。
如果你用的是 TOML 配置:
[api] base_url = "https://taotoken.net/api" api_key = "sk-替换成你的统一Key" model = "claude-sonnet-4-20250514" timeout = 60000 [logging] level = "info"3.2 环境变量配置片段
如果你更习惯用环境变量,PowerShell 里这样设(当前会话):
$env:OPENCLAW_BASE_URL = "https://taotoken.net/api" $env:OPENCLAW_API_KEY = "sk-替换成你的统一Key" $env:OPENCLAW_MODEL = "claude-sonnet-4-20250514"要永久生效,用[Environment]::SetEnvironmentVariable:
[Environment]::SetEnvironmentVariable("OPENCLAW_BASE_URL", "https://taotoken.net/api", "User") [Environment]::SetEnvironmentVariable("OPENCLAW_API_KEY", "sk-替换成你的统一Key", "User")bash/zsh 环境下:
export OPENCLAW_BASE_URL="https://taotoken.net/api" export OPENCLAW_API_KEY="sk-替换成你的统一Key" export OPENCLAW_MODEL="claude-sonnet-4-20250514"永久生效写进~/.bashrc或~/.zshrc。
3.3 三件套对齐检查
无论用哪种方式,Base URL、Key、Model ID 这三件套必须对齐。Base URL 指向统一通道,Key 是统一通道签发的,Model ID 是统一通道支持的模型。三者有一个不对,就可能 401 或 404。
如果你同时用 Claude Code、Cline 或 Codex 这类工具,它们的配置逻辑类似,都是这三件套。比如 Codex 的auth.json里也是 base URL、key、model 三个字段。配置思路一致,只是文件路径和字段名不同。
统一 Key 的申请入口在控制台,拿到 Key 后建议先别急着填进 OpenClaw,先用下面的 curl 验证一次,确认 Key 本身是有效的。这样能把「Key 无效」和「endpoint 配错」两个问题分开排查。
4. 用 curl 验证请求是否走通统一通道
4.1 验证命令
配置改完之后,别急着在 OpenClaw 里试,先用 curl 直接打一次接口。这一步的目的是把 OpenClaw 这个变量排除掉,单独验证 endpoint 和 Key 是否匹配。
curl -X POST https://taotoken.net/api/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: sk-替换成你的统一Key" \ -H "anthropic-version: 2023-06-01" \ -d '{ "model": "claude-sonnet-4-20250514", "max_tokens": 64, "messages": [ {"role": "user", "content": "回复一个字:好"} ] }'Windows PowerShell 里 curl 是Invoke-WebRequest的别名,建议用curl.exe显式调用:
curl.exe -X POST https://taotoken.net/api/v1/messages ` -H "Content-Type: application/json" ` -H "x-api-key: sk-替换成你的统一Key" ` -H "anthropic-version: 2023-06-01" ` -d '{\"model\":\"claude-sonnet-4-20250514\",\"max_tokens\":64,\"messages\":[{\"role\":\"user\",\"content\":\"回复一个字:好\"}]}'4.2 成功结果长什么样
如果一切正常,你会收到一个 JSON 响应,结构大致是:
{ "id": "msg_xxx", "type": "message", "role": "assistant", "content": [ {"type": "text", "text": "好"} ], "model": "claude-sonnet-4-20250514", "stop_reason": "end_turn", "usage": {"input_tokens": 12, "output_tokens": 2} }看到content里有文本、usage里有 token 计数,说明请求已经走通统一通道,Key 和 endpoint 都是对的。这时候再回到 OpenClaw 里跑,如果还 401,那问题就在 OpenClaw 的配置读取上,而不是 Key 或 endpoint 本身。
如果 curl 返回 401,说明 Key 或 endpoint 至少有一个不对。先确认 Key 有没有复制错,再确认 endpoint 是不是https://taotoken.net/api。如果返回 404,通常是路径拼错了,比如多了一层或少了一层/v1。如果返回 403,可能是 Key 权限或额度问题,去控制台看一眼。
4.3 把 curl 结果和 OpenClaw 行为对照
curl 通了但 OpenClaw 不通,这是最典型的情况。原因几乎总是 OpenClaw 读到的配置和你 curl 用的不一致。这时候回到第 2 节,把 OpenClaw 实际读取的环境变量和配置文件再打印一遍,逐字段和 curl 命令里的值比对。
一个高效的技巧:在 OpenClaw 启动命令前临时注入环境变量,强制它用你指定的值:
$env:OPENCLAW_BASE_URL = "https://taotoken.net/api" $env:OPENCLAW_API_KEY = "sk-替换成你的统一Key" openclaw run "测试一下"如果这样能通,说明问题在持久化配置的读取上,而不是 OpenClaw 本身。接下来只需要把持久化配置改对就行。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
5.1 401 但 curl 能通
现象:curl 直接打接口返回正常,OpenClaw 里调用返回 401。原因:OpenClaw 读到的 endpoint 或 Key 和 curl 用的不一致。排查:打印 OpenClaw 进程的环境变量,检查配置文件路径是否是你改的那个。常见坑是改了~/.openclaw/config.json,但 OpenClaw 实际读的是%APPDATA%\openclaw\config.json。
5.2 local proxy failed
现象:报错里出现local proxy failed或类似字样。这通常意味着 OpenClaw 尝试走本地代理端口,但那个端口没有服务在监听。排查:检查环境变量里有没有HTTP_PROXY、HTTPS_PROXY或ALL_PROXY指向一个不存在的本地端口。清掉这些变量再试:
Remove-Item Env:\HTTP_PROXY -ErrorAction SilentlyContinue Remove-Item Env:\HTTPS_PROXY -ErrorAction SilentlyContinue Remove-Item Env:\ALL_PROXY -ErrorAction SilentlyContinue5.3 reading choices 报错
现象:报错信息里出现reading 'choices'或cannot read property 'choices' of undefined。这是响应体解析失败,通常因为服务端返回的不是预期的 JSON 结构。原因可能是 endpoint 指向了一个不兼容的接口,或者请求路径少了/v1。排查:用 curl 打一次同样的 endpoint,看返回的 JSON 结构里有没有choices或content字段。如果返回的是 HTML 错误页,说明 endpoint 路径不对。
5.4 OAuth 相关报错
现象:报错里出现OAuth、token refresh failed或invalid_grant。这类报错通常出现在使用 OAuth 方式认证的场景。如果你用的是 API Key 方式,理论上不该出现 OAuth 报错。如果出现了,检查配置文件里有没有残留的 OAuth 字段,比如oauthToken或refreshToken,把它们删掉,只保留apiKey。
5.5 三件套对齐检查表
| 检查项 | 正确值 | 常见错误 |
|---|---|---|
| Base URL | https://taotoken.net/api | 带了尾部斜杠、指向默认地址、少了/api |
| API Key | sk-开头的统一 Key | 复制时带换行、用了别的平台的 Key |
| Model ID | 统一通道支持的模型 ID | 拼写错误、用了不支持的模型名 |
排查时按这个表逐项过一遍,大部分 401 都能定位到具体哪一项不对。
6. 配好之后怎么继续用:统一通道的日常维护
配置改对、curl 验证通过之后,OpenClaw 的日常使用就顺了。但有几个维护习惯值得养成,能避免以后再次踩坑。
第一,Key 轮换时记得同步更新所有读取位置。如果你同时用了环境变量和配置文件,换 Key 时两处都要改。只改一处,另一处还是旧 Key,下次启动就可能 401。建议固定用一种方式,减少同步成本。
第二,模型 ID 变更时先查文档再改。不同模型 ID 对应的能力和计费不同,改之前确认统一通道支持你要用的模型。改完用 curl 验证一次,确认返回正常再在 OpenClaw 里用。
第三,遇到报错先看完整错误信息,别只看状态码。401 只是表象,错误体里通常有更具体的描述,比如invalid api key、model not found、insufficient quota。这些描述能直接把排查范围缩小到一个点。
第四,长期做编码或 Agent 任务的话,可以考虑用 Coding Plan 这类套餐,比按量计费更划算。日常只是偶尔调用的话,按量就够。
如果你在配的过程中卡住了,接入文档里有各工具的详细配置示例,API Keys 页面可以管理你的 Key。模型对话页面可以直接在浏览器里试模型,不用装任何工具,适合快速验证 Key 是否有效。
最后说一个我踩过的坑:有一次改完配置文件忘了重启 OpenClaw 进程,它还在用旧配置跑,怎么测都 401。后来杀掉进程重新启动,一次就通了。所以改完配置记得重启,这个动作虽然简单,但容易忘。