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.
- rasa/cli/train.py +3 -0
- rasa/cli/utils.py +6 -0
- rasa/core/channels/development_inspector.py +77 -21
- rasa/core/channels/inspector/dist/assets/{arc-f0f8bd46.js → arc-9f1365dc.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-7162c77d.js → blockDiagram-38ab4fdb-e0f81b12.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-b1d0d098.js → c4Diagram-3d4e48cf-9deaee1c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-807a1b27.js → classDiagram-70f12bd4-20450a96.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-5238dcdb.js → classDiagram-v2-f2320105-749d2abf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-75dfaa67.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-df20501d.js → edges-e0da2a9e-943801a7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-13cf4797.js → erDiagram-9861fffd-d523a948.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-a4991264.js → flowDb-956e92f1-54e4cf19.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-ccecf773.js → flowDiagram-66a62f08-48bfbbe8.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-b5801783.js → flowchart-elk-definition-4a651766-17c30827.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-161e079a.js → ganttDiagram-c361ad54-43086f2d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-f38e86a4.js → gitGraphDiagram-72cf32ee-5c8b693e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-be6ef5d8.js → graph-41a90d26.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-d9ce8994.js → index-3862675e-b43eeae9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-7794b245.js → index-e8affe45.js} +155 -155
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-5000a3dc.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-8ef0a17a.js → journeyDiagram-49397b02-39bce7b5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-d649bc98.js → layout-dc8eeea4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-95add810.js → line-c4d2e756.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-f6025094.js → linear-86f6f2d9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-2e8531c4.js → mindmap-definition-fc14e90a-4216f771.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-918adfdb.js → pieDiagram-8a3498a8-1a0cfa96.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-cbd01797.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6a8b877b.js → requirementDiagram-deff3bca-d4046bed.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-c377c3fe.js → sankeyDiagram-04a897e0-2cf6d1d7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-ab9e9b7f.js → sequenceDiagram-704730f1-751ac4f5.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-5e6ae67d.js → stateDiagram-587899a1-f734f4d4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-40643476.js → stateDiagram-v2-d93cdb3a-91c65710.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-afb8d108.js → styles-6aaf32cf-e0cff7be.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-7edc9423.js → styles-9a916d00-c8029e5d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-c1d8f7e9.js → styles-c10674c1-114f312a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-f494b2ef.js → svgDrawCommon-08f97a94-b7b9dc00.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-11c7cdd0.js → timeline-definition-85554ec2-9536d189.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-3f191ec1.js → xychartDiagram-e933f94c-bf3b0f36.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +1 -1
- rasa/core/channels/inspector/package.json +1 -0
- rasa/core/channels/inspector/src/App.tsx +15 -2
- rasa/core/channels/inspector/src/components/RasaLogo.tsx +31 -0
- rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +68 -0
- rasa/core/channels/inspector/src/components/Welcome.tsx +19 -13
- rasa/core/channels/inspector/yarn.lock +5 -0
- rasa/core/channels/voice_ready/audiocodes.py +2 -2
- rasa/core/channels/voice_stream/audiocodes.py +44 -29
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +24 -1
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +1 -1
- rasa/dialogue_understanding/processor/command_processor.py +20 -1
- rasa/engine/validation.py +2 -0
- rasa/model_training.py +3 -1
- rasa/server.py +1 -0
- rasa/shared/core/domain.py +4 -0
- rasa/shared/importers/importer.py +9 -1
- rasa/shared/utils/common.py +14 -0
- rasa/validator.py +2 -2
- rasa/version.py +1 -1
- {rasa_pro-3.12.0rc3.dist-info → rasa_pro-3.12.1.dist-info}/METADATA +2 -2
- {rasa_pro-3.12.0rc3.dist-info → rasa_pro-3.12.1.dist-info}/RECORD +66 -66
- rasa/core/channels/inspector/dist/assets/channel-e265ea59.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-21f8a43d.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-5c8ce12d.js +0 -1
- rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_fallback_other_models_template.jinja2 +0 -57
- {rasa_pro-3.12.0rc3.dist-info → rasa_pro-3.12.1.dist-info}/NOTICE +0 -0
- {rasa_pro-3.12.0rc3.dist-info → rasa_pro-3.12.1.dist-info}/WHEEL +0 -0
- {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:
|
|
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
|
-
|
|
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:
|
|
19
|
-
|
|
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:
|
|
28
|
+
color: isRecruitmentVisible ? "#0000EE" : "neutral.50",
|
|
29
|
+
textDecoration: "underline",
|
|
25
30
|
_hover: {
|
|
26
|
-
color:
|
|
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
|
-
|
|
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("
|
|
51
|
-
bot_phone=parameters.get("
|
|
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 "
|
|
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 "
|
|
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
|
-
#
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
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("
|
|
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("
|
|
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("
|
|
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("
|
|
167
|
+
logger.warning("audiocodes_stream.unknown_activity", data=activity)
|
|
153
168
|
elif data["type"] == "userStream.start":
|
|
154
|
-
logger.debug("
|
|
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("
|
|
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("
|
|
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("
|
|
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("
|
|
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 =
|
|
193
|
+
preferred_format = PREFERRED_AUDIO_FORMAT
|
|
179
194
|
|
|
180
195
|
if preferred_format not in supported_formats:
|
|
181
196
|
logger.warning(
|
|
182
|
-
"
|
|
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":
|
|
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("
|
|
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
|
-
"
|
|
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
|
-
|
|
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
|
|
rasa/shared/core/domain.py
CHANGED
|
@@ -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,
|
rasa/shared/utils/common.py
CHANGED
|
@@ -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 = {
|
|
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
|
|
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,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: rasa-pro
|
|
3
|
-
Version: 3.12.
|
|
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
|
|
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)
|