Spaces:
Runtime error
Runtime error
| import os | |
| from openai import AzureOpenAI | |
| import PyPDF2 | |
| import gradio as gr | |
| import docx | |
| import re | |
| class Resume_Overall: | |
| def __init__(self): | |
| self.client = AzureOpenAI(api_key=os.getenv("AZURE_OPENAI_KEY"), | |
| api_version="2023-07-01-preview", | |
| azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT") | |
| ) | |
| def extract_text_from_file(self,file_path): | |
| # Get the file extension | |
| file_extension = os.path.splitext(file_path)[1] | |
| if file_extension == '.pdf': | |
| with open(file_path, 'rb') as file: | |
| # Create a PDF file reader object | |
| reader = PyPDF2.PdfFileReader(file) | |
| # Create an empty string to hold the extracted text | |
| extracted_text = "" | |
| # Loop through each page in the PDF and extract the text | |
| for page_number in range(reader.getNumPages()): | |
| page = reader.getPage(page_number) | |
| extracted_text += page.extractText() | |
| return extracted_text | |
| elif file_extension == '.txt': | |
| with open(file_path, 'r') as file: | |
| # Just read the entire contents of the text file | |
| return file.read() | |
| elif file_extension == '.docx': | |
| doc = docx.Document(file_path) | |
| text = [] | |
| for paragraph in doc.paragraphs: | |
| text.append(paragraph.text) | |
| return '\n'.join(text) | |
| else: | |
| return "Unsupported file type" | |
| def course_response(self,resume_path): | |
| resume_path = resume_path.name | |
| resume = self.extract_text_from_file(resume_path) | |
| # Define the prompt or input for the model | |
| conversation = [ | |
| {"role": "system", "content": "You are a Resume Assistant."}, | |
| {"role": "user", "content": f"""Analyze the resume to generate online courses with website links to improve skills following resume delimitted by triple backticks. Generate atmost five courses. | |
| result format should be: | |
| course:[course]. | |
| website link:[website link] | |
| ```{resume}``` | |
| """} | |
| ] | |
| # Generate a response from the GPT-3 model | |
| chat_completion = self.client.chat.completions.create( | |
| model = "GPT-3", | |
| messages = conversation, | |
| max_tokens=200, | |
| temperature=0, | |
| n=1, | |
| stop=None, | |
| ) | |
| # Extract the generated text from the API response | |
| generated_text = chat_completion.choices[0].message.content | |
| return generated_text | |
| def summary_response(self,resume_path): | |
| resume_path = resume_path.name | |
| resume = self.extract_text_from_file(resume_path) | |
| # Define the prompt or input for the model | |
| conversation = [ | |
| {"role": "system", "content": "You are a Resume Summarizer."}, | |
| {"role": "user", "content": f"""Analyze the resume to write the summary for following resume delimitted by triple backticks. | |
| ```{resume}``` | |
| """} | |
| ] | |
| # Generate a response from the GPT-3 model | |
| chat_completion = self.client.chat.completions.create( | |
| model = "GPT-3", | |
| messages = conversation, | |
| max_tokens=200, | |
| temperature=0, | |
| n=1, | |
| stop=None, | |
| ) | |
| # Extract the generated text from the API response | |
| generated_text = chat_completion.choices[0].message.content | |
| return generated_text | |
| def skill_response(self,job_description_path): | |
| job_description_path = job_description_path.name | |
| resume = self.extract_text_from_file(job_description_path) | |
| # Define the prompt or input for the model | |
| conversation = [ | |
| {"role": "system", "content": "You are a Resume Assistant."}, | |
| {"role": "user", "content": f"""Find Education Gaps in given resume. Find Skills in resume. | |
| ```{resume}``` | |
| """} | |
| ] | |
| # Generate a response from the GPT-3 model | |
| chat_completion = self.client.chat.completions.create( | |
| model = "GPT-3", # Choose the GPT-3 engine you want to use | |
| messages = conversation, | |
| max_tokens=100, # Set the maximum number of tokens in the generated response | |
| temperature=0, # Controls the randomness of the output. Higher values = more random, lower values = more focused | |
| n=1, # Generate a single response | |
| stop=None, # Specify an optional stop sequence to limit the length of the response | |
| ) | |
| # Extract the generated text from the API response | |
| generated_text = chat_completion.choices[0].message.content | |
| return generated_text | |
| def _generate_job_list(self, resume: str) -> str: | |
| conversation = [ | |
| {"role": "system", "content": "You are a Resume Assistant."}, | |
| {"role": "user", "content": f"List out perfect job roles for based on resume informations:{resume}"} | |
| ] | |
| chat_completion = self.client.chat.completions.create( | |
| model = "GPT-3", | |
| messages = conversation, | |
| max_tokens=100, | |
| temperature=0, | |
| n=1, | |
| stop=None, | |
| ) | |
| generated_text = chat_completion.choices[0].message.content | |
| return generated_text | |
| def job_list_interface(self, file) -> str: | |
| resume_text = self.extract_text_from_file(file.name) | |
| job_list = self._generate_job_list(resume_text) | |
| return job_list | |
| def generate_job_description(self, role, experience): | |
| # Generate a response from the GPT-3 model | |
| conversation = [ | |
| {"role": "system", "content": "You are a Resume Assistant."}, | |
| {"role": "user", "content": f"""Your task is generate Job description for this {role} with {experience} years of experience. | |
| Job Description Must have | |
| 1. Job Title | |
| 2. Job Summary : [200 words] | |
| 3. Responsibilities : Five Responsibilities in five lines | |
| 4. Required Skills : Six Skills | |
| 5. Qualifications | |
| These topics must have in that Generated Job Description. | |
| """} | |
| ] | |
| chat_completion = self.client.chat.completions.create( | |
| model = "GPT-3", # Choose the GPT-3 engine you want to use | |
| messages = conversation, | |
| max_tokens=500, # Set the maximum number of tokens in the generated response | |
| temperature=0.5, # Controls the randomness of the output. Higher values = more random, lower values = more focused | |
| ) | |
| # Extract the generated text from the API response | |
| generated_text = chat_completion.choices[0].message.content | |
| return generated_text | |
| def response(self,job_description_path): | |
| job_description_path = job_description_path.name | |
| job_description = self.extract_text_from_file(job_description_path) | |
| # Define the prompt or input for the model | |
| conversation = [ | |
| {"role": "system", "content": "You are a Resume Assistant."}, | |
| {"role": "user", "content": f"""Generate interview questions for screening following job_description delimitted by triple backticks. Generate atmost ten questions. | |
| ```{job_description}``` | |
| """} | |
| ] | |
| # Generate a response from the GPT-3 model | |
| chat_completion = self.client.chat.completions.create( | |
| model = "GPT-3", # Choose the GPT-3 engine you want to use | |
| messages = conversation, | |
| max_tokens=200, # Set the maximum number of tokens in the generated response | |
| temperature=0, # Controls the randomness of the output. Higher values = more random, lower values = more focused | |
| n=1, # Generate a single response | |
| stop=None, # Specify an optional stop sequence to limit the length of the response | |
| ) | |
| # Extract the generated text from the API response | |
| generated_text = chat_completion.choices[0].message.content | |
| return generated_text | |
| def show_file(self,file_path): | |
| return file_path.name | |
| def launch_gradio_interface(self, share: bool = True): | |
| with gr.Blocks(css="style.css",theme='freddyaboulton/test-blue') as app: | |
| gr.HTML("""<center class="darkblue" text-align:center;padding:25px;'><be><h1 style="color:#fff; font-weight:bold; font-size:28px;">Resume Analyzer</h1></center>""") | |
| with gr.Tab("Resume"): | |
| with gr.Row(elem_id="col-container"): | |
| with gr.Column(scale=0.70): | |
| file_output = gr.File(elem_classes="filenameshow") | |
| with gr.Column(scale=0.30): | |
| upload_button = gr.UploadButton( | |
| "Browse File",file_types=[".txt", ".pdf", ".doc", ".docx",".json",".csv"], | |
| elem_classes="uploadbutton",scale=0.60) | |
| with gr.TabItem("Designation"): | |
| with gr.Column(elem_id = "col-container",scale=0.80): | |
| btn = gr.Button(value="Submit") | |
| output_text = gr.Textbox(label="Designation List",lines=8) | |
| with gr.TabItem("Summarized"): | |
| with gr.Column(elem_id = "col-container",scale=0.80): | |
| analyse = gr.Button("Analyze") | |
| summary_result = gr.Textbox(label="Summarized",lines=8) | |
| with gr.TabItem("Skills and Education Gaps"): | |
| with gr.Column(elem_id = "col-container",scale=0.80): | |
| analyse_resume = gr.Button("Analyze Resume") | |
| result = gr.Textbox(label="Skills and Education Gaps",lines=8) | |
| with gr.TabItem("Course"): | |
| with gr.Column(elem_id = "col-container",scale=0.80): | |
| course_analyse = gr.Button("Find Courses") | |
| course_result = gr.Textbox(label="Suggested Cources",lines=8) | |
| upload_button.upload(self.show_file,upload_button,file_output) | |
| course_analyse.click(self.course_response, [upload_button], course_result) | |
| analyse_resume.click(self.skill_response, [upload_button], result) | |
| btn.click(self.job_list_interface, upload_button, output_text) | |
| analyse.click(self.summary_response, [upload_button], summary_result) | |
| with gr.Tab("Job Description"): | |
| with gr.Row(elem_id="col-container"): | |
| with gr.Column(scale=0.70): | |
| file_output1 = gr.File(elem_classes="filenameshow") | |
| with gr.Column(scale=0.30): | |
| upload_button1 = gr.UploadButton( | |
| "Browse File",file_types=[".txt", ".pdf", ".doc", ".docx",".json",".csv"], | |
| elem_classes="uploadbutton") | |
| with gr.TabItem("Screening Question"): | |
| with gr.Row(elem_id="col-container"): | |
| jd_btn = gr.Button(value="Submit") | |
| with gr.Row(elem_id="col-container"): | |
| output_text1 = gr.Textbox(label="Screening Question") | |
| with gr.TabItem("Generate JD"): | |
| with gr.Row(elem_id="col-container"): | |
| with gr.Column(scale=0.50): | |
| rolls = gr.Textbox(label="Role",scale=0.60) | |
| with gr.Column(scale=0.50): | |
| experience = gr.Textbox(label="Experience",scale=0.60) | |
| with gr.Row(elem_id="col-container"): | |
| get_jd_btn = gr.Button("Generate JD") | |
| with gr.Row(elem_id="col-container"): | |
| result_jd = gr.Textbox(label="Job Description",lines=8) | |
| get_jd_btn.click(self.generate_job_description, [rolls,experience], result_jd) | |
| upload_button1.upload(self.show_file,upload_button1,file_output1) | |
| jd_btn.click(self.response,[upload_button1], output_text1) | |
| app.launch(debug=True) | |
| if __name__ == "__main__": | |
| resume_overall = Resume_Overall() | |
| resume_overall.launch_gradio_interface() |