Spaces:
Sleeping
Sleeping
import gradio as gr | |
import os | |
from tqdm import tqdm | |
import utils | |
import config | |
import pandas as pd | |
def output(file, text1, text2, text3, text4, text5, text6, template, progress: gr.Progress = gr.Progress(track_tqdm=True)): | |
output_text = "" | |
if file is None: | |
return gr.Error("No file uploaded.") | |
file_path = file.name | |
structured_data = utils.process_resume(file_path) | |
if structured_data is None: | |
return gr.Error("Unsupported file type.") | |
# Get the selected template value | |
selected_template = config.template[template] | |
prompt = f""" | |
{{ | |
"Hiring Manager's Name": "{text1}", | |
"Company Name": "{text2}", | |
"Industry/Field": "{text3}", | |
"Specific Projects, Innovations, or Company Achievements": "{text4}", | |
"Specific Skills or Tools Relevant to the Job": "{text5}", | |
"Specific Roles, Teams, or Projects at the Company": "{text6}", | |
"resume": {structured_data} | |
}} | |
""" | |
progress(0.5) | |
output_text = utils.generate_email(prompt, selected_template) | |
progress(1) | |
return output_text, output_text | |
def bulk_output(excel, pdf, template, progress: gr.Progress = gr.Progress(track_tqdm=True)): | |
# Check for uploaded files | |
if excel is None: | |
return gr.Error("No Excel file uploaded.") | |
if pdf is None: | |
return gr.Error("No PDF file uploaded.") | |
# Determine file extension and read accordingly | |
file_ext = os.path.splitext(excel.name)[-1].lower() | |
try: | |
if file_ext == '.csv': | |
df = pd.read_csv(excel.name) | |
elif file_ext in ['.xls', '.xlsx']: | |
df = pd.read_excel(excel.name) | |
else: | |
return gr.Error("Unsupported file type. Please upload a .csv or .xlsx file.") | |
except Exception as e: | |
return gr.Error(f"Failed to read the file: {str(e)}") | |
# Check required columns | |
required_columns = [ | |
'Hiring Managers Name', 'Company Name', 'Industry/Field', | |
'Specific Projects, Innovations, or Company Achievements', | |
'Specific Skills or Tools Relevant to the Job', | |
'Specific Roles, Teams, or Projects at the Company' | |
] | |
missing_columns = [col for col in required_columns if col not in df.columns] | |
if missing_columns: | |
return gr.Error(f"The uploaded Excel file is missing required columns: {', '.join(missing_columns)}") | |
# Process the resume | |
structured_data = utils.process_resume(pdf.name) | |
if structured_data is None: | |
return gr.Error("Unsupported or unreadable resume file.") | |
# Get the selected template value | |
selected_template = config.template[template] | |
# Loop through each row and generate emails | |
for _, row in tqdm(df.iterrows(), total=len(df), desc="Generating emails"): | |
prompt = f""" | |
{{ | |
"Hiring Manager's Name": "{row['Hiring Managers Name']}", | |
"Company Name": "{row['Company Name']}", | |
"Industry/Field": "{row['Industry/Field']}", | |
"Specific Projects, Innovations, or Company Achievements": "{row['Specific Projects, Innovations, or Company Achievements']}", | |
"Specific Skills or Tools Relevant to the Job": "{row['Specific Skills or Tools Relevant to the Job']}", | |
"Specific Roles, Teams, or Projects at the Company": "{row['Specific Roles, Teams, or Projects at the Company']}", | |
"resume": {structured_data} | |
}} | |
""" | |
try: | |
email = utils.generate_email(prompt, selected_template) | |
config.write_email(row['Hiring Managers Name'], row['Company Name'], email) | |
except Exception as e: | |
return gr.Error(f"Error generating email for {row['Company Name']}: {str(e)}") | |
return "Emails have been drafted and saved as Word documents." | |
def generate_and_download(name, company, ai_email): | |
file_path = config.write_email(name, company, ai_email) | |
return file_path | |
def bulk_generate_and_download(): | |
zip_file_path = config.return_bulk_file() | |
return zip_file_path | |
with gr.Blocks(css="body { background: #f8fafc; font-family: 'Inter'; }") as demo: | |
with gr.Tabs(): | |
with gr.TabItem("Single Email"): | |
with gr.Row(): | |
with gr.Column(scale=1): | |
text1 = gr.Textbox(label="Hiring Manager's Name") | |
text2 = gr.Textbox(label="Company Name") | |
text3 = gr.Textbox(label="Industry/Field") | |
text4 = gr.Textbox(label="Specific Projects, Innovations, or Company Achievements") | |
text5 = gr.Textbox(label="Specific Skills or Tools Relevant to the Job") | |
text6 = gr.Textbox(label="Specific Roles, Teams, or Projects at the Company") | |
with gr.Row(): | |
template = gr.Dropdown(choices=list(config.template.keys()), label="Select Email Template", interactive=True) | |
pdf_input = gr.File(label="Upload PDF", file_types=[".pdf", ".docx"], interactive=True, scale=1) | |
submit_btn = gr.Button("Submit") | |
with gr.Column(scale=1): | |
output_box = gr.Textbox(label="Output", lines=10, autoscroll=True) | |
with gr.Row(): | |
with gr.Column(scale=1): | |
write_btn = gr.Button("Draft Email") | |
with gr.Column(scale=1): | |
download_button = gr.File(label="Download Word Document") | |
state = gr.State() | |
submit_btn.click(output, inputs=[pdf_input, text1, text2, text3, text4, text5, text6, template], outputs=[output_box, state]) | |
write_btn.click(generate_and_download, inputs=[text1, text2, state], outputs= [download_button]) | |
with gr.TabItem("Batch Email"): | |
with gr.Row(): | |
with gr.Column(scale=1): | |
pdf_input = gr.File(label="Upload PDF", file_types=[".pdf", ".docx"], interactive=True, scale=1) | |
excel_input = gr.File(label="Upload Excel", file_types=[".xlsx", ".csv"], interactive=True, scale=1) | |
with gr.Row(): | |
template = gr.Dropdown(choices=list(config.template.keys()), label="Select Email Template", interactive=True) | |
submit_btn = gr.Button("Submit and Draft") | |
with gr.Column(scale=1): | |
output_box = gr.Textbox(label="Output", lines=10, autoscroll=True) | |
with gr.Row(): | |
with gr.Column(scale=1): | |
Zip_btn = gr.Button("Make Zip File") | |
with gr.Column(scale=1): | |
download_button = gr.File(label="Download ZIP File") | |
submit_btn.click(bulk_output, inputs=[excel_input, pdf_input, template], outputs=[output_box]) | |
Zip_btn.click(bulk_generate_and_download, inputs=[], outputs=[download_button]) | |
demo.launch() |