示例#1
0
def test_json_parse_user():
    # DOCS MARKER UserUttered
    evt = \
        {
            'event': 'user',
            'text': 'Hey',
            'parse_data': {
                'intent': {'name': 'greet', 'confidence': 0.9},
                'entities': []
            }
        }
    # DOCS END
    assert Event.from_parameters(evt) == UserUttered("Hey",
                                                     intent={
                                                         "name": "greet",
                                                         "confidence": 0.9
                                                     },
                                                     entities=[],
                                                     parse_data={
                                                         "intent": {
                                                             "name": "greet",
                                                             "confidence": 0.9
                                                         },
                                                         "entities": []
                                                     })
示例#2
0
def test_pushing_events(app, event):
    cid = str(uuid.uuid1())
    conversation = "http://dummy/conversations/{}".format(cid)
    data = json.dumps({"query": "/greet"})
    response = app.post("{}/parse".format(conversation),
                        data=data,
                        content_type='application/json')
    content = response.get_json()
    assert response.status_code == 200

    data = json.dumps({"events": [], "executed_action": "utter_greet"})
    response = app.post("{}/continue".format(conversation),
                        data=data,
                        content_type='application/json')
    content = response.get_json()
    assert response.status_code == 200

    data = json.dumps([event.as_dict()])
    response = app.post("{}/tracker/events".format(conversation),
                        data=data,
                        content_type='application/json')
    content = response.get_json()
    assert response.status_code == 200

    tracker_response = app.get("http://dummy/conversations/{}/tracker"
                               "".format(cid))
    tracker = tracker_response.get_json()
    assert tracker is not None
    assert len(tracker.get("events")) == 5

    evt = tracker.get("events")[4]
    assert Event.from_parameters(evt) == event
示例#3
0
def test_pushing_event(app, event):
    cid = str(uuid.uuid1())
    conversation = "/conversations/{}".format(cid)
    data = json.dumps({"query": "/greet"})
    _, response = app.post("{}/respond".format(conversation),
                           data=data,
                           headers={"Content-Type": "application/json"})
    assert response.json is not None
    assert response.status == 200

    data = json.dumps(event.as_dict())
    _, response = app.post("{}/tracker/events".format(conversation),
                           data=data,
                           headers={"Content-Type": "application/json"})
    assert (response.json is not None)
    assert response.status == 200

    _, tracker_response = app.get("/conversations/{}/tracker"
                                  "".format(cid))
    tracker = tracker_response.json
    assert tracker is not None
    assert len(tracker.get("events")) == 6

    evt = tracker.get("events")[5]
    assert Event.from_parameters(evt) == event
示例#4
0
def test_json_parse_undo():
    # DOCS MARKER ActionReverted
    evt = \
        {
            'event': 'undo',
        }
    # DOCS END
    assert Event.from_parameters(evt) == ActionReverted()
示例#5
0
def test_json_parse_restarted():
    # DOCS MARKER Restarted
    evt = \
        {
            'event': 'restart'
        }
    # DOCS END
    assert Event.from_parameters(evt) == Restarted()
示例#6
0
def test_json_parse_rewind():
    # DOCS MARKER UserUtteranceReverted
    evt = \
        {
            'event': 'rewind'
        }
    # DOCS END
    assert Event.from_parameters(evt) == UserUtteranceReverted()
示例#7
0
def test_json_parse_reset():
    # DOCS MARKER AllSlotsReset
    evt = \
        {
            'event': 'reset_slots'
        }
    # DOCS END
    assert Event.from_parameters(evt) == AllSlotsReset()
示例#8
0
def test_json_parse_export():
    # DOCS MARKER StoryExported
    evt = \
        {
            'event': 'export',
        }
    # DOCS END
    assert Event.from_parameters(evt) == StoryExported()
示例#9
0
def test_json_parse_restarted():
    # DOCS MARKER Restarted
    evt = \
        {
            'event': 'restart'
        }
    # DOCS END
    assert Event.from_parameters(evt) == Restarted()
示例#10
0
def test_json_parse_undo():
    # DOCS MARKER ActionReverted
    evt = \
        {
            'event': 'undo',
        }
    # DOCS END
    assert Event.from_parameters(evt) == ActionReverted()
