Docfile commited on
Commit
4c30bf8
·
verified ·
1 Parent(s): 5faadee

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +80 -83
app.py CHANGED
@@ -1,136 +1,133 @@
1
-
2
-
3
  import streamlit as st
4
  from google import genai
5
  from PIL import Image
6
- import io
7
  import os
8
- import google.auth
9
- import subprocess
10
  import tempfile
11
- import shutil
12
 
13
- # Authenticate using the application default credentials
14
- #credentials, project = google.auth.default()
15
- gen = api_key=os.environ['GOOGLE_API_KEY']
16
- # Initialize the Gemini client
17
  client = genai.Client(api_key=gen)
18
 
19
  def ensure_latex_packages():
20
  """Vérifie si les packages LaTeX nécessaires sont installés."""
21
- required_packages = ['amsmath', 'amssymb']
22
-
23
  try:
24
- # Vérifie si pdflatex est installé
25
  subprocess.run(['pdflatex', '--version'], capture_output=True, check=True)
26
  return True
27
- except subprocess.CalledProcessError:
28
  st.error("pdflatex n'est pas installé. Veuillez installer TeX Live ou MiKTeX.")
29
  return False
30
- except FileNotFoundError:
31
- st.error("pdflatex n'est pas trouvé. Veuillez installer TeX Live ou MiKTeX.")
32
- return False
33
 
34
- def generate_latex_response(image, question):
35
  """Génère une réponse en format LaTeX depuis le modèle Gemini."""
36
  try:
37
- images = Image.open(image)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  response = client.models.generate_content(
39
  model="gemini-2.0-flash-thinking-exp",
40
- contents=[images, question],
41
  )
42
- # Extrait les pensées et la réponse
43
- thoughts = response.candidates[0].content.parts[0].text
44
- answer = response.candidates[0].content.parts[1].text
45
-
46
- # Formate en LaTeX
47
- latex_output = answer
48
- print(answer)
49
- return answer
50
-
51
  except Exception as e:
52
- return f"Une erreur s'est produite: {e}"
 
53
 
54
  def latex_to_pdf(latex_content):
55
  """Convertit le contenu LaTeX en PDF."""
56
- # Crée un dossier temporaire pour les fichiers LaTeX
57
  with tempfile.TemporaryDirectory() as temp_dir:
58
- # Chemin du fichier tex
59
  tex_file = os.path.join(temp_dir, "output.tex")
60
-
61
- # Écrit le contenu LaTeX dans le fichier
62
  with open(tex_file, "w", encoding="utf-8") as f:
63
  f.write(latex_content)
64
 
65
  try:
66
- # Exécute pdflatex deux fois pour assurer la bonne génération des références
67
- for _ in range(2):
68
- subprocess.run(
69
- ["pdflatex", "-interaction=nonstopmode", "output.tex"],
70
- cwd=temp_dir,
71
- capture_output=True,
72
- check=True
73
- )
74
-
75
- # Lit le fichier PDF généré
76
- pdf_file = os.path.join(temp_dir, "output.pdf")
77
- with open(pdf_file, "rb") as f:
78
- pdf_data = f.read()
79
-
80
- return pdf_data
81
 
 
 
 
 
 
 
 
 
 
 
82
  except subprocess.CalledProcessError as e:
83
- st.error(f"Erreur lors de la génération du PDF: {e}")
84
- st.code(e.output.decode())
85
  return None
86
 
87
- # Application Streamlit
88
  def main():
89
  st.title("Application Gemini 2.0 avec Export PDF")
90
 
91
- # Vérifie si LaTeX est installé
92
  if not ensure_latex_packages():
93
- st.stop()
94
 
95
  uploaded_file = st.file_uploader("Choisissez une image...", type=["png", "jpg", "jpeg"])
96
-
97
- if uploaded_file is not None:
98
- with tempfile.NamedTemporaryFile(delete=False, suffix='.png') as tmp_file:
99
- tmp_file.write(uploaded_file.getvalue())
100
- temp_image_path = tmp_file.name
101
- # Affiche l'image téléchargée
102
- image = Image.open(temp_image_path)
103
- st.image(image, caption="Image téléchargée", use_container_width=True)
104
-
105
- # Obtient la question de l'utilisateur
106
  question = st.text_input("Entrez votre question:")
107
-
108
- if st.button("Générer la réponse"):
109
- if question:
110
- with st.spinner("Génération de la réponse en cours..."):
111
- # Convertit l'image PIL en bytes pour l'API Gemini
 
 
 
 
112
 
113
- # Génère la réponse LaTeX
114
- latex_response = generate_latex_response(temp_image_path, question)
115
-
116
- # Affiche la réponse LaTeX
117
- st.markdown("### Code LaTeX généré:")
118
- st.text(latex_response)
119
-
120
  # Convertit en PDF
121
  with st.spinner("Conversion en PDF..."):
122
- pdf_data = latex_to_pdf(latex_response)
123
 
124
  if pdf_data:
125
- # Crée un bouton de téléchargement
126
  st.download_button(
127
- label="Télécharger le PDF",
128
- data=pdf_data,
129
- file_name="reponse_gemini.pdf",
130
  mime="application/pdf"
131
  )
132
- else:
133
- st.warning("Veuillez entrer une question.")
 
