Appearance
OpenClaw Skill Workshop 是一个实验性插件,能让智能体把重复性流程、用户纠正、故障修复等保存为工作区技能(SKILL.md 文件)。默认禁用,需要你在 plugins.entries.skill-workshop 中显式启用;推荐先用 approvalPolicy: "pending" 模式排队提案,审核后再应用,避免自动写入不安全内容。用 openclaw plugins list --enabled 检查插件是否加载成功。
OpenClaw Skill Workshop 插件配置与启用说明
Skill Workshop 是 实验性 功能。默认禁用。捕获启发式逻辑和审核提示可能在版本间变更。自动写入应仅在可信工作区使用,并且建议先在 pending 模式下审核输出。
什么是 Skill Workshop
Skill Workshop 为工作区技能提供流程记忆(procedural memory)。它让智能体将可复用工作流、用户纠正、棘手的修复和常见陷阱保存为 <workspace>/skills/<skill-name>/SKILL.md 文件。
这与长期记忆不同:
- 记忆:存储事实、偏好、实体和历史上下文。
- 技能:存储智能体在 future 任务中应遵循的可复用流程。
- Skill Workshop:连接有用对话回合与持久化工作区技能的桥梁,包含安全检查与可选审批。
适用场景举例:
- 验证外部来源的动画 GIF 资源
- 替换截图资源并校验尺寸
- 运行特定仓库的 QA 场景
- 调试反复出现的 provider 故障
- 修复本地的陈旧工作流笔记
不适用于:
- 事实如“用户喜欢蓝色”
- 大段自传式记忆
- 原始对话转录存档
- 密钥、凭据或隐式提示文本
- 不会重复的一次性指令
默认状态
捆绑插件默认禁用,除非在 plugins.entries.skill-workshop 中显式启用。
插件 manifest 没有设置 enabledByDefault: true。插件配置 schema 中的 enabled: true 默认值只在插件条目已被选中且加载后才生效。
实验性意味着:
- 插件支持 opt-in 测试和 dogfooding
- 提案存储、审核阈值和捕获启发式逻辑可能演变
- pending 审批是推荐的起始模式
- auto apply 适用于可信的个人/工作区设置,而不是共享或大量不受信输入的环境
怎么启用 Skill Workshop
最小安全配置:
json5
{
plugins: {
entries: {
"skill-workshop": {
enabled: true,
config: {
autoCapture: true,
approvalPolicy: "pending",
reviewMode: "hybrid",
},
},
},
},
}此配置下:
skill_workshop工具可用- 显式的可复用纠正被排队为 pending 提案
- 基于阈值的审核器可通过审核 pass 提议技能更新
- 在应用 pending 提案前不会写入技能文件
仅在可信工作区使用自动写入:
json5
{
plugins: {
entries: {
"skill-workshop": {
enabled: true,
config: {
autoCapture: true,
approvalPolicy: "auto",
reviewMode: "hybrid",
},
},
},
},
}approvalPolicy: "auto" 仍会使用相同的扫描器和隔离路径。它不会应用含有严重发现的提案。
配置参数
| 配置键 | 默认值 | 取值范围 | 含义 |
|---|---|---|---|
enabled | true | boolean | 在插件条目加载后启用插件。 |
autoCapture | true | boolean | 启用成功智能体对话回合后的自动捕获/审核。 |
approvalPolicy | "pending" | "pending", "auto" | 排队提案或自动写入安全的提案。 |
reviewMode | "hybrid" | "off", "heuristic", "llm", "hybrid" | 选择显式纠正捕获、LLM 审核器、两者或关闭。 |
reviewInterval | 15 | 1..200 | 每隔多少次成功回合运行一次审核器。 |
reviewMinToolCalls | 8 | 1..500 | 在观察到多少次工具调用后运行审核器。 |
reviewTimeoutMs | 45000 | 5000..180000 | 嵌入审核器运行的超时时间(毫秒)。 |
maxPending | 50 | 1..200 | 每个工作区保留的最大 pending/已隔离提案数。 |
maxSkillBytes | 40000 | 1024..200000 | 生成的技能/支持文件的最大字节数。 |
推荐配置模板:
保守模式:仅显式使用工具,不自动捕获。
json5
{
autoCapture: false,
approvalPolicy: "pending",
reviewMode: "off",
}审核优先:自动捕获但需要审批。
json5
{
autoCapture: true,
approvalPolicy: "pending",
reviewMode: "hybrid",
}可信自动化:立即写入安全提案。
json5
{
autoCapture: true,
approvalPolicy: "auto",
reviewMode: "hybrid",
}低成本:不进行 LLM 审核调用,仅依赖显式纠正短语。
json5
{
autoCapture: true,
approvalPolicy: "pending",
reviewMode: "heuristic",
}捕获路径
Skill Workshop 有三种捕获路径。
工具建议
模型可以直接调用 skill_workshop,当它发现可复用流程或用户要求保存/更新技能时。这是最显式的路径,即使 autoCapture: false 也可用。
启发式捕获
当 autoCapture 启用且 reviewMode 为 heuristic 或 hybrid 时,插件扫描成功回合中的显式用户纠正短语:
下次(next time)从现在开始(from now on)记得要(remember to)确保(make sure to)总是……使用/检查/验证/记录/保存/偏好(always ... use/check/verify/record/save/prefer)偏好……时/代替/使用(prefer ... when/for/instead/use)当问到……(when asked)
启发式引擎从最新匹配的用户指令创建提案。它根据不同工作流使用主题提示选择技能名称:
- 动画 GIF 任务 →
animated-gif-workflow - 截图或资源任务 →
screenshot-asset-workflow - QA 或场景任务 →
qa-scenario-workflow - GitHub PR 任务 →
github-pr-workflow - 回退 →
learned-workflows
启发式捕获故意设计得很窄。它适用于清晰的纠正和可重复的过程记录,而不是对话摘要总结。
LLM 审核器
当 autoCapture 启用且 reviewMode 为 llm 或 hybrid 时,插件在达到阈值后运行一个小型嵌入审核器。
审核器接收:
- 最新的对话文本,截取后 12,000 字符
- 最多 12 个现有工作区技能
- 每个现有技能最多 2,000 字符
- 纯 JSON 指令
审核器没有工具:
disableTools: truetoolsAllow: []disableMessageTool: true
审核器返回 { "action": "none" } 或一个提案。action 字段是 create、append 或 replace —— 当已有相关技能时优先 append/replace;只有没有现有技能适用时才使用 create。
create 示例:
json
{
"action": "create",
"skillName": "media-asset-qa",
"title": "Media Asset QA",
"reason": "可复用的动画资源验收工作流",
"description": "验证外部来源的动画资源后再用于产品。",
"body": "## Workflow\n\n- 确认真正动画。\n- 记录来源归属。\n- 保存本地已批准副本。\n- 在最终回复前在产品 UI 中验证。"
}append 添加 section + body。replace 在指定技能中替换 oldText 为 newText。
提案生命周期
每个生成的更新都成为一个提案,包含:
idcreatedAtupdatedAtworkspaceDir- 可选
agentId - 可选
sessionId skillNametitlereasonsource:tool、agent_end或reviewerstatuschange- 可选
scanFindings - 可选
quarantineReason
提案状态:
pending—— 等待审批applied—— 已写入<workspace>/skillsrejected—— 被操作者/模型拒绝quarantined—— 因严重扫描发现被阻止
状态按工作区存储在 Gateway 状态目录下:
text
<stateDir>/skill-workshop/<workspace-hash>.jsonpending 和 quarantined 提案按技能名称和变更负载去重。存储保留最新的 pending/quarantined 提案,最多 maxPending 个。
工具参考
插件注册一个智能体工具:
text
skill_workshopstatus
统计指定工作区各状态的提案数量。
json
{ "action": "status" }返回值:
json
{
"workspaceDir": "/path/to/workspace",
"pending": 1,
"quarantined": 0,
"applied": 3,
"rejected": 0
}list_pending
列出 pending 提案。
json
{ "action": "list_pending" }列出其他状态:
json
{ "action": "list_pending", "status": "applied" }status 有效值:pending、applied、rejected、quarantined。
list_quarantine
列出 quarantined 提案。
json
{ "action": "list_quarantine" }当自动捕获似乎没反应,且日志中出现 skill-workshop: quarantined <skill> 时使用此命令。
inspect
按 id 获取提案详情。
json
{
"action": "inspect",
"id": "proposal-id"
}suggest
创建一个提案。approvalPolicy: "pending"(默认)时,提案将被排队而非直接写入。
json
{
"action": "suggest",
"skillName": "animated-gif-workflow",
"title": "Animated GIF Workflow",
"reason": "用户建立了可复用的 GIF 验证规则。",
"description": "使用动画 GIF 资源前先验证。",
"body": "## Workflow\n\n- 确认 URL 解析为 image/gif。\n- 确认文件有多帧。\n- 记录来源归属和许可证。\n- 如需本地资源避免热链接。"
}请求在 auto 模式下立即写入(apply: true):
json
{
"action": "suggest",
"apply": true,
"skillName": "animated-gif-workflow",
"description": "使用动画 GIF 资源前先验证。",
"body": "## Workflow\n\n- 确认真正动画。\n- 记录来源归属。"
}对于 approvalPolicy: "pending",apply: true 仍会排队提案。审核后再使用 apply 动作。
在 auto 策略下强制 pending(apply: false):
json
{
"action": "suggest",
"apply": false,
"skillName": "screenshot-asset-workflow",
"description": "截图替换工作流。",
"body": "## Workflow\n\n- 验证尺寸。\n- 优化 PNG。\n- 运行相关门控。"
}追加到指定 section:
json
{
"action": "suggest",
"skillName": "qa-scenario-workflow",
"section": "Workflow",
"description": "QA 场景工作流。",
"body": "- 对媒体 QA,验证生成的资源是否渲染并通过最终断言。"
}替换精确文本:
json
{
"action": "suggest",
"skillName": "github-pr-workflow",
"oldText": "- 检查 PR。",
"newText": "- 在作决定前检查未解决的审核线程、CI 状态、关联 Issue 和更改文件。"
}apply
应用一个 pending 提案。对于 approvalPolicy: "pending",此动作在写入工作区技能前会请求操作者审批。
json
{
"action": "apply",
"id": "proposal-id"
}apply 拒绝 quarantined 提案:
text
quarantined proposal cannot be appliedreject
标记一个提案为 rejected。
json
{
"action": "reject",
"id": "proposal-id"
}write_support_file
在现有或提案技能目录内写入一个支持文件。
允许的顶层支持目录:
references/templates/scripts/assets/
示例:
json
{
"action": "write_support_file",
"skillName": "release-workflow",
"relativePath": "references/checklist.md",
"body": "# Release Checklist\n\n- 运行发布文档。\n- 验证 Changelog。\n"
}支持文件是工作区作用域、路径检查、受 maxSkillBytes 字节限制、扫描后原子写入。
技能写入
Skill Workshop 只写入:
text
<workspace>/skills/<normalized-skill-name>/技能名称规范:
- 转小写
- 非
[a-z0-9_-]字符变为- - 去掉首尾非字母数字字符
- 最大长度 80 字符
- 最终名称必须匹配
[a-z0-9][a-z0-9_-]{1,79}
对于 create:
- 如果技能不存在,Skill Workshop 写入新的
SKILL.md - 如果已存在,Skill Workshop 将 body 追加到
## Workflow
对于 append:
- 如果技能存在,Skill Workshop 追加到指定 section
- 如果不存在,Skill Workshop 创建最小技能再追加
对于 replace:
- 技能必须已存在
oldText必须精确存在- 只替换第一个精确匹配
所有写入都是原子操作,并立即刷新内存中的技能快照,因此新技能或更新后的技能无需重启 Gateway 即可生效。
安全模型
Skill Workshop 在生成的 SKILL.md 内容和支持文件上运行安全扫描器。
严重发现会隔离提案:
| 规则 id | 阻止包含以下内容的提案 |
|---|---|
prompt-injection-ignore-instructions | 告诉智能体忽略之前的/更高级的指令 |
prompt-injection-system | 引用系统提示、开发者消息或隐藏指令 |
prompt-injection-tool | 鼓励绕过工具权限/审批 |
shell-pipe-to-shell | 包含 curl/wget 管道至 sh、bash 或 zsh |
secret-exfiltration | 将环境/进程环境数据发送到网络 |
警告发现会被保留,但不会单独阻止:
| 规则 id | 警告内容 |
|---|---|
destructive-delete | 广泛的 rm -rf 风格命令 |
unsafe-permissions | chmod 777 风格权限使用 |
被隔离的提案:
- 保留
scanFindings - 保留
quarantineReason - 出现在
list_quarantine中 - 不能通过
apply应用
要从隔离中恢复,创建一个安全的新提案,移除不安全内容。不要手动编辑存储 JSON。
提示词引导
启用后,Skill Workshop 会注入一段简短的提示词部分,告诉智能体使用 skill_workshop 作为持久流程记忆。
引导强调:
- 流程,而非事实/偏好
- 用户纠正
- 非显而易见的成功流程
- 反复出现的陷阱
- 陈旧/薄弱/错误的技能修复(通过 append/replace)
- 长时间工具循环或艰难修复后保存可复用流程
- 简短直白的技能文本
- 不转储对话记录
写入模式文本随 approvalPolicy 变化:
- pending 模式:排队建议;在显式审批后使用
apply - auto 模式:自动应用安全工作区技能更新,除非
apply: false改为排队
成本与运行时行为
启发式捕获不调用模型。
LLM 审核使用活动/默认智能体模型运行嵌入审核。它是基于阈值的,因此默认不会在每个回合都运行。
审核器:
- 在可用时使用相同配置的 provider/model 上下文
- 回退到运行时智能体默认值
- 有
reviewTimeoutMs - 使用轻量级引导上下文
- 没有工具
- 不直接写入任何内容
- 只能发出一个提案,该提案会经过正常的扫描器和审批/隔离路径
如果审核器失败、超时或返回无效 JSON,插件会记录一条警告/调试信息并跳过本次审核 pass。
使用模式
当用户说出以下内容时使用 Skill Workshop:
- “下次,做 X”
- “从现在开始偏好 Y”
- “确保验证 Z”
- “把这个保存为工作流”
- “这花了不少时间;记住这个过程”
- “更新本地技能”
好的技能文本:
markdown
## Workflow
- 确认 GIF URL 解析为 `image/gif`。
- 确认文件有多帧。
- 记录来源 URL、许可证和归属。
- 当资源会随产品发布时保存本地副本。
- 在最终回复前验证本地资源在目标 UI 中正常渲染。差的技能文本:
markdown
用户问了一个 GIF,我搜索了两个网站。然后其中一个被 Cloudflare 屏蔽了。最终回答说要检查归属。差的版本不应被保存的原因:
- 像对话记录
- 不是指令形式
- 包含噪声的一次性细节
- 没有告诉下一个智能体该做什么
调试
检查插件是否已加载:
bash
openclaw plugins list --enabled从智能体/工具上下文检查提案数量:
json
{ "action": "status" }检查 pending 提案:
json
{ "action": "list_pending" }检查被隔离的提案:
json
{ "action": "list_quarantine" }常见症状:
| 症状 | 可能原因 | 检查方法 |
|---|---|---|
| 工具不可用 | 插件条目未启用 | plugins.entries.skill-workshop.enabled 和 openclaw plugins list |
| 没有自动提案出现 | autoCapture: false、reviewMode: "off" 或阈值未达到 | 配置文件、提案状态、Gateway 日志 |
| 启发式未捕获 | 用户措辞未匹配纠正模式 | 使用显式的 skill_workshop.suggest 或启用 LLM 审核器 |
| 审核器未创建提案 | 审核器返回 none、无效 JSON 或超时 | Gateway 日志、reviewTimeoutMs、阈值 |
| 提案未应用 | approvalPolicy: "pending" | list_pending,然后 apply |
| 提案从 pending 消失 | 重复提案被复用、max pending 裁剪、或已被应用/拒绝/隔离 | status、带状态过滤的 list_pending、list_quarantine |
| 技能文件存在但模型未使用 | 技能快照未刷新或技能门控排除了它 | openclaw skills 状态和工作区技能资格 |
相关日志:
skill-workshop: queued <skill>skill-workshop: applied <skill>skill-workshop: quarantined <skill>skill-workshop: heuristic capture skipped: ...skill-workshop: reviewer skipped: ...skill-workshop: reviewer found no update
QA 场景
仓库中的 QA 场景:
qa/scenarios/plugins/skill-workshop-animated-gif-autocreate.mdqa/scenarios/plugins/skill-workshop-pending-approval.mdqa/scenarios/plugins/skill-workshop-reviewer-autonomous.md
运行确定性覆盖测试:
bash
pnpm openclaw qa suite \
--scenario skill-workshop-animated-gif-autocreate \
--scenario skill-workshop-pending-approval \
--concurrency 1运行审核器覆盖测试:
bash
pnpm openclaw qa suite \
--scenario skill-workshop-reviewer-autonomous \
--concurrency 1审核器场景特意分开,因为它启用了 reviewMode: "llm" 并运行嵌入审核 pass。
什么时候不该启用自动应用
在以下情况下避免使用 approvalPolicy: "auto":
- 工作区包含敏感流程
- 智能体正在处理不受信输入
- 技能跨团队共享
- 仍在调整提示词或扫描器规则
- 模型频繁处理恶意网页/邮件内容
先使用 pending 模式。在审查了智能体在该工作区提议的技能种类后,再切换到 auto 模式。
相关文档
常见问题
为什么 skill_workshop 工具不可用?
工具不可用的最常见原因是插件条目未启用。检查配置中 plugins.entries.skill-workshop.enabled 是否为 true,并运行 openclaw plugins list --enabled 确认插件已加载。如果插件列表中没有 skill-workshop,请重新检查配置文件并重启 Gateway。
自动提案没有出现,怎么办?
首先确认 autoCapture 为 true 且 reviewMode 不是 "off"。如果使用启发式捕获,检查用户话语是否包含 next time、from now on、remember to、make sure to 等短语(中文场景下这些短语可能不自动触发,建议直接用 skill_workshop.suggest 显式提交)。如果使用 LLM 审核器,检查 reviewInterval 和 reviewMinToolCalls 阈值是否达到,并查看 Gateway 日志中是否有 skill-workshop: reviewer skipped: ... 或 skill-workshop: heuristic capture skipped: ... 信息。
提案被隔离(quarantined)怎么处理?
被隔离的提案无法通过 apply 应用。运行 skill_workshop 工具的 list_quarantine 动作查看被隔离的提案及其 scanFindings。常见原因包括包含提示注入、shell 管道或秘密泄露。创建一个新的安全提案,移除不安全内容,然后要么在 pending 模式下提交并等待审核,要么在 auto 模式下直接写入。不要手动编辑存储 JSON 文件。