Mariamexpo / app.py
Docfile's picture
Update app.py
0a6c0de verified
raw
history blame
4.35 kB
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}")