Spaces:
Sleeping
Sleeping
Update src/crew/tasks.py
Browse files- src/crew/tasks.py +83 -18
src/crew/tasks.py
CHANGED
|
@@ -48,16 +48,23 @@ 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 |
|
| 58 |
RÈGLES STRICTES :
|
| 59 |
-
1.
|
| 60 |
-
2.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 61 |
"""
|
| 62 |
),
|
| 63 |
agent=experience_extractor_agent,
|
|
@@ -65,7 +72,8 @@ task_extract_experience = Task(
|
|
| 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 |
-
"
|
|
|
|
| 69 |
)
|
| 70 |
)
|
| 71 |
|
|
@@ -73,20 +81,77 @@ task_extract_projects = Task(
|
|
| 73 |
description=(
|
| 74 |
"Voici le contenu du CV :\n\n{cv_content}\n\n"
|
| 75 |
"""
|
| 76 |
-
Identifie et extrais les PROJETS SPÉCIFIQUES
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 82 |
"""
|
| 83 |
),
|
| 84 |
agent=project_extractor_agent,
|
| 85 |
input_keys=["cv_content"],
|
| 86 |
expected_output=(
|
| 87 |
-
"Un dictionnaire JSON VALIDE
|
| 88 |
-
"Chaque
|
| 89 |
-
"FORMAT EXACT: {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 90 |
)
|
| 91 |
)
|
| 92 |
|
|
|
|
| 48 |
description=(
|
| 49 |
"Voici le contenu du CV :\n\n{cv_content}\n\n"
|
| 50 |
"""
|
| 51 |
+
Extrais UNIQUEMENT les expériences professionnelles du CV (emplois, stages, alternances).
|
| 52 |
+
Une expérience professionnelle est un POSTE occupé dans une entreprise/organisation.
|
| 53 |
+
|
| 54 |
+
Pour chaque expérience, tu DOIS fournir :
|
| 55 |
+
- Poste: Le titre du poste UNIQUEMENT (ex: "Développeur Full-Stack", "Stagiaire Data Analyst")
|
| 56 |
+
- Entreprise: Le nom de l'entreprise/organisation
|
| 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. NE PAS extraire les projets spécifiques menés pendant l'expérience
|
| 63 |
+
2. Les responsabilités doivent être générales : "Développement d'applications web", pas "Création du projet XYZ"
|
| 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 |
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 |
+
"Les responsabilités doivent être GÉNÉRALES, pas des projets spécifiques. "
|
| 76 |
+
"FORMAT EXACT: [{\"Poste\": \"titre\", \"Entreprise\": \"nom\", \"start_date\": \"MM/YYYY\", \"end_date\": \"MM/YYYY\", \"responsabilités\": [\"mission1\", \"mission2\"]}]"
|
| 77 |
)
|
| 78 |
)
|
| 79 |
|
|
|
|
| 81 |
description=(
|
| 82 |
"Voici le contenu du CV :\n\n{cv_content}\n\n"
|
| 83 |
"""
|
| 84 |
+
Identifie et extrais UNIQUEMENT les PROJETS SPÉCIFIQUES avec un nom/titre clair.
|
| 85 |
+
|
| 86 |
+
CRITÈRES D'UN PROJET :
|
| 87 |
+
- A un nom/titre spécifique (ex: "Simulateur IA", "Application E-commerce", "Site web portfolio")
|
| 88 |
+
- Décrit une réalisation concrète et délimitée dans le temps
|
| 89 |
+
- Peut être professionnel (dans le cadre du travail) ou personnel (side project, formation)
|
| 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 les clés 'professional' et 'personal'. "
|
| 118 |
+
"Chaque projet doit avoir un NOM SPÉCIFIQUE et être clairement délimité. "
|
| 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 |
|