rasa-pro 3.12.0rc1__py3-none-any.whl → 3.12.0rc2__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 (40) hide show
  1. README.md +10 -13
  2. rasa/cli/project_templates/calm/domain/list_contacts.yml +1 -2
  3. rasa/cli/project_templates/calm/domain/remove_contact.yml +1 -2
  4. rasa/cli/project_templates/calm/domain/shared.yml +1 -4
  5. rasa/core/actions/action_handle_digressions.py +35 -13
  6. rasa/core/policies/flows/flow_executor.py +7 -2
  7. rasa/core/processor.py +0 -1
  8. rasa/dialogue_understanding/commands/can_not_handle_command.py +1 -1
  9. rasa/dialogue_understanding/commands/cancel_flow_command.py +1 -1
  10. rasa/dialogue_understanding/commands/change_flow_command.py +1 -1
  11. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +1 -1
  12. rasa/dialogue_understanding/commands/clarify_command.py +1 -1
  13. rasa/dialogue_understanding/commands/command_syntax_manager.py +1 -1
  14. rasa/dialogue_understanding/commands/handle_digressions_command.py +1 -7
  15. rasa/dialogue_understanding/commands/human_handoff_command.py +1 -1
  16. rasa/dialogue_understanding/commands/knowledge_answer_command.py +1 -1
  17. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +1 -1
  18. rasa/dialogue_understanding/commands/set_slot_command.py +1 -1
  19. rasa/dialogue_understanding/commands/skip_question_command.py +1 -1
  20. rasa/dialogue_understanding/commands/start_flow_command.py +3 -1
  21. rasa/dialogue_understanding/commands/utils.py +1 -28
  22. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  23. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +75 -13
  24. rasa/dialogue_understanding/processor/command_processor.py +4 -4
  25. rasa/dialogue_understanding/stack/utils.py +38 -0
  26. rasa/dialogue_understanding_test/du_test_case.py +30 -10
  27. rasa/dialogue_understanding_test/du_test_result.py +1 -1
  28. rasa/e2e_test/assertions.py +6 -8
  29. rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2 +5 -1
  30. rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2 +4 -0
  31. rasa/llm_fine_tuning/conversations.py +1 -1
  32. rasa/shared/core/slots.py +6 -0
  33. rasa/shared/providers/llm/openai_llm_client.py +2 -2
  34. rasa/shared/utils/llm.py +5 -2
  35. rasa/version.py +1 -1
  36. {rasa_pro-3.12.0rc1.dist-info → rasa_pro-3.12.0rc2.dist-info}/METADATA +12 -14
  37. {rasa_pro-3.12.0rc1.dist-info → rasa_pro-3.12.0rc2.dist-info}/RECORD +40 -40
  38. {rasa_pro-3.12.0rc1.dist-info → rasa_pro-3.12.0rc2.dist-info}/NOTICE +0 -0
  39. {rasa_pro-3.12.0rc1.dist-info → rasa_pro-3.12.0rc2.dist-info}/WHEEL +0 -0
  40. {rasa_pro-3.12.0rc1.dist-info → rasa_pro-3.12.0rc2.dist-info}/entry_points.txt +0 -0
README.md CHANGED
@@ -2,15 +2,14 @@
2
2
 
3
3
  <div align="center">
4
4
 