示例#11
0
def test_json_parse_resume():
    # DOCS MARKER ConversationResumed
    evt = \
        {
            'event': 'resume',
        }
    # DOCS END
    assert Event.from_parameters(evt) == ConversationResumed()
示例#12
0
def test_json_parse_resume():
    # DOCS MARKER ConversationResumed
    evt = \
        {
            'event': 'resume',
        }
    # DOCS END
    assert Event.from_parameters(evt) == ConversationResumed()
示例#13
0
def test_json_parse_export():
    # DOCS MARKER StoryExported
    evt = \
        {
            'event': 'export',
        }
    # DOCS END
    assert Event.from_parameters(evt) == StoryExported()
示例#14
0
def test_json_parse_pause():
    # DOCS MARKER ConversationPaused
    evt = \
        {
            'event': 'pause',
        }
    # DOCS END
    assert Event.from_parameters(evt) == ConversationPaused()
示例#15
0
def test_json_parse_rewind():
    # DOCS MARKER UserUtteranceReverted
    evt = \
        {
            'event': 'rewind'
        }
    # DOCS END
    assert Event.from_parameters(evt) == UserUtteranceReverted()
示例#16
0
def test_json_parse_reset():
    # DOCS MARKER AllSlotsReset
    evt = \
        {
            'event': 'reset_slots'
        }
    # DOCS END
    assert Event.from_parameters(evt) == AllSlotsReset()
示例#17
0
def test_json_parse_pause():
    # DOCS MARKER ConversationPaused
    evt = \
        {
            'event': 'pause',
        }
    # DOCS END
    assert Event.from_parameters(evt) == ConversationPaused()
示例#18
0
def test_json_parse_followup():
    # DOCS MARKER FollowupAction
    evt = \
        {
            'event': 'followup',
            'name': 'my_action'
        }
    # DOCS END
    assert Event.from_parameters(evt) == FollowupAction("my_action")
示例#19
0
def test_json_parse_action():
    # DOCS MARKER ActionExecuted
    evt = \
        {
            'event': 'action',
            'name': 'my_action'
        }
    # DOCS END
    assert Event.from_parameters(evt) == ActionExecuted("my_action")
示例#20
0
def test_json_parse_agent():
    # DOCS MARKER AgentUttered
    evt = \
        {
            'event': 'agent',
            'text': 'Hey, how are you?'
        }
    # DOCS END
    assert Event.from_parameters(evt) == AgentUttered("Hey, how are you?")
示例#21
0
def test_json_parse_agent():
    # DOCS MARKER AgentUttered
    evt = \
        {
            'event': 'agent',
            'text': 'Hey, how are you?'
        }
    # DOCS END
    assert Event.from_parameters(evt) == AgentUttered("Hey, how are you?")
示例#22
0
def test_json_parse_followup():
    # DOCS MARKER FollowupAction
    evt = \
        {
            'event': 'followup',
            'name': 'my_action'
        }
    # DOCS END
    assert Event.from_parameters(evt) == FollowupAction("my_action")
示例#23
0
def test_json_parse_action():
    # DOCS MARKER ActionExecuted
    evt = \
        {
            'event': 'action',
            'name': 'my_action'
        }
    # DOCS END
    assert Event.from_parameters(evt) == ActionExecuted("my_action")
示例#24
0
def test_json_parse_bot():
    # DOCS MARKER BotUttered
    evt = \
        {
            'event': 'bot',
            'text': 'Hey there!',
            'data': {}
        }
    # DOCS END
    assert Event.from_parameters(evt) == BotUttered("Hey there!", {})
示例#25
0
def test_json_parse_bot():
    # DOCS MARKER BotUttered
    evt = \
        {
            'event': 'bot',
            'text': 'Hey there!',
            'data': {}
        }
    # DOCS END
    assert Event.from_parameters(evt) == BotUttered("Hey there!", {})
示例#26
0
def test_json_parse_setslot():
    # DOCS MARKER SetSlot
    evt = \
        {
            'event': 'slot',
            'name': 'departure_airport',
            'value': 'BER',
        }
    # DOCS END
    assert Event.from_parameters(evt) == SlotSet("departure_airport", "BER")
