QuentinL52 commited on
Commit
cb4d373
·
verified ·
1 Parent(s): 4f1959b

Delete src/crew

Browse files
src/crew/__init__.py DELETED
File without changes
src/crew/__pycache__/__init__.cpython-311.pyc DELETED
Binary file (137 Bytes)
 
src/crew/__pycache__/__init__.cpython-312.pyc DELETED
Binary file (190 Bytes)
 
src/crew/__pycache__/__init__.cpython-312.pycZone.Identifier DELETED
@@ -1,2 +0,0 @@
1
- [ZoneTransfer]
2
- ZoneId=3
 
 
 
src/crew/__pycache__/agents.cpython-311.pyc DELETED
Binary file (3.57 kB)
 
src/crew/__pycache__/agents.cpython-312.pyc DELETED
Binary file (3.43 kB)
 
src/crew/__pycache__/agents.cpython-312.pycZone.Identifier DELETED
@@ -1,2 +0,0 @@
1
- [ZoneTransfer]
2
- ZoneId=3
 
 
 
src/crew/__pycache__/analysis_crew.cpython-312.pyc DELETED
Binary file (1.08 kB)
 
src/crew/__pycache__/analysis_crew.cpython-312.pycZone.Identifier DELETED
@@ -1,2 +0,0 @@
1
- [ZoneTransfer]
2
- ZoneId=3
 
 
 
src/crew/__pycache__/crew_pool.cpython-311.pyc DELETED
Binary file (2.46 kB)
 
src/crew/__pycache__/crew_pool.cpython-312.pyc DELETED
Binary file (2.18 kB)
 
src/crew/__pycache__/crew_pool.cpython-312.pycZone.Identifier DELETED
@@ -1,2 +0,0 @@
1
- [ZoneTransfer]
2
- ZoneId=3
 
 
 
src/crew/__pycache__/tasks.cpython-312.pyc DELETED
Binary file (8.39 kB)
 
src/crew/__pycache__/tasks.cpython-312.pycZone.Identifier DELETED
@@ -1,2 +0,0 @@
1
- [ZoneTransfer]
2
- ZoneId=3
 
 
 
