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"""
Company Logo
""") 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()