cjzhi98's picture
Update app.py
338ab91 verified
import gradio as gr
import os
from dataset_loader import load_dataset
from dotenv import load_dotenv
load_dotenv()
if not os.path.isdir("low_partners_chatbot_data"):
load_dataset()
from low_partners_chatbot_data.agent import Agent
import gradio as gr
import fitz # PyMuPDF
from PIL import Image
import io
import os
from uuid import uuid4
agent = Agent()
def extract_pages_from_multiple_pdfs(pdf_info):
images = []
for pdf_path, page_numbers in pdf_info.items():
if not os.path.exists(pdf_path):
print(f"PDF file not found: {pdf_path}")
continue
try:
doc = fitz.open(pdf_path)
for page_num in page_numbers:
if 1 <= page_num <= len(doc):
page = doc.load_page(page_num - 1)
pix = page.get_pixmap(
matrix=fitz.Matrix(2, 2)
) # Increase resolution
img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
images.append(
(img, f"{os.path.basename(pdf_path)} - Page {page_num}")
)
else:
print(f"Page {page_num} is out of range for {pdf_path}")
doc.close()
except Exception as e:
print(f"An error occurred with {pdf_path}: {str(e)}")
return images
def get_answer(query, chat_history, session_id):
print(f"Session ID: {session_id}")
answer, pdf_info = agent.ask(query, session_id)
images = []
if pdf_info:
images = extract_pages_from_multiple_pdfs(pdf_info)
# Update chat history
chat_history.append((query, answer))
return chat_history, images, session_id
with gr.Blocks(title="Low & Partners Chatbot") as demo:
# Initialize session ID
session_id = gr.State(value=lambda: str(uuid4()))
gr.Markdown("## Low & Partners Chatbot")
gr.Markdown(
"This is a chatbot for Low & Partners Law Firm. Ask me anything related to law! \n"
"Note: The chat session persists until you refresh the page."
)
with gr.Row():
# Left Column - Chat Interface
with gr.Column(scale=1):
chatbot = gr.Chatbot(label="Conversation History")
query_input = gr.Textbox(
label="Enter your legal query",
placeholder="Type your question here and press Enter...",
lines=3,
)
submit_btn = gr.Button("Submit", variant="primary")
# Right Column - PDF References
with gr.Column(scale=1):
gallery = gr.Gallery(
label="Reference Documents from Latest Answer",
allow_preview=True,
preview=True,
object_fit="contain",
height=600,
)
# Event handlers for both button click and Enter key
submit_event = submit_btn.click(
fn=get_answer,
inputs=[query_input, chatbot, session_id],
outputs=[chatbot, gallery, session_id],
).then(lambda: "", outputs=[query_input])
query_input.submit(
fn=get_answer,
inputs=[query_input, chatbot, session_id],
outputs=[chatbot, gallery, session_id],
).then(lambda: "", outputs=[query_input])
if __name__ == "__main__":
demo.launch()