Spaces:
Running
Running
File size: 3,908 Bytes
c2f9ec8 2854e2c 56325dc 19ea0c5 2854e2c 56325dc 2854e2c c2f9ec8 2854e2c 56325dc 102e49d 8f8f414 edfcf73 8f8f414 2854e2c 0c91845 8f8f414 2854e2c 8f8f414 102e49d 8f8f414 2854e2c 8f8f414 2854e2c 8f8f414 2854e2c 8f8f414 949011b 2854e2c 8f8f414 2854e2c 8f8f414 56325dc 2854e2c 56325dc |
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 |
# TalentLens
import os
from io import BytesIO
import streamlit as st
import fitz # PyMuPDF
import requests
from dotenv import load_dotenv
from config import supabase, HF_API_TOKEN, HF_HEADERS, HF_MODELS
from utils.parser import parse_resume, extract_email, summarize_resume
from utils.hybrid_extractor import extract_resume_sections
from utils.builder import build_resume_from_data
from utils.screening import evaluate_resumes
from utils.reporting import generate_pdf_report, generate_interview_questions_from_summaries
# ------------------------- Main App Function -------------------------
def main():
st.set_page_config(
page_title="TalentLens.AI",
layout="centered",
initial_sidebar_state="collapsed"
)
# Hide sidebar completely with CSS
st.markdown("""
<style>
.css-1d391kg {display: none}
.css-1rs6os {display: none}
.css-17ziqus {display: none}
[data-testid="stSidebar"] {display: none}
[data-testid="collapsedControl"] {display: none}
.css-1lcbmhc {display: none}
.css-1outpf7 {display: none}
.sidebar .sidebar-content {display: none}
</style>
""", unsafe_allow_html=True)
st.markdown("<h1 style='text-align: center;'>TalentLens.AI</h1>", unsafe_allow_html=True)
st.divider()
st.markdown("<h3 style='text-align: center;'>AI-Powered Intelligent Resume Screening</h3>", unsafe_allow_html=True)
# Upload resumes (limit: 10 files)
uploaded_files = st.file_uploader(
"Upload Resumes (PDF Only, Max: 10)",
accept_multiple_files=True,
type=["pdf"]
)
if uploaded_files and len(uploaded_files) > 10:
st.error("β οΈ You can upload a maximum of 10 resumes at a time.")
return
# Input job description
job_description = st.text_area("Enter Job Description")
# Main action buttons
col1, col2 = st.columns(2)
with col1:
# Evaluation trigger
evaluate_clicked = st.button("π Evaluate Resumes", type="primary", use_container_width=True)
with col2:
# Format Resume redirect button
format_clicked = st.button("π Format Resume", use_container_width=True)
# Handle Format Resume redirect
if format_clicked:
st.switch_page("pages/Template.py")
# Handle Evaluate Resumes
if evaluate_clicked:
if not job_description:
st.error("β οΈ Please enter a job description.")
return
if not uploaded_files:
st.error("β οΈ Please upload at least one resume.")
return
st.write("### π Evaluating Resumes...")
# Resume Evaluation
shortlisted, removed_candidates = evaluate_resumes(uploaded_files, job_description)
if not shortlisted:
st.warning("β οΈ No resumes matched the required keywords.")
else:
st.subheader("β
Shortlisted Candidates:")
for candidate in shortlisted:
st.write(f"**{candidate['name']}**")
# Generate Interview Questions
questions = generate_interview_questions_from_summaries(shortlisted)
st.subheader("π§ Suggested Interview Questions:")
for idx, q in enumerate(questions, 1):
st.markdown(f"{q}")
# Downloadable PDF Report
pdf_report = generate_pdf_report(shortlisted, questions)
st.download_button("Download Shortlist Report", pdf_report, "shortlist.pdf")
# Removed Candidates Info
if removed_candidates:
st.subheader("β Resumes Removed:")
for removed in removed_candidates:
st.write(f"**{removed['name']}** - {removed['reason']}")
# ------------------------- Run the App -------------------------
if __name__ == "__main__":
main() |