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(