Commit Graph

134 Commits

Author SHA1 Message Date
OG T
d1409fc4c0 fix(api): 增加 LLM 超時到 120/180s (llama3.2:3b CPU 約 2-3 分鐘)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-27 09:23:35 +08:00
OG T
a3a02398c3 fix(api): 增加 LLM 分析超時 30/60s (Ollama CPU 模式)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-27 09:11:39 +08:00
OG T
855b7f5593 fix: 修復 Telegram 轟炸問題
問題: 765ee39 的修改導致 COMPLETED 狀態下 incident 未解決時
會建立新 decision,每次 poll 都觸發 Telegram 發送

修復: COMPLETED 狀態直接返回 existing_token,不建立新 decision

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 22:24:03 +08:00
OG T
3256142d29 feat(api): ADR-030 Phase 5 持續學習迴圈
從執行結果中學習,持續優化決策:

1. learning_service.py - 持續學習服務
   - process_execution_result(): 處理執行結果
   - process_human_feedback(): 處理人工反饋
   - 自動調整信任度 (成功+1 / 失敗歸零)
   - 更新 Playbook 統計
   - 成功案例自動萃取 Playbook

2. approval_execution.py - 整合學習觸發
   - 執行成功後觸發學習
   - 執行失敗後觸發學習
   - _trigger_learning(): 非阻塞呼叫學習服務

學習流程:
執行完成 → LearningService.process_execution_result()
  ├─ 成功: TrustEngine +1 分 + Playbook 統計更新
  └─ 失敗: TrustEngine 歸零 + 記錄失敗原因

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 22:19:41 +08:00
OG T
ce7f8a1b23 feat(api): ADR-030 Phase 4 自動執行機制
實作低風險操作自動執行策略:

1. auto_approve.py - 自動執行策略服務
   - AutoApprovePolicy: 評估是否可自動執行
   - 條件: LOW 風險 + 信任分數 >= 5 + Playbook 成功率 >= 95%
   - CRITICAL 永遠不自動執行
   - 完整審計追蹤

2. trust_engine.py - 新增 singleton
   - get_trust_manager(): 取得全域 TrustScoreManager

3. decision_manager.py - 整合自動執行 (Tier 3 紅區)
   - Step 5 加入 AutoApprovePolicy 判斷
   - 條件滿足時跳過 Telegram,直接執行
   - _auto_execute(): 自動執行邏輯
   - 失敗時 fallback 到人工審核

流程:
Incident → 分析 → AutoApprovePolicy 評估
  ├─ 可自動執行 → 直接執行 → 完成
  └─ 需人工審核 → Telegram 通知 → 等待批准

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 22:13:10 +08:00
OG T
17ee8838be revert: 還原 Telegram + CD 到正常狀態
還原檔案到 d071019 版本:
- decision_manager.py: 移除 Redis dedup 邏輯
- telegram_gateway.py: 還原 INC- 前綴邏輯
- cd.yaml: 移除 selector immutable 處理和 Token injection

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 22:10:52 +08:00
OG T
3c034526a5 feat(api): ADR-030 Phase 3 Playbook RAG 向量搜尋
實作 Playbook 語意搜尋能力:

1. playbook_rag.py - RAG 向量服務
   - Ollama nomic-embed-text 生成 embedding
   - Redis 儲存向量 (JSON 格式)
   - 餘弦相似度搜尋
   - 混合搜尋 (Vector 60% + Jaccard 40%)

2. playbook_service.py - 整合 RAG
   - extract_from_incident 後自動建立向量索引
   - get_recommendations 支援混合搜尋
   - RAG 失敗時 fallback 到純 Jaccard

功能:
- embed_text(): 文字向量化
- embed_playbook(): Playbook 向量化
- search_similar(): 向量相似度搜尋
- hybrid_search(): 混合搜尋

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 22:08:15 +08:00
OG T
60e9538889 feat(api): ADR-030 Phase 2 診斷資料收集強化
實作智能自動修復系統的資料收集層:

1. k8s_diagnostics.py - K8s 診斷服務
   - Pod Events/Logs/ResourceUsage 收集
   - CrashLoopBackOff/OOM/ImagePull 偵測
   - 非同步並行收集 + 錯誤容忍

2. diagnosis_aggregator.py - 診斷聚合器
   - 整合 K8s + SignOz + Expert Rules
   - DiagnosisContext 提供結構化 LLM Prompt
   - DiagnosisSignal 信號分析

