Spaces:
Sleeping
Sleeping
import os | |
import ast | |
import streamlit as st | |
from crewai import Agent, Crew, Process, Task | |
from crewai_tools import SerperDevTool | |
from langchain_google_genai import ChatGoogleGenerativeAI | |
from crewai import LLM | |
from typing import List | |
# Configuration des clés API | |
os.environ["GEMINI_API_KEY"] = "AIzaSyD6yZxfVOnh63GXBJjakAupk9aP4CZrgrQ" | |
os.environ["SERPER_API_KEY"] = "9b90a274d9e704ff5b21c0367f9ae1161779b573" | |
llm = LLM( | |
model="gemini/gemini-1.5-flash", | |
temperature=0.7, | |
timeout=120, | |
max_tokens=8000, | |
) | |
# Définitions des agents (inchangées) | |
project_manager = Agent( | |
role="Chef de Projet", | |
goal="Coordonner les autres agents pour assurer la cohérence et la qualité de l'exposé.", | |
backstory="Un chef de projet expérimenté avec une expertise dans la gestion d'équipes et la coordination de projets complexes.", | |
llm=llm, | |
verbose=True, | |
allow_delegation=True, | |
) | |
topic_analyst = Agent( | |
role="Analyste de Thème", | |
goal="Analyser le thème de l'exposé et générer un plan détaillé.", | |
backstory="Un expert en recherche et en structuration de contenu, capable de décomposer des sujets complexes en plans clairs et concis.", | |
llm=llm, | |
verbose=True, | |
tools=[SerperDevTool()], | |
) | |
content_writer = Agent( | |
role="Rédacteur de Contenu", | |
goal="Rédiger les sections de l'exposé en se basant sur le plan et les recherches.", | |
backstory="Un rédacteur spécialisé dans la création de contenu clair, concis et engageant.", | |
llm=llm, | |
verbose=True, | |
tools=[SerperDevTool()], | |
) | |
editor = Agent( | |
role="Éditeur/Réviseur", | |
goal="Réviser et peaufiner le contenu, assurer la cohérence du style et du ton, corriger les erreurs.", | |
backstory="Un éditeur expérimenté avec un souci du détail et une excellente maîtrise de la langue.", | |
llm=llm, | |
verbose=True, | |
) | |
def assign_tasks(topic: str) -> List[Task]: | |
# Tâche d'analyse qui retourne une liste de sections | |
analyze_topic_task = Task( | |
description=f"""Analyser le thème '{topic}' et générer un plan détaillé pour l'exposé. | |
IMPORTANT: Ta réponse doit être UNIQUEMENT une liste Python sous forme de string. | |
Exemple de réponse: "['Introduction', 'Historique', 'État actuel', 'Perspectives futures', 'Conclusion']" | |
Ne pas ajouter d'autres explications ou texte.""", | |
expected_output="Une liste Python sous forme de string contenant les sections de l'exposé", | |
agent=topic_analyst | |
) | |
tasks = [analyze_topic_task] | |
# Création dynamique des tâches d'écriture pour chaque section | |
def create_writing_tasks(sections_result: str) -> List[Task]: | |
try: | |
# Conversion de la string en liste Python | |
sections = ast.literal_eval(sections_result) | |
writing_tasks = [] | |
for section in sections: | |
write_task = Task( | |
description=f"""Rédiger la section '{section}' de l'exposé sur le thème '{topic}'. | |
Concentre-toi uniquement sur cette section spécifique. | |
Utilise un style académique et professionnel.""", | |
expected_output=f"Contenu détaillé de la section '{section}' au format markdown", | |
agent=content_writer, | |
context=[analyze_topic_task] | |
) | |
writing_tasks.append(write_task) | |
return writing_tasks | |
except (ValueError, SyntaxError) as e: | |
st.error(f"Erreur lors de la conversion du plan en liste: {e}") | |
return [] | |
# Tâche d'édition finale | |
def create_editing_task(writing_tasks: List[Task]) -> Task: | |
return Task( | |
description="Réviser et harmoniser l'ensemble du contenu de l'exposé. Assurer la cohérence entre toutes les sections.", | |
expected_output="Version finale de l'exposé au format markdown", | |
agent=editor, | |
context=writing_tasks | |
) | |
return { | |
'analyze_task': analyze_topic_task, | |
'create_writing_tasks': create_writing_tasks, | |
'create_editing_task': create_editing_task | |
} | |
# Interface Streamlit | |
st.title("🤖 Générateur d'Exposés avec CrewAI") | |
topic = st.text_input("Entrez le thème de l'exposé:", "L'Intelligence Artificielle en 2024") | |
if st.button("Générer l'exposé"): | |
with st.spinner("Création de l'équipe d'agents..."): | |
task_creators = assign_tasks(topic) | |
# Exécution de la tâche d'analyse | |
crew_analysis = Crew( | |
agents=[project_manager, topic_analyst], | |
tasks=[task_creators['analyze_task']], | |
process=Process.hierarchical, | |
manager_llm=llm, | |
verbose=True, | |
) | |
sections_result = crew_analysis.kickoff() | |
# Création des tâches d'écriture basées sur le résultat de l'analyse | |
writing_tasks = task_creators['create_writing_tasks'](sections_result) | |
# Création de la tâche d'édition | |
editing_task = task_creators['create_editing_task'](writing_tasks) | |
# Toutes les tâches dans l'ordre | |
all_tasks = [task_creators['analyze_task']] + writing_tasks + [editing_task] | |
# Création et exécution du crew final | |
crew = Crew( | |
agents=[project_manager, topic_analyst, content_writer, editor], | |
tasks=all_tasks, | |
process=Process.hierarchical, | |
manager_llm=llm, | |
verbose=True, | |
) | |
with st.spinner("Génération de l'exposé..."): | |
result = crew.kickoff() | |
st.success("Exposé généré avec succès!") | |
st.markdown(result) |