matalee/hpce-dev
0
1from __future__ import annotations2"""3roadshow-server-v34AX Tech Connect 시연용 백엔드 (마이K Intent Taxonomy 116개 기반)5 6시나리오: cs-myk-v37구조: 3-Layer (Foundation / Inference / Serving)8"""9import logging10from contextlib import asynccontextmanager11 12from fastapi import FastAPI13from fastapi.middleware.cors import CORSMiddleware14 15from config import settings16from data.executor import init_db17from routes import sessions, intents, scenarios, admin18from ws.handler import router as ws_router19 20logging.basicConfig(21 level=logging.INFO,22 format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",23)24logger = logging.getLogger(__name__)25 26 27@asynccontextmanager28async def lifespan(app: FastAPI):29 """앱 수명주기를 관리한다.30 31 기동 시 DB를 초기화(스키마 생성 + 카탈로그 시드)하고,32 WARMUP_ON_START가 켜져 있으면 모델을 미리 학습·준비한다.33 종료 시 로깅한다.34 35 Args:36 app: FastAPI 애플리케이션 인스턴스.37 38 Yields:39 제어를 애플리케이션 실행 구간으로 넘긴다.40 """41 logger.info(f"Starting roadshow-server-v3 (scenario={settings.SCENARIO_ID})")42 init_db()43 logger.info(f"DB initialized: {settings.DB_PATH}")44 if settings.WARMUP_ON_START: # 첫 설문 없이 모델 준비45 from core.warmup import warmup_models46 warmup_models()47 yield48 logger.info("Shutting down roadshow-server-v3")49 50 51app = FastAPI(52 title="roadshow-server-v3",53 description="AX Tech Connect 시연용 백엔드 (마이K Intent Taxonomy 116개)",54 version="3.0.0",55 lifespan=lifespan,56)57 58_cors_origins = (59 [o.strip() for o in settings.CORS_ORIGINS.split(",") if o.strip()]60 if settings.CORS_ORIGINS61 else ["*"]62)63app.add_middleware(64 CORSMiddleware,65 allow_origins=_cors_origins,66 allow_credentials=True,67 allow_methods=["*"],68 allow_headers=["*"],69)70 71app.include_router(scenarios.router, prefix="/api/scenarios", tags=["scenarios"])72app.include_router(sessions.router, prefix="/api/sessions", tags=["sessions"])73app.include_router(intents.router, prefix="/api/intents", tags=["intents"])74app.include_router(admin.router, prefix="/api/admin", tags=["admin"])75app.include_router(ws_router)76 77 78@app.get("/health")79async def health() -> dict:80 """헬스 체크 엔드포인트.81 82 Returns:83 서버 상태(status), 시나리오 ID(scenario_id), 환경(env)을 담은 dict.84 """85 return {86 "status": "ok",87 "scenario_id": settings.SCENARIO_ID,88 "env": settings.ENV,89 }90 91 92if __name__ == "__main__":93 import uvicorn94 uvicorn.run(95 "main:app",96 host="0.0.0.0",97 port=settings.PORT,98 reload=settings.RELOAD,99 )100 