1. 从零装好 OpenClaw 却卡在模型通道我踩过的三个坑OpenClaw原 Clawdbot是一个轻量级的 AI 任务自动化框架你可以把它理解成一个「本地跑得动、能挂 Skills、能接各种模型通道」的 Agent 运行时。它能做什么简单说就是你给它一个任务描述它自己拆步骤、调工具、跑 Skills最后把结果吐回来。适合谁适合想在自己机器或小服务器上跑自动化流程、又不想被某一家模型厂商绑死的开发者。我这次的目标很明确装好 OpenClaw把 Skills 目录跑通然后把settings里的模型通道从默认配置改到 TaoToken 的统一 Key/API 通道最后验证一次真实调用能返回正常结果。前两次尝试都翻车了。第一次是 Skills 列表死活加载不出来日志里只有一行skills directory not found第二次是模型通道改完请求直接报local proxy failed我一度以为是网络问题折腾半天才发现是settings里 base URL 和 model id 没对齐。第三次我把整个链路拆成「安装 → 配置 → 验证」三段逐段确认才跑通。这篇就按这个顺序写重点放在settings配置片段和 Skills 目录结构上每一步都给可复制的命令和配置。你跟着做基本能避开我踩的那几个坑。先说清楚整体链路OpenClaw 本体负责调度Skills 是它调用的能力单元放在固定目录里按约定格式声明模型通道则由settings文件里的 provider 配置决定。三者关系是——OpenClaw 启动时读settings拿到模型通道运行时按任务需要去 Skills 目录加载对应能力再通过模型通道发起请求。所以任何一环配置错了表现都是「启动没报错但调用失败」这也是最容易让人误判的地方。下面进入正题。我会先讲安装和目录准备再讲 TaoToken 通道的前置准备然后是核心的settings配置片段接着是逐项验证动作最后是常见报错排查。2. 安装 OpenClaw 与 Skills 目录准备settings 文件到底在哪安装 OpenClaw 本身不复杂关键是搞清楚它的目录结构尤其是settings文件和 Skills 目录的位置。很多人装完找不到配置文件就是因为不知道默认路径。我用的方式是源码安装这样目录结构最清晰也方便后面改settings。先确认基础环境Node.js 18 以上、npm 或 pnpm、git。我用的是 Node 20 pnpm。# 确认 Node 版本低于 18 先升级 node -v # 确认包管理器 pnpm -v # 拉取 OpenClaw 源码2026 稳定分支 git clone https://github.com/openclaw/openclaw.git cd openclaw # 安装依赖 pnpm install # 构建 pnpm build构建完成后目录里会出现几个关键路径我列一下你对照自己的实际情况openclaw/ ├── settings.json # 主配置文件模型通道在这里改 ├── skills/ # Skills 根目录 │ ├── example-skill/ │ │ ├── skill.json # Skill 声明文件 │ │ └── index.js # Skill 执行逻辑 │ └── ... ├── data/ # 运行时数据、日志 └── package.json如果你是用 npm 全局安装的settings.json一般在用户目录下比如~/.openclaw/settings.jsonSkills 目录则是~/.openclaw/skills/。两种方式都行我建议源码安装路径可控出问题好排查。Skills 目录的结构有约定不是随便放个 js 文件就能被识别。每个 Skill 是一个子目录里面必须有skill.json声明名称、版本、入口文件、参数 schema。举个最小可用的例子{ name: echo-skill, version: 1.0.0, description: 回显输入内容用于验证 Skills 加载链路, entry: index.js, parameters: { type: object, properties: { text: { type: string, description: 要回显的文本 } }, required: [text] } }对应的index.jsmodule.exports async function ({ text }) { return { echoed: text, timestamp: Date.now() }; };这个 echo-skill 后面验证环节会用到先建好。注意skill.json里的entry必须和实际文件名一致大小写敏感这是 Skills 列表加载失败最常见的原因之一。装完之后先别急着改模型通道先跑一次启动确认本体没问题# 启动 OpenClaw pnpm start # 正常输出类似 # [openclaw] server listening on :3000 # [openclaw] skills loaded: 1 # [openclaw] settings loaded from ./settings.json如果这里就报错先解决启动问题别往下走。启动无报错是后面所有验证的前提。我见过有人启动日志里其实有skills loaded: 0但没注意后面调用一直失败还以为是模型通道的问题。到这里安装和目录准备就完成了。下一步是准备 TaoToken 的通道信息也就是 Key 和 API 地址。3. 把 settings 改到 TaoToken 通道可复制的配置片段这一步是全文核心。OpenClaw 的模型通道由settings.json里的 provider 配置决定默认可能指向某个内置通道我们要把它改成 TaoToken 的统一 Key/API 通道。先说前置准备。你需要一个 TaoToken 的 API Key。获取入口在控制台的 API Keys 页面登录后创建即可。TaoToken 的 API 地址是https://taotoken.net/api这个地址在配置里会用到。如果你还没注册可以从官网入口进https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后在控制台创建 Key。拿到 Key 之后打开settings.json。默认内容大概长这样不同版本略有差异{ server: { port: 3000 }, skills: { dir: ./skills }, model: { provider: default, baseUrl: https://some-default-endpoint/v1, apiKey: , modelId: default-model } }我们要改的是model这一段。改成 TaoToken 通道后{ server: { port: 3000 }, skills: { dir: ./skills }, model: { provider: openai-compatible, baseUrl: https://taotoken.net/api, apiKey: 你的TaoToken API Key, modelId: claude-sonnet-4-20250514, timeout: 60000, maxRetries: 2 } }几个关键点必须对齐错一个就会报错provider填openai-compatible因为 TaoToken 的 API 是 OpenAI 兼容格式OpenClaw 用这个 provider 类型去发请求。baseUrl填https://taotoken.net/api注意不要多加/v1OpenClaw 内部会自己拼路径。我第二次翻车就是这里多写了/v1结果请求打到https://taotoken.net/api/v1/chat/completions之外的路径直接 404。apiKey填你创建的那串 Key注意不要带多余空格。modelId填你要用的模型 ID比如claude-sonnet-4-20250514。这个 ID 要和 TaoToken 支持的模型列表一致填错了会报model not found。如果你用的是 TOML 格式的配置部分版本支持等价写法是[server] port 3000 [skills] dir ./skills [model] provider openai-compatible baseUrl https://taotoken.net/api apiKey 你的TaoToken API Key modelId claude-sonnet-4-20250514 timeout 60000 maxRetries 2改完保存重启 OpenClawpnpm start启动日志里应该能看到settings loaded和model provider: openai-compatible。如果日志里 provider 还是 default说明你的settings.json路径不对OpenClaw 读的是另一个文件。用pnpm start --verbose可以看到它实际加载的配置路径。这里补一句如果你同时用 Claude Code 或 Cline 这类工具它们的配置逻辑类似都是 Base URL Key Model ID 三件套。TaoToken 的接入文档里有各工具的配置示例可以对照着看入口在接入文档页。配置改完只是第一步能不能真正跑通得靠验证。下一节讲逐项验证动作。4. 逐项验证启动无报错、Skills 可加载、示例调用返回正常配置改完不能只看启动日志要逐项验证。我按三个层次来启动层、Skills 层、调用层。每一层都有明确的成功标志任何一层不过都别往下走。第一层启动无报错。重启后看日志pnpm start # 期望输出 # [openclaw] server listening on :3000 # [openclaw] settings loaded from ./settings.json # [openclaw] model provider: openai-compatible # [openclaw] skills loaded: 1四个关键行都要有。model provider必须是openai-compatibleskills loaded至少是 1我们建了 echo-skill。如果skills loaded: 0去检查settings.json里skills.dir指向的目录以及每个 Skill 子目录里有没有合法的skill.json。第二层Skills 列表可加载。OpenClaw 启动后有个 HTTP 接口可以查 Skills 列表curl http://localhost:3000/skills # 期望返回 # { # skills: [ # { name: echo-skill, version: 1.0.0, description: 回显输入内容... } # ] # }如果返回空数组说明 Skills 没被扫描到。常见原因是skill.json格式错误或者entry指向的文件不存在。用node -e require(./skills/echo-skill/skill.json)单独验证一下 JSON 是否合法。第三层示例调用返回正常。这是最关键的一步它同时验证了模型通道和 Skills 执行链路。OpenClaw 提供一个调用接口curl -X POST http://localhost:3000/invoke \ -H Content-Type: application/json \ -d { skill: echo-skill, parameters: { text: hello taotoken } } # 期望返回 # { # success: true, # result: { echoed: hello taotoken, timestamp: 1730000000000 } # }注意这个调用走的是 Skills 执行链路不一定经过模型通道。要验证模型通道得发一个需要模型推理的请求curl -X POST http://localhost:3000/chat \ -H Content-Type: application/json \ -d { messages: [ { role: user, content: 用一句话说明你正在通过哪个通道响应 } ] } # 期望返回一段正常的模型回复文本如果这一步返回了正常文本说明 TaoToken 通道打通了。如果报错看下一节的排查。我实测下来这三层验证做完基本能确认整条链路是通的。启动层确认配置被正确加载Skills 层确认能力单元可被发现调用层确认模型通道和 Skills 执行都正常。三层都过才算真正装好。5. 常见报错排查401、local proxy failed、reading choices、OAuth这一节列几个我实际遇到过的报错以及对应的排查方向。这些报错在 OpenClaw 接入 TaoToken 的过程中比较典型你大概率会碰到其中一个。报错一401 UnauthorizedError: request failed with status 401 {error:{message:invalid api key,type:authentication_error}}这是 Key 的问题。排查顺序先确认settings.json里apiKey没有多余空格或换行再确认这个 Key 在 TaoToken 控制台是启用状态最后确认 Key 没有过期。如果 Key 是从控制台复制的注意别把前后引号也复制进去。我见过有人把 Key 用引号包起来填进 JSON结果 Key 里带了引号字符直接 401。报错二local proxy failedError: local proxy failed: connect ECONNREFUSED 127.0.0.1:7890这个报错说明 OpenClaw 尝试走本地代理但代理没开。如果你机器上配了全局代理环境变量HTTP_PROXY/HTTPS_PROXYOpenClaw 会继承。解决办法是在启动前清掉这些变量unset HTTP_PROXY unset HTTPS_PROXY unset ALL_PROXY pnpm start或者在settings.json里显式声明不走代理。这个报错和 TaoToken 本身无关是本地网络环境的问题。报错三reading choicesTypeError: Cannot read properties of undefined (reading choices)这个报错说明请求发出去了但返回的 JSON 结构里没有choices字段。常见原因有两个一是baseUrl配错了请求打到了非 OpenAI 兼容的端点返回了错误结构二是modelId填错了服务端返回了错误信息而不是正常的 completion 结构。排查方法用 curl 直接打一次 TaoToken 的接口看返回结构curl https://taotoken.net/api/chat/completions \ -H Authorization: Bearer 你的Key \ -H Content-Type: application/json \ -d { model: claude-sonnet-4-20250514, messages: [{ role: user, content: hi }] }如果这个 curl 返回正常说明 Key 和模型 ID 没问题那就是 OpenClaw 的baseUrl配置问题。重点检查有没有多写/v1。报错四OAuth 相关错误Error: OAuth token exchange failed如果你在 OpenClaw 里配了 OAuth 类型的 provider但实际用的是 API Key 通道就会报这个。解决办法是把provider改成openai-compatible用 Key 认证不要走 OAuth 流程。TaoToken 的通道用 Key 认证即可不需要 OAuth。报错五Skills 加载失败但无明确报错[openclaw] skills loaded: 0没有报错但 Skills 数量是 0通常是skill.json里的entry字段和实际文件名不匹配或者parameters的 schema 格式不合法。用这个命令逐个验证for d in skills/*/; do echo checking $d node -e JSON.parse(require(fs).readFileSync($d/skill.json)) echo json ok done排查完这些基本能覆盖 90% 的接入问题。如果还有别的报错可以对照 TaoToken 的接入文档里面有更详细的错误码说明。6. 把通道固定下来后续维护与扩展建议跑通之后有几件事值得做能让这套配置更稳。第一把settings.json纳入版本管理但 Key 不要提交。可以用环境变量替换{ model: { provider: openai-compatible, baseUrl: https://taotoken.net/api, apiKey: ${TAOTOKEN_API_KEY}, modelId: claude-sonnet-4-20250514 } }启动前export TAOTOKEN_API_KEY你的Key这样配置文件可以安全地提交到仓库。第二Skills 目录可以按业务拆分。比如skills/office/、skills/dev/只要settings.json里skills.dir指向根目录OpenClaw 会递归扫描。每个 Skill 保持独立目录和skill.json方便单独更新。第三如果你要长期跑 Agent 任务可以考虑用 Coding Plan 这类按量方案比单次调用更划算。入口在 Coding Plan 页面。日常调试模型响应用模型对话页面直接测更快。第四定期检查 OpenClaw 和 Skills 的版本。Skills 的skill.json里可以声明兼容的 OpenClaw 版本范围升级前先看 changelog避免 schema 变更导致加载失败。这套配置我跑了一段时间整体稳定。核心就是三件事settings里的 Base URL、Key、Model ID 对齐Skills 目录结构规范验证分三层做。把这三件事固定成流程后面换模型、加 Skill 都不会乱。