Spaces:
Sleeping
Sleeping
| 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 {} | |