From baba9ab54af5f1afd19fa7892403ddbc516cdda0 Mon Sep 17 00:00:00 2001 From: JiriUhlir <149317995+JiriUhlir@users.noreply.github.com> Date: Mon, 13 Jul 2026 08:54:45 +0200 Subject: [PATCH] uprava na errors a try catch --- app/routers/transcribe.py | 61 +++++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 12 deletions(-) diff --git a/app/routers/transcribe.py b/app/routers/transcribe.py index 320d8db..3b88495 100644 --- a/app/routers/transcribe.py +++ b/app/routers/transcribe.py @@ -6,7 +6,10 @@ co nejlepšího přepisu. Audio přichází jako proměnná (upload `file` ve form-data). Všechny ostatní parametry jsou v POST těle (form fields). API klíče jsou v X- hlavičkách (viz credentials.py). -Výstup je vždy JSON: {"gpt": ..., "deepgram": ..., "merge": ...}. +Výstup je vždy JSON: {"gpt": ..., "deepgram": ..., "merge": ..., "errors": [...]}. + +Selhání jednoho z přepisů (Deepgram / OpenAI) nebo sloučení neshodí celý request — +jeho část zůstane prázdná a chyba se přidá do pole `errors`. """ import asyncio @@ -41,6 +44,11 @@ class TranscribeResult(BaseModel): ..., description="Sloučený, co nejpřesnější a úplný přepis se štítky mluvčích.", ) + errors: list[str] = Field( + default_factory=list, + description="Chyby dílčích kroků (Deepgram / OpenAI přepis / sloučení). " + "Prázdné, pokud vše proběhlo v pořádku. Selhavší část je pak prázdná.", + ) async def _read_upload(file: UploadFile) -> tuple[bytes, str, str]: @@ -85,8 +93,10 @@ async def transcribe( audio, filename, content_type = await _read_upload(file) - # Oba přepisy paralelně. - text_deepgram, text_gpt = await asyncio.gather( + errors: list[str] = [] + + # Oba přepisy paralelně; selhání jednoho neshodí druhý ani celý request. + result_deepgram, result_gpt = await asyncio.gather( deepgram_client.transcribe( api_key=deepgram_key, audio=audio, @@ -104,15 +114,42 @@ async def transcribe( model=whisper_model, language=language, ), + return_exceptions=True, ) - prompt = combine_prompt.strip() if combine_prompt and combine_prompt.strip() else DEFAULT_COMBINE_PROMPT - merged = await openai_client.merge_transcripts( - api_key=openai_key, - model=chat_model, - system_prompt=prompt, - text_deepgram=text_deepgram, - text_whisper=text_gpt, - ) + if isinstance(result_deepgram, BaseException): + log.exception("Deepgram přepis selhal", exc_info=result_deepgram) + errors.append(f"Deepgram přepis selhal: {result_deepgram}") + text_deepgram = "" + else: + text_deepgram = result_deepgram - return TranscribeResult(gpt=text_gpt, deepgram=text_deepgram, merge=merged) + if isinstance(result_gpt, BaseException): + log.exception("OpenAI (whisper) přepis selhal", exc_info=result_gpt) + errors.append(f"OpenAI (whisper) přepis selhal: {result_gpt}") + text_gpt = "" + else: + text_gpt = result_gpt + + # Sloučení má smysl jen když je aspoň jeden přepis k dispozici. + merged = "" + if text_deepgram or text_gpt: + prompt = combine_prompt.strip() if combine_prompt and combine_prompt.strip() else DEFAULT_COMBINE_PROMPT + try: + merged = await openai_client.merge_transcripts( + api_key=openai_key, + model=chat_model, + system_prompt=prompt, + text_deepgram=text_deepgram, + text_whisper=text_gpt, + ) + except Exception as exc: + log.exception("Sloučení přepisů selhalo") + errors.append(f"Sloučení přepisů selhalo: {exc}") + + return TranscribeResult( + gpt=text_gpt, + deepgram=text_deepgram, + merge=merged, + errors=errors, + )