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,571 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from collections import OrderedDict
|
|
5
|
+
from typing import (
|
|
6
|
+
Any,
|
|
7
|
+
Dict,
|
|
8
|
+
Text,
|
|
9
|
+
List,
|
|
10
|
+
Tuple,
|
|
11
|
+
Callable,
|
|
12
|
+
Set,
|
|
13
|
+
Optional,
|
|
14
|
+
Type,
|
|
15
|
+
Union,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
import numpy as np
|
|
19
|
+
import scipy.sparse
|
|
20
|
+
|
|
21
|
+
import rasa.shared.utils.io
|
|
22
|
+
import rasa.utils.io
|
|
23
|
+
from rasa.engine.graph import ExecutionContext, GraphComponent
|
|
24
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
25
|
+
from rasa.engine.storage.resource import Resource
|
|
26
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
27
|
+
from rasa.nlu.constants import TOKENS_NAMES
|
|
28
|
+
from rasa.nlu.featurizers.sparse_featurizer.sparse_featurizer import SparseFeaturizer
|
|
29
|
+
from rasa.nlu.tokenizers.spacy_tokenizer import POS_TAG_KEY, SpacyTokenizer
|
|
30
|
+
from rasa.nlu.tokenizers.tokenizer import Token, Tokenizer
|
|
31
|
+
from rasa.shared.constants import DOCS_URL_COMPONENTS
|
|
32
|
+
from rasa.shared.exceptions import InvalidConfigException
|
|
33
|
+
from rasa.shared.nlu.constants import TEXT
|
|
34
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
35
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
36
|
+
|
|
37
|
+
logger = logging.getLogger(__name__)
|
|
38
|
+
|
|
39
|
+
END_OF_SENTENCE = "EOS"
|
|
40
|
+
BEGIN_OF_SENTENCE = "BOS"
|
|
41
|
+
|
|
42
|
+
FEATURES = "features"
|
|
43
|
+
|
|
44
|
+
SEPERATOR = "###"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@DefaultV1Recipe.register(
|
|
48
|
+
DefaultV1Recipe.ComponentType.MESSAGE_FEATURIZER, is_trainable=True
|
|
49
|
+
)
|
|
50
|
+
class LexicalSyntacticFeaturizer(SparseFeaturizer, GraphComponent):
|
|
51
|
+
"""Extracts and encodes lexical syntactic features.
|
|
52
|
+
|
|
53
|
+
Given a sequence of tokens, this featurizer produces a sequence of features
|
|
54
|
+
where the `t`-th feature encodes lexical and syntactic information about the `t`-th
|
|
55
|
+
token and it's surrounding tokens.
|
|
56
|
+
|
|
57
|
+
In detail: The lexical syntactic features can be specified via a list of
|
|
58
|
+
configurations `[c_0, c_1, ..., c_n]` where each `c_i` is a list of names of
|
|
59
|
+
lexical and syntactic features (e.g. `low`, `suffix2`, `digit`).
|
|
60
|
+
For a given tokenized text, the featurizer will consider a window of size `n`
|
|
61
|
+
around each token and evaluate the given list of configurations as follows:
|
|
62
|
+
- It will extract the features listed in `c_m` where `m = (n-1)/2` if n is even and
|
|
63
|
+
`n/2` from token `t`
|
|
64
|
+
- It will extract the features listed in `c_{m-1}`,`c_{m-2}` ... , from the last,
|
|
65
|
+
second to last, ... token before token `t`, respectively.
|
|
66
|
+
- It will extract the features listed `c_{m+1}`, `c_{m+1}`, ... for the first,
|
|
67
|
+
second, ... token `t`, respectively.
|
|
68
|
+
It will then combine all these features into one feature for position `t`.
|
|
69
|
+
|
|
70
|
+
Example:
|
|
71
|
+
If we specify `[['low'], ['upper'], ['prefix2']]`, then for each position `t`
|
|
72
|
+
the `t`-th feature will encode whether the token at position `t` is upper case,
|
|
73
|
+
where the token at position `t-1` is lower case and the first two characters
|
|
74
|
+
of the token at position `t+1`.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
FILENAME_FEATURE_TO_IDX_DICT = "feature_to_idx_dict.json"
|
|
78
|
+
|
|
79
|
+
# NOTE: "suffix5" of the token "is" will be "is". Hence, when combining multiple
|
|
80
|
+
# prefixes, short words will be represented/encoded repeatedly.
|
|
81
|
+
_FUNCTION_DICT: Dict[Text, Callable[[Token], Union[Text, bool, None]]] = { # noqa: RUF012
|
|
82
|
+
"low": lambda token: token.text.islower(),
|
|
83
|
+
"title": lambda token: token.text.istitle(),
|
|
84
|
+
"prefix5": lambda token: token.text[:5],
|
|
85
|
+
"prefix2": lambda token: token.text[:2],
|
|
86
|
+
"suffix5": lambda token: token.text[-5:],
|
|
87
|
+
"suffix3": lambda token: token.text[-3:],
|
|
88
|
+
"suffix2": lambda token: token.text[-2:],
|
|
89
|
+
"suffix1": lambda token: token.text[-1:],
|
|
90
|
+
"pos": lambda token: token.data.get(POS_TAG_KEY, None),
|
|
91
|
+
"pos2": lambda token: token.data.get(POS_TAG_KEY, [])[:2]
|
|
92
|
+
if POS_TAG_KEY in token.data
|
|
93
|
+
else None,
|
|
94
|
+
"upper": lambda token: token.text.isupper(),
|
|
95
|
+
"digit": lambda token: token.text.isdigit(),
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
SUPPORTED_FEATURES = sorted(
|
|
99
|
+
set(_FUNCTION_DICT.keys()).union([END_OF_SENTENCE, BEGIN_OF_SENTENCE])
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
@classmethod
|
|
103
|
+
def _extract_raw_features_from_token(
|
|
104
|
+
cls, feature_name: Text, token: Token, token_position: int, num_tokens: int
|
|
105
|
+
) -> Text:
|
|
106
|
+
"""Extracts a raw feature from the token at the given position.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
feature_name: the name of a supported feature
|
|
110
|
+
token: the token from which we want to extract the feature
|
|
111
|
+
token_position: the position of the token inside the tokenized text
|
|
112
|
+
num_tokens: the total number of tokens in the tokenized text
|
|
113
|
+
Returns:
|
|
114
|
+
the raw feature value as text
|
|
115
|
+
"""
|
|
116
|
+
if feature_name not in cls.SUPPORTED_FEATURES:
|
|
117
|
+
raise InvalidConfigException(
|
|
118
|
+
f"Configured feature '{feature_name}' not valid. Please check "
|
|
119
|
+
f"'{DOCS_URL_COMPONENTS}' for valid configuration parameters."
|
|
120
|
+
)
|
|
121
|
+
if feature_name == END_OF_SENTENCE:
|
|
122
|
+
return str(token_position == num_tokens - 1)
|
|
123
|
+
if feature_name == BEGIN_OF_SENTENCE:
|
|
124
|
+
return str(token_position == 0)
|
|
125
|
+
return str(cls._FUNCTION_DICT[feature_name](token))
|
|
126
|
+
|
|
127
|
+
@classmethod
|
|
128
|
+
def required_components(cls) -> List[Type]:
|
|
129
|
+
"""Components that should be included in the pipeline before this component."""
|
|
130
|
+
return [Tokenizer]
|
|
131
|
+
|
|
132
|
+
@staticmethod
|
|
133
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
134
|
+
"""Returns the component's default config."""
|
|
135
|
+
return {
|
|
136
|
+
**SparseFeaturizer.get_default_config(),
|
|
137
|
+
FEATURES: [
|
|
138
|
+
["low", "title", "upper"],
|
|
139
|
+
["BOS", "EOS", "low", "upper", "title", "digit"],
|
|
140
|
+
["low", "title", "upper"],
|
|
141
|
+
],
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
def __init__(
|
|
145
|
+
self,
|
|
146
|
+
config: Dict[Text, Any],
|
|
147
|
+
model_storage: ModelStorage,
|
|
148
|
+
resource: Resource,
|
|
149
|
+
execution_context: ExecutionContext,
|
|
150
|
+
feature_to_idx_dict: Optional[Dict[Tuple[int, Text], Dict[Text, int]]] = None,
|
|
151
|
+
) -> None:
|
|
152
|
+
"""Instantiates a new `LexicalSyntacticFeaturizer` instance."""
|
|
153
|
+
super().__init__(execution_context.node_name, config)
|
|
154
|
+
# graph component
|
|
155
|
+
self._model_storage = model_storage
|
|
156
|
+
self._resource = resource
|
|
157
|
+
self._execution_context = execution_context
|
|
158
|
+
# featurizer specific
|
|
159
|
+
self._feature_config = self._config[FEATURES]
|
|
160
|
+
self._set_feature_to_idx_dict(
|
|
161
|
+
feature_to_idx_dict or {}, check_consistency_with_config=True
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
@classmethod
|
|
165
|
+
def validate_config(cls, config: Dict[Text, Any]) -> None:
|
|
166
|
+
"""Validates that the component is configured properly."""
|
|
167
|
+
if FEATURES not in config:
|
|
168
|
+
return # will be replaced with default
|
|
169
|
+
feature_config = config[FEATURES]
|
|
170
|
+
message = (
|
|
171
|
+
f"Expected configuration of `features` to be a list of lists that "
|
|
172
|
+
f"that contain names of lexical and syntactic features "
|
|
173
|
+
f"(i.e. {cls.SUPPORTED_FEATURES}). "
|
|
174
|
+
f"Received {feature_config} instead. "
|
|
175
|
+
)
|
|
176
|
+
try:
|
|
177
|
+
configured_feature_names = set(
|
|
178
|
+
feature_name
|
|
179
|
+
for pos_config in feature_config
|
|
180
|
+
for feature_name in pos_config
|
|
181
|
+
)
|
|
182
|
+
except TypeError as e:
|
|
183
|
+
raise InvalidConfigException(message) from e
|
|
184
|
+
if configured_feature_names.difference(cls.SUPPORTED_FEATURES):
|
|
185
|
+
raise InvalidConfigException(message)
|
|
186
|
+
|
|
187
|
+
def _set_feature_to_idx_dict(
|
|
188
|
+
self,
|
|
189
|
+
feature_to_idx_dict: Dict[Tuple[int, Text], Dict[Text, int]],
|
|
190
|
+
check_consistency_with_config: bool = False,
|
|
191
|
+
) -> None:
|
|
192
|
+
"""Sets the "feature" to index mapping.
|
|
193
|
+
|
|
194
|
+
Here, "feature" denotes the combination of window position, feature name,
|
|
195
|
+
and feature_value.
|
|
196
|
+
|
|
197
|
+
Args:
|
|
198
|
+
feature_to_idx_dict: mapping from tuples of window position and feature name
|
|
199
|
+
to a mapping from feature values to indices
|
|
200
|
+
check_consistency_with_config: whether the consistency with the current
|
|
201
|
+
`self.config` should be checked
|
|
202
|
+
"""
|
|
203
|
+
self._feature_to_idx_dict = feature_to_idx_dict
|
|
204
|
+
self._number_of_features = sum(
|
|
205
|
+
[
|
|
206
|
+
len(feature_values.values())
|
|
207
|
+
for feature_values in self._feature_to_idx_dict.values()
|
|
208
|
+
]
|
|
209
|
+
)
|
|
210
|
+
if check_consistency_with_config:
|
|
211
|
+
known_features = set(self._feature_to_idx_dict.keys())
|
|
212
|
+
not_in_config = known_features.difference(
|
|
213
|
+
(
|
|
214
|
+
(window_idx, feature_name)
|
|
215
|
+
for window_idx, feature_names in enumerate(self._feature_config)
|
|
216
|
+
for feature_name in feature_names
|
|
217
|
+
)
|
|
218
|
+
)
|
|
219
|
+
if not_in_config:
|
|
220
|
+
rasa.shared.utils.io.raise_warning(
|
|
221
|
+
f"A feature to index mapping has been loaded that does not match "
|
|
222
|
+
f"the configured features. The given mapping configures "
|
|
223
|
+
f" (position in window, feature_name): {not_in_config}. "
|
|
224
|
+
f" These are not specified in the given config "
|
|
225
|
+
f" {self._feature_config}. "
|
|
226
|
+
f"Continuing with constant values for these features. "
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
def train(self, training_data: TrainingData) -> Resource:
|
|
230
|
+
"""Trains the featurizer.
|
|
231
|
+
|
|
232
|
+
Args:
|
|
233
|
+
training_data: the training data
|
|
234
|
+
|
|
235
|
+
Returns:
|
|
236
|
+
the resource from which this trained component can be loaded
|
|
237
|
+
"""
|
|
238
|
+
self.warn_if_pos_features_cannot_be_computed(training_data)
|
|
239
|
+
feature_to_idx_dict = self._create_feature_to_idx_dict(training_data)
|
|
240
|
+
self._set_feature_to_idx_dict(feature_to_idx_dict=feature_to_idx_dict)
|
|
241
|
+
if not self._feature_to_idx_dict:
|
|
242
|
+
rasa.shared.utils.io.raise_warning(
|
|
243
|
+
"No lexical syntactic features could be extracted from the training "
|
|
244
|
+
"data. In order for this component to work you need to define "
|
|
245
|
+
"`features` that can be found in the given training data."
|
|
246
|
+
)
|
|
247
|
+
self.persist()
|
|
248
|
+
return self._resource
|
|
249
|
+
|
|
250
|
+
def warn_if_pos_features_cannot_be_computed(
|
|
251
|
+
self, training_data: TrainingData
|
|
252
|
+
) -> None:
|
|
253
|
+
"""Warn if part-of-speech features are needed but not given."""
|
|
254
|
+
training_example = next(
|
|
255
|
+
(
|
|
256
|
+
message
|
|
257
|
+
for message in training_data.training_examples
|
|
258
|
+
if message.get(TOKENS_NAMES[TEXT], [])
|
|
259
|
+
),
|
|
260
|
+
Message(),
|
|
261
|
+
)
|
|
262
|
+
tokens_example = training_example.get(TOKENS_NAMES[TEXT], [])
|
|
263
|
+
|
|
264
|
+
configured_feature_names = set(
|
|
265
|
+
feature_name
|
|
266
|
+
for pos_config in self._feature_config
|
|
267
|
+
for feature_name in pos_config
|
|
268
|
+
)
|
|
269
|
+
if {"pos", "pos2"}.intersection(
|
|
270
|
+
configured_feature_names
|
|
271
|
+
) and not tokens_example[0].data.get(POS_TAG_KEY, []):
|
|
272
|
+
rasa.shared.utils.io.raise_warning(
|
|
273
|
+
f"Expected training data to include tokens with part-of-speech tags"
|
|
274
|
+
f"because the given configuration includes part-of-speech features "
|
|
275
|
+
f"`pos` and/or `pos2`. "
|
|
276
|
+
f"Please add a {SpacyTokenizer.__name__} to your "
|
|
277
|
+
f"configuration if you want to use the part-of-speech-features in the"
|
|
278
|
+
f"{self.__class__.__name__}. "
|
|
279
|
+
f"Continuing without the part-of-speech-features."
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
def _create_feature_to_idx_dict(
|
|
283
|
+
self, training_data: TrainingData
|
|
284
|
+
) -> Dict[Tuple[int, Text], Dict[Text, int]]:
|
|
285
|
+
"""Create a nested dictionary of all feature values.
|
|
286
|
+
|
|
287
|
+
Returns:
|
|
288
|
+
a nested mapping that maps from tuples of positions (in the window) and
|
|
289
|
+
supported feature names to "raw feature to index" mappings, i.e.
|
|
290
|
+
mappings that map the respective raw feature values to unique indices
|
|
291
|
+
(where `unique` means unique with respect to all indices in the
|
|
292
|
+
*nested* mapping)
|
|
293
|
+
"""
|
|
294
|
+
# collect all raw feature values
|
|
295
|
+
feature_vocabulary: Dict[Tuple[int, Text], Set[Text]] = dict()
|
|
296
|
+
for example in training_data.training_examples:
|
|
297
|
+
tokens = example.get(TOKENS_NAMES[TEXT], [])
|
|
298
|
+
sentence_features = self._map_tokens_to_raw_features(tokens)
|
|
299
|
+
for token_features in sentence_features:
|
|
300
|
+
for position_and_feature_name, feature_value in token_features.items():
|
|
301
|
+
feature_vocabulary.setdefault(position_and_feature_name, set()).add(
|
|
302
|
+
feature_value
|
|
303
|
+
)
|
|
304
|
+
# assign a unique index to each feature value
|
|
305
|
+
return self._build_feature_to_index_map(feature_vocabulary)
|
|
306
|
+
|
|
307
|
+
def _map_tokens_to_raw_features(
|
|
308
|
+
self, tokens: List[Token]
|
|
309
|
+
) -> List[Dict[Tuple[int, Text], Text]]:
|
|
310
|
+
"""Extracts the raw feature values.
|
|
311
|
+
|
|
312
|
+
Args:
|
|
313
|
+
tokens: a tokenized text
|
|
314
|
+
Returns:
|
|
315
|
+
a list of feature dictionaries for each token in the given list
|
|
316
|
+
where each feature dictionary maps a tuple containing
|
|
317
|
+
- a position (in the window) and
|
|
318
|
+
- a supported feature name
|
|
319
|
+
to the corresponding raw feature value
|
|
320
|
+
"""
|
|
321
|
+
sentence_features = []
|
|
322
|
+
|
|
323
|
+
# in case of an even number we will look at one more word before,
|
|
324
|
+
# e.g. window size 4 will result in a window range of
|
|
325
|
+
# [-2, -1, 0, 1] (0 = current word in sentence)
|
|
326
|
+
window_size = len(self._feature_config)
|
|
327
|
+
half_window_size = window_size // 2
|
|
328
|
+
window_range = range(-half_window_size, half_window_size + window_size % 2)
|
|
329
|
+
assert len(window_range) == window_size
|
|
330
|
+
|
|
331
|
+
for anchor in range(len(tokens)):
|
|
332
|
+
token_features: Dict[Tuple[int, Text], Text] = {}
|
|
333
|
+
|
|
334
|
+
for window_position, relative_position in enumerate(window_range):
|
|
335
|
+
absolute_position = anchor + relative_position
|
|
336
|
+
|
|
337
|
+
# skip, if current_idx is pointing to a non-existing token
|
|
338
|
+
if absolute_position < 0 or absolute_position >= len(tokens):
|
|
339
|
+
continue
|
|
340
|
+
|
|
341
|
+
token = tokens[absolute_position]
|
|
342
|
+
for feature_name in self._feature_config[window_position]:
|
|
343
|
+
token_features[(window_position, feature_name)] = (
|
|
344
|
+
self._extract_raw_features_from_token(
|
|
345
|
+
token=token,
|
|
346
|
+
feature_name=feature_name,
|
|
347
|
+
token_position=absolute_position,
|
|
348
|
+
num_tokens=len(tokens),
|
|
349
|
+
)
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
sentence_features.append(token_features)
|
|
353
|
+
|
|
354
|
+
return sentence_features
|
|
355
|
+
|
|
356
|
+
@staticmethod
|
|
357
|
+
def _build_feature_to_index_map(
|
|
358
|
+
feature_vocabulary: Dict[Tuple[int, Text], Set[Text]],
|
|
359
|
+
) -> Dict[Tuple[int, Text], Dict[Text, int]]:
|
|
360
|
+
"""Creates a nested dictionary for mapping raw features to indices.
|
|
361
|
+
|
|
362
|
+
Args:
|
|
363
|
+
feature_vocabulary: a mapping from tuples of positions (in the window) and
|
|
364
|
+
supported feature names to the set of possible feature values
|
|
365
|
+
Returns:
|
|
366
|
+
a nested mapping that maps from tuples of positions (in the window) and
|
|
367
|
+
supported feature names to "raw feature to index" mappings, i.e.
|
|
368
|
+
mappings that map the respective raw feature values to unique indices
|
|
369
|
+
(where `unique` means unique with respect to all indices in the
|
|
370
|
+
*nested* mapping)
|
|
371
|
+
"""
|
|
372
|
+
# Note that this will only sort the top level keys - and we keep
|
|
373
|
+
# doing it to ensure consistently with what was done before)
|
|
374
|
+
ordered_feature_vocabulary: Dict[Tuple[int, Text], Set[Text]] = OrderedDict(
|
|
375
|
+
sorted(feature_vocabulary.items())
|
|
376
|
+
)
|
|
377
|
+
|
|
378
|
+
# create the nested mapping
|
|
379
|
+
feature_to_idx_dict: Dict[Tuple[int, Text], Dict[Text, int]] = {}
|
|
380
|
+
offset = 0
|
|
381
|
+
for (
|
|
382
|
+
position_and_feature_name,
|
|
383
|
+
feature_values,
|
|
384
|
+
) in ordered_feature_vocabulary.items():
|
|
385
|
+
sorted_feature_values = sorted(feature_values)
|
|
386
|
+
feature_to_idx_dict[position_and_feature_name] = {
|
|
387
|
+
feature_value: feature_idx
|
|
388
|
+
for feature_idx, feature_value in enumerate(
|
|
389
|
+
sorted_feature_values, start=offset
|
|
390
|
+
)
|
|
391
|
+
}
|
|
392
|
+
offset += len(feature_values)
|
|
393
|
+
|
|
394
|
+
return feature_to_idx_dict
|
|
395
|
+
|
|
396
|
+
def process(self, messages: List[Message]) -> List[Message]:
|
|
397
|
+
"""Featurizes all given messages in-place.
|
|
398
|
+
|
|
399
|
+
Args:
|
|
400
|
+
messages: messages to be featurized.
|
|
401
|
+
|
|
402
|
+
Returns:
|
|
403
|
+
The same list with the same messages after featurization.
|
|
404
|
+
"""
|
|
405
|
+
for message in messages:
|
|
406
|
+
self._process_message(message)
|
|
407
|
+
return messages
|
|
408
|
+
|
|
409
|
+
def process_training_data(self, training_data: TrainingData) -> TrainingData:
|
|
410
|
+
"""Processes the training examples in the given training data in-place.
|
|
411
|
+
|
|
412
|
+
Args:
|
|
413
|
+
training_data: the training data
|
|
414
|
+
|
|
415
|
+
Returns:
|
|
416
|
+
same training data after processing
|
|
417
|
+
"""
|
|
418
|
+
self.process(training_data.training_examples)
|
|
419
|
+
return training_data
|
|
420
|
+
|
|
421
|
+
def _process_message(self, message: Message) -> None:
|
|
422
|
+
"""Featurizes the given message in-place.
|
|
423
|
+
|
|
424
|
+
Args:
|
|
425
|
+
message: a message to be featurized
|
|
426
|
+
"""
|
|
427
|
+
if not self._feature_to_idx_dict:
|
|
428
|
+
rasa.shared.utils.io.raise_warning(
|
|
429
|
+
f"The {self.__class__.__name__} {self._identifier} has not been "
|
|
430
|
+
f"trained properly yet. "
|
|
431
|
+
f"Continuing without adding features from this featurizer."
|
|
432
|
+
)
|
|
433
|
+
return
|
|
434
|
+
tokens = message.get(TOKENS_NAMES[TEXT])
|
|
435
|
+
if tokens:
|
|
436
|
+
sentence_features = self._map_tokens_to_raw_features(tokens)
|
|
437
|
+
sparse_matrix = self._map_raw_features_to_indices(sentence_features)
|
|
438
|
+
self.add_features_to_message(
|
|
439
|
+
# FIXME: create sentence feature and make `sentence` non optional
|
|
440
|
+
sequence=sparse_matrix,
|
|
441
|
+
sentence=None,
|
|
442
|
+
attribute=TEXT,
|
|
443
|
+
message=message,
|
|
444
|
+
)
|
|
445
|
+
|
|
446
|
+
def _map_raw_features_to_indices(
|
|
447
|
+
self, sentence_features: List[Dict[Tuple[int, Text], Any]]
|
|
448
|
+
) -> scipy.sparse.coo_matrix:
|
|
449
|
+
"""Converts the raw features to one-hot encodings.
|
|
450
|
+
|
|
451
|
+
Requires the "feature" to index dictionary, i.e. the featurizer must have
|
|
452
|
+
been trained.
|
|
453
|
+
|
|
454
|
+
Args:
|
|
455
|
+
sentence_features: a list of feature dictionaries where the `t`-th feature
|
|
456
|
+
dictionary maps a tuple containing
|
|
457
|
+
- a position (in the window) and
|
|
458
|
+
- a supported feature name
|
|
459
|
+
to the raw feature value extracted from the window around the `t`-th token.
|
|
460
|
+
|
|
461
|
+
Returns:
|
|
462
|
+
a sparse matrix where the `i`-th row is a multi-hot vector that encodes the
|
|
463
|
+
raw features extracted from the window around the `i`-th token
|
|
464
|
+
"""
|
|
465
|
+
rows = []
|
|
466
|
+
cols = []
|
|
467
|
+
shape = (len(sentence_features), self._number_of_features)
|
|
468
|
+
for token_idx, token_features in enumerate(sentence_features):
|
|
469
|
+
for position_and_feature_name, feature_value in token_features.items():
|
|
470
|
+
mapping = self._feature_to_idx_dict.get(position_and_feature_name)
|
|
471
|
+
if not mapping:
|
|
472
|
+
continue
|
|
473
|
+
feature_idx = mapping.get(feature_value, -1)
|
|
474
|
+
if feature_idx > -1:
|
|
475
|
+
rows.append(token_idx)
|
|
476
|
+
cols.append(feature_idx)
|
|
477
|
+
data = np.ones(len(rows))
|
|
478
|
+
return scipy.sparse.coo_matrix(
|
|
479
|
+
(data, (np.array(rows), np.array(cols))), shape=shape
|
|
480
|
+
)
|
|
481
|
+
|
|
482
|
+
@classmethod
|
|
483
|
+
def create(
|
|
484
|
+
cls,
|
|
485
|
+
config: Dict[Text, Any],
|
|
486
|
+
model_storage: ModelStorage,
|
|
487
|
+
resource: Resource,
|
|
488
|
+
execution_context: ExecutionContext,
|
|
489
|
+
) -> LexicalSyntacticFeaturizer:
|
|
490
|
+
"""Creates a new untrained component (see parent class for full docstring)."""
|
|
491
|
+
return cls(config, model_storage, resource, execution_context)
|
|
492
|
+
|
|
493
|
+
@staticmethod
|
|
494
|
+
def _restructure_feature_to_idx_dict(
|
|
495
|
+
loaded_data: Dict[str, Dict[str, int]],
|
|
496
|
+
) -> Dict[Tuple[int, str], Dict[str, int]]:
|
|
497
|
+
"""Reconstructs the feature to idx dict.
|
|
498
|
+
|
|
499
|
+
When storing the feature_to_idx_dict to disk, we need to convert the tuple (key)
|
|
500
|
+
into a string to be able to store it via json. When loading the data
|
|
501
|
+
we need to reconstruct the tuple from the stored string.
|
|
502
|
+
|
|
503
|
+
Args:
|
|
504
|
+
loaded_data: The loaded feature to idx dict from file.
|
|
505
|
+
|
|
506
|
+
Returns:
|
|
507
|
+
The reconstructed feature_to_idx_dict
|
|
508
|
+
"""
|
|
509
|
+
feature_to_idx_dict = {}
|
|
510
|
+
for tuple_string, feature_value in loaded_data.items():
|
|
511
|
+
# Example of tuple_string: "1###low"
|
|
512
|
+
index, feature_name = tuple_string.split(SEPERATOR)
|
|
513
|
+
|
|
514
|
+
feature_key = (int(index), feature_name)
|
|
515
|
+
feature_to_idx_dict[feature_key] = feature_value
|
|
516
|
+
|
|
517
|
+
return feature_to_idx_dict
|
|
518
|
+
|
|
519
|
+
@classmethod
|
|
520
|
+
def load(
|
|
521
|
+
cls,
|
|
522
|
+
config: Dict[Text, Any],
|
|
523
|
+
model_storage: ModelStorage,
|
|
524
|
+
resource: Resource,
|
|
525
|
+
execution_context: ExecutionContext,
|
|
526
|
+
**kwargs: Any,
|
|
527
|
+
) -> LexicalSyntacticFeaturizer:
|
|
528
|
+
"""Loads trained component (see parent class for full docstring)."""
|
|
529
|
+
try:
|
|
530
|
+
with model_storage.read_from(resource) as model_path:
|
|
531
|
+
loaded_data = rasa.shared.utils.io.read_json_file(
|
|
532
|
+
model_path / cls.FILENAME_FEATURE_TO_IDX_DICT,
|
|
533
|
+
)
|
|
534
|
+
|
|
535
|
+
# convert the key back into tuple
|
|
536
|
+
feature_to_idx_dict = cls._restructure_feature_to_idx_dict(loaded_data)
|
|
537
|
+
|
|
538
|
+
return cls(
|
|
539
|
+
config=config,
|
|
540
|
+
model_storage=model_storage,
|
|
541
|
+
resource=resource,
|
|
542
|
+
execution_context=execution_context,
|
|
543
|
+
feature_to_idx_dict=feature_to_idx_dict,
|
|
544
|
+
)
|
|
545
|
+
except ValueError:
|
|
546
|
+
logger.debug(
|
|
547
|
+
f"Failed to load `{cls.__class__.__name__}` from model storage. "
|
|
548
|
+
f"Resource '{resource.name}' doesn't exist."
|
|
549
|
+
)
|
|
550
|
+
return cls(
|
|
551
|
+
config=config,
|
|
552
|
+
model_storage=model_storage,
|
|
553
|
+
resource=resource,
|
|
554
|
+
execution_context=execution_context,
|
|
555
|
+
)
|
|
556
|
+
|
|
557
|
+
def persist(self) -> None:
|
|
558
|
+
"""Persist this model (see parent class for full docstring)."""
|
|
559
|
+
if not self._feature_to_idx_dict:
|
|
560
|
+
return None
|
|
561
|
+
|
|
562
|
+
# as we cannot dump tuples, convert the tuple into a string
|
|
563
|
+
restructured_feature_dict = {
|
|
564
|
+
f"{k[0]}{SEPERATOR}{k[1]}": v for k, v in self._feature_to_idx_dict.items()
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
with self._model_storage.write_to(self._resource) as model_path:
|
|
568
|
+
rasa.shared.utils.io.dump_obj_as_json_to_file(
|
|
569
|
+
model_path / self.FILENAME_FEATURE_TO_IDX_DICT,
|
|
570
|
+
restructured_feature_dict,
|
|
571
|
+
)
|