fix(hermes): 改用 anthropic Python SDK 直呼,棄用需要 claude CLI 的 claude-agent-sdk
Some checks failed
CD Pipeline / build-and-deploy (push) Has been cancelled

根因:claude-agent-sdk 需要 spawn claude CLI,prod pod 沒有 CLI 所以 SDK 回空。
修法:改用 anthropic.AsyncAnthropic().messages.create() 直呼 API。
model: claude-haiku-4-5-20251001(快速低成本,適合 Telegram QA)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Your Name
2026-04-25 03:08:51 +08:00
parent c14f23b33a
commit d467cac709
2 changed files with 35 additions and 20 deletions

View File

@@ -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-sdkprod pod 無 claude CLIsdk 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 回應為空請稍後再試。_"

View File

@@ -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 整合WS0WS6
### 完成項目