File size: 5,706 Bytes
dda2241
 
 
 
 
 
8c09efe
dda2241
8c09efe
dda2241
 
8c09efe
dda2241
 
8c09efe
dda2241
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10be51f
dda2241
 
10be51f
dda2241
 
 
 
 
10be51f
dda2241
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10be51f
dda2241
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10be51f
dda2241
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10be51f
dda2241
 
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
from flask import Flask, render_template, request, redirect, url_for, session
import os
import json
import http.client
import google.generativeai as genai
from dotenv import load_dotenv

load_dotenv()

app = Flask(__name__)
app.secret_key = 'votre-cle-secrete'  # Remplacez par une clé forte

# Configure la clé API pour Google Generative AI
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))

# Paramètres de sécurité
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"},
]

# Prompt système pour Mariam
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.

...
"""  # Vous pouvez insérer le prompt complet ici

# Création du modèle Gemini
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:
        print(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 process_uploaded_file(file):
    if file:
        upload_dir = 'temp'
        if not os.path.exists(upload_dir):
            os.makedirs(upload_dir)
        filepath = os.path.join(upload_dir, file.filename)
        file.save(filepath)
        try:
            gemini_file = genai.upload_file(filepath)
            return gemini_file
        except Exception as e:
            print(f"Erreur lors du téléchargement du fichier : {e}")
            return None
    return None

# Initialisation de la session pour le chat
def init_session():
    if 'chat_history' not in session:
        session['chat_history'] = []  # Liste de messages {'role': 'user'/'assistant', 'message': ...}
    if 'web_search' not in session:
        session['web_search'] = False

@app.route('/', methods=['GET', 'POST'])
def index():
    init_session()
    if request.method == 'POST':
        # Mise à jour du toggle pour la recherche web
        session['web_search'] = (request.form.get('toggle_web_search') == 'on')
        prompt = request.form.get('prompt')
        uploaded_file = request.files.get('file')
        uploaded_gemini_file = None
        if uploaded_file and uploaded_file.filename != '':
            uploaded_gemini_file = process_uploaded_file(uploaded_file)
        
        # Ajout du message utilisateur dans l'historique
        session['chat_history'].append({'role': 'user', 'message': prompt})
        
        # Si la recherche web est activée, on complète le prompt avec les résultats
        if session.get('web_search'):
            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?"
        
        try:
            # Envoi du message à Gemini
            if uploaded_gemini_file:
                response = model.send_message([uploaded_gemini_file, "\n\n", prompt])
            else:
                response = model.send_message(prompt)
            assistant_response = response.text
            # Ajout de la réponse de l'assistant dans l'historique
            session['chat_history'].append({'role': 'assistant', 'message': assistant_response})
        except Exception as e:
            error_msg = f"Erreur lors de l'envoi du message : {e}"
            session['chat_history'].append({'role': 'assistant', 'message': error_msg})
        
        session.modified = True
        return redirect(url_for('index'))
    
    return render_template('index.html',
                           chat_history=session.get('chat_history'),
                           web_search=session.get('web_search'))

if __name__ == '__main__':
    app.run(debug=True)