def _log_action_on_tracker( self, tracker: DialogueStateTracker, action: Action, events: Optional[List[Event]], prediction: PolicyPrediction, ) -> None: # Ensures that the code still works even if a lazy programmer missed # to type `return []` at the end of an action or the run method # returns `None` for some other reason. if events is None: events = [] self._warn_about_new_slots(tracker, action.name(), events) action_was_rejected_manually = any( isinstance(event, ActionExecutionRejected) for event in events ) if not action_was_rejected_manually: logger.debug(f"Policy prediction ended with events '{prediction.events}'.") tracker.update_with_events(prediction.events, self.domain) # log the action and its produced events tracker.update(action.event_for_successful_execution(prediction)) logger.debug(f"Action '{action.name()}' ended with events '{events}'.") tracker.update_with_events(events, self.domain)
async def _run_action( self, action: rasa.core.actions.action.Action, tracker: DialogueStateTracker, output_channel: OutputChannel, nlg: NaturalLanguageGenerator, prediction: PolicyPrediction, ) -> bool: # events and return values are used to update # the tracker state after an action has been taken try: # Use temporary tracker as we might need to discard the policy events in # case of a rejection. temporary_tracker = tracker.copy() temporary_tracker.update_with_events(prediction.events, self.domain) events = await action.run( output_channel, nlg, temporary_tracker, self.domain ) except rasa.core.actions.action.ActionExecutionRejection: events = [ ActionExecutionRejected( action.name(), prediction.policy_name, prediction.max_confidence ) ] tracker.update(events[0]) return self.should_predict_another_action(action.name()) except Exception: logger.exception( f"Encountered an exception while running action '{action.name()}'." "Bot will continue, but the actions events are lost. " "Please check the logs of your action server for " "more information." ) events = [] self._log_action_on_tracker(tracker, action, events, prediction) if action.name() != ACTION_LISTEN_NAME and not action.name().startswith( UTTER_PREFIX ): self._log_slots(tracker) await self.execute_side_effects(events, tracker, output_channel) return self.should_predict_another_action(action.name())
async def _run_action( self, action, tracker, output_channel, nlg, policy=None, confidence=None, metadata: Optional[Dict[Text, Any]] = None, ) -> bool: # events and return values are used to update # the tracker state after an action has been taken try: # Here we set optional metadata to the ActionSessionStart, which will then # be passed to the SessionStart event. Otherwise the metadata will be lost. if action.name() == ACTION_SESSION_START_NAME: action.metadata = metadata events = await action.run(output_channel, nlg, tracker, self.domain) except rasa.core.actions.action.ActionExecutionRejection: events = [ ActionExecutionRejected(action.name(), policy, confidence) ] tracker.update(events[0]) return self.should_predict_another_action(action.name()) except Exception as e: logger.error( f"Encountered an exception while running action '{action.name()}'. " "Bot will continue, but the actions events are lost. " "Please check the logs of your action server for " "more information.") logger.debug(e, exc_info=True) events = [] self._log_action_on_tracker(tracker, action.name(), events, policy, confidence) if action.name() != ACTION_LISTEN_NAME and not action.name( ).startswith(UTTER_PREFIX): self._log_slots(tracker) await self._send_bot_messages(events, tracker, output_channel) await self._schedule_reminders(events, tracker, output_channel, nlg) await self._cancel_reminders(events, tracker) return self.should_predict_another_action(action.name())
async def _run_action( self, action: rasa.core.actions.action.Action, tracker: DialogueStateTracker, output_channel: OutputChannel, nlg: NaturalLanguageGenerator, policy: Optional[Text] = None, confidence: Optional[float] = None, metadata: Optional[Dict[Text, Any]] = None, ) -> bool: # events and return values are used to update # the tracker state after an action has been taken try: # Here we set optional metadata to the ActionSessionStart, which will then # be passed to the SessionStart event. Otherwise the metadata will be lost. if action.name() == ACTION_SESSION_START_NAME: action.metadata = metadata events = await action.run(output_channel, nlg, tracker, self.domain) except rasa.core.actions.action.ActionExecutionRejection: events = [ ActionExecutionRejected(action.name(), policy, confidence) ] tracker.update(events[0]) return self.should_predict_another_action(action.name()) except Exception: logger.exception( f"Encountered an exception while running action '{action.name()}'." "Bot will continue, but the actions events are lost. " "Please check the logs of your action server for " "more information.") events = [] self._log_action_on_tracker(tracker, action.name(), events, policy, confidence) if action.name() != ACTION_LISTEN_NAME and not action.name( ).startswith(UTTER_PREFIX): self._log_slots(tracker) await self.execute_side_effects(events, tracker, output_channel) return self.should_predict_another_action(action.name())