RAG_APP / src /main.py
sxid003's picture
Update src/main.py
9d485eb verified
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()