File size: 14,472 Bytes
13d9c52
 
 
 
 
7bfe8df
 
 
 
 
 
13d9c52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7bfe8df
 
 
18d1c29
7bfe8df
 
 
18d1c29
2ad2919
281e951
b17325a
281e951
2ad2919
281e951
2ad2919
 
281e951
 
 
 
2ad2919
281e951
2ad2919
 
 
 
281e951
 
 
2ad2919
 
 
 
281e951
 
 
2ad2919
 
 
281e951
 
b17325a
 
281e951
 
18d1c29
7bfe8df
a5f1988
7bfe8df
 
 
a5f1988
7bfe8df
 
 
 
 
 
 
 
a5f1988
13d9c52
 
7bfe8df
 
a09ba33
13d9c52
 
 
2ad2919
13d9c52
 
 
7bfe8df
 
 
13d9c52
 
 
83396a4
13d9c52
 
 
7bfe8df
 
13d9c52
 
7bfe8df
13d9c52
 
 
7bfe8df
2ad2919
7bfe8df
2ad2919
13d9c52
 
 
7bfe8df
13d9c52
 
 
 
7bfe8df
 
 
13d9c52
 
 
 
 
 
 
7bfe8df
 
13d9c52
 
7bfe8df
13d9c52
 
 
7bfe8df
13d9c52
799f532
7bfe8df
13d9c52
 
 
 
7bfe8df
83396a4
d3f6eaa
 
 
7bfe8df
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d3f6eaa
 
7bfe8df
 
 
d3f6eaa
 
 
 
7bfe8df
d3f6eaa
 
 
 
 
7bfe8df
d3f6eaa
 
 
 
 
7bfe8df
d3f6eaa
 
 
 
 
7bfe8df
d3f6eaa
7bfe8df
d3f6eaa
 
 
 
 
83396a4
a5f1988
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d3f6eaa
 
 
 
 
 
 
7bfe8df
d3f6eaa
83396a4
d3f6eaa
 
7bfe8df
 
 
d3f6eaa
 
 
 
7bfe8df
d3f6eaa
 
 
 
 
7bfe8df
d3f6eaa
 
 
 
 
7bfe8df
b1c6513
 
 
 
 
7bfe8df
b1c6513
7bfe8df
b1c6513
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7bfe8df
b1c6513
7bfe8df
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
from flask import Flask, request, render_template, jsonify
import PIL.Image
import google.generativeai as genai
import os
from tempfile import NamedTemporaryFile
import logging
import traceback  # Import traceback

# Configuration du logging
logging.basicConfig(level=logging.DEBUG,  # Définir le niveau de logging à DEBUG
                    format='%(asctime)s - %(levelname)s - %(message)s')

app = Flask(__name__)

# Configuration de Gemini
generation_config = {
  "temperature": 1,
  "max_output_tokens": 8192,
}

safety_settings = [
  {
    "category": "HARM_CATEGORY_HARASSMENT",
    "threshold": "BLOCK_NONE"
  },
  {
    "category": "HARM_CATEGORY_HATE_SPEECH",
    "threshold": "BLOCK_NONE"
  },
  {
    "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
    "threshold": "BLOCK_NONE"
  },
  {
    "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
    "threshold": "BLOCK_NONE"
  },
]

GOOGLE_API_KEY = os.environ.get("TOKEN")

genai.configure(api_key=GOOGLE_API_KEY)

logging.info("Gemini API configuré.")


