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,888 @@
|
|
|
1
|
+
import copy
|
|
2
|
+
import functools
|
|
3
|
+
import json
|
|
4
|
+
from json import JSONDecodeError
|
|
5
|
+
import logging
|
|
6
|
+
import structlog
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
import re
|
|
9
|
+
from re import Match, Pattern
|
|
10
|
+
from typing import Dict, Text, List, Any, Optional, Union, Tuple
|
|
11
|
+
|
|
12
|
+
from rasa.shared.core.domain import Domain
|
|
13
|
+
import rasa.shared.data
|
|
14
|
+
from rasa.shared.core.slots import TextSlot, ListSlot
|
|
15
|
+
from rasa.shared.exceptions import YamlException
|
|
16
|
+
import rasa.shared.utils.io
|
|
17
|
+
from rasa.shared.core.constants import LOOP_NAME
|
|
18
|
+
from rasa.shared.nlu.constants import (
|
|
19
|
+
ENTITIES,
|
|
20
|
+
ENTITY_ATTRIBUTE_END,
|
|
21
|
+
ENTITY_ATTRIBUTE_START,
|
|
22
|
+
ENTITY_ATTRIBUTE_TYPE,
|
|
23
|
+
ENTITY_ATTRIBUTE_VALUE,
|
|
24
|
+
INTENT,
|
|
25
|
+
INTENT_NAME_KEY,
|
|
26
|
+
INTENT_RANKING_KEY,
|
|
27
|
+
PREDICTED_CONFIDENCE_KEY,
|
|
28
|
+
FULL_RETRIEVAL_INTENT_NAME_KEY,
|
|
29
|
+
ACTION_TEXT,
|
|
30
|
+
TEXT,
|
|
31
|
+
EXTRACTOR,
|
|
32
|
+
)
|
|
33
|
+
from rasa.shared.nlu.training_data import entities_parser
|
|
34
|
+
|
|
35
|
+
from rasa.shared.constants import (
|
|
36
|
+
INTENT_MESSAGE_PREFIX,
|
|
37
|
+
DOCS_URL_STORIES,
|
|
38
|
+
TEST_STORIES_FILE_PREFIX,
|
|
39
|
+
DOCS_URL_RULES,
|
|
40
|
+
DOCS_URL_SLOTS,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
from rasa.shared.core.constants import RULE_SNIPPET_ACTION_NAME
|
|
44
|
+
from rasa.shared.core.events import (
|
|
45
|
+
UserUttered,
|
|
46
|
+
SlotSet,
|
|
47
|
+
ActiveLoop,
|
|
48
|
+
DialogueStackUpdated,
|
|
49
|
+
)
|
|
50
|
+
from rasa.shared.core.training_data.story_reader.story_reader import StoryReader
|
|
51
|
+
from rasa.shared.core.training_data.structures import StoryStep
|
|
52
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
53
|
+
from rasa.shared.utils.yaml import (
|
|
54
|
+
validate_raw_yaml_using_schema_file,
|
|
55
|
+
read_yaml,
|
|
56
|
+
validate_training_data_format_version,
|
|
57
|
+
is_key_in_yaml,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
logger = logging.getLogger(__name__)
|
|
61
|
+
structlogger = structlog.get_logger()
|
|
62
|
+
|
|
63
|
+
KEY_STORIES = "stories"
|
|
64
|
+
KEY_STORY_NAME = "story"
|
|
65
|
+
KEY_RULES = "rules"
|
|
66
|
+
KEY_RULE_NAME = "rule"
|
|
67
|
+
KEY_STEPS = "steps"
|
|
68
|
+
KEY_ENTITIES = "entities"
|
|
69
|
+
KEY_USER_INTENT = "intent"
|
|
70
|
+
KEY_USER_MESSAGE = "user"
|
|
71
|
+
KEY_COMMANDS = "commands"
|
|
72
|
+
KEY_SLOT_NAME = "slot_was_set"
|
|
73
|
+
KEY_ACTIVE_LOOP = "active_loop"
|
|
74
|
+
KEY_ACTION = "action"
|
|
75
|
+
KEY_BOT_END_TO_END_MESSAGE = "bot"
|
|
76
|
+
KEY_CHECKPOINT = "checkpoint"
|
|
77
|
+
KEY_CHECKPOINT_SLOTS = "slot_was_set"
|
|
78
|
+
KEY_METADATA = "metadata"
|
|
79
|
+
KEY_OR = "or"
|
|
80
|
+
KEY_RULE_CONDITION = "condition"
|
|
81
|
+
KEY_WAIT_FOR_USER_INPUT_AFTER_RULE = "wait_for_user_input"
|
|
82
|
+
KEY_RULE_FOR_CONVERSATION_START = "conversation_start"
|
|
83
|
+
KEY_STACK_UPDATE = "stack"
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
CORE_SCHEMA_FILE = "shared/utils/schemas/stories.yml"
|
|
87
|
+
DEFAULT_VALUE_TEXT_SLOTS = "filled"
|
|
88
|
+
DEFAULT_VALUE_LIST_SLOTS = [DEFAULT_VALUE_TEXT_SLOTS]
|
|
89
|
+
|
|
90
|
+
INTENT_ENTITIES_PATTERN = (
|
|
91
|
+
f"^{INTENT_MESSAGE_PREFIX}"
|
|
92
|
+
f"(?P<{INTENT_NAME_KEY}>[^{{@]+)" # "{{" is a masked "{" in an f-string
|
|
93
|
+
f"(?P<{PREDICTED_CONFIDENCE_KEY}>@[0-9.]+)?"
|
|
94
|
+
f"(?P<{ENTITIES}>{{.+}})?" # "{{" is a masked "{" in an f-string
|
|
95
|
+
f"(?P<rest>.*)"
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class YAMLStoryReader(StoryReader):
|
|
100
|
+
"""Class that reads Core training data and rule data in YAML format."""
|
|
101
|
+
|
|
102
|
+
@classmethod
|
|
103
|
+
def from_reader(cls, reader: "YAMLStoryReader") -> "YAMLStoryReader":
|
|
104
|
+
"""Create a reader from another reader.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
reader: Another reader.
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
A new reader instance.
|
|
111
|
+
"""
|
|
112
|
+
return cls(reader.domain, reader.source_name)
|
|
113
|
+
|
|
114
|
+
def read_from_file(
|
|
115
|
+
self, filename: Union[Text, Path], skip_validation: bool = False
|
|
116
|
+
) -> List[StoryStep]:
|
|
117
|
+
"""Read stories or rules from file.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
filename: Path to the story/rule file.
|
|
121
|
+
skip_validation: `True` if the file was already validated
|
|
122
|
+
e.g. when it was stored in the database.
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
`StoryStep`s read from `filename`.
|
|
126
|
+
"""
|
|
127
|
+
self.source_name = str(filename)
|
|
128
|
+
try:
|
|
129
|
+
return self.read_from_string(
|
|
130
|
+
rasa.shared.utils.io.read_file(
|
|
131
|
+
filename, rasa.shared.utils.io.DEFAULT_ENCODING
|
|
132
|
+
),
|
|
133
|
+
skip_validation,
|
|
134
|
+
)
|
|
135
|
+
except YamlException as e:
|
|
136
|
+
e.filename = str(filename)
|
|
137
|
+
raise e
|
|
138
|
+
|
|
139
|
+
def read_from_string(
|
|
140
|
+
self, string: Text, skip_validation: bool = False
|
|
141
|
+
) -> List[StoryStep]:
|
|
142
|
+
"""Read stories or rules from a string.
|
|
143
|
+
|
|
144
|
+
Args:
|
|
145
|
+
string: Unprocessed YAML file content.
|
|
146
|
+
skip_validation: `True` if the string was already validated
|
|
147
|
+
e.g. when it was stored in the database.
|
|
148
|
+
|
|
149
|
+
Returns:
|
|
150
|
+
`StoryStep`s read from `string`.
|
|
151
|
+
"""
|
|
152
|
+
if not skip_validation:
|
|
153
|
+
validate_raw_yaml_using_schema_file(string, CORE_SCHEMA_FILE)
|
|
154
|
+
|
|
155
|
+
yaml_content = read_yaml(string)
|
|
156
|
+
|
|
157
|
+
return self.read_from_parsed_yaml(yaml_content)
|
|
158
|
+
|
|
159
|
+
def read_from_parsed_yaml(
|
|
160
|
+
self, parsed_content: Dict[Text, Union[Dict, List]]
|
|
161
|
+
) -> List[StoryStep]:
|
|
162
|
+
"""Read stories from parsed YAML.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
parsed_content: The parsed YAML as a dictionary.
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
The parsed stories or rules.
|
|
169
|
+
"""
|
|
170
|
+
if not validate_training_data_format_version(parsed_content, self.source_name):
|
|
171
|
+
return []
|
|
172
|
+
|
|
173
|
+
for key, parser_class in {
|
|
174
|
+
KEY_STORIES: StoryParser,
|
|
175
|
+
KEY_RULES: RuleParser,
|
|
176
|
+
}.items():
|
|
177
|
+
data = parsed_content.get(key) or []
|
|
178
|
+
parser = parser_class.from_reader(self)
|
|
179
|
+
parser.parse_data(data)
|
|
180
|
+
self.story_steps.extend(parser.get_steps())
|
|
181
|
+
|
|
182
|
+
return self.story_steps
|
|
183
|
+
|
|
184
|
+
@classmethod
|
|
185
|
+
def is_stories_file(cls, file_path: Union[Text, Path]) -> bool:
|
|
186
|
+
"""Check if file contains Core training data or rule data in YAML format.
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
file_path: Path of the file to check.
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
`True` in case the file is a Core YAML training data or rule data file,
|
|
193
|
+
`False` otherwise.
|
|
194
|
+
|
|
195
|
+
Raises:
|
|
196
|
+
YamlException: if the file seems to be a YAML file (extension) but
|
|
197
|
+
can not be read / parsed.
|
|
198
|
+
"""
|
|
199
|
+
return rasa.shared.data.is_likely_yaml_file(file_path) and is_key_in_yaml(
|
|
200
|
+
file_path, KEY_STORIES, KEY_RULES
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
@classmethod
|
|
204
|
+
def _has_test_prefix(cls, file_path: Text) -> bool:
|
|
205
|
+
"""Check if the filename of a file at a path has a certain prefix.
|
|
206
|
+
|
|
207
|
+
Arguments:
|
|
208
|
+
file_path: path to the file
|
|
209
|
+
|
|
210
|
+
Returns:
|
|
211
|
+
`True` if the filename starts with the prefix, `False` otherwise.
|
|
212
|
+
"""
|
|
213
|
+
return Path(file_path).name.startswith(TEST_STORIES_FILE_PREFIX)
|
|
214
|
+
|
|
215
|
+
@classmethod
|
|
216
|
+
def is_test_stories_file(cls, file_path: Union[Text, Path]) -> bool:
|
|
217
|
+
"""Checks if a file is a test conversations file.
|
|
218
|
+
|
|
219
|
+
Args:
|
|
220
|
+
file_path: Path of the file which should be checked.
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
`True` if it's a conversation test file, otherwise `False`.
|
|
224
|
+
"""
|
|
225
|
+
return cls._has_test_prefix(file_path) and cls.is_stories_file(file_path)
|
|
226
|
+
|
|
227
|
+
def get_steps(self) -> List[StoryStep]:
|
|
228
|
+
self._add_current_stories_to_result()
|
|
229
|
+
return self.story_steps
|
|
230
|
+
|
|
231
|
+
def parse_data(self, data: List[Dict[Text, Any]]) -> None:
|
|
232
|
+
item_title = self._get_item_title()
|
|
233
|
+
|
|
234
|
+
for item in data:
|
|
235
|
+
if not isinstance(item, dict):
|
|
236
|
+
rasa.shared.utils.io.raise_warning(
|
|
237
|
+
f"Unexpected block found in '{self.source_name}':\n"
|
|
238
|
+
f"{item}\nItems under the "
|
|
239
|
+
f"'{self._get_plural_item_title()}' key must be YAML "
|
|
240
|
+
f"dictionaries. It will be skipped.",
|
|
241
|
+
docs=self._get_docs_link(),
|
|
242
|
+
)
|
|
243
|
+
continue
|
|
244
|
+
|
|
245
|
+
if item_title in item.keys():
|
|
246
|
+
self._parse_plain_item(item)
|
|
247
|
+
|
|
248
|
+
def _parse_plain_item(self, item: Dict[Text, Any]) -> None:
|
|
249
|
+
item_name = item.get(self._get_item_title(), "")
|
|
250
|
+
|
|
251
|
+
if not item_name:
|
|
252
|
+
rasa.shared.utils.io.raise_warning(
|
|
253
|
+
f"Issue found in '{self.source_name}': \n"
|
|
254
|
+
f"{item}\n"
|
|
255
|
+
f"The {self._get_item_title()} has an empty name. "
|
|
256
|
+
f"{self._get_plural_item_title().capitalize()} should "
|
|
257
|
+
f"have a name defined under '{self._get_item_title()}' "
|
|
258
|
+
f"key. It will be skipped.",
|
|
259
|
+
docs=self._get_docs_link(),
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
steps: List[Union[Text, Dict[Text, Any]]] = item.get(KEY_STEPS, [])
|
|
263
|
+
|
|
264
|
+
if not steps:
|
|
265
|
+
rasa.shared.utils.io.raise_warning(
|
|
266
|
+
f"Issue found in '{self.source_name}': "
|
|
267
|
+
f"The {self._get_item_title()} has no steps. "
|
|
268
|
+
f"It will be skipped.",
|
|
269
|
+
docs=self._get_docs_link(),
|
|
270
|
+
)
|
|
271
|
+
return
|
|
272
|
+
|
|
273
|
+
self._new_part(item_name, item)
|
|
274
|
+
|
|
275
|
+
for step in steps:
|
|
276
|
+
self._parse_step(step)
|
|
277
|
+
|
|
278
|
+
self._close_part(item)
|
|
279
|
+
|
|
280
|
+
def _new_part(self, item_name: Text, item: Dict[Text, Any]) -> None:
|
|
281
|
+
raise NotImplementedError()
|
|
282
|
+
|
|
283
|
+
def _close_part(self, item: Dict[Text, Any]) -> None:
|
|
284
|
+
pass
|
|
285
|
+
|
|
286
|
+
def _parse_step(self, step: Union[Text, Dict[Text, Any]]) -> None:
|
|
287
|
+
if isinstance(step, str):
|
|
288
|
+
rasa.shared.utils.io.raise_warning(
|
|
289
|
+
f"Issue found in '{self.source_name}':\n"
|
|
290
|
+
f"Found an unexpected step in the {self._get_item_title()} "
|
|
291
|
+
f"description:\n{step}\nThe step is of type `str` "
|
|
292
|
+
f"which is only allowed for the rule snippet action "
|
|
293
|
+
f"'{RULE_SNIPPET_ACTION_NAME}'. It will be skipped.",
|
|
294
|
+
docs=self._get_docs_link(),
|
|
295
|
+
)
|
|
296
|
+
elif KEY_USER_INTENT in step.keys() or KEY_USER_MESSAGE in step.keys():
|
|
297
|
+
self._parse_user_utterance(step)
|
|
298
|
+
elif KEY_OR in step.keys():
|
|
299
|
+
self._parse_or_statement(step)
|
|
300
|
+
elif KEY_ACTION in step.keys():
|
|
301
|
+
self._parse_action(step)
|
|
302
|
+
elif KEY_BOT_END_TO_END_MESSAGE in step.keys():
|
|
303
|
+
self._parse_bot_message(step)
|
|
304
|
+
elif KEY_CHECKPOINT in step.keys():
|
|
305
|
+
self._parse_checkpoint(step)
|
|
306
|
+
# This has to be after the checkpoint test as there can be a slot key within
|
|
307
|
+
# a checkpoint.
|
|
308
|
+
elif KEY_SLOT_NAME in step.keys():
|
|
309
|
+
self._parse_slot(step)
|
|
310
|
+
elif KEY_ACTIVE_LOOP in step.keys():
|
|
311
|
+
self._parse_active_loop(step[KEY_ACTIVE_LOOP])
|
|
312
|
+
elif KEY_STACK_UPDATE in step.keys():
|
|
313
|
+
self._parse_stack(step)
|
|
314
|
+
elif KEY_METADATA in step.keys():
|
|
315
|
+
pass
|
|
316
|
+
else:
|
|
317
|
+
rasa.shared.utils.io.raise_warning(
|
|
318
|
+
f"Issue found in '{self.source_name}':\n"
|
|
319
|
+
f"Found an unexpected step in the {self._get_item_title()} "
|
|
320
|
+
f"description:\n{step}\nIt will be skipped.",
|
|
321
|
+
docs=self._get_docs_link(),
|
|
322
|
+
)
|
|
323
|
+
|
|
324
|
+
def _get_item_title(self) -> Text:
|
|
325
|
+
raise NotImplementedError()
|
|
326
|
+
|
|
327
|
+
def _get_plural_item_title(self) -> Text:
|
|
328
|
+
raise NotImplementedError()
|
|
329
|
+
|
|
330
|
+
def _get_docs_link(self) -> Text:
|
|
331
|
+
raise NotImplementedError()
|
|
332
|
+
|
|
333
|
+
def _parse_user_utterance(self, step: Dict[Text, Any]) -> None:
|
|
334
|
+
utterance = self._parse_raw_user_utterance(step)
|
|
335
|
+
|
|
336
|
+
if not utterance:
|
|
337
|
+
return
|
|
338
|
+
|
|
339
|
+
is_end_to_end_utterance = KEY_USER_INTENT not in step
|
|
340
|
+
if is_end_to_end_utterance:
|
|
341
|
+
utterance.intent = {INTENT_NAME_KEY: None}
|
|
342
|
+
else:
|
|
343
|
+
self._validate_that_utterance_is_in_domain(utterance)
|
|
344
|
+
|
|
345
|
+
if self.current_step_builder is not None:
|
|
346
|
+
self.current_step_builder.add_user_messages([utterance])
|
|
347
|
+
|
|
348
|
+
def _validate_that_utterance_is_in_domain(self, utterance: UserUttered) -> None:
|
|
349
|
+
intent_name = utterance.intent.get(INTENT_NAME_KEY)
|
|
350
|
+
|
|
351
|
+
# check if this is a retrieval intent
|
|
352
|
+
# in this case check only for the base intent in domain
|
|
353
|
+
intent_name = Message.separate_intent_response_key(intent_name)[0]
|
|
354
|
+
|
|
355
|
+
if not self.domain:
|
|
356
|
+
logger.debug(
|
|
357
|
+
"Skipped validating if intent is in domain as domain " "is `None`."
|
|
358
|
+
)
|
|
359
|
+
return
|
|
360
|
+
|
|
361
|
+
if intent_name not in self.domain.intents:
|
|
362
|
+
rasa.shared.utils.io.raise_warning(
|
|
363
|
+
f"Issue found in '{self.source_name}': \n"
|
|
364
|
+
f"Found intent '{intent_name}' in stories which is not part of the "
|
|
365
|
+
f"domain.",
|
|
366
|
+
docs=DOCS_URL_STORIES,
|
|
367
|
+
)
|
|
368
|
+
|
|
369
|
+
def _parse_or_statement(self, step: Dict[Text, Any]) -> None:
|
|
370
|
+
events: List = []
|
|
371
|
+
|
|
372
|
+
for item in step.get(KEY_OR, []):
|
|
373
|
+
if KEY_USER_INTENT in item.keys():
|
|
374
|
+
utterance = self._parse_raw_user_utterance(item)
|
|
375
|
+
if utterance:
|
|
376
|
+
events.append(utterance)
|
|
377
|
+
elif KEY_CHECKPOINT_SLOTS in item.keys():
|
|
378
|
+
for slot in item.get(KEY_CHECKPOINT_SLOTS, []):
|
|
379
|
+
if isinstance(slot, dict):
|
|
380
|
+
for key, value in slot.items():
|
|
381
|
+
parsed_events = self._parse_events(
|
|
382
|
+
SlotSet.type_name, {key: value}
|
|
383
|
+
)
|
|
384
|
+
events.extend(parsed_events)
|
|
385
|
+
elif isinstance(slot, str):
|
|
386
|
+
parsed_events = self._parse_events(
|
|
387
|
+
SlotSet.type_name, {slot: self._slot_default_value(slot)}
|
|
388
|
+
)
|
|
389
|
+
events.extend(parsed_events)
|
|
390
|
+
else:
|
|
391
|
+
rasa.shared.utils.io.raise_warning(
|
|
392
|
+
f"Issue found in '{self.source_name}':\n"
|
|
393
|
+
f"Invalid slot: \n{slot}\n"
|
|
394
|
+
f"Items under the '{KEY_CHECKPOINT_SLOTS}' key must be "
|
|
395
|
+
f"YAML dictionaries or Strings. "
|
|
396
|
+
f"The checkpoint will be skipped.",
|
|
397
|
+
docs=self._get_docs_link(),
|
|
398
|
+
)
|
|
399
|
+
return
|
|
400
|
+
else:
|
|
401
|
+
rasa.shared.utils.io.raise_warning(
|
|
402
|
+
f"Issue found in '{self.source_name}': \n"
|
|
403
|
+
f"`OR` statement can have '{KEY_USER_INTENT}' or '{KEY_SLOT_NAME}'"
|
|
404
|
+
f"as a sub-element. This step will be skipped:\n"
|
|
405
|
+
f"'{item}'\n",
|
|
406
|
+
docs=self._get_docs_link(),
|
|
407
|
+
)
|
|
408
|
+
return
|
|
409
|
+
|
|
410
|
+
if events and self.current_step_builder is not None:
|
|
411
|
+
self.current_step_builder.add_events(events)
|
|
412
|
+
|
|
413
|
+
def _user_intent_from_step(
|
|
414
|
+
self, step: Dict[Text, Any]
|
|
415
|
+
) -> Tuple[Text, Optional[Text]]:
|
|
416
|
+
try:
|
|
417
|
+
user_intent = step.get(KEY_USER_INTENT, "").strip()
|
|
418
|
+
except AttributeError:
|
|
419
|
+
rasa.shared.utils.io.raise_warning(
|
|
420
|
+
f"Issue found in '{self.source_name}':\n"
|
|
421
|
+
f"Missing intent value in {self._get_item_title()} step: {step} .",
|
|
422
|
+
docs=self._get_docs_link(),
|
|
423
|
+
)
|
|
424
|
+
user_intent = ""
|
|
425
|
+
|
|
426
|
+
if not user_intent and KEY_USER_MESSAGE not in step:
|
|
427
|
+
rasa.shared.utils.io.raise_warning(
|
|
428
|
+
f"Issue found in '{self.source_name}':\n"
|
|
429
|
+
f"User utterance cannot be empty. "
|
|
430
|
+
f"This {self._get_item_title()} step will be skipped:\n"
|
|
431
|
+
f"{step}",
|
|
432
|
+
docs=self._get_docs_link(),
|
|
433
|
+
)
|
|
434
|
+
|
|
435
|
+
if user_intent.startswith(INTENT_MESSAGE_PREFIX):
|
|
436
|
+
rasa.shared.utils.io.raise_warning(
|
|
437
|
+
f"Issue found in '{self.source_name}':\n"
|
|
438
|
+
f"User intent '{user_intent}' starts with "
|
|
439
|
+
f"'{INTENT_MESSAGE_PREFIX}'. This is not required.",
|
|
440
|
+
docs=self._get_docs_link(),
|
|
441
|
+
)
|
|
442
|
+
# Remove leading slash
|
|
443
|
+
user_intent = user_intent[1:]
|
|
444
|
+
|
|
445
|
+
# StoryStep should never contain a full retrieval intent, only the base intent.
|
|
446
|
+
# However, users can specify full retrieval intents in their test stories file
|
|
447
|
+
# for the NLU testing purposes.
|
|
448
|
+
base_intent, response_key = Message.separate_intent_response_key(user_intent)
|
|
449
|
+
if response_key and not self.is_test_stories_file(self.source_name):
|
|
450
|
+
rasa.shared.utils.io.raise_warning(
|
|
451
|
+
f"Issue found in '{self.source_name}' while parsing story "
|
|
452
|
+
f"{self._get_item_title()}:\n"
|
|
453
|
+
f"User intent '{user_intent}' is a full retrieval intent. "
|
|
454
|
+
f"Stories shouldn't contain full retrieval intents. "
|
|
455
|
+
f"Rasa Pro will only use base intent '{base_intent}' "
|
|
456
|
+
f"for training.",
|
|
457
|
+
docs=self._get_docs_link(),
|
|
458
|
+
)
|
|
459
|
+
|
|
460
|
+
return (base_intent, user_intent) if response_key else (base_intent, None)
|
|
461
|
+
|
|
462
|
+
def _parse_raw_user_utterance(self, step: Dict[Text, Any]) -> Optional[UserUttered]:
|
|
463
|
+
intent_name, full_retrieval_intent = self._user_intent_from_step(step)
|
|
464
|
+
intent = {
|
|
465
|
+
INTENT_NAME_KEY: intent_name,
|
|
466
|
+
FULL_RETRIEVAL_INTENT_NAME_KEY: full_retrieval_intent,
|
|
467
|
+
PREDICTED_CONFIDENCE_KEY: 1.0,
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
if KEY_USER_MESSAGE in step:
|
|
471
|
+
user_message = step[KEY_USER_MESSAGE].strip()
|
|
472
|
+
entities = entities_parser.find_entities_in_training_example(user_message)
|
|
473
|
+
plain_text = entities_parser.replace_entities(user_message)
|
|
474
|
+
|
|
475
|
+
if plain_text.startswith(INTENT_MESSAGE_PREFIX):
|
|
476
|
+
entities = self.unpack_regex_message(Message({TEXT: plain_text})).get(
|
|
477
|
+
ENTITIES, []
|
|
478
|
+
)
|
|
479
|
+
else:
|
|
480
|
+
raw_entities = step.get(KEY_ENTITIES, [])
|
|
481
|
+
entities = self._parse_raw_entities(raw_entities)
|
|
482
|
+
# set plain_text to None because only intent was provided in the stories
|
|
483
|
+
plain_text = None
|
|
484
|
+
return UserUttered(
|
|
485
|
+
plain_text,
|
|
486
|
+
intent,
|
|
487
|
+
entities,
|
|
488
|
+
parse_data={KEY_COMMANDS: step.get(KEY_COMMANDS, [])}, # type: ignore[misc]
|
|
489
|
+
)
|
|
490
|
+
|
|
491
|
+
@staticmethod
|
|
492
|
+
def _parse_raw_entities(
|
|
493
|
+
raw_entities: Union[List[Dict[Text, Text]], List[Text]],
|
|
494
|
+
) -> List[Dict[Text, Optional[Text]]]:
|
|
495
|
+
final_entities = []
|
|
496
|
+
for entity in raw_entities:
|
|
497
|
+
if isinstance(entity, dict):
|
|
498
|
+
_entity_type = None
|
|
499
|
+
_entity_value = None
|
|
500
|
+
_entity_role = None
|
|
501
|
+
_entity_group = None
|
|
502
|
+
for key, value in entity.items():
|
|
503
|
+
if key == "role":
|
|
504
|
+
_entity_role = value
|
|
505
|
+
elif key == "group":
|
|
506
|
+
_entity_group = value
|
|
507
|
+
else:
|
|
508
|
+
_entity_type = key
|
|
509
|
+
_entity_value = value
|
|
510
|
+
|
|
511
|
+
_entity_dict = {
|
|
512
|
+
"entity": _entity_type,
|
|
513
|
+
"value": _entity_value,
|
|
514
|
+
"role": _entity_role,
|
|
515
|
+
"group": _entity_group,
|
|
516
|
+
}
|
|
517
|
+
_entity_dict = {k: v for k, v in _entity_dict.items() if v is not None}
|
|
518
|
+
final_entities.append(_entity_dict)
|
|
519
|
+
else:
|
|
520
|
+
final_entities.append({"entity": entity, "value": ""})
|
|
521
|
+
|
|
522
|
+
return final_entities
|
|
523
|
+
|
|
524
|
+
def _parse_slot(self, step: Dict[Text, Any]) -> None:
|
|
525
|
+
for slot in step.get(KEY_CHECKPOINT_SLOTS, []):
|
|
526
|
+
if isinstance(slot, dict):
|
|
527
|
+
for key, value in slot.items():
|
|
528
|
+
self._add_event(SlotSet.type_name, {key: value})
|
|
529
|
+
elif isinstance(slot, str):
|
|
530
|
+
self._add_event(
|
|
531
|
+
SlotSet.type_name, {slot: self._slot_default_value(slot)}
|
|
532
|
+
)
|
|
533
|
+
else:
|
|
534
|
+
rasa.shared.utils.io.raise_warning(
|
|
535
|
+
f"Issue found in '{self.source_name}':\n"
|
|
536
|
+
f"Invalid slot: \n{slot}\n"
|
|
537
|
+
f"Items under the '{KEY_CHECKPOINT_SLOTS}' key must be "
|
|
538
|
+
f"YAML dictionaries or Strings. The checkpoint will be skipped.",
|
|
539
|
+
docs=self._get_docs_link(),
|
|
540
|
+
)
|
|
541
|
+
return
|
|
542
|
+
|
|
543
|
+
@functools.lru_cache()
|
|
544
|
+
def _slot_default_value(self, slot_name: Text) -> Any:
|
|
545
|
+
if not self.domain:
|
|
546
|
+
return None
|
|
547
|
+
|
|
548
|
+
slot_types_with_default_types = {
|
|
549
|
+
TextSlot: DEFAULT_VALUE_TEXT_SLOTS,
|
|
550
|
+
ListSlot: DEFAULT_VALUE_LIST_SLOTS,
|
|
551
|
+
}
|
|
552
|
+
slot = next(slot for slot in self.domain.slots if slot.name == slot_name)
|
|
553
|
+
|
|
554
|
+
default_value = slot_types_with_default_types.get(type(slot))
|
|
555
|
+
if default_value is None and slot.has_features():
|
|
556
|
+
rasa.shared.utils.io.raise_warning(
|
|
557
|
+
f"Slot '{slot_name}' was referenced by its name only. As slot "
|
|
558
|
+
f"'{slot_name}' is of type '{slot.type_name}' you need to specify a "
|
|
559
|
+
f"value for it. Slot '{slot_name}' will be treated as if it's value "
|
|
560
|
+
f"is empty.",
|
|
561
|
+
docs=DOCS_URL_SLOTS,
|
|
562
|
+
)
|
|
563
|
+
|
|
564
|
+
return default_value
|
|
565
|
+
|
|
566
|
+
def _parse_action(self, step: Dict[Text, Any]) -> None:
|
|
567
|
+
action_name = step.get(KEY_ACTION, "")
|
|
568
|
+
if not action_name:
|
|
569
|
+
rasa.shared.utils.io.raise_warning(
|
|
570
|
+
f"Issue found in '{self.source_name}': \n"
|
|
571
|
+
f"Action name cannot be empty. "
|
|
572
|
+
f"This {self._get_item_title()} step will be skipped:\n"
|
|
573
|
+
f"{step}",
|
|
574
|
+
docs=self._get_docs_link(),
|
|
575
|
+
)
|
|
576
|
+
return
|
|
577
|
+
|
|
578
|
+
self._add_event(action_name, {})
|
|
579
|
+
|
|
580
|
+
def _parse_stack(self, step: Dict[Text, Any]) -> None:
|
|
581
|
+
update = step.get(KEY_STACK_UPDATE, [])
|
|
582
|
+
self._add_event(DialogueStackUpdated.type_name, {"update": json.dumps(update)})
|
|
583
|
+
|
|
584
|
+
def _parse_bot_message(self, step: Dict[Text, Any]) -> None:
|
|
585
|
+
bot_message = step.get(KEY_BOT_END_TO_END_MESSAGE, "")
|
|
586
|
+
self._add_event("", {ACTION_TEXT: bot_message})
|
|
587
|
+
|
|
588
|
+
def _parse_active_loop(self, active_loop_name: Optional[Text]) -> None:
|
|
589
|
+
self._add_event(ActiveLoop.type_name, {LOOP_NAME: active_loop_name})
|
|
590
|
+
|
|
591
|
+
def _parse_checkpoint(self, step: Dict[Text, Any]) -> None:
|
|
592
|
+
checkpoint_name = step.get(KEY_CHECKPOINT, "")
|
|
593
|
+
slots = step.get(KEY_CHECKPOINT_SLOTS, [])
|
|
594
|
+
|
|
595
|
+
slots_dict = {}
|
|
596
|
+
|
|
597
|
+
for slot in slots:
|
|
598
|
+
if not isinstance(slot, dict):
|
|
599
|
+
rasa.shared.utils.io.raise_warning(
|
|
600
|
+
f"Issue found in '{self.source_name}':\n"
|
|
601
|
+
f"Checkpoint '{checkpoint_name}' has an invalid slot: "
|
|
602
|
+
f"{slots}\nItems under the '{KEY_CHECKPOINT_SLOTS}' key must be "
|
|
603
|
+
f"YAML dictionaries. The checkpoint will be skipped.",
|
|
604
|
+
docs=self._get_docs_link(),
|
|
605
|
+
)
|
|
606
|
+
return
|
|
607
|
+
|
|
608
|
+
for key, value in slot.items():
|
|
609
|
+
slots_dict[key] = value
|
|
610
|
+
|
|
611
|
+
self._add_checkpoint(checkpoint_name, slots_dict)
|
|
612
|
+
|
|
613
|
+
@staticmethod
|
|
614
|
+
def _regex_message_pattern() -> Pattern:
|
|
615
|
+
"""Builds the pattern that matches `TEXT`s of messages that need to be unpacked.
|
|
616
|
+
|
|
617
|
+
Returns:
|
|
618
|
+
pattern with named groups
|
|
619
|
+
"""
|
|
620
|
+
return re.compile(INTENT_ENTITIES_PATTERN)
|
|
621
|
+
|
|
622
|
+
@staticmethod
|
|
623
|
+
def unpack_regex_message(
|
|
624
|
+
message: Message,
|
|
625
|
+
domain: Optional[Domain] = None,
|
|
626
|
+
entity_extractor_name: Optional[Text] = None,
|
|
627
|
+
) -> Message:
|
|
628
|
+
"""Unpacks the message if `TEXT` contains an encoding of attributes.
|
|
629
|
+
|
|
630
|
+
Args:
|
|
631
|
+
message: some message
|
|
632
|
+
domain: the domain
|
|
633
|
+
entity_extractor_name: An extractor name which should be added for the
|
|
634
|
+
entities.
|
|
635
|
+
|
|
636
|
+
Returns:
|
|
637
|
+
the given message if that message does not need to be unpacked, and a new
|
|
638
|
+
message with the extracted attributes otherwise
|
|
639
|
+
"""
|
|
640
|
+
user_text = message.get(TEXT).strip()
|
|
641
|
+
|
|
642
|
+
# If the prefix doesn't match, we don't even need to try to match the pattern.
|
|
643
|
+
if not user_text.startswith(INTENT_MESSAGE_PREFIX):
|
|
644
|
+
return message
|
|
645
|
+
|
|
646
|
+
# Try to match the pattern.
|
|
647
|
+
match = YAMLStoryReader._regex_message_pattern().match(user_text)
|
|
648
|
+
|
|
649
|
+
# If it doesn't match, then (potentially) something went wrong, because the
|
|
650
|
+
# message text did start with the special prefix -- however, a user might
|
|
651
|
+
# just have decided to start their text this way.
|
|
652
|
+
if not match:
|
|
653
|
+
structlogger.warning(
|
|
654
|
+
"message.parsing.failed", user_text=copy.deepcopy(user_text)
|
|
655
|
+
)
|
|
656
|
+
return message
|
|
657
|
+
|
|
658
|
+
# Extract attributes from the match - and validate it via the domain.
|
|
659
|
+
intent_name = YAMLStoryReader._intent_name_from_regex_match(match, domain)
|
|
660
|
+
confidence = YAMLStoryReader._confidences_from_regex_match(match)
|
|
661
|
+
entities = YAMLStoryReader._entities_from_regex_match(
|
|
662
|
+
match, domain, entity_extractor_name
|
|
663
|
+
)
|
|
664
|
+
|
|
665
|
+
# The intent name is *not* optional, but during parsing we might find out
|
|
666
|
+
# that the given intent is unknown (and warn). In this case, stop here.
|
|
667
|
+
if intent_name is None:
|
|
668
|
+
return message
|
|
669
|
+
|
|
670
|
+
if match.group("rest"):
|
|
671
|
+
rasa.shared.utils.io.raise_warning(
|
|
672
|
+
f"Failed to parse arguments in line '{match.string}'. "
|
|
673
|
+
f"Failed to interpret some parts. "
|
|
674
|
+
f"Make sure your regex string is in the following format:"
|
|
675
|
+
f"{INTENT_MESSAGE_PREFIX}"
|
|
676
|
+
f"<intent_name>@<confidence-value><dictionary of entities> "
|
|
677
|
+
f"Continuing without {match.group('rest')}. "
|
|
678
|
+
)
|
|
679
|
+
|
|
680
|
+
# Add the results to the message.
|
|
681
|
+
intent_data = {
|
|
682
|
+
INTENT_NAME_KEY: intent_name,
|
|
683
|
+
PREDICTED_CONFIDENCE_KEY: confidence,
|
|
684
|
+
}
|
|
685
|
+
intent_ranking = [
|
|
686
|
+
{INTENT_NAME_KEY: intent_name, PREDICTED_CONFIDENCE_KEY: confidence}
|
|
687
|
+
]
|
|
688
|
+
message_data = {}
|
|
689
|
+
message_data[TEXT] = user_text
|
|
690
|
+
message_data[INTENT] = intent_data
|
|
691
|
+
message_data[INTENT_RANKING_KEY] = intent_ranking
|
|
692
|
+
message_data[ENTITIES] = entities
|
|
693
|
+
return Message(message_data, output_properties=set(message_data.keys()))
|
|
694
|
+
|
|
695
|
+
@staticmethod
|
|
696
|
+
def _intent_name_from_regex_match(match: Match, domain: Domain) -> Optional[Text]:
|
|
697
|
+
intent_name = match.group(INTENT_NAME_KEY).strip()
|
|
698
|
+
if domain and intent_name not in domain.intents:
|
|
699
|
+
rasa.shared.utils.io.raise_warning(
|
|
700
|
+
f"Failed to parse arguments in line '{match.string}'. "
|
|
701
|
+
f"Expected the intent to be one of [{domain.intents}] "
|
|
702
|
+
f"but found {intent_name}."
|
|
703
|
+
f"Continuing with given line as user text.",
|
|
704
|
+
docs=DOCS_URL_STORIES,
|
|
705
|
+
)
|
|
706
|
+
intent_name = None
|
|
707
|
+
return intent_name
|
|
708
|
+
|
|
709
|
+
@staticmethod
|
|
710
|
+
def _entities_from_regex_match(
|
|
711
|
+
match: Match, domain: Domain, extractor_name: Optional[Text]
|
|
712
|
+
) -> List[Dict[Text, Any]]:
|
|
713
|
+
"""Extracts the optional entity information from the given pattern match.
|
|
714
|
+
|
|
715
|
+
If no entities are specified or if the extraction fails, then an empty list
|
|
716
|
+
is returned.
|
|
717
|
+
|
|
718
|
+
Args:
|
|
719
|
+
match: a match produced by `self.pattern`
|
|
720
|
+
domain: the domain
|
|
721
|
+
extractor_name: A extractor name which should be added for the entities
|
|
722
|
+
|
|
723
|
+
Returns:
|
|
724
|
+
some list of entities
|
|
725
|
+
"""
|
|
726
|
+
entities_str = match.group(ENTITIES)
|
|
727
|
+
if entities_str is None:
|
|
728
|
+
return []
|
|
729
|
+
|
|
730
|
+
try:
|
|
731
|
+
parsed_entities = json.loads(entities_str)
|
|
732
|
+
if not isinstance(parsed_entities, dict):
|
|
733
|
+
raise ValueError(
|
|
734
|
+
f"Parsed value isn't a json object "
|
|
735
|
+
f"(instead parser found '{type(parsed_entities)}')"
|
|
736
|
+
)
|
|
737
|
+
except (JSONDecodeError, ValueError) as e:
|
|
738
|
+
rasa.shared.utils.io.raise_warning(
|
|
739
|
+
f"Failed to parse arguments in line '{match.string}'. "
|
|
740
|
+
f"Failed to decode parameters as a json object (dict). "
|
|
741
|
+
f"Make sure the intent is followed by a proper json object (dict). "
|
|
742
|
+
f"Continuing without entities. "
|
|
743
|
+
f"Error: {e}",
|
|
744
|
+
docs=DOCS_URL_STORIES,
|
|
745
|
+
)
|
|
746
|
+
parsed_entities = dict()
|
|
747
|
+
|
|
748
|
+
# validate the given entity types
|
|
749
|
+
if domain:
|
|
750
|
+
entity_types = set(parsed_entities.keys())
|
|
751
|
+
unknown_entity_types = entity_types.difference(domain.entities)
|
|
752
|
+
if unknown_entity_types:
|
|
753
|
+
rasa.shared.utils.io.raise_warning(
|
|
754
|
+
f"Failed to parse arguments in line '{match.string}'. "
|
|
755
|
+
f"Expected entities from {domain.entities} "
|
|
756
|
+
f"but found {unknown_entity_types}. "
|
|
757
|
+
f"Continuing without unknown entity types. ",
|
|
758
|
+
docs=DOCS_URL_STORIES,
|
|
759
|
+
)
|
|
760
|
+
parsed_entities = {
|
|
761
|
+
key: value
|
|
762
|
+
for key, value in parsed_entities.items()
|
|
763
|
+
if key not in unknown_entity_types
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
# convert them into the list of dictionaries that we expect
|
|
767
|
+
entities: List[Dict[Text, Any]] = []
|
|
768
|
+
default_properties = {}
|
|
769
|
+
if extractor_name:
|
|
770
|
+
default_properties = {EXTRACTOR: extractor_name}
|
|
771
|
+
|
|
772
|
+
for entity_type, entity_values in parsed_entities.items():
|
|
773
|
+
if not isinstance(entity_values, list):
|
|
774
|
+
entity_values = [entity_values]
|
|
775
|
+
|
|
776
|
+
for entity_value in entity_values:
|
|
777
|
+
entities.append(
|
|
778
|
+
{
|
|
779
|
+
ENTITY_ATTRIBUTE_TYPE: entity_type,
|
|
780
|
+
ENTITY_ATTRIBUTE_VALUE: entity_value,
|
|
781
|
+
ENTITY_ATTRIBUTE_START: match.start(ENTITIES),
|
|
782
|
+
ENTITY_ATTRIBUTE_END: match.end(ENTITIES),
|
|
783
|
+
**default_properties,
|
|
784
|
+
}
|
|
785
|
+
)
|
|
786
|
+
return entities
|
|
787
|
+
|
|
788
|
+
@staticmethod
|
|
789
|
+
def _confidences_from_regex_match(match: Match) -> float:
|
|
790
|
+
"""Extracts the optional confidence information from the given pattern match.
|
|
791
|
+
|
|
792
|
+
If no confidence is specified, then this method returns the maximum
|
|
793
|
+
confidence `1.0`.
|
|
794
|
+
If a confidence is specified but extraction fails, then this method defaults
|
|
795
|
+
to a confidence of `0.0`.
|
|
796
|
+
|
|
797
|
+
Args:
|
|
798
|
+
match: a match produced by `self.pattern`
|
|
799
|
+
domain: the domain
|
|
800
|
+
|
|
801
|
+
Returns:
|
|
802
|
+
some confidence value
|
|
803
|
+
"""
|
|
804
|
+
confidence_str = match.group(PREDICTED_CONFIDENCE_KEY)
|
|
805
|
+
if confidence_str is None:
|
|
806
|
+
return 1.0
|
|
807
|
+
try:
|
|
808
|
+
confidence_str = confidence_str.strip()[1:] # remove the "@"
|
|
809
|
+
try:
|
|
810
|
+
confidence = float(confidence_str)
|
|
811
|
+
except ValueError:
|
|
812
|
+
confidence = 0.0
|
|
813
|
+
raise ValueError(
|
|
814
|
+
f"Expected confidence to be a non-negative decimal number but "
|
|
815
|
+
f"found {confidence}. Continuing with 0.0 instead."
|
|
816
|
+
)
|
|
817
|
+
if confidence > 1.0:
|
|
818
|
+
# Due to the pattern we know that this cannot be a negative number.
|
|
819
|
+
original_confidence = confidence
|
|
820
|
+
confidence = min(1.0, confidence)
|
|
821
|
+
raise ValueError(
|
|
822
|
+
f"Expected confidence to be at most 1.0. "
|
|
823
|
+
f"but found {original_confidence}. "
|
|
824
|
+
f"Continuing with {confidence} instead."
|
|
825
|
+
)
|
|
826
|
+
return confidence
|
|
827
|
+
|
|
828
|
+
except ValueError as e:
|
|
829
|
+
rasa.shared.utils.io.raise_warning(
|
|
830
|
+
f"Failed to parse arguments in line '{match.string}'. "
|
|
831
|
+
f"Could not extract confidence value from `{confidence_str}'. "
|
|
832
|
+
f"Make sure the intent confidence is an @ followed "
|
|
833
|
+
f"by a decimal number that not negative and at most 1.0. "
|
|
834
|
+
f"Error: {e}",
|
|
835
|
+
docs=DOCS_URL_STORIES,
|
|
836
|
+
)
|
|
837
|
+
return confidence
|
|
838
|
+
|
|
839
|
+
|
|
840
|
+
class StoryParser(YAMLStoryReader):
|
|
841
|
+
"""Encapsulate story-specific parser behavior."""
|
|
842
|
+
|
|
843
|
+
def _new_part(self, item_name: Text, item: Dict[Text, Any]) -> None:
|
|
844
|
+
self._new_story_part(item_name, self.source_name)
|
|
845
|
+
|
|
846
|
+
def _get_item_title(self) -> Text:
|
|
847
|
+
return KEY_STORY_NAME
|
|
848
|
+
|
|
849
|
+
def _get_plural_item_title(self) -> Text:
|
|
850
|
+
return KEY_STORIES
|
|
851
|
+
|
|
852
|
+
def _get_docs_link(self) -> Text:
|
|
853
|
+
return DOCS_URL_STORIES
|
|
854
|
+
|
|
855
|
+
|
|
856
|
+
class RuleParser(YAMLStoryReader):
|
|
857
|
+
"""Encapsulate rule-specific parser behavior."""
|
|
858
|
+
|
|
859
|
+
def _new_part(self, item_name: Text, item: Dict[Text, Any]) -> None:
|
|
860
|
+
self._new_rule_part(item_name, self.source_name)
|
|
861
|
+
conditions = item.get(KEY_RULE_CONDITION, [])
|
|
862
|
+
self._parse_rule_conditions(conditions)
|
|
863
|
+
if not item.get(KEY_RULE_FOR_CONVERSATION_START):
|
|
864
|
+
self._parse_rule_snippet_action()
|
|
865
|
+
|
|
866
|
+
def _parse_rule_conditions(
|
|
867
|
+
self, conditions: List[Union[Text, Dict[Text, Any]]]
|
|
868
|
+
) -> None:
|
|
869
|
+
self._is_parsing_conditions = True
|
|
870
|
+
for condition in conditions:
|
|
871
|
+
self._parse_step(condition)
|
|
872
|
+
self._is_parsing_conditions = False
|
|
873
|
+
|
|
874
|
+
def _close_part(self, item: Dict[Text, Any]) -> None:
|
|
875
|
+
if item.get(KEY_WAIT_FOR_USER_INPUT_AFTER_RULE) is False:
|
|
876
|
+
self._parse_rule_snippet_action()
|
|
877
|
+
|
|
878
|
+
def _get_item_title(self) -> Text:
|
|
879
|
+
return KEY_RULE_NAME
|
|
880
|
+
|
|
881
|
+
def _get_plural_item_title(self) -> Text:
|
|
882
|
+
return KEY_RULES
|
|
883
|
+
|
|
884
|
+
def _get_docs_link(self) -> Text:
|
|
885
|
+
return DOCS_URL_RULES
|
|
886
|
+
|
|
887
|
+
def _parse_rule_snippet_action(self) -> None:
|
|
888
|
+
self._add_event(RULE_SNIPPET_ACTION_NAME, {})
|