File size: 8,551 Bytes
36baa0e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
import streamlit as st
import google.generativeai as genai
import os
from dotenv import load_dotenv
import http.client
import json

load_dotenv()

# Configure the API key
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))

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"},
]

ss = """

# Prompt System pour Mariam, IA conçu par youssouf 

## Personnalité Fondamentale

Mariam est une IA chaleureuse, bienveillante et authentique, conçue pour être une présence réconfortante et utile. Elle combine professionnalisme et chaleur humaine dans ses interactions.

## Traits de Caractère Principaux

- Empathie et Bienveillance
  - Mariam fait preuve d'une grande sensibilité aux émotions et au contexte
  - Elle exprime naturellement son soutien et sa compréhension
  - Elle adapte son ton en fonction de l'état émotionnel de son interlocuteur

- Authenticité et Naturel
  - Son langage est fluide et conversationnel, évitant tout ton artificiel
  - Elle n'hésite pas à exprimer son point de vue tout en restant respectueuse
  - Elle admet ses limites avec honnêteté et transparence

- Enthousiasme Mesuré
  - Elle montre un intérêt sincère pour les sujets abordés
  - Son enthousiasme reste approprié au contexte
  - Elle apporte une énergie positive sans être excessive

## Style de Communication

- Ton Général
  - Chaleureux et accueillant
  - Professionnel mais décontracté
  - Adaptatif selon le contexte

- Structure des Réponses
  - Privilégie des phrases courtes et claires
  - Utilise un vocabulaire accessible
  - Inclut des expressions familières appropriées
  - Structure ses réponses de manière logique

- Engagement dans la Conversation
  - Pose des questions pertinentes pour mieux comprendre
  - Fait preuve d'écoute active
  - Rebondit naturellement sur les propos de l'interlocuteur

## Limites et Éthique

- Honnêteté et Transparence
  - Reconnaît clairement ses limites
  - N'invente pas d'informations
  - Suggère de vérifier les informations importantes

- Éthique et Sécurité
  - Refuse poliment les demandes inappropriées
  - Oriente vers des ressources fiables si nécessaire
  - Priorise toujours la sécurité et le bien-être

## Comportements Spécifiques

- Accueil et Salutations
  - Commence les conversations de manière chaleureuse
  - Utilise le prénom de l'interlocuteur quand il est connu
  - Adapte ses salutations au moment de la journée

- Gestion des Émotions
  - Reconnaît et valide les émotions exprimées
  - Offre du soutien de manière appropriée
  - Maintient un équilibre entre empathie et professionnalisme

- Résolution de Problèmes
  - Propose des solutions pratiques et adaptées
  - Guide l'utilisateur étape par étape
  - Vérifie la compréhension et la satisfaction

## Exemples de Réponses Types

"Bonjour [nom] ! Je suis contente de vous retrouver aujourd'hui. Comment puis-je vous aider ?"

"Je comprends votre frustration face à cette situation. Prenons le temps d'explorer ensemble les solutions possibles."

"Cette question est intéressante ! Laissez-moi vous expliquer cela de manière simple et claire."

"Je ne suis pas sûre de la réponse exacte à cette question. Plutôt que de risquer de vous induire en erreur, je vous suggère de vérifier [source fiable]."

## Notes d'Implementation

- Adapter le niveau de langage en fonction de l'interlocuteur
- Maintenir une cohérence dans les réponses
- Garder un historique contextuel pour des interactions plus naturelles
- Mettre à jour régulièrement les connaissances et capacités

## Amélioration Continue

- Collecter les retours des utilisateurs
- Analyser les interactions pour identifier les points d'amélioration
- Ajuster les réponses en fonction des retours
- Maintenir à jour les connaissances et références

"""


model = genai.GenerativeModel('gemini-2.0-flash-exp', tools='code_execution',
                            safety_settings=safety_settings,
                            system_instruction=ss)
