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,208 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from json import JSONDecodeError
|
|
3
|
+
from typing import Text, List, Dict, Match, Optional, NamedTuple, Any
|
|
4
|
+
import logging
|
|
5
|
+
|
|
6
|
+
import rasa.shared.nlu.training_data.util
|
|
7
|
+
from rasa.shared.constants import DOCS_URL_TRAINING_DATA_NLU
|
|
8
|
+
from rasa.shared.exceptions import InvalidEntityFormatException
|
|
9
|
+
from rasa.shared.nlu.constants import (
|
|
10
|
+
ENTITY_ATTRIBUTE_VALUE,
|
|
11
|
+
ENTITY_ATTRIBUTE_TYPE,
|
|
12
|
+
ENTITY_ATTRIBUTE_GROUP,
|
|
13
|
+
ENTITY_ATTRIBUTE_ROLE,
|
|
14
|
+
)
|
|
15
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
GROUP_ENTITY_VALUE = "value"
|
|
19
|
+
GROUP_ENTITY_TYPE = "entity"
|
|
20
|
+
GROUP_ENTITY_DICT = "entity_dict"
|
|
21
|
+
GROUP_ENTITY_DICT_LIST = "list_entity_dicts"
|
|
22
|
+
GROUP_ENTITY_TEXT = "entity_text"
|
|
23
|
+
GROUP_COMPLETE_MATCH = 0
|
|
24
|
+
|
|
25
|
+
# regex for: `[entity_text]((entity_type(:entity_synonym)?)|{entity_dict}|[list_entity_dicts])` # noqa: E501
|
|
26
|
+
ENTITY_REGEX = re.compile(
|
|
27
|
+
r"\[(?P<entity_text>[^\]]+?)\](\((?P<entity>[^:)]+?)(?:\:(?P<value>[^)]+))?\)|\{(?P<entity_dict>[^}]+?)\}|\[(?P<list_entity_dicts>.*?)\])"
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
SINGLE_ENTITY_DICT = re.compile(r"{(?P<entity_dict>[^}]+?)\}")
|
|
31
|
+
|
|
32
|
+
logger = logging.getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class EntityAttributes(NamedTuple):
|
|
36
|
+
"""Attributes of an entity defined in markdown data."""
|
|
37
|
+
|
|
38
|
+
type: Text
|
|
39
|
+
value: Text
|
|
40
|
+
text: Text
|
|
41
|
+
group: Optional[Text]
|
|
42
|
+
role: Optional[Text]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def find_entities_in_training_example(example: Text) -> List[Dict[Text, Any]]:
|
|
46
|
+
"""Extracts entities from an annotated utterance.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
example: Annotated utterance.
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
Extracted entities.
|
|
53
|
+
"""
|
|
54
|
+
entities = []
|
|
55
|
+
offset = 0
|
|
56
|
+
|
|
57
|
+
for match in re.finditer(ENTITY_REGEX, example):
|
|
58
|
+
logger.debug(f"Entity annotation regex match: {match}")
|
|
59
|
+
if match.groupdict()[GROUP_ENTITY_DICT] or match.groupdict()[GROUP_ENTITY_TYPE]:
|
|
60
|
+
# Text is annotated with a single entity
|
|
61
|
+
entity_attributes = extract_entity_attributes(match)
|
|
62
|
+
|
|
63
|
+
start_index = match.start() - offset
|
|
64
|
+
end_index = start_index + len(entity_attributes.text)
|
|
65
|
+
offset += len(match.group(0)) - len(entity_attributes.text)
|
|
66
|
+
|
|
67
|
+
entity = rasa.shared.nlu.training_data.util.build_entity(
|
|
68
|
+
start_index,
|
|
69
|
+
end_index,
|
|
70
|
+
entity_attributes.value,
|
|
71
|
+
entity_attributes.type,
|
|
72
|
+
entity_attributes.role,
|
|
73
|
+
entity_attributes.group,
|
|
74
|
+
)
|
|
75
|
+
entities.append(entity)
|
|
76
|
+
else:
|
|
77
|
+
# Text is annotated with multiple entities for the same text
|
|
78
|
+
entity_text = match.groupdict()[GROUP_ENTITY_TEXT]
|
|
79
|
+
|
|
80
|
+
start_index = match.start() - offset
|
|
81
|
+
end_index = start_index + len(entity_text)
|
|
82
|
+
offset += len(match.group(0)) - len(entity_text)
|
|
83
|
+
|
|
84
|
+
for match_inner in re.finditer(
|
|
85
|
+
SINGLE_ENTITY_DICT, match.groupdict()[GROUP_ENTITY_DICT_LIST]
|
|
86
|
+
):
|
|
87
|
+
entity_attributes = extract_entity_attributes_from_dict(
|
|
88
|
+
entity_text=entity_text, match=match_inner
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
entity = rasa.shared.nlu.training_data.util.build_entity(
|
|
92
|
+
start_index,
|
|
93
|
+
end_index,
|
|
94
|
+
entity_attributes.value,
|
|
95
|
+
entity_attributes.type,
|
|
96
|
+
entity_attributes.role,
|
|
97
|
+
entity_attributes.group,
|
|
98
|
+
)
|
|
99
|
+
entities.append(entity)
|
|
100
|
+
|
|
101
|
+
return entities
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def extract_entity_attributes(match: Match) -> EntityAttributes:
|
|
105
|
+
"""Extract the entity attributes, i.e. type, value, etc., from the
|
|
106
|
+
regex match.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
match: Regex match to extract the entity attributes from.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
EntityAttributes object.
|
|
113
|
+
"""
|
|
114
|
+
entity_text = match.groupdict()[GROUP_ENTITY_TEXT]
|
|
115
|
+
|
|
116
|
+
if match.groupdict()[GROUP_ENTITY_DICT]:
|
|
117
|
+
return extract_entity_attributes_from_dict(entity_text, match)
|
|
118
|
+
|
|
119
|
+
entity_type = match.groupdict()[GROUP_ENTITY_TYPE]
|
|
120
|
+
|
|
121
|
+
if match.groupdict()[GROUP_ENTITY_VALUE]:
|
|
122
|
+
entity_value = match.groupdict()[GROUP_ENTITY_VALUE]
|
|
123
|
+
else:
|
|
124
|
+
entity_value = entity_text
|
|
125
|
+
|
|
126
|
+
return EntityAttributes(entity_type, entity_value, entity_text, None, None)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def extract_entity_attributes_from_dict(
|
|
130
|
+
entity_text: Text, match: Match
|
|
131
|
+
) -> EntityAttributes:
|
|
132
|
+
"""Extract entity attributes from dict format.
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
entity_text: Original entity text.
|
|
136
|
+
match: Regex match.
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
Extracted entity attributes.
|
|
140
|
+
"""
|
|
141
|
+
entity_dict_str = match.groupdict()[GROUP_ENTITY_DICT]
|
|
142
|
+
entity_dict = get_validated_dict(entity_dict_str)
|
|
143
|
+
return EntityAttributes(
|
|
144
|
+
entity_dict.get(ENTITY_ATTRIBUTE_TYPE),
|
|
145
|
+
entity_dict.get(ENTITY_ATTRIBUTE_VALUE, entity_text),
|
|
146
|
+
entity_text,
|
|
147
|
+
entity_dict.get(ENTITY_ATTRIBUTE_GROUP),
|
|
148
|
+
entity_dict.get(ENTITY_ATTRIBUTE_ROLE),
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def get_validated_dict(json_str: Text) -> Dict[Text, Text]:
|
|
153
|
+
"""Converts the provided `json_str` to a valid dict containing the entity
|
|
154
|
+
attributes.
|
|
155
|
+
|
|
156
|
+
Users can specify entity roles, synonyms, groups for an entity in a dict, e.g.
|
|
157
|
+
[LA]{"entity": "city", "role": "to", "value": "Los Angeles"}.
|
|
158
|
+
|
|
159
|
+
Args:
|
|
160
|
+
json_str: The entity dict as string without "{}".
|
|
161
|
+
|
|
162
|
+
Raises:
|
|
163
|
+
SchemaValidationError if validation of parsed entity fails.
|
|
164
|
+
InvalidEntityFormatException if provided entity is not valid json.
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
Deserialized and validated `json_str`.
|
|
168
|
+
"""
|
|
169
|
+
import json
|
|
170
|
+
from rasa.shared.utils.yaml import validate_training_data
|
|
171
|
+
import rasa.shared.nlu.training_data.schemas.data_schema as schema
|
|
172
|
+
|
|
173
|
+
# add {} as they are not part of the regex
|
|
174
|
+
try:
|
|
175
|
+
data = json.loads(f"{{{json_str}}}")
|
|
176
|
+
except JSONDecodeError as e:
|
|
177
|
+
raise InvalidEntityFormatException.create_from(
|
|
178
|
+
e,
|
|
179
|
+
f"Incorrect training data format ('{{{json_str}}}'). "
|
|
180
|
+
f"More info at {DOCS_URL_TRAINING_DATA_NLU}",
|
|
181
|
+
) from e
|
|
182
|
+
|
|
183
|
+
validate_training_data(data, schema.entity_dict_schema())
|
|
184
|
+
|
|
185
|
+
return data
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def replace_entities(training_example: Text) -> Text:
|
|
189
|
+
"""Replace special symbols related to the entities in the provided
|
|
190
|
+
training example.
|
|
191
|
+
|
|
192
|
+
Args:
|
|
193
|
+
training_example: Original training example with special symbols.
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
String with removed special symbols.
|
|
197
|
+
"""
|
|
198
|
+
return re.sub(
|
|
199
|
+
ENTITY_REGEX, lambda m: m.groupdict()[GROUP_ENTITY_TEXT], training_example
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def parse_training_example(example: Text, intent: Optional[Text] = None) -> "Message":
|
|
204
|
+
"""Extract entities and synonyms, and convert to plain text."""
|
|
205
|
+
entities = find_entities_in_training_example(example)
|
|
206
|
+
plain_text = replace_entities(example)
|
|
207
|
+
|
|
208
|
+
return Message.build(plain_text, intent, entities)
|
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import itertools
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import Iterable, Union, Text, Optional, List, Any, Tuple, Dict, Set
|
|
6
|
+
|
|
7
|
+
import numpy as np
|
|
8
|
+
import scipy.sparse
|
|
9
|
+
from safetensors.numpy import save_file, load_file
|
|
10
|
+
|
|
11
|
+
import rasa.shared.nlu.training_data.util
|
|
12
|
+
import rasa.shared.utils.io
|
|
13
|
+
from rasa.shared.nlu.constants import FEATURE_TYPE_SEQUENCE, FEATURE_TYPE_SENTENCE
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class FeatureMetadata:
|
|
18
|
+
data_type: str
|
|
19
|
+
attribute: str
|
|
20
|
+
origin: Union[str, List[str]]
|
|
21
|
+
is_sparse: bool
|
|
22
|
+
shape: tuple
|
|
23
|
+
safetensors_key: str
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def save_features(
|
|
27
|
+
features_dict: Dict[Text, List[Features]], file_name: str
|
|
28
|
+
) -> Dict[str, Any]:
|
|
29
|
+
"""Save a dictionary of Features lists to disk using safetensors.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
features_dict: Dictionary mapping strings to lists of Features objects
|
|
33
|
+
file_name: File to save the features to
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
The metadata to reconstruct the features.
|
|
37
|
+
"""
|
|
38
|
+
# All tensors are stored in a single safetensors file
|
|
39
|
+
tensors_to_save = {}
|
|
40
|
+
# Metadata will be stored separately
|
|
41
|
+
metadata = {}
|
|
42
|
+
|
|
43
|
+
for key, features_list in features_dict.items():
|
|
44
|
+
feature_metadata_list = []
|
|
45
|
+
|
|
46
|
+
for idx, feature in enumerate(features_list):
|
|
47
|
+
# Create a unique key for this tensor in the safetensors file
|
|
48
|
+
safetensors_key = f"{key}_{idx}"
|
|
49
|
+
|
|
50
|
+
# Convert sparse matrices to dense if needed
|
|
51
|
+
if feature.is_sparse():
|
|
52
|
+
# For sparse matrices, use the COO format
|
|
53
|
+
coo = feature.features.tocoo() # type:ignore[union-attr]
|
|
54
|
+
# Save data, row indices and col indices separately
|
|
55
|
+
tensors_to_save[f"{safetensors_key}_data"] = coo.data
|
|
56
|
+
tensors_to_save[f"{safetensors_key}_row"] = coo.row
|
|
57
|
+
tensors_to_save[f"{safetensors_key}_col"] = coo.col
|
|
58
|
+
else:
|
|
59
|
+
tensors_to_save[safetensors_key] = feature.features
|
|
60
|
+
|
|
61
|
+
# Store metadata
|
|
62
|
+
metadata_item = FeatureMetadata(
|
|
63
|
+
data_type=feature.type,
|
|
64
|
+
attribute=feature.attribute,
|
|
65
|
+
origin=feature.origin,
|
|
66
|
+
is_sparse=feature.is_sparse(),
|
|
67
|
+
shape=feature.features.shape,
|
|
68
|
+
safetensors_key=safetensors_key,
|
|
69
|
+
)
|
|
70
|
+
feature_metadata_list.append(vars(metadata_item))
|
|
71
|
+
|
|
72
|
+
metadata[key] = feature_metadata_list
|
|
73
|
+
|
|
74
|
+
# Save tensors
|
|
75
|
+
save_file(tensors_to_save, file_name)
|
|
76
|
+
|
|
77
|
+
return metadata
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def load_features(
|
|
81
|
+
filename: str, metadata: Dict[str, Any]
|
|
82
|
+
) -> Dict[Text, List[Features]]:
|
|
83
|
+
"""Load Features dictionary from disk.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
filename: File name of the safetensors file.
|
|
87
|
+
metadata: Metadata to reconstruct the features.
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
Dictionary mapping strings to lists of Features objects
|
|
91
|
+
"""
|
|
92
|
+
# Load tensors
|
|
93
|
+
tensors = load_file(filename)
|
|
94
|
+
|
|
95
|
+
# Reconstruct the features dictionary
|
|
96
|
+
features_dict: Dict[Text, List[Features]] = {}
|
|
97
|
+
|
|
98
|
+
for key, feature_metadata_list in metadata.items():
|
|
99
|
+
features_list = []
|
|
100
|
+
|
|
101
|
+
for meta in feature_metadata_list:
|
|
102
|
+
safetensors_key = meta["safetensors_key"]
|
|
103
|
+
|
|
104
|
+
if meta["is_sparse"]:
|
|
105
|
+
# Reconstruct sparse matrix from COO format
|
|
106
|
+
data = tensors[f"{safetensors_key}_data"]
|
|
107
|
+
row = tensors[f"{safetensors_key}_row"]
|
|
108
|
+
col = tensors[f"{safetensors_key}_col"]
|
|
109
|
+
|
|
110
|
+
features_matrix = scipy.sparse.coo_matrix(
|
|
111
|
+
(data, (row, col)), shape=tuple(meta["shape"])
|
|
112
|
+
).tocsr() # Convert back to CSR format
|
|
113
|
+
else:
|
|
114
|
+
features_matrix = tensors[safetensors_key]
|
|
115
|
+
|
|
116
|
+
# Reconstruct Features object
|
|
117
|
+
features = Features(
|
|
118
|
+
features=features_matrix,
|
|
119
|
+
feature_type=meta["data_type"],
|
|
120
|
+
attribute=meta["attribute"],
|
|
121
|
+
origin=meta["origin"],
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
features_list.append(features)
|
|
125
|
+
|
|
126
|
+
features_dict[key] = features_list
|
|
127
|
+
|
|
128
|
+
return features_dict
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class Features:
|
|
132
|
+
"""Stores the features produced by any featurizer."""
|
|
133
|
+
|
|
134
|
+
def __init__(
|
|
135
|
+
self,
|
|
136
|
+
features: Union[np.ndarray, scipy.sparse.spmatrix],
|
|
137
|
+
feature_type: Text,
|
|
138
|
+
attribute: Text,
|
|
139
|
+
origin: Union[Text, List[Text]],
|
|
140
|
+
) -> None:
|
|
141
|
+
"""Initializes the Features object.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
features: The features.
|
|
145
|
+
feature_type: Type of the feature, e.g. FEATURE_TYPE_SENTENCE.
|
|
146
|
+
attribute: Message attribute, e.g. INTENT or TEXT.
|
|
147
|
+
origin: Name of the component that created the features.
|
|
148
|
+
"""
|
|
149
|
+
self.features = features
|
|
150
|
+
self.type = feature_type
|
|
151
|
+
self.origin = origin
|
|
152
|
+
self.attribute = attribute
|
|
153
|
+
self._cached_fingerprint: Optional[Text] = None
|
|
154
|
+
if not self.is_dense() and not self.is_sparse():
|
|
155
|
+
raise ValueError(
|
|
156
|
+
"Features must either be a numpy array for dense "
|
|
157
|
+
"features or a scipy sparse matrix for sparse features."
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
def __repr__(self) -> Text:
|
|
161
|
+
return (
|
|
162
|
+
f"{self.__class__.__name__}("
|
|
163
|
+
f"features={self.features}, "
|
|
164
|
+
f"type={self.type}, "
|
|
165
|
+
f"origin={self.origin}, "
|
|
166
|
+
f"attribute={self.attribute})"
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
def __str__(self) -> Text:
|
|
170
|
+
return (
|
|
171
|
+
f"{self.__class__.__name__}("
|
|
172
|
+
f"features.shape={self.features.shape}, "
|
|
173
|
+
f"is_sparse={self.is_sparse()}, "
|
|
174
|
+
f"type={self.type}, "
|
|
175
|
+
f"origin={self.origin}, "
|
|
176
|
+
f"attribute={self.attribute})"
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
def is_sparse(self) -> bool:
|
|
180
|
+
"""Checks if features are sparse or not.
|
|
181
|
+
|
|
182
|
+
Returns:
|
|
183
|
+
True, if features are sparse, false otherwise.
|
|
184
|
+
"""
|
|
185
|
+
return isinstance(self.features, scipy.sparse.spmatrix)
|
|
186
|
+
|
|
187
|
+
def is_dense(self) -> bool:
|
|
188
|
+
"""Checks if features are dense or not.
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
True, if features are dense, false otherwise.
|
|
192
|
+
"""
|
|
193
|
+
return not self.is_sparse()
|
|
194
|
+
|
|
195
|
+
def combine_with_features(self, additional_features: Optional[Features]) -> None:
|
|
196
|
+
"""Combine the incoming features with this instance's features.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
additional_features: additional features to add
|
|
200
|
+
|
|
201
|
+
Returns:
|
|
202
|
+
Combined features.
|
|
203
|
+
"""
|
|
204
|
+
if additional_features is None:
|
|
205
|
+
return
|
|
206
|
+
|
|
207
|
+
if self.is_dense() and additional_features.is_dense():
|
|
208
|
+
self._combine_dense_features(additional_features)
|
|
209
|
+
elif self.is_sparse() and additional_features.is_sparse():
|
|
210
|
+
self._combine_sparse_features(additional_features)
|
|
211
|
+
else:
|
|
212
|
+
raise ValueError("Cannot combine sparse and dense features.")
|
|
213
|
+
|
|
214
|
+
def _combine_dense_features(self, additional_features: Features) -> None:
|
|
215
|
+
if self.features.ndim != additional_features.features.ndim:
|
|
216
|
+
raise ValueError(
|
|
217
|
+
f"Cannot combine dense features as sequence dimensions do not "
|
|
218
|
+
f"match: {self.features.ndim} != {additional_features.features.ndim}."
|
|
219
|
+
)
|
|
220
|
+
self.features = np.concatenate(
|
|
221
|
+
(self.features, additional_features.features), axis=-1
|
|
222
|
+
)
|
|
223
|
+
self._cached_fingerprint = None
|
|
224
|
+
|
|
225
|
+
def _combine_sparse_features(self, additional_features: Features) -> None:
|
|
226
|
+
from scipy.sparse import hstack
|
|
227
|
+
|
|
228
|
+
if self.features.shape[0] != additional_features.features.shape[0]:
|
|
229
|
+
raise ValueError(
|
|
230
|
+
f"Cannot combine sparse features as sequence dimensions do not "
|
|
231
|
+
f"match: {self.features.shape[0]} != "
|
|
232
|
+
f"{additional_features.features.shape[0]}."
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
self.features = hstack([self.features, additional_features.features])
|
|
236
|
+
self._cached_fingerprint = None
|
|
237
|
+
|
|
238
|
+
def __key__(
|
|
239
|
+
self,
|
|
240
|
+
) -> Tuple[
|
|
241
|
+
Text, Text, Union[np.ndarray, scipy.sparse.spmatrix], Union[Text, List[Text]]
|
|
242
|
+
]:
|
|
243
|
+
"""Returns a 4-tuple of defining properties.
|
|
244
|
+
|
|
245
|
+
Returns:
|
|
246
|
+
Tuple of type, attribute, features, and origin properties.
|
|
247
|
+
"""
|
|
248
|
+
return self.type, self.attribute, self.features, self.origin
|
|
249
|
+
|
|
250
|
+
def __eq__(self, other: Any) -> bool:
|
|
251
|
+
"""Tests if the `self` `Feature` equals to the `other`.
|
|
252
|
+
|
|
253
|
+
Args:
|
|
254
|
+
other: The other object.
|
|
255
|
+
|
|
256
|
+
Returns:
|
|
257
|
+
`True` when the other object is a `Feature` and has the same
|
|
258
|
+
type, attribute, and feature tensors.
|
|
259
|
+
"""
|
|
260
|
+
if not isinstance(other, Features):
|
|
261
|
+
return False
|
|
262
|
+
|
|
263
|
+
return (
|
|
264
|
+
other.type == self.type
|
|
265
|
+
and other.attribute == self.attribute
|
|
266
|
+
and other.features == self.features
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
def fingerprint(self) -> Text:
|
|
270
|
+
"""Calculate a stable string fingerprint for the features."""
|
|
271
|
+
if self._cached_fingerprint is None:
|
|
272
|
+
if self.is_dense():
|
|
273
|
+
f_as_text = self.features.tobytes()
|
|
274
|
+
else:
|
|
275
|
+
f_as_text = rasa.shared.nlu.training_data.util.sparse_matrix_to_string(
|
|
276
|
+
self.features
|
|
277
|
+
)
|
|
278
|
+
self._cached_fingerprint = rasa.shared.utils.io.deep_container_fingerprint(
|
|
279
|
+
[self.type, self.origin, self.attribute, f_as_text]
|
|
280
|
+
)
|
|
281
|
+
return self._cached_fingerprint
|
|
282
|
+
|
|
283
|
+
@staticmethod
|
|
284
|
+
def filter(
|
|
285
|
+
features_list: List[Features],
|
|
286
|
+
attributes: Optional[Iterable[Text]] = None,
|
|
287
|
+
type: Optional[Text] = None,
|
|
288
|
+
origin: Optional[List[Text]] = None,
|
|
289
|
+
is_sparse: Optional[bool] = None,
|
|
290
|
+
) -> List[Features]:
|
|
291
|
+
"""Filters the given list of features.
|
|
292
|
+
|
|
293
|
+
Args:
|
|
294
|
+
features_list: list of features to be filtered
|
|
295
|
+
attributes: List of attributes that we're interested in. Set this to `None`
|
|
296
|
+
to disable this filter.
|
|
297
|
+
type: The type of feature we're interested in. Set this to `None`
|
|
298
|
+
to disable this filter.
|
|
299
|
+
origin: If specified, this method will check that the exact order of origins
|
|
300
|
+
matches the given list of origins. The reason for this is that if
|
|
301
|
+
multiple origins are listed for a Feature, this means that this feature
|
|
302
|
+
has been created by concatenating Features from the listed origins in
|
|
303
|
+
that particular order.
|
|
304
|
+
is_sparse: Defines whether all features that we're interested in should be
|
|
305
|
+
sparse. Set this to `None` to disable this filter.
|
|
306
|
+
|
|
307
|
+
Returns:
|
|
308
|
+
sub-list of features with the desired properties
|
|
309
|
+
"""
|
|
310
|
+
filtered = features_list
|
|
311
|
+
if attributes is not None:
|
|
312
|
+
attributes = set(attributes)
|
|
313
|
+
filtered = [f for f in filtered if f.attribute in attributes]
|
|
314
|
+
if origin is not None:
|
|
315
|
+
filtered = [
|
|
316
|
+
f
|
|
317
|
+
for f in filtered
|
|
318
|
+
if (f.origin if not isinstance(f.origin, Text) else list([f.origin]))
|
|
319
|
+
== origin
|
|
320
|
+
]
|
|
321
|
+
if type is not None:
|
|
322
|
+
filtered = [f for f in filtered if f.type == type]
|
|
323
|
+
if is_sparse is not None:
|
|
324
|
+
filtered = [f for f in filtered if f.is_sparse() == is_sparse]
|
|
325
|
+
return filtered
|
|
326
|
+
|
|
327
|
+
@staticmethod
|
|
328
|
+
def groupby_attribute(
|
|
329
|
+
features_list: List[Features], attributes: Optional[Iterable[Text]] = None
|
|
330
|
+
) -> Dict[Text, List[Features]]:
|
|
331
|
+
"""Groups the given features according to their attribute.
|
|
332
|
+
|
|
333
|
+
Args:
|
|
334
|
+
features_list: list of features to be grouped
|
|
335
|
+
attributes: If specified, the result will be a grouping with respect to
|
|
336
|
+
the given attributes. If some specified attribute has no features attached
|
|
337
|
+
to it, then the resulting dictionary will map it to an empty list.
|
|
338
|
+
If this is None, the result will be a grouping according to all attributes
|
|
339
|
+
for which features can be found.
|
|
340
|
+
|
|
341
|
+
Returns:
|
|
342
|
+
a mapping from the requested attributes to the list of correspoding
|
|
343
|
+
features
|
|
344
|
+
"""
|
|
345
|
+
# ensure all requested attributes are present in the output - regardless
|
|
346
|
+
# of whether we find features later
|
|
347
|
+
extracted: Dict[Text, List[Features]] = (
|
|
348
|
+
dict()
|
|
349
|
+
if attributes is None
|
|
350
|
+
else {attribute: [] for attribute in attributes}
|
|
351
|
+
)
|
|
352
|
+
# extract features for all (requested) attributes
|
|
353
|
+
for feat in features_list:
|
|
354
|
+
if attributes is None or feat.attribute in attributes:
|
|
355
|
+
extracted.setdefault(feat.attribute, []).append(feat)
|
|
356
|
+
return extracted
|
|
357
|
+
|
|
358
|
+
@staticmethod
|
|
359
|
+
def combine(
|
|
360
|
+
features_list: List[Features], expected_origins: Optional[List[Text]] = None
|
|
361
|
+
) -> Features:
|
|
362
|
+
"""Combine features of the same type and level that describe the same attribute.
|
|
363
|
+
|
|
364
|
+
If sequence features are to be combined, then they must have the same
|
|
365
|
+
sequence dimension.
|
|
366
|
+
|
|
367
|
+
Args:
|
|
368
|
+
features: Non-empty list of Features of the same type and level that
|
|
369
|
+
describe the same attribute.
|
|
370
|
+
expected_origins: The expected origins of the given features. This method
|
|
371
|
+
will check that the origin information of each feature is as expected, i.e.
|
|
372
|
+
the origin of the i-th feature in the given list is the i-th origin
|
|
373
|
+
in this list of origins.
|
|
374
|
+
|
|
375
|
+
Raises:
|
|
376
|
+
`ValueError` will be raised
|
|
377
|
+
- if the given list is empty
|
|
378
|
+
- if there are inconsistencies in the given list of `Features`
|
|
379
|
+
- if the origins aren't as expected
|
|
380
|
+
"""
|
|
381
|
+
if len(features_list) == 0:
|
|
382
|
+
raise ValueError("Expected a non-empty list of Features.")
|
|
383
|
+
if len(features_list) == 1:
|
|
384
|
+
# nothing to combine here
|
|
385
|
+
return features_list[0]
|
|
386
|
+
|
|
387
|
+
# Un-Pack the Origin information
|
|
388
|
+
origin_of_combination = [f.origin for f in features_list]
|
|
389
|
+
origin_of_combination = [
|
|
390
|
+
featurizer_name
|
|
391
|
+
for origin in origin_of_combination
|
|
392
|
+
for featurizer_name in (origin if isinstance(origin, List) else [origin])
|
|
393
|
+
]
|
|
394
|
+
|
|
395
|
+
# Sanity Checks
|
|
396
|
+
# (1) origins must be as expected
|
|
397
|
+
if expected_origins is not None:
|
|
398
|
+
if origin_of_combination is not None:
|
|
399
|
+
for idx, (expected, actual) in enumerate(
|
|
400
|
+
itertools.zip_longest(expected_origins, origin_of_combination)
|
|
401
|
+
):
|
|
402
|
+
if expected != actual:
|
|
403
|
+
raise ValueError(
|
|
404
|
+
f"Expected '{expected}' to be the origin of the {idx}-th "
|
|
405
|
+
f"feature (because of `origin_of_combination`) but found a "
|
|
406
|
+
f"feature from '{actual}'."
|
|
407
|
+
)
|
|
408
|
+
# (2) attributes (is_sparse, type, attribute) must coincide
|
|
409
|
+
# Note: we could also use `filter` for this check, but then the error msgs
|
|
410
|
+
# aren't as nice.
|
|
411
|
+
sparseness: Set[bool] = set(f.is_sparse() for f in features_list)
|
|
412
|
+
if len(sparseness) > 1:
|
|
413
|
+
raise ValueError(
|
|
414
|
+
"Expected all Features to have the same sparseness property but "
|
|
415
|
+
"found both (sparse and dense)."
|
|
416
|
+
)
|
|
417
|
+
types: Set[Text] = set(f.type for f in features_list)
|
|
418
|
+
if len(types) > 1:
|
|
419
|
+
raise ValueError(
|
|
420
|
+
f"Expected all Features to have the same type but found the "
|
|
421
|
+
f"following types {types}."
|
|
422
|
+
)
|
|
423
|
+
attributes: Set[Text] = set(f.attribute for f in features_list)
|
|
424
|
+
if len(attributes) > 1:
|
|
425
|
+
raise ValueError(
|
|
426
|
+
f"Expected all Features to describe the same attribute but found "
|
|
427
|
+
f"attributes: {attributes}."
|
|
428
|
+
)
|
|
429
|
+
# (3) dimensions must match
|
|
430
|
+
# Note: We shouldn't have to check sentence-level features here but it doesn't
|
|
431
|
+
# hurt either.
|
|
432
|
+
dimensions = set(f.features.shape[0] for f in features_list)
|
|
433
|
+
if len(dimensions) > 1:
|
|
434
|
+
raise ValueError(
|
|
435
|
+
f"Expected all sequence dimensions to match but found {dimensions}."
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
# Combine the features
|
|
439
|
+
arbitrary_feature = features_list[0]
|
|
440
|
+
if not arbitrary_feature.is_sparse():
|
|
441
|
+
features = np.concatenate([f.features for f in features_list], axis=-1)
|
|
442
|
+
else:
|
|
443
|
+
features = scipy.sparse.hstack([f.features for f in features_list])
|
|
444
|
+
return Features(
|
|
445
|
+
features=features,
|
|
446
|
+
feature_type=arbitrary_feature.type,
|
|
447
|
+
attribute=arbitrary_feature.attribute,
|
|
448
|
+
origin=origin_of_combination,
|
|
449
|
+
)
|
|
450
|
+
|
|
451
|
+
@staticmethod
|
|
452
|
+
def reduce(
|
|
453
|
+
features_list: List[Features], expected_origins: Optional[List[Text]] = None
|
|
454
|
+
) -> List[Features]:
|
|
455
|
+
"""Combines features of same type and level into one Feature.
|
|
456
|
+
|
|
457
|
+
Args:
|
|
458
|
+
features_list: list of Features which must all describe the same attribute
|
|
459
|
+
expected_origins: if specified, this list will be used to validate that
|
|
460
|
+
the features from the right featurizers are combined in the right order
|
|
461
|
+
(cf. `Features.combine`)
|
|
462
|
+
|
|
463
|
+
Returns:
|
|
464
|
+
a list of the combined Features, i.e. at most 4 Features, where
|
|
465
|
+
- all the sparse features are listed before the dense features
|
|
466
|
+
- sequence feature is always listed before the sentence feature with the
|
|
467
|
+
same sparseness property
|
|
468
|
+
"""
|
|
469
|
+
if len(features_list) == 1:
|
|
470
|
+
return features_list
|
|
471
|
+
# sanity check
|
|
472
|
+
different_settings = set(f.attribute for f in features_list)
|
|
473
|
+
if len(different_settings) > 1:
|
|
474
|
+
raise ValueError(
|
|
475
|
+
f"Expected all Features to describe the same attribute but found "
|
|
476
|
+
f" {different_settings}."
|
|
477
|
+
)
|
|
478
|
+
output = []
|
|
479
|
+
for is_sparse in [True, False]:
|
|
480
|
+
# all sparse features before all dense features
|
|
481
|
+
for type in [FEATURE_TYPE_SEQUENCE, FEATURE_TYPE_SENTENCE]:
|
|
482
|
+
# sequence feature that is (not) sparse before sentence feature that is
|
|
483
|
+
# (not) sparse
|
|
484
|
+
sublist = Features.filter(
|
|
485
|
+
features_list=features_list, type=type, is_sparse=is_sparse
|
|
486
|
+
)
|
|
487
|
+
if sublist:
|
|
488
|
+
combined_feature = Features.combine(
|
|
489
|
+
sublist, expected_origins=expected_origins
|
|
490
|
+
)
|
|
491
|
+
output.append(combined_feature)
|
|
492
|
+
return output
|