# 好的描述示例description:"iFlytek Ultra-Realistic TTS (超拟人语音合成) — synthesize natural, expressive speech from text using iFlytek's ultra-realistic voice synthesis API. Supports 50+ voices (male/female/child, Chinese/English/dialect), adjustable speed/volume/pitch, mp3/pcm/opus output. Use when the user wants to convert text to speech, generate audio narration, or create voice content."# 不好的描述示例description:"TTS skill for voice synthesis"# 太简略,缺少触发场景
---name:weatherdescription:"Get current weather and forecasts via wttr.in or Open-Meteo. Use when: user asks about weather, temperature, or forecasts for any location. NOT for: historical weather data, severe weather alerts, or detailed meteorological analysis. No API key needed."homepage:https://wttr.in/:helpmetadata:openclaw:emoji:"🌤️"requires:bins: ["curl"]
---# Weather SkillGetcurrentweatherconditionsandforecasts.## When to Use✅**USEthisskillwhen:**-What'stheweather?-Willitraintoday/tomorrow?-Temperaturein [city]
-Weatherforecastfortheweek-Travelplanningweatherchecks## When NOT to Use❌**DON'Tusethisskillwhen:**-Historicalweatherdata→useweatherarchives/APIs-Climateanalysisortrends→usespecializeddatasources-Severeweatheralerts→checkofficialNWSsources## Commands### Current Weather# One-line summarycurl"wttr.in/London?format=3"# Detailed current conditionscurl"wttr.in/London?0"### Forecasts# 3-day forecastcurl"wttr.in/London"# Week forecastcurl"wttr.in/London?format=v2"## Notes-NoAPIkeyneeded(useswttr.in)-Ratelimited;don'tspamrequests-Worksformostglobalcities
这个示例展示了如何用简洁的方式定义一个完整的技能:
元数据清晰说明了功能和触发条件
正文提供了快速参考的命令示例
注意事项提醒了使用限制
5. 技能加载机制
5.1 三层加载架构
OpenClaw Skills 系统采用三层渐进式加载架构,这是其核心设计理念:
层级
内容
大小估算
第一层
元数据(始终加载)
~100 words
第二层
SKILL.md 正文(触发时加载)
~5k words
第三层
捆绑资源(按需加载)
无限制
第一层:元数据
始终存在于上下文中,占用约 100 个词。这一层包含 name 和 description 字段,OpenClaw 通过它们判断是否需要激活某个技能。
第二层:SKILL.md 正文
当技能被触发时加载,建议控制在 5000 词以内。这一层包含具体的使用指令、工作流程和示例。
第三层:捆绑资源
按需加载,理论上无大小限制。脚本可以直接执行而无需加载到上下文,参考文档和资产文件在需要时才读取。
5.2 技能触发流程
用户发送消息:今天天气怎么样?
文件系统扫描所有技能的 description
查询匹配的技能
匹配到 weather 技能
读取 weather/SKILL.md
返回技能正文
加载技能到上下文
执行技能指令
执行 curl wttr.in 命令
返回天气数据
回复天气信息
5.3 技能目录扫描
OpenClaw 会扫描以下目录查找技能:
内置技能目录:/app/skills/ — 随 OpenClaw 发行的基础技能
工作区技能目录:~/.openclaw/workspace/skills/ — 用户自定义技能
扩展技能目录:通过配置指定的额外路径
技能发现过程:
扫描所有技能目录,查找 SKILL.md 文件
解析每个 SKILL.md 的 YAML 前置元数据
将所有技能的元数据加载到上下文
根据用户输入匹配最相关的技能
5.4 资源加载策略
不同类型的资源有不同的加载策略:
资源类型
加载时机
加载方式
scripts/
执行时
直接运行,不加载到上下文
references/
需要时
读取文件内容到上下文
assets/
输出时
复制或引用,不加载到上下文
这种策略确保了:
脚本执行的高效性(无需解析)
参考文档的灵活性(按需获取详细信息)
资产文件的直接可用性(模板、图片等)
6. 内置技能介绍
OpenClaw 自带了丰富的内置技能,覆盖了常见的使用场景。以下是一些代表性技能的介绍:
6.1 工具类技能
weather — 天气查询
通过 wttr.in API 获取全球天气信息,无需 API 密钥。支持当前天气、多日预报、多种输出格式。
---name:todo-managerdescription:"Todo list management - add, list, complete, and delete tasks. Use when user wants to manage their todo list, create tasks, check pending items, or organize their work. Supports priority levels and due dates."---# Todo ManagerManageyourpersonaltodolistwithsimplecommands.## When to Use✅**USEthisskillwhen:**-Add a task:buygroceries-Showmytodos-Marktask1asdone-Deletetask2-What'sonmylist?## When NOT to Use❌**DON'Tusethisskillwhen:**-Calendarevents→usecalendarintegration-Projectmanagement→usededicatedtools-Teamcollaboration→useteamtools## Commands### Add a taskpython3scripts/todo.pyadd"Buy groceries"--priorityhigh### List all taskspython3scripts/todo.pylist### Complete a taskpython3scripts/todo.pycomplete1### Delete a taskpython3scripts/todo.pydelete2## Data StorageTasksarestoredin`~/.openclaw/workspace/data/todos.json`:```json
{"tasks":[{"id":1,"title":"Buygroceries","priority":"high","completed":false,"created_at":"2024-01-15T10:30:00"}]}
Notes
Tasks are persisted locally
Priority levels: low, medium, high
IDs are auto-incremented
#### 7.4 编写脚本实现
创建 scripts/todo.py:
```python
#!/usr/bin/env python3""" Todo Manager - A simple command-line todo list manager
Usage:
python3 todo.py add "Task title" [--priority low|medium|high]
python3 todo.py list [--all|--pending|--completed]
python3 todo.py complete <id>
python3 todo.py delete <id>
"""import argparse
import json
import os
from datetime import datetime
from pathlib import Path
# 数据文件路径
DATA_DIR = Path.home() / ".openclaw" / "workspace" / "data"
DATA_FILE = DATA_DIR / "todos.json"defensure_data_file():
"""确保数据文件存在"""
DATA_DIR.mkdir(parents=True, exist_ok=True)
ifnot DATA_FILE.exists():
withopen(DATA_FILE, 'w') as f:
json.dump({"tasks": [], "next_id": 1}, f)
defload_data():
"""加载待办数据"""
ensure_data_file()
withopen(DATA_FILE, 'r') as f:
return json.load(f)
defsave_data(data):
"""保存待办数据"""withopen(DATA_FILE, 'w') as f:
json.dump(data, f, indent=2)
defadd_task(title, priority="medium"):
"""添加新任务"""
data = load_data()
task = {
"id": data["next_id"],
"title": title,
"priority": priority,
"completed": False,
"created_at": datetime.now().isoformat()
}
data["tasks"].append(task)
data["next_id"] += 1
save_data(data)
print(f"✅ Task #{task['id']} added: {title}")
deflist_tasks(filter_type="all"):
"""列出任务"""
data = load_data()
tasks = data["tasks"]
if filter_type == "pending":
tasks = [t for t in tasks ifnot t["completed"]]
elif filter_type == "completed":
tasks = [t for t in tasks if t["completed"]]
ifnot tasks:
print("No tasks found.")
returnprint(f"\n{'ID':<4}{'Status':<10}{'Priority':<8}{'Title'}")
print("-" * 50)
for task in tasks:
status = "✓ Done"if task["completed"] else"○ Pending"print(f"{task['id']:<4}{status:<10}{task['priority']:<8}{task['title']}")
defcomplete_task(task_id):
"""标记任务完成"""
data = load_data()
for task in data["tasks"]:
if task["id"] == task_id:
task["completed"] = True
save_data(data)
print(f"✅ Task #{task_id} completed: {task['title']}")
returnprint(f"❌ Task #{task_id} not found")
defdelete_task(task_id):
"""删除任务"""
data = load_data()
for i, task inenumerate(data["tasks"]):
if task["id"] == task_id:
deleted = data["tasks"].pop(i)
save_data(data)
print(f"🗑️ Task #{task_id} deleted: {deleted['title']}")
returnprint(f"❌ Task #{task_id} not found")
defmain():
parser = argparse.ArgumentParser(description="Todo list manager")
subparsers = parser.add_subparsers(dest="command", required=True)
# add 命令
add_parser = subparsers.add_parser("add", help="Add a new task")
add_parser.add_argument("title", help="Task title")
add_parser.add_argument("--priority", choices=["low", "medium", "high"], default="medium", help="Task priority")
# list 命令
list_parser = subparsers.add_parser("list", help="List tasks")
list_parser.add_argument("--all", action="store_true", help="Show all tasks")
list_parser.add_argument("--pending", action="store_true", help="Show pending tasks")
list_parser.add_argument("--completed", action="store_true", help="Show completed tasks")
# complete 命令
complete_parser = subparsers.add_parser("complete", help="Mark task as completed")
complete_parser.add_argument("id", type=int, help="Task ID")
# delete 命令
delete_parser = subparsers.add_parser("delete", help="Delete a task")
delete_parser.add_argument("id", type=int, help="Task ID")
args = parser.parse_args()
if args.command == "add":
add_task(args.title, args.priority)
elif args.command == "list":
if args.pending:
list_tasks("pending")
elif args.completed:
list_tasks("completed")
else:
list_tasks("all")
elif args.command == "complete":
complete_task(args.id)
elif args.command == "delete":
delete_task(args.id)
if __name__ == "__main__":
main()
用户:帮我添加一个待办:明天开会
AI:✅ Task #1 added: 明天开会
用户:查看我的待办
AI: ID Status Priority Title -------------------------------------------------- 1 ○ Pending medium 明天开会
用户:标记任务 1 完成
AI:✅ Task #1 completed: 明天开会
8. 技能调试技巧
8.1 常见问题排查
技能未被触发
检查 description 字段是否包含足够的关键词。确保描述中列出了用户可能的表达方式。
# 问题:描述太简略description:"Todo management"# 解决:添加触发场景description:"Todo list management - add, list, complete, and delete tasks. Use when user wants to manage their todo list, create tasks, check pending items."
description:"Generate podcast audio from topic description. Combines web search, script generation, and TTS synthesis. Use when user wants to create audio content or podcast episodes."