一、核心心智模型(先看这个,避免 80% 坑)
1.1 三层配置来源
┌──────────────────────────────────────────────────────┐
│ 第 3 层:命令行临时覆盖 │
│ hermes -m <模型> --provider <provider> --in DIR │
│ 仅本次会话有效,不改文件 │
├──────────────────────────────────────────────────────┤
│ 第 2 层:用户配置文件(最常用) │
│ ~/.hermes/config.yaml — 模型、provider、fallback │
│ ~/.hermes/.env — API Key / Base URL │
├──────────────────────────────────────────────────────┤
│ 第 1 层:内置 provider 注册表 │
│ hermes_cli/providers.py — 别名 / 传输协议 / env 变量 │
│ 不可修改,是所有配置的”字典“ │
└──────────────────────────────────────────────────────┘
1.2 配置写入的优先级(禁止事项)
| 方式 | 推荐 | 原因 |
|---|---|---|
✅ hermes config set <key> <value> |
首选 | 写入做 schema 校验,不破坏 YAML 结构 |
✅ hermes setup / hermes model |
有界面场景 | 交互式选择,不会填错 provider 名 |
✅ 手动编辑 config.yaml 增量修改 |
可控场景 | 仅改目标键,保留其余结构 |
❌ 手动 .yaml 整段覆盖替换 |
禁止 | 缩进破坏 + 误删字段 = 校验失败 |
❌ 自造 YAML + HERMES_CONFIG= 覆盖 |
禁止 | 99% 概率结构不匹配 |
1.3 Provider 别名表(核心!别自己瞎写名字)
来自 providers.py 中 ALIASES 字典:
| 你想写的 | Hermes 实际识别 | 说明 |
|---|---|---|
openai |
→ openrouter |
裸 openai 不直接走官方!要用官方写 openai-api |
glm / z.ai / z-ai / zhipu |
→ zai |
智谱清言,推荐免费模型 glm-4-flash |
kimi / kimi-coding-cn / moonshot |
→ kimi-for-coding |
Kimi 月之暗面 |
qwen / alibaba / dashscope / aliyun |
→ alibaba |
阿里云通义千问 |
deep-seek |
→ deepseek |
DeepSeek |
ollama(裸) |
→ custom |
本地;Ollama Cloud 写 ollama-cloud |
lmstudio / lm-studio / lm_studio |
→ lmstudio |
通用本地端点!默认 127.0.0.1:1234/v1 |
vllm / llamacpp / llama-cpp |
→ local |
自定义本地端点 |
anthropic / claude / claude-code |
→ anthropic |
原生 Messages 协议 |
copilot / github |
→ github-copilot |
GitHub Copilot 服务 |
opencode-zen / zen |
→ opencode |
OpenCode Zen |
go |
→ opencode-go |
OpenCode Go |
vercel / aigateway |
→ vercel |
Vercel AI Gateway(聚合) |
nvidia / nim |
→ nvidia |
NVIDIA NIM |
huggingface / hf |
→ huggingface |
HF 推理端点 |
bedrock / aws / amazon |
→ bedrock |
AWS Bedrock(SDK 鉴权) |
tencent / tokenhub |
→ tencent-tokenhub |
腾讯 TokenHub |
黄金法则:不知道写啥 → 写
hermes model交互式选,别自造名。
二、三条配置路线
路线 A:云端 API Key(最省事,推荐入门)
# 1. 交互式配置最快
hermes setup
# 2. 选模型 + 验证
hermes doctor
hermes status
hermes chat -q Hello
单命令模式:
# 智谱 GLM-4-Flash(永久免费,国内可用)
echo ZAI_API_KEY=你的KEY >> ~/.hermes/.env
hermes config set model glm-4-flash
hermes chat -q 你好
# DeepSeek
echo DEEPSEEK_API_KEY=你的KEY >> ~/.hermes/.env
hermes config set model deepseek-v3
显式指定 provider 的安全写法(config.yaml):
model:
name: glm-4-flash
provider: zai
路线 B:本地大模型(自建 OpenAI 兼容端点)
适用:Ollama / oMLX / LM Studio / vLLM / llama.cpp / node-llama-cpp / 任何能开 OpenAI REST 端口的东西。
B-1 选择通用壳:lmstudio
- 它是内置 provider,transport=openai_chat
- 通过 LM_BASE_URL + LM_API_KEY 环境变量注入
B-2 最小可行配置
.env:
LM_BASE_URL=http://127.0.0.1:8080/v1
LM_API_KEY=local # 无鉴权也写占位符,不能为空
config.yaml:
model:
name: qwen2.5-3b
provider: lmstudio
B-3 致命坑:SSE 流式支持
Hermes 默认所有请求 stream=true!本地端点必须实现 text/event-stream 流式输出,否则 EmptyStreamError → 3 次后走 fallback。
标准 SSE 格式:每行 data: {...}
,最后 data: [DONE]
收尾。
B-4 验证链路(按顺序,一步不通别往下走):
# 1 端点
curl http://127.0.0.1:8080/v1/models
# 2 非流式
curl -s http://127.0.0.1:8080/v1/chat/completions -H Content-Type:application/json -d {"model":"qwen2.5-3b","stream":false,"messages":[{"role":"user","content":"你好"}]}
# 3 流式(关键)
curl -sN http://127.0.0.1:8080/v1/chat/completions -H Content-Type:application/json -d {"model":"qwen2.5-3b","stream":true,"messages":[{"role":"user","content":"你好"}]} | head -20
# 4 Hermes 真走通了吗
hermes chat -q 你好 2>&1 # 必须没 Primary model failed
路线 C:故障转移 Fallback 链
fallback_model:
provider: zai
model: glm-4-flash
注意:fallback 账户必须真实可用;目前只有一层。
三、高级:自定义 Provider(providers 段)
providers:
my-local-qwen:
name: 本地 Qwen
api: http://127.0.0.1:8080/v1
key_env: MY_LOCAL_API_KEY
transport: openai_chat
model:
name: qwen2.5-3b
provider: my-local-qwen
四、常见坑与解决方案速查表
| 4.1 配置写入类 | 错误 | 根因 | 修复 |
|---|---|---|---|
| hermes config set 报 Operation not permitted 写 .tmp 失败 | Agent 沙箱禁写 ~/.hermes | Shell 加 dangerouslyDisableSandbox=true;或用户终端手动执行 | |
| schema 校验失败 | YAML 缩进/整段覆盖误删字段 | hermes config migrate;恢复备份后增量改 | |
| --provider 不识别 | config set 没有此参数 | 手动写 YAML 字典 {name, provider} |
| 4.2 Provider / 模型解析类 | 错误 | 根因 | 修复 |
|---|---|---|---|
| 主模型失败切 fallback,但 curl 直连通 | 99% SSE 流格式错 | 实现标准 SSE + data: [DONE] | |
| Provider 401/403 | env 变量名写错 | 不要写 OPENAI_API_BASE(错),用 OPENAI_BASE_URL(对) | |
| 写 openai 路由到 OpenRouter | 别名生效 | 需要官方写 openai-api | |
| 本地模型名匹配到云端 alibaba | provider 没显式写 | provider: lmstudio |
| 4.3 网络 / 下载类 | 错误 | 根因 | 修复 |
|---|---|---|---|
| GitHub/npm 慢或超时 | 国内屏蔽 | npm 切 registry.npmmirror.com;HF 模型走 hf-mirror.com;git clone 失败下 main.zip | |
| 端口占用 | 旧实例没关干净 | 换端口 + 同步 base_url;或 lsof -ti : |
|
| uv pip install 装错位置 | 多 Python 冲突 | 先 uv venv 再装;或 venv/bin/python -m pip 绑定 |
| 4.4 交互向导类 | 错误 | 根因 | 修复 |
|---|---|---|---|
| hermes setup curses 多次被中断 | headless 不支持 ncurses | 立刻切非交互:hermes config set + 编辑 .env,不要重跑 setup | |
| 安装包体积异常小(几 KB) | 下了网页/重定向页 | 官方 release asset 直链;或 file 命令确认 |
五、“永不失败”的配置执行顺序(复制即用)
场景1:云端 API Key
KEY=xxxx; echo ZAI_API_KEY=$KEY >> ~/.hermes/.env
hermes config set model glm-4-flash
hermes config show | grep -A5 Model:
hermes chat -q Hi
场景2:本地 OpenAI 兼容端点
先 curl 验证健康(/v1/models + stream=true chat),再写 LM_BASE_URL/LM_API_KEY 进 .env,config.yaml 写 model.name/model.provider=lmstudio,最后 hermes chat -q Hi 验证。
场景3:本地模型长期运行脚本:建议写 bash case 脚本,start 节点后台进程 + PID 文件,就绪循环 poll /v1/models,stop 读 PID 文件结束进程。
六、调试清单:6 件事按顺序确认
- 配置是否被读了? → hermes config show 看 Model / API Keys 区
- 端点是否活着? → curl
/v1/models - 流式能通吗? → curl stream=true 看 SSE 格式
- API Key 带了吗? → Authorization 头(或端点日志)
- 模型名一致吗? → config.yaml 的 model.name 与 /v1/models 返回 id 一致
- provider 真对吗? → 不要自造,查别名表;或自定义 providers 段绕开
七、环境变量速查表
| Provider | API Key env | Base URL env |
|---|---|---|
| zai / 智谱 GLM | ZAI_API_KEY GLM_API_KEY Z_AI_API_KEY | GLM_BASE_URL |
| kimi-for-coding | KIMI_CN_API_KEY | KIMI_BASE_URL |
| alibaba / 千问 | DASHSCOPE_API_KEY 等 | DASHSCOPE_BASE_URL |
| deepseek | DEEPSEEK_API_KEY | DEEPSEEK_BASE_URL |
| anthropic | ANTHROPIC_API_KEY CLAUDE_CODE_OAUTH_TOKEN | — |
| lmstudio(本地通用壳) | LM_API_KEY | LM_BASE_URL |
| ollama-cloud | — | OLLAMA_BASE_URL |
| openrouter | OPENROUTER_API_KEY | OPENROUTER_BASE_URL |
| openai-api | OPENAI_API_KEY | OPENAI_BASE_URL |
| copilot / github | COPILOT_GITHUB_TOKEN GH_TOKEN | — |
| nvidia | NVIDIA_API_KEY | NVIDIA_BASE_URL |
| tencent-tokenhub | TOKENHUB_API_KEY | TOKENHUB_BASE_URL |
八、参考文件路径速查
| 作用 | macOS / Linux | Windows |
|---|---|---|
| config.yaml | ~/.hermes/config.yaml | %USERPROFILE%.hermes\config.yaml |
| .env | ~/.hermes/.env | %USERPROFILE%.hermes.env |
| 安装目录 | ~/.hermes/hermes-agent/ | 看安装器 |
| sessions | ~/.hermes/sessions/ | — |
| provider 代码 | hermes_cli/providers.py | — |
| config 代码 | hermes_cli/config.py | — |
一句话总结:云端 → hermes config set model + .env 写 Key;本地 → lmstudio 通用壳 + LM_BASE_URL/LM_API_KEY + 强制 SSE 流式;provider 名绝不要自造。
花絮:这篇文档是怎么被踩坑逼出来的
以下记录了 2026-08-19 到 2026-08-20 这 24 小时里,为搞定「Intel Mac + 本地 3B 模型 + 正确接入 Hermes Agent」这一件事,踩过的 6 个真坑。
后面的正文是把这些坑系统化后的操作手册,但如果你赶时间,先读下面 6 条,能帮你少走 90% 的弯路。
坑 1:本地端点能 curl 通,但 Hermes 永远报 EmptyStreamError???
我第一版写的 node-llama-cpp 服务器只返回普通 JSON,curl 直接测 200 正常,结果 Hermes 一连上就报:
EmptyStreamError — switching to fallback,连 fallback 都挂。
原因:Hermes 默认对所有调用都发 stream=true,它期待的是text/event-streamSSE 格式,而不是 application/json。一行 data: ...、两个换行,最后还要data: [DONE]收尾,差一个格式都不行。
教训:写本地 OpenAI 兼容服务器,第一行代码就要先把stream=true的分支实现好。
坑 2:写了 OPENAI_BASE_URL 也配了 model=qwen2.5-3b,为什么不走本地?
我一开始在 .env 里写了裸
OPENAI_BASE_URL=...,又在 config 里只写 model 名不写 provider。结果 qwen2.5-3b 这个名字被 Hermes 的 models.dev 误匹配到了云端的 alibaba provider,请求打到了阿里云 401。
原因:provider 的选择是「先按别名表/注册表匹配,找不到才走自定义」。本地模型名如果刚好撞了云端前缀,你不显式写 provider 就是赌博。
教训:本地端点必须显式写 provider,最简单的做法是用lmstudio这个内置壳 +LM_BASE_URL/LM_API_KEY两个环境变量,既干净又不会撞名。
坑 3:写 openai provider 怎么请求全跑到 OpenRouter 了?
裸
openai在 Hermes 内置的 ALIASES 字典里被强制映射到 openrouter(聚合路由)。不是官方 api.openai.com,是聚合!
教训:provider 名 绝不要靠猜,一定要查内置 ALIASES 表(见正文 1.3 节)。要用官方 OpenAI 写openai-api,不要写openai。
坑 4:hermes config set 为什么一写就报 Operation not permitted?
Agent 沙箱默认禁写
~/.hermes目录,hermes config set 会在那建临时.tmp原子文件,一跑就 PermissionError。
教训:在自动化脚本里对 Hermes 配置做修改,shell 命令必须用沙箱外执行(或让用户在自己的终端跑)。
坑 5:Kimi 账户显示「有 Key」,一用就 429?
我一开始把 fallback_model 设成了 kimi-coding-cn + moonshot-v1-128k,API Key 也写了。结果主模型失败一切就 429:
account suspended due to insufficient balance。
教训:有 Key ≠ 有余额。配 fallback 之后一定要模拟一次主模型故障来验证 fallback 真能工作。我现在的 fallback 固定是 zai + glm-4-flash(智谱清言免费额度)。
坑 6:YAML 改坏了怎么办?
我试过把 model 改成
model_provider: openai这种自造的键,结果被 Hermes 标成「未识别配置键」被忽略;又试过整段覆盖 config.yaml 导致缩进错位,schema 校验红。
教训:改 YAML 的原则是「最小增量改动」——只加/改你要的字段,其他一个字别动。能hermes config set就不要手改;手改就只改目标行。改坏了跑hermes config migrate救。
适用版本:Hermes Agent v0.20+ | 更新时间:2026-08-20
适用环境:macOS / Linux / Windows | 配置入口:hermes config+~/.hermes/config.yaml+~/.hermes/.env