Spaces:
Running
Running
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 import ( | |
evaluate_resumes, | |
generate_pdf_report, | |
store_in_supabase, | |
extract_email, | |
score_candidate, | |
parse_resume, | |
summarize_resume, | |
extract_keywords, | |
generate_interview_questions_from_summaries, | |
) | |
# ------------------------- Main App Function ------------------------- | |
def main(): | |
st.set_page_config(page_title="TalentLens.AI", layout="centered") | |
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") | |
# Evaluation trigger | |
if st.button("Evaluate Resumes"): | |
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() |