jaimalklyde commited on
Commit
bbda7a8
·
verified ·
1 Parent(s): fe54e0d

Update src/module/AIP.py

Browse files
Files changed (1) hide show
  1. src/module/AIP.py +97 -9
src/module/AIP.py CHANGED
@@ -11,6 +11,7 @@ import os
11
  import re
12
  import sys
13
 
 
14
  try:
15
  from Function.AIP_Function import (
16
  calculate_occupancy_rate,
@@ -19,16 +20,12 @@ try:
19
  get_patient_stats
20
  )
21
  except ImportError as e:
22
- # Petit debug au cas où
23
  st.error(f"Erreur interne dans AIP.py : impossible de trouver AIP_Function. {e}")
 
 
24
 
25
-
26
- from Function.AIP_Function import (
27
- calculate_occupancy_rate,
28
- audit_data_quality,
29
- get_stock_alerts,
30
- get_patient_stats
31
- )
32
 
33
  class JasmineAgent:
34
  def __init__(self, rdf_store, ontology_rules, dataframes=None):
@@ -189,4 +186,95 @@ IMPORTANT: Pour les fonctions de calcul, tu DOIS spécifier le nom du DataFrame
189
  msgs.append({"role": role, "parts": [content]})
190
 
191
  msgs.append({"role": "user", "parts": [user_message]})
192
- return msgs
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  import re
12
  import sys
13
 
14
+ # --- 1. IMPORT SÉCURISÉ DES FONCTIONS ---
15
  try:
16
  from Function.AIP_Function import (
17
  calculate_occupancy_rate,
 
20
  get_patient_stats
21
  )
22
  except ImportError as e:
23
+ # Debug affiché seulement si l'import échoue
24
  st.error(f"Erreur interne dans AIP.py : impossible de trouver AIP_Function. {e}")
25
+ # On crée des fonctions "bouchons" pour éviter que la classe ne plante si l'import échoue
26
+ calculate_occupancy_rate = audit_data_quality = get_stock_alerts = get_patient_stats = lambda x: "Fonction non chargée"
27
 
28
+ # [SUPPRIMÉ] L'import redondant qui faisait crasher a été retiré ici.
 
 
 
 
 
 
29
 
30
  class JasmineAgent:
31
  def __init__(self, rdf_store, ontology_rules, dataframes=None):
 
186
  msgs.append({"role": role, "parts": [content]})
187
 
188
  msgs.append({"role": "user", "parts": [user_message]})
189
+ return msgs
190
+
191
+ # --- 2. FONCTION D'AFFICHAGE (SHOW_TERMINAL) ---
192
+ def show_terminal(gspread_client, sheet_name="bdd_mvp_faker"):
193
+ """
194
+ Fonction principale appelée par Streamlit pour afficher l'interface de l'agent
195
+ """
196
+ st.markdown("## 🤖 AIP COMMAND TERMINAL")
197
+ st.caption("Agent Jasmine - Analyse Hospitalière Intelligente")
198
+
199
+ # 1. Vérification des données (Lien avec Data Explorer)
200
+ # On récupère les dataframes chargés dans le session_state par l'autre module
201
+ dataframes = {}
202
+ if 'data_explorer' in st.session_state:
203
+ dataframes = st.session_state.data_explorer.dataframes
204
+
205
+ if not dataframes:
206
+ st.warning("⚠️ Aucune donnée n'est chargée en mémoire.")
207
+ st.info("👉 Veuillez d'abord aller dans le menu **Data Explorer** et cliquer sur 'Charger les Données'.")
208
+ return
209
+
210
+ # 2. Initialisation de l'Agent (Singleton dans la session)
211
+ if 'jasmine_agent' not in st.session_state:
212
+ # On passe dataframes à l'agent pour qu'il puisse exécuter les fonctions
213
+ st.session_state.jasmine_agent = JasmineAgent(
214
+ rdf_store=None, # Pas encore utilisé
215
+ ontology_rules=None, # Pas encore utilisé
216
+ dataframes=dataframes
217
+ )
218
+
219
+ # 3. Initialisation de l'historique de chat
220
+ if "messages" not in st.session_state:
221
+ st.session_state.messages = []
222
+
223
+ # 4. Affichage de l'historique
224
+ for message in st.session_state.messages:
225
+ with st.chat_message(message["role"]):
226
+ st.markdown(message["content"])
227
+ # Si un résultat de fonction est stocké, on l'affiche proprement
228
+ if "function_result" in message and message["function_result"]:
229
+ with st.expander("🛠️ Résultat technique"):
230
+ st.json(message["function_result"])
231
+
232
+ # 5. Zone de saisie utilisateur
233
+ if prompt := st.chat_input("Ex: Calcule le taux d'occupation des lits"):
234
+ # Ajout message utilisateur
235
+ st.session_state.messages.append({"role": "user", "content": prompt})
236
+ with st.chat_message("user"):
237
+ st.markdown(prompt)
238
+
239
+ # Réponse de l'agent
240
+ with st.chat_message("assistant"):
241
+ message_placeholder = st.empty()
242
+ with st.spinner("Jasmine analyse la demande..."):
243
+ # Appel à la méthode ask de la classe JasmineAgent
244
+ err, action, thought, func_res = st.session_state.jasmine_agent.ask(
245
+ prompt,
246
+ st.session_state.messages
247
+ )
248
+
249
+ if err:
250
+ st.error(err)
251
+ response_text = "Désolé, une erreur technique est survenue."
252
+ else:
253
+ # Affichage de la pensée (Thought Trace)
254
+ if thought:
255
+ with st.expander("💭 Raisonnement de l'IA"):
256
+ st.write(thought)
257
+
258
+ # Construction de la réponse textuelle
259
+ if action.get("tool") and action.get("tool") != "none":
260
+ response_text = f"J'ai exécuté la commande `{action['tool']}` pour répondre à votre besoin."
261
+ else:
262
+ response_text = "Analyse terminée (aucune action technique requise)."
263
+
264
+ message_placeholder.markdown(response_text)
265
+
266
+ # Affichage du résultat de la fonction
267
+ if func_res:
268
+ if "success" in func_res:
269
+ st.success("✅ Exécution réussie")
270
+ st.json(func_res["result"])
271
+ else:
272
+ st.error(f"❌ Erreur fonction : {func_res.get('error')}")
273
+
274
+ # Sauvegarde dans l'historique
275
+ st.session_state.messages.append({
276
+ "role": "assistant",
277
+ "content": response_text,
278
+ "thought": thought,
279
+ "function_result": func_res
280
+ })