Spaces:
Runtime error
Runtime error
File size: 6,806 Bytes
b8af2a6 | 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 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | import gradio as gr
import PyPDF2
from fpdf import FPDF
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
import json
import os
# Load a lightweight Hugging Face summarization model
model_name = "sshleifer/distilbart-cnn-12-6" # Faster and memory-efficient model
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
# Function to summarize text using Hugging Face model
def summarize_text(text):
inputs = tokenizer.encode("summarize: " + text, return_tensors="pt", max_length=1024, truncation=True)
outputs = model.generate(inputs, max_length=150, min_length=50, length_penalty=2.0, num_beams=4, early_stopping=True)
return tokenizer.decode(outputs[0], skip_special_tokens=True)
# Function to extract text from a PDF file
def extract_text_from_pdf(pdf_file):
reader = PyPDF2.PdfReader(pdf_file)
text = ""
for page in reader.pages:
text += page.extract_text()
return text
# Function to analyze multiple proposals
def analyze_multiple_proposals(proposal_texts, criteria):
summaries = []
comparison = f"### Comparison based on the criteria: {criteria}\n"
for i, text in enumerate(proposal_texts, start=1):
summary = summarize_text(text)
summaries.append(summary)
comparison += f"- **Proposal {i} Summary**: {summary}\n"
# Generate a simple recommendation based on length
detailed_proposal = max(summaries, key=len)
recommendation = f"The most detailed proposal is likely: Proposal {summaries.index(detailed_proposal) + 1}."
return comparison, recommendation
# Function to generate PDF report
def generate_pdf(proposal_texts, comparison, recommendation, criteria):
pdf = FPDF()
pdf.add_page()
# Set title
pdf.set_font("Arial", 'B', 16)
pdf.cell(200, 10, txt="Proposal Comparison Report", ln=True, align='C')
# Add Criteria
pdf.set_font("Arial", 'B', 12)
pdf.cell(200, 10, txt=f"Criteria: {criteria}", ln=True, align='L')
# Add each Proposal's text and summary
for i, text in enumerate(proposal_texts, start=1):
pdf.set_font("Arial", 'B', 12)
pdf.cell(200, 10, txt=f"Proposal {i}:", ln=True)
pdf.set_font("Arial", '', 12)
pdf.multi_cell(200, 10, txt=text)
# Add Comparison and Recommendation
pdf.set_font("Arial", 'B', 12)
pdf.cell(200, 10, txt="Comparison:", ln=True)
pdf.set_font("Arial", '', 12)
pdf.multi_cell(200, 10, txt=comparison)
pdf.set_font("Arial", 'B', 12)
pdf.cell(200, 10, txt="Recommendation:", ln=True)
pdf.set_font("Arial", '', 12)
pdf.multi_cell(200, 10, txt=recommendation)
# Save the PDF
pdf_output_path = "data/proposal_comparison_report.pdf"
pdf.output(pdf_output_path)
return pdf_output_path
# Function to load language JSON based on the selected language
def load_language_data(language):
lang_file_path = os.path.join("lang", f"{language.lower()}.json")
with open(lang_file_path, "r", encoding="utf-8") as file:
return json.load(file)
# Function to update interface text based on language selection
def update_interface(language, components):
lang_data = load_language_data(language)
# Update content for components using 'value' instead of 'update'
components["title"].value = lang_data["title"]
components["rfp_label"].value = lang_data["rfp_label"]
components["proposals_label"].value = lang_data["proposals_label"]
components["criteria_label"].value = lang_data["criteria_label"]
components["compare_btn"].value = lang_data["compare_btn"]
components["download_btn"].value = lang_data["download_btn"]
components["comparison_label"].value = lang_data["comparison_label"]
components["recommendation_label"].value = lang_data["recommendation_label"]
components["download_link_label"].value = lang_data["download_link_label"]
# Apply RTL class directly to the container based on language
if language in ["Arabic", "Hebrew"]:
components["lang_container"].classes = "rtl" # Apply RTL to the container
else:
components["lang_container"].classes = "" # Remove RTL for LTR languages
# Set up the Gradio Interface
def interface():
with gr.Blocks(css="public/style.css") as app: # Adding the CSS file
# Create a container for the language-related components
lang_container = gr.Column()
# Language Selector at the top
language_selector = gr.Dropdown(choices=["English", "Arabic", "French", "Spanish"], label="Select Language", value="English")
components = {
"title": gr.Markdown(value="Generative AI RFP Proposal Comparison Tool"),
"rfp_label": gr.File(label="Upload RFP (PDF)", file_types=[".pdf"], file_count="single"),
"proposals_label": gr.File(label="Upload Proposals (PDF)", file_types=[".pdf"], file_count="multiple"),
"criteria_label": gr.Textbox(label="Comparison Criteria", placeholder="Enter the key comparison criteria", lines=2),
"compare_btn": gr.Button("Compare Proposals"),
"comparison_label": gr.Textbox(label="Comparison Results", interactive=False, lines=10),
"recommendation_label": gr.Textbox(label="Recommendation", interactive=False, lines=2),
"download_btn": gr.Button("Download PDF Report"),
"download_link_label": gr.File(label="Download Report", interactive=False),
"lang_container": lang_container # Adding the lang_container to components
}
# Update interface language based on the dropdown
language_selector.change(fn=lambda language: update_interface(language, components), inputs=language_selector, outputs=[])
# Define the actions for buttons
def on_compare(rfp, proposals, criteria):
rfp_text = extract_text_from_pdf(rfp) if rfp else ""
proposal_texts = [extract_text_from_pdf(pdf) for pdf in proposals]
comparison, recommendation = analyze_multiple_proposals(proposal_texts, criteria)
pdf_output_path = generate_pdf(proposal_texts, comparison, recommendation, criteria)
return comparison, recommendation, pdf_output_path
# Set button action
components["compare_btn"].click(fn=on_compare, inputs=[components["rfp_label"], components["proposals_label"], components["criteria_label"]], outputs=[components["comparison_label"], components["recommendation_label"], components["download_link_label"]])
# File download button action
components["download_link_label"].change(lambda file: file, inputs=components["download_link_label"], outputs=components["download_link_label"])
app.launch(share=True)
interface() |