rasa-pro 3.13.0.dev1__py3-none-any.whl → 3.13.0.dev2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- rasa/core/actions/action.py +0 -6
- rasa/core/channels/voice_ready/audiocodes.py +52 -17
- rasa/core/channels/voice_stream/audiocodes.py +53 -9
- rasa/core/channels/voice_stream/genesys.py +146 -16
- rasa/core/information_retrieval/faiss.py +6 -1
- rasa/core/information_retrieval/information_retrieval.py +40 -2
- rasa/core/information_retrieval/milvus.py +7 -2
- rasa/core/information_retrieval/qdrant.py +7 -2
- rasa/core/policies/enterprise_search_policy.py +61 -301
- rasa/core/policies/flows/flow_executor.py +3 -38
- rasa/core/processor.py +27 -6
- rasa/core/utils.py +53 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +4 -59
- rasa/dialogue_understanding/commands/start_flow_command.py +0 -41
- rasa/dialogue_understanding/generator/command_generator.py +67 -0
- rasa/dialogue_understanding/generator/command_parser.py +1 -1
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +4 -13
- rasa/dialogue_understanding/generator/prompt_templates/command_prompt_template.jinja2 +1 -1
- rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +20 -1
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +7 -0
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +0 -61
- rasa/dialogue_understanding/processor/command_processor.py +7 -65
- rasa/dialogue_understanding/stack/utils.py +0 -38
- rasa/dialogue_understanding_test/io.py +13 -8
- rasa/document_retrieval/__init__.py +0 -0
- rasa/document_retrieval/constants.py +32 -0
- rasa/document_retrieval/document_post_processor.py +351 -0
- rasa/document_retrieval/document_post_processor_prompt_template.jinja2 +0 -0
- rasa/document_retrieval/document_retriever.py +333 -0
- rasa/document_retrieval/knowledge_base_connectors/__init__.py +0 -0
- rasa/document_retrieval/knowledge_base_connectors/api_connector.py +39 -0
- rasa/document_retrieval/knowledge_base_connectors/knowledge_base_connector.py +34 -0
- rasa/document_retrieval/knowledge_base_connectors/vector_store_connector.py +226 -0
- rasa/document_retrieval/query_rewriter.py +234 -0
- rasa/document_retrieval/query_rewriter_prompt_template.jinja2 +8 -0
- rasa/engine/recipes/default_components.py +2 -0
- rasa/shared/core/constants.py +0 -8
- rasa/shared/core/domain.py +12 -3
- rasa/shared/core/flows/flow.py +0 -17
- rasa/shared/core/flows/flows_yaml_schema.json +3 -38
- rasa/shared/core/flows/steps/collect.py +5 -18
- rasa/shared/core/flows/utils.py +1 -16
- rasa/shared/core/slot_mappings.py +11 -5
- rasa/shared/nlu/constants.py +0 -1
- rasa/shared/utils/common.py +11 -1
- rasa/shared/utils/llm.py +1 -1
- rasa/tracing/instrumentation/attribute_extractors.py +10 -7
- rasa/tracing/instrumentation/instrumentation.py +12 -12
- rasa/validator.py +1 -123
- rasa/version.py +1 -1
- {rasa_pro-3.13.0.dev1.dist-info → rasa_pro-3.13.0.dev2.dist-info}/METADATA +1 -1
- {rasa_pro-3.13.0.dev1.dist-info → rasa_pro-3.13.0.dev2.dist-info}/RECORD +55 -47
- rasa/core/actions/action_handle_digressions.py +0 -164
- rasa/dialogue_understanding/commands/handle_digressions_command.py +0 -144
- rasa/dialogue_understanding/patterns/handle_digressions.py +0 -81
- {rasa_pro-3.13.0.dev1.dist-info → rasa_pro-3.13.0.dev2.dist-info}/NOTICE +0 -0
- {rasa_pro-3.13.0.dev1.dist-info → rasa_pro-3.13.0.dev2.dist-info}/WHEEL +0 -0
- {rasa_pro-3.13.0.dev1.dist-info → rasa_pro-3.13.0.dev2.dist-info}/entry_points.txt +0 -0
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from typing import Any, Dict, List, Optional
|
|
4
|
-
|
|
5
|
-
import structlog
|
|
6
|
-
|
|
7
|
-
from rasa.core.actions.action import Action, create_bot_utterance
|
|
8
|
-
from rasa.core.channels import OutputChannel
|
|
9
|
-
from rasa.core.nlg import NaturalLanguageGenerator
|
|
10
|
-
from rasa.core.utils import add_bot_utterance_metadata
|
|
11
|
-
from rasa.dialogue_understanding.patterns.continue_interrupted import (
|
|
12
|
-
ContinueInterruptedPatternFlowStackFrame,
|
|
13
|
-
)
|
|
14
|
-
from rasa.dialogue_understanding.patterns.handle_digressions import (
|
|
15
|
-
HandleDigressionsPatternFlowStackFrame,
|
|
16
|
-
)
|
|
17
|
-
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
18
|
-
FlowStackFrameType,
|
|
19
|
-
UserFlowStackFrame,
|
|
20
|
-
)
|
|
21
|
-
from rasa.dialogue_understanding.stack.utils import (
|
|
22
|
-
remove_digression_from_stack,
|
|
23
|
-
user_flows_on_the_stack,
|
|
24
|
-
)
|
|
25
|
-
from rasa.shared.core.constants import (
|
|
26
|
-
ACTION_BLOCK_DIGRESSION,
|
|
27
|
-
ACTION_CONTINUE_DIGRESSION,
|
|
28
|
-
)
|
|
29
|
-
from rasa.shared.core.domain import Domain
|
|
30
|
-
from rasa.shared.core.events import Event, FlowInterrupted
|
|
31
|
-
from rasa.shared.core.trackers import DialogueStateTracker
|
|
32
|
-
|
|
33
|
-
structlogger = structlog.get_logger()
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class ActionBlockDigressions(Action):
|
|
37
|
-
"""Action which blocks an interruption and continues the current flow."""
|
|
38
|
-
|
|
39
|
-
def name(self) -> str:
|
|
40
|
-
"""Return the action name."""
|
|
41
|
-
return ACTION_BLOCK_DIGRESSION
|
|
42
|
-
|
|
43
|
-
async def run(
|
|
44
|
-
self,
|
|
45
|
-
output_channel: OutputChannel,
|
|
46
|
-
nlg: NaturalLanguageGenerator,
|
|
47
|
-
tracker: DialogueStateTracker,
|
|
48
|
-
domain: Domain,
|
|
49
|
-
metadata: Optional[Dict[str, Any]] = None,
|
|
50
|
-
) -> List[Event]:
|
|
51
|
-
"""Update the stack."""
|
|
52
|
-
structlogger.debug("action_block_digressions.run")
|
|
53
|
-
top_frame = tracker.stack.top()
|
|
54
|
-
|
|
55
|
-
if not isinstance(top_frame, HandleDigressionsPatternFlowStackFrame):
|
|
56
|
-
return []
|
|
57
|
-
|
|
58
|
-
blocked_flow_id = top_frame.interrupting_flow_id
|
|
59
|
-
frame_type = FlowStackFrameType.REGULAR
|
|
60
|
-
|
|
61
|
-
stack = tracker.stack
|
|
62
|
-
|
|
63
|
-
if blocked_flow_id in user_flows_on_the_stack(stack):
|
|
64
|
-
structlogger.debug(
|
|
65
|
-
"action_block_digressions.already_blocked_flow",
|
|
66
|
-
blocked_flow_id=blocked_flow_id,
|
|
67
|
-
)
|
|
68
|
-
events = []
|
|
69
|
-
else:
|
|
70
|
-
stack.push(
|
|
71
|
-
UserFlowStackFrame(flow_id=blocked_flow_id, frame_type=frame_type), 0
|
|
72
|
-
)
|
|
73
|
-
stack.push(
|
|
74
|
-
ContinueInterruptedPatternFlowStackFrame(
|
|
75
|
-
previous_flow_name=blocked_flow_id
|
|
76
|
-
),
|
|
77
|
-
1,
|
|
78
|
-
)
|
|
79
|
-
events = tracker.create_stack_updated_events(stack)
|
|
80
|
-
|
|
81
|
-
utterance = "utter_block_digressions"
|
|
82
|
-
message = await nlg.generate(
|
|
83
|
-
utterance,
|
|
84
|
-
tracker,
|
|
85
|
-
output_channel.name(),
|
|
86
|
-
)
|
|
87
|
-
|
|
88
|
-
if message is None:
|
|
89
|
-
structlogger.error(
|
|
90
|
-
"action_block_digressions.run.failed.finding.utter",
|
|
91
|
-
utterance=utterance,
|
|
92
|
-
)
|
|
93
|
-
else:
|
|
94
|
-
message = add_bot_utterance_metadata(
|
|
95
|
-
message, utterance, nlg, domain, tracker
|
|
96
|
-
)
|
|
97
|
-
events.append(create_bot_utterance(message))
|
|
98
|
-
|
|
99
|
-
return events
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
class ActionContinueDigression(Action):
|
|
103
|
-
"""Action which continues with an interruption."""
|
|
104
|
-
|
|
105
|
-
def name(self) -> str:
|
|
106
|
-
"""Return the action name."""
|
|
107
|
-
return ACTION_CONTINUE_DIGRESSION
|
|
108
|
-
|
|
109
|
-
async def run(
|
|
110
|
-
self,
|
|
111
|
-
output_channel: OutputChannel,
|
|
112
|
-
nlg: NaturalLanguageGenerator,
|
|
113
|
-
tracker: DialogueStateTracker,
|
|
114
|
-
domain: Domain,
|
|
115
|
-
metadata: Optional[Dict[str, Any]] = None,
|
|
116
|
-
) -> List[Event]:
|
|
117
|
-
"""Update the stack."""
|
|
118
|
-
structlogger.debug("action_continue_digression.run")
|
|
119
|
-
top_frame = tracker.stack.top()
|
|
120
|
-
|
|
121
|
-
if not isinstance(top_frame, HandleDigressionsPatternFlowStackFrame):
|
|
122
|
-
return []
|
|
123
|
-
|
|
124
|
-
interrupting_flow_id = top_frame.interrupting_flow_id
|
|
125
|
-
stack = tracker.stack
|
|
126
|
-
|
|
127
|
-
if interrupting_flow_id in user_flows_on_the_stack(stack):
|
|
128
|
-
structlogger.debug(
|
|
129
|
-
"action_continue_digression.interrupting_flow_id_already_on_the_stack",
|
|
130
|
-
interrupting_flow_id=interrupting_flow_id,
|
|
131
|
-
)
|
|
132
|
-
stack = remove_digression_from_stack(stack, interrupting_flow_id)
|
|
133
|
-
|
|
134
|
-
frame_type = FlowStackFrameType.INTERRUPT
|
|
135
|
-
stack.push(
|
|
136
|
-
UserFlowStackFrame(flow_id=interrupting_flow_id, frame_type=frame_type)
|
|
137
|
-
)
|
|
138
|
-
|
|
139
|
-
events = [
|
|
140
|
-
FlowInterrupted(
|
|
141
|
-
flow_id=top_frame.interrupted_flow_id,
|
|
142
|
-
step_id=top_frame.interrupted_step_id,
|
|
143
|
-
)
|
|
144
|
-
] + tracker.create_stack_updated_events(stack)
|
|
145
|
-
|
|
146
|
-
utterance = "utter_continue_interruption"
|
|
147
|
-
message = await nlg.generate(
|
|
148
|
-
utterance,
|
|
149
|
-
tracker,
|
|
150
|
-
output_channel.name(),
|
|
151
|
-
)
|
|
152
|
-
|
|
153
|
-
if message is None:
|
|
154
|
-
structlogger.error(
|
|
155
|
-
"action_continue_digression.run.failed.finding.utter",
|
|
156
|
-
utterance=utterance,
|
|
157
|
-
)
|
|
158
|
-
else:
|
|
159
|
-
message = add_bot_utterance_metadata(
|
|
160
|
-
message, utterance, nlg, domain, tracker
|
|
161
|
-
)
|
|
162
|
-
events.append(create_bot_utterance(message))
|
|
163
|
-
|
|
164
|
-
return events
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from dataclasses import dataclass
|
|
4
|
-
from typing import Any, Dict, List
|
|
5
|
-
|
|
6
|
-
import structlog
|
|
7
|
-
|
|
8
|
-
from rasa.dialogue_understanding.commands.command import Command
|
|
9
|
-
from rasa.dialogue_understanding.patterns.cannot_handle import (
|
|
10
|
-
CannotHandlePatternFlowStackFrame,
|
|
11
|
-
)
|
|
12
|
-
from rasa.dialogue_understanding.patterns.handle_digressions import (
|
|
13
|
-
HandleDigressionsPatternFlowStackFrame,
|
|
14
|
-
)
|
|
15
|
-
from rasa.dialogue_understanding.stack.utils import (
|
|
16
|
-
top_flow_frame,
|
|
17
|
-
)
|
|
18
|
-
from rasa.shared.core.events import Event
|
|
19
|
-
from rasa.shared.core.flows import FlowsList
|
|
20
|
-
from rasa.shared.core.flows.steps import CollectInformationFlowStep
|
|
21
|
-
from rasa.shared.core.flows.utils import ALL_LABEL
|
|
22
|
-
from rasa.shared.core.trackers import DialogueStateTracker
|
|
23
|
-
from rasa.shared.nlu.constants import HANDLE_DIGRESSIONS_COMMAND
|
|
24
|
-
|
|
25
|
-
structlogger = structlog.get_logger()
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
@dataclass
|
|
29
|
-
class HandleDigressionsCommand(Command):
|
|
30
|
-
"""A command to handle digressions during an active flow."""
|
|
31
|
-
|
|
32
|
-
flow: str
|
|
33
|
-
"""The interrupting flow."""
|
|
34
|
-
|
|
35
|
-
@classmethod
|
|
36
|
-
def command(cls) -> str:
|
|
37
|
-
"""Returns the command type."""
|
|
38
|
-
return HANDLE_DIGRESSIONS_COMMAND
|
|
39
|
-
|
|
40
|
-
@classmethod
|
|
41
|
-
def from_dict(cls, data: Dict[str, Any]) -> HandleDigressionsCommand:
|
|
42
|
-
"""Converts the dictionary to a command.
|
|
43
|
-
|
|
44
|
-
Returns:
|
|
45
|
-
The converted dictionary.
|
|
46
|
-
"""
|
|
47
|
-
try:
|
|
48
|
-
return HandleDigressionsCommand(flow=data["flow"])
|
|
49
|
-
except KeyError as e:
|
|
50
|
-
raise ValueError(
|
|
51
|
-
f"Missing parameter '{e}' while parsing HandleDigressionsCommand."
|
|
52
|
-
) from e
|
|
53
|
-
|
|
54
|
-
def run_command_on_tracker(
|
|
55
|
-
self,
|
|
56
|
-
tracker: DialogueStateTracker,
|
|
57
|
-
all_flows: FlowsList,
|
|
58
|
-
original_tracker: DialogueStateTracker,
|
|
59
|
-
) -> List[Event]:
|
|
60
|
-
"""Runs the command on the tracker.
|
|
61
|
-
|
|
62
|
-
Args:
|
|
63
|
-
tracker: The tracker to run the command on.
|
|
64
|
-
all_flows: All flows in the assistant.
|
|
65
|
-
original_tracker: The tracker before any command was executed.
|
|
66
|
-
|
|
67
|
-
Returns:
|
|
68
|
-
The events to apply to the tracker.
|
|
69
|
-
"""
|
|
70
|
-
stack = tracker.stack
|
|
71
|
-
original_stack = original_tracker.stack
|
|
72
|
-
|
|
73
|
-
if self.flow not in all_flows.flow_ids:
|
|
74
|
-
structlogger.debug(
|
|
75
|
-
"command_executor.push_cannot_handle.start_invalid_flow_id",
|
|
76
|
-
command=self,
|
|
77
|
-
)
|
|
78
|
-
stack.push(CannotHandlePatternFlowStackFrame())
|
|
79
|
-
return tracker.create_stack_updated_events(stack)
|
|
80
|
-
|
|
81
|
-
# this allows to include called user flows in the stack search
|
|
82
|
-
latest_user_frame = top_flow_frame(original_stack, ignore_call_frames=False)
|
|
83
|
-
|
|
84
|
-
if latest_user_frame is None:
|
|
85
|
-
structlogger.debug(
|
|
86
|
-
"command_executor.skip_command.no_top_flow", command=self
|
|
87
|
-
)
|
|
88
|
-
return []
|
|
89
|
-
|
|
90
|
-
original_top_flow = latest_user_frame.flow(all_flows)
|
|
91
|
-
current_step = original_top_flow.step_by_id(latest_user_frame.step_id)
|
|
92
|
-
if not isinstance(current_step, CollectInformationFlowStep):
|
|
93
|
-
structlogger.debug(
|
|
94
|
-
"command_executor.skip_command.not_at_a_collect_step", command=self
|
|
95
|
-
)
|
|
96
|
-
return []
|
|
97
|
-
|
|
98
|
-
ask_confirm_digressions = set(
|
|
99
|
-
current_step.ask_confirm_digressions
|
|
100
|
-
+ original_top_flow.ask_confirm_digressions
|
|
101
|
-
)
|
|
102
|
-
|
|
103
|
-
block_digressions = set(
|
|
104
|
-
current_step.block_digressions + original_top_flow.block_digressions
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
if block_digressions:
|
|
108
|
-
if ALL_LABEL in block_digressions:
|
|
109
|
-
block_digressions.remove(ALL_LABEL)
|
|
110
|
-
block_digressions.add(self.flow)
|
|
111
|
-
|
|
112
|
-
if ask_confirm_digressions:
|
|
113
|
-
if ALL_LABEL in ask_confirm_digressions:
|
|
114
|
-
ask_confirm_digressions.remove(ALL_LABEL)
|
|
115
|
-
ask_confirm_digressions.add(self.flow)
|
|
116
|
-
|
|
117
|
-
structlogger.debug(
|
|
118
|
-
"command_executor.push_handle_digressions",
|
|
119
|
-
interrupting_flow_id=self.flow,
|
|
120
|
-
interrupted_flow_id=original_top_flow.id,
|
|
121
|
-
interrupted_step_id=current_step.id,
|
|
122
|
-
ask_confirm_digressions=ask_confirm_digressions,
|
|
123
|
-
block_digressions=block_digressions,
|
|
124
|
-
)
|
|
125
|
-
stack.push(
|
|
126
|
-
HandleDigressionsPatternFlowStackFrame(
|
|
127
|
-
interrupting_flow_id=self.flow,
|
|
128
|
-
interrupted_flow_id=original_top_flow.id,
|
|
129
|
-
interrupted_step_id=current_step.id,
|
|
130
|
-
ask_confirm_digressions=ask_confirm_digressions,
|
|
131
|
-
block_digressions=block_digressions,
|
|
132
|
-
)
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
return tracker.create_stack_updated_events(stack)
|
|
136
|
-
|
|
137
|
-
def __hash__(self) -> int:
|
|
138
|
-
return hash(self.flow)
|
|
139
|
-
|
|
140
|
-
def __eq__(self, other: object) -> bool:
|
|
141
|
-
if not isinstance(other, HandleDigressionsCommand):
|
|
142
|
-
return False
|
|
143
|
-
|
|
144
|
-
return other.flow == self.flow
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from dataclasses import dataclass, field
|
|
4
|
-
from typing import Any, Dict, Set
|
|
5
|
-
|
|
6
|
-
from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
|
|
7
|
-
from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
|
|
8
|
-
from rasa.shared.core.constants import (
|
|
9
|
-
KEY_ASK_CONFIRM_DIGRESSIONS,
|
|
10
|
-
KEY_BLOCK_DIGRESSIONS,
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
FLOW_PATTERN_HANDLE_DIGRESSIONS = (
|
|
14
|
-
RASA_DEFAULT_FLOW_PATTERN_PREFIX + "handle_digressions"
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@dataclass
|
|
19
|
-
class HandleDigressionsPatternFlowStackFrame(PatternFlowStackFrame):
|
|
20
|
-
"""A pattern flow stack frame that gets added if an interruption is completed."""
|
|
21
|
-
|
|
22
|
-
flow_id: str = FLOW_PATTERN_HANDLE_DIGRESSIONS
|
|
23
|
-
"""The ID of the flow."""
|
|
24
|
-
interrupting_flow_id: str = ""
|
|
25
|
-
"""The ID of the flow that interrupted the active flow."""
|
|
26
|
-
interrupted_flow_id: str = ""
|
|
27
|
-
"""The name of the active flow that was interrupted."""
|
|
28
|
-
interrupted_step_id: str = ""
|
|
29
|
-
"""The ID of the step that was interrupted."""
|
|
30
|
-
ask_confirm_digressions: Set[str] = field(default_factory=set)
|
|
31
|
-
"""The set of interrupting flow names to confirm."""
|
|
32
|
-
block_digressions: Set[str] = field(default_factory=set)
|
|
33
|
-
"""The set of interrupting flow names to block."""
|
|
34
|
-
|
|
35
|
-
@classmethod
|
|
36
|
-
def type(cls) -> str:
|
|
37
|
-
"""Returns the type of the frame."""
|
|
38
|
-
return FLOW_PATTERN_HANDLE_DIGRESSIONS
|
|
39
|
-
|
|
40
|
-
@staticmethod
|
|
41
|
-
def from_dict(data: Dict[str, Any]) -> HandleDigressionsPatternFlowStackFrame:
|
|
42
|
-
"""Creates a `DialogueStackFrame` from a dictionary.
|
|
43
|
-
|
|
44
|
-
Args:
|
|
45
|
-
data: The dictionary to create the `DialogueStackFrame` from.
|
|
46
|
-
|
|
47
|
-
Returns:
|
|
48
|
-
The created `DialogueStackFrame`.
|
|
49
|
-
"""
|
|
50
|
-
return HandleDigressionsPatternFlowStackFrame(
|
|
51
|
-
frame_id=data["frame_id"],
|
|
52
|
-
step_id=data["step_id"],
|
|
53
|
-
interrupted_step_id=data["interrupted_step_id"],
|
|
54
|
-
interrupted_flow_id=data["interrupted_flow_id"],
|
|
55
|
-
interrupting_flow_id=data["interrupting_flow_id"],
|
|
56
|
-
ask_confirm_digressions=set(data.get(KEY_ASK_CONFIRM_DIGRESSIONS, [])),
|
|
57
|
-
# This attribute must be converted to a set to enable usage
|
|
58
|
-
# of subset `contains` pypred operator in the default pattern
|
|
59
|
-
# conditional branching
|
|
60
|
-
block_digressions=set(data.get(KEY_BLOCK_DIGRESSIONS, [])),
|
|
61
|
-
)
|
|
62
|
-
|
|
63
|
-
def __eq__(self, other: Any) -> bool:
|
|
64
|
-
if not isinstance(other, HandleDigressionsPatternFlowStackFrame):
|
|
65
|
-
return False
|
|
66
|
-
return (
|
|
67
|
-
self.flow_id == other.flow_id
|
|
68
|
-
and self.interrupted_step_id == other.interrupted_step_id
|
|
69
|
-
and self.interrupted_flow_id == other.interrupted_flow_id
|
|
70
|
-
and self.interrupting_flow_id == other.interrupting_flow_id
|
|
71
|
-
and self.ask_confirm_digressions == other.ask_confirm_digressions
|
|
72
|
-
and self.block_digressions == other.block_digressions
|
|
73
|
-
)
|
|
74
|
-
|
|
75
|
-
def as_dict(self) -> Dict[str, Any]:
|
|
76
|
-
"""Returns the frame as a dictionary."""
|
|
77
|
-
data = super().as_dict()
|
|
78
|
-
# converting back to list to avoid serialization issues
|
|
79
|
-
data[KEY_ASK_CONFIRM_DIGRESSIONS] = list(self.ask_confirm_digressions)
|
|
80
|
-
data[KEY_BLOCK_DIGRESSIONS] = list(self.block_digressions)
|
|
81
|
-
return data
|
|
File without changes
|
|
File without changes
|
|
File without changes
|