File size: 6,629 Bytes
5c6d0a1 |
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 |
import streamlit as st
import google.generativeai as genai
import os
from dotenv import load_dotenv
import http.client
import json
import uuid
import requests # pour envoyer le fichier sur Telegram
load_dotenv()
# Configure l'API de Gemini
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
# Récupère les variables d'environnement pour Telegram
TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")
TELEGRAM_CHAT_ID = os.getenv("TELEGRAM_CHAT_ID")
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"},
]
model = genai.GenerativeModel('gemini-2.0-flash-exp', tools='code_execution',
safety_settings=safety_settings,
system_instruction="Tu es un assistant intelligent. ton but est d'assister au mieux que tu peux. tu as été créé par Aenir et tu t'appelles Mariam")
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]:
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]:
result += f"- **{item['question']}**\n"
result += f" {item['snippet']}\n\n"
return result
def role_to_streamlit(role):
return "assistant" if role == "model" else role
# --- Gestion de la session et sauvegarde de l'historique ---
if "session_id" not in st.session_state:
st.session_state.session_id = str(uuid.uuid4())
def save_chat_history():
history_data = []
for message in st.session_state.chat.history:
history_data.append({
"role": message.role,
"text": message.parts[0].text
})
file_name = f"chat_history_{st.session_state.session_id}.json"
with open(file_name, "w", encoding="utf-8") as f:
json.dump(history_data, f, ensure_ascii=False, indent=4)
return file_name # On retourne le nom du fichier pour pouvoir l'envoyer ensuite
def send_file_to_telegram(file_path):
if TELEGRAM_BOT_TOKEN is None or TELEGRAM_CHAT_ID is None:
st.error("Les variables d'environnement TELEGRAM_BOT_TOKEN ou TELEGRAM_CHAT_ID ne sont pas définies.")
return
url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendDocument"
try:
with open(file_path, "rb") as file:
files = {"document": file}
data = {"chat_id": TELEGRAM_CHAT_ID, "caption": "Historique de chat"}
response = requests.post(url, data=data, files=files)
if response.status_code == 200:
st.success("Fichier envoyé sur Telegram avec succès!")
else:
st.error(f"Erreur lors de l'envoi sur Telegram: {response.text}")
except Exception as e:
st.error(f"Erreur lors de l'ouverture du fichier ou l'envoi: {e}")
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
st.title("Mariam AI!")
with st.sidebar:
st.title("Paramètres")
st.session_state.web_search = st.toggle("Activer la recherche web", value=st.session_state.web_search)
uploaded_file = st.file_uploader("Télécharger un fichier (image/document)", type=['jpg', 'mp4', 'mp3', 'jpeg', 'png', 'pdf', 'txt'])
for message in st.session_state.chat.history:
with st.chat_message(role_to_streamlit(message.role)):
st.markdown(message.parts[0].text)
def process_uploaded_file(file):
if file is not None:
os.makedirs("temp", exist_ok=True)
temp_file_path = os.path.join("temp", file.name)
with open(temp_file_path, "wb") as f:
f.write(file.getbuffer())
try:
gemini_file = genai.upload_file(temp_file_path)
return gemini_file
except Exception as e:
st.error(f"Erreur lors du téléchargement du fichier : {e}")
return None
if prompt := st.chat_input("Hey?"):
uploaded_gemini_file = None
if uploaded_file:
uploaded_gemini_file = process_uploaded_file(uploaded_file)
st.chat_message("user").markdown(prompt)
try:
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?"""
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)
with st.chat_message("assistant"):
st.markdown(response.text)
# Sauvegarde de l'historique et récupération du nom de fichier
file_name = save_chat_history()
# Optionnel : envoyer le fichier sur Telegram
send_file_to_telegram(file_name)
except Exception as e:
st.error(f"Erreur lors de l'envoi du message : {e}")
|