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}