"""Классификация ошибок пайплайна → голосовые куи (текст + 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