Spaces:
Sleeping
Sleeping
Update src/crew/tasks.py
Browse files- src/crew/tasks.py +19 -84
src/crew/tasks.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
from crewai import Task
|
| 2 |
-
from .agents import report_generator_agent, skills_extractor_agent,
|
| 3 |
|
| 4 |
generate_report_task = Task(
|
| 5 |
description=(
|
|
@@ -48,23 +48,16 @@ task_extract_experience = Task(
|
|
| 48 |
description=(
|
| 49 |
"Voici le contenu du CV :\n\n{cv_content}\n\n"
|
| 50 |
"""
|
| 51 |
-
Extrais
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
-
|
| 56 |
-
-
|
| 57 |
-
- start_date: Date de début (format: "MM/YYYY" ou "YYYY")
|
| 58 |
-
- end_date: Date de fin ("Aujourd'hui" si actuel, sinon "MM/YYYY" ou "YYYY")
|
| 59 |
-
- responsabilités: Liste des missions GÉNÉRALES du poste (max 5 responsabilités)
|
| 60 |
|
| 61 |
RÈGLES STRICTES :
|
| 62 |
-
1.
|
| 63 |
-
2.
|
| 64 |
-
3. Si tu vois "Alternant chez Enedis où j'ai mené le projet Simulateur IA",
|
| 65 |
-
- Expérience: Poste="Alternant", Entreprise="Enedis", responsabilités=["Développement de solutions IA"]
|
| 66 |
-
- Le "Simulateur IA" sera extrait comme projet séparément
|
| 67 |
-
4. Utiliser "Non spécifié" si une information manque
|
| 68 |
"""
|
| 69 |
),
|
| 70 |
agent=experience_extractor_agent,
|
|
@@ -72,8 +65,7 @@ task_extract_experience = Task(
|
|
| 72 |
expected_output=(
|
| 73 |
"Un tableau JSON VALIDE d'objets 'Expérience Professionnelle' avec 5 clés par expérience : "
|
| 74 |
"'Poste', 'Entreprise', 'start_date', 'end_date', 'responsabilités'. "
|
| 75 |
-
"
|
| 76 |
-
"FORMAT EXACT: [{\"Poste\": \"titre\", \"Entreprise\": \"nom\", \"start_date\": \"MM/YYYY\", \"end_date\": \"MM/YYYY\", \"responsabilités\": [\"mission1\", \"mission2\"]}]"
|
| 77 |
)
|
| 78 |
)
|
| 79 |
|
|
@@ -81,77 +73,20 @@ task_extract_projects = Task(
|
|
| 81 |
description=(
|
| 82 |
"Voici le contenu du CV :\n\n{cv_content}\n\n"
|
| 83 |
"""
|
| 84 |
-
Identifie et extrais
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
RÈGLES STRICTES DE CLASSIFICATION :
|
| 92 |
-
1. PROJETS PROFESSIONNELS : Projets menés dans le cadre d'un emploi/stage
|
| 93 |
-
- "Développement du simulateur IA chez Enedis"
|
| 94 |
-
- "Création d'un dashboard analytics pour l'équipe"
|
| 95 |
-
|
| 96 |
-
2. PROJETS PERSONNELS : Projets auto-initiés ou de formation
|
| 97 |
-
- "Site web portfolio personnel"
|
| 98 |
-
- "Application mobile de gestion de tâches"
|
| 99 |
-
- "Projet final de formation : API REST"
|
| 100 |
-
|
| 101 |
-
3. NE PAS EXTRAIRE :
|
| 102 |
-
- Les responsabilités générales ("maintenance du code", "développement web")
|
| 103 |
-
- Les compétences techniques seules ("Python", "React")
|
| 104 |
-
- Les tâches quotidiennes d'un poste
|
| 105 |
-
|
| 106 |
-
Pour chaque projet identifié :
|
| 107 |
-
- title: Nom exact du projet
|
| 108 |
-
- role: Rôle spécifique dans ce projet (ex: "Développeur principal", "Chef de projet", "Contributeur")
|
| 109 |
-
- technologies: Technologies/outils utilisés spécifiquement pour ce projet
|
| 110 |
-
- outcomes: Résultats/livrables concrets du projet
|
| 111 |
-
- context: (NOUVEAU) "professional" ou "personal" selon le contexte
|
| 112 |
"""
|
| 113 |
),
|
| 114 |
agent=project_extractor_agent,
|
| 115 |
input_keys=["cv_content"],
|
| 116 |
expected_output=(
|
| 117 |
-
"Un dictionnaire JSON VALIDE avec
|
| 118 |
-
"Chaque
|
| 119 |
-
"FORMAT EXACT: {"
|
| 120 |
-
"\"professional\": ["
|
| 121 |
-
"{\"title\": \"Simulateur IA\", \"role\": \"Développeur principal\", \"technologies\": [\"Python\", \"TensorFlow\"], \"outcomes\": [\"Réduction de 30% du temps de calcul\"], \"context\": \"Projet mené chez Enedis\"}"
|
| 122 |
-
"], "
|
| 123 |
-
"\"personal\": ["
|
| 124 |
-
"{\"title\": \"Portfolio Web\", \"role\": \"Créateur\", \"technologies\": [\"React\", \"Node.js\"], \"outcomes\": [\"Site responsive déployé\"], \"context\": \"Projet personnel\"}"
|
| 125 |
-
"]"
|
| 126 |
-
"}"
|
| 127 |
-
)
|
| 128 |
-
)
|
| 129 |
-
|
| 130 |
-
validation_agent = Agent(
|
| 131 |
-
role="Validateur de Séparation Projets/Expériences",
|
| 132 |
-
goal="Vérifier que les projets et expériences sont correctement séparés et cohérents",
|
| 133 |
-
backstory=(
|
| 134 |
-
"Vous êtes un expert en structuration de données CV. Votre mission est de valider "
|
| 135 |
-
"que les expériences professionnelles ne contiennent pas de projets spécifiques, "
|
| 136 |
-
"et que les projets extraits sont bien des réalisations concrètes avec un nom précis."
|
| 137 |
-
),
|
| 138 |
-
verbose=False,
|
| 139 |
-
llm=LLM_agent
|
| 140 |
-
)
|
| 141 |
-
|
| 142 |
-
task_validate_separation = Task(
|
| 143 |
-
description=(
|
| 144 |
-
"Analyse les résultats des extractions précédentes pour détecter et corriger :"
|
| 145 |
-
"1. Les projets spécifiques mentionnés dans les responsabilités d'expériences"
|
| 146 |
-
"2. Les responsabilités générales classées comme projets"
|
| 147 |
-
"3. Les doublons entre expériences et projets"
|
| 148 |
-
"4. Les projets mal classifiés (professionnel vs personnel)"
|
| 149 |
-
),
|
| 150 |
-
agent=validation_agent,
|
| 151 |
-
context=[task_extract_experience, task_extract_projects],
|
| 152 |
-
expected_output=(
|
| 153 |
-
"Un dictionnaire JSON avec 'validated_experiences' et 'validated_projects' "
|
| 154 |
-
"corrigeant les erreurs de classification détectées."
|
| 155 |
)
|
| 156 |
)
|
| 157 |
|
|
|
|
| 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=(
|
|
|
|
| 48 |
description=(
|
| 49 |
"Voici le contenu du CV :\n\n{cv_content}\n\n"
|
| 50 |
"""
|
| 51 |
+
Extrais toutes les expériences professionnelles du CV. Pour chaque expérience, tu DOIS fournir les informations suivantes :
|
| 52 |
+
- Poste: Le titre du poste.
|
| 53 |
+
- Entreprise: Le nom de l'entreprise.
|
| 54 |
+
- start_date: La date de début. Si non trouvée, retourne "Non spécifié".
|
| 55 |
+
- end_date: La date de fin. Si le poste est actuel, utilise "Aujourd'hui". Si non trouvée, retourne "Non spécifié".
|
| 56 |
+
- responsabilités: Une liste des tâches et missions.
|
|
|
|
|
|
|
|
|
|
| 57 |
|
| 58 |
RÈGLES STRICTES :
|
| 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,
|
|
|
|
| 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'. "
|
| 68 |
+
"FORMAT EXACT: [{\"Poste\": \"titre\", \"Entreprise\": \"nom\", \"start_date\": \"année\", \"end_date\": \"année\", \"responsabilités\": [\"resp1\", \"resp2\"]}]"
|
|
|
|
| 69 |
)
|
| 70 |
)
|
| 71 |
|
|
|
|
| 73 |
description=(
|
| 74 |
"Voici le contenu du CV :\n\n{cv_content}\n\n"
|
| 75 |
"""
|
| 76 |
+
Identifie et extrais les PROJETS SPÉCIFIQUES mentionnés dans le CV.
|
| 77 |
+
Un projet est distinct d'une expérience professionnelle générale. Il a un nom ou un objectif clair.
|
| 78 |
+
|
| 79 |
+
RÈGLES STRICTES :
|
| 80 |
+
1. NE PAS extraire les responsabilités générales d'un poste en tant que projet. Par exemple, si le CV dit "Alternant chez Enedis où j'ai mené le projet 'Simulateur IA'", alors extrais 'Simulateur IA' comme projet. Ne copie pas toutes les tâches de l'alternance.
|
| 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 |
input_keys=["cv_content"],
|
| 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'. "
|
| 89 |
+
"FORMAT EXACT: {\"professional\": [{\"title\": \"titre\", \"role\": \"rôle\", \"technologies\": [\"tech1\"], \"outcomes\": [\"résultat1\"]}], \"personal\": []}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 90 |
)
|
| 91 |
)
|
| 92 |
|