app.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import streamlit as st
  2. import os
  3. from workflow_Agent import app # Ton graphe compilé
  4. import glob
  5. st.set_page_config(page_title="Dataltist AI Assistant", layout="wide")
  6. st.title("📊 Dataltist BI Chat")
  7. # --- 1. Gestion du Fichier ---
  8. with st.sidebar:
  9. st.header("Données")
  10. uploaded_file = st.file_uploader("Charge ton fichier (CSV/Excel)", type=["csv", "xlsx"])
  11. if uploaded_file:
  12. # On sauvegarde le fichier dans le dossier 'data'
  13. file_path = os.path.join("data", uploaded_file.name)
  14. with open(file_path, "wb") as f:
  15. f.write(uploaded_file.getbuffer())
  16. st.success(f"Fichier {uploaded_file.name} chargé !")
  17. # --- 2. Interface de Chat ---
  18. if "messages" not in st.session_state:
  19. st.session_state.messages = []
  20. if st.sidebar.button("🗑️ Effacer la discussion"):
  21. st.session_state.messages = []
  22. st.rerun()
  23. # Affichage de l'historique
  24. for message in st.session_state.messages:
  25. with st.chat_message(message["role"]):
  26. st.markdown(message["content"])
  27. # --- 3. Interaction avec les Agents ---
  28. if prompt := st.chat_input("Pose ta question sur tes données..."):
  29. # 1. NETTOYAGE PRÉALABLE : On vide les anciens graphiques avant de commencer
  30. # Cela garantit que list_of_plots ne contiendra que les nouveaux PNG
  31. if not os.path.exists("outputs"):
  32. os.makedirs("outputs")
  33. for f in glob.glob("outputs/*.png"):
  34. os.remove(f)
  35. # 2. Affichage du message utilisateur
  36. st.session_state.messages.append({"role": "user", "content": prompt})
  37. with st.chat_message("user"):
  38. st.markdown(prompt)
  39. # 3. Appel des agents
  40. with st.chat_message("assistant"):
  41. # On utilise expanded=True pour voir le raisonnement des agents (Analyseur, Exécuteur...)
  42. with st.status("Analyse Dataltist en cours...", expanded=True) as status:
  43. inputs = {
  44. "messages": [("user", prompt)],
  45. "current_df_path": file_path
  46. }
  47. # On lance le workflow (invoke est bloquant, donc l'analyse se termine avant la suite)
  48. final_state = app.invoke(inputs)
  49. # Récupération du message final du Reporter
  50. response_text = final_state["messages"][-1].content
  51. st.markdown(response_text)
  52. # --- AFFICHAGE DES GRAPHIQUES ---
  53. # On cherche les fichiers APRES l'exécution
  54. list_of_plots = glob.glob("outputs/*.png")
  55. if list_of_plots:
  56. st.write("---") # Séparateur visuel
  57. st.subheader("📊 Visualisations générées")
  58. # Organisation en colonnes pour éviter de longs défilements verticaux
  59. # On limite à 2 colonnes par ligne pour une meilleure lisibilité
  60. cols = st.columns(2)
  61. for idx, plot_path in enumerate(list_of_plots):
  62. col_idx = idx % 2
  63. with cols[col_idx]:
  64. st.image(plot_path, use_container_width=True, caption=f"Analyse {idx+1}")
  65. status.update(label="Analyse terminée !", state="complete")
  66. # 4. Sauvegarde dans l'historique pour le chat
  67. st.session_state.messages.append({"role": "assistant", "content": response_text})