Spaces:
Runtime error
Runtime error
| 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() |