Spaces:
Running
Running
Update app.py
Browse files
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 |
-
|
89 |
-
prompt = f"""Je veux faire mon travail de français de niveau
|
90 |
-
La question du travail est la suivante : "{french_prompt}". Tu devras
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 +
|
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 |
-
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
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 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
158 |
-
|
159 |
-
|
|
|
|
|
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 ---
|