1. OpenClaw 部署后 openclaw doctor 报错排查:本地 AI 工具链端口占用与 Node 版本问题怎么解决
OpenClaw 是一个可以本地自建、把大模型能力接进自己工作流的开源工具链,跑起来之后你能用命令行、HTTP 接口或者 Agent 的方式调用模型。它适合谁?适合那些不想把数据全交给云端、希望在自己机器上掌控推理入口的开发者。但本地部署有个绕不开的环节:环境依赖和端口。你装完 OpenClaw,第一件事不是急着发请求,而是跑一遍openclaw doctor,它会像体检一样把 Node 版本、npm 可用性、磁盘空间、配置文件、端口占用、网络可达性、权限、依赖完整性逐项过一遍。
我见过太多人卡在同一个地方:终端里敲下openclaw doctor,输出里一个红色的叉,然后不知道从哪下手。尤其是端口 18789 被占用、Node 版本低于 18、npm 找不到这三类,占了报错的大头。这篇就按真实排查路径走一遍,把 doctor 的输出逐行拆开,告诉你每个叉对应什么动作,端口怎么改,最后怎么把 endpoint 指到统一的 API 通道做连通性验证。你跟着做,基本能把本地这套跑通。
先明确一个认知:openclaw doctor不是万能的,它能自动修的只是目录缺失、权限、依赖重装、生成默认配置这几类。端口被占、系统级设置、Node 大版本升级,它不会替你动,得手动处理。所以看到--fix没解决,别慌,那是设计如此。
2. TaoToken 前置准备:统一 Key 与 API 通道接入 OpenClaw 的配置方法
在动 OpenClaw 的端口和依赖之前,先把模型通道这件事定下来。本地工具链最烦的就是每个工具配一套 Key、一套 Base URL,改起来到处找。我的做法是统一走一个兼容 OpenAI 协议的入口,OpenClaw 这边只需要填 Base URL、API Key、Model ID 三样。
TaoToken 的 API 地址是https://taotoken.net/api,注意这个地址后面不加任何查询参数。你需要在控制台生成一个 Key,然后把它写进 OpenClaw 的配置里。具体路径:先到 API Keys 页面创建密钥,再对照接入文档确认字段名。这两个入口分别是https://taotoken.net/api-keys和https://taotoken.net/doc,带上归因参数就是?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite这种形式。
为什么要先做这一步?因为openclaw doctor里有一项network检查,它会去探测你配置的 API 端点是否可达。如果你 endpoint 还没配好,这一项必然报错,你会误以为是网络问题,其实是配置没填。所以顺序是:先拿 Key、配 endpoint,再跑 doctor,这样 network 检查才有意义。
OpenClaw 的配置文件通常是 YAML 格式,路径在~/.openclaw/config.yaml或者项目目录下的config.yaml,取决于你的安装方式。里面 gateway 段控制端口,provider 段控制模型通道。下面给一份可复制的片段,你按自己的实际路径改。
# ~/.openclaw/config.yaml gateway: host: 127.0.0.1 port: 18789 admin_port: 18790 provider: name: taotoken base_url: "https://taotoken.net/api" api_key: "sk-你的Key" model: "claude-sonnet-4-20250514" timeout: 60这里 Model ID 要填你实际要用的模型标识,不同模型名字不一样,别照抄。填完之后先别急着启动,跑一次配置校验,确认 YAML 没写错缩进。YAML 对空格极其敏感,tab 和空格混用直接报语法错误,这是config检查项最常见的失败原因。
3. 可复制配置:openclaw doctor 输出解读清单与端口修改片段
现在进入正题。假设你跑openclaw doctor,看到这样一段输出:
openclaw doctor 🩺 OpenClaw Doctor — 系统诊断 ✔ Node.js v20.11.0 (需要 ≥ 18) ✔ npm v10.2.4 ✔ 磁盘空间 45.2 GB 可用 ✔ 配置文件 有效 ✖ 端口 18789 被占用 (PID: 5678) ✔ 网络连接 API 可达 ✔ 文件权限 正常 ✔ 依赖包 完整 诊断结果:发现 1 个问题 ✖ 端口 18789 已被进程 5678 占用 → 运行 openclaw doctor --fix 自动解决 → 或手动终止进程:kill 5678 → 或修改端口:openclaw config set gateway.port 18800逐行读:Node 和 npm 打勾说明运行时没问题;磁盘、配置、权限、依赖都过;唯一红叉是端口 18789 被 PID 5678 占了。这时候你有三个选择。第一,openclaw doctor --fix,但注意它不会杀进程,所以对端口占用无效,别浪费时间。第二,手动kill 5678,但你要先确认 5678 是什么进程,万一是你另一个正在跑的服务,杀了会出事。第三,改端口,这是最稳的。
改端口有两种方式。命令行方式:
openclaw config set gateway.port 18800 openclaw config set gateway.admin_port 18801配置文件方式,直接编辑 YAML:
gateway: host: 127.0.0.1 port: 18800 admin_port: 18801改完再跑一次openclaw doctor --check ports,只检查端口这一项,快速确认。如果还占用,换个更大的号段,比如 19000 以上,避开常见服务。
再说 Node 版本问题。如果输出是✖ Node.js v16.20.0 (需要 ≥ 18),说明你系统里默认的 node 太旧。这时候不要直接覆盖系统 node,容易搞坏其他依赖。用 nvm 管理多版本:
nvm install 20 nvm use 20 node -v确认输出 v20 之后再跑 doctor。npm 报错通常是✖ npm 未找到,多半是 node 装了但 npm 没跟着装,或者 PATH 没配好。用which npm查一下路径,没有就重装 node,nvm 装 node 会自带 npm。
依赖不完整这一项,报错长这样:✖ 依赖包 不完整。原因是上次npm install中断了。解决就是进项目目录重新装:
cd /path/to/openclaw rm -rf node_modules npm install删掉 node_modules 再装,比直接npm install更干净,能避免半损坏的包残留。
4. 验证请求:改完端口和 endpoint 后如何确认 OpenClaw 连通
配置改完,别只看 doctor 打勾就完事,要发一个真实请求验证链路。先启动 gateway:
openclaw start看到监听日志里出现你改的端口,比如listening on 127.0.0.1:18800,说明端口生效。然后另开一个终端,用 curl 打一下健康检查:
curl -s http://127.0.0.1:18800/health返回{"status":"ok"}就说明本地服务起来了。接下来验证模型通道,这一步才是关键,因为它会真正走到你配的 API 端点:
curl -s http://127.0.0.1:18800/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "回复 ok 两个字"}] }'如果返回里有choices字段和内容,说明 Base URL、Key、Model ID 三样都对,链路通了。如果报 401,是 Key 问题;如果报连接超时,是 Base URL 或网络问题;如果报 model not found,是 Model ID 写错了。这三种错误在下一节展开。
你也可以用 OpenClaw 自带的对话命令做一次端到端验证:
openclaw chat "你好,做个连通性测试"能正常返回内容,就说明从本地 gateway 到远端模型通道整条链路没问题。这时候再跑一次完整openclaw doctor,理想输出应该是全绿:
✔ Node.js v20.11.0 (需要 ≥ 18) ✔ npm v10.2.4 ✔ 磁盘空间 45.2 GB 可用 ✔ 配置文件 有效 ✔ 端口 18800 可用 ✔ 网络连接 API 可达 ✔ 文件权限 正常 ✔ 依赖包 完整 诊断结果:未发现问题到这一步,本地这套 OpenClaw 就算真正跑起来了。记住,doctor 全绿只是环境层面通过,业务层面还得靠真实请求验证,两者不能互相替代。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth 报错对照
这一节把几个高频报错和真实输出对照着讲,你遇到时直接对号入座。
401 Unauthorized。curl 返回{"error":{"message":"Invalid API key","type":"invalid_request_error"}}。原因就一个:Key 不对或没带上。检查配置文件里api_key字段有没有写错、有没有多余空格、是不是复制时漏了字符。还有一种情况是 Key 过期了,去控制台重新生成一个。注意 Base URL 结尾不要多加斜杠,https://taotoken.net/api和https://taotoken.net/api/在某些客户端里行为不一致。
local proxy failed。这个报错通常出现在你本地配了代理,但代理没起来或者端口不对。OpenClaw 启动日志里会写local proxy failed: connection refused。解决方式是检查你的代理进程是否在跑,或者干脆在配置里把代理关掉,直连 API 端点。如果你环境里必须走代理,确认代理地址和端口和实际监听一致。
reading choices 报错。完整报错类似error reading choices: unexpected end of JSON input。这是响应体不是合法 JSON,常见于 Base URL 配错,请求打到了一个返回 HTML 的地址上。比如你把 Base URL 写成了官网首页而不是 API 路径,返回的就是网页,解析自然失败。确认 Base URL 是https://taotoken.net/api,不是别的。
OAuth 相关报错。如果你用的是 Claude Code 这类需要 OAuth 的客户端,报错可能是OAuth token expired或failed to refresh token。这类客户端配置要写全三件套:Base URL、Key、Model ID。以 Claude Code 为例,它的 settings 文件里需要指定ANTHROPIC_BASE_URL、ANTHROPIC_API_KEY、ANTHROPIC_MODEL三个环境变量或配置项。少一个都会导致鉴权失败。Cline 的 MCP 配置同理,JSON 里baseUrl、apiKey、model三个字段缺一不可。Codex 的auth.json也是这个逻辑,字段名不同但本质一样。
给你一份 Claude Code 的配置片段参考:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的Key", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" } }Cline MCP 的配置片段:
{ "mcpServers": { "openclaw": { "command": "openclaw", "args": ["mcp", "serve"], "env": { "OPENCLAW_BASE_URL": "https://taotoken.net/api", "OPENCLAW_API_KEY": "sk-你的Key", "OPENCLAW_MODEL": "claude-sonnet-4-20250514" } } } }Codex 的auth.json:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-你的Key", "model": "claude-sonnet-4-20250514" }这三个客户端的共同点:Base URL 指向 API 根路径,Key 用同一个,Model ID 按需换。配好之后各自跑一次最小请求验证,别一次配一堆然后一起排障,那样定位不到是哪个环节出的问题。
还有一个容易忽略的:端口改了之后,如果你有别的工具或脚本硬编码了 18789,它们会连不上。改端口要全局搜一遍引用,把旧端口都替换掉。grep -r "18789" ~/.openclaw/能帮你找到所有引用点。
6. 语义一致 CTA:OpenClaw 长期编码与 Agent 场景的通道选择
环境跑通之后,接下来就是怎么用得顺手。如果你只是偶尔验证一下模型,用模型对话页面直接测就行,入口在https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite。如果你要把 OpenClaw 当成日常编码助手或者 Agent 底座,长期高频调用,那更适合走 Coding Plan,入口是https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite,它在配额和稳定性上更适合持续跑任务。
排障和接入过程中如果卡在配置字段、报错含义上,直接翻接入文档https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite,里面按客户端分类列了字段说明。Key 的管理在控制台https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite,生成、吊销、查看用量都在那。
最后说个实操细节:OpenClaw 的 doctor 检查项里,network那一项探测的是你配置的 endpoint,不是公网任意地址。所以只要你 Base URL 填对、Key 有效,它就会打勾。但打勾不代表模型一定能返回内容,因为 doctor 只做可达性探测,不做推理验证。真正的验证永远是你发一条真实消息看返回。这个区分很重要,别把 doctor 全绿当成万事大吉。端口改完、依赖装齐、endpoint 配好、真实请求返回内容,四步都过了,才算真正养好这只虾。