8f6f8969fd
- api/: FastAPI app, X-API-Key 인증(미설정 시 임시키), 엔진 load-once 풀 (+transcribe lock), POST /v1/transcribe(multipart, 동기), /health, /v1/system, /v1/models. 업로드 임시파일 finally 삭제(프라이버시). - postprocess/: llm.correct(scripts/llm_correct.py 승격; opt-in·allowlist·감사로그·재시도) + rules.normalize(EmbeddingGemma 등 정규화). - results/formats.py: txt/srt/vtt. connectivity/tunnel.py: cloudflared quick tunnel(Colab). - cli serve: uvicorn 단일워커 + --tunnel cloudflare; config llm_* 필드; pyproject api/queue extra 분리(+python-multipart, dev httpx). 검증: 22 단위테스트(API TestClient·formats·postprocess) + 실서버 e2e (/health·auth 401·실제 전사(JFK)·SRT·임시파일 삭제). KO 품질은 turbo/large-v3 필요(tiny는 한국어 degenerate). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
25 lines
629 B
Python
25 lines
629 B
Python
"""FastAPI 앱 팩토리."""
|
|
from __future__ import annotations
|
|
|
|
import contextlib
|
|
import logging
|
|
from collections.abc import AsyncIterator
|
|
|
|
from fastapi import FastAPI
|
|
|
|
from .deps import ensure_keys
|
|
from .routes.transcribe import router
|
|
|
|
logger = logging.getLogger("luke_scribe.api")
|
|
|
|
|
|
def create_app() -> FastAPI:
|
|
@contextlib.asynccontextmanager
|
|
async def lifespan(_app: FastAPI) -> AsyncIterator[None]:
|
|
logger.info("luke_scribe API ready · X-API-Key=%s", ensure_keys()[0])
|
|
yield
|
|
|
|
app = FastAPI(title="luke_scribe", version="0.1.0", lifespan=lifespan)
|
|
app.include_router(router)
|
|
return app
|