import streamlit as st 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 ) from config import supabase from config import HF_API_TOKEN, HF_HEADERS, HF_MODELS import fitz # PyMuPDF from io import BytesIO from dotenv import load_dotenv import os import requests def main(): st.set_page_config(page_title="TalentLens.AI", layout="centered") st.markdown("

TalentLens.AI

", unsafe_allow_html=True) st.divider() st.markdown("

AI-Powered Intelligent Resume Screening

", unsafe_allow_html=True) # Limit resume uploads to 10 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 job_description = st.text_area("Enter Job Description") 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 #if uploaded_files and job_description: st.write("### 📊 Evaluating Resumes...") # 🔹 Extract required keywords dynamically from the job description # required_keywords = extract_keywords(job_description) # st.write(f"**Extracted Keywords:** {', '.join(required_keywords)}") 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 PDF Report pdf_report = generate_pdf_report(shortlisted) st.download_button("Download Shortlist Report", pdf_report, "shortlist.pdf") # 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{idx}.** {q}") # 🔻 Display removed candidates due to missing keywords if removed_candidates: st.subheader("❌ Resumes Removed:") for removed in removed_candidates: st.write(f"**{removed['name']}** - {removed['reason']}") if __name__ == "__main__": main()