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()