rasa-pro 3.9.17__py3-none-any.whl → 3.9.19__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.

README.md CHANGED
@@ -10,39 +10,35 @@
10
10
 
11
11
  <hr />
12
12
 
13
- <img align="right" height="255" src="https://www.rasa.com/assets/img/sara/sara-open-source-2.0.png" alt="An image of Sara, the Rasa mascot bird, holding a flag that reads Open Source with one wing, and a wrench in the other" title="Rasa Pro">
14
13
 
15
- Rasa Pro is an open core product that extends Rasa Open Source. With over 50 million downloads, Rasa Open Source is the most popular open source framework for building chat and voice-based AI assistants.
14
+ Rasa Pro is a framework for building scalable, dynamic conversational AI assistants that integrate large language models (LLMs) to enable more contextually aware and agentic interactions. Whether you’re new to conversational AI or an experienced developer, Rasa Pro offers enhanced flexibility, control, and performance for mission-critical applications.
16
15
 
17
- Rasa Pro introduces CALM, a generative AI-native approach to developing assistants, combined with enterprise-ready analytics, security, and observability capabilities. A paid license is required to run Rasa Pro, but all Rasa Pro code is visible to end users and can be customized as needed.
16
+ Building on the foundation of Rasa Open Source, Rasa Pro adds advanced features like CALM (Conversational AI with Language Models) and Dialogue Understanding (DU), which enable developers to shift from traditional intent-driven systems to LLM-based agents. This allows for more robust, responsive interactions that adhere strictly to business logic, while reducing risks like prompt injection and minimizing hallucinations.
18
17
 
19
- Rasa Pro is the pro-code component of our enterprise solution, Rasa Platform, for implementing resilient and trustworthy AI assistants at scale. Rasa Studio complements Rasa Pro with a low-code user interface, enabling anyone on your team to create and improve your assistant.
18
+ **Key Features:**
20
19
 
