diff --git a/services/ai_legal_engine.py b/services/ai_legal_engine.py index de4e5df..d5f9fb3 100644 --- a/services/ai_legal_engine.py +++ b/services/ai_legal_engine.py @@ -204,36 +204,50 @@ class AILegalEngine: f"{self.get_role_instructions(role)}" ) - model_to_use = self.model_name + # Каскад моделей при перегрузке или временной недоступности (503/429) + models_to_try = [ + self.model_name, + "gemini-flash-latest", + "gemini-3-flash-preview" + ] + # Убираем дубликаты с сохранением порядка + seen = set() + models_cascade = [m for m in models_to_try if not (m in seen or seen.add(m))] - try: - reply_text = await self._query_rest_api( - prompt=prompt, - system_instruction=system_instruction, - model=model_to_use, - audio_path=audio_path - ) + last_err = None + for model_to_use in models_cascade: + try: + reply_text = await self._query_rest_api( + prompt=prompt, + system_instruction=system_instruction, + model=model_to_use, + audio_path=audio_path + ) - latency = (datetime.now() - start_time).total_seconds() + latency = (datetime.now() - start_time).total_seconds() - return { - "success": True, - "text": reply_text.strip(), - "answer": reply_text.strip(), - "role": role, - "latency_sec": round(latency, 2), - "model": model_to_use - } + return { + "success": True, + "text": reply_text.strip(), + "answer": reply_text.strip(), + "role": role, + "latency_sec": round(latency, 2), + "model": model_to_use + } - except Exception as e: - latency = (datetime.now() - start_time).total_seconds() - log.error(f"Gemini Error: {e}") - return { - "success": False, - "text": f"Ошибка обработки запроса ИИ: {e}", - "role": role, - "latency_sec": round(latency, 2) - } + except Exception as e: + last_err = e + log.warning(f"Model {model_to_use} failed ({e}), trying next fallback...") + await asyncio.sleep(0.5) + + latency = (datetime.now() - start_time).total_seconds() + log.error(f"All Gemini fallback models failed: {last_err}") + return { + "success": False, + "text": f"Шлюз ИИ временно перегружен. Пожалуйста, повторите вопрос через несколько секунд.", + "role": role, + "latency_sec": round(latency, 2) + } # Глобальный синглтон юридического ядра для роутеров бота legal_engine = AILegalEngine()