cd0040925a
맥북 LLM 백지화 + 맥미니 모델 재결정에 따라 DS 의 생성 LLM 소비를 일괄 보류. held = classify/summarize/deep_summary(큐, claim 미발생·attempts 미소모) + digest(04:00)/briefing(05:10) cron + study explanation/session_analysis/memo_card 컨슈머. GPU 특화 스테이지·수집기·인터랙티브(ask/eid chat)는 무영향. 기본값 [] = 무동작. /api/digest/regenerate 는 홀드 중 409 명시. 해제 = config held_stages 비우고 fastapi 재기동. exec plan: ~/.claude/plans/ds-llm-hold-exec-20260611.md Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
"""Morning Briefing 워커 — 야간 수집 뉴스 (KST 00:00~05:00) topic×country 비교 분석.
|
||
|
||
- APScheduler cron (매일 05:10 KST, PR-3 에서 등록) + 수동 호출 공용 진입점
|
||
- PIPELINE_HARD_CAP = 600초 hard cap 으로 cron stuck 절대 방지
|
||
- 단독 실행: `python -m workers.briefing_worker`
|
||
"""
|
||
|
||
import asyncio
|
||
from datetime import date
|
||
|
||
from core.config import settings
|
||
from core.utils import setup_logger
|
||
from services.briefing.pipeline import run_briefing_pipeline
|
||
|
||
logger = setup_logger("briefing_worker")
|
||
|
||
PIPELINE_HARD_CAP = 600
|
||
|
||
|
||
async def run(target_date: date | None = None) -> dict | None:
|
||
"""APScheduler + 수동 호출 공용 진입점.
|
||
|
||
Args:
|
||
target_date: KST 기준 briefing_date (None = 오늘). API regenerate 가 명시 지정 가능.
|
||
"""
|
||
if "briefing" in settings.pipeline_held_stages:
|
||
logger.info("[briefing] 보류 (pipeline.held_stages) — 이번 실행 skip")
|
||
return None
|
||
try:
|
||
result = await asyncio.wait_for(
|
||
run_briefing_pipeline(target_date),
|
||
timeout=PIPELINE_HARD_CAP,
|
||
)
|
||
logger.info(f"[briefing] 워커 완료: {result}")
|
||
return result
|
||
except asyncio.TimeoutError:
|
||
logger.error(
|
||
f"[briefing] HARD CAP {PIPELINE_HARD_CAP}s 초과 — 워커 강제 중단. "
|
||
f"기존 briefing 은 commit 시점에만 갱신되므로 그대로 유지됨."
|
||
)
|
||
except Exception as e:
|
||
logger.exception(f"[briefing] 워커 실패: {e}")
|
||
return None
|
||
|
||
|
||
if __name__ == "__main__":
|
||
asyncio.run(run())
|