HistoireGeo / app.py
Docfile's picture
Update app.py
281e951 verified
raw
history blame
9.8 kB
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