File size: 5,361 Bytes
814d355
c6420f7
e1c034a
 
f046245
e1c034a
d34d5e9
c6420f7
 
 
2dd94a5
e1c034a
2dd94a5
 
d34d5e9
 
 
 
 
 
 
b4fec2b
 
 
e1c034a
 
b4fec2b
e1c034a
d34d5e9
e1c034a
 
b4fec2b
154424a
 
e1c034a
 
b4fec2b
 
d34d5e9
e1c034a
b4fec2b
e1c034a
9c65178
e1c034a
 
b4fec2b
 
d34d5e9
e1c034a
b4fec2b
e1c034a
9c65178
e1c034a
b4fec2b
 
 
d34d5e9
e1c034a
b4fec2b
e1c034a
85e590f
b4fec2b
 
 
7ab5262
7ca0584
f2944a5
c6420f7
e1c034a
b4fec2b
 
 
 
 
 
 
f2944a5
b4fec2b
 
 
 
 
 
 
 
 
f2944a5
b4fec2b
 
 
e1c034a
c6420f7
e1c034a
 
 
 
 
b4fec2b
 
 
 
 
 
 
 
 
 
 
3123e2c
b4fec2b
 
 
 
 
 
 
 
 
 
 
 
3123e2c
b4fec2b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3123e2c
b4fec2b
 
 
 
 
 
85e590f
b4fec2b
 
 
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
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()