Spaces:
Sleeping
Sleeping
import gradio as gr | |
import pandas as pd | |
import datetime | |
import numpy as np | |
import docx | |
from PyPDF2 import PdfReader | |
from sentence_transformers import SentenceTransformer, util | |
class AIHRAgent: | |
def __init__(self): | |
# Advanced model for semantic similarity | |
self.resume_model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2") | |
self.employee_records = pd.DataFrame(columns=["Name", "Position", "Start Date", "Attendance", "Performance", "Leaves"]) | |
self.company_policies = "Employees are entitled to 24 annual leaves and must adhere to company policies regarding attendance and punctuality." | |
def extract_text_from_file(self, file_path): | |
"""Extract text from uploaded file (PDF or DOCX).""" | |
try: | |
if file_path.name.endswith(".pdf"): | |
pdf_reader = PdfReader(file_path) | |
text = " ".join(page.extract_text() for page in pdf_reader.pages if page.extract_text()) | |
elif file_path.name.endswith(".docx"): | |
doc = docx.Document(file_path) | |
text = " ".join(paragraph.text for paragraph in doc.paragraphs) | |
else: | |
raise ValueError("Unsupported file format. Please upload a PDF or DOCX file.") | |
return text | |
except Exception as e: | |
return f"Error extracting text from file: {e}" | |
def screen_resume(self, resume_text, job_description): | |
"""Advanced resume screening using sentence embeddings.""" | |
try: | |
if not resume_text or not job_description: | |
return "Please provide both the resume text and job description." | |
# Semantic similarity scoring | |
job_embedding = self.resume_model.encode(job_description, convert_to_tensor=True) | |
resume_embedding = self.resume_model.encode(resume_text, convert_to_tensor=True) | |
similarity = util.pytorch_cos_sim(job_embedding, resume_embedding).item() | |
return f"Relevance Score: {similarity:.2f} for the position of {job_description}." | |
except Exception as e: | |
return f"Error during resume screening: {e}" | |
def onboarding_guide(self, employee_name, position): | |
"""Automated onboarding guide generation.""" | |
return (f"Welcome {employee_name}!\n" | |
f"As a {position}, your onboarding plan includes:\n" | |
f"1. Orientation session.\n" | |
f"2. Team introductions.\n" | |
f"3. Work system setup.\n" | |
f"4. Initial training and goal setting.") | |
def add_employee(self, name, position, start_date): | |
new_employee = { | |
"Name": name, | |
"Position": position, | |
"Start Date": start_date, | |
"Attendance": 0, | |
"Performance": "Not Reviewed", | |
"Leaves": 0 | |
} | |
self.employee_records = self.employee_records.append(new_employee, ignore_index=True) | |
return f"Employee {name} added successfully." | |
def track_attendance(self, employee_name): | |
if employee_name in self.employee_records["Name"].values: | |
self.employee_records.loc[self.employee_records["Name"] == employee_name, "Attendance"] += 1 | |
return f"Attendance recorded for {employee_name}." | |
return f"Employee {employee_name} not found." | |
def process_payroll(self, employee_name, base_salary): | |
if employee_name in self.employee_records["Name"].values: | |
tax = base_salary * 0.1 | |
net_salary = base_salary - tax | |
return f"Payroll Processed: Gross Salary = {base_salary}, Tax = {tax}, Net Salary = {net_salary}." | |
return f"Employee {employee_name} not found." | |
def pulse_survey(self): | |
return "Pulse Survey: On a scale of 1-5, how satisfied are you with your current role?" | |
def feedback_analysis(self, feedback_scores): | |
avg_score = np.mean(feedback_scores) | |
return f"Average Engagement Score: {avg_score:.2f}. Action Needed: {'Yes' if avg_score < 3 else 'No'}." | |
def performance_review(self, employee_name, review_score): | |
if employee_name in self.employee_records["Name"].values: | |
self.employee_records.loc[self.employee_records["Name"] == employee_name, "Performance"] = review_score | |
return f"Performance of {employee_name} updated to {review_score}." | |
return f"Employee {employee_name} not found." | |
def get_policy(self): | |
return self.company_policies | |
def exit_interview(self, employee_name, feedback): | |
if employee_name in self.employee_records["Name"].values: | |
self.employee_records = self.employee_records[self.employee_records["Name"] != employee_name] | |
return f"Exit interview recorded for {employee_name}. Feedback: {feedback}" | |
return f"Employee {employee_name} not found." | |
# AI HR Agent Instance | |
ai_hr = AIHRAgent() | |
# Gradio Interface | |
def gradio_interface(): | |
with gr.Blocks() as interface: | |
gr.Markdown("# **Advanced AI HR Agent**") | |
gr.Markdown("This AI automates all HR tasks and provides advanced features such as resume screening and policy management.") | |
with gr.Tab("Recruitment and Onboarding"): | |
with gr.Row(): | |
with gr.Column(): | |
resume_upload = gr.File(label="Upload Resume (PDF/DOCX)") | |
job_description_input = gr.Textbox(label="Job Description") | |
resume_screen_output = gr.Textbox(label="Screening Result") | |
screen_button = gr.Button("Screen Resume") | |
with gr.Column(): | |
onboarding_name = gr.Textbox(label="Employee Name") | |
onboarding_position = gr.Textbox(label="Position") | |
onboarding_output = gr.Textbox(label="Onboarding Guide") | |
onboarding_button = gr.Button("Generate Onboarding Guide") | |
with gr.Tab("Employee Management"): | |
add_name = gr.Textbox(label="Employee Name") | |
add_position = gr.Textbox(label="Position") | |
add_start_date = gr.Textbox(label="Start Date (YYYY-MM-DD)") | |
add_output = gr.Textbox(label="Add Employee Result") | |
add_button = gr.Button("Add Employee") | |
attendance_name = gr.Textbox(label="Employee Name for Attendance") | |
attendance_output = gr.Textbox(label="Attendance Result") | |
attendance_button = gr.Button("Record Attendance") | |
with gr.Tab("Payroll Management"): | |
payroll_name = gr.Textbox(label="Employee Name") | |
payroll_salary = gr.Number(label="Base Salary") | |
payroll_output = gr.Textbox(label="Payroll Result") | |
payroll_button = gr.Button("Process Payroll") | |
with gr.Tab("Exit Management"): | |
exit_name = gr.Textbox(label="Employee Name") | |
exit_feedback = gr.Textbox(label="Exit Feedback") | |
exit_output = gr.Textbox(label="Exit Interview Result") | |
exit_button = gr.Button("Record Exit Interview") | |
# Button Actions | |
screen_button.click( | |
lambda file, job_desc: ai_hr.screen_resume(ai_hr.extract_text_from_file(file), job_desc) if file else "No resume file uploaded.", | |
inputs=[resume_upload, job_description_input], | |
outputs=resume_screen_output, | |
) | |
onboarding_button.click(ai_hr.onboarding_guide, inputs=[onboarding_name, onboarding_position], outputs=onboarding_output) | |
add_button.click(ai_hr.add_employee, inputs=[add_name, add_position, add_start_date], outputs=add_output) | |
attendance_button.click(ai_hr.track_attendance, inputs=attendance_name, outputs=attendance_output) | |
payroll_button.click(ai_hr.process_payroll, inputs=[payroll_name, payroll_salary], outputs=payroll_output) | |
exit_button.click(ai_hr.exit_interview, inputs=[exit_name, exit_feedback], outputs=exit_output) | |
return interface | |
# Launch Interface | |
interface = gradio_interface() | |
interface.launch(share=True) |