前言
调试和优化是 Skill 开发中不可避免的环节。一个行为异常的 Skill 会导致回复不准确,一个低效的 Skill 则会浪费大量 Token。本教程系统介绍 OpenClaw Skill 的调试工具和性能优化策略。
调试模式
开启全局调试
OpenClaw 提供多个日志输出级别:
# 默认日志级别(info)
openclaw logs
# Debug 级别(显示 Skill 匹配和执行详情)
openclaw logs --level debug
# Verbose 级别(包含 MCP 通信数据)
openclaw logs --level verbose
在配置中设置日志级别
也可以在 ~/.config/openclaw/openclaw.json5 中持久化设置:
{
logging: {
level: "debug", // info, debug, verbose
// 日志输出位置
file: "~/.openclaw/logs/openclaw.log",
// 日志文件最大大小
maxSize: "10MB",
// 保留日志文件数
maxFiles: 5,
// 是否输出到控制台
console: true
}
}
解读调试日志
开启 debug 级别后,你会看到以下关键日志条目:
[DEBUG] === Message Processing Start ===
[DEBUG] Input: "北京天气怎么样"
[DEBUG] Channel: telegram, User: user_12345
[DEBUG] --- Skill Matching Phase ---
[DEBUG] Checking skill: weather (triggers: 天气,weather,气温)
[DEBUG] ✓ Trigger matched: "天气" found in message
[DEBUG] Checking skill: reminder (triggers: 提醒,remind,闹钟)
[DEBUG] ✗ No trigger match
[DEBUG] Checking skill: translator (triggers: 翻译,translate)
[DEBUG] ✗ No trigger match
[DEBUG] --- Skill Execution Phase ---
[DEBUG] Active skill: weather
[DEBUG] MCP tools available: [http_fetch]
[DEBUG] Sending to model with skill context...
[DEBUG] --- MCP Tool Calls ---
[DEBUG] Tool call: http_fetch.http_get({url: "https://api.openweathermap.org/..."})
[DEBUG] Tool result: 200 OK, 1.2KB response
[DEBUG] Total tool calls: 1
[DEBUG] --- Response Generation ---
[DEBUG] Model response tokens: 245
[DEBUG] Total latency: 2340ms
[DEBUG] === Message Processing End ===
隔离测试Skill
通过Gateway API测试
直接通过 Gateway API 发送测试消息,绕过聊天频道:
# 测试指定 Skill
curl -X POST http://localhost:18789/api/chat \
-H "Content-Type: application/json" \
-d '{
"message": "北京天气怎么样",
"options": {
"skill": "weather",
"debug": true
}
}'
开启 debug: true 后,响应会包含调试信息:
{
"response": "🌤️ 北京天气...",
"debug": {
"skillMatched": "weather",
"triggerWord": "天气",
"mcpCalls": [
{
"server": "http-fetch",
"tool": "http_get",
"latency": 890,
"status": "success"
}
],
"modelTokens": {
"input": 1250,
"output": 245
},
"totalLatency": 2340
}
}
禁用其他Skill进行隔离测试
测试某个 Skill 时,可以临时禁用其他 Skill 以排除干扰:
{
skills: {
// 只启用你正在测试的 Skill
enabled: ["weather"],
// 或者禁用所有其他 Skill
// disabled: ["reminder", "translator", "rss-reader"]
}
}
修改后重启:
openclaw restart
测试完成后记得恢复配置。
用测试消息批量验证
创建一个测试脚本来批量验证 Skill 行为:
#!/bin/bash
# test-weather-skill.sh
GATEWAY="http://localhost:18789/api/chat"
test_cases=(
"北京天气怎么样"
"上海明天会下雨吗"
"weather in Tokyo"
"深圳这周气温多少"
"要不要带伞"
)
for msg in "${test_cases[@]}"; do
echo "=== Testing: $msg ==="
curl -s -X POST "$GATEWAY" \
-H "Content-Type: application/json" \
-d "{\"message\": \"$msg\", \"options\": {\"debug\": true}}" \
| python3 -m json.tool
echo ""
done
常见调试场景
场景一:Skill没有被触发
症状:包含触发词的消息没有激活 Skill。
排查步骤:
# 1. 确认 Skill 已加载
openclaw skill list
# 2. 查看匹配日志
openclaw logs --level debug
常见原因:
| 原因 | 解决方案 |
|---|---|
| 文件名不正确 | 必须以 .SKILL.md 结尾 |
| SKILL.md 语法错误 | 检查 YAML 前置数据格式 |
| 触发词不匹配 | 添加更多触发词变体 |
| Skill 被禁用 | 检查配置中的 disabled 列表 |
| 其他 Skill 优先匹配 | 调整 Skill 优先级 |
场景二:MCP工具调用失败
症状:Skill 被触发,但 MCP 工具返回错误。
# 查看详细的 MCP 通信日志
openclaw logs --level verbose
常见错误及解决方法:
[ERROR] MCP tool error: ECONNREFUSED
→ MCP Server 未运行或端口配置错误
[ERROR] MCP tool error: TIMEOUT
→ 工具调用超时——增加超时配置
[ERROR] MCP tool error: PERMISSION_DENIED
→ 文件系统 MCP 缺少读写权限
[ERROR] MCP tool error: INVALID_PARAMS
→ AI 传递了错误的参数格式
场景三:回复内容不符合预期
症状:Skill 被触发且工具调用成功,但输出格式或内容不对。
排查思路:
- 检查 SKILL.md 中的 Output Format 描述是否足够清晰
- 查看发送给 AI 模型的完整 prompt(在 verbose 日志中可见)
- 尝试在 Output Format 部分添加更多示例
- 考虑降低 temperature 以获得更稳定的输出
性能指标监控
关键性能指标
通过 Dashboard 或 API 监控以下指标:
# 打开 Dashboard
openclaw dashboard
| 指标 | 说明 | 健康范围 |
|---|---|---|
| 响应延迟 | 从收到消息到发出回复的时间 | < 5 秒 |
| MCP 调用延迟 | 单次 MCP 工具调用耗时 | < 2 秒 |
| 输入 Token 数 | 每次请求的输入 Token 数 | 视场景而定 |
| 输出 Token 数 | 每次回复的输出 Token 数 | < 500 |
| Skill 匹配耗时 | 触发词匹配所需时间 | < 10ms |
通过API获取性能数据
curl http://localhost:18789/api/stats
{
"uptime": "3d 14h 22m",
"totalMessages": 1250,
"avgLatency": 2100,
"skillStats": {
"weather": {
"invocations": 89,
"avgLatency": 2340,
"avgInputTokens": 1250,
"avgOutputTokens": 245,
"errorRate": 0.02
},
"reminder": {
"invocations": 156,
"avgLatency": 1100,
"avgInputTokens": 890,
"avgOutputTokens": 120,
"errorRate": 0.0
}
}
}
Token用量优化
Token 消耗直接影响 API 成本,以下是实用的优化技巧。
精简SKILL.md
SKILL.md 的内容会作为系统提示发送给模型,文件越大,每次请求的 Token 成本就越高。
优化前:
## Output Format
当用户查询天气时,你需要以一种美观且信息丰富的方式来呈现天气数据。
首先显示城市名称,然后显示当前的天气状况描述,接着显示温度信息
(包括当前温度和体感温度),再显示湿度和风速信息,
最后如果数据中有日出日落时间的话也一并显示出来。
请确保使用适当的emoji来让信息更加生动...
优化后:
## Output Format
🌤️ {城市} | {天气} 🌡️ {温度}°C(体感{体感}°C)| 💧{湿度}% | 💨{风速}m/s
减少不必要的上下文
{
context: {
// 缩小上下文窗口
maxMessages: 20, // 从默认的 50 减少
// Skill 激活时是否携带完整上下文
skillContext: "minimal" // minimal 只保留最近 3 条消息
}
}
选择合适的模型
不是所有场景都需要最强大的模型:
{
channels: {
telegram: {
// 简单场景使用更小的模型
model: {
provider: "claude",
name: "claude-haiku-4-20250514" // 更快更便宜
}
}
}
}
Skill加载顺序
当多个 Skill 的触发词有重叠时,加载顺序决定了优先级。
查看当前加载顺序
openclaw skill list --verbose
Skills (loaded in order):
1. weather (priority: 10, triggers: 天气,weather,气温)
2. reminder (priority: 10, triggers: 提醒,remind,闹钟)
3. translator (priority: 5, triggers: 翻译,translate)
4. rss-reader (priority: 5, triggers: 订阅,新闻,rss)
设置优先级
在 SKILL.md 的前置数据中设置:
---
name: weather
priority: 20 # 数值越大优先级越高
triggers:
- 天气
---
或在全局配置中统一管理:
{
skills: {
priority: {
"weather": 20,
"reminder": 15,
"translator": 10
}
}
}
性能优化检查清单
在 Skill 上线前,过一遍这个优化清单:
- [ ] SKILL.md 文件大小是否合理(建议 < 3KB)?
- [ ] 触发词是否精准(避免误触发)?
- [ ] MCP 工具调用次数是否最小化(避免冗余调用)?
- [ ] 上下文窗口大小是否合适?
- [ ] 输出格式是否简洁?
- [ ] 是否选择了适合场景的模型?
- [ ] 错误处理是否完善(避免重试风暴)?
- [ ] 优先级设置是否合理?
常用调试命令速查
# 查看所有 Skill 状态
openclaw skill list
# 查看实时日志
openclaw logs --level debug
# 系统健康检查
openclaw doctor
# 打开监控面板
openclaw dashboard
# 重启(加载新变更)
openclaw restart
# 通过 Gateway API 测试
curl http://localhost:18789/api/chat \
-H "Content-Type: application/json" \
-d '{"message": "test", "options": {"debug": true}}'
# 检查 Gateway 状态
curl http://localhost:18789/health
总结
高效的调试和性能优化是打造高质量 Skill 的关键。掌握日志分析、隔离测试、Token 优化和加载顺序管理,你就能快速定位问题、优化成本,开发出一流的 OpenClaw Skill。