Spaces:
Build error
Build error
| import os | |
| import fitz # PyMuPDF | |
| import re | |
| import pandas as pd | |
| import streamlit as st | |
| from smolagents import CodeAgent, HfApiModel, DuckDuckGoSearchTool | |
| from io import BytesIO | |
| # Disable SSL verification warning | |
| import urllib3 | |
| urllib3.disable_warnings() | |
| # Configure page | |
| st.set_page_config( | |
| page_title="Resume Scorer", | |
| page_icon="π", | |
| layout="wide" | |
| ) | |
| # Initialize the model and agent - moved outside of cache | |
| try: | |
| model = HfApiModel() | |
| agent = CodeAgent(tools=[DuckDuckGoSearchTool()], model=model) | |
| except Exception as e: | |
| st.error(f"Error initializing agent: {e}") | |
| agent = None | |
| def extract_text_from_uploaded_pdf(pdf_file): | |
| """Extracts text from an uploaded PDF file.""" | |
| try: | |
| pdf_bytes = pdf_file.read() | |
| doc = fitz.open(stream=pdf_bytes, filetype="pdf") | |
| text = "" | |
| for page in doc: | |
| text += page.get_text() | |
| return text | |
| except Exception as e: | |
| st.error(f"Error extracting text from PDF: {e}") | |
| return None | |
| def score_resume_against_job_description(resume_text, job_description): | |
| """Scores a resume against a job description using smolagents.""" | |
| if agent is None: | |
| st.error("Agent not initialized properly") | |
| return None | |
| prompt = f""" | |
| You are a professional recruiter that is highly skilled in scoring resumes. | |
| You will receive a resume and a job description. | |
| You will score the resume based on how well it matches the job description. | |
| Job Description: | |
| {job_description} | |
| Resume: | |
| {resume_text} | |
| Provide a score out of 100. Only provide the numerical score. | |
| """ | |
| try: | |
| response = agent.run(prompt) | |
| # Ensure we get a numeric response | |
| score = int(''.join(filter(str.isdigit, str(response)))) | |
| return min(max(score, 0), 100) # Ensure score is between 0 and 100 | |
| except Exception as e: | |
| st.error(f"An error has occurred: {e}") | |
| return None | |
| def extract_links_from_text(text): | |
| """Extracts links from text using regular expressions.""" | |
| links = re.findall(r'(https?://\S+)', text) | |
| return links | |
| def main(): | |
| st.title("π Resume Scorer") | |
| st.write("Upload a resume and enter a job description to get a matching score!") | |
| if agent is None: | |
| st.error("Failed to initialize the scoring system. Please try again later.") | |
| return | |
| # Create two columns | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| st.subheader("Upload Resume") | |
| uploaded_file = st.file_uploader("Upload Resume (PDF)", type="pdf") | |
| with col2: | |
| st.subheader("Job Description") | |
| job_description = st.text_area( | |
| "Enter Job Description", | |
| height=200, | |
| placeholder="Paste the job description here..." | |
| ) | |
| if uploaded_file and job_description: | |
| if st.button("Score Resume"): | |
| with st.spinner("Analyzing resume..."): | |
| resume_text = extract_text_from_uploaded_pdf(uploaded_file) | |
| if resume_text: | |
| links = extract_links_from_text(resume_text) | |
| score = score_resume_against_job_description(resume_text, job_description) | |
| st.divider() | |
| st.subheader("Results") | |
| if score is not None: | |
| score_col, links_col = st.columns(2) | |
| with score_col: | |
| st.metric("Resume Match Score", f"{score}/100") | |
| if score >= 80: | |
| st.success("Strong match! π") | |
| elif score >= 60: | |
| st.info("Good match! π") | |
| else: | |
| st.warning("Consider revising the resume") | |
| with links_col: | |
| if links: | |
| st.subheader("Links found in Resume:") | |
| for link in links: | |
| st.write(f"- {link}") | |
| else: | |
| st.info("No links found in the resume") | |
| else: | |
| st.error("Error calculating score") | |
| else: | |
| st.error("Could not extract text from the PDF") | |
| with st.sidebar: | |
| st.header("How to Use") | |
| st.write(""" | |
| 1. Upload a PDF resume | |
| 2. Paste the job description | |
| 3. Click 'Score Resume' | |
| """) | |
| st.divider() | |
| st.markdown(""" | |
| ### About | |
| This tool uses AI to analyze resumes and provide | |
| matching scores against job descriptions. | |
| """) | |
| if __name__ == "__main__": | |
| main() |