Hermes Agent Skills 系统深度指南:从创建到维护的完整工作流

Hermes Agent Skills 系统深度指南:从创建到维护的完整工作流

简介

Hermes Agent 的 Skills 系统是它的”肌肉记忆”——把重复性的工作流程、踩过的坑、最佳实践固化成可复用的技能文件,下次遇到同样场景自动加载执行。本文从实战角度出发,覆盖技能的创建、更新、维护全生命周期,以及如何将记忆中的经验高效转化为技能。

前置要求

  • 已安装并运行 Hermes Agent
  • 了解基本的 YAML 和 Markdown 语法
  • 熟悉 Hermes Agent 的 cron 和记忆系统(可选,但有帮助)

一、Skills 系统概述

1.1 什么是 Skills

Skills 是存放在 ~/.hermes/skills/ 目录下的 Markdown 文件,每个文件包含:

  • YAML 前置元数据:名称、描述、触发条件
  • Markdown 正文:步骤、代码示例、注意事项

当 Hermes Agent 处理任务时,会根据当前上下文自动匹配并加载相关的技能。技能的作用类似于人类的”肌肉记忆”——不需要每次都从头思考怎么做。

1.2 技能的生命周期

1
创建 → 使用 → 反馈 → 更新 → 归档/删除

技能不是一次写死就完事的——每次使用中发现的遗漏、错误、改进点,都应该及时更新。一个长期不维护的技能反而会成为负担。

1.3 技能 vs 记忆

维度 技能 (Skills) 记忆 (Memory)
内容 流程、步骤、命令 事实、偏好、约定
粒度 完整工作流 单条陈述
更新频率 按需(使用中发现问题时) 随时(发现新事实时)
典型用途 “如何发文件””如何部署博客” “用户喜欢简洁回复””项目用 pytest”

原则:过程性知识 → 技能,陈述性知识 → 记忆。

二、创建技能

2.1 基本命令

1
2
3
4
5
6
7
8
# 创建一个新技能
skill_manage(action='create', name='my-skill', content='...')

# 查看已有技能列表
skills_list()

# 查看技能详情
skill_view(name='my-skill')

2.2 技能文件结构

一个标准的技能文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
---
name: my-skill
description: 简短描述技能用途
metadata:
openclaw:
emoji: 🔧
requires:
bins: [curl, jq]
---

# My Skill

## 触发条件

当用户提到"xxx"或需要做 yyy 时触发。

## 步骤

### Step 1:准备工作
1. 检查依赖工具是否安装
2. 确认工作目录

### Step 2:执行
```bash
curl -s https://api.example.com

Step 3:验证

  • 检查输出是否包含预期结果
  • 如果失败,回退方案是什么

常见问题

Q:命令执行失败怎么办?

A:检查网络连接,或尝试备用方案。

注意事项

  • ⚠️ 不要在非预期环境下执行破坏性操作
  • 💡 输出结果超过 100 行时使用分页查看
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46

    ### 2.3 元数据字段详解

    | 字段 | 必填 | 说明 |
    |------|------|------|
    | `name` | ✅ | 技能名称,小写+连字符,最长 64 字符 |
    | `description` | ✅ | 简短描述,用于技能匹配 |
    | `metadata.openclaw.emoji` | ❌ | 显示用的表情符号 |
    | `metadata.openclaw.requires.bins` | ❌ | 依赖的命令行工具列表 |

    ### 2.4 实战:从记忆抽取技能

    这是最常用的创建方式——用户之前通过对话教过你某个流程,但这些流程散落在记忆文件中。正确的做法是:

    1. **识别**:在记忆文件中找到过程性描述("先做 A,再做 B,最后做 C")
    2. **提取**:用 `skill_manage(action='create')` 创建技能
    3. **清理**:将记忆中的过程描述替换为"已提取为 xxx 技能"
    4. **触发**:确保技能名称和描述能自然匹配到使用场景

    ```python
    # 示例:从记忆抽取发文件流程
    skill_manage(
    action='create',
    name='file-delivery',
    content='''---
    name: file-delivery
    description: 通过微信/QQ等平台发送文件给用户
    ---

    # File Delivery

    ## 步骤

    ### Step 1:检查文件是否存在
    使用 read_file 或 terminal 确认目标文件存在。

    ### Step 2:发送文件
    使用 MEDIA: 路径前缀发送到消息平台。

    ### Step 3:验证发送
    检查网关日志确认发送成功。

    ### Step 4:失败处理
    如果发送失败,尝试压缩、改名或分段发送。
    '''
    )

三、更新技能

3.1 局部更新(推荐)

使用 patch 模式进行精确替换,不改动文件其他部分:

1
2
3
4
5
6
skill_manage(
action='patch',
name='my-skill',
old_string='旧的内容',
new_string='新的内容'
)

3.2 整体重写

当技能需要大幅修改时,使用 edit 模式:

