File size: 25,122 Bytes
3fe712e
ce14cca
3fe712e
c0eca1f
 
3fe712e
c0eca1f
3fe712e
c0eca1f
5ff6e68
c0eca1f
7abca01
c629f00
 
e88a35b
3fe712e
 
 
 
 
c0eca1f
 
 
 
 
505ff54
c0eca1f
 
 
d085759
6758914
c0eca1f
003aab4
3fe712e
43ccf26
3fe712e
3dbe404
3fe712e
 
 
 
 
 
 
 
 
c0eca1f
bbf7982
 
 
d0a8bce
a050348
d0a8bce
a050348
 
 
 
 
3451a4d
a050348
3451a4d
5bc329d
 
31614c5
3451a4d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d0a8bce
c0eca1f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
767e505
 
c0eca1f
4f89adc
c0eca1f
95aea7b
cc46e5a
 
 
4f89adc
95aea7b
4f89adc
 
 
7949d6d
86abdc3
0c6e16f
9729db3
456d5c0
9729db3
 
 
 
 
 
0c6e16f
9729db3
 
 
 
 
 
 
 
51ec059
0fa1a06
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0188838
0fa1a06
 
 
0188838
b5a1316
 
0fa1a06
 
 
0188838
0fa1a06
 
 
 
 
 
0188838
0fa1a06
c3b3af5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e88a35b
 
 
 
 
 
 
c0eca1f
 
7949d6d
c0eca1f
 
 
 
 
 
 
 
 
 
a050348
deef16f
95aea7b
a050348
d9695d6
95aea7b
a050348
505ff54
d9695d6
9948d06
a659c17
 
 
 
 
 
 
3341d9a
 
 
 
 
b1435f0
 
 
 
 
 
 
0c6e16f
 
b1435f0
0c6e16f
 
a659c17
b1435f0
 
 
 
 
7cb9d32
 
 
 
a659c17
b1435f0
 
 
 
3341d9a
 
0fa1a06
3341d9a
0fa1a06
3341d9a
 
 
0c6e16f
7cb9d32
 
c6a24a4
3341d9a
7cb9d32
 
 
 
 
 
b1435f0
d9695d6
 
 
 
003aab4
7a27e9e
f87b7e0
 
0f0a413
f87b7e0
0f0a413
 
f87b7e0
0f0a413
 
f87b7e0
0f0a413
f87b7e0
 
 
0f0a413
f87b7e0
0f0a413
 
 
 
 
 
 
 
 
 
 
 
 
a536ecc
 
 
 
 
 
 
 
 
 
 
 
 
 
b3f6d50
 
693934f
cdaa149
b3f6d50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cdaa149
b3f6d50
0f0a413
f87b7e0
0f0a413
f87b7e0
a536ecc
0f0a413
 
f87b7e0
 
0f0a413
f87b7e0
0f0a413
f87b7e0
 
 
 
 
0f0a413
f87b7e0
003aab4
 
57da3c7
 
c0eca1f
003aab4
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
#load package
from fastapi import FastAPI,HTTPException,status,UploadFile,File,Query
from pydantic import BaseModel
import uvicorn
import logging
import torch
from transformers import T5Tokenizer, T5ForConditionalGeneration,AutoModelForCausalLM,AutoTokenizer
import os
import numpy as np
from openai import OpenAI 
import ollama
import pandas as pd 
# from io import StringIO
import io 
from fastapi.middleware.cors import CORSMiddleware

# Configurer les répertoires de cache
os.environ['TRANSFORMERS_CACHE'] = '/app/.cache'
os.environ['HF_HOME'] = '/app/.cache'
# Charger le modèle et le tokenizer
# model_name = "models/models--t5-base/snapshots/a9723ea7f1b39c1eae772870f3b547bf6ef7e6c1"
# tokenizer = T5Tokenizer.from_pretrained(model_name)
# model = T5ForConditionalGeneration.from_pretrained(model_name)
# model = AutoModelForCausalLM.from_pretrained("THUDM/longwriter-glm4-9b", trust_remote_code=True)
# tokenizer = AutoTokenizer.from_pretrained("THUDM/longwriter-glm4-9b", trust_remote_code=True)
prompt_first ="Résumé en 4 ou 5 phrases de la plainte suivante :"

client = OpenAI(
    base_url="https://integrate.api.nvidia.com/v1",
    # api_key="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"
    api_key="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"
)
 