src/crew/agents.py DELETED
@@ -1,86 +0,0 @@
1
- from crewai import Agent
2
- from crewai import LLM
3
- from src.config import crew_openai
4
-
5
- LLM_agent = crew_openai()
6
-
7
- report_generator_agent = Agent(
8
- role='Rédacteur de Rapports Synthétiques',
9
- goal='Générer un feedback pertinent, a partir du deroulement de lentretient',
10
- backstory=(
11
- "Sepcialisé dans le recrutement et les ressources humaines, capable d'evaluer les candidats"
12
- "sur la communication et la pertinences des reponses en fonction des questions posées, redige"
13
- "en un rapport clair, un feedback détaillé sur le candidat."
14
- ),
15
- allow_delegation=False,
16
- verbose=False,
17
- llm=LLM_agent
18
- )
19
-
20
- cv_section_splitter_agent = Agent(
21
- role="Analyseur de Structure de CV",
22
- goal="Découper intelligemment un CV en sections thématiques pour optimiser le traitement par les agents spécialisés.",
23
- backstory="Vous êtes un expert en analyse documentaire, spécialisé dans la reconnaissance de structures de CV. Votre mission est d'identifier et d'extraire précisément les différentes sections d'un CV pour permettre un traitement optimisé par des agents spécialisés.",
24
- verbose=False,
25
- llm=LLM_agent
26
- )
27
-
28
- skills_extractor_agent = Agent(
29
- role="Spécialiste de l'extraction de compétences (hard & soft skills)",
30
- goal="Identifier et extraire toutes les compétences pertinentes des sections pertinentes du CV.",
31
- backstory="Vous êtes un spécialiste des compétences techniques et comportementales. Votre mission est d'analyser les sections expériences, projets et compétences pour lister de manière exhaustive toutes les compétences mentionnées.",
32
- verbose=False,
33
- llm=LLM_agent
34
- )
35
-
36
- experience_extractor_agent = Agent(
37
- role="Expert en extraction d'expérience professionnelle",
38
- goal="Extraire en détail l'expérience professionnelle du candidat à partir de la section expériences.",
39
- backstory="Vous êtes un expert en recrutement spécialisé dans l'analyse des parcours professionnels. Vous devez extraire chaque expérience de manière précise, en notant les rôles, les entreprises, les dates et les responsabilités.",
40
- verbose=False,
41
- llm=LLM_agent
42
- )
43
-
44
- project_extractor_agent = Agent(
45
- role="Spécialiste de l'identification de projets (pro & perso)",
46
- goal="Identifier et décrire les projets significatifs mentionnés dans la section projets.",
47
- backstory="Vous êtes passionné par l'innovation et les réalisations. Votre rôle est de repérer et de décrire les projets professionnels et personnels qui mettent en lumière les compétences et l'initiative des candidats.",
48
- verbose=False,
49
- llm=LLM_agent
50
- )
51
-
52
- education_extractor_agent = Agent(
53
- role="Expert en extraction d'informations sur la formation",
54
- goal="Extraire les détails des études et des diplômes obtenus à partir de la section formations.",
55
- backstory="Vous êtes un spécialiste des parcours académiques. Votre tâche est d'extraire avec précision les informations relatives aux études, aux diplômes et aux établissements fréquentés par les candidats.",
56
- verbose=False,
57
- llm=LLM_agent
58
- )
59
-
60
- informations_personnelle_agent = Agent(
61
- role="Spécialiste de l'extraction des coordonnées",
62
- goal="Identifier et extraire précisément les coordonnées du candidat à partir de la section contact.",
63
- backstory="Vous êtes un expert en analyse de CV, particulièrement doué pour localiser et extraire les informations de contact. Votre rôle est de trouver le nom, l'adresse e-mail, le numéro de téléphone et la localisation du candidat.",
64
- verbose=False,
65
- llm=LLM_agent
66
- )
67
-
68
- ProfileBuilderAgent = Agent(
69
- role='Constructeur de Profil CV',
70
- goal='Créer un profil JSON structuré et valide avec la clé candidat',
71
- backstory=(
72
- "Tu es un expert en structuration de données JSON. "
73
- "Ta mission est de créer un profil candidat parfaitement formaté "
74
- "en respectant scrupuleusement la structure JSON demandée."
75
- ),
76
- verbose=True,
77
- llm=LLM_agent
78
- )
79
-
80
- reconversion_detector_agent = Agent(
81
- role="Détecteur de Reconversion Professionnelle",
82
- goal="Analyser la chronologie des expériences pour identifier les changements de carrière significatifs.",
83
- backstory="Vous êtes un conseiller d'orientation expert, capable de repérer les transitions de carrière, d'identifier les compétences transférables et de valoriser les parcours non linéaires. Votre analyse doit mettre en lumière les changements de secteur, de type de poste ou de niveau de responsabilité.",
84
- verbose=False,
85
- llm=LLM_agent
86
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/crew/crew_pool.py DELETED
@@ -1,158 +0,0 @@
1
- from crewai import Crew, Process
2
- from langchain_core.tools import tool
3
- import json
4
- from pydantic import BaseModel, Field
5
- from typing import Dict, List, Any, Type
6
- 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
7
- from .tasks import generate_report_task, task_split_cv_sections, task_extract_skills, task_extract_experience, task_extract_projects, task_extract_education, task_build_profile, task_extract_informations, task_detect_reconversion
8
- from src.deep_learning_analyzer import MultiModelInterviewAnalyzer
9
- from src.rag_handler import RAGHandler
10
- from langchain_core.tools import BaseTool
11
-
12
- def run_interview_analysis(conversation_history: list, job_description_text: list) -> str:
13
- """
14
- Appelle cet outil à la toute fin d'un entretien d'embauche pour analyser
15
- l'intégralité de la conversation et générer un rapport de feedback.
16
- Ne l'utilise PAS pour répondre à une question normale, mais seulement pour conclure et analyser l'entretien.
17
- """
18
- analyzer = MultiModelInterviewAnalyzer()
19
- structured_analysis = analyzer.run_full_analysis(conversation_history, job_description_text)
20
-
21
- rag_handler = RAGHandler()
22
- rag_feedback = []
23
- if structured_analysis.get("intent_analysis"):
24
- for intent in structured_analysis["intent_analysis"]:
25
- query = f"Conseils pour un candidat qui cherche à {intent['labels'][0]}"
26
- rag_feedback.extend(rag_handler.get_relevant_feedback(query))
27
-
28
- if structured_analysis.get("sentiment_analysis"):
29
- for sentiment_group in structured_analysis["sentiment_analysis"]:
30
- for sentiment in sentiment_group:
31
- if sentiment['label'] == 'stress' and sentiment['score'].item() > 0.6:
32
- rag_feedback.extend(rag_handler.get_relevant_feedback("gestion du stress en entretien"))
33
- unique_feedback = list(set(rag_feedback))
34
- interview_crew = Crew(
35
- agents=[report_generator_agent],
36
- tasks=[generate_report_task],
37
- process=Process.sequential,
38
- verbose=False,
39
- telemetry=False
40
- )
41
-
42
- final_report = interview_crew.kickoff(inputs={
43
- 'structured_analysis_data': json.dumps(structured_analysis, indent=2),
44
- 'rag_contextual_feedback': "\n".join(unique_feedback)
45
- })
46
- return final_report
47
-
48
- class CVSectionExtractor:
49
- """
50
- Extracteur de sections qui utilise les résultats du CVSectionSplitterAgent
51
- pour distribuer le contenu approprié à chaque agent spécialisé.
52
- """
53
-
54
- def __init__(self, sections_data: dict):
55
- self.sections = sections_data
56
-
57
- def get_contact_section(self) -> str:
58
- return self.sections.get("contact", "")
59
-
60
- def get_experiences_section(self) -> str:
61
- return self.sections.get("experiences", "")
62
-
63
- def get_projects_section(self) -> str:
64
- return self.sections.get("projects", "")
65
-
66
- def get_education_section(self) -> str:
67
- return self.sections.get("education", "")
68
-
69
- def get_skills_section(self) -> str:
70
- return self.sections.get("skills", "")
71
-
72
- def get_skills_context(self) -> str:
73
- """Combine les sections pertinentes pour l'extraction de compétences"""
74
- return f"""
75
- Section Expériences:
76
- {self.get_experiences_section()}
77
-
78
- Section Projets:
79
- {self.get_projects_section()}
80
-
81
- Section Compétences:
82
- {self.get_skills_section()}
83
- """
84
-
85
- def analyse_cv(cv_content: str) -> json:
86
- section_splitting_crew = Crew(
87
- agents=[cv_section_splitter_agent],
88
- tasks=[task_split_cv_sections],
89
- process=Process.sequential,
90
- verbose=False,
91
- telemetry=False
92
- )
93
-
94
- sections_result = section_splitting_crew.kickoff(inputs={"cv_content": cv_content})
95
-
96
- try:
97
- if hasattr(sections_result, 'raw'):
98
- sections_json = sections_result.raw
99
- else:
100
- sections_json = str(sections_result)
101
-
102
- sections_json_cleaned = sections_json.strip()
103
- if '```' in sections_json:
104
- if '```json' in sections_json:
105
- sections_json_cleaned = sections_json.split('```json')[1].split('```')[0].strip()
106
- else:
107
- parts = sections_json.split('```')
108
- if len(parts) >= 3:
109
- sections_json_cleaned = parts[1].strip()
110
-
111
- sections_data = json.loads(sections_json_cleaned)
112
- extractor = CVSectionExtractor(sections_data)
113
-
114
- except (json.JSONDecodeError, Exception) as e:
115
- sections_data = {
116
- "contact": cv_content[:500],
117
- "experiences": cv_content,
118
- "projects": cv_content,
119
- "education": cv_content,
120
- "skills": cv_content,
121
- "other": ""
122
- }
123
- extractor = CVSectionExtractor(sections_data)
124
-
125
- main_crew = Crew(
126
- agents=[
127
- informations_personnelle_agent,
128
- skills_extractor_agent,
129
- experience_extractor_agent,
130
- project_extractor_agent,
131
- education_extractor_agent,
132
- reconversion_detector_agent,
133
- ProfileBuilderAgent
134
- ],
135
- tasks=[
136
- task_extract_informations,
137
- task_extract_skills,
138
- task_extract_experience,
139
- task_extract_projects,
140
- task_extract_education,
141
- task_detect_reconversion,
142
- task_build_profile
143
- ],
144
- process=Process.sequential,
145
- verbose=False,
146
- telemetry=False
147
- )
148
-
149
- main_inputs = {
150
- "contact": extractor.get_contact_section(),
151
- "experiences": extractor.get_experiences_section(),
152
- "projects": extractor.get_projects_section(),
153
- "education": extractor.get_education_section(),
154
- "skills": extractor.get_skills_section()
155
- }
156
-
157
- result = main_crew.kickoff(inputs=main_inputs)
158
- return result
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/crew/tasks.py DELETED
@@ -1,198 +0,0 @@
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=(
6
- """Tu es un rédacteur expert en RH. Ta mission est de rédiger un rapport d'évaluation final.
7
- Tu dois utiliser deux sources d'information principales :
8
- 1. Les données d'analyse structurées de l'entretien : '{structured_analysis_data}'.
9
- 2. Une liste de conseils et de feedback pertinents issus de notre base de connaissances : '{rag_contextual_feedback}'.
10
-
11
- Ta tâche est de synthétiser ces informations en un rapport cohérent et actionnable."""
12
- ),
13
- expected_output=(
14
- """Un rapport final exceptionnel basé sur l'analyse fournie. Le rapport doit être structuré comme suit:
15
- 1. **Résumé et Score d'Adéquation** : Synthétise le score de similarité sémantique et donne un aperçu global.
16
- 2. **Analyse Comportementale** : Interprète les résultats de l'analyse de sentiment et d'intention pour décrire le comportement du candidat.
17
- 3. **Adéquation Sémantique avec le Poste** : Explique ce que signifie le score de similarité.
18
- 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.
19
- 5. **Recommandation Finale**."""
20
- ),
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. "
64
- "FORMAT EXACT: {\"hard_skills\": [\"compétence1\", \"compétence2\"], \"soft_skills\": [\"compétence1\", \"compétence2\"]}"
65
- )
66
- )
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'. "
86
- "FORMAT EXACT: [{\"Poste\": \"titre\", \"Entreprise\": \"nom\", \"start_date\": \"année\", \"end_date\": \"année\", \"responsabilités\": [\"resp1\", \"resp2\"]}]"
87
- )
88
- )
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'. "
105
- "FORMAT EXACT: {\"professional\": [{\"title\": \"titre\", \"role\": \"rôle\", \"technologies\": [\"tech1\"], \"outcomes\": [\"résultat1\"]}], \"personal\": []}"
106
- )
107
- )
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\"}"
147
- )
148
- )
149
-
150
- task_detect_reconversion = Task(
151
- description=(
152
- "En te basant sur les données extraites de la tâche `task_extract_experience`, analyse la chronologie des expériences professionnelles. "
153
- "Ton objectif est de déterminer si le candidat est en reconversion professionnelle. "
154
- "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. "
155
- "Si une reconversion est détectée, identifie les compétences qui semblent avoir été transférées."
156
- ),
157
- agent=reconversion_detector_agent,
158
- context=[task_extract_experience],
159
- expected_output=(
160
- "Un dictionnaire JSON VALIDE avec une clé 'reconversion_analysis'. "
161
- "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). "
162
- "FORMAT EXACT: {\"reconversion_analysis\": {\"is_reconversion\": true, \"analysis\": \"Le candidat a changé de secteur...\"}}"
163
- )
164
- )
165
-
166
- task_build_profile = Task(
167
- description=(
168
- "Ta mission est d'agir comme un architecte de données. En utilisant les extractions des tâches précédentes, "
169
- "assemble un profil de candidat complet. "
170
- "Le résultat final doit être un unique objet JSON, parfaitement valide."
171
- ),
172
- agent=ProfileBuilderAgent,
173
- context=[
174
- task_extract_informations,
175
- task_extract_skills,
176
- task_extract_experience,
177
- task_extract_projects,
178
- task_extract_education,
179
- task_detect_reconversion
180
- ],
181
- expected_output=(
182
- "Retourner un unique objet JSON valide. Cet objet doit avoir une seule clé à la racine : 'candidat'. "
183
- "La valeur de cette clé sera un autre objet contenant toutes les informations assemblées. "
184
- "Assure-toi que la syntaxe est parfaite, que tous les guillemets sont des guillemets doubles et qu'il n'y a aucune virgule finale. "
185
- "Le JSON doit être immédiatement parsable par un programme.\n\n"
186
- "FORMAT EXACT:\n"
187
- "{\n"
188
- " \"candidat\": {\n"
189
- " \"informations_personnelles\": {\"nom\": \"...\", \"email\": \"...\", ...},\n"
190
- " \"compétences\": {\"hard_skills\": [...], \"soft_skills\": [...]},\n"
191
- " \"expériences\": [{\"Poste\": \"...\", ...}],\n"
192
- " \"projets\": {\"professional\": [...], \"personal\": [...]},\n"
193
- " \"formations\": [{\"degree\": \"...\", ...}],\n"
194
- " \"reconversion\": {\"is_reconversion\": true, \"analysis\": \"...\"}\n"
195
- " }\n"
196
- "}"
197
- )
198
- )