rasa-pro 3.12.0rc3__py3-none-any.whl → 3.12.1__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 (70) hide show
  1. rasa/cli/train.py +3 -0
  2. rasa/cli/utils.py +6 -0
  3. rasa/core/channels/development_inspector.py +77 -21
  4. rasa/core/channels/inspector/dist/assets/{arc-f0f8bd46.js → arc-9f1365dc.js} +1 -1
  5. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-7162c77d.js → blockDiagram-38ab4fdb-e0f81b12.js} +1 -1
  6. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-b1d0d098.js → c4Diagram-3d4e48cf-9deaee1c.js} +1 -1
  7. rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
  8. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-807a1b27.js → classDiagram-70f12bd4-20450a96.js} +1 -1
  9. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-5238dcdb.js → classDiagram-v2-f2320105-749d2abf.js} +1 -1
  10. rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
  11. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-75dfaa67.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
  12. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-df20501d.js → edges-e0da2a9e-943801a7.js} +1 -1
  13. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-13cf4797.js → erDiagram-9861fffd-d523a948.js} +1 -1
  14. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-a4991264.js → flowDb-956e92f1-54e4cf19.js} +1 -1
  15. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-ccecf773.js → flowDiagram-66a62f08-48bfbbe8.js} +1 -1
  16. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
  17. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-b5801783.js → flowchart-elk-definition-4a651766-17c30827.js} +1 -1
  18. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-161e079a.js → ganttDiagram-c361ad54-43086f2d.js} +1 -1
  19. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-f38e86a4.js → gitGraphDiagram-72cf32ee-5c8b693e.js} +1 -1
  20. rasa/core/channels/inspector/dist/assets/{graph-be6ef5d8.js → graph-41a90d26.js} +1 -1
  21. rasa/core/channels/inspector/dist/assets/{index-3862675e-d9ce8994.js → index-3862675e-b43eeae9.js} +1 -1
  22. rasa/core/channels/inspector/dist/assets/{index-7794b245.js → index-e8affe45.js} +155 -155
  23. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-5000a3dc.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
  24. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-8ef0a17a.js → journeyDiagram-49397b02-39bce7b5.js} +1 -1
  25. rasa/core/channels/inspector/dist/assets/{layout-d649bc98.js → layout-dc8eeea4.js} +1 -1
  26. rasa/core/channels/inspector/dist/assets/{line-95add810.js → line-c4d2e756.js} +1 -1
  27. rasa/core/channels/inspector/dist/assets/{linear-f6025094.js → linear-86f6f2d9.js} +1 -1
  28. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-2e8531c4.js → mindmap-definition-fc14e90a-4216f771.js} +1 -1
  29. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-918adfdb.js → pieDiagram-8a3498a8-1a0cfa96.js} +1 -1
  30. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-cbd01797.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
  31. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6a8b877b.js → requirementDiagram-deff3bca-d4046bed.js} +1 -1
  32. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-c377c3fe.js → sankeyDiagram-04a897e0-2cf6d1d7.js} +1 -1
  33. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-ab9e9b7f.js → sequenceDiagram-704730f1-751ac4f5.js} +1 -1
  34. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-5e6ae67d.js → stateDiagram-587899a1-f734f4d4.js} +1 -1
  35. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-40643476.js → stateDiagram-v2-d93cdb3a-91c65710.js} +1 -1
  36. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-afb8d108.js → styles-6aaf32cf-e0cff7be.js} +1 -1
  37. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-7edc9423.js → styles-9a916d00-c8029e5d.js} +1 -1
  38. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-c1d8f7e9.js → styles-c10674c1-114f312a.js} +1 -1
  39. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-f494b2ef.js → svgDrawCommon-08f97a94-b7b9dc00.js} +1 -1
  40. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-11c7cdd0.js → timeline-definition-85554ec2-9536d189.js} +1 -1
  41. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-3f191ec1.js → xychartDiagram-e933f94c-bf3b0f36.js} +1 -1
  42. rasa/core/channels/inspector/dist/index.html +1 -1
  43. rasa/core/channels/inspector/package.json +1 -0
  44. rasa/core/channels/inspector/src/App.tsx +15 -2
  45. rasa/core/channels/inspector/src/components/RasaLogo.tsx +31 -0
  46. rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +68 -0
  47. rasa/core/channels/inspector/src/components/Welcome.tsx +19 -13
  48. rasa/core/channels/inspector/yarn.lock +5 -0
  49. rasa/core/channels/voice_ready/audiocodes.py +2 -2
  50. rasa/core/channels/voice_stream/audiocodes.py +44 -29
  51. rasa/dialogue_understanding/generator/llm_based_command_generator.py +24 -1
  52. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +1 -1
  53. rasa/dialogue_understanding/processor/command_processor.py +20 -1
  54. rasa/engine/validation.py +2 -0
  55. rasa/model_training.py +3 -1
  56. rasa/server.py +1 -0
  57. rasa/shared/core/domain.py +4 -0
  58. rasa/shared/importers/importer.py +9 -1
  59. rasa/shared/utils/common.py +14 -0
  60. rasa/validator.py +2 -2
  61. rasa/version.py +1 -1
  62. {rasa_pro-3.12.0rc3.dist-info → rasa_pro-3.12.1.dist-info}/METADATA +2 -2
  63. {rasa_pro-3.12.0rc3.dist-info → rasa_pro-3.12.1.dist-info}/RECORD +66 -66
  64. rasa/core/channels/inspector/dist/assets/channel-e265ea59.js +0 -1
  65. rasa/core/channels/inspector/dist/assets/clone-21f8a43d.js +0 -1
  66. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-5c8ce12d.js +0 -1
  67. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_fallback_other_models_template.jinja2 +0 -57
  68. {rasa_pro-3.12.0rc3.dist-info → rasa_pro-3.12.1.dist-info}/NOTICE +0 -0
  69. {rasa_pro-3.12.0rc3.dist-info → rasa_pro-3.12.1.dist-info}/WHEEL +0 -0
  70. {rasa_pro-3.12.0rc3.dist-info → rasa_pro-3.12.1.dist-info}/entry_points.txt +0 -0
