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