import gradio as gr from Modules import Agent_HCP import Modules import ast import pandas as pd import csv import re import os def chat_interface(query: str): if not query: return "", "" result, memory = Agent_HCP.get_response(query) # Formatage de l'historique pour affichage formatted_history = "" for message in memory.messages: if message.type == "human": formatted_history += ( f"
" f"User: {message.content}
" ) else: formatted_history += ( f"
" f"ChatBot: {message.content}
" ) Modules.PARSED_LOGS=Agent_HCP.save_sql_query_input_output_steps(result) # Retourne l'historique formaté et la réponse return formatted_history, "" # Fonction pour réinitialiser l'historique def clear_history(): Agent_HCP.clear_memory() return "", "" # Fonction pour colorer les lignes en alternance def color_rows(val): # Appliquer une couleur différente pour chaque ligne (alternée) return ['background-color: #f0f0f0' if i % 2 == 0 else 'background-color: #ffffff' for i in range(len(val))] # Fonction pour lire le CSV et afficher seulement deux colonnes du DataFrame def display_dataframe(): # Lire le fichier CSV dans un DataFrame df = pd.read_csv(Modules.FILE_HISTORY, header=None, names=['INPUT', 'SQL_QUERY', 'SQL_RESULT', 'OUTPUT', "STEPS"], quoting=csv.QUOTE_MINIMAL) # Sélectionner seulement les colonnes 'INPUT', 'SQL_QUERY', 'SQL_RESULT', 'OUTPUT' df_selected = df[['INPUT', 'SQL_QUERY', 'SQL_RESULT', 'OUTPUT']].sort_index(ascending=False) # Appliquer le style au DataFrame styled_df = df_selected.style.apply(color_rows, axis=0) html_table = styled_df.to_html() return html_table def get_action_details(index): log = Modules.PARSED_LOGS[index] return ( f"
Action: {index+1}

" f"
Question: {log['Question']}

" f"
Thought: {log['Thought']}

" f"
Action: {log['Action']}

" f"
Action Input: {log['Action Input']}

" f"
Result: {log['Result']}
" ) # Fonction pour rafraîchir les données et créer les nouveaux boutons def fn_action_buttons(): markdown_text = gr.Markdown(f"# Visualisation des actions de l'agent\n\nIl y a {len(Modules.PARSED_LOGS)} actions.") # Vérifier s'il y a des logs à afficher if len(Modules.PARSED_LOGS) > 0: # Créer les boutons pour chaque action disponible action_buttons = [gr.Button(f"Action {i + 1}", visible=True) for i in range(len(Modules.PARSED_LOGS))] else: # Si aucune action n'est disponible, on affiche un bouton placeholder caché action_buttons = [gr.Button(visible=False)] # Compléter avec des placeholders si nécessaire while len(action_buttons) < Modules.MAX_ACTIONS: action_buttons.append(gr.Button(visible=False)) # Ajouter des boutons cachés return [markdown_text, *action_buttons] # Interface Gradio with gr.Blocks() as demo: with gr.Tabs(): with gr.TabItem("Chat"): with gr.Row(): with gr.Column(scale=1, min_width=200): gr.Markdown(""" ### Description de l'outil : - Posez vos questions sur les données de recensement de 2014 au Maroc. - Cette base de données contient seulement 50.000 personnes. """) with gr.Column(scale=4): gr.Markdown("# Parlez avec les données de HCP") chat_history = gr.HTML("") user_input = gr.Textbox(placeholder="Enter text here…", label="Your input") run_btn = gr.Button("Run") clear_btn = gr.Button("Clear History") user_input.submit(chat_interface, inputs=user_input, outputs=[chat_history, user_input]) run_btn.click(chat_interface, inputs=user_input, outputs=[chat_history, user_input]) clear_btn.click(clear_history, outputs=[chat_history, user_input]) with gr.Row() : # Ajout d'exemples gr.Examples( examples=["Combien y-a-t-il de personnes recensées ?", "Quel est le le nombre de femmes ?",\ "Combien de ménages sont dirigés par des femmes dans la province d'Al Hoceïma ?"], inputs=user_input ) with gr.TabItem("Evaluation"): gr.Markdown("# SQL EVALUATION") # Ajouter un tableau pour afficher le DataFrame dans cet onglet refresh_button = gr.Button("Rafraîchir la table") # Afficher le DataFrame html_output = gr.HTML(display_dataframe()) # Rafraîchir les données à chaque clic sur le bouton refresh_button.click(fn=display_dataframe, inputs=[], outputs=html_output) # Fonction qui rafraîchit les données et retourne le texte Markdown mis à jour with gr.TabItem("Suivi"): # Affichage du nombre d'actions et bouton de rafraîchissement info_text = gr.Markdown(f"# Visualisation des actions de l'agent\n\nIl y a {len(Modules.PARSED_LOGS)} actions.") with gr.Row(): refresh_button = gr.Button("Rafraîchir les actions") # Créer les boutons d'action initiaux with gr.Row(): # Créer les boutons pour chaque action disponible output_buttons = [gr.Button(f"Action {i + 1}", visible=False) for i in range(Modules.MAX_ACTIONS)] # Zone pour afficher les détails de l'action sélectionnée details_output = gr.Markdown("") # Lier les boutons d'action à la fonction pour afficher les détails for i, button in enumerate(output_buttons): button.click(get_action_details, inputs=[gr.Number(i, visible=False)], outputs=details_output) # Action du bouton de rafraîchissement refresh_button.click( fn_action_buttons, # Fonction appelée lors du clic outputs=[info_text] + output_buttons # Mise à jour des éléments Markdown et boutons ) with gr.TabItem("V1-Graph"): info_graph = gr.Markdown(f"# La version1 est un agent graph.") def afficher_image(): # Remplacez le chemin par votre image image_path = os.path.abspath("Output/graph.jpeg") return image_path gr.Image(afficher_image()) with gr.TabItem("V2-Graph-RAG"): info_graph = gr.Markdown(f"# Dans la version2, RAG est intégré au graph.") def afficher_image_graph(): # Remplacez le chemin par votre image image_path = os.path.abspath("Output/graph_rag.jpeg") return image_path gr.Image(afficher_image_graph()) demo.launch(share=False) #demo.launch(share=True, auth=("username", "password"))