rasa-pro 3.13.0.dev1__py3-none-any.whl → 3.13.0.dev2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rasa-pro might be problematic. Click here for more details.

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