# ADR-029: Hermes-First 雙塔分工

- **Status**: Accepted
- **Date**: 2026-05-03
- **Decision Maker**: 統帥
- **Author**: Operation Ollama-First v5.0（Codex / A12 planner）
- **Related**: ADR-001（三 Agent 自主學習分工）、ADR-002（pgvector）、ADR-018（四 Agent 控制面）、ADR-019（Telegram Agentic Layer）、ADR-027（Primary Ollama on GCP）、ADR-028（LLM 路由統一準則）

---

## Context

ADR-001 / ADR-018 把 Hermes 定位為「L1 Observer / Embedding」、OpenClaw 定位為「L3 Strategist」，但實作上的權重失衡與成本失衡讓「分工」變成「OpenClaw 全包」。

### 失衡證據（戰役 v5.0 Phase 0 audit）

1. **程式碼體積失衡**：
   - `services/openclaw_strategist_service.py` ≈ **2677 行**（HEAD 起 1831 行 + Phase 3/4 增量 846 行）
   - `services/hermes_analyst_service.py` ≈ **607 行**
   - 比率 **4.4×**，但 Hermes 的呼叫頻率高 OpenClaw **約 100 倍**

2. **成本失衡**：
   - OpenClaw 月燒 Gemini ≈ **50M tokens**（估算依 phase0 audit caller 流量推算）
   - Hermes 月燒 Ollama ≈ **30M tokens**，邊際成本 **$0**
   - 換句話說：Hermes 跑了 60% 流量 = $0；OpenClaw 跑了 40% 流量 = 全部 Gemini 帳單

3. **使用者主入口 = Telegram，但 Telegram NL 走 OpenClaw**：
   - 統帥每日數十次答題從 Telegram 走 `routes/openclaw_bot_routes.py:6784-6843` 三層 fallback（Ollama → Gemini → NIM）
   - audit ID #29/30/31 顯示 OpenClaw Bot Q&A 是 Gemini 月支出第二大來源
   - ADR-019 的 Agent-First Conversation Layer 把所有用戶輸入導向 `openclaw_decide()`，更放大 OpenClaw 流量

4. **戰略 / 戰術層職責混雜**：
   - 「每日營運摘要」是高頻戰術（每日 09:00），卻走 OpenClaw Gemini → 成本最高頻率最高
   - 「KPI 計算」是規則引擎可解的純運算，卻丟給 LLM 寫敘事
   - 「Q&A」涵蓋從「上週業績多少」（戰術）到「下季品類布局建議」（戰略），全部走同條鏈

5. **Phase 3 A7 已局部驗證**：
   - 戰役 v5.0 Phase 3 已把 OpenClaw Q&A 第一響應切到 `qwen3:14b`（feature flag），保留 Gemini 作 fallback
   - 該變更顯示「Hermes-tier 模型接戰術 Q&A」是技術可行的

ADR-018 已定四 Agent 角色，但未量化「誰處理高頻流量、誰處理低頻戰略」；本 ADR 是 ADR-018 的成本驅動補述，把 Hermes 從「Observer」升格為「主入口」，OpenClaw 縮回「鎖定戰略場景的副引擎」。

---

## Decision — 雙塔分工（Twin-Tower）

### Hermes 主塔（L1 戰術 / 高頻 / Ollama-only）

- **定位**：所有 Telegram NL / 競價偵測 / 日常摘要 / KPI 計算 / 第一響應 Q&A 的單一入口
- **資源**：三主機 Ollama 級聯（ADR-028 支柱 1），邊際成本 0
- **模型**：`hermes3:latest`（意圖分類 / 競價）+ `qwen3:14b`（Q&A 第一響應，Phase 3 已切）
- **降級**：Ollama 失敗 → 規則引擎兜底（ADR-004 已定）→ 模板化回應，不直接升 Gemini
- **不可越界**：不寫戰略長文（≤ 200 字）、不做 Web Grounding、不做 vision

### OpenClaw 副塔（L3 戰略 / 低頻 / 鎖定 5 個 Gemini 場景）

