File size: 4,350 Bytes
0a6c0de
 
154424a
0a6c0de
154424a
0a6c0de
 
 
 
154424a
 
 
 
0a6c0de
154424a
 
 
 
0a6c0de
 
 
 
 
154424a
 
0a6c0de
 
 
 
154424a
0a6c0de
 
 
 
154424a
 
0a6c0de
 
 
154424a
0a6c0de
 
 
 
154424a
 
0a6c0de
 
154424a
0a6c0de
154424a
0a6c0de
 
 
 
154424a
 
0a6c0de
 
 
 
154424a
0a6c0de
 
 
154424a
 
0a6c0de
 
 
 
 
 
 
 
154424a
 
0a6c0de
 
 
 
 
 
 
154424a
 
0a6c0de
 
 
 
 
 
 
 
2b143d9
0a6c0de
 
 
 
 
 
 
2b143d9
0a6c0de
 
 
 
 
2b143d9
0a6c0de
 
9e4d923
0a6c0de
9e4d923
0a6c0de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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}")