From f46851d481ff9a61de7f1683c48acb3a2d5dc468 Mon Sep 17 00:00:00 2001 From: gahusb Date: Fri, 22 May 2026 03:14:23 +0900 Subject: [PATCH] =?UTF-8?q?feat(weight-evolver):=20cron=203=EC=A2=85=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20(=EC=9B=94=20generate+apply=20/=20?= =?UTF-8?q?=EC=9D=BC=20apply=20/=20=ED=86=A0=20evaluate)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- lotto/app/main.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/lotto/app/main.py b/lotto/app/main.py index 7d2a581..26571df 100644 --- a/lotto/app/main.py +++ b/lotto/app/main.py @@ -38,6 +38,11 @@ from .strategy_evolver import ( get_weights_with_trend, recalculate_weights, generate_smart_recommendation, ) +from .weight_evolver import ( + generate_weekly_candidates_and_save, + apply_today_and_pick, + evaluate_weekly, +) from .routers import curator as curator_router from .routers import briefing as briefing_router from .routers import review as review_router @@ -111,9 +116,42 @@ def on_startup(): id="grade_weekly_review", ) + scheduler.add_job(_run_weight_evolver_weekly, "cron", day_of_week="mon", hour=9, minute=0, id="weight_evolver_weekly") + scheduler.add_job(_run_weight_evolver_daily, "cron", hour=9, minute=0, id="weight_evolver_daily") + scheduler.add_job(_run_weight_evolver_eval, "cron", day_of_week="sat", hour=22, minute=0, id="weight_evolver_eval") + scheduler.start() +async def _run_weight_evolver_weekly(): + """월 09:00 — 6개 후보 생성 후 inline으로 apply_today도 호출.""" + try: + generate_weekly_candidates_and_save() + apply_today_and_pick(n=5) + except Exception as e: + logger.error(f"[weight_evolver_weekly] {e}") + + +async def _run_weight_evolver_daily(): + """매일 09:00 (월요일 제외 — 월은 weekly cron이 inline으로 처리).""" + try: + from datetime import datetime, timezone, timedelta + KST = timezone(timedelta(hours=9)) + if datetime.now(KST).weekday() == 0: + return + apply_today_and_pick(n=5) + except Exception as e: + logger.error(f"[weight_evolver_daily] {e}") + + +async def _run_weight_evolver_eval(): + """토 22:00 — 회고 + 다음주 base 갱신.""" + try: + evaluate_weekly() + except Exception as e: + logger.error(f"[weight_evolver_eval] {e}") + + @app.get("/health") def health(): return {"ok": True}