Chatm / app.py
Docfile's picture
Create app.py
da7ef42 verified
raw
history blame
6.61 kB
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)