File size: 6,680 Bytes
1dbe103
57b6ed4
b7844e1
 
 
 
 
57b6ed4
 
b7844e1
57b6ed4
 
 
b7844e1
 
57b6ed4
 
 
 
 
 
b7844e1
 
57b6ed4
b7844e1
 
57b6ed4
b7844e1
57b6ed4
 
 
 
 
b7844e1
 
 
57b6ed4
b7844e1
 
57b6ed4
 
 
 
 
 
b7844e1
 
57b6ed4
b7844e1
 
d9ee204
 
 
 
 
 
 
 
 
 
 
57b6ed4
 
b237e11
b7844e1
 
57b6ed4
 
 
 
 
 
 
 
 
b7844e1
57b6ed4
 
 
 
b7844e1
e1feafa
57b6ed4
b7844e1
57b6ed4
 
d9ee204
1dfef26
d9ee204
 
 
 
 
 
 
 
 
 
 
 
 
57b6ed4
 
 
b7844e1
e1feafa
d9ee204
 
 
 
 
1dfef26
 
d9ee204
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b7844e1
 
 
a415b40
b7844e1
d9ee204
57b6ed4
d9ee204
 
57b6ed4
 
e1feafa
a415b40
d9ee204
57b6ed4
d9ee204
 
 
 
 
 
 
 
 
57b6ed4
 
d9ee204
 
b7844e1
57b6ed4
b7844e1
a415b40
57b6ed4
 
 
 
 
 
d9ee204
 
57b6ed4
 
a415b40
b7844e1
d9ee204
b237e11
687de48
57b6ed4
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#fv
from flask import Flask, render_template, request, jsonify
import os
import json
from textwrap import dedent
from crewai import Agent, Crew, Process, Task
from crewai_tools import SerperDevTool
from crewai import LLM
from typing import List

app = Flask(__name__)

# Configuration des clés API
os.environ["GEMINI_API_KEY"] = "AIzaSyCQpoVCdk7h7MvAQKZOUfcnkQYVkHmAKwI"
os.environ["SERPER_API_KEY"] = "9b90a274d9e704ff5b21c0367f9ae1161779b573"

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

# Initialisation de l'outil de recherche
search_tool = SerperDevTool()

# Définition des agents
researcher = Agent(
    role='Chercheur de Sujets',
    goal=dedent("""Trouver les informations les plus pertinentes et précises sur {topic}
    en utilisant l'API SerpApi."""),
    backstory=dedent("""Un chercheur expert spécialisé dans la collecte d'informations sur divers sujets.
    Capable d'utiliser l'API SerpApi pour des recherches précises et efficaces."""),
    tools=[search_tool],
    llm=llm,
    verbose=True,
    allow_delegation=False
)

writer = Agent(
    role='Rédacteur de Flashcards',
    goal=dedent("""Créer des flashcards claires et concises en format question-réponse
    basées sur les informations fournies par le Chercheur."""),
    backstory=dedent("""Un expert en pédagogie et en création de matériel d'apprentissage.
    Capable de transformer des informations complexes en flashcards simples et mémorisables."""),
    llm=llm,
    verbose=True,
    allow_delegation=False
)

quiz_creator = Agent(
    role='Créateur de Quiz',
    goal=dedent("""Créer des questions de quiz à choix multiples basées sur les informations 
    fournies par le Chercheur."""),
    backstory=dedent("""Un expert en évaluation pédagogique spécialisé dans la création 
    de questions de quiz engageantes et éducatives avec différents niveaux de difficulté."""),
    llm=llm,
    verbose=True,
    allow_delegation=False
)

def extract_json_from_result(result_text: str) -> list:
    """Extrait le JSON des résultats de la crew."""
    try:
        json_start = result_text.find('[')
        json_end = result_text.rfind(']') + 1
        if json_start == -1 or json_end == 0:
            raise ValueError("JSON non trouvé dans le résultat")
        
        json_str = result_text[json_start:json_end]
        return json.loads(json_str)
    except (json.JSONDecodeError, ValueError) as e:
        raise ValueError(f"Erreur lors de l'extraction du JSON : {str(e)}")

def research_task(topic: str) -> Task:
    return Task(
        description=dedent(f"""Effectuer une recherche approfondie sur le sujet '{topic}'.
        Compiler les informations les plus pertinentes et les plus récentes."""),
        expected_output="Une liste d'informations pertinentes sur le sujet.",
        agent=researcher
    )

def flashcard_creation_task(research_task: Task) -> Task:
    return Task(
        description=dedent("""Transformer les informations fournies par le Chercheur
        en une série de flashcards au format JSON. Je veux une vingtaine de flashcard robuste et complet avec des questions et des réponses détailler. Chaque flashcard doit avoir une question
        d'un côté et une réponse concise de l'autre.
        le conenu généré est exclusivement en français.
        
        Format JSON attendu:
        [
            {
                "question": "Question 1?",
                "answer": "Réponse 1"
            },
            {
                "question": "Question 2?",
                "answer": "Réponse 2"
            }
        ]
        """),
        expected_output="Une liste de flashcards au format JSON.",
        agent=writer,
        context=[research_task]
    )

def quiz_creation_task(research_task: Task) -> Task:
    return Task(
        description=dedent("""Transformer les informations fournies par le Chercheur
        en une série de questions de quiz à choix multiples au format JSON.
        Créer 10 questions de quiz avec quatre options de réponse pour chaque question,
        dont une seule est correcte. Inclure une explication pour chaque réponse incorrecte.
        le conenu généré est exclusivement en français.
        
        Format JSON attendu:
        [
            {
                "question": "Question 1?",
                "options": ["Option A", "Option B", "Option C", "Option D"],
                "correctAnswer": "Option A",
                "explanation": "Explication de pourquoi cette réponse est correcte"
            },
            {
                "question": "Question 2?",
                "options": ["Option A", "Option B", "Option C", "Option D"],
                "correctAnswer": "Option C",
                "explanation": "Explication de pourquoi cette réponse est correcte"
            }
        ]
        """),
        expected_output="Une liste de questions de quiz au format JSON.",
        agent=quiz_creator,
        context=[research_task]
    )

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/generate', methods=['POST'])
def generate_content():
    topic = request.json.get('topic')
    content_type = request.json.get('type', 'flashcards')  # 'flashcards' ou 'quiz'
    
    if not topic:
        return jsonify({'error': 'Veuillez entrer un sujet.'}), 400

    try:
        # Création de la tâche de recherche
        research = research_task(topic)
        
        # Sélection de la tâche en fonction du type demandé
        if content_type == 'quiz':
            creation_task = quiz_creation_task(research)
            agents = [researcher, quiz_creator]
        else:  # Par défaut: flashcards
            creation_task = flashcard_creation_task(research)
            agents = [researcher, writer]
        
        # Création de la crew
        crew = Crew(
            agents=agents,
            tasks=[research, creation_task],
            process=Process.sequential,
            verbose=True
        )

        # Exécution de la crew
        result = crew.kickoff()
        
        # Extraction du JSON depuis le dernier résultat de tâche
        if result.tasks_output and len(result.tasks_output) > 0:
            last_task_output = result.tasks_output[-1].raw
            content_data = extract_json_from_result(last_task_output)
            return jsonify({'success': True, content_type: content_data})
        else:
            return jsonify({'error': 'Aucun résultat généré par la crew.'}), 500

    except Exception as e:
        return jsonify({'error': str(e)}), 500

if __name__ == '__main__':
    app.run(debug=True)