示例#27
0
def convert_obj_2_tracker_events(serialized_events, domain):
    # Example format: {"event": "set_slot", "value": 5, "name": "my_slot"}

    deserialized = []
    for e in serialized_events:
        etype = e.get("event")
        if etype is not None:
            del e["event"]
            deserialized.append(Event.from_parameters(etype, e, domain))
    return deserialized
示例#28
0
def test_json_parse_setslot():
    # DOCS MARKER SetSlot
    evt = \
        {
            'event': 'slot',
            'name': 'departure_airport',
            'value': 'BER',
        }
    # DOCS END
    assert Event.from_parameters(evt) == SlotSet("departure_airport", "BER")
示例#29
0
    def append_event(sender_id):
        """Append a list of events to the state of a conversation"""

        request_params = request.get_json(force=True)
        evt = Event.from_parameters(request_params)
        tracker = agent.tracker_store.get_or_create_tracker(sender_id)
        if evt:
            tracker.update(evt)
            agent.tracker_store.save(tracker)
        else:
            logger.warning(
                "Append event called, but could not extract a "
                "valid event. Request JSON: {}".format(request_params))
        return jsonify(tracker.current_state(EventVerbosity.AFTER_RESTART))
示例#30
0
    def append_event(sender_id):
        """Append a list of events to the state of a conversation"""

        request_params = request.get_json(force=True)
        evt = Event.from_parameters(request_params)
        tracker = agent.tracker_store.get_or_create_tracker(sender_id)
        if evt:
            tracker.update(evt)
            agent.tracker_store.save(tracker)
        else:
            logger.warning(
                    "Append event called, but could not extract a "
                    "valid event. Request JSON: {}".format(request_params))
        return jsonify(tracker.current_state(should_include_events=True))
示例#31
0
def test_json_parse_reminder():
    # DOCS MARKER ReminderScheduled
    evt = \
        {
            'event': 'reminder',
            'action': 'my_action',
            'date_time': '2018-09-03T11:41:10.128172',
            'name': 'my_reminder',
            'kill_on_user_msg': True
        }
    # DOCS END
    assert Event.from_parameters(evt) == ReminderScheduled(
        "my_action",
        parser.parse('2018-09-03T11:41:10.128172'),
        name='my_reminder',
        kill_on_user_message=True)
示例#32
0
def test_json_parse_reminder():
    # DOCS MARKER ReminderScheduled
    evt = \
        {
            'event': 'reminder',
            'action': 'my_action',
            'date_time': '2018-09-03T11:41:10.128172',
            'name': 'my_reminder',
            'kill_on_user_msg': True
        }
    # DOCS END
    assert Event.from_parameters(evt) == ReminderScheduled(
            "my_action",
            parser.parse('2018-09-03T11:41:10.128172'),
            name='my_reminder',
            kill_on_user_message=True)
示例#33
0
def test_file_broker_logs_to_file(tmpdir):
    fname = tmpdir.join("events.log").strpath

    actual = broker.from_endpoint_config(
        EndpointConfig(**{
            "type": "file",
            "path": fname
        }))

    for e in TEST_EVENTS:
        actual.publish(e.as_dict())

    # reading the events from the file one event per line
    recovered = []
    with open(fname, "r") as f:
        for l in f:
            recovered.append(Event.from_parameters(json.loads(l)))

    assert recovered == TEST_EVENTS
示例#34
0
def test_file_broker_properly_logs_newlines(tmpdir):
    fname = tmpdir.join("events.log").strpath

    actual = broker.from_endpoint_config(
        EndpointConfig(**{
            "type": "file",
            "path": fname
        }))

    event_with_newline = UserUttered("hello \n there")

    actual.publish(event_with_newline.as_dict())

    # reading the events from the file one event per line
    recovered = []
    with open(fname, "r") as f:
        for l in f:
            recovered.append(Event.from_parameters(json.loads(l)))

    assert recovered == [event_with_newline]
