Hermes Agent 源码解析 · 第 17 讲
Hermes Agent 源码解析 第 17 讲:Curator 编排器与后台自治 基于 Hermes Agent v0.16.0 源码 · 2026-06-29 一、从"对话机器人"到"自治Agent"的跃迁 前 16 讲我们逐层拆解了 Hermes 的核心运行时——从架构概览、对话循环、工具系统、插件、Provider 抽象、记忆与技能、网关适配、上下文压缩、MCP 集成、多模态、ACP 协议、CLI 交互、认证配置、预算控制、System Prompt 构建到工具执行。这些构成了 Hermes 的 "前台能力" 。 但 Hermes 的真正野心不止于此。它要成为一个 24/7 运行的自治 Agent ——即使你没有打开终端,它也在后台默默工作:管理技能库、执行定时任务、在每次对话后自我学习。这一讲我们深入 Hermes 的 "后台自治系统" ,核心组件包括: 📦 本讲核心文件 agent/curator.py (1835 行)— 技能编排器主逻辑 agent/curator_backup.py (695 行)— 快照与回滚 agent/background_review.py (608 行)— 每轮对话后的后台审查 cron/scheduler.py (2213 行)— 定时任务调度器 cron/jobs.py (1212 行)— 任务存储与管理 hermes_cli/curator.py (598 行)— CLI 子命令 二、Curator 编排器:技能库的"自治管家" 随着使用时间的增长,Agent 会创建大量技能——有些重复、有些过时、有些可以合并。Curator 就是为了解决这个问题而生的 后台技能维护编排器 。它不依赖 cron 守护进程,而是采用 空闲触发 机制:当 Agent 空闲超过 min_idle_hours (默认 2 小时),且距上次 Curator 运行超过 interval_hours (默认 7 天),就会自动启动一次审查。 Curator 的核心职责: 🔹 自动状态转换 :基于技能活跃度将技能标记为 active/stale/archived 🔹 LLM 审查 :派生一个 forked AIAgent 进行大规模技能合并与归档 🔹 快照与回滚 :每次审查前自动备份,支持一键回滚 🔹 状态持久化 :将运行状态写入 .curator_state 文件 三、技能生命周期状态机 Curator 维护一个 三态生命周期 ,转换完全基于时间戳计算,不需要 LLM 参与: 🟢 Active(活跃) ⬇️ 超过 stale_after_days(默认 30 天)无活动 🟡 Stale(陈旧) ⬇️ 超过 archive_after_days(默认 90 天)无活动 🔴 Archived(归档) 关键规则: 🔹 只处理 agent-created 技能 :内置技能和 Hub 安装的技能不受影响(除非开启 prune_builtins ) 🔹 从不自动删除 :归档 = 移动到 .archive/ ,随时可恢复 🔹 Pinned 技能免疫 :被用户标记为 pinned 的技能跳过所有自动转换 🔹 使用辅助客户端 :不触碰主会话的 prompt cache,独立运行 状态机代码在 apply_automatic_transitions() 中,是一个 纯函数 ——遍历所有候选技能,基于 last_activity_at 或 created_at 时间戳做出决定: def apply_automatic_transitions(now=None) -> Dict[str, int]: """遍历所有候选技能,基于活跃度时间戳转换状态。""" stale_cutoff = now - timedelta(days=stale_after_days) archive_cutoff = now - timedelta(days=archive_after_days) for row in agent_created_report(): if row.get("pinned"): continue # Pinned 技能跳过 anchor = last_activity or created_at or now if anchor…