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,729 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
from functools import cached_property
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
import random
|
|
6
|
+
from collections import Counter, OrderedDict
|
|
7
|
+
import copy
|
|
8
|
+
from os.path import relpath
|
|
9
|
+
from typing import Any, Dict, List, Optional, Set, Text, Tuple, Callable
|
|
10
|
+
import operator
|
|
11
|
+
|
|
12
|
+
import rasa.shared.data
|
|
13
|
+
import rasa.shared.utils.io
|
|
14
|
+
from rasa.shared.nlu.constants import (
|
|
15
|
+
RESPONSE,
|
|
16
|
+
INTENT_RESPONSE_KEY,
|
|
17
|
+
ENTITY_ATTRIBUTE_TYPE,
|
|
18
|
+
ENTITY_ATTRIBUTE_GROUP,
|
|
19
|
+
ENTITY_ATTRIBUTE_ROLE,
|
|
20
|
+
NO_ENTITY_TAG,
|
|
21
|
+
INTENT,
|
|
22
|
+
ENTITIES,
|
|
23
|
+
TEXT,
|
|
24
|
+
ACTION_NAME,
|
|
25
|
+
)
|
|
26
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
27
|
+
from rasa.shared.nlu.training_data import util
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
DEFAULT_TRAINING_DATA_OUTPUT_PATH = "training_data.yml"
|
|
31
|
+
|
|
32
|
+
logger = logging.getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class TrainingData:
|
|
36
|
+
"""Holds loaded intent and entity training data."""
|
|
37
|
+
|
|
38
|
+
# Validation will ensure and warn if these lower limits are not met
|
|
39
|
+
MIN_EXAMPLES_PER_INTENT = 2
|
|
40
|
+
MIN_EXAMPLES_PER_ENTITY = 2
|
|
41
|
+
|
|
42
|
+
def __init__(
|
|
43
|
+
self,
|
|
44
|
+
training_examples: Optional[List[Message]] = None,
|
|
45
|
+
entity_synonyms: Optional[Dict[Text, Text]] = None,
|
|
46
|
+
regex_features: Optional[List[Dict[Text, Text]]] = None,
|
|
47
|
+
lookup_tables: Optional[List[Dict[Text, Any]]] = None,
|
|
48
|
+
responses: Optional[Dict[Text, List[Dict[Text, Any]]]] = None,
|
|
49
|
+
) -> None:
|
|
50
|
+
if training_examples:
|
|
51
|
+
self.training_examples = self.sanitize_examples(training_examples)
|
|
52
|
+
else:
|
|
53
|
+
self.training_examples = []
|
|
54
|
+
self.entity_synonyms = entity_synonyms or {}
|
|
55
|
+
self.regex_features = regex_features or []
|
|
56
|
+
self.sort_regex_features()
|
|
57
|
+
self.lookup_tables = lookup_tables or []
|
|
58
|
+
self.responses = responses or {}
|
|
59
|
+
|
|
60
|
+
self._fill_response_phrases()
|
|
61
|
+
|
|
62
|
+
@staticmethod
|
|
63
|
+
def _load_lookup_table(lookup_table: Dict[Text, Any]) -> Dict[Text, Any]:
|
|
64
|
+
"""Loads the actual lookup table from file if there is a file specified.
|
|
65
|
+
|
|
66
|
+
Checks if the specified lookup table contains a filename in
|
|
67
|
+
`elements` and replaces it with actual elements from the file.
|
|
68
|
+
Returns the unchanged lookup table otherwise.
|
|
69
|
+
It works with JSON training data.
|
|
70
|
+
|
|
71
|
+
Params:
|
|
72
|
+
lookup_table: A lookup table.
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
Updated lookup table where filenames are replaced with the contents of
|
|
76
|
+
these files.
|
|
77
|
+
"""
|
|
78
|
+
elements = lookup_table["elements"]
|
|
79
|
+
potential_file = elements if isinstance(elements, str) else elements[0]
|
|
80
|
+
|
|
81
|
+
if Path(potential_file).is_file():
|
|
82
|
+
try:
|
|
83
|
+
lookup_table["elements"] = rasa.shared.utils.io.read_file(
|
|
84
|
+
potential_file
|
|
85
|
+
)
|
|
86
|
+
return lookup_table
|
|
87
|
+
except (FileNotFoundError, UnicodeDecodeError):
|
|
88
|
+
return lookup_table
|
|
89
|
+
|
|
90
|
+
return lookup_table
|
|
91
|
+
|
|
92
|
+
def fingerprint(self) -> Text:
|
|
93
|
+
"""Fingerprint the training data.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
hex string as a fingerprint of the training data.
|
|
97
|
+
"""
|
|
98
|
+
relevant_attributes = {
|
|
99
|
+
"training_examples": list(
|
|
100
|
+
sorted(e.fingerprint() for e in self.training_examples)
|
|
101
|
+
),
|
|
102
|
+
"entity_synonyms": self.entity_synonyms,
|
|
103
|
+
"regex_features": self.regex_features,
|
|
104
|
+
"lookup_tables": [
|
|
105
|
+
self._load_lookup_table(table) for table in self.lookup_tables
|
|
106
|
+
],
|
|
107
|
+
"responses": self.responses,
|
|
108
|
+
}
|
|
109
|
+
return rasa.shared.utils.io.deep_container_fingerprint(relevant_attributes)
|
|
110
|
+
|
|
111
|
+
def label_fingerprint(self) -> Text:
|
|
112
|
+
"""Fingerprints the labels in the training data.
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
hex string as a fingerprint of the training data labels.
|
|
116
|
+
"""
|
|
117
|
+
labels = {
|
|
118
|
+
"intents": sorted(self.intents),
|
|
119
|
+
"entities": sorted(self.entities),
|
|
120
|
+
"entity_groups": sorted(self.entity_groups),
|
|
121
|
+
"entity_roles": sorted(self.entity_roles),
|
|
122
|
+
"actions": sorted(self.action_names),
|
|
123
|
+
}
|
|
124
|
+
return rasa.shared.utils.io.deep_container_fingerprint(labels)
|
|
125
|
+
|
|
126
|
+
def merge(self, *others: Optional["TrainingData"]) -> "TrainingData":
|
|
127
|
+
"""Return merged instance of this data with other training data.
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
others: other training data instances to merge this one with
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
Merged training data object. Merging is not done in place, this
|
|
134
|
+
will be a new instance.
|
|
135
|
+
"""
|
|
136
|
+
training_examples = copy.deepcopy(self.training_examples)
|
|
137
|
+
entity_synonyms = self.entity_synonyms.copy()
|
|
138
|
+
regex_features = copy.deepcopy(self.regex_features)
|
|
139
|
+
lookup_tables = copy.deepcopy(self.lookup_tables)
|
|
140
|
+
responses = copy.deepcopy(self.responses)
|
|
141
|
+
|
|
142
|
+
for o in others:
|
|
143
|
+
if not o:
|
|
144
|
+
continue
|
|
145
|
+
|
|
146
|
+
training_examples.extend(copy.deepcopy(o.training_examples))
|
|
147
|
+
regex_features.extend(copy.deepcopy(o.regex_features))
|
|
148
|
+
lookup_tables.extend(copy.deepcopy(o.lookup_tables))
|
|
149
|
+
|
|
150
|
+
for text, syn in o.entity_synonyms.items():
|
|
151
|
+
util.check_duplicate_synonym(
|
|
152
|
+
entity_synonyms, text, syn, "merging training data"
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
entity_synonyms.update(o.entity_synonyms)
|
|
156
|
+
responses.update(o.responses)
|
|
157
|
+
|
|
158
|
+
return TrainingData(
|
|
159
|
+
training_examples, entity_synonyms, regex_features, lookup_tables, responses
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
def filter_training_examples(
|
|
163
|
+
self, condition: Callable[[Message], bool]
|
|
164
|
+
) -> "TrainingData":
|
|
165
|
+
"""Filter training examples.
|
|
166
|
+
|
|
167
|
+
Args:
|
|
168
|
+
condition: A function that will be applied to filter training examples.
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
TrainingData: A TrainingData with filtered training examples.
|
|
172
|
+
"""
|
|
173
|
+
return TrainingData(
|
|
174
|
+
list(filter(condition, self.training_examples)),
|
|
175
|
+
self.entity_synonyms,
|
|
176
|
+
self.regex_features,
|
|
177
|
+
self.lookup_tables,
|
|
178
|
+
self.responses,
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
def __hash__(self) -> int:
|
|
182
|
+
"""Calculate hash for the training data object.
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
Hash of the training data object.
|
|
186
|
+
"""
|
|
187
|
+
return int(self.fingerprint(), 16)
|
|
188
|
+
|
|
189
|
+
@staticmethod
|
|
190
|
+
def sanitize_examples(examples: List[Message]) -> List[Message]:
|
|
191
|
+
"""Makes sure the training data is clean.
|
|
192
|
+
|
|
193
|
+
Remove trailing whitespaces from intent and response annotations and drop
|
|
194
|
+
duplicate examples.
|
|
195
|
+
"""
|
|
196
|
+
for ex in examples:
|
|
197
|
+
if ex.get(INTENT):
|
|
198
|
+
ex.set(INTENT, ex.get(INTENT).strip())
|
|
199
|
+
|
|
200
|
+
if ex.get(RESPONSE):
|
|
201
|
+
ex.set(RESPONSE, ex.get(RESPONSE).strip())
|
|
202
|
+
|
|
203
|
+
return list(OrderedDict.fromkeys(examples))
|
|
204
|
+
|
|
205
|
+
@cached_property
|
|
206
|
+
def nlu_examples(self) -> List[Message]:
|
|
207
|
+
"""Return examples which have come from NLU training data.
|
|
208
|
+
|
|
209
|
+
E.g. If the example came from a story or domain it is not included.
|
|
210
|
+
|
|
211
|
+
Returns:
|
|
212
|
+
List of NLU training examples.
|
|
213
|
+
"""
|
|
214
|
+
return [
|
|
215
|
+
ex for ex in self.training_examples if not ex.is_core_or_domain_message()
|
|
216
|
+
]
|
|
217
|
+
|
|
218
|
+
@cached_property
|
|
219
|
+
def intent_examples(self) -> List[Message]:
|
|
220
|
+
"""Returns the list of examples that have intent."""
|
|
221
|
+
return [ex for ex in self.nlu_examples if ex.get(INTENT)]
|
|
222
|
+
|
|
223
|
+
@cached_property
|
|
224
|
+
def response_examples(self) -> List[Message]:
|
|
225
|
+
"""Returns the list of examples that have response."""
|
|
226
|
+
return [ex for ex in self.nlu_examples if ex.get(INTENT_RESPONSE_KEY)]
|
|
227
|
+
|
|
228
|
+
@cached_property
|
|
229
|
+
def entity_examples(self) -> List[Message]:
|
|
230
|
+
"""Returns the list of examples that have entities."""
|
|
231
|
+
return [ex for ex in self.nlu_examples if ex.get(ENTITIES)]
|
|
232
|
+
|
|
233
|
+
@cached_property
|
|
234
|
+
def intents(self) -> Set[Text]:
|
|
235
|
+
"""Returns the set of intents in the training data."""
|
|
236
|
+
return {ex.get(INTENT) for ex in self.training_examples} - {None}
|
|
237
|
+
|
|
238
|
+
@cached_property
|
|
239
|
+
def action_names(self) -> Set[Text]:
|
|
240
|
+
"""Returns the set of action names in the training data."""
|
|
241
|
+
return {ex.get(ACTION_NAME) for ex in self.training_examples} - {None}
|
|
242
|
+
|
|
243
|
+
@cached_property
|
|
244
|
+
def retrieval_intents(self) -> Set[Text]:
|
|
245
|
+
"""Returns the total number of response types in the training data."""
|
|
246
|
+
return {
|
|
247
|
+
ex.get(INTENT)
|
|
248
|
+
for ex in self.training_examples
|
|
249
|
+
if ex.get(INTENT_RESPONSE_KEY)
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
@cached_property
|
|
253
|
+
def number_of_examples_per_intent(self) -> Dict[Text, int]:
|
|
254
|
+
"""Calculates the number of examples per intent."""
|
|
255
|
+
intents = [ex.get(INTENT) for ex in self.nlu_examples]
|
|
256
|
+
return dict(Counter(intents))
|
|
257
|
+
|
|
258
|
+
@cached_property
|
|
259
|
+
def number_of_examples_per_response(self) -> Dict[Text, int]:
|
|
260
|
+
"""Calculates the number of examples per response."""
|
|
261
|
+
responses = [
|
|
262
|
+
ex.get(INTENT_RESPONSE_KEY)
|
|
263
|
+
for ex in self.training_examples
|
|
264
|
+
if ex.get(INTENT_RESPONSE_KEY)
|
|
265
|
+
]
|
|
266
|
+
return dict(Counter(responses))
|
|
267
|
+
|
|
268
|
+
@cached_property
|
|
269
|
+
def entities(self) -> Set[Text]:
|
|
270
|
+
"""Returns the set of entity types in the training data."""
|
|
271
|
+
return {e.get(ENTITY_ATTRIBUTE_TYPE) for e in self.sorted_entities()}
|
|
272
|
+
|
|
273
|
+
@cached_property
|
|
274
|
+
def entity_roles(self) -> Set[Text]:
|
|
275
|
+
"""Returns the set of entity roles in the training data."""
|
|
276
|
+
entity_types = {
|
|
277
|
+
e.get(ENTITY_ATTRIBUTE_ROLE)
|
|
278
|
+
for e in self.sorted_entities()
|
|
279
|
+
if ENTITY_ATTRIBUTE_ROLE in e
|
|
280
|
+
}
|
|
281
|
+
return entity_types - {NO_ENTITY_TAG}
|
|
282
|
+
|
|
283
|
+
@cached_property
|
|
284
|
+
def entity_groups(self) -> Set[Text]:
|
|
285
|
+
"""Returns the set of entity groups in the training data."""
|
|
286
|
+
entity_types = {
|
|
287
|
+
e.get(ENTITY_ATTRIBUTE_GROUP)
|
|
288
|
+
for e in self.sorted_entities()
|
|
289
|
+
if ENTITY_ATTRIBUTE_GROUP in e
|
|
290
|
+
}
|
|
291
|
+
return entity_types - {NO_ENTITY_TAG}
|
|
292
|
+
|
|
293
|
+
def entity_roles_groups_used(self) -> bool:
|
|
294
|
+
"""Checks if any entity roles or groups are used in the training data."""
|
|
295
|
+
entity_groups_used = (
|
|
296
|
+
self.entity_groups is not None and len(self.entity_groups) > 0
|
|
297
|
+
)
|
|
298
|
+
entity_roles_used = self.entity_roles is not None and len(self.entity_roles) > 0
|
|
299
|
+
|
|
300
|
+
return entity_groups_used or entity_roles_used
|
|
301
|
+
|
|
302
|
+
@cached_property
|
|
303
|
+
def number_of_examples_per_entity(self) -> Dict[Text, int]:
|
|
304
|
+
"""Calculates the number of examples per entity."""
|
|
305
|
+
entities = []
|
|
306
|
+
|
|
307
|
+
def _append_entity(entity: Dict[Text, Any], attribute: Text) -> None:
|
|
308
|
+
if attribute in entity:
|
|
309
|
+
_value = entity.get(attribute)
|
|
310
|
+
if _value is not None and _value != NO_ENTITY_TAG:
|
|
311
|
+
entities.append(f"{attribute} '{_value}'")
|
|
312
|
+
|
|
313
|
+
for entity in self.sorted_entities():
|
|
314
|
+
_append_entity(entity, ENTITY_ATTRIBUTE_TYPE)
|
|
315
|
+
_append_entity(entity, ENTITY_ATTRIBUTE_ROLE)
|
|
316
|
+
_append_entity(entity, ENTITY_ATTRIBUTE_GROUP)
|
|
317
|
+
|
|
318
|
+
return dict(Counter(entities))
|
|
319
|
+
|
|
320
|
+
def sort_regex_features(self) -> None:
|
|
321
|
+
"""Sorts regex features lexicographically by name+pattern."""
|
|
322
|
+
self.regex_features = sorted(
|
|
323
|
+
self.regex_features, key=lambda e: "{}+{}".format(e["name"], e["pattern"])
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
def _fill_response_phrases(self) -> None:
|
|
327
|
+
"""Set response phrase for all examples by looking up NLG stories."""
|
|
328
|
+
for example in self.training_examples:
|
|
329
|
+
# if intent_response_key is None, that means the corresponding intent is
|
|
330
|
+
# not a retrieval intent and hence no response text needs to be fetched.
|
|
331
|
+
# If intent_response_key is set, fetch the corresponding response text
|
|
332
|
+
if example.get(INTENT_RESPONSE_KEY) is None:
|
|
333
|
+
continue
|
|
334
|
+
|
|
335
|
+
# look for corresponding bot utterance
|
|
336
|
+
story_lookup_key = util.intent_response_key_to_template_key(
|
|
337
|
+
example.get_full_intent()
|
|
338
|
+
)
|
|
339
|
+
assistant_utterances = self.responses.get(story_lookup_key, [])
|
|
340
|
+
if assistant_utterances:
|
|
341
|
+
# Use the first response text as training label if needed downstream
|
|
342
|
+
for assistant_utterance in assistant_utterances:
|
|
343
|
+
if assistant_utterance.get(TEXT):
|
|
344
|
+
example.set(RESPONSE, assistant_utterance[TEXT])
|
|
345
|
+
|
|
346
|
+
# If no text attribute was found use the key for training
|
|
347
|
+
if not example.get(RESPONSE):
|
|
348
|
+
example.set(RESPONSE, story_lookup_key)
|
|
349
|
+
|
|
350
|
+
def nlu_as_json(self, **kwargs: Any) -> Text:
|
|
351
|
+
"""Represent this set of training examples as json."""
|
|
352
|
+
from rasa.shared.nlu.training_data.formats import RasaWriter
|
|
353
|
+
|
|
354
|
+
return RasaWriter().dumps(self, **kwargs)
|
|
355
|
+
|
|
356
|
+
def nlg_as_yaml(self) -> Text:
|
|
357
|
+
"""Generates yaml representation of the response phrases (NLG) of TrainingData.
|
|
358
|
+
|
|
359
|
+
Returns:
|
|
360
|
+
responses in yaml format as a string
|
|
361
|
+
"""
|
|
362
|
+
from rasa.shared.nlu.training_data.formats.rasa_yaml import RasaYAMLWriter
|
|
363
|
+
|
|
364
|
+
# only dump responses. at some point it might make sense to remove the
|
|
365
|
+
# differentiation between dumping NLU and dumping responses. but we
|
|
366
|
+
# can't do that until after we remove markdown support.
|
|
367
|
+
return RasaYAMLWriter().dumps(TrainingData(responses=self.responses))
|
|
368
|
+
|
|
369
|
+
def nlu_as_yaml(self) -> Text:
|
|
370
|
+
"""Generates YAML representation of NLU of TrainingData.
|
|
371
|
+
|
|
372
|
+
Returns:
|
|
373
|
+
data in YAML format as a string
|
|
374
|
+
"""
|
|
375
|
+
from rasa.shared.nlu.training_data.formats.rasa_yaml import RasaYAMLWriter
|
|
376
|
+
|
|
377
|
+
# avoid dumping NLG data (responses). this is a workaround until we
|
|
378
|
+
# can remove the distinction between nlu & nlg when converting to a string
|
|
379
|
+
# (so until after we remove markdown support)
|
|
380
|
+
no_responses_training_data = copy.copy(self)
|
|
381
|
+
no_responses_training_data.responses = {}
|
|
382
|
+
|
|
383
|
+
return RasaYAMLWriter().dumps(no_responses_training_data)
|
|
384
|
+
|
|
385
|
+
def persist_nlu(self, filename: Text = DEFAULT_TRAINING_DATA_OUTPUT_PATH) -> None:
|
|
386
|
+
"""Saves NLU to a file."""
|
|
387
|
+
if rasa.shared.data.is_likely_json_file(filename):
|
|
388
|
+
rasa.shared.utils.io.write_text_file(self.nlu_as_json(indent=2), filename)
|
|
389
|
+
elif rasa.shared.data.is_likely_yaml_file(filename):
|
|
390
|
+
rasa.shared.utils.io.write_text_file(self.nlu_as_yaml(), filename)
|
|
391
|
+
else:
|
|
392
|
+
raise ValueError(
|
|
393
|
+
"Unsupported file format detected. "
|
|
394
|
+
"Supported file formats are 'json', 'yml' "
|
|
395
|
+
"and 'md'."
|
|
396
|
+
)
|
|
397
|
+
|
|
398
|
+
def persist_nlg(self, filename: Text) -> None:
|
|
399
|
+
"""Saves NLG to a file."""
|
|
400
|
+
if rasa.shared.data.is_likely_yaml_file(filename):
|
|
401
|
+
rasa.shared.utils.io.write_text_file(self.nlg_as_yaml(), filename)
|
|
402
|
+
else:
|
|
403
|
+
raise ValueError(
|
|
404
|
+
"Unsupported file format detected. 'yml' is the only "
|
|
405
|
+
"supported file format."
|
|
406
|
+
)
|
|
407
|
+
|
|
408
|
+
@staticmethod
|
|
409
|
+
def get_nlg_persist_filename(nlu_filename: Text) -> Text:
|
|
410
|
+
"""Returns the full filename to persist NLG data."""
|
|
411
|
+
extension = Path(nlu_filename).suffix
|
|
412
|
+
if rasa.shared.data.is_likely_json_file(nlu_filename):
|
|
413
|
+
# backwards compatibility: previously NLG was always dumped as md. now
|
|
414
|
+
# we are going to dump in the same format as the NLU data. unfortunately
|
|
415
|
+
# there is a special case: NLU is in json format, in this case we use
|
|
416
|
+
# YAML as we do not have a NLG json format
|
|
417
|
+
extension = rasa.shared.data.yaml_file_extension()
|
|
418
|
+
# Add nlg_ as prefix and change extension to the correct one
|
|
419
|
+
filename = (
|
|
420
|
+
Path(nlu_filename)
|
|
421
|
+
.with_name("nlg_" + Path(nlu_filename).name)
|
|
422
|
+
.with_suffix(extension)
|
|
423
|
+
)
|
|
424
|
+
return str(filename)
|
|
425
|
+
|
|
426
|
+
def persist(
|
|
427
|
+
self, dir_name: Text, filename: Text = DEFAULT_TRAINING_DATA_OUTPUT_PATH
|
|
428
|
+
) -> Dict[Text, Any]:
|
|
429
|
+
"""Persists this training data to disk.
|
|
430
|
+
|
|
431
|
+
Returns: necessary information to load it again.
|
|
432
|
+
"""
|
|
433
|
+
if not os.path.exists(dir_name):
|
|
434
|
+
os.makedirs(dir_name)
|
|
435
|
+
|
|
436
|
+
nlu_data_file = os.path.join(dir_name, filename)
|
|
437
|
+
self.persist_nlu(nlu_data_file)
|
|
438
|
+
self.persist_nlg(self.get_nlg_persist_filename(nlu_data_file))
|
|
439
|
+
|
|
440
|
+
return {"training_data": relpath(nlu_data_file, dir_name)}
|
|
441
|
+
|
|
442
|
+
def sorted_entities(self) -> List[Any]:
|
|
443
|
+
"""Extract all entities from examples and sorts them by entity type."""
|
|
444
|
+
entity_examples = [
|
|
445
|
+
entity for ex in self.entity_examples for entity in ex.get("entities")
|
|
446
|
+
]
|
|
447
|
+
return sorted(entity_examples, key=lambda e: e["entity"])
|
|
448
|
+
|
|
449
|
+
def validate(self) -> None:
|
|
450
|
+
"""Ensures that the loaded training data is valid.
|
|
451
|
+
|
|
452
|
+
Checks that the data has a minimum of certain training examples.
|
|
453
|
+
"""
|
|
454
|
+
logger.debug("Validating training data...")
|
|
455
|
+
if "" in self.intents:
|
|
456
|
+
rasa.shared.utils.io.raise_warning(
|
|
457
|
+
"Found empty intent, please check your "
|
|
458
|
+
"training data. This may result in wrong "
|
|
459
|
+
"intent predictions."
|
|
460
|
+
)
|
|
461
|
+
|
|
462
|
+
if "" in self.responses:
|
|
463
|
+
rasa.shared.utils.io.raise_warning(
|
|
464
|
+
"Found empty response, please check your "
|
|
465
|
+
"training data. This may result in wrong "
|
|
466
|
+
"response predictions."
|
|
467
|
+
)
|
|
468
|
+
|
|
469
|
+
# emit warnings for intents with only a few training samples
|
|
470
|
+
for intent, count in self.number_of_examples_per_intent.items():
|
|
471
|
+
if count < self.MIN_EXAMPLES_PER_INTENT:
|
|
472
|
+
rasa.shared.utils.io.raise_warning(
|
|
473
|
+
f"Intent '{intent}' has only {count} training examples! "
|
|
474
|
+
f"Minimum is {self.MIN_EXAMPLES_PER_INTENT}, training may fail."
|
|
475
|
+
)
|
|
476
|
+
|
|
477
|
+
# emit warnings for entities with only a few training samples
|
|
478
|
+
for entity, count in self.number_of_examples_per_entity.items():
|
|
479
|
+
if count < self.MIN_EXAMPLES_PER_ENTITY:
|
|
480
|
+
rasa.shared.utils.io.raise_warning(
|
|
481
|
+
f"Entity {entity} has only {count} training examples! "
|
|
482
|
+
f"The minimum is {self.MIN_EXAMPLES_PER_ENTITY}, because of "
|
|
483
|
+
f"this the training may fail."
|
|
484
|
+
)
|
|
485
|
+
|
|
486
|
+
# emit warnings for response intents without a response template
|
|
487
|
+
for example in self.training_examples:
|
|
488
|
+
if example.get(INTENT_RESPONSE_KEY) and not example.get(RESPONSE):
|
|
489
|
+
rasa.shared.utils.io.raise_warning(
|
|
490
|
+
f"Your training data contains an example "
|
|
491
|
+
f"'{example.get(TEXT)[:20]}...' "
|
|
492
|
+
f"for the '{example.get_full_intent()}' intent. "
|
|
493
|
+
f"You either need to add a response phrase or correct the "
|
|
494
|
+
f"intent for this example in your training data. "
|
|
495
|
+
f"If you intend to use Response Selector in the pipeline, the "
|
|
496
|
+
f"training may fail."
|
|
497
|
+
)
|
|
498
|
+
|
|
499
|
+
def train_test_split(
|
|
500
|
+
self, train_frac: float = 0.8, random_seed: Optional[int] = None
|
|
501
|
+
) -> Tuple["TrainingData", "TrainingData"]:
|
|
502
|
+
"""Split into a training and test dataset, preserving the fraction of examples per intent.""" # noqa: E501
|
|
503
|
+
# collect all nlu data
|
|
504
|
+
test, train = self.split_nlu_examples(train_frac, random_seed)
|
|
505
|
+
|
|
506
|
+
# collect all nlg stories
|
|
507
|
+
test_responses = self._needed_responses_for_examples(test)
|
|
508
|
+
train_responses = self._needed_responses_for_examples(train)
|
|
509
|
+
|
|
510
|
+
data_train = TrainingData(
|
|
511
|
+
train,
|
|
512
|
+
entity_synonyms=self.entity_synonyms,
|
|
513
|
+
regex_features=self.regex_features,
|
|
514
|
+
lookup_tables=self.lookup_tables,
|
|
515
|
+
responses=train_responses,
|
|
516
|
+
)
|
|
517
|
+
|
|
518
|
+
data_test = TrainingData(
|
|
519
|
+
test,
|
|
520
|
+
entity_synonyms=self.entity_synonyms,
|
|
521
|
+
regex_features=self.regex_features,
|
|
522
|
+
lookup_tables=self.lookup_tables,
|
|
523
|
+
responses=test_responses,
|
|
524
|
+
)
|
|
525
|
+
|
|
526
|
+
return data_train, data_test
|
|
527
|
+
|
|
528
|
+
def _needed_responses_for_examples(
|
|
529
|
+
self, examples: List[Message]
|
|
530
|
+
) -> Dict[Text, List[Dict[Text, Any]]]:
|
|
531
|
+
"""Get all responses used in any of the examples.
|
|
532
|
+
|
|
533
|
+
Args:
|
|
534
|
+
examples: messages to select responses by.
|
|
535
|
+
|
|
536
|
+
Returns:
|
|
537
|
+
All responses that appear at least once in the list of examples.
|
|
538
|
+
"""
|
|
539
|
+
responses = {}
|
|
540
|
+
for ex in examples:
|
|
541
|
+
if ex.get(INTENT_RESPONSE_KEY) and ex.get(RESPONSE):
|
|
542
|
+
key = util.intent_response_key_to_template_key(ex.get_full_intent())
|
|
543
|
+
responses[key] = self.responses[key]
|
|
544
|
+
return responses
|
|
545
|
+
|
|
546
|
+
def split_nlu_examples(
|
|
547
|
+
self, train_frac: float, random_seed: Optional[int] = None
|
|
548
|
+
) -> Tuple[list, list]:
|
|
549
|
+
"""Split the training data into a train and test set.
|
|
550
|
+
|
|
551
|
+
Args:
|
|
552
|
+
train_frac: percentage of examples to add to the training set.
|
|
553
|
+
random_seed: random seed used to shuffle examples.
|
|
554
|
+
|
|
555
|
+
Returns:
|
|
556
|
+
Test and training examples.
|
|
557
|
+
"""
|
|
558
|
+
self.validate()
|
|
559
|
+
|
|
560
|
+
# Stratified split: both test and train should have (approximately) the
|
|
561
|
+
# same class distribution as the original data. We also require that
|
|
562
|
+
# each class is represented in both splits.
|
|
563
|
+
|
|
564
|
+
# First check that there is enough data to split at the requested
|
|
565
|
+
# rate: we must be able to include one example per class in both
|
|
566
|
+
# test and train, so num_classes is the minimum size of either.
|
|
567
|
+
smaller_split_frac = train_frac if train_frac < 0.5 else (1.0 - train_frac)
|
|
568
|
+
num_classes = (
|
|
569
|
+
len(self.number_of_examples_per_intent.items())
|
|
570
|
+
- len(self.retrieval_intents)
|
|
571
|
+
+ len(self.number_of_examples_per_response)
|
|
572
|
+
)
|
|
573
|
+
num_examples = sum(self.number_of_examples_per_intent.values())
|
|
574
|
+
|
|
575
|
+
if int(smaller_split_frac * num_examples) + 1 < num_classes:
|
|
576
|
+
rasa.shared.utils.io.raise_warning(
|
|
577
|
+
f"There aren't enough intent examples in your data to include "
|
|
578
|
+
f"an example of each class in both test and train splits and "
|
|
579
|
+
f"also reserve {train_frac} of the data for training. "
|
|
580
|
+
f"The output training fraction will differ."
|
|
581
|
+
)
|
|
582
|
+
|
|
583
|
+
# Now simulate traversing the sorted examples, sampling at a rate
|
|
584
|
+
# of train_frac, so that after traversing k examples (for all k), we
|
|
585
|
+
# have sampled int(k * train_frac) of them for training.
|
|
586
|
+
# Corner case that makes this approximate: we require at least one sample
|
|
587
|
+
# in test, and at least one in train, so proportions will be less exact
|
|
588
|
+
# when classes have few examples, e.g. when a class has only 2 examples
|
|
589
|
+
# but the user requests an 80% / 20% split.
|
|
590
|
+
|
|
591
|
+
train, test = [], []
|
|
592
|
+
|
|
593
|
+
# helper to simulate the traversal of all examples in a single class
|
|
594
|
+
def _split_class(
|
|
595
|
+
_examples: List[Message], _running_count: int, _running_train_count: int
|
|
596
|
+
) -> Tuple[int, int]:
|
|
597
|
+
if random_seed is not None:
|
|
598
|
+
random.Random(random_seed).shuffle(_examples)
|
|
599
|
+
else:
|
|
600
|
+
random.shuffle(_examples)
|
|
601
|
+
|
|
602
|
+
# first determine how many samples we should have in training after
|
|
603
|
+
# traversing the examples in this class, if sampling train_frac of
|
|
604
|
+
# them. Then adjust so there's at least one example in test and train.
|
|
605
|
+
# Adjustment can accumulate until we encounter a frequent class.
|
|
606
|
+
exact_train_count = (
|
|
607
|
+
int((_running_count + len(_examples)) * train_frac)
|
|
608
|
+
- _running_train_count
|
|
609
|
+
)
|
|
610
|
+
approx_train_count = min(len(_examples) - 1, max(1, exact_train_count))
|
|
611
|
+
|
|
612
|
+
train.extend(_examples[:approx_train_count])
|
|
613
|
+
test.extend(_examples[approx_train_count:])
|
|
614
|
+
|
|
615
|
+
return (
|
|
616
|
+
_running_count + len(_examples),
|
|
617
|
+
_running_train_count + approx_train_count,
|
|
618
|
+
)
|
|
619
|
+
|
|
620
|
+
training_examples = set(self.training_examples)
|
|
621
|
+
running_count = 0
|
|
622
|
+
running_train_count = 0
|
|
623
|
+
|
|
624
|
+
# Sort by class frequency so we first handle the tail of the distribution,
|
|
625
|
+
# where the percentages in the split are most approximate. Items from
|
|
626
|
+
# more frequent classes can then be over/ undersampled as needed to
|
|
627
|
+
# meet the requested train_frac. First for responses:
|
|
628
|
+
for response, _ in sorted(
|
|
629
|
+
self.number_of_examples_per_response.items(), key=operator.itemgetter(1)
|
|
630
|
+
):
|
|
631
|
+
examples = [
|
|
632
|
+
e
|
|
633
|
+
for e in training_examples
|
|
634
|
+
if e.get(INTENT_RESPONSE_KEY) and e.get(INTENT_RESPONSE_KEY) == response
|
|
635
|
+
]
|
|
636
|
+
running_count, running_train_count = _split_class(
|
|
637
|
+
examples, running_count, running_train_count
|
|
638
|
+
)
|
|
639
|
+
training_examples = training_examples - set(examples)
|
|
640
|
+
|
|
641
|
+
# Again for intents:
|
|
642
|
+
for intent, _ in sorted(
|
|
643
|
+
self.number_of_examples_per_intent.items(), key=operator.itemgetter(1)
|
|
644
|
+
):
|
|
645
|
+
examples = [
|
|
646
|
+
e
|
|
647
|
+
for e in training_examples
|
|
648
|
+
if INTENT in e.data and e.data[INTENT] == intent
|
|
649
|
+
]
|
|
650
|
+
if len(examples) > 0: # will be 0 for retrieval intents
|
|
651
|
+
running_count, running_train_count = _split_class(
|
|
652
|
+
examples, running_count, running_train_count
|
|
653
|
+
)
|
|
654
|
+
training_examples = training_examples - set(examples)
|
|
655
|
+
|
|
656
|
+
return test, train
|
|
657
|
+
|
|
658
|
+
def print_stats(self) -> None:
|
|
659
|
+
number_of_examples_for_each_intent = []
|
|
660
|
+
for intent_name, example_count in self.number_of_examples_per_intent.items():
|
|
661
|
+
number_of_examples_for_each_intent.append(
|
|
662
|
+
f"intent: {intent_name}, training examples: {example_count} "
|
|
663
|
+
)
|
|
664
|
+
newline = "\n"
|
|
665
|
+
|
|
666
|
+
logger.info("Training data stats:")
|
|
667
|
+
logger.info(
|
|
668
|
+
f"Number of intent examples: {len(self.intent_examples)} "
|
|
669
|
+
f"({len(self.intents)} distinct intents)"
|
|
670
|
+
"\n"
|
|
671
|
+
)
|
|
672
|
+
# log the number of training examples per intent
|
|
673
|
+
|
|
674
|
+
logger.debug(f"{newline.join(number_of_examples_for_each_intent)}")
|
|
675
|
+
|
|
676
|
+
if self.intents:
|
|
677
|
+
logger.info(f" Found intents: {list_to_str(self.intents)}")
|
|
678
|
+
logger.info(
|
|
679
|
+
f"Number of response examples: {len(self.response_examples)} "
|
|
680
|
+
f"({len(self.responses)} distinct responses)"
|
|
681
|
+
)
|
|
682
|
+
logger.info(
|
|
683
|
+
f"Number of entity examples: {len(self.entity_examples)} "
|
|
684
|
+
f"({len(self.entities)} distinct entities)"
|
|
685
|
+
)
|
|
686
|
+
if self.entities:
|
|
687
|
+
logger.info(f" Found entity types: {list_to_str(self.entities)}")
|
|
688
|
+
if self.entity_roles:
|
|
689
|
+
logger.info(f" Found entity roles: {list_to_str(self.entity_roles)}")
|
|
690
|
+
if self.entity_groups:
|
|
691
|
+
logger.info(f" Found entity groups: {list_to_str(self.entity_groups)}")
|
|
692
|
+
|
|
693
|
+
def is_empty(self) -> bool:
|
|
694
|
+
"""Checks if any training data was loaded."""
|
|
695
|
+
lists_to_check = [
|
|
696
|
+
self.training_examples,
|
|
697
|
+
self.entity_synonyms,
|
|
698
|
+
self.regex_features,
|
|
699
|
+
self.lookup_tables,
|
|
700
|
+
]
|
|
701
|
+
return not any([len(lst) > 0 for lst in lists_to_check])
|
|
702
|
+
|
|
703
|
+
def contains_no_pure_nlu_data(self) -> bool:
|
|
704
|
+
"""Checks if any NLU training data was loaded."""
|
|
705
|
+
lists_to_check = [
|
|
706
|
+
self.nlu_examples,
|
|
707
|
+
self.entity_synonyms,
|
|
708
|
+
self.regex_features,
|
|
709
|
+
self.lookup_tables,
|
|
710
|
+
]
|
|
711
|
+
return not any([len(lst) > 0 for lst in lists_to_check])
|
|
712
|
+
|
|
713
|
+
def has_e2e_examples(self) -> bool:
|
|
714
|
+
"""Checks if there are any training examples from e2e stories."""
|
|
715
|
+
return any(message.is_e2e_message() for message in self.training_examples)
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
def list_to_str(lst: List[Text], delim: Text = ", ", quote: Text = "'") -> Text:
|
|
719
|
+
"""Converts list to a string.
|
|
720
|
+
|
|
721
|
+
Args:
|
|
722
|
+
lst: The list to convert.
|
|
723
|
+
delim: The delimiter that is used to separate list inputs.
|
|
724
|
+
quote: The quote that is used to wrap list inputs.
|
|
725
|
+
|
|
726
|
+
Returns:
|
|
727
|
+
The string.
|
|
728
|
+
"""
|
|
729
|
+
return delim.join([quote + e + quote for e in lst])
|