ByteNoteByteNote

字节笔记本

2026年6月21日

hermes教程-策展人

API中转
¥120

策展人是一个后台维护过程,用于管理智能体创建的技能。它跟踪每个技能被查看、使用和修补的频率,将长期未使用的技能通过 active → stale → archived 状态进行转移,并定期启动一个简短的辅助模型审查,提出合并建议或修补漂移。

它的存在是为了防止通过自我改进循环创建的技能无限堆积。每次智能体解决一个新问题并保存一个技能时,该技能都会存放在 ~/.hermes/skills/ 中。如果没有维护,最终你会得到几十个狭窄的近似重复项,污染目录并浪费令牌。

默认情况下(prune_builtins: true),策展人可以归档未使用的捆绑内置技能(随仓库一起提供),这些技能在 archive_after_days 天内未被使用,同时也会管理它主要管理的智能体创建的技能。从中心安装的技能(来自 agentskills.io)始终不受影响。设置 curator.prune_builtins: false 可以恢复旧的仅智能体创建行为,此时捆绑技能永远不会被触及。策展人也从不自动删除——最坏的结果是归档到 ~/.hermes/skills/.archive/,这是可恢复的。

跟踪 issue #7816

如何运行

策展人由不活动检查触发,而不是 cron 守护进程。在 CLI 会话启动时,以及在网关的 cron 滴答线程内的定期滴答中,Hermes 会检查:

  1. 自上次策展人运行以来是否已过去足够的时间(interval_hours,默认 7 天),以及
  2. 智能体是否已空闲足够长的时间(min_idle_hours,默认 2 小时)。

如果两者都为真,它会生成一个 AIAgent 的后台分支——与记忆/技能自我改进提示使用的模式相同。该分支在自己的提示缓存中运行,并且从不触及活动对话。

信息 — 首次运行行为

在新安装(或 hermes update 后首次运行预策展人安装的滴答)时,策展人不会立即运行。第一次观察将 last_run_at 设置为“现在”,并将第一次实际运行推迟一个完整的 interval_hours。这为你提供了一个完整的间隔来审查你的技能库,固定任何重要的内容,或者在策展人触及它之前完全选择退出。

如果你想在实际运行之前查看策展人做什么,请运行 hermes curator run --dry-run——它会生成相同的审查报告,但不会修改库。

一次运行有两个阶段:

  1. 自动转移(确定性,无 LLM)。未使用超过 stale_after_days(30)天的技能变为 stale;未使用超过 archive_after_days(90)天的技能被移动到 ~/.hermes/skills/.archive/
  2. LLM 审查(单次辅助模型传递,max_iterations=8)。分支智能体调查智能体创建的技能,可以使用 skill_view 读取其中任何一个,并针对每个技能决定是保留、修补(通过 skill_manage)、合并重叠的技能,还是通过终端工具归档。合并将技能视为一个完整的包:如果一个技能有 references/templates/scripts/assets/ 或指向这些路径的相对链接,策展人必须要么保持其独立,要么重新安置所需的支持文件并重写路径,要么将整个包原封不动地归档——而不是仅将 SKILL.md 扁平化到另一个技能的 references/ 文件中。

固定的技能对策展人的自动转移和智能体自己的 skill_manage 工具都是禁区。请参阅下面的固定技能

配置

所有设置都位于 config.yaml 中的 curator: 下(不是 .env——这不是秘密)。默认值:

yaml
curator:
  enabled: true
  interval_hours: 168          # 7 天
  min_idle_hours: 2
  stale_after_days: 30
  archive_after_days: 90
  prune_builtins: true         # 也归档未使用的捆绑内置技能(中心技能始终豁免)

要完全禁用,请设置 curator.enabled: false

在更便宜的辅助模型上运行审查

策展人的 LLM 审查传递是一个常规的辅助任务槽——auxiliary.curator——与视觉、压缩、会话搜索等并列。“自动”意味着“使用我的主要聊天模型”;覆盖该槽以指定一个特定的提供者 + 模型用于审查传递。

最简单的方法——hermes model

bash
hermes model                   # → "辅助模型 — 侧任务路由"
## → 选择 "策展人" → 选择提供者 → 选择模型

相同的选择器在 Web 仪表板的 模型 选项卡下也可用。

直接 config.yaml(等效):

yaml
auxiliary:
  curator:
    provider: openrouter
    model: google/gemini-3-flash-preview
    timeout: 600               # 宽松——审查可能需要几分钟

provider: auto(默认值)保留,会将审查传递路由到你的主要聊天模型,与其他所有辅助任务的行为一致。

注意 — 旧版配置

早期版本使用了一个一次性的 curator.auxiliary.{provider,model} 块。该路径仍然有效,但会输出一条弃用日志行——请迁移到上面的 auxiliary.curator,以便策展人共享与其他所有辅助任务相同的管道(hermes model、仪表板模型选项卡、base_urlapi_keytimeoutextra_body)。

