Files
kb/raw/2026-08/2026-08-07-opencode-go-primary-deepseek-fallback.md
T

2.7 KiB
Raw Blame History

ingested, status
ingested status
2026-08-07 inbox

主模型切换:OpenCode Go(订阅)为主 + DeepSeek 官方 fallback2026-08-07

大哥拍板:把 Hermes 主模型供应商从 DeepSeek 官方改为 OpenCode Go 订阅opencode-go 里的 deepseek-v4-flash),不可用时自动 fallback 回 DeepSeek 官方同模型。目的:主流量走 OpenCode Go 订阅额度,省钱(不再按量计费)。

最终配置(~/.hermes/config.yaml

model:
  default: deepseek-v4-flash
  provider: opencode-go
fallback_providers:
  - provider: deepseek
    model: deepseek-v4-flash
  • opencode-gobase_url https://opencode.ai/zen/go/v1env OPENCODE_GO_API_KEY,别名 go/opencode-go-sub;模型列表在 hermes_cli/models.py25 个,含 deepseek-v4-flash、kimi-k3、glm-5.2、mimo 系列等),default_aux_model=glm-5
  • 机制:每轮(turn)先试主模型429/5xx 重试耗尽后切 fallback401/403/404 立即切(不重试);下一轮自动回到主模型。切换无缝保留上下文,但会重置 prompt cache(成本提示)

踩坑记录

  1. opencode.ai 有 Cloudflare 防护:无浏览器 UA 直接 403 error 1010,请求必须带 Mozilla UA
  2. OpenCode Go 的 deepseek-v4-flash 需显式 opt-in:最新版托管在中国区,未确认启用时返回 403 RegionError(提示去 opencode.ai 工作台确认)。403 属 auth 类 → fallback 立即触发,链路仍可用,只是每轮白打一次 403
  3. hermes config set fallback_providers '<JSON字符串>' 是坑:值会被存成字符串,而 _iter_fallback_entriesfallback_config.py)只接受 dict/list,字符串被静默忽略 → fallback 不生效。原配置 fallback_providers: '["openrouter"]' 就是这个无效旧格式。正确姿势:用 Hermes 自身 Python API from hermes_cli.config import load_config, save_config 写列表
  4. hermes fallback add 是交互式 TTY 命令,无法脚本化;agent 的 patch 工具被安全策略拒绝直接改 config.yaml(需用 hermes config 或 Python API
  5. DeepSeek 官方 API 测试坑max_tokens=10 时 reasoning_tokens 吃光额度返回空回复(max_tokens=200 正常)——测 deepseek-v4-flash 时 max_tokens 要设够
  6. gateway 重启防护(详见 08-04 hermes-v020-upgrade):内部任何方式无法重启自身,最终大哥手动重启(20:13 AEST),重启后会话无损继续,当前回复即走 OpenCode Go 主模型验证生效

验证

  • opencode-go key 有效、模型在列表中;opt-in 后实测 opencode.ai 返回正常
  • hermes fallback listPrimary deepseek-v4-flash (via opencode-go)Fallback chain 1 entry deepseek-v4-flash (via deepseek)
  • gateway 为 systemd user 服务 hermes-gateway.service