import gradio as gr from huggingface_hub import InferenceClient from PyPDF2 import PdfFileReader import requests from bs4 import BeautifulSoup # Initialize the Inference Client client = InferenceClient("HuggingFaceH4/zephyr-7b-beta") def extract_text_from_pdf(file): reader = PdfFileReader(file) text = "" for page in range(reader.getNumPages()): text += reader.getPage(page).extract_text() return text def ats_friendly_checker(file): resume_text = extract_text_from_pdf(file) # Implement ATS-friendly checker logic using LLM system_message = "Evaluate the following resume for ATS-friendliness and provide a score and 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"] score = response.split("\n")[0].split(":")[-1].strip() feedback = "\n".join(response.split("\n")[1:]) return score, feedback def scrape_job_description(url): response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') job_description = soup.get_text(separator=" ", strip=True) return job_description def resume_match_checker(file, job_url): resume_text = extract_text_from_pdf(file) job_description = scrape_job_description(job_url) # Implement resume match checker logic using LLM system_message = "Compare the following resume with the job description and provide a match score." 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"] match_score = response.split(":")[-1].strip() return match_score def resume_quality_score(file): resume_text = extract_text_from_pdf(file) # Implement resume quality scoring logic using LLM system_message = "Evaluate the following resume for overall quality and provide a score." 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"] quality_score = response.split(":")[-1].strip() return quality_score def text_to_overleaf(resume_text): # Implement the conversion to Overleaf code using LLM 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\nEnhance your resume with the following features.") with gr.Tab("ATS-Friendly Checker"): with gr.Row(): resume = gr.File(label="Upload your Resume (PDF)") score = gr.Number(label="ATS Score", interactive=False) feedback = gr.Textbox(label="Feedback", interactive=False) resume.upload(ats_friendly_checker, resume, [score, 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") match_score = gr.Number(label="Match Score", interactive=False) gr.Button("Check Match").click(resume_match_checker, [resume, job_url], match_score) with gr.Tab("Resume Quality Score"): with gr.Row(): resume = gr.File(label="Upload your Resume (PDF)") quality_score = gr.Number(label="Quality Score", interactive=False) resume.upload(resume_quality_score, resume, quality_score) with gr.Tab("Text to Overleaf Code"): with gr.Row(): resume_text = gr.Textbox(label="Resume Text") overleaf_code = gr.Textbox(label="Overleaf Code", interactive=False) resume_text.submit(text_to_overleaf, resume_text, overleaf_code) gr.Markdown("---\nBuilt with love by [Bahae Eddine HALIM](https://www.linkedin.com/in/halimbahae/)") if __name__ == "__main__": demo.launch()