资讯动态

第04篇:技能(Skill)系统 —— 用 Rhai 脚本扩展 AI 能力,TaoToken 统一 Key 接入实践

发布时间:2026/10/2 12:32:37 来源:尧图企业网站定制
1. 为什么需要 Skill 系统从单步工具到多步流程很多人第一次接触 AI Agent 的时候会觉得“工具调用”已经很厉害了模型能读文件、能搜网页、能发请求似乎什么都能干。但真正把它放到日常任务里你会发现一个尴尬的事实——单步工具解决不了复合任务。举个我自己踩过的例子。我想让 AI 帮我盯一只股票每隔十分钟查一次价格跌破某个阈值就发通知同时把每次查询结果写进日志。如果只靠工具我得让模型自己规划先调行情接口再判断数值再决定要不要发消息最后再写文件。每一步都要模型“想一遍”中间任何一步格式跑偏整条链路就断了。更麻烦的是这种任务需要重复执行每次都让模型重新推理既慢又不稳定。这就是 Skill技能系统要解决的问题。技能 把多个工具调用封装成可复用的确定性流程。它和工具的关系有点像“函数”和“语句”工具是原子操作技能是有逻辑、有分支、有错误处理的复合体。一个技能通常由三部分组成分工非常清晰文件作用谁来读meta.yaml触发词、描述、权限声明系统做匹配和鉴权SKILL.md操作规范、参数说明、示例LLM当上下文注入SKILL.rhai确定性编排逻辑Rhai 引擎真正执行这个设计最妙的地方在于LLM 的行为可以通过改 Markdown 来调整不需要重新训练模型。你想让技能多支持一种股票市场改 SKILL.md 里的表格就行你想改阈值判断逻辑改 SKILL.rhai 就行。灵活性和可控性同时拿到了。而 Rhai 脚本在这里扮演的是“确定性执行层”的角色。它是一个嵌入式脚本语言语法接近 JavaScript 和 Rust 的混合体专为嵌入 Rust 程序设计。你不需要懂 Rust只要会写let、if、for就能写出可用的技能脚本。对于没有编程经验的人来说它的上手门槛比 Python 还低——没有缩进陷阱没有复杂的包管理一个文件就是一个技能。接下来的内容我会带你从零跑通一条完整链路写一个 Rhai 技能脚本用 TaoToken 统一 Key 接入模型调用然后验证技能能被正确触发执行。全程可复制不需要你提前配好一堆环境。2. TaoToken 前置准备统一 Key 与 API 通道在写脚本之前得先把模型调用的通道打通。技能系统本身负责编排逻辑但真正“动脑子”的部分——比如理解用户意图、生成 SKILL.md 里的操作规范、在脚本里做语义判断——还是需要调用大模型。如果每个技能都单独配一套 Key管理起来会非常痛苦。TaoToken 在这里的作用就是统一 Key 和 API 通道。你只需要一个 Key就能通过同一个 Base URL 访问多种模型技能脚本里不用关心具体走的是哪家模型换模型也不用改脚本。先拿到 Key。打开控制台地址https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentskill_rhaiutm_campaignrewrite登录后进入 API Keys 页面创建一个新 Keyhttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentskill_rhaiutm_campaignrewrite创建时建议给 Key 起一个能识别的名字比如skill-rhai-demo方便后面排查问题时定位。Key 只在创建时完整显示一次复制后先存到安全的地方。接下来是接入配置。TaoToken 的 API 入口是https://taotoken.net/api注意这个地址不带任何查询参数是纯粹的 API 端点。如果你用的是 OpenAI 兼容的 SDK 或者工具配置通常长这样{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: claude-sonnet-4-20250514 }如果你用的是 Claude Code 这类工具配置会写在 settings 文件里。以~/.claude/settings.json为例{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key, ANTHROPIC_MODEL: claude-sonnet-4-20250514 } }这里有个细节要注意Base URL 和 Key 必须配套。如果你只改了 Key 没改 Base URL请求会打到默认端点然后报 401反过来只改 Base URL 没换 Key同样会认证失败。我见过不少人在这两个地方来回折腾其实只要记住“三件套一起改”就行Base URL、Key、Model ID。Model ID 的写法要和你实际使用的模型对应。TaoToken 支持多种模型具体可用的 Model ID 可以在模型对话页面查看https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentskill_rhaiutm_campaignrewrite配置完成后先别急着写技能脚本用一条最简单的请求验证通道是否通。可以用 curlcurl https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer sk-你的Key \ -d { model: claude-sonnet-4-20250514, messages: [{role: user, content: 回复 OK 两个字母}], max_tokens: 10 }如果返回的 JSON 里有正常的choices字段说明通道没问题。如果报错先看错误码401 是 Key 问题404 是 Base URL 或路径问题429 是额度或频率问题。这一步验证通过后再进入技能脚本的编写能省掉很多“到底是脚本问题还是通道问题”的排查时间。3. 可复制配置Rhai 技能脚本模板与接入片段现在进入核心部分。我会给出一个完整的技能目录结构以及三个文件的可复制内容。你可以直接照着建目录、贴文件然后跑起来。先建目录。假设你的工作目录是~/.blockcell/workspace/skills/创建一个叫stock_monitor的技能mkdir -p ~/.blockcell/workspace/skills/stock_monitor cd ~/.blockcell/workspace/skills/stock_monitor第一个文件meta.yaml这个文件负责触发词匹配和权限声明。系统会根据用户输入去匹配triggers里的关键词命中后加载这个技能。name: stock_monitor description: A股/港股/美股实时行情监控与分析 version: 1.0.0 triggers: - 查股票 - 股价 - 行情 - 监控股票 - stock price permissions: - network - storagepermissions里声明network是因为脚本要调行情接口声明storage是因为要把结果写日志。权限声明不是摆设如果脚本里调用了未声明的能力执行时会被拦截。第二个文件SKILL.md这是给 LLM 看的操作手册。它不是给人读的文档而是注入到模型上下文里的“行为规范”。写法上要尽量结构化用表格和步骤降低模型的歧义。# 股票监控技能操作手册 ## 数据源速查 | 市场 | 代码格式 | 工具调用 | |------|---------|---------| | A股沪市 | 6位数字如 600519 | finance_api stock_quote sourceeastmoney | | A股深市 | 6位数字如 000001 | finance_api stock_quote sourceeastmoney | | 港股 | 5位数字如 00700 | finance_api stock_quote sourceeastmoney | | 美股 | 字母代码如 AAPL | finance_api stock_quote | ## 常见股票代码 - 贵州茅台: 600519 - 中国平安: 601318 - 腾讯控股: 00700港股 - 苹果: AAPL ## 场景一查询实时股价 步骤 1. 调用 finance_apiactionstock_quotesymbol股票代码 2. 返回价格、涨跌幅、成交量、市盈率 ## 场景二查询历史走势 步骤 1. 调用 finance_apiactionstock_historysymbol股票代码period1mo 2. 可选调用 chart_generate 画折线图 ## 错误处理 如果 finance_api 返回错误降级使用 web_search 搜索 {symbol} 股价 今日。第三个文件SKILL.rhai这是真正执行的编排脚本。Rhai 的语法很轻下面这个模板包含了参数校验、工具调用、错误降级和结果格式化四个环节。// SKILL.rhai 示例股票监控 // 获取用户输入的股票代码 let symbol ctx[symbol]; if symbol { set_output(请提供股票代码例如600519茅台); return; } // 查询实时行情 let quote_result call_tool(finance_api, #{ action: stock_quote, symbol: symbol }); if is_error(quote_result) { // 降级尝试用 web_search 搜索 log_warn(finance_api 失败尝试 web_search); let search_result call_tool(web_search, #{ query: ${symbol} 股价 今日 }); set_output(search_result); return; } // 格式化输出 let price get_field(quote_result, price); let change get_field(quote_result, change_pct); set_output(${symbol} 当前价格${price}涨跌幅${change}%);几个关键点解释一下。ctx是系统传入的上下文里面装着用户提供的参数。call_tool是调用内置工具的入口第二个参数是一个 Map写法是#{ key: value }。is_error判断调用是否失败get_field从返回结果里取字段。set_output把最终结果返回给用户。如果你想让技能在跌幅超过阈值时发通知可以加一段判断let threshold ctx[threshold] ?? 3.0; let change get_field(quote_result, change_pct); if change -threshold { call_tool(notification, #{ channel: telegram, message: ${symbol} 跌幅 ${change}%超过阈值 ${threshold}% }); }??是空值合并运算符如果ctx[threshold]不存在就用默认值 3.0。这个写法在 Rhai 里很常用能避免参数缺失导致的报错。接入配置片段技能脚本里如果需要调用模型做语义判断可以在脚本里通过 HTTP 工具请求 TaoToken。配置片段如下let llm_result call_tool(http_request, #{ url: https://taotoken.net/api/v1/chat/completions, method: POST, headers: #{ Content-Type: application/json, Authorization: Bearer sk-你的Key }, body: #{ model: claude-sonnet-4-20250514, messages: [ #{ role: user, content: 判断这句话的情绪今天大盘暴跌 } ] } });注意这里的Authorization头是Bearer sk-你的KeyBase URL 用的是https://taotoken.net/api。如果你把 Key 直接写在脚本里记得不要把这个技能目录提交到公开仓库。更安全的做法是把 Key 放在环境变量里脚本里用env(TAOTOKEN_KEY)读取。4. 验证请求从注册技能到触发执行文件都建好之后需要验证技能能被正确加载和触发。这一步分三个动作注册、触发、看结果。动作一注册技能技能目录放在~/.blockcell/workspace/skills/下系统启动时会自动扫描。如果你是在运行中创建的可以通过对话让 AI 重新加载帮我重新加载技能目录系统会扫描 skills 目录把meta.yaml里的触发词注册到匹配表里。加载成功后通常会看到类似这样的日志[skill] loaded: stock_monitor (triggers: 查股票, 股价, 行情, 监控股票, stock price)如果没看到日志先检查目录结构对不对。meta.yaml、SKILL.md、SKILL.rhai三个文件必须在同一个目录下目录名就是技能名。文件名大小写也要注意SKILL.rhai不能写成skill.rhai。动作二触发技能在对话里输入包含触发词的内容帮我查一下茅台的股价系统会匹配到stock_monitor技能然后把SKILL.md注入到 LLM 上下文同时把用户输入里的参数提取出来传给SKILL.rhai。Rhai 引擎执行脚本调用finance_api工具拿到结果后格式化输出。动作三看结果如果一切正常你会看到类似这样的返回600519 当前价格1680.50涨跌幅-1.23%如果行情接口失败脚本会走降级逻辑用web_search搜索返回搜索结果。如果连搜索也失败会返回错误信息。你可以通过日志确认走了哪条路径[skill] stock_monitor executed, toolfinance_api, statusok验证模型调用通道如果你的技能脚本里包含了对 TaoToken 的模型调用可以用一条独立的请求先验证通道。打开模型对话页面https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentskill_rhaiutm_campaignrewrite在对话框里输入“回复 OK”如果能正常返回说明 Key 和 Base URL 配置正确。这一步和技能脚本里的调用是同一个通道通道通了脚本里的请求就不会因为认证问题失败。热重载验证技能系统支持热重载。你修改SKILL.rhai后不需要重启整个系统。比如把阈值从 3% 改成 5%let threshold ctx[threshold] ?? 5.0;保存文件后系统会检测到变化并重新加载。日志里会看到[skill] reloaded: stock_monitor这个功能在开发调试阶段特别有用。你可以一边改脚本一边触发不用反复重启。一个完整的验证清单检查项预期结果不通过时看哪里技能目录存在三个文件齐全目录名和文件名大小写meta.yaml 可解析触发词注册成功YAML 缩进和引号SKILL.rhai 无语法错误加载时不报错Rhai 语法特别是 Map 写法触发词能匹配输入后技能被调用triggers 列表是否包含关键词工具调用成功返回行情数据权限声明和工具名模型通道正常返回 OKBase URL、Key、Model ID这张表建议存下来后面遇到问题按行排查比盲目试错快得多。5. 常见错误排查401、local proxy failed、reading choices、OAuth技能系统跑起来之后最容易出问题的不是脚本逻辑而是接入层。下面这几个报错我见过太多次逐个拆解。报错一401 Unauthorized{error: {message: Invalid API key, type: authentication_error}}这个最直接Key 不对。可能的原因有三个Key 复制时少了字符、Key 已经被删除或重置、Key 和 Base URL 不匹配。排查顺序是先去 API Keys 页面确认 Key 还在然后重新复制一次确保没有多余空格。如果用的是环境变量检查变量名有没有拼错。echo $ANTHROPIC_API_KEY如果输出为空说明环境变量没生效。在 settings.json 里配置的话注意 JSON 格式末尾不能有多余逗号。报错二local proxy failedError: local proxy failed: connection refused这个报错通常出现在你本地配了代理但代理服务没启动或者端口不对。技能脚本里的 HTTP 请求会走系统代理设置如果代理挂了请求就发不出去。排查方法是先确认代理服务状态或者临时把代理关掉直接用直连测试。如果你在 settings.json 里配了HTTP_PROXY或HTTPS_PROXY先注释掉再试。TaoToken 的 API 入口是公网地址不需要额外代理就能访问。报错三reading choicesError: reading choices - undefined这个报错说明请求发出去了也拿到了响应但响应结构里没有choices字段。常见原因是 Base URL 写错了比如写成了https://taotoken.net而不是https://taotoken.net/api或者路径少了/v1。另一个可能是 Model ID 写错了服务端返回了一个错误对象而不是正常的 completion 结构。排查方法是用 curl 直接打一次看返回的原始 JSONcurl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d {model:claude-sonnet-4-20250514,messages:[{role:user,content:hi}]}如果返回里有error字段按错误信息处理。如果没有choices也没有error检查 Model ID 是否在支持列表里。报错四OAuth 相关错误Error: OAuth token expired如果你用的是 Claude Code 这类带 OAuth 流程的工具可能会遇到 token 过期。这时候需要重新走一次授权或者改用 API Key 方式接入。用 TaoToken 的 Key 接入时配置里应该用ANTHROPIC_API_KEY而不是 OAuth token。两者不要混用混用会导致认证冲突。三件套检查法不管是哪个报错先检查三件套是否一致配置项正确写法常见错误Base URLhttps://taotoken.net/api少了/api或多了/v1API Keysk-开头完整字符串复制不完整、有多余空格Model ID与支持列表一致拼写错误、用了不支持的模型如果三件套都对再看网络和权限。技能脚本里的permissions声明了network才能发请求没声明会被拦截。这个拦截报错通常会说permission denied和认证错误区分开。一个容易忽略的点技能热重载之后如果脚本里有语法错误系统可能不会立即报错而是在触发时才报。所以改完脚本后最好手动触发一次确认没有运行时错误。Rhai 的错误信息会指出行号按行号定位很快。6. 语义一致 CTA把技能接入你的工作流技能系统跑通之后下一步就是把它接到你日常的工作流里。这里给几个方向按需选择。如果你主要是在做排障和接入建议先把 API Keys 和接入文档过一遍确保通道稳定https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentskill_rhaiutm_campaignrewrite接入文档里有各种语言和工具的配置示例包括 Claude Code、Cline、Codex 等https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentskill_rhaiutm_campaignrewrite如果你只是想验证模型是否可用直接打开模型对话页面输入一句话就能测https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentskill_rhaiutm_campaignrewrite如果你打算长期用技能做编码或 Agent 任务Coding Plan 会更合适额度和稳定性都更适合持续调用https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentskill_rhaiutm_campaignrewrite回到技能本身。Rhai 脚本的扩展能力不止于股票监控。你可以把任何重复性的多步流程封装成技能每天早上汇总日程、监控某个网页变化、批量处理文件、定时抓取数据。核心思路是一样的meta.yaml定义触发条件SKILL.md给模型操作规范SKILL.rhai写确定性逻辑。我自己的习惯是先把流程用 Rhai 写死跑通之后再考虑要不要让模型介入做语义判断。确定性逻辑交给脚本模糊判断交给模型两者分工明确整个链路就稳了。技能目录建议用 git 管理但记得把 Key 放在环境变量里不要提交到仓库。最后留一个实用技巧调试 Rhai 脚本时多用log_warn和set_output打中间结果。Rhai 没有断点调试但日志足够定位问题。把中间变量输出出来比盯着报错猜要快得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