TauriTavern/docs/Agent/Skill.md
Darkatse 8abb2b3bc7 docs(skills): streamline import guidance and cleanup contract
Keep recursive discovery and batch cleanup responsibilities in the existing Skill documentation. Remove duplicated workflow and implementation details.
2026-09-15 20:25:22 -04:00

6 KiB
Raw Permalink Blame History

Skill

Skill 是按需读取的本地知识包。SKILL.md 说明它适合什么任务、如何使用,其他文件保存参考材料、示例和脚本。

创建一个 Skill

scene-review/
  SKILL.md
  references/checklist.md
  scripts/list-scenes.js

最小的 SKILL.md:

---
name: scene-review
description: 检查场景中的人物动机与叙事衔接。
---

阅读 references/checklist.md,按其中的问题检查草稿。
将具体修改建议写入 summaries/review.md,并引用对应段落。

包名使用小写字母、数字、- 或 _。其他目录按内容需要添加;有脚本时,在 SKILL.md 中说明用途、参数和返回值。

安装与作用域

Skill Manager 可从目录或 ZIP 递归发现 Skill,逐项预览和安装;支持一次选择多个来源。角色卡和预设也可以携带 Skill。导出得到包含原始文件的 ZIP。

Skill 可以属于全局、预设、Profile 或角色。运行时按 global → preset → profile → character 解析,同名 Skill 由靠后的作用域覆盖,再按 Profile 的 skills.visible 和 deny 筛选。

子 Agent 使用目标 Profile 的 Skill 配置;角色与当前预设等环境信息来自 Run 冻结的输入。这样同一名称可以在某个角色或 Profile 中提供更具体的工作方法。

在运行中使用

模型先通过 skill.list 查看索引,使用 skill.read 阅读正文,或用 skill.search 查找片段。读取支持行范围,长文返回预览和续读位置。

普通 Skill 文本会展开本次输入冻结的宏,脚本源码保持原文。已安装文件供模型读取,需要摘录或修改的内容写入工作区。模型显式调用 skill.run_script 时才会执行包内脚本。

宿主侧的管理接口是 api.skill,包括预览、安装、编辑、移动、导出与删除,见 Skill API。

运行脚本

scripts/ 中的 JavaScript 可以处理文件、计算或生成材料。例如 scripts/list-scenes.js:

import { workspace } from '@tauritavern/runtime';

export default function ({ path }) {
  const text = workspace.readText(path);
  const scenes = text.split('\n').filter(line => line.startsWith('## '));
  workspace.writeText('summaries/scenes.md', scenes.join('\n'));
  return { count: scenes.length, path: 'summaries/scenes.md' };
}

模型通过 skill.run_script 调用:

{
  "skill": "scene-review",
  "script": "list-scenes",
  "args": { "path": "output/main.md" }
}

script 对应 scripts/<name>.js,名称使用小写字母、数字和连字符。入口导出 default(args) 或 main(args),同时存在时使用 default。返回值为可序列化的 JSON;没有内容时返回 null,较大正文写入文件并返回路径。

可用能力

每次调用在独立 QuickJS 环境中执行,宿主能力从 @tauritavern/runtime 导入。标准 JavaScript 和脚本内部可完成的 async / await 可用;环境不提供网络、进程、Node、DOM 或定时器 API。

接口 用途
workspace.readText(path) 读取 UTF-8 文件,返回字符串
workspace.writeText(path, text) 写入文件,自动创建父目录
workspace.listFiles(path?) 无参数时列出可见顶层条目;指定目录时返回相对于该目录的文件路径
workspace.exists(path) 查询文件或目录,可见范围外返回 false
context.worldInfo.entries Run 启动时激活的世界书
context.variables.local / global 保留原始 JSON 类型的 SillyTavern 变量
context.macro 冻结的名称、角色、聊天位置等宏数据
macros.render(text) 使用冻结值展开模板中的宏
log.info(text) / warn / error / debug 将字符串写入宿主日志

路径相对于 Run 工作区,读写范围来自 Invocation 的 Profile。脚本在调用时的文件快照上工作,同一路径多次写入保留最后的内容;执行成功后按快照 SHA 写回。并发修改会报告冲突,多文件写入中途失败时会列出已写入的文件。

context 是当前执行的副本,修改它不会写回宿主。macros.render() 只展开一层,未知语法保持原文,\{{char}} 得到字面量 {{char}};支持的宏与查询见 frozen_macros。

模块与工具箱

相对导入可以引用同一 Skill 的 scripts/**/*.js,例如 import { format } from './helpers.js'。常用库已随应用提供:

模块 用途
@tauritavern/kit/dayjs 日期处理
@tauritavern/kit/es-toolkit 数组、对象和字符串处理
@tauritavern/kit/fast-xml-parser XML 解析、校验与构建
@tauritavern/kit/marked Markdown 转 HTML
@tauritavern/kit/papaparse CSV 解析与生成
@tauritavern/kit/slugify 生成适合路径或标识符的文本

这些库保留各自的 API,功能仍受 QuickJS 环境限制。其他库可打包成 ESM 放入 scripts/vendor/,通过相对路径导入。

脚本每次执行限时 30 秒,内存 32 MiB,返回值 256 KiB。模块和输入输出的具体预算见下方引擎源码。

源码

Skill 保存在 _tauritavern/skills/,按作用域组织安装目录,索引位于 index/skills.json。