Docfile commited on
Commit
d783c87
·
verified ·
1 Parent(s): a4fc9a3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +45 -32
app.py CHANGED
@@ -1,4 +1,4 @@
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
@@ -25,9 +25,16 @@ safety_settings = [
25
  {"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_NONE"},
26
  ]
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
  )
@@ -38,14 +45,22 @@ def index():
38
 
39
  @app.route('/api/francais', methods=['POST'])
40
  def gpt_francais():
41
- """Handles French questions."""
42
  french_prompt = request.form.get('sujet', '').strip()
43
  choix = request.form.get('choix', '').strip()
44
  style = request.form.get('style', '').strip()
 
 
 
45
 
46
  if not french_prompt:
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.
@@ -89,7 +104,7 @@ def gpt_francais():
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 :
@@ -162,78 +177,76 @@ def gpt_francais():
162
  Je veux que tu utilises un style d'écriture {style}."""
163
 
164
  try:
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():
176
- """Handles text analysis for French with multiple images."""
177
  if 'images' not in request.files:
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 ---
 
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
 
25
  {"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_NONE"},
26
  ]
27
 
28
+ # Define model names
29
+ STANDARD_MODEL_NAME = "gemini-2.0-flash" # Using latest flash
30
+ # MODIFICATION: Utilisation du nom de modèle Pro spécifié (attention: peut être expérimental/non disponible)
31
+ DEEPTHINK_MODEL_NAME = "gemini-2.5-pro-exp-03-25" # Using stable latest Pro model is generally safer
32
+ # DEEPTHINK_MODEL_NAME = "models/gemini-1.5-pro-exp-0325" # Si vous voulez absolument tester ce modèle expérimental spécifique
33
+ # Note: Les noms de modèles expérimentaux peuvent nécessiter un préfixe "models/"
34
+
35
+ # Default model instance (used for etude-texte)
36
+ default_model = genai.GenerativeModel(
37
+ model_name=STANDARD_MODEL_NAME,
38
  generation_config=generation_config,
39
  safety_settings=safety_settings
40
  )
 
45
 
46
  @app.route('/api/francais', methods=['POST'])
47
  def gpt_francais():
48
+ """Handles French questions with optional DeepThink model."""
49
  french_prompt = request.form.get('sujet', '').strip()
50
  choix = request.form.get('choix', '').strip()
51
  style = request.form.get('style', '').strip()
52
+ # MODIFICATION: Lire le nouveau paramètre 'use_deepthink'
53
+ use_deepthink_str = request.form.get('use_deepthink', 'false')
54
+ use_deepthink = use_deepthink_str.lower() == 'true'
55
 
56
  if not french_prompt:
57
  return jsonify({"output": "Veuillez saisir un thème."}), 400
58
 
59
+ # MODIFICATION: Sélectionner le nom du modèle basé sur use_deepthink
60
+ model_to_use_name = DEEPTHINK_MODEL_NAME if use_deepthink else STANDARD_MODEL_NAME
61
+ print(f"Using model: {model_to_use_name}") # Log for debugging
62
+
63
+ # Le reste de la logique de construction du prompt reste identique...
64
  if choix == "discuter":
65
  prompt = f""" Je veux faire mon travail de français de niveau lycée sous la forme d'un travail argumentatif.
66
  La question du travail est la suivante : "{french_prompt}". Tu devras discuter ce thème.
 
104
 
105
  Je veux que tu utilises un style d'écriture {style}."""
106
 
107
+ elif choix == "dissertation":
108
  prompt = f""" Je veux faire mon travail de français de niveau lycée sous la forme d'une dissertation.
109
  La question du travail est la suivante : "{french_prompt}". Tu devras traiter ce sujet de manière approfondie.
110
  tu utiliseras la méthodologie suivante :
 
177
  Je veux que tu utilises un style d'écriture {style}."""
178
 
179
  try:
180
+ # MODIFICATION: Instancier le modèle spécifique pour cette requête
181
+ # Utiliser les mêmes configurations que le modèle par défaut
182
+ selected_model = genai.GenerativeModel(
183
+ model_name=model_to_use_name,
184
+ generation_config=generation_config,
185
+ safety_settings=safety_settings
186
+ )
187
+ response = selected_model.generate_content(prompt)
188
  return jsonify({"output": response.text}), 200
189
  except Exception as e:
190
  # Log l'erreur pour le débogage côté serveur
191
+ print(f"Error generating content with model {model_to_use_name}: {e}")
192
  # Retourne un message d'erreur générique à l'utilisateur
193
+ # Vérifier si l'erreur est due à un modèle invalide/non disponible
194
+ if "model" in str(e).lower() and "not found" in str(e).lower():
195
+ return jsonify({"output": f"Erreur: Le modèle '{model_to_use_name}' n'est pas accessible ou n'existe pas. Essayez sans l'option DeepThink."}), 500
196
+ return jsonify({"output": f"Une erreur interne est survenue lors de la génération du contenu ({type(e).__name__}). Veuillez réessayer."}), 500
197
 
198
 
199
  @app.route('/api/etude-texte', methods=['POST'])
200
  def gpt_francais_cc():
201
+ """Handles text analysis for French with multiple images (uses default model)."""
202
  if 'images' not in request.files:
203
  return jsonify({"output": "Aucune image n'a été téléchargée."}), 400
204
 
205
  images = request.files.getlist('images')
206
+ if not images or all(not image.filename for image in images):
207
  return jsonify({"output": "Aucune image sélectionnée ou les fichiers sont vides."}), 400
208
 
209
  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."
210
 
 
211
  contents = [pre_prompt]
 
212
  valid_images_found = False
213
  for image in images:
214
+ if image and image.filename:
215
  try:
 
216
  img_bytes = image.read()
 
217
  if not img_bytes:
218
  print(f"Skipping empty file: {image.filename}")
219
+ continue
220
 
221
  img = Image.open(io.BytesIO(img_bytes))
222
+ img.verify()
 
223
  img = Image.open(io.BytesIO(img_bytes))
224
 
 
225
  contents.append(img)
226
  valid_images_found = True
227
 
228
  except (IOError, SyntaxError) as e:
 
229
  print(f"Error processing image {image.filename}: {e}. It might be corrupted or not a valid image format.")
 
 
230
  except Exception as e:
231
  print(f"Unexpected error processing image {image.filename}: {e}")
 
 
232
 
233
  if not valid_images_found:
234
  return jsonify({"output": "Aucune image valide n'a été trouvée parmi les fichiers téléchargés."}), 400
235
 
 
236
  try:
237
+ # Utilisation du modèle par défaut (non-DeepThink) pour l'analyse d'images
238
+ response = default_model.generate_content(contents)
239
  return jsonify({"output": response.text}), 200
240
  except types.generation_types.BlockedPromptException as e:
241
  print(f"Content generation blocked: {e}")
242
  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
243
  except Exception as e:
244
+ print(f"Error during Gemini generation (etude-texte): {e}")
245
+ return jsonify({"output": f"Une erreur interne est survenue lors de l'analyse des images ({type(e).__name__}). Veuillez réessayer."}), 500
 
 
246
 
247
 
248
  if __name__ == '__main__':
249
+ # Désactiver le reloader Flask si vous avez des problèmes avec les instances multiples de modèle ou la mémoire
250
+ # app.run(debug=True, use_reloader=False)
251
  app.run(debug=True)
252
  #--- END OF FILE app - 2025-04-08T095242.046.py ---