CLI

bash
hermes curator status         # 上次运行、计数、固定列表、最近最少使用前 5 名
hermes curator run            # 立即触发审查(阻塞直到 LLM 传递完成)
hermes curator run --background  # 即发即忘:在后台线程中启动 LLM 传递
hermes curator run --dry-run  # 仅预览——报告而不进行任何修改
hermes curator backup         # 手动创建 ~/.hermes/skills/ 的快照
hermes curator rollback       # 从最新快照恢复
hermes curator rollback --list     # 列出可用快照
hermes curator rollback --id <ts>  # 恢复特定快照
hermes curator rollback -y         # 跳过确认提示
hermes curator pause          # 停止运行直到恢复
hermes curator resume
hermes curator pin <skill>    # 永远不要自动转移此技能
hermes curator unpin <skill>
hermes curator restore <skill>  # 将归档技能移回活动状态
hermes curator list-archived    # 列出当前在 ~/.hermes/skills/.archive/ 中的技能
hermes curator archive <skill>  # 立即手动归档单个技能
hermes curator prune [--days N] # 批量归档空闲 >= N 天(默认 90)的智能体创建技能

备份和回滚

在每次实际策展人传递之前,Hermes 会在 ~/.hermes/skills/.curator_backups/<utc-iso>/skills.tar.gz 处创建 ~/.hermes/skills/ 的 tar.gz 快照。如果一次传递归档或合并了你不想被触及的内容,你可以用一个命令撤销整个运行:

bash
hermes curator rollback        # 恢复最新快照(带确认)
hermes curator rollback -y     # 跳过提示
hermes curator rollback --list # 查看所有快照,包含原因 + 大小

回滚本身是可逆的:在替换技能树之前,Hermes 会创建另一个标记为 pre-rollback to <target-id> 的快照,因此可以通过使用 --id 向前滚动到该快照来撤销错误的回滚。

你也可以随时使用 hermes curator backup --reason "before-refactor" 手动创建快照。--reason 字符串会进入快照的 manifest.json 中,并在 --list 中显示。

快照会被修剪到 curator.backup.keep(默认 5)以限制磁盘使用:

yaml
curator:
  backup:
    enabled: true
    keep: 5

设置 curator.backup.enabled: false 以禁用自动快照。当备份被禁用时,手动 hermes curator backup 命令仍然有效,但前提是你先设置了 enabled: true——该标志对称地控制两条路径,因此无法在修改性运行中意外跳过运行前快照。

hermes curator status 还会列出五个最近最少使用的技能——快速查看哪些技能可能即将变得过时。

相同的子命令在运行中的会话(CLI 或网关平台)内也可作为 /curator 斜杠命令使用。

“智能体创建”的含义

策展人只管理在 ~/.hermes/skills/.usage.json 中明确标记为智能体创建的技能。一个技能在满足以下所有条件时符合资格:

  1. 其名称不在 ~/.hermes/skills/.bundled_manifest 中(随仓库提供的捆绑技能)。
  2. 其名称不在 ~/.hermes/skills/.hub/lock.json 中(中心安装的技能)。
  3. .usage.json 条目具有 "created_by": "agent""agent_created": true

目前,只有后台自我改进审查分支会设置此标记——当它在定期审查传递(大约每 10 个智能体轮次)期间创建新的总括技能时。后台分支以 "background_review" 的写入来源运行(通过 tools/skill_provenance.py),这是唯一触发 skill_managemark_agent_created() 调用的路径。

前台智能体在对话期间通过 skill_manage(action="create") 创建的技能被标记为智能体创建——它们被视为用户指导的,策展人故意不碰它们。

警告 — 你手动编写的技能不会被策展

如果你手动创建了 SKILL.md 或将 Hermes 指向外部技能目录,该技能将具有 created_by: null(或字段缺失)的 .usage.json 条目。策展人不会碰它。这同样适用于前台智能体应你请求创建的技能。

要查看策展人实际管理哪些技能,请运行 hermes curator status。如果智能体创建计数为 0,则当前没有技能处于策展人的管辖范围内——LLM 审查传递将被跳过,报告将显示 Model: (not resolved) via (not resolved)Duration: 0s

被标记为智能体创建的技能遵循完整的生命周期:

  • active → (30 天未使用) stale → (90 天未使用) archived
  • 固定的技能绕过所有自动转移
  • 归档可通过 hermes curator restore <name> 恢复

如果你想保护特定技能永远不被触及——例如你依赖的手动编写的技能——请使用 hermes curator pin <name>。请参阅下一节。

固定技能