21
- ---
22
- - 🤓 [Read The Docs](https://rasa.com/docs/rasa-pro/)
20
+ - **Flows for Business Logic:** Easily define business logic through Flows, a simplified way to describe how your AI assistant should handle conversations. Flows help streamline the development process, focusing on key tasks and reducing the complexity involved in managing conversations.
21
+ - **Automatic Conversation Repair:** Ensure seamless interactions by automatically handling interruptions or unexpected inputs. Developers have full control to customize these repairs based on specific use cases.
22
+ - **Customizable and Open:** Fully customizable code that allows developers to modify Rasa Pro to meet specific requirements, ensuring flexibility and adaptability to various conversational AI needs.
23
+ - **Robustness and Control:** Maintain strict adherence to business logic, preventing unwanted behaviors like prompt injection and hallucinations, leading to more reliable responses and secure interactions.
24
+ - **Built-in Security:** Safeguard sensitive data, control access, and ensure secure deployment, essential for production environments that demand high levels of security and compliance.
23
25
 
24
- - 😁 [Install Rasa Pro](https://rasa.com/docs/rasa-pro/installation/python/installation)
25
26
 
26
- ---
27
27
 
28
- ## README Contents:
29
- - [Development Internals](#development-internals)
30
- - [Releases](#releases)
31
- - [Troubleshooting](#troubleshooting)
28
+ A [free developer license](https://rasa.com/docs/rasa-pro/developer-edition/) is available so you can explore and get to know Rasa Pro. For small production deployments, the Extended Developer License allows you to take your assistant live in a limited capacity. A paid license is required for larger-scale production use, but all code is visible and can be customized as needed.
32
29
 
33
- ## Development Internals
30
+ To get started right now, you can
34
31
 
35
- ### Installing Poetry
32
+ `pip install rasa-pro`
36
33
 
37
- Rasa uses Poetry for packaging and dependency management. If you want to build it from source,
38
- you have to install Poetry first. Please follow
39
- [the official guide](https://python-poetry.org/docs/#installation) to see all possible options.
34
+ Check out our
40
35
 
41
- To update an existing poetry version to the [version](.github/poetry_version.txt), currently used in rasa, run:
42
- ```shell
43
- poetry self update <version>
44
- ```
36
+ - [Rasa-pro Quickstart](https://rasa.com/docs/rasa-pro/installation/quickstart/),
37
+ - [Conversational AI with Language Models (CALM) conceptual rundown](https://rasa.com/docs/rasa-pro/calm/),
38
+ - [Rasa Pro / CALM tutorial](https://rasa.com/docs/rasa-pro/tutorial), and
39
+ - [Rasa pro changelog](https://rasa.com/docs/rasa/rasa-pro-changelog/)
45
40
 
41
+ <<<<<<< HEAD
46
42
  ### Managing environments
47
43
 
48
44
  The official [Poetry guide](https://python-poetry.org/docs/managing-environments/) suggests to use
@@ -414,3 +410,6 @@ Please refer to the [Rasa Product Release and Maintenance Policy](https://rasa.c
414
410
  ```
415
411
 
416
412
  For more information on this command, please see the [Official Docker Documentation](https://docs.docker.com/engine/reference/commandline/system_prune/).
413
+ =======
414
+ for more. Also feel free to reach out to us on the [Rasa forum](https://forum.rasa.com/).
415
+ >>>>>>> 2c5cd7bc639 (update readme.md from main branch on 3.10.x (#1597))
@@ -17,6 +17,7 @@
17
17
  <script>
18
18
  const chatDiv = document.getElementById("rasa-chat-widget");
19
19
  const websocketUrl = window.location.origin.replace("http", "ws");
20
+ const initialPayload = "/session_start";
20
21
  const maxHeight = document.documentElement.scrollHeight - 130;
21
22
  // 21 and 25 are the rem number we're using for the columns. We add 0.75rem for the padding
22
23
  // A potential improvement would be to add a onresize event for both width and height
@@ -28,6 +29,7 @@
28
29
  const columnWidth = remReference * parseFloat(getComputedStyle(document.documentElement).fontSize);
29
30
 
30
31
  chatDiv.setAttribute("data-websocket-url", websocketUrl);
32
+ chatDiv.setAttribute("data-initial-payload", initialPayload);
31
33
  chatDiv.setAttribute("data-close-on-outside-click", false);
32
34
  chatDiv.setAttribute("data-height", maxHeight);
33
35
  chatDiv.setAttribute("data-width", columnWidth);
@@ -15,6 +15,7 @@
15
15
  <script>
16
16
  const chatDiv = document.getElementById("rasa-chat-widget");
17
17
  const websocketUrl = window.location.origin.replace("http", "ws");
18
+ const initialPayload = "/session_start";
18
19
  const maxHeight = document.documentElement.scrollHeight - 130;
19
20
  // 21 and 25 are the rem number we're using for the columns. We add 0.75rem for the padding
20
21
  // A potential improvement would be to add a onresize event for both width and height
@@ -26,6 +27,7 @@
26
27
  const columnWidth = remReference * parseFloat(getComputedStyle(document.documentElement).fontSize);
27
28
 
28
29
  chatDiv.setAttribute("data-websocket-url", websocketUrl);
30
+ chatDiv.setAttribute("data-initial-payload", initialPayload);
29
31
  chatDiv.setAttribute("data-close-on-outside-click", false);
30
32
  chatDiv.setAttribute("data-height", maxHeight);
31
33
  chatDiv.setAttribute("data-width", columnWidth);
@@ -476,7 +476,8 @@ def validate_collect_step(
476
476
  step: CollectInformationFlowStep,
477
477
  stack: DialogueStack,
478
478
  available_actions: List[str],
479
- slots: Dict[Text, Slot],
479
+ slots: Dict[str, Slot],
480
+ flow_name: str,
480
481
  ) -> bool:
481
482
  """Validate that a collect step can be executed.
482
483
 
@@ -498,12 +499,12 @@ def validate_collect_step(
498
499
  slot_name=step.collect,
499
500
  )
500
501
 
501
- cancel_flow_and_push_internal_error(stack)
502
+ cancel_flow_and_push_internal_error(stack, flow_name)
502
503
 
503
504
  return False
504
505
 
505
506
 
506
- def cancel_flow_and_push_internal_error(stack: DialogueStack) -> None:
507
+ def cancel_flow_and_push_internal_error(stack: DialogueStack, flow_name: str) -> None:
507
508
  """Cancel the top user flow and push the internal error pattern."""
508
509
  top_frame = stack.top()
509
510
 
@@ -515,7 +516,7 @@ def cancel_flow_and_push_internal_error(stack: DialogueStack) -> None:
515
516
  canceled_frames = CancelFlowCommand.select_canceled_frames(stack)
516
517
  stack.push(
517
518
  CancelPatternFlowStackFrame(
518
- canceled_name=top_frame.flow_id,
519
+ canceled_name=flow_name,
519
520
  canceled_frames=canceled_frames,
520
521
  )
521
522
  )
@@ -527,6 +528,7 @@ def validate_custom_slot_mappings(
527
528
  stack: DialogueStack,
528
529
  tracker: DialogueStateTracker,
529
530
  available_actions: List[str],
531
+ flow_name: str,
530
532
  ) -> bool:
531
533
  """Validate a slot with custom mappings.
532
534
 
@@ -547,7 +549,7 @@ def validate_custom_slot_mappings(
547
549
  action=step.collect_action,
548
550
  collect=step.collect,
549
551
  )
550
- cancel_flow_and_push_internal_error(stack)
552
+ cancel_flow_and_push_internal_error(stack, flow_name)
551
553
  return False
552
554
 
553
555
  return True
@@ -586,30 +588,15 @@ def run_step(
586
588
  initial_events.append(FlowStarted(flow.id))
587
589
 
588
590
  if isinstance(step, CollectInformationFlowStep):
589
- is_step_valid = validate_collect_step(
590
- step, stack, available_actions, tracker.slots
591
- )
592
- if not is_step_valid:
593
- # if we return any other FlowStepResult, the assistant will stay silent
594
- # instead of triggering the internal error pattern
595
- return ContinueFlowWithNextStep(events=initial_events)
596
-
597
- is_mapping_valid = validate_custom_slot_mappings(
598
- step, stack, tracker, available_actions
599
- )
600
- if not is_mapping_valid:
601
- # if we return any other FlowStepResult, the assistant will stay silent
602
- # instead of triggering the internal error pattern
603
- return ContinueFlowWithNextStep(events=initial_events)
604
-
605
- structlogger.debug("flow.step.run.collect")
606
- trigger_pattern_ask_collect_information(
607
- step.collect, stack, step.rejections, step.utter, step.collect_action
591
+ return _run_collect_information_step(
592
+ available_actions,
593
+ initial_events,
594
+ stack,
595
+ step,
596
+ tracker,
597
+ flow.readable_name(),
608
598
  )
609
599
 
610
- events: List[Event] = events_for_collect_step_execution(step, tracker)
611
- return ContinueFlowWithNextStep(events=initial_events + events)
612
-
613
600
  elif isinstance(step, ActionFlowStep):
614
601
  if not step.action:
615
602
  raise FlowException(f"Action not specified for step {step}")
@@ -682,3 +669,37 @@ def run_step(
682
669
 
683
670
  else:
684
671
  raise FlowException(f"Unknown flow step type {type(step)}")
672
+
673
+
674
+ def _run_collect_information_step(
675
+ available_actions: List[str],
676
+ initial_events: List[Event],
677
+ stack: DialogueStack,
678
+ step: CollectInformationFlowStep,
679
+ tracker: DialogueStateTracker,
680
+ flow_name: str,
681
+ ) -> FlowStepResult:
682
+ is_step_valid = validate_collect_step(
683
+ step, stack, available_actions, tracker.slots, flow_name
684
+ )
685
+
686
+ if not is_step_valid:
687
+ # if we return any other FlowStepResult, the assistant will stay silent
688
+ # instead of triggering the internal error pattern
689
+ return ContinueFlowWithNextStep(events=initial_events)
690
+ is_mapping_valid = validate_custom_slot_mappings(
691
+ step, stack, tracker, available_actions, flow_name
692
+ )
693
+
694
+ if not is_mapping_valid:
695
+ # if we return any other FlowStepResult, the assistant will stay silent
696
+ # instead of triggering the internal error pattern
697
+ return ContinueFlowWithNextStep(events=initial_events)
698
+
699
+ structlogger.debug("flow.step.run.collect")
700
+ trigger_pattern_ask_collect_information(
701
+ step.collect, stack, step.rejections, step.utter, step.collect_action
702
+ )
703
+
704
+ events: List[Event] = events_for_collect_step_execution(step, tracker)
705
+ return ContinueFlowWithNextStep(events=initial_events + events)
rasa/core/processor.py CHANGED
@@ -1260,11 +1260,13 @@ class MessageProcessor:
1260
1260
  tracker.update(events[0])
1261
1261
  return self.should_predict_another_action(action.name())
1262
1262
  except Exception:
1263
- logger.exception(
1264
- f"Encountered an exception while running action '{action.name()}'."
1265
- "Bot will continue, but the actions events are lost. "
1266
- "Please check the logs of your action server for "
1267
- "more information."
1263
+ structlogger.exception(
1264
+ "rasa.core.processor.run_action.exception",
1265
+ event_info=f"Encountered an exception while "
1266
+ f"running action '{action.name()}'."
1267
+ f"Bot will continue, but the actions events are lost. "
1268
+ f"Please check the logs of your action server for "
1269
+ f"more information.",
1268
1270
  )
1269
1271
  events = []
1270
1272
 
@@ -40,3 +40,12 @@ class ContinueInterruptedPatternFlowStackFrame(PatternFlowStackFrame):
40
40
  step_id=data["step_id"],
41
41
  previous_flow_name=data["previous_flow_name"],
42
42
  )
43
+
44
+ def __eq__(self, other: Any) -> bool:
45
+ if not isinstance(other, ContinueInterruptedPatternFlowStackFrame):
46
+ return False
47
+ return (
48
+ self.flow_id == other.flow_id
49
+ and self.step_id == other.step_id
50
+ and self.previous_flow_name == other.previous_flow_name
51
+ )
@@ -77,6 +77,7 @@ def top_user_flow_frame(dialogue_stack: DialogueStack) -> Optional[UserFlowStack
77
77
  if (
78
78
  isinstance(frame, UserFlowStackFrame)
79
79
  and frame.frame_type != FlowStackFrameType.CALL
80
+ and frame.frame_type != FlowStackFrameType.LINK
80
81
  ):
81
82
  return frame
82
83
  return None
@@ -103,8 +103,11 @@ class E2ETestRunner:
103
103
  turns: TEST_TURNS_TYPE = {}
104
104
  event_cursor = 0
105
105
 
106
- tracker = await self.agent.processor.fetch_tracker_with_initial_session( # type: ignore[union-attr]
107
- sender_id
106
+ if not self.agent.processor:
107
+ return turns
108
+
109
+ tracker = await self.agent.processor.fetch_tracker_with_initial_session(
110
+ sender_id, output_channel=collector
108
111
  )
109
112
  # turn -1 i used to contain events that happen during
110
113
  # the start of the session and before the first user message
@@ -157,7 +160,7 @@ class E2ETestRunner:
157
160
  f"An exception occurred while handling "
158
161
  f"user message '{step.text}'."
159
162
  )
160
- tracker = await self.agent.tracker_store.retrieve(sender_id)
163
+ tracker = await self.agent.tracker_store.retrieve(sender_id) # type: ignore[assignment]
161
164
  turns[position], event_cursor = self.get_actual_step_output(
162
165
  tracker, step, event_cursor
163
166
  )
@@ -592,8 +595,11 @@ class E2ETestRunner:
592
595
  """
593
596
  if not fixtures:
594
597
  return
595
- tracker = await self.agent.processor.fetch_tracker_with_initial_session( # type: ignore[union-attr]
596
- sender_id
598
+ if not self.agent.processor:
599
+ return
600
+
601
+ tracker = await self.agent.processor.fetch_tracker_with_initial_session(
602
+ sender_id, output_channel=CollectingOutputChannel()
597
603
  )
598
604
 
599
605
  for fixture in fixtures:
@@ -1,5 +1,4 @@
1
1
  from __future__ import annotations
2
- import copy
3
2
  import logging
4
3
  from typing import Any, List, Text, Dict, Type, Union, Tuple, Optional
5
4
 
@@ -185,8 +184,6 @@ def undo_fallback_prediction(prediction: Dict[Text, Any]) -> Dict[Text, Any]:
185
184
  if len(intent_ranking) < 2:
186
185
  return prediction
187
186
 
188
- prediction = copy.deepcopy(prediction)
189
187
  prediction[INTENT] = intent_ranking[1]
190
188
  prediction[INTENT_RANKING_KEY] = prediction[INTENT_RANKING_KEY][1:]
191
-
192
189
  return prediction
@@ -63,7 +63,7 @@ class Flow:
63
63
  Returns:
64
64
  A Flow object.
65
65
  """
66
- step_sequence = FlowStepSequence.from_json(data.get("steps"))
66
+ step_sequence = FlowStepSequence.from_json(flow_id, data.get("steps"))
67
67
  nlu_triggers = NLUTriggers.from_json(data.get("nlu_trigger"))
68
68
 
69
69
  return Flow(
@@ -153,13 +153,13 @@ class Flow:
153
153
  return None
154
154
 
155
155
  if step_id == START_STEP:
156
- return StartFlowStep(self.first_step_in_flow().id)
156
+ return StartFlowStep(self.id, self.first_step_in_flow().id)
157
157
 
158
158
  if step_id == END_STEP:
159
- return EndFlowStep()
159
+ return EndFlowStep(self.id)
160
160
 
161
161
  if step_id.startswith(CONTINUE_STEP_PREFIX):
162
- return ContinueFlowStep(step_id[len(CONTINUE_STEP_PREFIX) :])
162
+ return ContinueFlowStep(self.id, step_id[len(CONTINUE_STEP_PREFIX) :])
163
163
 
164
164
  for step in self.steps_with_calls_resolved:
165
165
  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
  )
rasa/shared/utils/llm.py CHANGED
@@ -52,7 +52,7 @@ DEFAULT_OPENAI_GENERATE_MODEL_NAME = "gpt-3.5-turbo"
52
52
 
53
53
  DEFAULT_OPENAI_CHAT_MODEL_NAME = "gpt-3.5-turbo"
54
54
 
55
- DEFAULT_OPENAI_CHAT_MODEL_NAME_ADVANCED = "gpt-4"
55
+ DEFAULT_OPENAI_CHAT_MODEL_NAME_ADVANCED = "gpt-4-0613"
56
56
 
57
57
  DEFAULT_OPENAI_EMBEDDING_MODEL_NAME = "text-embedding-ada-002"
58
58
 
rasa/version.py CHANGED
@@ -1,3 +1,3 @@
1
1
  # this file will automatically be changed,
2
2
  # do not add anything but the version number here!
3
- __version__ = "3.9.17"
3
+ __version__ = "3.9.19"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rasa-pro
3
- Version: 3.9.17
3
+ Version: 3.9.19
4
4
  Summary: State-of-the-art open-core Conversational AI framework for Enterprises that natively leverages generative AI for effortless assistant development.
5
5
  Home-page: https://rasa.com
6
6
  Keywords: nlp,machine-learning,machine-learning-library,bot,bots,botkit,rasa conversational-agents,conversational-ai,chatbot,chatbot-framework,bot-framework
@@ -54,7 +54,7 @@ Requires-Dist: importlib-resources (>=6.1.1,<7.0.0)
54
54
  Requires-Dist: jieba (>=0.42.1,<0.43) ; extra == "jieba" or extra == "full"
55
55
  Requires-Dist: jinja2 (>=3.1.4,<4.0.0)
56
56
  Requires-Dist: jsonpatch (>=1.33,<2.0)
57
- Requires-Dist: jsonpickle (>=3.0,<3.1)
57
+ Requires-Dist: jsonpickle (>=3.3.0,<3.4)
58
58
  Requires-Dist: jsonschema (>=4.20,<4.21)
59
59
  Requires-Dist: keras (==2.14.0)
60
60
  Requires-Dist: langchain (>=0.0.329,<0.0.330)
@@ -157,39 +157,35 @@ Description-Content-Type: text/markdown
157
157
 
158
158
  <hr />
159
159
 
160
- <img align="right" height="255" src="https://www.rasa.com/assets/img/sara/sara-open-source-2.0.png" alt="An image of Sara, the Rasa mascot bird, holding a flag that reads Open Source with one wing, and a wrench in the other" title="Rasa Pro">
161
160
 
162
- Rasa Pro is an open core product that extends Rasa Open Source. With over 50 million downloads, Rasa Open Source is the most popular open source framework for building chat and voice-based AI assistants.
161
+ Rasa Pro is a framework for building scalable, dynamic conversational AI assistants that integrate large language models (LLMs) to enable more contextually aware and agentic interactions. Whether you’re new to conversational AI or an experienced developer, Rasa Pro offers enhanced flexibility, control, and performance for mission-critical applications.
163
162
 
164
- Rasa Pro introduces CALM, a generative AI-native approach to developing assistants, combined with enterprise-ready analytics, security, and observability capabilities. A paid license is required to run Rasa Pro, but all Rasa Pro code is visible to end users and can be customized as needed.
163
+ Building on the foundation of Rasa Open Source, Rasa Pro adds advanced features like CALM (Conversational AI with Language Models) and Dialogue Understanding (DU), which enable developers to shift from traditional intent-driven systems to LLM-based agents. This allows for more robust, responsive interactions that adhere strictly to business logic, while reducing risks like prompt injection and minimizing hallucinations.
165
164
 
166
- Rasa Pro is the pro-code component of our enterprise solution, Rasa Platform, for implementing resilient and trustworthy AI assistants at scale. Rasa Studio complements Rasa Pro with a low-code user interface, enabling anyone on your team to create and improve your assistant.
165
+ **Key Features:**
167
166
 
168
- ---
169
- - 🤓 [Read The Docs](https://rasa.com/docs/rasa-pro/)
167
+ - **Flows for Business Logic:** Easily define business logic through Flows, a simplified way to describe how your AI assistant should handle conversations. Flows help streamline the development process, focusing on key tasks and reducing the complexity involved in managing conversations.
168
+ - **Automatic Conversation Repair:** Ensure seamless interactions by automatically handling interruptions or unexpected inputs. Developers have full control to customize these repairs based on specific use cases.
169
+ - **Customizable and Open:** Fully customizable code that allows developers to modify Rasa Pro to meet specific requirements, ensuring flexibility and adaptability to various conversational AI needs.
170
+ - **Robustness and Control:** Maintain strict adherence to business logic, preventing unwanted behaviors like prompt injection and hallucinations, leading to more reliable responses and secure interactions.
171
+ - **Built-in Security:** Safeguard sensitive data, control access, and ensure secure deployment, essential for production environments that demand high levels of security and compliance.
170
172
 
171
- - 😁 [Install Rasa Pro](https://rasa.com/docs/rasa-pro/installation/python/installation)
172
173
 
173
- ---
174
174
 
175
- ## README Contents:
176
- - [Development Internals](#development-internals)
177
- - [Releases](#releases)
178
- - [Troubleshooting](#troubleshooting)
175
+ A [free developer license](https://rasa.com/docs/rasa-pro/developer-edition/) is available so you can explore and get to know Rasa Pro. For small production deployments, the Extended Developer License allows you to take your assistant live in a limited capacity. A paid license is required for larger-scale production use, but all code is visible and can be customized as needed.
179
176
 
180
- ## Development Internals
177
+ To get started right now, you can
181
178
 
182
- ### Installing Poetry
179
+ `pip install rasa-pro`
183
180
 
184
- Rasa uses Poetry for packaging and dependency management. If you want to build it from source,
185
- you have to install Poetry first. Please follow
186
- [the official guide](https://python-poetry.org/docs/#installation) to see all possible options.
181
+ Check out our
187
182
 
188
- To update an existing poetry version to the [version](.github/poetry_version.txt), currently used in rasa, run:
189
- ```shell
190
- poetry self update <version>
191
- ```
183
+ - [Rasa-pro Quickstart](https://rasa.com/docs/rasa-pro/installation/quickstart/),
184
+ - [Conversational AI with Language Models (CALM) conceptual rundown](https://rasa.com/docs/rasa-pro/calm/),
185
+ - [Rasa Pro / CALM tutorial](https://rasa.com/docs/rasa-pro/tutorial), and
186
+ - [Rasa pro changelog](https://rasa.com/docs/rasa/rasa-pro-changelog/)
192
187
 
188
+ <<<<<<< HEAD
193
189
  ### Managing environments
194
190
 
195
191
  The official [Poetry guide](https://python-poetry.org/docs/managing-environments/) suggests to use
@@ -561,4 +557,7 @@ Please refer to the [Rasa Product Release and Maintenance Policy](https://rasa.c
561
557
  ```
562
558
 
563
559
  For more information on this command, please see the [Official Docker Documentation](https://docs.docker.com/engine/reference/commandline/system_prune/).
560
+ =======
561
+ for more. Also feel free to reach out to us on the [Rasa forum](https://forum.rasa.com/).
562
+ >>>>>>> 2c5cd7bc639 (update readme.md from main branch on 3.10.x (#1597))
564
563
 
@@ -1,4 +1,4 @@
1
- README.md,sha256=H0c0jrlyOrGm8UOM1MfggcrCDfwry3Gak7IuJ5RqpPA,23138
1
+ README.md,sha256=i205Tmh_mTyKYrm09rgjd5CjkaabXYzMhSK6zNoyutc,24262
2
2
  rasa/__init__.py,sha256=GmsfxCbHI9hPTvgeUA_r8mr1WmNZ35jq1BOuQ7tzWr4,280
3
3
  rasa/__main__.py,sha256=yjgc3M3Ga2oOhTaqciL6AW3io-wvtcH4pSbQDmgDr0k,5602
4
4
  rasa/anonymization/__init__.py,sha256=Z-ZUW2ofZGfI6ysjYIS7U0JL4JSzDNOkHiiXK488Zik,86
@@ -178,8 +178,8 @@ rasa/core/channels/inspector/dist/assets/styles-9c745c82-f0fc6921.js,sha256=LQKL
178
178
  rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-ef3c5a77.js,sha256=DSdBJHhg90UYRnWjFOmeR83QGVX10N62afFU2lIM0p0,1304
179
179
  rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-bf3e91c1.js,sha256=vA1r0ZS5HZygWBg4WDkqzjyeBGB10DLeuHOJEd_D1Yg,22627
180
180
  rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-4d4026c0.js,sha256=snRQD2cXkJf9VdmGnsrBVm3iqMSII0HXF_Ytri39LZE,37268
181
- rasa/core/channels/inspector/dist/index.html,sha256=02UAsBCSlIaqwlnpC2cfN1ML6o-LWtAx_8AxEEgVR2s,2483
182
- rasa/core/channels/inspector/index.html,sha256=ywJio90S8eUhPaeId87__l-Xj-3eXfwckZlJncsQ-OU,1423
181
+ rasa/core/channels/inspector/dist/index.html,sha256=xM57yI-zs94jO3Ab1Ncnl0BtuhT1UIdYoD4NL3OlUHQ,2594
182
+ rasa/core/channels/inspector/index.html,sha256=Zs5n96nppdGdoVp4A4_hsA9GThy0vne5j0wAZeM-JFw,1534
183
183
  rasa/core/channels/inspector/jest.config.ts,sha256=pDs-0q6gs0Jnm9mWKq5M1vC5wiX_Cnh4l6s--dBsskM,406
184
184
  rasa/core/channels/inspector/package.json,sha256=9QaJDSfrNm0ESF2-ohktVjdpP8ZhjuO-fSMhOEw8Qm8,1377
185
185
  rasa/core/channels/inspector/setupTests.ts,sha256=JaGsnR6noIcuD5kLjb9SiOkXwJARLV_gF0dULtlWPqk,75
@@ -291,7 +291,7 @@ rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2,sha256
291
291
  rasa/core/policies/flow_policy.py,sha256=wGb1l_59cGM9ZaexSIK5uXFi618739oNfLOxx2FC0_Y,7490
292
292
  rasa/core/policies/flows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
293
293
  rasa/core/policies/flows/flow_exceptions.py,sha256=_FQuN-cerQDM1pivce9bz4zylh5UYkljvYS1gjDukHI,1527
294
- rasa/core/policies/flows/flow_executor.py,sha256=amHXqN-Rrkv5YFjHJ3Pzd22PzGEEw_UQaQsKulFQVao,23856
294
+ rasa/core/policies/flows/flow_executor.py,sha256=8n1rVnclQrYEhXsi8t3yJZUDh990FzwHu9PFNg2fRks,24319
295
295
  rasa/core/policies/flows/flow_step_result.py,sha256=agjPrD6lahGSe2ViO5peBeoMdI9ngVGRSgtytgxmJmg,1360
296
296
  rasa/core/policies/intentless_policy.py,sha256=rkjO2ol-1p-umUyj9et2cVLwglrx43iV1mb1iZDsH4k,33444
297
297
  rasa/core/policies/intentless_prompt_template.jinja2,sha256=KhIL3cruMmkxhrs5oVbqgSvK6ZiN_6TQ_jXrgtEB-ZY,677
@@ -300,7 +300,7 @@ rasa/core/policies/policy.py,sha256=HeVtIaV0dA1QcAG3vjdn-4g7-oUEJPL4u01ETJt78YA,
300
300
  rasa/core/policies/rule_policy.py,sha256=YNDPZUZkpKFCvZwKe1kSfP6LQnDL9CQ6JU69JRwdmWw,50729
301
301
  rasa/core/policies/ted_policy.py,sha256=_DHiDH5Upx1yFNzMXBA3SGdHBRfsitTLlr7howUHPoo,87750
302
302
  rasa/core/policies/unexpected_intent_policy.py,sha256=5pGe9EMS-NLHIDDhqY6KCH_Kv7_TGMzSbe_GsjuKH1w,39649
303
- rasa/core/processor.py,sha256=mUJa4cnFDq6s5TozU4_2h4-0pUH1d94gUckjJjyh97A,53274
303
+ rasa/core/processor.py,sha256=0qv5tj7eywAAxg-NceZ5g9dCtjqVyZhI9rBl_cLqz5k,53375
304
304
  rasa/core/run.py,sha256=T2tEPcHoquy5PTmHEmOkeQ3KIFYhG7Og68JWwIvi-ZY,10993
305
305
  rasa/core/secrets_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
306
306
  rasa/core/secrets_manager/constants.py,sha256=jVhtn_2PN2LQVq-FkeBEipztCQPYSVQq4_n2xq0wfoY,1051
@@ -365,7 +365,7 @@ rasa/dialogue_understanding/patterns/clarify.py,sha256=guR6rvRh6dPIShd0zczf5o0zM
365
365
  rasa/dialogue_understanding/patterns/code_change.py,sha256=YXj9ZaHMUXGzdHzYiUITFxJHx3Q7l6xwt7jxubujg-0,1185
366
366
  rasa/dialogue_understanding/patterns/collect_information.py,sha256=nfzAtvjIyP67CiR2KvaHQ2VKcZrYsrt96DfwEW4lpS4,3233
367
367
  rasa/dialogue_understanding/patterns/completed.py,sha256=NqVaS_5-62UetGRXjR1eOGG3o6EPaIAQxbbkkNVEa9s,1278
368
- rasa/dialogue_understanding/patterns/continue_interrupted.py,sha256=4UCFxCReL1wR8ALU4B0LzpC9izdtKrp2nJ6chS_jVng,1355
368
+ rasa/dialogue_understanding/patterns/continue_interrupted.py,sha256=JSW6F94xh6MjBId87gHtPq5jhtZqxEsKknPDRBGIf7k,1682
369
369
  rasa/dialogue_understanding/patterns/correction.py,sha256=ZfSGzvgLvmbebEuisYP0Ke0lQEZziuDvq1oB4wMSFr4,11001
370
370
  rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml,sha256=6AM-nIc-JSD8wSZ7KDGInm6nP5n4EJZe4rce747V8fQ,8284
371
371
  rasa/dialogue_understanding/patterns/human_handoff.py,sha256=ocGrnLLRW-_aiXjmSUG9nReUGQbBUxFFt4FTBWSXARM,1132
@@ -383,12 +383,12 @@ rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py,sha256=rmG09a66
383
383
  rasa/dialogue_understanding/stack/frames/flow_stack_frame.py,sha256=W4mEmihIN5Bih2C9KDpKf-rxCHjLCzK9TcT6JslhW7g,5047
384
384
  rasa/dialogue_understanding/stack/frames/pattern_frame.py,sha256=EVrYWv5dCP7XTvNV-HqtOOrseP-IkF0jD2_JacAvIYw,235
385
385
  rasa/dialogue_understanding/stack/frames/search_frame.py,sha256=rJ9og28k_udUIjP-2Z5xeb_2T5HvCzwDCnxVG9K7lws,728
386
- rasa/dialogue_understanding/stack/utils.py,sha256=ysH6-IeMwNnKbF1__uMlq6I8zaGXFdMEpw1iYdEz4kA,7650
386
+ rasa/dialogue_understanding/stack/utils.py,sha256=UpcxXwbneAMrvc94Fi1__r17UU2BAZQQ_RYI25Mek_c,7710
387
387
  rasa/e2e_test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
388
388
  rasa/e2e_test/constants.py,sha256=YZE0Fku8JVywNcWJPnBly367eZjIFRxXueijSvrKBeo,291
389
389
  rasa/e2e_test/e2e_test_case.py,sha256=XlgWdR86rBU2AzQJ_E36_InKxn-ZKsnn_Eh42FA8tG4,12798
390
390
  rasa/e2e_test/e2e_test_result.py,sha256=KgqD3N6PQW2HayY_TkSize25ISEl52GONOi-lAfYgRQ,869
391
- rasa/e2e_test/e2e_test_runner.py,sha256=RCioeshOV9qlwguZSclL5b4x8gndz8c_Sl7idj82XgU,27540
391
+ rasa/e2e_test/e2e_test_runner.py,sha256=qx0C1PROS3DePz77ROp8FcBiVuayQTlZLR8oeOGZBDM,27700
392
392
  rasa/e2e_test/e2e_test_schema.yml,sha256=F1CimUtTS9PLTDzLUzcepT8qT2N7EmD5dA2PxceB6nY,2430
393
393
  rasa/engine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
394
394
  rasa/engine/caching.py,sha256=Uu-0yn_eQGysmW7nsub-tb3gD8QNz6TNssNd-GIthuI,16451
@@ -447,7 +447,7 @@ rasa/nlu/__init__.py,sha256=D0IYuTK_ZQ_F_9xsy0bXxVCAtU62Fzvp8S7J9tmfI_c,123
447
447
  rasa/nlu/classifiers/__init__.py,sha256=Qvrf7_rfiMxm2Vt2fClb56R3QFExf7WPdFdL-AOvgsk,118
448
448
  rasa/nlu/classifiers/classifier.py,sha256=9fm1mORuFf1vowYIXmqE9yLRKdSC4nGQW7UqNZQipKY,133
449
449
  rasa/nlu/classifiers/diet_classifier.py,sha256=jhzvTqC_Ln-eFCrE1o3uQf1JRR7d6mCPn5ZRewePUas,72565
450
- rasa/nlu/classifiers/fallback_classifier.py,sha256=FYOgM7bLG3HlasVWRozanz-MmDozygTlTIFcPHJWJoo,7150
450
+ rasa/nlu/classifiers/fallback_classifier.py,sha256=4vuVdtTSGuDvpD01HmL67JuijymwBHSX66mBCQ3FqTk,7094
451
451
  rasa/nlu/classifiers/keyword_intent_classifier.py,sha256=dxDzCK7YzYKslZiXYkBD1Al1y_yZWdZYkBBl7FLyPm8,7581
452
452
  rasa/nlu/classifiers/llm_intent_classifier.py,sha256=q_xzDVnB4thKphGeTR4YDlvAMLKwOECsJKYVnK-XQdU,18582
453
453
  rasa/nlu/classifiers/logistic_regression_classifier.py,sha256=C7GkIaVNC5MHu5xOaqKzRiV1LTu_19I5vk_Oa9BIDDU,9589
@@ -514,25 +514,25 @@ rasa/shared/core/conversation.py,sha256=tw1fD2XB3gOdQjDI8hHo5TAAmE2JYNogQGWe3rE9
514
514
  rasa/shared/core/domain.py,sha256=68oAyvY7WgpBRadoD3UcoPmm8bOYjdudt3-PVTAExGE,79706
515
515
  rasa/shared/core/events.py,sha256=j9UAH9onHNmFTWyyM3jFxALwcTFt8pVgQpd_ANeM5uQ,81922
516
516
  rasa/shared/core/flows/__init__.py,sha256=HszhIvEARpmyxABFc1MKYvj8oy04WiZW1xmCdToakbs,181
517
- rasa/shared/core/flows/flow.py,sha256=NysRw4m0zsSWcniHfmCXskK0t3Pk4IKQqhUdt8XVMIs,13174
518
- rasa/shared/core/flows/flow_step.py,sha256=YW2rF2uCDEPfkX8vIHue95zfjF4cU84DWiW1wvGsGZs,4218
519
- rasa/shared/core/flows/flow_step_links.py,sha256=phK1BiAnASSvjUm3FcPw3atOzXbZ8ul6t9PjJes0oqI,10006
520
- rasa/shared/core/flows/flow_step_sequence.py,sha256=jStz6epvKIycZWn8nE52ZB1vbncnOKkP5J_GuJsyLa8,2253
517
+ rasa/shared/core/flows/flow.py,sha256=YAHjjB8dyDRJPGK6MtbUnAZ5SFZ9ryYVZ7opPaOfPTQ,13208
518
+ rasa/shared/core/flows/flow_step.py,sha256=6hoVOMXryTKHgT7-p7jzTqH2r9QREmy_6d6bX2OyxI0,4550
519
+ rasa/shared/core/flows/flow_step_links.py,sha256=zMZV_9rWVjEa8kHIFSIbXCWA1qaUvp8r4uSCK_NsKKs,10548
520
+ rasa/shared/core/flows/flow_step_sequence.py,sha256=tXUEhubX3g312G2FH8Hiez7_v9XG9EaspKlANRa7Sa8,2362
521
521
  rasa/shared/core/flows/flows_list.py,sha256=gZQwhLgymineOMGZKu_NeWuuASRsDWS5lQL7V4yEB0k,7505
522
522
  rasa/shared/core/flows/flows_yaml_schema.json,sha256=uSxpB5-mWNDqwlQMMdRlcaPZWVHZvjWoH38bfu_i4jQ,5989
523
523
  rasa/shared/core/flows/nlu_trigger.py,sha256=gfnRUi7QJaUjMb43RTyQWbLoIUSx2I78LeM8CjDIIDE,3907
524
524
  rasa/shared/core/flows/steps/__init__.py,sha256=M43kHDuB8okcIE3WLivnvuCBzIsA5Qi2ATXUGTVW2Rw,655
525
- rasa/shared/core/flows/steps/action.py,sha256=AjGMtgQnaSHtzwcYdj4mkWIa1wg0_z4TxereAp8Cn-8,1642
526
- rasa/shared/core/flows/steps/call.py,sha256=KgkL9t6jhV1-cuR8dxLG0sU5FJJjCcp4myyGugJKRUw,1769
527
- rasa/shared/core/flows/steps/collect.py,sha256=L3Uhbu2wUWAgagYNc41kkGzUnmUTBNREo707q2Qh4e4,3851
525
+ rasa/shared/core/flows/steps/action.py,sha256=SoeNNgoq6Aq3eIP9aYKYj8en4vXoDMjEAERPXlige6Q,1730
526
+ rasa/shared/core/flows/steps/call.py,sha256=6y0929pM2n8Z1TQ2avfr3g2l7w7bPSKyCRJzljvGtoE,1856
527
+ rasa/shared/core/flows/steps/collect.py,sha256=p79c69BCHNR5pcVl20EmaAkoSBG52yoEbODZh0UAAok,3959
528
528
  rasa/shared/core/flows/steps/constants.py,sha256=DCxrEUGbJciBknHm-_t4tmcnH19IZKP-WYxqix9gm7M,132
529
- rasa/shared/core/flows/steps/continuation.py,sha256=DJr6lLE3WKJdiDYz6zhzUAsZf3ctJ1qWktNTVfsh3gg,1430
530
- rasa/shared/core/flows/steps/end.py,sha256=Esq4blLqrC2tz_lEERUhG_Cv9hPCJYekK8wodikYgLw,681
531
- rasa/shared/core/flows/steps/internal.py,sha256=cfQdnmTytptUS4BPJ9MvYOawRtFp8osu8_k0296sxqI,1370
532
- rasa/shared/core/flows/steps/link.py,sha256=Vtc-w3yxxytB2zMVi3i6wHDin3WFNkb4eNe9VEN96m0,1410
533
- rasa/shared/core/flows/steps/no_operation.py,sha256=6ETxgusM7rughMQPhv807OmLY9DO1SDmQAvJfP7H_eQ,1306
534
- rasa/shared/core/flows/steps/set_slots.py,sha256=oo4gYfbLFJc7507K_bGoB6Qjciv5jsx96WSHSYwOQ7U,1404
535
- rasa/shared/core/flows/steps/start.py,sha256=GA-uvHEC2dXYMKiFH8snMgU_fFfUG7s6ixoiMBes5U0,903
529
+ rasa/shared/core/flows/steps/continuation.py,sha256=5Rzayr80FsgS4bAajuRObVvVcLqPEh9nxGbT2te85xY,1498
530
+ rasa/shared/core/flows/steps/end.py,sha256=0XrPlQMVBnQKVeZs0or8P9IrVqG7i6RoSNDsVrvAeDk,749
531
+ rasa/shared/core/flows/steps/internal.py,sha256=vqBapuLBYQin3Me-YZKn_Tyg5VKozRIJ-tFmjVvmFBs,1449
532
+ rasa/shared/core/flows/steps/link.py,sha256=dlx56o-VnFRAn9Xmsu67Di3Fc9MjkDVXzIttHHRaTzA,1507
533
+ rasa/shared/core/flows/steps/no_operation.py,sha256=I0xWFWJqhUAbvU0HSFXtw4v2gmIiTEveGv4AImvLDfo,1399
534
+ rasa/shared/core/flows/steps/set_slots.py,sha256=NgBXLPl5adIa0-M-Tgt2Teg3gXYggcDqpaf96BPpvKE,1492
535
+ rasa/shared/core/flows/steps/start.py,sha256=AJpKIm0S3GZYLEs3ybXW0Zrq03Pu9lvirNahiUy2I6k,1010
536
536
  rasa/shared/core/flows/validation.py,sha256=snTzSnS_xy3jjV2o1MHwLF3kOIpvAccwNSZiokQ5fMA,19494
537
537
  rasa/shared/core/flows/yaml_flows_io.py,sha256=Ao4UTXSEpKssgUxPC9vIsca3hCCv1TRZ6FsTHWQWoR8,9374
538
538
  rasa/shared/core/generator.py,sha256=y2B2Vn2xOl7k_smzefryoX048b_MTtSDqclx9Ompz9s,35687
@@ -592,7 +592,7 @@ rasa/shared/utils/cli.py,sha256=2o0ek7B85kTHDNzZbZQNiWkM3td_etH1zxghFJFvDlA,2078
592
592
  rasa/shared/utils/common.py,sha256=Z0sfpDosVHLhGDY-72lGVTPWsNC64z3HWSLdnZRG7yE,10057
593
593
  rasa/shared/utils/constants.py,sha256=ZNQu0RHM_7Q4A2hn6pD8XlKPEwzivNpfKiiQihwH8-U,141
594
594
  rasa/shared/utils/io.py,sha256=ppLA6OO_RrSsLBCCGjYtMHkuvmCcyYsgq2IBK_YPLK0,13054
595
- rasa/shared/utils/llm.py,sha256=fWe17AnEi_xyW1hVyf1RsIsjXj8_vX76W2C-Q4c2D6Q,13596
595
+ rasa/shared/utils/llm.py,sha256=SqO5VFg_36BZXL95nOu38oRiDyLrySJGwZWPWjc6imU,13601
596
596
  rasa/shared/utils/pykwalify_extensions.py,sha256=4W8gde8C6QpGCY_t9IEmaZSgjMuie1xH0F1DYyn83BM,883
597
597
  rasa/shared/utils/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
598
598
  rasa/shared/utils/schemas/config.yml,sha256=czxSADw9hOIZdhvFP8pVUQo810hs9_C8ZGfCPx17taM,27
@@ -654,9 +654,9 @@ rasa/utils/train_utils.py,sha256=f1NWpp5y6al0dzoQyyio4hc4Nf73DRoRSHDzEK6-C4E,212
654
654
  rasa/utils/url_tools.py,sha256=JQcHL2aLqLHu82k7_d9imUoETCm2bmlHaDpOJ-dKqBc,1218
655
655
  rasa/utils/yaml.py,sha256=KjbZq5C94ZP7Jdsw8bYYF7HASI6K4-C_kdHfrnPLpSI,2000
656
656
  rasa/validator.py,sha256=JFhASyXNzA24SIK4BCyX2rE4x2bsLMU7phYWAMSzlSM,55245
657
- rasa/version.py,sha256=j9HbcPYmwWIYhkdN8CmSRbyBZtRR38tUkdbK97ieysQ,117
658
- rasa_pro-3.9.17.dist-info/METADATA,sha256=mtNL6t3yXzQtzYHaLFTdohTZKfMl0iabkZgzgNQ98yQ,30450
659
- rasa_pro-3.9.17.dist-info/NOTICE,sha256=7HlBoMHJY9CL2GlYSfTQ-PZsVmLmVkYmMiPlTjhuCqA,218
660
- rasa_pro-3.9.17.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
661
- rasa_pro-3.9.17.dist-info/entry_points.txt,sha256=ckJ2SfEyTPgBqj_I6vm_tqY9dZF_LAPJZA335Xp0Q9U,43
662
- rasa_pro-3.9.17.dist-info/RECORD,,
657
+ rasa/version.py,sha256=QFSRRi7XtzFDId7wp0wh7BQW3Cxtrl1_efMyiOGE-7Q,117
658
+ rasa_pro-3.9.19.dist-info/METADATA,sha256=10F1mLovynJUSf7I8iLWJz5ZFBI4icH2OxgE4CoLGNw,31576
659
+ rasa_pro-3.9.19.dist-info/NOTICE,sha256=7HlBoMHJY9CL2GlYSfTQ-PZsVmLmVkYmMiPlTjhuCqA,218
660
+ rasa_pro-3.9.19.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
661
+ rasa_pro-3.9.19.dist-info/entry_points.txt,sha256=ckJ2SfEyTPgBqj_I6vm_tqY9dZF_LAPJZA335Xp0Q9U,43
662
+ rasa_pro-3.9.19.dist-info/RECORD,,