Docfile commited on
Commit
b4fec2b
·
verified ·
1 Parent(s): 274d5af

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +92 -105
app.py CHANGED
@@ -18,99 +18,72 @@ llm = LLM(
18
  max_tokens=8000,
19
  )
20
 
21
- # Définitions des agents (inchangées)
 
 
22
  project_manager = Agent(
23
  role="Chef de Projet",
24
- goal="Coordonner les autres agents pour assurer la cohérence et la qualité de l'exposé.",
25
  backstory="Un chef de projet expérimenté avec une expertise dans la gestion d'équipes et la coordination de projets complexes.",
26
  llm=llm,
27
  verbose=True,
28
  allow_delegation=True,
 
29
  )
30
 
31
  topic_analyst = Agent(
32
  role="Analyste de Thème",
33
- goal="Analyser le thème de l'exposé et générer un plan détaillé.",
34
- backstory="Un expert en recherche et en structuration de contenu, capable de décomposer des sujets complexes en plans clairs et concis.",
35
  llm=llm,
36
  verbose=True,
37
- tools=[SerperDevTool()],
38
  )
39
 
40
  content_writer = Agent(
41
  role="Rédacteur de Contenu",
42
- goal="Rédiger les sections de l'exposé en se basant sur le plan et les recherches.",
43
- backstory="Un rédacteur spécialisé dans la création de contenu clair, concis et engageant.",
44
  llm=llm,
45
  verbose=True,
46
- tools=[SerperDevTool()],
47
  )
48
 
49
  editor = Agent(
50
- role="Éditeur/Réviseur",
51
- goal="Réviser et peaufiner le contenu, assurer la cohérence du style et du ton.",
52
- backstory="tu es expérimenté avec un souci du détail et une excellente maîtrise de la langue.",
53
  llm=llm,
54
  verbose=True,
 
55
  )
56
 
57
- def parse_sections(crew_output) -> List[str]:
58
- """Parse the sections from CrewOutput object."""
59
- try:
60
- # Extraire le raw output
61
- raw_output = crew_output.raw
62
- # Nettoyer la string (enlever les guillemets externes s'ils existent)
63
- cleaned_output = raw_output.strip('"\'')
64
- # Évaluer la string comme une liste Python
65
- sections = eval(cleaned_output)
66
- return sections
67
- except Exception as e:
68
- st.error(f"Erreur lors du parsing des sections: {e}")
69
- st.error(f"Raw output: {crew_output.raw}")
70
- return []
71
-
72
- def assign_tasks(topic: str) -> List[Task]:
73
- # Tâche d'analyse qui retourne une liste de sections
74
- analyze_topic_task = Task(
75
- description=f"""Analyser le thème '{topic}' et générer un plan détaillé pour l'exposé.
76
- IMPORTANT: Ta réponse doit être UNIQUEMENT une liste Python.
77
- Exemple de réponse: ['Introduction', 'Historique', 'État actuel', 'Perspectives futures', 'Conclusion']
78
- Ne pas ajouter d'autres explications ou texte.""",
79
- expected_output="Une liste Python contenant les sections de l'exposé",
80
  agent=topic_analyst
81
  )
82
-
83
- tasks = [analyze_topic_task]
84
-
85
- # Création dynamique des tâches d'écriture pour chaque section
86
- def create_writing_tasks(sections: List[str]) -> List[Task]:
87
- writing_tasks = []
88
- for section in sections:
89
- write_task = Task(
90
- description=f"""Rédiger la section '{section}' de l'exposé sur le thème '{topic}'.
91
- Concentre-toi uniquement sur cette section spécifique.
92
- Utilise un style académique et professionnel.""",
93
- expected_output=f"Contenu détaillé de la section '{section}' au format markdown",
94
- agent=content_writer,
95
- context=[analyze_topic_task]
96
- )
97
- writing_tasks.append(write_task)
98
- return writing_tasks
99
-
100
- # Tâche d'édition finale
101
- def create_editing_task(writing_tasks: List[Task]) -> Task:
102
- return Task(
103
- description="Réviser et harmoniser l'ensemble du contenu de l'exposé. Assurer la cohérence entre toutes les sections.",
104
- expected_output="Version finale de l'exposé au format",
105
- agent=editor,
106
- context=writing_tasks
107
- )
108
-
109
- return {
110
- 'analyze_task': analyze_topic_task,
111
- 'create_writing_tasks': create_writing_tasks,
112
- 'create_editing_task': create_editing_task
113
- }
114
 
