fix(legal): add model cascade fallback on 503/429 high demand spikes
This commit is contained in:
parent
2924765624
commit
5c437b78b0
1 changed files with 40 additions and 26 deletions
|
|
@ -204,36 +204,50 @@ class AILegalEngine:
|
||||||
f"{self.get_role_instructions(role)}"
|
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:
|
last_err = None
|
||||||
reply_text = await self._query_rest_api(
|
for model_to_use in models_cascade:
|
||||||
prompt=prompt,
|
try:
|
||||||
system_instruction=system_instruction,
|
reply_text = await self._query_rest_api(
|
||||||
model=model_to_use,
|
prompt=prompt,
|
||||||
audio_path=audio_path
|
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 {
|
return {
|
||||||
"success": True,
|
"success": True,
|
||||||
"text": reply_text.strip(),
|
"text": reply_text.strip(),
|
||||||
"answer": reply_text.strip(),
|
"answer": reply_text.strip(),
|
||||||
"role": role,
|
"role": role,
|
||||||
"latency_sec": round(latency, 2),
|
"latency_sec": round(latency, 2),
|
||||||
"model": model_to_use
|
"model": model_to_use
|
||||||
}
|
}
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
latency = (datetime.now() - start_time).total_seconds()
|
last_err = e
|
||||||
log.error(f"Gemini Error: {e}")
|
log.warning(f"Model {model_to_use} failed ({e}), trying next fallback...")
|
||||||
return {
|
await asyncio.sleep(0.5)
|
||||||
"success": False,
|
|
||||||
"text": f"Ошибка обработки запроса ИИ: {e}",
|
latency = (datetime.now() - start_time).total_seconds()
|
||||||
"role": role,
|
log.error(f"All Gemini fallback models failed: {last_err}")
|
||||||
"latency_sec": round(latency, 2)
|
return {
|
||||||
}
|
"success": False,
|
||||||
|
"text": f"Шлюз ИИ временно перегружен. Пожалуйста, повторите вопрос через несколько секунд.",
|
||||||
|
"role": role,
|
||||||
|
"latency_sec": round(latency, 2)
|
||||||
|
}
|
||||||
|
|
||||||
# Глобальный синглтон юридического ядра для роутеров бота
|
# Глобальный синглтон юридического ядра для роутеров бота
|
||||||
legal_engine = AILegalEngine()
|
legal_engine = AILegalEngine()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue