File size: 5,035 Bytes
17312e6 2af7dad 17312e6 6186ef3 979f189 6186ef3 2758e4e 979f189 2758e4e 957c597 0aa2a41 cd8a1b9 0aa2a41 979f189 957c597 979f189 957c597 6186ef3 957c597 f4884f9 957c597 2758e4e 957c597 979f189 2758e4e 957c597 ecd2eec 957c597 2758e4e 957c597 979f189 957c597 6186ef3 979f189 957c597 |
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 |
import streamlit as st
from google import genai
from google.genai import types
from PIL import Image
import json
import logging
# Configuration du logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
def stream_response(container, response):
"""Gère le streaming de la réponse avec un affichage progressif"""
mode = 'starting'
thinking_placeholder = None
answer_placeholder = None
thinking_text = ""
answer_text = ""
try:
for chunk in response:
logger.debug(f"Chunk reçu: {chunk}")
try:
for part in chunk.candidates[0].content.parts:
if hasattr(part, 'thought') and part.thought:
if mode != "thinking":
if thinking_placeholder is None:
with container.expander("Voir le raisonnement", expanded=False):
thinking_placeholder = st.empty()
mode = "thinking"
thinking_text += part.text
thinking_placeholder.markdown(thinking_text)
else:
if mode != "answering":
if answer_placeholder is None:
answer_placeholder = container.empty()
container.subheader("Réponse")
mode = "answering"
answer_text += part.text
answer_placeholder.markdown(answer_text)
except Exception as e:
logger.error(f"Erreur lors du traitement d'un chunk: {e}")
logger.debug(f"Contenu du chunk problématique: {chunk}")
raise
except Exception as e:
logger.error(f"Erreur dans le streaming de la réponse: {e}")
raise
def main():
st.title("Analyseur d'Images Géométriques avec Gemini")
# Utilisation des secrets pour la clé API
try:
api_key = st.secrets["GEMINI_API_KEY"]
except Exception as e:
logger.error(f"Erreur dans la récupération des secrets: {e}")
st.error("Erreur: Impossible d'accéder aux secrets de l'application.")
return
# Initialisation du client
try:
client = genai.Client(
api_key=api_key,
http_options={'api_version':'v1alpha'}
)
except Exception as e:
logger.error(f"Erreur d'initialisation du client: {e}")
st.error(f"Erreur lors de l'initialisation du client Gemini: {e}")
return
# Upload de l'image
uploaded_file = st.file_uploader("Choisissez une image géométrique", type=['png', 'jpg', 'jpeg'])
if uploaded_file:
try:
# Affichage de l'image
image = Image.open(uploaded_file)
st.image(image, caption="Image téléchargée", use_container_width=True)
# Configuration du modèle
model_name = "gemini-2.0-flash-thinking-exp-01-21"
if st.button("Analyser l'image"):
# Création d'un conteneur pour la réponse en streaming
response_container = st.container()
with st.spinner("Analyse en cours..."):
try:
# Préparation de la requête
request = {
"contents": [
{"image": image},
{"text": "What's the area of the overlapping region?"}
]
}
logger.debug(f"Envoi de la requête au modèle: {request}")
# Génération de la réponse en streaming
response = client.models.generate_content_stream(
model=model_name,
config={'thinking_config': {'include_thoughts': True}},
contents=[
image,
"Resous cette exercice. ça doit être bien présentable et espacé afin d'être facile à lire. "
]
)
# Streaming de la réponse
stream_response(response_container, response)
except Exception as e:
logger.error(f"Erreur lors de l'analyse: {e}", exc_info=True)
st.error(f"Erreur lors de l'analyse de l'image: {str(e)}")
except Exception as e:
logger.error(f"Erreur lors du traitement de l'image: {e}", exc_info=True)
st.error(f"Erreur lors du traitement de l'image: {str(e)}")
if __name__ == "__main__":
main() |