🚀 Hermes 自定义技能进阶:脚本、模板与技能市场

高阶第 2 篇 — 从单文件 Markdown 到完整技能包

🎯 这篇讲什么

上篇学会了写基础 SKILL.md。这篇进阶:用脚本实现复杂逻辑、用模板减少重复、发布到技能市场分享。


🐍 脚本集成:让 Skill 真正「能做事」

为什么需要脚本?

有些操作用 Markdown 描述不清楚,用代码才精确。比如:

  • 解析 API 返回的 JSON
  • 批量处理文件
  • 调用外部服务
  • 复杂的数据校验
  • 目录结构

    
    my-skills/github-stats/
    ├── SKILL.md
    └── scripts/
        └── fetch_stats.py
    

    SKILL.md 中引用脚本

    
    ---
    name: github-stats
    description: 获取 GitHub 仓库的 star 数、fork 数和最近 issue 统计
    version: 1.0.0
    ---
    
    # GitHub 仓库统计
    
    ## 触发条件
    用户询问 GitHub 仓库数据时触发。
    
    ## 步骤
    
    1. 确认仓库名(格式:owner/repo)
    2. 执行脚本获取数据:
       ```bash
       python3 scripts/fetch_stats.py <owner/repo>
       ```
    3. 将 JSON 结果格式化为中文报告
    
    ## 注意事项
    - 需要 GitHub Token 环境变量 `GITHUB_TOKEN`
    - API 有频率限制(未认证 60次/小时)
    

    脚本示例(scripts/fetch_stats.py

    
    #!/usr/bin/env python3
    """获取 GitHub 仓库统计数据"""
    import sys, os, json, urllib.request
    
    repo = sys.argv[1]
    token = os.getenv("GITHUB_TOKEN", "")
    
    def api(path):
        url = f"https://api.github.com/repos/{repo}/{path}"
        req = urllib.request.Request(url)
        if token:
            req.add_header("Authorization", f"Bearer {token}")
        with urllib.request.urlopen(req) as resp:
            return json.loads(resp.read())
    
    data = api("")
    issues = api("issues?state=open&per_page=1")
    
    # 从响应头获取总数(GitHub API 分页返回在 Link 头里)
    result = {
        "stars": data["stargazers_count"],
        "forks": data["forks_count"],
        "open_issues": data["open_issues_count"],
        "language": data.get("language", "N/A"),
        "description": data.get("description", ""),
    }
    print(json.dumps(result, ensure_ascii=False, indent=2))
    

    📋 模板集成:减少重复劳动

    模板文件让 Skill 能快速生成标准化内容。

    用例:Issue 报告模板

    
    my-skills/bug-reporter/
    ├── SKILL.md
    └── templates/
        └── bug-report.md
    

    模板文件(templates/bug-report.md

    
    # Bug 报告:{{ title }}
    
    **严重程度:** {{ severity }}
    **发现时间:** {{ date }}
    **环境:** {{ environment }}
    
    ## 复现步骤
    {{ steps }}
    
    ## 预期行为
    {{ expected }}
    
    ## 实际行为
    {{ actual }}
    
    ## 附加信息
    {{ extra }}
    

    SKILL.md

    
    ---
    name: bug-reporter
    description: 帮助用户创建结构化的 Bug 报告
    version: 1.0.0
    ---
    
    ## 步骤
    
    1. 向用户询问:Bug 标题、严重程度、环境、复现步骤
    2. 读取模板:`templates/bug-report.md`
    3. 用用户输入替换 `{{ }}` 占位符
    4. 保存到 `~/Reports/bugs/{{ 日期 }}-{{ 标题 }}.md`
    

    🏪 技能市场:发现与分享

    浏览和搜索

    
    # 浏览所有可用技能
    hermes skills browse
    
    # 搜索特定主题
    hermes skills search "web search"
    
    # 预览(不安装)
    hermes skills inspect duckduckgo-search
    

    安装技能

    
    # 从官方市场安装
    hermes skills install web-search
    
    # 从 URL 直接安装
    hermes skills install https://example.com/my-skill/SKILL.md
    
    # 从社区技能商店安装
    hermes skills install skillhub:my-custom-skill
    

    管理已安装技能

    
    # 列出
    hermes skills list
    
    # 检查更新
    hermes skills check
    
    # 更新全部
    hermes skills update
    
    # 卸载
    hermes skills uninstall web-search
    

    按平台启用/禁用

    
    # 微信上启用搜索,Telegram 上禁用
    hermes skills config
    # → 交互式选择每个平台启用哪些技能
    

    🎨 实战:从头写一个完整的 Skill

    场景:每日 AI 新闻简报

    
    my-skills/daily-ai-news/
    ├── SKILL.md
    ├── scripts/
    │   └── fetch_news.py
    └── templates/
        └── news-brief.md
    

    SKILL.md

    
    ---
    name: daily-ai-news
    description: 抓取当日 AI 领域重要新闻,生成中文简报。
      当用户说"AI新闻""今日AI动态""有什么AI大事"时触发。
    version: 1.0.0
    ---
    
    # 每日 AI 新闻简报
    
    ## 步骤
    
    1. 执行 `python3 scripts/fetch_news.py` 获取新闻
    2. 筛选出最重要的 5 条
    3. 使用 `templates/news-brief.md` 模板生成简报
    4. 发布到配置的默认平台
    
    ## 模板变量
    - {{ date }}: 当前日期
    - {{ summary }}: 一句话总结
    - {{ items }}: 新闻条目列表
    
    ## 注意事项
    - 新闻源 API 可能限流,失败时用缓存
    - 每条约 50 字以内
    - 重要新闻用 🔥 标记
    

    模板(templates/news-brief.md

    
    # 🤖 AI 日报 — {{ date }}
    
    > {{ summary }}
    
    ---
    
    {{ items }}
    
    ---
    *由 Hermes Agent 自动生成*
    

    🧪 测试 Skill

    
    # 1. 检查语法
    cat SKILL.md | grep "^---$" | wc -l  # 应该有 2 个 ---
    
    # 2. 在对话中加载测试
    hermes -s daily-ai-news
    
    # 3. 触发测试
    hermes chat -q "今天的 AI 新闻有哪些?"
    
    # 4. 调试:看是否加载
    # 在对话中说 /skill daily-ai-news
    

    🔄 持续改进

    Hermes 的 self-improvement 技能会自动:

    1. 发现 Skill 执行中的错误

    2. 记录用户纠正

    3. 建议更新 Skill

    你也可以手动让 Hermes 改进:

    
    用户: 检查一下 daily-ai-news 这个技能,最近三次执行有什么可以优化的地方
    Hermes: [分析执行记录] 建议:
           1. 新闻筛选逻辑改为按热度排序
           2. 增加中文翻译步骤(源数据是英文)
           3. 缓存时间从 1 小时延长到 3 小时
           
           要我应用这些改进吗?
    

    ❓ 常见问题 (FAQ)

    Q1: 脚本用什么语言?

    Python 最方便(Hermes 自带 Python 环境)。Shell 脚本也行。不推荐需要额外安装运行时的语言。

    Q2: 脚本怎么传参数给 SKILL.md 的步骤?

    通过命令行参数。Hermes 执行步骤时会解析命令并传入。

    Q3: 模板里的 {{ }} 语法是必须的吗?

    不是。这是建议约定。用占位符让 Hermes 知道哪里需要替换,你也可以用其他格式。

    Q4: 我的 Skill 想用第三方库怎么办?

    在 SKILL.md 的注意事项里写明依赖。如"需要 pip install requests"。

    Q5: 怎么发布到技能市场给别人用?

    hermes skills publish <path>。需要注册技能市场账号。

    Q6: 别人的 Skill 安全吗?

    Hermes 会扫描安装的 Skill 中的危险模式(如 curl | bash)。来自外部的 Skill 默认隔离安装到 .hub/quarantine/


    ⚠️ 实操避坑

    正确做法
    脚本没加 #!/usr/bin/env python3第一行加 shebang,否则可能用错解释器
    脚本用绝对路径用相对路径,基于 Skill 目录
    模板占位符拼写不一致定义好变量名,全文统一
    Skill 装了但平台没启用hermes skills config 检查各平台开关
    更新 Skill 后旧会话不生效/reset 开新会话加载新版本

    标签:#AI #HermesAgent #高阶 #Skill #脚本 #模板