Spaces:
Sleeping
Sleeping
Update src/crew/tasks.py
Browse files- src/crew/tasks.py +70 -56
src/crew/tasks.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
from crewai import Task
|
| 2 |
-
from .agents import report_generator_agent, skills_extractor_agent, experience_extractor_agent, project_extractor_agent, education_extractor_agent, ProfileBuilderAgent, informations_personnelle_agent, reconversion_detector_agent
|
| 3 |
|
| 4 |
generate_report_task = Task(
|
| 5 |
description=(
|
|
@@ -21,22 +21,43 @@ generate_report_task = Task(
|
|
| 21 |
agent=report_generator_agent,
|
| 22 |
)
|
| 23 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
task_extract_skills = Task(
|
| 25 |
description=(
|
| 26 |
-
"Voici
|
| 27 |
-
"
|
| 28 |
-
"
|
| 29 |
-
"
|
|
|
|
|
|
|
|
|
|
| 30 |
"Ne rien inventer. Ne pas déduire de compétences à partir d'un poste ou d'une expérience implicite. "
|
| 31 |
-
"Identifie clairement les compétences, et n'en exclue aucune.
|
| 32 |
-
"\n\n**CONTRAINTES JSON STRICTES:**\n"
|
| 33 |
-
"- Utiliser UNIQUEMENT des guillemets doubles (\") pour les chaînes\n"
|
| 34 |
-
"- Aucune virgule finale dans les listes ou objets\n"
|
| 35 |
-
"- Vérifier la syntaxe JSON avant de retourner le résultat\n"
|
| 36 |
-
"- Échapper correctement les caractères spéciaux (\\, \", \\n, etc.)"
|
| 37 |
),
|
| 38 |
agent=skills_extractor_agent,
|
| 39 |
-
|
| 40 |
expected_output=(
|
| 41 |
"Un dictionnaire JSON VALIDE 'Compétences' avec deux clés : 'hard_skills' et 'soft_skills', "
|
| 42 |
"contenant uniquement des listes de compétences présentes dans le texte. "
|
|
@@ -46,22 +67,19 @@ task_extract_skills = Task(
|
|
| 46 |
|
| 47 |
task_extract_experience = Task(
|
| 48 |
description=(
|
| 49 |
-
"Voici
|
| 50 |
-
""
|
| 51 |
-
|
| 52 |
-
-
|
| 53 |
-
-
|
| 54 |
-
-
|
| 55 |
-
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
1. NE JAMAIS laisser un champ vide (""). Si une information est introuvable, utilise la valeur "Non spécifié".
|
| 60 |
-
2. Analyse attentivement les dates. "Depuis 2023" signifie que la date de fin est "Aujourd'hui".
|
| 61 |
-
"""
|
| 62 |
),
|
| 63 |
agent=experience_extractor_agent,
|
| 64 |
-
|
| 65 |
expected_output=(
|
| 66 |
"Un tableau JSON VALIDE d'objets 'Expérience Professionnelle' avec 5 clés par expérience : "
|
| 67 |
"'Poste', 'Entreprise', 'start_date', 'end_date', 'responsabilités'. "
|
|
@@ -71,18 +89,16 @@ task_extract_experience = Task(
|
|
| 71 |
|
| 72 |
task_extract_projects = Task(
|
| 73 |
description=(
|
| 74 |
-
"Voici
|
| 75 |
-
""
|
| 76 |
-
Identifie et extrais les PROJETS SPÉCIFIQUES mentionnés dans
|
| 77 |
-
Un projet est distinct d'une expérience professionnelle générale. Il a un nom ou un objectif clair
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
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.
|
| 82 |
-
"""
|
| 83 |
),
|
| 84 |
agent=project_extractor_agent,
|
| 85 |
-
|
| 86 |
expected_output=(
|
| 87 |
"Un dictionnaire JSON VALIDE 'Projets' avec deux clés : 'professional' et 'personal'. "
|
| 88 |
"Chaque clé contient une liste de dictionnaires, chaque dictionnaire représentant un projet avec les clés 'title', 'role', 'technologies', et 'outcomes'. "
|
|
@@ -92,41 +108,39 @@ task_extract_projects = Task(
|
|
| 92 |
|
| 93 |
task_extract_education = Task(
|
| 94 |
description=(
|
| 95 |
-
"Voici
|
| 96 |
-
""
|
| 97 |
-
|
| 98 |
-
Pour chaque élément, fournis
|
| 99 |
-
- degree: Le nom du diplôme, du titre (ex: 'Titre RNCP niveau 6') ou de la certification (ex: 'Core Designer Certification')
|
| 100 |
-
- institution: L'école, l'université ou la plateforme (ex: 'WILD CODE SCHOOL', 'DataIku', 'DataCamp')
|
| 101 |
-
- start_date: La date de début. Si non trouvée, retourne "Non
|
| 102 |
-
- end_date: La date de fin. Si non trouvée, retourne "Non
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
2. NE PAS extraire une simple compétence (ex: 'Python') comme une formation.
|
| 107 |
-
"""
|
| 108 |
),
|
| 109 |
agent=education_extractor_agent,
|
| 110 |
-
|
| 111 |
expected_output=(
|
| 112 |
"Un tableau JSON VALIDE d'objets 'Formation' avec les clés : 'degree', 'institution', 'start_date', 'end_date'. "
|
| 113 |
-
"FORMAT EXACT: [{\"degree\": \"diplôme\", \"institution\": \"établissement\", \"start_date\": \"année\", \"end_date\": \"année\"]
|
| 114 |
)
|
| 115 |
)
|
| 116 |
|
| 117 |
task_extract_informations = Task(
|
| 118 |
description=(
|
| 119 |
-
"Voici
|
| 120 |
-
"Votre tâche est d'extraire les informations de contact du candidat
|
| 121 |
"Extrayez précisément :\n"
|
| 122 |
"- Le **Nom complet**.\n"
|
| 123 |
"- L'**Adresse e-mail**.\n"
|
| 124 |
"- Le **Numéro de téléphone**.\n"
|
| 125 |
"- La **Localisation** (ville ou région).\n"
|
| 126 |
-
"
|
| 127 |
),
|
| 128 |
agent=informations_personnelle_agent,
|
| 129 |
-
|
| 130 |
expected_output=(
|
| 131 |
"Un dictionnaire JSON VALIDE 'informations_personnelles' contenant le nom, l'email, le numéro de téléphone et la localisation du candidat. "
|
| 132 |
"FORMAT EXACT: {\"nom\": \"nom\", \"email\": \"email\", \"numero_de_telephone\": \"tel\", \"localisation\": \"lieu\"}"
|
|
@@ -181,4 +195,4 @@ task_build_profile = Task(
|
|
| 181 |
" }\n"
|
| 182 |
"}"
|
| 183 |
)
|
| 184 |
-
)
|
|
|
|
| 1 |
from crewai import Task
|
| 2 |
+
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
|
| 3 |
|
| 4 |
generate_report_task = Task(
|
| 5 |
description=(
|
|
|
|
| 21 |
agent=report_generator_agent,
|
| 22 |
)
|
| 23 |
|
| 24 |
+
task_split_cv_sections = Task(
|
| 25 |
+
description=(
|
| 26 |
+
"Voici le contenu complet du CV :\n\n{cv_content}\n\n"
|
| 27 |
+
"Votre mission est d'analyser ce CV et de l'organiser en sections thématiques claires. "
|
| 28 |
+
"Identifiez et extrayez le contenu de chaque section, même si les titres ne sont pas explicites. "
|
| 29 |
+
"Recherchez les patterns typiques d'un CV pour identifier les sections."
|
| 30 |
+
),
|
| 31 |
+
agent=cv_section_splitter_agent,
|
| 32 |
+
input_keys=["cv_content"],
|
| 33 |
+
expected_output=(
|
| 34 |
+
"Un dictionnaire JSON VALIDE avec les sections suivantes :\n"
|
| 35 |
+
"{\n"
|
| 36 |
+
' "contact": "contenu de la section contact/coordonnées",\n'
|
| 37 |
+
' "experiences": "contenu de la section expériences professionnelles",\n'
|
| 38 |
+
' "projects": "contenu de la section projets",\n'
|
| 39 |
+
' "education": "contenu de la section formations/études",\n'
|
| 40 |
+
' "skills": "contenu de la section compétences",\n'
|
| 41 |
+
' "other": "tout autre contenu pertinent non catégorisé"\n'
|
| 42 |
+
"}\n"
|
| 43 |
+
"Chaque section doit contenir le texte exact extrait du CV, même si certaines sections sont vides."
|
| 44 |
+
)
|
| 45 |
+
)
|
| 46 |
+
|
| 47 |
task_extract_skills = Task(
|
| 48 |
description=(
|
| 49 |
+
"Voici les sections pertinentes du CV :\n\n"
|
| 50 |
+
"Section Expériences: {experiences}\n\n"
|
| 51 |
+
"Section Projets: {projects}\n\n"
|
| 52 |
+
"Section Compétences: {skills}\n\n"
|
| 53 |
+
"Extraire uniquement les compétences mentionnées explicitement dans ces sections. "
|
| 54 |
+
"Séparer les hard skills (techniques) et les soft skills (comportementales). "
|
| 55 |
+
"Les hard skills doivent comprendre des compétences techniques, outils, langages de programmation, etc. "
|
| 56 |
"Ne rien inventer. Ne pas déduire de compétences à partir d'un poste ou d'une expérience implicite. "
|
| 57 |
+
"Identifie clairement les compétences, et n'en exclue aucune."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 58 |
),
|
| 59 |
agent=skills_extractor_agent,
|
| 60 |
+
context=[task_split_cv_sections],
|
| 61 |
expected_output=(
|
| 62 |
"Un dictionnaire JSON VALIDE 'Compétences' avec deux clés : 'hard_skills' et 'soft_skills', "
|
| 63 |
"contenant uniquement des listes de compétences présentes dans le texte. "
|
|
|
|
| 67 |
|
| 68 |
task_extract_experience = Task(
|
| 69 |
description=(
|
| 70 |
+
"Voici la section expériences professionnelles du CV :\n\n{experiences}\n\n"
|
| 71 |
+
"Extrais toutes les expériences professionnelles de cette section uniquement. Pour chaque expérience, tu DOIS fournir les informations suivantes :\n"
|
| 72 |
+
"- Poste: Le titre du poste.\n"
|
| 73 |
+
"- Entreprise: Le nom de l'entreprise.\n"
|
| 74 |
+
"- start_date: La date de début. Si non trouvée, retourne \"Non spécifié\".\n"
|
| 75 |
+
"- end_date: La date de fin. Si le poste est actuel, utilise \"Aujourd'hui\". Si non trouvée, retourne \"Non spécifié\".\n"
|
| 76 |
+
"- responsabilités: Une liste des tâches et missions.\n\n"
|
| 77 |
+
"RÈGLES STRICTES :\n"
|
| 78 |
+
"1. NE JAMAIS laisser un champ vide (\"\"). Si une information est introuvable, utilise la valeur \"Non spécifié\".\n"
|
| 79 |
+
"2. Analyse attentivement les dates. \"Depuis 2023\" signifie que la date de fin est \"Aujourd'hui\"."
|
|
|
|
|
|
|
|
|
|
| 80 |
),
|
| 81 |
agent=experience_extractor_agent,
|
| 82 |
+
context=[task_split_cv_sections],
|
| 83 |
expected_output=(
|
| 84 |
"Un tableau JSON VALIDE d'objets 'Expérience Professionnelle' avec 5 clés par expérience : "
|
| 85 |
"'Poste', 'Entreprise', 'start_date', 'end_date', 'responsabilités'. "
|
|
|
|
| 89 |
|
| 90 |
task_extract_projects = Task(
|
| 91 |
description=(
|
| 92 |
+
"Voici la section projets du CV :\n\n{projects}\n\n"
|
| 93 |
+
"Voici également la section expériences pour contexte :\n\n{experiences}\n\n"
|
| 94 |
+
"Identifie et extrais les PROJETS SPÉCIFIQUES mentionnés dans ces sections. "
|
| 95 |
+
"Un projet est distinct d'une expérience professionnelle générale. Il a un nom ou un objectif clair.\n\n"
|
| 96 |
+
"RÈGLES STRICTES :\n"
|
| 97 |
+
"1. NE PAS extraire les responsabilités générales d'un poste en tant que projet.\n"
|
| 98 |
+
"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."
|
|
|
|
|
|
|
| 99 |
),
|
| 100 |
agent=project_extractor_agent,
|
| 101 |
+
context=[task_split_cv_sections],
|
| 102 |
expected_output=(
|
| 103 |
"Un dictionnaire JSON VALIDE 'Projets' avec deux clés : 'professional' et 'personal'. "
|
| 104 |
"Chaque clé contient une liste de dictionnaires, chaque dictionnaire représentant un projet avec les clés 'title', 'role', 'technologies', et 'outcomes'. "
|
|
|
|
| 108 |
|
| 109 |
task_extract_education = Task(
|
| 110 |
description=(
|
| 111 |
+
"Voici la section formations/études du CV :\n\n{education}\n\n"
|
| 112 |
+
"Extrais le parcours de formation et les certifications de cette section uniquement. "
|
| 113 |
+
"Fais une distinction claire entre les types de formation.\n"
|
| 114 |
+
"Pour chaque élément, fournis :\n"
|
| 115 |
+
"- degree: Le nom du diplôme, du titre (ex: 'Titre RNCP niveau 6') ou de la certification (ex: 'Core Designer Certification').\n"
|
| 116 |
+
"- institution: L'école, l'université ou la plateforme (ex: 'WILD CODE SCHOOL', 'DataIku', 'DataCamp').\n"
|
| 117 |
+
"- start_date: La date de début. Si non trouvée, retourne \"Non spécifié\".\n"
|
| 118 |
+
"- end_date: La date de fin. Si non trouvée, retourne \"Non spécifié\".\n\n"
|
| 119 |
+
"RÈGLES STRICTES :\n"
|
| 120 |
+
"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"
|
| 121 |
+
"2. NE PAS extraire une simple compétence (ex: 'Python') comme une formation."
|
|
|
|
|
|
|
| 122 |
),
|
| 123 |
agent=education_extractor_agent,
|
| 124 |
+
context=[task_split_cv_sections],
|
| 125 |
expected_output=(
|
| 126 |
"Un tableau JSON VALIDE d'objets 'Formation' avec les clés : 'degree', 'institution', 'start_date', 'end_date'. "
|
| 127 |
+
"FORMAT EXACT: [{\"degree\": \"diplôme\", \"institution\": \"établissement\", \"start_date\": \"année\", \"end_date\": \"année\"}]"
|
| 128 |
)
|
| 129 |
)
|
| 130 |
|
| 131 |
task_extract_informations = Task(
|
| 132 |
description=(
|
| 133 |
+
"Voici la section contact/coordonnées du CV :\n\n{contact}\n\n"
|
| 134 |
+
"Votre tâche est d'extraire les informations de contact du candidat de cette section.\n"
|
| 135 |
"Extrayez précisément :\n"
|
| 136 |
"- Le **Nom complet**.\n"
|
| 137 |
"- L'**Adresse e-mail**.\n"
|
| 138 |
"- Le **Numéro de téléphone**.\n"
|
| 139 |
"- La **Localisation** (ville ou région).\n"
|
| 140 |
+
"Toutes les informations devront être normalisées, principalement le nom si il est en majuscule en titre."
|
| 141 |
),
|
| 142 |
agent=informations_personnelle_agent,
|
| 143 |
+
context=[task_split_cv_sections],
|
| 144 |
expected_output=(
|
| 145 |
"Un dictionnaire JSON VALIDE 'informations_personnelles' contenant le nom, l'email, le numéro de téléphone et la localisation du candidat. "
|
| 146 |
"FORMAT EXACT: {\"nom\": \"nom\", \"email\": \"email\", \"numero_de_telephone\": \"tel\", \"localisation\": \"lieu\"}"
|
|
|
|
| 195 |
" }\n"
|
| 196 |
"}"
|
| 197 |
)
|
| 198 |
+
)
|