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.
- README.md +10 -13
- rasa/cli/project_templates/calm/domain/list_contacts.yml +1 -2
- rasa/cli/project_templates/calm/domain/remove_contact.yml +1 -2
- rasa/cli/project_templates/calm/domain/shared.yml +1 -4
- rasa/core/actions/action_handle_digressions.py +35 -13
- rasa/core/policies/flows/flow_executor.py +7 -2
- rasa/core/processor.py +0 -1
- rasa/dialogue_understanding/commands/can_not_handle_command.py +1 -1
- rasa/dialogue_understanding/commands/cancel_flow_command.py +1 -1
- rasa/dialogue_understanding/commands/change_flow_command.py +1 -1
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +1 -1
- rasa/dialogue_understanding/commands/clarify_command.py +1 -1
- rasa/dialogue_understanding/commands/command_syntax_manager.py +1 -1
- rasa/dialogue_understanding/commands/handle_digressions_command.py +1 -7
- rasa/dialogue_understanding/commands/human_handoff_command.py +1 -1
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +1 -1
- rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +1 -1
- rasa/dialogue_understanding/commands/set_slot_command.py +1 -1
- rasa/dialogue_understanding/commands/skip_question_command.py +1 -1
- rasa/dialogue_understanding/commands/start_flow_command.py +3 -1
- rasa/dialogue_understanding/commands/utils.py +1 -28
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +75 -13
- rasa/dialogue_understanding/processor/command_processor.py +4 -4
- rasa/dialogue_understanding/stack/utils.py +38 -0
- rasa/dialogue_understanding_test/du_test_case.py +30 -10
- rasa/dialogue_understanding_test/du_test_result.py +1 -1
- rasa/e2e_test/assertions.py +6 -8
- rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2 +5 -1
- rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2 +4 -0
- rasa/llm_fine_tuning/conversations.py +1 -1
- rasa/shared/core/slots.py +6 -0
- rasa/shared/providers/llm/openai_llm_client.py +2 -2
- rasa/shared/utils/llm.py +5 -2
- rasa/version.py +1 -1
- {rasa_pro-3.12.0rc1.dist-info → rasa_pro-3.12.0rc2.dist-info}/METADATA +12 -14
- {rasa_pro-3.12.0rc1.dist-info → rasa_pro-3.12.0rc2.dist-info}/RECORD +40 -40
- {rasa_pro-3.12.0rc1.dist-info → rasa_pro-3.12.0rc2.dist-info}/NOTICE +0 -0
- {rasa_pro-3.12.0rc1.dist-info → rasa_pro-3.12.0rc2.dist-info}/WHEEL +0 -0
- {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
|
-
[](https://github.com/RasaHQ/rasa-private/actions)
|
|
6
5
|
[](https://sonarcloud.io/summary/new_code?id=RasaHQ_rasa)
|
|
7
|
-
[](https://rasa.com/docs/
|
|
6
|
+
[](https://rasa.com/docs/docs/pro/intro)
|
|
7
|
+

|
|
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
|
-
|
|
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/
|
|
37
|
-
- [Conversational AI with Language Models (CALM) conceptual rundown](https://rasa.com/docs/
|
|
38
|
-
- [Rasa Pro / CALM tutorial](https://rasa.com/docs/
|
|
39
|
-
- [Rasa pro changelog](https://rasa.com/docs/
|
|
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/).
|
|
@@ -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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
113
|
-
frame_type = FlowStackFrameType.INTERRUPT
|
|
124
|
+
interrupting_flow_id = top_frame.interrupting_flow_id
|
|
114
125
|
stack = tracker.stack
|
|
115
|
-
|
|
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
|
|
291
|
-
|
|
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
|
@@ -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"^[
|
|
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"^[
|
|
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"^[
|
|
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"^[
|
|
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"^[
|
|
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.
|
|
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
|
|
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"^[
|
|
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"^[
|
|
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"^[
|
|
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"""^[
|
|
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"^[
|
|
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:
|
|
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,
|
|
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,
|
|
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.
|
|
354
|
-
f"{cls.
|
|
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
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
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
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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 =
|
|
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.
|
|
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
|
)
|
rasa/e2e_test/assertions.py
CHANGED
|
@@ -972,7 +972,7 @@ class GenerativeResponseMixin(Assertion):
|
|
|
972
972
|
data.pop("metric_adjective")
|
|
973
973
|
return data
|
|
974
974
|
|
|
975
|
-
def _render_prompt(self,
|
|
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(
|
|
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,
|
|
1163
|
+
def _render_prompt(self, matching_event: BotUttered) -> str:
|
|
1164
1164
|
"""Render the prompt."""
|
|
1165
|
-
inputs = _get_prompt_inputs(self.type(),
|
|
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,
|
|
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", "
|
|
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**: {{
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
695
|
-
|
|
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,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: rasa-pro
|
|
3
|
-
Version: 3.12.
|
|
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
|
-
[](https://github.com/RasaHQ/rasa-private/actions)
|
|
161
161
|
[](https://sonarcloud.io/summary/new_code?id=RasaHQ_rasa)
|
|
162
|
-
[](https://rasa.com/docs/
|
|
162
|
+
[](https://rasa.com/docs/docs/pro/intro)
|
|
163
|
+

|
|
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
|
-
|
|
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/
|
|
192
|
-
- [Conversational AI with Language Models (CALM) conceptual rundown](https://rasa.com/docs/
|
|
193
|
-
- [Rasa Pro / CALM tutorial](https://rasa.com/docs/
|
|
194
|
-
- [Rasa pro changelog](https://rasa.com/docs/
|
|
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=
|
|
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=
|
|
50
|
-
rasa/cli/project_templates/calm/domain/remove_contact.yml,sha256=
|
|
51
|
-
rasa/cli/project_templates/calm/domain/shared.yml,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
372
|
-
rasa/dialogue_understanding/commands/cancel_flow_command.py,sha256=
|
|
373
|
-
rasa/dialogue_understanding/commands/change_flow_command.py,sha256=
|
|
374
|
-
rasa/dialogue_understanding/commands/chit_chat_answer_command.py,sha256=
|
|
375
|
-
rasa/dialogue_understanding/commands/clarify_command.py,sha256=
|
|
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=
|
|
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=
|
|
383
|
-
rasa/dialogue_understanding/commands/human_handoff_command.py,sha256=
|
|
384
|
-
rasa/dialogue_understanding/commands/knowledge_answer_command.py,sha256=
|
|
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=
|
|
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=
|
|
392
|
-
rasa/dialogue_understanding/commands/skip_question_command.py,sha256=
|
|
393
|
-
rasa/dialogue_understanding/commands/start_flow_command.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
459
|
-
rasa/dialogue_understanding_test/du_test_result.py,sha256=
|
|
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=
|
|
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=
|
|
483
|
-
rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
824
|
-
rasa_pro-3.12.
|
|
825
|
-
rasa_pro-3.12.
|
|
826
|
-
rasa_pro-3.12.
|
|
827
|
-
rasa_pro-3.12.
|
|
828
|
-
rasa_pro-3.12.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|