cv_parser / src /agents /analysis_agent.py
QuentinL52's picture
Update src/agents/analysis_agent.py
c48a606 verified
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 {}