Hi all,
I’d like to handle the case something went wrong when filling out a form.
In my case I have two requested slots and during the validation of the first one I make and API call to a backend service to retrieve some information.
How can I deactivate my form and block the system to ask for the subsequent requested slot if the API call went wrong?
I’ve read about self.deactivate
but I’m not sure how to use it during validation
Thanks
Hi @GabrieleRomeo!
You can’t do it form the validation function, you need to override the request_next_slot()
method. See below.
From the docs:
In case the slot is filled with something that you are certain can’t be handled and you want to deactivate the form directly, you can overwrite the request_next_slot() method to do so. The example below checks the value of the cuisine slot directly, but you could use any logic you’d like to trigger deactivation:
def request_next_slot(
self,
dispatcher: "CollectingDispatcher",
tracker: "Tracker",
domain: Dict[Text, Any],
) -> Optional[List[EventType]]:
"""Request the next slot and utter template if needed,
else return None"""
for slot in self.required_slots(tracker):
if self._should_request_slot(tracker, slot):
## Condition of validated slot that triggers deactivation
if slot == "cuisine" and tracker.get_slot("cuisine") == "caribbean":
dispatcher.utter_message(text="Sorry, I can't help you with that")
return self.deactivate()
## For all other slots, continue as usual
logger.debug(f"Request next slot '{slot}'")
dispatcher.utter_message(
template=f"utter_ask_{slot}", **tracker.slots
)
return [SlotSet(REQUESTED_SLOT, slot)]
return None
If nothing is extracted from the user’s utterance for any of the required slots, an ActionExecutionRejection error will be raised, meaning the action execution was rejected and therefore Core will fall back onto a different policy to predict another action.
Hi @saurabh-m523
thanks for your reply.
I’ve tried to follow the instructions from the docs and I’ve overwrote the request_next_slot
method but now if all the requested slots are not filled out from the user input at the beginning the chatbot does not ask them anymore
It seems that the utter_message
method is not being triggered
dispatcher.utter_message(
template=f"utter_ask_{slot}", **tracker.slots
)
In my domain.yml
I’ve correctly set all the utter_ask_*
responses
If I remove the request_next_slot
method it works correctly
my fault,
the problem was related to a wrong import of REQUESTED_SLOT
Now it works as expected, cool!
Thanks
1 Like