# ADR-004：NemoTron 配額耗盡 fallback 至 Hermes Rule-based

- **Status**: Accepted
- **Date**: 2026-04-18
- **Decision Maker**: 統帥（顧問補充建議第 2 條）
- **Author**: Claude

## Context

NemoTron 走 NVIDIA NIM，每日 80 次免費配額（保留 20 給 AWOOOI，實際可用 60 次）。風險場景：
- **雙 11 / 母親節 / 聖誕** 等大促時，告警暴增可能瞬間耗盡配額
- **PChome 突發降價戰** 觸發大量競價威脅分類
- **任何單日異常** 導致 webhook 大量被觸發

一旦 NemoTron 回 HTTP 429（Too Many Requests），現有代碼會直接報錯 → 告警靜默 → 業務風險。

## Decision

**NemoTron 必須有兩階 fallback 鏈**：

```
告警觸發
    │
    ▼
NemoTron (NIM) ─── HTTP 200 ─→ 正常派發
    │
    └─ HTTP 429 / timeout / network error
            │
            ▼
    Hermes (Ollama 本地) Rule-based 派發
            │
            ├─ 已知告警類型 → 對應 template 派發 Telegram
            └─ 未知類型 → 兜底 template + 標記「降級模式」
```

**降級模式特徵**：
- 派發訊息開頭加 `🟡 降級派發` 標記
- 不嘗試做複雜決策（不調用 store_insight 等需要 reasoning 的 tool）
- 純 if-else 分類 + template 渲染

## Alternatives Considered

| 方案 | 拒絕原因 |
|---|---|
| 直接 fallback 到 OpenClaw/Gemini | 大促時 OpenClaw 配額也很緊張；付費成本暴增 |
| 進入告警佇列等配額恢復 | 告警時效性最重要，等不起 |
| 不做 fallback，直接 alert 統帥 | 告警靜默風險巨大 |

## Consequences

### Positive
- 告警永不中斷（即使 NemoTron 全掛）
- 大促日成本依然受控（不會意外切到 OpenClaw 燒錢）
- Hermes 本地 = 永遠可用兜底

### Negative / Trade-offs
- 降級期間決策品質下降（rule-based 不如 LLM）
- 需要維護一套 rule template（增加代碼量）
- Hermes 主機壓力會在降級時激增

## Implementation Notes

```python
# services/nemotron_dispatcher_service.py
class DispatchResult:
    mode: Literal['normal', 'degraded']
    text: str

def dispatch_alert(alert: Alert) -> DispatchResult:
    try:
        return _nemotron_dispatch(alert)  # NIM tool calling
    except (RateLimitError, TimeoutError, RequestException) as e:
        sys_log.warning(f"[NemoTron] degraded: {e}")
        return _hermes_rule_fallback(alert)

def _hermes_rule_fallback(alert: Alert) -> DispatchResult:
    template = RULE_TEMPLATES.get(alert.type, RULE_TEMPLATES['default'])
    text = template.render(alert=alert)
    return DispatchResult(mode='degraded', text=f"🟡 降級派發\n{text}")
```

監控加上：
- Prometheus metric: `nemotron_fallback_total` counter
- Grafana 告警：5 分鐘內 fallback > 10 次 → 通知統帥（系統級異常）

## Related ADRs

- ADR-001：三 Agent 分工（NemoTron 處理層、Hermes 採集層）