@@ -13,6 +13,7 @@ import { DialogueStack } from "./components/DialogueStack";
13
13
  import { DialougeInformation } from "./components/DialogueInformation";
14
14
  import { LoadingSpinner } from "./components/LoadingSpinner";
15
15
  import { DiagramFlow } from "./components/DiagramFlow";
16
+ import { RecruitmentPanel } from "./components/RecruitmentPanel";
16
17
  import { formatSlots } from "./helpers/formatters";
17
18
  import { Slot, Stack, Event, Flow, SelectedStack, Tracker } from "./types";
18
19
  import {
@@ -35,6 +36,9 @@ export function App() {
35
36
  const [stack, setStack] = useState<Stack[]>([]);
36
37
  const [frame, setFrame] = useState<SelectedStack | undefined>(undefined);
37
38
 
39
+ // State to control the visibility of the RecruitmentPanel
40
+ const [showRecruitmentPanel, setShowRecruitmentPanel] = useState(true);
41
+
38
42
  // we only show the transcript if we are not on the socket io channel
39
43
  // on the socketio channel, we show the chat component instead
40
44
  const shouldShowTranscript = !window.location.href.includes("socketio");
@@ -165,7 +169,9 @@ export function App() {
165
169
  height: "100%",
166
170
  overflow: "hidden",
167
171
  gridTemplateColumns: "1fr",
168
- gridTemplateRows: "max-content minmax(10rem, 17.5rem) minmax(10rem, auto)",
172
+ gridTemplateRows: showRecruitmentPanel
173
+ ? "max-content max-content minmax(10rem, auto)"
174
+ : "max-content minmax(10rem, 17.5rem) minmax(10rem, auto)",
169
175
  gridRowGap: rasaSpace[1],
170
176
  };
171
177
 
@@ -177,13 +183,20 @@ export function App() {
177
183
  });
178
184
  };
179
185
 
186
+ const handleCloseRecruitmentPanel = () => {
187
+ setShowRecruitmentPanel(false);
188
+ };
189
+
180
190
  if (!rasaChatSessionId && !window.location.href.includes("socketio")) return <LoadingSpinner />;
181
191
 
182
192
  return (
183
193
  <Grid sx={gridSx}>
184
194
  <GridItem overflow="hidden">
185
195
  <Grid sx={leftColumnSx}>
186
- <Welcome sx={boxSx} />
196
+ <Welcome sx={boxSx} isRecruitmentVisible={showRecruitmentPanel} />
197
+ {showRecruitmentPanel && (
198
+ <RecruitmentPanel onClose={handleCloseRecruitmentPanel} />
199
+ )}
187
200
  <DialogueStack
188
201
  sx={boxSx}
189
202
  stack={stack}
@@ -30,3 +30,34 @@ export const RasaLogo = (props: BoxProps) => {
30
30
  </Box>
31
31
  );
32
32
  };