115
  # Interface Streamlit
116
  st.title("🤖 Générateur d'Exposés avec CrewAI")
@@ -118,46 +91,60 @@ st.title("🤖 Générateur d'Exposés avec CrewAI")
118
  topic = st.text_input("Entrez le thème de l'exposé:", "L'Intelligence Artificielle en 2024")
119
 
120
  if st.button("Générer l'exposé"):
121
- with st.spinner("Création de l'équipe d'agents..."):
122
- task_creators = assign_tasks(topic)
123
-
124
- # Exécution de la tâche d'analyse
125
- crew_analysis = Crew(
126
- agents=[project_manager, topic_analyst],
127
- tasks=[task_creators['analyze_task']],
128
- process=Process.hierarchical,
129
- manager_llm=llm,
130
- verbose=True,
131
- )
132
- analysis_result = crew_analysis.kickoff()
133
-
134
- # Parsing des sections depuis le résultat
135
- sections = parse_sections(analysis_result)
136
- st.write("Sections identifiées:", sections)
137
-
138
- if sections:
139
- # Création des tâches d'écriture basées sur les sections
140
- writing_tasks = task_creators['create_writing_tasks'](sections)
141
-
142
- # Création de la tâche d'édition
143
- editing_task = task_creators['create_editing_task'](writing_tasks)
144
 
145
- # Toutes les tâches dans l'ordre
146
- all_tasks = [task_creators['analyze_task']] + writing_tasks + [editing_task]
 
 
 
 
 
 
 
 
 
 
147
 
148
- # Création et exécution du crew final
149
- crew = Crew(
150
- agents=[project_manager, topic_analyst, content_writer, editor],
151
- tasks=all_tasks,
152
- process=Process.hierarchical,
153
- manager_llm=llm,
154
- verbose=True,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  )
 
 
 
 
 
 
156
 
157
- with st.spinner("Génération de l'exposé..."):
158
- result = crew.kickoff()
159
-
160
- st.success("Exposé généré avec succès!")
161
- st.markdown(result)
162
- else:
163
- st.error("Impossible de continuer sans une liste valide de sections.")
 
18
  max_tokens=8000,
19
  )
20
 
21
+ search_tool = SerperDevTool()
22
+
23
+ # Définitions des agents avec outils explicites
24
  project_manager = Agent(
25
  role="Chef de Projet",
26
+ goal="Coordonner les autres agents et synthétiser les résultats.",
27
  backstory="Un chef de projet expérimenté avec une expertise dans la gestion d'équipes et la coordination de projets complexes.",
28
  llm=llm,
29
  verbose=True,
30
  allow_delegation=True,
31
+ tools=[search_tool]
32
  )
33
 
34
  topic_analyst = Agent(
35
  role="Analyste de Thème",
36
+ goal="Analyser le thème et générer un plan détaillé.",
37
+ backstory="Un expert en recherche et en structuration de contenu.",
38
  llm=llm,
39
  verbose=True,
40
+ tools=[search_tool]
41
  )
42
 
43
  content_writer = Agent(
44
  role="Rédacteur de Contenu",
45
+ goal="Rédiger le contenu en se basant sur des recherches approfondies.",
46
+ backstory="Un rédacteur spécialisé dans la création de contenu académique.",
47
  llm=llm,
48
  verbose=True,
49
+ tools=[search_tool]
50
  )
51
 