3. decision_manager.py - 決策引擎整合
   - Step 2.5 加入診斷收集
   - 傳遞 diagnosis_context 給 LLM

4. openclaw.py - LLM Prompt 增強
   - 整合 K8s/SignOz 深度診斷上下文
   - 支援 diagnosis_signals 摘要

ADR-030 架構: 診斷先行,根因分析,非盲目重啟

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 21:55:50 +08:00
OG T
bb6151cf44 revert: 移除 Telegram Redis dedup 邏輯
原因: dedup 邏輯導致 Telegram 完全無法發送
保留: INC- 前綴修復 (approval_id = incident.incident_id)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 21:53:39 +08:00
OG T
d148756b67 feat(api): LLM 整合 Expert System 診斷上下文
長期方案實作: Expert 診斷 + LLM 智能分析

變更:
1. decision_manager._dual_engine_analyze():
   - 測試資源跳過 LLM (省錢)
   - 傳遞 Expert 診斷上下文給 LLM
   - LLM 失敗時根據診斷調整回應

2. openclaw.generate_incident_proposal():
   - 新增 expert_context 參數
   - Prompt 包含 Expert 診斷結果
   - 引導 LLM 基於診斷做決策

流程:
Playbook → Expert診斷 → LLM(with context) → 智能建議

這是「先診斷根因,再決定行動」的正確實作

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 21:41:26 +08:00
OG T
2ef7daccde feat(api): Expert System 智能診斷重構 - 根因優先
問題: 原本的 Expert System 只會建議「重啟」,不診斷根因

重構:
1. 分層診斷:
   - 層 1: 測試資源過濾 (test/demo/tmp 自動忽略)
   - 層 2: 規則匹配 (更精確的 pattern)
   - 層 3: 診斷指令 (提供 kubectl 診斷命令)

2. 根因優先:
   - OOM → 檢查記憶體用量,非重啟
   - CrashLoop → 查看崩潰日誌,非重啟
   - ImagePull → 檢查映像配置,非重啟
   - Default → 人工診斷,非盲目重啟

3. 人工標記:
   - 未知問題標記 human_review_required
   - 降低 confidence (0.5)

這才是正確的自動化修復:先診斷根因,再決定行動

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 21:35:20 +08:00
OG T
801b08a4b7 fix(api): AI_FALLBACK_ORDER 無法正確解析 JSON 格式
根因: ConfigMap 用 JSON '["gemini","ollama","claude"]'
但 validator 用 split(",") 解析,導致無法匹配任何 provider
結果永遠用 default ["ollama","gemini","claude"]

影響: /api/v1/incidents 超時 (Ollama CPU 推理慢)

修復: 新增 JSON 格式支援,優先嘗試 json.loads()

這是根因修復,不是重啟!

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 20:10:56 +08:00
OG T
fb03430469 feat(api): ADR-027 Phase 2 - 簽核/拒絕後自動同步 Incident 狀態
Router 整合點:
- POST /approvals/{id}/sign → on_approval_status_change("approved")
- POST /approvals/{id}/reject → on_approval_status_change("rejected")
- POST /approvals/bulk-approve → 批次同步

變更:
- 移除舊的 resolve_incident_after_approval() 調用
- 改用 IncidentApprovalService.on_approval_status_change()
- 同步失敗不阻斷主流程 (容錯設計)

ADR-027 進度: Phase 1-2  完成

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 19:44:59 +08:00
OG T
139ddc3f7b fix(telegram): 修復 INC-INC- 重複前綴 (telegram_gateway.py)
問題: approval_id 已有 INC- 前綴時,又加了一次
修復: 檢查是否已有前綴再決定是否添加

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 19:42:18 +08:00
OG T
5f2e5c9763 fix(api): Langfuse v4.x API 相容性修復
Langfuse SDK v4.0.1 API 變更:
- 移除 client.trace() 方法
- 改用 create_trace_id() + OTEL 整合

