| import streamlit as st |
| from referentials import REFERENTIALS |
| from PyPDF2 import PdfReader |
| from pocketgroq import GroqProvider |
|
|
| |
| def get_groq_provider(): |
| if "api_key" not in st.session_state or not st.session_state.api_key: |
| st.error("Veuillez entrer votre clé API Groq.") |
| return None |
| return GroqProvider(api_key=st.session_state.api_key) |
|
|
| |
| def extract_text_from_pdf(file): |
| try: |
| reader = PdfReader(file) |
| text = " ".join(page.extract_text() for page in reader.pages if page.extract_text()) |
| return text |
| except Exception as e: |
| st.error(f"Erreur lors de l'extraction du texte : {str(e)}") |
| return None |
|
|
| |
| def analyze_cv_with_groq(cv_text, referential): |
| groq = get_groq_provider() |
| if not groq: |
| return "Erreur : clé API non fournie." |
|
|
| referential_data = REFERENTIALS.get(referential, {}) |
| general_requirements = referential_data.get("General_Requirements", {}) |
| qualifications = referential_data.get("Qualifications", {}) |
| audit_experience = referential_data.get("Audit_Experience", {}) |
| advanced_requirements = referential_data.get("Advanced_Requirements", {}) |
|
|
| prompt = f""" |
| Vous êtes un expert en évaluation des compétences selon les référentiels GFSI ({referential}). |
| Analysez ce CV, sans citer le nom du candidat (toujours faire référence en le nommant : le candidat), pour vérifier sa conformité avec les exigences suivantes : |
| Général : |
| {general_requirements} |
| Qualifications : |
| {qualifications} |
| Expérience en audit : |
| {audit_experience} |
| Exigences avancées : |
| {advanced_requirements} |
| Contenu du CV : |
| {cv_text} |
| Fournissez une analyse détaillée rédigée en langue française , de manière prefessionnelle et complète, en identifiant : |
| 1. Les exigences remplies. |
| 2. Les lacunes ou non-conformités. |
| 3. Des recommandations pour combler les lacunes par rapports aux exigences strictes du référentiel. |
| Il faut rester au plus proche des exigences des référentiels , ne pas ajouter des exigences, toujours faire une vérification |
| sur la base de la chain of thoughts avec un réévaluation a chaque fois pour confirmer qu'il s'agit bien d'exigences demandés par le referentiel choisi dans REFERENTIALS.keys |
| il ne faut evaluer le cv que sur le referentiel choisi , il ne faut pas mélanger les référentiels |
| """ |
| try: |
| return groq.generate(prompt, max_tokens=1000, temperature=0.2, use_cot=True) |
| except Exception as e: |
| st.error(f"Erreur lors de l'analyse du CV : {str(e)}") |
| return None |
|
|
| |
| def generate_conclusion(analysis): |
| if "non-conformité" in analysis: |
| return "Le candidat répond partiellement aux exigences du référentiel sélectionné. Des améliorations spécifiques sont recommandées." |
| else: |
| return "Le candidat satisfait pleinement aux exigences du référentiel sélectionné." |
|
|
| |
| def main(): |
| st.title("Analyse de CV selon les référentiels GFSI") |
| st.markdown(""" |
| <div style="background-color:#f9f9f9;padding:10px;border-radius:5px;"> |
| <h3>Bienvenue sur l'outil d'analyse de CV GFSI</h3> |
| <p>Utilisez cet outil pour évaluer un CV selon les référentiels tels que BRCGS, FSSC 22000, et IFS.</p> |
| <ol> |
| <li>Entrez votre clé API Groq.</li> |
| <li>Téléchargez un CV au format PDF.</li> |
| <li>Sélectionnez un référentiel pour l'analyse.</li> |
| </ol> |
| </div> |
| """, unsafe_allow_html=True) |
|
|
| api_key = st.text_input("Entrez votre clé API Groq :", type="password") |
| if api_key: |
| st.session_state.api_key = api_key |
|
|
| uploaded_file = st.file_uploader("Téléchargez un fichier PDF (CV)", type="pdf") |
| referential = st.selectbox("Sélectionnez un référentiel", list(REFERENTIALS.keys())) |
|
|
| if uploaded_file and referential: |
| cv_text = extract_text_from_pdf(uploaded_file) |
| if cv_text: |
| st.markdown("### Résultat de l'analyse") |
| analysis = analyze_cv_with_groq(cv_text, referential) |
| if analysis: |
| st.markdown(f"<div style='font-size:16px;line-height:1.6;'>{analysis}</div>", unsafe_allow_html=True) |
| conclusion = generate_conclusion(analysis) |
| st.markdown(f""" |
| <div style="background-color:#dff0d8;padding:10px;border-radius:5px;margin-top:20px;"> |
| <strong>Conclusion :</strong> {conclusion} |
| </div> |
| """, unsafe_allow_html=True) |
| else: |
| st.error("Impossible d'extraire le texte du CV. Vérifiez que le fichier PDF est lisible.") |
|
|
| if __name__ == "__main__": |
| main() |
|
|
|
|