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})