MathieuGAL commited on
Commit
2b9788e
·
verified ·
1 Parent(s): e2ec423

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +33 -22
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 AVEC RETRY
279
  # ======================================================================
280
-
281
  def call_gemini(rag_prompt, system_prompt, gemini_client):
282
- """Appelle Google Gemini avec retry automatique en cas d'erreur 503."""
 
 
 
 
 
 
 
 
 
 
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
- # Vérifie si c'est une erreur 503
293
- if "503" in error_message or "Service Unavailable" in error_message:
294
- print(f"⚠️ Erreur 503 détectée (tentative {attempt + 1}/{MAX_RETRIES}). Nouvelle tentative dans {RETRY_DELAY}s...")
295
- if attempt < MAX_RETRIES - 1: # Pas de sleep à la dernière tentative
296
- time.sleep(RETRY_DELAY)
297
- continue
 
298
  else:
299
- # Si ce n'est pas une erreur 503, on arrête et on retourne l'erreur
300
- print(f" Erreur Gemini (non-503): {e}")
301
- return f"Erreur: {str(e)}"
302
-
303
- # Si on arrive ici, c'est qu'on a épuisé toutes les tentatives
304
- print(f" Échec après {MAX_RETRIES} tentatives")
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 avec retry automatique
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