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}")