feat: smart recommendation generator with feedback loop and result checker
This commit is contained in:
@@ -10,8 +10,9 @@ from .db import (
|
||||
update_recommendation,
|
||||
)
|
||||
from .recommender import recommend_numbers
|
||||
from .recommender import recommend_numbers
|
||||
from .collector import sync_latest, sync_ensure_all
|
||||
from .generator import generate_smart_recommendations
|
||||
from .checker import check_results_for_draw
|
||||
|
||||
app = FastAPI()
|
||||
scheduler = BackgroundScheduler(timezone=os.getenv("TZ", "Asia/Seoul"))
|
||||
@@ -80,7 +81,20 @@ def calc_recent_overlap(numbers: List[int], draws: List[Tuple[int, List[int]]],
|
||||
@app.on_event("startup")
|
||||
def on_startup():
|
||||
init_db()
|
||||
scheduler.add_job(lambda: sync_latest(LATEST_URL), "cron", hour="9,21", minute=10)
|
||||
|
||||
# 1. 로또 당첨번호 동기화 (매일 9시, 21시 10분)
|
||||
# 동기화 후 새로운 회차가 있으면 채점(check)까지 수행
|
||||
def _sync_and_check():
|
||||
res = sync_latest(LATEST_URL)
|
||||
if res["was_new"]:
|
||||
# 새로운 회차(예: 1000회)가 나오면, 999회차 기반 추천들을 채점
|
||||
check_results_for_draw(res["drawNo"])
|
||||
|
||||
scheduler.add_job(_sync_and_check, "cron", hour="9,21", minute=10)
|
||||
|
||||
# 2. 매일 아침 8시: 지능형 자동 추천 (10개씩)
|
||||
scheduler.add_job(lambda: generate_smart_recommendations(10), "cron", hour="8", minute=0)
|
||||
|
||||
scheduler.start()
|
||||
|
||||
@app.get("/health")
|
||||
@@ -115,7 +129,17 @@ def api_draw(drw_no: int):
|
||||
|
||||
@app.post("/api/admin/sync_latest")
|
||||
def admin_sync_latest():
|
||||
return sync_latest(LATEST_URL)
|
||||
res = sync_latest(LATEST_URL)
|
||||
# 수동 동기화 시에도 신규 회차면 채점
|
||||
if res["was_new"]:
|
||||
check_results_for_draw(res["drawNo"])
|
||||
return res
|
||||
|
||||
@app.post("/api/admin/auto_gen")
|
||||
def admin_auto_gen(count: int = 10):
|
||||
"""지능형 자동 생성 수동 트리거"""
|
||||
n = generate_smart_recommendations(count)
|
||||
return {"generated": n}
|
||||
|
||||
@app.get("/api/lotto/stats")
|
||||
def api_stats():
|
||||
|
||||
Reference in New Issue
Block a user