Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -7,7 +7,6 @@ from typing import List, Dict
|
|
| 7 |
from flask import Flask, request, jsonify
|
| 8 |
from flask_cors import CORS
|
| 9 |
from datetime import datetime
|
| 10 |
-
import time
|
| 11 |
|
| 12 |
# ======================================================================
|
| 13 |
# CONFIGURATION
|
|
@@ -42,10 +41,6 @@ MAX_CONVERSATION_HISTORY = 10
|
|
| 42 |
API_HOST = '0.0.0.0'
|
| 43 |
API_PORT = 1212 # Le port 1212 est conservé, il doit être configuré dans le README.md
|
| 44 |
|
| 45 |
-
# Configuration retry pour erreur 503
|
| 46 |
-
MAX_RETRIES = 10
|
| 47 |
-
RETRY_DELAY = 1 # secondes entre chaque tentative
|
| 48 |
-
|
| 49 |
# ======================================================================
|
| 50 |
# VARIABLES GLOBALES
|
| 51 |
# ======================================================================
|
|
@@ -275,34 +270,50 @@ def clear_history(session_id):
|
|
| 275 |
conversation_histories[session_id] = []
|
| 276 |
|
| 277 |
# ======================================================================
|
| 278 |
-
# CALL GEMINI
|
| 279 |
# ======================================================================
|
| 280 |
-
|
| 281 |
def call_gemini(rag_prompt, system_prompt, gemini_client):
|
| 282 |
-
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 283 |
for attempt in range(MAX_RETRIES):
|
| 284 |
try:
|
|
|
|
|
|
|
|
|
|
| 285 |
response = gemini_client.models.generate_content(
|
| 286 |
model=GEMINI_MODEL,
|
| 287 |
contents=f"{system_prompt}\n\n{rag_prompt}"
|
| 288 |
)
|
|
|
|
| 289 |
return response.text.replace("*", "")
|
|
|
|
| 290 |
except Exception as e:
|
|
|
|
|
|
|
| 291 |
error_message = str(e)
|
| 292 |
-
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 297 |
-
|
|
|
|
| 298 |
else:
|
| 299 |
-
#
|
| 300 |
-
print(
|
| 301 |
-
return f"Erreur: {
|
| 302 |
-
|
| 303 |
-
#
|
| 304 |
-
|
| 305 |
-
return "Erreur: Service temporairement indisponible après plusieurs tentatives"
|
| 306 |
|
| 307 |
# ======================================================================
|
| 308 |
# ANSWER PROCESS
|
|
@@ -388,7 +399,7 @@ def api_get_answer():
|
|
| 388 |
# Génère prompt RAG
|
| 389 |
rag_prompt = get_answer(query_text, collection, model_paraphrase, model_cross_encoder, history)
|
| 390 |
|
| 391 |
-
# Appelle Gemini
|
| 392 |
response = call_gemini(rag_prompt, system_prompt, gemini_client)
|
| 393 |
|
| 394 |
# Sauvegarde réponse
|
|
|
|
| 7 |
from flask import Flask, request, jsonify
|
| 8 |
from flask_cors import CORS
|
| 9 |
from datetime import datetime
|
|
|
|
| 10 |
|
| 11 |
# ======================================================================
|
| 12 |
# CONFIGURATION
|
|
|
|
| 41 |
API_HOST = '0.0.0.0'
|
| 42 |
API_PORT = 1212 # Le port 1212 est conservé, il doit être configuré dans le README.md
|
| 43 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
# ======================================================================
|
| 45 |
# VARIABLES GLOBALES
|
| 46 |
# ======================================================================
|
|
|
|
| 270 |
conversation_histories[session_id] = []
|
| 271 |
|
| 272 |
# ======================================================================
|
| 273 |
+
# CALL GEMINI
|
| 274 |
# ======================================================================
|
|
|
|
| 275 |
def call_gemini(rag_prompt, system_prompt, gemini_client):
|
| 276 |
+
"""
|
| 277 |
+
Appelle Google Gemini avec une logique de réessai en cas d'échec de l'API.
|
| 278 |
+
Maximum de 10 tentatives.
|
| 279 |
+
"""
|
| 280 |
+
MAX_RETRIES = 10
|
| 281 |
+
|
| 282 |
+
# L'API Gemini Python ne retourne pas directement les codes HTTP comme 503,
|
| 283 |
+
# mais lève des exceptions `APIError` ou `ResourceExhaustedError` qui correspondent
|
| 284 |
+
# à des erreurs de service. Nous allons intercepter l'exception générique
|
| 285 |
+
# pour capturer toutes les erreurs potentielles liées à l'appel.
|
| 286 |
+
|
| 287 |
for attempt in range(MAX_RETRIES):
|
| 288 |
try:
|
| 289 |
+
print(f" 📞 Tentative d'appel Gemini #{attempt + 1}...")
|
| 290 |
+
# L'API Python de Google lève des exceptions `APIError` pour les échecs,
|
| 291 |
+
# y compris ceux qui correspondent aux 5xx.
|
| 292 |
response = gemini_client.models.generate_content(
|
| 293 |
model=GEMINI_MODEL,
|
| 294 |
contents=f"{system_prompt}\n\n{rag_prompt}"
|
| 295 |
)
|
| 296 |
+
# Si la réponse réussit, on sort de la boucle
|
| 297 |
return response.text.replace("*", "")
|
| 298 |
+
|
| 299 |
except Exception as e:
|
| 300 |
+
# Ici, on capture toute erreur d'API ou de connexion.
|
| 301 |
+
# On considère cela comme une erreur de service transitoire pour les réessais.
|
| 302 |
error_message = str(e)
|
| 303 |
+
print(f" ❌ Erreur Gemini (Tentative {attempt + 1}/{MAX_RETRIES}): {error_message}")
|
| 304 |
+
|
| 305 |
+
if attempt < MAX_RETRIES - 1:
|
| 306 |
+
# Si ce n'est pas la dernière tentative, on attend avant de réessayer
|
| 307 |
+
sleep_time = 2 # Attente de 2 secondes
|
| 308 |
+
print(f" 😴 Attente de {sleep_time} secondes avant de réessayer...")
|
| 309 |
+
time.sleep(sleep_time)
|
| 310 |
else:
|
| 311 |
+
# Dernière tentative échouée
|
| 312 |
+
print(" 🛑 Toutes les tentatives de réessai ont échoué.")
|
| 313 |
+
return f"Erreur fatale après {MAX_RETRIES} tentatives: {error_message}"
|
| 314 |
+
|
| 315 |
+
# Ne devrait jamais être atteint, mais par sécurité
|
| 316 |
+
return "Erreur inconnue dans la boucle de réessai de Gemini."
|
|
|
|
| 317 |
|
| 318 |
# ======================================================================
|
| 319 |
# ANSWER PROCESS
|
|
|
|
| 399 |
# Génère prompt RAG
|
| 400 |
rag_prompt = get_answer(query_text, collection, model_paraphrase, model_cross_encoder, history)
|
| 401 |
|
| 402 |
+
# Appelle Gemini
|
| 403 |
response = call_gemini(rag_prompt, system_prompt, gemini_client)
|
| 404 |
|
| 405 |
# Sauvegarde réponse
|