固定保护技能不被删除——无论是策展人的自动归档传递还是智能体的 skill_manage(action="delete") 工具调用。一旦技能被固定:

  • 策展人在自动转移(active → stale → archived)期间跳过它,并且其 LLM 审查传递被指示不要碰它。
  • 智能体的 skill_manage 工具拒绝对其执行 delete,并提示用户使用 hermes curator unpin <name>。修补和编辑仍然可以进行,因此智能体可以在出现陷阱时改进固定技能的内容,而无需进行固定/取消固定/重新固定的操作。

使用以下命令固定和取消固定:

bash
hermes curator pin <skill>
hermes curator unpin <skill>

该标志作为 "pinned": true 存储在技能在 ~/.hermes/skills/.usage.json 的条目中,因此在会话之间持久存在。

只有智能体创建的技能可以被固定——hermes curator pin 会拒绝捆绑和中心安装的技能,并给出解释性消息。中心安装的技能永远不会受到策展人修改的影响。捆绑的内置技能仅在 curator.prune_builtins: true(默认)时被触及,并且即使如此,也仅在 archive_after_days 天未使用后归档——从不修补、合并或删除。设置 curator.prune_builtins: false 以完全豁免捆绑技能。

一小部分受保护的内置技能被硬编码为永远不可归档且不可合并,无论 curator.prune_builtins、固定状态或 LLM 判断如何。这些技能承载用户体验——例如,plan/plan 斜杠命令流程提供支持——因此静默归档一个会导致其斜杠命令变成“未知命令”错误,而不会给你任何信号。受保护的内置技能会从策展人的候选列表中完全过滤掉,因此合并传递永远不会看到它们。

如果你想要比“不删除”更强的保证——例如,在智能体仍然读取技能内容的同时完全冻结其内容——请直接用编辑器编辑 ~/.hermes/skills/<name>/SKILL.md。固定保护的是工具驱动的删除,而不是你自己的文件系统访问。

使用遥测

策展人在 ~/.hermes/skills/.usage.json 中维护一个边车文件,每个技能一个条目:

json
{
  "my-skill": {
    "use_count": 12,
    "view_count": 34,
    "last_used_at": "2026-04-24T18:12:03Z",
    "last_viewed_at": "2026-04-23T09:44:17Z",
    "patch_count": 3,
    "last_patched_at": "2026-04-20T22:01:55Z",
    "created_at": "2026-03-01T14:20:00Z",
    "state": "active",
    "pinned": false,
    "archived_at": null
  }
}

计数器在以下情况下递增:

  • view_count:智能体对该技能调用 skill_view
  • use_count:技能被加载到对话的提示中。
  • patch_countskill_manage patch/edit/write_file/remove_file 在该技能上运行。

捆绑和中心安装的技能被明确排除在遥测写入之外。

每次运行报告

每次策展人运行都会在 ~/.hermes/logs/curator/ 下写入一个带时间戳的目录:

text
~/.hermes/logs/curator/
└── 20260429-111512/
    ├── run.json      # 机器可读:完整保真度、统计信息、LLM 输出
    └── REPORT.md     # 人类可读摘要

REPORT.md 是查看给定运行所做操作的快速方法——哪些技能发生了转移、LLM 审查者说了什么、它修补了哪些技能。适合审计,而无需 grep agent.log

注意 — 没有候选?报告显示 (not resolved)

当策展人没有智能体创建的技能需要审查时,LLM 审查传递会被完全跳过。报告标题将显示 Model: (not resolved) via (not resolved)Duration: 0s——这表示配置错误或模型解析失败。它仅仅意味着没有候选,因此从未调用过模型。自动转移阶段仍然运行并正常报告其计数。

摘要中的重命名映射

如果一次运行将多个技能合并到一个总括下(或合并了近似重复项),运行结束时打印的用户可见摘要会包含一个显式的重命名映射,显示策展人应用的每个 old-name → new-name 对。这是对每个技能转移行的补充,因此当一波重命名发生时,你可以一目了然地发现它们,而无需比较 JSON 报告。该提示也会在 hermes curator pin 下显示,以便你可以立即固定总括名称以锁定新标签。

恢复归档技能

如果策展人归档了你仍然想要的内容:

bash
hermes curator restore <skill-name>

这会将技能从 ~/.hermes/skills/.archive/ 移回活动树,并将其状态重置为 active。如果此后有同名的捆绑或中心安装技能被安装(会遮蔽上游),则恢复会拒绝。

按环境禁用

策展人默认开启。要关闭它:

  • 仅针对一个配置文件: 编辑 ~/.hermes/config.yaml(或活动配置文件的配置)并设置 curator.enabled: false
  • 仅针对一次运行: hermes curator pause——暂停在会话之间持久存在;使用 resume 重新启用。

如果 min_idle_hours 尚未过去,策展人也会拒绝运行,因此在活跃的开发机器上,它自然只会在安静时段运行。

另请参阅

分享: