datacipen commited on
Commit
16c5cf6
·
verified ·
1 Parent(s): 21bf51f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +112 -44
app.py CHANGED
@@ -10,16 +10,12 @@ Intégration complète avec:
10
  - Chain of Thought visible
11
  - Style personnalisé (dark theme)
12
  """
13
-
14
  import os
15
  import json
16
  import asyncio
17
  from typing import Dict, Any, List, Optional
18
-
19
  import chainlit as cl
20
  from chainlit.types import ThreadDict, Starter
21
- #from langsmith import Client
22
- #from langsmith.run_helpers import traceable
23
  from langsmith import traceable
24
 
25
  # Import du module agent (votre code existant)
@@ -33,36 +29,9 @@ from agent_collaboratif_avid import (
33
  MAX_VALIDATION_LOOPS
34
  )
35
  import bcrypt
36
- from chainlit.data.sql_alchemy import SQLAlchemyDataLayer
37
- #from sql_alchemy import SQLAlchemyDataLayer
38
- from supabase import create_client, Client
39
- from supabase.lib.client_options import ClientOptions
40
-
41
- #from langfuse.langchain import CallbackHandler
42
- #import getpass
43
- #os.environ['LANGFUSE_SECRET_KEY'] = getpass.getpass("Enter your Secret key: ")
44
- #os.environ['LANGFUSE_PUBLIC_KEY'] = getpass.getpass("Enter your Public key: ")
45
- #os.environ["LANGFUSE_HOST"] = "https://cloud.langfuse.com"
46
- #langfuse_handler = CallbackHandler()
47
-
48
-
49
- SUPABASE_URL = os.environ.get("SUPABASE_URL")
50
- SUPABASE_ANON_KEY = os.environ.get("SUPABASE_ANON_KEY")
51
- CONNINFO = os.environ.get("CONNINFO")
52
-
53
- url: str = SUPABASE_URL
54
- key: str = SUPABASE_ANON_KEY
55
- supabase: Client = create_client(url, key)
56
-
57
- #url: str = "https://urtvfyesitnmwrouarze.supabase.co"
58
- #key: str = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InVydHZmeWVzaXRubXdyb3VhcnplIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NTk5NTgyNzIsImV4cCI6MjA3NTUzNDI3Mn0.HvZVdlyyck6iI6L5XiPupPZ8voLt-u4NCKAqgwHl6dE"
59
- #supabase: Client = create_client(url, key, options=ClientOptions(auto_refresh_token=False,persist_session=True))
60
- #@cl.data_layer
61
- #def get_data_layer():
62
- # return SQLAlchemyDataLayer(conninfo="postgresql+asyncpg://postgres.urtvfyesitnmwrouarze:2VlIHUmI3qVhJpcb@aws-1-eu-north-1.pooler.supabase.com:5432/postgres", storage_provider=supabase)
63
- @cl.data_layer
64
- def get_data_layer():
65
- return SQLAlchemyDataLayer(conninfo=CONNINFO, storage_provider=supabase)
66
 
67
  # =============================================================================
68
  # CONFIGURATION DE L'AUTHENTIFICATION (Optionnel)
@@ -108,9 +77,23 @@ if LANGCHAIN_API_KEY:
108
  print(f"✅ LangSmith activé - Projet: {LANGSMITH_PROJECT}")
109
  else:
110
  print("⚠️ LANGCHAIN_API_KEY non définie - Monitoring désactivé")
111
- langsmith_client = None
112
-
113
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
  # =============================================================================
115
  # FONCTIONS AUXILIAIRES POUR L'AFFICHAGE
116
  # =============================================================================
@@ -211,11 +194,11 @@ async def display_similar_info(similar_info: List[Dict[str, Any]]):
211
  )
212
  elements.append(element)
213
 
214
- if elements:
215
- await cl.Message(
216
- content="💡 **Informations similaires trouvées dans d'autres bases**",
217
- elements=elements
218
- ).send()
219
 
220
  async def display_web_search_results(web_search_results: List[Dict[str, Any]]):
221
  """Affiche les résultats de recherche web."""
@@ -328,7 +311,26 @@ async def process_query_with_tracing(query: str, thread_id: str) -> Dict[str, An
328
  # event est un dictionnaire avec les nœuds comme clés
329
  for node_name, node_state in event.items():
330
  # Ignorer le nœud spécial __start__
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
331
  if node_name == "__start__":
 
332
  continue
333
 
334
  # Afficher un message de progression pour le nœud actuel
@@ -340,7 +342,35 @@ async def process_query_with_tracing(query: str, thread_id: str) -> Dict[str, An
340
  "refine_response": "⚙️ Refinement de la réponse",
341
  "collect_similar_information": "🔗 Collecte d'informations similaires"
342
  }
343
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
344
  display_name = node_display_names.get(node_name, f"⚙️ {node_name}")
345
 
346
  # Message de progression
@@ -451,6 +481,11 @@ async def chat_profile(current_user: cl.User):
451
  ),cl.ChatProfile(
452
  name="Avid Dataviz",
453
  markdown_description="💡 Avid Dataviz permet d'avoir recours à des éléments statistiques et de corrélation entre les données laboratoires et les thématiques Ville Durable",
 
 
 
 
 
454
  )
455
  ]
456
 
@@ -458,13 +493,43 @@ async def chat_profile(current_user: cl.User):
458
  @cl.on_chat_start
459
  async def start():
460
  """Initialisation de la session chat."""
 
 
 
 
461
  user = cl.user_session.get("user")
462
  chat_profile = cl.user_session.get("chat_profile")
463
  if chat_profile == "Avid Dataviz":
464
  await cl.Message(
465
  content=f"Bienvenue {user.identifier}!\n\nL'environnement {chat_profile} vous restitue les données sous forme d'objets statistiques."
466
  ).send()
467
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
468
  # Message de bienvenue avec style
469
  # welcome_msg = f"""# 🎓 Agent Collaboratif - Université Gustave Eiffel
