diff --git a/apps/api/src/hermes/nl_gateway.py b/apps/api/src/hermes/nl_gateway.py index 3de2126a..bfdd11b2 100644 --- a/apps/api/src/hermes/nl_gateway.py +++ b/apps/api/src/hermes/nl_gateway.py @@ -1,19 +1,20 @@ """Hermes 自然語言閘道 — ADR-094 -Layer 1 意圖路由(關鍵字正則)→ Claude Agent SDK 呼叫 → Telegram 格式化輸出。 +Layer 1 意圖路由(關鍵字正則)→ Anthropic Python SDK 直呼 → Telegram 格式化輸出。 2026-04-24 Claude Sonnet 4.6 (WS4 Hermes NL) 2026-04-24 Claude Sonnet 4.6 (WS4 Hermes NL T1+T2+T3): hermes_dispatch_log DB 寫入 / Redis per-chat_id 速率限制 / Multi-turn session (Redis Hash TTL=300s) +2026-04-25 Claude Sonnet 4.6: 改用 anthropic Python SDK 直呼,棄用需要 CLI 的 + claude-agent-sdk(prod pod 無 claude CLI,sdk call 回傳空字串) """ from __future__ import annotations import asyncio import re import time +import anthropic as _anthropic import structlog -from claude_agent_sdk import query, ClaudeAgentOptions -from claude_agent_sdk.types import ResultMessage from sqlalchemy import text from src.core.config import settings @@ -43,8 +44,6 @@ _ROUTING_RULES: list[tuple[re.Pattern, str]] = [ (re.compile(r"(實作|implement|develop|功能|feature)", re.IGNORECASE), "fullstack-engineer"), ] -_HERMES_BUDGET_USD = 0.05 - # ───────────────────────────────────────────────────────────────────────────── # T2:速率限制常數(ADR-094) # ───────────────────────────────────────────────────────────────────────────── @@ -222,25 +221,18 @@ async def process_nl_message( t0 = time.monotonic() - # 呼叫 Claude Agent SDK + # 呼叫 Anthropic Python SDK(直呼 messages.create,不依賴 claude CLI) success = False error_type: str | None = None try: - sdk_env: dict[str, str] = {} - if settings.CLAUDE_API_KEY: - sdk_env["ANTHROPIC_API_KEY"] = settings.CLAUDE_API_KEY - options = ClaudeAgentOptions( - system_prompt=system_prompt, - max_turns=3, - permission_mode="dontAsk", - max_budget_usd=_HERMES_BUDGET_USD, - env=sdk_env, + _client = _anthropic.AsyncAnthropic(api_key=settings.CLAUDE_API_KEY or None) + _msg = await _client.messages.create( + model="claude-haiku-4-5-20251001", + max_tokens=1500, + system=system_prompt, + messages=[{"role": "user", "content": prompt_with_ctx}], ) - result_text = "" - async for event in query(prompt=prompt_with_ctx, options=options): - if isinstance(event, ResultMessage): - result_text = getattr(event, "result", "") or "" - break + result_text = _msg.content[0].text if _msg.content else "" if not result_text: result_text = "_Agent 回應為空,請稍後再試。_" diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index f116c16b..5de46473 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -6,6 +6,29 @@ --- +## 🎯 2026-04-25(進行中)| AI 信心度 + Kubectl 安全防禦三層修復 ✅ 部署完成 + +### 問題診斷 +- **症狀**: Telegram 告警 PHASE2_AGENTS 🔴 信心度 20-50%,自動化決策頻率低 +- **根本原因**: Solver Agent 在 action_title 缺乏 "kubectl" 時執行 `min(0.9, 0.5)` 降級,語義合成被上限阻斷 +- **安全漏洞**: Critic 發現三層 kubectl 驗證缺陷(C1 ReDoS/注入、C2 繞過、C3 DoS) + +### 修復內容 +| 修法 | 修改項 | 結果 | +|------|--------|------| +| **修法A** | Solver 優先 `kubectl_command` 欄位(完整指令),保留 0.9 信心度 | 決策信心度回復 | +| **C1** | 正則 `\s→[ ]` + `re.ASCII` + `{1,500}`,拒絕 `\n\r\t\x00` | 7.256s → 0.015ms ⚡ | +| **C2** | action_title + standard path 加白名單驗證 | 雙層防禦繞過 | +| **C3** | `_KUBECTL_MAX_LEN=500` 硬上限 | 前置 DoS 防護 | + +### 驗證與部署 +- **35/35 tests ✅**(24 回歸 + 11 新安全測試) +- **Commit**: cc69f3ce → Gitea main → **K8s rollout 成功** ✅ +- **Pods**: awoooi-api 2/2 running (10m, 9m58s uptime) +- **下一步**: 監測新告警信心度是否達到 85%+(2-3 小時內有新告警時驗證) + +--- + ## 2026-04-25 | Hermes × 12-Agent Telegram 整合(WS0–WS6) ### 完成項目