示例#35
0
    def append_event(sender_id):
        """Append a list of events to the state of a conversation"""

        request_params = request.get_json(force=True)
        evt = Event.from_parameters(request_params)
        tracker = agent.tracker_store.get_or_create_tracker(sender_id)
        verbosity = event_verbosity_parameter(EventVerbosity.AFTER_RESTART)

        if evt:
            tracker.update(evt)
            agent.tracker_store.save(tracker)
            return jsonify(tracker.current_state(verbosity))
        else:
            logger.warning(
                "Append event called, but could not extract a "
                "valid event. Request JSON: {}".format(request_params))
            return error(400, "InvalidParameter",
                         "Couldn't extract a proper event from the request "
                         "body.",
                         {"parameter": "", "in": "body"})
示例#36
0
def test_json_parse_user():
    # DOCS MARKER UserUttered
    evt = \
        {
            'event': 'user',
            'text': 'Hey',
            'parse_data': {
                'intent': {'name': 'greet', 'confidence': 0.9},
                'entities': []
            }
        }
    # DOCS END
    assert Event.from_parameters(evt) == UserUttered(
            "Hey",
            intent={"name": "greet",
                    "confidence": 0.9},
            entities=[],
            parse_data={
                "intent": {"name": "greet", "confidence": 0.9},
                "entities": []
            })
示例#37
0
    async def append_event(request: Request, sender_id: Text):
        """Append a list of events to the state of a conversation"""

        request_params = request.json
        evt = Event.from_parameters(request_params)
        tracker = app.agent.tracker_store.get_or_create_tracker(sender_id)
        verbosity = event_verbosity_parameter(request,
                                              EventVerbosity.AFTER_RESTART)

        if evt:
            tracker.update(evt)
            app.agent.tracker_store.save(tracker)
            return response.json(tracker.current_state(verbosity))
        else:
            logger.warning(
                "Append event called, but could not extract a "
                "valid event. Request JSON: {}".format(request_params))
            raise ErrorResponse(400, "InvalidParameter",
                                "Couldn't extract a proper event from the "
                                "request body.",
                                {"parameter": "", "in": "body"})
示例#38
0
def test_pushing_event(app, event):
    cid = str(uuid.uuid1())
    conversation = "http://dummy/conversations/{}".format(cid)
    data = json.dumps({"query": "/greet"})
    response = app.post("{}/respond".format(conversation),
                        data=data, content_type='application/json')
    content = response.get_json()
    assert response.status_code == 200

    data = json.dumps(event.as_dict())
    response = app.post("{}/tracker/events".format(conversation),
                        data=data, content_type='application/json')
    content = response.get_json()
    assert response.status_code == 200

    tracker_response = app.get("http://dummy/conversations/{}/tracker"
                               "".format(cid))
    tracker = tracker_response.get_json()
    assert tracker is not None
    assert len(tracker.get("events")) == 6

    evt = tracker.get("events")[5]
    assert Event.from_parameters(evt) == event
示例#39
0
from rasa_core.events import (UserUttered, BotUttered, SlotSet, Event,
                              ActionExecuted)
from rasa_core.interpreter import RegexInterpreter
from rasa_core.policies.memoization import AugmentedMemoizationPolicy
from rasa_core.remote import RasaCoreClient, RemoteAgent
from rasa_core.utils import EndpointConfig
from tests.conftest import DEFAULT_STORIES_FILE

# a couple of event instances that we can use for testing
test_events = [
    Event.from_parameters({
        "event": UserUttered.type_name,
        "text": "/goodbye",
        "parse_data": {
            "intent": {
                "confidence": 1.0,
                "name": "greet"
            },
            "entities": []
        }
    }),
    BotUttered("Welcome!", {"test": True}),
    SlotSet("cuisine", 34),
    SlotSet("cuisine", "34"),
    SlotSet("location", None),
    SlotSet("location", [34, "34", None]),
]


