from fastapi import APIRouter, File, Form, HTTPException, Query, UploadFile from app.errors import RoutingError from app.dependencies import ( resolve_route, build_orchestrator, resolve_input_endpoint, ) router = APIRouter() @router.post("/transcribe") async def transcribe( file: UploadFile = File(...), language: str | None = Form(default=None), input_endpoint: str | None = Form(default=None), stt_provider: str | None = Form(default=None), session_id: str | None = Query( default=None, description="Optional session id to apply a stored route", ), ): overrides = { "input_endpoint": input_endpoint, "language": language, "stt_provider": stt_provider, } route = resolve_route(session_id, overrides) try: orchestrator = build_orchestrator(route) source = await resolve_input_endpoint(route) except RoutingError as exc: raise HTTPException(status_code=422, detail=str(exc)) content = await file.read() suffix = (file.filename or "audio.wav").rsplit(".", 1)[-1].lower() try: trace = await orchestrator.transcribe_only( content, fmt=suffix, language=route.language, input=source, ) except Exception as exc: raise HTTPException(status_code=502, detail=str(exc)) return {"route": route.as_dict(), "trace": trace.model_dump()}