#Additional information
origins = ["*"]
Informations = """ 
-text : Texte à resumé  

output:
- Text summary : texte resumé
"""

app =FastAPI(
    title='Text Summary',
    description =Informations
)  
  
#class to define the input text 
logging.basicConfig(level=logging.INFO)
logger =logging.getLogger(__name__)
prompt_chat = """
Rédige un résumé structuré et concis de la plainte suivante. Va directement au résumé sans ajouter d’introduction ou de phrase comme "Résumé de la situation". Concentre-toi sur ces éléments essentiels :

1. **Problème signalé** : Mentionne le client affecté, son numéro, la localisation et les détails du problème.
2. **Dates clés** : Liste les étapes importantes dans le traitement de la plainte.
3. **Acteurs impliqués** : Identifie les personnes et équipes ayant participé au traitement.
4. **Résolution** : Explique si le problème a été résolu et comment.
5. **Recommandations** : Fournis des actions concrètes pour éviter que le problème ne se reproduise.

Fournis directement le résumé sous forme de texte continu et structuré, sans introduction ni phrase générique. Rédige de manière concise et professionnelle.

"""
plt_prompt ="""
Résumer la plainte de manière claire et concise, présentant les faits avérés,évaluant la rapidité et l'efficacité de la résolution et formulant une recommandation pour améliorer la satisfaction client, sans utiliser de phrases génériques ou de formules standard.Donner uniquement les informations précises requis, telles que le nom du client, le numéro de téléphone,la date et l'heure de signalisation de la plainte, la description du souci ou du problème rencontré,les interventions ou les étapes entreprises pour résoudre le problème, la date et l'heure de résolution ou de clôture de la plainte.Merci de rendre la réponse précise, humaine, et orientée vers des actions concrètes.
"""
prompt_ameliorer ="""
Bonjour,

En tant qu’expert dans la gestion et le traitement de plaintes réseaux chez un opérateur de télécommunications, rédige un descriptif clair de la situation concernant la plainte dont les informations sont fournies plus bas. La description doit inclure les éléments suivants :

1. **Résumé de la situation en 4 ou 5 phrases claires et concises** comme si tu t’adressais à un humain.
2. **Identification du véritable client affecté** (et non les intermédiaires) en incluant ses informations clés comme le numéro de téléphone, la localisation, et les soucis rencontrés.
3. Les **dates clés** de la plainte et les actions prises par les équipes impliquées.
4. Les **délais associés à la résolution** du problème ou les éventuels retards.
5. Des **recommandations concrètes** pour résoudre efficacement la plainte et éviter tout mécontentement du client.

Les informations supplémentaires sont :
- Les acteurs impliqués (comme Mohamed SARR, Alioune GUEYE, etc.) doivent être mentionnés uniquement pour préciser leurs rôles dans le traitement.
- **Les informations essentielles sur le client doivent être tirées du champ “NUMERO CLIENT” ou de sections similaires** précisant directement le client affecté.

Merci de rendre la réponse précise, humaine, et orientée vers des actions concrètes.
Attention : Tu dois aller droit au but en évitant les phrases génériques comme “Voici une description claire de la situation”. Concentre-toi uniquement sur le résumé et les actions nécessaires.

"""
default_prompt = """Bonjour,
en tant qu’expert dans la gestion et le traitement de plaintes réseaux chez un opérateur de télécommunications, fais moi un descriptif clair de la situation concernant la plainte dont les informations sont fournies plus bas dans ce message. Ecris la situation en 4 ou 5 phrases claires et concises, fais comme si tu parlais à un humain et rajoutes les informations relatives au Client pour une meilleure connaissance de ce dernier ainsi que des éléments de dates/délais pour être précis sur le traitement de la plainte. N’hésites pas à innover sur le ton à utiliser car n’oublies pas que tu dois faire comme si tu parlais à un humain. Ce ton peut être adapté et ne pas toujours être le même en fonction des cas.
Pour m’éviter de lire tout le détail de la plainte (voir le texte partagé plus bas), essayes de trouver toutes les informations utiles permettant de mieux appréhender la situation, par exemple : si les coordonnées GPS (Lat, Lon) sont disponibles essayes de m'indiquer le lieu où est survenue la plainte même de manière approximative. Essayes également de glaner sur internet toutes les informations pouvant aider à mieux comprendre et traiter la plainte (cela peut inclure des informations des réseaux sociaux, des concurrents, etc.) tout en priorisant dans l’analyse les informations fournies dans le texte plus bas; informations qui ont été renseignées par les experts internes chez l’opérateur de télécommunications en question et qui sont structurées en plusieurs sections :
a) Un titre de la plainte
b) Une section avec les Détails de la Plainte contenant l’objet, le numéro client, l’expéditeur, la date de création, les coordonnées géographiques (lat, lon)
c) Une section avec les états d’avancement incluant les échanges (sous format chat) entre les différents acteurs impliqués dans le traitement de la plainte
d) Une section contenant les éléments relatifs à la qualification de la plainte (type de plainte, origine, domaine, sous-domaine, etc…)
e) Une section avec les fichiers joints à la plainte et autres pièces jointes pour mieux comprendre et trouver une solution à cette plainte en vue de satisfaire le Client
 
Dans la situation que tu vas me donner (en quelques 4 ou 5 phrases comme si tu t’adresses à un humain), assures toi que les points cruciaux (voire rédhibitoires) ci-dessous sont bien présents :
1) Ecris la situation en 4 ou 5 phrases claires et concises, fais comme si tu parlais à un humain
2) Rajoutes les informations relatives au Client pour être précis sur la connaissance de ce dernier.
3) Rajoutes des éléments de dates (remontée, transfert, prise en charge, résolution, clôture, etc…) ainsi que les délais (par exemple de réponse des différents acteurs ou experts de la chaine de traitement) pour mieux apprécier l'efficacité du traitement de la plainte.
4) Rajoutes à la fin une recommandation importante afin d'éviter le mécontentement du Client par exemple pour éviter qu’une Plainte ne soit clôturée sans solution pour le Client notamment et à titre illustratif seulement dans certains cas pour un Client qui a payé pour un service et ne l'a pas obtenu, On ne peut décemment pas clôturer sa plainte sans solution en lui disant d’être plus vigilant, il faut recommander à l’équipe en charge de la plainte de le rembourser ou de trouver un moyen de donner au Client le service pour lequel il a payé (à défaut de le rembourser).
5) N’hésites pas à innover sur le ton à utiliser car n’oublies pas que tu dois faire comme si tu parlais à un humain. Ce ton peut être adapté et ne pas toujours être le même en fonction des cas.
Attention : Tu dois aller droit au but en évitant les phrases génériques comme “Voici une description claire de la situation”. Concentre-toi uniquement sur le résumé et les actions nécessaires.

"""

