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,97 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from dataclasses import dataclass, field
|
|
3
|
+
from typing import Any, Dict, List, Optional
|
|
4
|
+
|
|
5
|
+
import structlog
|
|
6
|
+
from rasa.core.actions import action
|
|
7
|
+
from rasa.core.channels.channel import OutputChannel
|
|
8
|
+
from rasa.core.nlg.generator import NaturalLanguageGenerator
|
|
9
|
+
from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
|
|
10
|
+
from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
|
|
11
|
+
from rasa.shared.core.constants import ACTION_CLARIFY_FLOWS
|
|
12
|
+
from rasa.shared.core.domain import Domain
|
|
13
|
+
from rasa.shared.core.events import Event
|
|
14
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
structlogger = structlog.get_logger()
|
|
18
|
+
|
|
19
|
+
FLOW_PATTERN_CLARIFICATION = RASA_DEFAULT_FLOW_PATTERN_PREFIX + "clarification"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass
|
|
23
|
+
class ClarifyPatternFlowStackFrame(PatternFlowStackFrame):
|
|
24
|
+
"""A pattern flow stack frame which helps the user clarify their action."""
|
|
25
|
+
|
|
26
|
+
flow_id: str = FLOW_PATTERN_CLARIFICATION
|
|
27
|
+
"""The ID of the flow."""
|
|
28
|
+
names: List[str] = field(default_factory=list)
|
|
29
|
+
"""The names of the flows that the user can choose from."""
|
|
30
|
+
clarification_options: str = ""
|
|
31
|
+
"""The options that the user can choose from as a string."""
|
|
32
|
+
|
|
33
|
+
@classmethod
|
|
34
|
+
def type(cls) -> str:
|
|
35
|
+
"""Returns the type of the frame."""
|
|
36
|
+
return FLOW_PATTERN_CLARIFICATION
|
|
37
|
+
|
|
38
|
+
@staticmethod
|
|
39
|
+
def from_dict(data: Dict[str, Any]) -> ClarifyPatternFlowStackFrame:
|
|
40
|
+
"""Creates a `DialogueStackFrame` from a dictionary.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
data: The dictionary to create the `DialogueStackFrame` from.
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
The created `DialogueStackFrame`.
|
|
47
|
+
"""
|
|
48
|
+
return ClarifyPatternFlowStackFrame(
|
|
49
|
+
frame_id=data["frame_id"],
|
|
50
|
+
step_id=data["step_id"],
|
|
51
|
+
names=data["names"],
|
|
52
|
+
clarification_options=data["clarification_options"],
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class ActionClarifyFlows(action.Action):
|
|
57
|
+
"""Action which clarifies which flow to start."""
|
|
58
|
+
|
|
59
|
+
def name(self) -> str:
|
|
60
|
+
"""Return the flow name."""
|
|
61
|
+
return ACTION_CLARIFY_FLOWS
|
|
62
|
+
|
|
63
|
+
@staticmethod
|
|
64
|
+
def assemble_options_string(names: List[str]) -> str:
|
|
65
|
+
"""Concatenate options to a human-readable string."""
|
|
66
|
+
clarification_message = ""
|
|
67
|
+
for i, name in enumerate(names):
|
|
68
|
+
if i == 0:
|
|
69
|
+
clarification_message += name
|
|
70
|
+
elif i == len(names) - 1:
|
|
71
|
+
clarification_message += f" or {name}"
|
|
72
|
+
else:
|
|
73
|
+
clarification_message += f", {name}"
|
|
74
|
+
return clarification_message
|
|
75
|
+
|
|
76
|
+
async def run(
|
|
77
|
+
self,
|
|
78
|
+
output_channel: "OutputChannel",
|
|
79
|
+
nlg: "NaturalLanguageGenerator",
|
|
80
|
+
tracker: "DialogueStateTracker",
|
|
81
|
+
domain: "Domain",
|
|
82
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
83
|
+
) -> List[Event]:
|
|
84
|
+
"""Correct the slots."""
|
|
85
|
+
stack = tracker.stack
|
|
86
|
+
if not (top := stack.top()):
|
|
87
|
+
structlogger.warning("action.clarify_flows.no_active_flow")
|
|
88
|
+
return []
|
|
89
|
+
|
|
90
|
+
if not isinstance(top, ClarifyPatternFlowStackFrame):
|
|
91
|
+
structlogger.warning("action.clarify_flows.no_clarification_frame", top=top)
|
|
92
|
+
return []
|
|
93
|
+
|
|
94
|
+
options_string = self.assemble_options_string(top.names)
|
|
95
|
+
top.clarification_options = options_string
|
|
96
|
+
# since we modified the stack frame, we need to update the stack
|
|
97
|
+
return tracker.create_stack_updated_events(stack)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import Any, Dict
|
|
4
|
+
|
|
5
|
+
import structlog
|
|
6
|
+
from rasa.dialogue_understanding.stack.frames import (
|
|
7
|
+
PatternFlowStackFrame,
|
|
8
|
+
)
|
|
9
|
+
from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
|
|
10
|
+
|
|
11
|
+
structlogger = structlog.get_logger()
|
|
12
|
+
|
|
13
|
+
FLOW_PATTERN_CODE_CHANGE_ID = RASA_DEFAULT_FLOW_PATTERN_PREFIX + "code_change"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class CodeChangeFlowStackFrame(PatternFlowStackFrame):
|
|
18
|
+
"""A pattern flow stack frame which cleans the stack after a bot update."""
|
|
19
|
+
|
|
20
|
+
flow_id: str = FLOW_PATTERN_CODE_CHANGE_ID
|
|
21
|
+
"""The ID of the flow."""
|
|
22
|
+
|
|
23
|
+
@classmethod
|
|
24
|
+
def type(cls) -> str:
|
|
25
|
+
"""Returns the type of the frame."""
|
|
26
|
+
return FLOW_PATTERN_CODE_CHANGE_ID
|
|
27
|
+
|
|
28
|
+
@staticmethod
|
|
29
|
+
def from_dict(data: Dict[str, Any]) -> CodeChangeFlowStackFrame:
|
|
30
|
+
"""Creates a `DialogueStackFrame` from a dictionary.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
data: The dictionary to create the `DialogueStackFrame` from.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
The created `DialogueStackFrame`.
|
|
37
|
+
"""
|
|
38
|
+
return CodeChangeFlowStackFrame(
|
|
39
|
+
frame_id=data["frame_id"],
|
|
40
|
+
step_id=data["step_id"],
|
|
41
|
+
)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import Any, Dict, List, Optional
|
|
4
|
+
from rasa.dialogue_understanding.stack.frames import DialogueStackFrame
|
|
5
|
+
from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
|
|
6
|
+
from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
|
|
7
|
+
from rasa.shared.core.flows.steps.collect import SlotRejection
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
FLOW_PATTERN_COLLECT_INFORMATION = (
|
|
11
|
+
RASA_DEFAULT_FLOW_PATTERN_PREFIX + "collect_information"
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass
|
|
16
|
+
class CollectInformationPatternFlowStackFrame(PatternFlowStackFrame):
|
|
17
|
+
"""A pattern flow stack frame which collects information from the user."""
|
|
18
|
+
|
|
19
|
+
flow_id: str = FLOW_PATTERN_COLLECT_INFORMATION
|
|
20
|
+
"""The ID of the flow."""
|
|
21
|
+
collect: str = ""
|
|
22
|
+
"""The information that should be collected from the user.
|
|
23
|
+
this corresponds to the slot that will be filled."""
|
|
24
|
+
utter: str = ""
|
|
25
|
+
"""The utter action that should be executed to ask the user for the
|
|
26
|
+
information."""
|
|
27
|
+
collect_action: str = ""
|
|
28
|
+
"""The action that should be executed to ask the user for the
|
|
29
|
+
information."""
|
|
30
|
+
rejections: Optional[List[SlotRejection]] = None
|
|
31
|
+
"""The predicate check that should be applied to the collected information.
|
|
32
|
+
If a predicate check fails, its `utter` action indicated under rejections
|
|
33
|
+
will be executed.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def type(cls) -> str:
|
|
38
|
+
"""Returns the type of the frame."""
|
|
39
|
+
return "pattern_collect_information"
|
|
40
|
+
|
|
41
|
+
@staticmethod
|
|
42
|
+
def from_dict(data: Dict[str, Any]) -> CollectInformationPatternFlowStackFrame:
|
|
43
|
+
"""Creates a `DialogueStackFrame` from a dictionary.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
data: The dictionary to create the `DialogueStackFrame` from.
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
The created `DialogueStackFrame`.
|
|
50
|
+
"""
|
|
51
|
+
rejections = data.get("rejections")
|
|
52
|
+
if rejections is not None:
|
|
53
|
+
rejections = [
|
|
54
|
+
SlotRejection.from_dict(rejection) for rejection in rejections
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
return CollectInformationPatternFlowStackFrame(
|
|
58
|
+
frame_id=data["frame_id"],
|
|
59
|
+
step_id=data["step_id"],
|
|
60
|
+
collect=data["collect"],
|
|
61
|
+
collect_action=data["collect_action"],
|
|
62
|
+
utter=data["utter"],
|
|
63
|
+
rejections=rejections,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
def context_as_dict(
|
|
67
|
+
self, underlying_frames: List[DialogueStackFrame]
|
|
68
|
+
) -> Dict[str, Any]:
|
|
69
|
+
"""Returns the context of the frame as a dictionary.
|
|
70
|
+
|
|
71
|
+
The collect information frame needs a special implementation as
|
|
72
|
+
it includes the context of the underlying frame in its context.
|
|
73
|
+
|
|
74
|
+
This corresponds to the user expectation when e.g. using templates
|
|
75
|
+
in a collect information node.
|
|
76
|
+
"""
|
|
77
|
+
context = super().context_as_dict(underlying_frames)
|
|
78
|
+
|
|
79
|
+
if underlying_frames:
|
|
80
|
+
underlying_context = underlying_frames[-1].context_as_dict(
|
|
81
|
+
underlying_frames[:-1]
|
|
82
|
+
)
|
|
83
|
+
else:
|
|
84
|
+
underlying_context = {}
|
|
85
|
+
|
|
86
|
+
# the collect information frame is a special case, as it is not
|
|
87
|
+
# a regular frame, but a frame that is used to collect information
|
|
88
|
+
|
|
89
|
+
context.update(underlying_context)
|
|
90
|
+
return context
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import Any, Dict
|
|
4
|
+
|
|
5
|
+
from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
|
|
6
|
+
from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
FLOW_PATTERN_COMPLETED = RASA_DEFAULT_FLOW_PATTERN_PREFIX + "completed"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass
|
|
13
|
+
class CompletedPatternFlowStackFrame(PatternFlowStackFrame):
|
|
14
|
+
"""A pattern flow stack frame which gets added if all prior flows are completed."""
|
|
15
|
+
|
|
16
|
+
flow_id: str = FLOW_PATTERN_COMPLETED
|
|
17
|
+
"""The ID of the flow."""
|
|
18
|
+
previous_flow_name: str = ""
|
|
19
|
+
"""The name of the last flow that was completed."""
|
|
20
|
+
|
|
21
|
+
@classmethod
|
|
22
|
+
def type(cls) -> str:
|
|
23
|
+
"""Returns the type of the frame."""
|
|
24
|
+
return FLOW_PATTERN_COMPLETED
|
|
25
|
+
|
|
26
|
+
@staticmethod
|
|
27
|
+
def from_dict(data: Dict[str, Any]) -> CompletedPatternFlowStackFrame:
|
|
28
|
+
"""Creates a `DialogueStackFrame` from a dictionary.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
data: The dictionary to create the `DialogueStackFrame` from.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
The created `DialogueStackFrame`.
|
|
35
|
+
"""
|
|
36
|
+
return CompletedPatternFlowStackFrame(
|
|
37
|
+
frame_id=data["frame_id"],
|
|
38
|
+
step_id=data["step_id"],
|
|
39
|
+
previous_flow_name=data["previous_flow_name"],
|
|
40
|
+
)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import Any, Dict
|
|
4
|
+
|
|
5
|
+
from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
|
|
6
|
+
from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
FLOW_PATTERN_CONTINUE_INTERRUPTED = (
|
|
10
|
+
RASA_DEFAULT_FLOW_PATTERN_PREFIX + "continue_interrupted"
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
class ContinueInterruptedPatternFlowStackFrame(PatternFlowStackFrame):
|
|
16
|
+
"""A pattern flow stack frame that gets added if an interruption is completed."""
|
|
17
|
+
|
|
18
|
+
flow_id: str = FLOW_PATTERN_CONTINUE_INTERRUPTED
|
|
19
|
+
"""The ID of the flow."""
|
|
20
|
+
previous_flow_name: str = ""
|
|
21
|
+
"""The name of the flow that was interrupted."""
|
|
22
|
+
|
|
23
|
+
@classmethod
|
|
24
|
+
def type(cls) -> str:
|
|
25
|
+
"""Returns the type of the frame."""
|
|
26
|
+
return FLOW_PATTERN_CONTINUE_INTERRUPTED
|
|
27
|
+
|
|
28
|
+
@staticmethod
|
|
29
|
+
def from_dict(data: Dict[str, Any]) -> ContinueInterruptedPatternFlowStackFrame:
|
|
30
|
+
"""Creates a `DialogueStackFrame` from a dictionary.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
data: The dictionary to create the `DialogueStackFrame` from.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
The created `DialogueStackFrame`.
|
|
37
|
+
"""
|
|
38
|
+
return ContinueInterruptedPatternFlowStackFrame(
|
|
39
|
+
frame_id=data["frame_id"],
|
|
40
|
+
step_id=data["step_id"],
|
|
41
|
+
previous_flow_name=data["previous_flow_name"],
|
|
42
|
+
)
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from dataclasses import dataclass, field
|
|
3
|
+
from typing import Any, Dict, Text, List, Optional
|
|
4
|
+
|
|
5
|
+
import structlog
|
|
6
|
+
from rasa.core.actions import action
|
|
7
|
+
from rasa.core.channels import OutputChannel
|
|
8
|
+
from rasa.core.nlg import NaturalLanguageGenerator
|
|
9
|
+
from rasa.dialogue_understanding.patterns.collect_information import (
|
|
10
|
+
CollectInformationPatternFlowStackFrame,
|
|
11
|
+
)
|
|
12
|
+
from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
|
|
13
|
+
from rasa.dialogue_understanding.stack.frames import (
|
|
14
|
+
BaseFlowStackFrame,
|
|
15
|
+
PatternFlowStackFrame,
|
|
16
|
+
)
|
|
17
|
+
from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
|
|
18
|
+
DialogueStackFrame,
|
|
19
|
+
)
|
|
20
|
+
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
21
|
+
FlowStackFrameType,
|
|
22
|
+
UserFlowStackFrame,
|
|
23
|
+
)
|
|
24
|
+
from rasa.dialogue_understanding.stack.utils import top_user_flow_frame
|
|
25
|
+
from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
|
|
26
|
+
from rasa.shared.core.constants import ACTION_CORRECT_FLOW_SLOT
|
|
27
|
+
from rasa.shared.core.domain import Domain
|
|
28
|
+
from rasa.shared.core.events import Event, SlotSet
|
|
29
|
+
from rasa.shared.core.flows.flow import ContinueFlowStep, END_STEP, START_STEP
|
|
30
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
31
|
+
|
|
32
|
+
structlogger = structlog.get_logger()
|
|
33
|
+
|
|
34
|
+
FLOW_PATTERN_CORRECTION_ID = RASA_DEFAULT_FLOW_PATTERN_PREFIX + "correction"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass
|
|
38
|
+
class CorrectionPatternFlowStackFrame(PatternFlowStackFrame):
|
|
39
|
+
"""A pattern flow stack frame which gets added if a slot value is corrected."""
|
|
40
|
+
|
|
41
|
+
flow_id: str = FLOW_PATTERN_CORRECTION_ID
|
|
42
|
+
"""The ID of the flow."""
|
|
43
|
+
is_reset_only: bool = False
|
|
44
|
+
"""Whether the correction is only a reset of the flow.
|
|
45
|
+
|
|
46
|
+
This is the case if all corrected slots have `ask_before_filling=True`.
|
|
47
|
+
In this case, we do not set their value directly but rather reset the flow
|
|
48
|
+
to the position where the first question is asked to fill the slot."""
|
|
49
|
+
corrected_slots: Dict[str, Any] = field(default_factory=dict)
|
|
50
|
+
"""The slots that were corrected."""
|
|
51
|
+
reset_flow_id: Optional[str] = None
|
|
52
|
+
"""The ID of the flow to reset to."""
|
|
53
|
+
reset_step_id: Optional[str] = None
|
|
54
|
+
"""The ID of the step to reset to."""
|
|
55
|
+
|
|
56
|
+
@classmethod
|
|
57
|
+
def type(cls) -> str:
|
|
58
|
+
"""Returns the type of the frame."""
|
|
59
|
+
return FLOW_PATTERN_CORRECTION_ID
|
|
60
|
+
|
|
61
|
+
@staticmethod
|
|
62
|
+
def from_dict(data: Dict[Text, Any]) -> CorrectionPatternFlowStackFrame:
|
|
63
|
+
"""Creates a `DialogueStackFrame` from a dictionary.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
data: The dictionary to create the `DialogueStackFrame` from.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
The created `DialogueStackFrame`.
|
|
70
|
+
"""
|
|
71
|
+
return CorrectionPatternFlowStackFrame(
|
|
72
|
+
frame_id=data["frame_id"],
|
|
73
|
+
step_id=data["step_id"],
|
|
74
|
+
is_reset_only=data["is_reset_only"],
|
|
75
|
+
corrected_slots=data["corrected_slots"],
|
|
76
|
+
reset_flow_id=data["reset_flow_id"],
|
|
77
|
+
reset_step_id=data["reset_step_id"],
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class ActionCorrectFlowSlot(action.Action):
|
|
82
|
+
"""Action which corrects a slots value in a flow."""
|
|
83
|
+
|
|
84
|
+
def __init__(self) -> None:
|
|
85
|
+
"""Creates a `ActionCorrectFlowSlot`."""
|
|
86
|
+
super().__init__()
|
|
87
|
+
|
|
88
|
+
def name(self) -> Text:
|
|
89
|
+
"""Return the flow name."""
|
|
90
|
+
return ACTION_CORRECT_FLOW_SLOT
|
|
91
|
+
|
|
92
|
+
async def run(
|
|
93
|
+
self,
|
|
94
|
+
output_channel: "OutputChannel",
|
|
95
|
+
nlg: "NaturalLanguageGenerator",
|
|
96
|
+
tracker: "DialogueStateTracker",
|
|
97
|
+
domain: "Domain",
|
|
98
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
99
|
+
) -> List[Event]:
|
|
100
|
+
"""Correct the slots."""
|
|
101
|
+
stack = tracker.stack
|
|
102
|
+
if not (top := stack.top()):
|
|
103
|
+
structlogger.warning("action.correct_flow_slot.no_active_flow")
|
|
104
|
+
return []
|
|
105
|
+
|
|
106
|
+
if not isinstance(top, CorrectionPatternFlowStackFrame):
|
|
107
|
+
structlogger.warning(
|
|
108
|
+
"action.correct_flow_slot.no_correction_frame", top=top
|
|
109
|
+
)
|
|
110
|
+
return []
|
|
111
|
+
|
|
112
|
+
events: List[Event] = []
|
|
113
|
+
if top.reset_flow_id:
|
|
114
|
+
updated_stack = reset_stack_on_tracker_to_prior_state(
|
|
115
|
+
top.reset_flow_id, top.reset_step_id or START_STEP, tracker
|
|
116
|
+
)
|
|
117
|
+
events.extend(tracker.create_stack_updated_events(updated_stack))
|
|
118
|
+
|
|
119
|
+
events.extend([SlotSet(k, v) for k, v in top.corrected_slots.items()])
|
|
120
|
+
return events
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def find_previous_state_to_reset_to(
|
|
124
|
+
reset_flow_id: str, reset_step_id: str, tracker: DialogueStateTracker
|
|
125
|
+
) -> Optional[DialogueStack]:
|
|
126
|
+
"""Find the previous stack state where the reset step was the active stack frame.
|
|
127
|
+
|
|
128
|
+
Looks for the most recent state of the stack in the tracker where the top
|
|
129
|
+
flow has the same flow id and step id as the reset flow id and reset step id.
|
|
130
|
+
"""
|
|
131
|
+
stack_to_reset_to: Optional[DialogueStack] = None
|
|
132
|
+
for previous_stack_state in tracker.previous_stack_states():
|
|
133
|
+
top_frame = previous_stack_state.top()
|
|
134
|
+
if (
|
|
135
|
+
isinstance(top_frame, BaseFlowStackFrame)
|
|
136
|
+
and top_frame.flow_id == reset_flow_id
|
|
137
|
+
and top_frame.step_id == reset_step_id
|
|
138
|
+
):
|
|
139
|
+
stack_to_reset_to = previous_stack_state
|
|
140
|
+
return stack_to_reset_to
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def slice_of_stack_below_target(
|
|
144
|
+
target_frame: DialogueStackFrame, stack: DialogueStack
|
|
145
|
+
) -> List[DialogueStackFrame]:
|
|
146
|
+
"""Get all the frames from the current stack up until the target frame.
|
|
147
|
+
|
|
148
|
+
The target frame is not included."""
|
|
149
|
+
replacement_stack: List[DialogueStackFrame] = []
|
|
150
|
+
|
|
151
|
+
for frame in stack.frames:
|
|
152
|
+
if frame.frame_id == target_frame.frame_id:
|
|
153
|
+
break
|
|
154
|
+
replacement_stack.append(frame)
|
|
155
|
+
return replacement_stack
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def slice_of_stack_with_target_and_above(
|
|
159
|
+
target_frame: DialogueStackFrame, stack: DialogueStack
|
|
160
|
+
) -> List[DialogueStackFrame]:
|
|
161
|
+
"""Get all the frames from the current stack starting at the target frame."""
|
|
162
|
+
replacement_frames: List[DialogueStackFrame] = []
|
|
163
|
+
for frame in reversed(stack.frames):
|
|
164
|
+
replacement_frames.insert(0, frame) # push to front, since reversed
|
|
165
|
+
if frame.frame_id == target_frame.frame_id:
|
|
166
|
+
break
|
|
167
|
+
return replacement_frames
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def set_topmost_flow_frame_to_continue(stack_frames: List[DialogueStackFrame]) -> None:
|
|
171
|
+
"""Ensure that the topmost flow frame continues its step.
|
|
172
|
+
|
|
173
|
+
This ensures that the topmost step can be re-executed."""
|
|
174
|
+
for frame in reversed(stack_frames):
|
|
175
|
+
if isinstance(frame, BaseFlowStackFrame) and frame.step_id != START_STEP:
|
|
176
|
+
frame.step_id = ContinueFlowStep.continue_step_for_id(frame.step_id)
|
|
177
|
+
break
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def create_termination_frames_for_missing_frames(
|
|
181
|
+
new_stack_frames: List[DialogueStackFrame], previous_stack: DialogueStack
|
|
182
|
+
) -> List[DialogueStackFrame]:
|
|
183
|
+
"""Terminate frames that are part in the previous stack but not in the new stack.
|
|
184
|
+
|
|
185
|
+
The frames are terminated by setting them to the END_STEP. This allows
|
|
186
|
+
them to be properly wrapped up.
|
|
187
|
+
"""
|
|
188
|
+
|
|
189
|
+
reused_frame_ids = {frame.frame_id for frame in new_stack_frames}
|
|
190
|
+
|
|
191
|
+
frames_to_terminate: List[DialogueStackFrame] = []
|
|
192
|
+
for frame in reversed(previous_stack.frames):
|
|
193
|
+
if frame.frame_id in reused_frame_ids:
|
|
194
|
+
# this frame already exists in the replacement stack, skip it
|
|
195
|
+
# shouldn't be terminated
|
|
196
|
+
continue
|
|
197
|
+
if (
|
|
198
|
+
isinstance(frame, UserFlowStackFrame)
|
|
199
|
+
and frame.frame_type == FlowStackFrameType.CALL
|
|
200
|
+
):
|
|
201
|
+
frame.step_id = ContinueFlowStep.continue_step_for_id(END_STEP)
|
|
202
|
+
if isinstance(frame, CollectInformationPatternFlowStackFrame):
|
|
203
|
+
frame.step_id = ContinueFlowStep.continue_step_for_id(END_STEP)
|
|
204
|
+
frames_to_terminate.insert(0, frame)
|
|
205
|
+
return frames_to_terminate
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def reset_stack_on_tracker_to_prior_state(
|
|
209
|
+
reset_flow_id: str, reset_step_id: str, tracker: DialogueStateTracker
|
|
210
|
+
) -> DialogueStack:
|
|
211
|
+
"""Reset the stack on the tracker to the prior state."""
|
|
212
|
+
# assumption is that we have already been at the reset step id in the reset flow
|
|
213
|
+
# at some point before in the tracker. we'll search for that point in time and
|
|
214
|
+
# update the current stack to be as close to that time as possible,
|
|
215
|
+
# jumping back in time.
|
|
216
|
+
stack_to_reset_to: Optional[DialogueStack] = find_previous_state_to_reset_to(
|
|
217
|
+
reset_flow_id, reset_step_id, tracker
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
if not stack_to_reset_to:
|
|
221
|
+
structlogger.warning(
|
|
222
|
+
"action.correct_flow_slot.no_frame_found",
|
|
223
|
+
reset_step_id=reset_step_id,
|
|
224
|
+
reset_flow_id=reset_flow_id,
|
|
225
|
+
)
|
|
226
|
+
return tracker.stack
|
|
227
|
+
|
|
228
|
+
target_frame = top_user_flow_frame(stack_to_reset_to)
|
|
229
|
+
|
|
230
|
+
if not target_frame:
|
|
231
|
+
structlogger.warning(
|
|
232
|
+
"action.correct_flow_slot.no_target_frame_found",
|
|
233
|
+
reset_step_id=reset_step_id,
|
|
234
|
+
reset_flow_id=reset_flow_id,
|
|
235
|
+
stack_to_reset_to=stack_to_reset_to,
|
|
236
|
+
)
|
|
237
|
+
return tracker.stack
|
|
238
|
+
|
|
239
|
+
current_stack = tracker.stack
|
|
240
|
+
|
|
241
|
+
# Approach we use to reset the stack:
|
|
242
|
+
# 1. Search through all past stack states and identify the most recent
|
|
243
|
+
# state where the stack had the given flow and step id on top. This
|
|
244
|
+
# stack is the reference stack.
|
|
245
|
+
# 2. On the reference stack, identify the top most user flow frame that
|
|
246
|
+
# was not started through a flow call. This frame is the reference frame.
|
|
247
|
+
# 3. Create a new stack by stacking the following frames: A) all frames
|
|
248
|
+
# from the current stack that are strictly below the reference
|
|
249
|
+
# frame. B) all frames including the reference frame and frames above
|
|
250
|
+
# it from the reference stack. C) all frames from the current stack
|
|
251
|
+
# that are strictly above the reference frame and set them to their
|
|
252
|
+
# end step.
|
|
253
|
+
# 4. This will ensure A) we keep anything from the current stack that is
|
|
254
|
+
# below the current active user flow. B) We reset the current user
|
|
255
|
+
# flow to the desired position. C) we wrap up all unfinished frames
|
|
256
|
+
# above the current user flow from the current state.
|
|
257
|
+
|
|
258
|
+
replacement_stack: List[DialogueStackFrame] = []
|
|
259
|
+
|
|
260
|
+
# get all the frames from the current stack up until the target frame
|
|
261
|
+
# and put them into the replacement stack. the target frame is not included
|
|
262
|
+
replacement_stack.extend(slice_of_stack_below_target(target_frame, current_stack))
|
|
263
|
+
|
|
264
|
+
replacement_stack.extend(
|
|
265
|
+
slice_of_stack_with_target_and_above(target_frame, stack_to_reset_to)
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
# ensure that we continue the topmost frames step
|
|
269
|
+
set_topmost_flow_frame_to_continue(replacement_stack)
|
|
270
|
+
|
|
271
|
+
# terminate all the frames from the original stack that are not part of the
|
|
272
|
+
# replacement stack. this will add these frames to the replacement stack,
|
|
273
|
+
# but with their step set to END_STEP. this allows them to be properly
|
|
274
|
+
# wrapped up before we head into the correction.
|
|
275
|
+
replacement_stack.extend(
|
|
276
|
+
create_termination_frames_for_missing_frames(replacement_stack, current_stack)
|
|
277
|
+
)
|
|
278
|
+
return DialogueStack(frames=replacement_stack)
|