Beispiel #1
0
async def test_run_end_to_end_utterance_action():
    end_to_end_utterance = "Hi"

    domain = Domain.from_yaml(
        textwrap.dedent(f"""
    actions:
    - my_action
    {KEY_E2E_ACTIONS}:
    - {end_to_end_utterance}
    - Bye Bye
"""))

    e2e_action = action.action_for_name_or_text("Hi", domain, None)
    events = await e2e_action.run(
        CollectingOutputChannel(),
        TemplatedNaturalLanguageGenerator(domain.templates),
        DialogueStateTracker.from_events("sender", evts=[]),
        domain,
    )

    assert events == [
        BotUttered(
            end_to_end_utterance,
            {
                "elements": None,
                "quick_replies": None,
                "buttons": None,
                "attachment": None,
                "image": None,
                "custom": None,
            },
            {},
        )
    ]
Beispiel #2
0
def test_domain_action_instantiation():
    domain = Domain(
        intents=[{
            "chitchat": {
                "is_retrieval_intent": True
            }
        }],
        entities=[],
        slots=[],
        templates={},
        action_names=["my_module.ActionTest", "utter_test", "utter_chitchat"],
        forms={},
    )

    instantiated_actions = [
        action.action_for_name_or_text(action_name, domain, None)
        for action_name in domain.action_names_or_texts
    ]

    assert len(instantiated_actions) == 14
    assert instantiated_actions[0].name() == ACTION_LISTEN_NAME
    assert instantiated_actions[1].name() == ACTION_RESTART_NAME
    assert instantiated_actions[2].name() == ACTION_SESSION_START_NAME
    assert instantiated_actions[3].name() == ACTION_DEFAULT_FALLBACK_NAME
    assert instantiated_actions[4].name() == ACTION_DEACTIVATE_LOOP_NAME
    assert instantiated_actions[5].name() == ACTION_REVERT_FALLBACK_EVENTS_NAME
    assert instantiated_actions[6].name(
    ) == ACTION_DEFAULT_ASK_AFFIRMATION_NAME
    assert instantiated_actions[7].name() == ACTION_DEFAULT_ASK_REPHRASE_NAME
    assert instantiated_actions[8].name() == ACTION_TWO_STAGE_FALLBACK_NAME
    assert instantiated_actions[9].name() == ACTION_BACK_NAME
    assert instantiated_actions[10].name() == RULE_SNIPPET_ACTION_NAME
    assert instantiated_actions[11].name() == "my_module.ActionTest"
    assert instantiated_actions[12].name() == "utter_test"
    assert instantiated_actions[13].name() == "utter_chitchat"
Beispiel #3
0
    async def _ask_for_slot(
        self,
        domain: Domain,
        nlg: NaturalLanguageGenerator,
        output_channel: OutputChannel,
        slot_name: Text,
        tracker: DialogueStateTracker,
    ) -> List[Event]:
        logger.debug(f"Request next slot '{slot_name}'")

        action_to_ask_for_next_slot = self._name_of_utterance(domain, slot_name)
        if not action_to_ask_for_next_slot:
            # Use a debug log as the user might have asked as part of a custom action
            logger.debug(
                f"There was no action found to ask for slot '{slot_name}' "
                f"name to be filled."
            )
            return []

        action_to_ask_for_next_slot = action.action_for_name_or_text(
            action_to_ask_for_next_slot, domain, self.action_endpoint
        )
        return await action_to_ask_for_next_slot.run(
            output_channel, nlg, tracker, domain
        )
Beispiel #4
0
def test_get_form_action_if_not_in_forms():
    form_action_name = "my_business_logic"
    domain = Domain.from_yaml(
        textwrap.dedent("""
    actions:
    - my_action
    """))

    with pytest.raises(ActionNotFoundException):
        assert not action.action_for_name_or_text(form_action_name, domain,
                                                  None)
Beispiel #5
0
    async def _ask_rephrase(
        self,
        output_channel: OutputChannel,
        nlg: NaturalLanguageGenerator,
        tracker: DialogueStateTracker,
        domain: Domain,
    ) -> List[Event]:
        rephrase = action.action_for_name_or_text(
            ACTION_DEFAULT_ASK_REPHRASE_NAME, domain, self._action_endpoint)

        return await rephrase.run(output_channel, nlg, tracker, domain)
Beispiel #6
0
    async def _ask_affirm(
        self,
        output_channel: OutputChannel,
        nlg: NaturalLanguageGenerator,
        tracker: DialogueStateTracker,
        domain: Domain,
    ) -> List[Event]:
        affirm_action = action.action_for_name_or_text(
            ACTION_DEFAULT_ASK_AFFIRMATION_NAME, domain, self._action_endpoint)

        return await affirm_action.run(output_channel, nlg, tracker, domain)
Beispiel #7
0
    async def _give_up(
        self,
        output_channel: OutputChannel,
        nlg: NaturalLanguageGenerator,
        tracker: DialogueStateTracker,
        domain: Domain,
    ) -> List[Event]:
        fallback = action.action_for_name_or_text(
            ACTION_DEFAULT_FALLBACK_NAME, domain, self._action_endpoint
        )

        return await fallback.run(output_channel, nlg, tracker, domain)
Beispiel #8
0
def test_overridden_form_action():
    form_action_name = "my_business_logic"
    domain = Domain.from_yaml(
        textwrap.dedent(f"""
    actions:
    - my_action
    - {form_action_name}
    forms:
        {form_action_name}:
    """))

    actual = action.action_for_name_or_text(form_action_name, domain, None)
    assert isinstance(actual, RemoteAction)
Beispiel #9
0
def test_get_form_action_with_rasa_open_source_1_forms():
    form_action_name = "my_business_logic"
    with pytest.warns(FutureWarning):
        domain = Domain.from_yaml(
            textwrap.dedent(f"""
        actions:
        - my_action
        forms:
        - {form_action_name}
        """))

    actual = action.action_for_name_or_text(form_action_name, domain, None)
    assert isinstance(actual, RemoteAction)
Beispiel #10
0
def test_get_form_action(slot_mapping: Text):
    form_action_name = "my_business_logic"
    domain = Domain.from_yaml(
        textwrap.dedent(f"""
    actions:
    - my_action
    forms:
      {form_action_name}:
        {slot_mapping}
    """))

    actual = action.action_for_name_or_text(form_action_name, domain, None)
    assert isinstance(actual, FormAction)
Beispiel #11
0
def test_get_end_to_end_utterance_action(end_to_end_utterance: Text):
    domain = Domain.from_yaml(
        textwrap.dedent(f"""
    actions:
    - my_action
    {KEY_E2E_ACTIONS}:
    - {end_to_end_utterance}
    - Bye Bye
"""))

    actual = action.action_for_name_or_text(end_to_end_utterance, domain, None)

    assert isinstance(actual, ActionEndToEndResponse)
    assert actual.name() == end_to_end_utterance