diff --git a/apps/api/src/services/heartbeat_report_service.py b/apps/api/src/services/heartbeat_report_service.py index b936525d..52de5210 100644 --- a/apps/api/src/services/heartbeat_report_service.py +++ b/apps/api/src/services/heartbeat_report_service.py @@ -339,15 +339,13 @@ class HeartbeatReportService: km_total = await db.scalar(select(func.count()).select_from(KnowledgeEntryRecord)) stats.km_total = km_total or 0 - # Incident 向量化數 + # KM 向量化數(embedding IS NOT NULL) + # 注意:knowledge_entries 無 vectorized 欄位,用 embedding 判斷 vec_count = await db.scalar( - select(func.count()).select_from(IncidentRecord) - .where(IncidentRecord.vectorized == True) # noqa: E712 + select(func.count()).select_from(KnowledgeEntryRecord) + .where(KnowledgeEntryRecord.embedding.isnot(None)) ) - inc_total = await db.scalar(select(func.count()).select_from(IncidentRecord)) stats.km_vectorized = vec_count or 0 - if not stats.km_total: - stats.km_total = inc_total or 0 # 24h 修復統計 since = datetime.utcnow() - timedelta(hours=24) diff --git a/apps/api/src/services/telegram_gateway.py b/apps/api/src/services/telegram_gateway.py index 1f8d8185..297032ac 100644 --- a/apps/api/src/services/telegram_gateway.py +++ b/apps/api/src/services/telegram_gateway.py @@ -4748,6 +4748,16 @@ class TelegramGateway: """ interval_seconds = interval_minutes * 60 + # 對齊到下一個整點倍數(例如 interval=30 → 對齊到 :00 或 :30) + # 避免多 replica 因啟動時間不同而各自發送 + now_ts = datetime.now(UTC).timestamp() + next_slot = (int(now_ts / interval_seconds) + 1) * interval_seconds + wait_seconds = next_slot - now_ts + try: + await asyncio.sleep(wait_seconds) + except asyncio.CancelledError: + return + while self._heartbeat_active: try: await self.send_heartbeat()