instructions_par_defaut = (
        "Fais moi un résumé détaillé en 3 ou 4 prhases de ce plainte concise et sous forme de texte brut directemen sans utiliser de structures comme JSON  ou des gras ou des listes formelles: "
        "1. Objet de la plainte. "
        "2. Détails incluant le numéro client, le problème et les dates importantes. "
        "3. Actions prises et suivis incluant les dates et les personnes impliquées. "
        "4. Toute action supplémentaire ou Donne des recommandations nécessaire si neccesaire"
        "Pas besoins d'enumerer les etapes donne directement le résumé"
        "fais comme si tu parlais à un humain,sois professionel et concise aussi"
        "Evite toute introduction générique comme la répétiton du prompt comme 'voici un résumé détaillé de la plainte en 4 phrases' donne directement le résumé"

    )
DEFAULT_PROMPT1 = "Résumez la plainte suivante en 5 phrases concises, en vous concentrant sur les faits principaux ,Rajoutes les informations relatives au Client pour être précis sur la connaissance de ce dernier,Rajoutes des éléments de dates (remontée, transfert, prise en charge, résolution, clôture, etc…) ainsi que les délais (par exemple de réponse des différents acteurs ou experts de la chaine de traitement) pour mieux apprécier l'efficacité du traitement de la plainte,Rajoutes à la fin une recommandation importante afin d'éviter le mécontentement du Client par exemple pour éviter qu’une Plainte ne soit clôturée sans solution pour le Client notamment et à titre illustratif seulement dans certains cas pour un Client qui a payé pour un service,fais comme si tu parlais à un humain et ne l'a pas obtenu,et en évitant toute introduction générique comme la répétiton du prompt  : "
prompt1 = """
Tu es un assistant IA chargé d'analyser qualitativement les plaintes clients sur plusieurs domaines, en te concentrant sur une seule semaine. Les données fournies incluent des plaintes clients avec des informations sur le statut, le domaine, et des détails descriptifs. Ton objectif est de fournir une analyse détaillée prenant en compte :

1. La répartition des plaintes par statut (FERMÉ, EN COURS, TRANSFÉRÉ, etc.) dans chaque domaine pour la semaine spécifiée.
2. Le temps moyen de traitement des plaintes par statut durant cette semaine.
3. Les intervenants les plus fréquents dans la résolution des plaintes pour cette semaine.
4. Les actions concrètes menées pour résoudre les plaintes cette semaine.
5. Les problèmes récurrents observés dans les plaintes cette semaine (réception, facturation, réseau, etc.).
6. Des recommandations pour améliorer la gestion des plaintes et résoudre les problèmes identifiés pour cette semaine.

Voici un exemple d'information :
- Domaine : "Domaine général" (par ex. MOBILE, FIXE, etc.).
- Statut : "FERMÉ", "EN COURS", "TRANSFÉRÉ".
- Détails de la plainte : erreurs, problème de service, etc.
- Intervenants : équipes techniques, support client, etc.
- Temps de traitement moyen par statut (uniquement pour la semaine en question).

Génère une analyse qualitative complète pour chaque domaine et statut en prenant en compte ces informations pour une seule semaine.
"""
prompt_month = """
        Analyse des plaintes par mois :

        **Résumé général du mois :**

        - Période : [Mois et Année]

        **Répartition des plaintes par domaine :**

        - Domaine [Nom du domaine] :
          - Total des plaintes : [Nombre total de plaintes]
          - Statuts des plaintes :
            - En cours : [Nombre]
            - Transférées : [Nombre]
            - Fermées : [Nombre]
            - Non pris en charge : [Nombre]
            - Autres statuts : [Nombre]

        **Problèmes récurrents observés ce mois-ci :**

        - lister 1 à 2 probléme les plus fréquents 

        **Actions entreprises :**

        - lister les actions entrepris
        -Le temps moyen de traitement des plaintes par statut durant cette semaine.
        -Les intervenants les plus fréquents dans la résolution des plaintes pour ce mois-ci

        **Recommandations pour améliorer la gestion des plaintes :**

        1.faites des recommendations

        En résumé, voici les principales tendances et recommandations pour améliorer la gestion des plaintes et résoudre les problèmes identifiés ce mois-ci.

        ---

        Utilisez ces informations pour améliorer la qualité du service et optimiser la gestion des plaintes.
        et surtout n'oublie pas tu vas parler comme un être humain
        """