def generer_histoire(sujet, points):
    """Génère une histoire à partir d'un sujet et de points donnés."""
    logging.info(f"Début de la génération de l'histoire avec sujet: {sujet} et points: {points}")

    prompt = f"""
    je souhaite faire mon travail d'histoire sous forme de dissertation. le thème {sujet} et les différents point a détaillé sont : {points}

Voici la méthodologie que tu devras scrupuleusement respecté pour la dissertation et assure toi d'intégrer les connecteur logique pour débuter les arguments Je veux un travail bien détaillé. commence directement ta réponse par l'introduction :

Introduction

Amorce
Problématique
Annonce du plan(les points )

Développement(il y a trois points et donc une partie pour chaque points )

1er partie

Phrase chapeau ( Avec annonce des deux arguments)
Argument 1+ explication+ exemple
Argument 2 + explication + exemple
Transition

2eme partie

Phrase chapeau ( Avec annonce des deux arguments)
Argument 1+ explication+ exemple
Argument 2 + explication + exemple
Transition

3eme partie

Phrase chapeau ( Avec annonce des deux arguments)
Argument 1+ explication+ exemple
Argument 2 + explication + exemple

Conclusion
bilan
question d'ouverture 
    
    """

    logging.debug(f"Prompt utilisé pour Gemini: {prompt}")

    try:
        model = genai.GenerativeModel('gemini-2.0-flash', generation_config=generation_config, safety_settings=safety_settings)
        logging.info("Modèle Gemini initialisé.")

        response = model.generate_content(prompt, request_options={"timeout": 600})
        logging.info("Réponse de Gemini reçue.")
        logging.debug(f"Réponse brute de Gemini: {response}")
        return response.text
    except Exception as e:
        logging.error(f"Erreur lors de la génération de l'histoire: {e}")
        logging.error(traceback.format_exc()) # Log the full traceback
        raise

@app.route('/')
def index():
    """Route pour la page d'accueil."""
    logging.info("Accès à la page d'accueil.")
    return render_template('histoire.html')
    




@app.route('/api/histoire', methods=['POST'])
def submit_histoire():
    """Route pour soumettre un sujet d'histoire et générer une dissertation."""
    logging.info("Requête POST reçue sur /api/histoire")

    # Récupération des données
    sujet = request.form.get('sujet-histoire', '').strip()
    points = [
        request.form.get('pointt1-histoire', '').strip(),
        request.form.get('point2-histoire', '').strip(),
        request.form.get('point3-histoire', '').strip()
    ]

    logging.debug(f"Sujet reçu: {sujet}, Points reçus: {points}")
    
    if not sujet or not all(points):
        logging.warning("Tous les champs ne sont pas remplis.")
        return jsonify({"error": "Tous les champs sont obligatoires"}), 400
    
    try:
        logging.info("Début de la génération de la dissertation.")
        dissertation = generer_histoire(sujet,points)
        logging.info("Dissertation générée avec succès.")

        return jsonify({"output": dissertation}), 200
        
    except Exception as e:
        logging.exception("Erreur lors du traitement de la requête /api/histoire") # Use logging.exception to log the exception with traceback
        return jsonify({"error": str(e)}), 500

@app.route('/api/geographie', methods=['POST'])
def submit_geographie():
    """Route pour soumettre un sujet de géographie et générer une dissertation."""
    logging.info("Requête POST reçue sur /api/geographie")

    # Récupération des données
    sujet = request.form.get('sujet-geographie', '').strip()
    points = [
        request.form.get('point1-geographie', '').strip(),
        request.form.get('point2-geographie', '').strip(),
        request.form.get('point3-geographie', '').strip()
    ]

    logging.debug(f"Sujet reçu: {sujet}, Points reçus: {points}")
    
    if not sujet or not all(points):
        logging.warning("Tous les champs ne sont pas remplis.")
        return jsonify({"error": "Tous les champs sont obligatoires"}), 400
    
    try:
        logging.info("Début de la génération de la dissertation.")
        # Génération de l'introduction
        dissertation = generer_histoire(sujet,points)
        logging.info("Dissertation générée avec succès.")
        
        return jsonify({"output": dissertation}), 200
        
    except Exception as e:
        logging.exception("Erreur lors du traitement de la requête /api/geographie") # Use logging.exception to log the exception with traceback
        return jsonify({"error": str(e)}), 500