- **定位**：產生月/年報敘事、PPT 顧問深度分析、Code Review 高階評估、EA HITL pre-fetch、複雜 SKU 推理
- **資源**：Gemini 2.5 Flash 主，NIM `llama-3.3-nemotron-super-49b-v1.5` fallback（ADR-004）
- **觸發頻率**：日報 1×/日 / 週報 1×/週 / 月報 1×/月 / Code Review 部署觸發 / EA HITL escalation 觸發
- **不可越界**：不接 Telegram 第一響應（一律先過 Hermes，信心 < threshold 才升級）

### 升級條件（Hermes → OpenClaw）

由 Hermes 主塔判定是否需要升級：
1. **意圖分類為「戰略性問題」**（如「明年品類規劃」「Q3 競品深度分析」）
2. **複雜 SKU 推理且信心分數 < 0.65**（Hermes self-assessment）
3. **使用者明確要求「深度報告」**（Telegram menu 點 `cmd:strategy` / `cmd:annual` / `cmd:competitor`）
4. **EA escalation 事件**（ADR-021 已定）

升級時 OpenClaw 必須拿到 Hermes 已有的 context（意圖 / 信心 / 既有摘要），不重複呼叫 Ollama。

---

## 職責重劃表（戰前 vs 戰後）

| # | 任務 | 戰前 | 戰後 | 對應戰役 task |
|---|---|---|---|---|
| 1 | 競價威脅偵測（每 4h）| Hermes Ollama | Hermes Ollama ✅ 維持 | — |
| 2 | 意圖分類（Telegram NL）| Hermes Ollama | Hermes Ollama ✅ 維持 | — |
| 3 | 每日營運摘要 | OpenClaw Gemini（每日 1×）| **Hermes 模板 + Gemini 200 字洞察** | **A8** |
| 4 | KPI 計算（業績 / 庫存 / 達成率）| OpenClaw Gemini | **Hermes 規則引擎**（純運算）| **A8** |
| 5 | Q&A 第一響應（Telegram）| OpenClaw Gemini → NIM → 字面 fallback | **Hermes qwen3:14b → 信心低升 Gemini** | **A7（已落地）** |
| 6 | 複雜 SKU 推理 | OpenClaw Gemini | Hermes 信心 < 0.65 → OpenClaw Gemini | A7 條件分支 |
| 7 | PPT 簡報深度分析 | OpenClaw Gemini | OpenClaw Gemini ✅ 鎖定 | — |
| 8 | 週/月/年報敘事 | OpenClaw Gemini | OpenClaw Gemini ✅ 鎖定 | — |
| 9 | Code Review 高階評估 | OpenClaw Gemini | OpenClaw Gemini ✅ 鎖定 | — |
| 10 | EA HITL pre-fetch | Hermes Ollama（ADR-021）| Hermes Ollama ✅ 維持，escalation 走 OpenClaw Gemini | — |
| 11 | Meta 自審 | OpenClaw 每 6h | **OpenClaw 每 24h**（降頻 4×）| **A10** |
| 12 | 規則引擎兜底 | Hermes（ADR-004）| Hermes ✅ 維持 | — |

**淨效果**（critic-A11 B5 修補：算術重核）：
- 任務 3/4/5 從 OpenClaw Gemini 遷移至 Hermes Ollama → 月省 ~9.5M Gemini tokens（A7+A8 試算）
- 任務 11 降頻（Meta 自審 6h → 12:00）→ 月省 ~2.25M Gemini tokens（A10 實測超預估）
- 合計月省 ~11.75M tokens（50M → 38.25M = **-23.5%**）
- Hermes 流量從 ~30M tokens/月 → 預估 ~120M tokens/月（**+400%，成本不變**）

---

## A7 / A8 / A10 落地對照

