Files
Gov-chat-bot/backend/app/main.py
2026-03-26 12:49:43 +09:00

71 lines
2.1 KiB
Python

from contextlib import asynccontextmanager
from fastapi import FastAPI
from app.core.config import settings
from app.core.database import startup_hook
from app.core.middleware import TenantMiddleware
from app.providers import get_embedding_provider, get_llm_provider, get_vectordb_provider
from app.routers import health
from app.routers import engine, skill
from app.routers import admin_docs, admin_crawler
from app.routers import admin_faq, admin_moderation, admin_complaints
from app.routers import admin_auth, admin_metrics
@asynccontextmanager
async def lifespan(app: FastAPI):
await startup_hook()
# 전역 설정 로드
cfg = settings.model_dump()
# Provider 초기화
embedding = get_embedding_provider(cfg)
llm = get_llm_provider(cfg)
vectordb = get_vectordb_provider(cfg)
# 임베딩 워밍업 (시작 시 모델 로드)
try:
await embedding.warmup()
except Exception:
pass # 실패해도 서버는 기동 — /ready에서 상태 노출
app.state.providers = {
"embedding": embedding,
"llm": llm,
"vectordb": vectordb,
}
app.state.tenant_configs = {} # 캐시: {tenant_slug: config_dict}
app.state.redis = None # Phase 1: Redis 연결은 선택적
# Redis 연결 시도
try:
import redis.asyncio as aioredis
r = aioredis.from_url(settings.REDIS_URL, socket_connect_timeout=2)
await r.ping()
app.state.redis = r
except Exception:
pass # Redis 없이도 동작 (Idempotency 비활성)
yield
# 종료 시 Redis 연결 해제
if app.state.redis:
await app.state.redis.aclose()
app = FastAPI(title="SmartBot KR", version="1.0.0", lifespan=lifespan)
app.add_middleware(TenantMiddleware)
app.include_router(health.router)
app.include_router(engine.router)
app.include_router(skill.router)
app.include_router(admin_docs.router)
app.include_router(admin_crawler.router)
app.include_router(admin_auth.router)
app.include_router(admin_faq.router)
app.include_router(admin_moderation.router)
app.include_router(admin_complaints.router)
app.include_router(admin_metrics.router)