def analyze_images(images, prompt):
    """Analyse les images fournies et génère une réponse textuelle."""
    logging.info("Début de l'analyse des images.")
    logging.debug(f"Prompt utilisé pour l'analyse d'images: {prompt}")
    try:
        model = genai.GenerativeModel('gemini-2.0-flash')
        logging.info("Modèle Gemini initialisé pour l'analyse d'images.")

        response = model.generate_content(
            [prompt, *images],
            generation_config=generation_config,
            safety_settings=safety_settings
        )
        logging.info("Réponse de Gemini reçue pour l'analyse d'images.")
        logging.debug(f"Réponse brute de Gemini (analyse d'images): {response}")
        return response.text
    except Exception as e:
        logging.error(f"Erreur lors de l'analyse des images: {e}")
        logging.error(traceback.format_exc()) # Log the full traceback
        raise


@app.route('/api/histoire-type2', methods=['POST'])
def submit_histoire_type2():
    """Route pour soumettre un sujet d'histoire et des images et générer une dissertation."""
    logging.info("Requête POST reçue sur /api/histoire-type2")

    # Récupération des données
    sujet = request.form.get('sujet-histoire-type2', '').strip()
    
    if 'images-histoire-type2' not in request.files:
        logging.warning("Aucune image n'a été envoyée.")
        return jsonify({"error": "Aucune image n'a été envoyée."}), 400

    files = request.files.getlist('images-histoire-type2')
    
    if not sujet:
        logging.warning("Le champ sujet est obligatoire.")
        return jsonify({"error": "Le champ sujet est obligatoire"}), 400
    
    images = []
    for file in files:
        if file.filename == '':
            logging.warning("Un ou plusieurs fichiers n'ont pas de nom.")
            return jsonify({"error": "Un ou plusieurs fichiers n'ont pas de nom."}), 400

        try:
            img = PIL.Image.open(file)
            images.append(img)
            logging.debug(f"Image {file.filename} chargée avec succès.")
        except Exception as e:
            logging.error(f"Impossible de lire l'image : {file.filename}. Erreur : {str(e)}")
            return jsonify({"error": f"Impossible de lire l'image : {file.filename}. Erreur : {str(e)}"}), 400

    try:
        # Prompt pour l'analyse d'images en histoire
        prompt = f"""
        
        je souhaite faire mon travail d'histoire sous forme de dissertation. le thème est {sujet}.

Voici la méthodologie que tu devras scrupuleusement respecté pour la dissertation et assure toi d'intégrer les connecteur logique pour débuter les arguments Je veux un travail bien détaillé. commence directement ta réponse par l'introduction :


Introduction:

1er Paragraphe: Présentation des documents (Natures et auteurs au programme). Cela signifie qu'il faut identifier la nature des documents (ex : texte, image, graphique) et mentionner les auteurs, si disponibles, en lien avec le programme.

2ème Paragraphe: Contexte historique. Il faut situer les documents dans leur contexte historique, c'est-à-dire l'époque, les événements, et les grandes tendances associées.

3ème Paragraphe: Résumé des idées majeures. En quelques phrases, il faut synthétiser les principaux thèmes ou les grandes idées qui ressortent des documents et du contexte.

Note: Il est recommandé de sauter 2 ou 3 lignes entre l'introduction et le développement.

Développement :

Le développement est structuré autour de plusieurs consignes, chacune ayant la même structure :

Pour chaque consigne (n°1, n°2, n°3):

1er Paragraphe: Constat. Il s'agit de présenter ce qui est observable, un fait, une situation, une information tirée du document.

2ème Paragraphe: Explication. Il faut analyser et expliquer le constat fait dans le paragraphe précédent. Pourquoi observe-t-on cela ? Quels sont les mécanismes, les causes, les facteurs à l'œuvre ?

3ème Paragraphe: Critique. Il faut prendre du recul, analyser de manière critique les informations, les sources ou le contexte. Peut-on nuancer ou remettre en cause certaines affirmations ?

4ème Paragraphe: Phrase de transition. Il s'agit d'une phrase courte pour faire le lien avec la consigne suivante.

Note: Il est recommandé de sauter 1 ligne entre chaque consigne du développement.

Conclusion
bilan 
phrase d'ouverture

 
        
        """

        # Analyse des images et génération de la réponse
        response_text = analyze_images(images, prompt)
        return jsonify({"output": response_text}), 200

    except Exception as e:
        logging.exception("Erreur lors du traitement de la requête /api/histoire-type2") # Use logging.exception to log the exception with traceback
        return jsonify({"error": str(e)}), 500
        