33
+
34
+ export const RasaLogoDark = (props: BoxProps) => {
35
+ return (
36
+ <Box
37
+ as="svg"
38
+ {...props}
39
+ xmlns="http://www.w3.org/2000/svg"
40
+ width="41"
41
+ height="51"
42
+ fill="none"
43
+ viewBox="0 0 41 51"
44
+ >
45
+ <path
46
+ fill="#7622D2"
47
+ fillRule="evenodd"
48
+ d="M34.041 10.59V7.508H21.385v12.847h3.037v-3.867h6.582v3.854h3.037v-9.763.013zm-3.037 2.827h-6.582V10.59h6.582v2.826zM19.36 29.74V35.52H6.956v-3.083h9.366V30.64H6.956v-7.965H19.36v3.083H9.994v1.798h9.366v2.184zM34.041 25.75v-3.084H21.385v12.847h3.037v-3.867h6.582V35.5h3.037v-9.764.013zm-3.037 2.826h-6.582v-2.827h6.582v2.827z"
49
+ clipRule="evenodd"
50
+ ></path>
51
+ <path
52
+ fill="#7622D2"
53
+ d="M36.826 4.689v33.578h-5.248v5.724l-9.487-5.318-.744-.417H4.179V4.69h32.654-.007zm3.298-3.34H.881v40.258h19.618l14.368 8.054v-8.054h5.25V1.349h.007z"
54
+ ></path>
55
+ <path
56
+ fill="#7622D2"
57
+ fillRule="evenodd"
58
+ d="M15.287 15.464l3.888-1.436.185-.074V7.515H6.956v.257l-.028 12.59h3.038V17.43l2.278-.838 3.417 3.77h3.752l-4.126-4.897zM9.97 14.15v-3.55h6.351V11.8l-6.351 2.348z"
59
+ clipRule="evenodd"
60
+ ></path>
61
+ </Box>
62
+ );
63
+ };
@@ -0,0 +1,68 @@
1
+ // RecruitmentPanel.tsx
2
+ import {
3
+ Box,
4
+ Flex,
5
+ Heading,
6
+ IconButton,
7
+ Text,
8
+ Button,
9
+ } from "@chakra-ui/react";
10
+ import { CloseIcon } from "@chakra-ui/icons";
11
+ import { useOurTheme } from "../theme";
12
+
13
+ interface RecruitmentPanelProps {
14
+ onClose: () => void;
15
+ }
16
+
17
+ export const RecruitmentPanel: React.FC<RecruitmentPanelProps> = ({ onClose }) => {
18
+ const { rasaRadii } = useOurTheme();
19
+
20
+ const textColor = "white";
21
+ const iconColor = "white";
22
+
23
+ const boxSx = {
24
+ borderRadius: rasaRadii.normal,
25
+ padding: "1rem",
26
+ bgGradient: "linear(to-b, #4E61E1, #7622D2)",
27
+ color: textColor,
28
+ };
29
+
30
+ return (
31
+ <Box sx={boxSx}>
32
+ <Flex justify="space-between" align="center">
33
+ <Flex align="center">
34
+ <Heading as="h3" size="lg" fontWeight="bold" color={textColor}>
35
+ Help us Improve Rasa Pro!
36
+ </Heading>
37
+ </Flex>
38
+ <IconButton
39
+ aria-label="Close"
40
+ icon={<CloseIcon color={iconColor} />}
41
+ size="sm"
42
+ onClick={onClose}
43
+ bg="transparent"
44
+ _hover={{ bg: "rgba(255, 255, 255, 0.2)" }}
45
+ />
46
+ </Flex>
47
+ <Flex align="center" mt="0.5rem" justify="space-between">
48
+ <Text fontSize="sm" color={textColor}>
49
+ We're looking for users to share their feedback.
50
+ </Text>
51
+ <Button
52
+ as="a"
53
+ href="https://calendly.com/alvaro-rasa/rasa-pro-installation"
54
+ target="_blank"
55
+ rel="noopener noreferrer"
56
+ color="#7622D2"
57
+ bg="white"
58
+ fontWeight="bold"
59
+ ml="1rem"
60
+ size="sm"
61
+ _hover={{ bg: "whiteAlpha.800" }}
62
+ >
63
+ Sign up
64
+ </Button>
65
+ </Flex>
66
+ </Box>
67
+ );
68
+ };
@@ -5,33 +5,35 @@ import {
5
5
  Heading,
6
6
  Link,
7
7
  Text,
8
- useColorModeValue,
9
8
  } from "@chakra-ui/react";
10
- import { RasaLogo } from "./RasaLogo";
9
+ import { RasaLogo, RasaLogoDark } from "./RasaLogo";
11
10
  import { useOurTheme } from "../theme";
12
11
 