default_ameliore ="""
Bonjour,
en tant qu’expert dans la gestion et le traitement de plaintes réseaux chez un opérateur de télécommunications, fais moi un descriptif clair de la situation concernant la plainte dont les informations sont fournies plus bas dans ce message. Ecris la situation en 4 ou 5 phrases claires et concises, fais comme si tu parlais à un humain et rajoutes les informations relatives au Client pour une meilleure connaissance de ce dernier ainsi que des éléments de dates/délais pour être précis sur le traitement de la plainte. N’hésites pas à innover sur le ton à utiliser car n’oublies pas que tu dois faire comme si tu parles à un humain. Ce ton peut être adapté et ne pas toujours être le même en fonction des cas.
Pour m’éviter de lire tout le détail de la plainte (voir le texte partagé plus bas), essayes de trouver toutes les informations utiles permettant de mieux appréhender la situation, par exemple : si les coordonnées GPS (Lat, Lon) sont disponibles essayes de m'indiquer le lieu où est survenue la plainte même de manière approximative. Essayes également de glaner sur internet toutes les informations pouvant aider à mieux comprendre et traiter la plainte (cela peut inclure des informations des réseaux sociaux, des concurrents, etc.) tout en priorisant dans l’analyse les informations fournies dans le texte plus bas; informations qui ont été renseignées par les experts internes chez l’opérateur de télécommunications en question et qui sont structurées en plusieurs sections :
a)	Un titre de la plainte
b)	Une section avec les Détails de la Plainte contenant l’objet, le numéro client, l’expéditeur, la date de création, les coordonnées géographiques (lat, lon)
c)	Une section avec les états d’avancement incluant les échanges (sous format chat) entre les différents acteurs impliqués dans le traitement de la plainte
d)	Une section contenant les éléments relatifs à la qualification de la plainte (type de plainte, origine, domaine, sous-domaine, etc…)
e)	Une section avec les fichiers joints à la plainte et autres pièces jointes pour mieux comprendre et trouver une solution à cette plainte en vue de satisfaire le Client

Dans la situation que tu vas me donner (en quelques 4 ou 5 phrases comme si tu t’adresses à un humain), assures toi que les points cruciaux (voire rédhibitoires) ci-dessous sont bien présents :
1)	Ecris la situation en 4 ou 5 phrases claires et concises, fais comme si tu parlais à un humain 
2)	Rajoutes les informations relatives au Client pour être précis sur la connaissance de ce dernier. 
3)	Rajoutes des éléments de dates (remontée, transfert, prise en charge, résolution, clôture, etc…) ainsi que les délais (par exemple de réponse des différents acteurs ou experts de la chaine de traitement) pour mieux apprécier l'efficacité du traitement de la plainte.
4)	Rajoutes à la fin une recommandation importante afin d'éviter le mécontentement du Client par exemple pour éviter qu’une Plainte ne soit clôturée sans solution pour le Client notamment et à titre illustratif seulement dans certains cas pour un Client qui a payé pour un service et ne l'a pas obtenu, On ne peut décemment pas clôturer sa plainte sans solution en lui disant d’être plus vigilant, il faut recommander à l’équipe en charge de la plainte de le rembourser ou de trouver un moyen de donner au Client le service pour lequel il a payé (à défaut de le rembourser).
5)	N’hésites pas à innover sur le ton à utiliser car n’oublies pas que tu dois faire comme si tu parlais à un humain. Ce ton peut être adapté et ne pas toujours être le même en fonction des cas.
Attention : Tu dois aller droit au but en évitant les phrases génériques comme “Voici une description claire de la situation”. Concentre-toi uniquement sur le résumé et les actions nécessaires.

Voici les informations brutes à considérer pour cette plainte :
"""
app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)
class TextSummary(BaseModel): 
    prompt:str 
    
