Spaces:
Runtime error
Runtime error
Greg Thompson
commited on
Commit
•
249f836
1
Parent(s):
63d32ce
Update conversation_manager to handle sending multiple messages
Browse files- app.py +9 -9
- mathtext_fastapi/conversation_manager.py +103 -82
app.py
CHANGED
@@ -55,18 +55,18 @@ async def programmatic_message_manager(request: Request):
|
|
55 |
print(request)
|
56 |
|
57 |
data_dict = await request.json()
|
58 |
-
print("FULL REQUEST")
|
59 |
-
print(data_dict)
|
60 |
|
61 |
-
message_data = data_dict.get('message_data', '')
|
62 |
-
context_data = data_dict.get('context', '')
|
63 |
|
64 |
-
print("MESSAGE_DATA")
|
65 |
-
print(message_data)
|
66 |
-
print("CONTEXT_DATA")
|
67 |
-
print(context_data)
|
68 |
|
69 |
-
context = generate_message(
|
70 |
return JSONResponse(context)
|
71 |
|
72 |
@app.post("/nlu")
|
|
|
55 |
print(request)
|
56 |
|
57 |
data_dict = await request.json()
|
58 |
+
# print("FULL REQUEST")
|
59 |
+
# print(data_dict)
|
60 |
|
61 |
+
# message_data = data_dict.get('message_data', '')
|
62 |
+
# context_data = data_dict.get('context', '')
|
63 |
|
64 |
+
# print("MESSAGE_DATA")
|
65 |
+
# print(message_data)
|
66 |
+
# print("CONTEXT_DATA")
|
67 |
+
# print(context_data)
|
68 |
|
69 |
+
context = generate_message(data_dict)
|
70 |
return JSONResponse(context)
|
71 |
|
72 |
@app.post("/nlu")
|
mathtext_fastapi/conversation_manager.py
CHANGED
@@ -9,7 +9,54 @@ load_dotenv()
|
|
9 |
# os.environ.get('SUPABASE_URL')
|
10 |
|
11 |
|
12 |
-
def
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
""" pending
|
14 |
|
15 |
REQUIREMENTS
|
@@ -25,82 +72,73 @@ def generate_message(data_json, context_data):
|
|
25 |
Need to make util functions that apply to both /nlu and /conversation_manager
|
26 |
"""
|
27 |
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
|
34 |
-
# Send a custom message with buttons
|
35 |
headers = {
|
36 |
'Authorization': f"Bearer {os.environ.get('TURN_AUTHENTICATION_TOKEN')}",
|
37 |
'Content-Type': 'application/json'
|
38 |
}
|
39 |
|
40 |
-
|
|
|
|
|
41 |
|
42 |
-
print("
|
43 |
-
print(
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
|
45 |
-
user_message = data_json['message']['text']['body']
|
46 |
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
"to": whatsapp_id,
|
52 |
-
"type": "text",
|
53 |
-
"text": {
|
54 |
-
"body": "What's 2+2?"
|
55 |
-
}
|
56 |
-
}
|
57 |
-
elif user_message == 'substract':
|
58 |
-
data = {
|
59 |
-
"preview_url": False,
|
60 |
-
"recipient_type": "individual",
|
61 |
-
"to": whatsapp_id,
|
62 |
-
"type": "text",
|
63 |
-
"text": {
|
64 |
-
"body": "What's 1-1?"
|
65 |
-
}
|
66 |
-
}
|
67 |
-
else:
|
68 |
-
data = {
|
69 |
-
"to": whatsapp_id,
|
70 |
-
# "to": "alan",
|
71 |
-
"type": "interactive",
|
72 |
-
"interactive": {
|
73 |
-
"type": "button",
|
74 |
-
# "header": { },
|
75 |
-
"body": {
|
76 |
-
"text": "Please choose one of the following options."
|
77 |
-
},
|
78 |
-
# "footer": { },
|
79 |
-
"action": {
|
80 |
-
"buttons": [
|
81 |
-
{
|
82 |
-
"type": "reply",
|
83 |
-
"reply": {
|
84 |
-
"id": "inquiry-yes",
|
85 |
-
"title": "add"
|
86 |
-
}
|
87 |
-
},
|
88 |
-
{
|
89 |
-
"type": "reply",
|
90 |
-
"reply": {
|
91 |
-
"id": "inquiry-no",
|
92 |
-
"title": "subtract"
|
93 |
-
}
|
94 |
-
}
|
95 |
-
]
|
96 |
-
}
|
97 |
-
}
|
98 |
-
}
|
99 |
|
100 |
|
101 |
# data = {
|
102 |
# "to": whatsapp_id,
|
103 |
-
# # "to": "alan",
|
104 |
# "type": "interactive",
|
105 |
# "interactive": {
|
106 |
# "type": "button",
|
@@ -128,21 +166,4 @@ def generate_message(data_json, context_data):
|
|
128 |
# ]
|
129 |
# }
|
130 |
# }
|
131 |
-
# }
|
132 |
-
|
133 |
-
r = requests.post(f'https://whatsapp.turn.io/v1/messages', data=json.dumps(data), headers=headers)
|
134 |
-
print("==================")
|
135 |
-
print("Headers")
|
136 |
-
print(headers)
|
137 |
-
print("Data")
|
138 |
-
print(data)
|
139 |
-
print("Request Info")
|
140 |
-
print(r)
|
141 |
-
print("--")
|
142 |
-
# print(r.body)
|
143 |
-
print("==================")
|
144 |
-
|
145 |
-
|
146 |
-
context = {"context":{"user":"524754272", "state": "received-and-replied-state"}}
|
147 |
-
|
148 |
-
return context
|
|
|
9 |
# os.environ.get('SUPABASE_URL')
|
10 |
|
11 |
|
12 |
+
def create_text_message(message_text, whatsapp_id):
|
13 |
+
data = {
|
14 |
+
"preview_url": False,
|
15 |
+
"recipient_type": "individual",
|
16 |
+
"to": whatsapp_id,
|
17 |
+
"type": "text",
|
18 |
+
"text": {
|
19 |
+
"body": message_text
|
20 |
+
}
|
21 |
+
}
|
22 |
+
return data
|
23 |
+
|
24 |
+
def create_button_objects(button_options):
|
25 |
+
button_arr = []
|
26 |
+
for option in button_options:
|
27 |
+
button_choice = {
|
28 |
+
"type": "reply",
|
29 |
+
"reply": {
|
30 |
+
"id": "inquiry-yes",
|
31 |
+
"title": "add"
|
32 |
+
}
|
33 |
+
}
|
34 |
+
button_arr.append(button_choice)
|
35 |
+
return button_arr
|
36 |
+
|
37 |
+
def create_interactive_message(message_text, button_options, whatsapp_id):
|
38 |
+
|
39 |
+
button_arr = create_button_objects(button_options)
|
40 |
+
|
41 |
+
data = {
|
42 |
+
"to": whatsapp_id,
|
43 |
+
"type": "interactive",
|
44 |
+
"interactive": {
|
45 |
+
"type": "button",
|
46 |
+
# "header": { },
|
47 |
+
"body": {
|
48 |
+
"text": message_text
|
49 |
+
},
|
50 |
+
# "footer": { },
|
51 |
+
"action": {
|
52 |
+
"buttons": button_arr
|
53 |
+
}
|
54 |
+
}
|
55 |
+
}
|
56 |
+
return data
|
57 |
+
|
58 |
+
|
59 |
+
def generate_message(data_json):
|
60 |
""" pending
|
61 |
|
62 |
REQUIREMENTS
|
|
|
72 |
Need to make util functions that apply to both /nlu and /conversation_manager
|
73 |
"""
|
74 |
|
75 |
+
message_data = data_json.get('message_data', '')
|
76 |
+
context_data = data_json.get('context', '')
|
77 |
+
|
78 |
+
whatsapp_id = message_data['message']['_vnd']['v1']['chat']['owner'].replace("+","")
|
79 |
+
user_message = message_data['message']['text']['body']
|
80 |
+
|
81 |
+
if user_message == '':
|
82 |
+
message_package = {
|
83 |
+
'messages': [],
|
84 |
+
'input_prompt': "Welcome to our math practice. What would you like to try? Type add or subtract.",
|
85 |
+
'state': "welcome-sequence"
|
86 |
+
}
|
87 |
+
elif user_message == 'add':
|
88 |
+
message_package = {
|
89 |
+
'messages': [
|
90 |
+
"Great, let's do some addition",
|
91 |
+
"First, we'll start with single digits.",
|
92 |
+
"Type your response as a number. For example, for '1 + 1', you'd write 2."
|
93 |
+
],
|
94 |
+
'input_prompt': "Here's the first one... What's 2+2?",
|
95 |
+
'state': "add-question-sequence"
|
96 |
+
}
|
97 |
+
elif user_message == 'subtract':
|
98 |
+
message_package = {
|
99 |
+
'messages': [
|
100 |
+
"Time for some subtraction!",
|
101 |
+
"Type your response as a number. For example, for '1 - 1', you'd write 0."
|
102 |
+
],
|
103 |
+
'input_prompt': "Here's the first one... What's 3-1?",
|
104 |
+
'state': "subtract-question-sequence"
|
105 |
+
}
|
106 |
+
else:
|
107 |
+
message_package = {
|
108 |
+
'messages': [
|
109 |
+
"Hmmm...sorry friend. I'm not really sure what to do."
|
110 |
+
],
|
111 |
+
'input_prompt': "Please type add or subtract to start a math activity.",
|
112 |
+
'state': "reprompt-menu-options"
|
113 |
+
}
|
114 |
|
|
|
115 |
headers = {
|
116 |
'Authorization': f"Bearer {os.environ.get('TURN_AUTHENTICATION_TOKEN')}",
|
117 |
'Content-Type': 'application/json'
|
118 |
}
|
119 |
|
120 |
+
for message in message_package['messages']:
|
121 |
+
data = create_text_message(message, whatsapp_id)
|
122 |
+
r = requests.post(f'https://whatsapp.turn.io/v1/messages', data=json.dumps(data), headers=headers)
|
123 |
|
124 |
+
# print("==================")
|
125 |
+
# print("Headers")
|
126 |
+
# print(headers)
|
127 |
+
# print("Data")
|
128 |
+
# print(data)
|
129 |
+
# print("Request Info")
|
130 |
+
# print(r)
|
131 |
+
# print("==================")
|
132 |
|
|
|
133 |
|
134 |
+
context = {"context":{"user": whatsapp_id, "state": message_package['state'], "bot_message": message_package['input_prompt'], "user_message": user_message}}
|
135 |
+
|
136 |
+
return context
|
137 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
138 |
|
139 |
|
140 |
# data = {
|
141 |
# "to": whatsapp_id,
|
|
|
142 |
# "type": "interactive",
|
143 |
# "interactive": {
|
144 |
# "type": "button",
|
|
|
166 |
# ]
|
167 |
# }
|
168 |
# }
|
169 |
+
# }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|