def test_revert_action_event(default_domain: Domain): tracker = DialogueStateTracker("default", default_domain.slots) # the retrieved tracker should be empty assert len(tracker.events) == 0 intent = {"name": "greet", "confidence": 1.0} tracker.update(ActionExecuted(ACTION_LISTEN_NAME)) tracker.update(UserUttered("/greet", intent, [])) tracker.update(ActionExecuted("my_action")) tracker.update(ActionExecuted(ACTION_LISTEN_NAME)) # Expecting count of 4: # +3 executed actions # +1 final state assert tracker.latest_action.get(ACTION_NAME) == ACTION_LISTEN_NAME assert len(list(tracker.generate_all_prior_trackers())) == 4 tracker.update(ActionReverted()) # Expecting count of 3: # +3 executed actions # +1 final state # -1 reverted action assert tracker.latest_action.get(ACTION_NAME) == "my_action" assert len(list(tracker.generate_all_prior_trackers())) == 3 dialogue = tracker.as_dialogue() recovered = DialogueStateTracker("default", default_domain.slots) recovered.recreate_from_dialogue(dialogue) assert recovered.current_state() == tracker.current_state() assert tracker.latest_action.get(ACTION_NAME) == "my_action" assert len(list(tracker.generate_all_prior_trackers())) == 3
def _create_start_trackers_for_augmentation( self, story_end_trackers: List[TrackerWithCachedStates] ) -> TrackerLookupDict: """This is where the augmentation magic happens. We will reuse all the trackers that reached the end checkpoint `None` (which is the end of a story) and start processing all steps again. So instead of starting with a fresh tracker, the second and all following phases will reuse a couple of the trackers that made their way to a story end. We need to do some cleanup before processing them again. """ next_active_trackers = defaultdict(list) if self.config.use_story_concatenation: ending_trackers = _subsample_array( story_end_trackers, self.config.augmentation_factor, rand=self.config.rand, ) for t in ending_trackers: # this is a nasty thing - all stories end and # start with action listen - so after logging the first # actions in the next phase the trackers would # contain action listen followed by action listen. # to fix this we are going to "undo" the last action listen # tracker should be copied, # otherwise original tracker is updated aug_t = t.copy() aug_t.is_augmented = True aug_t.update(ActionReverted()) next_active_trackers[STORY_START].append(aug_t) return next_active_trackers
def test_json_parse_undo(): evt = {"event": "undo"} assert Event.from_parameters(evt) == ActionReverted()
@pytest.mark.parametrize( "one_event,another_event", [ ( UserUttered("/greet", {"name": "greet", "confidence": 1.0}, []), UserUttered("/goodbye", {"name": "goodbye", "confidence": 1.0}, []), ), (SlotSet("my_slot", "value"), SlotSet("my__other_slot", "value")), (Restarted(), None), (AllSlotsReset(), None), (ConversationPaused(), None), (ConversationResumed(), None), (StoryExported(), None), (ActionReverted(), None), (UserUtteranceReverted(), None), (SessionStarted(), None), (ActionExecuted("my_action"), ActionExecuted("my_other_action")), (FollowupAction("my_action"), FollowupAction("my_other_action")), ( BotUttered("my_text", {"my_data": 1}), BotUttered("my_other_test", {"my_other_data": 1}), ), ( AgentUttered("my_text", "my_data"), AgentUttered("my_other_test", "my_other_data"), ), ( ReminderScheduled("my_intent", datetime.now()), ReminderScheduled("my_other_intent", datetime.now()),
def test_get_last_event_with_reverted(): events = [ActionExecuted("one"), ActionReverted(), user_uttered("two", 1)] tracker = get_tracker(events) assert tracker.get_last_event_for(ActionExecuted) is None
ActionExecutionRejected(action_name="my_action"), LegacyFormValidation(validate=True, timestamp=None), LoopInterrupted(timestamp=None, is_interrupted=False), ActiveLoop(name="loop"), LegacyForm(name="my_form"), AllSlotsReset(), SlotSet(key="my_slot", value={}), SlotSet(key="my slot", value=[]), SlotSet(key="test", value=1), SlotSet(key="test", value="text"), ConversationResumed(), ConversationPaused(), FollowupAction(name="test"), StoryExported(), Restarted(), ActionReverted(), UserUtteranceReverted(), BotUttered(text="Test bot utterance"), UserUttered( parse_data={ "entities": [], "response_selector": { "all_retrieval_intents": [], "chitchat/ask_weather": { "response": {}, "ranking": [] }, }, }), UserUttered( text="hello",