Skip to content

Commit bca1c0d

Browse files
authored
Merge branch '2.0.x' into #5974/restart_action_doesnt_run_session_start
2 parents f93192b + 9690842 commit bca1c0d

File tree

7 files changed

+62
-56
lines changed

7 files changed

+62
-56
lines changed

CHANGELOG.mdx

+9
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,15 @@ https://github.com/RasaHQ/rasa/tree/master/changelog/ . -->
1616

1717
<!-- TOWNCRIER -->
1818

19+
## [2.0.6] - 2020-11-10
20+
21+
22+
### Bugfixes
23+
- [#6629](https://github.com/rasahq/rasa/issues/6629): Fixed a bug that occurred when setting multiple Sanic workers in combination with a custom [Lock Store](lock-stores.mdx). Previously, if the number was set higher than 1 and you were using a custom lock store, it would reject because of a strict check to use a [Redis Lock Store](lock-stores.mdx#redislockstore).
24+
- [#7176](https://github.com/rasahq/rasa/issues/7176): Fixed a bug in the [`TwoStageFallback`](fallback-handoff.mdx#two-stage-fallback) action which
25+
reverted too many events after the user successfully rephrased.
26+
27+
1928
## [2.0.5] - 2020-11-10
2029

2130

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ exclude = "((.eggs | .git | .pytest_cache | build | dist))"
99

1010
[tool.poetry]
1111
name = "rasa"
12-
version = "2.0.5"
12+
version = "2.0.6"
1313
description = "Open source machine learning framework to automate text- and voice-based conversations: NLU, dialogue management, connect to Slack, Facebook, and more - Create chatbots and voice assistants"
1414
authors = [ "Rasa Technologies GmbH <hi@rasa.com>",]
1515
maintainers = [ "Tom Bocklisch <tom@rasa.com>",]

rasa/core/actions/two_stage_fallback.py

+5-26
Original file line numberDiff line numberDiff line change
@@ -102,31 +102,8 @@ async def deactivate(
102102
if _two_fallbacks_in_a_row(tracker) or _second_affirmation_failed(tracker):
103103
return await self._give_up(output_channel, nlg, tracker, domain)
104104

105-
return await self._revert_fallback_events(
106-
output_channel, nlg, tracker, domain, events_so_far
107-
) + _message_clarification(tracker)
108-
109-
async def _revert_fallback_events(
110-
self,
111-
output_channel: OutputChannel,
112-
nlg: NaturalLanguageGenerator,
113-
tracker: DialogueStateTracker,
114-
domain: Domain,
115-
events_so_far: List[Event],
116-
) -> List[Event]:
117-
revert_events = [UserUtteranceReverted(), UserUtteranceReverted()]
118-
119-
temp_tracker = DialogueStateTracker.from_events(
120-
tracker.sender_id, tracker.applied_events() + events_so_far + revert_events
121-
)
122-
123-
while temp_tracker.latest_message and not await self.is_done(
124-
output_channel, nlg, temp_tracker, domain, []
125-
):
126-
temp_tracker.update(revert_events[-1])
127-
revert_events.append(UserUtteranceReverted())
128-
129-
return revert_events
105+
# revert fallback events
106+
return [UserUtteranceReverted()] + _message_clarification(tracker)
130107

131108
async def _give_up(
132109
self,
@@ -163,7 +140,9 @@ def _last_n_intent_names(
163140
intent_names = []
164141
for i in range(number_of_last_intent_names):
165142
message = tracker.get_last_event_for(
166-
UserUttered, skip=i, event_verbosity=EventVerbosity.AFTER_RESTART
143+
(UserUttered, UserUtteranceReverted),
144+
skip=i,
145+
event_verbosity=EventVerbosity.AFTER_RESTART,
167146
)
168147
if isinstance(message, UserUttered):
169148
intent_names.append(message.intent.get("name"))

rasa/core/channels/slack.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,9 @@ def _raise_deprecation_warnings(self) -> None:
205205
rasa.shared.utils.io.raise_deprecation_warning(
206206
"Your slack bot is missing a configured signing secret. Running a "
207207
"bot without a signing secret is deprecated and will be removed in "
208-
"the next release (2.1.0). You should add a `slack_signing_secret` "
208+
"the next release (2.2.0). You should add a `slack_signing_secret` "
209209
"parameter to your channel configuration.",
210-
warn_until_version="2.1.0",
210+
warn_until_version="2.2.0",
211211
docs=DOCS_URL_CONNECTORS_SLACK,
212212
)
213213

rasa/shared/core/trackers.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -663,7 +663,7 @@ def export_stories_to_file(self, export_path: Text = "debug_stories.yml") -> Non
663663

664664
def get_last_event_for(
665665
self,
666-
event_type: Type[Event],
666+
event_type: Union[Type[Event], Tuple[Type, ...]],
667667
action_names_to_exclude: List[Text] = None,
668668
skip: int = 0,
669669
event_verbosity: EventVerbosity = EventVerbosity.APPLIED,

rasa/version.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# this file will automatically be changed,
22
# do not add anything but the version number here!
3-
__version__ = "2.0.5"
3+
__version__ = "2.0.6"

tests/core/actions/test_two_stage_fallback.py

+43-25
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
import pytest
44

5+
from rasa.core.processor import MessageProcessor
56
from rasa.shared.constants import DEFAULT_NLU_FALLBACK_INTENT_NAME
67
from rasa.core.actions.two_stage_fallback import TwoStageFallbackAction
78
from rasa.core.channels import CollectingOutputChannel
89
from rasa.shared.core.domain import Domain
910
from rasa.shared.core.events import (
1011
ActionExecuted,
1112
UserUttered,
13+
SlotSet,
1214
ActiveLoop,
1315
BotUttered,
1416
UserUtteranceReverted,
@@ -45,10 +47,17 @@ def _two_stage_clarification_request() -> List[Event]:
4547
return [ActionExecuted(ACTION_TWO_STAGE_FALLBACK_NAME), BotUttered("please affirm")]
4648

4749

48-
async def test_ask_affirmation():
49-
tracker = DialogueStateTracker.from_events(
50-
"some-sender", evts=_message_requiring_fallback()
51-
)
50+
@pytest.mark.parametrize(
51+
"events",
52+
[
53+
_message_requiring_fallback(),
54+
_message_requiring_fallback()
55+
+ [UserUtteranceReverted()]
56+
+ _message_requiring_fallback(),
57+
],
58+
)
59+
async def test_ask_affirmation(events: List[Event]):
60+
tracker = DialogueStateTracker.from_events("some-sender", evts=events)
5261
domain = Domain.empty()
5362
action = TwoStageFallbackAction()
5463

@@ -64,10 +73,13 @@ async def test_ask_affirmation():
6473
assert isinstance(events[1], BotUttered)
6574

6675

67-
async def test_1st_affirmation_is_successful():
76+
async def test_1st_affirmation_is_successful(default_processor: MessageProcessor):
6877
tracker = DialogueStateTracker.from_events(
6978
"some-sender",
7079
evts=[
80+
ActionExecuted(ACTION_LISTEN_NAME),
81+
UserUttered("my name is John", {"name": "say_name", "confidence": 1.0}),
82+
SlotSet("some_slot", "example_value"),
7183
# User sends message with low NLU confidence
7284
*_message_requiring_fallback(),
7385
ActiveLoop(ACTION_TWO_STAGE_FALLBACK_NAME),
@@ -81,18 +93,18 @@ async def test_1st_affirmation_is_successful():
8193
domain = Domain.empty()
8294
action = TwoStageFallbackAction()
8395

84-
events = await action.run(
96+
await default_processor._run_action(
97+
action,
98+
tracker,
8599
CollectingOutputChannel(),
86100
TemplatedNaturalLanguageGenerator(domain.templates),
87-
tracker,
88-
domain,
89101
)
90102

91-
for events in events:
92-
tracker.update(events, domain)
93-
94103
applied_events = tracker.applied_events()
95104
assert applied_events == [
105+
ActionExecuted(ACTION_LISTEN_NAME),
106+
UserUttered("my name is John", {"name": "say_name", "confidence": 1.0}),
107+
SlotSet("some_slot", "example_value"),
96108
ActionExecuted(ACTION_LISTEN_NAME),
97109
UserUttered("hi", {"name": "greet", "confidence": 1.0}),
98110
]
@@ -164,10 +176,13 @@ async def test_ask_rephrase_after_failed_affirmation():
164176
assert bot_utterance.text == rephrase_text
165177

166178

167-
async def test_ask_rephrasing_successful():
179+
async def test_ask_rephrasing_successful(default_processor: MessageProcessor):
168180
tracker = DialogueStateTracker.from_events(
169181
"some-sender",
170182
evts=[
183+
ActionExecuted(ACTION_LISTEN_NAME),
184+
UserUttered("my name is John", {"name": "say_name", "confidence": 1.0}),
185+
SlotSet("some_slot", "example_value"),
171186
# User sends message with low NLU confidence
172187
*_message_requiring_fallback(),
173188
ActiveLoop(ACTION_TWO_STAGE_FALLBACK_NAME),
@@ -186,18 +201,18 @@ async def test_ask_rephrasing_successful():
186201
domain = Domain.empty()
187202
action = TwoStageFallbackAction()
188203

189-
events = await action.run(
204+
await default_processor._run_action(
205+
action,
206+
tracker,
190207
CollectingOutputChannel(),
191208
TemplatedNaturalLanguageGenerator(domain.templates),
192-
tracker,
193-
domain,
194209
)
195210

196-
for event in events:
197-
tracker.update(event)
198-
199211
applied_events = tracker.applied_events()
200212
assert applied_events == [
213+
ActionExecuted(ACTION_LISTEN_NAME),
214+
UserUttered("my name is John", {"name": "say_name", "confidence": 1.0}),
215+
SlotSet("some_slot", "example_value"),
201216
ActionExecuted(ACTION_LISTEN_NAME),
202217
UserUttered("hi", {"name": "greet"}),
203218
]
@@ -236,10 +251,13 @@ async def test_ask_affirm_after_rephrasing():
236251
assert isinstance(events[0], BotUttered)
237252

238253

239-
async def test_2nd_affirm_successful():
254+
async def test_2nd_affirm_successful(default_processor: MessageProcessor):
240255
tracker = DialogueStateTracker.from_events(
241256
"some-sender",
242257
evts=[
258+
ActionExecuted(ACTION_LISTEN_NAME),
259+
UserUttered("my name is John", {"name": "say_name", "confidence": 1.0}),
260+
SlotSet("some_slot", "example_value"),
243261
# User sends message with low NLU confidence
244262
*_message_requiring_fallback(),
245263
ActiveLoop(ACTION_TWO_STAGE_FALLBACK_NAME),
@@ -262,19 +280,19 @@ async def test_2nd_affirm_successful():
262280
domain = Domain.empty()
263281
action = TwoStageFallbackAction()
264282

265-
events = await action.run(
283+
await default_processor._run_action(
284+
action,
285+
tracker,
266286
CollectingOutputChannel(),
267287
TemplatedNaturalLanguageGenerator(domain.templates),
268-
tracker,
269-
domain,
270288
)
271289

272-
for event in events:
273-
tracker.update(event)
274-
275290
applied_events = tracker.applied_events()
276291

277292
assert applied_events == [
293+
ActionExecuted(ACTION_LISTEN_NAME),
294+
UserUttered("my name is John", {"name": "say_name", "confidence": 1.0}),
295+
SlotSet("some_slot", "example_value"),
278296
ActionExecuted(ACTION_LISTEN_NAME),
279297
UserUttered("hi", {"name": "greet"}),
280298
]

0 commit comments

Comments
 (0)