예제 #1
0
    def controller_step(self):
        """Process incoming chats and modify task stack"""
        raw_incoming_chats = self.get_incoming_chats()
        if raw_incoming_chats:
            # force to get objects
            self.perceive(force=True)
        logging.info("Incoming chats: {}".format(raw_incoming_chats))

        incoming_chats = []
        for raw_chat in raw_incoming_chats:
            match = re.search("^<([^>]+)> (.*)", raw_chat)
            if match is None:
                logging.info("Ignoring chat: {}".format(raw_chat))
                continue

            speaker, chat = match.group(1), match.group(2)
            speaker_hash = hash_user(speaker)
            logging.info("Incoming chat: ['{}' -> {}]".format(
                speaker_hash, chat))
            if chat.startswith("/"):
                continue
            incoming_chats.append((speaker, chat))
            self.memory.add_chat(
                self.memory.get_player_by_name(speaker).memid, chat)

        if len(incoming_chats) > 0:
            # change this to memory.get_time() format?
            self.last_chat_time = time.time()
            # for now just process the first incoming chat
            self.dialogue_manager.step(incoming_chats[0])
        else:
            self.dialogue_manager.step((None, ""))
    def handle_logical_form(self, speaker: str, d: Dict, chatstr: str) -> Optional[DialogueObject]:
        """Return the appropriate DialogueObject to handle an action dict "d"

        "d" should have spans resolved by corefs not yet resolved to a specific
        MemoryObject
        """
        coref_resolve(self.agent.memory, d, chatstr)
        logging.info('logical form post-coref "{}" -> {}'.format(hash_user(speaker), d))
        ProgramNode.create(self.agent.memory, d)

        if d["dialogue_type"] == "NOOP":
            return Say("I don't know how to answer that.", **self.dialogue_object_parameters)
        elif d["dialogue_type"] == "HUMAN_GIVE_COMMAND":
            return self.dialogue_objects["interpreter"](
                speaker, d, **self.dialogue_object_parameters
            )
        elif d["dialogue_type"] == "PUT_MEMORY":
            return self.dialogue_objects["put_memory"](
                speaker, d, **self.dialogue_object_parameters
            )
        elif d["dialogue_type"] == "GET_MEMORY":
            logging.info("this model out: %r" % (d))
            logging.info("querying QA model now")
            if self.QA_model:
                QA_model_d = self.get_logical_form(
                    s=chatstr, model=self.QA_model, chat_as_list=True
                )
                logging.info("QA model out: %r" % (QA_model_d))
                if (
                    QA_model_d["dialogue_type"] != "GET_MEMORY"
                ):  # this happens sometimes when new model sayas its an Answer action but previous says noop
                    return Say(
                        "I don't know how to answer that.", **self.dialogue_object_parameters
                    )
                return self.dialogue_objects["get_memory"](
                    speaker, QA_model_d, **self.dialogue_object_parameters
                )
            else:
                return self.dialogue_objects["get_memory"](
                    speaker, d, **self.dialogue_object_parameters
                )
        else:
            raise ValueError("Bad dialogue_type={}".format(d["dialogue_type"]))
예제 #3
0
    def handle_action_dict(self, speaker: str,
                           d: Dict) -> Optional[DialogueObject]:
        """Return the appropriate DialogueObject to handle an action dict "d"

        "d" should have spans resolved by corefs not yet resolved to a specific
        MemoryObject
        """
        coref_resolve(self.agent.memory, d)
        logging.info('ttad post-coref "{}" -> {}'.format(
            hash_user(speaker), d))

        if d["dialogue_type"] == "NOOP":
            return Say("I don't know how to answer that.",
                       **self.dialogue_object_parameters)
        elif d["dialogue_type"] == "HUMAN_GIVE_COMMAND":
            return Interpreter(speaker, d, **self.dialogue_object_parameters)
        elif d["dialogue_type"] == "PUT_MEMORY":
            return PutMemoryHandler(speaker, d,
                                    **self.dialogue_object_parameters)
        elif d["dialogue_type"] == "GET_MEMORY":
            return GetMemoryHandler(speaker, d,
                                    **self.dialogue_object_parameters)
        else:
            raise ValueError("Bad dialogue_type={}".format(d["dialogue_type"]))