rasa-pro 3.11.3a1.dev7__py3-none-any.whl → 3.11.5__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.

Files changed (135) hide show
  1. rasa/core/actions/action.py +10 -17
  2. rasa/core/actions/direct_custom_actions_executor.py +0 -1
  3. rasa/core/channels/__init__.py +0 -2
  4. rasa/core/channels/inspector/dist/assets/Tableau10-1b767f5e.js +1 -0
  5. rasa/core/channels/inspector/dist/assets/arc-f0f8bd46.js +1 -0
  6. rasa/core/channels/inspector/dist/assets/blockDiagram-38ab4fdb-7162c77d.js +118 -0
  7. rasa/core/channels/inspector/dist/assets/c4Diagram-3d4e48cf-b1d0d098.js +10 -0
  8. rasa/core/channels/inspector/dist/assets/channel-e265ea59.js +1 -0
  9. rasa/core/channels/inspector/dist/assets/classDiagram-70f12bd4-807a1b27.js +2 -0
  10. rasa/core/channels/inspector/dist/assets/classDiagram-v2-f2320105-5238dcdb.js +2 -0
  11. rasa/core/channels/inspector/dist/assets/clone-21f8a43d.js +1 -0
  12. rasa/core/channels/inspector/dist/assets/{createText-62fc7601-ef476ecd.js → createText-2e5e7dd3-75dfaa67.js} +1 -1
  13. rasa/core/channels/inspector/dist/assets/edges-e0da2a9e-df20501d.js +4 -0
  14. rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-fac75185.js → erDiagram-9861fffd-13cf4797.js} +4 -4
  15. rasa/core/channels/inspector/dist/assets/flowDb-956e92f1-a4991264.js +10 -0
  16. rasa/core/channels/inspector/dist/assets/flowDiagram-66a62f08-ccecf773.js +4 -0
  17. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-5c8ce12d.js +1 -0
  18. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-4a651766-b5801783.js +139 -0
  19. rasa/core/channels/inspector/dist/assets/ganttDiagram-c361ad54-161e079a.js +257 -0
  20. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-72cf32ee-f38e86a4.js +70 -0
  21. rasa/core/channels/inspector/dist/assets/graph-be6ef5d8.js +1 -0
  22. rasa/core/channels/inspector/dist/assets/index-3862675e-d9ce8994.js +1 -0
  23. rasa/core/channels/inspector/dist/assets/{index-37817b51.js → index-7794b245.js} +200 -195
  24. rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-6b731386.js → infoDiagram-f8f76790-5000a3dc.js} +1 -1
  25. rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-e8579ac6.js → journeyDiagram-49397b02-8ef0a17a.js} +4 -4
  26. rasa/core/channels/inspector/dist/assets/katex-498eb57e.js +261 -0
  27. rasa/core/channels/inspector/dist/assets/layout-d649bc98.js +1 -0
  28. rasa/core/channels/inspector/dist/assets/{line-dc73d3fc.js → line-95add810.js} +1 -1
  29. rasa/core/channels/inspector/dist/assets/linear-f6025094.js +1 -0
  30. rasa/core/channels/inspector/dist/assets/mindmap-definition-fc14e90a-2e8531c4.js +312 -0
  31. rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-bdf5f29b.js → pieDiagram-8a3498a8-918adfdb.js} +7 -7
  32. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-c7a0cbe4.js → quadrantDiagram-120e2f19-cbd01797.js} +1 -1
  33. rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-7ec5410f.js → requirementDiagram-deff3bca-6a8b877b.js} +2 -2
  34. rasa/core/channels/inspector/dist/assets/sankeyDiagram-04a897e0-c377c3fe.js +8 -0
  35. rasa/core/channels/inspector/dist/assets/sequenceDiagram-704730f1-ab9e9b7f.js +122 -0
  36. rasa/core/channels/inspector/dist/assets/stateDiagram-587899a1-5e6ae67d.js +1 -0
  37. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-d93cdb3a-40643476.js +1 -0
  38. rasa/core/channels/inspector/dist/assets/{styles-9c745c82-7a4e0e61.js → styles-6aaf32cf-afb8d108.js} +1 -1
  39. rasa/core/channels/inspector/dist/assets/styles-9a916d00-7edc9423.js +160 -0
  40. rasa/core/channels/inspector/dist/assets/styles-c10674c1-c1d8f7e9.js +116 -0
  41. rasa/core/channels/inspector/dist/assets/svgDrawCommon-08f97a94-f494b2ef.js +1 -0
  42. rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-01ea12df.js → timeline-definition-85554ec2-11c7cdd0.js} +3 -3
  43. rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-89407137.js → xychartDiagram-e933f94c-3f191ec1.js} +3 -3
  44. rasa/core/channels/inspector/dist/index.html +3 -1
  45. rasa/core/channels/inspector/index.html +2 -0
  46. rasa/core/channels/inspector/package.json +10 -3
  47. rasa/core/channels/inspector/src/App.tsx +1 -4
  48. rasa/core/channels/inspector/yarn.lock +89 -99
  49. rasa/core/channels/socketio.py +23 -2
  50. rasa/core/channels/voice_ready/audiocodes.py +42 -23
  51. rasa/core/nlg/contextual_response_rephraser.py +9 -62
  52. rasa/core/policies/enterprise_search_policy.py +12 -77
  53. rasa/core/policies/flows/flow_executor.py +2 -26
  54. rasa/core/processor.py +8 -11
  55. rasa/dialogue_understanding/generator/command_generator.py +5 -120
  56. rasa/dialogue_understanding/generator/llm_based_command_generator.py +5 -5
  57. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -2
  58. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +4 -50
  59. rasa/dialogue_understanding/generator/nlu_command_adapter.py +0 -3
  60. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +3 -16
  61. rasa/dialogue_understanding/patterns/continue_interrupted.py +9 -0
  62. rasa/dialogue_understanding/stack/utils.py +1 -0
  63. rasa/e2e_test/e2e_test_case.py +1 -2
  64. rasa/e2e_test/utils/e2e_yaml_utils.py +1 -1
  65. rasa/e2e_test/utils/io.py +1 -1
  66. rasa/e2e_test/utils/validation.py +2 -100
  67. rasa/engine/recipes/default_recipe.py +49 -63
  68. rasa/engine/recipes/graph_recipe.py +7 -8
  69. rasa/hooks.py +9 -14
  70. rasa/model_manager/socket_bridge.py +2 -7
  71. rasa/model_manager/warm_rasa_process.py +4 -9
  72. rasa/model_training.py +1 -2
  73. rasa/nlu/classifiers/fallback_classifier.py +0 -3
  74. rasa/plugin.py +0 -11
  75. rasa/server.py +40 -2
  76. rasa/shared/constants.py +6 -26
  77. rasa/shared/core/events.py +8 -8
  78. rasa/shared/core/flows/flow.py +4 -4
  79. rasa/shared/core/flows/flow_step.py +15 -10
  80. rasa/shared/core/flows/flow_step_links.py +20 -12
  81. rasa/shared/core/flows/flow_step_sequence.py +5 -3
  82. rasa/shared/core/flows/steps/action.py +3 -2
  83. rasa/shared/core/flows/steps/call.py +3 -3
  84. rasa/shared/core/flows/steps/collect.py +6 -3
  85. rasa/shared/core/flows/steps/continuation.py +3 -1
  86. rasa/shared/core/flows/steps/end.py +3 -1
  87. rasa/shared/core/flows/steps/internal.py +2 -1
  88. rasa/shared/core/flows/steps/link.py +5 -3
  89. rasa/shared/core/flows/steps/no_operation.py +5 -3
  90. rasa/shared/core/flows/steps/set_slots.py +3 -2
  91. rasa/shared/core/flows/steps/start.py +3 -1
  92. rasa/shared/nlu/constants.py +0 -7
  93. rasa/shared/providers/llm/llm_response.py +1 -42
  94. rasa/shared/utils/llm.py +1 -1
  95. rasa/shared/utils/schemas/events.py +1 -1
  96. rasa/shared/utils/yaml.py +5 -6
  97. rasa/studio/upload.py +5 -19
  98. rasa/telemetry.py +33 -40
  99. rasa/tracing/instrumentation/attribute_extractors.py +9 -12
  100. rasa/validator.py +41 -32
  101. rasa/version.py +1 -1
  102. {rasa_pro-3.11.3a1.dev7.dist-info → rasa_pro-3.11.5.dist-info}/METADATA +7 -7
  103. {rasa_pro-3.11.3a1.dev7.dist-info → rasa_pro-3.11.5.dist-info}/RECORD +106 -107
  104. rasa/core/channels/inspector/dist/assets/arc-861ddd57.js +0 -1
  105. rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-921f02db.js +0 -10
  106. rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-b436c4f8.js +0 -2
  107. rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-511a23cb.js +0 -2
  108. rasa/core/channels/inspector/dist/assets/edges-f2ad444c-f1878e0a.js +0 -4
  109. rasa/core/channels/inspector/dist/assets/flowDb-1972c806-201c5bbc.js +0 -6
  110. rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-f904ae41.js +0 -4
  111. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +0 -1
  112. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-1813da66.js +0 -139
  113. rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-872af172.js +0 -266
  114. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-34a0af5a.js +0 -70
  115. rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-42ba3e3d.js +0 -1
  116. rasa/core/channels/inspector/dist/assets/layout-89e6403a.js +0 -1
  117. rasa/core/channels/inspector/dist/assets/linear-f5b1d2bc.js +0 -1
  118. rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-82cb74fa.js +0 -109
  119. rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-caee5554.js +0 -8
  120. rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-2935f8db.js +0 -122
  121. rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-8f5d9693.js +0 -1
  122. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-d565d1de.js +0 -1
  123. rasa/core/channels/inspector/dist/assets/styles-080da4f6-75ad421d.js +0 -110
  124. rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-7e764226.js +0 -159
  125. rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-4019d1bf.js +0 -1
  126. rasa/core/channels/studio_chat.py +0 -192
  127. rasa/dialogue_understanding/constants.py +0 -1
  128. rasa/dialogue_understanding/utils.py +0 -21
  129. rasa/dialogue_understanding_test/__init__.py +0 -0
  130. rasa/dialogue_understanding_test/constants.py +0 -15
  131. rasa/dialogue_understanding_test/du_test_case.py +0 -118
  132. rasa/dialogue_understanding_test/du_test_result.py +0 -11
  133. {rasa_pro-3.11.3a1.dev7.dist-info → rasa_pro-3.11.5.dist-info}/NOTICE +0 -0
  134. {rasa_pro-3.11.3a1.dev7.dist-info → rasa_pro-3.11.5.dist-info}/WHEEL +0 -0
  135. {rasa_pro-3.11.3a1.dev7.dist-info → rasa_pro-3.11.5.dist-info}/entry_points.txt +0 -0
