import gradio as gr from huggingface_hub import InferenceClient from PyPDF2 import PdfReader import requests from bs4 import BeautifulSoup # Initialize the Inference Client client = InferenceClient("HuggingFaceH4/zephyr-7b-beta") def extract_text_from_pdf(file): if file is None: return "" reader = PdfReader(file) text = "" for page in reader.pages: text += page.extract_text() return text def ats_friendly_checker(file): resume_text = extract_text_from_pdf(file) system_message = "Evaluate the following resume for ATS-friendliness and provide feedback." message = resume_text response = client.chat_completion( [{"role": "system", "content": system_message}, {"role": "user", "content": message}], max_tokens=512, temperature=0.7, top_p=0.95 ).choices[0].message.content feedback = response return feedback # def scrape_job_description(url): # try: # response = requests.get(url) # response.raise_for_status() # soup = BeautifulSoup(response.text, 'html.parser') # job_description = soup.get_text(separator=" ", strip=True) # return job_description # except requests.exceptions.RequestException as e: # return f"Error accessing job description: {e}" def scrape_job_description(url): try: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } response = requests.get(url, headers=headers) response.raise_for_status() soup = BeautifulSoup(response.text, 'html.parser') job_description = soup.get_text(separator=" ", strip=True) return job_description except requests.exceptions.RequestException as e: return f"Error accessing job description: {e}" except Exception as e: return f"An unexpected error occurred: {e}" def resume_match_checker(file, job_url): resume_text = extract_text_from_pdf(file) job_description = scrape_job_description(job_url) if job_description.startswith("Error accessing job description:"): return job_description system_message = "Compare the following resume with the job description and provide feedback." message = f"Resume: {resume_text}\n\nJob Description: {job_description}" response = client.chat_completion( [{"role": "system", "content": system_message}, {"role": "user", "content": message}], max_tokens=512, temperature=0.7, top_p=0.95 ).choices[0].message.content feedback = response return feedback def resume_quality_score(file): resume_text = extract_text_from_pdf(file) system_message = "Evaluate the following resume for overall quality and provide feedback." message = resume_text response = client.chat_completion( [{"role": "system", "content": system_message}, {"role": "user", "content": message}], max_tokens=512, temperature=0.7, top_p=0.95 ).choices[0].message.content interpretation = response return interpretation def text_to_overleaf(resume_text): system_message = "Convert the following resume text to Overleaf code." message = resume_text response = client.chat_completion( [{"role": "system", "content": system_message}, {"role": "user", "content": message}], max_tokens=512, temperature=0.7, top_p=0.95 ).choices[0].message.content overleaf_code = response return overleaf_code # Define the Gradio interface with gr.Blocks() as demo: gr.Markdown(""" # Resume Enhancement Tool 🚀 Welcome to the Resume Enhancement Tool! This tool offers several features to help you enhance your resume, ensuring it's ATS-friendly, matches job descriptions, and is of high quality. You can also convert your resume text to Overleaf code for a polished, professional look. """) with gr.Tab("ATS-Friendly Checker 📝"): with gr.Row(): resume = gr.File(label="Upload your Resume (PDF)") feedback = gr.Textbox(label="Feedback", interactive=False, lines=15, max_lines=50) resume.upload(ats_friendly_checker, resume, feedback) with gr.Tab("Resume Match Checker 🔍"): with gr.Row(): resume = gr.File(label="Upload your Resume (PDF)") job_url = gr.Textbox(label="Job Description URL") feedback = gr.Textbox(label="Feedback", interactive=False, lines=15, max_lines=50) gr.Button("Check Match").click(resume_match_checker, [resume, job_url], feedback) with gr.Tab("Resume Quality Score 🌟"): with gr.Row(): resume = gr.File(label="Upload your Resume (PDF)") interpretation = gr.Textbox(label="Interpretation", interactive=False, lines=15, max_lines=50) resume.upload(resume_quality_score, resume, interpretation) with gr.Tab("Text to Overleaf Code 🖋️"): with gr.Row(): resume_text = gr.Textbox(label="Resume Text", placeholder="Enter your resume text here or paste the example below:\n\nJohn Doe\n\nExperience\n- Software Engineer at Company A\n- Data Scientist at Company B\n\nEducation\n- BSc in Computer Science") overleaf_code = gr.Textbox(label="Overleaf Code", interactive=False, lines=15, max_lines=50) resume_text.submit(text_to_overleaf, resume_text, overleaf_code) gr.Markdown("Paste the generated code into [Overleaf](https://www.overleaf.com/) to create your resume.") gr.Markdown("---\nBuilt with love by [Bahae Eddine HALIM](https://www.linkedin.com/in/halimbahae/)") if __name__ == "__main__": demo.launch(share=True)