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,1318 @@
|
|
|
1
|
+
import copy
|
|
2
|
+
import logging
|
|
3
|
+
from functools import lru_cache
|
|
4
|
+
from typing import (
|
|
5
|
+
TYPE_CHECKING,
|
|
6
|
+
Any,
|
|
7
|
+
Dict,
|
|
8
|
+
List,
|
|
9
|
+
Optional,
|
|
10
|
+
Set,
|
|
11
|
+
Text,
|
|
12
|
+
Tuple,
|
|
13
|
+
cast,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
from jsonschema import Draft202012Validator
|
|
17
|
+
|
|
18
|
+
import rasa.core
|
|
19
|
+
import rasa.shared.utils.io
|
|
20
|
+
from rasa.core.actions.custom_action_executor import (
|
|
21
|
+
CustomActionExecutor,
|
|
22
|
+
NoEndpointCustomActionExecutor,
|
|
23
|
+
RetryCustomActionExecutor,
|
|
24
|
+
)
|
|
25
|
+
from rasa.core.actions.direct_custom_actions_executor import DirectCustomActionExecutor
|
|
26
|
+
from rasa.core.actions.e2e_stub_custom_action_executor import (
|
|
27
|
+
E2EStubCustomActionExecutor,
|
|
28
|
+
)
|
|
29
|
+
from rasa.core.actions.grpc_custom_action_executor import GRPCCustomActionExecutor
|
|
30
|
+
from rasa.core.actions.http_custom_action_executor import HTTPCustomActionExecutor
|
|
31
|
+
from rasa.core.constants import (
|
|
32
|
+
UTTER_SOURCE_METADATA_KEY,
|
|
33
|
+
)
|
|
34
|
+
from rasa.core.policies.policy import PolicyPrediction
|
|
35
|
+
from rasa.core.utils import add_bot_utterance_metadata
|
|
36
|
+
from rasa.e2e_test.constants import KEY_STUB_CUSTOM_ACTIONS
|
|
37
|
+
from rasa.nlu.constants import (
|
|
38
|
+
RESPONSE_SELECTOR_DEFAULT_INTENT,
|
|
39
|
+
RESPONSE_SELECTOR_PREDICTION_KEY,
|
|
40
|
+
RESPONSE_SELECTOR_PROPERTY_NAME,
|
|
41
|
+
RESPONSE_SELECTOR_UTTER_ACTION_KEY,
|
|
42
|
+
)
|
|
43
|
+
from rasa.shared.constants import (
|
|
44
|
+
DEFAULT_NLU_FALLBACK_INTENT_NAME,
|
|
45
|
+
DOCS_BASE_URL,
|
|
46
|
+
FLOW_PREFIX,
|
|
47
|
+
ROUTE_TO_CALM_SLOT,
|
|
48
|
+
UTTER_PREFIX,
|
|
49
|
+
)
|
|
50
|
+
from rasa.shared.core.constants import (
|
|
51
|
+
ACTION_BACK_NAME,
|
|
52
|
+
ACTION_DEACTIVATE_LOOP_NAME,
|
|
53
|
+
ACTION_DEFAULT_ASK_AFFIRMATION_NAME,
|
|
54
|
+
ACTION_DEFAULT_ASK_REPHRASE_NAME,
|
|
55
|
+
ACTION_DEFAULT_FALLBACK_NAME,
|
|
56
|
+
ACTION_EXTRACT_SLOTS,
|
|
57
|
+
ACTION_LISTEN_NAME,
|
|
58
|
+
ACTION_RESET_ROUTING,
|
|
59
|
+
ACTION_RESTART_NAME,
|
|
60
|
+
ACTION_REVERT_FALLBACK_EVENTS_NAME,
|
|
61
|
+
ACTION_SEND_TEXT_NAME,
|
|
62
|
+
ACTION_SESSION_START_NAME,
|
|
63
|
+
ACTION_UNLIKELY_INTENT_NAME,
|
|
64
|
+
ACTION_VALIDATE_SLOT_MAPPINGS,
|
|
65
|
+
DEFAULT_SLOT_NAMES,
|
|
66
|
+
KNOWLEDGE_BASE_SLOT_NAMES,
|
|
67
|
+
MAPPING_TYPE,
|
|
68
|
+
REQUESTED_SLOT,
|
|
69
|
+
USER_INTENT_OUT_OF_SCOPE,
|
|
70
|
+
SlotMappingType,
|
|
71
|
+
)
|
|
72
|
+
from rasa.shared.core.domain import Domain
|
|
73
|
+
from rasa.shared.core.events import (
|
|
74
|
+
ActionExecuted,
|
|
75
|
+
ActiveLoop,
|
|
76
|
+
BotUttered,
|
|
77
|
+
Event,
|
|
78
|
+
Restarted,
|
|
79
|
+
RoutingSessionEnded,
|
|
80
|
+
SessionStarted,
|
|
81
|
+
SlotSet,
|
|
82
|
+
UserUtteranceReverted,
|
|
83
|
+
UserUttered,
|
|
84
|
+
)
|
|
85
|
+
from rasa.shared.core.flows import FlowsList
|
|
86
|
+
from rasa.shared.core.slot_mappings import (
|
|
87
|
+
SlotFillingManager,
|
|
88
|
+
extract_slot_value,
|
|
89
|
+
)
|
|
90
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
91
|
+
from rasa.shared.exceptions import RasaException
|
|
92
|
+
from rasa.shared.nlu.constants import (
|
|
93
|
+
INTENT_NAME_KEY,
|
|
94
|
+
INTENT_RANKING_KEY,
|
|
95
|
+
)
|
|
96
|
+
from rasa.shared.utils.io import raise_warning
|
|
97
|
+
from rasa.shared.utils.schemas.events import EVENTS_SCHEMA
|
|
98
|
+
from rasa.utils.endpoints import ClientResponseError, EndpointConfig
|
|
99
|
+
from rasa.utils.url_tools import UrlSchema, get_url_schema
|
|
100
|
+
|
|
101
|
+
if TYPE_CHECKING:
|
|
102
|
+
from rasa.core.channels.channel import OutputChannel
|
|
103
|
+
from rasa.core.nlg import NaturalLanguageGenerator
|
|
104
|
+
from rasa.shared.core.events import IntentPrediction
|
|
105
|
+
|
|
106
|
+
logger = logging.getLogger(__name__)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def default_actions(action_endpoint: Optional[EndpointConfig] = None) -> List["Action"]:
|
|
110
|
+
"""List default actions."""
|
|
111
|
+
from rasa.core.actions.action_clean_stack import ActionCleanStack
|
|
112
|
+
from rasa.core.actions.action_run_slot_rejections import ActionRunSlotRejections
|
|
113
|
+
from rasa.core.actions.action_trigger_chitchat import ActionTriggerChitchat
|
|
114
|
+
from rasa.core.actions.action_trigger_search import ActionTriggerSearch
|
|
115
|
+
from rasa.core.actions.two_stage_fallback import TwoStageFallbackAction
|
|
116
|
+
from rasa.core.actions.action_hangup import ActionHangup
|
|
117
|
+
from rasa.core.actions.action_repeat_bot_messages import ActionRepeatBotMessages
|
|
118
|
+
from rasa.dialogue_understanding.patterns.cancel import ActionCancelFlow
|
|
119
|
+
from rasa.dialogue_understanding.patterns.clarify import ActionClarifyFlows
|
|
120
|
+
from rasa.dialogue_understanding.patterns.correction import ActionCorrectFlowSlot
|
|
121
|
+
|
|
122
|
+
return [
|
|
123
|
+
ActionListen(),
|
|
124
|
+
ActionRestart(),
|
|
125
|
+
ActionSessionStart(),
|
|
126
|
+
ActionDefaultFallback(),
|
|
127
|
+
ActionDeactivateLoop(),
|
|
128
|
+
ActionRevertFallbackEvents(),
|
|
129
|
+
ActionDefaultAskAffirmation(),
|
|
130
|
+
ActionDefaultAskRephrase(),
|
|
131
|
+
TwoStageFallbackAction(action_endpoint),
|
|
132
|
+
ActionUnlikelyIntent(),
|
|
133
|
+
ActionSendText(),
|
|
134
|
+
ActionBack(),
|
|
135
|
+
ActionExtractSlots(action_endpoint),
|
|
136
|
+
ActionCancelFlow(),
|
|
137
|
+
ActionCorrectFlowSlot(),
|
|
138
|
+
ActionClarifyFlows(),
|
|
139
|
+
ActionRunSlotRejections(),
|
|
140
|
+
ActionCleanStack(),
|
|
141
|
+
ActionTriggerSearch(),
|
|
142
|
+
ActionTriggerChitchat(),
|
|
143
|
+
ActionResetRouting(),
|
|
144
|
+
ActionHangup(),
|
|
145
|
+
ActionRepeatBotMessages(),
|
|
146
|
+
]
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def action_for_index(
|
|
150
|
+
index: int,
|
|
151
|
+
domain: Domain,
|
|
152
|
+
action_endpoint: Optional[EndpointConfig],
|
|
153
|
+
) -> "Action":
|
|
154
|
+
"""Get an action based on its index in the list of available actions.
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
index: The index of the action. This is usually used by `Policy`s as they
|
|
158
|
+
predict the action index instead of the name.
|
|
159
|
+
domain: The `Domain` of the current model. The domain contains the actions
|
|
160
|
+
provided by the user + the default actions.
|
|
161
|
+
action_endpoint: Can be used to run `custom_actions`
|
|
162
|
+
(e.g. using the `rasa-sdk`).
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
The instantiated `Action` or `None` if no `Action` was found for the given
|
|
166
|
+
index.
|
|
167
|
+
"""
|
|
168
|
+
if domain.num_actions <= index or index < 0:
|
|
169
|
+
raise IndexError(
|
|
170
|
+
f"Cannot access action at index {index}. "
|
|
171
|
+
f"Domain has {domain.num_actions} actions."
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
return action_for_name_or_text(
|
|
175
|
+
domain.action_names_or_texts[index],
|
|
176
|
+
domain,
|
|
177
|
+
action_endpoint,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def is_retrieval_action(action_name: Text, retrieval_intents: List[Text]) -> bool:
|
|
182
|
+
"""Check if an action name is a retrieval action.
|
|
183
|
+
|
|
184
|
+
The name for a retrieval action has an extra `utter_` prefix added to
|
|
185
|
+
the corresponding retrieval intent name.
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
action_name: Name of the action.
|
|
189
|
+
retrieval_intents: List of retrieval intents defined in the NLU training data.
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
`True` if the resolved intent name is present in the list of retrieval
|
|
193
|
+
intents, `False` otherwise.
|
|
194
|
+
"""
|
|
195
|
+
return (
|
|
196
|
+
ActionRetrieveResponse.intent_name_from_action(action_name) in retrieval_intents
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def action_for_name_or_text(
|
|
201
|
+
action_name_or_text: Text,
|
|
202
|
+
domain: Domain,
|
|
203
|
+
action_endpoint: Optional[EndpointConfig],
|
|
204
|
+
) -> "Action":
|
|
205
|
+
"""Retrieves an action by its name or by its text in case it's an end-to-end action.
|
|
206
|
+
|
|
207
|
+
Args:
|
|
208
|
+
action_name_or_text: The name of the action.
|
|
209
|
+
domain: The current model domain.
|
|
210
|
+
action_endpoint: The endpoint to execute custom actions.
|
|
211
|
+
|
|
212
|
+
Raises:
|
|
213
|
+
ActionNotFoundException: If action not in current domain.
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
The instantiated action.
|
|
217
|
+
"""
|
|
218
|
+
if action_name_or_text not in domain.action_names_or_texts:
|
|
219
|
+
domain.raise_action_not_found_exception(action_name_or_text)
|
|
220
|
+
|
|
221
|
+
defaults = {a.name(): a for a in default_actions(action_endpoint)}
|
|
222
|
+
|
|
223
|
+
if (
|
|
224
|
+
action_name_or_text in defaults
|
|
225
|
+
and action_name_or_text not in domain.user_actions_and_forms
|
|
226
|
+
):
|
|
227
|
+
return defaults[action_name_or_text]
|
|
228
|
+
|
|
229
|
+
if action_name_or_text.startswith(UTTER_PREFIX) and is_retrieval_action(
|
|
230
|
+
action_name_or_text, domain.retrieval_intents
|
|
231
|
+
):
|
|
232
|
+
return ActionRetrieveResponse(action_name_or_text)
|
|
233
|
+
|
|
234
|
+
if action_name_or_text in domain.action_texts:
|
|
235
|
+
return ActionEndToEndResponse(action_name_or_text)
|
|
236
|
+
|
|
237
|
+
if action_name_or_text.startswith(UTTER_PREFIX):
|
|
238
|
+
return ActionBotResponse(action_name_or_text)
|
|
239
|
+
|
|
240
|
+
is_form = action_name_or_text in domain.form_names
|
|
241
|
+
# Users can override the form by defining an action with the same name as the form
|
|
242
|
+
user_overrode_form_action = is_form and action_name_or_text in domain.user_actions
|
|
243
|
+
if is_form and not user_overrode_form_action:
|
|
244
|
+
from rasa.core.actions.forms import FormAction
|
|
245
|
+
|
|
246
|
+
return FormAction(action_name_or_text, action_endpoint)
|
|
247
|
+
|
|
248
|
+
if action_name_or_text.startswith(FLOW_PREFIX):
|
|
249
|
+
from rasa.core.actions.action_trigger_flow import ActionTriggerFlow
|
|
250
|
+
|
|
251
|
+
return ActionTriggerFlow(action_name_or_text)
|
|
252
|
+
return RemoteAction(action_name_or_text, action_endpoint)
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def create_bot_utterance(message: Dict[Text, Any]) -> BotUttered:
|
|
256
|
+
"""Create BotUttered event from message."""
|
|
257
|
+
bot_message = BotUttered(
|
|
258
|
+
text=message.pop("text", None),
|
|
259
|
+
data={
|
|
260
|
+
"elements": message.pop("elements", None),
|
|
261
|
+
"quick_replies": message.pop("quick_replies", None),
|
|
262
|
+
"buttons": message.pop("buttons", None),
|
|
263
|
+
# for legacy / compatibility reasons we need to set the image
|
|
264
|
+
# to be the attachment if there is no other attachment (the
|
|
265
|
+
# `.get` is intentional - no `pop` as we still need the image`
|
|
266
|
+
# property to set it in the following line)
|
|
267
|
+
"attachment": message.pop("attachment", None) or message.get("image", None),
|
|
268
|
+
"image": message.pop("image", None),
|
|
269
|
+
"custom": message.pop("custom", None),
|
|
270
|
+
},
|
|
271
|
+
metadata=message,
|
|
272
|
+
)
|
|
273
|
+
return bot_message
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
class Action:
|
|
277
|
+
"""Next action to be taken in response to a dialogue state."""
|
|
278
|
+
|
|
279
|
+
def name(self) -> Text:
|
|
280
|
+
"""Unique identifier of this simple action."""
|
|
281
|
+
raise NotImplementedError
|
|
282
|
+
|
|
283
|
+
async def run(
|
|
284
|
+
self,
|
|
285
|
+
output_channel: "OutputChannel",
|
|
286
|
+
nlg: "NaturalLanguageGenerator",
|
|
287
|
+
tracker: "DialogueStateTracker",
|
|
288
|
+
domain: "Domain",
|
|
289
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
290
|
+
) -> List[Event]:
|
|
291
|
+
"""Execute the side effects of this action.
|
|
292
|
+
|
|
293
|
+
Args:
|
|
294
|
+
nlg: which ``nlg`` to use for response generation
|
|
295
|
+
output_channel: ``output_channel`` to which to send the resulting message.
|
|
296
|
+
tracker (DialogueStateTracker): the state tracker for the current
|
|
297
|
+
user. You can access slot values using
|
|
298
|
+
``tracker.get_slot(slot_name)`` and the most recent user
|
|
299
|
+
message is ``tracker.latest_message.text``.
|
|
300
|
+
domain (Domain): the bot's domain
|
|
301
|
+
metadata: Additional information for the action.
|
|
302
|
+
|
|
303
|
+
Returns:
|
|
304
|
+
A list of :class:`rasa.core.events.Event` instances
|
|
305
|
+
"""
|
|
306
|
+
raise NotImplementedError
|
|
307
|
+
|
|
308
|
+
def __str__(self) -> Text:
|
|
309
|
+
"""Returns text representation of form."""
|
|
310
|
+
return f"{self.__class__.__name__}('{self.name()}')"
|
|
311
|
+
|
|
312
|
+
def event_for_successful_execution(
|
|
313
|
+
self, prediction: PolicyPrediction
|
|
314
|
+
) -> ActionExecuted:
|
|
315
|
+
"""Event which should be logged for the successful execution of this action.
|
|
316
|
+
|
|
317
|
+
Args:
|
|
318
|
+
prediction: Prediction which led to the execution of this event.
|
|
319
|
+
|
|
320
|
+
Returns:
|
|
321
|
+
Event which should be logged onto the tracker.
|
|
322
|
+
"""
|
|
323
|
+
return ActionExecuted(
|
|
324
|
+
self.name(),
|
|
325
|
+
prediction.policy_name,
|
|
326
|
+
prediction.max_confidence,
|
|
327
|
+
hide_rule_turn=prediction.hide_rule_turn,
|
|
328
|
+
metadata=prediction.action_metadata,
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
class ActionBotResponse(Action):
|
|
333
|
+
"""An action which only effect is to utter a response when it is run."""
|
|
334
|
+
|
|
335
|
+
def __init__(self, name: Text, silent_fail: Optional[bool] = False) -> None:
|
|
336
|
+
"""Creates action.
|
|
337
|
+
|
|
338
|
+
Args:
|
|
339
|
+
name: Name of the action.
|
|
340
|
+
silent_fail: `True` if the action should fail silently in case no response
|
|
341
|
+
was defined for this action.
|
|
342
|
+
"""
|
|
343
|
+
self.utter_action = name
|
|
344
|
+
self.silent_fail = silent_fail
|
|
345
|
+
|
|
346
|
+
async def run(
|
|
347
|
+
self,
|
|
348
|
+
output_channel: "OutputChannel",
|
|
349
|
+
nlg: "NaturalLanguageGenerator",
|
|
350
|
+
tracker: "DialogueStateTracker",
|
|
351
|
+
domain: "Domain",
|
|
352
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
353
|
+
) -> List[Event]:
|
|
354
|
+
"""Simple run implementation uttering a (hopefully defined) response."""
|
|
355
|
+
kwargs = {
|
|
356
|
+
"domain_responses": domain.responses,
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
message = await nlg.generate(
|
|
360
|
+
self.utter_action,
|
|
361
|
+
tracker,
|
|
362
|
+
output_channel.name(),
|
|
363
|
+
**kwargs,
|
|
364
|
+
)
|
|
365
|
+
if message is None:
|
|
366
|
+
if not self.silent_fail:
|
|
367
|
+
logger.error(
|
|
368
|
+
"Couldn't create message for response '{}'.".format(
|
|
369
|
+
self.utter_action
|
|
370
|
+
)
|
|
371
|
+
)
|
|
372
|
+
return []
|
|
373
|
+
|
|
374
|
+
message.update(metadata or {})
|
|
375
|
+
message = add_bot_utterance_metadata(
|
|
376
|
+
message, self.utter_action, nlg, domain, tracker
|
|
377
|
+
)
|
|
378
|
+
return [create_bot_utterance(message)]
|
|
379
|
+
|
|
380
|
+
def name(self) -> Text:
|
|
381
|
+
"""Returns action name."""
|
|
382
|
+
return self.utter_action
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
class ActionEndToEndResponse(Action):
|
|
386
|
+
"""Action to utter end-to-end responses to the user."""
|
|
387
|
+
|
|
388
|
+
def __init__(self, action_text: Text) -> None:
|
|
389
|
+
"""Creates action.
|
|
390
|
+
|
|
391
|
+
Args:
|
|
392
|
+
action_text: Text of end-to-end bot response.
|
|
393
|
+
"""
|
|
394
|
+
self.action_text = action_text
|
|
395
|
+
|
|
396
|
+
def name(self) -> Text:
|
|
397
|
+
"""Returns action name."""
|
|
398
|
+
# In case of an end-to-end action there is no label (aka name) for the action.
|
|
399
|
+
# We fake a name by returning the text which the bot sends back to the user.
|
|
400
|
+
return self.action_text
|
|
401
|
+
|
|
402
|
+
async def run(
|
|
403
|
+
self,
|
|
404
|
+
output_channel: "OutputChannel",
|
|
405
|
+
nlg: "NaturalLanguageGenerator",
|
|
406
|
+
tracker: "DialogueStateTracker",
|
|
407
|
+
domain: "Domain",
|
|
408
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
409
|
+
) -> List[Event]:
|
|
410
|
+
"""Runs action (see parent class for full docstring)."""
|
|
411
|
+
message = {"text": self.action_text}
|
|
412
|
+
return [create_bot_utterance(message)]
|
|
413
|
+
|
|
414
|
+
def event_for_successful_execution(
|
|
415
|
+
self, prediction: PolicyPrediction
|
|
416
|
+
) -> ActionExecuted:
|
|
417
|
+
"""Event which should be logged for the successful execution of this action.
|
|
418
|
+
|
|
419
|
+
Args:
|
|
420
|
+
prediction: Prediction which led to the execution of this event.
|
|
421
|
+
|
|
422
|
+
Returns:
|
|
423
|
+
Event which should be logged onto the tracker.
|
|
424
|
+
"""
|
|
425
|
+
return ActionExecuted(
|
|
426
|
+
policy=prediction.policy_name,
|
|
427
|
+
confidence=prediction.max_confidence,
|
|
428
|
+
action_text=self.action_text,
|
|
429
|
+
hide_rule_turn=prediction.hide_rule_turn,
|
|
430
|
+
metadata=prediction.action_metadata,
|
|
431
|
+
)
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
class ActionRetrieveResponse(ActionBotResponse):
|
|
435
|
+
"""An action which queries the Response Selector for the appropriate response."""
|
|
436
|
+
|
|
437
|
+
def __init__(self, name: Text, silent_fail: Optional[bool] = False) -> None:
|
|
438
|
+
"""Creates action. See docstring of parent class."""
|
|
439
|
+
super().__init__(name, silent_fail)
|
|
440
|
+
self.action_name = name
|
|
441
|
+
self.silent_fail = silent_fail
|
|
442
|
+
|
|
443
|
+
@staticmethod
|
|
444
|
+
def intent_name_from_action(action_name: Text) -> Text:
|
|
445
|
+
"""Resolve the name of the intent from the action name."""
|
|
446
|
+
return action_name.split(UTTER_PREFIX)[1]
|
|
447
|
+
|
|
448
|
+
def get_full_retrieval_name(
|
|
449
|
+
self, tracker: "DialogueStateTracker"
|
|
450
|
+
) -> Optional[Text]:
|
|
451
|
+
"""Returns full retrieval name for the action.
|
|
452
|
+
|
|
453
|
+
Extracts retrieval intent from response selector and
|
|
454
|
+
returns complete action utterance name.
|
|
455
|
+
|
|
456
|
+
Args:
|
|
457
|
+
tracker: Tracker containing past conversation events.
|
|
458
|
+
|
|
459
|
+
Returns:
|
|
460
|
+
Full retrieval name of the action if the last user utterance
|
|
461
|
+
contains a response selector output, `None` otherwise.
|
|
462
|
+
"""
|
|
463
|
+
latest_message = tracker.latest_message
|
|
464
|
+
|
|
465
|
+
if latest_message is None:
|
|
466
|
+
return None
|
|
467
|
+
|
|
468
|
+
if RESPONSE_SELECTOR_PROPERTY_NAME not in latest_message.parse_data:
|
|
469
|
+
return None
|
|
470
|
+
|
|
471
|
+
response_selector_properties = latest_message.parse_data[
|
|
472
|
+
RESPONSE_SELECTOR_PROPERTY_NAME # type: ignore[literal-required]
|
|
473
|
+
]
|
|
474
|
+
|
|
475
|
+
if (
|
|
476
|
+
self.intent_name_from_action(self.action_name)
|
|
477
|
+
in response_selector_properties
|
|
478
|
+
):
|
|
479
|
+
query_key = self.intent_name_from_action(self.action_name)
|
|
480
|
+
elif RESPONSE_SELECTOR_DEFAULT_INTENT in response_selector_properties:
|
|
481
|
+
query_key = RESPONSE_SELECTOR_DEFAULT_INTENT
|
|
482
|
+
else:
|
|
483
|
+
return None
|
|
484
|
+
|
|
485
|
+
selected = response_selector_properties[query_key]
|
|
486
|
+
full_retrieval_utter_action = selected[RESPONSE_SELECTOR_PREDICTION_KEY][
|
|
487
|
+
RESPONSE_SELECTOR_UTTER_ACTION_KEY
|
|
488
|
+
]
|
|
489
|
+
return full_retrieval_utter_action
|
|
490
|
+
|
|
491
|
+
async def run(
|
|
492
|
+
self,
|
|
493
|
+
output_channel: "OutputChannel",
|
|
494
|
+
nlg: "NaturalLanguageGenerator",
|
|
495
|
+
tracker: "DialogueStateTracker",
|
|
496
|
+
domain: "Domain",
|
|
497
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
498
|
+
) -> List[Event]:
|
|
499
|
+
"""Query the appropriate response and create a bot utterance with that."""
|
|
500
|
+
latest_message = tracker.latest_message
|
|
501
|
+
|
|
502
|
+
if latest_message is None:
|
|
503
|
+
return []
|
|
504
|
+
|
|
505
|
+
response_selector_properties = latest_message.parse_data[
|
|
506
|
+
RESPONSE_SELECTOR_PROPERTY_NAME # type: ignore[literal-required]
|
|
507
|
+
]
|
|
508
|
+
|
|
509
|
+
if (
|
|
510
|
+
self.intent_name_from_action(self.action_name)
|
|
511
|
+
in response_selector_properties
|
|
512
|
+
):
|
|
513
|
+
query_key = self.intent_name_from_action(self.action_name)
|
|
514
|
+
elif RESPONSE_SELECTOR_DEFAULT_INTENT in response_selector_properties:
|
|
515
|
+
query_key = RESPONSE_SELECTOR_DEFAULT_INTENT
|
|
516
|
+
else:
|
|
517
|
+
if not self.silent_fail:
|
|
518
|
+
logger.error(
|
|
519
|
+
"Couldn't create message for response action '{}'.".format(
|
|
520
|
+
self.action_name
|
|
521
|
+
)
|
|
522
|
+
)
|
|
523
|
+
return []
|
|
524
|
+
|
|
525
|
+
logger.debug(f"Picking response from selector of type {query_key}")
|
|
526
|
+
selected = response_selector_properties[query_key]
|
|
527
|
+
|
|
528
|
+
# Override utter action of ActionBotResponse
|
|
529
|
+
# with the complete utter action retrieved from
|
|
530
|
+
# the output of response selector.
|
|
531
|
+
self.utter_action = selected[RESPONSE_SELECTOR_PREDICTION_KEY][
|
|
532
|
+
RESPONSE_SELECTOR_UTTER_ACTION_KEY
|
|
533
|
+
]
|
|
534
|
+
|
|
535
|
+
return await super().run(output_channel, nlg, tracker, domain)
|
|
536
|
+
|
|
537
|
+
def name(self) -> Text:
|
|
538
|
+
"""Returns action name."""
|
|
539
|
+
return self.action_name
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
class ActionBack(ActionBotResponse):
|
|
543
|
+
"""Revert the tracker state by two user utterances."""
|
|
544
|
+
|
|
545
|
+
def name(self) -> Text:
|
|
546
|
+
"""Returns action back name."""
|
|
547
|
+
return ACTION_BACK_NAME
|
|
548
|
+
|
|
549
|
+
def __init__(self) -> None:
|
|
550
|
+
"""Initializes action back."""
|
|
551
|
+
super().__init__("utter_back", silent_fail=True)
|
|
552
|
+
|
|
553
|
+
async def run(
|
|
554
|
+
self,
|
|
555
|
+
output_channel: "OutputChannel",
|
|
556
|
+
nlg: "NaturalLanguageGenerator",
|
|
557
|
+
tracker: "DialogueStateTracker",
|
|
558
|
+
domain: "Domain",
|
|
559
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
560
|
+
) -> List[Event]:
|
|
561
|
+
"""Runs action. Please see parent class for the full docstring."""
|
|
562
|
+
# only utter the response if it is available
|
|
563
|
+
evts = await super().run(output_channel, nlg, tracker, domain)
|
|
564
|
+
|
|
565
|
+
return evts + [UserUtteranceReverted(), UserUtteranceReverted()]
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
class ActionListen(Action):
|
|
569
|
+
"""The first action in any turn - bot waits for a user message.
|
|
570
|
+
|
|
571
|
+
The bot should stop taking further actions and wait for the user to say
|
|
572
|
+
something.
|
|
573
|
+
"""
|
|
574
|
+
|
|
575
|
+
def name(self) -> Text:
|
|
576
|
+
"""Returns action listen name."""
|
|
577
|
+
return ACTION_LISTEN_NAME
|
|
578
|
+
|
|
579
|
+
async def run(
|
|
580
|
+
self,
|
|
581
|
+
output_channel: "OutputChannel",
|
|
582
|
+
nlg: "NaturalLanguageGenerator",
|
|
583
|
+
tracker: "DialogueStateTracker",
|
|
584
|
+
domain: "Domain",
|
|
585
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
586
|
+
) -> List[Event]:
|
|
587
|
+
"""Runs action. Please see parent class for the full docstring."""
|
|
588
|
+
return []
|
|
589
|
+
|
|
590
|
+
|
|
591
|
+
class ActionResetRouting(Action):
|
|
592
|
+
"""Resets the tracker to its initial state.
|
|
593
|
+
|
|
594
|
+
Utters the restart response if available.
|
|
595
|
+
"""
|
|
596
|
+
|
|
597
|
+
def name(self) -> Text:
|
|
598
|
+
"""Returns action restart name."""
|
|
599
|
+
return ACTION_RESET_ROUTING
|
|
600
|
+
|
|
601
|
+
async def run(
|
|
602
|
+
self,
|
|
603
|
+
output_channel: "OutputChannel",
|
|
604
|
+
nlg: "NaturalLanguageGenerator",
|
|
605
|
+
tracker: "DialogueStateTracker",
|
|
606
|
+
domain: "Domain",
|
|
607
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
608
|
+
) -> List[Event]:
|
|
609
|
+
"""Runs action. Please see parent class for the full docstring."""
|
|
610
|
+
# SlotSet(ROUTE_TO_CALM_SLOT, None) is needed to ensure the routing slot
|
|
611
|
+
# is really reset to None and not just reset to an initial value
|
|
612
|
+
return [RoutingSessionEnded(), SlotSet(ROUTE_TO_CALM_SLOT, None)]
|
|
613
|
+
|
|
614
|
+
|
|
615
|
+
class ActionRestart(ActionBotResponse):
|
|
616
|
+
"""Resets the tracker to its initial state.
|
|
617
|
+
|
|
618
|
+
Utters the restart response if available.
|
|
619
|
+
"""
|
|
620
|
+
|
|
621
|
+
def name(self) -> Text:
|
|
622
|
+
"""Returns action restart name."""
|
|
623
|
+
return ACTION_RESTART_NAME
|
|
624
|
+
|
|
625
|
+
def __init__(self) -> None:
|
|
626
|
+
"""Initializes action restart."""
|
|
627
|
+
super().__init__("utter_restart", silent_fail=True)
|
|
628
|
+
|
|
629
|
+
async def run(
|
|
630
|
+
self,
|
|
631
|
+
output_channel: "OutputChannel",
|
|
632
|
+
nlg: "NaturalLanguageGenerator",
|
|
633
|
+
tracker: "DialogueStateTracker",
|
|
634
|
+
domain: "Domain",
|
|
635
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
636
|
+
) -> List[Event]:
|
|
637
|
+
"""Runs action. Please see parent class for the full docstring."""
|
|
638
|
+
# only utter the response if it is available
|
|
639
|
+
evts = await super().run(output_channel, nlg, tracker, domain)
|
|
640
|
+
|
|
641
|
+
return evts + [Restarted()]
|
|
642
|
+
|
|
643
|
+
|
|
644
|
+
class ActionSessionStart(Action):
|
|
645
|
+
"""Applies a conversation session start.
|
|
646
|
+
|
|
647
|
+
Takes all `SlotSet` events from the previous session and applies them to the new
|
|
648
|
+
session.
|
|
649
|
+
"""
|
|
650
|
+
|
|
651
|
+
def name(self) -> Text:
|
|
652
|
+
"""Returns action start name."""
|
|
653
|
+
return ACTION_SESSION_START_NAME
|
|
654
|
+
|
|
655
|
+
@staticmethod
|
|
656
|
+
def _slot_set_events_from_tracker(
|
|
657
|
+
tracker: "DialogueStateTracker",
|
|
658
|
+
) -> List["SlotSet"]:
|
|
659
|
+
"""Fetch SlotSet events from tracker and carry over key, value and metadata."""
|
|
660
|
+
return [
|
|
661
|
+
SlotSet(key=event.key, value=event.value, metadata=event.metadata)
|
|
662
|
+
for event in tracker.applied_events()
|
|
663
|
+
if isinstance(event, SlotSet)
|
|
664
|
+
]
|
|
665
|
+
|
|
666
|
+
async def run(
|
|
667
|
+
self,
|
|
668
|
+
output_channel: "OutputChannel",
|
|
669
|
+
nlg: "NaturalLanguageGenerator",
|
|
670
|
+
tracker: "DialogueStateTracker",
|
|
671
|
+
domain: "Domain",
|
|
672
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
673
|
+
) -> List[Event]:
|
|
674
|
+
"""Runs action. Please see parent class for the full docstring."""
|
|
675
|
+
_events: List[Event] = [SessionStarted()]
|
|
676
|
+
|
|
677
|
+
if domain.session_config.carry_over_slots:
|
|
678
|
+
_events.extend(self._slot_set_events_from_tracker(tracker))
|
|
679
|
+
|
|
680
|
+
_events.append(ActionExecuted(ACTION_LISTEN_NAME))
|
|
681
|
+
|
|
682
|
+
return _events
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
class ActionDefaultFallback(ActionBotResponse):
|
|
686
|
+
"""Executes the fallback action and goes back to the prev state of the dialogue."""
|
|
687
|
+
|
|
688
|
+
def name(self) -> Text:
|
|
689
|
+
"""Returns action default fallback name."""
|
|
690
|
+
return ACTION_DEFAULT_FALLBACK_NAME
|
|
691
|
+
|
|
692
|
+
def __init__(self) -> None:
|
|
693
|
+
"""Initializes action default fallback."""
|
|
694
|
+
super().__init__("utter_default", silent_fail=True)
|
|
695
|
+
|
|
696
|
+
async def run(
|
|
697
|
+
self,
|
|
698
|
+
output_channel: "OutputChannel",
|
|
699
|
+
nlg: "NaturalLanguageGenerator",
|
|
700
|
+
tracker: "DialogueStateTracker",
|
|
701
|
+
domain: "Domain",
|
|
702
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
703
|
+
) -> List[Event]:
|
|
704
|
+
"""Runs action. Please see parent class for the full docstring."""
|
|
705
|
+
# only utter the response if it is available
|
|
706
|
+
evts = await super().run(output_channel, nlg, tracker, domain)
|
|
707
|
+
|
|
708
|
+
return evts + [UserUtteranceReverted()]
|
|
709
|
+
|
|
710
|
+
|
|
711
|
+
class ActionDeactivateLoop(Action):
|
|
712
|
+
"""Deactivates an active loop."""
|
|
713
|
+
|
|
714
|
+
def name(self) -> Text:
|
|
715
|
+
return ACTION_DEACTIVATE_LOOP_NAME
|
|
716
|
+
|
|
717
|
+
async def run(
|
|
718
|
+
self,
|
|
719
|
+
output_channel: "OutputChannel",
|
|
720
|
+
nlg: "NaturalLanguageGenerator",
|
|
721
|
+
tracker: "DialogueStateTracker",
|
|
722
|
+
domain: "Domain",
|
|
723
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
724
|
+
) -> List[Event]:
|
|
725
|
+
"""Runs action. Please see parent class for the full docstring."""
|
|
726
|
+
return [ActiveLoop(None), SlotSet(REQUESTED_SLOT, None)]
|
|
727
|
+
|
|
728
|
+
|
|
729
|
+
class RemoteActionJSONValidator:
|
|
730
|
+
"""
|
|
731
|
+
A validator class for ensuring that the JSON response from a custom action executor
|
|
732
|
+
adheres to the expected schema.
|
|
733
|
+
"""
|
|
734
|
+
|
|
735
|
+
@staticmethod
|
|
736
|
+
def action_response_format_spec() -> Dict[Text, Any]:
|
|
737
|
+
"""Expected response schema for an Action endpoint.
|
|
738
|
+
|
|
739
|
+
Used for validation of the response returned from the
|
|
740
|
+
Action endpoint.
|
|
741
|
+
|
|
742
|
+
Returns:
|
|
743
|
+
Dict[Text, Any]: A dictionary representing the JSON schema for validation.
|
|
744
|
+
"""
|
|
745
|
+
schema = {
|
|
746
|
+
"type": "object",
|
|
747
|
+
"properties": {
|
|
748
|
+
"events": EVENTS_SCHEMA,
|
|
749
|
+
"responses": {"type": "array", "items": {"type": "object"}},
|
|
750
|
+
},
|
|
751
|
+
}
|
|
752
|
+
return schema
|
|
753
|
+
|
|
754
|
+
@classmethod
|
|
755
|
+
def validate(cls, result: Dict[Text, Any]) -> bool:
|
|
756
|
+
"""
|
|
757
|
+
Validate the given JSON result against the expected Action response schema.
|
|
758
|
+
|
|
759
|
+
This method uses a cached JSON schema validator to check if the provided result
|
|
760
|
+
conforms to the predefined schema.
|
|
761
|
+
|
|
762
|
+
Args:
|
|
763
|
+
result (Dict[Text, Any]): The JSON response to validate.
|
|
764
|
+
|
|
765
|
+
Returns:
|
|
766
|
+
bool: True if validation is successful.
|
|
767
|
+
|
|
768
|
+
Raises:
|
|
769
|
+
ValidationError: If the JSON response does not conform to the schema.
|
|
770
|
+
"""
|
|
771
|
+
from jsonschema import ValidationError
|
|
772
|
+
|
|
773
|
+
try:
|
|
774
|
+
validator = cls.get_action_response_validator()
|
|
775
|
+
validator.validate(
|
|
776
|
+
result, RemoteActionJSONValidator.action_response_format_spec()
|
|
777
|
+
)
|
|
778
|
+
return True
|
|
779
|
+
except ValidationError as e:
|
|
780
|
+
e.message += (
|
|
781
|
+
f". Failed to validate Action server response from API, "
|
|
782
|
+
f"make sure your response from the Action endpoint is valid. "
|
|
783
|
+
f"For more information about the format visit "
|
|
784
|
+
f"{DOCS_BASE_URL}/custom-actions"
|
|
785
|
+
)
|
|
786
|
+
raise e
|
|
787
|
+
|
|
788
|
+
@classmethod
|
|
789
|
+
@lru_cache(maxsize=1)
|
|
790
|
+
def get_action_response_validator(cls) -> Draft202012Validator:
|
|
791
|
+
"""
|
|
792
|
+
Retrieve a cached JSON schema validator for the Action response schema.
|
|
793
|
+
|
|
794
|
+
Returns:
|
|
795
|
+
Draft202012Validator: An instance of the JSON schema validator.
|
|
796
|
+
"""
|
|
797
|
+
return Draft202012Validator(cls.action_response_format_spec())
|
|
798
|
+
|
|
799
|
+
|
|
800
|
+
class RemoteAction(Action):
|
|
801
|
+
def __init__(
|
|
802
|
+
self,
|
|
803
|
+
name: Text,
|
|
804
|
+
action_endpoint: Optional[EndpointConfig] = None,
|
|
805
|
+
) -> None:
|
|
806
|
+
self._name = name
|
|
807
|
+
self.action_endpoint = action_endpoint
|
|
808
|
+
self.executor = self._create_executor()
|
|
809
|
+
|
|
810
|
+
@lru_cache(maxsize=1)
|
|
811
|
+
def _create_executor(self) -> CustomActionExecutor:
|
|
812
|
+
"""Creates an executor based on the action endpoint configuration.
|
|
813
|
+
|
|
814
|
+
Returns:
|
|
815
|
+
An instance of CustomActionExecutor.
|
|
816
|
+
|
|
817
|
+
Raises:
|
|
818
|
+
RasaException: If no valid action endpoint is configured.
|
|
819
|
+
"""
|
|
820
|
+
if not self.action_endpoint:
|
|
821
|
+
return NoEndpointCustomActionExecutor(self.name())
|
|
822
|
+
|
|
823
|
+
if self.action_endpoint.kwargs.get(KEY_STUB_CUSTOM_ACTIONS):
|
|
824
|
+
return E2EStubCustomActionExecutor(self.name(), self.action_endpoint)
|
|
825
|
+
|
|
826
|
+
if self.action_endpoint.url and self.action_endpoint.actions_module:
|
|
827
|
+
raise_warning(
|
|
828
|
+
"Both 'actions_module' and 'url' are defined. "
|
|
829
|
+
"As they are mutually exclusive and 'actions_module' "
|
|
830
|
+
"is prioritized, actions will be executed by the assistant."
|
|
831
|
+
)
|
|
832
|
+
|
|
833
|
+
if self.action_endpoint and self.action_endpoint.actions_module:
|
|
834
|
+
return DirectCustomActionExecutor(self.name(), self.action_endpoint)
|
|
835
|
+
|
|
836
|
+
url_schema = get_url_schema(self.action_endpoint.url)
|
|
837
|
+
|
|
838
|
+
if url_schema == UrlSchema.GRPC:
|
|
839
|
+
return RetryCustomActionExecutor(
|
|
840
|
+
GRPCCustomActionExecutor(self.name(), self.action_endpoint)
|
|
841
|
+
)
|
|
842
|
+
elif (
|
|
843
|
+
url_schema == UrlSchema.HTTP
|
|
844
|
+
or url_schema == UrlSchema.HTTPS
|
|
845
|
+
or url_schema == UrlSchema.NOT_SPECIFIED
|
|
846
|
+
):
|
|
847
|
+
return RetryCustomActionExecutor(
|
|
848
|
+
HTTPCustomActionExecutor(self.name(), self.action_endpoint)
|
|
849
|
+
)
|
|
850
|
+
raise RasaException(
|
|
851
|
+
f"Failed to create a custom action executor. "
|
|
852
|
+
f"Please make sure to include an action endpoint configuration in your "
|
|
853
|
+
f"endpoints configuration file. Make sure that for grpc, http and https "
|
|
854
|
+
f"an url schema is set. "
|
|
855
|
+
f"Found url '{self.action_endpoint.url}'."
|
|
856
|
+
)
|
|
857
|
+
|
|
858
|
+
@staticmethod
|
|
859
|
+
async def _utter_responses(
|
|
860
|
+
responses: List[Dict[Text, Any]],
|
|
861
|
+
output_channel: "OutputChannel",
|
|
862
|
+
nlg: "NaturalLanguageGenerator",
|
|
863
|
+
tracker: "DialogueStateTracker",
|
|
864
|
+
**kwargs: Any,
|
|
865
|
+
) -> List[BotUttered]:
|
|
866
|
+
"""Use the responses generated by the action endpoint and utter them."""
|
|
867
|
+
bot_messages = []
|
|
868
|
+
domain: Domain = kwargs.get("domain", None)
|
|
869
|
+
action_name: str = kwargs.get("action_name", None)
|
|
870
|
+
for response in responses:
|
|
871
|
+
generated_response = response.pop("response", None)
|
|
872
|
+
if generated_response is not None:
|
|
873
|
+
draft = await nlg.generate(
|
|
874
|
+
generated_response, tracker, output_channel.name(), **response
|
|
875
|
+
)
|
|
876
|
+
if not draft:
|
|
877
|
+
continue
|
|
878
|
+
draft = add_bot_utterance_metadata(
|
|
879
|
+
draft, generated_response, nlg, domain, tracker
|
|
880
|
+
)
|
|
881
|
+
else:
|
|
882
|
+
draft = {UTTER_SOURCE_METADATA_KEY: action_name}
|
|
883
|
+
|
|
884
|
+
buttons = response.pop("buttons", []) or []
|
|
885
|
+
if buttons:
|
|
886
|
+
draft.setdefault("buttons", [])
|
|
887
|
+
draft["buttons"].extend(buttons)
|
|
888
|
+
|
|
889
|
+
# Avoid overwriting `draft` values with empty values
|
|
890
|
+
response = {k: v for k, v in response.items() if v}
|
|
891
|
+
draft.update(response)
|
|
892
|
+
bot_messages.append(create_bot_utterance(draft))
|
|
893
|
+
|
|
894
|
+
return bot_messages
|
|
895
|
+
|
|
896
|
+
async def run(
|
|
897
|
+
self,
|
|
898
|
+
output_channel: "OutputChannel",
|
|
899
|
+
nlg: "NaturalLanguageGenerator",
|
|
900
|
+
tracker: "DialogueStateTracker",
|
|
901
|
+
domain: "Domain",
|
|
902
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
903
|
+
) -> List[Event]:
|
|
904
|
+
"""Runs action. Please see parent class for the full docstring."""
|
|
905
|
+
response = await self.executor.run(
|
|
906
|
+
domain=domain,
|
|
907
|
+
tracker=tracker,
|
|
908
|
+
)
|
|
909
|
+
|
|
910
|
+
events_json = response.get("events", [])
|
|
911
|
+
responses = response.get("responses", [])
|
|
912
|
+
bot_messages = await self._utter_responses(
|
|
913
|
+
responses,
|
|
914
|
+
output_channel,
|
|
915
|
+
nlg,
|
|
916
|
+
tracker,
|
|
917
|
+
domain=domain,
|
|
918
|
+
action_name=self.name(),
|
|
919
|
+
)
|
|
920
|
+
|
|
921
|
+
events = rasa.shared.core.events.deserialise_events(events_json)
|
|
922
|
+
return cast(List[Event], bot_messages) + events
|
|
923
|
+
|
|
924
|
+
def name(self) -> Text:
|
|
925
|
+
return self._name
|
|
926
|
+
|
|
927
|
+
|
|
928
|
+
class ActionRevertFallbackEvents(Action):
|
|
929
|
+
"""Reverts events which were done during the `TwoStageFallbackPolicy`.
|
|
930
|
+
|
|
931
|
+
This reverts user messages and bot utterances done during a fallback
|
|
932
|
+
of the `TwoStageFallbackPolicy`. By doing so it is not necessary to
|
|
933
|
+
write custom stories for the different paths, but only of the happy
|
|
934
|
+
path. This is deprecated and can be removed once the
|
|
935
|
+
`TwoStageFallbackPolicy` is removed.
|
|
936
|
+
"""
|
|
937
|
+
|
|
938
|
+
def name(self) -> Text:
|
|
939
|
+
return ACTION_REVERT_FALLBACK_EVENTS_NAME
|
|
940
|
+
|
|
941
|
+
async def run(
|
|
942
|
+
self,
|
|
943
|
+
output_channel: "OutputChannel",
|
|
944
|
+
nlg: "NaturalLanguageGenerator",
|
|
945
|
+
tracker: "DialogueStateTracker",
|
|
946
|
+
domain: "Domain",
|
|
947
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
948
|
+
) -> List[Event]:
|
|
949
|
+
"""Runs action. Please see parent class for the full docstring."""
|
|
950
|
+
from rasa.core.policies.two_stage_fallback import has_user_rephrased
|
|
951
|
+
|
|
952
|
+
# User rephrased
|
|
953
|
+
if has_user_rephrased(tracker):
|
|
954
|
+
return _revert_successful_rephrasing(tracker)
|
|
955
|
+
# User affirmed
|
|
956
|
+
elif has_user_affirmed(tracker):
|
|
957
|
+
return _revert_affirmation_events(tracker)
|
|
958
|
+
else:
|
|
959
|
+
return []
|
|
960
|
+
|
|
961
|
+
|
|
962
|
+
class ActionUnlikelyIntent(Action):
|
|
963
|
+
"""An action that indicates that the intent predicted by NLU is unexpected.
|
|
964
|
+
|
|
965
|
+
This action can be predicted by `UnexpecTEDIntentPolicy`.
|
|
966
|
+
"""
|
|
967
|
+
|
|
968
|
+
def name(self) -> Text:
|
|
969
|
+
"""Returns the name of the action."""
|
|
970
|
+
return ACTION_UNLIKELY_INTENT_NAME
|
|
971
|
+
|
|
972
|
+
async def run(
|
|
973
|
+
self,
|
|
974
|
+
output_channel: "OutputChannel",
|
|
975
|
+
nlg: "NaturalLanguageGenerator",
|
|
976
|
+
tracker: "DialogueStateTracker",
|
|
977
|
+
domain: "Domain",
|
|
978
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
979
|
+
) -> List[Event]:
|
|
980
|
+
"""Runs action. Please see parent class for the full docstring."""
|
|
981
|
+
return []
|
|
982
|
+
|
|
983
|
+
|
|
984
|
+
def has_user_affirmed(tracker: "DialogueStateTracker") -> bool:
|
|
985
|
+
"""Indicates if the last executed action is `action_default_ask_affirmation`."""
|
|
986
|
+
return tracker.last_executed_action_has(ACTION_DEFAULT_ASK_AFFIRMATION_NAME)
|
|
987
|
+
|
|
988
|
+
|
|
989
|
+
def _revert_affirmation_events(tracker: "DialogueStateTracker") -> List[Event]:
|
|
990
|
+
revert_events = _revert_single_affirmation_events()
|
|
991
|
+
|
|
992
|
+
# User affirms the rephrased intent
|
|
993
|
+
rephrased_intent = tracker.last_executed_action_has(
|
|
994
|
+
name=ACTION_DEFAULT_ASK_REPHRASE_NAME, skip=1
|
|
995
|
+
)
|
|
996
|
+
if rephrased_intent:
|
|
997
|
+
revert_events += _revert_rephrasing_events()
|
|
998
|
+
|
|
999
|
+
last_user_event = tracker.get_last_event_for(UserUttered)
|
|
1000
|
+
if not last_user_event:
|
|
1001
|
+
raise TypeError("Cannot find last event to revert to.")
|
|
1002
|
+
|
|
1003
|
+
last_user_event = copy.deepcopy(last_user_event)
|
|
1004
|
+
# FIXME: better type annotation for `parse_data` would require
|
|
1005
|
+
# a larger refactoring (e.g. switch to dataclass)
|
|
1006
|
+
last_user_event.parse_data["intent"]["confidence"] = 1.0 # type: ignore[typeddict-item]
|
|
1007
|
+
|
|
1008
|
+
return revert_events + [last_user_event]
|
|
1009
|
+
|
|
1010
|
+
|
|
1011
|
+
def _revert_single_affirmation_events() -> List[Event]:
|
|
1012
|
+
return [
|
|
1013
|
+
UserUtteranceReverted(), # revert affirmation and request
|
|
1014
|
+
# revert original intent (has to be re-added later)
|
|
1015
|
+
UserUtteranceReverted(),
|
|
1016
|
+
# add action listen intent
|
|
1017
|
+
ActionExecuted(action_name=ACTION_LISTEN_NAME),
|
|
1018
|
+
]
|
|
1019
|
+
|
|
1020
|
+
|
|
1021
|
+
def _revert_successful_rephrasing(tracker: "DialogueStateTracker") -> List[Event]:
|
|
1022
|
+
last_user_event = tracker.get_last_event_for(UserUttered)
|
|
1023
|
+
if not last_user_event:
|
|
1024
|
+
raise TypeError("Cannot find last event to revert to.")
|
|
1025
|
+
|
|
1026
|
+
last_user_event = copy.deepcopy(last_user_event)
|
|
1027
|
+
return _revert_rephrasing_events() + [last_user_event]
|
|
1028
|
+
|
|
1029
|
+
|
|
1030
|
+
def _revert_rephrasing_events() -> List[Event]:
|
|
1031
|
+
return [
|
|
1032
|
+
UserUtteranceReverted(), # remove rephrasing
|
|
1033
|
+
# remove feedback and rephrase request
|
|
1034
|
+
UserUtteranceReverted(),
|
|
1035
|
+
# remove affirmation request and false intent
|
|
1036
|
+
UserUtteranceReverted(),
|
|
1037
|
+
# replace action with action listen
|
|
1038
|
+
ActionExecuted(action_name=ACTION_LISTEN_NAME),
|
|
1039
|
+
]
|
|
1040
|
+
|
|
1041
|
+
|
|
1042
|
+
class ActionDefaultAskAffirmation(Action):
|
|
1043
|
+
"""Default implementation which asks the user to affirm his intent.
|
|
1044
|
+
|
|
1045
|
+
It is suggested to overwrite this default action with a custom action
|
|
1046
|
+
to have more meaningful prompts for the affirmations. E.g. have a
|
|
1047
|
+
description of the intent instead of its identifier name.
|
|
1048
|
+
"""
|
|
1049
|
+
|
|
1050
|
+
def name(self) -> Text:
|
|
1051
|
+
return ACTION_DEFAULT_ASK_AFFIRMATION_NAME
|
|
1052
|
+
|
|
1053
|
+
async def run(
|
|
1054
|
+
self,
|
|
1055
|
+
output_channel: "OutputChannel",
|
|
1056
|
+
nlg: "NaturalLanguageGenerator",
|
|
1057
|
+
tracker: "DialogueStateTracker",
|
|
1058
|
+
domain: "Domain",
|
|
1059
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
1060
|
+
) -> List[Event]:
|
|
1061
|
+
"""Runs action. Please see parent class for the full docstring."""
|
|
1062
|
+
latest_message = tracker.latest_message
|
|
1063
|
+
if latest_message is None:
|
|
1064
|
+
raise TypeError(
|
|
1065
|
+
"Cannot find last user message for detecting fallback affirmation."
|
|
1066
|
+
)
|
|
1067
|
+
|
|
1068
|
+
intent_to_affirm = latest_message.intent.get(INTENT_NAME_KEY)
|
|
1069
|
+
|
|
1070
|
+
# FIXME: better type annotation for `parse_data` would require
|
|
1071
|
+
# a larger refactoring (e.g. switch to dataclass)
|
|
1072
|
+
intent_ranking = cast(
|
|
1073
|
+
List["IntentPrediction"],
|
|
1074
|
+
latest_message.parse_data.get(INTENT_RANKING_KEY) or [],
|
|
1075
|
+
)
|
|
1076
|
+
if (
|
|
1077
|
+
intent_to_affirm == DEFAULT_NLU_FALLBACK_INTENT_NAME
|
|
1078
|
+
and len(intent_ranking) > 1
|
|
1079
|
+
):
|
|
1080
|
+
intent_to_affirm = intent_ranking[1][INTENT_NAME_KEY] # type: ignore[literal-required]
|
|
1081
|
+
|
|
1082
|
+
affirmation_message = f"Did you mean '{intent_to_affirm}'?"
|
|
1083
|
+
|
|
1084
|
+
message = {
|
|
1085
|
+
"text": affirmation_message,
|
|
1086
|
+
"buttons": [
|
|
1087
|
+
{"title": "Yes", "payload": f"/{intent_to_affirm}"},
|
|
1088
|
+
{"title": "No", "payload": f"/{USER_INTENT_OUT_OF_SCOPE}"},
|
|
1089
|
+
],
|
|
1090
|
+
"utter_action": self.name(),
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
return [create_bot_utterance(message)]
|
|
1094
|
+
|
|
1095
|
+
|
|
1096
|
+
class ActionDefaultAskRephrase(ActionBotResponse):
|
|
1097
|
+
"""Default implementation which asks the user to rephrase his intent."""
|
|
1098
|
+
|
|
1099
|
+
def name(self) -> Text:
|
|
1100
|
+
"""Returns action default ask rephrase name."""
|
|
1101
|
+
return ACTION_DEFAULT_ASK_REPHRASE_NAME
|
|
1102
|
+
|
|
1103
|
+
def __init__(self) -> None:
|
|
1104
|
+
"""Initializes action default ask rephrase."""
|
|
1105
|
+
super().__init__("utter_ask_rephrase", silent_fail=True)
|
|
1106
|
+
|
|
1107
|
+
|
|
1108
|
+
class ActionSendText(Action):
|
|
1109
|
+
"""Sends a text message to the output channel."""
|
|
1110
|
+
|
|
1111
|
+
def name(self) -> Text:
|
|
1112
|
+
return ACTION_SEND_TEXT_NAME
|
|
1113
|
+
|
|
1114
|
+
async def run(
|
|
1115
|
+
self,
|
|
1116
|
+
output_channel: "OutputChannel",
|
|
1117
|
+
nlg: "NaturalLanguageGenerator",
|
|
1118
|
+
tracker: "DialogueStateTracker",
|
|
1119
|
+
domain: "Domain",
|
|
1120
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
1121
|
+
) -> List[Event]:
|
|
1122
|
+
"""Runs action. Please see parent class for the full docstring."""
|
|
1123
|
+
fallback = {"text": ""}
|
|
1124
|
+
metadata_copy = copy.deepcopy(metadata) if metadata else {}
|
|
1125
|
+
message = metadata_copy.get("message", fallback)
|
|
1126
|
+
return [create_bot_utterance(message)]
|
|
1127
|
+
|
|
1128
|
+
|
|
1129
|
+
class ActionExtractSlots(Action):
|
|
1130
|
+
"""Default action that runs after each user turn.
|
|
1131
|
+
|
|
1132
|
+
Action is executed automatically in MessageProcessor.handle_message(...)
|
|
1133
|
+
before the next predicted action is run.
|
|
1134
|
+
|
|
1135
|
+
Set slots to extracted values from user message
|
|
1136
|
+
according to assigned slot mappings.
|
|
1137
|
+
"""
|
|
1138
|
+
|
|
1139
|
+
def __init__(self, action_endpoint: Optional[EndpointConfig]) -> None:
|
|
1140
|
+
"""Initializes default action extract slots."""
|
|
1141
|
+
self._action_endpoint = action_endpoint
|
|
1142
|
+
|
|
1143
|
+
def name(self) -> Text:
|
|
1144
|
+
"""Returns action_extract_slots name."""
|
|
1145
|
+
return ACTION_EXTRACT_SLOTS
|
|
1146
|
+
|
|
1147
|
+
async def _run_custom_action(
|
|
1148
|
+
self,
|
|
1149
|
+
custom_action: Text,
|
|
1150
|
+
output_channel: "OutputChannel",
|
|
1151
|
+
nlg: "NaturalLanguageGenerator",
|
|
1152
|
+
tracker: "DialogueStateTracker",
|
|
1153
|
+
domain: "Domain",
|
|
1154
|
+
) -> List[Event]:
|
|
1155
|
+
slot_events: List[Event] = []
|
|
1156
|
+
remote_action = RemoteAction(custom_action, self._action_endpoint)
|
|
1157
|
+
disallowed_types = set()
|
|
1158
|
+
|
|
1159
|
+
try:
|
|
1160
|
+
custom_events = await remote_action.run(
|
|
1161
|
+
output_channel, nlg, tracker, domain
|
|
1162
|
+
)
|
|
1163
|
+
for event in custom_events:
|
|
1164
|
+
if isinstance(event, SlotSet):
|
|
1165
|
+
slot_events.append(event)
|
|
1166
|
+
elif isinstance(event, BotUttered):
|
|
1167
|
+
slot_events.append(event)
|
|
1168
|
+
else:
|
|
1169
|
+
disallowed_types.add(event.type_name)
|
|
1170
|
+
except (RasaException, ClientResponseError) as e:
|
|
1171
|
+
logger.warning(
|
|
1172
|
+
f"Failed to execute custom action '{custom_action}' "
|
|
1173
|
+
f"as a result of error '{e!s}'. The default action "
|
|
1174
|
+
f"'{self.name()}' failed to fill slots with custom "
|
|
1175
|
+
f"mappings."
|
|
1176
|
+
)
|
|
1177
|
+
|
|
1178
|
+
for type_name in disallowed_types:
|
|
1179
|
+
logger.info(
|
|
1180
|
+
f"Running custom action '{custom_action}' has resulted "
|
|
1181
|
+
f"in an event of type '{type_name}'. This is "
|
|
1182
|
+
f"disallowed and the tracker will not be "
|
|
1183
|
+
f"updated with this event."
|
|
1184
|
+
)
|
|
1185
|
+
|
|
1186
|
+
return slot_events
|
|
1187
|
+
|
|
1188
|
+
async def _execute_custom_action(
|
|
1189
|
+
self,
|
|
1190
|
+
mapping: Dict[Text, Any],
|
|
1191
|
+
executed_custom_actions: Set[Text],
|
|
1192
|
+
output_channel: "OutputChannel",
|
|
1193
|
+
nlg: "NaturalLanguageGenerator",
|
|
1194
|
+
tracker: "DialogueStateTracker",
|
|
1195
|
+
domain: "Domain",
|
|
1196
|
+
calm_custom_action_names: Optional[Set[str]] = None,
|
|
1197
|
+
) -> Tuple[List[Event], Set[Text]]:
|
|
1198
|
+
custom_action = mapping.get("action")
|
|
1199
|
+
|
|
1200
|
+
if not custom_action or custom_action in executed_custom_actions:
|
|
1201
|
+
return [], executed_custom_actions
|
|
1202
|
+
|
|
1203
|
+
if (
|
|
1204
|
+
calm_custom_action_names is not None
|
|
1205
|
+
and custom_action in calm_custom_action_names
|
|
1206
|
+
):
|
|
1207
|
+
return [], executed_custom_actions
|
|
1208
|
+
|
|
1209
|
+
slot_events = await self._run_custom_action(
|
|
1210
|
+
custom_action, output_channel, nlg, tracker, domain
|
|
1211
|
+
)
|
|
1212
|
+
|
|
1213
|
+
executed_custom_actions.add(custom_action)
|
|
1214
|
+
|
|
1215
|
+
return slot_events, executed_custom_actions
|
|
1216
|
+
|
|
1217
|
+
async def _execute_validation_action(
|
|
1218
|
+
self,
|
|
1219
|
+
extraction_events: List[Event],
|
|
1220
|
+
output_channel: "OutputChannel",
|
|
1221
|
+
nlg: "NaturalLanguageGenerator",
|
|
1222
|
+
tracker: "DialogueStateTracker",
|
|
1223
|
+
domain: "Domain",
|
|
1224
|
+
) -> List[Event]:
|
|
1225
|
+
slot_events: List[SlotSet] = [
|
|
1226
|
+
event for event in extraction_events if isinstance(event, SlotSet)
|
|
1227
|
+
]
|
|
1228
|
+
|
|
1229
|
+
slot_candidates = "\n".join([e.key for e in slot_events])
|
|
1230
|
+
logger.debug(f"Validating extracted slots: {slot_candidates}")
|
|
1231
|
+
|
|
1232
|
+
if ACTION_VALIDATE_SLOT_MAPPINGS not in domain.user_actions:
|
|
1233
|
+
return cast(List[Event], slot_events)
|
|
1234
|
+
|
|
1235
|
+
_tracker = DialogueStateTracker.from_events(
|
|
1236
|
+
tracker.sender_id,
|
|
1237
|
+
tracker.events_after_latest_restart() + cast(List[Event], slot_events),
|
|
1238
|
+
slots=domain.slots,
|
|
1239
|
+
)
|
|
1240
|
+
validate_events = await self._run_custom_action(
|
|
1241
|
+
ACTION_VALIDATE_SLOT_MAPPINGS, output_channel, nlg, _tracker, domain
|
|
1242
|
+
)
|
|
1243
|
+
validated_slot_names = [
|
|
1244
|
+
event.key for event in validate_events if isinstance(event, SlotSet)
|
|
1245
|
+
]
|
|
1246
|
+
|
|
1247
|
+
# If the custom action doesn't return a SlotSet event for an extracted slot
|
|
1248
|
+
# candidate we assume that it was valid. The custom action has to return a
|
|
1249
|
+
# SlotSet(slot_name, None) event to mark a Slot as invalid.
|
|
1250
|
+
return validate_events + [
|
|
1251
|
+
event for event in slot_events if event.key not in validated_slot_names
|
|
1252
|
+
]
|
|
1253
|
+
|
|
1254
|
+
async def run(
|
|
1255
|
+
self,
|
|
1256
|
+
output_channel: "OutputChannel",
|
|
1257
|
+
nlg: "NaturalLanguageGenerator",
|
|
1258
|
+
tracker: "DialogueStateTracker",
|
|
1259
|
+
domain: "Domain",
|
|
1260
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
1261
|
+
) -> List[Event]:
|
|
1262
|
+
"""Runs action. Please see parent class for the full docstring."""
|
|
1263
|
+
slot_events: List[Event] = []
|
|
1264
|
+
executed_custom_actions: Set[Text] = set()
|
|
1265
|
+
|
|
1266
|
+
user_slots = [
|
|
1267
|
+
slot
|
|
1268
|
+
for slot in domain.slots
|
|
1269
|
+
if slot.name not in DEFAULT_SLOT_NAMES | KNOWLEDGE_BASE_SLOT_NAMES
|
|
1270
|
+
]
|
|
1271
|
+
|
|
1272
|
+
calm_slot_names = set()
|
|
1273
|
+
calm_custom_action_names = None
|
|
1274
|
+
flows = None
|
|
1275
|
+
|
|
1276
|
+
if metadata is not None:
|
|
1277
|
+
flows = metadata.get("all_flows")
|
|
1278
|
+
|
|
1279
|
+
if flows is not None:
|
|
1280
|
+
flows = FlowsList.from_json(flows)
|
|
1281
|
+
calm_slot_names = flows.available_slot_names()
|
|
1282
|
+
calm_custom_action_names = flows.available_custom_actions()
|
|
1283
|
+
|
|
1284
|
+
slot_filling_manager = SlotFillingManager(
|
|
1285
|
+
domain, tracker, action_endpoint=self._action_endpoint
|
|
1286
|
+
)
|
|
1287
|
+
|
|
1288
|
+
for slot in user_slots:
|
|
1289
|
+
if slot.name in calm_slot_names:
|
|
1290
|
+
continue
|
|
1291
|
+
|
|
1292
|
+
slot_value, is_extracted = extract_slot_value(slot, slot_filling_manager)
|
|
1293
|
+
if is_extracted:
|
|
1294
|
+
slot_events.append(SlotSet(slot.name, slot_value))
|
|
1295
|
+
|
|
1296
|
+
for mapping in slot.mappings:
|
|
1297
|
+
mapping_type = SlotMappingType(mapping.get(MAPPING_TYPE))
|
|
1298
|
+
should_fill_custom_slot = mapping_type == SlotMappingType.CUSTOM
|
|
1299
|
+
|
|
1300
|
+
if should_fill_custom_slot:
|
|
1301
|
+
(
|
|
1302
|
+
custom_evts,
|
|
1303
|
+
executed_custom_actions,
|
|
1304
|
+
) = await self._execute_custom_action(
|
|
1305
|
+
mapping,
|
|
1306
|
+
executed_custom_actions,
|
|
1307
|
+
output_channel,
|
|
1308
|
+
nlg,
|
|
1309
|
+
tracker,
|
|
1310
|
+
domain,
|
|
1311
|
+
calm_custom_action_names,
|
|
1312
|
+
)
|
|
1313
|
+
slot_events.extend(custom_evts)
|
|
1314
|
+
|
|
1315
|
+
validated_events = await self._execute_validation_action(
|
|
1316
|
+
slot_events, output_channel, nlg, tracker, domain
|
|
1317
|
+
)
|
|
1318
|
+
return validated_events
|