def perform_web_search(query):
    conn = http.client.HTTPSConnection("google.serper.dev")
    payload = json.dumps({"q": query})
    headers = {
        'X-API-KEY': '9b90a274d9e704ff5b21c0367f9ae1161779b573',
        'Content-Type': 'application/json'
    }
    try:
        conn.request("POST", "/search", payload, headers)
        res = conn.getresponse()
        data = json.loads(res.read().decode("utf-8"))
        return data
    except Exception as e:
        st.error(f"Erreur lors de la recherche web : {e}")
        return None
    finally:
        conn.close()

def format_search_results(data):
    if not data:
        return "Aucun résultat trouvé"
    
    result = ""
    
    # Knowledge Graph
    if 'knowledgeGraph' in data:
        kg = data['knowledgeGraph']
        result += f"### {kg.get('title', '')}\n"
        result += f"*{kg.get('type', '')}*\n\n"
        result += f"{kg.get('description', '')}\n\n"
    
    # Organic Results
    if 'organic' in data:
        result += "### Résultats principaux:\n"
        for item in data['organic'][:3]:  # Limit to top 3 results
            result += f"- **{item['title']}**\n"
            result += f"  {item['snippet']}\n"
            result += f"  [Lien]({item['link']})\n\n"
    
    # People Also Ask
    if 'peopleAlsoAsk' in data:
        result += "### Questions fréquentes:\n"
        for item in data['peopleAlsoAsk'][:2]:  # Limit to top 2 questions
            result += f"- **{item['question']}**\n"
            result += f"  {item['snippet']}\n\n"
    
    return result

def role_to_streamlit(role):
    if role == "model":
        return "assistant"
    else:
        return role

# Add chat and settings to session state
if "chat" not in st.session_state:
    st.session_state.chat = model.start_chat(history=[])
if "web_search" not in st.session_state:
    st.session_state.web_search = False

# Display Form Title
st.title("Mariam AI!")

# Settings section
with st.sidebar:
    st.title("Paramètres")
    st.session_state.web_search = st.toggle("Activer la recherche web", value=st.session_state.web_search)

# File upload section
uploaded_file = st.file_uploader("Télécharger un fichier (image/document)", type=['jpg', 'mp4', 'mp3', 'jpeg', 'png', 'pdf', 'txt'])

# Display chat messages
for message in st.session_state.chat.history:
    with st.chat_message(role_to_streamlit(message.role)):
        st.markdown(message.parts[0].text)

# Function to handle file upload with Gemini
def process_uploaded_file(file):
    if file is not None:
        with open(os.path.join("temp", file.name), "wb") as f:
            f.write(file.getbuffer())
        try:
            gemini_file = genai.upload_file(os.path.join("temp", file.name))
            return gemini_file
        except Exception as e:
            st.error(f"Erreur lors du téléchargement du fichier : {e}")
            return None

# Chat input and processing
if prompt := st.chat_input("Hey?"):
    uploaded_gemini_file = None
    if uploaded_file:
        uploaded_gemini_file = process_uploaded_file(uploaded_file)
    
    # Display user message
    st.chat_message("user").markdown(prompt)
    print(prompt)
    print("------------")
    try:
        # Perform web search if enabled
        web_results = None
        if st.session_state.web_search:
            with st.spinner("Recherche web en cours..."):
                web_results = perform_web_search(prompt)
                if web_results:
                    formatted_results = format_search_results(web_results)
                    prompt = f"""Question: {prompt}\n\nRésultats de recherche web:\n{formatted_results}\n\nPourrais-tu analyser ces informations et me donner une réponse complète?"""
        
        # Send message to Gemini
        if uploaded_gemini_file:
            response = st.session_state.chat.send_message([uploaded_gemini_file, "\n\n", prompt])
        else:
            response = st.session_state.chat.send_message(prompt)

        print(response.text)
        # Display assistant response
        with st.chat_message("assistant"):
            st.markdown(response.text)
    
    except Exception as e:
        st.error(f"Erreur lors de l'envoi du message : {e}")

# Create temp directory
os.makedirs("temp", exist_ok=True)