import streamlit as st import os #from dotenv import load_dotenv import google.generativeai as genai from PyPDF2 import PdfReader from docx import Document # Chargement des variables d'environnement #load_dotenv() #API_KEY = os.getenv("API_KEY") #prise en charge par hugging face API_KEY = os.environ.get("API_KEY") # Récupère la clé depuis les paramètres du Space # Configuration de l'API Gemini genai.configure(api_key=API_KEY) def extract_text_from_pdf(pdf_file): reader = PdfReader(pdf_file) text = "" for page in reader.pages: text += page.extract_text() return text def extract_text_from_docx(docx_file): doc = Document(docx_file) text = "" for para in doc.paragraphs: text += para.text + "\n" return text def analyze_documents(resume_text, job_description): custom_prompt = f""" Analysez le CV suivant en fonction de la description de poste fournie. Vérifiez rigoureusement chaque ligne de la description de poste et évaluez la correspondance exacte avec le CV. Respectez strictement les normes ATS et attribuez des scores uniquement aux éléments corrects. Identifiez : 1. Le pourcentage de correspondance entre le CV et la description de poste 2. Une liste précise des mots-clés manquants 3. Une synthèse finale de l'adéquation globale en 3 points 4. Des recommandations concrètes pour améliorer le CV avec des exemples Présentez les résultats dans l'ordre ci-dessus sans numérotation. Conservez strictement ce format à chaque analyse. Ne modifiez surtout pas la structure du modèle. Titre obligatoire : Analyse de CV ATS Description de poste : {job_description} CV : {resume_text} """ model = genai.GenerativeModel('gemini-1.5-flash') response = model.generate_content(custom_prompt) return response.text def rephrase_text(text): custom_prompt = f""" Reformulez le texte suivant selon les normes ATS en ajoutant des mesures quantifiables et des améliorations concrètes : Titre obligatoire : Texte reformulé Texte original : {text} """ model = genai.GenerativeModel('gemini-1.5-flash') response = model.generate_content(custom_prompt) return response.text def display_resume(file): file_type = file.name.split('.')[-1].lower() if file_type == 'pdf': reader = PdfReader(file) text = "" for page in reader.pages: text += page.extract_text() st.text_area("Contenu du CV analysé", text, height=400) elif file_type == 'docx': doc = Document(file) text = "" for para in doc.paragraphs: text += para.text + "\n" st.text_area("Contenu du CV analysé", text, height=400) else: st.error("Format de fichier non supporté. Veuillez uploader un PDF ou DOCX.") st.set_page_config(page_title="Système d'Évaluation ATS", layout="wide") st.sidebar.title("Navigation") page = st.sidebar.radio("Aller à", ["Analyseur de CV", "Réécriture ATS", "Modèles ATS"]) if page == "Analyseur de CV": st.title("📄🔍 Système d'Évaluation ATS") st.write("Bonjour et bienvenu cette page, je m'appelle Kalilou I Sangare professionnel MEAL et débutant en Data Science. Cette page est juste une moyen gratuit de vous aider à analyser votre CV avec le Système ATS AI par rapport à une description de poste pour optimiser votre candidature.") job_description = st.text_area("Description de poste :") resume = st.file_uploader("Uploader votre CV (PDF ou DOCX)", type=["pdf", "docx"]) if resume: st.write("CV uploadé :") display_resume(resume) if st.button("Analyser la correspondance"): if job_description and resume: with st.spinner("Analyse en cours..."): resume.seek(0) file_type = resume.name.split('.')[-1].lower() if file_type == 'pdf': resume_text = extract_text_from_pdf(resume) elif file_type == 'docx': resume_text = extract_text_from_docx(resume) analysis = analyze_documents(resume_text, job_description) st.markdown(analysis) if "pourcentage de correspondance" in analysis.lower(): match_line = [line for line in analysis.split('\n') if "pourcentage de correspondance" in line.lower()][0] match_percentage = ''.join(filter(str.isdigit, match_line)) if match_percentage: st.write(f"Correspondance avec le poste : {match_percentage}%") st.progress(int(match_percentage)) st.success("Analyse terminée !") else: st.error("Veuillez saisir la description de poste et uploader un CV.") elif page == "Réécriture ATS": st.title("🔮 Réécriture ATS") st.write("Optimisez vos phrases pour passer les filtres ATS avec des formulations quantifiables.") text_to_rephrase = st.text_area("Texte à reformuler :") if st.button("Générer la réécriture"): if text_to_rephrase: with st.spinner("Réécriture en cours..."): rephrased_text = rephrase_text(text_to_rephrase) st.write(rephrased_text) st.success("Réécriture terminée !") else: st.error("Veuillez saisir le texte à reformuler.") elif page == "Modèles ATS": st.title("📄📝 Modèles ATS Gratuits") st.write("Téléchargez des modèles de CV optimisés pour les systèmes ATS :") templates = { "Modèle 1": "https://docs.google.com/document/d/1NWFIz-EZ1ZztZSdXfrrcdffSzG-uermd/edit", "Modèle 2": "https://docs.google.com/document/d/1xO7hvK-RQSb0mjXRn24ri3AiDrXx6qt8/edit", "Modèle 3": "https://docs.google.com/document/d/1fAukvT0lWXns3VexbZjwXyCAZGw2YptO/edit", "Modèle 4": "https://docs.google.com/document/d/1htdoqTPDnG-T0OpTtj8wUOIfX9PfvqhS/edit", "Modèle 5": "https://docs.google.com/document/d/1uTINCs71c4lL1Gcb8DQlyFYVqzOPidoS/edit", "Modèle 6": "https://docs.google.com/document/d/1KO9OuhY7l6dn2c5xynpCOIgbx5LWsfb0/edit" } cols = st.columns(3) for index, (template_name, template_link) in enumerate(templates.items()): col = cols[index % 3] col.markdown(f"""

{template_name}
""", unsafe_allow_html=True)