File size: 5,756 Bytes
814d355
c6420f7
e1c034a
 
f046245
e1c034a
d34d5e9
c6420f7
 
 
73f73b3
 
e1c034a
d34d5e9
 
 
 
 
 
 
c6420f7
e1c034a
 
 
 
d34d5e9
e1c034a
 
154424a
 
e1c034a
 
 
 
d34d5e9
e1c034a
 
 
9c65178
e1c034a
 
 
 
d34d5e9
e1c034a
 
 
9c65178
e1c034a
 
 
 
d34d5e9
e1c034a
 
85e590f
c6420f7
 
e1c034a
c6420f7
 
 
 
 
 
e1c034a
88f982a
c6420f7
88f982a
c6420f7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e1c034a
c6420f7
e1c034a
 
 
 
 
 
c6420f7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e1c034a
 
c6420f7
e1c034a
d34d5e9
e1c034a
85e590f
 
e1c034a
 
c6420f7
e1c034a
 
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
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
os.environ["GEMINI_API_KEY"] = "AIzaSyD6yZxfVOnh63GXBJjakAupk9aP4CZrgrQ"
os.environ["SERPER_API_KEY"] = "9b90a274d9e704ff5b21c0367f9ae1161779b573"

llm = LLM(
    model="gemini/gemini-1.5-flash",
    temperature=0.7,
    timeout=120,
    max_tokens=8000,
)

# Définitions des agents (inchangées)
project_manager = Agent(
    role="Chef de Projet",
    goal="Coordonner les autres agents pour assurer la cohérence et la qualité de l'exposé.",
    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,
)

topic_analyst = Agent(
    role="Analyste de Thème",
    goal="Analyser le thème de l'exposé et générer un plan détaillé.",
    backstory="Un expert en recherche et en structuration de contenu, capable de décomposer des sujets complexes en plans clairs et concis.",
    llm=llm,
    verbose=True,
    tools=[SerperDevTool()],
)

content_writer = Agent(
    role="Rédacteur de Contenu",
    goal="Rédiger les sections de l'exposé en se basant sur le plan et les recherches.",
    backstory="Un rédacteur spécialisé dans la création de contenu clair, concis et engageant.",
    llm=llm,
    verbose=True,
    tools=[SerperDevTool()],
)

editor = Agent(
    role="Éditeur/Réviseur",
    goal="Réviser et peaufiner le contenu, assurer la cohérence du style et du ton, corriger les erreurs.",
    backstory="Un éditeur expérimenté avec un souci du détail et une excellente maîtrise de la langue.",
    llm=llm,
    verbose=True,
)

def assign_tasks(topic: str) -> List[Task]:
    # Tâche d'analyse qui retourne une liste de sections
    analyze_topic_task = Task(
        description=f"""Analyser le thème '{topic}' et générer un plan détaillé pour l'exposé.
        IMPORTANT: Ta réponse doit être UNIQUEMENT une liste Python sous forme de string.
        Exemple de réponse: "['Introduction', 'Historique', 'État actuel', 'Perspectives futures', 'Conclusion']"
        Ne pas ajouter d'autres explications ou texte.""",
        expected_output="Une liste Python sous forme de string contenant les sections de l'exposé",
        agent=topic_analyst
    )
    
    tasks = [analyze_topic_task]
    
    # Création dynamique des tâches d'écriture pour chaque section
    def create_writing_tasks(sections_result: str) -> List[Task]:
        try:
            # Conversion de la string en liste Python
            sections = ast.literal_eval(sections_result)
            writing_tasks = []
            
            for section in sections:
                write_task = Task(
                    description=f"""Rédiger la section '{section}' de l'exposé sur le thème '{topic}'.
                    Concentre-toi uniquement sur cette section spécifique.
                    Utilise un style académique et professionnel.""",
                    expected_output=f"Contenu détaillé de la section '{section}' au format markdown",
                    agent=content_writer,
                    context=[analyze_topic_task]
                )
                writing_tasks.append(write_task)
            
            return writing_tasks
        except (ValueError, SyntaxError) as e:
            st.error(f"Erreur lors de la conversion du plan en liste: {e}")
            return []
    
    # Tâche d'édition finale
    def create_editing_task(writing_tasks: List[Task]) -> Task:
        return Task(
            description="Réviser et harmoniser l'ensemble du contenu de l'exposé. Assurer la cohérence entre toutes les sections.",
            expected_output="Version finale de l'exposé au format markdown",
            agent=editor,
            context=writing_tasks
        )
    
    return {
        'analyze_task': analyze_topic_task,
        'create_writing_tasks': create_writing_tasks,
        'create_editing_task': create_editing_task
    }

# 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é"):
    with st.spinner("Création de l'équipe d'agents..."):
        task_creators = assign_tasks(topic)
        
        # Exécution de la tâche d'analyse
        crew_analysis = Crew(
            agents=[project_manager, topic_analyst],
            tasks=[task_creators['analyze_task']],
            process=Process.hierarchical,
            manager_llm=llm,
            verbose=True,
        )
        sections_result = crew_analysis.kickoff()
        
        # Création des tâches d'écriture basées sur le résultat de l'analyse
        writing_tasks = task_creators['create_writing_tasks'](sections_result)
        
        # Création de la tâche d'édition
        editing_task = task_creators['create_editing_task'](writing_tasks)
        
        # Toutes les tâches dans l'ordre
        all_tasks = [task_creators['analyze_task']] + writing_tasks + [editing_task]
        
        # Création et exécution du crew final
        crew = Crew(
            agents=[project_manager, topic_analyst, content_writer, editor],
            tasks=all_tasks,
            process=Process.hierarchical,
            manager_llm=llm,
            verbose=True,
        )

    with st.spinner("Génération de l'exposé..."):
        result = crew.kickoff()
        
        st.success("Exposé généré avec succès!")
        st.markdown(result)