5
- [![Build Status](https://github.com/RasaHQ/rasa-private/workflows/Continuous%20Integration/badge.svg)](https://github.com/RasaHQ/rasa-private/actions)
6
5
  [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=RasaHQ_rasa&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=RasaHQ_rasa)
7
- [![Documentation Status](https://img.shields.io/badge/docs-stable-brightgreen.svg)](https://rasa.com/docs/rasa-pro/)
6
+ [![Documentation Status](https://img.shields.io/badge/docs-stable-brightgreen.svg)](https://rasa.com/docs/docs/pro/intro)
7
+ ![Python version support](https://img.shields.io/pypi/pyversions/rasa-pro)
8
8
 
9
9
  </div>
10
10
 
11
11
  <hr />
12
12
 
13
-
14
13
  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.
15
14
 
16
15
  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.
@@ -23,19 +22,17 @@ Building on the foundation of Rasa Open Source, Rasa Pro adds advanced features
23
22
  - **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
23
  - **Built-in Security:** Safeguard sensitive data, control access, and ensure secure deployment, essential for production environments that demand high levels of security and compliance.
25
24
 
25
+ A [free developer license](https://rasa.com/docs/pro/intro/#who-rasa-pro-is-for) is available so you can explore and get to know Rasa Pro. It allows you to take your assistant live in production a limited capacity. A paid license is required for larger-scale production use, but all code is visible and can be customized as needed.
26
26
 
27
+ To get started right now, you can
27
28
 
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.
29
-
30
- To get started right now, you can
31
-
32
- `pip install rasa-pro`
29
+ `pip install rasa-pro`
33
30
 
34
- Check out our
31
+ Check out our
35
32
 
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/)
33
+ - [Rasa-pro Quickstart](https://rasa.com/docs/learn/quickstart/pro),
34
+ - [Conversational AI with Language Models (CALM) conceptual rundown](https://rasa.com/docs/learn/concepts/calm),
35
+ - [Rasa Pro / CALM tutorial](https://rasa.com/docs/pro/tutorial), and
36
+ - [Rasa pro changelog](https://rasa.com/docs/reference/changelogs/rasa-pro-changelog)
40
37
 
41
38
  for more. Also feel free to reach out to us on the [Rasa forum](https://forum.rasa.com/).
@@ -7,8 +7,7 @@ slots:
7
7
  contacts_list:
8
8
  type: text
9
9
  mappings:
10
- - type: custom
11
- action: list_contacts
10
+ - type: controlled
12
11
 
13
12
  responses:
14
13
  utter_no_contacts:
@@ -7,8 +7,7 @@ slots:
7
7
  remove_contact_name:
8
8
  type: text
9
9
  mappings:
10
- - type: custom
11
- action: remove_contact
10
+ - type: controlled
12
11
  remove_contact_handle:
13
12
  type: text
14
13
  mappings:
@@ -4,7 +4,4 @@ slots:
4
4
  return_value:
5
5
  type: any
6
6
  mappings:
7
- - type: custom
8
- action: add_contact
9
- - type: custom
10
- action: remove_contact
7
+ - type: controlled
@@ -18,6 +18,10 @@ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
18
18
  FlowStackFrameType,
19
19
  UserFlowStackFrame,
20
20
  )
21
+ from rasa.dialogue_understanding.stack.utils import (
22
+ remove_digression_from_stack,
23
+ user_flows_on_the_stack,
24
+ )
21
25
  from rasa.shared.core.constants import (
22
26
  ACTION_BLOCK_DIGRESSION,
23
27
  ACTION_CONTINUE_DIGRESSION,
@@ -55,16 +59,24 @@ class ActionBlockDigressions(Action):
55
59
  frame_type = FlowStackFrameType.REGULAR
56
60
 
57
61
  stack = tracker.stack
58
- stack.push(
59
- UserFlowStackFrame(flow_id=blocked_flow_id, frame_type=frame_type), 0
60
- )
61
- stack.push(
62
- ContinueInterruptedPatternFlowStackFrame(
63
- previous_flow_name=blocked_flow_id
64
- ),
65
- 1,
66
- )
67
- events = tracker.create_stack_updated_events(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)
68
80
 
69
81
  utterance = "utter_block_digressions"
70
82
  message = await nlg.generate(
@@ -109,10 +121,20 @@ class ActionContinueDigression(Action):
109
121
  if not isinstance(top_frame, HandleDigressionsPatternFlowStackFrame):
110
122
  return []
111
123
 
112
- blocked_flow_id = top_frame.interrupting_flow_id
113
- frame_type = FlowStackFrameType.INTERRUPT
124
+ interrupting_flow_id = top_frame.interrupting_flow_id
114
125
  stack = tracker.stack
115
- stack.push(UserFlowStackFrame(flow_id=blocked_flow_id, frame_type=frame_type))
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
+ )
116
138
 
117
139
  events = [
118
140
  FlowInterrupted(
@@ -287,8 +287,13 @@ def trigger_pattern_clarification(
287
287
  if not isinstance(current_frame, UserFlowStackFrame):
288
288
  return None
289
289
 
290
- if current_frame.frame_type == FlowStackFrameType.CALL:
291
- # we want to return to the flow that called the current flow
290
+ if current_frame.frame_type in [
291
+ FlowStackFrameType.CALL,
292
+ FlowStackFrameType.INTERRUPT,
293
+ ]:
294
+ # we want to return to the flow that called
295
+ # the current flow or the flow that was interrupted
296
+ # by the current flow
292
297
  return None
293
298
 
294
299
  pending_flows = [
rasa/core/processor.py CHANGED
@@ -1553,7 +1553,6 @@ class MessageProcessor:
1553
1553
  tracker,
1554
1554
  prior_tracker_events,
1555
1555
  should_break=True,
1556
- update_corrected_slots=True,
1557
1556
  )
1558
1557
 
1559
1558
  return tracker, validate_frames
@@ -99,7 +99,7 @@ class CannotHandleCommand(Command):
99
99
  def regex_pattern() -> str:
100
100
  mapper = {
101
101
  CommandSyntaxVersion.v1: r"CannotHandle\(\)",
102
- CommandSyntaxVersion.v2: r"^[^\w]*cannot handle$",
102
+ CommandSyntaxVersion.v2: r"""^[\s\W\d]*cannot handle['"`]*$""",
103
103
  }
104
104
  return mapper.get(
105
105
  CommandSyntaxManager.get_syntax_version(),
@@ -166,7 +166,7 @@ class CancelFlowCommand(Command):
166
166
  def regex_pattern() -> str:
167
167
  mapper = {
168
168
  CommandSyntaxVersion.v1: r"CancelFlow\(\)",
169
- CommandSyntaxVersion.v2: r"^[^\w]*cancel flow$",
169
+ CommandSyntaxVersion.v2: r"""^[\s\W\d]*cancel flow['"`]*$""",
170
170
  }
171
171
  return mapper.get(
172
172
  CommandSyntaxManager.get_syntax_version(),
@@ -70,7 +70,7 @@ class ChangeFlowCommand(Command):
70
70
  def regex_pattern() -> str:
71
71
  mapper = {
72
72
  CommandSyntaxVersion.v1: r"ChangeFlow\(\)",
73
- CommandSyntaxVersion.v2: r"^[^\w]*change$",
73
+ CommandSyntaxVersion.v2: r"""^[\s\W\d]*change['"`]*$""",
74
74
  }
75
75
  return mapper.get(
76
76
  CommandSyntaxManager.get_syntax_version(),
@@ -81,7 +81,7 @@ class ChitChatAnswerCommand(FreeFormAnswerCommand):
81
81
  def regex_pattern() -> str:
82
82
  mapper = {
83
83
  CommandSyntaxVersion.v1: r"ChitChat\(\)",
84
- CommandSyntaxVersion.v2: r"^[^\w]*offtopic reply$",
84
+ CommandSyntaxVersion.v2: r"""^[\s\W\d]*offtopic reply['"`]*$""",
85
85
  }
86
86
  return mapper.get(
87
87
  CommandSyntaxManager.get_syntax_version(),
@@ -119,7 +119,7 @@ class ClarifyCommand(Command):
119
119
  mapper = {
120
120
  CommandSyntaxVersion.v1: r"Clarify\(([\"\'a-zA-Z0-9_, ]*)\)",
121
121
  CommandSyntaxVersion.v2: (
122
- r"^[^\w]*disambiguate flows ([\"\'a-zA-Z0-9_, ]*)$"
122
+ r"""^[\s\W\d]*disambiguate flows (["'a-zA-Z0-9_, ]*)['"`]*$"""
123
123
  ),
124
124
  }
125
125
  return mapper.get(
@@ -30,7 +30,7 @@ class CommandSyntaxManager:
30
30
  syntax version remains consistent throughout the lifetime of the generator.
31
31
  """
32
32
  if cls._version:
33
- structlogger.warn(
33
+ structlogger.debug(
34
34
  "command_syntax_manager.syntax_version_already_set",
35
35
  event_info=(
36
36
  f"The command syntax version has already been set. Overwriting "
@@ -14,7 +14,6 @@ from rasa.dialogue_understanding.patterns.handle_digressions import (
14
14
  )
15
15
  from rasa.dialogue_understanding.stack.utils import (
16
16
  top_flow_frame,
17
- user_flows_on_the_stack,
18
17
  )
19
18
  from rasa.shared.core.events import Event
20
19
  from rasa.shared.core.flows import FlowsList
@@ -71,12 +70,7 @@ class HandleDigressionsCommand(Command):
71
70
  stack = tracker.stack
72
71
  original_stack = original_tracker.stack
73
72
 
74
- if self.flow in user_flows_on_the_stack(stack):
75
- structlogger.debug(
76
- "command_executor.skip_command.already_started_flow", command=self
77
- )
78
- return []
79
- elif self.flow not in all_flows.flow_ids:
73
+ if self.flow not in all_flows.flow_ids:
80
74
  structlogger.debug(
81
75
  "command_executor.push_cannot_handle.start_invalid_flow_id",
82
76
  command=self,
@@ -88,7 +88,7 @@ class HumanHandoffCommand(Command):
88
88
  def regex_pattern() -> str:
89
89
  mapper = {
90
90
  CommandSyntaxVersion.v1: r"HumanHandoff\(\)",
91
- CommandSyntaxVersion.v2: r"^[^\w]*hand over$",
91
+ CommandSyntaxVersion.v2: r"""^[\s\W\d]*hand over['"`]*$""",
92
92
  }
93
93
  return mapper.get(
94
94
  CommandSyntaxManager.get_syntax_version(),
@@ -81,7 +81,7 @@ class KnowledgeAnswerCommand(FreeFormAnswerCommand):
81
81
  def regex_pattern() -> str:
82
82
  mapper = {
83
83
  CommandSyntaxVersion.v1: r"SearchAndReply\(\)",
84
- CommandSyntaxVersion.v2: r"^[^\w]*provide info$",
84
+ CommandSyntaxVersion.v2: r"""^[\s\W\d]*provide info['"`]*$""",
85
85
  }
86
86
  return mapper.get(
87
87
  CommandSyntaxManager.get_syntax_version(),
@@ -82,7 +82,7 @@ class RepeatBotMessagesCommand(Command):
82
82
  def regex_pattern() -> str:
83
83
  mapper = {
84
84
  CommandSyntaxVersion.v1: r"RepeatLastBotMessages\(\)",
85
- CommandSyntaxVersion.v2: r"^[^\w]*repeat message$",
85
+ CommandSyntaxVersion.v2: r"""^[\s\W\d]*repeat message['"`]*$""",
86
86
  }
87
87
  return mapper.get(
88
88
  CommandSyntaxManager.get_syntax_version(),
@@ -189,7 +189,7 @@ class SetSlotCommand(Command):
189
189
  r"""SetSlot\(['"]?([a-zA-Z_][a-zA-Z0-9_-]*)['"]?, ?['"]?(.*)['"]?\)"""
190
190
  ),
191
191
  CommandSyntaxVersion.v2: (
192
- r"""^[^\w]*set slot ['"]?([a-zA-Z_][a-zA-Z0-9_-]*)['"]? ['"]?(.+?)['"]?$""" # noqa: E501
192
+ r"""^[\s\W\d]*set slot ['"`]?([a-zA-Z_][a-zA-Z0-9_-]*)['"`]? ['"`]?(.+?)['"`]*$""" # noqa: E501
193
193
  ),
194
194
  }
195
195
  return mapper.get(
@@ -97,7 +97,7 @@ class SkipQuestionCommand(Command):
97
97
  def regex_pattern() -> str:
98
98
  mapper = {
99
99
  CommandSyntaxVersion.v1: r"SkipQuestion\(\)",
100
- CommandSyntaxVersion.v2: r"^[^\w]*skip question$",
100
+ CommandSyntaxVersion.v2: r"""^[\s\W\d]*skip question['"`]*$""",
101
101
  }
102
102
  return mapper.get(
103
103
  CommandSyntaxManager.get_syntax_version(),
@@ -141,7 +141,9 @@ class StartFlowCommand(Command):
141
141
  def regex_pattern() -> str:
142
142
  mapper = {
143
143
  CommandSyntaxVersion.v1: r"StartFlow\(['\"]?([a-zA-Z0-9_-]+)['\"]?\)",
144
- CommandSyntaxVersion.v2: r"^[^\w]*start flow ['\"]?([a-zA-Z0-9_-]+)['\"]?",
144
+ CommandSyntaxVersion.v2: (
145
+ r"""^[\s\W\d]*start flow ['"`]?([a-zA-Z0-9_-]+)['"`]*"""
146
+ ),
145
147
  }
146
148
  return mapper.get(
147
149
  CommandSyntaxManager.get_syntax_version(),
@@ -1,4 +1,4 @@
1
- from typing import TYPE_CHECKING, Any, List, Optional, Tuple, Union
1
+ from typing import TYPE_CHECKING, List, Optional, Tuple, Union
2
2
 
3
3
  import structlog
4
4
 
@@ -100,7 +100,6 @@ def create_validate_frames_from_slot_set_events(
100
100
  events: List[Event],
101
101
  validate_frames: List[ValidateSlotPatternFlowStackFrame] = [],
102
102
  should_break: bool = False,
103
- update_corrected_slots: bool = False,
104
103
  ) -> Tuple[DialogueStateTracker, List[ValidateSlotPatternFlowStackFrame]]:
105
104
  """Process SlotSet events and create validation frames.
106
105
 
@@ -111,8 +110,6 @@ def create_validate_frames_from_slot_set_events(
111
110
  if True, break out of the event loop as soon as the first non-SlotSet
112
111
  event is encountered.
113
112
  if False, continue processing the events until the end.
114
- update_corrected_slots: whether or not corrected slots in the last
115
- correction frame need to be updated.
116
113
 
117
114
  Returns:
118
115
  Tuple of (updated tracker, list of validation frames).
@@ -130,29 +127,5 @@ def create_validate_frames_from_slot_set_events(
130
127
 
131
128
  if frame:
132
129
  validate_frames.append(frame)
133
- if update_corrected_slots:
134
- tracker = update_corrected_slots_in_correction_frame(
135
- tracker, event.key, event.value
136
- )
137
130
 
138
131
  return tracker, validate_frames
139
-
140
-
141
- def update_corrected_slots_in_correction_frame(
142
- tracker: DialogueStateTracker, slot_name: str, slot_value: Any
143
- ) -> DialogueStateTracker:
144
- """Update the corrected_slots and new_slot_values of the
145
- CorrectionPatternFlowStackFrame with only valid values.
146
- """
147
- stack = tracker.stack
148
- top_frame = stack.top()
149
- del top_frame.corrected_slots[slot_name] # type: ignore[union-attr]
150
- top_frame.new_slot_values.remove(slot_value) # type: ignore[union-attr]
151
-
152
- # since we can't directly modify a stack we have to pop first
153
- # and then push back the updated frame
154
- stack.pop()
155
- stack.push(top_frame)
156
- new_events = tracker.create_stack_updated_events(stack)
157
- tracker.update_with_events(new_events)
158
- return tracker
@@ -226,7 +226,7 @@ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
226
226
  # be completed, "predict" the ErrorCommand
227
227
  commands = [ErrorCommand()]
228
228
 
229
- if not commands:
229
+ if not commands and not prior_commands:
230
230
  # if for any reason the final list of commands is empty,
231
231
  # "predict" CannotHandle
232
232
  commands = [CannotHandleCommand()]
@@ -72,10 +72,63 @@ MODEL_PROMPT_MAPPER = {
72
72
  ),
73
73
  }
74
74
 
75
-
76
75
  DEFAULT_COMMAND_PROMPT_TEMPLATE_FILE_NAME = "command_prompt_v2_default.jinja2"
77
76
 
78
77
 
78
+ class CommandParserValidatorSingleton:
79
+ """Singleton class to validate the command parser.
80
+
81
+ This class is used to validate the command parser. It keeps track of the number of
82
+ consecutive turns where no commands are parsed by the command parser. If the
83
+ number of consecutive turns exceeds a certain threshold, a warning is logged.
84
+ The prompt can use a DSL syntax that can be incompatible with the command syntax
85
+ used by the command parser. This class helps to detect such incompatibilities.
86
+ """
87
+
88
+ MAX_CONSECUTIVE_TURNS_NO_COMMAND_PREDICTED = 5
89
+ _NO_COMMAND_PREDICTED_TURN_COUNTER = 0
90
+ _command_parser_validated = False
91
+
92
+ @classmethod
93
+ def get_no_command_predicted_turn_counter(cls) -> int:
94
+ return cls._NO_COMMAND_PREDICTED_TURN_COUNTER
95
+
96
+ @classmethod
97
+ def should_validate_command_parser(cls) -> bool:
98
+ return not cls._command_parser_validated
99
+
100
+ @classmethod
101
+ def reset_command_parser_validation(cls) -> None:
102
+ cls._NO_COMMAND_PREDICTED_TURN_COUNTER = 0
103
+ cls._command_parser_validated = False
104
+
105
+ @classmethod
106
+ def validate_if_commands_are_parsed_from_llm_response(
107
+ cls, commands: List[Command], llm_response: str
108
+ ) -> None:
109
+ if llm_response and not commands:
110
+ cls._NO_COMMAND_PREDICTED_TURN_COUNTER += 1
111
+ else:
112
+ # Reset the counter if commands are generated, and mark
113
+ # the command parser as validated.
114
+ cls._NO_COMMAND_PREDICTED_TURN_COUNTER = 0
115
+ cls._command_parser_validated = True
116
+ return
117
+
118
+ if (
119
+ cls._NO_COMMAND_PREDICTED_TURN_COUNTER
120
+ >= cls.MAX_CONSECUTIVE_TURNS_NO_COMMAND_PREDICTED
121
+ ):
122
+ structlogger.warning(
123
+ "llm_command_generator.predict_commands.command_parser_not_working",
124
+ event_info=(
125
+ f"No commands were generated by the command parser for the last "
126
+ f"{cls._NO_COMMAND_PREDICTED_TURN_COUNTER} times. Check if you "
127
+ "are running incompatible prompt and LLM command generator."
128
+ ),
129
+ )
130
+
131
+
79
132
  @DefaultV1Recipe.register(
80
133
  [
81
134
  DefaultV1Recipe.ComponentType.COMMAND_GENERATOR,
@@ -103,12 +156,14 @@ class CompactLLMCommandGenerator(LLMBasedCommandGenerator):
103
156
 
104
157
  # Get the default prompt template based on the model name
105
158
  default_command_prompt_template = get_default_prompt_template_based_on_model(
106
- config, MODEL_PROMPT_MAPPER, DEFAULT_COMMAND_PROMPT_TEMPLATE_FILE_NAME
159
+ self.config.get(LLM_CONFIG_KEY, {}) or {},
160
+ MODEL_PROMPT_MAPPER,
161
+ DEFAULT_COMMAND_PROMPT_TEMPLATE_FILE_NAME,
107
162
  )
108
163
 
109
164
  # Set the prompt template either from the config or the default prompt template.
110
165
  self.prompt_template = prompt_template or get_prompt_template(
111
- config.get(PROMPT_TEMPLATE_CONFIG_KEY),
166
+ self.config.get(PROMPT_TEMPLATE_CONFIG_KEY),
112
167
  default_command_prompt_template,
113
168
  )
114
169
 
@@ -230,7 +285,7 @@ class CompactLLMCommandGenerator(LLMBasedCommandGenerator):
230
285
  structlogger.warning(
231
286
  "llm_command_generator.predict_commands",
232
287
  message="No commands were predicted as the LLM response could "
233
- "not be parsed or the LLM responded with an invalid command."
288
+ "not be parsed or the LLM responded with an invalid command. "
234
289
  "Returning a CannotHandleCommand instead.",
235
290
  )
236
291
  commands = [CannotHandleCommand()]
@@ -306,6 +361,11 @@ class CompactLLMCommandGenerator(LLMBasedCommandGenerator):
306
361
 
307
362
  commands = self.parse_commands(action_list, tracker, flows)
308
363
 
364
+ if CommandParserValidatorSingleton.should_validate_command_parser():
365
+ CommandParserValidatorSingleton.validate_if_commands_are_parsed_from_llm_response(
366
+ commands, action_list
367
+ )
368
+
309
369
  self._update_message_parse_data_for_fine_tuning(message, commands, flow_prompt)
310
370
  add_commands_to_message_parse_data(message, self.__class__.__name__, commands)
311
371
  add_prompt_to_message_parse_data(
@@ -350,8 +410,8 @@ class CompactLLMCommandGenerator(LLMBasedCommandGenerator):
350
410
  """
351
411
  commands = parse_commands_using_command_parsers(actions, flows)
352
412
  if not commands:
353
- structlogger.debug(
354
- f"{cls.__class__.__name__}.parse_commands",
413
+ structlogger.warning(
414
+ f"{cls.__name__}.parse_commands",
355
415
  message="No commands were parsed from the LLM actions.",
356
416
  actions=actions,
357
417
  )
@@ -441,13 +501,6 @@ class CompactLLMCommandGenerator(LLMBasedCommandGenerator):
441
501
  def fingerprint_addon(cls: Any, config: Dict[str, Any]) -> Optional[str]:
442
502
  """Add a fingerprint for the graph."""
443
503
  # Get the default prompt template based on the model name
444
- default_command_prompt_template = get_default_prompt_template_based_on_model(
445
- config, MODEL_PROMPT_MAPPER, DEFAULT_COMMAND_PROMPT_TEMPLATE_FILE_NAME
446
- )
447
- prompt_template = get_prompt_template(
448
- config.get(PROMPT_TEMPLATE_CONFIG_KEY),
449
- default_command_prompt_template,
450
- )
451
504
  llm_config = resolve_model_client_config(
452
505
  config.get(LLM_CONFIG_KEY), CompactLLMCommandGenerator.__name__
453
506
  )
@@ -455,6 +508,15 @@ class CompactLLMCommandGenerator(LLMBasedCommandGenerator):
455
508
  config.get(FLOW_RETRIEVAL_KEY, {}).get(EMBEDDINGS_CONFIG_KEY),
456
509
  FlowRetrieval.__name__,
457
510
  )
511
+ default_command_prompt_template = get_default_prompt_template_based_on_model(
512
+ llm_config or {},
513
+ MODEL_PROMPT_MAPPER,
514
+ DEFAULT_COMMAND_PROMPT_TEMPLATE_FILE_NAME,
515
+ )
516
+ prompt_template = get_prompt_template(
517
+ config.get(PROMPT_TEMPLATE_CONFIG_KEY),
518
+ default_command_prompt_template,
519
+ )
458
520
  return deep_container_fingerprint(
459
521
  [prompt_template, llm_config, embedding_config]
460
522
  )
@@ -263,10 +263,10 @@ def execute_commands(
263
263
  events.extend(new_events)
264
264
  tracker.update_with_events(new_events)
265
265
 
266
- new_events = push_stack_frames_to_follow_commands(
267
- tracker, stack_frames_to_follow_commands
268
- )
269
- events.extend(new_events)
266
+ new_events = push_stack_frames_to_follow_commands(
267
+ tracker, stack_frames_to_follow_commands
268
+ )
269
+ events.extend(new_events)
270
270
 
271
271
  return remove_duplicated_set_slots(events)
272
272
 
@@ -4,6 +4,9 @@ from typing import List, Optional, Set, Tuple
4
4
  from rasa.dialogue_understanding.patterns.collect_information import (
5
5
  CollectInformationPatternFlowStackFrame,
6
6
  )
7
+ from rasa.dialogue_understanding.patterns.continue_interrupted import (
8
+ ContinueInterruptedPatternFlowStackFrame,
9
+ )
7
10
  from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
8
11
  from rasa.dialogue_understanding.stack.frames import (
9
12
  BaseFlowStackFrame,
@@ -213,3 +216,38 @@ def get_collect_steps_excluding_ask_before_filling_for_active_flow(
213
216
  for step in active_flow.get_collect_steps()
214
217
  if not step.ask_before_filling
215
218
  )
219
+
220
+
221
+ def remove_digression_from_stack(stack: DialogueStack, flow_id: str) -> DialogueStack:
222
+ """Remove a specific flow frame from the stack and other frames that reference it.
223
+
224
+ The main use-case is to prevent duplicate digressions from being added to the stack.
225
+
226
+ Args:
227
+ stack: The dialogue stack.
228
+ flow_id: The flow to remove.
229
+
230
+ Returns:
231
+ The updated dialogue stack.
232
+ """
233
+ updated_stack = stack.copy()
234
+ original_frames = updated_stack.frames[:]
235
+ found_digression_index = -1
236
+ for index, frame in enumerate(original_frames):
237
+ if isinstance(frame, BaseFlowStackFrame) and frame.flow_id == flow_id:
238
+ updated_stack.frames.pop(index)
239
+ found_digression_index = index
240
+
241
+ # we also need to remove the `ContinueInterruptedPatternFlowStackFrame`
242
+ elif (
243
+ isinstance(frame, ContinueInterruptedPatternFlowStackFrame)
244
+ and frame.previous_flow_name == flow_id
245
+ and found_digression_index + 1 == index
246
+ ):
247
+ # we know that this frame is always added after the digressing flow frame
248
+ # that was blocked previously by action_block_digressions,
249
+ # so this check would occur after the digressing flow was popped.
250
+ # Therefore, we need to update the index dynamically before popping.
251
+ updated_stack.frames.pop(index - 1)
252
+
253
+ return updated_stack
@@ -85,15 +85,33 @@ class DialogueUnderstandingOutput(BaseModel):
85
85
  for command in predicted_commands
86
86
  ]
87
87
 
88
- def get_component_names_that_predicted_commands(self) -> List[str]:
89
- """Get all component names that have predicted commands."""
90
- if self.commands is None:
91
- return []
92
- return [
93
- component_name
94
- for component_name, predicted_commands in self.commands.items()
95
- if predicted_commands
96
- ]
88
+ def get_component_names_that_predicted_commands_or_have_llm_response(
89
+ self,
90
+ ) -> List[str]:
91
+ """Get all component names that have predicted commands or recieved
92
+ non-empty response from LLM.
93
+ """
94
+ component_names_that_predicted_commands = (
95
+ [
96
+ component_name
97
+ for component_name, predicted_commands in self.commands.items()
98
+ if predicted_commands
99
+ ]
100
+ if self.commands
101
+ else []
102
+ )
103
+ components_with_prompts = (
104
+ [
105
+ str(prompt.get(KEY_COMPONENT_NAME, None))
106
+ for prompt in self.prompts
107
+ if prompt.get(KEY_LLM_RESPONSE_METADATA, None)
108
+ ]
109
+ if self.prompts
110
+ else []
111
+ )
112
+ return list(
113
+ set(component_names_that_predicted_commands + components_with_prompts)
114
+ )
97
115
 
98
116
  def get_component_name_to_prompt_info(self) -> Dict[str, List[Dict[str, Any]]]:
99
117
  """Return a dictionary of component names to prompt information.
@@ -120,7 +138,9 @@ class DialogueUnderstandingOutput(BaseModel):
120
138
  return {}
121
139
 
122
140
  data: Dict[str, List[Dict[str, Any]]] = {}
123
- relevant_component_names = self.get_component_names_that_predicted_commands()
141
+ relevant_component_names = (
142
+ self.get_component_names_that_predicted_commands_or_have_llm_response()
143
+ )
124
144
 
125
145
  for prompt_data in self.prompts:
126
146
  component_name = prompt_data[KEY_COMPONENT_NAME]
@@ -84,7 +84,7 @@ class FailedTestStep(BaseModel):
84
84
 
85
85
  if step.dialogue_understanding_output:
86
86
  predicted_commands = step.dialogue_understanding_output.commands
87
- command_generators = step.dialogue_understanding_output.get_component_names_that_predicted_commands() # noqa: E501
87
+ command_generators = step.dialogue_understanding_output.get_component_names_that_predicted_commands_or_have_llm_response() # noqa: E501
88
88
  prompts = (
89
89
  step.dialogue_understanding_output.get_component_name_to_prompt_info()
90
90
  )
@@ -972,7 +972,7 @@ class GenerativeResponseMixin(Assertion):
972
972
  data.pop("metric_adjective")
973
973
  return data
974
974
 
975
- def _render_prompt(self, step_text: str, matching_event: BotUttered) -> str:
975
+ def _render_prompt(self, matching_event: BotUttered) -> str:
976
976
  raise NotImplementedError
977
977
 
978
978
  def _get_processed_output(self, parsed_llm_output: Dict[str, Any]) -> List[Any]:
@@ -999,7 +999,7 @@ class GenerativeResponseMixin(Assertion):
999
999
  ) -> Tuple[Optional[AssertionFailure], Optional[Event]]:
1000
1000
  """Run the LLM evaluation on the given event."""
1001
1001
  bot_message = matching_event.text
1002
- prompt = self._render_prompt(step_text, matching_event)
1002
+ prompt = self._render_prompt(matching_event)
1003
1003
  llm_response = self._invoke_llm(llm_judge_config, prompt)
1004
1004
 
1005
1005
  try:
@@ -1160,9 +1160,9 @@ class GenerativeResponseIsRelevantAssertion(GenerativeResponseMixin):
1160
1160
  def type(cls) -> str:
1161
1161
  return AssertionType.GENERATIVE_RESPONSE_IS_RELEVANT.value
1162
1162
 
1163
- def _render_prompt(self, step_text: str, matching_event: BotUttered) -> str:
1163
+ def _render_prompt(self, matching_event: BotUttered) -> str:
1164
1164
  """Render the prompt."""
1165
- inputs = _get_prompt_inputs(self.type(), step_text, matching_event)
1165
+ inputs = _get_prompt_inputs(self.type(), matching_event)
1166
1166
  prompt_template = _get_default_prompt_template(
1167
1167
  DEFAULT_ANSWER_RELEVANCE_PROMPT_TEMPLATE_FILE_NAME
1168
1168
  )
@@ -1206,11 +1206,10 @@ class GenerativeResponseIsGroundedAssertion(GenerativeResponseMixin):
1206
1206
  def type(cls) -> str:
1207
1207
  return AssertionType.GENERATIVE_RESPONSE_IS_GROUNDED.value
1208
1208
 
1209
- def _render_prompt(self, step_text: str, matching_event: BotUttered) -> str:
1209
+ def _render_prompt(self, matching_event: BotUttered) -> str:
1210
1210
  """Render the prompt."""
1211
1211
  inputs = _get_prompt_inputs(
1212
1212
  assertion_type=self.type(),
1213
- step_text=step_text,
1214
1213
  matching_event=matching_event,
1215
1214
  ground_truth=self.ground_truth,
1216
1215
  )
@@ -1336,12 +1335,11 @@ def _get_default_prompt_template(default_prompt_template_file_name: str) -> str:
1336
1335
 
1337
1336
  def _get_prompt_inputs(
1338
1337
  assertion_type: str,
1339
- step_text: str,
1340
1338
  matching_event: BotUttered,
1341
1339
  ground_truth: Optional[str] = None,
1342
1340
  ) -> Dict[str, Any]:
1343
1341
  if assertion_type == AssertionType.GENERATIVE_RESPONSE_IS_RELEVANT.value:
1344
- return {"num_variations": "3", "user_message": step_text}
1342
+ return {"num_variations": "3", "bot_message": matching_event.text}
1345
1343
  elif assertion_type == AssertionType.GENERATIVE_RESPONSE_IS_GROUNDED.value:
1346
1344
  ground_truth_event_metadata = matching_event.metadata.get(
1347
1345
  SEARCH_RESULTS_METADATA_KEY, ""
@@ -84,6 +84,10 @@ These are a few examples of how to generate question variations and identify non
84
84
 
85
85
  ## Task Inputs
86
86
 
87
- - **Input Answer**: {{ user_message }}
87
+ - **Input Answer**: {{ bot_message }}
88
+
89
+ ## Task Outputs
90
+
91
+ Do not include any additional explanations in your output. Only provide the JSON object as described in the task steps.
88
92
 
89
93
  Your output:
@@ -162,4 +162,8 @@ These are a few examples of how to evaluate the correctness of the answer based
162
162
  - **Input Answer**: {{ bot_message }}
163
163
  - **Ground Truth**: {{ ground_truth }}
164
164
 
165
+ ## Task Outputs
166
+
167
+ Do not include any additional explanations in your output. Only provide the JSON object as described in the task steps.
168
+
165
169
  Your output:
@@ -45,7 +45,7 @@ class ConversationStep:
45
45
  elif isinstance(command, SetSlotCommand):
46
46
  output.append(f"SetSlot({command.name}, {command.value})")
47
47
  elif isinstance(command, ClarifyCommand):
48
- output.append(f"Clarify({command.options})")
48
+ output.append(f"Clarify({', '.join(command.options)})")
49
49
  elif isinstance(command, CancelFlowCommand):
50
50
  output.append("CancelFlow()")
51
51
  elif isinstance(command, ChitChatAnswerCommand):
rasa/shared/core/slots.py CHANGED
@@ -329,6 +329,7 @@ class FloatSlot(Slot):
329
329
  is_builtin: bool = False,
330
330
  shared_for_coexistence: bool = False,
331
331
  filled_by: Optional[str] = None,
332
+ validation: Optional[Dict[str, Any]] = None,
332
333
  ) -> None:
333
334
  """Creates a FloatSlot.
334
335
 
@@ -345,6 +346,7 @@ class FloatSlot(Slot):
345
346
  is_builtin,
346
347
  shared_for_coexistence,
347
348
  filled_by=filled_by,
349
+ validation=validation,
348
350
  )
349
351
  self.max_value = max_value
350
352
  self.min_value = min_value
@@ -503,6 +505,7 @@ class CategoricalSlot(Slot):
503
505
  is_builtin: bool = False,
504
506
  shared_for_coexistence: bool = False,
505
507
  filled_by: Optional[str] = None,
508
+ validation: Optional[Dict[str, Any]] = None,
506
509
  ) -> None:
507
510
  """Creates a `Categorical Slot` (see parent class for detailed docstring)."""
508
511
  super().__init__(
@@ -514,6 +517,7 @@ class CategoricalSlot(Slot):
514
517
  is_builtin,
515
518
  shared_for_coexistence,
516
519
  filled_by=filled_by,
520
+ validation=validation,
517
521
  )
518
522
  if values and None in values:
519
523
  rasa.shared.utils.io.raise_warning(
@@ -725,6 +729,7 @@ class AnySlot(Slot):
725
729
  is_builtin: bool = False,
726
730
  shared_for_coexistence: bool = False,
727
731
  filled_by: Optional[str] = None,
732
+ validation: Optional[Dict[str, Any]] = None,
728
733
  ) -> None:
729
734
  """Creates an `Any Slot` (see parent class for detailed docstring).
730
735
 
@@ -749,6 +754,7 @@ class AnySlot(Slot):
749
754
  is_builtin,
750
755
  shared_for_coexistence,
751
756
  filled_by=filled_by,
757
+ validation=validation,
752
758
  )
753
759
 
754
760
  def __eq__(self, other: Any) -> bool:
@@ -14,7 +14,7 @@ from rasa.shared.constants import (
14
14
  )
15
15
  from rasa.shared.providers._configs.openai_client_config import OpenAIClientConfig
16
16
  from rasa.shared.providers.constants import (
17
- LITE_LLM_API_KEY_FIELD,
17
+ LITE_LLM_API_BASE_FIELD,
18
18
  LITE_LLM_API_VERSION_FIELD,
19
19
  )
20
20
  from rasa.shared.providers.llm._base_litellm_client import _BaseLiteLLMClient
@@ -154,7 +154,7 @@ class OpenAILLMClient(_BaseLiteLLMClient):
154
154
  fn_args = super()._completion_fn_args
155
155
  fn_args.update(
156
156
  {
157
- LITE_LLM_API_KEY_FIELD: self.api_base,
157
+ LITE_LLM_API_BASE_FIELD: self.api_base,
158
158
  LITE_LLM_API_VERSION_FIELD: self.api_version,
159
159
  }
160
160
  )
rasa/shared/utils/llm.py CHANGED
@@ -691,8 +691,11 @@ def get_default_prompt_template_based_on_model(
691
691
  Returns:
692
692
  The default prompt template.
693
693
  """
694
- provider = config.get(PROVIDER_CONFIG_KEY)
695
- model = config.get(MODEL_CONFIG_KEY, "")
694
+ _config = deepcopy(config)
695
+ if MODELS_CONFIG_KEY in _config:
696
+ _config = _config[MODELS_CONFIG_KEY][0]
697
+ provider = _config.get(PROVIDER_CONFIG_KEY)
698
+ model = _config.get(MODEL_CONFIG_KEY, "")
696
699
  model_name = model if provider and provider in model else f"{provider}/{model}"
697
700
  prompt_file_path = model_prompt_mapping.get(model_name, fallback_prompt_path)
698
701
  return importlib.resources.read_text(DEFAULT_PROMPT_PACKAGE_NAME, prompt_file_path)
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.12.0rc1"
3
+ __version__ = "3.12.0rc2"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rasa-pro
3
- Version: 3.12.0rc1
3
+ Version: 3.12.0rc2
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
@@ -64,6 +64,7 @@ Requires-Dist: jsonschema (>=4.22)
64
64
  Requires-Dist: keras (==2.14.0)
65
65
  Requires-Dist: langchain (>=0.2.0,<0.3.0)
66
66
  Requires-Dist: langchain-community (>=0.2.0,<0.3.0)
67
+ Requires-Dist: langcodes (>=3.5.0,<4.0.0)
67
68
  Requires-Dist: litellm (>=1.52.6,<1.53.0)
68
69
  Requires-Dist: matplotlib (>=3.7,<3.8)
69
70
  Requires-Dist: mattermostwrapper (>=2.2,<2.3)
@@ -157,15 +158,14 @@ Description-Content-Type: text/markdown
157
158
 
158
159
  <div align="center">
159
160
 
160
- [![Build Status](https://github.com/RasaHQ/rasa-private/workflows/Continuous%20Integration/badge.svg)](https://github.com/RasaHQ/rasa-private/actions)
161
161
  [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=RasaHQ_rasa&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=RasaHQ_rasa)
162
- [![Documentation Status](https://img.shields.io/badge/docs-stable-brightgreen.svg)](https://rasa.com/docs/rasa-pro/)
162
+ [![Documentation Status](https://img.shields.io/badge/docs-stable-brightgreen.svg)](https://rasa.com/docs/docs/pro/intro)
163
+ ![Python version support](https://img.shields.io/pypi/pyversions/rasa-pro)
163
164
 
164
165
  </div>
165
166
 
166
167
  <hr />
167
168
 
168
-
169
169
  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.
170
170
 
171
171
  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.
@@ -178,20 +178,18 @@ Building on the foundation of Rasa Open Source, Rasa Pro adds advanced features
178
178
  - **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.
179
179
  - **Built-in Security:** Safeguard sensitive data, control access, and ensure secure deployment, essential for production environments that demand high levels of security and compliance.
180
180
 
181
+ A [free developer license](https://rasa.com/docs/pro/intro/#who-rasa-pro-is-for) is available so you can explore and get to know Rasa Pro. It allows you to take your assistant live in production a limited capacity. A paid license is required for larger-scale production use, but all code is visible and can be customized as needed.
181
182
 
183
+ To get started right now, you can
182
184
 
183
- 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.
184
-
185
- To get started right now, you can
186
-
187
- `pip install rasa-pro`
185
+ `pip install rasa-pro`
188
186
 
189
- Check out our
187
+ Check out our
190
188
 
191
- - [Rasa-pro Quickstart](https://rasa.com/docs/rasa-pro/installation/quickstart/),
192
- - [Conversational AI with Language Models (CALM) conceptual rundown](https://rasa.com/docs/rasa-pro/calm/),
193
- - [Rasa Pro / CALM tutorial](https://rasa.com/docs/rasa-pro/tutorial), and
194
- - [Rasa pro changelog](https://rasa.com/docs/rasa/rasa-pro-changelog/)
189
+ - [Rasa-pro Quickstart](https://rasa.com/docs/learn/quickstart/pro),
190
+ - [Conversational AI with Language Models (CALM) conceptual rundown](https://rasa.com/docs/learn/concepts/calm),
191
+ - [Rasa Pro / CALM tutorial](https://rasa.com/docs/pro/tutorial), and
192
+ - [Rasa pro changelog](https://rasa.com/docs/reference/changelogs/rasa-pro-changelog)
195
193
 
196
194
  for more. Also feel free to reach out to us on the [Rasa forum](https://forum.rasa.com/).
197
195
 
@@ -1,4 +1,4 @@
1
- README.md,sha256=hu3oA1lnwNcUZbeb3AlbNJidVy64MCYzXIqai8rPORY,3298
1
+ README.md,sha256=rn81McEFcq6MM6i5ZVs-MV7HQd4ffBVtBeVV2DvF7Bo,3175
2
2
  rasa/__init__.py,sha256=YXG8RzVxiSJ__v-AewtV453YoCbmzWlHsU_4S0O2XpE,206
3
3
  rasa/__main__.py,sha256=OmUXcaA9l7KR_eSYCwaCSetuczxjrcN2taNnZ2ZUTbA,6472
4
4
  rasa/anonymization/__init__.py,sha256=Z-ZUW2ofZGfI6ysjYIS7U0JL4JSzDNOkHiiXK488Zik,86
@@ -46,9 +46,9 @@ rasa/cli/project_templates/calm/data/flows/list_contacts.yml,sha256=hwm484n_o1-2
46
46
  rasa/cli/project_templates/calm/data/flows/remove_contact.yml,sha256=moo4ShJqW3dnnFGyyIUhFtqC4BAYSa014rbjunLZTQk,969
47
47
  rasa/cli/project_templates/calm/db/contacts.json,sha256=5IxR4hab60DyOLHnCG03dmrQN4B03Sg7Bng5d52xYV4,110
48
48
  rasa/cli/project_templates/calm/domain/add_contact.yml,sha256=ItDgPQM0Hx8cWOwpUaxPfkHhgCpKSOhWRAw7a_HqlCU,1124
49
- rasa/cli/project_templates/calm/domain/list_contacts.yml,sha256=8398tP9LXqqugiBA6tjxLmUndUtvR2PzqwKCShzMRQI,327
50
- rasa/cli/project_templates/calm/domain/remove_contact.yml,sha256=ecY7pILAOrpRoEXn8wl0AEvD4Xs7AJEMQPZlSDoKdjc,1131
51
- rasa/cli/project_templates/calm/domain/shared.yml,sha256=aaSNQmtPH7Q77QTwf2heIAT6mdEHVSPWzZQqXnPFD9U,168
49
+ rasa/cli/project_templates/calm/domain/list_contacts.yml,sha256=iELDp7D-lnGeI44T1XywnrRvboMqFW5qE_E_0SLU6lU,301
50
+ rasa/cli/project_templates/calm/domain/remove_contact.yml,sha256=Kc9JQvt5K8rkd3fLzlQCtlwFjAMoPCBDtoKBKrZpME8,1104
51
+ rasa/cli/project_templates/calm/domain/shared.yml,sha256=l3MJZN1l44OyciUxeWQ_fDuZkmtnI2tHw3AcCGPleMM,92
52
52
  rasa/cli/project_templates/calm/e2e_tests/cancelations/user_cancels_during_a_correction.yml,sha256=2dhrQ9BAL-7L0NlLqU-Cp8dyEhLBkQ8kHpip4zmhXqE,575
53
53
  rasa/cli/project_templates/calm/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml,sha256=7n5jT1oXD3O2Fjv93wZHi8Bir68pxO_XulqvOKJj2h0,214
54
54
  rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_handle.yml,sha256=ENWTNgKZp6iAbB26qDEjo2FwnE0RUiEvlYQGRW43lqQ,658
@@ -96,7 +96,7 @@ rasa/core/actions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
96
96
  rasa/core/actions/action.py,sha256=Kqup2dXUREQRA7vPk3-VjLZCVubbRR2I998cOSDRNkg,43336
97
97
  rasa/core/actions/action_clean_stack.py,sha256=xUP-2ipPsPAnAiwP17c-ezmHPSrV4JSUZr-eSgPQwIs,2279
98
98
  rasa/core/actions/action_exceptions.py,sha256=hghzXYN6VeHC-O_O7WiPesCNV86ZTkHgG90ZnQcbai8,724
99
- rasa/core/actions/action_handle_digressions.py,sha256=u1woxFGmDbsoRyEB9yFDJonojRUeYosbm1_afzfecWo,4442
99
+ rasa/core/actions/action_handle_digressions.py,sha256=p3cjzTfT0GEsJlYip-TPnr-PJQ545vQnNp0JPKBUs8A,5234
100
100
  rasa/core/actions/action_hangup.py,sha256=o5iklHG-F9IcRgWis5C6AumVXznxzAV3o9zdduhozEM,994
101
101
  rasa/core/actions/action_repeat_bot_messages.py,sha256=2DZFHPS7SKslz_Pm3Tyn0154xTws3E7lMYKl2ktQPTQ,3522
102
102
  rasa/core/actions/action_run_slot_rejections.py,sha256=xsb0AHEWLV9AtX7dsCyxaJBbF0t7REC353YWerHIhts,7274
@@ -333,7 +333,7 @@ rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2,sha256
333
333
  rasa/core/policies/flow_policy.py,sha256=597G62hrLF_CAMCvu-TPRldFnjMP2XEIkhcIaPWcQAc,7489
334
334
  rasa/core/policies/flows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
335
335
  rasa/core/policies/flows/flow_exceptions.py,sha256=_FQuN-cerQDM1pivce9bz4zylh5UYkljvYS1gjDukHI,1527
336
- rasa/core/policies/flows/flow_executor.py,sha256=gZ7PJ6GQk19r9VUIRA2XacBgaDk_tWwz2Igq_yuuGzc,26810
336
+ rasa/core/policies/flows/flow_executor.py,sha256=1KJhBovD9INHVF7PQD4N7CH46JFfPrsy7QXnnGAPlNU,26938
337
337
  rasa/core/policies/flows/flow_step_result.py,sha256=agjPrD6lahGSe2ViO5peBeoMdI9ngVGRSgtytgxmJmg,1360
338
338
  rasa/core/policies/intentless_policy.py,sha256=p9e54sSjTOGAFxLbPdF0jspQNETmtBvg-RXQNPviIbE,37898
339
339
  rasa/core/policies/intentless_prompt_template.jinja2,sha256=KhIL3cruMmkxhrs5oVbqgSvK6ZiN_6TQ_jXrgtEB-ZY,677
@@ -342,7 +342,7 @@ rasa/core/policies/policy.py,sha256=5SUnPajSTSf8PzB1-jFbQPtsvR-zLN-xkjeotWOxuJc,
342
342
  rasa/core/policies/rule_policy.py,sha256=EItfUn07JIBLRIbriPKDprsvWq_-xzZTGrlTS2erByA,50730
343
343
  rasa/core/policies/ted_policy.py,sha256=0RzIuyrtt4PxLcqQ-bfaExkZvU-TnsMbgmDcwh2SakY,87710
344
344
  rasa/core/policies/unexpected_intent_policy.py,sha256=ZXvbswf2NDy00kHmBQcyXa1OVYFyc79HQKrFkQ4gCfM,39609
345
- rasa/core/processor.py,sha256=x8GaYuDkelCwFpmjjrpkN3xtzaewiAxlVgpZHG3tOU0,59265
345
+ rasa/core/processor.py,sha256=KWCu91DQghe1ZN_p8EduwjWA3mtog39nqeuai3iB3to,59224
346
346
  rasa/core/run.py,sha256=5qq1Z-GiIrFejsthOnnkhQtNiqccuYHYf8ixP49PSHk,11484
347
347
  rasa/core/secrets_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
348
348
  rasa/core/secrets_manager/constants.py,sha256=dTDHenvG1JBVi34QIR6FpdO5RDOXQwAjAxLlgJ2ZNEI,1193
@@ -368,31 +368,31 @@ rasa/dialogue_understanding/coexistence/intent_based_router.py,sha256=JlYBZdScnh
368
368
  rasa/dialogue_understanding/coexistence/llm_based_router.py,sha256=UTLMZpynSRt8qnQSSV-dTgFQbBHaMEgrLIUWCMyH1BE,11354
369
369
  rasa/dialogue_understanding/coexistence/router_template.jinja2,sha256=CHWFreN0sv1EbPh-hf5AlCt3zxy2_llX1Pdn9Q11Y18,357
370
370
  rasa/dialogue_understanding/commands/__init__.py,sha256=F-pLETYRUjhIkjjDfXGUuPsK_ac1HcLmJkrUUP0RhME,2259
371
- rasa/dialogue_understanding/commands/can_not_handle_command.py,sha256=k3N2qT9pdptJb6oAxtQV1YvKt_ujLbidLD0CeC8P43A,3506
372
- rasa/dialogue_understanding/commands/cancel_flow_command.py,sha256=2UoNPgJ3WsX2btDcWq5FL7qBp0DvNQACGaMZV3qYk4Y,7636
373
- rasa/dialogue_understanding/commands/change_flow_command.py,sha256=S0ZUvFPl7ppksyKyADJboY93wByj_SWI3onxDXLIpRs,2396
374
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py,sha256=UI2Jvo9OVkiOH74Y1n9qSDzOvj8WbK-Zp03zk6nc5ZM,2829
375
- rasa/dialogue_understanding/commands/clarify_command.py,sha256=HbmswhwAznFKzP5ghqkGtvlR3EEPx1xTKO9zb0nUPys,4278
371
+ rasa/dialogue_understanding/commands/can_not_handle_command.py,sha256=fKOj9ScLxuaFO9Iw0p7og_4zMiw2weBdx322rBKlnCI,3519
372
+ rasa/dialogue_understanding/commands/cancel_flow_command.py,sha256=eNsXlANhsHbTjT2TaPZvVAm3w8EMqJ6nuDn-2_hMttk,7649
373
+ rasa/dialogue_understanding/commands/change_flow_command.py,sha256=NnD9PM0B9o4oxTtYdcb-lDBC0-oQkbAQRB-55iYCkng,2409
374
+ rasa/dialogue_understanding/commands/chit_chat_answer_command.py,sha256=PtwNuAHJdIUQ_PIOv5bguVJMyZ_2jPtoozQQdiebKB4,2842
375
+ rasa/dialogue_understanding/commands/clarify_command.py,sha256=H-sse6PA47nPkFXhx8L6XAztdInSrgU_U4U0VF45EBU,4289
376
376
  rasa/dialogue_understanding/commands/command.py,sha256=rhxHmllTMwvb4Uq-pDqmUdlKtu-87y8nqN5DRO-KDwE,2529
377
- rasa/dialogue_understanding/commands/command_syntax_manager.py,sha256=vPX-ckjD58YHchrk2phcQ4ZXEZmO1penyIH0fpKPHas,1892
377
+ rasa/dialogue_understanding/commands/command_syntax_manager.py,sha256=vO6sOak0g9GucEtiNximJ9bQFbHQwWJ-M5XNF1gGxz4,1893
378
378
  rasa/dialogue_understanding/commands/correct_slots_command.py,sha256=LlaBtWc3y-DyDPMF-zGG9x_J9uCe78LqiuogHIyoz5Q,10810
379
379
  rasa/dialogue_understanding/commands/error_command.py,sha256=LTEsxkGGGZR6wEEGuTtQ4K4EK_u2UFhNK4eAKyPfyME,2436
380
380
  rasa/dialogue_understanding/commands/free_form_answer_command.py,sha256=XlQrHXrcOemzu1LHZiDhBAluiSlnUQ2V7ET5Z-aG7gc,224
381
381
  rasa/dialogue_understanding/commands/handle_code_change_command.py,sha256=Cp2e1iD0zacXmljJ8vDXHJu9Fp6BwB7cGx8NF748akw,2192
382
- rasa/dialogue_understanding/commands/handle_digressions_command.py,sha256=uSotn4xHsOnfQPOnltU5ZxBabW9gfjm2RsnvkXEefbA,5127
383
- rasa/dialogue_understanding/commands/human_handoff_command.py,sha256=qEBaeHWcKHpsAE-WjNX-bC9mknH79v8Vb2IGNQjfwmg,2952
384
- rasa/dialogue_understanding/commands/knowledge_answer_command.py,sha256=2fVTYzL3irCWA_BQmGZC4LwpCwo9UdaTCex2jNZIk3Q,2839
382
+ rasa/dialogue_understanding/commands/handle_digressions_command.py,sha256=KKEqyW6HROsZ0xcCUKqOIQapK6oSKWXyDNOHyzU-5KA,4889
383
+ rasa/dialogue_understanding/commands/human_handoff_command.py,sha256=vfMXBWKm7fsaabCcLti1r8c1GrjS_0bvRKzgxJ8s6rU,2965
384
+ rasa/dialogue_understanding/commands/knowledge_answer_command.py,sha256=hnU6hOVr9aR7KfuxIV-LFycQWk7fsl4b9ZuAqpjBjvM,2852
385
385
  rasa/dialogue_understanding/commands/noop_command.py,sha256=aIaLBjSV84qy9X4aGlJfMIYhF57maH5CiKNWL_-giD4,1485
386
386
  rasa/dialogue_understanding/commands/prompt_command.py,sha256=slKQkvtrM353I3gltiett5xrZ7IxQ0omdqJHi6IowGk,2569
387
- rasa/dialogue_understanding/commands/repeat_bot_messages_command.py,sha256=YnaG1Ugw55OwTttY8Wp7-AdpwHc53LD7wBo9AQbbK2E,2920
387
+ rasa/dialogue_understanding/commands/repeat_bot_messages_command.py,sha256=8SavUvMk6FmWz4Yr-j_JDTuwAwLfGy0RYZOLqn16wx0,2933
388
388
  rasa/dialogue_understanding/commands/restart_command.py,sha256=vvmucwlVtfh6VMgdOn5hZfsP9U5HhfbDeBSG2IndX0Y,1639
389
389
  rasa/dialogue_understanding/commands/session_end_command.py,sha256=ZecUpYZDTX_68_kV1Hv4i317bbeBeVHHyhW_A7r5yzs,1770
390
390
  rasa/dialogue_understanding/commands/session_start_command.py,sha256=FA4yocMnFt5bn2dmXj48S4Pq_yTlEnOBxgK_mq-qAxg,1704
391
- rasa/dialogue_understanding/commands/set_slot_command.py,sha256=2AlLUBPKB2YbfGjOJx6R6B9O2o2EWgkNUxSUIA8sBo0,6725
392
- rasa/dialogue_understanding/commands/skip_question_command.py,sha256=q13cRbTXL9ioaTWTQwIf6Ew2GPGKcnYY7hpmg1KcL0Q,3283
393
- rasa/dialogue_understanding/commands/start_flow_command.py,sha256=NQo8SbB6FWSsE0v95XKqDaYsK6obrWnwd7rGjbzaAzM,6381
391
+ rasa/dialogue_understanding/commands/set_slot_command.py,sha256=76AvXY88WEdlFnKuMiOIoiwNC4s__NeU_TNwYovl754,6732
392
+ rasa/dialogue_understanding/commands/skip_question_command.py,sha256=PvGpiW0Dk1xwvmntzhz7pEn99XqPv5nMQfR-cwNKxXk,3296
393
+ rasa/dialogue_understanding/commands/start_flow_command.py,sha256=yWHjXu7IYIMD_Y49hvztvowapELNyf3a1sgAgQYIdL4,6420
394
394
  rasa/dialogue_understanding/commands/user_silence_command.py,sha256=DQjRfZk09sV1o2emnLkmX7cZpsJwBHNeJGBDQVkejjY,1686
395
- rasa/dialogue_understanding/commands/utils.py,sha256=ZymuPFPJCS48VKwvVcZmqnhCpG_DiIqnw8w69wDE17w,5171
395
+ rasa/dialogue_understanding/commands/utils.py,sha256=vjCLhH_o4vcfniyttlRynDQ8IaYeHeExvs8DFCFcECc,4070
396
396
  rasa/dialogue_understanding/constants.py,sha256=_kB0edGV23uvhujlF193N2jk6YG0R6LC599YDX5B5vo,129
397
397
  rasa/dialogue_understanding/generator/__init__.py,sha256=pBm0o6pnJA_0W0UOrGuVsiG4hsTNH_n5GLrz8BYQHM8,830
398
398
  rasa/dialogue_understanding/generator/command_generator.py,sha256=QvYHF3w_WgyItMySUtf0B2Qmb_7SEOLONmQXdLseIt8,13184
@@ -405,7 +405,7 @@ rasa/dialogue_understanding/generator/llm_command_generator.py,sha256=z7jhIJ3W_5
405
405
  rasa/dialogue_understanding/generator/multi_step/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
406
406
  rasa/dialogue_understanding/generator/multi_step/fill_slots_prompt.jinja2,sha256=Y0m673tAML3cFPaLM-urMXDsBYUUcXIw9YUpkAhGUuA,2933
407
407
  rasa/dialogue_understanding/generator/multi_step/handle_flows_prompt.jinja2,sha256=8l93_QBKBYnqLICVdiTu5ejZDE8F36BU8-qwba0px44,1927
408
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py,sha256=921KrV-9p0vEqqQzjRMK3dseG2qgl-tmhyC24FKZxTo,31946
408
+ rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py,sha256=kvVbUibV-OgiaLhgnmbA7UWKXKsN7TN_OjmLJfI49M8,31969
409
409
  rasa/dialogue_understanding/generator/nlu_command_adapter.py,sha256=28QdoZ330DL5X-SdUQASjsmyf9KIY3GGHbrl2xEeZMU,10868
410
410
  rasa/dialogue_understanding/generator/prompt_templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
411
411
  rasa/dialogue_understanding/generator/prompt_templates/command_prompt_template.jinja2,sha256=nMayu-heJYH1QmcL1cFmXb8SeiJzfdDR_9Oy5IRUXsM,3937
@@ -413,7 +413,7 @@ rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_claude_
413
413
  rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_default.jinja2,sha256=walH6RpfjxT43lhe4er7zl7FFHLYsIyRev4zGTR5VOQ,3051
414
414
  rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2,sha256=Nk6dXFR-eBWh9gSH6XLh7bdlKIoWUcaoQuxCkiD9l-Q,3555
415
415
  rasa/dialogue_understanding/generator/single_step/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
416
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py,sha256=4aawT_0cMo_LkjffiLVPeYuCMAC7xmZxIkYHCsmVDL8,17462
416
+ rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py,sha256=D9EWIzX5B1vri8mTI6_7cf-I8_EaiuDapd7BeIqZ2B8,19924
417
417
  rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py,sha256=tfRanDYEuZLJExGwDrAoncwr8udfoGVNAYWMFtTHFXI,3973
418
418
  rasa/dialogue_understanding/generator/utils.py,sha256=jxtb-AfngN59y2rHynqJDK80xM_yooEvr3aW1MWl6H0,2760
419
419
  rasa/dialogue_understanding/patterns/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -438,7 +438,7 @@ rasa/dialogue_understanding/patterns/skip_question.py,sha256=fJ1MC0WEEtS-BpnGJEf
438
438
  rasa/dialogue_understanding/patterns/user_silence.py,sha256=xP-QMnd-MsybH5z4g01hBv4OLOHcw6m3rc26LQfe2zo,1140
439
439
  rasa/dialogue_understanding/patterns/validate_slot.py,sha256=hqd5AEGT3M3HLNhMwuI9W9kZNCvgU6GyI-2xc2b4kz8,2085
440
440
  rasa/dialogue_understanding/processor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
441
- rasa/dialogue_understanding/processor/command_processor.py,sha256=l2CPJCNzA5X1W_i08QpXBwF8ys5eqMItRsKK-9CyP-g,30510
441
+ rasa/dialogue_understanding/processor/command_processor.py,sha256=tviXfun7JNdKxvpLol1sMIumyuxRrBAV6kKItrLyIJI,30494
442
442
  rasa/dialogue_understanding/processor/command_processor_component.py,sha256=9NWJxMibKeaOBLDRT9lcylJr0ki5sQ0hJRtLlKHIlnI,1526
443
443
  rasa/dialogue_understanding/stack/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
444
444
  rasa/dialogue_understanding/stack/dialogue_stack.py,sha256=cYV6aQeh0EuOJHODDqK3biqXozYTX8baPgLwHhPxFqs,5244
@@ -448,15 +448,15 @@ rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py,sha256=SBTmCV4S
448
448
  rasa/dialogue_understanding/stack/frames/flow_stack_frame.py,sha256=827ppz6PKr1tSN34BuMlm_iWZCYsZTgvqaNaq1QQFkc,5078
449
449
  rasa/dialogue_understanding/stack/frames/pattern_frame.py,sha256=EVrYWv5dCP7XTvNV-HqtOOrseP-IkF0jD2_JacAvIYw,235
450
450
  rasa/dialogue_understanding/stack/frames/search_frame.py,sha256=Eo6tSSbJpslKcs6DLu250NmtoKMe4bDHC8_ebx5sJ60,759
451
- rasa/dialogue_understanding/stack/utils.py,sha256=FRdsnfHB-6ydCMGs7e6E9v-raOJSL4cy3FcenXK9GEU,7672
451
+ rasa/dialogue_understanding/stack/utils.py,sha256=doBFHAHsJNgnIKhdDdONbMVDMRxDoXs_dmb5fe5o4Vc,9201
452
452
  rasa/dialogue_understanding/utils.py,sha256=s3Y-REFv2HKYGpPS8nCgISQh86SnQgaRA8KukeFSf9Y,5445
453
453
  rasa/dialogue_understanding_test/README.md,sha256=klUCq_FYd0MkIeyxlwYCfsB9EEsSmXUpTTDTxdR7EPc,17764
454
454
  rasa/dialogue_understanding_test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
455
455
  rasa/dialogue_understanding_test/command_comparison.py,sha256=LvCZGgZVFpKjWqaZE5OqPClM5xDNdFZQ4FslvNerB7s,1812
456
456
  rasa/dialogue_understanding_test/command_metric_calculation.py,sha256=ys1BobRxqEhsfKk5Op9OB_IXUIsGGSiK6ox8246W-9E,3889
457
457
  rasa/dialogue_understanding_test/constants.py,sha256=G63FEzswDUOonTxoXQicEJwI6ICkSx3YP1ILkGH1ijw,790
458
- rasa/dialogue_understanding_test/du_test_case.py,sha256=NZ76ZT_Cz0q8WwSPw7WEzWW3JyiUMVxtYw5PJnFgHJM,14573
459
- rasa/dialogue_understanding_test/du_test_result.py,sha256=9cg_BVmZmm41bnA41Z9h80tKu9ehmG7pCYIa9mKoyPs,15065
458
+ rasa/dialogue_understanding_test/du_test_case.py,sha256=72gfbvtVgkEVnevG5ttikL9QcWgho-XOrapm38MkGH0,15179
459
+ rasa/dialogue_understanding_test/du_test_result.py,sha256=AL1T5f9OoEeTFmCIN5wmqPELXBnYrWwRn3ZtAEIBLfA,15086
460
460
  rasa/dialogue_understanding_test/du_test_runner.py,sha256=ZG-TNfu-Ak9l_gg9NNadzKzARgICJ9wlsYooCBi1WKU,11943
461
461
  rasa/dialogue_understanding_test/du_test_schema.yml,sha256=zgIhb6PE8LnoigVmv4NbU3cjSsr2SkGoO-5Xh4Et9KA,4767
462
462
  rasa/dialogue_understanding_test/io.py,sha256=A797fXYvjFZM4ejA7ozZwp71eFLg-ebTM4I_rZwH4yk,15127
@@ -467,7 +467,7 @@ rasa/dialogue_understanding_test/utils.py,sha256=YxaYvxlrMOBeS4PcpvVy5NIuN3-Pliq
467
467
  rasa/dialogue_understanding_test/validation.py,sha256=JFsDIjdB-CNPKhRjBBNKzNoNq9nfnEtRC15YhG1AUg0,2701
468
468
  rasa/e2e_test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
469
469
  rasa/e2e_test/aggregate_test_stats_calculator.py,sha256=Ys2Zfc8OOPNN2KHtfKqRdyrWvUzbgSzzfvuCa-Pu21k,4924
470
- rasa/e2e_test/assertions.py,sha256=u3NBg5jRUf7t6-V2Rm51i59--uEfXMwZhwA3mmYEDgE,47042
470
+ rasa/e2e_test/assertions.py,sha256=yATtyCRQpuBeQF-2Vhd5IYf4rQAeKlo72HAX0x9gS4M,46928
471
471
  rasa/e2e_test/assertions_schema.yml,sha256=NJ-3uuK2lHKKGn4GV3XsnNSvRRQFJznzknUSIBQZMws,3250
472
472
  rasa/e2e_test/constants.py,sha256=iQVJm2kFYj9Ex1SKSZEg2evEbg73bKQpn3Jzj1pRNQs,1496
473
473
  rasa/e2e_test/e2e_config.py,sha256=C1gZ_AGP3pe9xhtfB42dtMo7AjO8MI5D3hN1zWa7vZE,9198
@@ -479,8 +479,8 @@ rasa/e2e_test/e2e_test_coverage_report.py,sha256=zO_3hQIuCf4r9YIbQ2_DHM7HCWHe9pZ
479
479
  rasa/e2e_test/e2e_test_result.py,sha256=qVurjFC4cAWIY7rOsc-A-4nIdcnnw98TaK86-bDwI7Y,1649
480
480
  rasa/e2e_test/e2e_test_runner.py,sha256=eXV5DJ0rAVY7FAXYI9aKvYqZXdfsE92y6deEUqUvrTY,47965
481
481
  rasa/e2e_test/e2e_test_schema.yml,sha256=0deWjuKRHNo6e_LSCnUoiw9NLIYf6dj1-zFPl_AqLYA,5632
482
- rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2,sha256=kJZnYwQ_vy72PP_mLm8j3rIfMrBydAEzpVqn1s-lo4Y,2589
483
- rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2,sha256=30mc3VLKBcKozAyqI0s441mN2piwfRnDuEt18bmjQ7I,8088
482
+ rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2,sha256=W8sb_6mDRxuRpyC8hf5jdP6KkdiFj5n7E9O1LDgQFLA,2726
483
+ rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2,sha256=jCgDbZvWn5fncr4zvB5UQSK1VJu9xDQtpY4B8GKtlmA,8226
484
484
  rasa/e2e_test/pykwalify_extensions.py,sha256=OGYKIKYJXd2S0NrWknoQuijyBQaE-oMLkfV_eMRkGSM,1331
485
485
  rasa/e2e_test/stub_custom_action.py,sha256=aGOdZEQVZJpfY5zaHUcG447_tdJCncgD3G85eDUlVj0,2369
486
486
  rasa/e2e_test/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -536,7 +536,7 @@ rasa/hooks.py,sha256=5ZMrqNz323w56MMY6E8jeZ_YXgRqq8p-yi18S2XOmbo,4061
536
536
  rasa/jupyter.py,sha256=TCYVD4QPQIMmfA6ZwDUBOBTAECwCwbU2XOkosodLO9k,1782
537
537
  rasa/llm_fine_tuning/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
538
538
  rasa/llm_fine_tuning/annotation_module.py,sha256=6wBBjGwONVlikp79xAHp5g3rydEhPM6kP1bw1g-maYk,8578
539
- rasa/llm_fine_tuning/conversations.py,sha256=yWK1EwBDoek8WoTuBUEJq8Pln8sZrss00PXishH7QcU,5197
539
+ rasa/llm_fine_tuning/conversations.py,sha256=faZrkYff0xM2b4ucpuucE5er6c61MWwGoWER5W9ckuA,5208
540
540
  rasa/llm_fine_tuning/llm_data_preparation_module.py,sha256=TW57W13s3z7KvfZJt6k2D6XOaH7PDh3RX3nUldlYtsg,6082
541
541
  rasa/llm_fine_tuning/paraphrasing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
542
542
  rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py,sha256=73ltYqukJoLGEalMTf2kpiHVeyqlOUnC8pZHahd0GzY,9945
@@ -659,7 +659,7 @@ rasa/shared/core/flows/validation.py,sha256=4IfTR8LoaJcqP8I7NQXjl0Ysmwc7VO7YzCsh
659
659
  rasa/shared/core/flows/yaml_flows_io.py,sha256=85ln95jpkh7ZqDl1cheFa8Q21gnadLjWrW8ADmQlrUQ,14385
660
660
  rasa/shared/core/generator.py,sha256=UAuBPu5UjUhL9djVK-PvrWZcNhRACOEgnRsTleV7eeY,35686
661
661
  rasa/shared/core/slot_mappings.py,sha256=0jOIk-iSKI-pJObYdk-Bmf-2SPTYFUuCA4H6SONthRA,25847
662
- rasa/shared/core/slots.py,sha256=0vy6laTW7A96sQfImZfTFF0foq_c9cTHKFFh31Gc58k,28934
662
+ rasa/shared/core/slots.py,sha256=2tOpUGLMY3a24zL8pqJ_U38x-h5Du-KpZoNxEGoFOqY,29198
663
663
  rasa/shared/core/trackers.py,sha256=KRmahvRNa3M9q8MS-pv8wu8atzo__sh8uHhkSildSsA,45018
664
664
  rasa/shared/core/training_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
665
665
  rasa/shared/core/training_data/loading.py,sha256=RCx1uTI9iDejFI_sWg3qPzhjln7-hu78f3EDAT6K0No,2894
@@ -740,7 +740,7 @@ rasa/shared/providers/llm/default_litellm_llm_client.py,sha256=e3f-YMS7-aariB5er
740
740
  rasa/shared/providers/llm/litellm_router_llm_client.py,sha256=OHE1IcLg1EFrKXEIQ6ku3XT-9DbgOQ2BlyPcxAG9wL8,7946
741
741
  rasa/shared/providers/llm/llm_client.py,sha256=-hTCRsL-A3GCMRHtcyCgcCyra-9OJ8GUC-mURoRXH0k,3242
742
742
  rasa/shared/providers/llm/llm_response.py,sha256=8mOpZdmh4-3yM7aOmNO0yEYUmRDErfoP7ZDMUuHr2Cc,3504
743
- rasa/shared/providers/llm/openai_llm_client.py,sha256=_pfuedqXm2V7C1awLF6HBHN5uFuvQ9dbSovmmWwQOeI,5011
743
+ rasa/shared/providers/llm/openai_llm_client.py,sha256=rSdLj29Hl1Wm5G6Uwo77j4WqogK_3QIbTA7fyt63YAg,5013
744
744
  rasa/shared/providers/llm/rasa_llm_client.py,sha256=44Tvtnkq4mxDIxtdrGUkwBWAvX1OLaswqmpAsyBH8e8,3504
745
745
  rasa/shared/providers/llm/self_hosted_llm_client.py,sha256=X3QyA5nZbQap0tomg0dQozbY39Ry0y-lLnj-EowK6dI,10270
746
746
  rasa/shared/providers/mappings.py,sha256=QSD3XWvhYCtBLNpGycN30vEnLULYIaqCsAtmfPfSZ3U,3674
@@ -756,7 +756,7 @@ rasa/shared/utils/health_check/embeddings_health_check_mixin.py,sha256=ASOzDtI3i
756
756
  rasa/shared/utils/health_check/health_check.py,sha256=izixrbc9BxFSsjzwoIw9U0w0VKSX5gMwhey8bcwe1wc,9709
757
757
  rasa/shared/utils/health_check/llm_health_check_mixin.py,sha256=ANP5Q68TRX8p4wWkRCAISsWBV1iYYeGnqWILnR1NawE,957
758
758
  rasa/shared/utils/io.py,sha256=AhuECoXGO367NvWRCBu99utEtTQnyxWVJyKOOpLePpg,15917
759
- rasa/shared/utils/llm.py,sha256=cMtfAuRJ_APadlVEv9PqkQ1D86Op9JOLfRVjjFM1Eks,26466
759
+ rasa/shared/utils/llm.py,sha256=Mc7d_BD4_k_f-t9xSeHxBwwyHVsegkvAnorgDSguObA,26584
760
760
  rasa/shared/utils/pykwalify_extensions.py,sha256=2fvaysurCST_EMelCsECzkBgvClKYbdHb2Ty9rZhszw,1846
761
761
  rasa/shared/utils/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
762
762
  rasa/shared/utils/schemas/config.yml,sha256=czxSADw9hOIZdhvFP8pVUQo810hs9_C8ZGfCPx17taM,27
@@ -820,9 +820,9 @@ rasa/utils/train_utils.py,sha256=ClJx-6x3-h3Vt6mskacgkcCUJTMXjFPe3zAcy_DfmaU,212
820
820
  rasa/utils/url_tools.py,sha256=dZ1HGkVdWTJB7zYEdwoDIrEuyX9HE5WsxKKFVsXBLE0,1218
821
821
  rasa/utils/yaml.py,sha256=KjbZq5C94ZP7Jdsw8bYYF7HASI6K4-C_kdHfrnPLpSI,2000
822
822
  rasa/validator.py,sha256=Hq8Y_dBflR3pO0YWSoNZ9uoacRaAmMAE3ijK3XH2bnk,88713
823
- rasa/version.py,sha256=-B6bTF_cJDg-krlKwYBHdn3qzGK6oUPnjj1h140Xh-A,120
824
- rasa_pro-3.12.0rc1.dist-info/METADATA,sha256=YvxFxzw8BcDBgGBR_knyMmz72K4NNdVcwDWr_At7Y94,10777
825
- rasa_pro-3.12.0rc1.dist-info/NOTICE,sha256=7HlBoMHJY9CL2GlYSfTQ-PZsVmLmVkYmMiPlTjhuCqA,218
826
- rasa_pro-3.12.0rc1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
827
- rasa_pro-3.12.0rc1.dist-info/entry_points.txt,sha256=ckJ2SfEyTPgBqj_I6vm_tqY9dZF_LAPJZA335Xp0Q9U,43
828
- rasa_pro-3.12.0rc1.dist-info/RECORD,,
823
+ rasa/version.py,sha256=1-Q-FizBfzLTlKpg6czpFSQiTXjLS_71kd66wzjtazI,120
824
+ rasa_pro-3.12.0rc2.dist-info/METADATA,sha256=d2GqDjYl0z12lfz7Spx8JVJhDhXnD3eSid7JSEVNupA,10696
825
+ rasa_pro-3.12.0rc2.dist-info/NOTICE,sha256=7HlBoMHJY9CL2GlYSfTQ-PZsVmLmVkYmMiPlTjhuCqA,218
826
+ rasa_pro-3.12.0rc2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
827
+ rasa_pro-3.12.0rc2.dist-info/entry_points.txt,sha256=ckJ2SfEyTPgBqj_I6vm_tqY9dZF_LAPJZA335Xp0Q9U,43
828
+ rasa_pro-3.12.0rc2.dist-info/RECORD,,