13
- export const Welcome = ({ sx, ...props }: FlexProps) => {
12
+ interface WelcomeProps extends FlexProps {
13
+ isRecruitmentVisible?: boolean;
14
+ }
15
+
16
+ export const Welcome = ({ sx, isRecruitmentVisible, ...props }: WelcomeProps) => {
14
17
  const { rasaSpace } = useOurTheme();
15
18
 
16
19
  const containerSx = {
17
20
  ...sx,
18
- color: useColorModeValue("neutral.50", "neutral.50"),
19
- bgGradient: "linear(to-b, #4E61E1, #7622D2)",
21
+ color: isRecruitmentVisible ? "black" : "neutral.50",
22
+ bg: isRecruitmentVisible ? "white" : undefined,
23
+ bgGradient: isRecruitmentVisible ? undefined : "linear(to-b, #4E61E1, #7622D2)",
20
24
  };
21
25
 
22
26
  const linkSx = {
23
27
  flexGrow: 0,
24
- color: useColorModeValue("neutral.50", "neutral.50"),
28
+ color: isRecruitmentVisible ? "#0000EE" : "neutral.50",
29
+ textDecoration: "underline",
25
30
  _hover: {
26
- color: useColorModeValue("neutral.400", "neutral.400"),
31
+ color: isRecruitmentVisible
32
+ ? "link.visited"
33
+ : "neutral.400",
27
34
  },
28
35
  };
29
36
 
30
- const logoSx = {
31
- flexShrink:0,
32
- marginLeft: "auto"
33
- };
34
-
35
37
  return (
36
38
  <Flex sx={containerSx} {...props}>
37
39
  <Box>
@@ -48,7 +50,11 @@ export const Welcome = ({ sx, ...props }: FlexProps) => {
48
50
  ml={rasaSpace[0.25]}
49
51
  >Browse the docs</Link>
50
52
  </Box>
51
- <RasaLogo sx={logoSx}/>
53
+ {isRecruitmentVisible ? (
54
+ <RasaLogoDark sx={{ flexShrink: 0, marginLeft: "auto" }}/>
55
+ ) : (
56
+ <RasaLogo sx={{ flexShrink: 0, marginLeft: "auto" }}/>
57
+ )}
52
58
  </Flex>
53
59
  );
54
60
  };
@@ -531,6 +531,11 @@
531
531
  dependencies:
532
532
  "@chakra-ui/shared-utils" "2.0.5"
533
533
 
534
+ "@chakra-ui/icons@^2.2.4":
535
+ version "2.2.4"
536
+ resolved "https://registry.yarnpkg.com/@chakra-ui/icons/-/icons-2.2.4.tgz#fc3f59a7e377d6e4efdbe8ee0a3aec7f29a4ab32"
537
+ integrity sha512-l5QdBgwrAg3Sc2BRqtNkJpfuLw/pWRDwwT58J6c4PqQT6wzXxyNa8Q0PForu1ltB5qEiFb1kxr/F/HO1EwNa6g==
538
+
534
539
  "@chakra-ui/image@2.1.0":
535
540
  version "2.1.0"
536
541
  resolved "https://registry.yarnpkg.com/@chakra-ui/image/-/image-2.1.0.tgz#6c205f1ca148e3bf58345b0b5d4eb3d959eb9f87"
@@ -47,8 +47,8 @@ def map_call_params(parameters: Dict[Text, Any]) -> CallParameters:
47
47
  """Map the Audiocodes parameters to the CallParameters dataclass."""
48
48
  return CallParameters(
49
49
  call_id=parameters.get("vaigConversationId"),
50
- user_phone=parameters.get("callee"),
51
- bot_phone=parameters.get("caller"),
50
+ user_phone=parameters.get("caller"),
51
+ bot_phone=parameters.get("callee"),
52
52
  user_name=parameters.get("callerDisplayName"),
53
53
  user_host=parameters.get("callerHost"),
54
54
  bot_host=parameters.get("calleeHost"),
@@ -13,6 +13,7 @@ from sanic import ( # type: ignore[attr-defined]
13
13
  )
14
14
 
15
15
  from rasa.core.channels import UserMessage
16
+ from rasa.core.channels.voice_ready.audiocodes import map_call_params
16
17
  from rasa.core.channels.voice_ready.utils import CallParameters
17
18
  from rasa.core.channels.voice_stream.audio_bytes import RasaAudioBytes
18
19
  from rasa.core.channels.voice_stream.call_state import (
@@ -27,24 +28,16 @@ from rasa.core.channels.voice_stream.voice_channel import (
27
28
  VoiceInputChannel,
28
29
  VoiceOutputChannel,
29
30
  )
31
+ from rasa.shared.utils.common import mark_as_beta_feature
30
32
 
31
33
  logger = structlog.get_logger(__name__)
32
-
33
-
34
- def map_call_params(data: Dict[Text, Any]) -> CallParameters:
35
- """Map the audiocodes stream parameters to the CallParameters dataclass."""
36
- return CallParameters(
37
- call_id=data["conversationId"],
38
- user_phone=data["caller"],
39
- # Bot phone is not available in the Audiocodes API
40
- direction="inbound", # AudioCodes calls are always inbound
41
- )
34
+ PREFERRED_AUDIO_FORMAT = "raw/mulaw"
42
35
 
43
36
 
44
37
  class AudiocodesVoiceOutputChannel(VoiceOutputChannel):
45
38
  @classmethod
46
39
  def name(cls) -> str:
47
- return "ac_voice"
40
+ return "audiocodes_stream"
48
41
 
49
42
  def _ensure_stream_id(self) -> None:
50
43
  """Audiocodes requires a stream ID with playStream messages."""
@@ -81,6 +74,7 @@ class AudiocodesVoiceOutputChannel(VoiceOutputChannel):
81
74
  {
82
75
  "type": "playStream.start",
83
76
  "streamId": self._get_stream_id(),
77
+ "mediaFormat": PREFERRED_AUDIO_FORMAT,
84
78
  }
85
79
  )
86
80
  logger.debug("Sending start marker", stream_id=self._get_stream_id())
@@ -105,7 +99,17 @@ class AudiocodesVoiceOutputChannel(VoiceOutputChannel):
105
99
  class AudiocodesVoiceInputChannel(VoiceInputChannel):
106
100
  @classmethod
107
101
  def name(cls) -> str:
108
- return "ac_voice"
102
+ return "audiocodes_stream"
103
+
104
+ def __init__(
105
+ self,
106
+ server_url: str,
107
+ asr_config: Dict,
108
+ tts_config: Dict,
109
+ monitor_silence: bool = False,
110
+ ):
111
+ mark_as_beta_feature("Audiocodes (audiocodes_stream) Channel")
112
+ super().__init__(server_url, asr_config, tts_config, monitor_silence)
109
113
 
110
114
  def channel_bytes_to_rasa_audio_bytes(self, input_bytes: bytes) -> RasaAudioBytes:
111
115
  return RasaAudioBytes(base64.b64decode(input_bytes))
@@ -116,13 +120,23 @@ class AudiocodesVoiceInputChannel(VoiceInputChannel):
116
120
  async for message in channel_websocket:
117
121
  data = json.loads(message)
118
122
  if data["type"] == "session.initiate":
119
- # retrieve parameters set in the webhook - contains info about the
120
- # caller
121
- logger.info("received initiate message", data=data)
123
+ # contains info about mediaformats
124
+ logger.info(
125
+ "audiocodes_stream.collect_call_parameters.session.initiate",
126
+ data=data,
127
+ )
122
128
  self._send_accepted(channel_websocket, data)
123
- return map_call_params(data)
129
+ elif data["type"] == "activities":
130
+ activities = data["activities"]
131
+ for activity in activities:
132
+ logger.debug(
133
+ "audiocodes_stream.collect_call_parameters.activity",
134
+ data=activity,
135
+ )
136
+ if activity["name"] == "start":
137
+ return map_call_params(activity["parameters"])
124
138
  else:
125
- logger.warning("ac_voice.unknown_message", data=data)
139
+ logger.warning("audiocodes_stream.unknown_message", data=data)
126
140
  return None
127
141
 
128
142
  def map_input_message(
@@ -134,14 +148,15 @@ class AudiocodesVoiceInputChannel(VoiceInputChannel):
134
148
  if data["type"] == "activities":
135
149
  activities = data["activities"]
136
150
  for activity in activities:
137
- logger.debug("ac_voice.activity", data=activity)
151
+ logger.debug("audiocodes_stream.activity", data=activity)
138
152
  if activity["name"] == "start":
153
+ # already handled in collect_call_parameters
139
154
  pass
140
155
  elif activity["name"] == "dtmf":
141
156
  # TODO: handle DTMF input
142
157
  pass
143
158
  elif activity["name"] == "playFinished":
144
- logger.debug("ac_voice.playFinished", data=activity)
159
+ logger.debug("audiocodes_stream.playFinished", data=activity)
145
160
  if call_state.should_hangup:
146
161
  logger.info("audiocodes.hangup")
147
162
  self._send_hangup(ws, data)
@@ -149,37 +164,37 @@ class AudiocodesVoiceInputChannel(VoiceInputChannel):
149
164
  # we receive a end message from audiocodes
150
165
  pass
151
166
  else:
152
- logger.warning("ac_voice.unknown_activity", data=activity)
167
+ logger.warning("audiocodes_stream.unknown_activity", data=activity)
153
168
  elif data["type"] == "userStream.start":
154
- logger.debug("ac_voice.userStream.start", data=data)
169
+ logger.debug("audiocodes_stream.userStream.start", data=data)
155
170
  self._send_recognition_started(ws, data)
156
171
  elif data["type"] == "userStream.chunk":
157
172
  audio_bytes = self.channel_bytes_to_rasa_audio_bytes(data["audioChunk"])
158
173
  return NewAudioAction(audio_bytes)
159
174
  elif data["type"] == "userStream.stop":
160
- logger.debug("ac_voice.stop_recognition", data=data)
175
+ logger.debug("audiocodes_stream.stop_recognition", data=data)
161
176
  self._send_recognition_ended(ws, data)
162
177
  elif data["type"] == "session.resume":
163
- logger.debug("ac_voice.resume", data=data)
178
+ logger.debug("audiocodes_stream.resume", data=data)
164
179
  self._send_accepted(ws, data)
165
180
  elif data["type"] == "session.end":
166
- logger.debug("ac_voice.end", data=data)
181
+ logger.debug("audiocodes_stream.end", data=data)
167
182
  return EndConversationAction()
168
183
  elif data["type"] == "connection.validate":
169
184
  # not part of call flow; only sent when integration is created
170
185
  self._send_validated(ws, data)
171
186
  else:
172
- logger.warning("ac_voice.unknown_message", data=data)
187
+ logger.warning("audiocodes_stream.unknown_message", data=data)
173
188
 
174
189
  return ContinueConversationAction()
175
190
 
176
191
  def _send_accepted(self, ws: Websocket, data: Dict[Text, Any]) -> None:
177
192
  supported_formats = data.get("supportedMediaFormats", [])
178
- preferred_format = "raw/mulaw"
193
+ preferred_format = PREFERRED_AUDIO_FORMAT
179
194
 
180
195
  if preferred_format not in supported_formats:
181
196
  logger.warning(
182
- "ac_voice.format_not_supported",
197
+ "audiocodes_stream.format_not_supported",
183
198
  supported_formats=supported_formats,
184
199
  preferred_format=preferred_format,
185
200
  )
@@ -187,7 +202,7 @@ class AudiocodesVoiceInputChannel(VoiceInputChannel):
187
202
 
188
203
  payload = {
189
204
  "type": "session.accepted",
190
- "mediaFormat": "raw/mulaw",
205
+ "mediaFormat": PREFERRED_AUDIO_FORMAT,
191
206
  }
192
207
  _schedule_async_task(ws.send(json.dumps(payload)))
193
208
 
@@ -243,7 +258,7 @@ class AudiocodesVoiceInputChannel(VoiceInputChannel):
243
258
  self, on_new_message: Callable[[UserMessage], Awaitable[Any]]
244
259
  ) -> Blueprint:
245
260
  """Defines a Sanic bluelogger.debug."""
246
- blueprint = Blueprint("ac_voice", __name__)
261
+ blueprint = Blueprint("audiocodes_stream", __name__)
247
262
 
248
263
  @blueprint.route("/", methods=["GET"])
249
264
  async def health(_: Request) -> HTTPResponse:
@@ -12,6 +12,9 @@ from rasa.dialogue_understanding.commands import (
12
12
  SetSlotCommand,
13
13
  StartFlowCommand,
14
14
  )
15
+ from rasa.dialogue_understanding.commands.handle_digressions_command import (
16
+ HandleDigressionsCommand,
17
+ )
15
18
  from rasa.dialogue_understanding.constants import KEY_MINIMIZE_NUM_CALLS
16
19
  from rasa.dialogue_understanding.generator import CommandGenerator
17
20
  from rasa.dialogue_understanding.generator.constants import (
@@ -584,6 +587,24 @@ class LLMBasedCommandGenerator(
584
587
 
585
588
  return filtered_commands
586
589
 
590
+ def _should_merge_llm_commands(
591
+ self,
592
+ prior_commands: List[Command],
593
+ prior_start_flow_names: Set[str],
594
+ ) -> bool:
595
+ """Check if the LLM current commands should be merged with the prior commands.
596
+
597
+ This can be done if there are no prior start flow commands and
598
+ no prior handle digressions commands.
599
+ """
600
+ prior_handle_digressions = [
601
+ command
602
+ for command in prior_commands
603
+ if isinstance(command, HandleDigressionsCommand)
604
+ ]
605
+
606
+ return not prior_start_flow_names and not prior_handle_digressions
607
+
587
608
  def _check_start_flow_command_overlap(
588
609
  self,
589
610
  prior_commands: List[Command],
@@ -596,7 +617,9 @@ class LLMBasedCommandGenerator(
596
617
  prior_start_flow_names
597
618
  )
598
619
 
599
- if not different_flow_names:
620
+ if not different_flow_names or self._should_merge_llm_commands(
621
+ prior_commands, prior_start_flow_names
622
+ ):
600
623
  return prior_commands + commands
601
624
 
602
625
  # discard the flow names that are different to prior start flow commands
@@ -103,7 +103,7 @@ DEFAULT_COMMAND_PROMPT_TEMPLATE_FILE_NAME = (
103
103
  # When the configured model is not found in the model prompt mapper, then we use the
104
104
  # fallback prompt template
105
105
  FALLBACK_COMMAND_PROMPT_TEMPLATE_FILE_NAME = (
106
- "command_prompt_v2_fallback_other_models_template.jinja2"
106
+ "command_prompt_v2_gpt_4o_2024_11_20_template.jinja2"
107
107
  )
108
108
 
109
109
 
@@ -447,7 +447,14 @@ def clean_up_commands(
447
447
  continue
448
448
 
449
449
  if should_add_handle_digressions_command(tracker, all_flows, top_flow_id):
450
- clean_commands.append(HandleDigressionsCommand(flow=command.flow))
450
+ handle_digression_command = HandleDigressionsCommand(flow=command.flow)
451
+ if handle_digression_command in clean_commands:
452
+ structlogger.debug(
453
+ "command_processor.clean_up_commands.skip_handle_digressions.command_already_present",
454
+ command=handle_digression_command,
455
+ )
456
+ continue
457
+ clean_commands.append(handle_digression_command)
451
458
  structlogger.debug(
452
459
  "command_processor.clean_up_commands.push_handle_digressions",
453
460
  command=command,
@@ -487,6 +494,18 @@ def clean_up_commands(
487
494
  elif not tracker.has_coexistence_routing_slot and len(clean_commands) > 1:
488
495
  clean_commands = filter_cannot_handle_command_for_skipped_slots(clean_commands)
489
496
 
497
+ # remove cancel flow when there is a handle digression command
498
+ # otherwise the cancel command will cancel the active flow which defined a specific
499
+ # behavior for the digression
500
+ if contains_command(clean_commands, HandleDigressionsCommand) and contains_command(
501
+ clean_commands, CancelFlowCommand
502
+ ):
503
+ clean_commands = [
504
+ command
505
+ for command in clean_commands
506
+ if not isinstance(command, CancelFlowCommand)
507
+ ]
508
+
490
509
  clean_commands = ensure_max_number_of_command_type(
491
510
  clean_commands, RepeatBotMessagesCommand, 1
492
511
  )
rasa/engine/validation.py CHANGED
@@ -89,6 +89,7 @@ from rasa.shared.core.flows import Flow, FlowsList
89
89
  from rasa.shared.core.slots import Slot
90
90
  from rasa.shared.exceptions import RasaException
91
91
  from rasa.shared.nlu.training_data.message import Message
92
+ from rasa.shared.utils.common import display_research_study_prompt
92
93
 
93
94
  TypeAnnotation = Union[TypeVar, Text, Type, Optional[AvailableEndpoints]]
94
95
 
@@ -1449,4 +1450,5 @@ def validate_api_type_config_key_usage(
1449
1450
  f"For other providers, please use the '{PROVIDER_CONFIG_KEY}' key."
1450
1451
  ),
1451
1452
  )
1453
+ display_research_study_prompt()
1452
1454
  sys.exit(1)
rasa/model_training.py CHANGED
@@ -140,6 +140,7 @@ def _check_unresolved_slots(domain: Domain, stories: StoryGraph) -> None:
140
140
  f"whether there is a spelling error."
141
141
  ),
142
142
  )
143
+ rasa.shared.utils.common.display_research_study_prompt()
143
144
  sys.exit(1)
144
145
 
145
146
 
@@ -296,6 +297,7 @@ async def _train_graph(
296
297
  f"model within the directory '{output_path}'."
297
298
  ),
298
299
  )
300
+ rasa.shared.utils.common.display_research_study_prompt()
299
301
  sys.exit(1)
300
302
 
301
303
  rasa.shared.utils.common.mark_as_experimental_feature(
@@ -377,7 +379,7 @@ async def _train_graph(
377
379
  f"Your Rasa model is trained and saved at '{full_model_path}'."
378
380
  ),
379
381
  )
380
-
382
+ rasa.shared.utils.common.display_research_study_prompt()
381
383
  return TrainingResult(str(full_model_path), 0)
382
384
 
383
385
 
rasa/server.py CHANGED
@@ -1147,6 +1147,7 @@ def create_app(
1147
1147
  f"An unexpected error occurred during training. Error: {e}",
1148
1148
  )
1149
1149
  finally:
1150
+ rasa.shared.utils.common.display_research_study_prompt()
1150
1151
  with app.ctx.active_training_processes.get_lock():
1151
1152
  app.ctx.active_training_processes.value -= 1
1152
1153
 
@@ -2107,6 +2107,10 @@ class Domain:
2107
2107
 
2108
2108
  return read_yaml(raw_yaml_content, expand_env_vars=cls.expand_env_vars)
2109
2109
 
2110
+ def remove_builtin_slots(self) -> None:
2111
+ """Remove all builtin slots from the domain."""
2112
+ self.slots = [slot for slot in self.slots if not slot.is_builtin]
2113
+
2110
2114
 
2111
2115
  def warn_about_duplicates_found_during_domain_merging(
2112
2116
  duplicates: Dict[Text, List[Text]],
@@ -34,6 +34,7 @@ from rasa.shared.core.events import ActionExecuted, UserUttered
34
34
  from rasa.shared.core.flows import FlowsList
35
35
  from rasa.shared.core.slots import StrictCategoricalSlot
36
36
  from rasa.shared.core.training_data.structures import StoryGraph
37
+ from rasa.shared.exceptions import RasaException
37
38
  from rasa.shared.nlu.constants import ACTION_NAME, ENTITIES
38
39
  from rasa.shared.nlu.training_data.message import Message
39
40
  from rasa.shared.nlu.training_data.training_data import TrainingData
@@ -536,6 +537,14 @@ class LanguageImporter(PassThroughImporter):
536
537
  if domain.is_empty():
537
538
  return domain
538
539
 
540
+ domain.remove_builtin_slots()
541
+ slot_name = rasa.shared.core.constants.LANGUAGE_SLOT
542
+ if any(slot.name == slot_name for slot in domain.slots):
543
+ raise RasaException(
544
+ f"The '{slot_name}' slot is a builtin slot that cannot be overridden. "
545
+ f"Please remove its definition from your domain configuration."
546
+ )
547
+
539
548
  config = self._importer.get_config()
540
549
  language = config.get(CONFIG_LANGUAGE_KEY)
541
550
  additional_languages = config.get(CONFIG_ADDITIONAL_LANGUAGES_KEY) or []
@@ -545,7 +554,6 @@ class LanguageImporter(PassThroughImporter):
545
554
  values.append(language)
546
555
 
547
556
  # Prepare the serialized representation of the language slot
548
- slot_name = rasa.shared.core.constants.LANGUAGE_SLOT
549
557
  serialized_slot: Dict[Text, Any] = {
550
558
  "type": StrictCategoricalSlot.type_name,
551
559
  "initial_value": language,
@@ -13,6 +13,7 @@ import rasa.shared.utils.io
13
13
  from rasa.exceptions import MissingDependencyException
14
14
  from rasa.shared.constants import DOCS_URL_MIGRATION_GUIDE
15
15
  from rasa.shared.exceptions import ProviderClientValidationError, RasaException
16
+ from rasa.shared.utils.cli import print_success
16
17
 
17
18
  logger = logging.getLogger(__name__)
18
19
 
@@ -322,3 +323,16 @@ def validate_environment(
322
323
  raise MissingDependencyException(
323
324
  f"Missing package for {component_name}: {p}"
324
325
  )
326
+
327
+
328
+ def display_research_study_prompt() -> None:
329
+ """Logs a prompt to get users to participate in a UX Improvement research study."""
330
+ separator = "-" * 54
331
+ message = f"""
332
+ {separator}
333
+ Want to help shape the future of Rasa Pro?
334
+ Share your feedback in a short conversation with our team.
335
+ Sign up at: https://calendly.com/alvaro-rasa/rasa-pro-installation
336
+ {separator}
337
+ """
338
+ print_success(message)
rasa/validator.py CHANGED
@@ -2061,7 +2061,7 @@ class Validator:
2061
2061
 
2062
2062
  def validate_conditional_response_variation_predicates(self) -> bool:
2063
2063
  """Validate the conditional response variation predicates."""
2064
- context = {"slots": {slot.name: None for slot in self.domain.slots}}
2064
+ context = {SLOTS: {slot.name: None for slot in self.domain.slots}}
2065
2065
  all_good = True
2066
2066
 
2067
2067
  for utter_name, variations in self.domain.responses.items():
@@ -2115,7 +2115,7 @@ class Validator:
2115
2115
 
2116
2116
  if (
2117
2117
  slot_namespace is not None
2118
- and slot_namespace[1] not in self.domain.slots
2118
+ and slot_namespace[1] not in context[SLOTS]
2119
2119
  ):
2120
2120
  structlogger.error(
2121
2121
  "validator.validate_conditional_response_variation_predicates.invalid_slot",
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.0rc3"
3
+ __version__ = "3.12.1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rasa-pro
3
- Version: 3.12.0rc3
3
+ Version: 3.12.1
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
@@ -103,7 +103,7 @@ Requires-Dist: pyyaml (>=6.0)
103
103
  Requires-Dist: qdrant-client (>=1.9.1,<1.10.0)
104
104
  Requires-Dist: questionary (>=1.10.0,<2.1.0)
105
105
  Requires-Dist: randomname (>=0.2.1,<0.3.0)
106
- Requires-Dist: rasa-sdk (==3.12.0.dev2)
106
+ Requires-Dist: rasa-sdk (==3.12.0)
107
107
  Requires-Dist: redis (>=4.6.0,<6.0)
108
108
  Requires-Dist: regex (>=2024.7.24,<2024.8.0)
109
109
  Requires-Dist: requests (>=2.32.3,<2.33.0)