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
rasa/core/migrate.py
ADDED
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
import copy
|
|
2
|
+
import shutil
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import List, Dict, Text, Any, Tuple, Optional, Union
|
|
5
|
+
|
|
6
|
+
from ruamel.yaml.scalarstring import DoubleQuotedScalarString
|
|
7
|
+
|
|
8
|
+
import rasa.shared.utils.io
|
|
9
|
+
import rasa.shared.utils.cli
|
|
10
|
+
from rasa.shared.constants import REQUIRED_SLOTS_KEY, IGNORED_INTENTS
|
|
11
|
+
from rasa.shared.core.constants import (
|
|
12
|
+
ACTIVE_LOOP,
|
|
13
|
+
REQUESTED_SLOT,
|
|
14
|
+
SlotMappingType,
|
|
15
|
+
MAPPING_TYPE,
|
|
16
|
+
SLOT_MAPPINGS,
|
|
17
|
+
)
|
|
18
|
+
from rasa.shared.constants import LATEST_TRAINING_DATA_FORMAT_VERSION
|
|
19
|
+
from rasa.shared.core.domain import KEY_ENTITIES, KEY_SLOTS, KEY_FORMS, Domain
|
|
20
|
+
from rasa.shared.exceptions import RasaException
|
|
21
|
+
from rasa.shared.utils.yaml import (
|
|
22
|
+
KEY_TRAINING_DATA_FORMAT_VERSION,
|
|
23
|
+
read_yaml,
|
|
24
|
+
write_yaml,
|
|
25
|
+
read_yaml_file,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
ORIGINAL_DOMAIN = "original_domain" # not a default, fixed
|
|
29
|
+
DEFAULT_NEW_DOMAIN = "new_domain"
|
|
30
|
+
YML_SUFFIX = ".yml"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _create_back_up(domain_file: Path, backup_location: Path) -> Dict[Text, Any]:
|
|
34
|
+
"""Makes a backup and returns the content of the file."""
|
|
35
|
+
original_content = read_yaml(rasa.shared.utils.io.read_file(domain_file))
|
|
36
|
+
write_yaml(original_content, backup_location, should_preserve_key_order=True)
|
|
37
|
+
return original_content
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _get_updated_mapping_condition(
|
|
41
|
+
condition: Dict[Text, Text], mapping: Dict[Text, Any], slot_name: Text
|
|
42
|
+
) -> Dict[Text, Text]:
|
|
43
|
+
if mapping.get(MAPPING_TYPE) not in [
|
|
44
|
+
str(SlotMappingType.FROM_ENTITY),
|
|
45
|
+
str(SlotMappingType.FROM_TRIGGER_INTENT),
|
|
46
|
+
]:
|
|
47
|
+
return {**condition, REQUESTED_SLOT: slot_name}
|
|
48
|
+
return condition
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _get_updated_or_new_mappings(
|
|
52
|
+
existing_mappings: List[Dict[Text, Any]],
|
|
53
|
+
new_mappings: List[Dict[Text, Any]],
|
|
54
|
+
condition: Dict[Text, Text],
|
|
55
|
+
slot_name: Text,
|
|
56
|
+
) -> List[Dict[Text, Any]]:
|
|
57
|
+
updated_mappings = []
|
|
58
|
+
|
|
59
|
+
for existing_mapping in existing_mappings:
|
|
60
|
+
mapping_copy = copy.deepcopy(existing_mapping)
|
|
61
|
+
|
|
62
|
+
conditions = existing_mapping.pop("conditions", [])
|
|
63
|
+
if existing_mapping in new_mappings:
|
|
64
|
+
new_mappings.remove(existing_mapping)
|
|
65
|
+
conditions.append(
|
|
66
|
+
_get_updated_mapping_condition(condition, existing_mapping, slot_name)
|
|
67
|
+
)
|
|
68
|
+
existing_mapping.update({"conditions": conditions})
|
|
69
|
+
updated_mappings.append(existing_mapping)
|
|
70
|
+
else:
|
|
71
|
+
updated_mappings.append(mapping_copy)
|
|
72
|
+
|
|
73
|
+
for mapping in new_mappings:
|
|
74
|
+
mapping.update(
|
|
75
|
+
{
|
|
76
|
+
"conditions": [
|
|
77
|
+
_get_updated_mapping_condition(condition, mapping, slot_name)
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
updated_mappings.append(mapping)
|
|
82
|
+
|
|
83
|
+
return updated_mappings
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _migrate_form_slots(
|
|
87
|
+
domain: Dict[Text, Any],
|
|
88
|
+
) -> Tuple[Dict[Any, Dict[str, Any]], Optional[Any]]:
|
|
89
|
+
updated_slots = domain.get(KEY_SLOTS, {})
|
|
90
|
+
forms = domain.get(KEY_FORMS, {})
|
|
91
|
+
|
|
92
|
+
new_forms = {}
|
|
93
|
+
|
|
94
|
+
for form_name, form_data in forms.items():
|
|
95
|
+
ignored_intents = form_data.pop(IGNORED_INTENTS, [])
|
|
96
|
+
if REQUIRED_SLOTS_KEY in form_data:
|
|
97
|
+
form_data = form_data.get(REQUIRED_SLOTS_KEY, {})
|
|
98
|
+
|
|
99
|
+
required_slots = []
|
|
100
|
+
|
|
101
|
+
for slot_name, mappings in form_data.items():
|
|
102
|
+
condition = {ACTIVE_LOOP: form_name}
|
|
103
|
+
slot_properties = updated_slots.get(slot_name, {})
|
|
104
|
+
existing_mappings = slot_properties.get("mappings", [])
|
|
105
|
+
updated_mappings = _get_updated_or_new_mappings(
|
|
106
|
+
existing_mappings, mappings, condition, slot_name
|
|
107
|
+
)
|
|
108
|
+
slot_properties.update({"mappings": updated_mappings})
|
|
109
|
+
updated_slots[slot_name] = slot_properties
|
|
110
|
+
|
|
111
|
+
required_slots.append(slot_name)
|
|
112
|
+
|
|
113
|
+
new_forms[form_name] = {REQUIRED_SLOTS_KEY: required_slots}
|
|
114
|
+
|
|
115
|
+
if ignored_intents:
|
|
116
|
+
new_forms[form_name][IGNORED_INTENTS] = ignored_intents
|
|
117
|
+
|
|
118
|
+
return new_forms, updated_slots
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def _migrate_auto_fill(
|
|
122
|
+
slot_name: Text, properties: Dict[Text, Any], entities: List[Text]
|
|
123
|
+
) -> Dict[Text, Any]:
|
|
124
|
+
if slot_name in entities and properties.get("auto_fill", True) is True:
|
|
125
|
+
from_entity_mapping = {
|
|
126
|
+
"type": str(SlotMappingType.FROM_ENTITY),
|
|
127
|
+
"entity": slot_name,
|
|
128
|
+
}
|
|
129
|
+
mappings = properties.get(SLOT_MAPPINGS, [])
|
|
130
|
+
if from_entity_mapping not in mappings:
|
|
131
|
+
mappings.append(from_entity_mapping)
|
|
132
|
+
properties.update({SLOT_MAPPINGS: mappings})
|
|
133
|
+
|
|
134
|
+
if "auto_fill" in properties:
|
|
135
|
+
del properties["auto_fill"]
|
|
136
|
+
|
|
137
|
+
return properties
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def _migrate_custom_slots(
|
|
141
|
+
slot_name: Text, properties: Dict[Text, Any]
|
|
142
|
+
) -> Dict[Text, Any]:
|
|
143
|
+
if not properties.get("mappings"):
|
|
144
|
+
properties.update({"mappings": [{"type": "custom"}]})
|
|
145
|
+
|
|
146
|
+
rasa.shared.utils.io.raise_warning(
|
|
147
|
+
f"A custom mapping was added to slot '{slot_name}'. "
|
|
148
|
+
f"Please double-check this is correct.",
|
|
149
|
+
UserWarning,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
return properties
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def _migrate_auto_fill_and_custom_slots(
|
|
156
|
+
domain: Dict[Text, Any], slots: Dict[Text, Any]
|
|
157
|
+
) -> Dict[Text, Any]:
|
|
158
|
+
new_slots = {}
|
|
159
|
+
entities = domain.get(KEY_ENTITIES, [])
|
|
160
|
+
|
|
161
|
+
for slot_name, properties in slots.items():
|
|
162
|
+
updated_properties = _migrate_auto_fill(slot_name, properties, entities)
|
|
163
|
+
updated_properties = _migrate_custom_slots(slot_name, updated_properties)
|
|
164
|
+
|
|
165
|
+
new_slots[slot_name] = updated_properties
|
|
166
|
+
return new_slots
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _assemble_new_domain(
|
|
170
|
+
domain_file: Path, new_forms: Dict[Text, Any], new_slots: Dict[Text, Any]
|
|
171
|
+
) -> Dict[Text, Any]:
|
|
172
|
+
original_content = read_yaml(rasa.shared.utils.io.read_file(domain_file))
|
|
173
|
+
new_domain: Dict[Text, Any] = {}
|
|
174
|
+
for key, value in original_content.items():
|
|
175
|
+
if key == KEY_SLOTS:
|
|
176
|
+
new_domain.update({key: new_slots})
|
|
177
|
+
elif key == KEY_FORMS:
|
|
178
|
+
new_domain.update({key: new_forms})
|
|
179
|
+
elif key == "version":
|
|
180
|
+
new_domain.update(
|
|
181
|
+
{key: DoubleQuotedScalarString(LATEST_TRAINING_DATA_FORMAT_VERSION)}
|
|
182
|
+
)
|
|
183
|
+
else:
|
|
184
|
+
new_domain.update({key: value})
|
|
185
|
+
return new_domain
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def _write_final_domain(
|
|
189
|
+
domain_file: Path, new_forms: Dict, new_slots: Dict, out_file: Path
|
|
190
|
+
) -> None:
|
|
191
|
+
if domain_file.is_dir():
|
|
192
|
+
for file in domain_file.iterdir():
|
|
193
|
+
if not Domain.is_domain_file(file):
|
|
194
|
+
continue
|
|
195
|
+
new_domain = _assemble_new_domain(file, new_forms, new_slots)
|
|
196
|
+
write_yaml(new_domain, out_file / file.name, True)
|
|
197
|
+
else:
|
|
198
|
+
new_domain = _assemble_new_domain(domain_file, new_forms, new_slots)
|
|
199
|
+
write_yaml(new_domain, out_file, True)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def _migrate_domain_files(
|
|
203
|
+
domain_path: Path, backup_location: Path, out_path: Path
|
|
204
|
+
) -> Dict[Text, Any]:
|
|
205
|
+
"""Migrates files that only need a version update and collects the remaining info.
|
|
206
|
+
|
|
207
|
+
Moreover, backups will be created from all domain files that can be found in the
|
|
208
|
+
given domain directory.
|
|
209
|
+
|
|
210
|
+
Args:
|
|
211
|
+
domain_path: directory containing domain files
|
|
212
|
+
backup_location: where to backup all domain files
|
|
213
|
+
out_path: location where to store the migrated files
|
|
214
|
+
"""
|
|
215
|
+
slots: Dict[Text, Any] = {}
|
|
216
|
+
forms: Dict[Text, Any] = {}
|
|
217
|
+
entities: List[Any] = []
|
|
218
|
+
|
|
219
|
+
domain_files = [
|
|
220
|
+
file for file in domain_path.iterdir() if Domain.is_domain_file(file)
|
|
221
|
+
]
|
|
222
|
+
|
|
223
|
+
if not domain_files:
|
|
224
|
+
raise RasaException(
|
|
225
|
+
f"The domain directory '{domain_path.as_posix()}' does not contain any "
|
|
226
|
+
f"domain files. Please make sure to include these for a successful "
|
|
227
|
+
f"migration."
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
for file in domain_files:
|
|
231
|
+
backup = backup_location / file.name
|
|
232
|
+
original_content = _create_back_up(file, backup)
|
|
233
|
+
|
|
234
|
+
if KEY_SLOTS not in original_content and KEY_FORMS not in original_content:
|
|
235
|
+
if isinstance(original_content, dict):
|
|
236
|
+
original_content.update(
|
|
237
|
+
{
|
|
238
|
+
"version": DoubleQuotedScalarString(
|
|
239
|
+
LATEST_TRAINING_DATA_FORMAT_VERSION
|
|
240
|
+
)
|
|
241
|
+
}
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
# this is done so that the other domain files can be moved
|
|
245
|
+
# in the migrated directory
|
|
246
|
+
write_yaml(original_content, out_path / file.name, True)
|
|
247
|
+
elif KEY_SLOTS in original_content and slots:
|
|
248
|
+
raise RasaException(
|
|
249
|
+
f"Domain files with multiple '{KEY_SLOTS}' "
|
|
250
|
+
f"sections were provided. Please group these sections "
|
|
251
|
+
f"in one file only to prevent content duplication across "
|
|
252
|
+
f"multiple files. "
|
|
253
|
+
)
|
|
254
|
+
elif KEY_FORMS in original_content and forms:
|
|
255
|
+
raise RasaException(
|
|
256
|
+
f"Domain files with multiple '{KEY_FORMS}' "
|
|
257
|
+
f"sections were provided. Please group these sections "
|
|
258
|
+
f"in one file only to prevent content duplication across "
|
|
259
|
+
f"multiple files. "
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
slots.update(original_content.get(KEY_SLOTS, {}))
|
|
263
|
+
forms.update(original_content.get(KEY_FORMS, {}))
|
|
264
|
+
entities.extend(original_content.get(KEY_ENTITIES, []))
|
|
265
|
+
|
|
266
|
+
if not slots or not forms:
|
|
267
|
+
raise RasaException(
|
|
268
|
+
f"The files you have provided in '{domain_path}' are missing slots "
|
|
269
|
+
f"or forms. Please make sure to include these for a "
|
|
270
|
+
f"successful migration."
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
return {KEY_SLOTS: slots, KEY_FORMS: forms, KEY_ENTITIES: entities}
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def migrate_domain_format(
|
|
277
|
+
domain_path: Union[Text, Path], out_path: Optional[Union[Text, Path]]
|
|
278
|
+
) -> None:
|
|
279
|
+
"""Converts 2.0 domain to 3.0 format."""
|
|
280
|
+
domain_path = Path(domain_path)
|
|
281
|
+
out_path = Path(out_path) if out_path else None
|
|
282
|
+
|
|
283
|
+
domain_parent_dir = domain_path.parent
|
|
284
|
+
migrate_file_only = domain_path.is_file()
|
|
285
|
+
|
|
286
|
+
# Ensure the backup location does not exist yet
|
|
287
|
+
# Note: We demand that file as well as folder with this name gets deleted before
|
|
288
|
+
# the command is run to avoid confusion afterwards.
|
|
289
|
+
suffix = f"{ORIGINAL_DOMAIN}{YML_SUFFIX}" if migrate_file_only else ORIGINAL_DOMAIN
|
|
290
|
+
backup_location = domain_parent_dir / suffix
|
|
291
|
+
if backup_location.exists():
|
|
292
|
+
backup_location_str = "directory" if backup_location.is_dir() else "file"
|
|
293
|
+
raise RasaException(
|
|
294
|
+
f"The domain could not be migrated since the "
|
|
295
|
+
f"{backup_location_str} '{backup_location}' already exists."
|
|
296
|
+
f"Please make sure that there is no {backup_location_str} at "
|
|
297
|
+
f"'{backup_location}'."
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
# Choose a default output location if nothing was specified
|
|
301
|
+
if out_path is None:
|
|
302
|
+
suffix = (
|
|
303
|
+
f"{DEFAULT_NEW_DOMAIN}{YML_SUFFIX}"
|
|
304
|
+
if migrate_file_only
|
|
305
|
+
else DEFAULT_NEW_DOMAIN
|
|
306
|
+
)
|
|
307
|
+
out_path = domain_parent_dir / suffix
|
|
308
|
+
|
|
309
|
+
# Ensure the output location is not already in-use
|
|
310
|
+
if not migrate_file_only:
|
|
311
|
+
if out_path.is_dir() and any(out_path.iterdir()):
|
|
312
|
+
raise RasaException(
|
|
313
|
+
f"The domain could not be migrated to "
|
|
314
|
+
f"'{out_path}' because that folder is not empty."
|
|
315
|
+
"Please remove the contents of the folder and try again."
|
|
316
|
+
)
|
|
317
|
+
else:
|
|
318
|
+
if out_path.is_file():
|
|
319
|
+
raise RasaException(
|
|
320
|
+
f"The domain could not be migrated to "
|
|
321
|
+
f"'{out_path}' because that file already exists."
|
|
322
|
+
"Please remove the file and try again."
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
# Sanity Check: Assert the files to be migrated aren't in 3.0 format already
|
|
326
|
+
# Note: we do not enforce that the version tag is 2.0 everywhere + validate that
|
|
327
|
+
# migrate-able domain files are among these files later
|
|
328
|
+
original_files = (
|
|
329
|
+
{
|
|
330
|
+
file: read_yaml_file(file)
|
|
331
|
+
for file in domain_path.iterdir()
|
|
332
|
+
if Domain.is_domain_file(file)
|
|
333
|
+
}
|
|
334
|
+
if domain_path.is_dir()
|
|
335
|
+
else {domain_path: read_yaml_file(domain_path)}
|
|
336
|
+
)
|
|
337
|
+
migrated_files = []
|
|
338
|
+
|
|
339
|
+
for file, file_dict in original_files.items():
|
|
340
|
+
if not isinstance(file_dict, dict):
|
|
341
|
+
raise RasaException(
|
|
342
|
+
f"The file {file} could not be read "
|
|
343
|
+
f"as an eligible domain dictionary. "
|
|
344
|
+
f"Please make sure you have included "
|
|
345
|
+
f"only eligible domain files."
|
|
346
|
+
)
|
|
347
|
+
|
|
348
|
+
if (
|
|
349
|
+
file_dict.get(KEY_TRAINING_DATA_FORMAT_VERSION)
|
|
350
|
+
== LATEST_TRAINING_DATA_FORMAT_VERSION
|
|
351
|
+
):
|
|
352
|
+
migrated_files.append(file)
|
|
353
|
+
|
|
354
|
+
if migrated_files:
|
|
355
|
+
raise RasaException(
|
|
356
|
+
f"Some of the given files ({[file for file in migrated_files]}) "
|
|
357
|
+
f"have already been migrated to Rasa 3.0 format. Please remove these "
|
|
358
|
+
f"migrated files (or replace them with files in 2.0 format) and try again."
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
# Validate given domain file(s) and migrate them
|
|
362
|
+
try:
|
|
363
|
+
created_out_dir = False
|
|
364
|
+
if not migrate_file_only:
|
|
365
|
+
if not out_path.is_dir():
|
|
366
|
+
out_path.mkdir()
|
|
367
|
+
created_out_dir = True
|
|
368
|
+
backup_location.mkdir()
|
|
369
|
+
original_domain = _migrate_domain_files(
|
|
370
|
+
domain_path, backup_location, out_path
|
|
371
|
+
)
|
|
372
|
+
else:
|
|
373
|
+
if not Domain.is_domain_file(domain_path):
|
|
374
|
+
raise RasaException(
|
|
375
|
+
f"The file '{domain_path.as_posix()}' could not be validated as a "
|
|
376
|
+
f"domain file. Only domain yaml files can be migrated. "
|
|
377
|
+
)
|
|
378
|
+
original_domain = _create_back_up(domain_path, backup_location)
|
|
379
|
+
|
|
380
|
+
new_forms, updated_slots = _migrate_form_slots(original_domain)
|
|
381
|
+
new_slots = _migrate_auto_fill_and_custom_slots(original_domain, updated_slots)
|
|
382
|
+
|
|
383
|
+
_write_final_domain(domain_path, new_forms, new_slots, out_path)
|
|
384
|
+
|
|
385
|
+
rasa.shared.utils.cli.print_success(
|
|
386
|
+
f"Your domain file '{domain_path!s}' was successfully migrated! "
|
|
387
|
+
f"The migrated version is now '{out_path!s}'. "
|
|
388
|
+
f"The original domain file is backed-up at '{backup_location!s}'."
|
|
389
|
+
)
|
|
390
|
+
|
|
391
|
+
except Exception as e:
|
|
392
|
+
# Remove the backups if migration couldn't be completed
|
|
393
|
+
if backup_location.is_dir():
|
|
394
|
+
shutil.rmtree(backup_location)
|
|
395
|
+
if out_path.is_dir():
|
|
396
|
+
if created_out_dir:
|
|
397
|
+
shutil.rmtree(out_path)
|
|
398
|
+
else: # just remove contained files so we do not mess with access rights
|
|
399
|
+
for f in out_path.glob("*"):
|
|
400
|
+
f.unlink()
|
|
401
|
+
if backup_location.is_file():
|
|
402
|
+
backup_location.unlink()
|
|
403
|
+
raise e
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
from typing import List, Text, Any, Dict, Optional
|
|
4
|
+
|
|
5
|
+
from rasa.core.constants import DEFAULT_REQUEST_TIMEOUT
|
|
6
|
+
from rasa.core.nlg.generator import NaturalLanguageGenerator, ResponseVariationFilter
|
|
7
|
+
from rasa.shared.core.trackers import DialogueStateTracker, EventVerbosity
|
|
8
|
+
from rasa.shared.exceptions import RasaException
|
|
9
|
+
from rasa.utils.endpoints import EndpointConfig
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def nlg_response_format_spec() -> Dict[Text, Any]:
|
|
15
|
+
"""Expected response schema for an NLG endpoint.
|
|
16
|
+
|
|
17
|
+
Used for validation of the response returned from the NLG endpoint.
|
|
18
|
+
"""
|
|
19
|
+
return {
|
|
20
|
+
"type": "object",
|
|
21
|
+
"properties": {
|
|
22
|
+
"text": {"type": "string"},
|
|
23
|
+
"id": {"type": ["string", "null"]},
|
|
24
|
+
"buttons": {"type": ["array", "null"], "items": {"type": "object"}},
|
|
25
|
+
"elements": {"type": ["array", "null"], "items": {"type": "object"}},
|
|
26
|
+
"attachment": {"type": ["object", "null"]},
|
|
27
|
+
"image": {"type": ["string", "null"]},
|
|
28
|
+
"custom": {"type": "object"},
|
|
29
|
+
},
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
RESPONSE_ID_KEY = "response_ids"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def nlg_request_format(
|
|
37
|
+
utter_action: Text,
|
|
38
|
+
tracker: DialogueStateTracker,
|
|
39
|
+
output_channel: Text,
|
|
40
|
+
**kwargs: Any,
|
|
41
|
+
) -> Dict[Text, Any]:
|
|
42
|
+
"""Create the json body for the NLG json body for the request."""
|
|
43
|
+
tracker_state = tracker.current_state(EventVerbosity.ALL)
|
|
44
|
+
response_id = kwargs.pop("response_id", None)
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
"response": utter_action,
|
|
48
|
+
"id": response_id,
|
|
49
|
+
"arguments": kwargs,
|
|
50
|
+
"tracker": tracker_state,
|
|
51
|
+
"channel": {"name": output_channel},
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class CallbackNaturalLanguageGenerator(NaturalLanguageGenerator):
|
|
56
|
+
"""Generate bot utterances by using a remote endpoint for the generation.
|
|
57
|
+
|
|
58
|
+
The generator will call the endpoint for each message it wants to
|
|
59
|
+
generate. The endpoint needs to respond with a properly formatted
|
|
60
|
+
json. The generator will use this message to create a response for
|
|
61
|
+
the bot.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
def __init__(self, endpoint_config: EndpointConfig) -> None:
|
|
65
|
+
self.nlg_endpoint = endpoint_config
|
|
66
|
+
|
|
67
|
+
async def generate(
|
|
68
|
+
self,
|
|
69
|
+
utter_action: Text,
|
|
70
|
+
tracker: DialogueStateTracker,
|
|
71
|
+
output_channel: Text,
|
|
72
|
+
**kwargs: Any,
|
|
73
|
+
) -> Dict[Text, Any]:
|
|
74
|
+
"""Retrieve a named response from the domain using an endpoint."""
|
|
75
|
+
domain_responses = kwargs.pop("domain_responses", None)
|
|
76
|
+
response_id = self.fetch_response_id(
|
|
77
|
+
utter_action, tracker, output_channel, domain_responses
|
|
78
|
+
)
|
|
79
|
+
kwargs["response_id"] = response_id
|
|
80
|
+
|
|
81
|
+
body = nlg_request_format(utter_action, tracker, output_channel, **kwargs)
|
|
82
|
+
|
|
83
|
+
logger.debug(
|
|
84
|
+
"Requesting NLG for {} from {}. The request body is {}.".format(
|
|
85
|
+
utter_action, self.nlg_endpoint.url, json.dumps(body)
|
|
86
|
+
)
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
response = await self.nlg_endpoint.request(
|
|
90
|
+
method="post", json=body, timeout=DEFAULT_REQUEST_TIMEOUT
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
logger.debug(f"Received NLG response: {json.dumps(response)}")
|
|
94
|
+
|
|
95
|
+
if isinstance(response, dict) and self.validate_response(response):
|
|
96
|
+
return response
|
|
97
|
+
else:
|
|
98
|
+
raise RasaException("NLG web endpoint returned an invalid response.")
|
|
99
|
+
|
|
100
|
+
@staticmethod
|
|
101
|
+
def validate_response(content: Optional[Dict[Text, Any]]) -> bool:
|
|
102
|
+
"""Validate the NLG response. Raises exception on failure."""
|
|
103
|
+
from jsonschema import validate
|
|
104
|
+
from jsonschema import ValidationError
|
|
105
|
+
|
|
106
|
+
try:
|
|
107
|
+
if content is None or content == "":
|
|
108
|
+
# means the endpoint did not want to respond with anything
|
|
109
|
+
return True
|
|
110
|
+
else:
|
|
111
|
+
validate(content, nlg_response_format_spec())
|
|
112
|
+
return True
|
|
113
|
+
except ValidationError as e:
|
|
114
|
+
raise RasaException(
|
|
115
|
+
f"{e.message}. Failed to validate NLG response from API, make sure "
|
|
116
|
+
f"your response from the NLG endpoint is valid. "
|
|
117
|
+
f"For more information about the format please consult the "
|
|
118
|
+
f"`nlg_response_format_spec` function from this same module: "
|
|
119
|
+
f"https://github.com/RasaHQ/rasa/blob/main/rasa/core/nlg/callback.py"
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
@staticmethod
|
|
123
|
+
def fetch_response_id(
|
|
124
|
+
utter_action: Text,
|
|
125
|
+
tracker: DialogueStateTracker,
|
|
126
|
+
output_channel: Text,
|
|
127
|
+
domain_responses: Optional[Dict[Text, List[Dict[Text, Any]]]],
|
|
128
|
+
) -> Optional[Text]:
|
|
129
|
+
"""Fetch the response id for the utter action.
|
|
130
|
+
|
|
131
|
+
The response id is retrieved from the domain responses for the
|
|
132
|
+
utter action given the tracker state and channel.
|
|
133
|
+
"""
|
|
134
|
+
if domain_responses is None:
|
|
135
|
+
logger.debug("Failed to fetch response id. Responses not provided.")
|
|
136
|
+
return None
|
|
137
|
+
|
|
138
|
+
response_filter = ResponseVariationFilter(domain_responses)
|
|
139
|
+
response_id = response_filter.get_response_variation_id(
|
|
140
|
+
utter_action, tracker, output_channel
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
if response_id is None:
|
|
144
|
+
logger.debug(f"Failed to fetch response id for action '{utter_action}'.")
|
|
145
|
+
|
|
146
|
+
return response_id
|