| Task | 範圍 | 狀態 | 對應檔案 |
|---|---|---|---|
| **A7** | OpenClaw Q&A → qwen3:14b（feature flag）| ✅ Phase 3 完成，待 Phase 4 黃金集 A/B 驗證 | `services/openclaw_strategist_service.py` Q&A 入口 |
| **A8** | Hermes daily 摘要 + KPI 規則引擎 | 規劃中（Phase 4）| `services/hermes_analyst_service.py` 新增 daily_summary / kpi_compute 方法 |
| **A10** | OpenClaw Meta 自審降頻 + 程式瘦身 -29% | 規劃中（Phase 7-8）| `services/openclaw_strategist_service.py` 拆出戰術層遷移至 Hermes |

---

## 預期效益（量化）

| 指標 | 戰前 | 戰後 | 變化 |
|---|---|---|---|
| Gemini 月支出（tokens） | ~50M | ~38.25M | **-23.5%** |
| OpenClaw 程式碼行數 | 2677（HEAD 1831 + Phase 3/4 增量）| Phase 4 +18 行（A10 保守抽出）| Phase 4 行數目標未達；主戰果 = Meta 降頻 |
| Hermes 流量（tokens） | ~30M | ~120M | **+400%（$0）** |
| Telegram NL 第一響應延遲 p50 | ~2.5s（Gemini）| ~1.2s（Ollama 本地）| **-52%**（待 ai_calls 實測） |
| 戰術層 fallback 鏈深度 | 3（Gemini→NIM→字面）| 2（Hermes→規則引擎）| **-33%** |
| 月成本（Gemini API）| baseline | -23.5% | 戰役 v5.0 KPI |

> 上述數字為 Phase 0 audit 推算，Phase 5 報表上線後以 `ai_calls` 實測值修訂。

---

## Alternatives Considered

| 方案 | 不採用原因 |
|---|---|
| **A. 維持 ADR-018 現狀（OpenClaw 全包）** | Gemini 月支出無上限增長；Telegram NL 延遲 p50 ≥ 2.5s 體驗差；Hermes 程式碼長期被冷凍 |
| **B. OpenClaw 全切 Ollama（廢 Gemini）** | 月/年報品質下降 10-20%（phase0_research Section 1）；Code Review / PPT vision 補不齊；繁中商業敘事短板（TMMLU+ 論文）|
| **C. 把 Hermes 升格 L3、廢 OpenClaw** | OpenClaw 已有 KM 沉澱 / Meta 自審 / 戰略架構，砍掉等於拋棄 1.8% → 80% 觀測能力（ADR-019）；ADR-018 四 Agent 控制面被破壞 |
| **D. 引入第五個 Agent 接戰術層** | 增加心智負擔；Hermes 已是現成 L1 Observer，升格成本最低；統帥 FinOps 視角不偏好新增複雜度 |
| **E. 全部走 NIM（避開 Gemini 帳單）** | NIM 80 calls/day 配額硬限，月/年報已經會爆；NIM 模型品質 < Gemini 2.5 Flash |

---

## Consequences

### 正面

1. **成本下降 23%**：戰役 v5.0 KPI 第一目標達成。
2. **Telegram NL 延遲減半**：本地 Ollama 三主機級聯 vs Gemini API round-trip。
3. **Hermes 體質升級**：從「Observer」升「主入口」，未來 Phase 11 RAG 攔截可直接接 Hermes 流量。
4. **程式碼瘦身**：A10 採保守抽出（2 個 helper），行數 -25% 目標未達；主戰果為 Meta 降頻（月省 2.25M tokens）。深度瘦身延至 Phase 7+。
5. **ADR-019 真正落地**：`openclaw_decide()` 第一響應改走 Hermes，agent suggestion shortcut 不再 = OpenClaw 全包。

### 負面

1. **A7 切換有黃金集 A/B 風險**：qwen3:14b 繁中短板若實測差距 > 30%，需走 Plan B（Llama-3-Taiwan-70B 或退回 Gemini 加 prompt cache）。
2. **A10 重構工程量大**：A10 已執行（Phase 4），採保守抽出避險；4 個報告函數結構差異大，深度瘦身（daily_summary / kpi_compute 遷移至 Hermes）需獨立 Phase，refactor-specialist 範圍。
3. **Hermes 變主入口後故障半徑放大**：原本 Hermes 掛 = 規則引擎兜底；現在掛 = 60% Telegram NL 體驗劣化。需強化 mark_unhealthy + 三主機級聯（ADR-027 / ADR-028）。

