对话笔记直发:8.13 Hermes 网关免费模型自动切换与报错修复。分类:AI工程。
title: Hermes 网关免费模型自动切换与报错修复 date: 2026-08-13 tags:
- Hermes
- Nous
- Telegram
- 网关部署
- sing-box
- 免费模型
- 自动切换
- 云服务器
- yun1
- tencent summary: 在 yun1 与 tencent 两台云服务器部署 Hermes Agent 网关(Nous 免费账号 + Telegram + sing-box 代理),修复「model provider failed after retries」404 报错(根因:配置放错路径导致网关回退到付费默认模型),并补齐 jp 已有的免费模型自动切换(model_catalog + fallback_model)。
Hermes 网关免费模型自动切换与报错修复(2026-08-13)
一、部署目标与约束
- 在 yun1(
121.41.*.*,admin)与 tencent(124.222.*.*,root)两台云服务器部署 Hermes Agent 网关。 - 绑定 Nous 官方免费账号,使用免费 API token 模型;两个独立免费额度账号(不是同一账号)。
- 配置 Telegram(bot token 来自
@telegram BOT.txt):hermes1=yun1,hermes2=tencent。 - egress 走 sing-box 代理
127.0.0.1:7890(参考本地 NAS jp192.168.*.*的配置同步)。 - 硬约束(不可违反):不得影响 tencent 既有容器服务(omniroute/codex-box 等);不得影响 yun1 的
ai-chat前后端容器。
二、最终落地配置(两台一致)
/opt/data/config.yaml(注意路径,见坑 3),属主 hermes:hermes,权限 600:
model: tencent/hy3:free
model_catalog:
enabled: true
url: https://hermes-agent.nousresearch.com/docs/api/model-catalog.json
ttl_hours: 1
providers: {}
fallback_model:
provider: nous
model: stepfun/step-3.7-flash:free- 服务:
hermes-gateway.service(User=hermes,HERMES_HOME=/opt/data,WorkingDirectory=/opt/data,EnvironmentFile=/opt/data/.env)。 /opt/data/.env(600,hermes):含HTTP_PROXY/HTTPS_PROXY=http://127.0.0.1:7890、NO_PROXY=localhost,127.0.0.1,::1、TELEGRAM_BOT_TOKEN=xxxx、TELEGRAM_ALLOWED_USERS=5359999791。
三、踩过的坑(关键经验)
坑 1:Nous 登录非交互时自动导入共享凭证
hermes auth add nous --type oauth --no-browser检测到<HERMES_HOME>/shared/nous_auth.json存在时,在管道/非 TTY 输入下input()抛EOFError被当作 “y”,自动 rehydrate 共享凭证 → 绑定成错误账号。- 修复:删
/opt/data/shared/nous_auth.json(及.lock)后再跑,才会走 device-code 流程打印新user_code链接。 - 最终两个账号独立:yun1
org_id=nas_organisation:246f1c47-…、tencentorg_id=nas_organisation:bda55a46-…(均不同于最初误导入的cmopzccfr…)。
坑 2:免费模型名写错
- 误写
tencent/hy3-preview:free→ Nous 推理 404「Model not found」。 - 正确:
tencent/hy3:free(直连https://inference-api.nousresearch.com/v1/chat/completions返回 200 “PONG”,不计费)。Nous 可用模型共 363 个;tencent/hy3-preview:free不存在,stepfun/step-3.7-flash:free存在。
坑 3(本次主因):配置放错路径 → 网关回退付费默认模型
- 现象:用户通过 Telegram 发消息,bot 回复
⚠️ The model provider failed after retries;日志真实报错:404 Model 'deepseek/deepseek-v4-flash' requires available credits … pick a free model.—— 网关在用付费模型,免费账号无额度。 - 根因:网关
_load_gateway_config()读取_hermes_home / 'config.yaml'(即/opt/data/config.yaml,源码gateway/run.py约 1530 行);而之前把配置建在了/opt/data/.hermes/config.yaml(那是 CLIload_config()的路径)。网关读不到 → 回退内置默认deepseek/deepseek-v4-flash(付费)→ 404。 - 修复:把配置写到正确路径
/opt/data/config.yaml,删除误放的/opt/data/.hermes/config.yaml,重启hermes-gateway.service。 - 佐证:jp 的配置文件就在
/opt/data/config.yaml(无.hermes那份),与网关加载路径一致。
四、jp 的「免费模型自动切换」机制(已复刻到云上)
model_catalog:Hermes 每小时拉取 Nous 的当前免费/推荐模型清单(/api/nous/recommended-models的freeRecommendedModels是「当前免费模型」真相源),供模型选择器感知最新免费款。目录 URL 实际 301 重定向到nousresearch.github.io/.../model-catalog.json,经代理返回 200 有效 JSON。fallback_model:主模型调用失败时自动回退到另一个:free模型(stepfun/step-3.7-flash:free)。- 局限(与 jp 一致):网关主模型是静态值。当
tencent/hy3:free不再免费时,回退到fallback_model(固定免费款),而非自动跟到「当月最新免费款」;严格跟最新款需在切换后手动hermes model重选(catalog 已让选择器显示最新款)。 - 注意:日后若用
hermes model等 CLI 改模型,必须export HERMES_HOME=/opt/data,否则 CLI 会在未设 HERMES_HOME 时于~/.hermes/config.yaml生成影子配置、与网关读取的/opt/data/config.yaml不一致。
五、验证结果
- ✅ 两台
hermes-gateway.serviceactive,Telegram 已连(polling 模式,走 sing-box 代理)。 - ✅ 重启后日志不再出现
No model configured/defaulting to deepseek(旧的 22:xx 时间戳行均为历史)。 - ✅ 两个 Nous 账号独立(org_id 不同)。
- ✅
tencent/hy3:free经 Nous 直连 200;model_catalog目录经代理可达。 - ✅ 子代理方案评审 PASS、代码复核 PASS;硬约束未被触碰(tencent 容器、yun1 ai-chat 均在运行)。
- ⏳ 待办:真实 Telegram 往返验收未完成(见下)。
六、待办 / 后续
- 真实 Telegram 往返验收:用户需在 Telegram 给两个 bot 各发一条消息——yun1
@feng_hermes1_bot、tencent@feng_hermes2_bot(允许 chat5359999791)——确认网关这次用model=tencent/hy3:free调用成功并回复(而非 404 credits)。发完让我拉日志确认。 ✅ 2026-08-14 - 若某日
tencent/hy3:free不再免费:先手动hermes model在免费款里重选;或依赖fallback_model回退到stepfun/step-3.7-flash:free。 - 可选:把 jp 的其余网关相关配置(telegram 富文本、cron 等)按需同步到云上(当前云上仅最小配置,telegram token 走 .env,已正常工作)。
七、关键定位速查
- 网关配置真路径:
/opt/data/config.yaml(CLI 路径是.hermes/config.yaml,两处不同,别混)。 - Nous 推理端点:
https://inference-api.nousresearch.com/v1,bearer 用 Nousagent_key(NAS invoke JWT)。 - 代理:
127.0.0.1:7890(sing-box mixed)。直连 Nous 推理在云上可能被拦,必须走代理。 - Telegram Bot API 验证:
curl -x 127.0.0.1:7890 https://api.telegram.org/bot<token>/getMe。
八、完整部署过程时间线(两台云服务器,含细节)
目标:在 yun1(
121.41.*.*,admin)与 tencent(124.222.*.*,root)各部署一套 Hermes Agent 网关,绑定 两个相互独立的 Nous 官方免费账号(各自独立免费额度),通过 Telegram 收发,egress 走 sing-box 代理127.0.0.1:7890。参考机为本地 NAS jp(192.168.*.*,已配好 Hermes + 免费模型自动切换)。 硬约束(全程未违反):不得影响 tencent 既有容器服务(omniroute/codex-box 等);不得影响 yun1 的ai-chat前后端容器。
阶段 0:环境准备
- 两台均新建 Hermes venv
/opt/hermes:yun1 为 Python 3.12,tencent 为 Python 3.11(standalone)。HERMES_HOME=/opt/data,工作目录/opt/data。 - sing-box 代理:两台均在本机
127.0.0.1:7890提供 mixed 入站(vless)。yun1 把 sing-box 从旧版升到 v1.13.18;tencent 已有。 - Telegram bot(来自
@telegram BOT.txt):- hermes1 = yun1 →
@feng_hermes1_bot(id8880356226:xxxx) - hermes2 = tencent →
@feng_hermes2_bot(id8642117385:xxxx) - 允许的用户 chat:
5359999791(unixcs1)。
- hermes1 = yun1 →
阶段 1:安装 Hermes + 建立网关服务
pip install hermes-agent(或等价于在 venv 装hermes_cli),生成/opt/hermes/bin/hermes与python -m hermes_cli.main。- 编写 systemd 单元
hermes-gateway.service:User=hermes、WorkingDirectory=/opt/data、Environment=HERMES_HOME=/opt/data、EnvironmentFile=/opt/data/.env、ExecStart=/opt/hermes/bin/python -m hermes_cli.main gateway run;After=sing-box.service(仅排序,不触发重启)。 /opt/data/.env(属主 hermes,权限 600)含:HTTP_PROXY/HTTPS_PROXY=http://127.0.0.1:7890、NO_PROXY=localhost,127.0.0.1,::1、`TELEGRAM_BOT_