diff --git a/apps/api/pyproject.toml b/apps/api/pyproject.toml index 11ea5dc7..2c6c4d00 100644 --- a/apps/api/pyproject.toml +++ b/apps/api/pyproject.toml @@ -39,6 +39,10 @@ dependencies = [ "claude-agent-sdk>=0.1.50", # Sprint 5.1 2026-04-08 Claude Sonnet 4.6: Service Registry YAML 讀取 "pyyaml>=6.0.0", + # Phase 4 ADR-084: 動態異常偵測 (2026-04-15 ogt: 補齊缺失依賴) + "statsmodels>=0.14.0", + "drain3>=0.9.11", + "sse-starlette>=1.8.0", ] # [tool.uv.sources] diff --git a/apps/api/src/main.py b/apps/api/src/main.py index 4325fd9e..5a86089a 100644 --- a/apps/api/src/main.py +++ b/apps/api/src/main.py @@ -259,25 +259,29 @@ async def lifespan(_app: FastAPI) -> AsyncGenerator[None, None]: restored = 0 for record in records: - from src.models.incident import Incident - incident = Incident( - incident_id=record.incident_id, - status=record.status, - severity=record.severity, - signals=record.signals or [], - affected_services=record.affected_services or [], - decision_chain=record.decision_chain, - proposal_ids=record.proposal_ids or [], - outcome=record.outcome, - created_at=record.created_at, - updated_at=record.updated_at, - resolved_at=record.resolved_at, - closed_at=record.closed_at, - ttl_days=record.ttl_days, - vectorized=record.vectorized, - ) - if await incident_service.save_to_working_memory(incident): - restored += 1 + try: + from src.models.incident import Incident + incident = Incident( + incident_id=record.incident_id, + status=record.status, + severity=record.severity, + signals=record.signals or [], + affected_services=record.affected_services or [], + decision_chain=record.decision_chain, + proposal_ids=record.proposal_ids or [], + outcome=record.outcome, + created_at=record.created_at, + updated_at=record.updated_at, + resolved_at=record.resolved_at, + closed_at=record.closed_at, + ttl_days=record.ttl_days, + vectorized=record.vectorized, + ) + if await incident_service.save_to_working_memory(incident): + restored += 1 + except Exception: + # 舊資料 source 值不合法(node-exporter 等)→ 跳過 + pass logger.info("working_memory_warmed_up", restored=restored, total=len(records)) except Exception as e: