Hermes Agent 实战避坑指南:从启动报错到多模型优雅切换
本文解决的核心问题
你用 Hermes Agent 接入国产大模型(Kimi、GLM、ZAI 等),却在启动时遇到一串报错,不知道从哪里下手? 本文完整还原一次真实的排错过程,从最初的 ImportError 到 HTTP 404,每一步都有明确的原因分析和可执行的修复命令。读完之后,你将掌握 Hermes Agent 的配置逻辑、多模型管理方式,以及几个容易忽视的安全隐患。
目录
- 🍂
Hermes Agent 是什么,为什么要用它 - 🍂
启动时的第一个坑:anthropic 包缺失 - 🍂
深挖原因:Kimi 为什么依赖 anthropic SDK - 🍂
反思:config.yaml 里一个字段引发的连锁错误 - 🍂
第二个坑:ZAI 余额耗尽与 Kimi 404 - 🍂
安全盲区:API Key 明文泄露风险 - 🍂
多模型配置与 /model 实时切换 - 🍂
实用摘要与操作清单 - 🍂
一页速览 - 🍂
FAQ
Hermes Agent 是什么,为什么要用它 {#what-is-hermes}
Hermes Agent 是一个支持多平台消息接入(飞书、Slack、Discord、Telegram 等)与定时任务调度的 AI 网关框架。它的核心价值在于:让你用一套配置文件,把任意大模型接入任意 IM 平台,并通过 cron 调度器自动执行周期性 AI 任务。
对于国内开发者来说,它的吸引力在于原生支持 Kimi(Moonshot)、GLM(智谱 ZAI)、DeepSeek 等模型,不需要绕路 OpenAI。但正是这种”多协议兼容”的设计,藏着几个非常容易踩到的坑。
启动时的第一个坑:anthropic 包缺失 {#issue-1-anthropic}
报错出现在两个地方:处理飞书消息的 session agent,以及 cron 调度器执行定时任务时。 错误信息如下:
ImportError: The 'anthropic' package is required for the Anthropic provider.
Install it with: pip install 'anthropic>=0.39.0'
第一反应往往是”我用的是 Kimi,又不是 Anthropic,为什么要装这个包?”——这是一个非常合理的疑问,也是排查的起点。
修复命令
如果你的 Python 环境是系统级管理的(Ubuntu/Debian 常见),直接 pip install 会报 externally-managed-environment 错误,需要加参数:
pip install 'anthropic>=0.39.0' --break-system-packages
安装后验证:
python3 -c "import anthropic; print(anthropic.__version__)"
输出版本号大于等于 0.39.0 即可。
深挖原因:Kimi 为什么依赖 anthropic SDK {#why-kimi-needs-anthropic}
这不是配置错误,而是 Hermes 的设计决策。 Kimi 的 api.kimi.com/coding 端点实现的是 Anthropic Messages API 协议,Hermes 用 anthropic SDK 作为传输层来调用它,只是把 base_url 替换成 Kimi 的地址。
在 Hermes 的插件源码注释里写得很清楚:
# Third-party providers (MiniMax, Kimi, GLM, LiteLLM proxies) that accept the
# Anthropic protocol must never trip OAuth code paths...
Kimi 插件本身也明确记录了两套端点的区别:
# sk-kimi-* keys → api.kimi.com/coding (Anthropic Messages API)
# legacy keys → api.moonshot.ai/v1 (OpenAI Chat Completions)
也就是说:
如果你持有的是新版 sk-kimi- 格式的 Key,安装 anthropic 包是唯一可行路径。它只是一个传输层依赖,你仍然使用的是 Kimi 的服务和 Key,跟 Anthropic 的账号没有任何关系。
“
作者反思: 这类”协议复用”的设计在 AI 基础设施领域越来越常见——模型提供商为了降低接入成本,选择兼容已有协议而非发明新的。对开发者来说,这意味着有时候你装的包名和你实际用的服务名完全不同。遇到这类报错,先看调用链,而不是对着包名想当然。
反思:config.yaml 里一个字段引发的连锁错误 {#config-analysis}
一个错误的 base_url 可以让整个配置逻辑走偏。 在排查过程中发现,初始配置文件里写的是:
model:
default: kimi-for-coding
provider: kimi-coding
base_url: https://api.kimi.com/coding
这个 base_url 指向的是 Anthropic 协议端点。Hermes 检测到这个地址后,自动将 api_mode 设为 anthropic_messages,进而调用 anthropic_adapter 构建客户端,触发了 ImportError。
Kimi 插件的默认 base_url 是 https://api.moonshot.ai/v1(OpenAI 兼容),如果用户没有手动覆盖,就不会走 Anthropic 协议路径。
这里有一个配置优先级的坑: 用户在 config.yaml 里手动写的 base_url 会覆盖插件默认值,而覆盖后的 URL 可能触发完全不同的 api_mode 逻辑。
Hermes api_mode 自动判断逻辑(简化版)
provider == "anthropic"
→ api_mode = anthropic_messages
base_url 结尾为 "/anthropic"
→ api_mode = anthropic_messages
base_url 包含 "bedrock-runtime"
→ api_mode = bedrock_converse
其他情况
→ api_mode = chat_completions(OpenAI 兼容)
所以,api.kimi.com/coding 这个 URL 并不直接匹配上面任何一条规则,但如果 Key 是 sk-kimi- 格式,插件内部会自动切到 coding 端点,间接触发 Anthropic 协议。
config.yaml 中另一个结构性问题
model_catalog:
enabled: true
providers: {}
feishu: # ← 这里缩进有问题,feishu 被嵌套在 model_catalog 下
reconnect_interval: 5
feishu 应当是顶层配置项,错误的缩进可能导致飞书连接参数不生效。正确结构:
model_catalog:
enabled: true
providers: {}
feishu:
reconnect_interval: 5
heartbeat_interval: 15
max_reconnect_attempts: 10
第二个坑:ZAI 余额耗尽与 Kimi 404 {#issue-2-zai-kimi}
排错过程的第二阶段,anthropic 包问题解决后,出现了新的错误:
ZAI(GLM-5.1):余额不足
HTTP 429: Insufficient balance or no resource package. Please recharge.
{'code': '1113', 'message': 'Insufficient balance or no resource package. Please recharge.'}
这个直接去 z.ai 控制台充值即可,没有技术门槛。值得注意的是,第一次请求报的是 1305(服务过载),第二次才是 1113(余额不足)——说明 Hermes 的重试机制会在第一次失败后等待约 3 秒再重试,两次都失败后才触发 fallback 切换。
Kimi(kimi-for-coding):404 资源不存在
HTTP 404: The requested resource was not found
{'message': 'The requested resource was not found', 'type': 'resource_not_found_error'}
问题出在 fallback 配置里的模型名:
fallback_model:
provider: kimi-coding
model: kimi-for-coding # 这个模型名在 Kimi 端点上不存在
kimi-for-coding 是一个别名/本地标识,并非 Kimi API 实际接受的模型名。应当改为 Kimi 真实支持的模型名,例如:
fallback_model:
provider: kimi-coding
model: kimi-k2-turbo-preview
验证可用模型名
hermes models # 列出所有已配置 provider 的可用模型
hermes models --all # 包括未配置 Key 的模型
安全盲区:API Key 明文泄露风险 {#security}
每次启动都会看到这条警告,但很多人选择忽视它:
⚠ Secret redaction is DISABLED (HERMES_REDACT_SECRETS=false).
API keys and tokens may appear verbatim in chat output, session JSONs, and logs.
这意味着你的 API Key 可能出现在:
- 🍂
~/.hermes/sessions/下的会话 JSON 文件 - 🍂
终端日志输出 - 🍂
聊天记录(如果接入了 IM 平台)
一行命令修复:
sed -i 's/redact_secrets: false/redact_secrets: true/' ~/.hermes/config.yaml
验证:
grep redact_secrets ~/.hermes/config.yaml
# 应输出: redact_secrets: true
重启 Hermes 生效。
此外,config.yaml 末尾还有 FEISHU_HOME_CHANNEL 这样的频道 ID 直接写在配置文件里,建议通过环境变量或单独的 .env 文件管理敏感信息,不要提交到版本控制。
“
作者见解: 开发阶段关掉脱敏是很常见的操作,方便调试。但如果你的 Hermes 实例接入了飞书群组,会话记录会被多人可见。这个配置从”开发默认”切换到”生产默认”的那一步,非常容易被遗忘。建议在首次配置时就把
redact_secrets设为true,调试需要时再临时关闭,而不是反过来。
多模型配置与 /model 实时切换 {#multi-model}
Hermes 支持同时配置多个 provider,并在运行时通过 /model 命令切换,无需重启。
credentials.yaml:统一管理所有 API Key
cat ~/.hermes/credentials.yaml
多 provider 的 Key 都放在这个文件里:
zai:
api_key: sk-xxx
kimi-coding:
api_key: sk-kimi-xxx
deepseek:
api_key: sk-xxx
openai:
api_key: sk-xxx
config.yaml:配置主模型与兜底模型
model:
default: glm-5.1
provider: zai
base_url: https://api.z.ai/api/paas/v4
fallback_model:
provider: kimi-coding
model: kimi-k2-turbo-preview
运行时切换模型
在与 Hermes 的对话中直接输入:
/model kimi-k2-turbo-preview
/model glm-5.1
/model deepseek-chat
也可以带上 provider 前缀,避免同名模型的歧义:
/model kimi-coding/kimi-k2-turbo-preview
/model zai/glm-5.1
使用 credential_pool_strategies 管理多个同 provider 的 Key
如果你有多个同一 provider 的 Key(例如多个 ZAI 账号),可以配置轮询策略:
credential_pool_strategies:
zai: fill_first # 优先用第一个 Key,额度耗尽再切换
可选策略通常包括 fill_first(顺序用完再换)和轮询模式,具体支持的策略值可通过 hermes --help 或文档确认。
场景示例:飞书群 + 主备模型组合
假设你用 Hermes 接入飞书群,主力模型用 ZAI 的 GLM-5.1(成本低),备用 Kimi K2(能力强)。当 ZAI 余额耗尽或限流时,Hermes 自动切换到 Kimi,用户无感知。
model:
default: glm-5.1
provider: zai
base_url: https://api.z.ai/api/paas/v4
fallback_model:
provider: kimi-coding
model: kimi-k2-turbo-preview
agent:
api_max_retries: 2
api_retry_delay: 5
这个配置实现了:主模型失败最多重试 2 次,每次等待 5 秒,全部失败后自动启用 fallback。
实用摘要与操作清单 {#checklist}
首次配置 Hermes + 国产模型
- 🍂
[ ] 安装 anthropic 包(Kimi sk-kimi-* Key 必须): pip install 'anthropic>=0.39.0' --break-system-packages - 🍂
[ ] 在 credentials.yaml里填写各 provider 的 API Key - 🍂
[ ] 确认 config.yaml中base_url与 Key 格式匹配(sk-kimi-* →api.kimi.com/coding,legacy →api.moonshot.ai/v1) - 🍂
[ ] fallback_model.model使用 API 真实接受的模型名,不用别名 - 🍂
[ ] 开启密钥脱敏: security.redact_secrets: true - 🍂
[ ] 检查 feishu配置是否在顶层(不是嵌套在model_catalog下)
日常运维
- 🍂
[ ] ZAI/Kimi 余额不足时及时充值(HTTP 429 code 1113 是余额告警) - 🍂
[ ] 定期检查 ~/.hermes/sessions/目录大小,配置sessions.auto_prune - 🍂
[ ] 通过 /model命令临时切换模型测试效果,不必改配置重启
一页速览 {#one-page}
FAQ {#faq}
Q1:我用的是 Kimi,为什么必须安装 anthropic 包?
如果你的 Key 是 sk-kimi- 开头,Kimi 使用的是 Anthropic Messages API 协议。Hermes 使用 anthropic SDK 作为传输层来调用这个协议,所以即使你不用 Anthropic 的服务,这个包也是必要依赖。
Q2:安装 anthropic 包会影响我的 Kimi Key 或账单吗?
不会。anthropic 包只是 HTTP 客户端库,账单完全由你的 Kimi API Key 决定,与 Anthropic 账号无关。
Q3:pip install 报 externally-managed-environment 怎么办?
加上 --break-system-packages 参数:pip install 'anthropic>=0.39.0' --break-system-packages。这是 Ubuntu/Debian 系统对系统级 Python 环境的保护机制,加参数后可以正常安装。
Q4:kimi-for-coding 和 kimi-k2-turbo-preview 有什么区别?
kimi-for-coding 是 Hermes 插件内部的别名标识,Kimi API 本身并不认识这个名字,所以会返回 404。kimi-k2-turbo-preview 才是 Kimi API 真实接受的模型标识符。
Q5:怎么知道哪些模型名是 API 真实支持的?
运行 hermes models 可以列出当前已配置 provider 的可用模型列表。也可以查阅对应服务商的官方 API 文档。
Q6:fallback 模型是自动触发的吗,还是需要手动切换?
自动触发。当主模型连续失败(达到 api_max_retries 次数)后,Hermes 自动切换到 fallback_model 配置的模型,无需手动干预。手动切换使用 /model 命令。
Q7:redact_secrets: false 具体会泄露哪些内容?
API Key、access token 等敏感字符串可能明文出现在:终端输出、~/.hermes/sessions/ 下的会话 JSON 文件、以及 IM 平台的聊天记录(如果 Hermes 接入了飞书、Slack 等)。建议生产环境始终开启脱敏。
Q8:多个同一 provider 的 Key 怎么管理?
在 credentials.yaml 里为同一 provider 配置多个 Key,并在 config.yaml 的 credential_pool_strategies 里设置轮询策略(如 fill_first),Hermes 会在当前 Key 额度耗尽时自动切换到下一个。

