File size: 7,054 Bytes
7715c35
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
import gradio as gr
from Modules import Agent_HCP
import Modules
import ast
import pandas as pd
import csv
import re


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"<div style='text-align: right; margin: 10px 0; background-color: white; padding: 5px; border-radius: 5px; max-width: 60%; margin-left: auto;'>"
                f"<strong>User:</strong> {message.content}</div>"
            )
        else:
            formatted_history += (
                f"<div style='text-align: left; margin: 10px 0; background-color: lightgray; padding: 5px; border-radius: 5px; max-width: 60%;'>"
                f"<strong>ChatBot:</strong> {message.content}</div>"
            )
    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"<div style='color: #007BFF;'><strong>Action:</strong> {index+1}</div><br>"
        f"<div style='color: #28A745;'><strong>Question:</strong> {log['Question']}</div><br>"
        f"<div style='color: #FFC107;'><strong>Thought:</strong> {log['Thought']}</div><br>"
        f"<div style='color: #17A2B8;'><strong>Action:</strong> {log['Action']}</div><br>"
        f"<div style='color: #DC3545;'><strong>Action Input:</strong> {log['Action Input']}</div><br>"
        f"<div style='color: #6C757D;'><strong>Result:</strong> {log['Result']}</div>"
    )

# 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 3.341.426 personnes.
                    - Pour avoir un résultat approximatif, il faut multiplier le résutat obtenu par 9,99999453089430
                    """)
                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")
                    clear_btn = gr.Button("Clear History")
                    user_input.submit(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
            )

demo.launch(share=False)
#demo.launch(share=True, auth=("username", "password"))