跳到主要内容

Curator(技能策展人)

Curator 是针对 Agent 创建的技能 的后台维护流程。它会跟踪每个技能的查看、使用和修补频率,将长期未使用的技能从 active(活跃)状态迁移至 stale(陈旧),最终进入 archived(归档)状态,并定期启动一个短暂的辅助模型审查,以提出合并建议或修复漂移。

它的存在是为了防止通过 自我改进循环 创建的技能无限堆积。每当 Agent 解决一个新问题并保存一个技能时,该技能都会存入 ~/.hermes/skills/。如果没有维护机制,你最终会得到数十个狭窄且近乎重复的技能,污染技能目录并浪费 Token。

默认情况下(prune_builtins: true),除了主要管理的 Agent 创建的技能外,Curator 还可以在 archive_after_days 天未使用后归档 未使用的内置捆绑技能(随仓库一起发布)。从 agentskills.io 安装的 Hub 技能始终不受影响。设置 curator.prune_builtins: false 可恢复旧的仅针对 Agent 创建技能的行为,此时内置技能永远不会被触及。Curator 也 绝不会自动删除 技能——最坏的结果是归档到 ~/.hermes/skills/.archive/,这是可恢复的。

追踪 issue #7816

运行方式

Curator 由空闲检查触发,而非 cron 守护进程。在 CLI 会话启动时,以及在网关的 cron-ticker 线程中的周期性滴答声中,Hermes 会检查是否满足以下条件:

  1. 距离上次 Curator 运行已过去足够的时间(interval_hours,默认 7 天),且
  2. Agent 已空闲足够长的时间(min_idle_hours,默认 2 小时)。

如果两者均为真,它将生成 AIAgent 的后台分支——这与内存/技能自我改进提示所使用的模式相同。该分支在其独立的提示缓存中运行,绝不会干扰当前活动对话。

首次运行行为

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

如果你想在 Curator 实际运行之前查看它 做什么,请运行 hermes curator run --dry-run——它会生成相同的审查报告,但不会变更技能库。

一次运行包含两个阶段:

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

固定技能对 Curator 的自动状态转换和 Agent 自身的 skill_manage 工具均不可见。请参阅下方的 固定技能

配置

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

curator:
enabled: true
interval_hours: 168 # 7 days
min_idle_hours: 2
stale_after_days: 30
archive_after_days: 90
prune_builtins: true # archive unused bundled built-in skills too (hub skills always exempt)

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

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

Curator 的 LLM 审查步骤是一个常规的辅助任务槽位——auxiliary.curator——与 Vision、Compression、Session Search 等并列。“Auto”表示“使用我的主聊天模型”;覆盖该槽位以指定特定的提供商 + 模型用于审查步骤。

最简单的方法——hermes model

hermes model                   # → "Auxiliary models — side-task routing"
# → pick "Curator" → pick provider → pick model

同样的选择器也可在 Web 仪表板的 Models 选项卡中找到。

直接配置 config.yaml(等效):

auxiliary:
curator:
provider: openrouter
model: google/gemini-3-flash-preview
timeout: 600 # generous — reviews can take several minutes

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

遗留配置

早期版本使用一次性配置的 curator.auxiliary.{provider,model} 块。该路径仍然有效,但会发出弃用日志行——请迁移到上述的 auxiliary.curator,以便 Curator 与其他辅助任务共享相同的管道(hermes model、仪表板 Models 选项卡、base_urlapi_keytimeoutextra_body)。

CLI

hermes curator status         # last run, counts, pinned list, LRU top 5
hermes curator run # trigger a review now (blocks until the LLM pass finishes)
hermes curator run --background # fire-and-forget: start the LLM pass in a background thread
hermes curator run --dry-run # preview only — report without any mutations
hermes curator backup # take a manual snapshot of ~/.hermes/skills/
hermes curator rollback # restore from the newest snapshot
hermes curator rollback --list # list available snapshots
hermes curator rollback --id <ts> # restore a specific snapshot
hermes curator rollback -y # skip the confirmation prompt
hermes curator pause # stop runs until resumed
hermes curator resume
hermes curator pin <skill> # never auto-transition this skill
hermes curator unpin <skill>
hermes curator restore <skill> # move an archived skill back to active
hermes curator list-archived # list skills currently in ~/.hermes/skills/.archive/
hermes curator archive <skill> # manually archive a single skill now
hermes curator prune [--days N] # bulk-archive agent-created skills idle >= N days (default 90)

备份和回滚

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

hermes curator rollback        # restore newest snapshot (with confirmation)
hermes curator rollback -y # skip the prompt
hermes curator rollback --list # see all snapshots with reason + size

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

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

快照会被修剪至 curator.backup.keep(默认值为 5)以限制磁盘占用:

curator:
backup:
enabled: true
keep: 5

设置 curator.backup.enabled: false 可禁用自动快照功能。仅在首先设置 enabled: true 时,手动执行的 hermes curator backup 命令才能在备份禁用的情况下正常工作——该标志对称地控制两条路径,从而确保在可变运行中不会意外跳过运行前快照。

hermes curator status 还会列出最近最少使用的五个技能——这是一种快速查看哪些技能可能即将过期的方法。

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

“agent-created”(代理创建)的含义

