ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

OpenClaw 养龙虾:用 Skills 把 AI Agent 接进 Node.js 项目

OpenClaw 养龙虾:用 Skills 把 AI Agent 接进 Node.js 项目 1. 为什么要在 Node.js 项目里养这只“龙虾”OpenClaw 是一个本地优先、可自主执行任务的 AI Agent 平台核心能力是从“会说”走到“会做”接收指令、拆解任务、调用工具、执行操作、返回结果。它和普通聊天机器人最大的区别在于它能真正操作你的电脑——抓取新闻、分拣邮件、管理文件甚至执行 Shell 命令和操控浏览器。而 Skills 机制就是让这只“龙虾”长出不同钳子的关键每个 Skill 是一组可被 Agent 调用的能力单元你可以按项目需要安装、组合、替换。把 OpenClaw 接进 Node.js 项目适合谁适合那些想让 AI Agent 自动执行本地任务的后端开发者——比如定时拉取数据、自动生成日报、批量处理文件、在 CI 流程里插入智能决策节点。你不需要把整个项目改造成 Agent 架构只需要在 Node.js 侧留一个调用入口让 OpenClaw 作为“执行层”跑在本地Node.js 作为“调度层”负责触发和收结果。我试过直接在项目里硬编码模型调用结果 Key 散落在多个文件、换模型要改十几处、Agent 行为无法复现。后来把 OpenClaw 的 Skills 目录和 config.toml 纳入版本管理配合 TaoToken 统一 Key才把“养龙虾”从玩具变成可维护的工程配置。下面按步骤拆开讲。2. TaoToken 前置统一 Key 与 OpenClaw 的对接位置OpenClaw 本身是一个通用网关支持对接多种模型提供商。但如果你在 Node.js 项目里同时用多个模型比如 Claude 做代码生成、GPT 做文本摘要每个提供商一套 Key、一套计费、一套限流维护成本会迅速上升。TaoToken 的作用是把这些统一成一个入口一个 Key、一套 API 地址兼容主流模型调用格式。在 OpenClaw 的 config.toml 里模型提供商配置通常长这样以兼容 OpenAI 格式的提供商为例[providers.taotoken] type openai base_url https://taotoken.net/api api_key sk-你的TaoTokenKey这里 base_url 填https://taotoken.net/api不要加多余路径。api_key 从 TaoToken 控制台的 API Keys 页面生成。生成后建议直接写入环境变量config.toml 里用占位符引用避免 Key 进 Git[providers.taotoken] type openai base_url https://taotoken.net/api api_key ${TAOTOKEN_API_KEY}Node.js 侧读取同一个环境变量这样 OpenClaw 和你的项目共用一套 Key换模型只改 config.toml 里的 model 字段Node.js 代码不动。注意TaoToken 的 Key 只用于模型调用不要把它写进前端代码或提交到公开仓库。建议在 .env 里管理.gitignore 里排除。如果你还没有 Key先去控制台创建一个https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。创建后复制 sk- 开头的字符串后面配置要用。3. 可复制配置Skills 目录结构与 config.toml 骨架OpenClaw 的 Skills 机制核心是一个目录约定。每个 Skill 是一个独立文件夹里面至少包含一个 manifest 文件描述能力以及可选的执行脚本。推荐的项目内目录结构如下my-node-project/ ├── openclaw/ │ ├── config.toml │ └── skills/ │ ├── fetch-news/ │ │ ├── skill.toml │ │ └── run.js │ ├── sort-files/ │ │ ├── skill.toml │ │ └── run.js │ └── daily-report/ │ ├── skill.toml │ └── run.js ├── src/ │ └── agent-bridge.js ├── .env └── package.json每个 skill.toml 描述这个 Skill 的名称、触发词、参数 schema 和入口name fetch-news description 抓取指定 RSS 源的最新条目并返回标题列表 entry run.js runtime node [params] source { type string, required true, description RSS 源地址 } limit { type number, required false, default 5 }run.js 就是一个普通 Node.js 模块导出 async 函数接收 params 对象// openclaw/skills/fetch-news/run.js module.exports async function ({ source, limit }) { const res await fetch(source); const text await res.text(); // 简化解析实际可用 fast-xml-parser const titles text.match(/title(.*?)\/title/g) || []; return titles.slice(1, limit 1).map(t t.replace(/\/?title/g, )); };config.toml 骨架把 provider、skills 目录、Agent 行为串起来[agent] name node-lobster model claude-3-5-sonnet provider taotoken skills_dir ./openclaw/skills max_steps 10 [providers.taotoken] type openai base_url https://taotoken.net/api api_key ${TAOTOKEN_API_KEY} [server] host 127.0.0.1 port 18789这里 model 字段填你在 TaoToken 上可用的模型名。max_steps 控制 Agent 单次任务最多拆解几步防止无限循环。skills_dir 指向项目内的 Skills 目录这样 Skills 跟着项目走换机器 clone 下来就能用。Node.js 侧写一个薄桥接层负责触发 Agent 并拿结果// src/agent-bridge.js const OPENCLAW_URL process.env.OPENCLAW_URL || http://127.0.0.1:18789; async function runAgentTask(instruction) { const res await fetch(${OPENCLAW_URL}/api/task, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ instruction, stream: false }) }); if (!res.ok) throw new Error(Agent 调用失败: ${res.status}); return res.json(); } module.exports { runAgentTask };这样你的 Node.js 业务代码只需要runAgentTask(抓取 Hacker News 前 5 条标题)剩下的拆解、调用 Skill、执行、返回结果都由 OpenClaw 完成。4. 验证请求一次可复现的 Agent 调用配置写完后先启动 OpenClaw 服务。在项目根目录执行export TAOTOKEN_API_KEYsk-你的Key openclaw --config ./openclaw/config.toml服务启动后Web 控制台默认在 http://127.0.0.1:18789/ 。先别急着开浏览器用 curl 做一次最小验证确认 Agent 能识别 Skills 并调用模型curl -s -X POST http://127.0.0.1:18789/api/task \ -H Content-Type: application/json \ -d {instruction:用 fetch-news 技能抓取 https://news.ycombinator.com/rss 的前 3 条标题,stream:false}预期返回类似{ status: success, steps: [ { action: call_skill, skill: fetch-news, params: { source: https://news.ycombinator.com/rss, limit: 3 } }, { action: return, result: [Title A, Title B, Title C] } ], result: [Title A, Title B, Title C] }如果 steps 里出现了 call_skill 并且 result 有内容说明 Skills 目录被正确加载、TaoToken Key 生效、Agent 拆解逻辑正常。接着在 Node.js 里跑一次const { runAgentTask } require(./src/agent-bridge); runAgentTask(用 fetch-news 技能抓取 https://news.ycombinator.com/rss 的前 3 条标题) .then(r console.log(r.result)) .catch(console.error);实测下来从 Node.js 触发到拿到结果通常在 3–8 秒取决于模型响应速度和 Skill 执行耗时。如果返回的 steps 里没有 call_skill而是直接让模型“编”了一个答案说明 Skill 没被识别检查 skills_dir 路径和 skill.toml 的 name 字段是否与指令中的技能名一致。5. 本篇常见错排查错误一openclaw: command not found说明 OpenClaw 没装或不在 PATH。Node.js 22.x 以上环境用 npm 全局安装或者用官方一键包。装完执行openclaw --version确认。错误二Agent 返回 401 或invalid api keyTaoToken Key 没读到。检查 .env 是否被加载config.toml 里${TAOTOKEN_API_KEY}的变量名是否和 export 的一致。注意 base_url 必须是https://taotoken.net/api多写/v1或结尾斜杠都可能导致 404。错误三Skill 不触发Agent 自己编答案skill.toml 的 name 和指令里的技能名对不上或者 skills_dir 指向了错误目录。用绝对路径先排除相对路径问题。另外确认 run.js 导出的是函数而不是对象。错误四max_steps exceededAgent 在循环调用 Skill。检查 Skill 的返回值是否清晰避免返回模糊描述让模型反复尝试。把 max_steps 从 10 降到 5 也能快速暴露问题。错误五端口 18789 被占用改 config.toml 里的 port同时更新 Node.js 侧的 OPENCLAW_URL 环境变量。别硬编码端口。错误六Node.js fetch 报ECONNREFUSEDOpenClaw 服务没启动或者 host 配成了 0.0.0.0 而 Node.js 连的 127.0.0.1。本地开发统一用 127.0.0.1。排障时优先看 OpenClaw 的日志输出它会打印每次 Agent 决策的步骤和 Skill 调用参数。如果日志里 Key 显示为${TAOTOKEN_API_KEY}字面量说明环境变量没展开检查启动命令前是否 export 了。6. 把“养龙虾”变成可维护的工程配置走到这里你的 Node.js 项目里已经有一只可复现、可版本管理的“龙虾”了。Skills 目录跟着项目走config.toml 描述 Agent 行为TaoToken 统一 Key 让模型切换不影响业务代码。后续要加新能力只需要在 skills/ 下新建文件夹、写 skill.toml 和 run.js重启 OpenClaw 即可。如果你打算长期在编码和 Agent 场景里用这套组合可以看看 Coding Plan 的额度方案比按次调用更适合高频任务https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。接入文档里有更多 provider 配置示例和 Skills 规范https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。想先验证模型对话是否通用模型对话页面发一条消息最快https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。最后留一个实用技巧把 openclaw/config.toml 和 skills/ 一起提交到 Git但在 .gitignore 里排除 .env。新同事 clone 后只需要配一次 TAOTOKEN_API_KEY就能复现你本地完全一样的 Agent 行为。这比口头描述“我那个龙虾是怎么配的”靠谱得多。
返回列表