ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

别再给AI塞提示词了:用SKILL.md给OpenClaw的Agent装上web_fetch技能

别再给AI塞提示词了:用SKILL.md给OpenClaw的Agent装上web_fetch技能 1. 从“提示词越写越长”到“能力按需加载”如果你最近在折腾 OpenClaw 的 Agent大概率经历过这个阶段为了让 Agent 能抓网页、能读文档、能调接口你把一大段一大段的提示词往 system prompt 里塞塞到最后自己都记不清哪条规则对应哪个能力。结果是模型启动变慢、token 成本飙升最要命的是——工具一多它反而开始“选错工具”明明该抓网页却去调了搜索明明该读本地文件却发起了一个 HTTP 请求。这不是模型变笨了而是上下文被稀释了。OpenClaw 给出的解法是 Skill 体系把能力从“提示词堆叠”里抽出来写成一个个独立的SKILL.md系统启动时只加载极简索引等用户输入真正匹配到某个场景才把对应 Skill 的完整定义加载进来。这就是所谓的渐进式披露。这篇就以web_fetch这个最常用的技能为例带你走一遍完整流程写一个可复制的SKILL.md骨架、用 TaoToken 统一 Key 和 API 通道、让 Agent 真正调用web_fetch并验证输出。适合已经跑通 OpenClaw 基础对话、想让 Agent 能力边界再扩一圈的开发者。全程不需要你重写 Agent 内核改的是一个 Markdown 文件加一段配置。2. TaoToken 前置一把 Key 打通模型与 Skill 调用在写 Skill 之前先把模型通道理顺。OpenClaw 的 Agent 在触发 Skill 时往往需要模型做一次“意图判断 参数抽取”这背后是一次真实的模型请求。如果每个 Skill 都配一套 Key维护成本会失控。我的做法是统一走 TaoToken 的 API 通道一个 Key 覆盖对话、编码、Agent 场景。先到控制台创建 Key地址是https://taotoken.net/console登录后在 API Keys 页面新建一个复制出来形如sk-xxxx的字符串。注意这个 Key 只在创建时完整显示一次先存到本地环境变量里别直接写进代码。export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/apiTaoToken 的接口是 OpenAI 兼容格式所以 OpenClaw 里凡是填base_url和api_key的地方都指向上面这两个值即可。如果你用的是 Claude Code 或 Anthropic 风格的调用接入地址在https://taotoken.net/api下同样有对应端点文档在https://taotoken.net/doc里写得很清楚这里不展开。注意Key 不要提交到 Git也不要在SKILL.md里硬编码。Skill 文件是会被 Agent 读取甚至分享给团队成员的把密钥写进去等于公开。配好之后建议先用模型对话页面做一次连通性验证地址https://taotoken.net/model-chat随便发一句“你好”能正常返回就说明 Key 和通道没问题。这一步别跳过后面 Skill 调用失败时你能快速判断是模型通道的问题还是 Skill 本身的问题。3. 可复制配置web_fetch 的 SKILL.md 骨架OpenClaw 的 Skill 目录一般放在项目根下的skills/里每个 Skill 一个子目录核心文件就是SKILL.md。文件名固定Agent 靠它识别。下面是我实测可用的web_fetch骨架你可以直接复制改掉里面的 URL 白名单和超时参数。--- name: web_fetch description: 抓取指定 URL 的网页内容并提取正文适用于需要读取在线文章、文档、公告的场景。当用户提供 http/https 链接并希望总结、翻译或提取信息时使用。 version: 1.0.0 triggers: - 抓取 - 读取这个链接 - 帮我看看这个网页 - 总结这篇文章 --- # web_fetch ## 能力说明 给定一个 http 或 https 链接发起 GET 请求返回页面正文的纯文本。 仅处理静态 HTML 或服务端渲染页面不执行 JavaScript。 ## 输入参数 - url必填目标网页地址必须以 http:// 或 https:// 开头 - max_chars可选默认 8000返回正文的最大字符数超出截断 ## 执行流程 1. 校验 url 协议非 http/https 直接拒绝 2. 检查域名是否在允许列表内不在则提示用户确认 3. 发起请求超时 15 秒携带常规浏览器 User-Agent 4. 解析 HTML剥离 script/style 标签提取正文文本 5. 按 max_chars 截断后返回 ## 边界与限制 - 不处理需要登录、Cookie 鉴权或 JS 动态渲染的页面 - 遇到 403/401 时明确告知用户“该页面需要鉴权web_fetch 无法读取” - 不跟随跨域重定向超过 3 次 ## 失败处理 - 超时提示“目标站点响应超时请稍后重试或换用其他方式” - 正文为空提示“页面正文可能由 JS 渲染web_fetch 无法提取”这个骨架的关键在于description和triggers。description是给模型看的决定它什么时候想起这个 Skilltriggers是给索引层用的命中才加载完整定义。很多人 Skill 写了但 Agent 不调用八成是description写得太泛比如只写“抓网页”模型判断不出和内置搜索的区别。web_fetch的定位要卡死它只做“已知 URL 的静态抓取”。搜索、动态渲染、鉴权页面都不归它管。边界写清楚模型才不会乱用。4. 验证请求让 Agent 真正调用 web_fetch配置写完了得验证它真的被调用。启动 OpenClaw 后在对话里丢一个静态页面的链接比如某个技术博客的文章地址然后说“帮我抓取这个链接的正文”。预期行为是这样的Agent 先做意图判断命中web_fetch的 triggers加载完整 Skill 定义抽取url参数然后执行。你会在日志或工具调用面板里看到类似这样的记录{ skill: web_fetch, params: { url: https://example.com/blog/post-1, max_chars: 8000 }, status: success, chars_returned: 6421 }如果返回的正文是干净的段落文本没有div标签残留说明 HTML 剥离逻辑生效了。这时候你可以再补一句“用三句话总结”Agent 会基于刚抓到的正文继续推理而不是重新抓一遍——因为正文已经进了当前上下文。再测一个边界场景丢一个需要登录的页面链接。预期是 Agent 明确回复“该页面需要鉴权web_fetch 无法读取”而不是返回一堆登录页的导航文字。这个负向验证比正向验证更重要它证明你的边界声明被模型正确理解了。提示如果你在验证时发现 Agent 没调用 Skill 而是直接凭记忆回答先检查triggers是否命中再检查 Skill 目录是否被 OpenClaw 正确扫描。可以在启动日志里搜skill loaded确认。5. 本篇常见错排查Skill 不触发Agent 直接回答。最常见的原因是description和用户输入语义距离太远。比如用户说“这个链接讲了啥”而你的 description 写的是“执行 HTTP 请求获取资源”。把 description 改成贴近用户口语的描述比如“读取在线文章内容”命中率会明显上升。触发了但报 403。目标站点识别出请求不是浏览器。检查你的 User-Agent 是否被改成了默认的 Python 请求头。在 Skill 的执行流程里显式指定一个常规浏览器 UA能解决大部分 403。返回正文为空或只有导航文字。这是典型的 JS 渲染页面web_fetch拿到的只是 HTML 骨架。这时候不要硬改web_fetch去执行 JS那会让 Skill 变重。正确做法是另写一个 Skill比如基于浏览器快照的方案让两个 Skill 各管各的边界。Key 报 401 或额度异常。先确认环境变量有没有被正确读取再确认 Key 没有过期。如果是在 CI 或容器里跑注意环境变量不会自动继承。TaoToken 的用量和额度可以在控制台实时看排查时先看那里。Skill 加载了但参数抽取错误。比如把max_chars抽成了字符串8000。在SKILL.md的参数说明里明确写“整数”并在执行流程第一步做类型转换能避免这类问题。6. 把能力沉淀成文件而不是记忆回到开头那个问题为什么别再给 AI 塞提示词了因为提示词是易失的、不可复用的、每次对话都要重新讲一遍的。而SKILL.md是文件它能进版本控制、能被团队共享、能在下次遇到同样场景时被直接加载。web_fetch只是一个起点。你可以照着这个骨架把“读本地 CSV”“调内部 API”“生成周报”都写成独立 Skill。每个 Skill 只解决一类问题边界清晰触发条件明确。Agent 不再是一个什么都懂一点但什么都不稳的“通才”而是一个知道在什么场景下调用什么能力的调度器。模型通道这边统一用 TaoToken 的 Key 和 API 地址省去多套凭证的麻烦。需要长期跑编码和 Agent 任务的可以看看 Coding Plan 的额度方案只是验证模型连通性的模型对话页面就够用。接入细节和参数说明都在文档里遇到报错先翻文档再排查比盲目改配置快得多。
返回列表