rasa-pro 3.12.0.dev1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- README.md +41 -0
- rasa/__init__.py +9 -0
- rasa/__main__.py +177 -0
- rasa/anonymization/__init__.py +2 -0
- rasa/anonymization/anonymisation_rule_yaml_reader.py +91 -0
- rasa/anonymization/anonymization_pipeline.py +286 -0
- rasa/anonymization/anonymization_rule_executor.py +260 -0
- rasa/anonymization/anonymization_rule_orchestrator.py +120 -0
- rasa/anonymization/schemas/config.yml +47 -0
- rasa/anonymization/utils.py +118 -0
- rasa/api.py +160 -0
- rasa/cli/__init__.py +5 -0
- rasa/cli/arguments/__init__.py +0 -0
- rasa/cli/arguments/data.py +106 -0
- rasa/cli/arguments/default_arguments.py +207 -0
- rasa/cli/arguments/evaluate.py +65 -0
- rasa/cli/arguments/export.py +51 -0
- rasa/cli/arguments/interactive.py +74 -0
- rasa/cli/arguments/run.py +219 -0
- rasa/cli/arguments/shell.py +17 -0
- rasa/cli/arguments/test.py +211 -0
- rasa/cli/arguments/train.py +279 -0
- rasa/cli/arguments/visualize.py +34 -0
- rasa/cli/arguments/x.py +30 -0
- rasa/cli/data.py +354 -0
- rasa/cli/dialogue_understanding_test.py +251 -0
- rasa/cli/e2e_test.py +259 -0
- rasa/cli/evaluate.py +222 -0
- rasa/cli/export.py +250 -0
- rasa/cli/inspect.py +75 -0
- rasa/cli/interactive.py +166 -0
- rasa/cli/license.py +65 -0
- rasa/cli/llm_fine_tuning.py +403 -0
- rasa/cli/markers.py +78 -0
- rasa/cli/project_templates/__init__.py +0 -0
- rasa/cli/project_templates/calm/actions/__init__.py +0 -0
- rasa/cli/project_templates/calm/actions/action_template.py +27 -0
- rasa/cli/project_templates/calm/actions/add_contact.py +30 -0
- rasa/cli/project_templates/calm/actions/db.py +57 -0
- rasa/cli/project_templates/calm/actions/list_contacts.py +22 -0
- rasa/cli/project_templates/calm/actions/remove_contact.py +35 -0
- rasa/cli/project_templates/calm/config.yml +10 -0
- rasa/cli/project_templates/calm/credentials.yml +33 -0
- rasa/cli/project_templates/calm/data/flows/add_contact.yml +31 -0
- rasa/cli/project_templates/calm/data/flows/list_contacts.yml +14 -0
- rasa/cli/project_templates/calm/data/flows/remove_contact.yml +29 -0
- rasa/cli/project_templates/calm/db/contacts.json +10 -0
- rasa/cli/project_templates/calm/domain/add_contact.yml +39 -0
- rasa/cli/project_templates/calm/domain/list_contacts.yml +17 -0
- rasa/cli/project_templates/calm/domain/remove_contact.yml +38 -0
- rasa/cli/project_templates/calm/domain/shared.yml +10 -0
- rasa/cli/project_templates/calm/e2e_tests/cancelations/user_cancels_during_a_correction.yml +16 -0
- rasa/cli/project_templates/calm/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +7 -0
- rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_handle.yml +20 -0
- rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_name.yml +19 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +15 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_lists_contacts.yml +5 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact.yml +11 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact_from_list.yml +12 -0
- rasa/cli/project_templates/calm/endpoints.yml +58 -0
- rasa/cli/project_templates/default/actions/__init__.py +0 -0
- rasa/cli/project_templates/default/actions/actions.py +27 -0
- rasa/cli/project_templates/default/config.yml +44 -0
- rasa/cli/project_templates/default/credentials.yml +33 -0
- rasa/cli/project_templates/default/data/nlu.yml +91 -0
- rasa/cli/project_templates/default/data/rules.yml +13 -0
- rasa/cli/project_templates/default/data/stories.yml +30 -0
- rasa/cli/project_templates/default/domain.yml +34 -0
- rasa/cli/project_templates/default/endpoints.yml +42 -0
- rasa/cli/project_templates/default/tests/test_stories.yml +91 -0
- rasa/cli/project_templates/tutorial/actions/__init__.py +0 -0
- rasa/cli/project_templates/tutorial/actions/actions.py +22 -0
- rasa/cli/project_templates/tutorial/config.yml +12 -0
- rasa/cli/project_templates/tutorial/credentials.yml +33 -0
- rasa/cli/project_templates/tutorial/data/flows.yml +8 -0
- rasa/cli/project_templates/tutorial/data/patterns.yml +11 -0
- rasa/cli/project_templates/tutorial/domain.yml +35 -0
- rasa/cli/project_templates/tutorial/endpoints.yml +55 -0
- rasa/cli/run.py +143 -0
- rasa/cli/scaffold.py +273 -0
- rasa/cli/shell.py +141 -0
- rasa/cli/studio/__init__.py +0 -0
- rasa/cli/studio/download.py +62 -0
- rasa/cli/studio/studio.py +296 -0
- rasa/cli/studio/train.py +59 -0
- rasa/cli/studio/upload.py +62 -0
- rasa/cli/telemetry.py +102 -0
- rasa/cli/test.py +280 -0
- rasa/cli/train.py +278 -0
- rasa/cli/utils.py +484 -0
- rasa/cli/visualize.py +40 -0
- rasa/cli/x.py +206 -0
- rasa/constants.py +45 -0
- rasa/core/__init__.py +17 -0
- rasa/core/actions/__init__.py +0 -0
- rasa/core/actions/action.py +1318 -0
- rasa/core/actions/action_clean_stack.py +59 -0
- rasa/core/actions/action_exceptions.py +24 -0
- rasa/core/actions/action_hangup.py +29 -0
- rasa/core/actions/action_repeat_bot_messages.py +89 -0
- rasa/core/actions/action_run_slot_rejections.py +210 -0
- rasa/core/actions/action_trigger_chitchat.py +31 -0
- rasa/core/actions/action_trigger_flow.py +109 -0
- rasa/core/actions/action_trigger_search.py +31 -0
- rasa/core/actions/constants.py +5 -0
- rasa/core/actions/custom_action_executor.py +191 -0
- rasa/core/actions/direct_custom_actions_executor.py +109 -0
- rasa/core/actions/e2e_stub_custom_action_executor.py +72 -0
- rasa/core/actions/forms.py +741 -0
- rasa/core/actions/grpc_custom_action_executor.py +251 -0
- rasa/core/actions/http_custom_action_executor.py +145 -0
- rasa/core/actions/loops.py +114 -0
- rasa/core/actions/two_stage_fallback.py +186 -0
- rasa/core/agent.py +559 -0
- rasa/core/auth_retry_tracker_store.py +122 -0
- rasa/core/brokers/__init__.py +0 -0
- rasa/core/brokers/broker.py +126 -0
- rasa/core/brokers/file.py +58 -0
- rasa/core/brokers/kafka.py +324 -0
- rasa/core/brokers/pika.py +388 -0
- rasa/core/brokers/sql.py +86 -0
- rasa/core/channels/__init__.py +61 -0
- rasa/core/channels/botframework.py +338 -0
- rasa/core/channels/callback.py +84 -0
- rasa/core/channels/channel.py +456 -0
- rasa/core/channels/console.py +241 -0
- rasa/core/channels/development_inspector.py +197 -0
- rasa/core/channels/facebook.py +419 -0
- rasa/core/channels/hangouts.py +329 -0
- rasa/core/channels/inspector/.eslintrc.cjs +25 -0
- rasa/core/channels/inspector/.gitignore +23 -0
- rasa/core/channels/inspector/README.md +54 -0
- rasa/core/channels/inspector/assets/favicon.ico +0 -0
- rasa/core/channels/inspector/assets/rasa-chat.js +2 -0
- rasa/core/channels/inspector/custom.d.ts +3 -0
- rasa/core/channels/inspector/dist/assets/arc-861ddd57.js +1 -0
- rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
- rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-921f02db.js +10 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-b436c4f8.js +2 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-511a23cb.js +2 -0
- rasa/core/channels/inspector/dist/assets/createText-62fc7601-ef476ecd.js +7 -0
- rasa/core/channels/inspector/dist/assets/edges-f2ad444c-f1878e0a.js +4 -0
- rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-fac75185.js +51 -0
- rasa/core/channels/inspector/dist/assets/flowDb-1972c806-201c5bbc.js +6 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-f904ae41.js +4 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +1 -0
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-1813da66.js +139 -0
- rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-872af172.js +266 -0
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-34a0af5a.js +70 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-128cfa44.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-21dbcb97.woff +0 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-222b5e26.svg +329 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-9ad89b2a.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-42ba3e3d.js +1 -0
- rasa/core/channels/inspector/dist/assets/index-37817b51.js +1317 -0
- rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
- rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-6b731386.js +7 -0
- rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
- rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-e8579ac6.js +139 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-60c05ee4.woff +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-8335d9b8.svg +438 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-9cc39c75.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-ead13ccf.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-16705655.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-5aeb07f9.woff +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9c459044.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9e2898a4.svg +435 -0
- rasa/core/channels/inspector/dist/assets/layout-89e6403a.js +1 -0
- rasa/core/channels/inspector/dist/assets/line-dc73d3fc.js +1 -0
- rasa/core/channels/inspector/dist/assets/linear-f5b1d2bc.js +1 -0
- rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-82cb74fa.js +109 -0
- rasa/core/channels/inspector/dist/assets/ordinal-ba9b4969.js +1 -0
- rasa/core/channels/inspector/dist/assets/path-53f90ab3.js +1 -0
- rasa/core/channels/inspector/dist/assets/pieDiagram-dbbf0591-bdf5f29b.js +35 -0
- rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-c7a0cbe4.js +7 -0
- rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-7ec5410f.js +52 -0
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-caee5554.js +8 -0
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-2935f8db.js +122 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-8f5d9693.js +1 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-d565d1de.js +1 -0
- rasa/core/channels/inspector/dist/assets/styles-080da4f6-75ad421d.js +110 -0
- rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-7e764226.js +159 -0
- rasa/core/channels/inspector/dist/assets/styles-9c745c82-7a4e0e61.js +207 -0
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-4019d1bf.js +1 -0
- rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-01ea12df.js +61 -0
- rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-89407137.js +7 -0
- rasa/core/channels/inspector/dist/index.html +42 -0
- rasa/core/channels/inspector/index.html +40 -0
- rasa/core/channels/inspector/jest.config.ts +13 -0
- rasa/core/channels/inspector/package.json +52 -0
- rasa/core/channels/inspector/setupTests.ts +2 -0
- rasa/core/channels/inspector/src/App.tsx +220 -0
- rasa/core/channels/inspector/src/components/Chat.tsx +95 -0
- rasa/core/channels/inspector/src/components/DiagramFlow.tsx +108 -0
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
- rasa/core/channels/inspector/src/components/DialogueStack.tsx +136 -0
- rasa/core/channels/inspector/src/components/ExpandIcon.tsx +16 -0
- rasa/core/channels/inspector/src/components/FullscreenButton.tsx +45 -0
- rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +22 -0
- rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +21 -0
- rasa/core/channels/inspector/src/components/RasaLogo.tsx +32 -0
- rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +39 -0
- rasa/core/channels/inspector/src/components/Slots.tsx +91 -0
- rasa/core/channels/inspector/src/components/Welcome.tsx +54 -0
- rasa/core/channels/inspector/src/helpers/audiostream.ts +191 -0
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +392 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +306 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +127 -0
- rasa/core/channels/inspector/src/main.tsx +13 -0
- rasa/core/channels/inspector/src/theme/Button/Button.ts +29 -0
- rasa/core/channels/inspector/src/theme/Heading/Heading.ts +31 -0
- rasa/core/channels/inspector/src/theme/Input/Input.ts +27 -0
- rasa/core/channels/inspector/src/theme/Link/Link.ts +10 -0
- rasa/core/channels/inspector/src/theme/Modal/Modal.ts +47 -0
- rasa/core/channels/inspector/src/theme/Table/Table.tsx +38 -0
- rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +12 -0
- rasa/core/channels/inspector/src/theme/base/breakpoints.ts +8 -0
- rasa/core/channels/inspector/src/theme/base/colors.ts +88 -0
- rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +29 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.svg +329 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.svg +438 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.svg +435 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/radii.ts +9 -0
- rasa/core/channels/inspector/src/theme/base/shadows.ts +7 -0
- rasa/core/channels/inspector/src/theme/base/sizes.ts +7 -0
- rasa/core/channels/inspector/src/theme/base/space.ts +15 -0
- rasa/core/channels/inspector/src/theme/base/styles.ts +13 -0
- rasa/core/channels/inspector/src/theme/base/typography.ts +24 -0
- rasa/core/channels/inspector/src/theme/base/zIndices.ts +19 -0
- rasa/core/channels/inspector/src/theme/index.ts +101 -0
- rasa/core/channels/inspector/src/types.ts +84 -0
- rasa/core/channels/inspector/src/vite-env.d.ts +1 -0
- rasa/core/channels/inspector/tests/__mocks__/fileMock.ts +1 -0
- rasa/core/channels/inspector/tests/__mocks__/matchMedia.ts +16 -0
- rasa/core/channels/inspector/tests/__mocks__/styleMock.ts +1 -0
- rasa/core/channels/inspector/tests/renderWithProviders.tsx +14 -0
- rasa/core/channels/inspector/tsconfig.json +26 -0
- rasa/core/channels/inspector/tsconfig.node.json +10 -0
- rasa/core/channels/inspector/vite.config.ts +8 -0
- rasa/core/channels/inspector/yarn.lock +6249 -0
- rasa/core/channels/mattermost.py +229 -0
- rasa/core/channels/rasa_chat.py +126 -0
- rasa/core/channels/rest.py +230 -0
- rasa/core/channels/rocketchat.py +174 -0
- rasa/core/channels/slack.py +620 -0
- rasa/core/channels/socketio.py +302 -0
- rasa/core/channels/telegram.py +298 -0
- rasa/core/channels/twilio.py +169 -0
- rasa/core/channels/vier_cvg.py +374 -0
- rasa/core/channels/voice_ready/__init__.py +0 -0
- rasa/core/channels/voice_ready/audiocodes.py +501 -0
- rasa/core/channels/voice_ready/jambonz.py +121 -0
- rasa/core/channels/voice_ready/jambonz_protocol.py +396 -0
- rasa/core/channels/voice_ready/twilio_voice.py +403 -0
- rasa/core/channels/voice_ready/utils.py +37 -0
- rasa/core/channels/voice_stream/__init__.py +0 -0
- rasa/core/channels/voice_stream/asr/__init__.py +0 -0
- rasa/core/channels/voice_stream/asr/asr_engine.py +89 -0
- rasa/core/channels/voice_stream/asr/asr_event.py +18 -0
- rasa/core/channels/voice_stream/asr/azure.py +130 -0
- rasa/core/channels/voice_stream/asr/deepgram.py +90 -0
- rasa/core/channels/voice_stream/audio_bytes.py +8 -0
- rasa/core/channels/voice_stream/browser_audio.py +107 -0
- rasa/core/channels/voice_stream/call_state.py +23 -0
- rasa/core/channels/voice_stream/tts/__init__.py +0 -0
- rasa/core/channels/voice_stream/tts/azure.py +106 -0
- rasa/core/channels/voice_stream/tts/cartesia.py +118 -0
- rasa/core/channels/voice_stream/tts/tts_cache.py +27 -0
- rasa/core/channels/voice_stream/tts/tts_engine.py +58 -0
- rasa/core/channels/voice_stream/twilio_media_streams.py +173 -0
- rasa/core/channels/voice_stream/util.py +57 -0
- rasa/core/channels/voice_stream/voice_channel.py +427 -0
- rasa/core/channels/webexteams.py +134 -0
- rasa/core/concurrent_lock_store.py +210 -0
- rasa/core/constants.py +112 -0
- rasa/core/evaluation/__init__.py +0 -0
- rasa/core/evaluation/marker.py +267 -0
- rasa/core/evaluation/marker_base.py +923 -0
- rasa/core/evaluation/marker_stats.py +293 -0
- rasa/core/evaluation/marker_tracker_loader.py +103 -0
- rasa/core/exceptions.py +29 -0
- rasa/core/exporter.py +284 -0
- rasa/core/featurizers/__init__.py +0 -0
- rasa/core/featurizers/precomputation.py +410 -0
- rasa/core/featurizers/single_state_featurizer.py +421 -0
- rasa/core/featurizers/tracker_featurizers.py +1262 -0
- rasa/core/http_interpreter.py +89 -0
- rasa/core/information_retrieval/__init__.py +7 -0
- rasa/core/information_retrieval/faiss.py +124 -0
- rasa/core/information_retrieval/information_retrieval.py +137 -0
- rasa/core/information_retrieval/milvus.py +59 -0
- rasa/core/information_retrieval/qdrant.py +96 -0
- rasa/core/jobs.py +63 -0
- rasa/core/lock.py +139 -0
- rasa/core/lock_store.py +343 -0
- rasa/core/migrate.py +403 -0
- rasa/core/nlg/__init__.py +3 -0
- rasa/core/nlg/callback.py +146 -0
- rasa/core/nlg/contextual_response_rephraser.py +320 -0
- rasa/core/nlg/generator.py +230 -0
- rasa/core/nlg/interpolator.py +143 -0
- rasa/core/nlg/response.py +155 -0
- rasa/core/nlg/summarize.py +70 -0
- rasa/core/persistor.py +538 -0
- rasa/core/policies/__init__.py +0 -0
- rasa/core/policies/ensemble.py +329 -0
- rasa/core/policies/enterprise_search_policy.py +905 -0
- rasa/core/policies/enterprise_search_prompt_template.jinja2 +25 -0
- rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +60 -0
- rasa/core/policies/flow_policy.py +205 -0
- rasa/core/policies/flows/__init__.py +0 -0
- rasa/core/policies/flows/flow_exceptions.py +44 -0
- rasa/core/policies/flows/flow_executor.py +754 -0
- rasa/core/policies/flows/flow_step_result.py +43 -0
- rasa/core/policies/intentless_policy.py +1031 -0
- rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
- rasa/core/policies/memoization.py +538 -0
- rasa/core/policies/policy.py +725 -0
- rasa/core/policies/rule_policy.py +1273 -0
- rasa/core/policies/ted_policy.py +2169 -0
- rasa/core/policies/unexpected_intent_policy.py +1022 -0
- rasa/core/processor.py +1465 -0
- rasa/core/run.py +342 -0
- rasa/core/secrets_manager/__init__.py +0 -0
- rasa/core/secrets_manager/constants.py +36 -0
- rasa/core/secrets_manager/endpoints.py +391 -0
- rasa/core/secrets_manager/factory.py +241 -0
- rasa/core/secrets_manager/secret_manager.py +262 -0
- rasa/core/secrets_manager/vault.py +584 -0
- rasa/core/test.py +1335 -0
- rasa/core/tracker_store.py +1703 -0
- rasa/core/train.py +105 -0
- rasa/core/training/__init__.py +89 -0
- rasa/core/training/converters/__init__.py +0 -0
- rasa/core/training/converters/responses_prefix_converter.py +119 -0
- rasa/core/training/interactive.py +1744 -0
- rasa/core/training/story_conflict.py +381 -0
- rasa/core/training/training.py +93 -0
- rasa/core/utils.py +366 -0
- rasa/core/visualize.py +70 -0
- rasa/dialogue_understanding/__init__.py +0 -0
- rasa/dialogue_understanding/coexistence/__init__.py +0 -0
- rasa/dialogue_understanding/coexistence/constants.py +4 -0
- rasa/dialogue_understanding/coexistence/intent_based_router.py +196 -0
- rasa/dialogue_understanding/coexistence/llm_based_router.py +327 -0
- rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
- rasa/dialogue_understanding/commands/__init__.py +61 -0
- rasa/dialogue_understanding/commands/can_not_handle_command.py +70 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +125 -0
- rasa/dialogue_understanding/commands/change_flow_command.py +44 -0
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +57 -0
- rasa/dialogue_understanding/commands/clarify_command.py +86 -0
- rasa/dialogue_understanding/commands/command.py +85 -0
- rasa/dialogue_understanding/commands/correct_slots_command.py +297 -0
- rasa/dialogue_understanding/commands/error_command.py +79 -0
- rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
- rasa/dialogue_understanding/commands/handle_code_change_command.py +73 -0
- rasa/dialogue_understanding/commands/human_handoff_command.py +66 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +57 -0
- rasa/dialogue_understanding/commands/noop_command.py +54 -0
- rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +60 -0
- rasa/dialogue_understanding/commands/restart_command.py +58 -0
- rasa/dialogue_understanding/commands/session_end_command.py +61 -0
- rasa/dialogue_understanding/commands/session_start_command.py +59 -0
- rasa/dialogue_understanding/commands/set_slot_command.py +160 -0
- rasa/dialogue_understanding/commands/skip_question_command.py +75 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +107 -0
- rasa/dialogue_understanding/commands/user_silence_command.py +59 -0
- rasa/dialogue_understanding/commands/utils.py +45 -0
- rasa/dialogue_understanding/generator/__init__.py +21 -0
- rasa/dialogue_understanding/generator/command_generator.py +464 -0
- rasa/dialogue_understanding/generator/constants.py +27 -0
- rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +466 -0
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +500 -0
- rasa/dialogue_understanding/generator/llm_command_generator.py +67 -0
- rasa/dialogue_understanding/generator/multi_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/multi_step/fill_slots_prompt.jinja2 +62 -0
- rasa/dialogue_understanding/generator/multi_step/handle_flows_prompt.jinja2 +38 -0
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +920 -0
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +261 -0
- rasa/dialogue_understanding/generator/single_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2 +60 -0
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +486 -0
- rasa/dialogue_understanding/patterns/__init__.py +0 -0
- rasa/dialogue_understanding/patterns/cancel.py +111 -0
- rasa/dialogue_understanding/patterns/cannot_handle.py +43 -0
- rasa/dialogue_understanding/patterns/chitchat.py +37 -0
- rasa/dialogue_understanding/patterns/clarify.py +97 -0
- rasa/dialogue_understanding/patterns/code_change.py +41 -0
- rasa/dialogue_understanding/patterns/collect_information.py +90 -0
- rasa/dialogue_understanding/patterns/completed.py +40 -0
- rasa/dialogue_understanding/patterns/continue_interrupted.py +42 -0
- rasa/dialogue_understanding/patterns/correction.py +278 -0
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +301 -0
- rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
- rasa/dialogue_understanding/patterns/internal_error.py +47 -0
- rasa/dialogue_understanding/patterns/repeat.py +37 -0
- rasa/dialogue_understanding/patterns/restart.py +37 -0
- rasa/dialogue_understanding/patterns/search.py +37 -0
- rasa/dialogue_understanding/patterns/session_start.py +37 -0
- rasa/dialogue_understanding/patterns/skip_question.py +38 -0
- rasa/dialogue_understanding/patterns/user_silence.py +37 -0
- rasa/dialogue_understanding/processor/__init__.py +0 -0
- rasa/dialogue_understanding/processor/command_processor.py +720 -0
- rasa/dialogue_understanding/processor/command_processor_component.py +43 -0
- rasa/dialogue_understanding/stack/__init__.py +0 -0
- rasa/dialogue_understanding/stack/dialogue_stack.py +178 -0
- rasa/dialogue_understanding/stack/frames/__init__.py +19 -0
- rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +27 -0
- rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +137 -0
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +157 -0
- rasa/dialogue_understanding/stack/frames/pattern_frame.py +10 -0
- rasa/dialogue_understanding/stack/frames/search_frame.py +27 -0
- rasa/dialogue_understanding/stack/utils.py +211 -0
- rasa/dialogue_understanding/utils.py +14 -0
- rasa/dialogue_understanding_test/__init__.py +0 -0
- rasa/dialogue_understanding_test/command_metric_calculation.py +12 -0
- rasa/dialogue_understanding_test/constants.py +17 -0
- rasa/dialogue_understanding_test/du_test_case.py +118 -0
- rasa/dialogue_understanding_test/du_test_result.py +11 -0
- rasa/dialogue_understanding_test/du_test_runner.py +93 -0
- rasa/dialogue_understanding_test/io.py +54 -0
- rasa/dialogue_understanding_test/validation.py +22 -0
- rasa/e2e_test/__init__.py +0 -0
- rasa/e2e_test/aggregate_test_stats_calculator.py +134 -0
- rasa/e2e_test/assertions.py +1345 -0
- rasa/e2e_test/assertions_schema.yml +129 -0
- rasa/e2e_test/constants.py +31 -0
- rasa/e2e_test/e2e_config.py +220 -0
- rasa/e2e_test/e2e_config_schema.yml +26 -0
- rasa/e2e_test/e2e_test_case.py +569 -0
- rasa/e2e_test/e2e_test_converter.py +363 -0
- rasa/e2e_test/e2e_test_converter_prompt.jinja2 +70 -0
- rasa/e2e_test/e2e_test_coverage_report.py +364 -0
- rasa/e2e_test/e2e_test_result.py +54 -0
- rasa/e2e_test/e2e_test_runner.py +1192 -0
- rasa/e2e_test/e2e_test_schema.yml +181 -0
- rasa/e2e_test/pykwalify_extensions.py +39 -0
- rasa/e2e_test/stub_custom_action.py +70 -0
- rasa/e2e_test/utils/__init__.py +0 -0
- rasa/e2e_test/utils/e2e_yaml_utils.py +55 -0
- rasa/e2e_test/utils/io.py +598 -0
- rasa/e2e_test/utils/validation.py +178 -0
- rasa/engine/__init__.py +0 -0
- rasa/engine/caching.py +463 -0
- rasa/engine/constants.py +17 -0
- rasa/engine/exceptions.py +14 -0
- rasa/engine/graph.py +642 -0
- rasa/engine/loader.py +48 -0
- rasa/engine/recipes/__init__.py +0 -0
- rasa/engine/recipes/config_files/default_config.yml +41 -0
- rasa/engine/recipes/default_components.py +97 -0
- rasa/engine/recipes/default_recipe.py +1272 -0
- rasa/engine/recipes/graph_recipe.py +79 -0
- rasa/engine/recipes/recipe.py +93 -0
- rasa/engine/runner/__init__.py +0 -0
- rasa/engine/runner/dask.py +250 -0
- rasa/engine/runner/interface.py +49 -0
- rasa/engine/storage/__init__.py +0 -0
- rasa/engine/storage/local_model_storage.py +244 -0
- rasa/engine/storage/resource.py +110 -0
- rasa/engine/storage/storage.py +199 -0
- rasa/engine/training/__init__.py +0 -0
- rasa/engine/training/components.py +176 -0
- rasa/engine/training/fingerprinting.py +64 -0
- rasa/engine/training/graph_trainer.py +256 -0
- rasa/engine/training/hooks.py +164 -0
- rasa/engine/validation.py +1451 -0
- rasa/env.py +14 -0
- rasa/exceptions.py +69 -0
- rasa/graph_components/__init__.py +0 -0
- rasa/graph_components/converters/__init__.py +0 -0
- rasa/graph_components/converters/nlu_message_converter.py +48 -0
- rasa/graph_components/providers/__init__.py +0 -0
- rasa/graph_components/providers/domain_for_core_training_provider.py +87 -0
- rasa/graph_components/providers/domain_provider.py +71 -0
- rasa/graph_components/providers/flows_provider.py +74 -0
- rasa/graph_components/providers/forms_provider.py +44 -0
- rasa/graph_components/providers/nlu_training_data_provider.py +56 -0
- rasa/graph_components/providers/responses_provider.py +44 -0
- rasa/graph_components/providers/rule_only_provider.py +49 -0
- rasa/graph_components/providers/story_graph_provider.py +96 -0
- rasa/graph_components/providers/training_tracker_provider.py +55 -0
- rasa/graph_components/validators/__init__.py +0 -0
- rasa/graph_components/validators/default_recipe_validator.py +550 -0
- rasa/graph_components/validators/finetuning_validator.py +302 -0
- rasa/hooks.py +111 -0
- rasa/jupyter.py +63 -0
- rasa/llm_fine_tuning/__init__.py +0 -0
- rasa/llm_fine_tuning/annotation_module.py +241 -0
- rasa/llm_fine_tuning/conversations.py +144 -0
- rasa/llm_fine_tuning/llm_data_preparation_module.py +178 -0
- rasa/llm_fine_tuning/paraphrasing/__init__.py +0 -0
- rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +281 -0
- rasa/llm_fine_tuning/paraphrasing/default_rephrase_prompt_template.jina2 +44 -0
- rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +121 -0
- rasa/llm_fine_tuning/paraphrasing/rephrased_user_message.py +10 -0
- rasa/llm_fine_tuning/paraphrasing_module.py +128 -0
- rasa/llm_fine_tuning/storage.py +174 -0
- rasa/llm_fine_tuning/train_test_split_module.py +441 -0
- rasa/markers/__init__.py +0 -0
- rasa/markers/marker.py +269 -0
- rasa/markers/marker_base.py +828 -0
- rasa/markers/upload.py +74 -0
- rasa/markers/validate.py +21 -0
- rasa/model.py +118 -0
- rasa/model_manager/__init__.py +0 -0
- rasa/model_manager/config.py +40 -0
- rasa/model_manager/model_api.py +559 -0
- rasa/model_manager/runner_service.py +286 -0
- rasa/model_manager/socket_bridge.py +146 -0
- rasa/model_manager/studio_jwt_auth.py +86 -0
- rasa/model_manager/trainer_service.py +325 -0
- rasa/model_manager/utils.py +87 -0
- rasa/model_manager/warm_rasa_process.py +187 -0
- rasa/model_service.py +112 -0
- rasa/model_testing.py +457 -0
- rasa/model_training.py +596 -0
- rasa/nlu/__init__.py +7 -0
- rasa/nlu/classifiers/__init__.py +3 -0
- rasa/nlu/classifiers/classifier.py +5 -0
- rasa/nlu/classifiers/diet_classifier.py +1881 -0
- rasa/nlu/classifiers/fallback_classifier.py +192 -0
- rasa/nlu/classifiers/keyword_intent_classifier.py +188 -0
- rasa/nlu/classifiers/logistic_regression_classifier.py +253 -0
- rasa/nlu/classifiers/mitie_intent_classifier.py +156 -0
- rasa/nlu/classifiers/regex_message_handler.py +56 -0
- rasa/nlu/classifiers/sklearn_intent_classifier.py +330 -0
- rasa/nlu/constants.py +77 -0
- rasa/nlu/convert.py +40 -0
- rasa/nlu/emulators/__init__.py +0 -0
- rasa/nlu/emulators/dialogflow.py +55 -0
- rasa/nlu/emulators/emulator.py +49 -0
- rasa/nlu/emulators/luis.py +86 -0
- rasa/nlu/emulators/no_emulator.py +10 -0
- rasa/nlu/emulators/wit.py +56 -0
- rasa/nlu/extractors/__init__.py +0 -0
- rasa/nlu/extractors/crf_entity_extractor.py +715 -0
- rasa/nlu/extractors/duckling_entity_extractor.py +206 -0
- rasa/nlu/extractors/entity_synonyms.py +178 -0
- rasa/nlu/extractors/extractor.py +470 -0
- rasa/nlu/extractors/mitie_entity_extractor.py +293 -0
- rasa/nlu/extractors/regex_entity_extractor.py +220 -0
- rasa/nlu/extractors/spacy_entity_extractor.py +95 -0
- rasa/nlu/featurizers/__init__.py +0 -0
- rasa/nlu/featurizers/dense_featurizer/__init__.py +0 -0
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +445 -0
- rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +768 -0
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +170 -0
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +132 -0
- rasa/nlu/featurizers/featurizer.py +89 -0
- rasa/nlu/featurizers/sparse_featurizer/__init__.py +0 -0
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +867 -0
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +571 -0
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +271 -0
- rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
- rasa/nlu/model.py +24 -0
- rasa/nlu/run.py +27 -0
- rasa/nlu/selectors/__init__.py +0 -0
- rasa/nlu/selectors/response_selector.py +987 -0
- rasa/nlu/test.py +1940 -0
- rasa/nlu/tokenizers/__init__.py +0 -0
- rasa/nlu/tokenizers/jieba_tokenizer.py +148 -0
- rasa/nlu/tokenizers/mitie_tokenizer.py +75 -0
- rasa/nlu/tokenizers/spacy_tokenizer.py +72 -0
- rasa/nlu/tokenizers/tokenizer.py +239 -0
- rasa/nlu/tokenizers/whitespace_tokenizer.py +95 -0
- rasa/nlu/utils/__init__.py +35 -0
- rasa/nlu/utils/bilou_utils.py +462 -0
- rasa/nlu/utils/hugging_face/__init__.py +0 -0
- rasa/nlu/utils/hugging_face/registry.py +108 -0
- rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +311 -0
- rasa/nlu/utils/mitie_utils.py +113 -0
- rasa/nlu/utils/pattern_utils.py +168 -0
- rasa/nlu/utils/spacy_utils.py +310 -0
- rasa/plugin.py +90 -0
- rasa/server.py +1588 -0
- rasa/shared/__init__.py +0 -0
- rasa/shared/constants.py +311 -0
- rasa/shared/core/__init__.py +0 -0
- rasa/shared/core/command_payload_reader.py +109 -0
- rasa/shared/core/constants.py +180 -0
- rasa/shared/core/conversation.py +46 -0
- rasa/shared/core/domain.py +2172 -0
- rasa/shared/core/events.py +2559 -0
- rasa/shared/core/flows/__init__.py +7 -0
- rasa/shared/core/flows/flow.py +562 -0
- rasa/shared/core/flows/flow_path.py +84 -0
- rasa/shared/core/flows/flow_step.py +146 -0
- rasa/shared/core/flows/flow_step_links.py +319 -0
- rasa/shared/core/flows/flow_step_sequence.py +70 -0
- rasa/shared/core/flows/flows_list.py +258 -0
- rasa/shared/core/flows/flows_yaml_schema.json +303 -0
- rasa/shared/core/flows/nlu_trigger.py +117 -0
- rasa/shared/core/flows/steps/__init__.py +24 -0
- rasa/shared/core/flows/steps/action.py +56 -0
- rasa/shared/core/flows/steps/call.py +64 -0
- rasa/shared/core/flows/steps/collect.py +112 -0
- rasa/shared/core/flows/steps/constants.py +5 -0
- rasa/shared/core/flows/steps/continuation.py +36 -0
- rasa/shared/core/flows/steps/end.py +22 -0
- rasa/shared/core/flows/steps/internal.py +44 -0
- rasa/shared/core/flows/steps/link.py +51 -0
- rasa/shared/core/flows/steps/no_operation.py +48 -0
- rasa/shared/core/flows/steps/set_slots.py +50 -0
- rasa/shared/core/flows/steps/start.py +30 -0
- rasa/shared/core/flows/utils.py +39 -0
- rasa/shared/core/flows/validation.py +735 -0
- rasa/shared/core/flows/yaml_flows_io.py +405 -0
- rasa/shared/core/generator.py +908 -0
- rasa/shared/core/slot_mappings.py +526 -0
- rasa/shared/core/slots.py +654 -0
- rasa/shared/core/trackers.py +1183 -0
- rasa/shared/core/training_data/__init__.py +0 -0
- rasa/shared/core/training_data/loading.py +89 -0
- rasa/shared/core/training_data/story_reader/__init__.py +0 -0
- rasa/shared/core/training_data/story_reader/story_reader.py +129 -0
- rasa/shared/core/training_data/story_reader/story_step_builder.py +168 -0
- rasa/shared/core/training_data/story_reader/yaml_story_reader.py +888 -0
- rasa/shared/core/training_data/story_writer/__init__.py +0 -0
- rasa/shared/core/training_data/story_writer/story_writer.py +76 -0
- rasa/shared/core/training_data/story_writer/yaml_story_writer.py +444 -0
- rasa/shared/core/training_data/structures.py +858 -0
- rasa/shared/core/training_data/visualization.html +146 -0
- rasa/shared/core/training_data/visualization.py +603 -0
- rasa/shared/data.py +249 -0
- rasa/shared/engine/__init__.py +0 -0
- rasa/shared/engine/caching.py +26 -0
- rasa/shared/exceptions.py +167 -0
- rasa/shared/importers/__init__.py +0 -0
- rasa/shared/importers/importer.py +770 -0
- rasa/shared/importers/multi_project.py +215 -0
- rasa/shared/importers/rasa.py +108 -0
- rasa/shared/importers/remote_importer.py +196 -0
- rasa/shared/importers/utils.py +36 -0
- rasa/shared/nlu/__init__.py +0 -0
- rasa/shared/nlu/constants.py +53 -0
- rasa/shared/nlu/interpreter.py +10 -0
- rasa/shared/nlu/training_data/__init__.py +0 -0
- rasa/shared/nlu/training_data/entities_parser.py +208 -0
- rasa/shared/nlu/training_data/features.py +492 -0
- rasa/shared/nlu/training_data/formats/__init__.py +10 -0
- rasa/shared/nlu/training_data/formats/dialogflow.py +163 -0
- rasa/shared/nlu/training_data/formats/luis.py +87 -0
- rasa/shared/nlu/training_data/formats/rasa.py +135 -0
- rasa/shared/nlu/training_data/formats/rasa_yaml.py +618 -0
- rasa/shared/nlu/training_data/formats/readerwriter.py +244 -0
- rasa/shared/nlu/training_data/formats/wit.py +52 -0
- rasa/shared/nlu/training_data/loading.py +137 -0
- rasa/shared/nlu/training_data/lookup_tables_parser.py +30 -0
- rasa/shared/nlu/training_data/message.py +490 -0
- rasa/shared/nlu/training_data/schemas/__init__.py +0 -0
- rasa/shared/nlu/training_data/schemas/data_schema.py +85 -0
- rasa/shared/nlu/training_data/schemas/nlu.yml +53 -0
- rasa/shared/nlu/training_data/schemas/responses.yml +70 -0
- rasa/shared/nlu/training_data/synonyms_parser.py +42 -0
- rasa/shared/nlu/training_data/training_data.py +729 -0
- rasa/shared/nlu/training_data/util.py +223 -0
- rasa/shared/providers/__init__.py +0 -0
- rasa/shared/providers/_configs/__init__.py +0 -0
- rasa/shared/providers/_configs/azure_openai_client_config.py +677 -0
- rasa/shared/providers/_configs/client_config.py +59 -0
- rasa/shared/providers/_configs/default_litellm_client_config.py +132 -0
- rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +236 -0
- rasa/shared/providers/_configs/litellm_router_client_config.py +222 -0
- rasa/shared/providers/_configs/model_group_config.py +173 -0
- rasa/shared/providers/_configs/openai_client_config.py +177 -0
- rasa/shared/providers/_configs/rasa_llm_client_config.py +75 -0
- rasa/shared/providers/_configs/self_hosted_llm_client_config.py +178 -0
- rasa/shared/providers/_configs/utils.py +117 -0
- rasa/shared/providers/_ssl_verification_utils.py +124 -0
- rasa/shared/providers/_utils.py +79 -0
- rasa/shared/providers/constants.py +7 -0
- rasa/shared/providers/embedding/__init__.py +0 -0
- rasa/shared/providers/embedding/_base_litellm_embedding_client.py +243 -0
- rasa/shared/providers/embedding/_langchain_embedding_client_adapter.py +74 -0
- rasa/shared/providers/embedding/azure_openai_embedding_client.py +335 -0
- rasa/shared/providers/embedding/default_litellm_embedding_client.py +126 -0
- rasa/shared/providers/embedding/embedding_client.py +90 -0
- rasa/shared/providers/embedding/embedding_response.py +41 -0
- rasa/shared/providers/embedding/huggingface_local_embedding_client.py +191 -0
- rasa/shared/providers/embedding/litellm_router_embedding_client.py +138 -0
- rasa/shared/providers/embedding/openai_embedding_client.py +172 -0
- rasa/shared/providers/llm/__init__.py +0 -0
- rasa/shared/providers/llm/_base_litellm_client.py +265 -0
- rasa/shared/providers/llm/azure_openai_llm_client.py +415 -0
- rasa/shared/providers/llm/default_litellm_llm_client.py +110 -0
- rasa/shared/providers/llm/litellm_router_llm_client.py +202 -0
- rasa/shared/providers/llm/llm_client.py +78 -0
- rasa/shared/providers/llm/llm_response.py +50 -0
- rasa/shared/providers/llm/openai_llm_client.py +161 -0
- rasa/shared/providers/llm/rasa_llm_client.py +120 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +276 -0
- rasa/shared/providers/mappings.py +94 -0
- rasa/shared/providers/router/__init__.py +0 -0
- rasa/shared/providers/router/_base_litellm_router_client.py +185 -0
- rasa/shared/providers/router/router_client.py +75 -0
- rasa/shared/utils/__init__.py +0 -0
- rasa/shared/utils/cli.py +102 -0
- rasa/shared/utils/common.py +324 -0
- rasa/shared/utils/constants.py +4 -0
- rasa/shared/utils/health_check/__init__.py +0 -0
- rasa/shared/utils/health_check/embeddings_health_check_mixin.py +31 -0
- rasa/shared/utils/health_check/health_check.py +258 -0
- rasa/shared/utils/health_check/llm_health_check_mixin.py +31 -0
- rasa/shared/utils/io.py +499 -0
- rasa/shared/utils/llm.py +764 -0
- rasa/shared/utils/pykwalify_extensions.py +27 -0
- rasa/shared/utils/schemas/__init__.py +0 -0
- rasa/shared/utils/schemas/config.yml +2 -0
- rasa/shared/utils/schemas/domain.yml +145 -0
- rasa/shared/utils/schemas/events.py +214 -0
- rasa/shared/utils/schemas/model_config.yml +36 -0
- rasa/shared/utils/schemas/stories.yml +173 -0
- rasa/shared/utils/yaml.py +1068 -0
- rasa/studio/__init__.py +0 -0
- rasa/studio/auth.py +270 -0
- rasa/studio/config.py +136 -0
- rasa/studio/constants.py +19 -0
- rasa/studio/data_handler.py +368 -0
- rasa/studio/download.py +489 -0
- rasa/studio/results_logger.py +137 -0
- rasa/studio/train.py +134 -0
- rasa/studio/upload.py +563 -0
- rasa/telemetry.py +1876 -0
- rasa/tracing/__init__.py +0 -0
- rasa/tracing/config.py +355 -0
- rasa/tracing/constants.py +62 -0
- rasa/tracing/instrumentation/__init__.py +0 -0
- rasa/tracing/instrumentation/attribute_extractors.py +765 -0
- rasa/tracing/instrumentation/instrumentation.py +1306 -0
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +144 -0
- rasa/tracing/instrumentation/metrics.py +294 -0
- rasa/tracing/metric_instrument_provider.py +205 -0
- rasa/utils/__init__.py +0 -0
- rasa/utils/beta.py +83 -0
- rasa/utils/cli.py +28 -0
- rasa/utils/common.py +639 -0
- rasa/utils/converter.py +53 -0
- rasa/utils/endpoints.py +331 -0
- rasa/utils/io.py +252 -0
- rasa/utils/json_utils.py +60 -0
- rasa/utils/licensing.py +542 -0
- rasa/utils/log_utils.py +181 -0
- rasa/utils/mapper.py +210 -0
- rasa/utils/ml_utils.py +147 -0
- rasa/utils/plotting.py +362 -0
- rasa/utils/sanic_error_handler.py +32 -0
- rasa/utils/singleton.py +23 -0
- rasa/utils/tensorflow/__init__.py +0 -0
- rasa/utils/tensorflow/callback.py +112 -0
- rasa/utils/tensorflow/constants.py +116 -0
- rasa/utils/tensorflow/crf.py +492 -0
- rasa/utils/tensorflow/data_generator.py +440 -0
- rasa/utils/tensorflow/environment.py +161 -0
- rasa/utils/tensorflow/exceptions.py +5 -0
- rasa/utils/tensorflow/feature_array.py +366 -0
- rasa/utils/tensorflow/layers.py +1565 -0
- rasa/utils/tensorflow/layers_utils.py +113 -0
- rasa/utils/tensorflow/metrics.py +281 -0
- rasa/utils/tensorflow/model_data.py +798 -0
- rasa/utils/tensorflow/model_data_utils.py +499 -0
- rasa/utils/tensorflow/models.py +935 -0
- rasa/utils/tensorflow/rasa_layers.py +1094 -0
- rasa/utils/tensorflow/transformer.py +640 -0
- rasa/utils/tensorflow/types.py +6 -0
- rasa/utils/train_utils.py +572 -0
- rasa/utils/url_tools.py +53 -0
- rasa/utils/yaml.py +54 -0
- rasa/validator.py +1644 -0
- rasa/version.py +3 -0
- rasa_pro-3.12.0.dev1.dist-info/METADATA +199 -0
- rasa_pro-3.12.0.dev1.dist-info/NOTICE +5 -0
- rasa_pro-3.12.0.dev1.dist-info/RECORD +790 -0
- rasa_pro-3.12.0.dev1.dist-info/WHEEL +4 -0
- rasa_pro-3.12.0.dev1.dist-info/entry_points.txt +3 -0
rasa/core/utils.py
ADDED
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import structlog
|
|
2
|
+
import logging
|
|
3
|
+
import os
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from socket import SOCK_DGRAM, SOCK_STREAM
|
|
6
|
+
from typing import Any, Dict, Optional, List, Set, TYPE_CHECKING, Text, Tuple, Union
|
|
7
|
+
|
|
8
|
+
import numpy as np
|
|
9
|
+
from sanic import Sanic
|
|
10
|
+
|
|
11
|
+
import rasa.cli.utils as cli_utils
|
|
12
|
+
import rasa.shared.utils.io
|
|
13
|
+
from rasa.constants import DEFAULT_SANIC_WORKERS, ENV_SANIC_WORKERS
|
|
14
|
+
from rasa.core.constants import (
|
|
15
|
+
DOMAIN_GROUND_TRUTH_METADATA_KEY,
|
|
16
|
+
UTTER_SOURCE_METADATA_KEY,
|
|
17
|
+
ACTIVE_FLOW_METADATA_KEY,
|
|
18
|
+
STEP_ID_METADATA_KEY,
|
|
19
|
+
)
|
|
20
|
+
from rasa.core.lock_store import LockStore, RedisLockStore, InMemoryLockStore
|
|
21
|
+
from rasa.shared.constants import DEFAULT_ENDPOINTS_PATH, TCP_PROTOCOL
|
|
22
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
23
|
+
from rasa.utils.endpoints import (
|
|
24
|
+
EndpointConfig,
|
|
25
|
+
read_endpoint_config,
|
|
26
|
+
read_property_config_from_endpoints_file,
|
|
27
|
+
)
|
|
28
|
+
from rasa.utils.io import write_yaml
|
|
29
|
+
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
from rasa.core.nlg import NaturalLanguageGenerator
|
|
32
|
+
from rasa.shared.core.domain import Domain
|
|
33
|
+
|
|
34
|
+
structlogger = structlog.get_logger()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def configure_file_logging(
|
|
38
|
+
logger_obj: logging.Logger,
|
|
39
|
+
log_file: Optional[Text],
|
|
40
|
+
use_syslog: Optional[bool],
|
|
41
|
+
syslog_address: Optional[Text] = None,
|
|
42
|
+
syslog_port: Optional[int] = None,
|
|
43
|
+
syslog_protocol: Optional[Text] = None,
|
|
44
|
+
) -> None:
|
|
45
|
+
"""Configure logging to a file.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
logger_obj: Logger object to configure.
|
|
49
|
+
log_file: Path of log file to write to.
|
|
50
|
+
use_syslog: Add syslog as a logger.
|
|
51
|
+
syslog_address: Adress of the syslog server.
|
|
52
|
+
syslog_port: Port of the syslog server.
|
|
53
|
+
syslog_protocol: Protocol with the syslog server
|
|
54
|
+
"""
|
|
55
|
+
if use_syslog:
|
|
56
|
+
formatter = logging.Formatter(
|
|
57
|
+
"%(asctime)s [%(levelname)-5.5s] [%(process)d]" " %(message)s"
|
|
58
|
+
)
|
|
59
|
+
socktype = SOCK_STREAM if syslog_protocol == TCP_PROTOCOL else SOCK_DGRAM
|
|
60
|
+
syslog_handler = logging.handlers.SysLogHandler(
|
|
61
|
+
address=(syslog_address, syslog_port), socktype=socktype
|
|
62
|
+
)
|
|
63
|
+
syslog_handler.setLevel(logger_obj.level)
|
|
64
|
+
syslog_handler.setFormatter(formatter)
|
|
65
|
+
logger_obj.addHandler(syslog_handler)
|
|
66
|
+
if log_file:
|
|
67
|
+
formatter = logging.Formatter("%(asctime)s [%(levelname)-5.5s] %(message)s")
|
|
68
|
+
file_handler = logging.FileHandler(
|
|
69
|
+
log_file, encoding=rasa.shared.utils.io.DEFAULT_ENCODING
|
|
70
|
+
)
|
|
71
|
+
file_handler.setLevel(logger_obj.level)
|
|
72
|
+
file_handler.setFormatter(formatter)
|
|
73
|
+
logger_obj.addHandler(file_handler)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def one_hot(hot_idx: int, length: int, dtype: Optional[Text] = None) -> np.ndarray:
|
|
77
|
+
"""Create a one-hot array.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
hot_idx: Index of the hot element.
|
|
81
|
+
length: Length of the array.
|
|
82
|
+
dtype: ``numpy.dtype`` of the array.
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
One-hot array.
|
|
86
|
+
"""
|
|
87
|
+
if hot_idx >= length:
|
|
88
|
+
raise ValueError(
|
|
89
|
+
"Can't create one hot. Index '{}' is out of range (length '{}')".format(
|
|
90
|
+
hot_idx, length
|
|
91
|
+
)
|
|
92
|
+
)
|
|
93
|
+
r = np.zeros(length, dtype)
|
|
94
|
+
r[hot_idx] = 1
|
|
95
|
+
return r
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def dump_obj_as_yaml_to_file(
|
|
99
|
+
filename: Union[Text, Path], obj: Any, should_preserve_key_order: bool = False
|
|
100
|
+
) -> None:
|
|
101
|
+
"""Writes `obj` to the filename in YAML repr.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
filename: Target filename.
|
|
105
|
+
obj: Object to dump.
|
|
106
|
+
should_preserve_key_order: Whether to preserve key order in `obj`.
|
|
107
|
+
"""
|
|
108
|
+
write_yaml(obj, filename, should_preserve_key_order=should_preserve_key_order)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def list_routes(app: Sanic) -> Dict[Text, Text]:
|
|
112
|
+
"""List all the routes of a sanic application. Mainly used for debugging."""
|
|
113
|
+
from urllib.parse import unquote
|
|
114
|
+
|
|
115
|
+
output = {}
|
|
116
|
+
|
|
117
|
+
def find_route(suffix: Text, path: Text) -> Optional[Text]:
|
|
118
|
+
for name, (uri, _) in app.router.routes_names.items():
|
|
119
|
+
if name.split(".")[-1] == suffix and uri == path:
|
|
120
|
+
return name
|
|
121
|
+
return None
|
|
122
|
+
|
|
123
|
+
for route in app.router.routes:
|
|
124
|
+
endpoint = route.parts
|
|
125
|
+
if endpoint[:-1] in app.router.routes_all and endpoint[-1] == "/":
|
|
126
|
+
continue
|
|
127
|
+
|
|
128
|
+
options = {}
|
|
129
|
+
for arg in route._params:
|
|
130
|
+
options[arg] = f"[{arg}]"
|
|
131
|
+
|
|
132
|
+
name = route.name.replace("rasa_server.", "")
|
|
133
|
+
methods = ",".join(route.methods)
|
|
134
|
+
|
|
135
|
+
full_endpoint = "/" + "/".join(endpoint)
|
|
136
|
+
line = unquote(f"{full_endpoint:50s} {methods:30s} {name}")
|
|
137
|
+
output[name] = line
|
|
138
|
+
|
|
139
|
+
url_table = "\n".join(output[url] for url in sorted(output))
|
|
140
|
+
structlogger.debug(
|
|
141
|
+
"server.routes", event_info=f"Available web server routes: \n{url_table}"
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
return output
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def extract_args(
|
|
148
|
+
kwargs: Dict[Text, Any], keys_to_extract: Set[Text]
|
|
149
|
+
) -> Tuple[Dict[Text, Any], Dict[Text, Any]]:
|
|
150
|
+
"""Go through the kwargs and filter out the specified keys.
|
|
151
|
+
|
|
152
|
+
Return both, the filtered kwargs as well as the remaining kwargs.
|
|
153
|
+
"""
|
|
154
|
+
remaining = {}
|
|
155
|
+
extracted = {}
|
|
156
|
+
for k, v in kwargs.items():
|
|
157
|
+
if k in keys_to_extract:
|
|
158
|
+
extracted[k] = v
|
|
159
|
+
else:
|
|
160
|
+
remaining[k] = v
|
|
161
|
+
|
|
162
|
+
return extracted, remaining
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def is_limit_reached(num_messages: int, limit: Optional[int]) -> bool:
|
|
166
|
+
"""Determine whether the number of messages has reached a limit.
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
num_messages: The number of messages to check.
|
|
170
|
+
limit: Limit on the number of messages.
|
|
171
|
+
|
|
172
|
+
Returns:
|
|
173
|
+
`True` if the limit has been reached, otherwise `False`.
|
|
174
|
+
"""
|
|
175
|
+
return limit is not None and num_messages >= limit
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
class AvailableEndpoints:
|
|
179
|
+
"""Collection of configured endpoints."""
|
|
180
|
+
|
|
181
|
+
_instance = None
|
|
182
|
+
|
|
183
|
+
@classmethod
|
|
184
|
+
def read_endpoints(cls, endpoint_file: Text) -> "AvailableEndpoints":
|
|
185
|
+
"""Read the different endpoints from a yaml file."""
|
|
186
|
+
nlg = read_endpoint_config(endpoint_file, endpoint_type="nlg")
|
|
187
|
+
nlu = read_endpoint_config(endpoint_file, endpoint_type="nlu")
|
|
188
|
+
action = read_endpoint_config(endpoint_file, endpoint_type="action_endpoint")
|
|
189
|
+
model = read_endpoint_config(endpoint_file, endpoint_type="models")
|
|
190
|
+
tracker_store = read_endpoint_config(
|
|
191
|
+
endpoint_file, endpoint_type="tracker_store"
|
|
192
|
+
)
|
|
193
|
+
lock_store = read_endpoint_config(endpoint_file, endpoint_type="lock_store")
|
|
194
|
+
event_broker = read_endpoint_config(endpoint_file, endpoint_type="event_broker")
|
|
195
|
+
vector_store = read_endpoint_config(endpoint_file, endpoint_type="vector_store")
|
|
196
|
+
model_groups = read_property_config_from_endpoints_file(
|
|
197
|
+
endpoint_file, property_name="model_groups"
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
return cls(
|
|
201
|
+
nlg,
|
|
202
|
+
nlu,
|
|
203
|
+
action,
|
|
204
|
+
model,
|
|
205
|
+
tracker_store,
|
|
206
|
+
lock_store,
|
|
207
|
+
event_broker,
|
|
208
|
+
vector_store,
|
|
209
|
+
model_groups,
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
def __init__(
|
|
213
|
+
self,
|
|
214
|
+
nlg: Optional[EndpointConfig] = None,
|
|
215
|
+
nlu: Optional[EndpointConfig] = None,
|
|
216
|
+
action: Optional[EndpointConfig] = None,
|
|
217
|
+
model: Optional[EndpointConfig] = None,
|
|
218
|
+
tracker_store: Optional[EndpointConfig] = None,
|
|
219
|
+
lock_store: Optional[EndpointConfig] = None,
|
|
220
|
+
event_broker: Optional[EndpointConfig] = None,
|
|
221
|
+
vector_store: Optional[EndpointConfig] = None,
|
|
222
|
+
model_groups: Optional[List[Dict[str, Any]]] = None,
|
|
223
|
+
) -> None:
|
|
224
|
+
"""Create an `AvailableEndpoints` object."""
|
|
225
|
+
self.model = model
|
|
226
|
+
self.action = action
|
|
227
|
+
self.nlu = nlu
|
|
228
|
+
self.nlg = nlg
|
|
229
|
+
self.tracker_store = tracker_store
|
|
230
|
+
self.lock_store = lock_store
|
|
231
|
+
self.event_broker = event_broker
|
|
232
|
+
self.vector_store = vector_store
|
|
233
|
+
self.model_groups = model_groups
|
|
234
|
+
|
|
235
|
+
@classmethod
|
|
236
|
+
def get_instance(
|
|
237
|
+
cls, endpoint_file: Optional[Text] = DEFAULT_ENDPOINTS_PATH
|
|
238
|
+
) -> "AvailableEndpoints":
|
|
239
|
+
"""Get the singleton instance of AvailableEndpoints."""
|
|
240
|
+
# Ensure that the instance is initialized only once.
|
|
241
|
+
if cls._instance is None:
|
|
242
|
+
cls._instance = cls.read_endpoints(endpoint_file)
|
|
243
|
+
return cls._instance
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def read_endpoints_from_path(
|
|
247
|
+
endpoints_path: Optional[Union[Path, Text]] = None,
|
|
248
|
+
) -> AvailableEndpoints:
|
|
249
|
+
"""Get `AvailableEndpoints` object from specified path.
|
|
250
|
+
|
|
251
|
+
Args:
|
|
252
|
+
endpoints_path: Path of the endpoints file to be read. If `None` the
|
|
253
|
+
default path for that file is used (`endpoints.yml`).
|
|
254
|
+
|
|
255
|
+
Returns:
|
|
256
|
+
`AvailableEndpoints` object read from endpoints file.
|
|
257
|
+
|
|
258
|
+
"""
|
|
259
|
+
endpoints_config_path = cli_utils.get_validated_path(
|
|
260
|
+
endpoints_path, "endpoints", DEFAULT_ENDPOINTS_PATH, True
|
|
261
|
+
)
|
|
262
|
+
return AvailableEndpoints.get_instance(endpoints_config_path)
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def _lock_store_is_multi_worker_compatible(
|
|
266
|
+
lock_store: Union[EndpointConfig, LockStore, None],
|
|
267
|
+
) -> bool:
|
|
268
|
+
if isinstance(lock_store, InMemoryLockStore):
|
|
269
|
+
return False
|
|
270
|
+
|
|
271
|
+
if isinstance(lock_store, RedisLockStore):
|
|
272
|
+
return True
|
|
273
|
+
|
|
274
|
+
# `lock_store` is `None` or `EndpointConfig`
|
|
275
|
+
return (
|
|
276
|
+
lock_store is not None
|
|
277
|
+
and isinstance(lock_store, EndpointConfig)
|
|
278
|
+
and lock_store.type != "in_memory"
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def number_of_sanic_workers(lock_store: Union[EndpointConfig, LockStore, None]) -> int:
|
|
283
|
+
"""Get the number of Sanic workers to use in `app.run()`.
|
|
284
|
+
|
|
285
|
+
If the environment variable constants.ENV_SANIC_WORKERS is set and is not equal to
|
|
286
|
+
1, that value will only be permitted if the used lock store is not the
|
|
287
|
+
`InMemoryLockStore`.
|
|
288
|
+
"""
|
|
289
|
+
|
|
290
|
+
def _log_and_get_default_number_of_workers() -> int:
|
|
291
|
+
structlogger.debug(
|
|
292
|
+
"server.worker.set_count",
|
|
293
|
+
number_of_workers=DEFAULT_SANIC_WORKERS,
|
|
294
|
+
event_info=f"Using the default number of Sanic workers "
|
|
295
|
+
f"({DEFAULT_SANIC_WORKERS}).",
|
|
296
|
+
)
|
|
297
|
+
return DEFAULT_SANIC_WORKERS
|
|
298
|
+
|
|
299
|
+
try:
|
|
300
|
+
env_value = int(os.environ.get(ENV_SANIC_WORKERS, DEFAULT_SANIC_WORKERS))
|
|
301
|
+
except ValueError:
|
|
302
|
+
structlogger.error(
|
|
303
|
+
"server.worker.set_count.error",
|
|
304
|
+
number_of_workers=os.environ[ENV_SANIC_WORKERS],
|
|
305
|
+
event_info=f"Cannot convert environment variable `{ENV_SANIC_WORKERS}` "
|
|
306
|
+
f"to int ('{os.environ[ENV_SANIC_WORKERS]}').",
|
|
307
|
+
)
|
|
308
|
+
return _log_and_get_default_number_of_workers()
|
|
309
|
+
|
|
310
|
+
if env_value == DEFAULT_SANIC_WORKERS:
|
|
311
|
+
return _log_and_get_default_number_of_workers()
|
|
312
|
+
|
|
313
|
+
if env_value < 1:
|
|
314
|
+
structlogger.warning(
|
|
315
|
+
"server.worker.set_count.error_less_than_one",
|
|
316
|
+
number_of_workers=env_value,
|
|
317
|
+
event_info=f"Cannot set number of Sanic workers to the desired value "
|
|
318
|
+
f"({env_value}). The number of workers must be at least 1.",
|
|
319
|
+
)
|
|
320
|
+
return _log_and_get_default_number_of_workers()
|
|
321
|
+
|
|
322
|
+
if _lock_store_is_multi_worker_compatible(lock_store):
|
|
323
|
+
structlogger.debug(
|
|
324
|
+
"server.worker.set_count.success",
|
|
325
|
+
event_info=f"Using {env_value} Sanic workers.",
|
|
326
|
+
num_workers=env_value,
|
|
327
|
+
)
|
|
328
|
+
return env_value
|
|
329
|
+
|
|
330
|
+
structlogger.warning(
|
|
331
|
+
"server.worker.set_count.error_no_lock_store",
|
|
332
|
+
event_info=f"Unable to assign desired number of Sanic workers ({env_value}) as "
|
|
333
|
+
f"no `RedisLockStore` or custom `LockStore` endpoint "
|
|
334
|
+
f"configuration has been found.",
|
|
335
|
+
num_workers=env_value,
|
|
336
|
+
)
|
|
337
|
+
return _log_and_get_default_number_of_workers()
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
def add_bot_utterance_metadata(
|
|
341
|
+
message: Dict[str, Any],
|
|
342
|
+
domain_response_name: str,
|
|
343
|
+
nlg: "NaturalLanguageGenerator",
|
|
344
|
+
domain: "Domain",
|
|
345
|
+
tracker: Optional[DialogueStateTracker],
|
|
346
|
+
) -> Dict[str, Any]:
|
|
347
|
+
"""Add metadata to the bot message."""
|
|
348
|
+
message["utter_action"] = domain_response_name
|
|
349
|
+
|
|
350
|
+
utter_source = message.get(UTTER_SOURCE_METADATA_KEY)
|
|
351
|
+
if utter_source is None:
|
|
352
|
+
utter_source = nlg.__class__.__name__
|
|
353
|
+
message[UTTER_SOURCE_METADATA_KEY] = utter_source
|
|
354
|
+
|
|
355
|
+
if tracker:
|
|
356
|
+
message[ACTIVE_FLOW_METADATA_KEY] = tracker.active_flow
|
|
357
|
+
message[STEP_ID_METADATA_KEY] = tracker.current_step_id
|
|
358
|
+
|
|
359
|
+
if utter_source in ["IntentlessPolicy", "ContextualResponseRephraser"]:
|
|
360
|
+
message[DOMAIN_GROUND_TRUTH_METADATA_KEY] = [
|
|
361
|
+
response.get("text")
|
|
362
|
+
for response in domain.responses.get(domain_response_name, [])
|
|
363
|
+
if response.get("text") is not None
|
|
364
|
+
]
|
|
365
|
+
|
|
366
|
+
return message
|
rasa/core/visualize.py
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
from typing import Text
|
|
4
|
+
|
|
5
|
+
from rasa import telemetry
|
|
6
|
+
from rasa.shared.core.training_data import loading
|
|
7
|
+
from rasa.shared.utils.cli import print_error
|
|
8
|
+
from rasa.shared.core.domain import InvalidDomain, Domain
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def visualize(
|
|
14
|
+
domain_path: Text,
|
|
15
|
+
stories_path: Text,
|
|
16
|
+
nlu_data_path: Text,
|
|
17
|
+
output_path: Text,
|
|
18
|
+
max_history: int,
|
|
19
|
+
) -> None:
|
|
20
|
+
"""Visualizes stories as graph.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
domain_path: Path to the domain file.
|
|
24
|
+
stories_path: Path to the stories files.
|
|
25
|
+
nlu_data_path: Path to the NLU training data which can be used to interpolate
|
|
26
|
+
intents with actual examples in the graph.
|
|
27
|
+
output_path: Path where the created graph should be persisted.
|
|
28
|
+
max_history: Max history to use for the story visualization.
|
|
29
|
+
"""
|
|
30
|
+
import rasa.shared.core.training_data.visualization
|
|
31
|
+
|
|
32
|
+
try:
|
|
33
|
+
domain = Domain.load(domain_path)
|
|
34
|
+
except InvalidDomain as e:
|
|
35
|
+
print_error(
|
|
36
|
+
f"Could not load domain due to: '{e}'. To specify a valid domain path use "
|
|
37
|
+
f"the '--domain' argument."
|
|
38
|
+
)
|
|
39
|
+
return
|
|
40
|
+
|
|
41
|
+
# this is optional, only needed if the `/greet` type of
|
|
42
|
+
# messages in the stories should be replaced with actual
|
|
43
|
+
# messages (e.g. `hello`)
|
|
44
|
+
if nlu_data_path is not None:
|
|
45
|
+
import rasa.shared.nlu.training_data.loading
|
|
46
|
+
|
|
47
|
+
nlu_training_data = rasa.shared.nlu.training_data.loading.load_data(
|
|
48
|
+
nlu_data_path
|
|
49
|
+
)
|
|
50
|
+
else:
|
|
51
|
+
nlu_training_data = None
|
|
52
|
+
|
|
53
|
+
logger.info("Starting to visualize stories...")
|
|
54
|
+
telemetry.track_visualization()
|
|
55
|
+
|
|
56
|
+
story_steps = loading.load_data_from_resource(stories_path, domain)
|
|
57
|
+
rasa.shared.core.training_data.visualization.visualize_stories(
|
|
58
|
+
story_steps,
|
|
59
|
+
domain,
|
|
60
|
+
output_path,
|
|
61
|
+
max_history,
|
|
62
|
+
nlu_training_data=nlu_training_data,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
full_output_path = "file://{}".format(os.path.abspath(output_path))
|
|
66
|
+
logger.info(f"Finished graph creation. Saved into {full_output_path}")
|
|
67
|
+
|
|
68
|
+
import webbrowser
|
|
69
|
+
|
|
70
|
+
webbrowser.open(full_output_path)
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import Any, Dict, List, Optional
|
|
3
|
+
|
|
4
|
+
import structlog
|
|
5
|
+
|
|
6
|
+
from rasa.dialogue_understanding.coexistence.constants import (
|
|
7
|
+
CALM_ENTRY,
|
|
8
|
+
NLU_ENTRY,
|
|
9
|
+
STICKY,
|
|
10
|
+
NON_STICKY,
|
|
11
|
+
)
|
|
12
|
+
from rasa.dialogue_understanding.commands import Command, SetSlotCommand
|
|
13
|
+
from rasa.dialogue_understanding.commands.noop_command import NoopCommand
|
|
14
|
+
from rasa.dialogue_understanding.generator.nlu_command_adapter import (
|
|
15
|
+
NLUCommandAdapter,
|
|
16
|
+
)
|
|
17
|
+
from rasa.engine.graph import ExecutionContext, GraphComponent
|
|
18
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
19
|
+
from rasa.engine.storage.resource import Resource
|
|
20
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
21
|
+
from rasa.shared.constants import ROUTE_TO_CALM_SLOT
|
|
22
|
+
from rasa.shared.core.domain import Domain
|
|
23
|
+
from rasa.shared.core.flows import FlowsList
|
|
24
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
25
|
+
from rasa.shared.exceptions import InvalidConfigException
|
|
26
|
+
from rasa.shared.nlu.constants import COMMANDS, INTENT, INTENT_NAME_KEY
|
|
27
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
28
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
structlogger = structlog.get_logger()
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@DefaultV1Recipe.register(
|
|
35
|
+
[
|
|
36
|
+
DefaultV1Recipe.ComponentType.COEXISTENCE_ROUTER,
|
|
37
|
+
],
|
|
38
|
+
is_trainable=False,
|
|
39
|
+
)
|
|
40
|
+
class IntentBasedRouter(GraphComponent):
|
|
41
|
+
@staticmethod
|
|
42
|
+
def get_default_config() -> Dict[str, Any]:
|
|
43
|
+
"""The component's default config (see parent class for full docstring)."""
|
|
44
|
+
return {
|
|
45
|
+
NLU_ENTRY: None,
|
|
46
|
+
CALM_ENTRY: None,
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
def __init__(
|
|
50
|
+
self,
|
|
51
|
+
config: Dict[str, Any],
|
|
52
|
+
model_storage: ModelStorage,
|
|
53
|
+
resource: Resource,
|
|
54
|
+
) -> None:
|
|
55
|
+
self.config = {**self.get_default_config(), **config}
|
|
56
|
+
self._model_storage = model_storage
|
|
57
|
+
self._resource = resource
|
|
58
|
+
self.validate_config()
|
|
59
|
+
|
|
60
|
+
def validate_config(self) -> None:
|
|
61
|
+
"""Validate the config of the router."""
|
|
62
|
+
if not (self._is_nlu_entry_valid() and self._is_calm_entry_valid()):
|
|
63
|
+
raise ValueError(
|
|
64
|
+
"The IntentBasedRouter component needs a proper "
|
|
65
|
+
"description of the capabilities implemented in the DM1 "
|
|
66
|
+
"part of the bot."
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
def _is_nlu_entry_valid(self) -> bool:
|
|
70
|
+
"""Check if the NLU entry in the config is valid."""
|
|
71
|
+
nlu_entry = self.config.get(NLU_ENTRY, {})
|
|
72
|
+
return (
|
|
73
|
+
isinstance(nlu_entry, dict)
|
|
74
|
+
and nlu_entry.get(STICKY) is not None
|
|
75
|
+
and nlu_entry.get(NON_STICKY) is not None
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
def _is_calm_entry_valid(self) -> bool:
|
|
79
|
+
"""Check if the CALM entry in the config is valid."""
|
|
80
|
+
calm_entry = self.config.get(CALM_ENTRY, {})
|
|
81
|
+
return isinstance(calm_entry, dict) and calm_entry.get(STICKY) is not None
|
|
82
|
+
|
|
83
|
+
def train(self, training_data: TrainingData) -> Resource:
|
|
84
|
+
"""Train the intent classifier on a data set."""
|
|
85
|
+
return self._resource
|
|
86
|
+
|
|
87
|
+
@classmethod
|
|
88
|
+
def load(
|
|
89
|
+
cls,
|
|
90
|
+
config: Dict[str, Any],
|
|
91
|
+
model_storage: ModelStorage,
|
|
92
|
+
resource: Resource,
|
|
93
|
+
execution_context: ExecutionContext,
|
|
94
|
+
**kwargs: Any,
|
|
95
|
+
) -> "IntentBasedRouter":
|
|
96
|
+
"""Loads trained component (see parent class for full docstring)."""
|
|
97
|
+
return cls(config, model_storage, resource)
|
|
98
|
+
|
|
99
|
+
@classmethod
|
|
100
|
+
def create(
|
|
101
|
+
cls,
|
|
102
|
+
config: Dict[str, Any],
|
|
103
|
+
model_storage: ModelStorage,
|
|
104
|
+
resource: Resource,
|
|
105
|
+
execution_context: ExecutionContext,
|
|
106
|
+
) -> IntentBasedRouter:
|
|
107
|
+
"""Creates component (see parent class for full docstring)."""
|
|
108
|
+
return cls(config, model_storage, resource)
|
|
109
|
+
|
|
110
|
+
async def process(
|
|
111
|
+
self,
|
|
112
|
+
messages: List[Message],
|
|
113
|
+
flows: FlowsList,
|
|
114
|
+
tracker: Optional[DialogueStateTracker] = None,
|
|
115
|
+
domain: Optional[Domain] = None,
|
|
116
|
+
) -> List[Message]:
|
|
117
|
+
"""Process a list of messages."""
|
|
118
|
+
if tracker is None:
|
|
119
|
+
# cannot do anything if there is no tracker (happens during 'rasa test nlu')
|
|
120
|
+
return messages
|
|
121
|
+
|
|
122
|
+
for message in messages:
|
|
123
|
+
commands = await self.predict_commands(message, flows, tracker, domain)
|
|
124
|
+
commands_dicts = [command.as_dict() for command in commands]
|
|
125
|
+
message.set(COMMANDS, commands_dicts, add_to_output=True)
|
|
126
|
+
|
|
127
|
+
return messages
|
|
128
|
+
|
|
129
|
+
async def predict_commands(
|
|
130
|
+
self,
|
|
131
|
+
message: Message,
|
|
132
|
+
flows: FlowsList,
|
|
133
|
+
tracker: DialogueStateTracker,
|
|
134
|
+
domain: Optional[Domain] = None,
|
|
135
|
+
) -> List[Command]:
|
|
136
|
+
if not tracker.has_coexistence_routing_slot:
|
|
137
|
+
raise InvalidConfigException(
|
|
138
|
+
f"Tried to run the IntentBasedRouter component "
|
|
139
|
+
f"without the slot to track coexistence routing ({ROUTE_TO_CALM_SLOT})."
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
route_session_to_calm = tracker.get_slot(ROUTE_TO_CALM_SLOT)
|
|
143
|
+
if route_session_to_calm is None:
|
|
144
|
+
commands = self._generate_command_using_intent(message, flows, tracker)
|
|
145
|
+
structlogger.info(
|
|
146
|
+
"intent_based_router.predicated_commands", commands=commands
|
|
147
|
+
)
|
|
148
|
+
return commands
|
|
149
|
+
elif route_session_to_calm is True:
|
|
150
|
+
# don't set any commands so that a `LLMBasedCommandGenerator` is
|
|
151
|
+
# triggered and can predict the actual commands.
|
|
152
|
+
return []
|
|
153
|
+
else:
|
|
154
|
+
# If the session is assigned to DM1 add a `NoopCommand` to silence
|
|
155
|
+
# the other command generators.
|
|
156
|
+
return [NoopCommand()]
|
|
157
|
+
|
|
158
|
+
def _check_intent_part_of_nlu_trigger(
|
|
159
|
+
self, message: Message, tracker: DialogueStateTracker, flows: FlowsList
|
|
160
|
+
) -> bool:
|
|
161
|
+
"""Check if the intent is part of a nlu trigger."""
|
|
162
|
+
commands = NLUCommandAdapter.convert_nlu_to_commands(
|
|
163
|
+
message,
|
|
164
|
+
tracker,
|
|
165
|
+
flows,
|
|
166
|
+
)
|
|
167
|
+
return len(commands) > 0
|
|
168
|
+
|
|
169
|
+
def _generate_command_using_intent(
|
|
170
|
+
self, message: Message, flows: FlowsList, tracker: DialogueStateTracker
|
|
171
|
+
) -> List[Command]:
|
|
172
|
+
intent = message.data.get(INTENT)
|
|
173
|
+
if not intent or intent.get(INTENT_NAME_KEY) is None:
|
|
174
|
+
# If the message does not have a predicted intent, let the session
|
|
175
|
+
# be sticky and routed to DM1. This is done as the customers currently
|
|
176
|
+
# are in the inital phase of migration to CALM. In the future, we can
|
|
177
|
+
# let the next command generator predict the commands.
|
|
178
|
+
return [SetSlotCommand(ROUTE_TO_CALM_SLOT, False)]
|
|
179
|
+
|
|
180
|
+
if intent[INTENT_NAME_KEY] in self.config[NLU_ENTRY][STICKY]:
|
|
181
|
+
# If the intent is in nlu entry sticky, set the slot to route to DM1.
|
|
182
|
+
return [SetSlotCommand(ROUTE_TO_CALM_SLOT, False)]
|
|
183
|
+
elif intent[INTENT_NAME_KEY] in self.config[NLU_ENTRY][NON_STICKY]:
|
|
184
|
+
# If the intent is in nlu entry non-sticky, predict a Noop so that
|
|
185
|
+
# the next command generator is skipped for just this turn.
|
|
186
|
+
return [NoopCommand()]
|
|
187
|
+
elif intent[INTENT_NAME_KEY] in self.config[CALM_ENTRY][STICKY]:
|
|
188
|
+
# If the intent is in calm entry sticky, set the slot to route to CALM.
|
|
189
|
+
return []
|
|
190
|
+
|
|
191
|
+
if self._check_intent_part_of_nlu_trigger(message, tracker, flows):
|
|
192
|
+
# If the intent is part of a nlu trigger, set the slot to route to CALM.
|
|
193
|
+
return []
|
|
194
|
+
# If the intent is not present in any of the above, let the session be sticky
|
|
195
|
+
# and routed to DM1.
|
|
196
|
+
return [SetSlotCommand(ROUTE_TO_CALM_SLOT, False)]
|