コード例 #1
0
    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
コード例 #2
0
    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)]
コード例 #3
0
 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", []),
         })
     ]
コード例 #4
0
    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
コード例 #5
0
 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 []
コード例 #6
0
 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