Files
awoooi/docs/adr/ADR-094-hermes-nl-interface.md
Your Name 86ee013cdf
All checks were successful
CD Pipeline / build-and-deploy (push) Successful in 9m32s
feat(hermes-complete): Hermes NL 三項補強 + ConsensusEngine + ADR 收尾
## Hermes NL 補強(nl_gateway.py)
- T1 hermes_dispatch_log DB 寫入(asyncio.create_task 非阻擋)
- T2 Redis 速率限制:per-chat_id 20 req/min,fail-open
- T3 Multi-turn session:hermes:session:{chat_id}:{user_id} TTL=300s,最近 3 輪

## ConsensusEngine(ADR-095 宣告式設計)
- consensus_engine.py: CONSENSUS_WEIGHTS class 屬性
  security=0.4 鎖定,9 個 Claude Code agent 分配 0.6
- config.py: ENABLE_12AGENT_CONSENSUS=False feature flag

## ADR 狀態
- ADR-093/094/095: Proposed → 🟡 批准實作中
- 各 ADR 加 v1.1 變更紀錄

## K8s ConfigMap
- prod 04-configmap.yaml: 加 3 個 feature flags(均 false)
- dev 02-configmap.yaml: 同步加入

## LOGBOOK
- 記錄 WS0–WS6 + 補強完成,feature flags 啟用指引

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 02:22:40 +08:00

4.6 KiB
Raw Permalink Blame History

ADR-094: Hermes 自然語言介面(@mention 對話)

狀態: 🟡 批准實作中 日期: 2026-04-24 決策者: 統帥 + 12-Agent 全景分析團隊

背景

Hermes 目前是 AWOOOI 的 rule quality scannerapps/api/src/jobs/hermes_rule_quality_job.py,每日 04:00 用 LLM 分析噪音規則),不是對話型 bot

使用者需求:把 Hermes 升級為 SRE 戰情室群組中的自然語言對話入口,團隊成員可 @Hermes 問任何 SRE 問題,系統自動派對應 Claude Code subagent 回答。

Web Research 查證Telegram Bot API 官方文件):

  • Bot-to-bot 訊息永遠互不可讀(即使關 privacy、設 admin→ 12 獨立 bot 方案不可行
  • editMessage 48h 硬上限 → pending 卡跨日需 copyMessage fallback
  • setWebhooksecret_token 防偽
  • allowed_updates 需明列 chat_member 才能收群組成員變動

決策

方案 C單 bot + Claude Agent SDK 虛擬分派

  1. 對外:沿用既有 OPENCLAW_TG_BOT_TOKEN,不新增 BotFather bot 帳號
  2. Webhook:新增 /api/v1/telegram/webhook 取代/共存 Long PollingADR-091 §4
    • secret_token header 驗證
    • allowed_updates=["message","callback_query","chat_member","my_chat_member"]
  3. 意圖路由apps/api/src/hermes/router.py
    • Layer 1 規則引擎(關鍵字正則,<10ms
    • Layer 2 LLM 分類Haiku<1s觸發條件 confidence<0.6
    • Layer 3 default = debugger最常見「X 為什麼壞了」)
  4. SDK 共存不替換 ai_router.py
    • ADR-082 Phase 2 incident 決策仍走 ai_router.pyOllama/NIM
    • Hermes NL 走 claude-agent-sdkAnthropic API需 allowlist
    • 兩者透過 HERMES_ENABLED feature flag 切換

理由

為什麼不多 bot方案 B 否決)

  • Telegram API 硬性封鎖 bot-to-bot 訊息 → 12 獨立 bot 後端要用 Redis message bus 繞路
  • 單人維運 12 token 違反最小憑證面(feedback_secrets_leak_incidents_2026-04-18
  • 方案 C 從方案 A/B 的遷移都是單向相容的(可後加 bot但 B→C 要回收 12 bot 麻煩

Prompt Injection 防護P0-2 修)

  • NL 輸入 → 意圖分類只允 query/describe/summarize
  • mutate/approve/deploy 動作必須走 ApprovalRecord 二次確認
  • danger:*rm -rf / force push直接硬拒
  • system prompt 前置 <user_input>...</user_input> 隔離標籤
  • SanitizationService 擴充 12 pattern既有 LOGBOOK L956

多輪對話context engineering

  • 短期記憶(當前 sessionRedis Hash hermes:session:{chat_id}:{user_id}TTL 300s
  • Compactionturn ≥5 觸發 summary 壓縮節省 60% token
  • 長期記憶:未來 v2 PostgreSQL hermes_user_memory

後果

優點

  • 對話體感延遲 <3s首字元
  • 零新增 Telegram bot沿用現有 httpx 裸打 API 架構(切換成本零)
  • claude-agent-sdk>=0.1.50 已在 pyproject.toml 宣告,無新依賴

缺點

  • LLM 費用增加Anthropic Sonnet/Opus API→ 需 per-user 每小時 10 query 速率限制 + 月度 budget hard cap
  • Hermes 現有 scanner job 命名空間與新服務衝突 → 新檔改名 hermes_nl_gateway.py(避開 hermes_service.py
  • claude-agent-sdk.claude/agents/*.md 在 SDK 不會自動載入,需自寫 loader

風險

  • LLM 幻覺 → 新增 hermes_dispatch_log audit 表 + P95 confidence 監控ADR-092 Evidence-First Protocol
  • Rate limit 撞牆 → Redis token bucket per chat_id20/min 群組上限,預留 5/min buffer
  • 成本失控 → Langfuse trace + per-user budget

Rollback

Feature flag HERMES_NL_ENABLED=off → Hermes 退回純 scanner 模式,不接 Telegram webhook。 SDK 延遲 > 10s P95 → 自動降級 debugger agent 預設回覆。

參考

變更紀錄

版本 日期 執行者 變更內容
v1.0 2026-04-24 12-Agent 全景分析 初版 Proposed
v1.1 2026-04-25 Claude Sonnet 4.6 WS4 實作完成hermes/ 套件 + NL gateway + SDK 接入 + dispatch_log + rate limit + session