dav74 commited on
Commit
2227115
·
verified ·
1 Parent(s): 52466b4

Delete main.py

Browse files
Files changed (1) hide show
  1. main.py +0 -168
main.py DELETED
@@ -1,168 +0,0 @@
1
- import os
2
- from dotenv import load_dotenv
3
- from langchain_core.output_parsers import StrOutputParser
4
- from langchain_core.prompts import PromptTemplate
5
- from langgraph.checkpoint.memory import MemorySaver
6
- from typing import List
7
- from typing_extensions import TypedDict
8
- from typing import Annotated
9
- from langgraph.graph.message import AnyMessage, add_messages
10
- from langchain_core.messages import HumanMessage, AIMessage
11
- from langgraph.graph import END, StateGraph, START
12
- from fastapi import FastAPI
13
- from fastapi.middleware.cors import CORSMiddleware
14
- from pydantic import BaseModel
15
- from database import create_table, return_title, return_exercise, return_mot_cle, return_niveau
16
- import logging
17
- from langchain_google_genai import ChatGoogleGenerativeAI
18
-
19
- create_table()
20
- logging.basicConfig(
21
- format="%(asctime)s - %(levelname)s - %(message)s",
22
- level=logging.INFO
23
- )
24
-
25
- GOOGLE_API_KEY = ''
26
-
27
- llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash", temperature=0.7)
28
-
29
-
30
- prompt_aide = PromptTemplate.from_template(
31
- """
32
- Tu es un expert en pédagogie de l'apprentissage de la programmation
33
- Le langage utilisé pour l'apprentissage de la programmation est Python.
34
- Tu dois aider un élève à résoudre un exercice de programmation Python.
35
- Tu ne dois jamais donner la solution de l'exercice (même partiellement) à l'élève, juste lui donner des inddications lui permettant de résoudre lui même l'exercice
36
- Tu dois t'adresser directement à l'élève.
37
- L'élève ne peut pas te poser des questions, il peut juste te proposer son code.
38
- Tu ne dois pas proposer à l'élève de te poser des questions
39
- Il est inutile de proposer à l'élève de tester son code avec les exemples proposés.
40
- Tu ne dois pas proposer aux élèves des modifications du programme qui sorte du cadre de l'exercice. Par exemple, pour l'exercice qui demande d'écrire une fonction moyenne, si dans l'énoncé il est précisé que l'on a un tableau non vide d'entier en paramètre, il est inutile de dire à l'élève que son programme doit gérer les tableaux vides.
41
- Tu dois t'exprimer en français
42
- Voici l'énoncé de l'exercice :
43
- {enonce}
44
- Voici le programme proposé par l'élève pour résoudre l'exercice :
45
- {code}
46
- Pour améliorer ta réponse, tu as aussi à ta disposition l'historique des différents programme proposés par l'élève et les différents conseils que tu lui a déjà donné :
47
- {historique}
48
- """)
49
-
50
- prompt_bilan = PromptTemplate.from_template(
51
- """
52
- Tu es un expert en pédagogie de l'apprentissage de la programmation
53
- Le langage utilisé pour l'apprentissage de la programmation est Python.
54
- Ton rôle est de proposer un bilan sur la résolution d'un exercice réaliser par un élève.
55
- Tu dois t'adresser directement à l'élève.
56
- Cet élève vient de réussir l'exercice suivant :
57
- {enonce}
58
- Voici l'historique de la résolution de cet exercice (code de l'élève et conseil donnés par un expert)
59
- {historique}
60
- Tu dois faire un bilan sur les points forts de l'élève et les points à travailler
61
- Ton bilan doit absolument être cohérent. Il vaut mieux ne rien mettre que de mettre une information inutile
62
- Tu dois proposer à l'élève un autre exercice à résoudre parmi les exercices ci-dessous (pour chaque exercice tu as le titre de l'exercice, une liste de mots clé et un niveau allant de 1 à 4 (le niveau 1 étant le plus facile et le niveau 4 le plus difficile)) :
63
- Tu ne dois UNIQUEMENT proposer un exercice appartenant à la liste ci-dessous.
64
- Tu dois donner uniquement le titre et le numéro de l'exercice que tu proposes à l'élèves (inutile d'indiquer les mots clé liés à l'exercice)
65
- Tu ne dois pas proposer l'exercice qui vient d'être résolu sauf si tu considères que l'élève n'a pas respecté les consignes données dans l'énoncé, à ce moment, tu dois lui demander de refaire l'exercice.
66
- Quand l'élève a réussi un exercice tu dois lui proposer un exercice plus difficile (avec un niveau supérieur)
67
- ### LISTE DES EXERCICES
68
- {mot_cle}
69
- """)
70
-
71
-
72
- descr_exo = ""
73
- lst_titre = return_title()
74
- lst_niveau = return_niveau()
75
- lst_mot_cle = return_mot_cle()
76
- for i in range(len(lst_niveau)):
77
- descr_exo += f"Exercie n° {lst_mot_cle[i]['id']} => titre : {lst_titre[i]['title']} ; mots clé : {lst_mot_cle[i]['mot_cle']} ; niveau : {lst_niveau[i]['niveau']}\n"
78
-
79
- def history(hist):
80
- historical = ""
81
- for i in range(len(hist)):
82
- if i%2 == 0:
83
- historical += "code de l'éléve : \n"+hist[i].content+"\n"
84
- else :
85
- historical += "aide de l'expert : \n"+hist[i].content+"\n"
86
- return historical
87
-
88
- memory = MemorySaver()
89
- app = FastAPI()
90
-
91
- app.add_middleware(
92
- CORSMiddleware,
93
- allow_origins=["*"],
94
- allow_credentials=True,
95
- allow_methods=["*"],
96
- allow_headers=["*"],
97
- )
98
-
99
- class Request(BaseModel):
100
- id : str
101
- enonce : str
102
- code : str
103
- res_test : str
104
-
105
- class AgentState(TypedDict):
106
- enonce : str
107
- messages: Annotated[list[AnyMessage], add_messages]
108
- res_test : str
109
-
110
- def routeur(state : AgentState):
111
- if state['res_test'] == "1" or state['res_test'] == "0":
112
- return "aide"
113
- else :
114
- return "bilan"
115
-
116
- def aide(state : AgentState):
117
- llm_aide = prompt_aide | llm | StrOutputParser()
118
- response = llm_aide.invoke({'enonce': state['enonce'], 'code' : state['messages'][-1].content, 'historique' : history(state['messages'])})
119
- return {"messages": [AIMessage(content=response)]}
120
-
121
- def bilan(state : AgentState):
122
- llm_bilan = prompt_bilan | llm | StrOutputParser()
123
- response = llm_bilan.invoke({'enonce': state['enonce'], 'historique' : history(state['messages']), 'mot_cle': descr_exo})
124
- return {"messages": [AIMessage(content=response)]}
125
-
126
- workflow = StateGraph(AgentState)
127
-
128
- workflow.add_node("aide", aide)
129
- workflow.add_node("bilan", bilan)
130
-
131
- workflow.add_conditional_edges(
132
- START,
133
- routeur,
134
- {
135
- "aide": "aide",
136
- "bilan": "bilan"
137
- })
138
- workflow.add_edge( "aide",END)
139
- workflow.add_edge( "bilan",END)
140
- graph = workflow.compile(checkpointer=memory)
141
-
142
- @app.post('/request')
143
- def request(req: Request):
144
- config = {"configurable": {"thread_id": req.id}}
145
- rep = graph.invoke({"enonce" : req.enonce,"messages": req.code, "res_test" : req.res_test},config , stream_mode="values")
146
- logging.info(rep['messages'][-1].content)
147
- return {"response":rep['messages'][-1].content}
148
-
149
-
150
- @app.get('/title')
151
- def get_title():
152
- tab_title = return_title()
153
- return {"title":tab_title}
154
-
155
- @app.get('/exercise/{id}')
156
- def get_exercise(id : int):
157
- ex = return_exercise(id)
158
- logging.info(f"Endpoint /exercise/{id} called")
159
- return {"title" : ex[1].replace("\n",""), "enonce" : ex[4], "test": ex[5]}
160
-
161
-
162
-
163
-
164
-
165
-
166
-
167
-
168
-