Appearance
Hermes Agent 的 Provider 路由分两层:第一层是 Provider 统一接入(15+ 家,用 OpenRouter 聚合或直接配各家 Key),第二层是 per-turn 智能路由(根据消息复杂度自动用廉价模型处理简单问题)。两层叠加,能在不损失质量的前提下把 API 成本降低 30~60%。
Hermes Agent 多 Provider 路由:怎么配置 Claude / Copilot / DeepSeek 并自动切换
Hermes 支持同时配置多个 LLM Provider,核心场景有三个:
- 不同任务用不同模型(编程用 Claude,简单问答用 Gemini Flash)
- 自动降级:简单消息不浪费贵模型
- 多账号轮转(credential pool),防单 Key 限速
Provider 接入方式
方式一:OpenRouter(推荐)
OpenRouter 是聚合中间层,一个 Key 覆盖 200+ 模型,计费按实际调用量:
env
# ~/.hermes/.env
OPENROUTER_API_KEY=sk-or-v1-...config.yaml 指定模型时用 provider/model 格式:
yaml
model:
default: anthropic/claude-opus-4.6Hermes 检测到 anthropic/ 前缀 + OPENROUTER_API_KEY,自动走 OpenRouter 路由。
方式二:直接接各家 Provider
也可以绕过 OpenRouter,直接配各家 Key,Hermes 会按 Key 的前缀或 Provider 名称路由:
env
# Anthropic 原生 API
ANTHROPIC_API_KEY=sk-ant-...
# Google Gemini
GOOGLE_API_KEY=AIza...
# DeepSeek(支持 OpenAI 兼容格式)
DEEPSEEK_API_KEY=sk-...
# Kimi(月之暗面)
KIMI_API_KEY=sk-kimi-...
# GitHub Copilot(用 GitHub Token)
GITHUB_TOKEN=ghp_...Hermes 按优先级自动选 Provider:配置文件里指定 provider 字段 > 能匹配到 Key 的第一个。
方式三:Credential Pool(多账号轮转)
对于有 rate limit 的 Provider,配 credential pool 让 Hermes 自动轮转多个 Key:
yaml
# config.yaml
model:
credential_pool:
- api_key: sk-ant-key1
provider: anthropic
- api_key: sk-ant-key2
provider: anthropic
- api_key: sk-or-key1
provider: openrouterHermes 按轮询策略分配请求,单 Key 打到限速时自动切下一个。
per-turn 智能路由
机制说明
Hermes 在每次调用前运行 choose_cheap_model_route() 判断是否降级到廉价模型。判断逻辑(保守策略):
触发廉价模型路由的条件(同时满足):
- 消息长度 ≤ 160 字符
- 词数 ≤ 28 个词
- 不超过 1 行(无多行内容)
- 不含代码块(无反引号)
- 不含 URL
强制保留主力模型(命中任一):
- 消息含关键词:
debug、implement、refactor、analyze、architecture、review、terminal、test、delegate、docker等 - 消息超过长度/词数阈值
设计哲学是保守:宁可多用贵模型,也不在复杂任务上用廉价模型出错。
配置廉价路由
yaml
# config.yaml
routing:
enabled: true
cheap_model:
provider: openrouter
model: google/gemini-flash-1.5
max_simple_chars: 160 # 消息字符上限(超过保留主力)
max_simple_words: 28 # 词数上限常见的廉价模型搭配:
| 主力模型 | 廉价备选 | 适用场景 |
|---|---|---|
| claude-opus-4.6 | gemini-flash-1.5 | 简单问答降级 |
| claude-sonnet-4.6 | gpt-4o-mini | 日常编程 + 简单交互 |
| deepseek-chat | qwen-turbo | 中文场景 |
Anthropic Prompt Caching
Hermes 实现了 Anthropic 的 system_and_3 缓存策略,自动插入 cache_control 断点:
| 位置 | 缓存类型 | 节省 |
|---|---|---|
| 系统提示 | 对话全程复用 | 最稳定 |
| 最近 3 条非系统消息 | 滚动窗口 | 上下文越长越省 |
实现细节:Hermes 在发送前做深拷贝,对最后 3 条非 system 消息的末尾内容块注入 {"type": "ephemeral"} 标记。不改变原始消息,不影响缓存的一致性。
Anthropic 的计费规则: cached 输入 token 费用是普通输入的 10%,写入缓存(首次)是普通输入的 125%。长对话从第二轮开始节省,上下文越长、对话越多,省得越多。
配置(默认开启,可关闭):
yaml
# config.yaml
anthropic_caching:
enabled: true
ttl: "5m" # 缓存生命周期,可选 "5m" 或 "1h"成本优化实战
场景:日常编程助手,同时要控制成本
yaml
model:
default: anthropic/claude-sonnet-4.6
routing:
enabled: true
cheap_model:
provider: openrouter
model: google/gemini-flash-1.5-8b
anthropic_caching:
enabled: true
ttl: "5m"效果估算(实际因对话模式而异):
- 廉价路由:简单问答占 20~30% 时,可节省约 15~20%
- Prompt caching:长对话(20+ 轮)节省约 40~60% 输入 token 费用
场景:严格固定单一模型,关闭路由
yaml
routing:
enabled: falseFAQ
Q: per-turn 路由的降级判断准确吗?
保守策略设计就是宁可多用贵模型。一旦消息里出现代码、技术关键词、多行内容,立即回主力模型。误判率低,但覆盖率也不高。实测简单日常问候和短问答会触发,复杂任务全部走主力。
Q: Gemini Flash 和 OpenRouter 的延迟差多少?
OpenRouter 走中间层有额外延迟(通常 100~300ms),对 Claude 影响不大(Claude 本身响应慢),对 Gemini Flash 影响更明显。如果延迟敏感,直接配 GOOGLE_API_KEY 绕过 OpenRouter。
Q: Credential Pool 和 OpenRouter 的区别?
Credential Pool 是在 Hermes 层面做多账号轮转,适合有多个自有 API Key 的场景。OpenRouter 是聚合层自动负载均衡,适合不想管多个 Key 的场景。两者可以叠加:OpenRouter Key 放进 Credential Pool,多个 OpenRouter 账号轮转。