File size: 5,221 Bytes
a1445fb f200cca 06d8ed2 9ee01a9 06d8ed2 4c30bf8 06d8ed2 f200cca 06d8ed2 f200cca 06d8ed2 f200cca 06d8ed2 f200cca 06d8ed2 f200cca 06d8ed2 dd6e891 06d8ed2 f200cca 06d8ed2 4c30bf8 06d8ed2 4c30bf8 06d8ed2 f200cca 06d8ed2 f200cca 06d8ed2 f200cca 06d8ed2 f200cca 9ee01a9 06d8ed2 4c30bf8 9ee01a9 06d8ed2 4c30bf8 f200cca 4c30bf8 f200cca 06d8ed2 f200cca 0b9a8bb 06d8ed2 f200cca 06d8ed2 f200cca 06d8ed2 f200cca 06d8ed2 4c30bf8 06d8ed2 f200cca |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
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
# Authenticate using the application default credentials
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, question):
"""Génère une réponse en format LaTeX depuis le modèle Gemini."""
try:
images = Image.open(image)
response = client.models.generate_content(
model="gemini-2.0-flash-thinking-exp",
contents=[images, question],
)
# Extrait les pensées et la réponse
thoughts = response.candidates[0].content.parts[0].text
answer = response.candidates[0].content.parts[1].text
# Préparation du template LaTeX
latex_template = r"""\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\begin{document}
%s
\end{document}
""" % answer
return latex_template
except Exception as e:
return f"Une erreur s'est produite: {e}"
def latex_to_pdf(latex_content):
"""Convertit le contenu LaTeX en PDF."""
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:
# Execute pdflatex
process = subprocess.run(
["pdflatex", "-interaction=nonstopmode", tex_file],
cwd=temp_dir,
capture_output=True,
text=True,
check=True
)
# Vérifie si le PDF existe
pdf_path = os.path.join(temp_dir, "output.pdf")
if os.path.exists(pdf_path):
with open(pdf_path, "rb") as f:
return f.read()
else:
st.error("Le fichier PDF n'a pas été généré")
st.code(process.stdout)
return None
except subprocess.CalledProcessError as e:
st.error(f"Erreur lors de la compilation LaTeX: {str(e)}")
st.code(e.stdout)
return None
# Application Streamlit
def main():
st.title("Application Gemini 2.0 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:")
if st.button("Générer la réponse"):
if question:
with st.spinner("Génération de la réponse en cours..."):
# Génère la réponse LaTeX
latex_response = generate_latex_response(temp_image_path, question)
# Affiche la réponse LaTeX brute
st.markdown("### Code LaTeX généré:")
st.text(latex_response)
if latex_response:
# Convertit en PDF
with st.spinner("Conversion en PDF..."):
pdf_data = latex_to_pdf(latex_response)
if pdf_data:
st.success("PDF généré avec succès!")
# Crée un bouton de téléchargement
st.download_button(
label="Télécharger le PDF",
data=pdf_data,
file_name="reponse_gemini.pdf",
mime="application/pdf"
)
else:
st.warning("Veuillez entrer une question.")
# Nettoie le fichier temporaire
os.unlink(temp_image_path)
if __name__ == "__main__":
main() |