Fallback Providers(回退提供商)
Hermes Agent 具有三层弹性机制,可在提供商遇到问题时保持会话运行:
- 凭证池(Credential pools)——在同一提供商间轮换多个 API 密钥(首先尝试)
- 主模型回退——当主模型失败时,自动切换到不同的提供商:模型
- 辅助任务回退——为视觉、压缩和网页提取等辅助任务提供独立的提供商解析
凭证池处理同一提供商的密钥轮换(例如多个 OpenRouter 密钥)。本页介绍跨提供商回退。两者都是可选的且独立工作。
主模型回退
当您的主 LLM 提供商遇到错误——速率限制、服务器过载、认证失败、连接断开——Hermes 可以自动切换到备份的提供商:模型对,而不会丢失您的对话,且在整个会话中保持。
配置
最简单的路径是交互式管理器:
hermes fallbackhermes fallback 重用 hermes model 的提供商选择器——相同的提供商列表、相同的凭证提示、相同的验证。使用子命令 add、list(别名 ls)、remove(别名 rm)和 clear 管理回退链。更改会持久化到 config.yaml 顶层 fallback_providers: 列表中。
如果您更愿意直接编辑 YAML,向 ~/.hermes/config.yaml 添加 fallback_model 部分:
fallback_model:
provider: openrouter
model: anthropic/claude-sonnet-4provider 和 model 都是必需的。如果缺少任何一个,回退被禁用。
:::note fallback_model 与 fallback_providers
fallback_model(单数)是旧版单回退键——Hermes 仍保留它以向后兼容。fallback_providers(复数,列表)支持多个按顺序尝试的回退;hermes fallback 会写入此键。当两者都设置时,Hermes 会合并它们,fallback_providers 优先。
:::
支持的提供商
| 提供商 | 值 | 要求 |
|---|---|---|
| AI Gateway | ai-gateway | AI_GATEWAY_API_KEY |
| OpenRouter | openrouter | OPENROUTER_API_KEY |
| Nous Portal | nous | hermes auth(OAuth) |
| OpenAI Codex | openai-codex | hermes model(ChatGPT OAuth) |
| GitHub Copilot | copilot | COPILOT_GITHUB_TOKEN、GH_TOKEN 或 GITHUB_TOKEN |
| GitHub Copilot ACP | copilot-acp | 外部进程(编辑器集成) |
| Anthropic | anthropic | ANTHROPIC_API_KEY 或 Claude Code 凭据 |
| z.ai / GLM | zai | GLM_API_KEY |
| Kimi / Moonshot | kimi-coding | KIMI_API_KEY |
| MiniMax | minimax | MINIMAX_API_KEY |
| MiniMax(中国) | minimax-cn | MINIMAX_CN_API_KEY |
| DeepSeek | deepseek | DEEPSEEK_API_KEY |
| NVIDIA NIM | nvidia | NVIDIA_API_KEY(可选:NVIDIA_BASE_URL) |
| GMI Cloud | gmi | GMI_API_KEY(可选:GMI_BASE_URL) |
| StepFun | stepfun | STEPFUN_API_KEY(可选:STEPFUN_BASE_URL) |
| Ollama Cloud | ollama-cloud | OLLAMA_API_KEY |
| Google Gemini(OAuth) | google-gemini-cli | hermes model(Google OAuth;可选:HERMES_GEMINI_PROJECT_ID) |
| Google AI Studio | gemini | GOOGLE_API_KEY(别名:GEMINI_API_KEY) |
| xAI(Grok) | xai(别名 grok) | XAI_API_KEY(可选:XAI_BASE_URL) |
| xAI Grok OAuth(SuperGrok) | xai-oauth(别名 grok-oauth) | hermes model → xAI Grok OAuth(浏览器登录;SuperGrok 订阅) |
| AWS Bedrock | bedrock | 标准 boto3 认证(AWS_REGION + AWS_PROFILE 或 AWS_ACCESS_KEY_ID) |
| Qwen Portal(OAuth) | qwen-oauth | hermes model(Qwen Portal OAuth;可选:HERMES_QWEN_BASE_URL) |
| MiniMax(OAuth) | minimax-oauth | hermes model(MiniMax portal OAuth) |
| OpenCode Zen | opencode-zen | OPENCODE_ZEN_API_KEY |
| OpenCode Go | opencode-go | OPENCODE_GO_API_KEY |
| Kilo Code | kilocode | KILOCODE_API_KEY |
| Xiaomi MiMo | xiaomi | XIAOMI_API_KEY |
| Arcee AI | arcee | ARCEEAI_API_KEY |
| GMI Cloud | gmi | GMI_API_KEY |
| Alibaba / DashScope | alibaba | DASHSCOPE_API_KEY |
| Alibaba Coding Plan | alibaba-coding-plan | ALIBABA_CODING_PLAN_API_KEY(回退到 DASHSCOPE_API_KEY) |
| Kimi / Moonshot(中国) | kimi-coding-cn | KIMI_CN_API_KEY |
| StepFun | stepfun | STEPFUN_API_KEY |
| Tencent TokenHub | tencent-tokenhub | TOKENHUB_API_KEY |
| Microsoft Foundry | azure-foundry | AZURE_FOUNDRY_API_KEY + AZURE_FOUNDRY_BASE_URL |
| LM Studio(本地) | lmstudio | LM_API_KEY(或无,本地)+ LM_BASE_URL |
| Hugging Face | huggingface | HF_TOKEN |
| 自定义端点 | custom | base_url + key_env(见下文) |
自定义端点回退
对于自定义的 OpenAI 兼容端点,添加 base_url 和可选的 key_env:
fallback_model:
provider: custom
model: my-local-model
base_url: http://localhost:8000/v1
key_env: MY_LOCAL_KEY # 包含 API 密钥的环境变量名称何时触发回退
当主模型出现以下故障时,回退自动激活:
- 速率限制(HTTP 429)——在耗尽重试尝试后
- 服务器错误(HTTP 500、502、503)——在耗尽重试尝试后
- 认证失败(HTTP 401、403)——立即(重试无意义)
- 未找到(HTTP 404)——立即
- 无效响应——当 API 重复返回格式错误或空响应时
触发时,Hermes:
- 解析回退提供商的凭证
- 构建新的 API 客户端
- 原地替换模型、提供商和客户端
- 重置重试计数器并继续对话
切换是无缝的——您的对话历史、工具调用和上下文都得以保留。代理从它离开的地方继续,只是使用了不同的模型。
:::info 按轮次而非按会话 回退是轮次作用域的:每个新用户消息开始时会恢复主模型。如果主模型在轮次中间失败,回退仅针对该轮次激活。在下一个消息时,Hermes 再次尝试主模型。在单轮次内,回退最多激活一次——如果回退也失败,则由正常错误处理接管(重试,然后错误消息)。这防止了轮次内的级联故障转移循环,同时每轮给主模型一次新的机会。 :::
示例
OpenRouter 作为 Anthropic 原生的回退:
model:
provider: anthropic
default: claude-sonnet-4-6
fallback_model:
provider: openrouter
model: anthropic/claude-sonnet-4Nous Portal 作为 OpenRouter 的回退:
model:
provider: openrouter
default: anthropic/claude-opus-4
fallback_model:
provider: nous
model: nous-hermes-3本地模型作为云端回退:
fallback_model:
provider: custom
model: llama-3.1-70b
base_url: http://localhost:8000/v1
key_env: LOCAL_API_KEYCodex OAuth 作为回退:
fallback_model:
provider: openai-codex
model: gpt-5.3-codex回退生效范围
| 上下文 | 支持回退 |
|---|---|
| CLI 会话 | ✔ |
| 消息网关(Telegram、Discord 等) | ✔ |
| 子代理委派 | ✘(子代理不继承回退配置) |
| 定时任务 | ✘(使用固定提供商运行) |
| 辅助任务(视觉、压缩) | ✘(使用自己的提供商链——见下文) |
:::tip
fallback_model 没有环境变量——它完全通过 config.yaml 配置。这是有意为之:回退配置是一个审慎的选择,不应被过时的 shell 导出覆盖。
:::
辅助任务回退
Hermes 为辅助任务使用独立的轻量模型。每个任务有自己的提供商解析链,作为内置回退系统。
具有独立提供商解析的任务
| 任务 | 功能 | 配置键 |
|---|---|---|
| Vision(视觉) | 图像分析、浏览器截图 | auxiliary.vision |
| Web Extract(网页提取) | 网页摘要 | auxiliary.web_extract |
| Compression(压缩) | 上下文压缩摘要 | auxiliary.compression |
| Skills Hub(技能中心) | 技能搜索和发现 | auxiliary.skills_hub |
| MCP | MCP 辅助操作 | auxiliary.mcp |
| Approval(审批) | 智能命令审批分类 | auxiliary.approval |
| Title Generation(标题生成) | 会话标题摘要 | auxiliary.title_generation |
| Triage Specifier(分类细化) | hermes kanban specify / 仪表盘 ✨ 按钮 —— 将一行分类任务展开为完整规范 | auxiliary.triage_specifier |
自动检测链
当任务的提供商设置为 "auto"(默认值)时,Hermes 按顺序尝试提供商直到一个生效:
对于文本任务(压缩、网页提取等):
OpenRouter → Nous Portal → Custom endpoint → Codex OAuth →
API-key providers (z.ai, Kimi, MiniMax, Xiaomi MiMo, Hugging Face, Anthropic) → 放弃
对于视觉任务:
Main provider (if vision-capable) → OpenRouter → Nous Portal →
Codex OAuth → Anthropic → Custom endpoint → 放弃
如果解析后的提供商在调用时失败,Hermes 还有一个内部重试机制:如果提供商不是 OpenRouter 且没有显式设置 base_url,它会尝试将 OpenRouter 作为最后的回退。
配置辅助提供商
每个任务可以在 config.yaml 中独立配置:
auxiliary:
vision:
provider: "auto" # auto | openrouter | nous | codex | main | anthropic
model: "" # 例如 "openai/gpt-4o"
base_url: "" # 直接端点(优先于 provider)
api_key: "" # base_url 对应的 API 密钥
web_extract:
provider: "auto"
model: ""
compression:
provider: "auto"
model: ""
skills_hub:
provider: "auto"
model: ""
mcp:
provider: "auto"
model: ""上述每个任务遵循相同的 provider / model / base_url 模式。上下文压缩在 auxiliary.compression 下配置:
auxiliary:
compression:
provider: main # 与其他辅助任务相同的提供商选项
model: google/gemini-3-flash-preview
base_url: null # 自定义 OpenAI 兼容端点而回退模型使用:
fallback_model:
provider: openrouter
model: anthropic/claude-sonnet-4
# base_url: http://localhost:8000/v1 # 可选的自定义端点所有三项——辅助任务、压缩、回退——工作方式相同:设置 provider 选择处理请求的服务商,model 选择模型,base_url 指向自定义端点(覆盖 provider)。
辅助任务的提供商选项
这些选项仅适用于 auxiliary:、compression: 和 fallback_model: 配置——"main"不是顶级 model.provider 的有效值。对于自定义端点,在 model: 部分使用 provider: custom(参见 AI Providers)。
| 提供商 | 描述 | 要求 |
|---|---|---|
"auto" | 按顺序尝试提供商直到一个生效(默认) | 至少配置一个提供商 |
"openrouter" | 强制使用 OpenRouter | OPENROUTER_API_KEY |
"nous" | 强制使用 Nous Portal | hermes auth |
"codex" | 强制使用 Codex OAuth | hermes model → Codex |
"main" | 使用主代理正在使用的提供商(仅辅助任务) | 已配置活动的主提供商 |
"anthropic" | 强制使用 Anthropic 原生 | ANTHROPIC_API_KEY 或 Claude Code 凭据 |
直接端点覆盖
对于任何辅助任务,设置 base_url 会绕过提供商解析,直接将请求发送到该端点:
auxiliary:
vision:
base_url: "http://localhost:1234/v1"
api_key: "local-key"
model: "qwen2.5-vl"base_url 优先于 provider。Hermes 使用配置的 api_key 进行认证,如果未设置则回退到 OPENAI_API_KEY。对于自定义端点,它不会重用 OPENROUTER_API_KEY。
辅助容量错误回退
当您设置了显式的辅助提供商(例如 auxiliary.vision.provider: glm),Hermes 会将其作为您的首选——但如果提供商由于容量错误(HTTP 402 需要付款、HTTP 429 日配额耗尽、连接失败)而根本无法提供服务,Hermes 会通过分层链进行回退,而不是静默失败:
- 主辅助提供商——您配置的那个(总是首先尝试)
auxiliary.<task>.fallback_chain——您的每任务覆盖列表(如果您编写了的话)- 主代理提供商 + 模型——最后的安全网(总是尝试,即使您没有编写链)
- 警告 + 重新抛出——如果每一层都失败,Hermes 以 WARNING 级别记录
Auxiliary <task>: ... all fallbacks exhausted并重新抛出原始错误
瞬态 HTTP 429 速率限制(Retry-After: ...)被视为请求约束,而非容量问题——它们尊重您显式的提供商选择,并且不会触发回退阶梯。只有日/月配额耗尽、付款错误和连接失败会绕过显式提供商的门控。
对于使用 provider: auto(无显式辅助提供商)的用户,现有的自动检测链会代替步骤 2-3 运行。其第一步已经是主代理模型,因此 auto 用户无需任何配置即可获得相同的结果。
可选:每任务回退链
如果您想要与”主代理模型优先”不同的回退顺序,显式配置 fallback_chain。每个条目至少需要 provider;model、base_url 和 api_key 是可选的。
auxiliary:
vision:
provider: glm
model: glm-4v-flash
fallback_chain:
- provider: openrouter
model: google/gemini-3-flash-preview
- provider: nous
model: anthropic/claude-sonnet-4
compression:
provider: openrouter
fallback_chain:
- provider: openai
model: gpt-4o-mini您不需要配置 fallback_chain 来获得回退功能——主代理安全网始终运行。仅当您明确想要与默认不同的顺序时才使用它。
触发回退的提供商配额错误
Hermes 将这些识别为等同于 402 信用耗尽的容量错误(而非瞬态速率限制):
- Bedrock / LiteLLM:
Too many tokens per day、daily limit、tokens per day - Vertex AI / GCP:
quota exceeded、resource exhausted、RESOURCE_EXHAUSTED - 通用:
daily quota、quota_exceeded
如果您的提供商返回不同的短语表示日配额耗尽而 Hermes 没有触发回退,那是一个 bug——请提交包含确切错误字符串的 issue。
上下文压缩回退
上下文压缩使用 auxiliary.compression 配置块来控制哪个模型和提供商处理摘要:
auxiliary:
compression:
provider: "auto" # auto | openrouter | nous | main
model: "google/gemini-3-flash-preview":::info 旧版迁移
旧配置中的 compression.summary_model / compression.summary_provider / compression.summary_base_url 会在首次加载时自动迁移到 auxiliary.compression.*(配置版本 17)。
:::
如果没有可用的压缩提供商,Hermes 会丢弃中间的对话轮次而不生成摘要,而不是使会话失败。
委派提供商覆盖
delegate_task 生成的子代理不使用主回退模型。但是,它们可以被路由到不同的提供商:模型对以优化成本:
delegation:
provider: "openrouter" # 为所有子代理覆盖提供商
model: "google/gemini-3-flash-preview" # 覆盖模型
# base_url: "http://localhost:1234/v1" # 或使用直接端点
# api_key: "local-key"参见 子代理委派 获取完整配置详情。
定时任务提供商
定时任务在执行时使用当时配置的任何提供商。它们不支持回退模型。要为定时任务使用不同的提供商,在任务本身上配置 provider 和 model 覆盖:
cronjob(
action="create",
schedule="every 2h",
prompt="Check server status",
provider="openrouter",
model="google/gemini-3-flash-preview"
)参见 定时任务(Cron) 获取完整配置详情。
总结
| 功能 | 回退机制 | 配置位置 |
|---|---|---|
| 主代理模型 | fallback_model 在 config.yaml 中 —— 每轮故障转移(每轮恢复主模型) | fallback_model:(顶层) |
| 辅助任务(任意)—— auto 用户 | 完整自动检测链(主代理模型优先,然后是提供商链),容量错误时 | auxiliary.<task>.provider: auto |
| 辅助任务(任意)—— 显式提供商 | fallback_chain(如果设置)→ 主代理模型 → 警告 + 抛出,仅容量错误时 | auxiliary.<task>.fallback_chain |
| 视觉 | 分层(见上文)+ 内部 OpenRouter 重试 | auxiliary.vision |
| 网页提取 | 分层(见上文)+ 内部 OpenRouter 重试 | auxiliary.web_extract |
| 上下文压缩 | 分层(见上文);所有层不可用时降级为无摘要 | auxiliary.compression |
| 技能中心 | 分层(见上文) | auxiliary.skills_hub |
| MCP 辅助 | 分层(见上文) | auxiliary.mcp |
| 审批分类 | 分层(见上文) | auxiliary.approval |
| 标题生成 | 分层(见上文) | auxiliary.title_generation |
| 分类细化 | 分层(见上文) | auxiliary.triage_specifier |
| 委派 | 仅提供商覆盖(无自动回退) | delegation.provider / delegation.model |
| 定时任务 | 仅每任务提供商覆盖(无自动回退) | 每任务 provider / model |