File size: 6,819 Bytes
c253059
da7ef42
c253059
 
da7ef42
 
c253059
c54f02a
da7ef42
 
6979c79
c253059
da7ef42
f97a643
da7ef42
 
f97a643
da7ef42
 
 
 
 
 
 
f97a643
c253059
f97a643
 
da7ef42
 
f97a643
a2eb89f
 
 
 
 
 
 
 
6979c79
 
da7ef42
 
 
 
f97a643
da7ef42
 
 
 
 
 
 
 
f97a643
da7ef42
 
 
 
 
 
 
 
f97a643
da7ef42
 
f97a643
 
 
 
 
 
c253059
da7ef42
f97a643
 
 
 
 
 
 
c253059
f97a643
c253059
f97a643
 
4979ae3
f97a643
c253059
f97a643
 
c96425b
f97a643
 
 
 
 
a2eb89f
f97a643
c96425b
c253059
 
 
 
a2eb89f
f97a643
 
a2eb89f
f97a643
4979ae3
a2eb89f
f97a643
 
 
a2eb89f
f97a643
 
4979ae3
a2eb89f
f97a643
 
4979ae3
a2eb89f
 
 
 
 
 
 
 
 
 
 
f97a643
a2eb89f
f97a643
 
a2eb89f
4979ae3
a2eb89f
 
f97a643
a2eb89f
f97a643
 
 
 
 
c253059
a2eb89f
c253059
f97a643
c253059
f97a643
c253059
f97a643
a2eb89f
 
 
 
c253059
6979c79
c253059
 
 
f97a643
c253059
 
 
 
 
f97a643
 
c253059
 
f97a643
 
c253059
f97a643
 
 
 
da7ef42
f97a643
a2eb89f
 
 
 
 
 
 
f97a643
da7ef42
f97a643
 
 
c253059
 
 
f97a643
 
 
 
a2eb89f
c253059
da7ef42
c253059
f97a643
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
from flask import Flask, render_template, request, jsonify, session
import google.generativeai as genai
import os
from dotenv import load_dotenv
import http.client
import json
from werkzeug.utils import secure_filename
import uuid

app = Flask(__name__)
app.secret_key = os.urandom(24)
load_dotenv()

# Configure Google AI
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))

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

# System prompt
SYSTEM_PROMPT = """
# Prompt System pour Mariam, IA conçu par youssouf 
[Your existing system prompt content here]
"""

# Initialize Gemini model
model = genai.GenerativeModel(
    'gemini-2.0-flash-exp',
    tools='code_execution',
    safety_settings=safety_settings,
    system_instruction=SYSTEM_PROMPT
)

# Stockage des sessions de chat
chat_sessions = {}

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"Web search error: {e}")
        return None
    finally:
        conn.close()

def format_search_results(data):
    if not data:
        return "Aucun résultat trouvé"
    
    result = []
    if 'knowledgeGraph' in data:
        kg = data['knowledgeGraph']
        result.append({
            'type': 'knowledge',
            'title': kg.get('title', ''),
            'description': kg.get('description', ''),
            'category': kg.get('type', '')
        })
    
    if 'organic' in data:
        for item in data['organic'][:3]:
            result.append({
                'type': 'organic',
                'title': item['title'],
                'snippet': item['snippet'],
                'link': item['link']
            })
    
    return result

UPLOAD_FOLDER = 'temp'
ALLOWED_EXTENSIONS = {'jpg', 'jpeg', 'png', 'pdf', 'txt', 'mp3', 'mp4'}

os.makedirs(UPLOAD_FOLDER, exist_ok=True)

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route('/')
def home():
    if 'session_id' not in session:
        session['session_id'] = str(uuid.uuid4())
        session['messages'] = []
        session['uploaded_files'] = []  # initialisation de la liste des fichiers uploadés
    return render_template('index.html', messages=session.get('messages', []))

@app.route('/send_message', methods=['POST'])
def send_message():
    try:
        data = request.json
        user_message = data.get('message')
        web_search_enabled = data.get('web_search', False)
        
        if not user_message:
            return jsonify({'error': 'No message provided'}), 400

        # Initialiser la session si nécessaire
        if 'session_id' not in session:
            session['session_id'] = str(uuid.uuid4())
            session['messages'] = []
            session['uploaded_files'] = []

        session_id = session['session_id']

        # Initialiser la session de chat si nécessaire
        if session_id not in chat_sessions:
            chat_sessions[session_id] = model.start_chat(history=[])

        # Intégration des fichiers uploadés dans le prompt
        prompt = ""
        if 'uploaded_files' in session and session['uploaded_files']:
            prompt += "Fichiers uploadés:\n"
            for file_info in session['uploaded_files']:
                prompt += f"- Nom: {file_info['filename']}, Référence: {file_info['file_id']}\n"
            prompt += "\n"
        
        prompt += f"Question: {user_message}"

        # Réaliser une recherche web si activée
        if web_search_enabled:
            web_results = perform_web_search(user_message)
            if web_results:
                formatted_results = format_search_results(web_results)
                prompt += f"\n\nRésultats de recherche web:\n{formatted_results}\n\nPourrais-tu analyser ces informations et me donner une réponse complète?"

        # Envoi du message à Gemini
        response = chat_sessions[session_id].send_message(prompt)
        
        # Mise à jour de l'historique de chat dans la session
        if 'messages' not in session:
            session['messages'] = []
            
        current_messages = session['messages']
        current_messages.append({
            'role': 'user',
            'content': prompt
        })
        current_messages.append({
            'role': 'assistant',
            'content': response.text
        })
        session['messages'] = current_messages

        # Optionnel : vider la liste des fichiers uploadés après utilisation
        session['uploaded_files'] = []

        return jsonify({
            'response': response.text
        })

    except Exception as e:
        print(f"Error in send_message: {e}")
        return jsonify({'error': str(e)}), 500

@app.route('/upload', methods=['POST'])
def upload_file():
    if 'file' not in request.files:
        return jsonify({'error': 'No file part'}), 400
    
    file = request.files['file']
    if file.filename == '':
        return jsonify({'error': 'No selected file'}), 400
    
    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        filepath = os.path.join(UPLOAD_FOLDER, filename)
        file.save(filepath)
        
        try:
            gemini_file = genai.upload_file(filepath)
            # Stocker la référence du fichier dans la session
            if 'uploaded_files' not in session:
                session['uploaded_files'] = []
            session['uploaded_files'].append({
                'filename': filename,
                'file_id': gemini_file.get('id') if isinstance(gemini_file, dict) else gemini_file
            })
            return jsonify({'success': True, 'filename': filename})
        except Exception as e:
            return jsonify({'error': str(e)}), 500
    
    return jsonify({'error': 'Invalid file type'}), 400

@app.route('/clear_chat', methods=['POST'])
def clear_chat():
    session_id = session.get('session_id')
    if session_id in chat_sessions:
        del chat_sessions[session_id]
    session['messages'] = []
    session['uploaded_files'] = []
    return jsonify({'success': True})

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