Hermes Agent 源码解析(九):Skills —— 以前以为「自我进化」是营销话术,读完源码我信了
以前觉得"自我进化"就是营销话术——哪个开源项目不吹自己有多智能?拆完 Skills 源码才发现:Agent 完成复杂任务后,自己写了一份说明书。以后遇到类似问题,它不用再推理,直接翻说明书。Curator 惰性审查保质量,30 天不活跃自动归档但永不删除。
这套从创建到淘汰的完整生命周期管理,让"自我进化"从四个字变成了真东西。
三个技能来源
skills/ ← 内置技能,默认加载(随仓库发布)optional-skills/ ← 内置但默认不加载(重依赖或小众)~/.hermes/skills/ ← 用户/Agent 自建技能(运行时创建)技能是一组遵循 SKILL.md 格式的文本文件,结构如下:

SKILL.md 标准
一个标准的 SKILL.md 包含核心元数据字段和 Markdown 章节:
---name:my-skilldescription:一句话描述(≤60字符)version:1.0.0platforms: [macos, linux]---YAML 头之后是 ## When to Use、## Prerequisites、## How to Run 等约 8 个标准章节,顺序固定。description 的精确度直接决定 Agent 能否在需要时命中该技能——这是最关键的召回信号。
AGENTS.md 中规定了 8 条硬性标准,包括:
1. description≤ 60 字符,一句话2. 工具引用用反引号括起来的 Hermes 内建工具名( read_file、web_search)3. platforms与实际脚本的平台依赖严格对应4. author署真名,不署 "Hermes Agent"5. 脚本放 scripts/,参考放references/,模板放templates/6. 测试放在 tests/skills/test_<skill>_skill.py7. 新技能有对应测试
注入时机:User Message 而非 System Prompt
这是关键的缓存优化设计:
# agent/skill_commands.py# 扫描 ~/.hermes/skills/,注入为 user message# 不嵌入 system prompt → 不破坏 prefix cache• System prompt 变了 → API 侧的 prefix cache 整个失效 → 成本激增 • User message 变了 → 不影响系统 prompt 的缓存命中
所以技能内容被附加为 user message,而非嵌入系统提示词。
Curator —— 技能生命周期管理器
agent/curator.py(1,781 行)后台守护技能的生命周期:
不可变原则
Curator 只操作 created_by: "agent" 的技能Bundled + hub-installed 技能 → 不可碰永不删除 → 最大破坏是归档(可恢复)Pinned 技能 → 豁免所有自动转换生命周期状态机
技能生命周期分三态:active(活跃)→ 30 天无活动后变为 stale(过时)→ 再 90 天无活动后归档至 ~/.hermes/skills/.archive/。归档不会删除数据,随时可手动恢复——最大破坏力就是归档,体现了"永不删除"的设计哲学。
Curator 配置
curator:enabled:trueinterval_hours:168stale_after_days:30archive_after_days:90每隔 7 天(168 小时)运行一次,利用 Agent 空闲时的 maybe_run_curator() 惰性触发,不依赖 cron 守护进程——这与 Hermes Agent 整体"按需执行"的设计一脉相承。
运行机制
maybe_run_curator() 在 Agent 空闲时触发。不使用 cron,而是惰性检查:Agent 完成一轮对话后,如果距离上次 curator 运行已超过 interval_hours,fork 一个背景 AIAgent 做审查。
审查 Agent 使用 auxiliary 客户端(辅助 LLM),不影响主会话的 prompt cache。
技能使用追踪
tools/skill_usage.py 维护 ~/.hermes/skills/.usage.json:
{"my-skill":{"use_count":12,"last_activity_at":"2026-05-18T10:30:00Z","state":"active"}}每条记录追踪使用次数和最后活跃时间——Curator 以此判定技能是否活跃。pinned 标记可豁免任何自动转换,让关键技能始终可用。
这些数据供 Curator 判定技能是否"活跃"。
Skills Hub
tools/skills_hub.py(OptionalSkillSource)管理 optional-skills/ 目录下的技能。用户通过 hermes skills install official/<category>/<skill> 安装。
欢迎一起讨论! 「自我进化」这个特性你最想用在什么场景?你觉得 Curator 的惰性检查机制够用吗?
📢 关注我,获取最新开源更新日志和开发者工具动态。如果觉得这篇文章有用,欢迎转发给身边的开发者朋友。
下一篇讲记忆与会话 —— 如何让 Agent 跨会话记住你。
夜雨聆风