File size: 4,853 Bytes
3107242
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75dfd0b
 
 
 
9d485eb
3107242
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
df9c6f0
3107242
 
 
 
df9c6f0
3107242
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9036732
3107242
 
 
 
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
import gradio as gr
from langchain_core.messages import HumanMessage, AIMessage
from src.agents.main_agent import multi_agent_graph
from src.agents.rag_agent import invocation_state
from src.configs.config import LOG_DIR
import logging
import os

LOG_FILE = os.path.join(LOG_DIR, "Agents.log")
logging.basicConfig(
    filename=LOG_FILE,
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S'
)

import pandas as pd

invocation_state.invocation_type = 'chatbot'

class GradioChatbotApp:
    def __init__(self):
        #graph_img = multi_agent_graph.get_graph(xray=True).draw_mermaid_png()
        #os.makedirs("docs", exist_ok=True)
        #with open("docs/full_graph.png", "wb") as f:
        #    f.write(graph_img)
        pass

    async def process_chat(self, history, user_input):
        messages = []
        for user, bot in history:
            messages.append(HumanMessage(content=user))
            messages.append(AIMessage(content=bot))
        messages.append(HumanMessage(content=user_input))

        logging.info(f"User query: {user_input}")
        config = {"configurable": {"thread_id": "1"}}
        result = await multi_agent_graph.ainvoke({"messages": messages}, config=config)
        bot_msg = result["messages"][-1].content
        history.append((user_input, bot_msg))
        return history, ""

    def create_interface(self):
        # Load CSV and keep only needed columns
        csv_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "../dataset/docs_metadata.csv"))
        if os.path.exists(csv_path):
            df_full = pd.read_csv(csv_path)
            df = df_full[["Catégorie", "Nom du document", "Lien"]]
        else:
            df = pd.DataFrame(columns=["Catégorie", "Nom du document", "Lien"])

        # Absolute path for logo
        logo_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "docs", "logo.jpg"))

        with gr.Blocks(title="HOLOKIA RAG/MCP", theme=gr.themes.Soft()) as demo:
            with gr.Tab("Chatbot"):
                # Centered logo
                gr.HTML(f"""
                <div style='display:flex; justify-content:center; align-items:center; margin-top:30px; margin-bottom:30px;'>
                    <img src="https://holokia.com/wp-content/uploads/2025/04/cropped-logo_holokia_noir.png" style="width:130px; height:auto;" alt="Company Logo">
                </div>
                """)

                gr.Markdown("""
                ## Chatbot Juridique

                Cette plateforme d’assistance juridique intelligente est dédiée à l’analyse et à l’interprétation du droit marocain ainsi qu’aux travaux parlementaires.

                Elle s’appuie sur un système de génération augmentée par récupération (RAG), permettant de délivrer des réponses précises et documentées à partir des textes législatifs et des archives parlementaires.
                """)

                chatbot = gr.Chatbot(label="Assistant", type="tuples")
                user_input = gr.Textbox(
                    label="Votre message",
                    placeholder="Posez une question sur la loi marocaine, le parlement, ou des documents légaux...",
                    scale=7
                )

                with gr.Row():
                    gr.Examples(
                        examples=[
                            ["ما هي العقوبات المقررة لبيع المشروبات الكحولية بدون رخصة؟"],
                            ["ما هو دور البرلمان حسب الدستور المغربي 2011 ؟"],
                            ["Quel est le role du parlement dans la Constitution marocaine 2011?"],
                            ["Comment est defini le droit de greve dans la Constitution ?"]
                        ],
                        inputs=user_input
                    )

                with gr.Row():
                    send_btn = gr.Button("Envoyer", variant="primary")
                    clear_btn = gr.Button("Effacer la conversation")

                state = gr.State([])

                send_btn.click(self.process_chat, [chatbot, user_input], [chatbot, user_input])
                user_input.submit(self.process_chat, [chatbot, user_input], [chatbot, user_input])
                clear_btn.click(fn=lambda: [], inputs=None, outputs=chatbot)

            with gr.Tab("Documents"):
                gr.Markdown("## Liste des documents utilisés dans le RAG")
                gr.DataFrame(df, label="Documents", interactive=False)

        return demo

    def launch(self):
        logging.info("Launching Gradio app...")
        demo = self.create_interface()
        demo.launch(server_name="0.0.0.0", server_port=7860)

if __name__ == "__main__":
    app = GradioChatbotApp()
    app.launch()