Hermes Agent 实战避坑指南:从启动报错到多模型优雅切换

本文解决的核心问题

你用 Hermes Agent 接入国产大模型(Kimi、GLM、ZAI 等),却在启动时遇到一串报错,不知道从哪里下手? 本文完整还原一次真实的排错过程,从最初的 ImportErrorHTTP 404,每一步都有明确的原因分析和可执行的修复命令。读完之后,你将掌握 Hermes Agent 的配置逻辑、多模型管理方式,以及几个容易忽视的安全隐患。


目录


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)

也就是说:

Key 格式 使用端点 协议 是否需要 anthropic 包
sk-kimi- 开头 api.kimi.com/coding Anthropic Messages API
其他格式(legacy) 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_urlhttps://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.yamlbase_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}

问题 原因 解决方法
ImportError: anthropic Kimi sk-kimi-* Key 走 Anthropic 协议,需要 SDK 作传输层 pip install 'anthropic>=0.39.0' --break-system-packages
ZAI HTTP 429 code 1113 账户余额耗尽 去 z.ai 充值
Kimi HTTP 404 model 字段填写的是别名而非真实模型名 改为 kimi-k2-turbo-preview 等真实模型名
API Key 明文出现在日志 redact_secrets: false 改为 true,重启生效
feishu 连接参数不生效 feishu 块错误嵌套在 model_catalog 移至配置文件顶层
运行时切换模型 对话中输入 /model <模型名>

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-codingkimi-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.yamlcredential_pool_strategies 里设置轮询策略(如 fill_first),Hermes 会在当前 Key 额度耗尽时自动切换到下一个。