File size: 2,810 Bytes
3d12257
 
d3fc1f1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c48a606
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d3fc1f1
 
 
3d12257
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d3fc1f1
3d12257
 
 
 
 
 
 
 
 
d3fc1f1
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
import json
import re
import logging
from typing import Dict, Any
from src.config import chat_openai

logger = logging.getLogger(__name__)

class AnalysisAgent:
    def __init__(self, llm=None):
        self.llm = llm or chat_openai()

    def analyze_candidate(self, cv_data: Dict[str, Any]) -> Dict[str, Any]:
        if not cv_data or "candidat" not in cv_data:
            return {}

        candidat = cv_data["candidat"]
        prompt = f"""
        Tu es un expert en recrutement. Analyse ce profil candidat en te basant sur les données suivantes :
        {candidat}

        Fournis une analyse complète avec ces sections :
        1. Évaluation des compétences techniques (niveau de maîtrise par domaine)
        2. Analyse des projets (objectifs, technologies, compétences démontrées)
        3. Évaluation des soft skills
        4. Analyse de l’expérience professionnelle (niveau, cohérence, domaines)
        5. Détection d’une reconversion (si oui, précise depuis quel domaine et pourquoi)
        6. Profil global (forces, axes d’amélioration, positionnement)
        7. Recommandations de postes et de progression de carrière
        8. Suggestions d’amélioration du CV

        Donne ta réponse au format JSON clair, par exemple :
        {{
            "competence_analysis": [...],
            "project_analysis": [...],
            "soft_skills_analysis": "...",
            "experience_evaluation": "...",
            "reconversion": {{ "is_reconversion": true, "details": "..." }},
            "global_profile": "...",
            "career_recommendations": [...],
            "cv_improvement_suggestions": [...]
        }}
        """

        response = self.llm.invoke(prompt)
        raw_content = response.get("content") if isinstance(response, dict) else getattr(response, "content", None)
        if not raw_content:
            logger.warning("Aucun contenu d'analyse trouvé dans la réponse du modèle.")
            return {}

        cleaned_json = self._extract_json_from_string(raw_content)
        if not cleaned_json:
            logger.warning("Impossible d'extraire le JSON propre du contenu.")
            return {}

        return cleaned_json

    def _extract_json_from_string(self, text: str) -> Dict[str, Any]:
        """
        Extrait proprement un bloc JSON d'une réponse texte du modèle.
        Supprime les balises ```json et convertit en dict Python.
        """
        try:
            json_match = re.search(r'\{.*\}', text, re.DOTALL)
            if not json_match:
                return {}

            json_str = json_match.group(0).strip()
            return json.loads(json_str)

        except json.JSONDecodeError as e:
            logger.error(f"Erreur de parsing du JSON de l'analyse : {e}")
            return {}