Docfile commited on
Commit
b156c6b
·
verified ·
1 Parent(s): df36903

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +64 -17
app.py CHANGED
@@ -174,11 +174,9 @@ L'analyse devra respecter la structure suivante :
174
 
175
  5- Ne fais pas de conclusion
176
 
177
- Réponds en français
178
-
179
  """
180
 
181
-
182
  prompt_redaction = """
183
  III - LE COMMENTAIRE COMPOSÉ
184
 
@@ -233,8 +231,6 @@ En parlant de ... (sous-axe 2), l'auteur met l'accent en premier sur… (interpr
233
  Ainsi, ... (axe 2) est lié (e) à ... (sous-axe 1) et à ... (sous-axe 2).
234
 
235
  Somme toute, ... (titre du texte) organise son sens autour de … (axe 1) et de ... (axe 2). De ces deux centres d’intérêt découlent respectivement, d’une part, … (sous-axe 1 de l'axe 1) et ... (sous-axe 2 de l'axe 1) et, d’autre part, … (sous-axe 1 de l'axe 2) et … (sous-axe 2 de l'axe 2). À travers ce texte, ...(nom de l'auteur) nous ... (opinion personnelle). Une telle optique est perceptible dans la logique de... (nom de l'auteur nous permettant de faire un rapprochement thématique), dans son œuvre ...(titre de l’œuvre), dans lequel il aborde… (bref résumé de l'œuvre en question qui peut être facultatif).
236
-
237
-
238
  """
239
 
240
  model = genai.GenerativeModel(
@@ -244,16 +240,15 @@ model = genai.GenerativeModel(
244
  )
245
 
246
  def generate_table(image):
247
- """Génère le tableau d'analyse à partir de l'image"""
248
  response = model.generate_content([prompt_tableau, image])
249
-
250
  return response.text
251
 
252
  def generate_dissertation(tableau):
253
  """Génère la dissertation basée sur le tableau"""
254
  prompt = f"""
255
-
256
- {prompt_redaction}.Écris maintenant un rédaction pour ça en suivant l'exercice a trous ; {tableau}"""
257
  response = model.generate_content(prompt)
258
  return response.text
259
 
@@ -264,21 +259,18 @@ def index():
264
  @app.route('/analyze', methods=['POST'])
265
  def analyze():
266
  if 'image' not in request.files:
267
- return jsonify({'error': 'No image uploaded'}), 400
268
-
269
 
270
  image_file = request.files['image']
271
 
272
- # Sauvegarder temporairement l'image
273
  with tempfile.NamedTemporaryFile(delete=False) as temp_file:
274
  image_file.save(temp_file.name)
275
  image = Image.open(temp_file.name)
276
 
277
-
278
  try:
279
  # Première génération : le tableau
280
  tableau = generate_table(image)
281
-
282
  # Deuxième génération : la dissertation
283
  dissertation = generate_dissertation(tableau)
284
 
@@ -287,7 +279,62 @@ def analyze():
287
  'dissertation': dissertation
288
  })
289
  except Exception as e:
290
- return jsonify({'error': "Erreur."}), 500
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
291
  finally:
292
- # Nettoyer le fichier temporaire
293
- os.unlink(temp_file.name)
 
 
 
 
 
 
 
 
174
 
175
  5- Ne fais pas de conclusion
176
 
177
+ Répond en français
 
178
  """
179
 
 
180
  prompt_redaction = """
181
  III - LE COMMENTAIRE COMPOSÉ
182
 
 
231
  Ainsi, ... (axe 2) est lié (e) à ... (sous-axe 1) et à ... (sous-axe 2).
232
 
