0x07CB commited on
Commit
68acb68
·
unverified ·
1 Parent(s): 5de0e95

refactor: Amélioration de la robustesse de la détection de langue avec gestion des erreurs et fallback

Browse files
Files changed (1) hide show
  1. core/DetectLanguage.py +63 -25
core/DetectLanguage.py CHANGED
@@ -2,6 +2,7 @@
2
  from os import getenv
3
  from typing import Optional
4
  import requests
 
5
 
6
  from openai import OpenAI
7
 
@@ -12,7 +13,24 @@ def detect_language(input_text: str,
12
  ) -> str:
13
  """
14
  Détecte la langue d'un texte donné avec une vérification croisée si doute.
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  """
 
 
 
 
16
  system_prompt = (
17
  "Agissez comme une fonction de détection de langue. "
18
  "Fournissez la langue d'entrée au format ISO-639-1. "
@@ -20,40 +38,60 @@ def detect_language(input_text: str,
20
  )
21
 
22
  try:
23
- client = OpenAI(api_key=getenv("OPENAI_API_KEY"))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
 
25
- response = client.chat.completions.create(
26
- model=model,
27
- temperature=temperature,
28
- messages=[
29
- {
30
- "role": "system",
31
- "content": system_prompt
32
- },
33
- {
34
- "role": "user",
35
- "content": input_text
36
- }
37
- ],
38
- max_tokens=context_window
39
- )
40
 
41
  detected_language = response.choices[0].message.content.strip()
42
 
43
- # Si le modèle indique un doute, faire appel à un modèle plus précis ou à un autre service de vérification
 
 
 
 
44
  if "doute" in detected_language.lower():
45
- print("[INFO] - (detect_language) : Doute détecté, appel d'un modèle plus précis.")
46
  return call_precise_language_model(input_text)
47
 
48
- if detected_language:
49
- return detected_language
50
- else:
51
- raise ValueError("La réponse de l'API est vide ou invalide.")
52
-
53
  except requests.RequestException as e:
54
- raise requests.RequestException(f"Erreur de communication avec l'API : {str(e)}")
 
 
 
 
55
  except Exception as e:
56
- raise ValueError(f"Erreur inattendue lors de la détection de la langue : {str(e)}")
 
57
 
58
  def call_precise_language_model(input_text: str) -> str:
59
  """
 
2
  from os import getenv
3
  from typing import Optional
4
  import requests
5
+ import streamlit as st
6
 
7
  from openai import OpenAI
8
 
 
13
  ) -> str:
14
  """
15
  Détecte la langue d'un texte donné avec une vérification croisée si doute.
16
+
17
+ Args:
18
+ input_text (str): Le texte dont la langue doit être détectée.
19
+ temperature (Optional[float]): Paramètre de température pour l'API. Par défaut 0.2.
20
+ context_window (Optional[int]): Taille de la fenêtre de contexte. Par défaut 128.
21
+ model (Optional[str]): Modèle à utiliser. Par défaut "gpt-4o-mini".
22
+
23
+ Returns:
24
+ str: Code de langue ISO-639-1 détecté.
25
+
26
+ Raises:
27
+ ValueError: Si le texte est vide ou invalide.
28
+ requests.RequestException: Si une erreur de communication avec l'API se produit.
29
  """
30
+ if not input_text or not isinstance(input_text, str):
31
+ st.error("Erreur : Le texte à analyser est vide ou invalide")
32
+ return "en" # Fallback sur l'anglais par défaut
33
+
34
  system_prompt = (
35
  "Agissez comme une fonction de détection de langue. "
36
  "Fournissez la langue d'entrée au format ISO-639-1. "
 
38
  )
39
 
40
  try:
41
+ # Vérifier la clé API
42
+ api_key = getenv("OPENAI_API_KEY")
43
+ if not api_key:
44
+ raise ValueError("Clé API OpenAI non trouvée dans les variables d'environnement")
45
+
46
+ client = OpenAI(api_key=api_key)
47
+
48
+ # Appel à l'API avec gestion du timeout
49
+ try:
50
+ response = client.chat.completions.create(
51
+ model=model,
52
+ temperature=temperature,
53
+ messages=[
54
+ {
55
+ "role": "system",
56
+ "content": system_prompt
57
+ },
58
+ {
59
+ "role": "user",
60
+ "content": input_text
61
+ }
62
+ ],
63
+ max_tokens=context_window,
64
+ timeout=10 # Timeout de 10 secondes
65
+ )
66
+ except requests.Timeout:
67
+ st.warning("Délai d'attente dépassé pour la détection de langue, utilisation du modèle de secours")
68
+ return call_precise_language_model(input_text)
69
 
70
+ if not response or not response.choices:
71
+ raise ValueError("Réponse invalide de l'API")
 
 
 
 
 
 
 
 
 
 
 
 
 
72
 
73
  detected_language = response.choices[0].message.content.strip()
74
 
75
+ # Vérification de la validité du code de langue
76
+ if not detected_language or len(detected_language) < 2:
77
+ raise ValueError("Code de langue invalide reçu de l'API")
78
+
79
+ # Si le modèle indique un doute, faire appel à un modèle plus précis
80
  if "doute" in detected_language.lower():
81
+ st.info("Doute sur la détection de langue, utilisation du modèle de secours")
82
  return call_precise_language_model(input_text)
83
 
84
+ return detected_language
85
+
 
 
 
86
  except requests.RequestException as e:
87
+ st.error(f"Erreur de communication avec l'API : {e}")
88
+ return "en" # Fallback sur l'anglais
89
+ except ValueError as e:
90
+ st.error(f"Erreur de configuration : {e}")
91
+ return "en" # Fallback sur l'anglais
92
  except Exception as e:
93
+ st.error(f"Erreur inattendue lors de la détection de la langue : {e}")
94
+ return "en" # Fallback sur l'anglais
95
 
96
  def call_precise_language_model(input_text: str) -> str:
97
  """