105 lines
4.0 KiB
Python
105 lines
4.0 KiB
Python
from openai import OpenAI
|
|
from dotenv import load_dotenv
|
|
import os
|
|
import pypdf
|
|
|
|
class ResumeBasedJobRecommendation:
|
|
def __init__(self, path: str):
|
|
self.resume_path = path
|
|
|
|
# method to read the content from the resume and use it for the user prompt
|
|
def read_resume(self):
|
|
"""method to read the content from the resume and use it for the user prompt.
|
|
|
|
Returns:
|
|
content (str): returns the content of the resume.
|
|
"""
|
|
try:
|
|
pdfreader = pypdf.PdfReader(self.resume_path)
|
|
data = ""
|
|
for page_number in range(pdfreader.get_num_pages()):
|
|
page = pdfreader.pages[page_number]
|
|
data += page.extract_text()
|
|
except FileNotFoundError as e:
|
|
print(f"Issue with the resume file path: {str(e)}")
|
|
return
|
|
except Exception as e:
|
|
print(f"Couldn't able to parse the pdf : {str(e)}")
|
|
return
|
|
return data
|
|
|
|
#
|
|
def message_prompt(self, data: str, job_sites: list, location: str):
|
|
"""method suggests the appropriate job roles and provides the search link from job sites based on users input of resume data, job boards and location.
|
|
|
|
Args:
|
|
data (str): resume content for user prompt
|
|
job_sites (list): job searching sites for user prompt
|
|
location (str): location of job search
|
|
|
|
Returns:
|
|
content (str): Provides summary of resume with suggested job roles and links using gpt 4.o model.
|
|
"""
|
|
self.message = [
|
|
{"role": "system",
|
|
"content": "You are an assistant that analysizes the resume data and summarize it. \
|
|
Based on the summarization, you suggest the appropriate job roles \
|
|
and provide the appropriate job search links for each suggested roles from the job sites based on filtering by the \
|
|
location provided. "
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": f"Below is my resume content, kindly look for the appropriate job openings in \
|
|
{job_sites} for location {location}:\n{data}"
|
|
}]
|
|
self.response = openai.chat.completions.create(model='gpt-4o-mini', messages=self.message)
|
|
return self.response.choices[0].message.content
|
|
|
|
|
|
if __name__ == '__main__':
|
|
# load the api key from .env and check if it is valid.
|
|
load_dotenv()
|
|
|
|
api_key = os.getenv('OPENAI_API_KEY')
|
|
|
|
if api_key is None:
|
|
print("No api key was found.")
|
|
exit()
|
|
elif not api_key.startswith('sk-proj-'):
|
|
print("api key is present but it is not matching with the openai api key pattern starting with sk-proj-. Please check it.")
|
|
exit()
|
|
elif api_key.strip() != api_key:
|
|
print("api key is good but it seems it has the spaces at starting or the end. Please check and remove it.")
|
|
exit()
|
|
else:
|
|
print("api key is found and it looks good.")
|
|
|
|
openai = OpenAI()
|
|
|
|
#Provide the valid resume path
|
|
file_path = input("Kindly enter the resume path:\n")
|
|
if not file_path:
|
|
print("Resume path is not provided. Kindly provide the valid path.")
|
|
exit()
|
|
|
|
obj = ResumeBasedJobRecommendation(file_path)
|
|
data = obj.read_resume()
|
|
|
|
if not data:
|
|
pass
|
|
else:
|
|
#provide the input for the job sites to search and valid job location
|
|
job_sites = input("Enter the job sites with space between each other: ")
|
|
if not job_sites:
|
|
print("Didn't provided the job sites to search for. Going with Linkedin, Indeed, Glassdoor and Naukri as defaults.")
|
|
job_sites = ['LinkedIn', 'Indeed', 'Naukri', 'Glassdoor']
|
|
else:
|
|
job_sites = job_sites.split(' ')
|
|
location = input("Enter the job location:")
|
|
if not location:
|
|
print("No location has been provided. Default will consider as United States.")
|
|
location = 'United States'
|
|
|
|
response = obj.message_prompt(data, job_sites, location)
|
|
print(response)
|