Skip to content

Commit

Permalink
Merge pull request #4855 from RasaHQ/sdk-fixes
Browse files Browse the repository at this point in the history
Sdk fixes
  • Loading branch information
wochinge committed Nov 27, 2019
2 parents 0452099 + 31bc89b commit 74854b7
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 14 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ Fixed
- End to end stories now support literal payloads which specify entities, e.g.
``greet: /greet{"name": "John"}``
- Slots will be correctly interpolated if there are lists in custom response templates.
- Fixed compatibility issues with ``rasa-sdk`` ``1.5``

[1.5.0] - 2019-11-26
^^^^^^^^^^^^^^^^^^^^
Expand Down
23 changes: 11 additions & 12 deletions rasa/core/actions/action.py
Original file line number Diff line number Diff line change
Expand Up @@ -406,28 +406,26 @@ async def _utter_responses(

bot_messages = []
for response in responses:
if "template" in response:
kwargs = response.copy()
del kwargs["template"]
template = response.pop("template", None)
if template:
draft = await nlg.generate(
response["template"], tracker, output_channel.name(), **kwargs
template, tracker, output_channel.name(), **response
)
if not draft:
continue

del response["template"]
else:
draft = {}

if "buttons" in response:
if "buttons" not in draft:
draft["buttons"] = []
draft["buttons"].extend(response["buttons"])
del response["buttons"]
buttons = response.pop("buttons", []) or []
if buttons:
draft.setdefault("buttons", [])
draft["buttons"].extend(buttons)

# Avoid overwriting `draft` values with empty values
response = {k: v for k, v in response.items() if v}
draft.update(response)

bot_messages.append(create_bot_utterance(draft))

return bot_messages

async def run(self, output_channel, nlg, tracker, domain) -> List[Event]:
Expand All @@ -452,6 +450,7 @@ async def run(self, output_channel, nlg, tracker, domain) -> List[Event]:
response = await self.action_endpoint.request(
json=json_body, method="post", timeout=DEFAULT_REQUEST_TIMEOUT
)

self._validate_action_result(response)

events_json = response.get("events", [])
Expand Down
54 changes: 52 additions & 2 deletions tests/core/test_actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
RemoteAction,
)
from rasa.core.domain import Domain, InvalidDomain
from rasa.core.events import Restarted, SlotSet, UserUtteranceReverted, BotUttered
from rasa.core.events import Restarted, SlotSet, UserUtteranceReverted, BotUttered, Form
from rasa.core.nlg.template import TemplatedNaturalLanguageGenerator
from rasa.core.trackers import DialogueStateTracker
from rasa.utils.endpoints import ClientResponseError, EndpointConfig
Expand Down Expand Up @@ -168,7 +168,11 @@ async def test_remote_action_logs_events(
response = {
"events": [{"event": "slot", "value": "rasa", "name": "name"}],
"responses": [
{"text": "test text", "buttons": [{"title": "cheap", "payload": "cheap"}]},
{
"text": "test text",
"template": None,
"buttons": [{"title": "cheap", "payload": "cheap"}],
},
{"template": "utter_greet"},
],
}
Expand Down Expand Up @@ -216,6 +220,52 @@ async def test_remote_action_logs_events(
assert events[2] == SlotSet("name", "rasa")


async def test_remote_action_utterances_with_none_values(
default_channel, default_tracker, default_domain
):
endpoint = EndpointConfig("https://example.com/webhooks/actions")
remote_action = action.RemoteAction("my_action", endpoint)

response = {
"events": [
{"event": "form", "name": "restaurant_form", "timestamp": None},
{
"event": "slot",
"timestamp": None,
"name": "requested_slot",
"value": "cuisine",
},
],
"responses": [
{
"text": None,
"buttons": None,
"elements": [],
"custom": None,
"template": "utter_ask_cuisine",
"image": None,
"attachment": None,
}
],
}

nlg = TemplatedNaturalLanguageGenerator(
{"utter_ask_cuisine": [{"text": "what dou want to eat?"}]}
)
with aioresponses() as mocked:
mocked.post("https://example.com/webhooks/actions", payload=response)

events = await remote_action.run(
default_channel, nlg, default_tracker, default_domain
)

assert events == [
BotUttered("what dou want to eat?"),
Form("restaurant_form"),
SlotSet("requested_slot", "cuisine"),
]


async def test_remote_action_without_endpoint(
default_channel, default_nlg, default_tracker, default_domain
):
Expand Down

0 comments on commit 74854b7

Please sign in to comment.