CVGFSI / appocket.py
MMOON's picture
Rename app.py to appocket.py
e7fbca8 verified
import streamlit as st
from referentials import REFERENTIALS # Chargement des référentiels depuis un fichier
from PyPDF2 import PdfReader
from pocketgroq import GroqProvider
# Fonction pour obtenir le fournisseur Groq
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)
# Extraction de texte depuis un PDF
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
# Analyse du CV avec Groq et référentiel
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
# Génération d'une conclusion
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é."
# Interface utilisateur principale
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()