from flask import Flask, request, render_template, jsonify import PIL.Image import google.generativeai as genai import os from tempfile import NamedTemporaryFile 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) def rediger_tout(theme, point): """Génère une section de dissertation d'histoire.""" prompt = f""" je souhaite faire mon travail d'histoire. le thème c'est {thème} et les différents point a détaillé sont : {point} Voici la méthodologie que tu devras scrupuleusement respecté pour la dissertation : 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 Argument 1 Argument 2 Transition 2eme partie Phrase chapeau Argument 1+ explication+ exemple Argument 2 + explication + exemple Transition 3eme partie Phrase chapeau Argument 1+ explication + exemple Argument 2 + explication + exemple Conclusion """ model = genai.GenerativeModel('gemini-exp-1206',generation_config=generation_config, safety_settings=safety_settings) response = model.generate_content([prompt, img], request_options={"timeout": 600}) return response.text @app.route('/') def index(): return render_template('histoire.html') def rediger_section_histoire(theme, point, contexte_precedent=""): """Génère une section de dissertation d'histoire.""" prompt = f""" Rédige une section détaillée pour une dissertation d'histoire sur le thème "{theme}". Point à traiter: {point} Structure à suivre: 1. Phrase chapeau introduisant l'idée principale 2. Trois arguments développés: - Argument + Explication détaillée + Exemple 3. transition vers le point suivant Contexte précédent de la dissertation: {contexte_precedent} """ model = genai.GenerativeModel('gemini-1.5-flash-002',generation_config=generation_config, safety_settings=safety_settings) chat = model.start_chat() response = chat.send_message(prompt) return response.text, chat.history def rediger_section_geographie(theme, point, contexte_precedent=""): """Génère une section de dissertation de géographie.""" prompt = f""" Rédige une section détaillée pour une dissertation de géographie sur le thème "{theme}". Point à traiter: {point} Structure à suivre: 1. Phrase chapeau présentant l'enjeu géographique 2. Trois aspects à développer: - Analyse spatiale + Exemple territorial concret + Données chiffrées - Utiliser des échelles d'analyse variées (locale, régionale, mondiale) 3. Phrase de transition Contexte précédent de la dissertation: {contexte_precedent} """ model = genai.GenerativeModel('gemini-1.5-flash-002',generation_config=generation_config, safety_settings=safety_settings) chat = model.start_chat() response = chat.send_message(prompt) return response.text, chat.history def generer_introduction(sujet,points, type_sujet="histoire"): """Génère l'introduction de la dissertation.""" prompt = f""" Rédige une introduction structurée pour une dissertation de {type_sujet} sur le sujet: "{sujet}" Structure: 1. Accroche (définition ou contextualisation) 2. Problématique claire 3. Annonce du plan({points}) """ model = genai.GenerativeModel('gemini-1.5-flash-002',generation_config=generation_config, safety_settings=safety_settings) response = model.generate_content(prompt) return response.text def generer_conclusion(sujet, contenu, type_sujet="histoire"): """Génère la conclusion de la dissertation.""" prompt = f""" À partir de cette dissertation de {type_sujet} sur "{sujet}", rédige une conclusion qui: 1. Synthétise les points principaux 2. Répond à la problématique 3. Propose une ouverture pertinente Contenu de la dissertation: {contenu} """ model = genai.GenerativeModel('gemini-1.5-flash-002',generation_config=generation_config, safety_settings=safety_settings) response = model.generate_content(prompt) return response.text @app.route('/api/histoire', methods=['POST']) def submit_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() ] if not sujet or not all(points): return jsonify({"error": "Tous les champs sont obligatoires"}), 400 try: """ # Génération de l'introduction dissertation = generer_introduction(sujet,points, "histoire") dissertation += "\n\n" # Génération du développement contexte = dissertation for point in points: section_texte, _ = rediger_section_histoire(sujet, point, contexte) dissertation += section_texte + "\n\n" contexte = dissertation # Génération de la conclusion dissertation += generer_conclusion(sujet, dissertation, "histoire") """ dissertation = rediger_tout(sujet,points) return jsonify({"output": dissertation}), 200 except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/api/geographie', methods=['POST']) def submit_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() ] if not sujet or not all(points): return jsonify({"error": "Tous les champs sont obligatoires"}), 400 try: # Génération de l'introduction dissertation = generer_introduction(sujet,points, "géographie") dissertation += "\n\n" # Génération du développement contexte = dissertation for point in points: section_texte, _ = rediger_section_geographie(sujet, point, contexte) dissertation += section_texte + "\n\n" contexte = dissertation # Génération de la conclusion dissertation += generer_conclusion(sujet, dissertation, "géographie") return jsonify({"output": dissertation}), 200 except Exception as e: return jsonify({"error": str(e)}), 500 def analyze_images(images, prompt): """Analyse les images fournies et génère une réponse textuelle.""" model = genai.GenerativeModel('gemini-pro-vision') response = model.generate_content( [prompt, *images], generation_config=generation_config, safety_settings=safety_settings ) return response.text @app.route('/api/histoire-type2', methods=['POST']) def submit_histoire_type2(): # Récupération des données sujet = request.form.get('sujet-histoire-type2', '').strip() if 'images-histoire-type2' not in request.files: return jsonify({"error": "Aucune image n'a été envoyée."}), 400 files = request.files.getlist('images-histoire-type2') if not sujet: return jsonify({"error": "Le champ sujet est obligatoire"}), 400 images = [] for file in files: if file.filename == '': return jsonify({"error": "Un ou plusieurs fichiers n'ont pas de nom."}), 400 try: img = PIL.Image.open(file) images.append(img) except Exception as 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""" Sujet: {sujet} Tu es un assistant spécialisé en histoire. Analyse les images fournies en lien avec le sujet donné. Structure de la réponse : 1. Description de chaque image. 2. Analyse du lien entre les images et le sujet. 3. Synthèse et informations pertinentes déduites des images. """ # 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: return jsonify({"error": str(e)}), 500 @app.route('/api/geographie-type2', methods=['POST']) def submit_geographie_type2(): # Récupération des données sujet = request.form.get('sujet-geographie-type2', '').strip() if 'images-geographie-type2' not in request.files: return jsonify({"error": "Aucune image n'a été envoyée."}), 400 files = request.files.getlist('images-geographie-type2') if not sujet: return jsonify({"error": "Le champ sujet est obligatoire"}), 400 images = [] for file in files: if file.filename == '': return jsonify({"error": "Un ou plusieurs fichiers n'ont pas de nom."}), 40