Я пытаюсь создать чат-бота, который в основном состоит из двух задач: Задача 1. Попросите пользователей поделиться своим пин-кодом и выбрать категорию. Получите результаты, используя эти два входа, и отобразите сообщение. Задача 2. 1. После завершения потока - если пользователь говорит «помощь коронавируса» - спросите его, хочет ли он получить их для указанного выше пин-кода, если нет - дайте ему возможность ввести новый пин-код.
Следуйте аналогичной схеме для категории. Например (допустим, пользователь попросил - Бесплатная еда в 600036)
Пользователь: corona help Бот: хотите получить ресурсы для - 600036. Нажмите да, чтобы подтвердить, и нет, чтобы изменить другой пин-код. Пользователь: нет Бот: Пожалуйста, поделитесь пин-кодом. Пользователь: 500081 Бот: Хотите получить «Бесплатную еду» . Нажмите «Да» для подтверждения и «Нет» для изменения. Пользователь: Да. Бот: Показать результаты для 500081 и Free Food.
Я уже выполнил задачу 1, но у меня возникли трудности с задачей 2. Я хочу знать, как задавать вопросы и заполнять необходимые ячейки, если срабатывает конкретное намерение.
Вот мой rules.yml:
version: "2.0"
rules:
- rule: trigger corona help
steps:
- intent: corona_help
- action: action_check_user_intent
- rule: Activate form
steps:
- intent: greet
- action: user_details_form
- active_loop: user_details_form
- rule: Submit form
condition:
# Condition that form is active.
- active_loop: user_details_form
steps:
# Form is deactivated
- action: user_details_form
- active_loop: null
- slot_was_set:
- requested_slot: null
# The actions we want to run when the form is submitted.
- action: action_submit
Actions.py:
class ValidateUserDetailsForm(FormValidationAction):
def name(self) -> Text:
return "validate_user_details_form"
def validate_pin_code(self,
slot_value: Any,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: DomainDict,
) -> Dict[Text, Any]:
print("HERE1")
url = f"https://api.postalpincode.in/pincode/{slot_value}"
r = requests.get(url)
data = json.loads(r.content)
status = data[0]['Status']
print(status)
if status == 'Error':
dispatcher.utter_message(text="Invalid PIN code. Enter again.")
return {"pin_code": None}
else:
return {"pin_code": slot_value}
class ActionCheckUserIntent(Action):
def name(self) -> Text:
return "action_check_user_intent"
def run(
self,
dispatcher,
tracker: Tracker,
domain: "DomainDict",
) -> List[Dict[Text, Any]]:
intent = tracker.latest_message['intent'].get('name')
print(intent)
pin_code = tracker.get_slot("pin_code")
print(pin_code)
category = tracker.get_slot("category")
if intent == "corona_help":
dispatcher.utter_message(response="utter_ask_confirm_pin_code")
return {"confirm_pin_code": None, "confirm_category": None}
class ActionSubmit(Action):
def name(self) -> Text:
return "action_submit"
def run(
self,
dispatcher,
tracker: Tracker,
domain: "DomainDict",
) -> List[Dict[Text, Any]]:
pin_code = tracker.get_slot("pin_code")
category = tracker.get_slot("category")
print("HERE2")
pin_code_url = f"https://api.postalpincode.in/pincode/{pin_code}"
r1 = requests.get(pin_code_url)
data1 = json.loads(r1.content)
city = data1[0]['PostOffice'][0]['District']
print("HERE3")
city_url = "http://ec2-3-23-130-174.us-east-2.compute.amazonaws.com:8000/cities"
r2 = requests.get(city_url)
data2 = json.loads(r2.content)
cities = data2['data']
if city in cities:
city = city.replace(" ", "%20")
category = category.replace(" ", "%20")
print("HERE4")
category_url = f"http://ec2-3-23-130-174.us-east-2.compute.amazonaws.com:8000/resource?city={city}&category={category}"
r = requests.get(category_url)
data = json.loads(r.content)
data = data['data']
print(data)
if not data:
print("HERE5")
dispatcher.utter_message(text="No resources found.")
return []
# return [AllSlotsReset()]
contact = data[0]["contact"]
description = data[0]["description"]
organisation = data[0]["organisation"]
phone = data[0]["phone"]
state = data[0]["state"]
category = category.replace("%20", " ")
dispatcher.utter_message(response="utter_submit",
pin_code=pin_code,
category=category,
contact = contact,
description = description,
organisation = organisation,
phone = phone,
state = state
)
# return [AllSlotsReset()]
# elif intent == "corona_help":
else:
dispatcher.utter_message(text="No resources found.")
# return [AllSlotsReset()]
Есть идеи, как этого добиться?