Mariamexpo / app.py
Docfile's picture
Update app.py
2dd94a5 verified
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
import os
os.environ["GEMINI_API_KEY"] = os.environ.get("GEMINI_API_KEY")
os.environ["SERPER_API_KEY"] = os.environ.get("SERPER_API_KEY")
llm = LLM(
model="gemini/gemini-1.5-flash",
temperature=0.7,
timeout=120,
max_tokens=8000,
)
search_tool = SerperDevTool()
# Définitions des agents avec outils explicites
project_manager = Agent(
role="Chef de Projet",
goal="Coordonner les autres agents et synthétiser les résultats.",
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,
tools=[search_tool]
)
topic_analyst = Agent(
role="Analyste de Thème",
goal="Analyser le thème et générer un plan détaillé.",
backstory="Un expert en recherche et en structuration de contenu.",
llm=llm,
verbose=True,
tools=[search_tool]
)
content_writer = Agent(
role="Rédacteur de Contenu",
goal="Rédiger le contenu en se basant sur des recherches approfondies.",
backstory="Un rédacteur spécialisé dans la création de contenu académique.",
llm=llm,
verbose=True,
tools=[search_tool]
)
editor = Agent(
role="Éditeur",
goal="Réviser et harmoniser le contenu final.",
backstory="Un éditeur expérimenté avec un excellent sens du détail.",
llm=llm,
verbose=True,
tools=[search_tool]
)
def create_outline_task(topic: str) -> Task:
return Task(
description=f"""Crée un plan détaillé pour un exposé sur '{topic}'.
Réponds UNIQUEMENT avec une liste Python.
Format attendu: ['Introduction', 'I', 'II','etc..', 'Conclusion']""",
expected_output="Liste Python des sections de l'exposé sous forme de string",
agent=topic_analyst
)
def create_content_task(topic: str, section: str, outline_task: Task) -> Task:
return Task(
description=f"""Rédige la section '{section}' de l'exposé sur '{topic}'.
Utilise un style académique et professionnel.
Base-toi sur des recherches récentes et pertinentes.
Format attendu: Texte en Markdown avec des sous-titres si nécessaire.""",
expected_output="Contenu de la section en format Markdown",
agent=content_writer,
context=[outline_task]
)
def create_editing_task(content_tasks: List[Task]) -> Task:
return Task(
description="""Révise et harmonise l'ensemble du contenu.
Assure la cohérence du style et la qualité de l'écriture.
Format attendu: Texte final en Markdown.""",
expected_output="Version finale de l'exposé en format Markdown",
agent=editor,
context=content_tasks
)
# 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é"):
try:
with st.spinner("1/4 - Création du plan..."):
# Étape 1: Création du plan
outline_task = create_outline_task(topic)
outline_crew = Crew(
agents=[topic_analyst],
tasks=[outline_task],
process=Process.sequential,
verbose=True
)
outline_result = outline_crew.kickoff()
# Parsing du résultat
try:
sections = eval(outline_result.raw.strip('"\''))
st.write("Plan généré:", sections)
except Exception as e:
st.error(f"Erreur lors du parsing du plan: {e}")
st.stop()
with st.spinner("2/4 - Rédaction des sections..."):
# Étape 2: Création du contenu section par section
content_tasks = []
content_results = []
for section in sections:
task = create_content_task(topic, section, outline_task)
content_crew = Crew(
agents=[content_writer],
tasks=[task],
process=Process.sequential,
verbose=True
)
result = content_crew.kickoff()
content_tasks.append(task)
content_results.append(result.raw)
st.write(f"Section '{section}' rédigée.")
with st.spinner("3/4 - Révision finale..."):
# Étape 3: Édition finale
editing_task = create_editing_task(content_tasks)
editing_crew = Crew(
agents=[editor],
tasks=[editing_task],
process=Process.sequential,
verbose=True
)
final_result = editing_crew.kickoff()
with st.spinner("4/4 - Assemblage final..."):
# Étape 4: Assemblage et présentation
st.success("Exposé généré avec succès!")
st.markdown(final_result.raw)
except Exception as e:
st.error(f"Une erreur est survenue: {e}")
st.stop()