岚叔用自研工具 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 用 ![alt](url) 会自动作为原生照片发送

会话上下文:当前在哪、哪个群组/thread、会话类型、已连接平台、定时任务投递选项。

工具加载机制

Hermes 总共注册了 51 个工具,但会话只加载了 30 个。未加载的工具:

未加载原因
mcp_*(3个)没配 MCP server
rl_*(10个)RL 训练工具集,未启用
homeassistant_*(4个)未配 Home Assistant
image_generation未配图像生成 API Key
mixture_of_agentsMoA 工具集未启用
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 机制本质上也实现了按需加载,只是路径不同。