Hermes Agent 架构:多 Agent 编排 + 技能系统 + Cron 自动化

为什么写这篇

Hermes Agent 官方文档很全,但新手从「安装」到「跑通第一个自动化工作流」仍有断层

  • 配置文件在哪?怎么加 API Key?
  • 技能怎么装?怎么写自己的技能?
  • Cron 任务怎么调试?部署后怎么验证自定义域名生效?
  • 多 Agent 编排怎么拆分任务?上下文怎么隔离?

这篇把我踩过的坑、跑通的最小闭环、可直接复制的模板全整理出来。读完 → 照做 → 拿到一个能跑的自动化系统


一、5 分钟跑通最小闭环

1.1 安装与初始化

# 安装 Hermes CLI(Go 单二进制,无依赖)
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash

# 或用 Go 安装
go install github.com/nousresearch/hermes-agent/cmd/hermes@latest

# 初始化配置(交互式引导)
hermes init

交互式会问:

  • Provider:选 nvidia / openrouter / anthropic / openai / custom
  • Model:如 nvidia/nemotron-3-ultraanthropic/claude-sonnet-4
  • API Key:粘贴你的 key

生成 ~/.hermes/config.yaml

provider: nvidia
model: nvidia/nemotron-3-ultra-550b-a55b
api_key: nvapi-xxx...
default_profile: default
profiles:
  default:
    skills_dir: ~/.hermes/skills
    plugins_dir: ~/.hermes/plugins
    cron_dir: ~/.hermes/cron
    memories_dir: ~/.hermes/memories

验证hermes chat "你好" 能回复即配置成功。


1.2 装第一个技能:hermes-agent(管理 Hermes 自身)

# 查看内置技能
hermes skills list

# 官方技能仓库已内置 hermes-agent,直接用
hermes skill load hermes-agent

现在你可以对 Hermes 说:「帮我创建一个每天早 7 点发消息的 Cron 任务」,它会自动调用技能里的 cronjob 工具生成配置。


1.3 跑通第一个 Cron:每日早报

# 创建任务(交互式或直接用参数)
hermes cron create \
  --name "daily-morning-brief" \
  --schedule "0 7 * * *" \
  --prompt "每天早 7 点,用中文生成一份 200 字以内的科技早报,包含:AI 新进展、开源热点、一句话感悟。发到 Telegram Home 频道。" \
  --skills "web_search,telegram" \
  --deliver "telegram"

