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,654 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from abc import ABC, abstractmethod
|
|
3
|
+
from typing import Any, Dict, List, Optional, Text, Type
|
|
4
|
+
|
|
5
|
+
import rasa.shared.core.constants
|
|
6
|
+
from rasa.shared.exceptions import RasaException
|
|
7
|
+
import rasa.shared.utils.common
|
|
8
|
+
import rasa.shared.utils.io
|
|
9
|
+
from rasa.shared.constants import (
|
|
10
|
+
DOCS_URL_SLOTS,
|
|
11
|
+
DOCS_URL_NLU_BASED_SLOTS,
|
|
12
|
+
DOCS_URL_CATEGORICAL_SLOTS,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class InvalidSlotTypeException(RasaException):
|
|
19
|
+
"""Raised if a slot type is invalid."""
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class InvalidSlotConfigError(RasaException, ValueError):
|
|
23
|
+
"""Raised if a slot's config is invalid."""
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class Slot(ABC):
|
|
27
|
+
"""Key-value store for storing information during a conversation."""
|
|
28
|
+
|
|
29
|
+
@property
|
|
30
|
+
@abstractmethod
|
|
31
|
+
def type_name(self) -> Text:
|
|
32
|
+
"""Name of the type of slot."""
|
|
33
|
+
...
|
|
34
|
+
|
|
35
|
+
def __init__(
|
|
36
|
+
self,
|
|
37
|
+
name: Text,
|
|
38
|
+
mappings: List[Dict[Text, Any]],
|
|
39
|
+
initial_value: Any = None,
|
|
40
|
+
value_reset_delay: Optional[int] = None,
|
|
41
|
+
influence_conversation: bool = True,
|
|
42
|
+
is_builtin: bool = False,
|
|
43
|
+
shared_for_coexistence: bool = False,
|
|
44
|
+
) -> None:
|
|
45
|
+
"""Create a Slot.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
name: The name of the slot.
|
|
49
|
+
initial_value: The initial value of the slot.
|
|
50
|
+
mappings: List containing slot mappings.
|
|
51
|
+
value_reset_delay: After how many turns the slot should be reset to the
|
|
52
|
+
initial_value. This is behavior is currently not implemented.
|
|
53
|
+
influence_conversation: If `True` the slot will be featurized and hence
|
|
54
|
+
influence the predictions of the dialogue polices.
|
|
55
|
+
is_builtin: `True` if the slot is a built-in slot, `False` otherwise.
|
|
56
|
+
Built-in slots also encompass user writable slots (via custom actions),
|
|
57
|
+
such as `return_value`.
|
|
58
|
+
shared_for_coexistence: If `True` the slot is not forgotten after either
|
|
59
|
+
dm1 or CALM finishes.
|
|
60
|
+
"""
|
|
61
|
+
self.name = name
|
|
62
|
+
self.mappings = mappings
|
|
63
|
+
self._value = initial_value
|
|
64
|
+
self.initial_value = initial_value
|
|
65
|
+
self._value_reset_delay = value_reset_delay
|
|
66
|
+
self.influence_conversation = influence_conversation
|
|
67
|
+
self._has_been_set = False
|
|
68
|
+
self.is_builtin = is_builtin
|
|
69
|
+
self.shared_for_coexistence = shared_for_coexistence
|
|
70
|
+
|
|
71
|
+
def feature_dimensionality(self) -> int:
|
|
72
|
+
"""How many features this single slot creates.
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
The number of features. `0` if the slot is unfeaturized. The dimensionality
|
|
76
|
+
of the array returned by `as_feature` needs to correspond to this value.
|
|
77
|
+
"""
|
|
78
|
+
if not self.influence_conversation:
|
|
79
|
+
return 0
|
|
80
|
+
|
|
81
|
+
return self._feature_dimensionality()
|
|
82
|
+
|
|
83
|
+
def _feature_dimensionality(self) -> int:
|
|
84
|
+
"""See the docstring for `feature_dimensionality`."""
|
|
85
|
+
return 1
|
|
86
|
+
|
|
87
|
+
def has_features(self) -> bool:
|
|
88
|
+
"""Indicate if the slot creates any features."""
|
|
89
|
+
return self.feature_dimensionality() != 0
|
|
90
|
+
|
|
91
|
+
def value_reset_delay(self) -> Optional[int]:
|
|
92
|
+
"""After how many turns the slot should be reset to the initial_value.
|
|
93
|
+
|
|
94
|
+
If the delay is set to `None`, the slot will keep its value forever.
|
|
95
|
+
"""
|
|
96
|
+
# TODO: FUTURE this needs to be implemented - slots are not reset yet
|
|
97
|
+
return self._value_reset_delay
|
|
98
|
+
|
|
99
|
+
def as_feature(self) -> List[float]:
|
|
100
|
+
if not self.influence_conversation:
|
|
101
|
+
return []
|
|
102
|
+
|
|
103
|
+
return self._as_feature()
|
|
104
|
+
|
|
105
|
+
@abstractmethod
|
|
106
|
+
def _as_feature(self) -> List[float]:
|
|
107
|
+
raise NotImplementedError(
|
|
108
|
+
"Each slot type needs to specify how its "
|
|
109
|
+
"value can be converted to a feature. Slot "
|
|
110
|
+
"'{}' is a generic slot that can not be used "
|
|
111
|
+
"for predictions. Make sure you add this "
|
|
112
|
+
"slot to your domain definition, specifying "
|
|
113
|
+
"the type of the slot. If you implemented "
|
|
114
|
+
"a custom slot type class, make sure to "
|
|
115
|
+
"implement `.as_feature()`."
|
|
116
|
+
"".format(self.name)
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
def reset(self) -> None:
|
|
120
|
+
"""Resets the slot's value to the initial value."""
|
|
121
|
+
self.value = self.initial_value
|
|
122
|
+
self._has_been_set = False
|
|
123
|
+
|
|
124
|
+
@property
|
|
125
|
+
def value(self) -> Any:
|
|
126
|
+
"""Gets the slot's value."""
|
|
127
|
+
return self._value
|
|
128
|
+
|
|
129
|
+
@value.setter
|
|
130
|
+
def value(self, value: Any) -> None:
|
|
131
|
+
"""Sets the slot's value."""
|
|
132
|
+
self._value = value
|
|
133
|
+
self._has_been_set = True
|
|
134
|
+
|
|
135
|
+
def has_same_coerced_value(self, other_value: Any) -> bool:
|
|
136
|
+
"""Checks if the coerced value of is the same as the slot value.
|
|
137
|
+
|
|
138
|
+
Can be used to check if an update with the value would be a no-op.
|
|
139
|
+
"""
|
|
140
|
+
return self.coerce_value(other_value) == self.value
|
|
141
|
+
|
|
142
|
+
def coerce_value(self, value: Any) -> Any:
|
|
143
|
+
"""Coerces the value to the slot's type."""
|
|
144
|
+
return value
|
|
145
|
+
|
|
146
|
+
def is_valid_value(self, value: Any) -> bool:
|
|
147
|
+
"""Checks if the slot contains the value."""
|
|
148
|
+
return True
|
|
149
|
+
|
|
150
|
+
@property
|
|
151
|
+
def has_been_set(self) -> bool:
|
|
152
|
+
"""Indicates if the slot's value has been set."""
|
|
153
|
+
return self._has_been_set
|
|
154
|
+
|
|
155
|
+
def __str__(self) -> Text:
|
|
156
|
+
return f"{self.__class__.__name__}({self.name}: {self.value})"
|
|
157
|
+
|
|
158
|
+
def __repr__(self) -> Text:
|
|
159
|
+
return f"<{self.__class__.__name__}({self.name}: {self.value})>"
|
|
160
|
+
|
|
161
|
+
@staticmethod
|
|
162
|
+
def resolve_by_type(type_name: Text) -> Type["Slot"]:
|
|
163
|
+
"""Returns a slots class by its type name."""
|
|
164
|
+
for cls in rasa.shared.utils.common.all_subclasses(Slot):
|
|
165
|
+
if cls.type_name == type_name:
|
|
166
|
+
return cls
|
|
167
|
+
try:
|
|
168
|
+
return rasa.shared.utils.common.class_from_module_path(type_name)
|
|
169
|
+
except (ImportError, AttributeError):
|
|
170
|
+
raise InvalidSlotTypeException(
|
|
171
|
+
f"Failed to find slot type, '{type_name}' is neither a known type nor "
|
|
172
|
+
f"user-defined. If you are creating your own slot type, make "
|
|
173
|
+
f"sure its module path is correct. "
|
|
174
|
+
f"You can find all build in types at {DOCS_URL_SLOTS}"
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
def persistence_info(self) -> Dict[str, Any]:
|
|
178
|
+
"""Returns relevant information to persist this slot."""
|
|
179
|
+
return {
|
|
180
|
+
"type": rasa.shared.utils.common.module_path_from_instance(self),
|
|
181
|
+
"initial_value": self.initial_value,
|
|
182
|
+
"influence_conversation": self.influence_conversation,
|
|
183
|
+
"mappings": self.mappings,
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
def fingerprint(self) -> Text:
|
|
187
|
+
"""Returns a unique hash for the slot which is stable across python runs.
|
|
188
|
+
|
|
189
|
+
Returns:
|
|
190
|
+
fingerprint of the slot
|
|
191
|
+
"""
|
|
192
|
+
data = {"slot_name": self.name, "slot_value": self.value}
|
|
193
|
+
data.update(self.persistence_info())
|
|
194
|
+
return rasa.shared.utils.io.get_dictionary_fingerprint(data)
|
|
195
|
+
|
|
196
|
+
def __eq__(self, other: Any) -> bool:
|
|
197
|
+
if not isinstance(other, Slot):
|
|
198
|
+
return False
|
|
199
|
+
return self.name == other.name and self.value == other.value
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
class FloatSlot(Slot):
|
|
203
|
+
"""A slot storing a float value."""
|
|
204
|
+
|
|
205
|
+
type_name = "float"
|
|
206
|
+
|
|
207
|
+
def __init__(
|
|
208
|
+
self,
|
|
209
|
+
name: Text,
|
|
210
|
+
mappings: List[Dict[Text, Any]],
|
|
211
|
+
initial_value: Optional[float] = None,
|
|
212
|
+
value_reset_delay: Optional[int] = None,
|
|
213
|
+
max_value: float = 1.0,
|
|
214
|
+
min_value: float = 0.0,
|
|
215
|
+
influence_conversation: bool = True,
|
|
216
|
+
is_builtin: bool = False,
|
|
217
|
+
shared_for_coexistence: bool = False,
|
|
218
|
+
) -> None:
|
|
219
|
+
"""Creates a FloatSlot.
|
|
220
|
+
|
|
221
|
+
Raises:
|
|
222
|
+
InvalidSlotConfigError, if the min-max range is invalid.
|
|
223
|
+
UserWarning, if initial_value is outside the min-max range.
|
|
224
|
+
"""
|
|
225
|
+
super().__init__(
|
|
226
|
+
name,
|
|
227
|
+
mappings,
|
|
228
|
+
initial_value,
|
|
229
|
+
value_reset_delay,
|
|
230
|
+
influence_conversation,
|
|
231
|
+
is_builtin,
|
|
232
|
+
shared_for_coexistence,
|
|
233
|
+
)
|
|
234
|
+
self.max_value = max_value
|
|
235
|
+
self.min_value = min_value
|
|
236
|
+
|
|
237
|
+
if min_value >= max_value:
|
|
238
|
+
raise InvalidSlotConfigError(
|
|
239
|
+
"Float slot ('{}') created with an invalid range "
|
|
240
|
+
"using min ({}) and max ({}) values. Make sure "
|
|
241
|
+
"min is smaller than max."
|
|
242
|
+
"".format(self.name, self.min_value, self.max_value)
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
if initial_value is not None and not (min_value <= initial_value <= max_value):
|
|
246
|
+
rasa.shared.utils.io.raise_warning(
|
|
247
|
+
f"Float slot ('{self.name}') created with an initial value "
|
|
248
|
+
f"{self.value}. This value is outside of the configured min "
|
|
249
|
+
f"({self.min_value}) and max ({self.max_value}) values."
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
def _as_feature(self) -> List[float]:
|
|
253
|
+
try:
|
|
254
|
+
capped_value = max(self.min_value, min(self.max_value, float(self.value)))
|
|
255
|
+
if abs(self.max_value - self.min_value) > 0:
|
|
256
|
+
covered_range = abs(self.max_value - self.min_value)
|
|
257
|
+
else:
|
|
258
|
+
covered_range = 1
|
|
259
|
+
return [1.0, (capped_value - self.min_value) / covered_range]
|
|
260
|
+
except (TypeError, ValueError):
|
|
261
|
+
return [0.0, 0.0]
|
|
262
|
+
|
|
263
|
+
def persistence_info(self) -> Dict[Text, Any]:
|
|
264
|
+
"""Returns relevant information to persist this slot."""
|
|
265
|
+
d = super().persistence_info()
|
|
266
|
+
d["max_value"] = self.max_value
|
|
267
|
+
d["min_value"] = self.min_value
|
|
268
|
+
return d
|
|
269
|
+
|
|
270
|
+
def coerce_value(self, value: Any) -> Any:
|
|
271
|
+
"""Coerces the value to the slot's type."""
|
|
272
|
+
try:
|
|
273
|
+
return float(value)
|
|
274
|
+
except (TypeError, ValueError):
|
|
275
|
+
return value
|
|
276
|
+
|
|
277
|
+
def is_valid_value(self, value: Any) -> bool:
|
|
278
|
+
"""Checks if the slot contains the value."""
|
|
279
|
+
# check that coerced type is float
|
|
280
|
+
return value is None or isinstance(self.coerce_value(value), float)
|
|
281
|
+
|
|
282
|
+
def _feature_dimensionality(self) -> int:
|
|
283
|
+
return len(self.as_feature())
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
class BooleanSlot(Slot):
|
|
287
|
+
"""A slot storing a truth value."""
|
|
288
|
+
|
|
289
|
+
type_name = "bool"
|
|
290
|
+
|
|
291
|
+
def _as_feature(self) -> List[float]:
|
|
292
|
+
try:
|
|
293
|
+
if self.value is not None:
|
|
294
|
+
return [1.0, float(bool_from_any(self.value))]
|
|
295
|
+
else:
|
|
296
|
+
return [0.0, 0.0]
|
|
297
|
+
except (TypeError, ValueError):
|
|
298
|
+
# we couldn't convert the value to float - using default value
|
|
299
|
+
return [0.0, 0.0]
|
|
300
|
+
|
|
301
|
+
def _feature_dimensionality(self) -> int:
|
|
302
|
+
return len(self.as_feature())
|
|
303
|
+
|
|
304
|
+
def coerce_value(self, value: Any) -> Any:
|
|
305
|
+
"""Coerces the value to the slot's type."""
|
|
306
|
+
try:
|
|
307
|
+
return bool_from_any(value)
|
|
308
|
+
except (ValueError, TypeError):
|
|
309
|
+
return value
|
|
310
|
+
|
|
311
|
+
def is_valid_value(self, value: Any) -> bool:
|
|
312
|
+
"""Checks if the slot contains the value."""
|
|
313
|
+
return value is None or isinstance(self.coerce_value(value), bool)
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def bool_from_any(x: Any) -> bool:
|
|
317
|
+
"""Converts bool/float/int/str to bool or raises error."""
|
|
318
|
+
if isinstance(x, bool):
|
|
319
|
+
return x
|
|
320
|
+
elif isinstance(x, (float, int)):
|
|
321
|
+
return x == 1.0
|
|
322
|
+
elif isinstance(x, str):
|
|
323
|
+
if x.isnumeric():
|
|
324
|
+
return float(x) == 1.0
|
|
325
|
+
elif x.strip().lower() == "true":
|
|
326
|
+
return True
|
|
327
|
+
elif x.strip().lower() == "no":
|
|
328
|
+
return False
|
|
329
|
+
elif x.strip().lower() == "false":
|
|
330
|
+
return False
|
|
331
|
+
elif x.strip().lower() == "yes":
|
|
332
|
+
return True
|
|
333
|
+
else:
|
|
334
|
+
raise ValueError("Cannot convert string to bool")
|
|
335
|
+
else:
|
|
336
|
+
raise TypeError("Cannot convert to bool")
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
class TextSlot(Slot):
|
|
340
|
+
type_name = "text"
|
|
341
|
+
|
|
342
|
+
def _as_feature(self) -> List[float]:
|
|
343
|
+
return [1.0 if self.value is not None else 0.0]
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
class ListSlot(Slot):
|
|
347
|
+
type_name = "list"
|
|
348
|
+
|
|
349
|
+
def _as_feature(self) -> List[float]:
|
|
350
|
+
try:
|
|
351
|
+
if self.value is not None and len(self.value) > 0:
|
|
352
|
+
return [1.0]
|
|
353
|
+
else:
|
|
354
|
+
return [0.0]
|
|
355
|
+
except (TypeError, ValueError):
|
|
356
|
+
# we couldn't convert the value to a list - using default value
|
|
357
|
+
return [0.0]
|
|
358
|
+
|
|
359
|
+
def coerce_value(self, value: Any) -> Any:
|
|
360
|
+
"""Coerces the value to the slot's type."""
|
|
361
|
+
if value and not isinstance(value, list):
|
|
362
|
+
# Make sure we always store list items
|
|
363
|
+
value = [value]
|
|
364
|
+
return value
|
|
365
|
+
|
|
366
|
+
# FIXME: https://github.com/python/mypy/issues/8085
|
|
367
|
+
@Slot.value.setter # type: ignore[attr-defined,misc]
|
|
368
|
+
def value(self, value: Any) -> None:
|
|
369
|
+
"""Sets the slot's value."""
|
|
370
|
+
# Call property setter of superclass
|
|
371
|
+
# FIXME: https://github.com/python/mypy/issues/8085
|
|
372
|
+
super(ListSlot, self.__class__).value.fset(self, self.coerce_value(value)) # type: ignore[attr-defined]
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
class CategoricalSlot(Slot):
|
|
376
|
+
"""Slot type which can be used to branch conversations based on its value."""
|
|
377
|
+
|
|
378
|
+
type_name = "categorical"
|
|
379
|
+
|
|
380
|
+
def __init__(
|
|
381
|
+
self,
|
|
382
|
+
name: Text,
|
|
383
|
+
mappings: List[Dict[Text, Any]],
|
|
384
|
+
values: Optional[List[Any]] = None,
|
|
385
|
+
initial_value: Any = None,
|
|
386
|
+
value_reset_delay: Optional[int] = None,
|
|
387
|
+
influence_conversation: bool = True,
|
|
388
|
+
is_builtin: bool = False,
|
|
389
|
+
shared_for_coexistence: bool = False,
|
|
390
|
+
) -> None:
|
|
391
|
+
"""Creates a `Categorical Slot` (see parent class for detailed docstring)."""
|
|
392
|
+
super().__init__(
|
|
393
|
+
name,
|
|
394
|
+
mappings,
|
|
395
|
+
initial_value,
|
|
396
|
+
value_reset_delay,
|
|
397
|
+
influence_conversation,
|
|
398
|
+
is_builtin,
|
|
399
|
+
shared_for_coexistence,
|
|
400
|
+
)
|
|
401
|
+
if values and None in values:
|
|
402
|
+
rasa.shared.utils.io.raise_warning(
|
|
403
|
+
f"Categorical slot '{self.name}' has `null` listed as a possible value"
|
|
404
|
+
f" in the domain file, which translates to `None` in Python. This value"
|
|
405
|
+
f" is reserved for when the slot is not set, and should not be listed"
|
|
406
|
+
f" as a value in the slot's definition."
|
|
407
|
+
f" Rasa will ignore `null` as a possible value for the '{self.name}'"
|
|
408
|
+
f" slot. Consider changing this value in your domain file to, for"
|
|
409
|
+
f" example, `unset`, or provide the value explicitly as a string by"
|
|
410
|
+
f' using quotation marks: "null".',
|
|
411
|
+
category=UserWarning,
|
|
412
|
+
)
|
|
413
|
+
self.values = [str(v) for v in values if v is not None] if values else []
|
|
414
|
+
self._warn_for_duplicate_coerced_values(values)
|
|
415
|
+
|
|
416
|
+
def _warn_for_duplicate_coerced_values(
|
|
417
|
+
self, possible_values: Optional[List[Any]]
|
|
418
|
+
) -> None:
|
|
419
|
+
"""If multiple values are coerced to the same value, warn the user.
|
|
420
|
+
|
|
421
|
+
A warning indicates that multiple values are coerced to the same value
|
|
422
|
+
which can create unexpected behavior. For example, if the slot is
|
|
423
|
+
configured with values `["a", "A"]` both of these values are coerced
|
|
424
|
+
to `"a"`. This can lead to unexpected behavior if the user sets the
|
|
425
|
+
slot to `"A"` and the slot is later checked for the value `"a"`.
|
|
426
|
+
|
|
427
|
+
Args:
|
|
428
|
+
possible_values: The values for this slot configured in the domain.
|
|
429
|
+
|
|
430
|
+
Returns:
|
|
431
|
+
None
|
|
432
|
+
"""
|
|
433
|
+
if not possible_values:
|
|
434
|
+
return
|
|
435
|
+
|
|
436
|
+
coerced_values: Dict[str, Any] = {}
|
|
437
|
+
for value in possible_values:
|
|
438
|
+
if value is None:
|
|
439
|
+
continue
|
|
440
|
+
|
|
441
|
+
if isinstance(value, Text):
|
|
442
|
+
coerced_value = value.casefold()
|
|
443
|
+
else:
|
|
444
|
+
# Make sure we always store items as strings - though these
|
|
445
|
+
# could be dicts, so we do not want to lower them
|
|
446
|
+
coerced_value = str(value)
|
|
447
|
+
|
|
448
|
+
if coerced_value in coerced_values:
|
|
449
|
+
rasa.shared.utils.io.raise_warning(
|
|
450
|
+
f"Multiple values are coerced to the same value for the "
|
|
451
|
+
f"categorical slot '{self.name}'. "
|
|
452
|
+
f"Coerced value '{coerced_value}' is the same for "
|
|
453
|
+
f"values '{value}' and '{coerced_values[coerced_value]}'. "
|
|
454
|
+
f"Make sure to provide unique values for the slot.",
|
|
455
|
+
category=UserWarning,
|
|
456
|
+
docs=DOCS_URL_CATEGORICAL_SLOTS,
|
|
457
|
+
)
|
|
458
|
+
coerced_values[coerced_value] = value
|
|
459
|
+
|
|
460
|
+
def add_default_value(self) -> None:
|
|
461
|
+
"""Adds the special default value to the list of possible values."""
|
|
462
|
+
values = set(self.values)
|
|
463
|
+
if rasa.shared.core.constants.DEFAULT_CATEGORICAL_SLOT_VALUE not in values:
|
|
464
|
+
self.values.append(
|
|
465
|
+
rasa.shared.core.constants.DEFAULT_CATEGORICAL_SLOT_VALUE
|
|
466
|
+
)
|
|
467
|
+
|
|
468
|
+
def persistence_info(self) -> Dict[Text, Any]:
|
|
469
|
+
"""Returns serialized slot."""
|
|
470
|
+
d = super().persistence_info()
|
|
471
|
+
d["values"] = [
|
|
472
|
+
value
|
|
473
|
+
for value in self.values
|
|
474
|
+
# Don't add default slot when persisting it.
|
|
475
|
+
# We'll re-add it on the fly when creating the domain.
|
|
476
|
+
if value != rasa.shared.core.constants.DEFAULT_CATEGORICAL_SLOT_VALUE
|
|
477
|
+
]
|
|
478
|
+
return d
|
|
479
|
+
|
|
480
|
+
def _as_feature(self) -> List[float]:
|
|
481
|
+
r = [0.0] * self.feature_dimensionality()
|
|
482
|
+
|
|
483
|
+
# Return the zero-filled array if the slot is unset (i.e. set to None).
|
|
484
|
+
# Conceptually, this is similar to the case when the featurisation process
|
|
485
|
+
# fails, hence the returned features here are the same as for that case.
|
|
486
|
+
if self.value is None:
|
|
487
|
+
return r
|
|
488
|
+
|
|
489
|
+
try:
|
|
490
|
+
for i, v in enumerate(self.values):
|
|
491
|
+
if v.lower() == str(self.value).lower():
|
|
492
|
+
r[i] = 1.0
|
|
493
|
+
break
|
|
494
|
+
else:
|
|
495
|
+
if (
|
|
496
|
+
rasa.shared.core.constants.DEFAULT_CATEGORICAL_SLOT_VALUE
|
|
497
|
+
in self.values
|
|
498
|
+
):
|
|
499
|
+
i = self.values.index(
|
|
500
|
+
rasa.shared.core.constants.DEFAULT_CATEGORICAL_SLOT_VALUE
|
|
501
|
+
)
|
|
502
|
+
r[i] = 1.0
|
|
503
|
+
else:
|
|
504
|
+
rasa.shared.utils.io.raise_warning(
|
|
505
|
+
f"Categorical slot '{self.name}' is set to a value "
|
|
506
|
+
f"('{self.value}') "
|
|
507
|
+
"that is not specified in the domain. "
|
|
508
|
+
"Value will be ignored and the slot will "
|
|
509
|
+
"behave as if no value is set. "
|
|
510
|
+
"Make sure to add all values a categorical "
|
|
511
|
+
"slot should store to the domain."
|
|
512
|
+
)
|
|
513
|
+
except (TypeError, ValueError):
|
|
514
|
+
logger.exception("Failed to featurize categorical slot.")
|
|
515
|
+
return r
|
|
516
|
+
return r
|
|
517
|
+
|
|
518
|
+
def _feature_dimensionality(self) -> int:
|
|
519
|
+
return len(self.values)
|
|
520
|
+
|
|
521
|
+
def coerce_value(self, value: Any) -> Any:
|
|
522
|
+
"""Coerces the value to the slot's configured values if possible.
|
|
523
|
+
|
|
524
|
+
If the value can not be mapped to a configured value, the value
|
|
525
|
+
is returned as is.
|
|
526
|
+
|
|
527
|
+
String values are compared case insensitive. For example, if the
|
|
528
|
+
slot is configured with values `["a", "b"]` and the value is `"A"`,
|
|
529
|
+
the value is coerced to `"a"`. One exception is the case where
|
|
530
|
+
the exact value is configured in the domain. In this case, the value's
|
|
531
|
+
casing is not changed. For example, if the slot is configured with
|
|
532
|
+
values `["A", "B"]` and the value is `"A"`, the value is coerced to
|
|
533
|
+
`"A"`.
|
|
534
|
+
|
|
535
|
+
Args:
|
|
536
|
+
value: The value to coerce.
|
|
537
|
+
|
|
538
|
+
Returns:
|
|
539
|
+
The coerced value or the value as is.
|
|
540
|
+
"""
|
|
541
|
+
if value and isinstance(value, Text):
|
|
542
|
+
# Make sure we always store items with the casing
|
|
543
|
+
# as they are defined in the domain
|
|
544
|
+
# first, try to find an exact match
|
|
545
|
+
if value in self.values:
|
|
546
|
+
return value
|
|
547
|
+
|
|
548
|
+
# fallback: try to find a case insensitive match
|
|
549
|
+
for configured_value in self.values:
|
|
550
|
+
if value.casefold() == configured_value.casefold():
|
|
551
|
+
return configured_value
|
|
552
|
+
return value
|
|
553
|
+
|
|
554
|
+
def is_valid_value(self, value: Any) -> bool:
|
|
555
|
+
"""Checks if the slots configured values contains the value.
|
|
556
|
+
|
|
557
|
+
If the value is `None`, it is always considered valid.
|
|
558
|
+
|
|
559
|
+
Args:
|
|
560
|
+
value: The value to check.
|
|
561
|
+
|
|
562
|
+
Returns:
|
|
563
|
+
`True` if the value is valid, `False` otherwise.
|
|
564
|
+
"""
|
|
565
|
+
if value is None:
|
|
566
|
+
return True
|
|
567
|
+
if isinstance(value, Text):
|
|
568
|
+
# Make sure we always store items with the casing
|
|
569
|
+
# as they are defined in the domain
|
|
570
|
+
for configured_value in self.values:
|
|
571
|
+
if value.casefold() == configured_value.casefold():
|
|
572
|
+
return True
|
|
573
|
+
return False
|
|
574
|
+
|
|
575
|
+
return str(value) in self.values
|
|
576
|
+
|
|
577
|
+
# FIXME: https://github.com/python/mypy/issues/8085
|
|
578
|
+
@Slot.value.setter # type: ignore[attr-defined,misc]
|
|
579
|
+
def value(self, value: Any) -> None:
|
|
580
|
+
"""Sets the slot's value after coercing it to a configured value.
|
|
581
|
+
|
|
582
|
+
If the value can not be mapped to a configured value, the value
|
|
583
|
+
is kept as is.
|
|
584
|
+
"""
|
|
585
|
+
# Call property setter of superclass
|
|
586
|
+
# FIXME: https://github.com/python/mypy/issues/8085
|
|
587
|
+
super(CategoricalSlot, self.__class__).value.fset( # type: ignore[attr-defined]
|
|
588
|
+
self, self.coerce_value(value)
|
|
589
|
+
)
|
|
590
|
+
|
|
591
|
+
|
|
592
|
+
class AnySlot(Slot):
|
|
593
|
+
"""Slot which can be used to store any value.
|
|
594
|
+
|
|
595
|
+
Users need to create a subclass of `Slot` in case
|
|
596
|
+
the information is supposed to get featurized.
|
|
597
|
+
"""
|
|
598
|
+
|
|
599
|
+
type_name = "any"
|
|
600
|
+
|
|
601
|
+
def __init__(
|
|
602
|
+
self,
|
|
603
|
+
name: Text,
|
|
604
|
+
mappings: List[Dict[Text, Any]],
|
|
605
|
+
initial_value: Any = None,
|
|
606
|
+
value_reset_delay: Optional[int] = None,
|
|
607
|
+
influence_conversation: bool = False,
|
|
608
|
+
is_builtin: bool = False,
|
|
609
|
+
shared_for_coexistence: bool = False,
|
|
610
|
+
) -> None:
|
|
611
|
+
"""Creates an `Any Slot` (see parent class for detailed docstring).
|
|
612
|
+
|
|
613
|
+
Raises:
|
|
614
|
+
InvalidSlotConfigError, if slot is featurized.
|
|
615
|
+
"""
|
|
616
|
+
if influence_conversation:
|
|
617
|
+
raise InvalidSlotConfigError(
|
|
618
|
+
f"An {AnySlot.__name__} cannot be featurized. "
|
|
619
|
+
f"Please use a different slot type for slot '{name}' instead. If you "
|
|
620
|
+
f"need to featurize a data type which is not supported out of the box, "
|
|
621
|
+
f"implement a custom slot type by subclassing '{Slot.__name__}'. See "
|
|
622
|
+
f"the documentation for more information: {DOCS_URL_NLU_BASED_SLOTS}"
|
|
623
|
+
)
|
|
624
|
+
|
|
625
|
+
super().__init__(
|
|
626
|
+
name,
|
|
627
|
+
mappings,
|
|
628
|
+
initial_value,
|
|
629
|
+
value_reset_delay,
|
|
630
|
+
influence_conversation,
|
|
631
|
+
is_builtin,
|
|
632
|
+
shared_for_coexistence,
|
|
633
|
+
)
|
|
634
|
+
|
|
635
|
+
def __eq__(self, other: Any) -> bool:
|
|
636
|
+
"""Compares object with other object."""
|
|
637
|
+
if not isinstance(other, AnySlot):
|
|
638
|
+
return NotImplemented
|
|
639
|
+
|
|
640
|
+
return (
|
|
641
|
+
self.name == other.name
|
|
642
|
+
and self.initial_value == other.initial_value
|
|
643
|
+
and self._value_reset_delay == other._value_reset_delay
|
|
644
|
+
and self.value == other.value
|
|
645
|
+
)
|
|
646
|
+
|
|
647
|
+
def _as_feature(self) -> List[float]:
|
|
648
|
+
raise InvalidSlotConfigError(
|
|
649
|
+
f"An {AnySlot.__name__} cannot be featurized. "
|
|
650
|
+
f"Please use a different slot type for slot '{self.name}' instead. If you "
|
|
651
|
+
f"need to featurize a data type which is not supported out of the box, "
|
|
652
|
+
f"implement a custom slot type by subclassing '{Slot.__name__}'. "
|
|
653
|
+
f"See the documentation for more information: {DOCS_URL_NLU_BASED_SLOTS}"
|
|
654
|
+
)
|