@app.route('/api/geographie-type2', methods=['POST'])
def submit_geographie_type2():
    """Route pour soumettre un sujet de géographie et des images et générer une dissertation."""
    logging.info("Requête POST reçue sur /api/geographie-type2")

    # Récupération des données
    sujet = request.form.get('sujet-geographie-type2', '').strip()
    
    if 'images-geographie-type2' not in request.files:
        logging.warning("Aucune image n'a été envoyée.")
        return jsonify({"error": "Aucune image n'a été envoyée."}), 400

    files = request.files.getlist('images-geographie-type2')
    
    if not sujet:
        logging.warning("Le champ sujet est obligatoire.")
        return jsonify({"error": "Le champ sujet est obligatoire"}), 400
    
    images = []
    for file in files:
        if file.filename == '':
            logging.warning("Un ou plusieurs fichiers n'ont pas de nom.")
            return jsonify({"error": "Un ou plusieurs fichiers n'ont pas de nom."}), 400

        try:
            img = PIL.Image.open(file)
            images.append(img)
            logging.debug(f"Image {file.filename} chargée avec succès.")
        except Exception as e:
            logging.error(f"Impossible de lire l'image : {file.filename}. Erreur : {str(e)}")
            return jsonify({"error": f"Impossible de lire l'image : {file.filename}. Erreur : {str(e)}"}), 400

    try:
        # Prompt pour l'analyse d'images en histoire
        prompt = f"""
        
        je souhaite faire mon travail de géographie sous forme de dissertation. le thème est {sujet}.

Voici la méthodologie que tu devras scrupuleusement respecté pour la dissertation et assure toi d'intégrer les connecteur logique pour débuter les arguments Je veux un travail bien détaillé. commence directement ta réponse par l'introduction :

Introduction:

1er Paragraphe: Définition du thème (ou définition des mots-clés). Il faut commencer par clairement définir le sujet de l'étude. Si nécessaire, il faut définir les mots-clés importants et les concepts liés au thème étudié.

2ème Paragraphe: Présentation des documents (Natures uniquement). Il faut présenter la nature des documents : cartes, graphiques, photos, etc. Contrairement à l'histoire, l'accent est mis ici uniquement sur la nature des documents, sans mention des auteurs.

3ème Paragraphe: Résumé des idées majeures. Il faut synthétiser les principales idées, les tendances ou les problématiques qui se dégagent des documents et de la définition du thème.

Note: Il est recommandé de sauter 2 ou 3 lignes entre l'introduction et le développement.

Développement:

Le développement en géographie suit une structure identique à celle de l'histoire, basée sur des consignes :

Pour chaque consigne (n°1, n°2, n°3):

1er Paragraphe: Constat. Présentez ce qui est observable dans les documents, un fait géographique, une tendance, une répartition spatiale, etc.

2ème Paragraphe: Explication. Analysez les raisons de ce constat. Quels facteurs géographiques (naturels, humains, économiques, politiques...) expliquent ce qui a été observé ?

3ème Paragraphe: Critique. Analysez les limites des documents ou de l'approche, la pertinence des facteurs explicatifs, les éventuelles alternatives ou nuances.

4ème Paragraphe: Phrase de transition. Une courte phrase pour passer en douceur à la consigne suivante.

Note: Il est recommandé de sauter 1 ligne entre chaque consigne du développement.


Conclusion
bilan 
phrase d'ouverture

 
        
        """

        # Analyse des images et génération de la réponse
        response_text = analyze_images(images, prompt)
        return jsonify({"output": response_text}), 200

    except Exception as e:
        logging.exception("Erreur lors du traitement de la requête /api/geographie-type2") # Use logging.exception to log the exception with traceback
        return jsonify({"error": str(e)}), 500

if __name__ == '__main__':
    app.run(debug=True)