File size: 6,613 Bytes
da7ef42 |
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 |
from flask import Flask, render_template_string, request, session, redirect, url_for
import os
import google.generativeai as genai
import http.client
import json
from dotenv import load_dotenv
load_dotenv()
app = Flask(__name__)
app.secret_key = os.getenv("FLASK_SECRET_KEY", "supersecretkey") # Configurez la clé secrète pour la session
# Configurez l'API pour Generative AI
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
# Paramètres de sécurité et instruction système
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"},
]
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.
[...]
## Amélioration Continue
- Collecter les retours des utilisateurs
- Analyser les interactions pour identifier les points d'amélioration
- Ajuster les réponses en fonction des retours
- Maintenir à jour les connaissances et références
"""
# Initialisation du modèle de chat
model = genai.GenerativeModel('gemini-2.0-flash-exp', tools='code_execution',
safety_settings=safety_settings,
system_instruction=ss)
# Fonction d'initialisation du chat dans la session
def init_chat():
session['chat_history'] = []
# Fonction pour réaliser une recherche web
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()
# Mise en forme des résultats de recherche
def format_search_results(data):
if not data:
return "Aucun résultat trouvé"
result = ""
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"
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"
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
# Traitement du fichier uploadé
def process_uploaded_file(file):
if file:
temp_dir = "temp"
os.makedirs(temp_dir, exist_ok=True)
temp_path = os.path.join(temp_dir, file.filename)
file.save(temp_path)
try:
gemini_file = genai.upload_file(temp_path)
return gemini_file
except Exception as e:
print(f"Erreur lors du téléchargement du fichier : {e}")
return None
return None
# Template HTML (vous pouvez le déplacer dans un fichier template si besoin)
template = """
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Mariam AI</title>
</head>
<body>
<h1>Mariam AI!</h1>
<form method="POST" enctype="multipart/form-data">
<div>
<label for="prompt">Votre message :</label>
<input type="text" id="prompt" name="prompt" required>
</div>
<div>
<label for="file">Télécharger un fichier (image/document) :</label>
<input type="file" id="file" name="file" accept=".jpg,.jpeg,.png,.mp4,.mp3,.pdf,.txt">
</div>
<div>
<label for="web_search">Activer la recherche web :</label>
<input type="checkbox" id="web_search" name="web_search">
</div>
<button type="submit">Envoyer</button>
</form>
<h2>Conversation</h2>
<div>
{% for message in chat_history %}
<p><strong>{{ message.role|capitalize }} :</strong> {{ message.text }}</p>
{% endfor %}
</div>
</body>
</html>
"""
@app.route("/", methods=["GET", "POST"])
def index():
# Initialisation de l'historique de chat en session s'il n'existe pas
if "chat_history" not in session:
init_chat()
if request.method == "POST":
prompt = request.form.get("prompt")
web_search_enabled = request.form.get("web_search") == "on"
file = request.files.get("file")
# Ajout du message utilisateur à l'historique de la session
session['chat_history'].append({"role": "user", "text": prompt})
uploaded_gemini_file = process_uploaded_file(file)
# Si la recherche web est activée, effectuez-la et enrichissez la question
if web_search_enabled:
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:
# Recrée le chat avec l'historique stocké en session
chat = model.start_chat(history=session.get("chat_history", []))
if uploaded_gemini_file:
response = chat.send_message([uploaded_gemini_file, "\n\n", prompt])
else:
response = chat.send_message(prompt)
answer = response.text
session['chat_history'].append({"role": "assistant", "text": answer})
except Exception as e:
error_message = f"Erreur lors de l'envoi du message : {e}"
session['chat_history'].append({"role": "assistant", "text": error_message})
session.modified = True
return redirect(url_for("index"))
return render_template_string(template, chat_history=session.get("chat_history", []))
if __name__ == "__main__":
app.run(debug=True) |