rasa-pro 3.12.0.dev1__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 +41 -0
- rasa/__init__.py +9 -0
- rasa/__main__.py +177 -0
- rasa/anonymization/__init__.py +2 -0
- rasa/anonymization/anonymisation_rule_yaml_reader.py +91 -0
- rasa/anonymization/anonymization_pipeline.py +286 -0
- rasa/anonymization/anonymization_rule_executor.py +260 -0
- rasa/anonymization/anonymization_rule_orchestrator.py +120 -0
- rasa/anonymization/schemas/config.yml +47 -0
- rasa/anonymization/utils.py +118 -0
- rasa/api.py +160 -0
- rasa/cli/__init__.py +5 -0
- rasa/cli/arguments/__init__.py +0 -0
- rasa/cli/arguments/data.py +106 -0
- rasa/cli/arguments/default_arguments.py +207 -0
- rasa/cli/arguments/evaluate.py +65 -0
- rasa/cli/arguments/export.py +51 -0
- rasa/cli/arguments/interactive.py +74 -0
- rasa/cli/arguments/run.py +219 -0
- rasa/cli/arguments/shell.py +17 -0
- rasa/cli/arguments/test.py +211 -0
- rasa/cli/arguments/train.py +279 -0
- rasa/cli/arguments/visualize.py +34 -0
- rasa/cli/arguments/x.py +30 -0
- rasa/cli/data.py +354 -0
- rasa/cli/dialogue_understanding_test.py +251 -0
- rasa/cli/e2e_test.py +259 -0
- rasa/cli/evaluate.py +222 -0
- rasa/cli/export.py +250 -0
- rasa/cli/inspect.py +75 -0
- rasa/cli/interactive.py +166 -0
- rasa/cli/license.py +65 -0
- rasa/cli/llm_fine_tuning.py +403 -0
- rasa/cli/markers.py +78 -0
- rasa/cli/project_templates/__init__.py +0 -0
- rasa/cli/project_templates/calm/actions/__init__.py +0 -0
- rasa/cli/project_templates/calm/actions/action_template.py +27 -0
- rasa/cli/project_templates/calm/actions/add_contact.py +30 -0
- rasa/cli/project_templates/calm/actions/db.py +57 -0
- rasa/cli/project_templates/calm/actions/list_contacts.py +22 -0
- rasa/cli/project_templates/calm/actions/remove_contact.py +35 -0
- rasa/cli/project_templates/calm/config.yml +10 -0
- rasa/cli/project_templates/calm/credentials.yml +33 -0
- rasa/cli/project_templates/calm/data/flows/add_contact.yml +31 -0
- rasa/cli/project_templates/calm/data/flows/list_contacts.yml +14 -0
- rasa/cli/project_templates/calm/data/flows/remove_contact.yml +29 -0
- rasa/cli/project_templates/calm/db/contacts.json +10 -0
- rasa/cli/project_templates/calm/domain/add_contact.yml +39 -0
- rasa/cli/project_templates/calm/domain/list_contacts.yml +17 -0
- rasa/cli/project_templates/calm/domain/remove_contact.yml +38 -0
- rasa/cli/project_templates/calm/domain/shared.yml +10 -0
- rasa/cli/project_templates/calm/e2e_tests/cancelations/user_cancels_during_a_correction.yml +16 -0
- rasa/cli/project_templates/calm/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +7 -0
- rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_handle.yml +20 -0
- rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_name.yml +19 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +15 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_lists_contacts.yml +5 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact.yml +11 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact_from_list.yml +12 -0
- rasa/cli/project_templates/calm/endpoints.yml +58 -0
- rasa/cli/project_templates/default/actions/__init__.py +0 -0
- rasa/cli/project_templates/default/actions/actions.py +27 -0
- rasa/cli/project_templates/default/config.yml +44 -0
- rasa/cli/project_templates/default/credentials.yml +33 -0
- rasa/cli/project_templates/default/data/nlu.yml +91 -0
- rasa/cli/project_templates/default/data/rules.yml +13 -0
- rasa/cli/project_templates/default/data/stories.yml +30 -0
- rasa/cli/project_templates/default/domain.yml +34 -0
- rasa/cli/project_templates/default/endpoints.yml +42 -0
- rasa/cli/project_templates/default/tests/test_stories.yml +91 -0
- rasa/cli/project_templates/tutorial/actions/__init__.py +0 -0
- rasa/cli/project_templates/tutorial/actions/actions.py +22 -0
- rasa/cli/project_templates/tutorial/config.yml +12 -0
- rasa/cli/project_templates/tutorial/credentials.yml +33 -0
- rasa/cli/project_templates/tutorial/data/flows.yml +8 -0
- rasa/cli/project_templates/tutorial/data/patterns.yml +11 -0
- rasa/cli/project_templates/tutorial/domain.yml +35 -0
- rasa/cli/project_templates/tutorial/endpoints.yml +55 -0
- rasa/cli/run.py +143 -0
- rasa/cli/scaffold.py +273 -0
- rasa/cli/shell.py +141 -0
- rasa/cli/studio/__init__.py +0 -0
- rasa/cli/studio/download.py +62 -0
- rasa/cli/studio/studio.py +296 -0
- rasa/cli/studio/train.py +59 -0
- rasa/cli/studio/upload.py +62 -0
- rasa/cli/telemetry.py +102 -0
- rasa/cli/test.py +280 -0
- rasa/cli/train.py +278 -0
- rasa/cli/utils.py +484 -0
- rasa/cli/visualize.py +40 -0
- rasa/cli/x.py +206 -0
- rasa/constants.py +45 -0
- rasa/core/__init__.py +17 -0
- rasa/core/actions/__init__.py +0 -0
- rasa/core/actions/action.py +1318 -0
- rasa/core/actions/action_clean_stack.py +59 -0
- rasa/core/actions/action_exceptions.py +24 -0
- rasa/core/actions/action_hangup.py +29 -0
- rasa/core/actions/action_repeat_bot_messages.py +89 -0
- rasa/core/actions/action_run_slot_rejections.py +210 -0
- rasa/core/actions/action_trigger_chitchat.py +31 -0
- rasa/core/actions/action_trigger_flow.py +109 -0
- rasa/core/actions/action_trigger_search.py +31 -0
- rasa/core/actions/constants.py +5 -0
- rasa/core/actions/custom_action_executor.py +191 -0
- rasa/core/actions/direct_custom_actions_executor.py +109 -0
- rasa/core/actions/e2e_stub_custom_action_executor.py +72 -0
- rasa/core/actions/forms.py +741 -0
- rasa/core/actions/grpc_custom_action_executor.py +251 -0
- rasa/core/actions/http_custom_action_executor.py +145 -0
- rasa/core/actions/loops.py +114 -0
- rasa/core/actions/two_stage_fallback.py +186 -0
- rasa/core/agent.py +559 -0
- rasa/core/auth_retry_tracker_store.py +122 -0
- rasa/core/brokers/__init__.py +0 -0
- rasa/core/brokers/broker.py +126 -0
- rasa/core/brokers/file.py +58 -0
- rasa/core/brokers/kafka.py +324 -0
- rasa/core/brokers/pika.py +388 -0
- rasa/core/brokers/sql.py +86 -0
- rasa/core/channels/__init__.py +61 -0
- rasa/core/channels/botframework.py +338 -0
- rasa/core/channels/callback.py +84 -0
- rasa/core/channels/channel.py +456 -0
- rasa/core/channels/console.py +241 -0
- rasa/core/channels/development_inspector.py +197 -0
- rasa/core/channels/facebook.py +419 -0
- rasa/core/channels/hangouts.py +329 -0
- rasa/core/channels/inspector/.eslintrc.cjs +25 -0
- rasa/core/channels/inspector/.gitignore +23 -0
- rasa/core/channels/inspector/README.md +54 -0
- rasa/core/channels/inspector/assets/favicon.ico +0 -0
- rasa/core/channels/inspector/assets/rasa-chat.js +2 -0
- rasa/core/channels/inspector/custom.d.ts +3 -0
- rasa/core/channels/inspector/dist/assets/arc-861ddd57.js +1 -0
- rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
- rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-921f02db.js +10 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-b436c4f8.js +2 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-511a23cb.js +2 -0
- rasa/core/channels/inspector/dist/assets/createText-62fc7601-ef476ecd.js +7 -0
- rasa/core/channels/inspector/dist/assets/edges-f2ad444c-f1878e0a.js +4 -0
- rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-fac75185.js +51 -0
- rasa/core/channels/inspector/dist/assets/flowDb-1972c806-201c5bbc.js +6 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-f904ae41.js +4 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +1 -0
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-1813da66.js +139 -0
- rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-872af172.js +266 -0
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-34a0af5a.js +70 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-128cfa44.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-21dbcb97.woff +0 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-222b5e26.svg +329 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-9ad89b2a.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-42ba3e3d.js +1 -0
- rasa/core/channels/inspector/dist/assets/index-37817b51.js +1317 -0
- rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
- rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-6b731386.js +7 -0
- rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
- rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-e8579ac6.js +139 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-60c05ee4.woff +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-8335d9b8.svg +438 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-9cc39c75.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-ead13ccf.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-16705655.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-5aeb07f9.woff +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9c459044.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9e2898a4.svg +435 -0
- rasa/core/channels/inspector/dist/assets/layout-89e6403a.js +1 -0
- rasa/core/channels/inspector/dist/assets/line-dc73d3fc.js +1 -0
- rasa/core/channels/inspector/dist/assets/linear-f5b1d2bc.js +1 -0
- rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-82cb74fa.js +109 -0
- rasa/core/channels/inspector/dist/assets/ordinal-ba9b4969.js +1 -0
- rasa/core/channels/inspector/dist/assets/path-53f90ab3.js +1 -0
- rasa/core/channels/inspector/dist/assets/pieDiagram-dbbf0591-bdf5f29b.js +35 -0
- rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-c7a0cbe4.js +7 -0
- rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-7ec5410f.js +52 -0
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-caee5554.js +8 -0
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-2935f8db.js +122 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-8f5d9693.js +1 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-d565d1de.js +1 -0
- rasa/core/channels/inspector/dist/assets/styles-080da4f6-75ad421d.js +110 -0
- rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-7e764226.js +159 -0
- rasa/core/channels/inspector/dist/assets/styles-9c745c82-7a4e0e61.js +207 -0
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-4019d1bf.js +1 -0
- rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-01ea12df.js +61 -0
- rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-89407137.js +7 -0
- rasa/core/channels/inspector/dist/index.html +42 -0
- rasa/core/channels/inspector/index.html +40 -0
- rasa/core/channels/inspector/jest.config.ts +13 -0
- rasa/core/channels/inspector/package.json +52 -0
- rasa/core/channels/inspector/setupTests.ts +2 -0
- rasa/core/channels/inspector/src/App.tsx +220 -0
- rasa/core/channels/inspector/src/components/Chat.tsx +95 -0
- rasa/core/channels/inspector/src/components/DiagramFlow.tsx +108 -0
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
- rasa/core/channels/inspector/src/components/DialogueStack.tsx +136 -0
- rasa/core/channels/inspector/src/components/ExpandIcon.tsx +16 -0
- rasa/core/channels/inspector/src/components/FullscreenButton.tsx +45 -0
- rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +22 -0
- rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +21 -0
- rasa/core/channels/inspector/src/components/RasaLogo.tsx +32 -0
- rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +39 -0
- rasa/core/channels/inspector/src/components/Slots.tsx +91 -0
- rasa/core/channels/inspector/src/components/Welcome.tsx +54 -0
- rasa/core/channels/inspector/src/helpers/audiostream.ts +191 -0
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +392 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +306 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +127 -0
- rasa/core/channels/inspector/src/main.tsx +13 -0
- rasa/core/channels/inspector/src/theme/Button/Button.ts +29 -0
- rasa/core/channels/inspector/src/theme/Heading/Heading.ts +31 -0
- rasa/core/channels/inspector/src/theme/Input/Input.ts +27 -0
- rasa/core/channels/inspector/src/theme/Link/Link.ts +10 -0
- rasa/core/channels/inspector/src/theme/Modal/Modal.ts +47 -0
- rasa/core/channels/inspector/src/theme/Table/Table.tsx +38 -0
- rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +12 -0
- rasa/core/channels/inspector/src/theme/base/breakpoints.ts +8 -0
- rasa/core/channels/inspector/src/theme/base/colors.ts +88 -0
- rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +29 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.svg +329 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.svg +438 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.svg +435 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/radii.ts +9 -0
- rasa/core/channels/inspector/src/theme/base/shadows.ts +7 -0
- rasa/core/channels/inspector/src/theme/base/sizes.ts +7 -0
- rasa/core/channels/inspector/src/theme/base/space.ts +15 -0
- rasa/core/channels/inspector/src/theme/base/styles.ts +13 -0
- rasa/core/channels/inspector/src/theme/base/typography.ts +24 -0
- rasa/core/channels/inspector/src/theme/base/zIndices.ts +19 -0
- rasa/core/channels/inspector/src/theme/index.ts +101 -0
- rasa/core/channels/inspector/src/types.ts +84 -0
- rasa/core/channels/inspector/src/vite-env.d.ts +1 -0
- rasa/core/channels/inspector/tests/__mocks__/fileMock.ts +1 -0
- rasa/core/channels/inspector/tests/__mocks__/matchMedia.ts +16 -0
- rasa/core/channels/inspector/tests/__mocks__/styleMock.ts +1 -0
- rasa/core/channels/inspector/tests/renderWithProviders.tsx +14 -0
- rasa/core/channels/inspector/tsconfig.json +26 -0
- rasa/core/channels/inspector/tsconfig.node.json +10 -0
- rasa/core/channels/inspector/vite.config.ts +8 -0
- rasa/core/channels/inspector/yarn.lock +6249 -0
- rasa/core/channels/mattermost.py +229 -0
- rasa/core/channels/rasa_chat.py +126 -0
- rasa/core/channels/rest.py +230 -0
- rasa/core/channels/rocketchat.py +174 -0
- rasa/core/channels/slack.py +620 -0
- rasa/core/channels/socketio.py +302 -0
- rasa/core/channels/telegram.py +298 -0
- rasa/core/channels/twilio.py +169 -0
- rasa/core/channels/vier_cvg.py +374 -0
- rasa/core/channels/voice_ready/__init__.py +0 -0
- rasa/core/channels/voice_ready/audiocodes.py +501 -0
- rasa/core/channels/voice_ready/jambonz.py +121 -0
- rasa/core/channels/voice_ready/jambonz_protocol.py +396 -0
- rasa/core/channels/voice_ready/twilio_voice.py +403 -0
- rasa/core/channels/voice_ready/utils.py +37 -0
- rasa/core/channels/voice_stream/__init__.py +0 -0
- rasa/core/channels/voice_stream/asr/__init__.py +0 -0
- rasa/core/channels/voice_stream/asr/asr_engine.py +89 -0
- rasa/core/channels/voice_stream/asr/asr_event.py +18 -0
- rasa/core/channels/voice_stream/asr/azure.py +130 -0
- rasa/core/channels/voice_stream/asr/deepgram.py +90 -0
- rasa/core/channels/voice_stream/audio_bytes.py +8 -0
- rasa/core/channels/voice_stream/browser_audio.py +107 -0
- rasa/core/channels/voice_stream/call_state.py +23 -0
- rasa/core/channels/voice_stream/tts/__init__.py +0 -0
- rasa/core/channels/voice_stream/tts/azure.py +106 -0
- rasa/core/channels/voice_stream/tts/cartesia.py +118 -0
- rasa/core/channels/voice_stream/tts/tts_cache.py +27 -0
- rasa/core/channels/voice_stream/tts/tts_engine.py +58 -0
- rasa/core/channels/voice_stream/twilio_media_streams.py +173 -0
- rasa/core/channels/voice_stream/util.py +57 -0
- rasa/core/channels/voice_stream/voice_channel.py +427 -0
- rasa/core/channels/webexteams.py +134 -0
- rasa/core/concurrent_lock_store.py +210 -0
- rasa/core/constants.py +112 -0
- rasa/core/evaluation/__init__.py +0 -0
- rasa/core/evaluation/marker.py +267 -0
- rasa/core/evaluation/marker_base.py +923 -0
- rasa/core/evaluation/marker_stats.py +293 -0
- rasa/core/evaluation/marker_tracker_loader.py +103 -0
- rasa/core/exceptions.py +29 -0
- rasa/core/exporter.py +284 -0
- rasa/core/featurizers/__init__.py +0 -0
- rasa/core/featurizers/precomputation.py +410 -0
- rasa/core/featurizers/single_state_featurizer.py +421 -0
- rasa/core/featurizers/tracker_featurizers.py +1262 -0
- rasa/core/http_interpreter.py +89 -0
- rasa/core/information_retrieval/__init__.py +7 -0
- rasa/core/information_retrieval/faiss.py +124 -0
- rasa/core/information_retrieval/information_retrieval.py +137 -0
- rasa/core/information_retrieval/milvus.py +59 -0
- rasa/core/information_retrieval/qdrant.py +96 -0
- rasa/core/jobs.py +63 -0
- rasa/core/lock.py +139 -0
- rasa/core/lock_store.py +343 -0
- rasa/core/migrate.py +403 -0
- rasa/core/nlg/__init__.py +3 -0
- rasa/core/nlg/callback.py +146 -0
- rasa/core/nlg/contextual_response_rephraser.py +320 -0
- rasa/core/nlg/generator.py +230 -0
- rasa/core/nlg/interpolator.py +143 -0
- rasa/core/nlg/response.py +155 -0
- rasa/core/nlg/summarize.py +70 -0
- rasa/core/persistor.py +538 -0
- rasa/core/policies/__init__.py +0 -0
- rasa/core/policies/ensemble.py +329 -0
- rasa/core/policies/enterprise_search_policy.py +905 -0
- rasa/core/policies/enterprise_search_prompt_template.jinja2 +25 -0
- rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +60 -0
- rasa/core/policies/flow_policy.py +205 -0
- rasa/core/policies/flows/__init__.py +0 -0
- rasa/core/policies/flows/flow_exceptions.py +44 -0
- rasa/core/policies/flows/flow_executor.py +754 -0
- rasa/core/policies/flows/flow_step_result.py +43 -0
- rasa/core/policies/intentless_policy.py +1031 -0
- rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
- rasa/core/policies/memoization.py +538 -0
- rasa/core/policies/policy.py +725 -0
- rasa/core/policies/rule_policy.py +1273 -0
- rasa/core/policies/ted_policy.py +2169 -0
- rasa/core/policies/unexpected_intent_policy.py +1022 -0
- rasa/core/processor.py +1465 -0
- rasa/core/run.py +342 -0
- rasa/core/secrets_manager/__init__.py +0 -0
- rasa/core/secrets_manager/constants.py +36 -0
- rasa/core/secrets_manager/endpoints.py +391 -0
- rasa/core/secrets_manager/factory.py +241 -0
- rasa/core/secrets_manager/secret_manager.py +262 -0
- rasa/core/secrets_manager/vault.py +584 -0
- rasa/core/test.py +1335 -0
- rasa/core/tracker_store.py +1703 -0
- rasa/core/train.py +105 -0
- rasa/core/training/__init__.py +89 -0
- rasa/core/training/converters/__init__.py +0 -0
- rasa/core/training/converters/responses_prefix_converter.py +119 -0
- rasa/core/training/interactive.py +1744 -0
- rasa/core/training/story_conflict.py +381 -0
- rasa/core/training/training.py +93 -0
- rasa/core/utils.py +366 -0
- rasa/core/visualize.py +70 -0
- rasa/dialogue_understanding/__init__.py +0 -0
- rasa/dialogue_understanding/coexistence/__init__.py +0 -0
- rasa/dialogue_understanding/coexistence/constants.py +4 -0
- rasa/dialogue_understanding/coexistence/intent_based_router.py +196 -0
- rasa/dialogue_understanding/coexistence/llm_based_router.py +327 -0
- rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
- rasa/dialogue_understanding/commands/__init__.py +61 -0
- rasa/dialogue_understanding/commands/can_not_handle_command.py +70 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +125 -0
- rasa/dialogue_understanding/commands/change_flow_command.py +44 -0
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +57 -0
- rasa/dialogue_understanding/commands/clarify_command.py +86 -0
- rasa/dialogue_understanding/commands/command.py +85 -0
- rasa/dialogue_understanding/commands/correct_slots_command.py +297 -0
- rasa/dialogue_understanding/commands/error_command.py +79 -0
- rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
- rasa/dialogue_understanding/commands/handle_code_change_command.py +73 -0
- rasa/dialogue_understanding/commands/human_handoff_command.py +66 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +57 -0
- rasa/dialogue_understanding/commands/noop_command.py +54 -0
- rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +60 -0
- rasa/dialogue_understanding/commands/restart_command.py +58 -0
- rasa/dialogue_understanding/commands/session_end_command.py +61 -0
- rasa/dialogue_understanding/commands/session_start_command.py +59 -0
- rasa/dialogue_understanding/commands/set_slot_command.py +160 -0
- rasa/dialogue_understanding/commands/skip_question_command.py +75 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +107 -0
- rasa/dialogue_understanding/commands/user_silence_command.py +59 -0
- rasa/dialogue_understanding/commands/utils.py +45 -0
- rasa/dialogue_understanding/generator/__init__.py +21 -0
- rasa/dialogue_understanding/generator/command_generator.py +464 -0
- rasa/dialogue_understanding/generator/constants.py +27 -0
- rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +466 -0
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +500 -0
- rasa/dialogue_understanding/generator/llm_command_generator.py +67 -0
- rasa/dialogue_understanding/generator/multi_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/multi_step/fill_slots_prompt.jinja2 +62 -0
- rasa/dialogue_understanding/generator/multi_step/handle_flows_prompt.jinja2 +38 -0
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +920 -0
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +261 -0
- rasa/dialogue_understanding/generator/single_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2 +60 -0
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +486 -0
- rasa/dialogue_understanding/patterns/__init__.py +0 -0
- rasa/dialogue_understanding/patterns/cancel.py +111 -0
- rasa/dialogue_understanding/patterns/cannot_handle.py +43 -0
- rasa/dialogue_understanding/patterns/chitchat.py +37 -0
- rasa/dialogue_understanding/patterns/clarify.py +97 -0
- rasa/dialogue_understanding/patterns/code_change.py +41 -0
- rasa/dialogue_understanding/patterns/collect_information.py +90 -0
- rasa/dialogue_understanding/patterns/completed.py +40 -0
- rasa/dialogue_understanding/patterns/continue_interrupted.py +42 -0
- rasa/dialogue_understanding/patterns/correction.py +278 -0
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +301 -0
- rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
- rasa/dialogue_understanding/patterns/internal_error.py +47 -0
- rasa/dialogue_understanding/patterns/repeat.py +37 -0
- rasa/dialogue_understanding/patterns/restart.py +37 -0
- rasa/dialogue_understanding/patterns/search.py +37 -0
- rasa/dialogue_understanding/patterns/session_start.py +37 -0
- rasa/dialogue_understanding/patterns/skip_question.py +38 -0
- rasa/dialogue_understanding/patterns/user_silence.py +37 -0
- rasa/dialogue_understanding/processor/__init__.py +0 -0
- rasa/dialogue_understanding/processor/command_processor.py +720 -0
- rasa/dialogue_understanding/processor/command_processor_component.py +43 -0
- rasa/dialogue_understanding/stack/__init__.py +0 -0
- rasa/dialogue_understanding/stack/dialogue_stack.py +178 -0
- rasa/dialogue_understanding/stack/frames/__init__.py +19 -0
- rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +27 -0
- rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +137 -0
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +157 -0
- rasa/dialogue_understanding/stack/frames/pattern_frame.py +10 -0
- rasa/dialogue_understanding/stack/frames/search_frame.py +27 -0
- rasa/dialogue_understanding/stack/utils.py +211 -0
- rasa/dialogue_understanding/utils.py +14 -0
- rasa/dialogue_understanding_test/__init__.py +0 -0
- rasa/dialogue_understanding_test/command_metric_calculation.py +12 -0
- rasa/dialogue_understanding_test/constants.py +17 -0
- rasa/dialogue_understanding_test/du_test_case.py +118 -0
- rasa/dialogue_understanding_test/du_test_result.py +11 -0
- rasa/dialogue_understanding_test/du_test_runner.py +93 -0
- rasa/dialogue_understanding_test/io.py +54 -0
- rasa/dialogue_understanding_test/validation.py +22 -0
- rasa/e2e_test/__init__.py +0 -0
- rasa/e2e_test/aggregate_test_stats_calculator.py +134 -0
- rasa/e2e_test/assertions.py +1345 -0
- rasa/e2e_test/assertions_schema.yml +129 -0
- rasa/e2e_test/constants.py +31 -0
- rasa/e2e_test/e2e_config.py +220 -0
- rasa/e2e_test/e2e_config_schema.yml +26 -0
- rasa/e2e_test/e2e_test_case.py +569 -0
- rasa/e2e_test/e2e_test_converter.py +363 -0
- rasa/e2e_test/e2e_test_converter_prompt.jinja2 +70 -0
- rasa/e2e_test/e2e_test_coverage_report.py +364 -0
- rasa/e2e_test/e2e_test_result.py +54 -0
- rasa/e2e_test/e2e_test_runner.py +1192 -0
- rasa/e2e_test/e2e_test_schema.yml +181 -0
- rasa/e2e_test/pykwalify_extensions.py +39 -0
- rasa/e2e_test/stub_custom_action.py +70 -0
- rasa/e2e_test/utils/__init__.py +0 -0
- rasa/e2e_test/utils/e2e_yaml_utils.py +55 -0
- rasa/e2e_test/utils/io.py +598 -0
- rasa/e2e_test/utils/validation.py +178 -0
- rasa/engine/__init__.py +0 -0
- rasa/engine/caching.py +463 -0
- rasa/engine/constants.py +17 -0
- rasa/engine/exceptions.py +14 -0
- rasa/engine/graph.py +642 -0
- rasa/engine/loader.py +48 -0
- rasa/engine/recipes/__init__.py +0 -0
- rasa/engine/recipes/config_files/default_config.yml +41 -0
- rasa/engine/recipes/default_components.py +97 -0
- rasa/engine/recipes/default_recipe.py +1272 -0
- rasa/engine/recipes/graph_recipe.py +79 -0
- rasa/engine/recipes/recipe.py +93 -0
- rasa/engine/runner/__init__.py +0 -0
- rasa/engine/runner/dask.py +250 -0
- rasa/engine/runner/interface.py +49 -0
- rasa/engine/storage/__init__.py +0 -0
- rasa/engine/storage/local_model_storage.py +244 -0
- rasa/engine/storage/resource.py +110 -0
- rasa/engine/storage/storage.py +199 -0
- rasa/engine/training/__init__.py +0 -0
- rasa/engine/training/components.py +176 -0
- rasa/engine/training/fingerprinting.py +64 -0
- rasa/engine/training/graph_trainer.py +256 -0
- rasa/engine/training/hooks.py +164 -0
- rasa/engine/validation.py +1451 -0
- rasa/env.py +14 -0
- rasa/exceptions.py +69 -0
- rasa/graph_components/__init__.py +0 -0
- rasa/graph_components/converters/__init__.py +0 -0
- rasa/graph_components/converters/nlu_message_converter.py +48 -0
- rasa/graph_components/providers/__init__.py +0 -0
- rasa/graph_components/providers/domain_for_core_training_provider.py +87 -0
- rasa/graph_components/providers/domain_provider.py +71 -0
- rasa/graph_components/providers/flows_provider.py +74 -0
- rasa/graph_components/providers/forms_provider.py +44 -0
- rasa/graph_components/providers/nlu_training_data_provider.py +56 -0
- rasa/graph_components/providers/responses_provider.py +44 -0
- rasa/graph_components/providers/rule_only_provider.py +49 -0
- rasa/graph_components/providers/story_graph_provider.py +96 -0
- rasa/graph_components/providers/training_tracker_provider.py +55 -0
- rasa/graph_components/validators/__init__.py +0 -0
- rasa/graph_components/validators/default_recipe_validator.py +550 -0
- rasa/graph_components/validators/finetuning_validator.py +302 -0
- rasa/hooks.py +111 -0
- rasa/jupyter.py +63 -0
- rasa/llm_fine_tuning/__init__.py +0 -0
- rasa/llm_fine_tuning/annotation_module.py +241 -0
- rasa/llm_fine_tuning/conversations.py +144 -0
- rasa/llm_fine_tuning/llm_data_preparation_module.py +178 -0
- rasa/llm_fine_tuning/paraphrasing/__init__.py +0 -0
- rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +281 -0
- rasa/llm_fine_tuning/paraphrasing/default_rephrase_prompt_template.jina2 +44 -0
- rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +121 -0
- rasa/llm_fine_tuning/paraphrasing/rephrased_user_message.py +10 -0
- rasa/llm_fine_tuning/paraphrasing_module.py +128 -0
- rasa/llm_fine_tuning/storage.py +174 -0
- rasa/llm_fine_tuning/train_test_split_module.py +441 -0
- rasa/markers/__init__.py +0 -0
- rasa/markers/marker.py +269 -0
- rasa/markers/marker_base.py +828 -0
- rasa/markers/upload.py +74 -0
- rasa/markers/validate.py +21 -0
- rasa/model.py +118 -0
- rasa/model_manager/__init__.py +0 -0
- rasa/model_manager/config.py +40 -0
- rasa/model_manager/model_api.py +559 -0
- rasa/model_manager/runner_service.py +286 -0
- rasa/model_manager/socket_bridge.py +146 -0
- rasa/model_manager/studio_jwt_auth.py +86 -0
- rasa/model_manager/trainer_service.py +325 -0
- rasa/model_manager/utils.py +87 -0
- rasa/model_manager/warm_rasa_process.py +187 -0
- rasa/model_service.py +112 -0
- rasa/model_testing.py +457 -0
- rasa/model_training.py +596 -0
- rasa/nlu/__init__.py +7 -0
- rasa/nlu/classifiers/__init__.py +3 -0
- rasa/nlu/classifiers/classifier.py +5 -0
- rasa/nlu/classifiers/diet_classifier.py +1881 -0
- rasa/nlu/classifiers/fallback_classifier.py +192 -0
- rasa/nlu/classifiers/keyword_intent_classifier.py +188 -0
- rasa/nlu/classifiers/logistic_regression_classifier.py +253 -0
- rasa/nlu/classifiers/mitie_intent_classifier.py +156 -0
- rasa/nlu/classifiers/regex_message_handler.py +56 -0
- rasa/nlu/classifiers/sklearn_intent_classifier.py +330 -0
- rasa/nlu/constants.py +77 -0
- rasa/nlu/convert.py +40 -0
- rasa/nlu/emulators/__init__.py +0 -0
- rasa/nlu/emulators/dialogflow.py +55 -0
- rasa/nlu/emulators/emulator.py +49 -0
- rasa/nlu/emulators/luis.py +86 -0
- rasa/nlu/emulators/no_emulator.py +10 -0
- rasa/nlu/emulators/wit.py +56 -0
- rasa/nlu/extractors/__init__.py +0 -0
- rasa/nlu/extractors/crf_entity_extractor.py +715 -0
- rasa/nlu/extractors/duckling_entity_extractor.py +206 -0
- rasa/nlu/extractors/entity_synonyms.py +178 -0
- rasa/nlu/extractors/extractor.py +470 -0
- rasa/nlu/extractors/mitie_entity_extractor.py +293 -0
- rasa/nlu/extractors/regex_entity_extractor.py +220 -0
- rasa/nlu/extractors/spacy_entity_extractor.py +95 -0
- rasa/nlu/featurizers/__init__.py +0 -0
- rasa/nlu/featurizers/dense_featurizer/__init__.py +0 -0
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +445 -0
- rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +768 -0
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +170 -0
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +132 -0
- rasa/nlu/featurizers/featurizer.py +89 -0
- rasa/nlu/featurizers/sparse_featurizer/__init__.py +0 -0
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +867 -0
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +571 -0
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +271 -0
- rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
- rasa/nlu/model.py +24 -0
- rasa/nlu/run.py +27 -0
- rasa/nlu/selectors/__init__.py +0 -0
- rasa/nlu/selectors/response_selector.py +987 -0
- rasa/nlu/test.py +1940 -0
- rasa/nlu/tokenizers/__init__.py +0 -0
- rasa/nlu/tokenizers/jieba_tokenizer.py +148 -0
- rasa/nlu/tokenizers/mitie_tokenizer.py +75 -0
- rasa/nlu/tokenizers/spacy_tokenizer.py +72 -0
- rasa/nlu/tokenizers/tokenizer.py +239 -0
- rasa/nlu/tokenizers/whitespace_tokenizer.py +95 -0
- rasa/nlu/utils/__init__.py +35 -0
- rasa/nlu/utils/bilou_utils.py +462 -0
- rasa/nlu/utils/hugging_face/__init__.py +0 -0
- rasa/nlu/utils/hugging_face/registry.py +108 -0
- rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +311 -0
- rasa/nlu/utils/mitie_utils.py +113 -0
- rasa/nlu/utils/pattern_utils.py +168 -0
- rasa/nlu/utils/spacy_utils.py +310 -0
- rasa/plugin.py +90 -0
- rasa/server.py +1588 -0
- rasa/shared/__init__.py +0 -0
- rasa/shared/constants.py +311 -0
- rasa/shared/core/__init__.py +0 -0
- rasa/shared/core/command_payload_reader.py +109 -0
- rasa/shared/core/constants.py +180 -0
- rasa/shared/core/conversation.py +46 -0
- rasa/shared/core/domain.py +2172 -0
- rasa/shared/core/events.py +2559 -0
- rasa/shared/core/flows/__init__.py +7 -0
- rasa/shared/core/flows/flow.py +562 -0
- rasa/shared/core/flows/flow_path.py +84 -0
- rasa/shared/core/flows/flow_step.py +146 -0
- rasa/shared/core/flows/flow_step_links.py +319 -0
- rasa/shared/core/flows/flow_step_sequence.py +70 -0
- rasa/shared/core/flows/flows_list.py +258 -0
- rasa/shared/core/flows/flows_yaml_schema.json +303 -0
- rasa/shared/core/flows/nlu_trigger.py +117 -0
- rasa/shared/core/flows/steps/__init__.py +24 -0
- rasa/shared/core/flows/steps/action.py +56 -0
- rasa/shared/core/flows/steps/call.py +64 -0
- rasa/shared/core/flows/steps/collect.py +112 -0
- rasa/shared/core/flows/steps/constants.py +5 -0
- rasa/shared/core/flows/steps/continuation.py +36 -0
- rasa/shared/core/flows/steps/end.py +22 -0
- rasa/shared/core/flows/steps/internal.py +44 -0
- rasa/shared/core/flows/steps/link.py +51 -0
- rasa/shared/core/flows/steps/no_operation.py +48 -0
- rasa/shared/core/flows/steps/set_slots.py +50 -0
- rasa/shared/core/flows/steps/start.py +30 -0
- rasa/shared/core/flows/utils.py +39 -0
- rasa/shared/core/flows/validation.py +735 -0
- rasa/shared/core/flows/yaml_flows_io.py +405 -0
- rasa/shared/core/generator.py +908 -0
- rasa/shared/core/slot_mappings.py +526 -0
- rasa/shared/core/slots.py +654 -0
- rasa/shared/core/trackers.py +1183 -0
- rasa/shared/core/training_data/__init__.py +0 -0
- rasa/shared/core/training_data/loading.py +89 -0
- rasa/shared/core/training_data/story_reader/__init__.py +0 -0
- rasa/shared/core/training_data/story_reader/story_reader.py +129 -0
- rasa/shared/core/training_data/story_reader/story_step_builder.py +168 -0
- rasa/shared/core/training_data/story_reader/yaml_story_reader.py +888 -0
- rasa/shared/core/training_data/story_writer/__init__.py +0 -0
- rasa/shared/core/training_data/story_writer/story_writer.py +76 -0
- rasa/shared/core/training_data/story_writer/yaml_story_writer.py +444 -0
- rasa/shared/core/training_data/structures.py +858 -0
- rasa/shared/core/training_data/visualization.html +146 -0
- rasa/shared/core/training_data/visualization.py +603 -0
- rasa/shared/data.py +249 -0
- rasa/shared/engine/__init__.py +0 -0
- rasa/shared/engine/caching.py +26 -0
- rasa/shared/exceptions.py +167 -0
- rasa/shared/importers/__init__.py +0 -0
- rasa/shared/importers/importer.py +770 -0
- rasa/shared/importers/multi_project.py +215 -0
- rasa/shared/importers/rasa.py +108 -0
- rasa/shared/importers/remote_importer.py +196 -0
- rasa/shared/importers/utils.py +36 -0
- rasa/shared/nlu/__init__.py +0 -0
- rasa/shared/nlu/constants.py +53 -0
- rasa/shared/nlu/interpreter.py +10 -0
- rasa/shared/nlu/training_data/__init__.py +0 -0
- rasa/shared/nlu/training_data/entities_parser.py +208 -0
- rasa/shared/nlu/training_data/features.py +492 -0
- rasa/shared/nlu/training_data/formats/__init__.py +10 -0
- rasa/shared/nlu/training_data/formats/dialogflow.py +163 -0
- rasa/shared/nlu/training_data/formats/luis.py +87 -0
- rasa/shared/nlu/training_data/formats/rasa.py +135 -0
- rasa/shared/nlu/training_data/formats/rasa_yaml.py +618 -0
- rasa/shared/nlu/training_data/formats/readerwriter.py +244 -0
- rasa/shared/nlu/training_data/formats/wit.py +52 -0
- rasa/shared/nlu/training_data/loading.py +137 -0
- rasa/shared/nlu/training_data/lookup_tables_parser.py +30 -0
- rasa/shared/nlu/training_data/message.py +490 -0
- rasa/shared/nlu/training_data/schemas/__init__.py +0 -0
- rasa/shared/nlu/training_data/schemas/data_schema.py +85 -0
- rasa/shared/nlu/training_data/schemas/nlu.yml +53 -0
- rasa/shared/nlu/training_data/schemas/responses.yml +70 -0
- rasa/shared/nlu/training_data/synonyms_parser.py +42 -0
- rasa/shared/nlu/training_data/training_data.py +729 -0
- rasa/shared/nlu/training_data/util.py +223 -0
- rasa/shared/providers/__init__.py +0 -0
- rasa/shared/providers/_configs/__init__.py +0 -0
- rasa/shared/providers/_configs/azure_openai_client_config.py +677 -0
- rasa/shared/providers/_configs/client_config.py +59 -0
- rasa/shared/providers/_configs/default_litellm_client_config.py +132 -0
- rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +236 -0
- rasa/shared/providers/_configs/litellm_router_client_config.py +222 -0
- rasa/shared/providers/_configs/model_group_config.py +173 -0
- rasa/shared/providers/_configs/openai_client_config.py +177 -0
- rasa/shared/providers/_configs/rasa_llm_client_config.py +75 -0
- rasa/shared/providers/_configs/self_hosted_llm_client_config.py +178 -0
- rasa/shared/providers/_configs/utils.py +117 -0
- rasa/shared/providers/_ssl_verification_utils.py +124 -0
- rasa/shared/providers/_utils.py +79 -0
- rasa/shared/providers/constants.py +7 -0
- rasa/shared/providers/embedding/__init__.py +0 -0
- rasa/shared/providers/embedding/_base_litellm_embedding_client.py +243 -0
- rasa/shared/providers/embedding/_langchain_embedding_client_adapter.py +74 -0
- rasa/shared/providers/embedding/azure_openai_embedding_client.py +335 -0
- rasa/shared/providers/embedding/default_litellm_embedding_client.py +126 -0
- rasa/shared/providers/embedding/embedding_client.py +90 -0
- rasa/shared/providers/embedding/embedding_response.py +41 -0
- rasa/shared/providers/embedding/huggingface_local_embedding_client.py +191 -0
- rasa/shared/providers/embedding/litellm_router_embedding_client.py +138 -0
- rasa/shared/providers/embedding/openai_embedding_client.py +172 -0
- rasa/shared/providers/llm/__init__.py +0 -0
- rasa/shared/providers/llm/_base_litellm_client.py +265 -0
- rasa/shared/providers/llm/azure_openai_llm_client.py +415 -0
- rasa/shared/providers/llm/default_litellm_llm_client.py +110 -0
- rasa/shared/providers/llm/litellm_router_llm_client.py +202 -0
- rasa/shared/providers/llm/llm_client.py +78 -0
- rasa/shared/providers/llm/llm_response.py +50 -0
- rasa/shared/providers/llm/openai_llm_client.py +161 -0
- rasa/shared/providers/llm/rasa_llm_client.py +120 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +276 -0
- rasa/shared/providers/mappings.py +94 -0
- rasa/shared/providers/router/__init__.py +0 -0
- rasa/shared/providers/router/_base_litellm_router_client.py +185 -0
- rasa/shared/providers/router/router_client.py +75 -0
- rasa/shared/utils/__init__.py +0 -0
- rasa/shared/utils/cli.py +102 -0
- rasa/shared/utils/common.py +324 -0
- rasa/shared/utils/constants.py +4 -0
- rasa/shared/utils/health_check/__init__.py +0 -0
- rasa/shared/utils/health_check/embeddings_health_check_mixin.py +31 -0
- rasa/shared/utils/health_check/health_check.py +258 -0
- rasa/shared/utils/health_check/llm_health_check_mixin.py +31 -0
- rasa/shared/utils/io.py +499 -0
- rasa/shared/utils/llm.py +764 -0
- rasa/shared/utils/pykwalify_extensions.py +27 -0
- rasa/shared/utils/schemas/__init__.py +0 -0
- rasa/shared/utils/schemas/config.yml +2 -0
- rasa/shared/utils/schemas/domain.yml +145 -0
- rasa/shared/utils/schemas/events.py +214 -0
- rasa/shared/utils/schemas/model_config.yml +36 -0
- rasa/shared/utils/schemas/stories.yml +173 -0
- rasa/shared/utils/yaml.py +1068 -0
- rasa/studio/__init__.py +0 -0
- rasa/studio/auth.py +270 -0
- rasa/studio/config.py +136 -0
- rasa/studio/constants.py +19 -0
- rasa/studio/data_handler.py +368 -0
- rasa/studio/download.py +489 -0
- rasa/studio/results_logger.py +137 -0
- rasa/studio/train.py +134 -0
- rasa/studio/upload.py +563 -0
- rasa/telemetry.py +1876 -0
- rasa/tracing/__init__.py +0 -0
- rasa/tracing/config.py +355 -0
- rasa/tracing/constants.py +62 -0
- rasa/tracing/instrumentation/__init__.py +0 -0
- rasa/tracing/instrumentation/attribute_extractors.py +765 -0
- rasa/tracing/instrumentation/instrumentation.py +1306 -0
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +144 -0
- rasa/tracing/instrumentation/metrics.py +294 -0
- rasa/tracing/metric_instrument_provider.py +205 -0
- rasa/utils/__init__.py +0 -0
- rasa/utils/beta.py +83 -0
- rasa/utils/cli.py +28 -0
- rasa/utils/common.py +639 -0
- rasa/utils/converter.py +53 -0
- rasa/utils/endpoints.py +331 -0
- rasa/utils/io.py +252 -0
- rasa/utils/json_utils.py +60 -0
- rasa/utils/licensing.py +542 -0
- rasa/utils/log_utils.py +181 -0
- rasa/utils/mapper.py +210 -0
- rasa/utils/ml_utils.py +147 -0
- rasa/utils/plotting.py +362 -0
- rasa/utils/sanic_error_handler.py +32 -0
- rasa/utils/singleton.py +23 -0
- rasa/utils/tensorflow/__init__.py +0 -0
- rasa/utils/tensorflow/callback.py +112 -0
- rasa/utils/tensorflow/constants.py +116 -0
- rasa/utils/tensorflow/crf.py +492 -0
- rasa/utils/tensorflow/data_generator.py +440 -0
- rasa/utils/tensorflow/environment.py +161 -0
- rasa/utils/tensorflow/exceptions.py +5 -0
- rasa/utils/tensorflow/feature_array.py +366 -0
- rasa/utils/tensorflow/layers.py +1565 -0
- rasa/utils/tensorflow/layers_utils.py +113 -0
- rasa/utils/tensorflow/metrics.py +281 -0
- rasa/utils/tensorflow/model_data.py +798 -0
- rasa/utils/tensorflow/model_data_utils.py +499 -0
- rasa/utils/tensorflow/models.py +935 -0
- rasa/utils/tensorflow/rasa_layers.py +1094 -0
- rasa/utils/tensorflow/transformer.py +640 -0
- rasa/utils/tensorflow/types.py +6 -0
- rasa/utils/train_utils.py +572 -0
- rasa/utils/url_tools.py +53 -0
- rasa/utils/yaml.py +54 -0
- rasa/validator.py +1644 -0
- rasa/version.py +3 -0
- rasa_pro-3.12.0.dev1.dist-info/METADATA +199 -0
- rasa_pro-3.12.0.dev1.dist-info/NOTICE +5 -0
- rasa_pro-3.12.0.dev1.dist-info/RECORD +790 -0
- rasa_pro-3.12.0.dev1.dist-info/WHEEL +4 -0
- rasa_pro-3.12.0.dev1.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
from sanic import Blueprint, response
|
|
2
|
+
from sanic.request import Request, RequestParameters
|
|
3
|
+
from sanic.response import HTTPResponse
|
|
4
|
+
from twilio.twiml.voice_response import VoiceResponse, Gather
|
|
5
|
+
from typing import Text, Callable, Awaitable, List, Any, Dict, Optional
|
|
6
|
+
from dataclasses import asdict
|
|
7
|
+
|
|
8
|
+
import structlog
|
|
9
|
+
import rasa.utils.io
|
|
10
|
+
import rasa.shared.utils.io
|
|
11
|
+
from rasa.shared.core.events import BotUttered
|
|
12
|
+
from rasa.shared.exceptions import InvalidConfigException
|
|
13
|
+
from rasa.core.channels.channel import (
|
|
14
|
+
InputChannel,
|
|
15
|
+
CollectingOutputChannel,
|
|
16
|
+
UserMessage,
|
|
17
|
+
)
|
|
18
|
+
from rasa.core.channels.voice_ready.utils import CallParameters
|
|
19
|
+
|
|
20
|
+
logger = structlog.get_logger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def map_call_params(form: RequestParameters) -> CallParameters:
|
|
24
|
+
"""Map the Audiocodes parameters to the CallParameters dataclass."""
|
|
25
|
+
return CallParameters(
|
|
26
|
+
call_id=form.get("CallSid"),
|
|
27
|
+
user_phone=form.get("Caller"),
|
|
28
|
+
bot_phone=form.get("Called"),
|
|
29
|
+
direction=form.get("Direction"),
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class TwilioVoiceInput(InputChannel):
|
|
34
|
+
"""Input channel for Twilio Voice."""
|
|
35
|
+
|
|
36
|
+
SUPPORTED_VOICES = [ # noqa: RUF012
|
|
37
|
+
"man",
|
|
38
|
+
"woman",
|
|
39
|
+
"alice",
|
|
40
|
+
"Polly.Mads",
|
|
41
|
+
"Polly.Naja",
|
|
42
|
+
"Polly.Lotte",
|
|
43
|
+
"Polly.Reuben",
|
|
44
|
+
"Polly.Nicole",
|
|
45
|
+
"Polly.Russell",
|
|
46
|
+
"Polly.Amy",
|
|
47
|
+
"Polly.Brian",
|
|
48
|
+
"Polly.Emma",
|
|
49
|
+
"Polly.Amy-Neural",
|
|
50
|
+
"Polly.Emma-Neural",
|
|
51
|
+
"Polly.Brian-Neural",
|
|
52
|
+
"Polly.Raveena",
|
|
53
|
+
"Polly.Ivy",
|
|
54
|
+
"Polly.Joanna",
|
|
55
|
+
"Polly.Joey",
|
|
56
|
+
"Polly.Justin",
|
|
57
|
+
"Polly.Kendra",
|
|
58
|
+
"Polly.Kimberly",
|
|
59
|
+
"Polly.Matthew",
|
|
60
|
+
"Polly.Salli",
|
|
61
|
+
"Polly.Ivy-Neural",
|
|
62
|
+
"Polly.Joanna-Neural",
|
|
63
|
+
"Polly.Kendra-Neural",
|
|
64
|
+
"Polly.Kimberly-Neural",
|
|
65
|
+
"Polly.Sally-Neural",
|
|
66
|
+
"Polly.Joey-Neural",
|
|
67
|
+
"Polly.Justin-Neural",
|
|
68
|
+
"Polly.Matthew-Neural",
|
|
69
|
+
"Polly.Geraint",
|
|
70
|
+
"Polly.Celine",
|
|
71
|
+
"Polly.Mathieu",
|
|
72
|
+
"Polly.Chantal",
|
|
73
|
+
"Polly.Hans",
|
|
74
|
+
"Polly.Marlene",
|
|
75
|
+
"Polly.Vicki",
|
|
76
|
+
"Polly.Dora",
|
|
77
|
+
"Polly.Karl",
|
|
78
|
+
"Polly.Carla",
|
|
79
|
+
"Polly.Giorgio",
|
|
80
|
+
"Polly.Mizuki",
|
|
81
|
+
"Polly.Takumi",
|
|
82
|
+
"Polly.Liv",
|
|
83
|
+
"Polly.Jacek",
|
|
84
|
+
"Polly.Jan",
|
|
85
|
+
"Polly.Ewa",
|
|
86
|
+
"Polly.Maja",
|
|
87
|
+
"Polly.Ricardo",
|
|
88
|
+
"Polly.Vitoria",
|
|
89
|
+
"Polly.Camila-Neural",
|
|
90
|
+
"Polly.Cristiano",
|
|
91
|
+
"Polly.Ines",
|
|
92
|
+
"Polly.Carmen",
|
|
93
|
+
"Polly.Maxim",
|
|
94
|
+
"Polly.Tatyana",
|
|
95
|
+
"Polly.Conchita",
|
|
96
|
+
"Polly.Enrique",
|
|
97
|
+
"Polly.Miguel",
|
|
98
|
+
"Polly.Penelope",
|
|
99
|
+
"Polly.Lupe-Neural",
|
|
100
|
+
"Polly.Astrid",
|
|
101
|
+
"Polly.Filiz",
|
|
102
|
+
"Polly.Gwyneth",
|
|
103
|
+
"Polly.Aditi",
|
|
104
|
+
]
|
|
105
|
+
|
|
106
|
+
SUPPORTED_SPEECH_MODELS = [ # noqa: RUF012
|
|
107
|
+
"default",
|
|
108
|
+
"numbers_and_commands",
|
|
109
|
+
"phone_call",
|
|
110
|
+
]
|
|
111
|
+
|
|
112
|
+
@classmethod
|
|
113
|
+
def name(cls) -> Text:
|
|
114
|
+
"""Name of channel."""
|
|
115
|
+
return "twilio_voice"
|
|
116
|
+
|
|
117
|
+
@classmethod
|
|
118
|
+
def from_credentials(cls, credentials: Optional[Dict[Text, Any]]) -> InputChannel:
|
|
119
|
+
"""Load custom configurations."""
|
|
120
|
+
credentials = credentials or {}
|
|
121
|
+
|
|
122
|
+
return cls(
|
|
123
|
+
credentials.get(
|
|
124
|
+
"reprompt_fallback_phrase",
|
|
125
|
+
"I'm sorry I didn't get that could you rephrase.",
|
|
126
|
+
),
|
|
127
|
+
credentials.get("assistant_voice", "woman"),
|
|
128
|
+
credentials.get("speech_timeout", "5"),
|
|
129
|
+
credentials.get("speech_model", "default"),
|
|
130
|
+
credentials.get("enhanced", "false"),
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
def __init__(
|
|
134
|
+
self,
|
|
135
|
+
reprompt_fallback_phrase: Optional[Text],
|
|
136
|
+
assistant_voice: Optional[Text],
|
|
137
|
+
speech_timeout: Text = "5",
|
|
138
|
+
speech_model: Text = "default",
|
|
139
|
+
enhanced: Text = "false",
|
|
140
|
+
) -> None:
|
|
141
|
+
"""Creates a connection to Twilio voice.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
reprompt_fallback_phrase: phrase to use if no user response.
|
|
145
|
+
assistant_voice: name of the assistant voice to use.
|
|
146
|
+
speech_timeout: how long to pause when user finished speaking.
|
|
147
|
+
speech_model: type of transcription model to use from Twilio.
|
|
148
|
+
enhanced: toggle to use Twilio's premium speech transcription model.
|
|
149
|
+
"""
|
|
150
|
+
self.reprompt_fallback_phrase = reprompt_fallback_phrase
|
|
151
|
+
self.assistant_voice = assistant_voice
|
|
152
|
+
self.speech_timeout = speech_timeout
|
|
153
|
+
self.speech_model = speech_model
|
|
154
|
+
self.enhanced = enhanced
|
|
155
|
+
|
|
156
|
+
self._validate_configuration()
|
|
157
|
+
|
|
158
|
+
def _validate_configuration(self) -> None:
|
|
159
|
+
"""Checks that the user configurations are valid."""
|
|
160
|
+
if self.assistant_voice not in self.SUPPORTED_VOICES:
|
|
161
|
+
self._raise_invalid_voice_exception()
|
|
162
|
+
|
|
163
|
+
try:
|
|
164
|
+
int(self.speech_timeout)
|
|
165
|
+
except ValueError:
|
|
166
|
+
if self.speech_timeout.lower() != "auto":
|
|
167
|
+
self._raise_invalid_speech_timeout_exception()
|
|
168
|
+
|
|
169
|
+
if self.speech_model not in self.SUPPORTED_SPEECH_MODELS:
|
|
170
|
+
self._raise_invalid_speech_model_exception()
|
|
171
|
+
|
|
172
|
+
if self.enhanced.lower() not in [
|
|
173
|
+
"true",
|
|
174
|
+
"false",
|
|
175
|
+
]:
|
|
176
|
+
self._raise_invalid_enhanced_option_exception()
|
|
177
|
+
|
|
178
|
+
if (
|
|
179
|
+
self.enhanced.lower() == "true"
|
|
180
|
+
and self.speech_model.lower() != "phone_call"
|
|
181
|
+
):
|
|
182
|
+
self._raise_invalid_enhanced_speech_model_exception()
|
|
183
|
+
|
|
184
|
+
if (
|
|
185
|
+
self.speech_model.lower() != "numbers_and_commands"
|
|
186
|
+
and self.speech_timeout.lower() == "auto"
|
|
187
|
+
):
|
|
188
|
+
self._raise_invalid_speech_model_timeout_exception()
|
|
189
|
+
|
|
190
|
+
def _raise_invalid_speech_model_timeout_exception(self) -> None:
|
|
191
|
+
"""Raises an error if incompatible speech_timeout and speech_model used."""
|
|
192
|
+
raise InvalidConfigException(
|
|
193
|
+
"If speech_timeout is 'auto' the speech_model must be "
|
|
194
|
+
"'numbers_and_commands'. Please update your speech_model "
|
|
195
|
+
"to be 'numbers_and_commands' if you would like to continue "
|
|
196
|
+
"using the 'auto' speech_model."
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
def _raise_invalid_enhanced_option_exception(self) -> None:
|
|
200
|
+
"""Raises an error if an invalid value is passed to the enhanced parameter."""
|
|
201
|
+
raise InvalidConfigException(
|
|
202
|
+
f"The value {self.enhanced} is invalid for the enhanced parameter. "
|
|
203
|
+
f"You must provide either `true` or `false` for this value."
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
def _raise_invalid_speech_model_exception(self) -> None:
|
|
207
|
+
"""Raises an error if an invalid speech_model is provided."""
|
|
208
|
+
raise InvalidConfigException(
|
|
209
|
+
f"The value {self.speech_model} for speech_model is invalid. "
|
|
210
|
+
f"You must choose one of 'default', 'numbers_and_commands', "
|
|
211
|
+
f"or 'phone_call'. Refer to the documentation for details "
|
|
212
|
+
f"about the selections."
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
def _raise_invalid_speech_timeout_exception(self) -> None:
|
|
216
|
+
"""Raises an error if an invalid speech_timeout is provided."""
|
|
217
|
+
raise InvalidConfigException(
|
|
218
|
+
f"The vale {self.speech_timeout} is an invalid value for speech_timeout. "
|
|
219
|
+
f"Only integers and 'auto' are valid entries."
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
def _raise_invalid_voice_exception(self) -> None:
|
|
223
|
+
"""Raises an error if an invalid voice is provided."""
|
|
224
|
+
raise InvalidConfigException(
|
|
225
|
+
f"The value {self.assistant_voice} is an invalid for assistant_voice. "
|
|
226
|
+
f"Please refer to the documentation for a list of valid voices "
|
|
227
|
+
f"you can use for your voice assistant."
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
def _raise_invalid_enhanced_speech_model_exception(self) -> None:
|
|
231
|
+
"""Raises error if enhanced is used with an incompatible speech_model."""
|
|
232
|
+
raise InvalidConfigException(
|
|
233
|
+
f"If you set enhanced to 'true' then speech_model must be 'phone_call'. "
|
|
234
|
+
f"Current speech_model is: {self.speech_model}."
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
def blueprint(
|
|
238
|
+
self, on_new_message: Callable[[UserMessage], Awaitable[None]]
|
|
239
|
+
) -> Blueprint:
|
|
240
|
+
"""Defines endpoints for Twilio voice channel."""
|
|
241
|
+
twilio_voice_webhook = Blueprint("Twilio_voice_webhook", __name__)
|
|
242
|
+
|
|
243
|
+
@twilio_voice_webhook.route("/", methods=["GET"])
|
|
244
|
+
async def health(request: Request) -> HTTPResponse:
|
|
245
|
+
return response.json({"status": "ok"})
|
|
246
|
+
|
|
247
|
+
@twilio_voice_webhook.route("/webhook", methods=["POST"])
|
|
248
|
+
async def receive(request: Request) -> HTTPResponse:
|
|
249
|
+
sender_id = request.form.get("From")
|
|
250
|
+
text = request.form.get("SpeechResult")
|
|
251
|
+
input_channel = self.name()
|
|
252
|
+
call_status = request.form.get("CallStatus")
|
|
253
|
+
metadata = {}
|
|
254
|
+
|
|
255
|
+
collector = TwilioVoiceCollectingOutputChannel()
|
|
256
|
+
|
|
257
|
+
logger.debug(
|
|
258
|
+
"twilio_voice.webhook",
|
|
259
|
+
sender_id=sender_id,
|
|
260
|
+
text=text,
|
|
261
|
+
call_status=call_status,
|
|
262
|
+
)
|
|
263
|
+
# Provide an initial greeting to answer the user's call.
|
|
264
|
+
if (text is None) and (call_status == "ringing"):
|
|
265
|
+
text = "/session_start"
|
|
266
|
+
metadata = asdict(map_call_params(request.form))
|
|
267
|
+
|
|
268
|
+
# when call is disconnected
|
|
269
|
+
if call_status == "completed":
|
|
270
|
+
text = "/session_end"
|
|
271
|
+
metadata = {"reason": "user disconnected"}
|
|
272
|
+
|
|
273
|
+
# determine the response.
|
|
274
|
+
if text is not None:
|
|
275
|
+
logger.info("twilio_voice.webhook.text_not_none", sender_id=sender_id)
|
|
276
|
+
await on_new_message(
|
|
277
|
+
UserMessage(
|
|
278
|
+
text,
|
|
279
|
+
collector,
|
|
280
|
+
sender_id,
|
|
281
|
+
input_channel=input_channel,
|
|
282
|
+
metadata=metadata,
|
|
283
|
+
)
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
twilio_response = self._build_twilio_voice_response(collector.messages)
|
|
287
|
+
# If the user doesn't respond resend the last message.
|
|
288
|
+
else:
|
|
289
|
+
logger.info("twilio_voice.webhook.text_none", sender_id=sender_id)
|
|
290
|
+
# Get last user utterance from tracker.
|
|
291
|
+
tracker = await request.app.ctx.agent.tracker_store.retrieve(sender_id)
|
|
292
|
+
last_response = None
|
|
293
|
+
if tracker:
|
|
294
|
+
last_response = next(
|
|
295
|
+
(
|
|
296
|
+
e
|
|
297
|
+
for e in reversed(tracker.events)
|
|
298
|
+
if isinstance(e, BotUttered)
|
|
299
|
+
),
|
|
300
|
+
None,
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
# If no previous utterance found use the reprompt_fallback phrase.
|
|
304
|
+
if last_response is None:
|
|
305
|
+
last_response_text = self.reprompt_fallback_phrase
|
|
306
|
+
else:
|
|
307
|
+
last_response_text = last_response.text
|
|
308
|
+
|
|
309
|
+
twilio_response = self._build_twilio_voice_response(
|
|
310
|
+
[{"text": last_response_text}]
|
|
311
|
+
)
|
|
312
|
+
return response.text(str(twilio_response), content_type="text/xml")
|
|
313
|
+
|
|
314
|
+
return twilio_voice_webhook
|
|
315
|
+
|
|
316
|
+
def _build_twilio_voice_response(
|
|
317
|
+
self, messages: List[Dict[Text, Any]]
|
|
318
|
+
) -> VoiceResponse:
|
|
319
|
+
"""Builds the Twilio Voice Response object."""
|
|
320
|
+
logger.debug("twilio_voice.build_twilio_voice_response", messages=messages)
|
|
321
|
+
voice_response = VoiceResponse()
|
|
322
|
+
gather = Gather(
|
|
323
|
+
input="speech",
|
|
324
|
+
action=f"/webhooks/{self.name()}/webhook",
|
|
325
|
+
actionOnEmptyResult=True,
|
|
326
|
+
speechTimeout=self.speech_timeout,
|
|
327
|
+
speechModel=self.speech_model,
|
|
328
|
+
enhanced=self.enhanced,
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
# Add pauses between messages.
|
|
332
|
+
# Add a listener to the last message to listen for user response.
|
|
333
|
+
for i, message in enumerate(messages):
|
|
334
|
+
msg_text = message["text"]
|
|
335
|
+
# Check if the message is a hangup message.
|
|
336
|
+
if message.get("custom", {}).get("hangup"):
|
|
337
|
+
voice_response.hangup()
|
|
338
|
+
break
|
|
339
|
+
|
|
340
|
+
if i + 1 == len(messages):
|
|
341
|
+
gather.say(msg_text, voice=self.assistant_voice)
|
|
342
|
+
voice_response.append(gather)
|
|
343
|
+
else:
|
|
344
|
+
voice_response.say(msg_text, voice=self.assistant_voice)
|
|
345
|
+
voice_response.pause(length=1)
|
|
346
|
+
|
|
347
|
+
return voice_response
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
class TwilioVoiceCollectingOutputChannel(CollectingOutputChannel):
|
|
351
|
+
"""Output channel that collects send messages in a list.
|
|
352
|
+
|
|
353
|
+
(doesn't send them anywhere, just collects them).
|
|
354
|
+
"""
|
|
355
|
+
|
|
356
|
+
@classmethod
|
|
357
|
+
def name(cls) -> Text:
|
|
358
|
+
"""Name of the output channel."""
|
|
359
|
+
return "twilio_voice"
|
|
360
|
+
|
|
361
|
+
async def send_text_message(
|
|
362
|
+
self, recipient_id: Text, text: Text, **kwargs: Any
|
|
363
|
+
) -> None:
|
|
364
|
+
"""Sends the text message after removing emojis."""
|
|
365
|
+
text = rasa.utils.io.remove_emojis(text)
|
|
366
|
+
for message_part in text.strip().split("\n\n"):
|
|
367
|
+
await self._persist_message(self._message(recipient_id, text=message_part))
|
|
368
|
+
|
|
369
|
+
async def send_text_with_buttons(
|
|
370
|
+
self,
|
|
371
|
+
recipient_id: str,
|
|
372
|
+
text: str,
|
|
373
|
+
buttons: List[Dict[str, Any]],
|
|
374
|
+
**kwargs: Any,
|
|
375
|
+
) -> None:
|
|
376
|
+
"""Uses the concise button output format for voice channels."""
|
|
377
|
+
await self.send_text_with_buttons_concise(recipient_id, text, buttons, **kwargs)
|
|
378
|
+
|
|
379
|
+
async def send_image_url(
|
|
380
|
+
self, recipient_id: Text, image: Text, **kwargs: Any
|
|
381
|
+
) -> None:
|
|
382
|
+
"""For voice channel do not send images."""
|
|
383
|
+
rasa.shared.utils.io.raise_warning(
|
|
384
|
+
"An image was removed from the voice message and "
|
|
385
|
+
"only the text of message was sent. "
|
|
386
|
+
"It's recommended that you define voice-friendly "
|
|
387
|
+
"alternatives for all responses "
|
|
388
|
+
"with a visual elements such as images and emojis "
|
|
389
|
+
"that are used in your voice channel."
|
|
390
|
+
)
|
|
391
|
+
|
|
392
|
+
async def hangup(self, recipient_id: Text, **kwargs: Any) -> None:
|
|
393
|
+
"""
|
|
394
|
+
Indicate that the conversation should be ended.
|
|
395
|
+
|
|
396
|
+
Parent class is a collecting output channel, so we don't actually hang up
|
|
397
|
+
but we add a custom message to the list of messages to be sent.
|
|
398
|
+
This message will be picked up by _build_twilio_voice_response
|
|
399
|
+
which will hang up the call.
|
|
400
|
+
"""
|
|
401
|
+
await self._persist_message(
|
|
402
|
+
self._message(recipient_id, custom={"hangup": True})
|
|
403
|
+
)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import structlog
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
structlogger = structlog.get_logger()
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def validate_voice_license_scope() -> None:
|
|
10
|
+
from rasa.utils.licensing import (
|
|
11
|
+
PRODUCT_AREA,
|
|
12
|
+
VOICE_SCOPE,
|
|
13
|
+
validate_license_from_env,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
"""Validate that the correct license scope is present."""
|
|
17
|
+
structlogger.info(
|
|
18
|
+
f"Validating current Rasa Pro license scope which must include "
|
|
19
|
+
f"the '{VOICE_SCOPE}' scope to use the voice channel."
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
voice_product_scope = PRODUCT_AREA + " " + VOICE_SCOPE
|
|
23
|
+
validate_license_from_env(product_area=voice_product_scope)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclass
|
|
27
|
+
class CallParameters:
|
|
28
|
+
"""Standardized call parameters for voice channels."""
|
|
29
|
+
|
|
30
|
+
call_id: str
|
|
31
|
+
user_phone: str
|
|
32
|
+
bot_phone: str
|
|
33
|
+
user_name: Optional[str] = None
|
|
34
|
+
user_host: Optional[str] = None
|
|
35
|
+
bot_host: Optional[str] = None
|
|
36
|
+
direction: Optional[str] = None
|
|
37
|
+
stream_id: Optional[str] = None
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import (
|
|
3
|
+
Dict,
|
|
4
|
+
AsyncIterator,
|
|
5
|
+
Any,
|
|
6
|
+
Generic,
|
|
7
|
+
Optional,
|
|
8
|
+
Tuple,
|
|
9
|
+
Type,
|
|
10
|
+
TypeVar,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
from websockets.legacy.client import WebSocketClientProtocol
|
|
14
|
+
|
|
15
|
+
from rasa.core.channels.voice_stream.asr.asr_event import ASREvent
|
|
16
|
+
from rasa.core.channels.voice_stream.audio_bytes import RasaAudioBytes
|
|
17
|
+
from rasa.core.channels.voice_stream.util import MergeableConfig
|
|
18
|
+
from rasa.shared.exceptions import ConnectionException
|
|
19
|
+
from rasa.shared.utils.common import validate_environment
|
|
20
|
+
|
|
21
|
+
T = TypeVar("T", bound="ASREngineConfig")
|
|
22
|
+
E = TypeVar("E", bound="ASREngine")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass
|
|
26
|
+
class ASREngineConfig(MergeableConfig):
|
|
27
|
+
pass
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ASREngine(Generic[T]):
|
|
31
|
+
required_env_vars: Tuple[str, ...] = ()
|
|
32
|
+
required_packages: Tuple[str, ...] = ()
|
|
33
|
+
|
|
34
|
+
def __init__(self, config: Optional[T] = None):
|
|
35
|
+
self.config = self.get_default_config().merge(config)
|
|
36
|
+
self.asr_socket: Optional[WebSocketClientProtocol] = None
|
|
37
|
+
validate_environment(
|
|
38
|
+
self.required_env_vars,
|
|
39
|
+
self.required_packages,
|
|
40
|
+
f"ASR Engine {self.__class__.__name__}",
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
async def connect(self) -> None:
|
|
44
|
+
self.asr_socket = await self.open_websocket_connection()
|
|
45
|
+
|
|
46
|
+
async def open_websocket_connection(self) -> WebSocketClientProtocol:
|
|
47
|
+
"""Connect to the ASR system."""
|
|
48
|
+
raise NotImplementedError
|
|
49
|
+
|
|
50
|
+
@classmethod
|
|
51
|
+
def from_config_dict(cls: Type[E], config: Dict) -> E:
|
|
52
|
+
raise NotImplementedError
|
|
53
|
+
|
|
54
|
+
async def close_connection(self) -> None:
|
|
55
|
+
if self.asr_socket:
|
|
56
|
+
await self.asr_socket.close()
|
|
57
|
+
|
|
58
|
+
async def signal_audio_done(self) -> None:
|
|
59
|
+
"""Signal to the ASR Api that you are done sending data."""
|
|
60
|
+
raise NotImplementedError
|
|
61
|
+
|
|
62
|
+
async def send_audio_chunks(self, chunk: RasaAudioBytes) -> None:
|
|
63
|
+
"""Send audio chunks to the ASR system via the websocket."""
|
|
64
|
+
if self.asr_socket is None:
|
|
65
|
+
raise ConnectionException("Websocket not connected.")
|
|
66
|
+
engine_bytes = self.rasa_audio_bytes_to_engine_bytes(chunk)
|
|
67
|
+
await self.asr_socket.send(engine_bytes)
|
|
68
|
+
|
|
69
|
+
def rasa_audio_bytes_to_engine_bytes(self, chunk: RasaAudioBytes) -> bytes:
|
|
70
|
+
"""Convert RasaAudioBytes to bytes usable by this engine."""
|
|
71
|
+
raise NotImplementedError
|
|
72
|
+
|
|
73
|
+
async def stream_asr_events(self) -> AsyncIterator[ASREvent]:
|
|
74
|
+
"""Stream the events returned by the ASR system as it is fed audio bytes."""
|
|
75
|
+
if self.asr_socket is None:
|
|
76
|
+
raise ConnectionException("Websocket not connected.")
|
|
77
|
+
async for message in self.asr_socket:
|
|
78
|
+
asr_event = self.engine_event_to_asr_event(message)
|
|
79
|
+
if asr_event:
|
|
80
|
+
yield asr_event
|
|
81
|
+
|
|
82
|
+
def engine_event_to_asr_event(self, e: Any) -> Optional[ASREvent]:
|
|
83
|
+
"""Translate an engine event to a common ASREvent."""
|
|
84
|
+
raise NotImplementedError
|
|
85
|
+
|
|
86
|
+
@staticmethod
|
|
87
|
+
def get_default_config() -> T:
|
|
88
|
+
"""Get the default config for this component."""
|
|
89
|
+
raise NotImplementedError
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
@dataclass
|
|
5
|
+
class ASREvent:
|
|
6
|
+
@classmethod
|
|
7
|
+
def name(cls) -> str:
|
|
8
|
+
return cls.__name__
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclass
|
|
12
|
+
class NewTranscript(ASREvent):
|
|
13
|
+
text: str
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class UserIsSpeaking(ASREvent):
|
|
18
|
+
pass
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import Any, Dict, Optional, AsyncIterator
|
|
4
|
+
import asyncio
|
|
5
|
+
|
|
6
|
+
from rasa.core.channels.voice_stream.asr.asr_engine import ASREngine, ASREngineConfig
|
|
7
|
+
from rasa.core.channels.voice_stream.asr.asr_event import (
|
|
8
|
+
ASREvent,
|
|
9
|
+
NewTranscript,
|
|
10
|
+
UserIsSpeaking,
|
|
11
|
+
)
|
|
12
|
+
from rasa.core.channels.voice_stream.audio_bytes import HERTZ, RasaAudioBytes
|
|
13
|
+
from rasa.shared.constants import AZURE_SPEECH_API_KEY_ENV_VAR
|
|
14
|
+
from rasa.shared.exceptions import ConnectionException
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class AzureASRConfig(ASREngineConfig):
|
|
19
|
+
language: Optional[str] = None
|
|
20
|
+
speech_region: Optional[str] = None
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class AzureASR(ASREngine[AzureASRConfig]):
|
|
24
|
+
required_env_vars = (AZURE_SPEECH_API_KEY_ENV_VAR,)
|
|
25
|
+
required_packages = ("azure.cognitiveservices.speech",)
|
|
26
|
+
|
|
27
|
+
def __init__(self, config: Optional[AzureASRConfig] = None):
|
|
28
|
+
super().__init__(config)
|
|
29
|
+
|
|
30
|
+
import azure.cognitiveservices.speech as speechsdk
|
|
31
|
+
|
|
32
|
+
self.speech_recognizer: Optional[speechsdk.SpeechRecognizer] = None
|
|
33
|
+
self.stream: Optional[speechsdk.audio.PushAudioInputStream] = None
|
|
34
|
+
self.is_recognizing = False
|
|
35
|
+
self.queue: asyncio.Queue[speechsdk.SpeechRecognitionEventArgs] = (
|
|
36
|
+
asyncio.Queue()
|
|
37
|
+
)
|
|
38
|
+
self.main_loop = asyncio.get_running_loop()
|
|
39
|
+
|
|
40
|
+
def signal_user_is_speaking(self, event: Any) -> None:
|
|
41
|
+
"""Replace the azure event with a generic is speaking event."""
|
|
42
|
+
self.fill_queue(UserIsSpeaking())
|
|
43
|
+
|
|
44
|
+
def fill_queue(self, event: Any) -> None:
|
|
45
|
+
"""Either puts the event or a dedicated ASR Event into the queue."""
|
|
46
|
+
# This function is used by call backs of the azure speech library
|
|
47
|
+
# which seems to run separate threads/processes
|
|
48
|
+
# To properly wake up the task waiting at queue.get, we need to
|
|
49
|
+
# put to the queue in the same event loop
|
|
50
|
+
self.main_loop.call_soon_threadsafe(self.queue.put_nowait, event)
|
|
51
|
+
|
|
52
|
+
async def connect(self) -> None:
|
|
53
|
+
import azure.cognitiveservices.speech as speechsdk
|
|
54
|
+
|
|
55
|
+
speech_config = speechsdk.SpeechConfig(
|
|
56
|
+
subscription=os.environ[AZURE_SPEECH_API_KEY_ENV_VAR],
|
|
57
|
+
region=self.config.speech_region,
|
|
58
|
+
)
|
|
59
|
+
audio_format = speechsdk.audio.AudioStreamFormat(
|
|
60
|
+
samples_per_second=HERTZ,
|
|
61
|
+
bits_per_sample=8,
|
|
62
|
+
channels=1,
|
|
63
|
+
wave_stream_format=speechsdk.AudioStreamWaveFormat.MULAW,
|
|
64
|
+
)
|
|
65
|
+
self.stream = speechsdk.audio.PushAudioInputStream(stream_format=audio_format)
|
|
66
|
+
audio_config = speechsdk.audio.AudioConfig(stream=self.stream)
|
|
67
|
+
self.speech_recognizer = speechsdk.SpeechRecognizer(
|
|
68
|
+
speech_config=speech_config,
|
|
69
|
+
language=self.config.language,
|
|
70
|
+
audio_config=audio_config,
|
|
71
|
+
)
|
|
72
|
+
self.speech_recognizer.recognized.connect(self.fill_queue)
|
|
73
|
+
self.speech_recognizer.recognizing.connect(self.signal_user_is_speaking)
|
|
74
|
+
self.speech_recognizer.start_continuous_recognition_async()
|
|
75
|
+
self.is_recognizing = True
|
|
76
|
+
|
|
77
|
+
async def close_connection(self) -> None:
|
|
78
|
+
if self.speech_recognizer is None:
|
|
79
|
+
raise ConnectionException("Websocket not connected.")
|
|
80
|
+
self.speech_recognizer.stop_continuous_recognition_async()
|
|
81
|
+
|
|
82
|
+
async def signal_audio_done(self) -> None:
|
|
83
|
+
"""Signal to the ASR Api that you are done sending data."""
|
|
84
|
+
self.is_recognizing = False
|
|
85
|
+
|
|
86
|
+
def rasa_audio_bytes_to_engine_bytes(self, chunk: RasaAudioBytes) -> bytes:
|
|
87
|
+
"""Convert RasaAudioBytes to bytes usable by this engine."""
|
|
88
|
+
return chunk
|
|
89
|
+
|
|
90
|
+
async def send_audio_chunks(self, chunk: RasaAudioBytes) -> None:
|
|
91
|
+
"""Send audio chunks to the ASR system via the websocket."""
|
|
92
|
+
if self.speech_recognizer is None or self.stream is None:
|
|
93
|
+
raise ConnectionException("ASR not connected.")
|
|
94
|
+
engine_bytes = self.rasa_audio_bytes_to_engine_bytes(chunk)
|
|
95
|
+
self.stream.write(engine_bytes)
|
|
96
|
+
|
|
97
|
+
async def stream_asr_events(self) -> AsyncIterator[ASREvent]:
|
|
98
|
+
"""Stream the events returned by the ASR system as it is fed audio bytes."""
|
|
99
|
+
if self.speech_recognizer is None:
|
|
100
|
+
raise ConnectionException("Websocket not connected.")
|
|
101
|
+
while self.is_recognizing or not self.queue.empty():
|
|
102
|
+
try:
|
|
103
|
+
message = await asyncio.wait_for(self.queue.get(), timeout=2)
|
|
104
|
+
asr_event = self.engine_event_to_asr_event(message)
|
|
105
|
+
if asr_event:
|
|
106
|
+
yield asr_event
|
|
107
|
+
except asyncio.TimeoutError:
|
|
108
|
+
pass
|
|
109
|
+
|
|
110
|
+
def engine_event_to_asr_event(self, e: Any) -> Optional[ASREvent]:
|
|
111
|
+
"""Translate an engine event to a common ASREvent."""
|
|
112
|
+
import azure.cognitiveservices.speech as speechsdk
|
|
113
|
+
|
|
114
|
+
if isinstance(e, speechsdk.SpeechRecognitionEventArgs) and isinstance(
|
|
115
|
+
e.result, speechsdk.SpeechRecognitionResult
|
|
116
|
+
):
|
|
117
|
+
return NewTranscript(e.result.text)
|
|
118
|
+
if isinstance(e, ASREvent):
|
|
119
|
+
# transformation happened before
|
|
120
|
+
return e
|
|
121
|
+
|
|
122
|
+
return None
|
|
123
|
+
|
|
124
|
+
@staticmethod
|
|
125
|
+
def get_default_config() -> AzureASRConfig:
|
|
126
|
+
return AzureASRConfig("en-US", "germanywestcentral")
|
|
127
|
+
|
|
128
|
+
@classmethod
|
|
129
|
+
def from_config_dict(cls, config: Dict) -> "AzureASR":
|
|
130
|
+
return AzureASR(AzureASRConfig.from_dict(config))
|