### 風險與緩解

| 風險 | 機率 | 緩解 |
|---|---|---|
| qwen3:14b 繁中黃金集 A/B 紅燈 | 中 | Phase 4 跑 50 題繁中商業 Q&A 黃金集；< 0.75 BERTScore 自動 fallback Gemini |
| Hermes 故障 = NL 體驗崩 | 低 | 三主機級聯 + mark_unhealthy 30s（ADR-028 支柱 1）；規則引擎兜底（ADR-004）|
| A8 daily 摘要品質 < 戰前 | 中 | Hermes 模板 + Gemini 200 字洞察混合；不是純 Hermes 全自動 |
| OpenClaw 重構引入 regression | 中 | A10 走 refactor-specialist + 完整 regression test；feature flag 灰度 |

### 降級策略

- A7 feature flag off → 退回 OpenClaw Gemini Q&A
- A8 Hermes daily 失敗 → 走原 OpenClaw Gemini daily（保留代碼路徑直至 Phase 8 確認穩定）
- 三主機全掛 → 規則引擎兜底 + Telegram 模板化告警

---

## Verification

### V1：流量分布
```sql
-- Hermes vs OpenClaw 月流量比
SELECT
  CASE
    WHEN caller LIKE 'hermes%' THEN 'hermes'
    WHEN caller LIKE 'openclaw%' THEN 'openclaw'
    ELSE 'other'
  END AS tower,
  SUM(input_tokens + output_tokens) AS total_tokens,
  COUNT(*) AS calls,
  SUM(cost_usd) AS cost
FROM ai_calls
WHERE called_at >= NOW() - INTERVAL '30 days'
GROUP BY 1 ORDER BY total_tokens DESC;
-- 期望：hermes tokens ≥ 4× openclaw tokens；openclaw cost > hermes cost（hermes = $0）
```

### V2：A7 切換驗證
```sql
-- Q&A 第一響應應 ≥ 80% 走 Hermes / qwen3
SELECT model, COUNT(*) AS calls,
       ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 1) AS pct
FROM ai_calls
WHERE caller IN ('openclaw_qa', 'hermes_qa', 'openclaw_bot_main')
  AND called_at >= NOW() - INTERVAL '7 days'
GROUP BY model ORDER BY calls DESC;
-- 期望：qwen3:14b + hermes3 合計 ≥ 80%
```

### V3：Gemini 月支出
- 每月 1 日 token report Section 4「by provider 月成本」對比 baseline 月份
- 預期 `gemini` provider 月成本下降 ≥ 20%

### V4：A8 / A10 上線
- Phase 4 後 `caller='hermes_daily_summary'` 應每日 1 筆出現於 ai_calls
- Phase 8 後 `services/openclaw_strategist_service.py` 行數 ≤ 1300

---

## References

- ADR-001 三 Agent 自主學習分工（戰役起點，Hermes/NemoTron/OpenClaw 原始定義）
- ADR-002 pgvector 唯一向量庫（Hermes embedding 落點）
- ADR-004 NemoTron fallback chain（OpenClaw NIM 鏈來源）
- ADR-018 四 Agent 控制面（本 ADR 細化的 L1/L3 角色）
- ADR-019 Telegram Agentic Layer（Hermes 主入口落地路徑）
- ADR-021 EA HITL pre-fetch（Hermes 預跑 5s timeout 設計）
- ADR-027 Primary Ollama on GCP（Hermes 主塔的硬體依託）
- ADR-028 LLM 路由統一準則（雙塔分工是支柱 3）
- `docs/phase0_audit_report_20260503.md`（34 caller 流量分布）
- `docs/phase0_research_report_20260503.md` Section 1（qwen3:14b vs Gemini 品質評估）
- 相關 memory：`project_three_agent_division.md`、`feedback_agent_action_ladder.md`、`reference_telegram_endpoints_map.md`
