mrap / app.py
Docfile's picture
Update app.py
2625f8a verified
raw
history blame
5.49 kB
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
# Authenrticate using the application default credentials
#credentials, project = google.auth.default()
gen = api_key=os.environ['GOOGLE_API_KEY']
# Initialize the Gemini client
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:
# Vérifie si pdflatex est installé
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(question)
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, prompt]
)
# Extrait la réponse et retire les délimiteurs LaTeX
answer = response.candidates[0].content.parts[1].text
# Retire les délimiteurs ```latex au début et ``` à la fin
if answer.startswith("```latex"):
answer = answer[8:] # Retire ```latex
if answer.endswith("```"):
answer = answer[:-3] # Retire ```
return answer.strip() # Retire les espaces supplémentaires
except Exception as e:
st.error(f"Erreur lors de la génération de la réponse: {str(e)}")
return None
def latex_to_pdf(latex_content):
"""Convertit le contenu LaTeX en PDF."""
# Crée un dossier temporaire pour les fichiers LaTeX
with tempfile.TemporaryDirectory() as temp_dir:
# Chemin du fichier tex
tex_file = os.path.join(temp_dir, "output.tex")
# Écrit le contenu LaTeX dans le fichier
with open(tex_file, "w", encoding="utf-8") as f:
f.write(latex_content)
try:
# Exécute pdflatex deux fois pour assurer la bonne génération des références
for _ in range(2):
subprocess.run(
["pdflatex", "-interaction=nonstopmode", "output.tex"],
cwd=temp_dir,
capture_output=True,
check=True
)
# Lit le fichier PDF généré
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
# Application Streamlit
def main():
st.title("Math/physique/chimie pdf test avec Export PDF")
# Vérifie si LaTeX est installé
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
# Affiche l'image téléchargée
image = Image.open(temp_image_path)
st.image(image, caption="Image téléchargée", use_container_width=True)
# Obtient la question de l'utilisateur
#question = st.text_input("Entrez votre question:")
question= None
if st.button("Générer la réponse"):
if question:
with st.spinner("Génération de la réponse en cours..."):
# Convertit l'image PIL en bytes pour l'API Gemini
# Génère la réponse LaTeX
latex_response = generate_latex_response(temp_image_path, question)
# Affiche la réponse LaTeX
st.markdown("### Code LaTeX généré:")
st.text("Réponse !!")
# Convertit en PDF
with st.spinner("Conversion en PDF..."):
pdf_data = latex_to_pdf(latex_response)
if pdf_data:
# Crée un bouton de téléchargement
st.download_button(
label="Télécharger le PDF",
data=pdf_data,
file_name="reponse_mariam.pdf",
mime="application/pdf"
)
else:
st.warning("Veuillez entrer une question.")
if __name__ == "__main__":
main()