Docfile commited on
Commit
b1fdf62
·
verified ·
1 Parent(s): 6c087d6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +116 -39
app.py CHANGED
@@ -1,3 +1,5 @@
 
 
1
  from flask import Flask, render_template, request, jsonify
2
  import google.generativeai as genai
3
  from google.generativeai import types
@@ -25,7 +27,7 @@ safety_settings = [
25
 
26
  # Choose the Gemini model
27
  model = genai.GenerativeModel(
28
- model_name="gemini-2.0-flash",
29
  generation_config=generation_config,
30
  safety_settings=safety_settings
31
  )
@@ -45,16 +47,17 @@ def gpt_francais():
45
  return jsonify({"output": "Veuillez saisir un thème."}), 400
46
 
47
  if choix == "discuter":
48
- prompt = f""" Je veux faire mon travail de français de niveau lycée sous la forme d'un travail argumentatif.
49
- La question du travail est la suivante : "{french_prompt}". Tu devras discuter ce thème.
50
  tu utiliseras la méthodologie suivante :
51
 
52
  # INTRODUCTION:
53
  - Approche par constat
54
- - Problématique
55
- - Annonce du plan
56
 
57
  # DÉVELOPPEMENT:
 
58
  - Introduction partielle (énonce la thèse)
59
  - Argument 1:
60
  * Explications
@@ -68,6 +71,7 @@ def gpt_francais():
68
 
69
  # phrase de Transiton vers la deuxieme partie :
70
 
 
71
  - Introduction partielle (énonce l'antithèse)
72
  - Argument 1:
73
  * Explications
@@ -79,24 +83,68 @@ def gpt_francais():
79
  * Explications
80
  * Illustration (exemple + explication)
81
 
82
- #Conclusion
83
- * Bilan
84
  * Ouverture du sujet (sous forme de phrase interrogative )
85
 
86
  Je veux que tu utilises un style d'écriture {style}."""
87
 
88
- else:
89
- prompt = f"""Je veux faire mon travail de français de niveau lycé sous la forme d'un travail argumentatif.
90
- La question du travail est la suivante : "{french_prompt}". Tu devras {choix} ce thème.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
  tu utiliseras la méthodologie suivante :
92
 
93
  # INTRODUCTION:
94
  - Approche par constat
95
- - Problématique
96
- - Annonce du plan
97
 
98
  # DÉVELOPPEMENT:
99
- - Phrase chapeau (énonce la thèse)
100
  - Argument 1:
101
  * Explications
102
  * Illustration (exemple + explication)
@@ -107,8 +155,8 @@ def gpt_francais():
107
  * Explications
108
  * Illustration (exemple + explication)
109
 
110
- #Conclusion
111
- * Bilan (thèse + arguments1 + arguments2+arguments3)
112
  * Ouverture du sujet ( sous forme de phrase interrogative )
113
 
114
  Je veux que tu utilises un style d'écriture {style}."""
@@ -117,7 +165,11 @@ def gpt_francais():
117
  response = model.generate_content(prompt)
118
  return jsonify({"output": response.text}), 200
119
  except Exception as e:
120
- return jsonify({"output": f"Erreur lors de la génération : {str(e)}"}), 500
 
 
 
 
121
 
122
  @app.route('/api/etude-texte', methods=['POST'])
123
  def gpt_francais_cc():
@@ -126,37 +178,62 @@ def gpt_francais_cc():
126
  return jsonify({"output": "Aucune image n'a été téléchargée."}), 400
127
 
128
  images = request.files.getlist('images')
129
- if not images:
130
- return jsonify({"output": "Aucune image selectionnée."}), 400
 
 
131
 
132
- pre_prompt = "Traite entièrement devoir."
133
-
134
  # Préparer les images pour l'API Gemini
135
  contents = [pre_prompt]
136
-
 
137
  for image in images:
138
- try:
139
- # Lire l'image avec PIL
140
- img_bytes = image.read()
141
- img = Image.open(io.BytesIO(img_bytes))
142
-
143
- # Convertir en format compatible avec Gemini
144
- # L'image PIL peut être directement utilisée avec l'API Gemini
145
- contents.append(img)
146
-
147
- except Exception as e:
148
- return jsonify({
149
- "output": f"Erreur lors du traitement de l'image {image.filename}: {str(e)}"
150
- }), 500
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151
 
152
  try:
153
- # Générer le contenu avec toutes les images
154
  response = model.generate_content(contents)
155
  return jsonify({"output": response.text}), 200
 
 
 
156
  except Exception as e:
157
- return jsonify({
158
- "output": f"Erreur lors de l'analyse des images : {str(e)}"
159
- }), 500
 
 
160
 
161
  if __name__ == '__main__':
162
- app.run(debug=True)
 
 
1
+ #-- START OF FILE app - 2025-04-08T095242.046.py ---
2
+
3
  from flask import Flask, render_template, request, jsonify
4
  import google.generativeai as genai
5
  from google.generativeai import types
 
27
 
28
  # Choose the Gemini model
29
  model = genai.GenerativeModel(
30
+ model_name="gemini-2.0-flash", # Modèle mis à jour vers 1.5-flash pour potentiellement de meilleures performances
31
  generation_config=generation_config,
32
  safety_settings=safety_settings
33
  )
 
47
  return jsonify({"output": "Veuillez saisir un thème."}), 400
48
 
49
  if choix == "discuter":
50
+ prompt = f""" Je veux faire mon travail de français de niveau lycée sous la forme d'un travail argumentatif.
51
+ La question du travail est la suivante : "{french_prompt}". Tu devras discuter ce thème.
52
  tu utiliseras la méthodologie suivante :
53
 
54
  # INTRODUCTION:
55
  - Approche par constat
56
+ - Problématique
57
+ - Annonce du plan
58
 
59
  # DÉVELOPPEMENT:
60
+ ## Partie 1 : Thèse
61
  - Introduction partielle (énonce la thèse)
62
  - Argument 1:
63
  * Explications
 
71
 
72
  # phrase de Transiton vers la deuxieme partie :
73
 
74
+ ## Partie 2 : Antithèse
75
  - Introduction partielle (énonce l'antithèse)
76
  - Argument 1:
77
  * Explications
 
83
  * Explications
84
  * Illustration (exemple + explication)
85
 
86
+ #Conclusion
87
+ * Bilan (Synthèse des arguments pour et contre)
88
  * Ouverture du sujet (sous forme de phrase interrogative )
89
 
90
  Je veux que tu utilises un style d'écriture {style}."""
91
 
92
+ elif choix == "dissertation": # NOUVEAU BLOC POUR LA DISSERTATION
93
+ prompt = f""" Je veux faire mon travail de français de niveau lycée sous la forme d'une dissertation.
94
+ La question du travail est la suivante : "{french_prompt}". Tu devras traiter ce sujet de manière approfondie.
95
+ tu utiliseras la méthodologie suivante :
96
+
97
+ # INTRODUCTION:
98
+ - Accroche (ou amorce) pertinente
99
+ - Présentation du sujet et reformulation de la question
100
+ - Problématique claire
101
+ - Annonce du plan (généralement en deux ou trois parties)
102
+
103
+ # DÉVELOPPEMENT:
104
+ ## Partie 1: Thèse (ou première grande idée)
105
+ - Introduction partielle (énonce l'idée directrice de la partie)
106
+ - Argument 1:
107
+ * Explications
108
+ * Illustration (exemple + explication détaillée)
109
+ - Argument 2:
110
+ * Explications
111
+ * Illustration (exemple + explication détaillée)
112
+ - (Optionnel: Argument 3)
113
+ - Transition vers la partie suivante
114
+
115
+ ## Partie 2: Antithèse (ou deuxième grande idée / nuance / contrepoint)
116
+ - Introduction partielle (énonce l'idée directrice de la partie)
117
+ - Argument 1:
118
+ * Explications
119
+ * Illustration (exemple + explication détaillée)
120
+ - Argument 2:
121
+ * Explications
122
+ * Illustration (exemple + explication détaillée)
123
+ - (Optionnel: Argument 3)
124
+ - Transition vers la partie suivante (si applicable) ou la conclusion
125
+
126
+ ## (Optionnel: Partie 3: Synthèse / Dépassement)
127
+ - Introduction partielle
128
+ - Arguments développés (synthèse ou dépassement des points précédents)
129
+
130
+ # CONCLUSION
131
+ * Bilan synthétique des idées principales du développement (réponse claire à la problématique)
132
+ * Ouverture du sujet (perspective plus large, nouvelle question, lien avec l'actualité ou une autre œuvre...)
133
+
134
+ Je veux que tu utilises un style d'écriture {style}."""
135
+
136
+ else: # Cas pour "Etaye" et "refute"
137
+ prompt = f"""Je veux faire mon travail de français de niveau lycée sous la forme d'un travail argumentatif.
138
+ La question du travail est la suivante : "{french_prompt}". Tu devras {choix} ce thème.
139
  tu utiliseras la méthodologie suivante :
140
 
141
  # INTRODUCTION:
142
  - Approche par constat
143
+ - Problématique
144
+ - Annonce du plan
145
 
146
  # DÉVELOPPEMENT:
147
+ - Phrase chapeau (énonce la thèse principale : pour étayer ou contre pour réfuter)
148
  - Argument 1:
149
  * Explications
150
  * Illustration (exemple + explication)
 
155
  * Explications
156
  * Illustration (exemple + explication)
157
 
158
+ #Conclusion
159
+ * Bilan (rappel de la thèse + arguments principaux)
160
  * Ouverture du sujet ( sous forme de phrase interrogative )
161
 
162
  Je veux que tu utilises un style d'écriture {style}."""
 
165
  response = model.generate_content(prompt)
166
  return jsonify({"output": response.text}), 200
167
  except Exception as e:
168
+ # Log l'erreur pour le débogage côté serveur
169
+ print(f"Error generating content: {e}")
170
+ # Retourne un message d'erreur générique à l'utilisateur
171
+ return jsonify({"output": f"Une erreur interne est survenue lors de la génération du contenu. Veuillez réessayer."}), 500
172
+
173
 
174
  @app.route('/api/etude-texte', methods=['POST'])
175
  def gpt_francais_cc():
 
178
  return jsonify({"output": "Aucune image n'a été téléchargée."}), 400
179
 
180
  images = request.files.getlist('images')
181
+ if not images or all(not image.filename for image in images): # Vérifie si la liste est vide ou ne contient que des objets vides
182
+ return jsonify({"output": "Aucune image sélectionnée ou les fichiers sont vides."}), 400
183
+
184
+ pre_prompt = "Analyse de manière exhaustive et structurée le contenu du devoir présenté dans les images suivantes. Identifie les questions, extrais le texte si présent, et réponds aux questions de manière détaillée en te basant uniquement sur les informations fournies dans les images."
185
 
 
 
186
  # Préparer les images pour l'API Gemini
187
  contents = [pre_prompt]
188
+
189
+ valid_images_found = False
190
  for image in images:
191
+ if image and image.filename: # S'assure que l'objet fichier n'est pas vide et a un nom
192
+ try:
193
+ # Lire l'image avec PIL
194
+ img_bytes = image.read()
195
+ # Vérifier si les bytes lus ne sont pas vides
196
+ if not img_bytes:
197
+ print(f"Skipping empty file: {image.filename}")
198
+ continue # Ignore les fichiers vides
199
+
200
+ img = Image.open(io.BytesIO(img_bytes))
201
+ img.verify() # Vérifie si l'image est valide/non corrompue
202
+ # Re-ouvrir après verify()
203
+ img = Image.open(io.BytesIO(img_bytes))
204
+
205
+ # Convertir en format compatible avec Gemini
206
+ contents.append(img)
207
+ valid_images_found = True
208
+
209
+ except (IOError, SyntaxError) as e:
210
+ # Log l'erreur spécifique
211
+ print(f"Error processing image {image.filename}: {e}. It might be corrupted or not a valid image format.")
212
+ # Optionnel: informer l'utilisateur qu'une image spécifique a échoué
213
+ # return jsonify({"output": f"Erreur lors du traitement de l'image {image.filename}: Format invalide ou fichier corrompu."}), 400
214
+ except Exception as e:
215
+ print(f"Unexpected error processing image {image.filename}: {e}")
216
+ # Optionnel: retourner une erreur générique
217
+ # return jsonify({"output": f"Erreur inattendue lors du traitement de l'image {image.filename}."}), 500
218
+
219
+ if not valid_images_found:
220
+ return jsonify({"output": "Aucune image valide n'a été trouvée parmi les fichiers téléchargés."}), 400
221
+
222
 
223
  try:
224
+ # Générer le contenu avec toutes les images valides
225
  response = model.generate_content(contents)
226
  return jsonify({"output": response.text}), 200
227
+ except types.generation_types.BlockedPromptException as e:
228
+ print(f"Content generation blocked: {e}")
229
+ return jsonify({"output": "La génération de contenu a été bloquée car la requête ou les images contenaient potentiellement du contenu non autorisé."}), 400
230
  except Exception as e:
231
+ # Log l'erreur pour le débogage côté serveur
232
+ print(f"Error during Gemini generation: {e}")
233
+ # Retourne un message d'erreur générique
234
+ return jsonify({"output": f"Une erreur interne est survenue lors de l'analyse des images. Veuillez réessayer."}), 500
235
+
236
 
237
  if __name__ == '__main__':
238
+ app.run(debug=True)
239
+ #--- END OF FILE app - 2025-04-08T095242.046.py ---