Spaces:
Build error
Build error
import streamlit as st | |
import os | |
import PyPDF2 | |
from langchain_mistralai.chat_models import ChatMistralAI | |
import json | |
from dotenv import load_dotenv | |
from PIL import Image | |
import pytesseract | |
import time | |
load_dotenv() | |
# Set up the Mistral AI client | |
mistral_api_key = os.getenv("MISTRAL_API_KEY") | |
client = ChatMistralAI(api_key=mistral_api_key) | |
# Define the input prompts | |
input_prompt1 = """ | |
You are an skilled Applicant Tracking System scanner with a deep understanding of Applicant Tracking System functionality, | |
your task is to evaluate the resume against the provided job description. | |
Show a single percentage reflecting the overall match between resume and job description. | |
""" | |
input_prompt2 = """ | |
You are an skilled Applicant Tracking System scanner with a deep understanding of Applicant Tracking System functionality, | |
your task is to evaluate the resume against the provided job description. | |
Find out the requirements the make this resume disqualified for this job in a list. | |
""" | |
input_prompt3 = """ | |
You are an skilled Applicant Tracking System scanner with a deep understanding of Applicant Tracking System functionality, | |
your task is to evaluate the resume against the provided job description. | |
Find out the most critical keywords in the resume that match the job description in a list. | |
""" | |
input_prompt4 = """ | |
You are submitting a resume to a job with the provided job description. | |
Find out the requirements in the job description you should add to make you qualify for this job. | |
""" | |
input_prompt5 = """ | |
You are the applicant who applied for this job and want to compose a strong but concise coverletter to convince the employer you have the skills and the expereince for this job. | |
The first paragraph of the cover letter must briefly discuss the your backgroud. | |
The second paragraph discuss how the applicant fit this role based on your skillsets matches the job requirements. | |
The third paragraph discuss the your interest in this role and thanks for the consideration . | |
""" | |
# Define a function to extract text from a PDF file | |
def extract_text_from_pdf(file): | |
reader = PyPDF2.PdfReader(file) | |
text = "" | |
for page in range(len(reader.pages)): | |
text += reader.pages[page].extract_text() | |
return text | |
# Set up the Streamlit app | |
st.set_page_config(page_title="Resume Match Maker", page_icon=":robot:", layout="wide") | |
# Add a header to the app | |
st.header("Resume Match Maker") | |
st.markdown("## Created by Gokul Palanisamy") | |
# Add a ticker to the app | |
st.markdown("""<div style='position:fixed;bottom:0;left:0;background-color:#222;color:#fff;padding:10px;border-radius:5px;'> | |
<marquee behavior="scroll" direction="left">Resume Match Maker helps you match your resume to job descriptions and generate cover letters. Created by Gokul Palanisamy.</marquee> | |
</div>""", unsafe_allow_html=True) | |
# Add a sidebar to the app | |
with st.sidebar: | |
st.markdown("# Resume Match Maker") | |
st.markdown("## Match your resume to job descriptions and generate cover letters") | |
# Add input fields for job description and resume | |
use_image = st.checkbox("Use Image for Job Description") | |
if use_image: | |
job_description_image = st.file_uploader("Upload Job Description Image", type=["jpg", "jpeg", "png"]) | |
if job_description_image: | |
# Perform OCR on the image | |
image = Image.open(job_description_image) | |
gray_image = image.convert("L") | |
job_description = pytesseract.image_to_string(gray_image) | |
else: | |
job_description = "" | |
else: | |
job_description = st.text_area("Enter Job Description", value="") | |
st.markdown("## Upload Resume") | |
resume = st.file_uploader("", type="pdf") | |
# Add a button to generate results | |
if st.button("Generate Results"): | |
# Display a loading spinner while the results are being generated | |
with st.spinner("Generating results..."): | |
# Display a progress bar while the results are being generated | |
progress_bar = st.progress(0) | |
# Extract text from the resume | |
if resume: | |
resume_text = extract_text_from_pdf(resume) | |
else: | |
st.error("Please upload a resume.") | |
resume_text = "" | |
# Generate results using Mistral AI | |
if job_description and resume_text: | |
# Match percentage | |
response1 = client.invoke(input_prompt1 + resume_text + job_description) | |
progress_bar.progress(20) | |
time.sleep(0.5) | |
# Disqualifying factors | |
response2 = client.invoke(input_prompt2 + resume_text + job_description) | |
progress_bar.progress(40) | |
time.sleep(0.5) | |
# Matching keywords | |
response3 = client.invoke(input_prompt3 + resume_text + job_description) | |
progress_bar.progress(60) | |
time.sleep(0.5) | |
# Missing keywords | |
response4 = client.invoke(input_prompt4 + resume_text + job_description) | |
progress_bar.progress(80) | |
time.sleep(0.5) | |
# Cover letter | |
response5 = client.invoke(input_prompt5 + resume_text + job_description) | |
progress_bar.progress(100) | |
time.sleep(0.5) | |
# Display the results | |
st.markdown("## Match Percentage") | |
st.markdown(f'* {response1.content}') | |
st.markdown("## Disqualifying Factors") | |
st.markdown(f'* {response2.content}') | |
st.markdown("## Matching Keywords") | |
st.markdown(f'* {response3.content}') | |
st.markdown("## Missing Keywords") | |
st.markdown(f'* {response4.content}') | |
st.markdown("## Cover Letter") | |
st.markdown(f'* {response5.content}') | |
else: | |
st.error("Please enter a job description and upload a resume.") | |