134
 
135
  if __name__ == "__main__":
136
  main()
 
 
 
1
  import streamlit as st
2
  from google import genai
3
  from PIL import Image
 
4
  import os
 
 
5
  import tempfile
6
+ import subprocess
7
 
8
+ # Configuration de l'API Gemini
9
+ gen = os.environ['GOOGLE_API_KEY']
 
 
10
  client = genai.Client(api_key=gen)
11
 
12
  def ensure_latex_packages():
13
  """Vérifie si les packages LaTeX nécessaires sont installés."""
 
 
14
  try:
 
15
  subprocess.run(['pdflatex', '--version'], capture_output=True, check=True)
16
  return True
17
+ except (subprocess.CalledProcessError, FileNotFoundError):
18
  st.error("pdflatex n'est pas installé. Veuillez installer TeX Live ou MiKTeX.")
19
  return False
 
 
 
20
 
21
+ def generate_latex_response(image_path, question):
22
  """Génère une réponse en format LaTeX depuis le modèle Gemini."""
23
  try:
24
+ # Charge l'image pour l'API
25
+ with open(image_path, 'rb') as img_file:
26
+ image_data = img_file.read()
27
+
28
+ # Prépare le template LaTeX
29
+ latex_template = r"""\documentclass{article}
30
+ \usepackage[utf8]{inputenc}
31
+ \usepackage[T1]{fontenc}
32
+ \usepackage{amsmath}
33
+ \usepackage{amsfonts}
34
+ \usepackage{amssymb}
35
+ \begin{document}
36
+ %s
37
+ \end{document}
38
+ """
39
+
40
+ # Génère la réponse avec Gemini
41
  response = client.models.generate_content(
42
  model="gemini-2.0-flash-thinking-exp",
43
+ contents=[{"mime_type": "image/jpeg", "data": image_data}, question]
44
  )
45
+
46
+ # Extrait la réponse
47
+ answer = response.text
48
+
49
+ # Formate la réponse en LaTeX complet
50
+ return latex_template % answer
51
+
 
 
52
  except Exception as e:
53
+ st.error(f"Erreur lors de la génération de la réponse: {str(e)}")
54
+ return None
55
 
56
  def latex_to_pdf(latex_content):
57
  """Convertit le contenu LaTeX en PDF."""
 
58
  with tempfile.TemporaryDirectory() as temp_dir:
59
+ # Crée le fichier tex
60
  tex_file = os.path.join(temp_dir, "output.tex")
 
 
61
  with open(tex_file, "w", encoding="utf-8") as f:
62
  f.write(latex_content)
63
 
64
  try:
65
+ # Exécute pdflatex
66
+ process = subprocess.run(
67
+ ["pdflatex", "-interaction=nonstopmode", tex_file],
68
+ cwd=temp_dir,
69
+ capture_output=True,
70
+ text=True,
71
+ check=True
72
+ )
 
 
 
 
 
 
 
73
 
74
+ # Vérifie si le PDF a été généré
75
+ pdf_path = os.path.join(temp_dir, "output.pdf")
76
+ if os.path.exists(pdf_path):
77
+ with open(pdf_path, "rb") as f:
78
+ return f.read()
79
+ else:
80
+ st.error("Le fichier PDF n'a pas été généré")
81
+ st.code(process.stdout)
82
+ return None
83
+
84
  except subprocess.CalledProcessError as e:
85
+ st.error(f"Erreur lors de la compilation LaTeX: {str(e)}")
86
+ st.code(e.stdout)
87
  return None
88
 
 
89
  def main():
90
  st.title("Application Gemini 2.0 avec Export PDF")
91
 
 
92
  if not ensure_latex_packages():
93
+ return
94
 
95
  uploaded_file = st.file_uploader("Choisissez une image...", type=["png", "jpg", "jpeg"])
96
+
97
+ if uploaded_file:
98
+ # Sauvegarde temporaire de l'image
99
+ with tempfile.NamedTemporaryFile(delete=False, suffix='.jpg') as temp_file:
100
+ temp_file.write(uploaded_file.getvalue())
101
+ temp_path = temp_file.name
102
+
103
+ st.image(uploaded_file, caption="Image téléchargée")
104
+
 
105
  question = st.text_input("Entrez votre question:")
106
+
107
+ if st.button("Générer la réponse") and question:
108
+ with st.spinner("Génération de la réponse..."):
109
+ # Génère la réponse LaTeX
110
+ latex_content = generate_latex_response(temp_path, question)
111
+
112
+ if latex_content:
113
+ st.markdown("### Réponse LaTeX générée:")
114
+ st.text(latex_content)
115
 
 
 
 
 
 
 
 
116
  # Convertit en PDF
117
  with st.spinner("Conversion en PDF..."):
118
+ pdf_data = latex_to_pdf(latex_content)
119
 
120
  if pdf_data:
121
+ st.success("PDF généré avec succès!")
122
  st.download_button(
123
+ "Télécharger le PDF",
124
+ pdf_data,
125
+ file_name="reponse.pdf",
126
  mime="application/pdf"
127
  )
128
+
129
+ # Nettoie le fichier temporaire
130
+ os.unlink(temp_path)
131
 
132
  if __name__ == "__main__":
133
  main()