修復:
- __enter__: 檢查 trace() 方法存在再使用,否則用 create_trace_id()
- generation/span/score: 加入 hasattr 檢查,v4 改用 debug log

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 19:34:37 +08:00
OG T
df04254b57 fix(lint): 修復 import 排序與未使用 import
- __init__.py: 按字母順序排列 imports
- incident_approval_service.py: 移除未使用 UUID, ApprovalRequest, Incident, IncidentStatus

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 19:25:52 +08:00
OG T
35aa690bf1 fix(decision_manager): 修復 Telegram 重複發送問題
問題:
- Phase 6.5 (765ee39) 修改導致每次 poll 都建立新 decision
- 觸發 Telegram 轟炸 (INC-INC-INC- prefix bug)

修復:
- 移除 INC- 重複前綴 (line 83)
- 加入 Redis 去重機制 (10 分鐘 TTL)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 19:21:36 +08:00
OG T
dd42e6b75b chore: services export + meetings 文檔格式化
- services/__init__.py: 導出 IncidentApprovalService (ADR-027)
- meetings docs: 格式化更新

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 19:10:48 +08:00
OG T
00e2c94a8e ci: API 分層檢查 + LLM 測試移至 Nightly
CI 強化:
- 新增 API Layer Check (#96): services/repositories/models 分層規則
- LLM 測試移至 nightly-llm.yaml (CPU 推理 ~300s/測試)

分層規則:
- services 禁止引用 api/routers
- repositories 禁止引用 services
- models 禁止引用業務層

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 19:10:30 +08:00
OG T
a9f8ad56c1 chore: 未提交變更整理 (API core + docs + scripts)
API 核心:
- constants.py: 系統常量定義
- unit_of_work.py: Unit of Work 模式
- incident_approval_service.py: Incident-Approval 同步服務

文檔更新:
- LOGBOOK.md: 進度更新
- AWOOOI_AGENTIC_WORKSPACE_ROADMAP.md: 路線圖
- 2026-03-26_llm_testing_evaluation.md: LLM 測試評估
- phase5_telemetry_architecture.md: 遙測架構
- SECRETS_REFERENCE.md: 密鑰參考

配置/腳本:
- Skill 02 v1.x: leWOOOgo 後端更新
- .dependency-cruiser.cjs: 依賴規則
- demo-multisig-flow.sh: 演示腳本

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 19:10:12 +08:00
OG T
a3a50fa807 fix(api): 活躍事件 500 錯誤修復 (timezone 比較)
根因: incidents.sort() 比較 timezone-aware 與 naive datetime
錯誤: can't compare offset-naive and offset-aware datetimes

修復: safe_created_at() 統一轉換為 timestamp

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 18:48:34 +08:00
OG T
f1117a3e79 chore: trigger CD build for RAGProvider
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 18:44:30 +08:00
OG T
539f14bcd5 feat(api): Phase 13.2 #84 RAG Provider + Gemini 優先切換
1. 新增 RAGProvider MCP Tool Provider
   - search_runbook: 語義搜尋維運手冊
   - index_documents: 索引文檔
   - get_index_stats: 取得索引統計

2. 更新 AI_FALLBACK_ORDER 為 Gemini 優先
   - 臨時措施:Ollama CPU 推論緩慢導致 mock_fallback
   - 預計 2026-03-27 切回 Ollama

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 18:21:24 +08:00
OG T
30153496d1 fix(api): 修復全部 lint 錯誤 (ruff --fix)
- Import sorting (I001)
- Unused imports (F401)
- f-string without placeholders (F541)
- Loop variable unused (B007)
- zip() strict parameter (B905)
- Exception chaining (B904)
- collections.abc imports (UP035)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 16:06:20 +08:00
OG T
e26ea526b1 fix(api): lint errors in Rate Limiter + RAG services
- Remove unused imports (settings, uuid)
- Add 'from e' to exception raises (B904)
- Add strict=True to zip() (B905)
- Remove unused variable

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 16:03:16 +08:00
OG T
bf32c4b1f2 feat(api): Phase 13.2 AI Rate Limiter + RAG 基礎設施 (#84)
Rate Limiter (防止 Gemini 用量暴衝):
- ai_rate_limiter.py: RPM/Daily/Token 三層閥值
- openclaw.py: 整合 rate limit 檢查,超限自動降級
- health.py: /health/ai-usage 監控端點

RAG Tool 基礎 (#84 進行中):
- embedding_service.py: Ollama embedding 封裝
- rag_service.py: Redis vector search 服務

閥值設定:
- Gemini: 10 RPM, 500/day, 100K tokens/day
- Claude: 5 RPM, 200/day, 50K tokens/day

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 15:52:57 +08:00
OG T
e58da5c534 feat(api): Phase 13.2 #83 Grafana MCP Tool
New MCP provider for Grafana dashboard integration:
- list_dashboards: List available dashboards with filtering
- get_dashboard: Get dashboard details by UID
- get_panel_data: Query panel data via Grafana Query API
- generate_dashboard_url: Generate shareable dashboard URLs

Security:
- API key authentication (Bearer token)
- Dashboard UID validation (alphanumeric + dash/underscore)
- Read-only operations only
- 30s request timeout

Config:
- GRAFANA_URL (default: http://192.168.0.188:3000)
- GRAFANA_API_KEY

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 15:36:17 +08:00
OG T
579da38b8b feat(api): Phase 13 智能路由 + CI/CD 整合 (#74-88)
Phase 13.1 CI/CD Integration:
- #76 workflow_run handler for CI failure diagnosis
- #77 SignOz log query (query_logs, error_logs_summary MCP)
- #78 CIAutoRepairService with risk-based execution decisions

Phase 13.3 Smart Routing:
- #85 Intent Classifier v2.0 (rule engine + LLM fallback)
- #86 Complexity Scorer (9-dimension scoring)
- #87 AI Router v3.0 (routing decision matrix)
- #88 Token Counter (OTEL + Langfuse integration)

New files:
- services/ci_auto_repair.py (risk stratification)
- services/model_registry.py (centralized model config)
- services/token_counter.py (677 lines)
- Skill 08: Model Router Expert
- Skill 09: Strangler Pattern Expert
- ADR-023: Smart Routing Architecture
- ADR-024: API Layer Architecture

Tests:
- phase11-conversational.spec.ts (E2E tests)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 15:32:52 +08:00
OG T
b79e5f1a1a fix: Telegram HTML 解析錯誤 + 簽核後內容保留
修復:
1. telegram_gateway.py - HTML 轉義 (html.escape) 防止 "Can't parse entities"
2. openclaw-state-machine.tsx - 簽核後顯示結果 2 秒再導航

問題根因:
- URL 和用戶輸入內容可能包含 <, >, & 破壞 HTML
- 簽核後立即刷新列表,已簽核項目消失

Memory: feedback_approval_preserve_content.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 15:32:23 +08:00
OG T
a470a514e6 refactor(api): Phase 17 P0 Router 層違規全部修復
消除 Router 層直接存取 Redis/DB 的違規:

incidents.py (6 處):
- 改用 IncidentService.get_active_incidents()
- 改用 IncidentService.get_from_working_memory()
- 改用 IncidentService.update_outcome()
- 改用 IncidentService.resolve_incident()
- 改用 IncidentService.find_by_proposal_id()

stats.py (8 處):
- 新增 StatsService 封裝快取邏輯
- 移除直接 Redis 存取

audit_logs.py (7 處):
- 新增 AuditLogRepository 封裝 DB 操作
- Router 改用 Repository 層

webhooks.py (2 處):
- 新增 SignalProducerService 封裝 Redis Stream
- 改用 IncidentService.save_to_working_memory()

符合 leWOOOgo 積木化規範:
Router → Service → Repository → DB/Redis

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 13:06:47 +08:00
OG T
d1f0bbfbcd refactor(api): Phase 17 P1 Tier 3 紅區服務 Protocol 定義
新增 5 個紅區核心服務的 Protocol 介面:
- IDecisionManager: 決策狀態機
- ITrustScoreManager: 信任評分引擎
- IIncidentEngine: 事件處理引擎
- IMultiSigRedisService: 分散式鎖服務
- ITelegramSecurityInterceptor: 安全攔截器

符合 leWOOOgo 積木化規範:
- 支援依賴注入 (DI)
- 便於測試時 Mock
- 型別約束確保實作一致性

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 12:49:30 +08:00
OG T
702e9a9634 fix(api): 移除未使用的 resource_resolver 導入
架構審查發現 get_resource_resolver 導入但未使用

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 12:43:59 +08:00
OG T
3bba3755ab refactor(api): P2 新增 IResourceResolver Protocol
Phase 17 P2 架構改進:
- 新增 IResourceResolver Protocol 介面定義
- 支援 runtime_checkable 驗證
- 更新 get/set_resource_resolver 型別提示
- 符合 leWOOOgo 積木化規範

@see feedback_resource_resolver_di.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 12:39:18 +08:00
OG T
30f045bf28 feat: ADR-019 System Prompt 集中管理 + Nightly LLM Workflow
新增:
- docs/adr/ADR-019-system-prompt-management.md - System Prompt 規範
- apps/api/src/core/prompts.py - 集中管理 System Prompts
- .github/workflows/nightly-llm.yaml - 每夜 LLM 迴歸測試

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 12:27:47 +08:00
OG T
1cc34e1fc8 fix(api): Phase 18.1 修復 - Mock Response 正規化遺漏
問題: _generate_mock_response() 直接使用原始 target_resource,
導致 URL (如 https://api.awoooi.wooo.work) 未正規化為有效 K8s 名稱

修復: 在 _generate_mock_response() 開頭加入 normalize_resource_name()
- 將 URL/域名轉換為有效 deployment 名稱
- 更新 namespace 為正確值 (awoooi-prod)

測試: E2E 驗證待部署後執行

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 12:07:16 +08:00
OG T
96c3ddd8c4 feat(api): Phase 18.1 K8s 資源名稱驗證 (ADR-016)
三層防禦架構確保 kubectl 指令有效:
1. Webhook 入口正規化 (webhooks.py)
2. OpenClaw 產生指令前驗證 (openclaw.py)
3. 靜態映射表 + 模糊匹配 (k8s_naming.py, resource_resolver.py)

新增:
- src/utils/k8s_naming.py: RFC 1123 正規化 + 靜態映射
- src/services/resource_resolver.py: MCP K8s Tool 動態驗證
- docs/adr/ADR-016-k8s-resource-naming.md: 契約文檔
- scripts/e2e_tool_call_verification.py: E2E 驗證腳本 v2.0

修改:
- webhooks.py: Phase 18.1.7 入口正規化
- openclaw.py: Phase 18.1.6 產生指令前驗證
- Skill 03 v1.4: 新增 K8s 資源驗證章節

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 11:22:47 +08:00
OG T
2e75a20150 feat(api): Phase 7.5-7.6 Playbook 整合決策與自動萃取
Phase 7.5: DecisionManager 三軌決策
- 新增 Playbook 優先匹配 (similarity >= 85%)
- 三軌決策順序: Playbook > LLM > Expert System
- 整合 PlaybookService 推薦引擎

Phase 7.6: 自動萃取機制
- approval_execution.py 成功執行後觸發萃取
- 條件: RESOLVED/CLOSED + effectiveness >= 4
- 滿分 (5) 自動核准 Playbook

測試:
- 13 個 Playbook 單元測試全部通過
- 修復 Incident 模型欄位對應 (reasoning_steps)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 11:09:25 +08:00
OG T
698687f092 feat(api): #7 Playbook 萃取功能 (Phase 7.1-7.4)
實作內容:
- models/playbook.py: Playbook 資料模型 + Request/Response
- repositories/playbook_repository.py: Redis 雙層儲存
- repositories/interfaces.py: IPlaybookRepository Protocol
- services/playbook_service.py: 業務邏輯 (萃取/推薦/核准)
- api/v1/playbooks.py: REST API 端點

API 端點:
- POST /playbooks/extract/{incident_id} - 從成功案例萃取
- POST /playbooks/recommend - 症狀匹配推薦
- POST /playbooks/{id}/approve - 人工核准
- GET/PATCH/DELETE /playbooks/{id} - CRUD

遵循 leWOOOgo 積木化: Router → Service → Repository

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 10:54:13 +08:00
OG T
648e100e3c fix(tests): 修復測試 lint 錯誤 + TelegramGateway 方法呼叫
修復項目:
1. 新增 conftest.py 確保環境變數在 settings 前載入
2. test_github_webhook.py 移除重複的 os.environ 設定 (E402)
3. test_smart_router.py 排序 import (I001)
4. github_webhook.py 修正 send_message → send_notification

Phase 13.1 首席架構師審查修復

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 10:37:45 +08:00
OG T
0060a33e31 feat(api): Phase 13.1 #74 GitHub Webhook → OpenClaw 整合
- POST /api/v1/webhooks/github endpoint
- 處理 pull_request 和 push 事件
- 驗證 X-Hub-Signature-256
- Telegram 通知整合
- GitHubWebhookService 封裝 Redis 操作 (leWOOOgo 合規)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 10:08:54 +08:00
OG T
957150a156 fix(api): 移除 intent_classifier 未使用 import (F401)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 10:06:43 +08:00
OG T
92ee07ad4b refactor(api): Phase 17 agents.py Router 層違規修復
- 建立 AgentService 封裝所有 Redis 操作
- 定義 IAgentTaskRepository Protocol 介面支援 DI
- Router 層改用 AgentService,不再直接 get_redis()
- 符合 leWOOOgo 積木化原則 (Router → Service → Repository)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 10:02:31 +08:00
OG T
e7f361db50 refactor(api): Phase 17 metrics.py Router 層違規修復
移除 Router 層直接 DB 存取,遵循 leWOOOgo 積木化原則:
- 新增 IMetricsRepository Protocol (interfaces.py)
- 新增 MetricsDBRepository 封裝 DB 查詢
- 新增 MetricsService 封裝業務邏輯
- Router 層只做 HTTP 轉發

架構: Router → Service → Repository → PostgreSQL

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 10:01:57 +08:00
OG T
58b4004a18 feat(api): Phase 13.3 智能路由 (#85-87)
- IntentClassifier: 意圖分類 (告警/部署/查詢/維運/審查)
- ComplexityScorer: 複雜度評分 (1-5 分)
- AIRouter: 動態模型選擇 (整合 Intent + Complexity)
- 測試: 完整單元測試覆蓋

Phase 13.3 設計: project_phase13_3_smart_router.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 10:01:04 +08:00
OG T
45c3656004 fix(api): 修正 langfuse_client import 排序 (I001)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 09:37:09 +08:00
OG T
46ab6a838a fix(api): 修復 ruff lint 錯誤
- langfuse_client.py: import Callable from collections.abc
- telemetry.py: import block 格式化

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 09:27:00 +08:00
OG T
b6cff31653 feat(api): Phase 15.3 Deep Linking 三系統互連
實現 Sentry ↔ SignOz ↔ Langfuse 零斷鏈觀測:

新增 deep_linking.py:
- SignOz Trace URL 生成器
- Langfuse Trace URL 生成器
- Sentry Issue URL 生成器
- get_all_links() 統一取得所有連結

整合點:
- main.py: Sentry before_send 注入 otel_trace_id + signoz_trace_url
- langfuse_client.py: 自動注入 OTEL trace_id 到 metadata
- openclaw.py: SignOz span 記錄 langfuse.trace_id 反向連結

架構圖:
┌─────────┐ trace_id ┌─────────┐ trace_id ┌──────────┐
│ Sentry  │◄────────►│ SignOz  │◄────────►│ Langfuse │
│ Errors  │          │ Traces  │          │ LLMOps   │
└─────────┘          └─────────┘          └──────────┘

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 00:48:28 +08:00
OG T
0d31ccb911 feat(api): Phase 15.2 Redis Trace Context 傳遞
實現 Redis Streams 跨服務追蹤零斷鏈:
- telemetry.py: 新增 get_trace_context() + restore_trace_context()
- webhooks.py: Producer 注入 _trace_id, _span_id 到 Redis
- signal_worker.py: Consumer 還原 Trace Context 建立子 Span

架構: API → Redis Streams → Worker 完整追蹤鏈
格式: W3C Trace Context (traceparent)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 00:40:20 +08:00
OG T
1ac8965a7a feat(api): Phase 15.1 Langfuse LLMOps 整合 + 模型升級
## 新功能
- Langfuse 自建部署 (192.168.0.110:3100)
- langfuse_client.py - LLM 呼叫追蹤包裝
- OpenClaw 整合 Langfuse trace

## 模型升級 (統帥批准)
- 生產預設: llama3.2:3b → qwen2.5:7b-instruct
- 摘要任務: llama3.2:3b (速度優先)

## 配置更新
- requirements.txt: +langfuse>=2.0.0
- config.py: +LANGFUSE_* 設定
- models.json: 更新 Ollama 模型配置
- K8s: Secret + ConfigMap 更新

## 審查通過
- 模組化檢查 
- 核心測試 31/31 

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 00:32:19 +08:00
OG T
31fabe8d61 fix(ci): 修復 CI 失敗問題
- lewooogo-core: 新增 placeholder 測試檔 (vitest)
- api: 修復 I001 import 排序 (ruff --fix)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-25 23:57:24 +08:00