第29篇:备用提供商——AI 不宕机
Hermes 功能详解第29篇:Fallback Providers。主模型挂了自动切换备用。
第29篇:备用提供商——AI 不宕机
各位老铁,今天咱们来聊聊一个特别实在的话题:AI 挂了怎么办?
用过 Hermes 的朋友都知道,这玩意儿干活儿是真利索,但万一你用的那个模型提供商突然抽风(服务器爆炸、API 限流、账号欠费……),你的智能体就瞬间变成傻子。那感觉,就像你正跟人聊到关键处,对方突然掉线了。
别慌,Hermes 早就想到了。这篇咱们就讲讲备用提供商这回事儿,让你家 AI 永远在线。
主模型和辅助模型,先分清
Hermes 里有两类模型槽位:
- 主模型:负责思考的“大脑”。你发的每条消息、每次工具调用、每个流式响应,都走它。
- 辅助模型:干杂活儿的“小工”。比如上下文压缩、图片分析、网页摘要、审批打分、MCP 工具路由、会话标题生成、技能搜索……一共 11 个槽位,每个都能单独指定模型。
默认情况下,辅助任务都是 auto,意思就是“主模型你顺便也干了吧”。但你要是想省钱或者提速,完全可以给某个辅助任务单独指定一个便宜的小模型。
备用提供商怎么配?
重点来了。在 Dashboard 左侧边栏点 Models,你会看到两个区域:
- Model Settings:上面那个面板,就是给各个槽位分配模型的地方。
- Usage analytics:下面那些卡片,显示每个模型跑了多少 token、花了多少钱。
点主模型那一行的 Change,会弹出一个选择器:
- 左边:你已经认证过的提供商(API key 配好了的、OAuth 过的、或者自定义端点的)。
- 右边:该提供商下 Hermes 精选的模型列表——注意,这不是原始
/models接口的垃圾堆(OpenRouter 上那玩意儿有 400 多个模型,包括 TTS、画图、reranker 什么的),而是真正适合做 agent 的模型。
选好模型,点 Switch,Hermes 就会把它写进 ~/.hermes/config.yaml。注意:这只对新会话生效。已经打开的聊天标签页,还是用原来的模型跑。想热切换当前对话?用 /model 斜杠命令。
配置备用链路,最省事的路径是交互式管理器:
hermes fallback
它复用 hermes model 的提供商选择器——同样的提供商列表、同样的凭据提示、同样的校验。用 add、list(别名 ls)、remove(别名 rm)、clear 这几个子命令管理链路,改动会持久化到 config.yaml 顶层的 fallback_providers: 列表里。
当然你也可以直接改 YAML,在 ~/.hermes/config.yaml 里加一个顶层 fallback_providers 列表:
fallback_providers:
- provider: openrouter
model: anthropic/claude-sonnet-4
每个条目必须同时有 provider 和 model,缺任何一个都会被忽略。
:::note fallback_model vs fallback_providers
fallback_providers(复数,列表)是当前的配置形态,支持多个备用项按顺序尝试。fallback_model(单数)是旧的单备用键——Hermes 仍然向后兼容它,但 hermes fallback 写入的是当前的 fallback_providers 键,并在写入时迁移旧配置。两者都设置时,fallback_providers 优先。
:::
Gemini 备用条目接受 gemini、google、google-gemini、google-ai-studio 这几个值。在 Google 原生 API 端点上,它们都走原生 Gemini 客户端,包括 generationConfig.thinkingConfig 的转换;而自定义的 OpenAI 兼容 base URL 则继续走兼容客户端。
自定义 OpenAI 兼容端点的话,加上 base_url,可选加 key_env:
fallback_providers:
- provider: custom
model: my-local-model
base_url: http://localhost:8000/v1
key_env: MY_LOCAL_KEY # 存放 API key 的环境变量名
另外,如果你配了 Mixture of Agents(MoA)预设,也能拿它当备用:provider 写 moa,model 填预设名就行。注意它跑的是整个预设(引用模型 + 聚合器),不是光跑聚合器,所以预设的聚合器得有凭据。
中途切换的坑
在会话中途切换模型(Herm TUI 的模型选择器、CLI、或者 Telegram/Discord 上的 /model),Hermes 会估算你下一条消息要不要对新模型的窗口做预检上下文压缩。如果会话已经接近或超过新模型的压缩阈值,切换回复里会带个警告。
还有个更坑的:中途切换会重置提示缓存。因为提示缓存是按模型来算的,你一切换,下一条消息就得按全价重新读一遍整个对话历史(而不是享受 75-90% 的缓存折扣)。长会话里,这一下重读的费用可能比两个模型本身的差价还大。所以,要切换就趁早,别聊到一半才想起来换。
同样的道理,备用链路触发时也会重置提示缓存:新的 provider:model 对你的对话没有缓存前缀,下一条请求得按全价重读整个历史;等这一轮结束、主模型恢复时,回到主模型的第一条请求同样是全价重读(除非主模型的缓存 TTL 还没过期)。这是保命的代价,但也是为什么在提供商之间来回跳的长会话,可能比一直待在一个提供商上明显更贵。
无人值守的数据训练层级
有些模型(比如 muse-spark-1.2-contributor)因为厂商可能拿你的数据去训练,所以价格打折。交互式选择模型时,Hermes 会弹确认框。但像 Kanban worker、cron agent 这种无人值守的启动路径,没法问人,所以默认拒绝使用这类模型。
如果你能接受无人值守任务的数据被拿去训练,可以持久化确认:
hermes config set security.allow_data_training_tiers_noninteractive true
想撤销就:
hermes config unset security.allow_data_training_tiers_noninteractive
Hermes 每次无人值守启动时,仍然会打印完整的数据政策警告和确认键,方便审计。
备用链路怎么走?
当主模型不可用或容量爆了,auto 模式会按这个顺序找替补:
- 任务特定的
auxiliary.<task>.fallback_chain - 主
fallback_providers/fallback_model链 - Hermes 内置的辅助模型发现链
所以,你可以在配置文件里给主模型配好几个备用提供商,一个挂了自动切下一个,用户无感知。
触发备用切换的时机是这样的:限流(HTTP 429)和服务器错误(HTTP 500、502、503)会在重试次数耗尽后触发;认证失败(HTTP 401、403)和未找到(HTTP 404)会立即触发,因为重试也没意义;无效响应(API 反复返回畸形或空响应)也会触发。这里有个小细节:有时候 HTTP 200 看着挺正常,但正文里只有一句路由器的 Connect timeout, please try again later.、completion token 是 0,这同样算无效响应,会被重试而不是当成答案给你看。反过来,模型在拒绝频道里明确说“我不干”属于终态结果,会直接展示、不重试。触发后,Hermes 会解析备用提供商的凭据(包括用 key_cmd 的命名自定义提供商)、构建新的 API 客户端(在超时和请求客户端重建时保留动态凭据源)、原地替换模型/提供商/客户端、重新解析备用模型的推理强度(先看它自己的 agent.reasoning_overrides,没有就用全局 agent.reasoning_effort),然后重置重试计数器继续对话。你的对话历史、工具调用、上下文都原样保留,智能体从断点接着干,只是换了个模型。
顺带一提,如果 CLI 在启动时就因为主提供商认证失败而切到备用,也会走同样的推理强度重解析——备用模型用它自己配的强度,而不是主模型的。不过你要是显式写了 hermes chat --reasoning <level>,这个会保留,毕竟那是你对这次运行的明确意图。
有一点要特别注意:备用是“按轮次”的,不是“按会话”的。每条新的用户消息开始时,主模型都会被恢复。如果主模型在一轮中途挂了,备用只对这一轮生效;下一条消息,Hermes 又会去试主模型。同一轮里,备用最多激活一次——如果备用也挂了,就交给常规错误处理(重试,然后报错)。这样既能防止一轮之内级联故障转移,又能让主模型每轮都有一次新机会。
这个按轮次的重试还是感知重置时间的:如果主模型的凭据报告了一个还没到的限流重置时间(比如 Claude Pro/Max 的 5 小时窗口、Codex 的每周限额,这些会以小时或天为单位报告),Hermes 会跳过这次注定失败的重试,一直待在备用上直到重置过去——避免每轮两次无意义的提供商切换(以及两次提示缓存失效)。重置时间到了,只是让主模型在后续轮次里重新有资格被尝试,它不会安排一次重试,也不保证一定能恢复。没有重置时间的临时 429 则使用指数退避冷却。
当一次切换触发了这个冷却,备用提示里会带上大致的剩余时长,例如:Primary retry eligible in ~60 s; recovery is not guaranteed.。非限流类的切换、以及从已经激活的跨提供商备用上再切换,不会宣告新的主模型冷却。
备用在哪些地方生效?
| 场景 | 是否支持备用 |
|---|---|
CLI 会话(交互式和 hermes -z 一次性) |
✔(启动时主提供商凭据/配额失败、会话中途都能切;聊天开着时新增或修改的链路,从下一轮开始生效) |
| 消息网关(Telegram、Discord 等) | ✔ |
| 桌面应用 / TUI 聊天 | ✔(聊天开着时新增或修改的链路,从下一轮开始生效) |
| 子智能体委派 | ✔(设置了 delegation.fallback_providers 时用它;否则只有未固定模型的子智能体会继承父链;[] 表示禁用) |
| Cron 任务 | ✔(cron 智能体继承配置好的备用提供商) |
provider: auto 的辅助任务 |
✔(先试任务级备用,再试主备用链,最后才用内置的辅助发现链) |
:::tip
主备用链没有环境变量——只能通过 config.yaml 或 hermes fallback 配置。这是有意为之:备用配置是一个深思熟虑的选择,不该被一个过期的 shell 导出覆盖。
:::
快速上手:Nous Portal
如果你还没配任何提供商,最快的路径是跑:
hermes setup --portal
一条命令登录 Nous Portal 并设为默认提供商,300+ 模型随便用。查看当前接线情况用 hermes portal info。Portal 订阅用户还能在按 token 计费的提供商上享受 9 折。
最后提醒
model: 配置项在新装的时候是空字符串(""),第一次跑 hermes setup 或 hermes model 时,会自动升级成带 provider、default、base_url、api_mode 子键的映射。如果你在 config.yaml 里看到空字符串,跑一下 hermes model(或点 Dashboard 里的 Change)就能自动修复。
好了,备用提供商这块儿就聊到这儿。记住:AI 会挂,但你的智能体不该挂。配置好备用链路,让你的 Hermes 永远在线!
📖 官方文档
本文根据 Hermes Agent 官方文档编写,原文见:官方文档 › user-guide/features/fallback-providers