|
|
|
|
| import streamlit as st |
| from google import genai |
| from PIL import Image |
| import io |
| import os |
| import google.auth |
| import subprocess |
| import tempfile |
| import shutil |
|
|
|
|
|
|
| pm = """ |
| |
| Introduction : |
| Dans son extrait de texte, ………… (Nom de l'auteur) aborde la thématique relative à/au ………… (Thème du texte) ; et répond en substance à la question de savoir si ………… (Question implicite). Sans ambiguïté, il répond en ces termes : "…………" (Thèse de l'auteur). Entendons par là que ………… (Reformulation de la thèse). En effet, si pour l'auteur ………… (Idée de la thèse) ; cependant, ne devons-nous pas aussi/ne pouvons-nous pas aussi affirmer ou dire que ………… (Idée de la nuance) ? |
| |
| |
| Développement : |
| |
| Pour mener à bien sa thèse, ………… (Nom de l'auteur) structure son argumentaire en deux principaux mouvements, à savoir : dans le premier « Premier mot (...) dernier mot », il traite de ………… (Idée du mouvement). Et dans le second « Premier mot (...) dernier mot », il parle de (Idée du mouvement). |
| |
| Alinéa Pour l'auteur, (Explication détaillé de l'idée du mouvement) |
| |
| Alinéa Plus loin,(Explication détaillé de l'idée du mouvement) |
| |
| • 1 ligne |
| |
| Au regard de ce qui précède, nous convenons avec l'auteur que………… (Idée de la thèse). Cependant, (Idée de la nuance prise dans l'introduction) ? |
| |
| • 1 ligne |
| |
| |
| conclusion : |
| Ce texte de ………… (Nom de l'auteur) revêt un intérêt pédagogique dans la mesure où il nous enseigne que………… (Thèse de l'auteur). En effet, |
| |
| (Corroboration/Justification de la thèse de l'auteur). |
| |
| D'un autre auteur qui aborde le même problème dans le sens de l'auteur du texte) ne dit pas le contraire lorsqu'il affirme que : "…………". Ceci pour signifier que (Explication de la citation). |
| |
| |
| |
| """ |
|
|
|
|
|
|
| |
| |
| gen = api_key=os.environ['GOOGLE_API_KEY'] |
| |
| client = genai.Client(api_key=gen) |
|
|
| def ensure_latex_packages(): |
| """Vérifie si les packages LaTeX nécessaires sont installés.""" |
| required_packages = ['amsmath', 'amssymb'] |
| |
| try: |
| |
| subprocess.run(['pdflatex', '--version'], capture_output=True, check=True) |
| return True |
| except subprocess.CalledProcessError: |
| st.error("pdflatex n'est pas installé. Veuillez installer TeX Live ou MiKTeX.") |
| return False |
| except FileNotFoundError: |
| st.error("pdflatex n'est pas trouvé. Veuillez installer TeX Live ou MiKTeX.") |
| return False |
|
|
| def generate_latex_response(image_path, question): |
| """Génère une réponse en format LaTeX depuis le modèle Gemini.""" |
| try: |
| |
| print("Utiliser ") |
| prompt = "Resous cette exercice. ça doit être bien présentable. c'est un devoir de lycée terminal S. Write you answer with rendering Latex . Donne uniquement du code Latex et rien d'autre. Commence ta réponse par \document" |
| image_data = Image.open(image_path) |
| response = client.models.generate_content( |
| model="gemini-2.0-flash-thinking-exp", |
| contents=[image_data, pm] |
| ) |
| |
| |
| answer = response.candidates[0].content.parts[1].text |
| |
| |
| |
| return answer |
| |
| except Exception as e: |
| st.error(f"Erreur lors de la génération de la réponse: ") |
| print(e) |
| return None |
| def latex_to_pdf(latex_content): |
| """Convertit le contenu LaTeX en PDF.""" |
| |
| with tempfile.TemporaryDirectory() as temp_dir: |
| |
| tex_file = os.path.join(temp_dir, "output.tex") |
| |
| |
| with open(tex_file, "w", encoding="utf-8") as f: |
| f.write(latex_content) |
| |
| try: |
| |
| for _ in range(2): |
| subprocess.run( |
| ["pdflatex", "-interaction=nonstopmode", "output.tex"], |
| cwd=temp_dir, |
| capture_output=True, |
| check=True |
| ) |
| |
| |
| pdf_file = os.path.join(temp_dir, "output.pdf") |
| with open(pdf_file, "rb") as f: |
| pdf_data = f.read() |
| |
| return pdf_data |
| |
| except subprocess.CalledProcessError as e: |
| st.error(f"Erreur lors de la génération du PDF: {e}") |
| st.code(e.output.decode()) |
| return None |
|
|
| |
| def main(): |
| st.title("...") |
| |
| |
| if not ensure_latex_packages(): |
| st.stop() |
| |
| uploaded_file = st.file_uploader("Choisissez une image...", type=["png", "jpg", "jpeg"]) |
|
|
| if uploaded_file is not None: |
| with tempfile.NamedTemporaryFile(delete=False, suffix='.png') as tmp_file: |
| tmp_file.write(uploaded_file.getvalue()) |
| temp_image_path = tmp_file.name |
| |
| image = Image.open(temp_image_path) |
| st.image(image, caption="Image téléchargée", use_container_width=True) |
|
|
| |
| |
| question= "yusuf" |
| |
|
|
| if st.button("Générer la réponse"): |
| if question: |
| with st.spinner("Génération de la réponse en cours..."): |
| |
| |
| |
| latex_response = generate_latex_response(temp_image_path, question) |
|
|
| |
| st.markdown("### ~:") |
| st.markdown(latex_response) |
|
|
| |
| |
| else: |
| st.warning("Veuillez entrer une question.") |
|
|
| if __name__ == "__main__": |
| main() |