Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -18,99 +18,72 @@ llm = LLM(
|
|
18 |
max_tokens=8000,
|
19 |
)
|
20 |
|
21 |
-
|
|
|
|
|
22 |
project_manager = Agent(
|
23 |
role="Chef de Projet",
|
24 |
-
goal="Coordonner les autres agents
|
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
|
34 |
-
backstory="Un expert en recherche et en structuration de contenu
|
35 |
llm=llm,
|
36 |
verbose=True,
|
37 |
-
tools=[
|
38 |
)
|
39 |
|
40 |
content_writer = Agent(
|
41 |
role="Rédacteur de Contenu",
|
42 |
-
goal="Rédiger
|
43 |
-
backstory="Un rédacteur spécialisé dans la création de contenu
|
44 |
llm=llm,
|
45 |
verbose=True,
|
46 |
-
tools=[
|
47 |
)
|
48 |
|
49 |
editor = Agent(
|
50 |
-
role="Éditeur
|
51 |
-
goal="Réviser et
|
52 |
-
backstory="
|
53 |
llm=llm,
|
54 |
verbose=True,
|
|
|
55 |
)
|
56 |
|
57 |
-
def
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
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 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
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 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
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 |
-
#
|
146 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
147 |
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
155 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
156 |
|
157 |
-
|
158 |
-
|
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()
|
|
|
|
|
|
|
|