From 429d81d29b19c1b2258f17b1e9ccf9ceb7621228 Mon Sep 17 00:00:00 2001 From: OG T Date: Sat, 4 Apr 2026 11:51:43 +0800 Subject: [PATCH] =?UTF-8?q?fix(knowledge):=20I2+I3=20=E9=A6=96=E5=B8=AD?= =?UTF-8?q?=E6=9E=B6=E6=A7=8B=E5=B8=AB=20Important=20=E4=BF=AE=E5=BE=A9=20?= =?UTF-8?q?=E2=80=94=20=E4=BE=9D=E8=B3=B4=E6=B3=A8=E5=85=A5=20+=20exceptio?= =?UTF-8?q?n=20=E7=B4=B0=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I2: KnowledgeService 移至 DecisionManager.__init__ 注入 _query_kb_context_inner 使用 self._knowledge_svc,移除函數內 import 耦合 I3: _query_kb_context exception 細分 - asyncio.TimeoutError → warning (預期降級) - ConnectionError/OSError → warning (Ollama 連線問題,預期降級) - Exception → error (非預期,提升監控可見性) Co-Authored-By: Claude Sonnet 4.6 --- apps/api/src/services/decision_manager.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/apps/api/src/services/decision_manager.py b/apps/api/src/services/decision_manager.py index db316dbe..444e82d5 100644 --- a/apps/api/src/services/decision_manager.py +++ b/apps/api/src/services/decision_manager.py @@ -374,6 +374,10 @@ class DecisionManager: def __init__(self): self._openclaw = get_openclaw() + # I2 修復 (首席架構師 Review): 注入 KnowledgeService 避免函數內 import 耦合 + # 2026-04-04 Claude Code + from src.services.knowledge_service import get_knowledge_service + self._knowledge_svc = get_knowledge_service() async def get_or_create_decision( self, @@ -550,14 +554,12 @@ class DecisionManager: async def _query_kb_context_inner(self, incident: Incident) -> str: """KB RAG 實際查詢邏輯,由 _query_kb_context 包裝 timeout 後呼叫""" - from src.services.knowledge_service import get_knowledge_service query_parts = list(incident.affected_services) if incident.signals: query_parts.insert(0, getattr(incident.signals[0], "alert_name", "")) query = " ".join(filter(None, query_parts)) - svc = get_knowledge_service() - results = await svc.semantic_search(query, limit=3, threshold=0.4) + results = await self._knowledge_svc.semantic_search(query, limit=3, threshold=0.4) if not results: return "" @@ -593,8 +595,13 @@ class DecisionManager: except asyncio.TimeoutError: logger.warning("kb_rag_timeout", incident_id=incident.incident_id) return "" + except (ConnectionError, OSError) as e: + # Ollama 連線問題,預期可降級 + logger.warning("kb_rag_connection_error", incident_id=incident.incident_id, error=str(e)) + return "" except Exception as e: - logger.warning("kb_rag_failed", incident_id=incident.incident_id, error=str(e)) + # 非預期錯誤,用 error 級別方便監控 + logger.error("kb_rag_unexpected_error", incident_id=incident.incident_id, error=str(e)) return "" async def _dual_engine_analyze(