Spaces:
Sleeping
Sleeping
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 | |
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 | |
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 | |
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 | |
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 | |
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 |