File size: 6,902 Bytes
c2fae2a 2171485 de01232 2171485 9b43085 de01232 c2fae2a de01232 2171485 de01232 2171485 de01232 9b43085 c2fae2a 9b43085 c2fae2a 9b43085 c2fae2a 9b43085 c2fae2a 9b43085 c2fae2a 9b43085 2171485 c2fae2a 9b43085 c2fae2a 9b43085 c2fae2a 9b43085 2171485 c2fae2a 2171485 c2fae2a de01232 9b43085 c2fae2a 9b43085 c2fae2a 9b43085 c2fae2a 9b43085 2863c40 9b43085 c2fae2a 9b43085 c2fae2a 9b43085 c2fae2a 9b43085 c2fae2a 9b43085 c2fae2a 9b43085 c2fae2a 9b43085 c2fae2a 2171485 9b43085 c2fae2a 2171485 de01232 c2fae2a 2171485 c2fae2a 2171485 c2fae2a 2171485 c2fae2a de01232 2171485 c2fae2a 9b43085 c2fae2a 9b43085 2171485 c2fae2a 2171485 de01232 c2fae2a |
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 |
import logging
from flask import Flask, render_template, request, jsonify, session
from google import genai
import os
from datetime import datetime
import uuid
import io
import httpx
# Configuration du logging
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s [%(levelname)s] %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
app = Flask(__name__)
app.secret_key = os.urandom(24) # Requis pour utiliser les sessions Flask
# Configuration de l'API Gemini (idéalement à déplacer dans un fichier de configuration)
# os.environ["GOOGLE_API_KEY"] = "VOTRE_GEMINI_API_KEY"
client = genai.Client(api_key=os.environ.get("GOOGLE_API_KEY", "GEMINI_API_KEY"))
# URL du PDF à analyser (fixe dans cette version)
PDF_URL = "http://www.ddl.cnrs.fr/projets/clhass/PageWeb/ressources/fang.pdf"
# Variable globale pour stocker le fichier PDF une fois téléchargé
pdf_file = None
def load_pdf():
"""Télécharge et prépare le fichier PDF pour l'analyse"""
global pdf_file
if pdf_file is None:
try:
logging.info(f"Début du téléchargement du PDF depuis {PDF_URL}")
response = httpx.get(PDF_URL)
response.raise_for_status()
pdf_content = response.content
pdf_io = io.BytesIO(pdf_content)
logging.info("Téléchargement réussi. Envoi du PDF à l'API Gemini...")
# Télécharger le fichier via l'API Gemini
pdf_file = client.files.upload(
file=pdf_io,
config=dict(mime_type='application/pdf')
)
logging.info("PDF téléchargé et préparé avec succès par Gemini!")
except Exception as e:
logging.error(f"Erreur lors du téléchargement ou de la préparation du PDF: {str(e)}")
raise
else:
logging.debug("PDF déjà chargé, utilisation du cache.")
return pdf_file
@app.route('/')
def index():
# Créer un ID de session unique s'il n'existe pas déjà
if 'session_id' not in session:
session['session_id'] = str(uuid.uuid4())
logging.info(f"Nouvelle session créée avec l'ID : {session['session_id']}")
else:
logging.debug(f"Session existante détectée : {session['session_id']}")
# Précharger le PDF au démarrage de l'application
try:
load_pdf()
except Exception as e:
error_msg = f"Erreur de chargement du PDF: {str(e)}"
logging.error(error_msg)
return render_template('index.html', error=error_msg)
logging.info("Chargement de la page d'accueil réussi.")
return render_template('index.html', pdf_url=PDF_URL)
@app.route('/chat', methods=['POST'])
def chat():
data = request.json
user_message = data.get('message', '')
logging.info(f"Message utilisateur reçu: {user_message}")
# Récupérer ou créer une session de chat pour cet utilisateur
session_id = session.get('session_id')
chat_session = get_or_create_chat_session(session_id)
logging.debug(f"Session de chat pour l'ID {session_id}: {chat_session}")
try:
# S'assurer que le PDF est chargé
pdf_document = load_pdf()
logging.debug("PDF document récupéré pour le traitement du chat.")
# Construire le prompt pour Gemini avec référence au PDF
prompt = f"En vous basant sur le contenu du PDF sur la langue fang, veuillez répondre à: {user_message}"
logging.info(f"Prompt construit pour Gemini: {prompt}")
# Envoyer le message à Gemini avec le PDF comme contexte et obtenir la réponse
logging.info("Envoi du prompt à Gemini...")
response = client.models.generate_content(
model="gemini-2.0-pro-exp-02-05",
contents=[pdf_document, prompt]
)
logging.info("Réponse reçue de Gemini.")
# Ajouter cette paire question/réponse à l'historique local
if not hasattr(app, 'chat_histories'):
app.chat_histories = {}
logging.debug("Création de l'historique global des chats.")
if session_id not in app.chat_histories:
app.chat_histories[session_id] = []
logging.debug(f"Création d'un historique de chat pour la session {session_id}.")
timestamp = datetime.now().strftime("%H:%M")
app.chat_histories[session_id].append({
'role': 'user',
'content': user_message,
'timestamp': timestamp
})
logging.debug("Message utilisateur ajouté à l'historique du chat.")
app.chat_histories[session_id].append({
'role': 'model',
'content': response.text,
'timestamp': timestamp
})
logging.debug("Réponse du modèle ajoutée à l'historique du chat.")
# Formater l'historique pour l'interface
history = app.chat_histories[session_id]
logging.info("Historique du chat formaté et prêt à être envoyé.")
return jsonify({
'response': response.text,
'history': history
})
except Exception as e:
logging.error(f"Erreur lors du traitement du chat: {str(e)}")
return jsonify({'error': str(e)}), 500
def get_or_create_chat_session(session_id):
"""
Récupère une session de chat existante ou en crée une nouvelle.
Dans une application réelle, vous pourriez stocker cela dans une base de données.
"""
if not hasattr(app, 'chat_sessions'):
app.chat_sessions = {}
logging.debug("Création du dictionnaire global des sessions de chat.")
if session_id not in app.chat_sessions:
logging.info(f"Aucune session de chat existante pour {session_id}. Création d'une nouvelle session.")
app.chat_sessions[session_id] = client.chats.create(model="gemini-2.0-flash")
else:
logging.debug(f"Session de chat existante retrouvée pour {session_id}.")
return app.chat_sessions[session_id]
@app.route('/reset', methods=['POST'])
def reset_chat():
"""Réinitialise la session de chat actuelle"""
session_id = session.get('session_id')
logging.info(f"Réinitialisation de la session de chat pour {session_id}")
# Réinitialiser l'historique stocké
if hasattr(app, 'chat_histories') and session_id in app.chat_histories:
app.chat_histories[session_id] = []
logging.debug("Historique de chat réinitialisé.")
# Réinitialiser la session de chat
if hasattr(app, 'chat_sessions') and session_id in app.chat_sessions:
app.chat_sessions[session_id] = client.chats.create(model="gemini-2.0-flash")
logging.debug("Session de chat réinitialisée dans le dictionnaire des sessions.")
return jsonify({'status': 'success'})
if __name__ == '__main__':
logging.info("Démarrage de l'application Flask avec le mode debug activé.")
app.run(debug=True)
|