rasa/server.py CHANGED
@@ -62,9 +62,11 @@ from rasa.shared.constants import (
62
62
  DOCS_BASE_URL,
63
63
  DOCS_URL_TRAINING_DATA,
64
64
  TEST_STORIES_FILE_PREFIX,
65
+ DOCS_URL_FLOWS,
65
66
  )
66
67
  from rasa.shared.core.domain import Domain, InvalidDomain
67
68
  from rasa.shared.core.events import Event
69
+ from rasa.shared.core.flows.yaml_flows_io import YAMLFlowsReader
68
70
  from rasa.shared.core.trackers import (
69
71
  DialogueStateTracker,
70
72
  EventVerbosity,
@@ -72,6 +74,7 @@ from rasa.shared.core.trackers import (
72
74
  from rasa.shared.core.training_data.story_writer.yaml_story_writer import (
73
75
  YAMLStoryWriter,
74
76
  )
77
+ from rasa.shared.exceptions import YamlException, RasaException
75
78
  from rasa.shared.importers.importer import TrainingDataImporter
76
79
  from rasa.shared.nlu.training_data.formats import RasaYAMLReader
77
80
  from rasa.shared.utils.schemas.events import EVENTS_SCHEMA
@@ -269,7 +272,9 @@ def requires_auth(
269
272
  raise ErrorResponse(
270
273
  HTTPStatus.UNAUTHORIZED,
271
274
  "NotAuthenticated",
272
- "User is not authenticated.",
275
+ "User is not authenticated. ",
276
+ "Please make sure the use of token is supported and that "
277
+ "the supplied token is valid.",
273
278
  help_url=_docs(
274
279
  "/user-guide/configuring-http-api/#security-considerations"
275
280
  ),
@@ -1566,7 +1571,8 @@ def _nlu_training_payload_from_json(
1566
1571
  )
1567
1572
 
1568
1573
 
1569
- def _validate_yaml_training_payload(yaml_text: Text) -> None:
1574
+ def _validate_nlu_training_data_payload(yaml_text: str) -> None:
1575
+ """Validate the NLU training data payload of the request body."""
1570
1576
  try:
1571
1577
  RasaYAMLReader().validate(yaml_text)
1572
1578
  except Exception as e:
@@ -1578,6 +1584,38 @@ def _validate_yaml_training_payload(yaml_text: Text) -> None:
1578
1584
  )
1579
1585
 
1580
1586
 
1587
+ def _validate_flows_payload(yaml_text: str) -> None:
1588
+ """Validate the flows payload of the request body."""
1589
+ try:
1590
+ YAMLFlowsReader().read_from_string(yaml_text)
1591
+ except (YamlException, RasaException) as exc:
1592
+ # if the payload does not contain any flows, we can ignore the error
1593
+ if (
1594
+ hasattr(exc, "validation_errors")
1595
+ and exc.validation_errors is not None
1596
+ and any(
1597
+ [
1598
+ "'flows' is a required property" in error.message
1599
+ for error in exc.validation_errors
1600
+ ]
1601
+ )
1602
+ ):
1603
+ return None
1604
+
1605
+ raise ErrorResponse(
1606
+ HTTPStatus.BAD_REQUEST,
1607
+ "BadRequest",
1608
+ f"The request body does not contain valid YAML. Error: {exc}",
1609
+ help_url=DOCS_URL_FLOWS,
1610
+ )
1611
+
1612
+
1613
+ def _validate_yaml_training_payload(yaml_text: str) -> None:
1614
+ """Validate the YAML training payload of the request body."""
1615
+ _validate_nlu_training_data_payload(yaml_text)
1616
+ _validate_flows_payload(yaml_text)
1617
+
1618
+
1581
1619
  def _extract_core_additional_arguments(request: Request) -> Dict[Text, Any]:
1582
1620
  return {
1583
1621
  "augmentation_factor": rasa.utils.endpoints.int_arg(request, "augmentation", 50)
rasa/shared/constants.py CHANGED
@@ -19,6 +19,7 @@ DOCS_URL_GRAPH_COMPONENTS = DOCS_URL_CONCEPTS + "/components/custom-graph-compon
19
19
  DOCS_URL_GRAPH_RECIPE = DOCS_URL_CONCEPTS + "/components/graph-recipe"
20
20
  DOCS_URL_CATEGORICAL_SLOTS = DOCS_URL_CONCEPTS + "/domain#categorical-slot"
21
21
  DOCS_URL_DOMAIN = DOCS_URL_CONCEPTS + "/domain"
22
+ DOCS_URL_FLOWS = DOCS_URL_CONCEPTS + "/flows"
22
23
 
23
24
  # Docs URLs for NLU-based assistants
24
25
  DOCS_URL_TRAINING_DATA = DOCS_URL_NLU_BASED + "/training-data-format"
@@ -101,28 +102,16 @@ ASSISTANT_ID_KEY = "assistant_id"
101
102
  ASSISTANT_ID_DEFAULT_VALUE = "placeholder_default"
102
103
 
103
104
  CONFIG_MANDATORY_COMMON_KEYS = [ASSISTANT_ID_KEY]
104
- CONFIG_NAME_KEY = "name"
105
- CONFIG_POLICIES_KEY = "policies"
106
- CONFIG_PIPELINE_KEY = "pipeline"
107
- CONFIG_LANGUAGE_KEY = "language"
108
- CONFIG_RECIPE_KEY = "recipe"
109
- CONFIG_LLM_KEY = "llm"
110
- CONFIG_MODEL_NAME_KEY = "model_name"
111
- CONFIG_TRAIN_SCHEMA = "train_schema"
112
- CONFIG_PREDICT_SCHEMA = "predict_schema"
113
- CONFIG_AUTOCONFIGURABLE_KEYS_CORE = [CONFIG_POLICIES_KEY]
114
- CONFIG_AUTOCONFIGURABLE_KEYS_NLU = [CONFIG_PIPELINE_KEY]
105
+ CONFIG_AUTOCONFIGURABLE_KEYS_CORE = ["policies"]
106
+ CONFIG_AUTOCONFIGURABLE_KEYS_NLU = ["pipeline"]
115
107
  CONFIG_AUTOCONFIGURABLE_KEYS = (
116
108
  CONFIG_AUTOCONFIGURABLE_KEYS_CORE + CONFIG_AUTOCONFIGURABLE_KEYS_NLU
117
109
  )
118
- CONFIG_KEYS_CORE = [CONFIG_POLICIES_KEY] + CONFIG_MANDATORY_COMMON_KEYS
119
- CONFIG_KEYS_NLU = [
120
- CONFIG_LANGUAGE_KEY,
121
- CONFIG_PIPELINE_KEY,
122
- ] + CONFIG_MANDATORY_COMMON_KEYS
110
+ CONFIG_KEYS_CORE = ["policies"] + CONFIG_MANDATORY_COMMON_KEYS
111
+ CONFIG_KEYS_NLU = ["language", "pipeline"] + CONFIG_MANDATORY_COMMON_KEYS
123
112
  CONFIG_KEYS = CONFIG_KEYS_CORE + CONFIG_KEYS_NLU
124
113
  CONFIG_MANDATORY_KEYS_CORE: List[Text] = [] + CONFIG_MANDATORY_COMMON_KEYS
125
- CONFIG_MANDATORY_KEYS_NLU = [CONFIG_LANGUAGE_KEY] + CONFIG_MANDATORY_COMMON_KEYS
114
+ CONFIG_MANDATORY_KEYS_NLU = ["language"] + CONFIG_MANDATORY_COMMON_KEYS
126
115
  CONFIG_MANDATORY_KEYS = CONFIG_MANDATORY_KEYS_CORE + CONFIG_MANDATORY_KEYS_NLU
127
116
 
128
117
  # Keys related to Forms (in the Domain)
@@ -319,12 +308,3 @@ SENSITIVE_DATA = [
319
308
  AWS_SECRET_ACCESS_KEY_CONFIG_KEY,
320
309
  AWS_SESSION_TOKEN_CONFIG_KEY,
321
310
  ]
322
-
323
- # Used for key values in BotUtterance.data
324
- TEXT = "text"
325
- ELEMENTS = "elements"
326
- QUICK_REPLIES = "quick_replies"
327
- BUTTONS = "buttons"
328
- ATTACHMENT = "attachment"
329
- IMAGE = "image"
330
- CUSTOM = "custom"
@@ -2,10 +2,14 @@ import abc
2
2
  import copy
3
3
  import json
4
4
  import logging
5
+ import structlog
5
6
  import re
7
+ from abc import ABC
8
+
9
+ import jsonpickle
6
10
  import time
7
11
  import uuid
8
- from abc import ABC
12
+ from dateutil import parser
9
13
  from datetime import datetime
10
14
  from typing import (
11
15
  List,
@@ -20,14 +24,11 @@ from typing import (
20
24
  Tuple,
21
25
  TypeVar,
22
26
  )
23
- from typing import Union
24
-
25
- import jsonpickle
26
- import structlog
27
- from dateutil import parser
28
27
 
29
28
  import rasa.shared.utils.common
30
29
  import rasa.shared.utils.io
30
+ from typing import Union
31
+
31
32
  from rasa.shared.constants import DOCS_URL_TRAINING_DATA
32
33
  from rasa.shared.core.constants import (
33
34
  LOOP_NAME,
@@ -61,7 +62,7 @@ from rasa.shared.nlu.constants import (
61
62
  ENTITY_ATTRIBUTE_END,
62
63
  FULL_RETRIEVAL_INTENT_NAME_KEY,
63
64
  )
64
- from rasa.shared.nlu.constants import PROMPTS
65
+
65
66
 
66
67
  if TYPE_CHECKING:
67
68
  from typing_extensions import TypedDict
@@ -97,7 +98,6 @@ if TYPE_CHECKING:
97
98
  ENTITIES: List[EntityPrediction],
98
99
  "message_id": Optional[Text],
99
100
  "metadata": Dict,
100
- PROMPTS: Dict,
101
101
  },
102
102
  total=False,
103
103
  )
@@ -79,7 +79,7 @@ class Flow:
79
79
  Returns:
80
80
  A Flow object.
81
81
  """
82
- step_sequence = FlowStepSequence.from_json(data.get("steps"))
82
+ step_sequence = FlowStepSequence.from_json(flow_id, data.get("steps"))
83
83
  nlu_triggers = NLUTriggers.from_json(data.get("nlu_trigger"))
84
84
 
85
85
  if file_path and isinstance(file_path, Path):
@@ -185,13 +185,13 @@ class Flow:
185
185
  return None
186
186
 
187
187
  if step_id == START_STEP:
188
- return StartFlowStep(self.first_step_in_flow().id)
188
+ return StartFlowStep(self.id, self.first_step_in_flow().id)
189
189
 
190
190
  if step_id == END_STEP:
191
- return EndFlowStep()
191
+ return EndFlowStep(self.id)
192
192
 
193
193
  if step_id.startswith(CONTINUE_STEP_PREFIX):
194
- return ContinueFlowStep(step_id[len(CONTINUE_STEP_PREFIX) :])
194
+ return ContinueFlowStep(self.id, step_id[len(CONTINUE_STEP_PREFIX) :])
195
195
 
196
196
  for step in self.steps_with_calls_resolved:
197
197
  if step.id == step_id:
@@ -20,10 +20,11 @@ if TYPE_CHECKING:
20
20
  structlogger = structlog.get_logger()
21
21
 
22
22
 
23
- def step_from_json(data: Dict[Text, Any]) -> FlowStep:
23
+ def step_from_json(flow_id: Text, data: Dict[Text, Any]) -> FlowStep:
24
24
  """Create a specific FlowStep from serialized data.
25
25
 
26
26
  Args:
27
+ flow_id: The id of the flow that contains the step.
27
28
  data: data for a specific FlowStep object in a serialized data format.
28
29
 
29
30
  Returns:
@@ -39,17 +40,17 @@ def step_from_json(data: Dict[Text, Any]) -> FlowStep:
39
40
  )
40
41
 
41
42
  if "action" in data:
42
- return ActionFlowStep.from_json(data)
43
+ return ActionFlowStep.from_json(flow_id, data)
43
44
  if "collect" in data:
44
- return CollectInformationFlowStep.from_json(data)
45
+ return CollectInformationFlowStep.from_json(flow_id, data)
45
46
  if "link" in data:
46
- return LinkFlowStep.from_json(data)
47
+ return LinkFlowStep.from_json(flow_id, data)
47
48
  if "call" in data:
48
- return CallFlowStep.from_json(data)
49
+ return CallFlowStep.from_json(flow_id, data)
49
50
  if "set_slots" in data:
50
- return SetSlotsFlowStep.from_json(data)
51
+ return SetSlotsFlowStep.from_json(flow_id, data)
51
52
  if "noop" in data:
52
- return NoOperationFlowStep.from_json(data)
53
+ return NoOperationFlowStep.from_json(flow_id, data)
53
54
  raise RasaException(f"Failed to parse step from json. Unknown type for {data}.")
54
55
 
55
56
 
@@ -67,12 +68,15 @@ class FlowStep:
67
68
  """Additional, unstructured information about this flow step."""
68
69
  next: FlowStepLinks
69
70
  """The next steps of the flow step."""
71
+ flow_id: Text
72
+ """The id of the flow that contains the step."""
70
73
 
71
74
  @classmethod
72
- def from_json(cls, data: Dict[Text, Any]) -> FlowStep:
75
+ def from_json(cls, flow_id: Text, data: Dict[Text, Any]) -> FlowStep:
73
76
  """Create a FlowStep object from data in a serialized format.
74
77
 
75
78
  Args:
79
+ flow_id: The id of the flow that contains the step.
76
80
  data: The data for a FlowStep object in a serialized format.
77
81
 
78
82
  Returns:
@@ -87,7 +91,8 @@ class FlowStep:
87
91
  custom_id=data.get("id"),
88
92
  description=data.get("description"),
89
93
  metadata=data.get("metadata", {}),
90
- next=FlowStepLinks.from_json(data.get("next", [])),
94
+ next=FlowStepLinks.from_json(flow_id, data.get("next", [])),
95
+ flow_id=flow_id,
91
96
  )
92
97
 
93
98
  def does_allow_for_next_step(self) -> bool:
@@ -125,7 +130,7 @@ class FlowStep:
125
130
  @property
126
131
  def default_id(self) -> str:
127
132
  """Returns the default id of the flow step."""
128
- return f"{self.idx}_{self.default_id_postfix}"
133
+ return f"{self.flow_id}_{self.idx}_{self.default_id_postfix}"
129
134
 
130
135
  @property
131
136
  def default_id_postfix(self) -> str:
@@ -17,10 +17,13 @@ class FlowStepLinks:
17
17
  links: List[FlowStepLink]
18
18
 
19
19
  @staticmethod
20
- def from_json(data: Union[str, List[Dict[Text, Any]]]) -> FlowStepLinks:
20
+ def from_json(
21
+ flow_id: Text, data: Union[str, List[Dict[Text, Any]]]
22
+ ) -> FlowStepLinks:
21
23
  """Create a FlowStepLinks object from a serialized data format.
22
24
 
23
25
  Args:
26
+ flow_id: The id of the flow that contains the step.
24
27
  data: data for a FlowStepLinks object in a serialized format.
25
28
 
26
29
  Returns:
@@ -30,11 +33,11 @@ class FlowStepLinks:
30
33
  return FlowStepLinks(links=[])
31
34
 
32
35
  if isinstance(data, str):
33
- return FlowStepLinks(links=[StaticFlowStepLink.from_json(data)])
36
+ return FlowStepLinks(links=[StaticFlowStepLink.from_json(flow_id, data)])
34
37
 
35
38
  return FlowStepLinks(
36
39
  links=[
37
- BranchingFlowStepLink.from_json(link_config)
40
+ BranchingFlowStepLink.from_json(flow_id, link_config)
38
41
  for link_config in data
39
42
  if link_config
40
43
  ]
@@ -94,10 +97,11 @@ class FlowStepLink:
94
97
  raise NotImplementedError()
95
98
 
96
99
  @staticmethod
97
- def from_json(data: Any) -> FlowStepLink:
100
+ def from_json(flow_id: Text, data: Any) -> FlowStepLink:
98
101
  """Create a FlowStepLink object from a serialized data format.
99
102
 
100
103
  Args:
104
+ flow_id: The id of the flow that contains the step.
101
105
  data: data for a FlowStepLink object in a serialized format.
102
106
 
103
107
  Returns:
@@ -163,19 +167,20 @@ class BranchingFlowStepLink(FlowStepLink):
163
167
  return self.target_reference
164
168
 
165
169
  @staticmethod
166
- def from_json(data: Dict[Text, Any]) -> BranchingFlowStepLink:
170
+ def from_json(flow_id: Text, data: Dict[Text, Any]) -> BranchingFlowStepLink:
167
171
  """Create a BranchingFlowStepLink object from a serialized data format.
168
172
 
169
173
  Args:
174
+ flow_id: The id of the flow that contains the step.
170
175
  data: data for a BranchingFlowStepLink object in a serialized format.
171
176
 
172
177
  Returns:
173
178
  a BranchingFlowStepLink object.
174
179
  """
175
180
  if "if" in data:
176
- return IfFlowStepLink.from_json(data)
181
+ return IfFlowStepLink.from_json(flow_id, data)
177
182
  else:
178
- return ElseFlowStepLink.from_json(data)
183
+ return ElseFlowStepLink.from_json(flow_id, data)
179
184
 
180
185
  def depth_in_tree(self) -> int:
181
186
  """Returns the depth in the tree."""
@@ -198,10 +203,11 @@ class IfFlowStepLink(BranchingFlowStepLink):
198
203
  """The condition that needs to be satisfied to follow this flow step link."""
199
204
 
200
205
  @staticmethod
201
- def from_json(data: Dict[Text, Any]) -> IfFlowStepLink:
206
+ def from_json(flow_id: Text, data: Dict[Text, Any]) -> IfFlowStepLink:
202
207
  """Create an IfFlowStepLink object from a serialized data format.
203
208
 
204
209
  Args:
210
+ flow_id: The id of the flow that contains the step.
205
211
  data: data for a IfFlowStepLink in a serialized format.
206
212
 
207
213
  Returns:
@@ -213,7 +219,7 @@ class IfFlowStepLink(BranchingFlowStepLink):
213
219
  return IfFlowStepLink(target_reference=data["then"], condition=data["if"])
214
220
  else:
215
221
  return IfFlowStepLink(
216
- target_reference=FlowStepSequence.from_json(data["then"]),
222
+ target_reference=FlowStepSequence.from_json(flow_id, data["then"]),
217
223
  condition=data["if"],
218
224
  )
219
225
 
@@ -238,10 +244,11 @@ class ElseFlowStepLink(BranchingFlowStepLink):
238
244
  """A flow step link that is taken when conditional flow step links weren't taken."""
239
245
 
240
246
  @staticmethod
241
- def from_json(data: Dict[Text, Any]) -> ElseFlowStepLink:
247
+ def from_json(flow_id: Text, data: Dict[Text, Any]) -> ElseFlowStepLink:
242
248
  """Create an ElseFlowStepLink object from serialized data.
243
249
 
244
250
  Args:
251
+ flow_id: The id of the flow that contains the step.
245
252
  data: data for an ElseFlowStepLink in a serialized format
246
253
 
247
254
  Returns:
@@ -253,7 +260,7 @@ class ElseFlowStepLink(BranchingFlowStepLink):
253
260
  return ElseFlowStepLink(target_reference=data["else"])
254
261
  else:
255
262
  return ElseFlowStepLink(
256
- target_reference=FlowStepSequence.from_json(data["else"])
263
+ target_reference=FlowStepSequence.from_json(flow_id, data["else"])
257
264
  )
258
265
 
259
266
  def as_json(self) -> Dict[Text, Any]:
@@ -279,10 +286,11 @@ class StaticFlowStepLink(FlowStepLink):
279
286
  """The id of the linked step."""
280
287
 
281
288
  @staticmethod
282
- def from_json(data: Text) -> StaticFlowStepLink:
289
+ def from_json(flow_id: Text, data: Text) -> StaticFlowStepLink:
283
290
  """Create a StaticFlowStepLink from serialized data
284
291
 
285
292
  Args:
293
+ flow_id: The id of the flow that contains the step.
286
294
  data: data for a StaticFlowStepLink in a serialized format
287
295
 
288
296
  Returns:
@@ -14,17 +14,19 @@ class FlowStepSequence:
14
14
  child_steps: List[FlowStep]
15
15
 
16
16
  @staticmethod
17
- def from_json(data: List[Dict[Text, Any]]) -> FlowStepSequence:
17
+ def from_json(flow_id: Text, data: List[Dict[Text, Any]]) -> FlowStepSequence:
18
18
  """Create a FlowStepSequence object from serialized data
19
19
 
20
20
  Args:
21
+ flow_id: The id of the flow that contains the step.
21
22
  data: data for a StepSequence in a serialized format
22
23
 
23
24
  Returns:
24
25
  A StepSequence object including its flow step objects.
25
26
  """
26
-
27
- flow_steps: List[FlowStep] = [step_from_json(config) for config in data]
27
+ flow_steps: List[FlowStep] = [
28
+ step_from_json(flow_id, config) for config in data
29
+ ]
28
30
 
29
31
  return FlowStepSequence(child_steps=flow_steps)
30
32
 
@@ -15,16 +15,17 @@ class ActionFlowStep(FlowStep):
15
15
  """The action of the flow step."""
16
16
 
17
17
  @classmethod
18
- def from_json(cls, data: Dict[Text, Any]) -> ActionFlowStep:
18
+ def from_json(cls, flow_id: Text, data: Dict[Text, Any]) -> ActionFlowStep:
19
19
  """Create an ActionFlowStep object from serialized data
20
20
 
21
21
  Args:
22
+ flow_id: The id of the flow that contains the step.
22
23
  data: data for an ActionFlowStep object in a serialized format
23
24
 
24
25
  Returns:
25
26
  An ActionFlowStep object
26
27
  """
27
- base = super().from_json(data)
28
+ base = super().from_json(flow_id, data)
28
29
  return ActionFlowStep(
29
30
  action=data["action"],
30
31
  **base.__dict__,
@@ -18,16 +18,17 @@ class CallFlowStep(FlowStep):
18
18
  called_flow_reference: Optional["Flow"] = None
19
19
 
20
20
  @classmethod
21
- def from_json(cls, data: Dict[Text, Any]) -> CallFlowStep:
21
+ def from_json(cls, flow_id: Text, data: Dict[Text, Any]) -> CallFlowStep:
22
22
  """Used to read flow steps from parsed YAML.
23
23
 
24
24
  Args:
25
+ flow_id: The id of the flow that contains the step.
25
26
  data: The parsed YAML as a dictionary.
26
27
 
27
28
  Returns:
28
29
  The parsed flow step.
29
30
  """
30
- base = super().from_json(data)
31
+ base = super().from_json(flow_id, data)
31
32
  return CallFlowStep(
32
33
  call=data.get("call", ""),
33
34
  **base.__dict__,
@@ -47,7 +48,6 @@ class CallFlowStep(FlowStep):
47
48
  self, should_resolve_calls: bool = True
48
49
  ) -> Generator[FlowStep, None, None]:
49
50
  """Returns the steps in the tree of the flow step."""
50
-
51
51
  yield self
52
52
 
53
53
  if should_resolve_calls:
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import Dict, Any, List, Set
4
+ from typing import Dict, Any, List, Set, Text
5
5
 
6
6
  from rasa.shared.constants import UTTER_ASK_PREFIX, ACTION_ASK_PREFIX
7
7
  from rasa.shared.core.flows.flow_step import FlowStep
@@ -61,16 +61,19 @@ class CollectInformationFlowStep(FlowStep):
61
61
  """Whether to reset the slot value at the end of the flow."""
62
62
 
63
63
  @classmethod
64
- def from_json(cls, data: Dict[str, Any]) -> CollectInformationFlowStep:
64
+ def from_json(
65
+ cls, flow_id: Text, data: Dict[str, Any]
66
+ ) -> CollectInformationFlowStep:
65
67
  """Create a CollectInformationFlowStep object from serialized data.
66
68
 
67
69
  Args:
70
+ flow_id: The id of the flow that contains the step.
68
71
  data: data for a CollectInformationFlowStep object in a serialized format
69
72
 
70
73
  Returns:
71
74
  A CollectInformationFlowStep object
72
75
  """
73
- base = super().from_json(data)
76
+ base = super().from_json(flow_id, data)
74
77
  return CollectInformationFlowStep(
75
78
  collect=data["collect"],
76
79
  utter=data.get("utter", f"{UTTER_ASK_PREFIX}{data['collect']}"),
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
+ from typing import Text
4
5
 
5
6
  from rasa.shared.core.flows.flow_step_links import FlowStepLinks, StaticFlowStepLink
6
7
  from rasa.shared.core.flows.steps.constants import (
@@ -14,7 +15,7 @@ from rasa.shared.core.flows.steps.internal import InternalFlowStep
14
15
  class ContinueFlowStep(InternalFlowStep):
15
16
  """A flow step that is dynamically introduced to jump to other flow steps."""
16
17
 
17
- def __init__(self, target_step_id: str) -> None:
18
+ def __init__(self, flow_id: Text, target_step_id: str) -> None:
18
19
  """Initializes a continue-step flow step."""
19
20
  super().__init__(
20
21
  idx=UNSET_FLOW_STEP_ID,
@@ -29,6 +30,7 @@ class ContinueFlowStep(InternalFlowStep):
29
30
  # This is why the continue step links to the step that should be
30
31
  # continued.
31
32
  next=FlowStepLinks(links=[StaticFlowStepLink(target_step_id)]),
33
+ flow_id=flow_id,
32
34
  )
33
35
 
34
36
  @staticmethod
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
+ from typing import Text
4
5
 
5
6
  from rasa.shared.core.flows.flow_step_links import FlowStepLinks
6
7
  from rasa.shared.core.flows.steps.constants import END_STEP, UNSET_FLOW_STEP_ID
@@ -11,7 +12,7 @@ from rasa.shared.core.flows.steps.internal import InternalFlowStep
11
12
  class EndFlowStep(InternalFlowStep):
12
13
  """A dynamically added flow step that marks the end of a flow."""
13
14
 
14
- def __init__(self) -> None:
15
+ def __init__(self, flow_id: Text) -> None:
15
16
  """Initializes an end flow step."""
16
17
  super().__init__(
17
18
  idx=UNSET_FLOW_STEP_ID,
@@ -19,4 +20,5 @@ class EndFlowStep(InternalFlowStep):
19
20
  description=None,
20
21
  metadata={},
21
22
  next=FlowStepLinks(links=[]),
23
+ flow_id=flow_id,
22
24
  )
@@ -13,10 +13,11 @@ class InternalFlowStep(FlowStep):
13
13
  """
14
14
 
15
15
  @classmethod
16
- def from_json(cls, data: Dict[Text, Any]) -> InternalFlowStep:
16
+ def from_json(cls, flow_id: Text, data: Dict[Text, Any]) -> InternalFlowStep:
17
17
  """Create an InternalFlowStep object from serialized data.
18
18
 
19
19
  Args:
20
+ flow_id: The id of the flow that contains the step.
20
21
  data: data for an InternalFlowStep in a serialized format
21
22
 
22
23
  Returns:
@@ -16,20 +16,22 @@ class LinkFlowStep(FlowStep):
16
16
  def does_allow_for_next_step(self) -> bool:
17
17
  """Returns whether this step allows for following steps.
18
18
 
19
- Link steps need to be terminal steps, so can't have a next step."""
19
+ Link steps need to be terminal steps, so can't have a next step.
20
+ """
20
21
  return False
21
22
 
22
23
  @classmethod
23
- def from_json(cls, data: Dict[Text, Any]) -> LinkFlowStep:
24
+ def from_json(cls, flow_id: Text, data: Dict[Text, Any]) -> LinkFlowStep:
24
25
  """Create a LinkFlowStep from serialized data
25
26
 
26
27
  Args:
28
+ flow_id: The id of the flow that contains the step.
27
29
  data: data for a LinkFlowStep in a serialized format
28
30
 
29
31
  Returns:
30
32
  a LinkFlowStep object
31
33
  """
32
- base = super().from_json(data)
34
+ base = super().from_json(flow_id, data)
33
35
  return LinkFlowStep(
34
36
  link=data["link"],
35
37
  **base.__dict__,
@@ -11,22 +11,24 @@ class NoOperationFlowStep(FlowStep):
11
11
  """A step that doesn't do a thing.
12
12
 
13
13
  This is NOT a branching step (but it can branch - but in addition to that
14
- it also does nothing)."""
14
+ it also does nothing).
15
+ """
15
16
 
16
17
  noop: Any
17
18
  """The id of the flow that should be started subsequently."""
18
19
 
19
20
  @classmethod
20
- def from_json(cls, data: Dict[Text, Any]) -> NoOperationFlowStep:
21
+ def from_json(cls, flow_id: Text, data: Dict[Text, Any]) -> NoOperationFlowStep:
21
22
  """Create a NoOperationFlowStep from serialized data
22
23
 
23
24
  Args:
25
+ flow_id: The id of the flow that contains the step.
24
26
  data: data for a NoOperationFlowStep in a serialized format
25
27
 
26
28
  Returns:
27
29
  a NoOperationFlowStep object
28
30
  """
29
- base = super().from_json(data)
31
+ base = super().from_json(flow_id, data)
30
32
  return NoOperationFlowStep(
31
33
  noop=data["noop"],
32
34
  **base.__dict__,
@@ -14,16 +14,17 @@ class SetSlotsFlowStep(FlowStep):
14
14
  """Slots and their values to set in the flow step."""
15
15
 
16
16
  @classmethod
17
- def from_json(cls, data: Dict[Text, Any]) -> SetSlotsFlowStep:
17
+ def from_json(cls, flow_id: Text, data: Dict[Text, Any]) -> SetSlotsFlowStep:
18
18
  """Create a SetSlotsFlowStep from serialized data
19
19
 
20
20
  Args:
21
+ flow_id: The id of the flow that contains the step.
21
22
  data: data for a SetSlotsFlowStep in a serialized format
22
23
 
23
24
  Returns:
24
25
  a SetSlotsFlowStep object
25
26
  """
26
- base = super().from_json(data)
27
+ base = super().from_json(flow_id, data)
27
28
  slots = [
28
29
  {"key": k, "value": v}
29
30
  for slot_sets in data["set_slots"]
@@ -15,10 +15,11 @@ from rasa.shared.core.flows.steps.internal import InternalFlowStep
15
15
  class StartFlowStep(InternalFlowStep):
16
16
  """A dynamically added flow step that represents the beginning of a flow."""
17
17
 
18
- def __init__(self, start_step_id: Text) -> None:
18
+ def __init__(self, flow_id: Text, start_step_id: Text) -> None:
19
19
  """Initializes a start flow step.
20
20
 
21
21
  Args:
22
+ flow_id: The id of the flow that contains the step
22
23
  start_step_id: The step id of the first step of the flow
23
24
  """
24
25
  super().__init__(
@@ -27,4 +28,5 @@ class StartFlowStep(InternalFlowStep):
27
28
  description=None,
28
29
  metadata={},
29
30
  next=FlowStepLinks(links=[StaticFlowStepLink(start_step_id)]),
31
+ flow_id=flow_id,
30
32
  )