"""Vstupní bod aplikace audio-transcription. Stateless FastAPI služba běžící v AppFactory za reverse proxy `/apps/`. Přijímá audio + parametry v POST, přepisuje ho paralelně (Deepgram + OpenAI Whisper) a volitelně slučuje do jednoho co nejlepšího přepisu. Výstup je vždy JSON. API klíče se předávají per-request v X- hlavičkách, nikdy se neukládají ani nelogují. """ import os from fastapi import FastAPI from .config import APP_NAME, APP_VERSION, ROOT_PATH from .errors import register_exception_handlers from .logging_config import configure_logging from .routers import meta, transcribe configure_logging() DESCRIPTION = """ Přepis hovorů / audia dvěma engine (Deepgram + OpenAI) a jejich AI sloučení do jednoho co nejpřesnějšího přepisu — vše v jednom requestu. ### Přihlašovací údaje (hlavičky) Secrets se předávají v hlavičkách u každého requestu — nikdy v těle ani v URL: - `X-Deepgram-Api-Key` — Deepgram API klíč (Deepgram Console → API Keys) - `X-OpenAI-Api-Key` — OpenAI API klíč (platform.openai.com → API keys) ### Endpoint - `POST /dual-with-merge` — audio přepíše paralelně Deepgramem i OpenAI (whisper-1) a oba texty sloučí přes OpenAI Chat dle `combine_prompt`. Vrací JSON `{"gpt": ..., "deepgram": ..., "merge": ...}` (`gpt` = OpenAI whisper-1, `deepgram` = Deepgram, `merge` = sloučený výsledek). Audio se posílá jako proměnná `file` (multipart/form-data). Ostatní parametry (modely, jazyk, prompt) jsou form fields v POST. ### Chyby JSON `{error, message, detail}`. 400 = špatný/prázdný nebo nepodporovaný audio soubor, 401 = chybějící nebo upstreamem odmítnutý API klíč, 429 = rate limit, 502 = výpadek upstreamu. """ app = FastAPI( title=APP_NAME, version=APP_VERSION, description=DESCRIPTION, root_path=ROOT_PATH, ) register_exception_handlers(app) app.include_router(meta.router) app.include_router(transcribe.router) if __name__ == "__main__": import uvicorn uvicorn.run( "app.main:app", host="0.0.0.0", port=int(os.getenv("PORT", "8000")), )