File size: 7,217 Bytes
8fc96bc
 
 
 
771fc4c
8fc96bc
8250adb
 
 
8fc96bc
 
771fc4c
 
 
 
8fc96bc
 
 
 
 
 
 
 
771fc4c
 
 
 
8fc96bc
 
 
 
 
 
 
 
 
e207d1b
771fc4c
 
 
 
8fc96bc
 
 
 
 
 
 
 
b1934e1
8fc96bc
 
 
 
 
 
 
 
 
 
b1934e1
 
8fc96bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
771fc4c
 
 
 
 
8fc96bc
 
 
 
 
 
771fc4c
 
 
 
8250adb
 
8fc96bc
8250adb
 
 
 
 
 
 
 
 
 
8fc96bc
 
 
 
 
 
 
 
 
 
 
 
 
771fc4c
 
 
 
 
8fc96bc
771fc4c
 
 
 
 
 
 
8250adb
771fc4c
 
8250adb
 
 
0c9112c
8250adb
 
 
 
 
 
 
771fc4c
8250adb
 
 
 
 
 
 
 
8fc96bc
771fc4c
8fc96bc
771fc4c
8fc96bc
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
import streamlit as st
from PyPDF2 import PdfReader
import pandas as pd
from groq import Groq  # Assurez-vous que la bibliothèque `groq` est installée correctement
from referentials import REFERENTIALS  # Importation des référentiels

# Configurer la page en mode large avec un titre et une icône
st.set_page_config(layout="wide", page_title="Analyse de CV - GFSI (Version 25.11)", page_icon="📄")

# Fonction pour configurer le client Groq
def get_groq_client(api_key):
    """
    Initialise et renvoie un client Groq avec la clé API.
    Vérifie que la clé API est valide avant de renvoyer le client.
    """
    try:
        return Groq(api_key=api_key)
    except Exception as e:
        st.error(f"Erreur lors de la configuration du client Groq : {str(e)}")
        return None

# Extraction de texte depuis un PDF
def extract_text_from_pdf(file):
    """
    Extrait le texte d'un fichier PDF.
    Renvoie le contenu texte extrait ou signale une erreur.
    """
    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

# Analyse du CV avec l'API Groq et référentiel
def analyze_cv_with_groq(cv_text, referential, groq_client, model="llama-3.3-70b-versatile"):
    """
    Analyse le texte d'un CV par rapport aux exigences d'un référentiel GFSI.
    Utilise l'API Groq pour générer une analyse détaillée.
    """
    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 demanière approfondie, 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}
    Pour chacun des points précédents veiller à bien étudier les expériences et formation réalisées par le candidat car il se peut que les mentions de formations 
    ne soient pas rédigées de manière exacte comme écrites dans ({referential}), évaluer chaque formation du candidat 2 fois.
    Fournissez une analyse détaillée rédigée en langue française, de manière professionnelle et complète, en identifiant :
    1. Les exigences remplies.
    2. Les lacunes ou non-conformités.
    3. Des recommandations pour combler les lacunes par rapport aux exigences strictes du référentiel.
    """
    
    try:
        messages = [
            {"role": "system", "content": "Vous êtes un assistant spécialisé dans l'analyse de conformité selon des référentiels GFSI."},
            {"role": "user", "content": prompt}
        ]
        response = groq_client.chat.completions.create(
            messages=messages,
            model=model,
            max_tokens=1000,
            temperature=0.2
        )
        return response.choices[0].message.content
    except Exception as e:
        st.error(f"Erreur lors de l'analyse du CV : {str(e)}")
        return None

# Génération d'une conclusion
def generate_conclusion(analysis):
    """
    Génère une conclusion basée sur l'analyse du CV.
    Vérifie la présence de "non-conformité" dans le texte pour déterminer si des lacunes existent.
    """
    if "non-conformité" in analysis.lower():
        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é."

# Interface utilisateur principale
def main():
    """
    Interface principale Streamlit pour l'analyse des CV selon les référentiels GFSI.
    Permet à l'utilisateur de fournir une clé API, de télécharger un CV, et de sélectionner un référentiel.
    """
    st.title("Analyse de CV selon les Référentiels GFSI (Version 25.11)")

    st.markdown("""
    <div style="background-color:#f0f0f0;padding:10px;border-radius:10px;">
        <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>
        <ul>
            <li><strong>Étape 1 :</strong> Entrez votre clé API Groq.</li>
            <li><strong>Étape 2 :</strong> Téléchargez un CV au format PDF.</li>
            <li><strong>Étape 3 :</strong> Sélectionnez un référentiel pour effectuer l'analyse.</li>
        </ul>
    </div>
    """, unsafe_allow_html=True)

    # Saisie de la clé API par l'utilisateur
    api_key = st.text_input("Entrez votre clé API Groq :", type="password")
    if not api_key:
        st.warning("Veuillez entrer votre clé API pour continuer.")
        return

    groq_client = get_groq_client(api_key)
    if not groq_client:
        return

    # Chargement du fichier PDF
    uploaded_file = st.file_uploader("Téléchargez un fichier PDF (CV)", type="pdf")
    if not uploaded_file:
        st.info("Veuillez télécharger un fichier PDF pour continuer.")
        return

    # Sélection du référentiel
    referential = st.selectbox("Sélectionnez un référentiel", list(REFERENTIALS.keys()))
    if not referential:
        st.warning("Veuillez sélectionner un référentiel pour continuer.")
        return

    # Extraction et analyse du texte du CV
    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, groq_client)
        if analysis:
            # Affichage des résultats avec une police plus grande
            st.markdown(
                f"""
                <div style='font-size:22px;line-height:1.8;margin-top:20px;'>
                    {analysis}
                </div>
                """,
                unsafe_allow_html=True
            )

            # Affichage de la conclusion avec une police encore plus grande
            conclusion = generate_conclusion(analysis)
            st.markdown(
                f"""
                <div style="background-color:#dff0d8;padding:20px;border-radius:10px;margin-top:30px;font-size:22px;line-height:1.8;">
                    <strong>Conclusion :</strong> {conclusion}
                </div>
                """,
                unsafe_allow_html=True
            )
        else:
            st.error("Une erreur est survenue lors de l'analyse du CV. Veuillez réessayer.")
    else:
        st.error("Impossible d'extraire le texte du CV. Vérifiez que le fichier PDF est lisible.")

if __name__ == "__main__":
    main()