Curator(策展器)
策展器是对代理创建的技能进行后台维护的机制。它追踪每个技能被查看、使用和修改的频率,将长期未使用的技能逐步迁移至 active → stale → archived 状态,并定期启动一个简短的辅助模型审查,提出合并建议或修正漂移。
它的存在是为了避免通过自我改进循环创建的技能无限堆积。每当代理解决一个新颖问题并保存一个技能时,该技能就会存放在 ~/.hermes/skills/ 中。没有维护机制,最终会积累大量狭窄的近似重复技能,污染目录并浪费令牌。
策展器从不触及捆绑技能(随仓库发布)或从中心安装的技能(来自 agentskills.io)。它只审查代理自行创作的技能。它也从不自动删除——最坏的情况是归档到 ~/.hermes/skills/.archive/,这是可恢复的。
关联 Issue #7816。
运行方式
策展器由空闲检查触发,而非定时任务守护进程。在 CLI 会话启动时,以及在网关定时器线程内的周期性触发点上,Hermes 检查:
- 距上次策展器运行是否已过去足够的时间(
interval_hours,默认 7 天),以及 - 代理是否已闲置足够长时间(
min_idle_hours,默认 2 小时)。
如果两个条件均满足,它会在后台 fork 一个 AIAgent 实例——与记忆/技能自我改进提示使用的模式相同。该 fork 在独立的提示缓存中运行,绝不触及当前对话。
:::info 首次运行行为
在全新安装(或首次安装后触发的预策展器 tick)时,策展器不会立即运行。首次观察将 last_run_at 设置为”现在”,并将首次真实运行推迟一个完整的 interval_hours 周期。这使您有一个完整的间隔来审查技能库、固定任何重要内容,或在策展器触及之前选择完全退出。
如果您想知道策展器在实际运行前会做什么,运行 hermes curator run --dry-run——它会生成相同的审查报告,但不改变技能库。
:::
一次运行分为两个阶段:
- 自动状态转换(确定性,无需 LLM)。技能在
stale_after_days(30 天)内未被使用则变为stale;在archive_after_days(90 天)内未被使用则移至~/.hermes/skills/.archive/。 - LLM 审查(单次辅助模型传递,
max_iterations=8)。fork 的代理调查代理创建的技能,可通过skill_view读取其中任意一个,并针对每个技能决定保留、修改(通过skill_manage)、合并重叠的技能,或通过终端工具归档。
已固定的技能不受策展器自动转换和代理自身的 skill_manage 工具影响。参见下方的固定技能。
配置
所有设置位于 config.yaml 的 curator: 下(而非 .env——这不是机密信息)。默认值:
curator:
enabled: true
interval_hours: 168 # 7 天
min_idle_hours: 2
stale_after_days: 30
archive_after_days: 90要完全禁用,设置 curator.enabled: false。
在更便宜的辅助模型上运行审查
策展器的 LLM 审查是一次常规的辅助任务槽——auxiliary.curator——与 Vision(视觉)、Compression(压缩)、Session Search(会话搜索)等并列。“Auto”表示”使用我的主聊天模型”;可通过覆盖该槽位来指定特定的提供商和模型进行审查。
最简单的方式——hermes model:
hermes model # → "Auxiliary models — side-task routing"
# → 选择 "Curator" → 选择提供商 → 选择模型同样的选择器在 Web 仪表盘的 Models 选项卡中也可用。
直接编辑 config.yaml(等效):
auxiliary:
curator:
provider: openrouter
model: google/gemini-3-flash-preview
timeout: 600 # 宽松设置——审查可能需要数分钟保留 provider: auto(默认值)会使审查传递通过您的主聊天模型路由,与其他辅助任务的行为一致。
:::note 旧版配置
早期版本使用独立的 curator.auxiliary.{provider,model} 配置块。该路径仍然有效,但会输出弃用日志——请迁移至上述 auxiliary.curator,以便策展器与其他辅助任务共享相同的底层机制(hermes model、仪表盘 Models 选项卡、base_url、api_key、timeout、extra_body)。
:::
CLI 命令
hermes curator status # 上次运行、计数、固定列表、LRU 前 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 会在 ~/.hermes/skills/.curator_backups/<utc-iso>/skills.tar.gz 处对 ~/.hermes/skills/ 生成 tar.gz 快照。如果某次运行归档或合并了您不希望变动的内容,您可以用一条命令撤销整个操作:
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)进行清理,以控制磁盘使用:
curator:
backup:
enabled: true
keep: 5设置 curator.backup.enabled: false 可禁用自动快照。手动 hermes curator backup 命令在备份禁用时仍可工作——标志对称地控制两条路径,因此不会意外绕过变异运行前的快照。
hermes curator status 还会列出最近最少使用的五个技能——快速了解哪些技能即将变为 stale。
相同的子命令也可以在运行中的会话(CLI 或网关平台)内通过 /curator 斜杠命令使用。
什么是”代理创建的”
如果一个技能的名称不在以下列表中,则被视为代理创建的:
~/.hermes/skills/.bundled_manifest(安装时从仓库复制的技能)~/.hermes/skills/.hub/lock.json(通过hermes skills install安装的技能)
~/.hermes/skills/ 中的所有其他内容都是策展器的管辖范围。这包括:
- 代理在对话中通过
skill_manage(action="create")保存的技能 - 您手动编写的
SKILL.md技能 - 通过外部技能目录指向 Hermes 的技能
:::warning 您手写的技能与代理保存的技能看起来一样 这里的来源是二元的(捆绑/中心 vs. 其他所有)。策展器无法区分您用于私有工作流的手写技能与自我改进循环在会话中保存的技能。两者都会落入”代理创建的”类别。
在首次真实运行之前(默认为安装后 7 天),请花点时间:
- 运行
hermes curator run --dry-run准确查看策展器会提出什么建议 - 使用
hermes curator pin <name>围栏保护您不希望被触及的内容 - 或者,如果您更愿意自己管理技能库,在
config.yaml中设置curator.enabled: false
归档内容始终可通过 hermes curator restore <name> 恢复,但事先固定比事后追溯合并更省事。
:::
如果您想保护某个特定技能永不被动——例如您依赖的手写技能——使用 hermes curator pin <name>。参见下一节。
固定技能
固定保护技能不被删除——包括策展器的自动归档传递和代理的 skill_manage(action="delete") 工具调用。一旦技能被固定:
- 策展器在自动状态转换(
active → stale → archived)中跳过它,并在 LLM 审查中指示不要动它 - 代理的
skill_manage工具拒绝对其执行delete,引导用户执行hermes curator unpin <name>。修补和编辑仍然可以进行,因此代理可以在不进行繁琐的固定/取消固定/再固定操作的情况下改进已固定技能的内容
通过以下命令固定和取消固定:
hermes curator pin <skill>
hermes curator unpin <skill>该标志在 ~/.hermes/skills/.usage.json 的技能条目中存储为 "pinned": true,因此在各会话间持久存在。
只有代理创建的技能可以被固定——捆绑和中心安装的技能本身就不受策展器修改的影响,如果尝试固定,hermes curator pin 将拒绝并返回解释性消息。
如果您需要比”不删除”更强的保证——例如,在代理仍然可以读取技能的情况下完全冻结其内容——直接用编辑器编辑 ~/.hermes/skills/<name>/SKILL.md。固定保护的是工具驱动的删除,而不是您自己的文件系统访问。
使用遥测
策展器在 ~/.hermes/skills/.usage.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_viewuse_count:技能被加载到对话的提示中patch_count:对技能执行skill_manage patch/edit/write_file/remove_file
捆绑和中心安装的技能明确排除在遥测写入之外。
每次运行报告
每次策展器运行都会在 ~/.hermes/logs/curator/ 下写入一个带时间戳的目录:
~/.hermes/logs/curator/
└── 20260429-111512/
├── run.json # 机器可读:完整保真度、统计信息、LLM 输出
└── REPORT.md # 人类可读摘要
REPORT.md 是快速查看某次运行做了什么的好方式——哪些技能发生了转换、LLM 审查员说了什么、修补了哪些技能。适合审计,无需 grep agent.log。
摘要中的重命名映射
如果一次运行将多个技能合并到一个总括技能下(或合并了近似的重复技能),运行结束时打印的用户可见摘要会包含明确的重命名映射,显示策展器应用的每个 旧名称 → 新名称 对。这是对每个技能转换行的补充,因此当一波重命名发生时,您无需对比 JSON 报告即可一目了然。该提示也会在 hermes curator pin 下显示,以便您立即固定总括名称。
恢复归档技能
如果策展器归档了您仍然需要的内容:
hermes curator restore <skill-name>这会将技能从 ~/.hermes/skills/.archive/ 移回活动树,并将其状态重置为 active。如果之后有同名的捆绑或中心安装技能,恢复操作会拒绝(否则会屏蔽上游)。
按环境禁用
策展器默认开启。要关闭它:
- **仅针对一个配置:**编辑
~/.hermes/config.yaml(或当前活动配置的配置文件),设置curator.enabled: false - 仅针对一次运行:
hermes curator pause——暂停状态在各会话间持续;使用resume重新启用
如果 min_idle_hours 尚未过去,策展器也会拒绝运行,因此在活跃的开发机器上,它自然只会在安静时段运行。
参见
- 技能系统 —— 技能的一般工作原理以及创建技能的自我改进循环
- 记忆 —— 维护长期记忆的并行后台审查
- 捆绑技能目录
- Issue #7816 —— 原始提案和设计讨论