Spaces:
Sleeping
Sleeping
File size: 4,005 Bytes
5f9325a a10ea6b 5f9325a a10ea6b 5f9325a a10ea6b 5f9325a a10ea6b 5f9325a a10ea6b 5f9325a a10ea6b 5f9325a a10ea6b 5f9325a a10ea6b 5f9325a a10ea6b 5f9325a a10ea6b |
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 |
from flask import Flask, request, render_template, send_from_directory
import google.generativeai as genai
import os
from PIL import Image
import io
import subprocess
import uuid
import re
import tempfile
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads'
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
# Configuration de l'API Gemini
token = os.environ.get("TOKEN")
if not token:
raise ValueError("La variable d'environnement TOKEN doit être définie.")
genai.configure(api_key=token)
generation_config = {
"temperature": 1,
"top_p": 0.95,
"top_k": 64,
"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"},
]
mm = """resous cet exercice. tu répondras en détaillant au maximum ton procédé de calcul. réponse attendue uniquement en Latex
"""
model = genai.GenerativeModel(
model_name="gemini-1.5-pro",
generation_config=generation_config,
safety_settings=safety_settings,
)
@app.route("/", methods=["GET", "POST"])
def index():
e = ""
if request.method == "POST":
if "image" not in request.files:
e = "Aucune image sélectionnée."
else:
image_file = request.files["image"]
try:
with tempfile.NamedTemporaryFile(delete=False) as temp_img:
image_file.save(temp_img.name)
image = Image.open(temp_img.name)
response = model.generate_content([mm, image])
latex_code = response.text
os.remove(temp_img.name)
match = re.search(r"\\chemfig\{(.*?)\}", latex_code, re.DOTALL)
if match:
chemfig_code = match.group(1)
try:
with tempfile.TemporaryDirectory() as tmpdirname:
svg_filename = generate_svg_from_chemfig(chemfig_code, tmpdirname)
e = f'<img src="/uploads/{svg_filename}" alt="Structure chimique">'
except Exception as svg_error:
e = f"Erreur lors de la génération de l'image SVG : {str(svg_error)}"
elif any(keyword in latex_code.lower() for keyword in ['.pdf', '.png', '.jpg', '.jpeg', '.gif', '.bmp', '.svg']):
e = "Désolé, les images et les PDF ne sont pas encore pris en charge dans la réponse."
else:
e = latex_code
except Exception as img_err:
e = f"Erreur lors du traitement de l'image: {str(img_err)}"
return render_template("index.html", e=e)
def generate_svg_from_chemfig(chemfig_code, tmpdirname):
unique_id = str(uuid.uuid4())
tex_filename = os.path.join(tmpdirname, f"chem_{unique_id}.tex")
pdf_filename = os.path.join(tmpdirname, f"chem_{unique_id}.pdf")
svg_filename = f"chem_{unique_id}.svg"
tex_content = f"""\\documentclass[margin=10pt]{{standalone}}
\\usepackage{{chemfig}}
\\begin{{document}}
\\chemfig{{{chemfig_code}}}
\\end{{document}}"""
with open(tex_filename, "w") as tex_file:
tex_file.write(tex_content)
try:
subprocess.run(["pdflatex", "-interaction=nonstopmode", tex_filename], check=True, cwd=tmpdirname)
subprocess.run(["pdf2svg", pdf_filename, os.path.join(app.config['UPLOAD_FOLDER'], svg_filename)], check=True)
return svg_filename
except subprocess.CalledProcessError as e:
raise Exception(f"Erreur lors de la compilation LaTeX ou de la conversion en SVG : {e}")
@app.route('/uploads/<filename>')
def uploaded_file(filename):
return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
if __name__ == "__main__":
app.run(debug=True) |