52
  editor = Agent(
53
+ role="Éditeur",
54
+ goal="Réviser et harmoniser le contenu final.",
55
+ backstory="Un éditeur expérimenté avec un excellent sens du détail.",
56
  llm=llm,
57
  verbose=True,
58
+ tools=[search_tool]
59
  )
60
 
61
+ def create_outline_task(topic: str) -> Task:
62
+ return Task(
63
+ description=f"""Crée un plan détaillé pour un exposé sur '{topic}'.
64
+ Réponds UNIQUEMENT avec une liste Python de sections.
65
+ Format attendu: ['Introduction', 'Section 1', 'Section 2', 'Conclusion']""",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  agent=topic_analyst
67
  )
68
+
69
+ def create_content_task(topic: str, section: str, outline_task: Task) -> Task:
70
+ return Task(
71
+ description=f"""Rédige la section '{section}' de l'exposé sur '{topic}'.
72
+ Utilise un style académique et professionnel.
73
+ Base-toi sur des recherches récentes et pertinentes.
74
+ Format attendu: Texte en Markdown avec des sous-titres si nécessaire.""",
75
+ agent=content_writer,
76
+ context=[outline_task]
77
+ )
78
+
79
+ def create_editing_task(content_tasks: List[Task]) -> Task:
80
+ return Task(
81
+ description="""Révise et harmonise l'ensemble du contenu.
82
+ Assure la cohérence du style et la qualité de l'écriture.
83
+ Format attendu: Texte final en Markdown.""",
84
+ agent=editor,
85
+ context=content_tasks
86
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
87
 
88
  # Interface Streamlit
89
  st.title("🤖 Générateur d'Exposés avec CrewAI")
 
91
  topic = st.text_input("Entrez le thème de l'exposé:", "L'Intelligence Artificielle en 2024")
92
 
93
  if st.button("Générer l'exposé"):
94
+ try:
95
+ with st.spinner("1/4 - Création du plan..."):
96
+ # Étape 1: Création du plan
97
+ outline_task = create_outline_task(topic)
98
+ outline_crew = Crew(
99
+ agents=[topic_analyst],
100
+ tasks=[outline_task],
101
+ process=Process.sequential,
102
+ verbose=True
103
+ )
104
+ outline_result = outline_crew.kickoff()
 
 
 
 
 
 
 
 
 
 
 
 
105
 
106
+ # Parsing du résultat
107
+ try:
108
+ sections = eval(outline_result.raw.strip('"\''))
109
+ st.write("Plan généré:", sections)
110
+ except Exception as e:
111
+ st.error(f"Erreur lors du parsing du plan: {e}")
112
+ st.stop()
113
+
114
+ with st.spinner("2/4 - Rédaction des sections..."):
115
+ # Étape 2: Création du contenu section par section
116
+ content_tasks = []
117
+ content_results = []
118
 
119
+ for section in sections:
120
+ task = create_content_task(topic, section, outline_task)
121
+ content_crew = Crew(
122
+ agents=[content_writer],
123
+ tasks=[task],
124
+ process=Process.sequential,
125
+ verbose=True
126
+ )
127
+ result = content_crew.kickoff()
128
+ content_tasks.append(task)
129
+ content_results.append(result.raw)
130
+ st.write(f"Section '{section}' rédigée.")
131
+
132
+ with st.spinner("3/4 - Révision finale..."):
133
+ # Étape 3: Édition finale
134
+ editing_task = create_editing_task(content_tasks)
135
+ editing_crew = Crew(
136
+ agents=[editor],
137
+ tasks=[editing_task],
138
+ process=Process.sequential,
139
+ verbose=True
140
  )
141
+ final_result = editing_crew.kickoff()
142
+
143
+ with st.spinner("4/4 - Assemblage final..."):
144
+ # Étape 4: Assemblage et présentation
145
+ st.success("Exposé généré avec succès!")
146
+ st.markdown(final_result.raw)
147
 
148
+ except Exception as e:
149
+ st.error(f"Une erreur est survenue: {e}")
150
+ st.stop()