Curator 仅管理在 ~/.hermes/skills/.usage.json 中明确标记为 agent-created 的技能。当满足以下所有条件时,技能才符合资格:

  1. 其名称不在 ~/.hermes/skills/.bundled_manifest 中(随仓库一起发布的捆绑技能)。
  2. 其名称不在 ~/.hermes/skills/.hub/lock.json 中(通过 Hub 安装的技能)。
  3. .usage.json 条目包含 "created_by": "agent""agent_created": true

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

前台代理在对话期间通过 skill_manage(action="create") 创建的技能不会被标记为 agent-created——它们被视为用户导向的,Curator 有意不干预它们。

你手写的技能不会被 Curator 管理

如果你手动创建了 SKILL.md 或将 Hermes 指向外部技能目录,该技能的 .usage.json 条目中的 created_by 将为 null(或缺少该字段)。Curator 不会触碰它。同样的规则也适用于前台代理应你的要求创建的技能。

要查看 Curator 实际管理的技能,请运行 hermes curator status。如果 agent-created 计数为 0,则当前没有技能处于 Curator 的管理范围内——LLM 审查步骤将被跳过,报告将显示 Model: (not resolved) via (not resolved)Duration: 0s

属于 agent-created 的技能遵循完整的生命周期:

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

如果你想保护特定技能免受任何干预——例如你依赖的手写技能——请使用 hermes curator pin <name>。请参阅下一节。

锁定(Pinning)技能

锁定可以保护技能不被删除——无论是 Curator 的自动归档流程,还是代理的 skill_manage(action="delete") 工具调用。一旦技能被锁定:

  • Curator 会在自动转换(active → stale → archived)期间跳过它,并且其 LLM 审查步骤会被指示忽略它。
  • 代理的 skill_manage 工具 会拒绝对其执行 delete 操作,并引导用户使用 hermes curator unpin <name>。补丁和编辑仍然可以通过,因此当出现问题时,代理可以在不进行“解锁/重新锁定”繁琐操作的情况下改进已锁定技能的内容。

使用以下命令进行锁定和解锁:

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

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

只有 agent-created 技能可以被锁定——如果你尝试锁定捆绑技能或 Hub 安装的技能,hermes curator pin 会拒绝操作并给出解释性消息。Hub 安装的技能永远不会受到 Curator 的变更影响。捆绑内置技能仅在 curator.prune_builtins: true(默认值)时才会被触及,即便如此,也只有在 archive_after_days 天未使用后才会被归档——绝不会被打补丁、合并或删除。设置 curator.prune_builtins: false 可完全豁免捆绑技能。

一小部分 受保护的内置技能 被硬编码为永远不可归档且永远不可合并,无论 curator.prune_builtins 设置、锁定状态或 LLM 判断如何。这些技能支撑着关键的 UX——例如,plan 支持 /plan 斜杠命令流程——因此静默归档其中一个会导致其斜杠命令变成“Unknown command”错误,且没有任何提示。受保护的内置技能会从 Curator 的候选列表中完全过滤掉,因此合并步骤永远不会看到它们。

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

使用遥测

Curator 在 ~/.hermes/skills/.usage.json 中维护一个 sidecar 文件,每个技能对应一个条目:

{
"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:代理(agent)对技能调用 skill_view
  • use_count:技能被加载到对话的提示词(prompt)中。
  • patch_count:对技能运行 skill_manage patch/edit/write_file/remove_file

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

每次运行的报告

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

~/.hermes/logs/curator/
└── 20260429-111512/
├── run.json # machine-readable: full fidelity, stats, LLM output
└── REPORT.md # human-readable summary

REPORT.md 提供了一种快速查看给定运行执行情况的方法——哪些技能发生了状态转换、LLM 审查器的意见是什么、它修补了哪些技能。这便于审计,而无需去 grep agent.log

没有候选项?报告显示 (not resolved)

当 Curator 没有由代理创建的技能可供审查时,LLM 审查阶段会被完全跳过。报告头部将显示 Model: (not resolved) via (not resolved),且 Duration: 0s——这并 表示配置错误或模型解析失败。这仅仅意味着没有候选项,因此从未调用过模型。自动转换阶段仍然会运行并正常报告其计数。

摘要中的重命名映射

如果一次运行将多个技能合并到一个总括技能(umbrella)下(或合并了近似重复项),则在运行结束时打印的用户可见摘要中会包含一个明确的重命名映射,显示 Curator 应用的每个 旧名称 → 新名称 对。除了每个技能的状态转换行之外,这样当出现大量重命名时,你可以一目了然地发现它们,而无需对 JSON 报告进行差异比较。该提示也会出现在 hermes curator pin 下,以便你可以立即固定总括名称,从而锁定新标签。

恢复已归档的技能

如果 Curator 归档了你仍然想要的技能:

hermes curator restore <skill-name>

这会将技能从 ~/.hermes/skills/.archive/ 移回活动树,并将其状态重置为 active。如果此后已安装了同名的捆绑技能或从 Hub 安装的技能(这会遮蔽上游版本),恢复操作将拒绝执行。

按环境禁用

Curator 默认启用。要关闭它:

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

如果未经过 min_idle_hours 指定的空闲时间,Curator 也会拒绝运行,因此在活跃的开发机器上,它自然只会在安静时段运行。

另见