import gradio as gr from parser import parse_resume import json def process_input(job_description, resumes): # resumes = [r for r in resumes if r and r.strip() != ""] # Remove empty if not job_description.strip() or not resumes: return "Please provide both job description and at least one resume." print("[CATEGORIES]", resumes) thinking, results = parse_resume(job_description, resumes) print("[THINKING]", thinking) print("[RESULTS]", results) results = json.loads(results) print("[SUCCESS JSON PARSING]") return thinking, results # results = zip(*parse_resume(job_description, resumes)) # formatted_output = "" # for i, (resume, score) in enumerate(results, 1): # formatted_output += f"Resume #{i}:\nScore: {score:.2f}\nResume Snippet: {resume[:200]}...\n\n-------\n\n" # return formatted_output initial_parsing = [ {"name":"education", "type":"List[str]","description":"attended school, university, and other education programs"}, {"name":"experience", "type":"float", "description":"years of experience"}, {"name":"skills", "type":"List[str]", "description":"list of skills"}, {"name":"name", "type":"str", "description":"name of the person"}, {"name":"location", "type":"str", "description":"location of the person"}, {"name":"email", "type":"str", "description":"email of the person"}, {"name":"websites", "type":"List[str]", "description":"urls related of the person"}, {"name":"certifications", "type":"List[str]", "description":"list of certifications"}, {"name":"languages", "type":"List[str]", "description":"list of languages"}, {"name":"projects", "type":"List[str]", "description":"list of projects"}, {"name":"note", "type":"str", "description":"additional note which highlight the best or uniqueness of the person"} ] def update_json(data, name, data_type, desc): # if name in [x["name"] for x in data]: # data.remove(name) data.append( {"name":name, "type":data_type, "description":desc} ) return data def delete_json(data, name): for i,x in enumerate(data): if x["name"] == name: data.pop(i) return data # UI definition with gr.Blocks() as demo: gr.Markdown("## 📝 Resume Ranking System") resumes_list = [] with gr.Row(): resume_count = gr.State(2) with gr.Column(): @gr.render(inputs=resume_count) def render_count(count): name = gr.Textbox( lines=1, placeholder=f"Category name", label=f"Name" ) data_type = gr.Textbox( lines=1, placeholder=f"Category data type", label=f"Data Type" ) desc = gr.Textbox( lines=1, placeholder=f"Category description", label=f"Description" ) update_json_button.click(update_json, inputs=[json_display, name, data_type, desc], outputs=json_display) # resumes_list.append( # {"name":name, "type":data_type, "description":desc} # ) # resumes_list.append(name) # resumes_list.append(data_type) # resumes_list.append(desc) # @gr.render(inputs=input_text) # def add_resume(): # new_input = gr.Textbox( # lines=6, # placeholder=f"Paste resume #{len(resumes_list)+1} here...", # label=f"Resume #{len(resumes_list)+1}" # ) # resumes_list.append(new_input) # return resumes_group.update(visible=True) # add_resume_btn = gr.Button("➕ Add Another Category") # add_resume_btn.click(lambda x: x + 1, resume_count, resume_count) update_json_button = gr.Button("Update Parsing Categories") category_delete = gr.Textbox( lines=1, placeholder=f"Category Name", label=f"Remove Category Based on It's Name" ) delete_json_button = gr.Button("Delete Category") json_display = gr.JSON(value=initial_parsing, label="Parsing Categories", show_label=True) delete_json_button.click(delete_json, inputs=[json_display, category_delete], outputs=json_display) job_description = gr.Textbox( lines=8, placeholder="Paste Resume here...", label="CV / Resume" ) with gr.Column(): # output = gr.Textbox( # lines=10, # label="JSON Result", # interactive=False # ) output = gr.JSON(show_indices=True, label="Parsing Output", show_label=True) thinking_output = gr.Textbox( lines=10, label="Thinking Result", interactive=False ) submit_btn = gr.Button("🚀 Parse Resume / CV") submit_btn.click( fn=process_input, inputs=[job_description, json_display], outputs=[thinking_output, output] ) # add_resume_btn.click(add_resume, outputs=resumes_group) # add_resume_btn.click(lambda x: x + 1, resume_count, resume_count) demo.launch()