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,735 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
import typing
|
|
5
|
+
from collections import defaultdict
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from typing import Optional, Set, Text, List
|
|
8
|
+
|
|
9
|
+
from rasa.shared.constants import (
|
|
10
|
+
RASA_DEFAULT_FLOW_PATTERN_PREFIX,
|
|
11
|
+
RASA_PATTERN_HUMAN_HANDOFF,
|
|
12
|
+
)
|
|
13
|
+
from rasa.shared.constants import (
|
|
14
|
+
RASA_PATTERN_INTERNAL_ERROR,
|
|
15
|
+
)
|
|
16
|
+
from rasa.shared.core.flows.flow import Flow
|
|
17
|
+
from rasa.shared.core.flows.flow_step import (
|
|
18
|
+
FlowStep,
|
|
19
|
+
)
|
|
20
|
+
from rasa.shared.core.flows.flow_step_links import (
|
|
21
|
+
BranchingFlowStepLink,
|
|
22
|
+
IfFlowStepLink,
|
|
23
|
+
ElseFlowStepLink,
|
|
24
|
+
)
|
|
25
|
+
from rasa.shared.core.flows.flow_step_sequence import FlowStepSequence
|
|
26
|
+
from rasa.shared.core.flows.steps.call import CallFlowStep
|
|
27
|
+
from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
|
|
28
|
+
from rasa.shared.core.flows.steps.constants import CONTINUE_STEP_PREFIX, DEFAULT_STEPS
|
|
29
|
+
from rasa.shared.core.flows.steps.link import LinkFlowStep
|
|
30
|
+
from rasa.shared.core.flows.steps.set_slots import SetSlotsFlowStep
|
|
31
|
+
from rasa.shared.core.flows.utils import (
|
|
32
|
+
warn_deprecated_collect_step_config,
|
|
33
|
+
get_duplicate_slot_persistence_config_error_message,
|
|
34
|
+
get_invalid_slot_persistence_config_error_message,
|
|
35
|
+
)
|
|
36
|
+
from rasa.shared.exceptions import RasaException
|
|
37
|
+
|
|
38
|
+
if typing.TYPE_CHECKING:
|
|
39
|
+
from rasa.shared.core.flows.flows_list import FlowsList
|
|
40
|
+
|
|
41
|
+
FLOW_ID_REGEX = r"""^[a-zA-Z0-9_][a-zA-Z0-9_-]*?$"""
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class UnreachableFlowStepException(RasaException):
|
|
45
|
+
"""Raised when a flow step is unreachable."""
|
|
46
|
+
|
|
47
|
+
def __init__(self, step_id: str, flow_id: str) -> None:
|
|
48
|
+
"""Initializes the exception."""
|
|
49
|
+
self.step_id = step_id
|
|
50
|
+
self.flow_id = flow_id
|
|
51
|
+
|
|
52
|
+
def __str__(self) -> str:
|
|
53
|
+
"""Return a string representation of the exception."""
|
|
54
|
+
return (
|
|
55
|
+
f"Step '{self.step_id}' in flow '{self.flow_id}' can not be reached "
|
|
56
|
+
f"from the start step. Please make sure that all steps can be reached "
|
|
57
|
+
f"from the start step, e.g. by "
|
|
58
|
+
f"checking that another step points to this step."
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class MissingNextLinkException(RasaException):
|
|
63
|
+
"""Raised when a flow step is missing a next link."""
|
|
64
|
+
|
|
65
|
+
def __init__(self, step_id: str, flow_id: str) -> None:
|
|
66
|
+
"""Initializes the exception."""
|
|
67
|
+
self.step_id = step_id
|
|
68
|
+
self.flow_id = flow_id
|
|
69
|
+
|
|
70
|
+
def __str__(self) -> str:
|
|
71
|
+
"""Return a string representation of the exception."""
|
|
72
|
+
return (
|
|
73
|
+
f"Step '{self.step_id}' in flow '{self.flow_id}' is missing a `next`. "
|
|
74
|
+
f"As a last step of a branch, it is required to have one. "
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class ReservedFlowStepIdException(RasaException):
|
|
79
|
+
"""Raised when a flow step is using a reserved id."""
|
|
80
|
+
|
|
81
|
+
def __init__(self, step_id: str, flow_id: str) -> None:
|
|
82
|
+
"""Initializes the exception."""
|
|
83
|
+
self.step_id = step_id
|
|
84
|
+
self.flow_id = flow_id
|
|
85
|
+
|
|
86
|
+
def __str__(self) -> str:
|
|
87
|
+
"""Return a string representation of the exception."""
|
|
88
|
+
return (
|
|
89
|
+
f"Step '{self.step_id}' in flow '{self.flow_id}' is using the reserved id "
|
|
90
|
+
f"'{self.step_id}'. Please use a different id for your step."
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class DuplicatedStepIdException(RasaException):
|
|
95
|
+
"""Raised when a flow step is using the same id as another step."""
|
|
96
|
+
|
|
97
|
+
def __init__(self, step_id: str, flow_id: str) -> None:
|
|
98
|
+
"""Initializes the exception."""
|
|
99
|
+
self.step_id = step_id
|
|
100
|
+
self.flow_id = flow_id
|
|
101
|
+
|
|
102
|
+
def __str__(self) -> str:
|
|
103
|
+
"""Return a string representation of the exception."""
|
|
104
|
+
return (
|
|
105
|
+
f"Step '{self.step_id}' in flow '{self.flow_id}' is using the same id as "
|
|
106
|
+
f"another step. Step ids must be unique across all steps of a flow. "
|
|
107
|
+
f"Please use a different id for your step."
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class DuplicatedFlowIdException(RasaException):
|
|
112
|
+
"""Raised when a flow is using the same id as another flow."""
|
|
113
|
+
|
|
114
|
+
def __init__(
|
|
115
|
+
self, flow_id: str, first_file_path: str, second_file_path: str
|
|
116
|
+
) -> None:
|
|
117
|
+
"""Initializes the exception."""
|
|
118
|
+
self.flow_id = flow_id
|
|
119
|
+
self.first_file_path = first_file_path
|
|
120
|
+
self.second_file_path = second_file_path
|
|
121
|
+
|
|
122
|
+
def __str__(self) -> str:
|
|
123
|
+
"""Return a string representation of the exception."""
|
|
124
|
+
if self.first_file_path == self.second_file_path:
|
|
125
|
+
return (
|
|
126
|
+
f"Flow '{self.flow_id}' is used twice in `{self.first_file_path}`. "
|
|
127
|
+
f"Please make sure flow IDs are unique across all files."
|
|
128
|
+
)
|
|
129
|
+
return (
|
|
130
|
+
f"Flow '{self.flow_id}' is used in both "
|
|
131
|
+
f"`{self.first_file_path}` and `{self.second_file_path}`. "
|
|
132
|
+
f"Please make sure flow IDs are unique across all files."
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
class MissingElseBranchException(RasaException):
|
|
137
|
+
"""Raised when a flow step is missing an else branch."""
|
|
138
|
+
|
|
139
|
+
def __init__(self, step_id: str, flow_id: str) -> None:
|
|
140
|
+
"""Initializes the exception."""
|
|
141
|
+
self.step_id = step_id
|
|
142
|
+
self.flow_id = flow_id
|
|
143
|
+
|
|
144
|
+
def __str__(self) -> str:
|
|
145
|
+
"""Return a string representation of the exception."""
|
|
146
|
+
return (
|
|
147
|
+
f"Step '{self.step_id}' in flow '{self.flow_id}' is missing an `else` "
|
|
148
|
+
f"branch. If a steps `next` statement contains an `if` it always "
|
|
149
|
+
f"also needs an `else` branch. Please add the missing `else` branch."
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class NoNextAllowedForLinkException(RasaException):
|
|
154
|
+
"""Raised when a flow step has a next link but is not allowed to have one."""
|
|
155
|
+
|
|
156
|
+
def __init__(self, step_id: str, flow_id: str) -> None:
|
|
157
|
+
"""Initializes the exception."""
|
|
158
|
+
self.step_id = step_id
|
|
159
|
+
self.flow_id = flow_id
|
|
160
|
+
|
|
161
|
+
def __str__(self) -> str:
|
|
162
|
+
"""Return a string representation of the exception."""
|
|
163
|
+
return (
|
|
164
|
+
f"Link step '{self.step_id}' in flow '{self.flow_id}' has a `next` but "
|
|
165
|
+
f"as a link step is not allowed to have one."
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
class ReferenceToPatternException(RasaException):
|
|
170
|
+
"""Raised when a flow step is referencing a pattern, which is not allowed."""
|
|
171
|
+
|
|
172
|
+
def __init__(
|
|
173
|
+
self, referenced_pattern: str, flow_id: str, step_id: str, call_step: bool
|
|
174
|
+
) -> None:
|
|
175
|
+
"""Initializes the exception."""
|
|
176
|
+
self.step_id = step_id
|
|
177
|
+
self.flow_id = flow_id
|
|
178
|
+
self.referenced_pattern = referenced_pattern
|
|
179
|
+
self.call_step = call_step
|
|
180
|
+
|
|
181
|
+
def __str__(self) -> str:
|
|
182
|
+
"""Return a string representation of the exception."""
|
|
183
|
+
message = (
|
|
184
|
+
f"Step '{self.step_id}' in flow '{self.flow_id}' is referencing a "
|
|
185
|
+
f"pattern '{self.referenced_pattern}', which is not allowed. "
|
|
186
|
+
)
|
|
187
|
+
if self.call_step:
|
|
188
|
+
return message + "Patterns can not be used as a target for a call step."
|
|
189
|
+
else:
|
|
190
|
+
return message + (
|
|
191
|
+
"All patterns, except for 'pattern_human_handoff', can "
|
|
192
|
+
"not be used as a target for a link step."
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
class PatternReferencedPatternException(RasaException):
|
|
197
|
+
"""Raised when a pattern is referencing a pattern, which is not allowed."""
|
|
198
|
+
|
|
199
|
+
def __init__(self, flow_id: str, step_id: str, call_step: bool) -> None:
|
|
200
|
+
"""Initializes the exception."""
|
|
201
|
+
self.step_id = step_id
|
|
202
|
+
self.flow_id = flow_id
|
|
203
|
+
self.call_step = call_step
|
|
204
|
+
|
|
205
|
+
def __str__(self) -> str:
|
|
206
|
+
"""Return a string representation of the exception."""
|
|
207
|
+
message = (
|
|
208
|
+
f"Step '{self.step_id}' in pattern '{self.flow_id}' is referencing a "
|
|
209
|
+
f"pattern which is not allowed. "
|
|
210
|
+
)
|
|
211
|
+
if self.call_step:
|
|
212
|
+
return message + "Patterns can not use call steps to other patterns."
|
|
213
|
+
else:
|
|
214
|
+
return message + (
|
|
215
|
+
"Patterns can not use link steps to other patterns. "
|
|
216
|
+
"Exception: patterns can link to 'pattern_human_handoff'."
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
class PatternReferencedFlowException(RasaException):
|
|
221
|
+
"""Raised when a pattern is referencing a flow, which is not allowed."""
|
|
222
|
+
|
|
223
|
+
def __init__(self, flow_id: str, step_id: str, call_step: bool) -> None:
|
|
224
|
+
"""Initializes the exception."""
|
|
225
|
+
self.step_id = step_id
|
|
226
|
+
self.flow_id = flow_id
|
|
227
|
+
self.call_step = call_step
|
|
228
|
+
|
|
229
|
+
def __str__(self) -> str:
|
|
230
|
+
"""Return a string representation of the exception."""
|
|
231
|
+
message = (
|
|
232
|
+
f"Step '{self.step_id}' in pattern '{self.flow_id}' is referencing a flow "
|
|
233
|
+
f"which is not allowed. "
|
|
234
|
+
)
|
|
235
|
+
if self.call_step:
|
|
236
|
+
return message + "Patterns can not use call steps."
|
|
237
|
+
else:
|
|
238
|
+
return message + (
|
|
239
|
+
"'pattern_internal_error' can not use link steps to user flows."
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
class NoLinkAllowedInCalledFlowException(RasaException):
|
|
244
|
+
"""Raised when a flow is called from another flow but is also using a link."""
|
|
245
|
+
|
|
246
|
+
def __init__(self, step_id: str, flow_id: str, called_flow_id: str) -> None:
|
|
247
|
+
"""Initializes the exception."""
|
|
248
|
+
self.step_id = step_id
|
|
249
|
+
self.flow_id = flow_id
|
|
250
|
+
self.called_flow_id = called_flow_id
|
|
251
|
+
|
|
252
|
+
def __str__(self) -> str:
|
|
253
|
+
"""Return a string representation of the exception."""
|
|
254
|
+
return (
|
|
255
|
+
f"Flow '{self.flow_id}' is calling another flow (call step). "
|
|
256
|
+
f"The flow that is getting called ('{self.called_flow_id}') is "
|
|
257
|
+
f"using a link step, which is not allowed. "
|
|
258
|
+
f"Either this flow can not be called or the link step in {self.step_id} "
|
|
259
|
+
f"needs to be removed."
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
class UnresolvedFlowException(RasaException):
|
|
264
|
+
"""Raised when a flow is called or linked from another flow but doesn't exist."""
|
|
265
|
+
|
|
266
|
+
def __init__(self, flow_id: str, calling_flow_id: str, step_id: str) -> None:
|
|
267
|
+
"""Initializes the exception."""
|
|
268
|
+
self.flow_id = flow_id
|
|
269
|
+
self.calling_flow_id = calling_flow_id
|
|
270
|
+
self.step_id = step_id
|
|
271
|
+
|
|
272
|
+
def __str__(self) -> str:
|
|
273
|
+
"""Return a string representation of the exception."""
|
|
274
|
+
return (
|
|
275
|
+
f"Flow '{self.flow_id}' is called or linked from flow "
|
|
276
|
+
f"'{self.calling_flow_id}' in step '{self.step_id}', "
|
|
277
|
+
f"but it doesn't exist. "
|
|
278
|
+
f"Please make sure that a flow with id '{self.flow_id}' exists."
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
class UnresolvedFlowStepIdException(RasaException):
|
|
283
|
+
"""Raised when a flow step is referenced, but its id can not be resolved."""
|
|
284
|
+
|
|
285
|
+
def __init__(
|
|
286
|
+
self, step_id: str, flow_id: str, referenced_from_step_id: Optional[str]
|
|
287
|
+
) -> None:
|
|
288
|
+
"""Initializes the exception."""
|
|
289
|
+
self.step_id = step_id
|
|
290
|
+
self.flow_id = flow_id
|
|
291
|
+
self.referenced_from_step_id = referenced_from_step_id
|
|
292
|
+
|
|
293
|
+
def __str__(self) -> str:
|
|
294
|
+
"""Return a string representation of the exception."""
|
|
295
|
+
if self.referenced_from_step_id:
|
|
296
|
+
exception_message = (
|
|
297
|
+
f"Step with id '{self.step_id}' could not be resolved. "
|
|
298
|
+
f"'Step '{self.referenced_from_step_id}' in flow '{self.flow_id}' "
|
|
299
|
+
f"referenced this step but it does not exist. "
|
|
300
|
+
)
|
|
301
|
+
else:
|
|
302
|
+
exception_message = (
|
|
303
|
+
f"Step '{self.step_id}' in flow '{self.flow_id}' can not be resolved. "
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
return exception_message + (
|
|
307
|
+
"Please make sure that the step is defined in the same flow."
|
|
308
|
+
)
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
class EmptyStepSequenceException(RasaException):
|
|
312
|
+
"""Raised when an empty step sequence is encountered."""
|
|
313
|
+
|
|
314
|
+
def __init__(self, flow_id: str, step_id: str) -> None:
|
|
315
|
+
"""Initializes the exception."""
|
|
316
|
+
self.flow_id = flow_id
|
|
317
|
+
self.step_id = step_id
|
|
318
|
+
|
|
319
|
+
def __str__(self) -> str:
|
|
320
|
+
"""Return a string representation of the exception."""
|
|
321
|
+
return (
|
|
322
|
+
f"Encountered an empty step sequence in flow '{self.flow_id}' "
|
|
323
|
+
f"and step '{self.step_id}'."
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
class EmptyFlowException(RasaException):
|
|
328
|
+
"""Raised when a flow is completely empty."""
|
|
329
|
+
|
|
330
|
+
def __init__(self, flow_id: str) -> None:
|
|
331
|
+
"""Initializes the exception."""
|
|
332
|
+
self.flow_id = flow_id
|
|
333
|
+
|
|
334
|
+
def __str__(self) -> str:
|
|
335
|
+
"""Return a string representation of the exception."""
|
|
336
|
+
return f"Flow '{self.flow_id}' does not have any steps."
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
class DuplicateNLUTriggerException(RasaException):
|
|
340
|
+
"""Raised when multiple flows can be started by the same intent."""
|
|
341
|
+
|
|
342
|
+
def __init__(self, intent: str, flow_names: List[str]) -> None:
|
|
343
|
+
"""Initializes the exception."""
|
|
344
|
+
self.intent = intent
|
|
345
|
+
self.flow_names = flow_names
|
|
346
|
+
|
|
347
|
+
def __str__(self) -> Text:
|
|
348
|
+
"""Return a string representation of the exception."""
|
|
349
|
+
return (
|
|
350
|
+
f"The intent '{self.intent}' is used as 'nlu_trigger' "
|
|
351
|
+
f"in multiple flows: {self.flow_names}. "
|
|
352
|
+
f"An intent should just trigger one flow, not multiple."
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
class SlotNamingException(RasaException):
|
|
357
|
+
"""Raised when a slot name to be collected does not adhere to naming convention."""
|
|
358
|
+
|
|
359
|
+
def __init__(self, flow_id: str, step_id: str, slot_name: str) -> None:
|
|
360
|
+
"""Initializes the exception."""
|
|
361
|
+
self.flow_id = flow_id
|
|
362
|
+
self.step_id = step_id
|
|
363
|
+
self.slot_name = slot_name
|
|
364
|
+
|
|
365
|
+
def __str__(self) -> str:
|
|
366
|
+
"""Return a string representation of the exception."""
|
|
367
|
+
return (
|
|
368
|
+
f"For the flow '{self.flow_id}', collect step '{self.step_id}' "
|
|
369
|
+
f"the slot name was set to : {self.slot_name}, while it has "
|
|
370
|
+
f"to adhere to the following pattern: [a-zA-Z_][a-zA-Z0-9_-]*?."
|
|
371
|
+
)
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
class FlowIdNamingException(RasaException):
|
|
375
|
+
"""Raised when a flow ID defined does not adhere to naming convention."""
|
|
376
|
+
|
|
377
|
+
def __init__(self, flow_id: str) -> None:
|
|
378
|
+
"""Initializes the exception."""
|
|
379
|
+
self.flow_id = flow_id
|
|
380
|
+
|
|
381
|
+
def __str__(self) -> str:
|
|
382
|
+
"""Return a string representation of the exception."""
|
|
383
|
+
return (
|
|
384
|
+
f"The flow ID was set to : {self.flow_id}, while it has "
|
|
385
|
+
f"to adhere to the following pattern: [a-zA-Z0-9_][a-zA-Z0-9_-]*?."
|
|
386
|
+
)
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
class DuplicateSlotPersistConfigException(RasaException):
|
|
390
|
+
"""Raised when a slot persist configuration is duplicated."""
|
|
391
|
+
|
|
392
|
+
def __init__(self, flow_id: str, collect_step: str) -> None:
|
|
393
|
+
"""Initializes the exception."""
|
|
394
|
+
self.flow_id = flow_id
|
|
395
|
+
self.collect_step = collect_step
|
|
396
|
+
|
|
397
|
+
def __str__(self) -> str:
|
|
398
|
+
"""Return a string representation of the exception."""
|
|
399
|
+
return get_duplicate_slot_persistence_config_error_message(
|
|
400
|
+
self.flow_id, self.collect_step
|
|
401
|
+
)
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
class InvalidPersistSlotsException(RasaException):
|
|
405
|
+
"""Raised when a slot persist configuration is duplicated."""
|
|
406
|
+
|
|
407
|
+
def __init__(self, flow_id: str, invalid_slots: Set[str]) -> None:
|
|
408
|
+
"""Initializes the exception."""
|
|
409
|
+
self.flow_id = flow_id
|
|
410
|
+
self.invalid_slots = invalid_slots
|
|
411
|
+
|
|
412
|
+
def __str__(self) -> str:
|
|
413
|
+
"""Return a string representation of the exception."""
|
|
414
|
+
return get_invalid_slot_persistence_config_error_message(
|
|
415
|
+
self.flow_id, self.invalid_slots
|
|
416
|
+
)
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
@dataclass
|
|
420
|
+
class ValidationResult:
|
|
421
|
+
is_valid: bool
|
|
422
|
+
invalid_slots: Set[str]
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
def validate_flow(flow: Flow) -> None:
|
|
426
|
+
"""Validates the flow configuration.
|
|
427
|
+
|
|
428
|
+
This ensures that the flow semantically makes sense. E.g. it
|
|
429
|
+
checks:
|
|
430
|
+
- whether all next links point to existing steps
|
|
431
|
+
- whether all steps can be reached from the start step
|
|
432
|
+
"""
|
|
433
|
+
from rasa.cli.utils import is_skip_validation_flag_set
|
|
434
|
+
|
|
435
|
+
validate_flow_not_empty(flow)
|
|
436
|
+
validate_no_empty_step_sequences(flow)
|
|
437
|
+
validate_all_steps_next_property(flow)
|
|
438
|
+
validate_all_next_ids_are_available_steps(flow)
|
|
439
|
+
validate_all_steps_can_be_reached(flow)
|
|
440
|
+
validate_all_branches_have_an_else(flow)
|
|
441
|
+
validate_not_using_builtin_ids(flow)
|
|
442
|
+
validate_slot_names_to_be_collected(flow)
|
|
443
|
+
validate_flow_id(flow)
|
|
444
|
+
|
|
445
|
+
if is_skip_validation_flag_set():
|
|
446
|
+
# we only want to run this validation if the --skip-validation flag is used
|
|
447
|
+
# during training because Flow Validation exceptions are raised one by one
|
|
448
|
+
# as opposed to all at once with the Validator class
|
|
449
|
+
validate_slot_persistence_configuration(flow)
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
def validate_flow_not_empty(flow: Flow) -> None:
|
|
453
|
+
"""Validate that the flow is not empty."""
|
|
454
|
+
if len(flow.steps) == 0:
|
|
455
|
+
raise EmptyFlowException(flow.id)
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
def validate_no_empty_step_sequences(flow: Flow) -> None:
|
|
459
|
+
"""Validate that the flow does not have any empty step sequences."""
|
|
460
|
+
for step in flow.steps:
|
|
461
|
+
for link in step.next.links:
|
|
462
|
+
if (
|
|
463
|
+
isinstance(link, BranchingFlowStepLink)
|
|
464
|
+
and isinstance(link.target_reference, FlowStepSequence)
|
|
465
|
+
and len(link.target_reference.child_steps) == 0
|
|
466
|
+
):
|
|
467
|
+
raise EmptyStepSequenceException(flow.id, step.id)
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
def validate_not_using_builtin_ids(flow: Flow) -> None:
|
|
471
|
+
"""Validates that the flow does not use any of the build in ids."""
|
|
472
|
+
for step in flow.steps:
|
|
473
|
+
if step.id in DEFAULT_STEPS or step.id.startswith(CONTINUE_STEP_PREFIX):
|
|
474
|
+
raise ReservedFlowStepIdException(step.id, flow.id)
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
def validate_all_branches_have_an_else(flow: Flow) -> None:
|
|
478
|
+
"""Validates that all branches have an else link."""
|
|
479
|
+
for step in flow.steps:
|
|
480
|
+
links = step.next.links
|
|
481
|
+
|
|
482
|
+
has_an_if = any(isinstance(link, IfFlowStepLink) for link in links)
|
|
483
|
+
has_an_else = any(isinstance(link, ElseFlowStepLink) for link in links)
|
|
484
|
+
|
|
485
|
+
if has_an_if and not has_an_else:
|
|
486
|
+
raise MissingElseBranchException(step.id, flow.id)
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
def validate_all_steps_next_property(flow: Flow) -> None:
|
|
490
|
+
"""Validates that every step that must have a `next` has one."""
|
|
491
|
+
for step in flow.steps:
|
|
492
|
+
if isinstance(step, LinkFlowStep):
|
|
493
|
+
# link steps can't have a next link!
|
|
494
|
+
if not step.next.no_link_available():
|
|
495
|
+
raise NoNextAllowedForLinkException(step.id, flow.id)
|
|
496
|
+
elif step.next.no_link_available():
|
|
497
|
+
# all other steps should have a next link
|
|
498
|
+
raise MissingNextLinkException(step.id, flow.id)
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
def validate_all_next_ids_are_available_steps(flow: Flow) -> None:
|
|
502
|
+
"""Validates that all next links point to existing steps."""
|
|
503
|
+
available_steps = {step.id for step in flow.steps} | DEFAULT_STEPS
|
|
504
|
+
for step in flow.steps:
|
|
505
|
+
for link in step.next.links:
|
|
506
|
+
if link.target not in available_steps:
|
|
507
|
+
raise UnresolvedFlowStepIdException(link.target, flow.id, step.id)
|
|
508
|
+
|
|
509
|
+
|
|
510
|
+
def validate_all_steps_can_be_reached(flow: Flow) -> None:
|
|
511
|
+
"""Validates that all steps can be reached from the start step."""
|
|
512
|
+
|
|
513
|
+
def _reachable_steps(
|
|
514
|
+
step: Optional[FlowStep], reached_steps: Set[Text]
|
|
515
|
+
) -> Set[Text]:
|
|
516
|
+
"""Validates that the given step can be reached from the start step."""
|
|
517
|
+
if step is None or step.id in reached_steps:
|
|
518
|
+
return reached_steps
|
|
519
|
+
|
|
520
|
+
reached_steps.add(step.id)
|
|
521
|
+
for link in step.next.links:
|
|
522
|
+
reached_steps = _reachable_steps(
|
|
523
|
+
flow.step_by_id(link.target), reached_steps
|
|
524
|
+
)
|
|
525
|
+
return reached_steps
|
|
526
|
+
|
|
527
|
+
reached_steps = _reachable_steps(flow.first_step_in_flow(), set())
|
|
528
|
+
|
|
529
|
+
for step in flow.steps:
|
|
530
|
+
if step.id not in reached_steps:
|
|
531
|
+
raise UnreachableFlowStepException(step.id, flow.id)
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
def validate_nlu_trigger(flows: List[Flow]) -> None:
|
|
535
|
+
"""Validates that an intent can just trigger one flow."""
|
|
536
|
+
nlu_trigger_to_flows = defaultdict(list)
|
|
537
|
+
|
|
538
|
+
for flow in flows:
|
|
539
|
+
intents = flow.get_trigger_intents()
|
|
540
|
+
for intent in intents:
|
|
541
|
+
nlu_trigger_to_flows[intent].append(flow.name)
|
|
542
|
+
|
|
543
|
+
for intent, flow_names in nlu_trigger_to_flows.items():
|
|
544
|
+
if len(flow_names) > 1:
|
|
545
|
+
raise DuplicateNLUTriggerException(intent, flow_names)
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
def validate_link_in_call_restriction(flows: "FlowsList") -> None:
|
|
549
|
+
"""Validates that a flow is not called from another flow and uses a link step."""
|
|
550
|
+
|
|
551
|
+
def does_flow_use_link(flow_id: str) -> bool:
|
|
552
|
+
if flow := flows.flow_by_id(flow_id):
|
|
553
|
+
for step in flow.steps:
|
|
554
|
+
if isinstance(step, LinkFlowStep):
|
|
555
|
+
return True
|
|
556
|
+
return False
|
|
557
|
+
|
|
558
|
+
for flow in flows.underlying_flows:
|
|
559
|
+
for step in flow.steps:
|
|
560
|
+
if isinstance(step, CallFlowStep) and does_flow_use_link(step.call):
|
|
561
|
+
raise NoLinkAllowedInCalledFlowException(step.id, flow.id, step.call)
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
def validate_called_flows_exists(flows: "FlowsList") -> None:
|
|
565
|
+
"""Validates that all called flows exist."""
|
|
566
|
+
for flow in flows.underlying_flows:
|
|
567
|
+
for step in flow.steps:
|
|
568
|
+
if not isinstance(step, CallFlowStep):
|
|
569
|
+
continue
|
|
570
|
+
|
|
571
|
+
if flows.flow_by_id(step.call) is None:
|
|
572
|
+
raise UnresolvedFlowException(step.call, flow.id, step.id)
|
|
573
|
+
|
|
574
|
+
|
|
575
|
+
def validate_linked_flows_exists(flows: "FlowsList") -> None:
|
|
576
|
+
"""Validates that all linked flows exist."""
|
|
577
|
+
for flow in flows.underlying_flows:
|
|
578
|
+
for step in flow.steps:
|
|
579
|
+
if not isinstance(step, LinkFlowStep):
|
|
580
|
+
continue
|
|
581
|
+
|
|
582
|
+
# It might be that the flows do not contain the default rasa patterns, but
|
|
583
|
+
# only the user flows. Manually check for `pattern_human_handoff` as this
|
|
584
|
+
# pattern can be linked to and it is part of the default patterns of rasa.
|
|
585
|
+
if (
|
|
586
|
+
flows.flow_by_id(step.link) is None
|
|
587
|
+
and step.link != RASA_PATTERN_HUMAN_HANDOFF
|
|
588
|
+
):
|
|
589
|
+
raise UnresolvedFlowException(step.link, flow.id, step.id)
|
|
590
|
+
|
|
591
|
+
|
|
592
|
+
def validate_patterns_are_not_called_or_linked(flows: "FlowsList") -> None:
|
|
593
|
+
"""Validates that patterns are never called or linked.
|
|
594
|
+
|
|
595
|
+
Exception: pattern_human_handoff can be linked.
|
|
596
|
+
"""
|
|
597
|
+
for flow in flows.underlying_flows:
|
|
598
|
+
for step in flow.steps:
|
|
599
|
+
if (
|
|
600
|
+
isinstance(step, LinkFlowStep)
|
|
601
|
+
and step.link.startswith(RASA_DEFAULT_FLOW_PATTERN_PREFIX)
|
|
602
|
+
and step.link != RASA_PATTERN_HUMAN_HANDOFF
|
|
603
|
+
):
|
|
604
|
+
raise ReferenceToPatternException(
|
|
605
|
+
step.link, flow.id, step.id, call_step=False
|
|
606
|
+
)
|
|
607
|
+
|
|
608
|
+
if isinstance(step, CallFlowStep) and step.call.startswith(
|
|
609
|
+
RASA_DEFAULT_FLOW_PATTERN_PREFIX
|
|
610
|
+
):
|
|
611
|
+
raise ReferenceToPatternException(
|
|
612
|
+
step.call, flow.id, step.id, call_step=True
|
|
613
|
+
)
|
|
614
|
+
|
|
615
|
+
|
|
616
|
+
def validate_patterns_are_not_calling_or_linking_other_flows(
|
|
617
|
+
flows: "FlowsList",
|
|
618
|
+
) -> None:
|
|
619
|
+
"""Validates that patterns do not contain call or link steps.
|
|
620
|
+
|
|
621
|
+
Link steps to user flows are allowed for all patterns but 'pattern_internal_error'.
|
|
622
|
+
Link steps to other patterns, except for 'pattern_human_handoff', are forbidden.
|
|
623
|
+
"""
|
|
624
|
+
for flow in flows.underlying_flows:
|
|
625
|
+
if not flow.is_rasa_default_flow:
|
|
626
|
+
continue
|
|
627
|
+
for step in flow.steps:
|
|
628
|
+
if isinstance(step, LinkFlowStep):
|
|
629
|
+
if step.link == RASA_PATTERN_HUMAN_HANDOFF:
|
|
630
|
+
# links to 'pattern_human_handoff' are allowed
|
|
631
|
+
continue
|
|
632
|
+
if step.link.startswith(RASA_DEFAULT_FLOW_PATTERN_PREFIX):
|
|
633
|
+
# all other patterns are allowed to link to user flows, but not
|
|
634
|
+
# to other patterns
|
|
635
|
+
raise PatternReferencedPatternException(
|
|
636
|
+
flow.id, step.id, call_step=False
|
|
637
|
+
)
|
|
638
|
+
if flow.id == RASA_PATTERN_INTERNAL_ERROR:
|
|
639
|
+
# 'pattern_internal_error' is not allowed to link at all
|
|
640
|
+
raise PatternReferencedFlowException(
|
|
641
|
+
flow.id, step.id, call_step=False
|
|
642
|
+
)
|
|
643
|
+
if isinstance(step, CallFlowStep):
|
|
644
|
+
if step.call.startswith(RASA_DEFAULT_FLOW_PATTERN_PREFIX):
|
|
645
|
+
raise PatternReferencedPatternException(
|
|
646
|
+
flow.id, step.id, call_step=True
|
|
647
|
+
)
|
|
648
|
+
else:
|
|
649
|
+
raise PatternReferencedFlowException(
|
|
650
|
+
flow.id, step.id, call_step=True
|
|
651
|
+
)
|
|
652
|
+
|
|
653
|
+
|
|
654
|
+
def validate_step_ids_are_unique(flows: "FlowsList") -> None:
|
|
655
|
+
"""Validates that step ids are unique within a flow and any called flows."""
|
|
656
|
+
for flow in flows.underlying_flows:
|
|
657
|
+
used_ids: Set[str] = set()
|
|
658
|
+
|
|
659
|
+
# check that the ids used in the flow are unique
|
|
660
|
+
for step in flow.steps:
|
|
661
|
+
if step.id in used_ids:
|
|
662
|
+
raise DuplicatedStepIdException(step.id, flow.id)
|
|
663
|
+
|
|
664
|
+
used_ids.add(step.id)
|
|
665
|
+
|
|
666
|
+
|
|
667
|
+
def validate_slot_names_to_be_collected(flow: Flow) -> None:
|
|
668
|
+
"""Validates that slot names to be collected comply with a specified regex."""
|
|
669
|
+
slot_re = re.compile(r"""^[a-zA-Z_][a-zA-Z0-9_-]*?$""")
|
|
670
|
+
for step in flow.steps:
|
|
671
|
+
if isinstance(step, CollectInformationFlowStep):
|
|
672
|
+
slot_name = step.collect
|
|
673
|
+
if not slot_re.search(slot_name):
|
|
674
|
+
raise SlotNamingException(flow.id, step.id, slot_name)
|
|
675
|
+
|
|
676
|
+
|
|
677
|
+
def validate_flow_id(flow: Flow) -> None:
|
|
678
|
+
"""Validates if the flow id comply with a specified regex.
|
|
679
|
+
Flow IDs can start with an alphanumeric character or an underscore.
|
|
680
|
+
Followed by zero or more alphanumeric characters, hyphens, or underscores.
|
|
681
|
+
|
|
682
|
+
Args:
|
|
683
|
+
flow: The flow to validate.
|
|
684
|
+
|
|
685
|
+
Raises:
|
|
686
|
+
FlowIdNamingException: If the flow id does not comply with the regex.
|
|
687
|
+
"""
|
|
688
|
+
flow_re = re.compile(FLOW_ID_REGEX)
|
|
689
|
+
if not flow_re.search(flow.id):
|
|
690
|
+
raise FlowIdNamingException(flow.id)
|
|
691
|
+
|
|
692
|
+
|
|
693
|
+
def validate_slot_persistence_configuration(flow: Flow) -> None:
|
|
694
|
+
"""Validates that slot persistence configuration is valid.
|
|
695
|
+
|
|
696
|
+
Only slots used in either a collect step or a set_slot step can be persisted
|
|
697
|
+
and the configuration can either be set at the flow level or the collect step level,
|
|
698
|
+
but not both.
|
|
699
|
+
|
|
700
|
+
Args:
|
|
701
|
+
flow: The flow to validate.
|
|
702
|
+
|
|
703
|
+
Raises:
|
|
704
|
+
DuplicateSlotPersistConfigException: If slot persist config is duplicated.
|
|
705
|
+
"""
|
|
706
|
+
|
|
707
|
+
def _is_persist_slots_valid(
|
|
708
|
+
persist_slots: List[str], flow_slots: Set[str]
|
|
709
|
+
) -> ValidationResult:
|
|
710
|
+
"""Validates that the slots that should be persisted are used in the flow."""
|
|
711
|
+
invalid_slots = set(persist_slots) - flow_slots
|
|
712
|
+
is_valid = False if invalid_slots else True
|
|
713
|
+
|
|
714
|
+
return ValidationResult(is_valid, invalid_slots)
|
|
715
|
+
|
|
716
|
+
flow_id = flow.id
|
|
717
|
+
persist_slots = flow.persisted_slots
|
|
718
|
+
has_flow_level_persistence = True if persist_slots else False
|
|
719
|
+
flow_slots = set()
|
|
720
|
+
|
|
721
|
+
for step in flow.steps_with_calls_resolved:
|
|
722
|
+
if isinstance(step, SetSlotsFlowStep):
|
|
723
|
+
flow_slots.update([slot["key"] for slot in step.slots])
|
|
724
|
+
elif isinstance(step, CollectInformationFlowStep):
|
|
725
|
+
flow_slots.add(step.collect)
|
|
726
|
+
if not step.reset_after_flow_ends:
|
|
727
|
+
collect_step = step.collect
|
|
728
|
+
warn_deprecated_collect_step_config(flow_id, collect_step)
|
|
729
|
+
if has_flow_level_persistence:
|
|
730
|
+
raise DuplicateSlotPersistConfigException(flow_id, collect_step)
|
|
731
|
+
|
|
732
|
+
if has_flow_level_persistence:
|
|
733
|
+
result = _is_persist_slots_valid(persist_slots, flow_slots)
|
|
734
|
+
if not result.is_valid:
|
|
735
|
+
raise InvalidPersistSlotsException(flow_id, result.invalid_slots)
|