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