File size: 7,819 Bytes
7715c35
 
 
 
 
 
 
3206420
7715c35
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
816d671
7715c35
 
 
 
 
0da1215
7715c35
 
0da1215
7715c35
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9e6b925
e763fc2
d8ec697
 
3b1cde6
d8ec697
 
e763fc2
 
 
 
 
 
 
d8ec697
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
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"<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 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"))