ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

OpenClaw 连接本地 vLLM 报 “Connection error” 问题排查与解决:从 models.json 到 gateway 的 TaoToken 统一接入

OpenClaw 连接本地 vLLM 报 “Connection error” 问题排查与解决:从 models.json 到 gateway 的 TaoToken 统一接入 1. OpenClaw 连接本地 vLLM 报 Connection error 的真实场景如果你正在用 OpenClaw 对接本地 vLLM 推理服务某天把 vLLM 从一台机器搬到另一台机器改完openclaw.json里的baseUrl重启 gateway结果所有对话都返回Connection error那这篇就是写给你的。这个报错最迷惑的地方在于curl能通、Node.js 直连能通、openclaw gateway status显示 RPC probe OK但 OpenClaw 就是不发请求。问题不在网络而在 OpenClaw 的多层配置覆盖机制。OpenClaw 是一个把本地/远程大模型统一编排成 agent 的运行时它支持 vLLM、Ollama、OpenAI 兼容接口等多种 provider。适合谁适合已经在本地跑 vLLM、想用 OpenClaw 做 agent 编排、又不想被配置覆盖坑到的开发者。核心检索词就是 OpenClaw、vLLM、Connection error、models.json、gateway 这五个下面全部围绕它们展开。我先把结论摆出来Connection error在 OpenClaw 里有两层含义。第一层是真正的 TCP/HTTP 连接失败第二层是 provider 连续失败后触发了 cooldown 冷却保护请求在本地就被拦截压根没发出去。你看到strace里 10 秒内没有任何到目标 IP 的connect调用就是第二层。而触发 cooldown 的根因往往是models.json里的旧 IP 覆盖了你在openclaw.json里改的新 IP。这个场景的典型链路是这样的你改了全局配置 → 以为生效 → 实际 agent 级models.json优先级更高 → 请求发往已下线的旧服务器 → 连续失败 → cooldown 拦截 → 后续所有请求本地直接返回Connection error。排查时如果只看 gateway 状态和 curl会一直以为是网络问题方向就偏了。下面按「先定位、再修复、后验证」的顺序走每一步都给可复制的命令和配置片段。你不需要从头读遇到哪一步卡住就跳到对应小节。2. TaoToken 统一接入把 Key 和 Base URL 收口到一处在动手改 OpenClaw 配置之前先说一个能减少这类问题的做法把模型访问的 Key 和 Base URL 统一收口。本地 vLLM 直连适合调试但一旦你要在 OpenClaw 里同时挂本地 vLLM、云端模型、多个 agent配置就会散落在openclaw.json、models.json、auth-profiles.json好几个文件里改一处漏一处正是这次Connection error的温床。TaoToken 在这里的角色是统一 Key/API 通道。你可以把它理解成一个「配置收口层」OpenClaw 里所有 provider 的baseUrl指向同一个入口Key 也只维护一份模型 ID 通过请求参数区分。这样迁移服务器、换模型、加 agent 时只需要改一处不会出现models.json和openclaw.json各写一个旧地址的情况。官网入口在这里https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。API 基址是 https://taotoken.net/api 注意这个地址不带 UTM 参数配置里直接写它。具体到 OpenClaw 的配置你需要在 provider 里填三件套Base URL、API Key、Model ID。Base URL 填https://taotoken.net/apiKey 在控制台生成Model ID 按你实际要调的模型填。这样 OpenClaw 的models.json里就不再出现10.10.85.220这种会过期的内网 IP迁移时也不会因为漏改某个文件而触发 cooldown。如果你只是想先验证模型能不能通可以用模型对话页面直接测https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。要生成和管理 Key去控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API Keys 页面在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。需要说明的是TaoToken 不是让你放弃本地 vLLM。本地 vLLM 继续跑你的私有模型TaoToken 负责把 OpenClaw 的访问入口统一。两者可以并存一个 provider 指向本地 vLLM另一个 provider 指向 TaoTokenagent 按需选择。关键是每个 provider 的配置只在一个地方维护避免覆盖。3. 可复制配置models.json 与 gateway 的正确写法这一节是全文最核心的可复制部分。先明确 OpenClaw 的配置优先级从高到低是~/.openclaw/agents/main/agent/models.jsonagent 级模型配置最高→~/.openclaw/agents/main/agent/auth-profiles.json认证信息→~/.openclaw/openclaw.json全局配置。你只改openclaw.json时models.json里的旧配置依然生效并覆盖全局这就是根因。先看一个会出问题的models.json长什么样{ providers: { vllm: { baseUrl: http://10.10.85.220:8000/v1, apiKey: sk-local, models: [gpt-oss-120b] } } }这里的10.10.85.220是旧服务器 IP已经下线。OpenClaw 每次请求都发往这个地址失败几次后触发 cooldown之后请求在本地被拦截表现为Connection error。修复方式一直接改models.json里的 IPsed -i s/10.10.85.220/192.168.1.221/g \ ~/.openclaw/agents/main/agent/models.json grep baseUrl ~/.openclaw/agents/main/agent/models.json openclaw gateway restart修复方式二如果你决定走 TaoToken 统一入口把models.json改成这样彻底去掉内网 IP{ providers: { taotoken: { baseUrl: https://taotoken.net/api, apiKey: sk-你的TaoTokenKey, models: [gpt-oss-120b] } } }注意baseUrl结尾不要多加/v1TaoToken 的 API 基址就是https://taotoken.net/api路径由 OpenClaw 按 OpenAI 兼容格式拼接。Key 从 API Keys 页面生成https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。如果你用的是 Claude Code 或 Codex 这类工具配置格式不同但三件套一样。Claude Code 的 settings 片段{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的TaoTokenKey, ANTHROPIC_MODEL: claude-sonnet-4-20250514 } }Codex 的auth.json片段{ base_url: https://taotoken.net/api, api_key: sk-你的TaoTokenKey, model: gpt-oss-120b }Cline MCP 的配置片段{ mcpServers: { taotoken: { command: npx, args: [-y, taotoken/mcp-server], env: { TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_API_KEY: sk-你的TaoTokenKey, TAOTOKEN_MODEL: gpt-oss-120b } } } }三件套永远是 Base URL Key Model ID缺一不可。CC Switch 切换配置时也是改这三个字段不要只改其中一个。改完配置后用命令方式同步更新避免手改漏文件openclaw config set models.providers.vllm.baseUrl http://192.168.1.221:8000/v1这个命令会同步更新所有相关配置比手动编辑models.json更安全。如果你有多个 agent记得检查~/.openclaw/agents/*/agent/models.json每个 agent 都有自己的覆盖文件。4. 验证请求curl 与日志对照确认修复成功配置改完不代表修好了必须验证。验证分三层底层网络、OpenClaw provider 状态、实际请求日志。第一层确认 vLLM 服务可达。如果你还在用本地 vLLMcurl http://192.168.1.221:8000/v1/models curl -X POST http://192.168.1.221:8000/v1/chat/completions \ -H Content-Type: application/json \ -d {model:gpt-oss-120b,messages:[{role:user,content:hello}],max_tokens:10}两个接口都正常响应说明底层网络没问题。如果你已经切到 TaoToken把地址换成https://taotoken.net/api/v1/models带上Authorization: Bearer sk-你的Key头curl https://taotoken.net/api/v1/models \ -H Authorization: Bearer sk-你的TaoTokenKey第二层确认 OpenClaw 实际生效的配置来源openclaw models status输出里会有一行sourcemodels.json: ~/.openclaw/agents/main/agent/models.json。这个source字段是关键它告诉你当前真正生效的是哪个文件。如果它指向的文件里还有旧 IP说明你改错了地方。第三层重启 gateway 后观察日志openclaw gateway restart openclaw logs --follow 21 | grep -E agent end|agent start正常输出应该是debug agent/embedded embedded run agent start: runIdxxx info agent/embedded embedded run agent end: runIdxxx isErrorfalse看到isErrorfalse就说明请求成功发出并返回了。如果还是isErrortrue errorConnection error回到第 5 节对照报错排查。还有一个快速验证 cooldown 是否解除的方法openclaw models status --reset-cooldown这个命令只重置冷却状态不改配置。如果重置后请求能通说明配置已经对了之前只是被 cooldown 拦着如果重置后还是报错说明配置里还有旧地址。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节把 OpenClaw 对接 vLLM 和 TaoToken 时最常见的几类报错对照清楚你按报错关键词直接跳。报错一Connection error且 strace 无 TCP connect。这是本文主场景。根因是 cooldown 拦截 models.json旧 IP。排查顺序openclaw gateway status确认 gateway 正常 →curl vllm_url/v1/models确认后端可达 →openclaw models status看source指向哪个文件 → 检查该文件是否含旧 IP。修复用第 3 节的sed或openclaw config set然后openclaw gateway restart。报错二401 Unauthorized。说明请求发出去了但 Key 不对。检查三件套里的 Key 是否和 API Keys 页面生成的一致注意不要有多余空格或换行。如果用的是 TaoToken确认Authorization: Bearer sk-xxx格式正确。Claude Code 场景下检查ANTHROPIC_API_KEYCodex 场景下检查auth.json里的api_key。报错三local proxy failed。这个通常出现在 gateway 转发环节说明 gateway 尝试把请求转发到 provider 时本地代理层失败。检查openclaw.json里 gateway 的监听地址和 provider 的baseUrl是否在同一网络命名空间可达。如果你在容器里跑 OpenClawlocalhost指向容器自身而不是宿主机要用宿主机 IP 或host.docker.internal。报错四reading choices或reading choices[0]。这是响应解析错误说明请求通了、返回了但返回体不是 OpenAI 兼容格式。常见于 vLLM 版本和 OpenClaw 期望的响应结构不一致或者 TaoToken 返回的模型 ID 和请求的不匹配。检查请求里的model字段是否在 provider 的models列表里以及 vLLM 启动时是否加了--served-model-name。报错五OAuth相关。如果你在 OpenClaw 里配了需要 OAuth 的 provider但走的是 API Key 模式会报 OAuth 错误。确认 provider 类型选对API Key 模式下不需要 OAuth 流程。Claude Code 接入时如果报 OAuth检查是否误用了需要登录的端点换成 API Key 端点即可。排查通用顺序记一下openclaw gateway status→curl baseUrl/v1/models→openclaw models status看source→ 检查该文件三件套 →openclaw gateway restart。这个顺序能覆盖 90% 的Connection error。6. 长期编码与 Agent 场景的接入选择如果你只是偶尔调一下本地 vLLM第 3 节的sed修复就够了。但如果你在 OpenClaw 里长期跑编码 agent、多 agent 编排、或者要同时挂本地和云端模型建议把接入方式固定下来减少配置漂移。长期编码和 Agent 场景更适合用 Coding Plan 这类统一通道入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。它的价值在于Key 和 Base URL 只维护一份模型 ID 按 agent 区分迁移服务器时不用满目录grep旧 IP。OpenClaw 的models.json里只留一个 provider 指向https://taotoken.net/api本地 vLLM 作为另一个 provider 并存互不覆盖。Claude Code 用户如果要做 Anthropic 兼容接入参考 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里面有三件套的完整写法。模型对话验证在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。最后给一个实用技巧每次迁移 vLLM 服务器后先跑一遍grep -r 旧IP ~/.openclaw/把所有命中文件列出来再决定是逐个sed还是统一改成 TaoToken 入口。这个习惯能让你在下次遇到Connection error时5 分钟内定位到是哪个models.json在覆盖配置。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进