Update app.py
Browse files
app.py
CHANGED
@@ -174,9 +174,11 @@ L'analyse devra respecter la structure suivante :
|
|
174 |
|
175 |
5- Ne fais pas de conclusion
|
176 |
|
177 |
-
|
|
|
178 |
"""
|
179 |
|
|
|
180 |
prompt_redaction = """
|
181 |
III - LE COMMENTAIRE COMPOSÉ
|
182 |
|
@@ -231,6 +233,8 @@ En parlant de ... (sous-axe 2), l'auteur met l'accent en premier sur… (interpr
|
|
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,15 +244,16 @@ model = genai.GenerativeModel(
|
|
240 |
)
|
241 |
|
242 |
def generate_table(image):
|
243 |
-
"""Génère le tableau d'analyse à partir
|
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 |
-
|
251 |
-
|
252 |
response = model.generate_content(prompt)
|
253 |
return response.text
|
254 |
|
@@ -259,18 +264,21 @@ def index():
|
|
259 |
@app.route('/analyze', methods=['POST'])
|
260 |
def analyze():
|
261 |
if 'image' not in request.files:
|
262 |
-
return jsonify({'error': '
|
|
|
263 |
|
264 |
image_file = request.files['image']
|
265 |
|
266 |
-
#
|
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,62 +287,7 @@ def analyze():
|
|
279 |
'dissertation': dissertation
|
280 |
})
|
281 |
except Exception as e:
|
282 |
-
return jsonify({'error': "Erreur
|
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 |
-
#
|
333 |
-
|
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)
|
|
|
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 |
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 |
)
|
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 |
@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 |
'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)
|
|
|
|
|
|
|
|
|
|
|
|
|
|