Spaces:
Runtime error
Runtime error
latest update
Browse files- app.py +47 -3
- scripts/make_request.py +35 -1
- scripts/quiz/questions.py +67 -8
app.py
CHANGED
@@ -15,9 +15,9 @@ from mathtext.sentiment import sentiment
|
|
15 |
from mathtext.text2int import text2int
|
16 |
from pydantic import BaseModel
|
17 |
|
18 |
-
from mathtext_fastapi.logging import prepare_message_data_for_logging
|
19 |
-
from mathtext_fastapi.conversation_manager import manage_conversation_response
|
20 |
-
from mathtext_fastapi.nlu import evaluate_message_with_nlu
|
21 |
|
22 |
app = FastAPI()
|
23 |
|
@@ -269,3 +269,47 @@ async def get_next_level(request: Request):
|
|
269 |
cur_level = message_data['current_level']
|
270 |
level_up = message_data['level_up']
|
271 |
return JSONResponse(utils.get_next_level(cur_level, level_up))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
from mathtext.text2int import text2int
|
16 |
from pydantic import BaseModel
|
17 |
|
18 |
+
# from mathtext_fastapi.logging import prepare_message_data_for_logging
|
19 |
+
# from mathtext_fastapi.conversation_manager import manage_conversation_response
|
20 |
+
# from mathtext_fastapi.nlu import evaluate_message_with_nlu
|
21 |
|
22 |
app = FastAPI()
|
23 |
|
|
|
269 |
cur_level = message_data['current_level']
|
270 |
level_up = message_data['level_up']
|
271 |
return JSONResponse(utils.get_next_level(cur_level, level_up))
|
272 |
+
|
273 |
+
|
274 |
+
@app.post("/score")
|
275 |
+
async def get_next_level(request: Request):
|
276 |
+
"""Depending on current level and desire to level up/down return next level
|
277 |
+
|
278 |
+
Input
|
279 |
+
request.body: json - score argument with value from 0 to 1
|
280 |
+
{
|
281 |
+
"score": 0.1
|
282 |
+
}
|
283 |
+
|
284 |
+
Output
|
285 |
+
number in range 1-495
|
286 |
+
"""
|
287 |
+
data_dict = await request.json()
|
288 |
+
message_data = ast.literal_eval(data_dict.get('message_data', '').get('message_body', ''))
|
289 |
+
score = message_data['score']
|
290 |
+
return JSONResponse(questions.generate_start_by_score(score))
|
291 |
+
|
292 |
+
|
293 |
+
@app.post("/question_new")
|
294 |
+
async def get_next_level(request: Request):
|
295 |
+
"""Depending on current level and desire to level up/down return next level
|
296 |
+
|
297 |
+
Input
|
298 |
+
request.body: json - score argument with value from 0 to 1
|
299 |
+
{
|
300 |
+
"score": 0.1
|
301 |
+
}
|
302 |
+
|
303 |
+
Output
|
304 |
+
number in range 1-495
|
305 |
+
"""
|
306 |
+
data_dict = await request.json()
|
307 |
+
message_data = ast.literal_eval(data_dict.get('message_data', '').get('message_body', ''))
|
308 |
+
start = message_data.get('start', "")
|
309 |
+
start = int(start) if start else start
|
310 |
+
step = message_data.get('step', "")
|
311 |
+
step = int(step) if step else step
|
312 |
+
sequence = message_data.get('sequence', "")
|
313 |
+
question_num = message_data.get('question_num', "")
|
314 |
+
question_num = int(question_num) if question_num else question_num
|
315 |
+
return JSONResponse(questions.generate_question(start, step=step, seq=sequence, question_num=question_num))
|
scripts/make_request.py
CHANGED
@@ -57,7 +57,41 @@ def run_simulated_request(endpoint, sample_answer, context=None):
|
|
57 |
# run_simulated_request('nlu', 'Today is a wonderful day')
|
58 |
# run_simulated_request('nlu', 'IDK 5?')
|
59 |
# run_simulated_request('manager', '')
|
60 |
-
run_simulated_request('manager', 'add')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
# run_simulated_request('manager', 'subtract')
|
62 |
# run_simulated_request('manager', 'exit')
|
63 |
|
|
|
57 |
# run_simulated_request('nlu', 'Today is a wonderful day')
|
58 |
# run_simulated_request('nlu', 'IDK 5?')
|
59 |
# run_simulated_request('manager', '')
|
60 |
+
# run_simulated_request('manager', 'add')
|
61 |
+
# run_simulated_request("question", {
|
62 |
+
# 'number_correct': 0,
|
63 |
+
# 'number_incorrect': 0,
|
64 |
+
# 'level': 'easy'
|
65 |
+
# })
|
66 |
+
# run_simulated_request("hint", {
|
67 |
+
# 'question_numbers': [1,2,3],
|
68 |
+
# 'right_answer': 3,
|
69 |
+
# 'number_correct': 0,
|
70 |
+
# 'number_incorrect': 0,
|
71 |
+
# 'level': 'easy',
|
72 |
+
# 'hints_used': 0
|
73 |
+
# })
|
74 |
+
# run_simulated_request("generate_question", {
|
75 |
+
# 'level': 'medium'
|
76 |
+
# })
|
77 |
+
# run_simulated_request("numbers_by_level", {
|
78 |
+
# 'level': 'medium'
|
79 |
+
# })
|
80 |
+
# run_simulated_request("number_sequence", {
|
81 |
+
# "current_number": 10,
|
82 |
+
# "ordinal_number": 2,
|
83 |
+
# "times": 1
|
84 |
+
# })
|
85 |
+
# run_simulated_request("level", {
|
86 |
+
# "current_level": "hard",
|
87 |
+
# "level_up": False
|
88 |
+
# })
|
89 |
+
run_simulated_request("question_new", {
|
90 |
+
"start": 10,
|
91 |
+
"step": 1,
|
92 |
+
"sequence": "8... 9... 10...",
|
93 |
+
"question_num": 1
|
94 |
+
})
|
95 |
# run_simulated_request('manager', 'subtract')
|
96 |
# run_simulated_request('manager', 'exit')
|
97 |
|
scripts/quiz/questions.py
CHANGED
@@ -2,24 +2,24 @@ import random
|
|
2 |
from typing import Literal
|
3 |
|
4 |
|
5 |
-
def generate_question_data(level: Literal["easy", "medium", "hard"] = "easy"):
|
6 |
"""generate question, its numbers and proper answer"""
|
7 |
|
8 |
nums = generate_numbers_by_level(level)
|
9 |
-
cur_num = nums['current_number']
|
10 |
-
ord_num = nums['ordinal_number']
|
11 |
-
|
12 |
|
13 |
count_up_by_one_questions = [
|
14 |
{
|
15 |
-
"question": f"Let's practice counting. After {cur_num}, what number is next?\n{
|
16 |
"current_number": cur_num,
|
17 |
"ordinal_number": 1,
|
18 |
"times": 1,
|
19 |
"answer": cur_num + 1
|
20 |
}
|
21 |
]
|
22 |
-
seq_up_by_ord = generate_number_sequence(cur_num, ord_num, times=1)
|
23 |
count_up_by_ord_questions = [
|
24 |
{
|
25 |
"question": f"What number comes {ord_num} number after {cur_num}?\n{seq_up_by_ord}",
|
@@ -47,7 +47,7 @@ def generate_question_data(level: Literal["easy", "medium", "hard"] = "easy"):
|
|
47 |
"answer": cur_num + ord_num * times
|
48 |
}
|
49 |
]
|
50 |
-
times_only_seq = generate_number_sequence(cur_num, 1, times)
|
51 |
times_only_questions = [
|
52 |
{
|
53 |
"question": f"Let's count up by {times}s. What number is next if we start from {cur_num}?\n{times_only_seq}",
|
@@ -57,11 +57,70 @@ def generate_question_data(level: Literal["easy", "medium", "hard"] = "easy"):
|
|
57 |
"answer": cur_num + times
|
58 |
}
|
59 |
]
|
|
|
|
|
|
|
60 |
questions = [*count_up_by_one_questions, *count_up_by_ord_questions, *times_only_questions, *times_ord_questions]
|
61 |
random_choice = random.choice(questions)
|
62 |
return random_choice
|
63 |
|
64 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
def generate_numbers_by_level(level: Literal["easy", "medium", "hard"] = "easy"):
|
66 |
"""generate current number, ordinal number and times parameter
|
67 |
|
@@ -72,7 +131,7 @@ def generate_numbers_by_level(level: Literal["easy", "medium", "hard"] = "easy")
|
|
72 |
:param times: the number of times we count up by ordinal number"""
|
73 |
|
74 |
if level == "easy":
|
75 |
-
cur_num = random.randint(
|
76 |
ord_num = random.randint(1, 2)
|
77 |
times = 1
|
78 |
elif level == "medium":
|
|
|
2 |
from typing import Literal
|
3 |
|
4 |
|
5 |
+
def generate_question_data(level: Literal["easy", "medium", "hard"] = "easy", increment=1):
|
6 |
"""generate question, its numbers and proper answer"""
|
7 |
|
8 |
nums = generate_numbers_by_level(level)
|
9 |
+
cur_num = nums['current_number'] # current number
|
10 |
+
ord_num = nums['ordinal_number'] # ordinal number
|
11 |
+
num_seq = generate_number_sequence(cur_num, ord_num, times=increment) # sequence with ord_num = 1, times = 1
|
12 |
|
13 |
count_up_by_one_questions = [
|
14 |
{
|
15 |
+
"question": f"Let's practice counting. After {cur_num}, what number is next?\n{num_seq}",
|
16 |
"current_number": cur_num,
|
17 |
"ordinal_number": 1,
|
18 |
"times": 1,
|
19 |
"answer": cur_num + 1
|
20 |
}
|
21 |
]
|
22 |
+
seq_up_by_ord = generate_number_sequence(cur_num, ord_num, times=1) # sequence with times = 1
|
23 |
count_up_by_ord_questions = [
|
24 |
{
|
25 |
"question": f"What number comes {ord_num} number after {cur_num}?\n{seq_up_by_ord}",
|
|
|
47 |
"answer": cur_num + ord_num * times
|
48 |
}
|
49 |
]
|
50 |
+
times_only_seq = generate_number_sequence(cur_num, 1, times) # sequence with ordinal number = 1
|
51 |
times_only_questions = [
|
52 |
{
|
53 |
"question": f"Let's count up by {times}s. What number is next if we start from {cur_num}?\n{times_only_seq}",
|
|
|
57 |
"answer": cur_num + times
|
58 |
}
|
59 |
]
|
60 |
+
print(f"Let's practice counting {'... '.join([str(num) for num in range(8, 11)])}... After 10, what is the next number you will count?")
|
61 |
+
# Let's practice counting 8... 9... 10... After 10, what is the next number you will count?
|
62 |
+
8, 9, 10
|
63 |
questions = [*count_up_by_one_questions, *count_up_by_ord_questions, *times_only_questions, *times_ord_questions]
|
64 |
random_choice = random.choice(questions)
|
65 |
return random_choice
|
66 |
|
67 |
|
68 |
+
def generate_question(start, step=None, seq=None, question_num=1):
|
69 |
+
"""returns question by provided number with filled parameters
|
70 |
+
|
71 |
+
parameters
|
72 |
+
----------
|
73 |
+
:num: question number
|
74 |
+
:start: current number
|
75 |
+
:step: interval between current and next numbers
|
76 |
+
:seq: sequence of numbers"""
|
77 |
+
convert_sequence_to_string(start, step, )
|
78 |
+
questions = {
|
79 |
+
1: f"Let's practice counting {seq} After {start}, what is the next number you will count?",
|
80 |
+
2: f"What number comes {step} number after {start}?",
|
81 |
+
3: f"We're counting by {step}s. What number is 1 after {start}?",
|
82 |
+
4: f"What is {step} number up from {start}?",
|
83 |
+
5: f"If we could up {step} from {start}, what number is next?",
|
84 |
+
}
|
85 |
+
if step > 1:
|
86 |
+
questions.update({
|
87 |
+
6: f"Now we're counting up by {step} 😄 From {start - 2 * step}, I count {step} numbers to get to {start - step}. Then from {start - step} I count {step} numbers to get to {start}. What is {step} numbers after {start}?",
|
88 |
+
7: f"What is {step} numbers after {start}? Let's count one number ... {start + 1}... now what is the next number?"
|
89 |
+
})
|
90 |
+
return questions[question_num]
|
91 |
+
|
92 |
+
|
93 |
+
def generate_start_by_score(score):
|
94 |
+
"""generate number by scrore
|
95 |
+
|
96 |
+
to calculate the starting point """
|
97 |
+
if score <= 0.3:
|
98 |
+
range_size = 27 - 1 # total range size
|
99 |
+
range_offset = score # offset from the lower end of the range
|
100 |
+
proportion = range_offset / 0.3 # proportion of the total range
|
101 |
+
number_range = int(proportion * range_size) # size of the range based on the argument
|
102 |
+
return random.randint(1, 1 + number_range)
|
103 |
+
elif score >= 0.6:
|
104 |
+
range_size = 495 - 97 # total range size
|
105 |
+
range_offset = score - 0.6 # offset from the lower end of the range
|
106 |
+
proportion = range_offset / (1 - 0.6) # proportion of the total range
|
107 |
+
number_range = int(proportion * range_size) # size of the range based on the argument
|
108 |
+
return random.randint(98, 98 + number_range)
|
109 |
+
else:
|
110 |
+
range_size = 97 - 28 # total range size
|
111 |
+
range_offset = score - 0.3 # offset from the lower end of the range
|
112 |
+
proportion = range_offset / (0.6 - 0.3) # proportion of the total range
|
113 |
+
number_range = int(proportion * range_size) # size of the range based on the argument
|
114 |
+
return random.randint(28, 28 + number_range)
|
115 |
+
|
116 |
+
|
117 |
+
def convert_sequence_to_string(start, step):
|
118 |
+
func_vars = {}
|
119 |
+
exec("seq = ', '.join([str(num) for num in range({start}, {stop}, {step})][::-1])".format(start=start, stop=start-3*step, step=step * (-1)), func_vars)
|
120 |
+
return func_vars['seq']
|
121 |
+
|
122 |
+
|
123 |
+
|
124 |
def generate_numbers_by_level(level: Literal["easy", "medium", "hard"] = "easy"):
|
125 |
"""generate current number, ordinal number and times parameter
|
126 |
|
|
|
131 |
:param times: the number of times we count up by ordinal number"""
|
132 |
|
133 |
if level == "easy":
|
134 |
+
cur_num = random.randint(5, 15)
|
135 |
ord_num = random.randint(1, 2)
|
136 |
times = 1
|
137 |
elif level == "medium":
|