470
 
@@ -562,6 +627,9 @@ async def main(message: cl.Message):
562
  # Supprimer le message de traitement initial vide
563
  processing_msg.content = "✅ Traitement terminé"
564
  await processing_msg.update()
 
 
 
565
 
566
  # Sauvegarder dans l'historique de session
567
  cl.user_session.set(f"query_{query_count}", {
 
10
  - Chain of Thought visible
11
  - Style personnalisé (dark theme)
12
  """
 
13
  import os
14
  import json
15
  import asyncio
16
  from typing import Dict, Any, List, Optional
 
17
  import chainlit as cl
18
  from chainlit.types import ThreadDict, Starter
 
 
19
  from langsmith import traceable
20
 
21
  # Import du module agent (votre code existant)
 
29
  MAX_VALIDATION_LOOPS
30
  )
31
  import bcrypt
32
+
33
+ from trace_agent_collaboratif import get_trace
34
+ from dataviz_avid import display_barplotcorrelation, display_barplotpublication, display_barplotformation
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
 
36
  # =============================================================================
37
  # CONFIGURATION DE L'AUTHENTIFICATION (Optionnel)
 
77
  print(f"✅ LangSmith activé - Projet: {LANGSMITH_PROJECT}")
78
  else:
79
  print("⚠️ LANGCHAIN_API_KEY non définie - Monitoring désactivé")
80
+ #langsmith_client = None
81
+
82
+ @cl.action_callback("display_trace")
83
+ async def on_action(action: cl.Action):
84
+ # Create the TaskList
85
+ task_list = cl.TaskList()
86
+ task_list.status = "Running..."
87
+ task1 = cl.Task(title="Connexion au serveur d'historique des données d'actions des utilisateurs de l'agent collabroatif AVID.", status=cl.TaskStatus.RUNNING)
88
+ await task_list.add_task(task1)
89
+ await task_list.send()
90
+ trace = await get_trace(LANGCHAIN_API_KEY, task_list)
91
+ task1.status = cl.TaskStatus.DONE
92
+ await task_list.send()
93
+ await cl.ElementSidebar.set_elements([cl.Text(content=trace, name="trace")])
94
+ await cl.ElementSidebar.set_title(" ⌛ Historique de conversation :")
95
+ #await cl.Message(content="Afficher l'historique des actions",elements=[cl.Text(content=trace, name="trace", display="side")]).send()
96
+
97
  # =============================================================================
98
  # FONCTIONS AUXILIAIRES POUR L'AFFICHAGE
99
  # =============================================================================
 
194
  )
195
  elements.append(element)
196
 
197
+ #if elements:
198
+ # await cl.Message(
199
+ # content="💡 **Informations similaires trouvées dans d'autres bases**",
200
+ # elements=elements
201
+ # ).send()
202
 
203
  async def display_web_search_results(web_search_results: List[Dict[str, Any]]):
204
  """Affiche les résultats de recherche web."""
 
311
  # event est un dictionnaire avec les nœuds comme clés
312
  for node_name, node_state in event.items():
313
  # Ignorer le nœud spécial __start__
314
+ task_list = cl.TaskList()
315
+ task_list.status = "Running..."
316
+ task1 = cl.Task(title="Traitement de la requête utilisateur de l'agent collaboratif AVID par une action conditionnelle.")
317
+ task1.status = cl.TaskStatus.RUNNING
318
+ await task_list.add_task(task1)
319
+ task2 = cl.Task(title="Collecte d'informations dans les bases de données et caractérisation des informations par un score de pertinence par rapport à la requête utilisateur.")
320
+ await task_list.add_task(task2)
321
+ task3 = cl.Task(title="Génération d'une première réponse par l'agent collaboratif AVID et vérification de sa validité en corrélant les informations collectées.")
322
+ await task_list.add_task(task3)
323
+ task4 = cl.Task(title="Vérification de la validité de la réponse par l'agent collaboratif AVID et correction si nécessaire pour éviter les réponses erronées.")
324
+ await task_list.add_task(task4)
325
+ task5 = cl.Task(title="Génération d'une réponse finale par l'agent collaboratif AVID et vérification de sa validité grâce à un dernier traitement de vérification anti-hallucination.")
326
+ await task_list.add_task(task5)
327
+ task6 = cl.Task(title="Affichage de la réponse finale et collecte d'informations similaires dans les bases de données non prises en compte dans la réponse finale.")
328
+ await task_list.add_task(task6)
329
+ task7 = cl.Task(title="Recherche sur le web des informations complémentaires par rapport à la requête utilisateur.")
330
+ await task_list.add_task(task7)
331
+ await task_list.send()
332
  if node_name == "__start__":
333
+ # Create the TaskList
334
  continue
335
 
336
  # Afficher un message de progression pour le nœud actuel
 
342
  "refine_response": "⚙️ Refinement de la réponse",
343
  "collect_similar_information": "🔗 Collecte d'informations similaires"
344
  }
345
+ if node_name == "analyze_query":
346
+ task1.status = cl.TaskStatus.DONE
347
+ task2.status = cl.TaskStatus.RUNNING
348
+ await task_list.send()
349
+ if node_name == "collect_information":
350
+ task2.status = cl.TaskStatus.DONE
351
+ task3.status = cl.TaskStatus.RUNNING
352
+ await task_list.send()
353
+ if node_name == "generate_response":
354
+ task3.status = cl.TaskStatus.DONE
355
+ task4.status = cl.TaskStatus.RUNNING
356
+ await task_list.send()
357
+ if node_name == "validate_response":
358
+ task4.status = cl.TaskStatus.DONE
359
+ task5.status = cl.TaskStatus.RUNNING
360
+ await task_list.send()
361
+ if node_name == "refine_response":
362
+ task5.status = cl.TaskStatus.DONE
363
+ task6.status = cl.TaskStatus.RUNNING
364
+ await task_list.send()
365
+ if node_name == "collect_similar_information":
366
+ task6.status = cl.TaskStatus.DONE
367
+ task7.status = cl.TaskStatus.RUNNING
368
+ await task_list.send()
369
+ if node_name == "web_search":
370
+ task7.status = cl.TaskStatus.DONE
371
+ task7.status = cl.TaskStatus.READY
372
+ await task_list.send()
373
+
374
  display_name = node_display_names.get(node_name, f"⚙️ {node_name}")
375
 
376
  # Message de progression
 
481
  ),cl.ChatProfile(
482
  name="Avid Dataviz",
483
  markdown_description="💡 Avid Dataviz permet d'avoir recours à des éléments statistiques et de corrélation entre les données laboratoires et les thématiques Ville Durable",
484
+ icon="/public/charts.png",
485
+ ),cl.ChatProfile(
486
+ name="Avid Historique",
487
+ markdown_description="💡 RUNNING...\nAvid Historique permet d'avoir recours aux actions des utilisateurs sur l'agent collaboratif AVID",
488
+ icon="/public/threads.png",
489
  )
490
  ]
491
 
 
493
  @cl.on_chat_start
494
  async def start():
495
  """Initialisation de la session chat."""
496
+ commands = [
497
+ {"id": "Search", "icon": "globe", "description": "Rechercher sur le web"},
498
+ ]
499
+ await cl.context.emitter.set_commands(commands)
500
  user = cl.user_session.get("user")
501
  chat_profile = cl.user_session.get("chat_profile")
502
  if chat_profile == "Avid Dataviz":
503
  await cl.Message(
504
  content=f"Bienvenue {user.identifier}!\n\nL'environnement {chat_profile} vous restitue les données sous forme d'objets statistiques."
505
  ).send()
506
+
507
+ actions = [cl.Action(name="display_trace",icon="mouse-pointer-click",payload={"value": "trace"},label="Afficher l'historique des actions")]
508
+ await cl.Message(content="Fil des conversations", actions=actions).send()
509
+
510
+ elements = []
511
+ figure_correlation = await display_barplotcorrelation()
512
+ figure_publication = await display_barplotpublication()
513
+ figure_formation = await display_barplotformation()
514
+ elements.append(cl.Plotly(name="chart_correlation", figure=figure_correlation, size="large", display="inline"))
515
+ elements.append(cl.Plotly(name="chart_publication", figure=figure_publication, size="large", display="inline"))
516
+ elements.append(cl.Plotly(name="chart_formation", figure=figure_formation, size="large", display="inline"))
517
+
518
+ await cl.Message(content="Datavisualisation des thématiques Ville Durable en fonction des laboratoires, en fonction des publications de recherche et en fonction des formations", elements=elements).send()
519
+
520
+
521
+ elif chat_profile == "Avid Historique":
522
+ # Create the TaskList
523
+ task_list = cl.TaskList()
524
+ task_list.status = "Running..."
525
+ task1 = cl.Task(title="Connexion au serveur d'historique des données d'actions des utilisateurs de l'agent collabroatif AVID.", status=cl.TaskStatus.RUNNING)
526
+ await task_list.add_task(task1)
527
+ await task_list.send()
528
+ trace = await get_trace(LANGCHAIN_API_KEY,task_list)
529
+ task1.status = cl.TaskStatus.DONE
530
+ await task_list.send()
531
+ elements = [cl.Text(content=trace, display="inline")]
532
+ await cl.Message(content="Fil des conversations", elements=elements).send()
533
  # Message de bienvenue avec style
534
  # welcome_msg = f"""# 🎓 Agent Collaboratif - Université Gustave Eiffel
535
 
 
627
  # Supprimer le message de traitement initial vide
628
  processing_msg.content = "✅ Traitement terminé"
629
  await processing_msg.update()
630
+
631
+ actions = [cl.Action(name="display_trace",icon="mouse-pointer-click",payload={"value": "trace"},label="Afficher l'historique des actions")]
632
+ await cl.Message(content="Fil des conversations", actions=actions).send()
633
 
634
  # Sauvegarder dans l'historique de session
635
  cl.user_session.set(f"query_{query_count}", {