1
2
3
4
5
skill_manage(
action='edit',
name='my-skill',
content='全新的完整内容...'
)

3.3 什么时候该更新

  • 发现遗漏步骤:执行过程中发现少了某一步
  • 命令过期:工具版本更新导致命令变化
  • 新增陷阱:踩了新坑,需要记录下来
  • 流程优化:找到了更高效的做法

3.4 实战:技能更新示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 假设 hexo-blog-workflow 技能缺少写作前自检步骤
skill_manage(
action='patch',
name='hexo-blog-workflow',
old_string='## 步骤\n\n### Phase 1:选题',
new_string='''## 步骤

### Phase 0:写作前自检
1. 在博客站点搜索已有内容:`site:geniux.top <话题>`
2. 如果已有相关内容:
- 写进阶篇、对比篇或实战篇
- 如果无法深入,换话题
3. 确认无重复后进入 Phase 1

### Phase 1:选题'''
)

四、管理技能

4.1 查看技能列表

1
2
3
4
5
# 查看所有技能
skills_list()

# 按分类筛选
skills_list(category='devops')

4.2 删除技能

1
2
3
4
5
# 删除技能(如果内容已合并到其他技能)
skill_manage(action='delete', name='old-skill', absorbed_into='umbrella-skill')

# 删除技能(内容已过时,无替代)
skill_manage(action='delete', name='stale-skill', absorbed_into='')

4.3 技能目录结构

1
2
3
4
5
6
7
8
9
10
11
~/.hermes/skills/
├── my-skill/
│ └── SKILL.md
├── hexo-blog-workflow/
│ ├── SKILL.md
│ ├── templates/
│ │ └── post-template.md
│ └── scripts/
│ └── deploy.sh
└── file-delivery/
└── SKILL.md

每个技能是一个目录,核心文件是 SKILL.md。可以附带 references/templates/scripts/assets/ 等子目录存放辅助文件。

4.4 辅助文件操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 写入辅助文件
skill_manage(
action='write_file',
name='my-skill',
file_path='scripts/validate.sh',
file_content='#!/bin/bash\n...'
)

# 删除辅助文件
skill_manage(
action='remove_file',
name='my-skill',
file_path='scripts/old-script.sh'
)

五、最佳实践

5.1 技能粒度

  • 太粗:一个技能包含太多不相关的步骤 → 难以维护
  • 太细:每个小操作都做成技能 → 管理成本高
  • 刚好:一个完整的工作流,5-15 步,有明确的开始和结束

5.2 命名规范

  • 使用小写字母和连字符:my-awesome-skill
  • 名称要能反映用途:file-deliverysend-files 更清晰
  • 避免缩写:db-migrationdb-mig 更好

5.3 触发条件

在技能开头明确写出触发条件,帮助 Hermes Agent 在正确的时机加载:

1
2
3
4
5
## 触发条件

- 用户说"发文件"、"发送 xxx"
- 需要将本地文件传递给用户
- 文件发送失败需要重试

5.4 版本管理

虽然技能没有内置版本号,但可以通过以下方式追踪变更:

  • 在 SKILL.md 末尾添加变更日志
  • 使用 patch 而非 edit 进行更新(保留历史上下文)
  • 定期 review 技能列表,清理过时内容

5.5 技能与 cron 任务结合

Cron 任务可以通过 skills 字段指定需要加载的技能:

1
2
3
4
5
6
# config.yaml 中的 cron 配置
cron:
daily-weather:
schedule: "0 7 * * *"
skills: ["weather"]
prompt: "推送每日长沙天气"

六、常见问题

Q:技能不自动触发怎么办?

检查以下几点:

  1. 技能名称和描述是否清晰?description 字段用于匹配
  2. 当前上下文是否相关?Hermes 不会在所有场景下加载所有技能
  3. 手动加载试试:skill_view(name='xxx')

Q:技能和记忆内容冲突怎么办?

优先遵循技能中的步骤,因为技能是更结构化的知识。同时更新记忆文件,将冲突的过程描述替换为”已提取为 xxx 技能”。

Q:技能太多怎么管理?

  • 使用 category 参数分类
  • 定期清理:absorbed_into 合并同类技能
  • 不需要的技能及时删除,避免干扰匹配

Q:修改技能后需要重启 Hermes 吗?

不需要。技能文件是动态加载的,修改后下次触发自动生效。

七、总结

Skills 系统是 Hermes Agent 最强大的特性之一,它将你的工作经验和最佳实践固化为可复用的知识库。关键要点:

  1. 过程进技能,事实进记忆——分清两类知识
  2. 持续维护——每次使用后反思,及时更新
  3. 粒度适中——一个技能对应一个完整工作流
  4. 清理冗余——合并同类技能,删除过时内容
  5. 善用辅助文件——脚本、模板、参考文档都可以随技能管理

把技能当作你的”第二大脑”来经营,越用越顺手。