---
ingested: 2026-08-07
status: inbox
---

# 主模型切换：OpenCode Go（订阅）为主 + DeepSeek 官方 fallback（2026-08-07）

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

## 最终配置（~/.hermes/config.yaml）
```yaml
model:
  default: deepseek-v4-flash
  provider: opencode-go
fallback_providers:
  - provider: deepseek
    model: deepseek-v4-flash
```
- opencode-go：base_url `https://opencode.ai/zen/go/v1`，env `OPENCODE_GO_API_KEY`，别名 `go`/`opencode-go-sub`；模型列表在 `hermes_cli/models.py`（25 个，含 deepseek-v4-flash、kimi-k3、glm-5.2、mimo 系列等），default_aux_model=glm-5
- 机制：**每轮（turn）先试主模型**，429/5xx 重试耗尽后切 fallback；401/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_entries`（fallback_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 list`：Primary deepseek-v4-flash (via opencode-go)，Fallback chain 1 entry deepseek-v4-flash (via deepseek)
- gateway 为 systemd user 服务 hermes-gateway.service
