Spaces:
Sleeping
Sleeping
| from crewai import Task | |
| from .agents import report_generator_agent, cv_section_splitter_agent, skills_extractor_agent, experience_extractor_agent, project_extractor_agent, education_extractor_agent, ProfileBuilderAgent, informations_personnelle_agent, reconversion_detector_agent | |
| generate_report_task = Task( | |
| description=( | |
| """Tu es un rédacteur expert en RH. Ta mission est de rédiger un rapport d'évaluation final. | |
| Tu dois utiliser deux sources d'information principales : | |
| 1. Les données d'analyse structurées de l'entretien : '{structured_analysis_data}'. | |
| 2. Une liste de conseils et de feedback pertinents issus de notre base de connaissances : '{rag_contextual_feedback}'. | |
| Ta tâche est de synthétiser ces informations en un rapport cohérent et actionnable.""" | |
| ), | |
| expected_output=( | |
| """Un rapport final exceptionnel basé sur l'analyse fournie. Le rapport doit être structuré comme suit: | |
| 1. **Résumé et Score d'Adéquation** : Synthétise le score de similarité sémantique et donne un aperçu global. | |
| 2. **Analyse Comportementale** : Interprète les résultats de l'analyse de sentiment et d'intention pour décrire le comportement du candidat. | |
| 3. **Adéquation Sémantique avec le Poste** : Explique ce que signifie le score de similarité. | |
| 4. **Points Forts & Axes d'Amélioration Personnalisés** : Utilise les données d'analyse pour identifier les points à améliorer. Ensuite, intègre de manière fluide et naturelle les conseils pertinents de '{rag_contextual_feedback}' pour proposer des pistes d'amélioration concrètes et personnalisées. Ne te contente pas de copier-coller le feedback, mais reformule-le pour qu'il s'intègre parfaitement au rapport. | |
| 5. **Recommandation Finale**.""" | |
| ), | |
| agent=report_generator_agent, | |
| ) | |
| task_split_cv_sections = Task( | |
| description=( | |
| "Voici le contenu complet du CV :\n\n{cv_content}\n\n" | |
| "Votre mission est d'analyser ce CV et de l'organiser en sections thématiques claires. " | |
| "Identifiez et extrayez le contenu de chaque section, même si les titres ne sont pas explicites. " | |
| "Recherchez les patterns typiques d'un CV pour identifier les sections." | |
| ), | |
| agent=cv_section_splitter_agent, | |
| input_keys=["cv_content"], | |
| expected_output=( | |
| "Un dictionnaire JSON VALIDE avec les sections suivantes :\n" | |
| "{\n" | |
| ' "contact": "contenu de la section contact/coordonnées",\n' | |
| ' "experiences": "contenu de la section expériences professionnelles",\n' | |
| ' "projects": "contenu de la section projets",\n' | |
| ' "education": "contenu de la section formations/études",\n' | |
| ' "skills": "contenu de la section compétences",\n' | |
| ' "other": "tout autre contenu pertinent non catégorisé"\n' | |
| "}\n" | |
| "Chaque section doit contenir le texte exact extrait du CV, même si certaines sections sont vides." | |
| ) | |
| ) | |
| task_extract_skills = Task( | |
| description=( | |
| "Voici les sections pertinentes du CV :\n\n" | |
| "Section Expériences: {experiences}\n\n" | |
| "Section Projets: {projects}\n\n" | |
| "Section Compétences: {skills}\n\n" | |
| "Extraire uniquement les compétences mentionnées explicitement dans ces sections. " | |
| "Séparer les hard skills (techniques) et les soft skills (comportementales). " | |
| "Les hard skills doivent comprendre des compétences techniques, outils, langages de programmation, etc. " | |
| "Ne rien inventer. Ne pas déduire de compétences à partir d'un poste ou d'une expérience implicite. " | |
| "Identifie clairement les compétences, et n'en exclue aucune." | |
| ), | |
| agent=skills_extractor_agent, | |
| context=[task_split_cv_sections], | |
| expected_output=( | |
| "Un dictionnaire JSON VALIDE 'Compétences' avec deux clés : 'hard_skills' et 'soft_skills', " | |
| "contenant uniquement des listes de compétences présentes dans le texte. " | |
| "FORMAT EXACT: {\"hard_skills\": [\"compétence1\", \"compétence2\"], \"soft_skills\": [\"compétence1\", \"compétence2\"]}" | |
| ) | |
| ) | |
| task_extract_experience = Task( | |
| description=( | |
| "Voici la section expériences professionnelles du CV :\n\n{experiences}\n\n" | |
| "Extrais toutes les expériences professionnelles de cette section uniquement. Pour chaque expérience, tu DOIS fournir les informations suivantes :\n" | |
| "- Poste: Le titre du poste.\n" | |
| "- Entreprise: Le nom de l'entreprise.\n" | |
| "- start_date: La date de début. Si non trouvée, retourne \"Non spécifié\".\n" | |
| "- end_date: La date de fin. Si le poste est actuel, utilise \"Aujourd'hui\". Si non trouvée, retourne \"Non spécifié\".\n" | |
| "- responsabilités: Une liste des tâches et missions.\n\n" | |
| "RÈGLES STRICTES :\n" | |
| "1. NE JAMAIS laisser un champ vide (\"\"). Si une information est introuvable, utilise la valeur \"Non spécifié\".\n" | |
| "2. Analyse attentivement les dates. \"Depuis 2023\" signifie que la date de fin est \"Aujourd'hui\"." | |
| ), | |
| agent=experience_extractor_agent, | |
| context=[task_split_cv_sections], | |
| expected_output=( | |
| "Un tableau JSON VALIDE d'objets 'Expérience Professionnelle' avec 5 clés par expérience : " | |
| "'Poste', 'Entreprise', 'start_date', 'end_date', 'responsabilités'. " | |
| "FORMAT EXACT: [{\"Poste\": \"titre\", \"Entreprise\": \"nom\", \"start_date\": \"année\", \"end_date\": \"année\", \"responsabilités\": [\"resp1\", \"resp2\"]}]" | |
| ) | |
| ) | |
| task_extract_projects = Task( | |
| description=( | |
| "Voici la section projets du CV :\n\n{projects}\n\n" | |
| "Voici également la section expériences pour contexte :\n\n{experiences}\n\n" | |
| "Identifie et extrais les PROJETS SPÉCIFIQUES mentionnés dans ces sections. " | |
| "Un projet est distinct d'une expérience professionnelle générale. Il a un nom ou un objectif clair.\n\n" | |
| "RÈGLES STRICTES :\n" | |
| "1. NE PAS extraire les responsabilités générales d'un poste en tant que projet.\n" | |
| "2. Si un projet est clairement lié à une expérience professionnelle, essaie de le noter, mais le plus important est de décrire le projet lui-même." | |
| ), | |
| agent=project_extractor_agent, | |
| context=[task_split_cv_sections], | |
| expected_output=( | |
| "Un dictionnaire JSON VALIDE 'Projets' avec deux clés : 'professional' et 'personal'. " | |
| "Chaque clé contient une liste de dictionnaires, chaque dictionnaire représentant un projet avec les clés 'title', 'role', 'technologies', et 'outcomes'. " | |
| "FORMAT EXACT: {\"professional\": [{\"title\": \"titre\", \"role\": \"rôle\", \"technologies\": [\"tech1\"], \"outcomes\": [\"résultat1\"]}], \"personal\": []}" | |
| ) | |
| ) | |
| task_extract_education = Task( | |
| description=( | |
| "Voici la section formations/études du CV :\n\n{education}\n\n" | |
| "Extrais le parcours de formation et les certifications de cette section uniquement. " | |
| "Fais une distinction claire entre les types de formation.\n" | |
| "Pour chaque élément, fournis :\n" | |
| "- degree: Le nom du diplôme, du titre (ex: 'Titre RNCP niveau 6') ou de la certification (ex: 'Core Designer Certification').\n" | |
| "- institution: L'école, l'université ou la plateforme (ex: 'WILD CODE SCHOOL', 'DataIku', 'DataCamp').\n" | |
| "- start_date: La date de début. Si non trouvée, retourne \"Non spécifié\".\n" | |
| "- end_date: La date de fin. Si non trouvée, retourne \"Non spécifié\".\n\n" | |
| "RÈGLES STRICTES :\n" | |
| "1. Si tu vois une certification comme \"DataIku (core designer)\", le diplôme est \"Core Designer\" et l'institution est \"DataIku\". NE PAS les mélanger.\n" | |
| "2. NE PAS extraire une simple compétence (ex: 'Python') comme une formation." | |
| ), | |
| agent=education_extractor_agent, | |
| context=[task_split_cv_sections], | |
| expected_output=( | |
| "Un tableau JSON VALIDE d'objets 'Formation' avec les clés : 'degree', 'institution', 'start_date', 'end_date'. " | |
| "FORMAT EXACT: [{\"degree\": \"diplôme\", \"institution\": \"établissement\", \"start_date\": \"année\", \"end_date\": \"année\"}]" | |
| ) | |
| ) | |
| task_extract_informations = Task( | |
| description=( | |
| "Voici la section contact/coordonnées du CV :\n\n{contact}\n\n" | |
| "Votre tâche est d'extraire les informations de contact du candidat de cette section.\n" | |
| "Extrayez précisément :\n" | |
| "- Le **Nom complet**.\n" | |
| "- L'**Adresse e-mail**.\n" | |
| "- Le **Numéro de téléphone**.\n" | |
| "- La **Localisation** (ville ou région).\n" | |
| "Toutes les informations devront être normalisées, principalement le nom si il est en majuscule en titre." | |
| ), | |
| agent=informations_personnelle_agent, | |
| context=[task_split_cv_sections], | |
| expected_output=( | |
| "Un dictionnaire JSON VALIDE 'informations_personnelles' contenant le nom, l'email, le numéro de téléphone et la localisation du candidat. " | |
| "FORMAT EXACT: {\"nom\": \"nom\", \"email\": \"email\", \"numero_de_telephone\": \"tel\", \"localisation\": \"lieu\"}" | |
| ) | |
| ) | |
| task_detect_reconversion = Task( | |
| description=( | |
| "En te basant sur les données extraites de la tâche `task_extract_experience`, analyse la chronologie des expériences professionnelles. " | |
| "Ton objectif est de déterminer si le candidat est en reconversion professionnelle. " | |
| "Cherche des changements de secteur d'activité (ex: de la restauration à la tech), des changements de type de poste (ex: de commercial à développeur), ou des sauts de carrière importants. " | |
| "Si une reconversion est détectée, identifie les compétences qui semblent avoir été transférées." | |
| ), | |
| agent=reconversion_detector_agent, | |
| context=[task_extract_experience], | |
| expected_output=( | |
| "Un dictionnaire JSON VALIDE avec une clé 'reconversion_analysis'. " | |
| "Ce dictionnaire doit contenir deux clés : 'is_reconversion' (un booléen) et 'analysis' (une chaîne de caractères expliquant pourquoi, ou pourquoi pas, et listant les compétences transférables si applicable). " | |
| "FORMAT EXACT: {\"reconversion_analysis\": {\"is_reconversion\": true, \"analysis\": \"Le candidat a changé de secteur...\"}}" | |
| ) | |
| ) | |
| task_build_profile = Task( | |
| description=( | |
| "Ta mission est d'agir comme un architecte de données. En utilisant les extractions des tâches précédentes, " | |
| "assemble un profil de candidat complet. " | |
| "Le résultat final doit être un unique objet JSON, parfaitement valide." | |
| ), | |
| agent=ProfileBuilderAgent, | |
| context=[ | |
| task_extract_informations, | |
| task_extract_skills, | |
| task_extract_experience, | |
| task_extract_projects, | |
| task_extract_education, | |
| task_detect_reconversion | |
| ], | |
| expected_output=( | |
| "Retourner un unique objet JSON valide. Cet objet doit avoir une seule clé à la racine : 'candidat'. " | |
| "La valeur de cette clé sera un autre objet contenant toutes les informations assemblées. " | |
| "Assure-toi que la syntaxe est parfaite, que tous les guillemets sont des guillemets doubles et qu'il n'y a aucune virgule finale. " | |
| "Le JSON doit être immédiatement parsable par un programme.\n\n" | |
| "FORMAT EXACT:\n" | |
| "{\n" | |
| " \"candidat\": {\n" | |
| " \"informations_personnelles\": {\"nom\": \"...\", \"email\": \"...\", ...},\n" | |
| " \"compétences\": {\"hard_skills\": [...], \"soft_skills\": [...]},\n" | |
| " \"expériences\": [{\"Poste\": \"...\", ...}],\n" | |
| " \"projets\": {\"professional\": [...], \"personal\": [...]},\n" | |
| " \"formations\": [{\"degree\": \"...\", ...}],\n" | |
| " \"reconversion\": {\"is_reconversion\": true, \"analysis\": \"...\"}\n" | |
| " }\n" | |
| "}" | |
| ) | |
| ) |