From 08ec749cd82f93e90c3c9b70a540241e213dc6c0 Mon Sep 17 00:00:00 2001 From: zyc <1439655764@qq.com> Date: Wed, 29 Apr 2026 14:35:10 +0800 Subject: [PATCH] =?UTF-8?q?feat(scheduler):=20=E5=90=AF=E5=8A=A8=20+=20?= =?UTF-8?q?=E8=B7=B3=E8=BF=87=20AI=20=E6=97=B6=E5=86=99=E8=AF=8A=E6=96=AD?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=88=B0=20sync=5Flogs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 加入两条诊断写入: 1. 服务启动时立刻写 [BOOT] 日志,包含 AI_ENABLED / AI_API_KEY 长度 / AI_MODEL / AI_BASE_URL,可在 sync_logs UI 直接确认 pod 拿到 的环境变量 2. 每次 cron/手动触发若因 AI_ENABLED=false 或 AI_API_KEY 空被跳过, 写一条 status=error 的 ai_okr 日志说明跳过原因 这样不需要 kubectl logs 就能定位"为什么 AI 没跑"。 Co-Authored-By: Claude Opus 4.7 (1M context) --- backend/src/sync/scheduler.ts | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/backend/src/sync/scheduler.ts b/backend/src/sync/scheduler.ts index a2b83c5..8e4657e 100644 --- a/backend/src/sync/scheduler.ts +++ b/backend/src/sync/scheduler.ts @@ -1,6 +1,9 @@ +import { v4 as uuid } from 'uuid'; import { Cron } from 'croner'; import { syncGitea } from './sync-gitea'; import { analyzeCommitsForOKR } from '../services/okr-ai-sync'; +import { db } from '../db/index'; +import { syncLogs } from '../db/schema'; import { config } from '../config'; let giteaJob: Cron | null = null; @@ -12,6 +15,17 @@ async function runSyncAndAnalyze() { await analyzeCommitsForOKR().catch(e => console.error('[SCHEDULER] AI OKR 分析失败:', e) ); + } else { + const reason = !config.AI_ENABLED ? 'AI_ENABLED=false' : 'AI_API_KEY 为空'; + console.warn(`[SCHEDULER] 跳过 AI 分析: ${reason}`); + await db.insert(syncLogs).values({ + id: uuid(), + source: 'ai_okr', + status: 'error', + message: `AI 分析被跳过: ${reason} (AI_ENABLED=${config.AI_ENABLED}, AI_API_KEY length=${config.AI_API_KEY?.length || 0}, AI_MODEL=${config.AI_MODEL})`, + recordsProcessed: 0, + syncedAt: new Date(), + }); } } @@ -22,7 +36,17 @@ export function startScheduler(): void { await runSyncAndAnalyze(); }); - console.info('[SCHEDULER] Gitea 自动同步已启动(每天 02:00 + 19:00)'); + console.info(`[SCHEDULER] Gitea 自动同步已启动(每天 02:00 + 19:00 UTC), AI_ENABLED=${config.AI_ENABLED}, AI_API_KEY length=${config.AI_API_KEY?.length || 0}`); + + // 启动时立刻写一条诊断日志(不阻塞) + db.insert(syncLogs).values({ + id: uuid(), + source: 'ai_okr', + status: 'success', + message: `[BOOT] Scheduler started. AI_ENABLED=${config.AI_ENABLED}, AI_API_KEY length=${config.AI_API_KEY?.length || 0}, AI_MODEL=${config.AI_MODEL}, AI_BASE_URL=${config.AI_BASE_URL}`, + recordsProcessed: 0, + syncedAt: new Date(), + }).catch(e => console.error('[SCHEDULER] 启动诊断日志写入失败:', e)); // 启动后 10 秒执行一次首次同步 setTimeout(async () => {