Spaces:
Sleeping
Sleeping
File size: 4,970 Bytes
866e5bd 1fa05f6 bbd1ea1 1fa05f6 866e5bd 1fa05f6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
import streamlit as st
from resume_parsing import parse_resume_with_llm
from database_integration import save_candidate, save_job, delete_candidate, delete_job, session, Candidate, Job
from chroma_utils import add_to_job_chroma, get_all_jobs_from_chroma, delete_resume_from_chroma, delete_job_from_chroma
from embedding_utils import generate_embedding
from job_matching import calculate_ats_score
import pandas as pd
import numpy as np
import os
os.environ["HF_HOME"] = "/tmp/huggingface"
os.environ["TRANSFORMERS_CACHE"] = "/tmp/huggingface"
os.environ["SENTENCE_TRANSFORMERS_HOME"] = "/tmp/huggingface"
os.environ["STREAMLIT_SERVER_FILE_WATCHER_TYPE"] = "none"
st.set_page_config(page_title="ATS System", layout="wide")
st.title("📄 ATS System Dashboard")
tabs = st.tabs(["Upload Resume", "Post Job", "Match Candidates", "Delete Resume/Job"])
# ---------------- Upload Resume ---------------- #
with tabs[0]:
st.header("Upload Candidate Resume")
name = st.text_input("Candidate Name")
location = st.text_input("Location")
uploaded_file = st.file_uploader("Upload PDF/DOCX Resume", type=["pdf", "docx"])
if st.button("Submit Resume"):
if not uploaded_file:
st.error("Please upload a resume file.")
elif not name or not location:
st.error("Please provide both name and location.")
else:
file_type = uploaded_file.name.split(".")[-1]
resume_content = uploaded_file.read()
result, embedding = parse_resume_with_llm(resume_content, name, location, file_type)
if "error" in result:
st.error(result["error"])
else:
save_candidate({
"name": name,
"location": location,
"experience": result.get("experience"),
"education": result.get("education"),
"skills": result.get("skills")
}, result["unique_id"])
st.success(f"Resume uploaded successfully! Candidate ID: {result['unique_id']}")
# ---------------- Post Job ---------------- #
with tabs[1]:
st.header("Post a New Job")
job_title = st.text_input("Job Title", key="job_title")
job_description = st.text_area("Job Description", key="job_description")
if st.button("Post Job"):
if not job_title or not job_description:
st.error("Both job title and description are required.")
else:
job_embedding = generate_embedding(job_description)
metadata = {"title": job_title, "description": job_description}
unique_id = add_to_job_chroma(job_embedding, metadata)
save_job(job_title, job_description, unique_id)
st.success(f"Job posted successfully! Job ID: {unique_id}")
# ---------------- Match Candidates ---------------- #
with tabs[2]:
st.header("Match Candidates for All Jobs")
if st.button("Run Matching"):
job_ids, job_embeddings, job_metadatas = get_all_jobs_from_chroma()
if not job_ids:
st.warning("No jobs found in database.")
else:
all_results = []
for i, job_embedding in enumerate(job_embeddings):
job_embedding = np.array(job_embedding)
matched_candidates = calculate_ats_score(job_embedding)
for candidate in matched_candidates:
all_results.append({
"Job ID": job_ids[i],
"Job Title": job_metadatas[i].get("title"),
"Candidate ID": candidate["candidate_id"],
"Candidate Name": candidate["metadata"]["name"],
"Score": round(candidate["score"], 3)
})
if all_results:
df = pd.DataFrame(all_results)
st.dataframe(df)
else:
st.info("No candidates matched any jobs yet.")
# ---------------- Delete Resume/Job ---------------- #
with tabs[3]:
st.header("Delete Resume or Job")
delete_option = st.radio("Select Type to Delete", ["Resume", "Job"])
unique_id = st.text_input("Enter Unique ID to Delete")
if st.button("Delete"):
if not unique_id:
st.error("Please provide a unique ID.")
else:
if delete_option == "Resume":
delete_resume_from_chroma(unique_id)
success = delete_candidate(unique_id)
if success:
st.success(f"Resume {unique_id} deleted successfully!")
else:
st.warning("Resume not found.")
elif delete_option == "Job":
delete_job_from_chroma(unique_id)
success = delete_job(unique_id)
if success:
st.success(f"Job {unique_id} deleted successfully!")
else:
st.warning("Job not found.") |