fix(incidents): GET /incidents 加 48h age filter,阻止舊 incident 反覆觸發 AI 分析
Some checks failed
CD Pipeline / build-and-deploy (push) Has been cancelled
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:
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user