|
|
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() |
|
|
|
|
|
|