Hi, I came across the issue that writing custom action for slot mapping in form does not work from my side.
To be more specific, I have a form which requires name, mobile and address. Mobile can be filled directly from single entity written in domain.yml, whereas name and address needs validate_ custom action to fill the slots. Even if I override the required_slots, name and address which are supposed to be asked by utter_ are skipped and filled with None, and only mobile is asked.
Thanks! If you uncomment ADDRESS and NAME in your form the form should prompt you to provide those slots. Are you trying to validate these values meet some criteria after they’ve been provided?
You could handle this in the form design and avoid the slot mapping. On your form instead of NAME you can have the following with separate slots for first and last name that are mapped to the correct name entity and role.
forms:
form_delivery:
first_name:
- type: from_entity
entity: name
role: first_name
last_name:
- type: from_entity
entity: name
role: last_name
This will fill first_name and last_name with whatever name is extracted from your entity. If a first or last name is missing then the user would be prompted for that information.
Then you can have a custom action processing the completed form that could access the slots to construct the whole name, which could be something like:
class ActionMakeDelivery(Action):
"""Processes Delivery Form"""
def name(self) -> Text:
"""Unique identifier of the action"""
return "action_delivery_form"
async def run(
self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any],
) -> List[Dict]:
"""Executes the action"""
full_name = " ".join([tracker.get_slot("first_name"), tracker.get_slot("last_name")])
dispatcher.utter_message(f"Order placed for {full_name}")
return [SlotSet("full_name", full_name)]
Thank you. The method you proposed is very helpful. However, I still have a question regarding how to prompt the user nicely after activating the form. As far as I know, the response utter_ask_<slot_name> is used to prompt the user for the next required slot value, and how should i ask “what is your name” instead of “what is your first name” ? Besides, the same issue happened also to ADDRESS, since I would like to make it consist of street, zipcode and city.