QuentinL52's picture
Update src/crew/tasks.py
57f1508 verified
raw
history blame
12 kB
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"
"}"
)
)