Hermes
§1 · Hermes 是什么
Section titled “§1 · Hermes 是什么”Nous Research 出品的 Python agent。定位是「长期运行、自改进、对资源约束敏感」的本地 agent。pyproject 加 flake.nix 支持 macOS、Linux、Termux(Android)多目标。
§2 · 按目录分层的架构栈
Section titled “§2 · 按目录分层的架构栈”| 维度 | Codex | Claude Code | OpenClaw | Hermes |
|---|---|---|---|---|
| 入口 | `hermes` 主二进制(CLI) | `hermes_cli/` 子命令分发 | `mcp_serve.py` MCP server 入口 | `hermes_state.py` 全局状态 |
| 核心 | `agent/` turn loop 加 insights 加 memory_manager | `gateway/` 模型网关 | `model_tools.py` 工具表 | `acp_adapter/` ACP 协议 |
| 记忆 | `tools/memory_tool.py` MEMORY.md(2200 char)加 USER.md(1375 char) | 4 actions:add、replace、remove、read | frozen snapshot 注入 system prompt | `_MEMORY_THREAT_PATTERNS` 11 条扫描 |
| 安全 | `tools/tirith_security.py` 子进程扫描器 | exit code 决定 verdict,不依赖 LLM | `agent/redact.py` 30+ vendor 前缀脱敏 | cosign 加 SHA-256 双重校验 tirith 二进制 |
| 定时任务 | `cron/` croniter 实现 | `~/.hermes/cron/jobs.json` 持久化 | `ONESHOT_GRACE_SECONDS = 120` | `_CRON_THREAT_PATTERNS` 10 条威胁扫描 |
| 观测与计费 | `agent/insights.py` 灵感来自 Claude Code | `agent/usage_pricing.py` 5 种 source 优先级 | `CanonicalUsage` 加 `PricingEntry` | 本地 markdown 报告 |
§3 · 工程亮点
Section titled “§3 · 工程亮点”- 工程克制是最大特色:2 个 markdown 文件管所有长期记忆。2200 加 1375 字符的硬约束逼着模型自己排序优先级。
- frozen snapshot 保 prefix cache:记忆在 session 加载时 snapshot 进 system prompt。mid-session 写入只落盘不重建 prompt,下次 session 才生效。prefix cache 不破。
- tirith 安全外包:内容级安全扫描放到独立 Python 二进制,主进程只看 exit code(0/1/2)。fail_open 默认开,agent 永远能跑。
- 30+ vendor 前缀脱敏:
agent/redact.py覆盖sk-、ghp_、AKIA、xox、AIza、gAAAA等主流密钥前缀。import 时 snapshot 配置防被改。 - 跨平台到 Android:Termux 跑 Python agent 的最完整参考。
constraints-termux.txt锁定可在 Android 装的依赖。
§4 · 短板
Section titled “§4 · 短板”- 检索弱:没有 FTS5、没有向量索引、没有 temporal decay。MEMORY.md 写满了,只能让模型自己排序。
- 没有 phase2 consolidation:记忆全靠 turn 内
memory工具的显式写入。 tirith是 OOS 安装依赖:受限环境装不上 cosign 或 tirith 时,会回退到 fail_open 等于没扫。- 没有 GUI 或 TUI:纯 CLI 加 MCP,IDE 集成完全靠用户自己接。
§5 · 5 件最值得借鉴的工程动作
Section titled “§5 · 5 件最值得借鉴的工程动作”- 字符限额代替 token 限额:跨模型可预测,不依赖 tokenizer。MEMORY.md 2200 字符的设计放在任何 agent 都能直接用。
- frozen snapshot 注入策略(
tools/memory_tool.py):mid-session 写入只落盘,下次 session 才重载。是「记忆要新加上 prefix cache 要稳」两个需求的最简方案。 - tirith 子进程加 exit code 决断:内容级安全扫描外包给独立进程。主进程只看 0、1、2 三个 exit code。
_MEMORY_THREAT_PATTERNS11 条加 10 个 invisible unicode:写入前扫描。覆盖 prompt injection、role hijack、exfil_curl、read_secrets、ssh_backdoor。agent/redact.py30+ 前缀加 import-time snapshot:脱敏配置在 import 时 snapshot,防 mid-runtime 被改。