import gradio as gr import fitz # PyMuPDF import pandas as pd import requests from io import BytesIO from models import evaluate_with_gpt, evaluate_with_gemma, evaluate_with_bloom, evaluate_with_jabir def extract_text_from_pdf(pdf_file): """Extract text from PDF file.""" doc = fitz.open(pdf_file) text = "" for page in doc: text += page.get_text() return text def evaluate_with_jabir(resume_text, job_description): prompt = f"""بر اساس این معیار های اندازه گیری که در زیر عنوان شده: وضعیت خدمت سربازی ، سن، محل سکونت، محدوده حقوق پرداختی ، میزان سابقه کار مدیریتی، میزان سابقه کار مرتبط با گروه شغلی مشابه ، میزان سابقه کار در صنعت، میزان تحصیلات، مهارت زبان، مهارت های نرم افزاری بیا درصد تطابق رزومه فرد با شرح شغلی را محاسبه کن و برای هر معیار اندازه گیری درصد تطابق را محاسبه کن و نهایتا یک درصد کلی برای تطابق رزومه فرد با شرح شغلی بده میخوام خیلی دقیق محاسبه کنی و این درصد ها را در خروجی به صورت جیسون برگردان روی مهارت ها بیشتر دقت کن و تک به تک برسی کن شرح شغل: {job_description} رزومه: {resume_text}""" base_url = "https://api.jabirproject.org/generate" headers = {"apikey": "7471142a-deb4-4a70-8ee3-6603e21bcc1d"} data = { "messages": [{"role": "user", "content": prompt}] } response = requests.post(base_url, headers=headers, json=data) if response.ok: return response.json() else: return f"Error: {response.status_code}, {response.text}" def evaluate_resume(resume_text, job_description, model): """Evaluates the resume text using the specified model.""" if model == "GPT-4o": return evaluate_with_gpt(resume_text, job_description) elif model == "Gemma": return evaluate_with_gemma(resume_text, job_description) elif model == "Bloom": return evaluate_with_bloom(resume_text, job_description) elif model == "jabir": return evaluate_with_jabir(resume_text, job_description) elif model == "llama": return evaluate_with_llama(resume_text, job_description) else: # If "All" is selected, evaluate with all models and return combined results. return evaluate_all_models(resume_text, job_description) def create_excel_output(results, job_description_features): """Creates an Excel file from the results.""" # Create a DataFrame from the results df = pd.DataFrame(results) # Insert job description features in the second row job_desc_row = pd.Series(job_description_features) df.loc[-1] = job_desc_row # adding a row df.index = df.index + 1 # shifting index df = df.sort_index() # sorting by index to place it at the second row # Save to Excel output = BytesIO() with pd.ExcelWriter(output, engine='xlsxwriter') as writer: df.to_excel(writer, index=False) output.seek(0) return output def evaluate_multiple_resumes(resume_files, job_description, model): """Evaluates multiple resumes and returns the results.""" results = [] job_description_features = { "وضعیت خدمت سربازی": "", "سن": "", "محل سکونت": "", "محدوده حقوق پرداختی": "", "میزان سابقه کار مدیریتی": "", "میزان سابقه کار مرتبط با گروه شغلی مشابه": "", "میزان سابقه کار در صنعت": "", "میزان تحصیلات": "", "مهارت زبان": "", "مهارت های نرم افزاری": "" } for resume_file in resume_files: title = resume_file.name resume_text = extract_text_from_pdf(resume_file) result = evaluate_resume(resume_text, job_description, model) # Adding the title of the resume and the total match percentage resume_data = { "رزومه": title, "درصد تطابق کلی": result.get("overall_match_percentage", 0) } # Adding each feature match to the resume data for feature, match in result.get("feature_matches", {}).items(): resume_data[feature] = match # Adding skills as a list in one column resume_data["مهارت ها"] = ", ".join(result.get("skills", [])) results.append(resume_data) # Create Excel output output = create_excel_output(results, job_description_features) return output iface = gr.Interface( fn=evaluate_multiple_resumes, inputs=[ gr.File(type="file", label="Upload Resumes PDF", file_count="multiple"), gr.Textbox(lines=10, label="Job Description"), gr.Radio(choices=["GPT-4o", "Gemma", "Bloom", "jabir", "llama", "All"], label="Choose Model") ], outputs=gr.File(label="Download Excel File"), title="Multiple Resume Evaluator" ) iface.launch()