Spaces:
Running
Running
| import streamlit as st | |
| import google.generativeai as genai | |
| import pdfplumber | |
| import docx | |
| import tempfile | |
| from dotenv import load_dotenv | |
| import os | |
| load_dotenv() | |
| API_KEY = os.getenv("GOOGLE_API_KEY") | |
| if not API_KEY: | |
| st.error("API Key not found. Please set the GOOGLE_API_KEY in your .env file.") | |
| else: | |
| genai.configure(api_key=API_KEY) | |
| model = genai.GenerativeModel("gemini-1.5-flash") | |
| ui_texts = { | |
| 'en': { | |
| "title": "TalentScout Hiring Assistant", | |
| "sidebar_title": "Candidate Details", | |
| "upload_title": "Upload Resume (PDF/DOCX)", | |
| "greeting": "Welcome to TalentScout! How’s everything going in", | |
| "resume_extracted": "Resume Extracted Successfully!", | |
| "personalized_questions": "Personalized Questions from Resume:", | |
| "interview_questions": "Interview Questions for the Position", | |
| "chat_with": "Chat with TalentScout Assistant", | |
| "exit_message": "Type 'exit' to end the conversation.", | |
| "thank_you": "Thank you for using TalentScout. We wish you the best in your job search!" | |
| }, | |
| 'hi': { | |
| "title": "TalentScout हायरिंग असिस्टेंट", | |
| "sidebar_title": "उम्मीदवार विवरण", | |
| "upload_title": "रिज़्यूमे अपलोड करें (PDF/DOCX)", | |
| "greeting": "TalentScout में आपका स्वागत है! **{location}** में सब कुछ कैसे चल रहा है?", | |
| "resume_extracted": "रिज़्यूमे सफलतापूर्वक निकाला गया!", | |
| "personalized_questions": "रिज़्यूमे से व्यक्तिगत प्रश्न:", | |
| "interview_questions": "पद के लिए साक्षात्कार प्रश्न", | |
| "chat_with": "TalentScout सहायक से चैट करें", | |
| "exit_message": "चर्चा समाप्त करने के लिए 'exit' टाइप करें।", | |
| "thank_you": "TalentScout का उपयोग करने के लिए धन्यवाद। हम आपकी नौकरी खोज में शुभकामनाएं देते हैं!" | |
| }, | |
| 'es': { | |
| "title": "Asistente de Contratación TalentScout", | |
| "sidebar_title": "Detalles del Candidato", | |
| "upload_title": "Subir Currículum (PDF/DOCX)", | |
| "greeting": "¡Bienvenido a TalentScout! ¿Cómo va todo en **{location}**?", | |
| "resume_extracted": "¡Currículum extraído con éxito!", | |
| "personalized_questions": "Preguntas personalizadas del currículum:", | |
| "interview_questions": "Preguntas para la posición", | |
| "chat_with": "Chatea con el Asistente TalentScout", | |
| "exit_message": "Escribe 'exit' para terminar la conversación.", | |
| "thank_you": "¡Gracias por usar TalentScout! Te deseamos lo mejor en tu búsqueda de trabajo." | |
| }, | |
| 'fr': { | |
| "title": "Assistant de recrutement TalentScout", | |
| "sidebar_title": "Détails du candidat", | |
| "upload_title": "Télécharger le CV (PDF/DOCX)", | |
| "greeting": "Bienvenue sur TalentScout! Comment ça va à **{location}**?", | |
| "resume_extracted": "CV extrait avec succès!", | |
| "personalized_questions": "Questions personnalisées à partir du CV :", | |
| "interview_questions": "Questions pour le poste", | |
| "chat_with": "Discutez avec l'assistant TalentScout", | |
| "exit_message": "Tapez 'exit' pour terminer la conversation.", | |
| "thank_you": "Merci d'avoir utilisé TalentScout. Nous vous souhaitons bonne chance dans votre recherche d'emploi." | |
| }, | |
| 'de': { | |
| "title": "TalentScout Einstellungsassistent", | |
| "sidebar_title": "Kandidaten Details", | |
| "upload_title": "Lebenslauf hochladen (PDF/DOCX)", | |
| "greeting": "Willkommen bei TalentScout! Wie läuft es in **{location}**?", | |
| "resume_extracted": "Lebenslauf erfolgreich extrahiert!", | |
| "personalized_questions": "Personalisierte Fragen aus dem Lebenslauf:", | |
| "interview_questions": "Fragen für die Position", | |
| "chat_with": "Chatten Sie mit dem TalentScout Assistenten", | |
| "exit_message": "Geben Sie 'exit' ein, um das Gespräch zu beenden.", | |
| "thank_you": "Danke, dass Sie TalentScout verwenden. Wir wünschen Ihnen viel Erfolg bei Ihrer Jobsuche." | |
| } | |
| } | |
| selected_language = st.sidebar.selectbox("Select Language", options=["English", "Hindi", "Spanish", "French", "German"]) | |
| language_map = {"English": "en", "Hindi": "hi", "Spanish": "es", "French": "fr", "German": "de"} | |
| selected_language_code = language_map[selected_language] | |
| if 'selected_language_code' not in st.session_state: | |
| st.session_state.selected_language_code = selected_language_code | |
| elif st.session_state.selected_language_code != selected_language_code: | |
| st.session_state.selected_language_code = selected_language_code | |
| st.session_state.greeted = False | |
| if 'chat_history' not in st.session_state: | |
| st.session_state.chat_history = {} | |
| if 'name' in st.session_state: | |
| name = st.session_state.name | |
| if name not in st.session_state.chat_history: | |
| st.session_state.chat_history[name] = [] | |
| st.title(ui_texts[st.session_state.selected_language_code]["title"]) | |
| st.sidebar.title(ui_texts[st.session_state.selected_language_code]["sidebar_title"]) | |
| st.sidebar.subheader(ui_texts[st.session_state.selected_language_code]["upload_title"]) | |
| uploaded_file = st.sidebar.file_uploader("Choose your resume", type=['pdf', 'docx']) | |
| def extract_resume_text(uploaded_file): | |
| text = "" | |
| if uploaded_file is not None: | |
| with tempfile.NamedTemporaryFile(delete=False) as temp_file: | |
| temp_file.write(uploaded_file.read()) | |
| temp_path = temp_file.name | |
| if uploaded_file.name.endswith(".pdf"): | |
| with pdfplumber.open(temp_path) as pdf: | |
| for page in pdf.pages: | |
| text += page.extract_text() or "" | |
| elif uploaded_file.name.endswith(".docx"): | |
| doc = docx.Document(temp_path) | |
| for para in doc.paragraphs: | |
| text += para.text + "\n" | |
| return text.strip() | |
| resume_text = extract_resume_text(uploaded_file) | |
| with st.sidebar.form("candidate_form"): | |
| name = st.text_input("Full Name") | |
| email = st.text_input("Email Address") | |
| phone = st.text_input("Phone Number") | |
| experience = st.number_input("Years of Experience", min_value=0, max_value=50) | |
| position = st.text_input("Desired Position(s)") | |
| location = st.text_input("Current Location") | |
| qualification = st.selectbox("Highest Qualification", ["Select", "Diploma", "Bachelor's Degree", "Master's Degree", "PhD"]) | |
| college_name = st.text_input("College/University Name") | |
| tech_stack = st.text_area("Tech Stack (e.g., Python, Django, MySQL)") | |
| submit = st.form_submit_button("Submit") | |
| def generate_response_in_language(prompt, language_code): | |
| language_name = { | |
| 'en': 'English', | |
| 'hi': 'Hindi', | |
| 'es': 'Spanish', | |
| 'fr': 'French', | |
| 'de': 'German' | |
| }.get(language_code, 'English') | |
| language_instruction = f"Please provide your response in {language_name}." | |
| return model.generate_content(language_instruction + " " + prompt).text | |
| if submit and not st.session_state.get("greeted", False): | |
| st.session_state.greeted = True | |
| st.write(f"**{name}! 👋**") | |
| st.write(f"{ui_texts[st.session_state.selected_language_code]['greeting']} **{location}**?") | |
| st.write(f"Your **{qualification}** from **{college_name}** sounds impressive! Let's get started. 😊") | |
| if resume_text: | |
| st.write(f"📄 **{ui_texts[st.session_state.selected_language_code]['resume_extracted']}**") | |
| st.write(resume_text[:300] + "...") | |
| else: | |
| st.write("No resume uploaded or extracted. Proceeding with available details.") | |
| tech_stack_list = [tech.strip() for tech in tech_stack.split(',')] | |
| for tech in tech_stack_list: | |
| tech_prompt = f"Based on the candidate's experience and skills in {tech}, generate 3-5 technical questions." | |
| response_tech = generate_response_in_language(tech_prompt, st.session_state.selected_language_code) | |
| st.write(f"### Questions related to {tech}:") | |
| st.write(response_tech) | |
| if resume_text: | |
| resume_prompt = f"Based on the resume of {name}, generate personalized questions that probe into the candidate's experience with projects, skills, and work history. Resume content: {resume_text}" | |
| response_resume = generate_response_in_language(resume_prompt, st.session_state.selected_language_code) | |
| st.write(f"### {ui_texts[st.session_state.selected_language_code]['personalized_questions']}") | |
| st.write(response_resume) | |
| if position: | |
| role_prompt = f"Based on the position {position} that the candidate, {name}, is applying for, generate 5-7 interview questions." | |
| response_role = generate_response_in_language(role_prompt, st.session_state.selected_language_code) | |
| st.write(f"### {ui_texts[st.session_state.selected_language_code]['interview_questions']} {position}") | |
| st.write(response_role) | |
| st.subheader(ui_texts[st.session_state.selected_language_code]["chat_with"]) | |
| chat_input = st.text_input("Your Message") | |
| if chat_input: | |
| sensitive_keywords = ["salary", "compensation", "benefits", "holiday", "leave", "pay", "bonus"] | |
| if any(word in chat_input.lower() for word in sensitive_keywords): | |
| response = f"I appreciate you bringing that up, {name}! 😊 However, compensation and related details are typically discussed after an offer is extended. If you’d like more insights, feel free to connect with HR directly." | |
| else: | |
| prompt = f"You are a helpful recruitment assistant. Respond to the following user input: {chat_input}. Use candidate details like name ({name}), location ({location}), qualification ({qualification}), and college ({college_name}) naturally during the response." | |
| response = generate_response_in_language(prompt, st.session_state.selected_language_code) | |
| if name not in st.session_state.chat_history: | |
| st.session_state.chat_history[name] = [] | |
| st.session_state.chat_history[name].append(chat_input) | |
| st.session_state.chat_history[name].append(response) | |
| for message in reversed(st.session_state.chat_history[name]): | |
| st.write(f"You: {message}") | |
| st.write("---") | |
| st.write(ui_texts[st.session_state.selected_language_code]["exit_message"]) | |
| if chat_input.lower() == "exit": | |
| st.write(f"Dhanyavaad {name}! 🙏 {ui_texts[st.session_state.selected_language_code]['thank_you']}") | |
| st.stop() | |