06. Hermes Agent 配置详解------提供商、模型与选项
配置是让 Hermes Agent 从"能跑"到"好用"的关键一步。理解配置的优先级、终端后端选择和辅助模型体系,你才能真正掌控这个智能体的行为。
配置的"家"在哪里
Hermes 的所有设置都集中在 ~/.hermes/ 目录下,结构清晰、职责分明:
~/.hermes/
├── config.yaml # 设置(模型、终端、TTS、压缩等)
├── .env # API 密钥和机密
├── auth.json # OAuth provider 凭据(Nous Portal 等)
├── SOUL.md # 主要 agent 身份(系统提示词第 #1 槽位)
├── memories/ # 持久记忆(MEMORY.md、USER.md)
├── skills/ # Agent 创建的技能
├── cron/ # 定时任务
├── sessions/ # Gateway 会话
└── logs/ # 日志(errors.log、gateway.log --- 机密自动脱敏)
管理配置有一组专用命令,其中 hermes config set 会自动将值路由到正确的文件------API 密钥保存到 .env,其他内容保存到 config.yaml,你不需要操心分类:
bash
hermes config # 查看当前配置
hermes config edit # 在编辑器中打开 config.yaml
hermes config set model anthropic/claude-opus-4
hermes config set terminal.backend docker
hermes config set OPENROUTER_API_KEY sk-or-... # 自动保存到 .env
配置优先级与经验法则
设置按以下顺序解析,优先级从高到低:CLI 参数 > config.yaml > .env > 内置默认值。一条经验法则贯穿全局------机密放 .env,其他放 config.yaml 。当两者都设置了非机密项时,config.yaml 优先。
config.yaml 还支持环境变量替换,使用 ${VAR_NAME} 语法:
yaml
auxiliary:
vision:
api_key: ${GOOGLE_API_KEY}
base_url: ${CUSTOM_VISION_URL}
如果引用的变量未设置,占位符保持原样。注意只支持 ${VAR} 语法,裸 $VAR 不会被展开。
终端后端:命令在哪里执行
终端后端决定 agent 的 shell 命令实际在哪里运行。Hermes 支持六种后端,各有适用场景:
| 后端 | 命令运行位置 | 隔离性 | 适合场景 |
|---|---|---|---|
| local | 直接在本机 | 无 | 开发、个人使用 |
| docker | 单个持久 Docker 容器 | 完全隔离 | 安全沙箱、CI/CD |
| ssh | 远程服务器 | 网络边界 | 远程开发、强大硬件 |
| modal | Modal 云沙箱 | 完全隔离 | 临时云计算 |
| daytona | Daytona 工作区 | 完全隔离 | 托管云开发环境 |
| singularity | Singularity 容器 | 命名空间隔离 | HPC 集群 |
默认使用 local 后端,命令直接在你的机器上运行。切换到 Docker 是最常见的生产选择:
yaml
terminal:
backend: docker
docker_image: "nikolaik/python-nodejs:python3.11-nodejs20"
container_cpu: 1
container_memory: 5120 # MB
container_disk: 51200 # MB
container_persistent: true
Docker 后端的一个关键特性是:Hermes 为每个终端和文件工具调用重用同一个长期运行的容器,而非每条命令一个容器。工作目录更改、已安装的包以及 /workspace 中的文件都会从一次工具调用延续到下一次------就像本地 shell 一样。容器在 Hermes 关闭时停止并删除。
SSH 后端适合在远程服务器上运行命令,默认启用持久 shell,通过 ControlMaster 复用连接,状态(cwd、环境变量)在命令之间保持:
bash
# ~/.hermes/.env 中配置
TERMINAL_SSH_HOST=my-server.example.com
TERMINAL_SSH_USER=ubuntu
上下文压缩:长对话的守护者
Hermes 自动压缩长对话以保持在模型的上下文窗口内。压缩摘要器是一个单独的 LLM 调用,你可以将其指向任何 provider 或端点:
yaml
compression:
enabled: true
threshold: 0.50 # 在上下文限制的 50% 时压缩
target_ratio: 0.20 # 保留为最近尾部的阈值分数
protect_last_n: 20 # 保持未压缩的最少最近消息数
auxiliary:
compression:
model: "" # 空 = 使用主聊天模型,或指定廉价模型
provider: "auto"
一个容易忽略的要点:摘要模型的上下文窗口必须至少和主模型一样大。压缩器会把对话的完整中间部分发给摘要模型,如果它的上下文窗口更小,摘要调用会因上下文长度错误而失败,中间轮次将在没有摘要的情况下被丢弃,静默丢失对话上下文。
此外,Gateway 还有一个 hygiene_hard_message_limit(默认 5000)安全阀。它的存在是为了打破一个死循环:当超大会话的 API 调用持续断开时,gateway 永远收不到 token 使用数据,基于 token 的阈值无法触发,transcript 持续增长。这个基于消息数的下限仅凭消息数量触发,强制压缩以恢复会话。
辅助模型:附带任务该用哪个模型
Hermes 使用"辅助"模型处理图像分析、网页摘要、浏览器截图分析、会话标题生成和上下文压缩等附带任务。默认情况下(provider: "auto"),所有辅助任务都路由到你的主聊天模型。
这意味着:如果你在昂贵的推理模型(如 Opus)上运行,辅助任务会增加显著成本。建议显式为辅助任务指定便宜快速的模型:
yaml
auxiliary:
vision:
provider: "openrouter"
model: "google/gemini-2.5-flash"
web_extract:
provider: "openrouter"
model: "google/gemini-2.5-flash"
compression:
provider: "openrouter"
model: "openai/gpt-4o-mini"
你不必手动编辑 YAML------运行 hermes model 并选择"配置辅助模型",即可获得交互式的每任务选择器。每个辅助任务还支持独立的 fallback_chain,当主辅助 provider 因速率限制或连接问题失败时,Hermes 会依次尝试回退链中的 provider。
显示与工具输出控制
显示设置影响你在终端和消息平台上看到的内容。几个关键项:
yaml
display:
tool_progress: all # off | new | all | verbose
streaming: false # 实时流式传输 token 到终端
show_cost: false # 状态栏显示费用
language: zh # 静态消息 UI 语言(审批提示等)
file_mutation_verifier: true # 轮次中写入失败时附加建议页脚
file_mutation_verifier 是一个容易被忽视但非常实用的功能:当本轮中 write_file 或 patch 调用失败且从未被成功写入取代时,Hermes 会在最终响应中附加一行建议,捕获"批量并行补丁,一半静默失败,模型却总结成功"这类过度声明。
工具输出截断由三个上限控制,需要根据模型上下文窗口大小调整:
yaml
tool_output:
max_bytes: 50000 # 终端输出上限(字符)
max_lines: 2000 # read_file 分页上限
max_line_length: 2000 # 每行上限
对于小上下文模型(16K 上下文),建议降低这些值以保持工具结果紧凑;大上下文模型(200K+)则可以适当调高。
推理努力与工具使用强制
yaml
agent:
reasoning_effort: "" # none | minimal | low | medium | high | xhigh
tool_use_enforcement: "auto" # auto | true | false | ["model-substring", ...]
max_turns: 90 # 每次对话轮次的最大迭代次数
tool_use_enforcement 解决一个常见问题:某些模型会将预期操作描述为文本而不是进行工具调用("我会运行测试..."而不是实际调用终端)。auto 模式默认对 GPT、Gemini、Grok 等模型启用强制指导,对 Claude、DeepSeek 等已经可靠使用工具的模型禁用。如果你发现当前模型经常"光说不做",可以设为 true。
Frequently Asked Questions
Q:config.yaml 和 .env 的边界到底怎么划分?我把 API key 写进 config.yaml 会怎样?
A: 原则很简单------机密(API 密钥、bot token、密码)放 .env,其他所有内容放 config.yaml。如果你用 hermes config set 命令设置值,系统会自动路由:带 API_KEY、TOKEN 等关键词的值会写入 .env,其余写 config.yaml。如果你手动把 API key 写进 config.yaml,功能上可能也能跑,但有两个隐患:一是 config.yaml 更容易被意外分享或检入版本控制,二是 config.yaml 支持 ${VAR} 环境变量替换,本就是为了让你把密钥留在 .env 里、在配置中引用。最佳实践是 .env 设为 chmod 600,永远不提交到 git。
Q:Docker 后端和 local 后端在开发体验上有什么本质区别?我该选哪个?
A: 核心区别在于隔离性和状态连续性。Local 后端命令直接在你的机器上跑,agent 拥有你用户账户的全部文件系统权限------开发时最方便,但安全边界为零。Docker 后端在一个加固容器内运行命令(cap-drop ALL、no-new-privileges、PID 限制),且容器是持久化的:你 cd 到某个目录、pip install 了一个包,下次工具调用时这些状态都在。对于日常开发,如果你信任 agent 的行为,local 足够;但如果你要让 agent 跑不确定的代码、或者通过消息 gateway 对外提供服务,强烈建议切到 Docker。一个实操建议:先用 local 开发调试,确认工作流稳定后再切 Docker 做生产隔离。
Q:辅助模型设成 auto 之后,我的视觉分析费用怎么突然变高了?
A: 这是因为 provider: "auto" 的行为是使用你的主聊天模型处理所有辅助任务。如果你的主模型是 Opus 这种昂贵推理模型,每次图像分析、网页摘要、上下文压缩都会按 Opus 的价格计费------这些任务本身不需要强推理能力,用 Opus 既慢又贵。建议运行 hermes model,选择"配置辅助模型",把 vision、web_extract、compression 这些附带任务指向一个便宜快速的模型(如 Gemini Flash 或 GPT-4o-mini)。一个常见误区是担心便宜模型"不够聪明"------实际上辅助任务大多是分类、摘要、图像描述,轻量模型完全胜任,而且响应更快。
延伸阅读与交流
本文涉及的Hermes Agent自进化智能体技术体系,目前已有系统化的深度学习资源可供参考。中国通信工业协会通信和信息技术创新人才培养工程项目办公室将于近期组织相关技术专题分享,围绕本文讨论的AI原生架构、智能体工作流、自进化数据层等方向展开系统讲解。
专题信息
- 主题:AI原生Hermes自进化智能体系统
- 时间:2026年8月22-23日
- 形式:线上直播
- 内容方向:AI原生架构 · Hermes智能体拆解 · 全栈扩展 · 智能自动化 · 产品级实战 · Context Engine · 自进化数据层
分享嘉宾
王老师(Gavin),Agentic AI企业联合创始人兼CTO,十余年硅谷AI系统工程经验。长期深耕NLP、强化学习、可控AI与智能体系统架构,提出"语言即控制(Language as Control)"原创范式,在RLHF、PPO、DPO、GRPO等方向有系统化工程实践,推动智能体技术在社交媒体、医疗、金融、法律、教育等专业场景落地。
技术交流
- 联系人:Sam
- Hermes Agent技术文档:https://hermes-agent.nousresearch.com/docs/