| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- import streamlit as st
- import os
- from workflow_Agent import app # Ton graphe compilé
- import glob
- st.set_page_config(page_title="Dataltist AI Assistant", layout="wide")
- st.title("📊 Dataltist BI Chat")
- # --- 1. Gestion du Fichier ---
- with st.sidebar:
- st.header("Données")
- uploaded_file = st.file_uploader("Charge ton fichier (CSV/Excel)", type=["csv", "xlsx"])
-
- if uploaded_file:
- # On sauvegarde le fichier dans le dossier 'data'
- file_path = os.path.join("data", uploaded_file.name)
- with open(file_path, "wb") as f:
- f.write(uploaded_file.getbuffer())
- st.success(f"Fichier {uploaded_file.name} chargé !")
- # --- 2. Interface de Chat ---
- if "messages" not in st.session_state:
- st.session_state.messages = []
- if st.sidebar.button("🗑️ Effacer la discussion"):
- st.session_state.messages = []
- st.rerun()
- # Affichage de l'historique
- for message in st.session_state.messages:
- with st.chat_message(message["role"]):
- st.markdown(message["content"])
- # --- 3. Interaction avec les Agents ---
- if prompt := st.chat_input("Pose ta question sur tes données..."):
- # 1. NETTOYAGE PRÉALABLE : On vide les anciens graphiques avant de commencer
- # Cela garantit que list_of_plots ne contiendra que les nouveaux PNG
- if not os.path.exists("outputs"):
- os.makedirs("outputs")
- for f in glob.glob("outputs/*.png"):
- os.remove(f)
- # 2. Affichage du message utilisateur
- st.session_state.messages.append({"role": "user", "content": prompt})
- with st.chat_message("user"):
- st.markdown(prompt)
- # 3. Appel des agents
- with st.chat_message("assistant"):
- # On utilise expanded=True pour voir le raisonnement des agents (Analyseur, Exécuteur...)
- with st.status("Analyse Dataltist en cours...", expanded=True) as status:
-
- inputs = {
- "messages": [("user", prompt)],
- "current_df_path": file_path
- }
-
- # On lance le workflow (invoke est bloquant, donc l'analyse se termine avant la suite)
- final_state = app.invoke(inputs)
-
- # Récupération du message final du Reporter
- response_text = final_state["messages"][-1].content
- st.markdown(response_text)
-
- # --- AFFICHAGE DES GRAPHIQUES ---
- # On cherche les fichiers APRES l'exécution
- list_of_plots = glob.glob("outputs/*.png")
-
- if list_of_plots:
- st.write("---") # Séparateur visuel
- st.subheader("📊 Visualisations générées")
-
- # Organisation en colonnes pour éviter de longs défilements verticaux
- # On limite à 2 colonnes par ligne pour une meilleure lisibilité
- cols = st.columns(2)
- for idx, plot_path in enumerate(list_of_plots):
- col_idx = idx % 2
- with cols[col_idx]:
- st.image(plot_path, use_container_width=True, caption=f"Analyse {idx+1}")
-
- status.update(label="Analyse terminée !", state="complete")
- # 4. Sauvegarde dans l'historique pour le chat
- st.session_state.messages.append({"role": "assistant", "content": response_text})
|