35 lines
1.4 KiB
Python
35 lines
1.4 KiB
Python
"""Классификация ошибок пайплайна → голосовые куи (текст + wav-файл).
|
|
|
|
Отец должен СЛЫШАТЬ, что случилось: нет сети / лимит / что-то ещё.
|
|
Куи — готовые wav из assets/earcons (мгновенно, без синтеза в момент ошибки).
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import re
|
|
from pathlib import Path
|
|
|
|
CUES_DIR = Path(__file__).resolve().parents[2] / "assets" / "earcons"
|
|
|
|
# Паттерны текста ошибки → куи
|
|
_PATTERNS: list[tuple[str, str]] = [
|
|
(r"Connection|ConnectError|Network|Timeout|timed out|getaddrinfo|SSLError|RemoteProtocol", "error_network.wav"),
|
|
(r"429|Rate limit|rate_limit|quota|Quota|billing|insufficient", "error_limit.wav"),
|
|
(r"401|403|Unauthorized|PermissionDenied|forbidden", "error_limit.wav"),
|
|
]
|
|
|
|
UNCLEAR_CUE = "unclear_question.wav"
|
|
GENERAL_CUE = "error_general.wav"
|
|
UNCLEAR_LIMIT = 5 # после N неразборчивых подряд — голосовое сообщение и сброс
|
|
|
|
|
|
def classify_error(exc: BaseException | str) -> str:
|
|
"""Текст ошибки → имя wav-куи в assets/earcons."""
|
|
text = str(exc)
|
|
for pattern, cue in _PATTERNS:
|
|
if re.search(pattern, text):
|
|
return cue
|
|
return GENERAL_CUE
|
|
|
|
|
|
def cue_path(cue: str) -> Path:
|
|
return CUES_DIR / cue |