@app.get("/")
async def home():
    return 'STN BIG DATA'
# Fonction pour générer du texte à partir d'une requête
# Modèle pour la requête
class RequestModel(BaseModel):
    text: str

@app.post("/generate/")
async def generate_text(request: RequestModel):
    messages = [
    {"role": "system", "content": "Vous êtes un assistant utile."},
    {"role": "user", "content": instructions_par_defaut + request.text}
    ]
    completion = client.chat.completions.create(
        model="nvidia/llama-3.1-nemotron-70b-instruct", 
        messages=messages,
        # max_tokens=1024, 
        stream=True
    )
  
    generated_text = ""
    for chunk in completion:
        if chunk.choices[0].delta.content is not None:
            generated_text += chunk.choices[0].delta.content

    return {"summary_text_2": generated_text}
@app.post("/analyse/")
async def generate_text(
    period: str = Query(..., description="Choisissez entre 'semaine' ou 'mois'"),
    file: UploadFile = File(...)):
    
    # Check file size
    contents = await file.read()
    file_size = len(contents)
    
    if file_size > 5_000_000:  # 5MB limit
        return {"error": "File size exceeds the 5MB limit. The file will be sampled."}

    # Read the uploaded CSV file
    try:
        df = pd.read_csv(io.StringIO(contents.decode('utf-8')))
    except Exception as e:
        return {"error": f"Error reading CSV file: {str(e)}"}

    # Sample the data if it's too large
    if len(df) > 1000:  # Adjust this number based on your needs
        df = df.sample(n=100, random_state=42)

    # Convert the DataFrame to a string
    try:
        text_to_generate = df.to_string(index=False)
    except Exception as e:
        return {"error": f"Error converting DataFrame to string: {str(e)}"}

    # Ensure the generated text is within size limits
    if len(text_to_generate.encode('utf-8')) > 5_000_000:
        return {"error": "Generated text exceeds size limit even after sampling. Please reduce the data further."}

    # Define the appropriate prompt based on the period (week or month)
    if period == "semaine":
            prompt = prompt1
    elif period == "mois":
            prompt = prompt_month
    else:
        return {"error": "Invalid period. Choose either 'semaine' or 'mois'."}

    # Create the request for the API
    try:
        completion = client.chat.completions.create(
            model="mistralai/mistral-7b-instruct-v0.3", 
            messages=[{"role": "user", "content": prompt + text_to_generate}],
            temperature=0.2,
            top_p=0.9,
            stream=True
        )
    except Exception as e:
        return {"error": f"Error generating text: {str(e)}"}

    generated_text = ""
    for chunk in completion:
        if chunk.choices[0].delta.content is not None:
            generated_text += chunk.choices[0].delta.content

    return {"summary_text_2": generated_text}