关键点

  • --skills:声明需要的工具集,Cron 运行时只加载这些,省 token
  • --deliver:指定投递渠道(telegram / discord / origin / local
  • Cron 任务存在 ~/.hermes/cron/daily-morning-brief.json

验证hermes cron run daily-morning-brief 手动触发一次,看 Telegram 收到消息。


二、技能系统:把「会做的事」变成可复用工具

2.1 技能目录结构

~/.hermes/skills/
├── my-blog-deploy/          # 你的自定义技能
│   ├── SKILL.md             # 技能元数据(必需)
│   ├── scripts/
│   │   └── deploy.sh        # 可执行脚本
│   └── templates/
│       └── article.md       # 模板文件
└── github-pr-review/        # 另一个技能
    ├── SKILL.md
    └── scripts/

2.2.2 写一个「博客部署」技能

~/.hermes/skills/my-blog-deploy/SKILL.md

---
name: my-blog-deploy
description: "Hugo + Cloudflare Pages 双域名部署:本地构建 → wrangler 部署 → 验证 ningop.com + pages.dev 双域名 200"
category: devops
tags: [hugo, cloudflare, pages, deploy, blog]
version: "1.0"
author: "ningfeiyu"
---

# My Blog Deploy Skill

## 使用场景
- 写完文章后,一句指令完成:构建 → 部署 → 双域名验证
- 避免手动跑命令、忘记验证自定义域名导致 404

## 入参(自然语言即可,Agent 自动提取)
- `action`:deploy | verify | build-only
- `article_path`:可选,指定文章路径,默认全站

## 执行步骤
1. `hugo --buildFuture` 本地构建
2. `npx wrangler pages deploy public --project-name=ningop-blog --branch=main`
3. 等待 10 秒,并发验证:
   - `https://ningop.com/` 首页
   - `https://ningop.com/posts/<new-article>/` 新文
   - `https://<preview>.ningop-blog.pages.dev/posts/<new-article>/` 预览
   - 所有图片 `/images/xxx.jpg` 200
4. 汇总报告:✅/❌ + 耗时 + 失败详情

## 依赖
- hugo (extended)
- node + npx + wrangler
- Cloudflare API Token 已配置 `CLOUDFLARE_API_TOKEN` 环境变量或 `~/.wrangler/config/default.toml`

scripts/deploy.sh

#!/usr/bin/env bash
set -euo pipefail

echo "🔨 Step 1: Hugo 构建..."
hugo --buildFuture

echo "🚀 Step 2: Wrangler 部署..."
DEPLOY_OUTPUT=$(npx wrangler pages deploy public --project-name=ningop-blog --branch=main 2>&1)
echo "$DEPLOY_OUTPUT"

PREVIEW_URL=$(echo "$DEPLOY_OUTPUT" | grep -oE 'https://[a-z0-9]+\.ningop-blog\.pages\.dev' | head -1)
echo "📍 Preview: $PREVIEW_URL"

echo "⏳ 等待 10 秒让边缘节点生效..."
sleep 10

echo "🔍 Step 3: 双域名验证..."
check_url() {
  local url=$1
  local code=$(curl -s -o /dev/null -w "%{http_code}" "$url" --max-time 15)
  if [[ "$code" == "200" ]]; then
    echo "  ✅ $url -> $code"
  else
    echo "  ❌ $url -> $code"
  fi
}

# 首页
check_url "https://ningop.com/"

# 如果传了文章路径,提取 slug 验证
if [[ -n "${ARTICLE_SLUG:-}" ]]; then
  check_url "https://ningop.com/posts/${ARTICLE_SLUG}/"
  check_url "${PREVIEW_URL}/posts/${ARTICLE_SLUG}/"
  check_url "https://ningop.com/images/${COVER_IMAGE:-cover.jpg}"
fi

echo "✅ 完成"

加载技能

hermes skill load my-blog-deploy

使用

> 帮我部署博客,新文章是 content/posts/hermes-advanced-guide.md,封面是 images/hermes_advanced_cover.svg

Agent 会自动提取 slug 和 cover,跑完给你报告。


三、多 Agent 编排:delegate_task 实战

3.1 核心原则

原则 说明
单一职责 每个子 Agent 只做一件事(写代码 / 搜资料 / 审代码)
上下文隔离 子 Agent 不知道父对话,必须通过 context 传所有信息
可验证产出 子 Agent 返回 URL / 路径 / HTTP 状态码,父 Agent 复核
并行上限 同时最多 3 个子 Agent(配置 delegation.max_concurrent_children

3.2 实例:写一篇技术文章 → 自动部署

父 Agent Prompt

目标:产出一篇「Hermes Agent 进阶指南」并部署到 ningop.com

子任务拆分(并行):
1. researcher:搜集 Hermes 官方文档、GitHub Issues、最佳实践 → 输出结构化笔记
2. writer:按大纲写文章 Markdown → 输出文件路径
3. deployer:调用 my-blog-deploy 技能部署 → 输出验证报告

context 传递:
- 目标受众:AI Agent 新手、想落地自动化的开发者
- 文章风格:实操优先、有代码、有避坑、可复制粘贴
- 部署目标:ningop.com + pages.dev 双域名必须 200

执行

# 伪代码:Hermes 内部实际用 delegate_task 工具
tasks = [
  {"goal": "搜集 Hermes 进阶用法...", "toolsets": ["web", "skill:hermes-agent"], "context": "..."},
  {"goal": "写文章...", "toolsets": ["file", "terminal"], "context": "..."},
  {"goal": "部署验证...", "toolsets": ["terminal", "skill:my-blog-deploy"], "context": "..."},
]
results = delegate_task(tasks=tasks)
# 父 Agent 收集结果,汇总给用户

⚠️ 避坑:子 Agent 不能clarifymemorysend_messageexecute_code。必须在 context 里塞齐所有信息。


四、MCP 工具调用:让 Agent 用上你的本地工具

4.1 是什么

MCP (Model Context Protocol) = 统一接口让 LLM 调用本地 CLI / HTTP 服务。Hermes 原生支持 MCP 客户端。

4.2 接入 filesystem MCP(读写本地文件)

~/.hermes/mcp_servers/filesystem.yaml

name: filesystem
command: npx
args: ["-y", "@modelcontextprotocol/server-filesystem", "/root/ningfeiyu.github.io"]
transport: stdio

启用

hermes mcp add filesystem.yaml
hermes mcp list  # 确认 running

现在 Agent 可以直接用 read_filewrite_filepatchsearch_files 等工具操作你的博客目录,不需要你手动跑终端命令

4.3 接入 github MCP(PR Review、Issue 创建)

name: github
command: npx
args: ["-y", "@modelcontextprotocol/server-github"]
env:
  GITHUB_PERSONAL_ACCESS_TOKEN: "ghp_xxx..."
transport: stdio

五、GitHub Actions 集成:Push 即部署

5.1 仓库 Secrets(一次性配置)

Secret 来源
CLOUDFLARE_API_TOKEN cfut_iHVZ9SYSX9aPZB8r7mI9xNbcExWZHt0detRIz9GCf30162b5 CF Dashboard → My Profile → API Tokens → Workers Scripts:Edit
CLOUDFLARE_ACCOUNT_ID 184d0bed47b2e2e4ceb6c8a515eea498 CF Dashboard 右侧
GH_TOKEN ghp_xxx GitHub Settings → Developer settings → Personal access tokens

5.2 Workflow:.github/workflows/deploy.yml

name: Deploy to Cloudflare Pages
on:
  push:
    branches: [main]
  workflow_dispatch:

permissions:
  contents: read
  deployments: write

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2
        with:
          hugo-version: '0.147.0'
          extended: true

      - name: Build
        run: hugo --buildFuture --minify

      - name: Deploy to Cloudflare Pages
        uses: cloudflare/pages-action@v1
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          projectName: ningop-blog
          directory: public
          branch: main
          wranglerVersion: 'latest'

      - name: Verify Custom Domain
        run: |
          sleep 15
          for url in \
            "https://ningop.com/" \
            "https://ningop.com/posts/$(ls -t content/posts/*.md | head -1 | xargs basename -s .md)/" \
            "https://${{ github.run_id }}.ningop-blog.pages.dev/"; do
            code=$(curl -s -o /dev/null -w "%{http_code}" "$url" --max-time 20)
            echo "$url -> $code"
            if [[ "$code" != "200" ]]; then exit 1; fi
          done

关键:最后一步 Verify Custom Domain 直接在 CI 里校验 ningop.com,失败则标红,防止 404 上线。


六、避坑清单(每次部署前自检)

# 症状 解法
1 图片相对路径 文章页图片 404 正文用绝对路径 /images/xxx.jpg,放 static/images/
2 日期写成未来/过去 首页不显示 date: 2026-06-23T10:00:00+08:00 + buildFuture = true
3 CF Pages 自定义域名缓存 pages.dev 200、ningop.com 404 CI 最后加验证步骤,或手动 wrangler pages deploy 触发刷新
4 WORKER_API_KEY 设了但值不对 Worker 全部 401 删掉 WORKER_API_KEY 让 Worker 兼容模式,或用 CF Access/JWT
5 Cron 任务时区不对 早 7 点变晚 7 点 Cron 表达式按服务器时区(通常 UTC),换算:北京 7:00 = UTC 23:00 → 0 23 * * *
6 子 Agent 返回「我做完了」无证据 父 Agent 信了,实际失败 要求子 Agent 返回 URL / 状态码 / 文件路径,父 Agent 必须复核
7 技能 SKILL.mdcategory/tags hermes skills list 显示异常 必填前置字段:name, description, category, tags, version, author

七、最小可用模板库(直接复制用)

7.1 日报 Cron 模板

hermes cron create \
  --name "daily-tech-brief" \
  --schedule "0 23 * * *" \
  --prompt "生成中文科技日报:AI 进展、开源热榜、一句话感悟,≤300 字。投递 Telegram Home。" \
  --skills "web_search,telegram" \
  --deliver "telegram"

7.2 周报 + 博客同步 Cron

hermes cron create \
  --name "weekly-blog-sync" \
  --schedule "0 2 * * 1" \
  --prompt "读取本周 GitHub 提交、部署记录、新文章,生成周报 Markdown,存入 content/posts/weekly-YYYY-MM-DD.md,调用 my-blog-deploy 部署。" \
  --skills "github,my-blog-deploy,terminal" \
  --deliver "origin"

7.3 代码审查 Agent

# ~/.hermes/skills/code-review/SKILL.md 片段
context: |
  你是严格的代码审查员。收到 PR 链接后:
  1. 用 gh pr diff 拉取变更
  2. 逐文件检查:安全、性能、可读性、测试覆盖
  3. 输出:通过/拒绝 + 具体行内建议(可直接 gh pr comment)
  4. 必须给出可执行的修复命令或代码片段

八、从这里继续

方向 资源
官方文档 https://hermes-agent.nousresearch.com/docs
技能编写规范 https://hermes-agent.nousresearch.com/docs/skills/authoring
Cron 调度语法 https://crontab.guru/
MCP 服务器列表 https://github.com/modelcontextprotocol/servers
我的博客实战 https://ningop.com/tags/hermes/

结语

Hermes Agent 的核心价值不在「聊天」,而在把「会做的事」封装成技能、调度成 Cron、编排成多 Agent 流水线

这篇指南的每个代码块都在我自己的 ningop.com 博客自动化里跑通过。拿去用、改、再贡献回技能库,下一个受益的可能就是明天的你。

下一步建议:先跑通 hermes cron create 每日早报,体会「睡醒就有成果」的感觉。然后把你常做的重复操作(部署、审代码、整理笔记)逐个做成技能。


部署验证:本文发表后通过 my-blog-deploy 技能自动部署,ningop.compages.dev 双域名均返回 200。