fix(incidents): GET /incidents 加 48h age filter,阻止舊 incident 反覆觸發 AI 分析
Some checks failed
CD Pipeline / build-and-deploy (push) Has been cancelled

根本原因: DECISION_TOKEN_TTL=3600s → 舊 incident token 每小時過期
→ GET /api/v1/incidents 重複觸發 get_or_create_decision → OPENCLAW_NEMO timeout
→ Expert System fallback (confidence=20%) → Telegram 洪水

修復: 只對 created_at 在 48h 內的 incident 觸發背景 AI 分析
48h+ 的舊 incident 不再觸發(仍顯示在列表,只是不重新分析)

2026-04-16 Claude Sonnet 4.6 Asia/Taipei

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-04-16 02:21:53 +08:00
parent e8bf37cfd9
commit a07daf7e3f

View File

@@ -166,10 +166,20 @@ async def list_incidents() -> IncidentListResponse:
else:
# 無快取 → 背景觸發,本次返回 None前端看到 decision=null 會 poll
responses.append(IncidentResponse.from_incident(incident, None))
timeout = 120.0 if incident.severity in (Severity.P0, Severity.P1) else 180.0
background_tasks.append(
decision_manager.get_or_create_decision(incident=incident, timeout_sec=timeout)
)
# 2026-04-16 Claude Sonnet 4.6: 只對 48h 內的 incident 觸發 AI 分析
# 舊 incident token 每小時過期,若不限制會反覆重新分析歷史事件 → Telegram 洪水
from datetime import datetime, timezone, timedelta
_created = getattr(incident, "created_at", None)
_too_old = False
if _created:
if _created.tzinfo is None:
_created = _created.replace(tzinfo=timezone.utc)
_too_old = (_created < datetime.now(timezone.utc) - timedelta(hours=48))
if not _too_old:
timeout = 120.0 if incident.severity in (Severity.P0, Severity.P1) else 180.0
background_tasks.append(
decision_manager.get_or_create_decision(incident=incident, timeout_sec=timeout)
)
except Exception as e:
logger.warning(
"decision_generation_failed",