Docfile commited on
Commit
313ca41
·
verified ·
1 Parent(s): 61bdcc2

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +119 -0
app.py ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, render_template, request, jsonify
2
+ import os
3
+ import json
4
+ from textwrap import dedent
5
+ from crewai import Agent, Crew, Process, Task
6
+ from crewai_tools import SerperDevTool
7
+ from crewai import LLM
8
+ from typing import List
9
+
10
+ app = Flask(__name__)
11
+
12
+ # Configuration des clés API
13
+ os.environ["GEMINI_API_KEY"] = os.environ.get("GEMINI_API_KEY")
14
+ os.environ["SERPER_API_KEY"] = os.environ.get("SERPER_API_KEY")
15
+
16
+ llm = LLM(
17
+ model="gemini/gemini-1.5-flash",
18
+ temperature=0.7,
19
+ timeout=120,
20
+ max_tokens=8000,
21
+ )
22
+
23
+ # Initialisation de l'outil de recherche
24
+ search_tool = SerperDevTool()
25
+
26
+ # Définition des agents
27
+ researcher = Agent(
28
+ role='Chercheur de Sujets',
29
+ goal=dedent("""Trouver les informations les plus pertinentes et précises sur {topic}
30
+ en utilisant l'API SerpApi."""),
31
+ backstory=dedent("""Un chercheur expert spécialisé dans la collecte d'informations sur divers sujets.
32
+ Capable d'utiliser l'API SerpApi pour des recherches précises et efficaces."""),
33
+ tools=[search_tool],
34
+ llm=llm,
35
+ verbose=True,
36
+ allow_delegation=False
37
+ )
38
+
39
+ writer = Agent(
40
+ role='Rédacteur de Flashcards',
41
+ goal=dedent("""Créer des flashcards claires et concises en format question-réponse
42
+ basées sur les informations fournies par le Chercheur."""),
43
+ backstory=dedent("""Un expert en pédagogie et en création de matériel d'apprentissage.
44
+ Capable de transformer des informations complexes en flashcards simples et mémorisables."""),
45
+ llm=llm,
46
+ verbose=True,
47
+ allow_delegation=False
48
+ )
49
+
50
+ def extract_json_from_result(result_text: str) -> list:
51
+ """Extrait le JSON des résultats de la crew."""
52
+ try:
53
+ json_start = result_text.find('[')
54
+ json_end = result_text.rfind(']') + 1
55
+ if json_start == -1 or json_end == 0:
56
+ raise ValueError("JSON non trouvé dans le résultat")
57
+
58
+ json_str = result_text[json_start:json_end]
59
+ return json.loads(json_str)
60
+ except (json.JSONDecodeError, ValueError) as e:
61
+ raise ValueError(f"Erreur lors de l'extraction du JSON : {str(e)}")
62
+
63
+ def research_task(topic: str) -> Task:
64
+ return Task(
65
+ description=dedent(f"""Effectuer une recherche approfondie sur le sujet '{topic}'.
66
+ Compiler les informations les plus pertinentes et les plus récentes."""),
67
+ expected_output="Une liste d'informations pertinentes sur le sujet.",
68
+ agent=researcher
69
+ )
70
+
71
+ def flashcard_creation_task(research_task: Task) -> Task:
72
+ return Task(
73
+ description=dedent("""Transformer les informations fournies par le Chercheur
74
+ en une série de flashcards au format JSON. Chaque flashcard doit avoir une question
75
+ d'un côté et une réponse concise de l'autre."""),
76
+ expected_output="Une liste de flashcards au format JSON.",
77
+ agent=writer,
78
+ context=[research_task]
79
+ )
80
+
81
+ @app.route('/')
82
+ def index():
83
+ return render_template('index.html')
84
+
85
+ @app.route('/generate', methods=['POST'])
86
+ def generate_flashcards():
87
+ topic = request.json.get('topic')
88
+ if not topic:
89
+ return jsonify({'error': 'Veuillez entrer un sujet.'}), 400
90
+
91
+ try:
92
+ # Création des tâches
93
+ research = research_task(topic)
94
+ flashcard_creation = flashcard_creation_task(research)
95
+
96
+ # Création de la crew
97
+ crew = Crew(
98
+ agents=[researcher, writer],
99
+ tasks=[research, flashcard_creation],
100
+ process=Process.sequential,
101
+ verbose=True
102
+ )
103
+
104
+ # Exécution de la crew
105
+ result = crew.kickoff()
106
+
107
+ # Extraction du JSON depuis le dernier résultat de tâche
108
+ if result.tasks_output and len(result.tasks_output) > 0:
109
+ last_task_output = result.tasks_output[-1].raw
110
+ flashcards = extract_json_from_result(last_task_output)
111
+ return jsonify({'success': True, 'flashcards': flashcards})
112
+ else:
113
+ return jsonify({'error': 'Aucun résultat généré par la crew.'}), 500
114
+
115
+ except Exception as e:
116
+ return jsonify({'error': str(e)}), 500
117
+
118
+ if __name__ == '__main__':
119
+ app.run(debug=True)