岚叔用自研工具 model-box 完整导出了 Hermes Agent 的系统提示词并逐层拆解。结论先说:万字级别不是幻觉,但一半以上其实可以优化。
系统提示词全貌
总字符数:~36,700 chars(~10K tokens),分 9 层:
┌─────────────────────────────────────────────┐
│ 1. SOUL.md — Agent 身份/人格 │
│ 2. 记忆使用指南 — Memory 工具使用规范 │
│ 3. MEMORY — 持久化记忆快照(冻结) │
│ 4. USER PROFILE — 用户画像快照(冻结) │
│ 5. Skills 索引 — 全量技能列表(~80个) │
│ 6. AGENTS.md — 项目级开发指南 │
│ 7. 会话元数据 — 时间/模型/Provider │
│ 8. 平台提示 — Telegram 特定行为 │
│ 9. 会话上下文 — 来源/群组/投递选项 │
└─────────────────────────────────────────────┘
各层解析
SOUL.md:定义 Agent 人格,硬编码在 _build_system_prompt() 里,告诉模型如何使用 memory 工具:
- 用 memory 工具保存持久事实(用户偏好、环境细节、工具特性)
- 不要保存任务进度、完成日志(用 session_search 回忆)
- 发现非平凡工作流 → 保存为 Skill
- 使用中发现 Skill 过时 → 立即用
skill_manage(action='patch')修复
MEMORY(冻结快照):会话内不变,包含 7 个主题板块,记录用户的关键信息、偏好、Wiki 维护要求等。
USER PROFILE(冻结快照):描述用户是谁,当前模型配置概览,GitHub 排版偏好等。
Skills 索引:~80+ 个 Skill 的完整分类列表,占 5000 chars。每个只展示名称 + 描述前缀(截断),模型需要时调用 skill_view(name) 加载完整内容。
AGENTS.md(问题核心):占了整个系统提示的近一半,20,360 chars,单文件上限 20,000 chars,所以中间被截断了一小段。内容包括:
- 完整目录树 + 文件职责
- 文件依赖链:registry → tools → model_tools → run_agent
- AIAgent 类的构造参数、chat() 和 run_conversation() 接口
- CLI 架构、皮肤/主题系统
- 添加工具的三步指南
- 6 个 Known Pitfalls
- pytest 测试指南
平台提示(Telegram):
- 不使用 Markdown(Telegram 不渲染)
- 媒体文件投递方式:
MEDIA:/path/to/file - 图片 URL 用
会自动作为原生照片发送
会话上下文:当前在哪、哪个群组/thread、会话类型、已连接平台、定时任务投递选项。
工具加载机制
Hermes 总共注册了 51 个工具,但会话只加载了 30 个。未加载的工具:
| 未加载 | 原因 |
|---|---|
mcp_*(3个) | 没配 MCP server |
rl_*(10个) | RL 训练工具集,未启用 |
homeassistant_*(4个) | 未配 Home Assistant |
image_generation | 未配图像生成 API Key |
mixture_of_agents | MoA 工具集未启用 |
send_message | 当前平台配置未启用 |
筛选逻辑在 model_tools.py 的 _discover_tools() 里,通过 check_fn(检查 API Key 是否存在)和 enabled_toolsets/disabled_toolsets 决定最终加载哪些工具。
优化方案:省 5K tokens
AGENTS.md 占了近 5K tokens,但如果不是做 Hermes 二次开发,这部分其实可以去掉。方法:
方案一:配置 TERMINAL CWD
告诉 Hermes:请将主 agent cwd 配置为 ~,然后重启。新开 session 后生效。
方案二:自定义 AGENTS.md
项目文件优先级:.hermes.md → AGENTS.md → CLAUDE.md → .cursorrules,挑一个最小的用即可。
效果:从 ~36,700 chars 降到 ~18,000 chars,每次对话省 5K tokens。
Hermes vs OpenClaw:AGENTS.md 设计差异
岚叔特别指出:Hermes 的 AGENTS.md 是项目级别的,可以动态加载;OpenClaw 是全局的,每次都要加载。
Hermes 相当于实现了 AGENTS.md 的动态加载,OpenClaw 就没法这么灵活,怎么都得加载 AGENTS.md 等相关文件。
不过两边其实在解决同一个问题:按需加载。OpenClaw 的 skill_view 机制本质上也实现了按需加载,只是路径不同。
Hermes 的 AGENTS.md 动态加载设计比 OpenClaw 更灵活——但 OpenClaw 用户也没必要慌,这篇文章的核心是「按需加载」逻辑,两边都在解决同一个问题,只是路径不同。