habibahmad's picture
Update app.py
15dfeb3 verified
import os
import gradio as gr
from transformers import pipeline
from PyPDF2 import PdfReader
# Load free Hugging Face models
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
qa_pipeline = pipeline("question-answering", model="distilbert-base-cased-distilled-squad")
# Global variable to store PDF text
pdf_text_store = ""
def extract_text_from_pdf(pdf_file):
reader = PdfReader(pdf_file)
text = ""
for page in reader.pages:
page_text = page.extract_text()
if page_text:
text += page_text + "\n"
return text
def upload_pdf(file, history):
global pdf_text_store
pdf_text_store = extract_text_from_pdf(file)
if not pdf_text_store.strip():
history.append(("System", "❌ No text could be extracted from the PDF. Please try another PDF."))
return history
summary = summarizer(pdf_text_store[:1000], max_length=200, min_length=50, do_sample=False)[0]['summary_text']
history.append(("System", f"βœ… PDF processed!\n\n**Summary:**\n{summary}"))
return history
def chatbot(user_message, history):
if not pdf_text_store:
history.append((user_message, "❌ Please upload a PDF first."))
return "", history
result = qa_pipeline({
'context': pdf_text_store,
'question': user_message
})
answer = result["answer"]
history.append((user_message, answer))
return "", history
with gr.Blocks(theme=gr.themes.Soft(primary_hue="purple", secondary_hue="blue")) as demo:
gr.HTML("""
<style>
body {
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
font-family: 'Helvetica Neue', sans-serif;
}
.title {
text-align: center;
font-size: 2.5rem;
font-weight: 700;
margin-bottom: 0.2em;
color: #4f46e5;
}
.subtitle {
text-align: center;
font-size: 1.1rem;
color: #4b5563;
margin-bottom: 2em;
}
.custom-btn {
background: #4f46e5;
color: white;
border-radius: 0.5em;
padding: 0.5em 1.2em;
transition: background 0.3s;
}
.custom-btn:hover {
background: #4338ca;
}
.upload-box {
background: white;
padding: 1em;
border-radius: 0.75em;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
margin-bottom: 1em;
}
.chat-area {
background: white;
border-radius: 0.75em;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
overflow: hidden;
}
</style>
""")
gr.HTML('<div class="title">πŸ“š Chat with Your PDF</div>')
gr.HTML('<div class="subtitle">Upload a PDF, get a summary, and chat with it!</div>')
with gr.Row():
with gr.Column(scale=1, min_width=250):
with gr.Group(elem_classes="upload-box"):
gr.Markdown("### πŸ“‚ Upload Your PDF")
pdf_upload = gr.File(label="Upload PDF", file_types=[".pdf"])
upload_btn = gr.Button("πŸš€ Process PDF", elem_classes="custom-btn")
with gr.Column(scale=2):
chatbot_ui = gr.Chatbot(
label="πŸ’¬ Chat with your PDF",
height=500,
show_copy_button=True,
elem_classes="chat-area"
)
user_input = gr.Textbox(
placeholder="Ask something about your PDF...",
show_label=False
)
upload_btn.click(upload_pdf, inputs=[pdf_upload, chatbot_ui], outputs=chatbot_ui)
user_input.submit(chatbot, [user_input, chatbot_ui], [user_input, chatbot_ui])
gr.HTML("""
<div style="text-align:center; font-size:0.9rem; color:#6b7280; margin-top:2em;">
Made with ❀️ – No API keys needed!
</div>
""")
if __name__ == "__main__":
demo.launch()