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