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,720 @@
|
|
|
1
|
+
from typing import List, Optional, Type, Set, Dict
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
from rasa.shared.core.training_data.structures import StoryGraph
|
|
5
|
+
from rasa.dialogue_understanding.commands import (
|
|
6
|
+
CancelFlowCommand,
|
|
7
|
+
ClarifyCommand,
|
|
8
|
+
Command,
|
|
9
|
+
CorrectSlotsCommand,
|
|
10
|
+
CorrectedSlot,
|
|
11
|
+
RepeatBotMessagesCommand,
|
|
12
|
+
SetSlotCommand,
|
|
13
|
+
StartFlowCommand,
|
|
14
|
+
FreeFormAnswerCommand,
|
|
15
|
+
ChitChatAnswerCommand,
|
|
16
|
+
CannotHandleCommand,
|
|
17
|
+
)
|
|
18
|
+
from rasa.dialogue_understanding.commands.handle_code_change_command import (
|
|
19
|
+
HandleCodeChangeCommand,
|
|
20
|
+
)
|
|
21
|
+
from rasa.dialogue_understanding.commands.set_slot_command import SetSlotExtractor
|
|
22
|
+
from rasa.dialogue_understanding.patterns.chitchat import FLOW_PATTERN_CHITCHAT
|
|
23
|
+
from rasa.dialogue_understanding.patterns.collect_information import (
|
|
24
|
+
CollectInformationPatternFlowStackFrame,
|
|
25
|
+
)
|
|
26
|
+
from rasa.dialogue_understanding.patterns.correction import (
|
|
27
|
+
CorrectionPatternFlowStackFrame,
|
|
28
|
+
)
|
|
29
|
+
from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
|
|
30
|
+
from rasa.dialogue_understanding.stack.frames import (
|
|
31
|
+
BaseFlowStackFrame,
|
|
32
|
+
)
|
|
33
|
+
from rasa.dialogue_understanding.stack.utils import (
|
|
34
|
+
filled_slots_for_active_flow,
|
|
35
|
+
top_flow_frame,
|
|
36
|
+
)
|
|
37
|
+
from rasa.engine.graph import ExecutionContext
|
|
38
|
+
from rasa.shared.constants import (
|
|
39
|
+
ROUTE_TO_CALM_SLOT,
|
|
40
|
+
RASA_PATTERN_CANNOT_HANDLE_CHITCHAT,
|
|
41
|
+
)
|
|
42
|
+
from rasa.shared.core.constants import ACTION_TRIGGER_CHITCHAT, SlotMappingType
|
|
43
|
+
from rasa.shared.core.constants import FLOW_HASHES_SLOT
|
|
44
|
+
from rasa.shared.core.events import Event, SlotSet
|
|
45
|
+
from rasa.shared.core.flows import FlowsList
|
|
46
|
+
from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
|
|
47
|
+
from rasa.shared.core.slots import Slot
|
|
48
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
49
|
+
from rasa.shared.nlu.constants import COMMANDS
|
|
50
|
+
|
|
51
|
+
structlogger = structlog.get_logger()
|
|
52
|
+
|
|
53
|
+
CANNOT_HANDLE_REASON = (
|
|
54
|
+
"A command generator attempted to set a slot "
|
|
55
|
+
"with a value extracted by an extractor "
|
|
56
|
+
"that is incompatible with the slot mapping type."
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def contains_command(commands: List[Command], typ: Type[Command]) -> bool:
|
|
61
|
+
"""Check if a list of commands contains a command of a given type.
|
|
62
|
+
|
|
63
|
+
Example:
|
|
64
|
+
>>> contains_command([SetSlotCommand("foo", "bar")], SetSlotCommand)
|
|
65
|
+
True
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
commands: The commands to check.
|
|
69
|
+
typ: The type of command to check for.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
`True` if the list of commands contains a command of the given type.
|
|
73
|
+
"""
|
|
74
|
+
return any(isinstance(command, typ) for command in commands)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def get_commands_from_tracker(tracker: DialogueStateTracker) -> List[Command]:
|
|
78
|
+
"""Extracts the commands from the tracker.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
tracker: The tracker containing the conversation history up to now.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
The commands.
|
|
85
|
+
"""
|
|
86
|
+
if tracker.latest_message:
|
|
87
|
+
dumped_commands = tracker.latest_message.parse_data.get(COMMANDS) or []
|
|
88
|
+
assert isinstance(dumped_commands, list)
|
|
89
|
+
return [Command.command_from_json(command) for command in dumped_commands]
|
|
90
|
+
else:
|
|
91
|
+
return []
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def filter_start_flow_commands(commands: List[Command]) -> List[str]:
|
|
95
|
+
"""Filters the start flow commands from a list of commands."""
|
|
96
|
+
return [
|
|
97
|
+
command.flow for command in commands if isinstance(command, StartFlowCommand)
|
|
98
|
+
]
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def validate_state_of_commands(commands: List[Command]) -> None:
|
|
102
|
+
"""Validates the state of the commands.
|
|
103
|
+
|
|
104
|
+
We have some invariants that should always hold true. This function
|
|
105
|
+
checks if they do. Executing the commands relies on these invariants.
|
|
106
|
+
|
|
107
|
+
We cleanup the commands before executing them, so the cleanup should
|
|
108
|
+
always make sure that these invariants hold true - no matter the commands
|
|
109
|
+
that are provided.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
commands: The commands to validate.
|
|
113
|
+
|
|
114
|
+
Raises:
|
|
115
|
+
ValueError: If the state of the commands is invalid.
|
|
116
|
+
"""
|
|
117
|
+
# check that there is only at max one cancel flow command
|
|
118
|
+
if sum(isinstance(c, CancelFlowCommand) for c in commands) > 1:
|
|
119
|
+
structlogger.error(
|
|
120
|
+
"command_processor.validate_state_of_commands.multiple_cancel_flow_commands",
|
|
121
|
+
commands=commands,
|
|
122
|
+
)
|
|
123
|
+
raise ValueError("There can only be one cancel flow command.")
|
|
124
|
+
|
|
125
|
+
# check that free form answer commands are only at the beginning of the list
|
|
126
|
+
free_form_answer_commands = [
|
|
127
|
+
c for c in commands if isinstance(c, FreeFormAnswerCommand)
|
|
128
|
+
]
|
|
129
|
+
if free_form_answer_commands != commands[: len(free_form_answer_commands)]:
|
|
130
|
+
structlogger.error(
|
|
131
|
+
"command_processor.validate_state_of_commands.free_form_answer_commands_not_at_beginning",
|
|
132
|
+
commands=commands,
|
|
133
|
+
)
|
|
134
|
+
raise ValueError(
|
|
135
|
+
"Free form answer commands must be at start of the predicted command list."
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
# check that there is at max only one correctslots command
|
|
139
|
+
if sum(isinstance(c, CorrectSlotsCommand) for c in commands) > 1:
|
|
140
|
+
structlogger.error(
|
|
141
|
+
"command_processor.validate_state_of_commands.multiple_correct_slots_commands",
|
|
142
|
+
commands=commands,
|
|
143
|
+
)
|
|
144
|
+
raise ValueError("There can only be one correct slots command.")
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def find_updated_flows(tracker: DialogueStateTracker, all_flows: FlowsList) -> Set[str]:
|
|
148
|
+
"""Find the set of updated flows.
|
|
149
|
+
|
|
150
|
+
Run through the current dialogue stack and compare the flow hashes of the
|
|
151
|
+
flows on the stack with those stored in the tracker.
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
tracker: The tracker.
|
|
155
|
+
all_flows: All flows.
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
A set of flow ids of those flows that have changed
|
|
159
|
+
"""
|
|
160
|
+
stored_fingerprints: Dict[str, str] = tracker.get_slot(FLOW_HASHES_SLOT) or {}
|
|
161
|
+
stack = tracker.stack
|
|
162
|
+
|
|
163
|
+
changed_flows = set()
|
|
164
|
+
for frame in stack.frames:
|
|
165
|
+
if isinstance(frame, BaseFlowStackFrame):
|
|
166
|
+
flow = all_flows.flow_by_id(frame.flow_id)
|
|
167
|
+
if flow is None or (
|
|
168
|
+
flow.id in stored_fingerprints
|
|
169
|
+
and flow.fingerprint != stored_fingerprints[flow.id]
|
|
170
|
+
):
|
|
171
|
+
changed_flows.add(frame.flow_id)
|
|
172
|
+
return changed_flows
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def calculate_flow_fingerprints(all_flows: FlowsList) -> Dict[str, str]:
|
|
176
|
+
"""Calculate fingerprints for all flows."""
|
|
177
|
+
return {flow.id: flow.fingerprint for flow in all_flows.underlying_flows}
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def execute_commands(
|
|
181
|
+
tracker: DialogueStateTracker,
|
|
182
|
+
all_flows: FlowsList,
|
|
183
|
+
execution_context: ExecutionContext,
|
|
184
|
+
story_graph: Optional[StoryGraph] = None,
|
|
185
|
+
) -> List[Event]:
|
|
186
|
+
"""Executes a list of commands.
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
commands: The commands to execute.
|
|
190
|
+
tracker: The tracker to execute the commands on.
|
|
191
|
+
all_flows: All flows.
|
|
192
|
+
execution_context: Information about the single graph run.
|
|
193
|
+
story_graph: StoryGraph object with stories available for training.
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
A list of the events that were created.
|
|
197
|
+
"""
|
|
198
|
+
commands: List[Command] = get_commands_from_tracker(tracker)
|
|
199
|
+
original_tracker = tracker.copy()
|
|
200
|
+
|
|
201
|
+
commands = clean_up_commands(
|
|
202
|
+
commands, tracker, all_flows, execution_context, story_graph
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
updated_flows = find_updated_flows(tracker, all_flows)
|
|
206
|
+
if updated_flows:
|
|
207
|
+
# Override commands
|
|
208
|
+
structlogger.debug(
|
|
209
|
+
"command_processor.execute_commands.running_flows_were_updated",
|
|
210
|
+
updated_flow_ids=updated_flows,
|
|
211
|
+
)
|
|
212
|
+
commands = [HandleCodeChangeCommand()]
|
|
213
|
+
|
|
214
|
+
# store current flow hashes if they changed
|
|
215
|
+
new_hashes = calculate_flow_fingerprints(all_flows)
|
|
216
|
+
flow_hash_events: List[Event] = []
|
|
217
|
+
if new_hashes != (tracker.get_slot(FLOW_HASHES_SLOT) or {}):
|
|
218
|
+
flow_hash_events.append(SlotSet(FLOW_HASHES_SLOT, new_hashes))
|
|
219
|
+
tracker.update_with_events(flow_hash_events)
|
|
220
|
+
|
|
221
|
+
events: List[Event] = flow_hash_events
|
|
222
|
+
|
|
223
|
+
# commands need to be reversed to make sure they end up in the right order
|
|
224
|
+
# on the stack. e.g. if there multiple start flow commands, the first one
|
|
225
|
+
# should be on top of the stack. this is achieved by reversing the list
|
|
226
|
+
# and then pushing the commands onto the stack in the reversed order.
|
|
227
|
+
reversed_commands = list(reversed(commands))
|
|
228
|
+
|
|
229
|
+
validate_state_of_commands(commands)
|
|
230
|
+
|
|
231
|
+
for command in reversed_commands:
|
|
232
|
+
new_events = command.run_command_on_tracker(
|
|
233
|
+
tracker, all_flows, original_tracker
|
|
234
|
+
)
|
|
235
|
+
events.extend(new_events)
|
|
236
|
+
tracker.update_with_events(new_events)
|
|
237
|
+
|
|
238
|
+
return remove_duplicated_set_slots(events)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def remove_duplicated_set_slots(events: List[Event]) -> List[Event]:
|
|
242
|
+
"""Removes duplicated set slot events.
|
|
243
|
+
|
|
244
|
+
This can happen if a slot is set multiple times in a row. We only want to
|
|
245
|
+
keep the last one.
|
|
246
|
+
|
|
247
|
+
Args:
|
|
248
|
+
events: The events to optimize.
|
|
249
|
+
|
|
250
|
+
Returns:
|
|
251
|
+
The optimized events.
|
|
252
|
+
"""
|
|
253
|
+
slots_so_far = set()
|
|
254
|
+
|
|
255
|
+
optimized_events: List[Event] = []
|
|
256
|
+
|
|
257
|
+
for event in reversed(events):
|
|
258
|
+
if isinstance(event, SlotSet) and event.key in slots_so_far:
|
|
259
|
+
# slot will be overwritten, no need to set it
|
|
260
|
+
continue
|
|
261
|
+
elif isinstance(event, SlotSet):
|
|
262
|
+
slots_so_far.add(event.key)
|
|
263
|
+
|
|
264
|
+
optimized_events.append(event)
|
|
265
|
+
|
|
266
|
+
# since we reversed the original events, we need to reverse the optimized
|
|
267
|
+
# events again to get them in the right order
|
|
268
|
+
return list(reversed(optimized_events))
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
def get_current_collect_step(
|
|
272
|
+
dialogue_stack: DialogueStack, all_flows: FlowsList
|
|
273
|
+
) -> Optional[CollectInformationFlowStep]:
|
|
274
|
+
"""Get the current collect information if the conversation is currently in one.
|
|
275
|
+
|
|
276
|
+
If we are currently in a collect information step, the stack should have at least
|
|
277
|
+
two frames. The top frame is the collect information pattern and the frame below
|
|
278
|
+
is the flow that triggered the collect information pattern. We can use the flow
|
|
279
|
+
id to get the collect information step from the flow.
|
|
280
|
+
|
|
281
|
+
Args:
|
|
282
|
+
dialogue_stack: The dialogue stack.
|
|
283
|
+
all_flows: All flows.
|
|
284
|
+
|
|
285
|
+
Returns:
|
|
286
|
+
The current collect information if the conversation is currently in one,
|
|
287
|
+
`None` otherwise.
|
|
288
|
+
"""
|
|
289
|
+
if not (top_frame := dialogue_stack.top()):
|
|
290
|
+
# we are currently not in a flow
|
|
291
|
+
return None
|
|
292
|
+
|
|
293
|
+
if not isinstance(top_frame, CollectInformationPatternFlowStackFrame):
|
|
294
|
+
# we are currently not in a collect information
|
|
295
|
+
return None
|
|
296
|
+
|
|
297
|
+
if len(dialogue_stack.frames) <= 1:
|
|
298
|
+
# for some reason only the collect information pattern step is on the stack
|
|
299
|
+
# but no flow that triggered it. this should never happen.
|
|
300
|
+
structlogger.warning(
|
|
301
|
+
"command_processor.get_current_collect_step.no_flow_on_stack",
|
|
302
|
+
stack=dialogue_stack,
|
|
303
|
+
)
|
|
304
|
+
return None
|
|
305
|
+
|
|
306
|
+
frame_that_triggered_collect_infos = dialogue_stack.frames[-2]
|
|
307
|
+
if not isinstance(frame_that_triggered_collect_infos, BaseFlowStackFrame):
|
|
308
|
+
# this is a failure, if there is a frame, we should be able to get the
|
|
309
|
+
# step from it
|
|
310
|
+
structlogger.warning(
|
|
311
|
+
"command_processor.get_current_collect_step.no_step_for_frame",
|
|
312
|
+
frame=frame_that_triggered_collect_infos,
|
|
313
|
+
)
|
|
314
|
+
return None
|
|
315
|
+
|
|
316
|
+
step = frame_that_triggered_collect_infos.step(all_flows)
|
|
317
|
+
if isinstance(step, CollectInformationFlowStep):
|
|
318
|
+
# we found it!
|
|
319
|
+
return step
|
|
320
|
+
else:
|
|
321
|
+
# this should never happen as we only push collect information patterns
|
|
322
|
+
# onto the stack if there is a collect information step
|
|
323
|
+
structlogger.warning(
|
|
324
|
+
"command_processor.get_current_collect_step.step_not_collect",
|
|
325
|
+
step=step,
|
|
326
|
+
)
|
|
327
|
+
return None
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
def clean_up_commands(
|
|
331
|
+
commands: List[Command],
|
|
332
|
+
tracker: DialogueStateTracker,
|
|
333
|
+
all_flows: FlowsList,
|
|
334
|
+
execution_context: ExecutionContext,
|
|
335
|
+
story_graph: Optional[StoryGraph] = None,
|
|
336
|
+
) -> List[Command]:
|
|
337
|
+
"""Clean up a list of commands.
|
|
338
|
+
|
|
339
|
+
This will clean commands that are not necessary anymore. e.g. removing commands
|
|
340
|
+
where the slot they correct was previously corrected to the same value, grouping
|
|
341
|
+
all slot corrections into one command, removing duplicate cancel flow commands
|
|
342
|
+
and moving free form answer commands to the beginning of the list (to be last when
|
|
343
|
+
reversed.)
|
|
344
|
+
|
|
345
|
+
Args:
|
|
346
|
+
commands: The commands to clean up.
|
|
347
|
+
tracker: The tracker to clean up the commands for.
|
|
348
|
+
all_flows: All flows.
|
|
349
|
+
execution_context: Information about a single graph run.
|
|
350
|
+
story_graph: StoryGraph object with stories available for training.
|
|
351
|
+
|
|
352
|
+
Returns:
|
|
353
|
+
The cleaned up commands.
|
|
354
|
+
"""
|
|
355
|
+
slots_so_far, active_flow = filled_slots_for_active_flow(tracker, all_flows)
|
|
356
|
+
|
|
357
|
+
clean_commands: List[Command] = []
|
|
358
|
+
|
|
359
|
+
for command in commands:
|
|
360
|
+
if isinstance(command, SetSlotCommand):
|
|
361
|
+
clean_commands = clean_up_slot_command(
|
|
362
|
+
clean_commands, command, tracker, all_flows, slots_so_far
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
elif isinstance(command, CancelFlowCommand) and contains_command(
|
|
366
|
+
clean_commands, CancelFlowCommand
|
|
367
|
+
):
|
|
368
|
+
structlogger.debug(
|
|
369
|
+
"command_processor.clean_up_commands"
|
|
370
|
+
".skip_command_flow_already_cancelled",
|
|
371
|
+
command=command,
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
# if there is a cannot handle command after the previous step,
|
|
375
|
+
# we don't want to add another one
|
|
376
|
+
elif isinstance(command, CannotHandleCommand) and contains_command(
|
|
377
|
+
clean_commands, CannotHandleCommand
|
|
378
|
+
):
|
|
379
|
+
structlogger.debug(
|
|
380
|
+
"command_processor"
|
|
381
|
+
".clean_up_commands"
|
|
382
|
+
".skip_command_already_has_cannot_handle",
|
|
383
|
+
command=command,
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
elif isinstance(command, StartFlowCommand) and command.flow == active_flow:
|
|
387
|
+
# drop a start flow command if the starting flow is equal to the currently
|
|
388
|
+
# active flow
|
|
389
|
+
structlogger.debug(
|
|
390
|
+
"command_processor.clean_up_commands.skip_command_flow_already_active",
|
|
391
|
+
command=command,
|
|
392
|
+
)
|
|
393
|
+
|
|
394
|
+
# handle chitchat command differently from other free-form answer commands
|
|
395
|
+
elif isinstance(command, ChitChatAnswerCommand):
|
|
396
|
+
clean_commands = clean_up_chitchat_command(
|
|
397
|
+
clean_commands, command, all_flows, execution_context, story_graph
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
elif isinstance(command, FreeFormAnswerCommand):
|
|
401
|
+
structlogger.debug(
|
|
402
|
+
"command_processor.clean_up_commands.prepend_command_freeform_answer",
|
|
403
|
+
command=command,
|
|
404
|
+
)
|
|
405
|
+
clean_commands.insert(0, command)
|
|
406
|
+
|
|
407
|
+
# drop all clarify commands if there are more commands. Otherwise, we might
|
|
408
|
+
# get a situation where two questions are asked at once.
|
|
409
|
+
elif isinstance(command, ClarifyCommand) and len(commands) > 1:
|
|
410
|
+
clean_commands = clean_up_clarify_command(clean_commands, commands, command)
|
|
411
|
+
if command not in clean_commands:
|
|
412
|
+
structlogger.debug(
|
|
413
|
+
"command_processor.clean_up_commands.drop_clarify_given_other_commands",
|
|
414
|
+
command=command,
|
|
415
|
+
)
|
|
416
|
+
else:
|
|
417
|
+
clean_commands.append(command)
|
|
418
|
+
|
|
419
|
+
# when coexistence is enabled, by default there will be a SetSlotCommand
|
|
420
|
+
# for the ROUTE_TO_CALM_SLOT slot.
|
|
421
|
+
if tracker.has_coexistence_routing_slot and len(clean_commands) > 2:
|
|
422
|
+
clean_commands = filter_cannot_handle_command_for_skipped_slots(clean_commands)
|
|
423
|
+
elif not tracker.has_coexistence_routing_slot and len(clean_commands) > 1:
|
|
424
|
+
clean_commands = filter_cannot_handle_command_for_skipped_slots(clean_commands)
|
|
425
|
+
|
|
426
|
+
clean_commands = ensure_max_number_of_command_type(
|
|
427
|
+
clean_commands, RepeatBotMessagesCommand, 1
|
|
428
|
+
)
|
|
429
|
+
structlogger.debug(
|
|
430
|
+
"command_processor.clean_up_commands.final_commands",
|
|
431
|
+
command=clean_commands,
|
|
432
|
+
)
|
|
433
|
+
|
|
434
|
+
return clean_commands
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
def ensure_max_number_of_command_type(
|
|
438
|
+
commands: List[Command], command_type: Type[Command], n: int
|
|
439
|
+
) -> List[Command]:
|
|
440
|
+
"""Ensures that for a given command type only the first n stay in the list."""
|
|
441
|
+
filtered: List[Command] = []
|
|
442
|
+
count = 0
|
|
443
|
+
for c in commands:
|
|
444
|
+
if isinstance(c, command_type):
|
|
445
|
+
if count >= n:
|
|
446
|
+
continue
|
|
447
|
+
else:
|
|
448
|
+
count += 1
|
|
449
|
+
filtered.append(c)
|
|
450
|
+
return filtered
|
|
451
|
+
|
|
452
|
+
|
|
453
|
+
def clean_up_clarify_command(
|
|
454
|
+
commands_so_far: List[Command],
|
|
455
|
+
all_commands: List[Command],
|
|
456
|
+
current_command: ClarifyCommand,
|
|
457
|
+
) -> List[Command]:
|
|
458
|
+
"""Clean up a clarify command.
|
|
459
|
+
|
|
460
|
+
Args:
|
|
461
|
+
commands_so_far: The commands cleaned up so far.
|
|
462
|
+
all_commands: All the predicted commands.
|
|
463
|
+
current_command: The current clarify command.
|
|
464
|
+
|
|
465
|
+
Returns:
|
|
466
|
+
The cleaned up commands.
|
|
467
|
+
"""
|
|
468
|
+
# Get the commands after removing the ROUTE_TO_CALM_SLOT set slot command.
|
|
469
|
+
commands_without_route_to_calm_set_slot = [
|
|
470
|
+
c
|
|
471
|
+
for c in all_commands
|
|
472
|
+
if not (isinstance(c, SetSlotCommand) and c.name == ROUTE_TO_CALM_SLOT)
|
|
473
|
+
]
|
|
474
|
+
|
|
475
|
+
# if all commands are clarify commands, add the first one only, otherwise add none
|
|
476
|
+
if all(
|
|
477
|
+
isinstance(c, ClarifyCommand) for c in commands_without_route_to_calm_set_slot
|
|
478
|
+
):
|
|
479
|
+
# Check if clean_commands is empty or contains only ROUTE_TO_CALM_SLOT
|
|
480
|
+
# set slot command.
|
|
481
|
+
if not commands_so_far or (
|
|
482
|
+
len(commands_so_far) == 1
|
|
483
|
+
and isinstance(commands_so_far[0], SetSlotCommand)
|
|
484
|
+
and commands_so_far[0].name == ROUTE_TO_CALM_SLOT
|
|
485
|
+
):
|
|
486
|
+
commands_so_far.append(current_command)
|
|
487
|
+
|
|
488
|
+
return commands_so_far
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
def clean_up_slot_command(
|
|
492
|
+
commands_so_far: List[Command],
|
|
493
|
+
command: SetSlotCommand,
|
|
494
|
+
tracker: DialogueStateTracker,
|
|
495
|
+
all_flows: FlowsList,
|
|
496
|
+
slots_so_far: Set[str],
|
|
497
|
+
) -> List[Command]:
|
|
498
|
+
"""Clean up a slot command.
|
|
499
|
+
|
|
500
|
+
This will remove commands that are not necessary anymore, e.g. because the slot
|
|
501
|
+
they correct was previously corrected to the same value. It will group all slot
|
|
502
|
+
corrections into one command.
|
|
503
|
+
|
|
504
|
+
Args:
|
|
505
|
+
commands_so_far: The commands cleaned up so far.
|
|
506
|
+
command: The command to clean up.
|
|
507
|
+
tracker: The dialogue state tracker.
|
|
508
|
+
all_flows: All flows.
|
|
509
|
+
slots_so_far: The slots that have been filled so far.
|
|
510
|
+
|
|
511
|
+
Returns:
|
|
512
|
+
The cleaned up commands.
|
|
513
|
+
"""
|
|
514
|
+
stack = tracker.stack
|
|
515
|
+
|
|
516
|
+
resulting_commands = commands_so_far[:]
|
|
517
|
+
|
|
518
|
+
slot = tracker.slots.get(command.name)
|
|
519
|
+
if slot is None:
|
|
520
|
+
structlogger.debug(
|
|
521
|
+
"command_processor.clean_up_slot_command.skip_command_slot_not_in_domain",
|
|
522
|
+
command=command,
|
|
523
|
+
)
|
|
524
|
+
return resulting_commands
|
|
525
|
+
|
|
526
|
+
if not should_slot_be_set(slot, command):
|
|
527
|
+
cannot_handle = CannotHandleCommand(reason=CANNOT_HANDLE_REASON)
|
|
528
|
+
if cannot_handle not in resulting_commands:
|
|
529
|
+
resulting_commands.append(cannot_handle)
|
|
530
|
+
|
|
531
|
+
return resulting_commands
|
|
532
|
+
|
|
533
|
+
if command.name in slots_so_far and command.name != ROUTE_TO_CALM_SLOT:
|
|
534
|
+
current_collect_info = get_current_collect_step(stack, all_flows)
|
|
535
|
+
|
|
536
|
+
if current_collect_info and current_collect_info.collect == command.name:
|
|
537
|
+
# not a correction but rather an answer to the current collect info
|
|
538
|
+
resulting_commands.append(command)
|
|
539
|
+
return resulting_commands
|
|
540
|
+
|
|
541
|
+
if (slot := tracker.slots.get(command.name)) is not None and slot.value == str(
|
|
542
|
+
command.value
|
|
543
|
+
):
|
|
544
|
+
# the slot is already set, we don't need to set it again
|
|
545
|
+
structlogger.debug(
|
|
546
|
+
"command_processor.clean_up_slot_command.skip_command_slot_already_set",
|
|
547
|
+
command=command,
|
|
548
|
+
)
|
|
549
|
+
return resulting_commands
|
|
550
|
+
|
|
551
|
+
top = top_flow_frame(stack)
|
|
552
|
+
if isinstance(top, CorrectionPatternFlowStackFrame):
|
|
553
|
+
already_corrected_slots = top.corrected_slots
|
|
554
|
+
else:
|
|
555
|
+
already_corrected_slots = {}
|
|
556
|
+
|
|
557
|
+
if command.name in already_corrected_slots and str(
|
|
558
|
+
already_corrected_slots[command.name]
|
|
559
|
+
) == str(command.value):
|
|
560
|
+
structlogger.debug(
|
|
561
|
+
"command_processor.clean_up_slot_command"
|
|
562
|
+
".skip_command_slot_already_corrected",
|
|
563
|
+
command=command,
|
|
564
|
+
)
|
|
565
|
+
return resulting_commands
|
|
566
|
+
|
|
567
|
+
structlogger.debug(
|
|
568
|
+
"command_processor.clean_up_slot_command.convert_command_to_correction",
|
|
569
|
+
command=command,
|
|
570
|
+
)
|
|
571
|
+
|
|
572
|
+
# Group all corrections into one command
|
|
573
|
+
corrected_slot = CorrectedSlot(command.name, command.value)
|
|
574
|
+
for c in resulting_commands:
|
|
575
|
+
if isinstance(c, CorrectSlotsCommand):
|
|
576
|
+
c.corrected_slots.append(corrected_slot)
|
|
577
|
+
break
|
|
578
|
+
else:
|
|
579
|
+
resulting_commands.append(
|
|
580
|
+
CorrectSlotsCommand(corrected_slots=[corrected_slot])
|
|
581
|
+
)
|
|
582
|
+
else:
|
|
583
|
+
resulting_commands.append(command)
|
|
584
|
+
|
|
585
|
+
return resulting_commands
|
|
586
|
+
|
|
587
|
+
|
|
588
|
+
def clean_up_chitchat_command(
|
|
589
|
+
commands_so_far: List[Command],
|
|
590
|
+
command: ChitChatAnswerCommand,
|
|
591
|
+
flows: FlowsList,
|
|
592
|
+
execution_context: ExecutionContext,
|
|
593
|
+
story_graph: Optional[StoryGraph] = None,
|
|
594
|
+
) -> List[Command]:
|
|
595
|
+
"""Clean up a chitchat answer command.
|
|
596
|
+
|
|
597
|
+
Respond with 'cannot handle' if 'IntentlessPolicy' is unset in
|
|
598
|
+
model config but 'action_trigger_chitchat' is used within the pattern_chitchat
|
|
599
|
+
|
|
600
|
+
Args:
|
|
601
|
+
commands_so_far: The commands cleaned up so far.
|
|
602
|
+
command: The command to clean up.
|
|
603
|
+
flows: All flows.
|
|
604
|
+
execution_context: Information about a single graph run.
|
|
605
|
+
story_graph: StoryGraph object with stories available for training.
|
|
606
|
+
Returns:
|
|
607
|
+
The cleaned up commands.
|
|
608
|
+
"""
|
|
609
|
+
from rasa.core.policies.intentless_policy import IntentlessPolicy
|
|
610
|
+
|
|
611
|
+
resulting_commands = commands_so_far[:]
|
|
612
|
+
|
|
613
|
+
pattern_chitchat = flows.flow_by_id(FLOW_PATTERN_CHITCHAT)
|
|
614
|
+
|
|
615
|
+
# very unlikely to happen, placed here due to mypy checks
|
|
616
|
+
if pattern_chitchat is None:
|
|
617
|
+
resulting_commands.insert(
|
|
618
|
+
0, CannotHandleCommand(RASA_PATTERN_CANNOT_HANDLE_CHITCHAT)
|
|
619
|
+
)
|
|
620
|
+
structlogger.warn(
|
|
621
|
+
"command_processor.clean_up_chitchat_command.pattern_chitchat_not_found",
|
|
622
|
+
command=resulting_commands[0],
|
|
623
|
+
)
|
|
624
|
+
return resulting_commands
|
|
625
|
+
|
|
626
|
+
has_action_trigger_chitchat = pattern_chitchat.has_action_step(
|
|
627
|
+
ACTION_TRIGGER_CHITCHAT
|
|
628
|
+
)
|
|
629
|
+
defines_intentless_policy = execution_context.has_node(IntentlessPolicy)
|
|
630
|
+
|
|
631
|
+
has_e2e_stories = True if (story_graph and story_graph.has_e2e_stories()) else False
|
|
632
|
+
|
|
633
|
+
if (has_action_trigger_chitchat and not defines_intentless_policy) or (
|
|
634
|
+
defines_intentless_policy and not has_e2e_stories
|
|
635
|
+
):
|
|
636
|
+
resulting_commands.insert(
|
|
637
|
+
0, CannotHandleCommand(RASA_PATTERN_CANNOT_HANDLE_CHITCHAT)
|
|
638
|
+
)
|
|
639
|
+
structlogger.warn(
|
|
640
|
+
"command_processor.clean_up_chitchat_command.replace_chitchat_answer_with_cannot_handle",
|
|
641
|
+
command=resulting_commands[0],
|
|
642
|
+
pattern_chitchat_uses_action_trigger_chitchat=has_action_trigger_chitchat,
|
|
643
|
+
defined_intentless_policy_in_config=defines_intentless_policy,
|
|
644
|
+
)
|
|
645
|
+
else:
|
|
646
|
+
resulting_commands.insert(0, command)
|
|
647
|
+
structlogger.debug(
|
|
648
|
+
"command_processor.clean_up_commands.prepend_command_chitchat_answer",
|
|
649
|
+
command=command,
|
|
650
|
+
pattern_chitchat_uses_action_trigger_chitchat=has_action_trigger_chitchat,
|
|
651
|
+
defined_intentless_policy_in_config=defines_intentless_policy,
|
|
652
|
+
)
|
|
653
|
+
|
|
654
|
+
return resulting_commands
|
|
655
|
+
|
|
656
|
+
|
|
657
|
+
def should_slot_be_set(slot: Slot, command: SetSlotCommand) -> bool:
|
|
658
|
+
"""Check if a slot should be set by a command."""
|
|
659
|
+
if command.extractor == SetSlotExtractor.COMMAND_PAYLOAD_READER.value:
|
|
660
|
+
# if the command is issued by the command payload reader, it means the slot
|
|
661
|
+
# was set deterministically via a response button. In this case,
|
|
662
|
+
# we can always set it
|
|
663
|
+
return True
|
|
664
|
+
|
|
665
|
+
slot_mappings = slot.mappings
|
|
666
|
+
|
|
667
|
+
if not slot_mappings:
|
|
668
|
+
slot_mappings = [{"type": SlotMappingType.FROM_LLM.value}]
|
|
669
|
+
|
|
670
|
+
for mapping in slot_mappings:
|
|
671
|
+
mapping_type = SlotMappingType(
|
|
672
|
+
mapping.get("type", SlotMappingType.FROM_LLM.value)
|
|
673
|
+
)
|
|
674
|
+
|
|
675
|
+
should_be_set_by_llm = (
|
|
676
|
+
command.extractor == SetSlotExtractor.LLM.value
|
|
677
|
+
and mapping_type == SlotMappingType.FROM_LLM
|
|
678
|
+
)
|
|
679
|
+
should_be_set_by_nlu = (
|
|
680
|
+
command.extractor == SetSlotExtractor.NLU.value
|
|
681
|
+
and mapping_type.is_predefined_type()
|
|
682
|
+
)
|
|
683
|
+
|
|
684
|
+
if should_be_set_by_llm or should_be_set_by_nlu:
|
|
685
|
+
# if the extractor matches the mapping type, we can continue
|
|
686
|
+
# setting the slot
|
|
687
|
+
break
|
|
688
|
+
|
|
689
|
+
structlogger.debug(
|
|
690
|
+
"command_processor.clean_up_slot_command.skip_command.extractor_"
|
|
691
|
+
"does_not_match_slot_mapping",
|
|
692
|
+
extractor=command.extractor,
|
|
693
|
+
slot_name=slot.name,
|
|
694
|
+
mapping_type=mapping_type.value,
|
|
695
|
+
)
|
|
696
|
+
return False
|
|
697
|
+
|
|
698
|
+
return True
|
|
699
|
+
|
|
700
|
+
|
|
701
|
+
def filter_cannot_handle_command_for_skipped_slots(
|
|
702
|
+
clean_commands: List[Command],
|
|
703
|
+
) -> List[Command]:
|
|
704
|
+
"""Filter out a 'cannot handle' command for skipped slots.
|
|
705
|
+
|
|
706
|
+
This is used to filter out a 'cannot handle' command for skipped slots
|
|
707
|
+
in case other commands are present.
|
|
708
|
+
|
|
709
|
+
Returns:
|
|
710
|
+
The filtered commands.
|
|
711
|
+
"""
|
|
712
|
+
return [
|
|
713
|
+
command
|
|
714
|
+
for command in clean_commands
|
|
715
|
+
if not (
|
|
716
|
+
isinstance(command, CannotHandleCommand)
|
|
717
|
+
and command.reason
|
|
718
|
+
and CANNOT_HANDLE_REASON == command.reason
|
|
719
|
+
)
|
|
720
|
+
]
|