File size: 6,749 Bytes
f9a4061
 
 
 
 
 
 
 
 
 
 
ee28809
f9a4061
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from flask import Flask, render_template, request, jsonify, send_file
import threading
import time
import os
from datetime import datetime
from google import genai
import uuid

app = Flask(__name__)

# Configuration
GOOGLE_API_KEY = "AIzaSyAPXOW7DCXOfGuryt8To1iqUADPzRcVApI"  # Remplacez par votre clé API
MODEL_ID = "gemini-2.5-flash-preview-05-20"  # Ou le modèle que vous utilisez
UPLOAD_FOLDER = 'uploads'
RESULTS_FOLDER = 'results'

# Créer les dossiers s'ils n'existent pas
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
os.makedirs(RESULTS_FOLDER, exist_ok=True)

# Stockage des tâches en cours
tasks = {}

class TaskManager:
    def __init__(self):
        self.tasks = {}
    
    def create_task(self, task_id):
        self.tasks[task_id] = {
            'status': 'running',
            'progress': 0,
            'total': 470,
            'results_file': f'results_{task_id}.txt',
            'start_time': datetime.now(),
            'errors': []
        }
    
    def update_progress(self, task_id, progress):
        if task_id in self.tasks:
            self.tasks[task_id]['progress'] = progress
    
    def add_error(self, task_id, error):
        if task_id in self.tasks:
            self.tasks[task_id]['errors'].append(error)
    
    def complete_task(self, task_id):
        if task_id in self.tasks:
            self.tasks[task_id]['status'] = 'completed'
    
    def get_task(self, task_id):
        return self.tasks.get(task_id)

task_manager = TaskManager()

def generate_synthetic_data(file_path, task_id):
    """Fonction qui exécute les 470 requêtes en arrière-plan"""
    try:
        # Initialiser le client Google AI
        client = genai.Client(api_key=GOOGLE_API_KEY)
        
        # Uploader le fichier
        file_ref = client.files.upload(file=file_path)
        
        # Prompt pour chaque requête
        prompt = ("J'aimerais générer des nouvelles données synthétiques à partir de ça. "
                 "Une fang, une français. Je veux 400 phrases longues.\n\n"
                 "Selon le format : fang :.... / Français :...")
        
        # Fichier de résultats
        results_file = os.path.join(RESULTS_FOLDER, f'results_{task_id}.txt')
        
        with open(results_file, 'w', encoding='utf-8') as f:
            f.write(f"Génération de données synthétiques - Démarré le {datetime.now()}\n")
            f.write("="*60 + "\n\n")
            
            for i in range(470):
                try:
                    # Faire la requête
                    response = client.models.generate_content(
                        model=MODEL_ID,
                        contents=[file_ref, prompt]
                    )
                    
                    # Écrire la réponse dans le fichier
                    f.write(f"--- Requête {i+1}/470 ---\n")
                    f.write(response.text)
                    f.write("\n" + "="*60 + "\n\n")
                    f.flush()  # Forcer l'écriture
                    
                    # Mettre à jour le progrès
                    task_manager.update_progress(task_id, i + 1)
                    
                    print(f"Requête {i+1}/470 complétée")
                    
                    # Pause pour éviter de surcharger l'API
                    time.sleep(1)
                    
                except Exception as e:
                    error_msg = f"Erreur requête {i+1}: {str(e)}"
                    task_manager.add_error(task_id, error_msg)
                    f.write(f"ERREUR - Requête {i+1}: {str(e)}\n")
                    f.write("="*60 + "\n\n")
                    print(error_msg)
        
        task_manager.complete_task(task_id)
        print(f"Tâche {task_id} terminée avec succès")
        
    except Exception as e:
        error_msg = f"Erreur générale: {str(e)}"
        task_manager.add_error(task_id, error_msg)
        print(error_msg)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/upload', methods=['POST'])
def upload_file():
    if 'file' not in request.files:
        return jsonify({'error': 'Aucun fichier sélectionné'}), 400
    
    file = request.files['file']
    if file.filename == '':
        return jsonify({'error': 'Aucun fichier sélectionné'}), 400
    
    if file:
        # Générer un ID unique pour cette tâche
        task_id = str(uuid.uuid4())
        
        # Sauvegarder le fichier
        filename = f"input_{task_id}.txt"
        file_path = os.path.join(UPLOAD_FOLDER, filename)
        file.save(file_path)
        
        # Créer la tâche
        task_manager.create_task(task_id)
        
        # Démarrer le traitement en arrière-plan
        thread = threading.Thread(
            target=generate_synthetic_data, 
            args=(file_path, task_id)
        )
        thread.daemon = True
        thread.start()
        
        return jsonify({
            'task_id': task_id,
            'message': 'Traitement démarré en arrière-plan'
        })

@app.route('/status/<task_id>')
def get_status(task_id):
    task = task_manager.get_task(task_id)
    if not task:
        return jsonify({'error': 'Tâche non trouvée'}), 404
    
    return jsonify({
        'status': task['status'],
        'progress': task['progress'],
        'total': task['total'],
        'percentage': round((task['progress'] / task['total']) * 100, 2),
        'errors_count': len(task['errors']),
        'start_time': task['start_time'].strftime('%Y-%m-%d %H:%M:%S')
    })

@app.route('/download/<task_id>')
def download_results(task_id):
    task = task_manager.get_task(task_id)
    if not task:
        return jsonify({'error': 'Tâche non trouvée'}), 404
    
    results_file = os.path.join(RESULTS_FOLDER, f'results_{task_id}.txt')
    
    if not os.path.exists(results_file):
        return jsonify({'error': 'Fichier de résultats non trouvé'}), 404
    
    return send_file(
        results_file,
        as_attachment=True,
        download_name=f'donnees_synthetiques_{task_id}.txt'
    )

@app.route('/tasks')
def list_tasks():
    """Liste toutes les tâches"""
    task_list = []
    for task_id, task_info in task_manager.tasks.items():
        task_list.append({
            'id': task_id,
            'status': task_info['status'],
            'progress': task_info['progress'],
            'total': task_info['total'],
            'percentage': round((task_info['progress'] / task_info['total']) * 100, 2),
            'start_time': task_info['start_time'].strftime('%Y-%m-%d %H:%M:%S'),
            'errors_count': len(task_info['errors'])
        })
    
    return jsonify(task_list)

if __name__ == '__main__':
    app.run(debug=True, threaded=True)