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"]))
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"]))