@pytest.fixture(scope="module")
def http_app(request, core_server):
示例#40
0
def _chat_history_table(evts):
    # type: (List[Dict[Text, Any]]) -> Text
    """Create a table containing bot and user messages.

    Also includes additional information, like any events and
    prediction probabilities."""
    def wrap(txt, max_width):
        return "\n".join(
            textwrap.wrap(txt, max_width, replace_whitespace=False))

    def colored(txt, color):
        return "{" + color + "}" + txt + "{/" + color + "}"

    def format_user_msg(user_evt, max_width):
        _parsed = user_evt.get('parse_data', {})
        _intent = _parsed.get('intent', {}).get("name")
        _confidence = _parsed.get('intent', {}).get("confidence", 1.0)
        _md = _as_md_message(_parsed)

        _lines = [
            colored(wrap(_md, max_width), "hired"),
            "intent: {} {:03.2f}".format(_intent, _confidence)
        ]
        return "\n".join(_lines)

    def bot_width(_table):
        # type: (AsciiTable) -> int
        return _table.column_max_width(1)

    def user_width(_table):
        # type: (AsciiTable) -> int
        return _table.column_max_width(3)

    def add_bot_cell(data, cell):
        data.append([len(data), Color(cell), "", ""])

    def add_user_cell(data, cell):
        data.append([len(data), "", "", Color(cell)])

    # prints the historical interactions between the bot and the user,
    # to help with correctly identifying the action
    table_data = [
        [
            "#  ",
            Color(colored('Bot      ', 'autoblue')), "  ",
            Color(colored('You       ', 'hired'))
        ],
    ]

    table = SingleTable(table_data, 'Chat History')

    bot_column = []
    for idx, evt in enumerate(evts):
        if evt.get("event") == "action":
            bot_column.append(colored(evt['name'], 'autocyan'))
            if evt['confidence'] is not None:
                bot_column[-1] += (colored(
                    " {:03.2f}".format(evt['confidence']), 'autowhite'))

        elif evt.get("event") == 'user':
            if bot_column:
                text = "\n".join(bot_column)
                add_bot_cell(table_data, text)
                bot_column = []

            msg = format_user_msg(evt, user_width(table))
            add_user_cell(table_data, msg)

        elif evt.get("event") == "bot":
            wrapped = wrap(format_bot_output(evt), bot_width(table))
            bot_column.append(colored(wrapped, 'autoblue'))

        elif evt.get("event") != "bot":
            e = Event.from_parameters(evt)
            bot_column.append(wrap(e.as_story_string(), bot_width(table)))

    if bot_column:
        text = "\n".join(bot_column)
        add_bot_cell(table_data, text)

    table.inner_heading_row_border = False
    table.inner_row_border = True
    table.inner_column_border = False
    table.outer_border = False
    table.justify_columns = {0: 'left', 1: 'left', 2: 'center', 3: 'right'}

    return table.table
示例#41
0
def test_dict_serialisation(one_event, default_domain):
    evt_dict = one_event.as_dict()
    recovered_event = Event.from_parameters(evt_dict)
    assert hash(one_event) == hash(recovered_event)
示例#42
0
from rasa_core.channels import CollectingOutputChannel
from rasa_core.domain import Domain
from rasa_core.events import (
    UserUttered, BotUttered, SlotSet, Event, ActionExecuted)
from rasa_core.interpreter import RegexInterpreter
from rasa_core.policies.memoization import AugmentedMemoizationPolicy
from rasa_core.remote import RasaCoreClient
from rasa_core.utils import EndpointConfig
from tests.conftest import DEFAULT_STORIES_FILE

# a couple of event instances that we can use for testing
test_events = [
    Event.from_parameters({"event": UserUttered.type_name,
                           "text": "/goodbye",
                           "parse_data": {
                               "intent": {
                                   "confidence": 1.0, "name": "greet"},
                               "entities": []}
                           }),
    BotUttered("Welcome!", {"test": True}),
    SlotSet("cuisine", 34),
    SlotSet("cuisine", "34"),
    SlotSet("location", None),
    SlotSet("location", [34, "34", None]),
]


@pytest.fixture(scope="module")
def app(core_server):
    return core_server.test_client()
示例#43
0
def test_dict_serialisation(one_event):
    evt_dict = one_event.as_dict()
    recovered_event = Event.from_parameters(evt_dict)
    assert hash(one_event) == hash(recovered_event)