@app.post("/analyse_globale/")
async def generate_global_analysis(file: UploadFile = File(...)):
    # Lire le fichier téléchargé
    contents = await file.read()

    # Vérification de la taille du fichier
    file_size = len(contents)
    if file_size > 5_000_000:  # Limite de 5 Mo
        return {"error": "La taille du fichier dépasse la limite de 5 Mo. Le fichier sera échantillonné."}

    # Lire le fichier CSV téléchargé
    try:
        df = pd.read_csv(io.StringIO(contents.decode('utf-8')))
    except Exception as e:
        return {"error": f"Erreur lors de la lecture du fichier CSV : {str(e)}"}

    # Échantillonner les données si elles sont trop grandes
    if len(df) > 1000:  # Ajustez ce nombre selon vos besoins
        df = df.sample(n=500, random_state=42)
    # Convertir le DataFrame en chaîne de caractères
    try:
        text_to_generate = df.to_string(index=False)
    except Exception as e:
        return {"error": f"Erreur lors de la conversion du DataFrame en chaîne : {str(e)}"}

    # S'assurer que le texte généré est dans les limites de taille
    if len(text_to_generate.encode('utf-8')) > 5_000_000:
        return {"error": "Le texte généré dépasse la limite de taille même après échantillonnage. Veuillez réduire davantage les données."}
    # Groupement des données par domaine
    domain_analyses = ""
    for domain, group in df.groupby('DOMAINE'):
        domain_summary = group.groupby('STATUT').size().to_dict()
        domain_analysis = f"""
        - Domaine "{domain}" :
          - Total des plaintes : {len(group)}
          - Répartition par statut :
            - En cours : {domain_summary.get('EN COURS', 0)}
            - Transférées : {domain_summary.get('TRANSFERE', 0)}
            - Fermées : {domain_summary.get('FERME', 0)}
            - Non pris en charge : {domain_summary.get('NON PRIS EN CHARGE', 0)}
            - Autres statuts : {sum(v for k, v in domain_summary.items() if k not in ['EN COURS', 'TRANSFERE', 'FERME', 'NON PRIS EN CHARGE'])}
        """
        domain_analyses += domain_analysis
    total_plaintes = len(df)

    # Définir le prompt de l'analyse globale
    prompt_global = f"""
        Je te fournis un tableau détaillant les plaintes classées par domaine et par statut. Voici les informations :
        Affiche ces informations d'abord:
        - Nombre totale plaintes{domain_analyses}
    
        - Nombre total de plaintes : {total_plaintes}
    
        Fais moi une analyse qualitative détaillée des plaintes selon ces critères :
        1. Résume les problèmes les plus fréquents par domaine en fonction des différents statuts (EN COURS, TRANSFERE, FERME, etc.).
        2. Pour chaque domaine, identifie les tendances importantes, telles que les augmentations ou diminutions du nombre de plaintes selon les statuts.
        3. Propose des recommandations spécifiques pour chaque domaine où le nombre de plaintes 'EN COURS' ou 'TRANSFERE' est élevé.
        4. Analyse les progrès dans les domaines où un nombre significatif de plaintes a été 'FERME' récemment.
        5. Fournis une analyse des plaintes par statut pour chaque domaine, en mettant en évidence les problèmes les plus critiques et les domaines qui nécessitent une attention particulière.
        6. Propose des suggestions concrètes pour améliorer le traitement des plaintes, réduire les délais de résolution, et améliorer la satisfaction des clients.
    
        Merci de fournir une analyse professionnelle, concise et axée sur les données.
        Utilisez ces informations pour améliorer la qualité du service et optimiser la gestion des plaintes.
        """
    # Création de la requête pour l'API (exemple avec un modèle fictif)
    try:
        # Remplacez cette partie par la logique spécifique à votre API
        completion = client.chat.completions.create(
            model="meta/llama-3.1-8b-instruct",
            messages=[{"role": "user", "content": prompt_global.format(domain_analyses=domain_analyses) + text_to_generate}],
            temperature=0.2, top_p=0.9, stream=True
        )
    except Exception as e:
        return {"error": f"Erreur lors de la génération du texte : {str(e)}"}

    # Récupération du texte généré
    generated_text = ""
    for chunk in completion:
        if chunk.choices[0].delta.content is not None:
            generated_text += chunk.choices[0].delta.content

    # Retour du texte généré
    return {"global_analysis_text": generated_text}
if __name__ == "__main__":
    uvicorn.run("app:app",reload=True)