async def request_next_slot( self, output_channel: "OutputChannel", nlg: "NaturalLanguageGenerator", tracker: "DialogueStateTracker", domain: "Domain", ) -> Optional[List[Event]]: """Request the next slot and utter template if needed, else return None""" for slot in self.required_slots(tracker): if type(slot) is dict: return [SlotSet(slot.get("name"), slot.get("value"))] if self._should_request_slot(tracker, slot): template = await nlg.generate( f"utter_ask_{slot}", tracker, output_channel.name(), ) logger.debug(f"Request next slot '{slot}'") return [ create_bot_utterance(template), SlotSet(REQUESTED_SLOT, slot) ] # no more required slots to fill return None
async def utter_post_validation( self, slot, value, valid: bool, output_channel: "OutputChannel", nlg: "NaturalLanguageGenerator", tracker: "DialogueStateTracker", domain: "Domain", ) -> List[Event]: if (valid and self.get_field_for_slot(slot, "utter_on_new_valid_slot", False) is False): return [] utter_what = "valid" if valid else "invalid" # so utter_(in)valid_slot supports {slot} template replacements temp_tracker = tracker.copy() temp_tracker.slots[slot].value = value template = await nlg.generate( f"utter_{utter_what}_{slot}", temp_tracker, output_channel.name(), ) if not template: return [] return [create_bot_utterance(template)]
async def run( self, output_channel: "OutputChannel", nlg: "NaturalLanguageGenerator", tracker: "DialogueStateTracker", domain: "Domain", ) -> List[Event]: message = None for event in list(tracker.events)[::-1]: logger.debug(event) if isinstance(event, SlotSet) and event.key == "disambiguation_message": message = event.value break if not message: return [] template = await nlg.generate( message["template"], tracker, output_channel.name(), ) return [ create_bot_utterance({ "text": template.get("text", ""), "quick_replies": message.get("quick_replies", []) + template.get("quick_replies", []), }) ]
async def run( self, output_channel: "OutputChannel", nlg: "NaturalLanguageGenerator", tracker: "DialogueStateTracker", domain: "Domain", ) -> List[Event]: """Append 'utter_' to intent name and generates from that template""" events = [] response_name = 'utter_' + tracker.latest_message.intent["name"] events += [create_bot_utterance(m) for m in await nlg.generate(response_name, tracker, output_channel.name(), language=output_channel.language)] return events
async def run( self, output_channel: "OutputChannel", nlg: "NaturalLanguageGenerator", tracker: "DialogueStateTracker", domain: "Domain", ) -> List[Event]: message = None for event in list(tracker.events)[::-1]: logger.debug(event) if isinstance(event, SlotSet) and event.key == "disambiguation_message": message = event.value break if message: return [create_bot_utterance({ "text": message["title"], "buttons": message["buttons"] })] else: return []
async def submit( self, output_channel: "OutputChannel", nlg: "NaturalLanguageGenerator", tracker: "DialogueStateTracker", domain: "Domain", ) -> List[Event]: events = [] utter_on_submit = self.form_spec.get("utter_on_submit", False) collect_in_botfront = self.form_spec.get("collect_in_botfront", False) if utter_on_submit: template = await nlg.generate( f"utter_submit_{self.name()}", tracker, output_channel.name(), ) if template: events += [create_bot_utterance(template)] if collect_in_botfront: submit_form_to_botfront(tracker) return events