Spaces:
Sleeping
Sleeping
import os | |
from crewai import Agent, Task, Crew, Process | |
from crewai_tools import SerperDevTool | |
import streamlit as st | |
from crewai import LLM | |
from crewai.tools import FileWriteTool # Importez FileWriteTool | |
# Configuration des clés API pour les outils | |
os.environ["SERPER_API_KEY"] = st.secrets["SERPER_API_KEY"] | |
os.environ["GEMINI_API_KEY"] = "AIzaSyAxG22bkNc0Nhsjs5aTh7H7e8LWJWy21Kw" | |
llm = LLM( | |
model="gemini/gemini-1.5-flash", | |
temperature=0.7, | |
timeout=120, # Secondes d'attente pour la réponse | |
max_tokens=8000, | |
) | |
# Définition des outils | |
search_tool = SerperDevTool() | |
# Définir FileWriteTool | |
file_writer_tool = FileWriteTool() | |
# Agents | |
coordinateur = Agent( | |
role="Coordinateur général", | |
goal="Superviser la création d'un exposé complet et formaté.", | |
llm=llm, | |
backstory=( | |
"Vous êtes un coordinateur expert, chargé de gérer chaque étape " | |
"du processus pour produire un exposé captivant et structuré." | |
), | |
) | |
planificateur = Agent( | |
role="Planificateur", | |
goal="Créer un plan structuré pour un exposé basé sur un thème donné.", | |
tools=[search_tool], | |
llm=llm, | |
backstory=( | |
"Vous êtes un planificateur méthodique, spécialiste de l'organisation d'idées en sections." | |
), | |
) | |
redacteur = Agent( | |
role="Rédacteur", | |
llm=llm, | |
goal="Rédiger des sections spécifiques de l'exposé en suivant un plan fourni.", | |
tools=[search_tool], | |
backstory=( | |
"Vous êtes un rédacteur talentueux capable de transformer un sujet complexe " | |
"en un texte clair et captivant." | |
), | |
) | |
formatteur = Agent( | |
role="Expert en mise en page", | |
goal="Assembler et formater l'exposé final dans un fichier PDF professionnel.", | |
tools=[file_writer_tool], # Inclut maintenant FileWriteTool | |
llm=llm, | |
backstory=( | |
"Vous êtes un expert en mise en page, dédié à produire des documents captivants." | |
), | |
) | |
# Tâches | |
generer_plan_task = Task( | |
description=( | |
"Créer un plan structuré détaillé à partir d'un thème principal. " | |
"Le plan doit inclure une introduction, des sections principales, et une conclusion." | |
), | |
expected_output="Un plan détaillé avec sections et sous-sections.", | |
agent=planificateur, | |
) | |
rediger_section_task = Task( | |
description=( | |
"Rédiger une section précise de l'exposé en suivant les instructions du plan. " | |
"Assurez-vous que le contenu est clair et engageant." | |
), | |
expected_output="Une section rédigée en 3-4 paragraphes.", | |
agent=redacteur, | |
) | |
assembler_et_formatter_task = Task( | |
description=( | |
"Assembler toutes les sections rédigées selon le plan et produire un fichier PDF final." | |
"Enregistrez la sortie dans un fichier appelé expose_final.pdf." | |
), | |
expected_output="Un fichier PDF formaté professionnellement.", | |
agent=formatteur, | |
) | |
# Crew avec un agent manager - Ne pas inclure le coordinateur dans la liste des agents | |
crew = Crew( | |
agents=[planificateur, redacteur, formatteur], | |
tasks=[generer_plan_task, rediger_section_task, assembler_et_formatter_task], | |
process=Process.hierarchical, | |
manager_agent=coordinateur, | |
) | |
# Interface utilisateur avec Streamlit | |
st.title("Générateur d'exposés") | |
st.write( | |
"Ce générateur d'exposés produit un document PDF complet à partir d'un thème principal." | |
) | |
# Entrée de l'utilisateur | |
theme = st.text_input("Entrez le thème de votre exposé :", value="Exemple : L'intelligence artificielle dans l'éducation") | |
# Bouton de génération | |
if st.button("Générer l'exposé"): | |
st.info("Génération de l'exposé en cours, cela peut prendre quelques instants...") | |
try: | |
# Lancement de la Crew avec le thème donné | |
result = crew.kickoff(inputs={"theme": theme}) | |
# Récupération et affichage du fichier PDF généré | |
pdf_file_path = result.tasks_output[-1].raw | |
with open(pdf_file_path, "rb") as pdf_file: | |
st.success("Exposé généré avec succès !") | |
st.download_button( | |
label="Télécharger l'exposé au format PDF", | |
data=pdf_file, | |
file_name="expose_final.pdf", | |
mime="application/pdf", | |
) | |
except Exception as e: | |
st.error(f"Une erreur est survenue : {e}") |