仓库里有 AGENTS.md,本机有 ~/.hermes/config.yaml,网关再挂一个 bot——三套东西要是从来不一起看,Hermes Agent 忽好忽坏,很容易被误会成「模型不稳」。下面按文档里能对上的部分,把全局配置、项目上下文、SOUL、网关和安全拆开聊;示例片段你可以直接复制改。
先把配置面分层:全局、项目、身份
先记住一句话:配置放哪儿,决定了规则跟谁走。
全局都在 ~/.hermes/:config.yaml 管模型、终端、TTS、压缩、审批、工具开关这些「非密钥」;密钥老老实实放 .env。目录大概长这样:
~/.hermes/
├── config.yaml
├── .env
├── auth.json
├── SOUL.md
├── memories/
├── skills/
├── cron/
├── sessions/
└── logs/
顺手记下几条常用命令:
hermes config # 查看
hermes config edit # 编辑 config.yaml
hermes config set KEY VAL # API key 会进 .env,其余进 yaml
hermes config check
hermes config migrate
优先级(高→低):CLI 参数 → config.yaml → .env → 内置默认。非密钥一般以 config.yaml 为准;密钥归 .env。yaml 里可以用 ${VAR_NAME} 引用环境变量(只支持 ${VAR} 这种写法)。
项目上下文跟 SOUL 是两条线(别混在一起记):同一会话里只会选中 一种 项目上下文类型,顺序是 .hermes.md → AGENTS.md → CLAUDE.md → .cursorrules(表格里常把 .hermes.md 和 HERMES.md 写成一类)。子目录里的那些文件要等工具真的摸到路径才进场;启动时加载的单文件最多 20000 字符,子目录提示单个文件 8000,太长就头尾掐一段。
身份只看 HERMES_HOME/SOUL.md,不在仓库里乱找——省得你「一进项目就像换了个人」。它在 slot #1;文件空着就走内置默认人设。
弄不清往哪写时,看下表就够了:
| 放进 SOUL | 放进 AGENTS |
|---|---|
| 语气、直接程度、犹豫时怎么说 | 架构、约定、路径、端口、命令 |
| 跨项目稳定的沟通默认值 | 仓库专属流程与临时事项 |
想临时换口气,用 /personality(内置或自定义都行)。自定义可以先写在 config.yaml,再 /personality <name>:
agent:
personalities:
codereviewer: >
You are a meticulous code reviewer. Identify bugs, security issues,
performance concerns, and unclear design choices. Be precise and constructive.
文档里那一摞提示栈,大意就是:SOUL.md → 工具侧约定 → memory/user → skills → 上下文文件 → 时间戳 → 平台格式 → 再来一层可选的 /personality。说白了:SOUL 改长期人设,AGENTS 改工程事实,/personality 改当下模式。
按场景调策略:终端、模型、网关与语音
终端后端决定命令在哪跑:local、docker、ssh、modal、daytona、vercel_sandbox、singularity。本地就是跟你同一个用户权限;仓库不放心就换容器系后端,镜像和挂载自己收紧。顺便提醒:并行子任务如果蹭同一个 Docker 容器,cd、环境变量、写文件都可能打架;真要隔离,去看文档里的任务级镜像覆盖之类做法。
网关跟 CLI 完全是两套授权逻辑,别混着背。顺序大概是:每平台 allow-all → DM 已通过列表 → 各平台 allowlist → GATEWAY_ALLOWED_USERS → 全局 GATEWAY_ALLOW_ALL_USERS → 默认拒绝。.env 里随手可以这样写:
TELEGRAM_ALLOWED_USERS=123456789,987654321
DISCORD_ALLOWED_USERS=111222333444555666
GATEWAY_ALLOWED_USERS=123456789
带终端能力的 bot,别开成「谁都能进来」。陌生人想聊:DM → 拿 8 位码 → 你在机器上 hermes pairing approve <platform> <CODE>,完事。
成本与节奏这块可以佛系一点策略、抠一点账单:默认模型定一个,重活用 /model 换强的;/usage、/insights 偶尔看一眼;聊太长就 /compress。并行丢给 delegate_task;能写成脚本的一次性跑完就用 execute_code,少来回扯回合。语音、消息入口和 CLI 共用 ~/.hermes,差别主要在谁在网关侧管授权、会话多长、工具露多少——别只在 CLI 调舒服了就以为网关也安全。
抑制漂移:优先级、人格强度、缓存与容量
项目链和 SOUL 会叠在一起生效:有冲突时 first match 只看链上谁先命中,不看谁写得长。
人格:SOUL 写太虚就像客服模板;把具体任务步骤全塞进 SOUL,又会跟 AGENTS 抢位置,仓库一改还容易漏。缓存:老换模型或乱改系统提示,prompt cache 很难友好;上下文文件也别没事全文重写一遍。
Memory 有天花板(默认如下),满了会合并——与其硬堆记忆,不如稳定事实放 AGENTS,套路做成 Skill:
memory:
memory_enabled: true
user_profile_enabled: true
memory_char_limit: 2200
user_char_limit: 1375
(会话里刚写入的记忆,要下一轮开局才进系统提示——别指望当下立刻变脸。)
把安全写进默认配置:审批、隔离、出站与 MCP
安全这部分不用当成「额外包袱」,当成默认装机选项就行。
审批:manual(默认)、smart、off。off 等于全程撒手,只适合你真信得过自动化那点场景。超时默认 60 秒,超时就算你没答,默认拦。
approvals:
mode: manual
timeout: 60
CLI 碰到危险命令会问你要 once / session / always / deny:always 会写进永久 command_allowlist,不熟的话先用 session 顶一顶。YOLO(--yolo、/yolo、HERMES_YOLO_MODE)能绕过常规审批,但硬阻断列表还在——特别离谱的命令照样拦。
走 docker / singularity / modal / daytona / vercel_sandbox 时,危险命令检测会跳过,相当于默认「边界在容器里」。docker_forward_env 塞进去的密钥,容器里进程都看得见,名单越短越好。
上下文会先扫一遍,不对劲就直接拒载,类似:
[BLOCKED: AGENTS.md contained potential prompt injection (prompt_injection). Content not loaded.]
MCP:子进程默认不带整机机密钥玩;该给谁,就写在对应 MCP 的 env 里:
mcp_servers:
github:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-github"]
env:
GITHUB_PERSONAL_ACCESS_TOKEN: "ghp_..."
出站:域名黑名单对 web_search、web_extract、browser_navigate 这类带 URL 的工具都生效:
security:
website_blocklist:
enabled: true
domains:
- "*.internal.company.com"
- "admin.example.com"
内网 URL 要放行,用 allow_private_urls——只在确实信得过的环境开。
全局关工具:与其每个平台点一遍,不如在 config.yaml 一处关掉:
agent:
disabled_toolsets:
- memory
- web
密钥文件:顺手执行 chmod 600 ~/.hermes/.env,养成习惯不亏。
长期维护:复盘、版本化与一体化
- 复盘:有空
/insights瞄一眼——是 AGENTS 缺料、SOUL 写拧了,还是模型一直选委屈了它。 - 版本化:仓库交
AGENTS.md;SOUL.md留在你自己的HERMES_HOME;网关 secrets 留在部署环境.env。 - Skill / Memory:五步以上的套路做成 Skill;事实是 Memory,套路是 Skill,别装错抽屉。担心 agent 手痒乱改 Skill,可以打开写入扫描(默认关着,怕误伤正经 skill):
skills:
guard_agent_created: true
配置、上下文、人设和安全,不像四块补丁贴上去就完事——更像给 Hermes Agent 这份「整机规格」做联动:动一处,顺手想一圈别处要不要跟着动,反而省心。