Spaces:
Sleeping
Sleeping
File size: 5,756 Bytes
814d355 c6420f7 e1c034a f046245 e1c034a d34d5e9 c6420f7 73f73b3 e1c034a d34d5e9 c6420f7 e1c034a d34d5e9 e1c034a 154424a e1c034a d34d5e9 e1c034a 9c65178 e1c034a d34d5e9 e1c034a 9c65178 e1c034a d34d5e9 e1c034a 85e590f c6420f7 e1c034a c6420f7 e1c034a 88f982a c6420f7 88f982a c6420f7 e1c034a c6420f7 e1c034a c6420f7 e1c034a c6420f7 e1c034a d34d5e9 e1c034a 85e590f e1c034a c6420f7 e1c034a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
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) |