233
  Somme toute, ... (titre du texte) organise son sens autour de … (axe 1) et de ... (axe 2). De ces deux centres d’intérêt découlent respectivement, d’une part, … (sous-axe 1 de l'axe 1) et ... (sous-axe 2 de l'axe 1) et, d’autre part, … (sous-axe 1 de l'axe 2) et … (sous-axe 2 de l'axe 2). À travers ce texte, ...(nom de l'auteur) nous ... (opinion personnelle). Une telle optique est perceptible dans la logique de... (nom de l'auteur nous permettant de faire un rapprochement thématique), dans son œuvre ...(titre de l’œuvre), dans lequel il aborde… (bref résumé de l'œuvre en question qui peut être facultatif).
 
 
234
  """
235
 
236
  model = genai.GenerativeModel(
 
240
  )
241
 
242
  def generate_table(image):
243
+ """Génère le tableau d'analyse à partir d'une image unique"""
244
  response = model.generate_content([prompt_tableau, image])
 
245
  return response.text
246
 
247
  def generate_dissertation(tableau):
248
  """Génère la dissertation basée sur le tableau"""
249
  prompt = f"""
250
+ {prompt_redaction}
251
+ Écris maintenant une rédaction pour ça en suivant l'exercice à trous ; {tableau}"""
252
  response = model.generate_content(prompt)
253
  return response.text
254
 
 
259
  @app.route('/analyze', methods=['POST'])
260
  def analyze():
261
  if 'image' not in request.files:
262
+ return jsonify({'error': 'Aucune image envoyée'}), 400
 
263
 
264
  image_file = request.files['image']
265
 
266
+ # Sauvegarde temporaire de l'image
267
  with tempfile.NamedTemporaryFile(delete=False) as temp_file:
268
  image_file.save(temp_file.name)
269
  image = Image.open(temp_file.name)
270
 
 
271
  try:
272
  # Première génération : le tableau
273
  tableau = generate_table(image)
 
274
  # Deuxième génération : la dissertation
275
  dissertation = generate_dissertation(tableau)
276
 
 
279
  'dissertation': dissertation
280
  })
281
  except Exception as e:
282
+ return jsonify({'error': "Erreur lors de la génération."}), 500
283
+ finally:
284
+ os.unlink(temp_file.name)
285
+
286
+ # -------------------------------
287
+ # Nouveau endpoint pour plusieurs images
288
+ # -------------------------------
289
+ @app.route('/analyze_multi', methods=['POST'])
290
+ def analyze_multi():
291
+ images = request.files.getlist('images')
292
+ if not images or len(images) == 0:
293
+ return jsonify({'error': 'Aucune image envoyée'}), 400
294
+
295
+ content = [
296
+ "J'aimerais que tu traites entièrement cet exercice en respectant scrupuleusement la méthodologie suivante :\n\n" + prompt_tableau +
297
+ "\n\nVoici les images de l'exercice :"
298
+ ]
299
+ temp_files = []
300
+
301
+ try:
302
+ # Pour chaque image, on la sauvegarde temporairement et on l'ouvre avec PIL pour l'ajouter au contenu
303
+ for image in images:
304
+ if image:
305
+ suffix = os.path.splitext(image.filename)[1] # conserver l'extension
306
+ with tempfile.NamedTemporaryFile(delete=False, suffix=suffix) as temp_file:
307
+ image.save(temp_file.name)
308
+ temp_files.append(temp_file.name)
309
+ opened_image = Image.open(temp_file.name)
310
+ # Vous pouvez ici convertir l'image en format adapté ou l'ajouter telle quelle dans la liste
311
+ content.append(opened_image)
312
+
313
+ # On utilise le modèle pour générer le tableau en passant la liste contenant du texte et les images
314
+ response_tableau = model.generate_content(
315
+ content,
316
+ request_options={"timeout": 600}
317
+ )
318
+ tableau = response_tableau.text
319
+
320
+ # Génération de la dissertation à partir du tableau obtenu
321
+ prompt_disc = f"{prompt_redaction}\nÉcris maintenant une rédaction pour ça en suivant l'exercice à trous ; {tableau}"
322
+ response_disc = model.generate_content(prompt_disc, request_options={"timeout": 600})
323
+ dissertation = response_disc.text
324
+
325
+ return jsonify({
326
+ 'tableau': tableau,
327
+ 'dissertation': dissertation
328
+ })
329
+ except Exception as e:
330
+ return jsonify({"error": str(e)}), 500
331
  finally:
332
+ # Supprimer tous les fichiers temporaires
333
+ for temp_file in temp_files:
334
+ try:
335
+ os.unlink(temp_file)
336
+ except Exception as ex:
337
+ print(f"Erreur lors de la suppression du fichier temporaire {temp_file} : {ex}")
338
+
339
+ if __name__ == '__main__':
340
+ app.run(debug=True)