File size: 5,846 Bytes
c76b52d
 
5771329
c76b52d
68acb68
c76b52d
 
7638888
5771329
 
 
d6ece0d
5771329
c76b52d
d6ece0d
68acb68
 
 
 
 
 
 
 
 
 
 
 
 
c76b52d
68acb68
 
 
 
c76b52d
 
d6ece0d
 
c76b52d
d6ece0d
c76b52d
68acb68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d6ece0d
 
 
68acb68
 
 
 
 
d6ece0d
68acb68
d6ece0d
 
68acb68
 
c76b52d
68acb68
 
 
 
 
c76b52d
68acb68
 
c76b52d
d6ece0d
 
 
 
 
 
 
 
 
 
 
 
 
 
2c0a8da
d6ece0d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7638888
 
d6ece0d
 
 
 
7638888
 
 
 
d6ece0d
7638888
 
 
d6ece0d
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#coding: utf-8
from os import getenv
from typing import Optional
import requests
import streamlit as st

from openai import OpenAI

def detect_language(input_text: str, 
                    temperature: Optional[float] = 0.2, 
                    context_window: Optional[int] = 128,
                    model: Optional[str] = "gpt-4o-mini"
                    ) -> str:
    """
    Détecte la langue d'un texte donné avec une vérification croisée si doute.

    Args:
        input_text (str): Le texte dont la langue doit être détectée.
        temperature (Optional[float]): Paramètre de température pour l'API. Par défaut 0.2.
        context_window (Optional[int]): Taille de la fenêtre de contexte. Par défaut 128.
        model (Optional[str]): Modèle à utiliser. Par défaut "gpt-4o-mini".

    Returns:
        str: Code de langue ISO-639-1 détecté.

    Raises:
        ValueError: Si le texte est vide ou invalide.
        requests.RequestException: Si une erreur de communication avec l'API se produit.
    """
    if not input_text or not isinstance(input_text, str):
        st.error("Erreur : Le texte à analyser est vide ou invalide")
        return "en"  # Fallback sur l'anglais par défaut

    system_prompt = (
        "Agissez comme une fonction de détection de langue. "
        "Fournissez la langue d'entrée au format ISO-639-1. "
        "Si vous avez un doute ou une incertitude, indiquez 'doute'."
    )
    
    try:
        # Vérifier la clé API
        api_key = getenv("OPENAI_API_KEY")
        if not api_key:
            raise ValueError("Clé API OpenAI non trouvée dans les variables d'environnement")

        client = OpenAI(api_key=api_key)

        # Appel à l'API avec gestion du timeout
        try:
            response = client.chat.completions.create(
                model=model,
                temperature=temperature,
                messages=[
                    {
                        "role": "system",
                        "content": system_prompt
                    },
                    {
                        "role": "user",
                        "content": input_text
                    }
                ],
                max_tokens=context_window,
                timeout=10  # Timeout de 10 secondes
            )
        except requests.Timeout:
            st.warning("Délai d'attente dépassé pour la détection de langue, utilisation du modèle de secours")
            return call_precise_language_model(input_text)

        if not response or not response.choices:
            raise ValueError("Réponse invalide de l'API")

        detected_language = response.choices[0].message.content.strip()

        # Vérification de la validité du code de langue
        if not detected_language or len(detected_language) < 2:
            raise ValueError("Code de langue invalide reçu de l'API")

        # Si le modèle indique un doute, faire appel à un modèle plus précis
        if "doute" in detected_language.lower():
            st.info("Doute sur la détection de langue, utilisation du modèle de secours")
            return call_precise_language_model(input_text)

        return detected_language

    except requests.RequestException as e:
        st.error(f"Erreur de communication avec l'API : {e}")
        return "en"  # Fallback sur l'anglais
    except ValueError as e:
        st.error(f"Erreur de configuration : {e}")
        return "en"  # Fallback sur l'anglais
    except Exception as e:
        st.error(f"Erreur inattendue lors de la détection de la langue : {e}")
        return "en"  # Fallback sur l'anglais

def call_precise_language_model(input_text: str) -> str:
    """
    Appelle un second modèle plus précis pour vérifier la langue en cas de doute.
    """
    precise_prompt = (
        "Agissez comme un détecteur de langue très précis. "
        "Fournissez la langue d'entrée au format ISO-639-1. "
    )
    
    try:
        client = OpenAI(api_key=getenv("OPENAI_API_KEY"))

        # Modèle plus précis
        response = client.chat.completions.create(
            model="gpt-4o",  # Un modèle plus lourd et précis
            temperature=0.1,
            messages=[
                {
                    "role": "system",
                    "content": precise_prompt
                },
                {
                    "role": "user",
                    "content": input_text
                }
            ],
            max_tokens=128
        )

        precise_language = response.choices[0].message.content.strip()
        return precise_language

    except Exception as e:
        raise ValueError(f"Erreur lors de la vérification précise de la langue : {str(e)}")


if __name__ == "__main__":
    input_text = "Bonjour, comment ça va ?"
    detected_language = detect_language(input_text)
    print(f"La langue détectée est : {detected_language}")

    input_text = "Hello, how are you?"
    detected_language = detect_language(input_text)
    print(f"La langue détectée est : {detected_language}")

    input_text = "Hola, ¿cómo estás?"
    detected_language = detect_language(input_text)
    print(f"La langue détectée est : {detected_language}")

    # maintenant des entrees plus longues, mais surtout plus ambigues, il faut comprendre la langue meme si le texte est ambigu ou melange des mots mirroirs ou des mots provenant de plusieurs langues

    input_text = "Cool raoul, j'y peut rien man, c'est la vie, c'est comme ça"
    detected_language = detect_language(input_text)
    print(f"La langue détectée est : {detected_language}")

    input_text = "Bordel de merde, le cousin s'est fait choper par les flics avec du shit sur lui."
    detected_language = detect_language(input_text)
    print(f"La langue détectée est : {detected_language}")