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
rasa/core/exporter.py
ADDED
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import uuid
|
|
3
|
+
import datetime
|
|
4
|
+
from typing import AsyncIterator, Text, Optional, List, Set, Dict, Any
|
|
5
|
+
|
|
6
|
+
from tqdm import tqdm
|
|
7
|
+
|
|
8
|
+
import rasa.shared.utils.cli
|
|
9
|
+
import rasa.shared.utils.io
|
|
10
|
+
from rasa.core.brokers.broker import EventBroker
|
|
11
|
+
from rasa.core.brokers.pika import PikaEventBroker
|
|
12
|
+
from rasa.core.constants import RASA_EXPORT_PROCESS_ID_HEADER_NAME
|
|
13
|
+
from rasa.core.tracker_store import TrackerStore
|
|
14
|
+
from rasa.shared.core.trackers import EventVerbosity
|
|
15
|
+
from rasa.exceptions import (
|
|
16
|
+
NoEventsToMigrateError,
|
|
17
|
+
NoConversationsInTrackerStoreError,
|
|
18
|
+
PublishingError,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class Exporter:
|
|
25
|
+
"""Manages the publishing of events in a tracker store to an event broker.
|
|
26
|
+
|
|
27
|
+
Attributes:
|
|
28
|
+
endpoints_path: Path to the endpoints file used to configure the event
|
|
29
|
+
broker and tracker store. If `None`, the default path ('endpoints.yml')
|
|
30
|
+
is used.
|
|
31
|
+
tracker_store: `TrackerStore` to export conversations from.
|
|
32
|
+
event_broker: `EventBroker` to export conversations to.
|
|
33
|
+
requested_conversation_ids: List of conversation IDs requested to be
|
|
34
|
+
processed.
|
|
35
|
+
minimum_timestamp: Minimum timestamp of events that are published.
|
|
36
|
+
If `None`, apply no such constraint.
|
|
37
|
+
maximum_timestamp: Maximum timestamp of events that are published.
|
|
38
|
+
If `None`, apply no such constraint.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def __init__(
|
|
42
|
+
self,
|
|
43
|
+
tracker_store: TrackerStore,
|
|
44
|
+
event_broker: EventBroker,
|
|
45
|
+
endpoints_path: Text,
|
|
46
|
+
requested_conversation_ids: Optional[Text] = None,
|
|
47
|
+
minimum_timestamp: Optional[float] = None,
|
|
48
|
+
maximum_timestamp: Optional[float] = None,
|
|
49
|
+
offset_timestamps_by_seconds: Optional[int] = None,
|
|
50
|
+
) -> None:
|
|
51
|
+
self.endpoints_path = endpoints_path
|
|
52
|
+
self.tracker_store = tracker_store
|
|
53
|
+
|
|
54
|
+
self.event_broker = event_broker
|
|
55
|
+
self.requested_conversation_ids = requested_conversation_ids
|
|
56
|
+
self.minimum_timestamp = minimum_timestamp
|
|
57
|
+
self.maximum_timestamp = maximum_timestamp
|
|
58
|
+
self.offset_timestamps_by_seconds = offset_timestamps_by_seconds
|
|
59
|
+
|
|
60
|
+
async def publish_events(self) -> int:
|
|
61
|
+
"""Publish events in a tracker store using an event broker.
|
|
62
|
+
|
|
63
|
+
Exits if the publishing of events is interrupted due to an error. In that case,
|
|
64
|
+
the CLI command to continue the export where it was interrupted is printed.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
The number of successfully published events.
|
|
68
|
+
"""
|
|
69
|
+
self._print_offset_info()
|
|
70
|
+
|
|
71
|
+
published_events = 0
|
|
72
|
+
current_timestamp = None
|
|
73
|
+
|
|
74
|
+
headers = self._get_message_headers()
|
|
75
|
+
|
|
76
|
+
async for event in self._fetch_events_within_time_range():
|
|
77
|
+
# noinspection PyBroadException
|
|
78
|
+
try:
|
|
79
|
+
self._publish_with_message_headers(event, headers)
|
|
80
|
+
published_events += 1
|
|
81
|
+
current_timestamp = event["timestamp"]
|
|
82
|
+
except Exception as e:
|
|
83
|
+
logger.exception(e)
|
|
84
|
+
raise PublishingError(current_timestamp)
|
|
85
|
+
|
|
86
|
+
await self.event_broker.close()
|
|
87
|
+
|
|
88
|
+
return published_events
|
|
89
|
+
|
|
90
|
+
def _print_offset_info(self) -> None:
|
|
91
|
+
"""Output information about the offset applied to event timestamps."""
|
|
92
|
+
if self.offset_timestamps_by_seconds is None:
|
|
93
|
+
return
|
|
94
|
+
|
|
95
|
+
delta = datetime.timedelta(seconds=abs(self.offset_timestamps_by_seconds))
|
|
96
|
+
operator = "-" if self.offset_timestamps_by_seconds > 0 else ""
|
|
97
|
+
rasa.shared.utils.cli.print_info(
|
|
98
|
+
f"All event timestamps will be offset by {operator}{delta}! ⏰"
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
def _get_message_headers(self) -> Optional[Dict[Text, Text]]:
|
|
102
|
+
"""Generate a message header for publishing events to a `PikaEventBroker`.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Message headers with a randomly generated uuid under the
|
|
106
|
+
`RASA_EXPORT_PROCESS_ID_HEADER_NAME` key if `self.event_broker` is a
|
|
107
|
+
`PikaEventBroker`, else `None`.
|
|
108
|
+
|
|
109
|
+
"""
|
|
110
|
+
if isinstance(self.event_broker, PikaEventBroker):
|
|
111
|
+
return {RASA_EXPORT_PROCESS_ID_HEADER_NAME: uuid.uuid4().hex}
|
|
112
|
+
|
|
113
|
+
return None
|
|
114
|
+
|
|
115
|
+
def _publish_with_message_headers(
|
|
116
|
+
self, original_event: Dict[Text, Any], headers: Optional[Dict[Text, Text]]
|
|
117
|
+
) -> None:
|
|
118
|
+
"""Publish `event` to a message broker with `headers`.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
original_event: Serialized event to be published.
|
|
122
|
+
headers: Message headers to be published if `self.event_broker` is a
|
|
123
|
+
`PikaEventBroker`.
|
|
124
|
+
|
|
125
|
+
"""
|
|
126
|
+
if self.offset_timestamps_by_seconds is not None:
|
|
127
|
+
event = dict(original_event)
|
|
128
|
+
event["timestamp"] += self.offset_timestamps_by_seconds
|
|
129
|
+
else:
|
|
130
|
+
event = original_event
|
|
131
|
+
|
|
132
|
+
if isinstance(self.event_broker, PikaEventBroker):
|
|
133
|
+
self.event_broker.publish(event=event, headers=headers)
|
|
134
|
+
else:
|
|
135
|
+
self.event_broker.publish(event)
|
|
136
|
+
|
|
137
|
+
async def _get_conversation_ids_in_tracker(self) -> Set[Text]:
|
|
138
|
+
"""Fetch conversation IDs in `self.tracker_store`.
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
A set of conversation IDs in `self.tracker_store`.
|
|
142
|
+
|
|
143
|
+
Raises:
|
|
144
|
+
`NoConversationsInTrackerStoreError` if
|
|
145
|
+
`conversation_ids_in_tracker_store` is empty.
|
|
146
|
+
|
|
147
|
+
"""
|
|
148
|
+
conversation_ids_in_tracker_store = set(await self.tracker_store.keys())
|
|
149
|
+
|
|
150
|
+
if conversation_ids_in_tracker_store:
|
|
151
|
+
return conversation_ids_in_tracker_store
|
|
152
|
+
|
|
153
|
+
raise NoConversationsInTrackerStoreError(
|
|
154
|
+
"Could not find any conversations in connected tracker store. "
|
|
155
|
+
"Please validate your `endpoints.yml` and make sure the defined "
|
|
156
|
+
"tracker store exists. Exiting."
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
def _validate_all_requested_ids_exist(
|
|
160
|
+
self, conversation_ids_in_tracker_store: Set[Text]
|
|
161
|
+
) -> None:
|
|
162
|
+
"""Warn user if `self.requested_conversation_ids` contains IDs not found in
|
|
163
|
+
`conversation_ids_in_tracker_store`.
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
conversation_ids_in_tracker_store: Set of conversation IDs contained in
|
|
167
|
+
the tracker store.
|
|
168
|
+
|
|
169
|
+
"""
|
|
170
|
+
missing_ids_in_tracker_store = (
|
|
171
|
+
set(self.requested_conversation_ids) - conversation_ids_in_tracker_store
|
|
172
|
+
)
|
|
173
|
+
if missing_ids_in_tracker_store:
|
|
174
|
+
rasa.shared.utils.cli.print_warning(
|
|
175
|
+
f"Could not find the following requested "
|
|
176
|
+
f"conversation IDs in connected tracker store: "
|
|
177
|
+
f"{', '.join(sorted(missing_ids_in_tracker_store))}"
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
async def _get_conversation_ids_to_process(self) -> Set[Text]:
|
|
181
|
+
"""Get conversation IDs that are good for processing.
|
|
182
|
+
|
|
183
|
+
Finds the intersection of events that are contained in the tracker store with
|
|
184
|
+
those events requested as a command-line argument.
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
Conversation IDs that are both requested and contained in the tracker
|
|
188
|
+
store. If no conversation IDs are requested, all conversation IDs in the
|
|
189
|
+
tracker store are returned.
|
|
190
|
+
|
|
191
|
+
"""
|
|
192
|
+
conversation_ids_in_tracker_store = (
|
|
193
|
+
await self._get_conversation_ids_in_tracker()
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
if not self.requested_conversation_ids:
|
|
197
|
+
return conversation_ids_in_tracker_store
|
|
198
|
+
|
|
199
|
+
self._validate_all_requested_ids_exist(conversation_ids_in_tracker_store)
|
|
200
|
+
|
|
201
|
+
conversation_ids_to_process = conversation_ids_in_tracker_store & set(
|
|
202
|
+
self.requested_conversation_ids
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
if not conversation_ids_to_process:
|
|
206
|
+
raise NoEventsToMigrateError(
|
|
207
|
+
"Could not find an overlap between the requested "
|
|
208
|
+
"conversation IDs and those found in the tracker store. Exiting."
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
return conversation_ids_to_process
|
|
212
|
+
|
|
213
|
+
async def _fetch_events_within_time_range(self) -> AsyncIterator[Dict[Text, Any]]:
|
|
214
|
+
"""Fetch all events for `conversation_ids` within the supplied time range.
|
|
215
|
+
|
|
216
|
+
Returns:
|
|
217
|
+
Serialized events with added `sender_id` field.
|
|
218
|
+
|
|
219
|
+
"""
|
|
220
|
+
conversation_ids_to_process = await self._get_conversation_ids_to_process()
|
|
221
|
+
|
|
222
|
+
rasa.shared.utils.cli.print_info(
|
|
223
|
+
f"Fetching events for {len(conversation_ids_to_process)} "
|
|
224
|
+
f"conversation IDs:"
|
|
225
|
+
)
|
|
226
|
+
for conversation_id in tqdm(conversation_ids_to_process, "conversation IDs"):
|
|
227
|
+
tracker = await self.tracker_store.retrieve_full_tracker(conversation_id)
|
|
228
|
+
if not tracker:
|
|
229
|
+
logger.info(
|
|
230
|
+
f"Could not retrieve tracker for conversation ID "
|
|
231
|
+
f"'{conversation_id}'. Skipping."
|
|
232
|
+
)
|
|
233
|
+
continue
|
|
234
|
+
|
|
235
|
+
_events = tracker.current_state(EventVerbosity.ALL)["events"]
|
|
236
|
+
|
|
237
|
+
if not _events:
|
|
238
|
+
logger.info(
|
|
239
|
+
f"No events to migrate for conversation ID '{conversation_id}'."
|
|
240
|
+
)
|
|
241
|
+
continue
|
|
242
|
+
|
|
243
|
+
events = self._get_events_for_conversation_id(_events, conversation_id)
|
|
244
|
+
|
|
245
|
+
# the order of events was changed after ATO-2192
|
|
246
|
+
# more context: https://github.com/RasaHQ/rasa/pull/13019
|
|
247
|
+
# we should sort the events by timestamp to keep the order
|
|
248
|
+
events.sort(key=lambda x: x["timestamp"])
|
|
249
|
+
|
|
250
|
+
# the conversation IDs are needed in the event publishing
|
|
251
|
+
for event in events:
|
|
252
|
+
if (
|
|
253
|
+
self.minimum_timestamp is not None
|
|
254
|
+
and event["timestamp"] < self.minimum_timestamp
|
|
255
|
+
):
|
|
256
|
+
continue
|
|
257
|
+
if (
|
|
258
|
+
self.maximum_timestamp is not None
|
|
259
|
+
and event["timestamp"] >= self.maximum_timestamp
|
|
260
|
+
):
|
|
261
|
+
continue
|
|
262
|
+
yield event
|
|
263
|
+
|
|
264
|
+
@staticmethod
|
|
265
|
+
def _get_events_for_conversation_id(
|
|
266
|
+
events: List[Dict[Text, Any]], conversation_id: Text
|
|
267
|
+
) -> List[Dict[Text, Any]]:
|
|
268
|
+
"""Get serialised events with added `sender_id` key.
|
|
269
|
+
|
|
270
|
+
Args:
|
|
271
|
+
events: Events to modify.
|
|
272
|
+
conversation_id: Conversation ID to add to events.
|
|
273
|
+
|
|
274
|
+
Returns:
|
|
275
|
+
Events with added `sender_id` key.
|
|
276
|
+
|
|
277
|
+
"""
|
|
278
|
+
events_with_conversation_id = []
|
|
279
|
+
|
|
280
|
+
for event in events:
|
|
281
|
+
event["sender_id"] = conversation_id
|
|
282
|
+
events_with_conversation_id.append(event)
|
|
283
|
+
|
|
284
|
+
return events_with_conversation_id
|
|
File without changes
|
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import Optional, Text, Dict, List, Union, Iterable, Any
|
|
3
|
+
from collections.abc import ValuesView, KeysView
|
|
4
|
+
|
|
5
|
+
from rasa.engine.graph import GraphComponent
|
|
6
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
7
|
+
from rasa.engine.storage.resource import Resource
|
|
8
|
+
from rasa.engine.graph import ExecutionContext
|
|
9
|
+
from rasa.shared.core.domain import Domain, SubState
|
|
10
|
+
from rasa.shared.core.events import ActionExecuted, UserUttered, Event
|
|
11
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
12
|
+
from rasa.shared.core.training_data.structures import StoryGraph
|
|
13
|
+
from rasa.shared.nlu.constants import ACTION_NAME, ACTION_TEXT, INTENT, TEXT
|
|
14
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
15
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
16
|
+
from rasa.shared.nlu.training_data.features import Features
|
|
17
|
+
import rasa.shared.utils.io
|
|
18
|
+
|
|
19
|
+
# TODO: make precomputations (MessageContainerForCoreFeaturization) cacheable
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class MessageContainerForCoreFeaturization:
|
|
23
|
+
"""A key-value store for specific `Messages`.
|
|
24
|
+
|
|
25
|
+
This container can be only be used to store messages that contain exactly
|
|
26
|
+
one of the following attributes: `ACTION_NAME`, `ACTION_TEXT`, `TEXT`, or `INTENT`.
|
|
27
|
+
A combination of the key attribute and the corresponding value will be used as
|
|
28
|
+
key for the respective message.
|
|
29
|
+
|
|
30
|
+
Background/Motivation:
|
|
31
|
+
- Our policies only require these attributes to be tokenized and/or featurized
|
|
32
|
+
via NLU graph components, which is why we don't care about storing anything else.
|
|
33
|
+
- Our tokenizers and featurizers work independently for each attribute,
|
|
34
|
+
which is why we can separate them and ask for "exactly one" of the key
|
|
35
|
+
attributes.
|
|
36
|
+
- Our tokenizers add attributes (e.g. token sequences) and not just `Features`,
|
|
37
|
+
which is why we need messages and why we allow messages to contain more than
|
|
38
|
+
just the key attributes.
|
|
39
|
+
- Due to the way we use this datastructure, it won't contain all features that the
|
|
40
|
+
policies need (cf. `rasa.core.featurizers.SingleStateFeaturizer`) and sometimes
|
|
41
|
+
the messages will contain no features at all, which is the motivation for the
|
|
42
|
+
name of this class.
|
|
43
|
+
- Values for different attributes might coincide (e.g. 'greet' can appear as user
|
|
44
|
+
text as well as name of an intent), but attributes are not all tokenized and
|
|
45
|
+
featurized in the same way, which is why we use the combination of key attribute
|
|
46
|
+
and value to identify a message.
|
|
47
|
+
|
|
48
|
+
Usage:
|
|
49
|
+
- At the start of core's featurization pipeline, we use this container to
|
|
50
|
+
de-duplicate the given story data during training (e.g. "Hello" might appear very
|
|
51
|
+
often but it will end up in the training data only once) and to de-duplicate
|
|
52
|
+
the data given in the tracker (e.g. if a text appears repeatedly in the
|
|
53
|
+
dialogue, it will only be featurized once later).
|
|
54
|
+
See: `rasa.core.featurizers.precomputation.CoreFeaturizationInputConverter`.
|
|
55
|
+
- At the end of core's featurization pipeline, we wrap all resulting
|
|
56
|
+
(training data) messages into this container again.
|
|
57
|
+
See: `rasa.core.featurizers.precomputation.CoreFeaturizationCollector`.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
KEY_ATTRIBUTES = [ACTION_NAME, ACTION_TEXT, TEXT, INTENT] # noqa: RUF012
|
|
61
|
+
|
|
62
|
+
def __init__(self) -> None:
|
|
63
|
+
"""Creates an empty container for precomputations."""
|
|
64
|
+
self._table: Dict[Text, Dict[Text, Message]] = {
|
|
65
|
+
key: {} for key in self.KEY_ATTRIBUTES
|
|
66
|
+
}
|
|
67
|
+
self._num_collisions_ignored = 0
|
|
68
|
+
|
|
69
|
+
def fingerprint(self) -> Text:
|
|
70
|
+
"""Fingerprint the container.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
hex string as a fingerprint of the container.
|
|
74
|
+
"""
|
|
75
|
+
message_fingerprints = [
|
|
76
|
+
message.fingerprint() for message in self.all_messages()
|
|
77
|
+
]
|
|
78
|
+
return rasa.shared.utils.io.deep_container_fingerprint(message_fingerprints)
|
|
79
|
+
|
|
80
|
+
def __repr__(self) -> Text:
|
|
81
|
+
return f"{self.__class__.__name__}({self._table})"
|
|
82
|
+
|
|
83
|
+
def __len__(self) -> int:
|
|
84
|
+
return sum(
|
|
85
|
+
len(key_attribute_table) for key_attribute_table in self._table.values()
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
def messages(self, key_attribute: Optional[Text] = None) -> ValuesView:
|
|
89
|
+
"""Returns a view of all messages."""
|
|
90
|
+
if key_attribute not in self._table:
|
|
91
|
+
raise ValueError(
|
|
92
|
+
f"Expected key attribute (i.e. one of {self.KEY_ATTRIBUTES}) "
|
|
93
|
+
f"but received {key_attribute}."
|
|
94
|
+
)
|
|
95
|
+
return self._table[key_attribute].values()
|
|
96
|
+
|
|
97
|
+
def all_messages(self) -> List[Message]:
|
|
98
|
+
"""Returns a list containing all messages."""
|
|
99
|
+
return [
|
|
100
|
+
message
|
|
101
|
+
for key_attribute_table in self._table.values()
|
|
102
|
+
for message in key_attribute_table.values()
|
|
103
|
+
]
|
|
104
|
+
|
|
105
|
+
def keys(self, key_attribute: Text) -> KeysView:
|
|
106
|
+
"""Returns a view of the value keys for the given key attribute."""
|
|
107
|
+
if key_attribute not in self._table:
|
|
108
|
+
raise ValueError(
|
|
109
|
+
f"Expected key attribute (i.e. one of {self.KEY_ATTRIBUTES}) "
|
|
110
|
+
f"but received {key_attribute}."
|
|
111
|
+
)
|
|
112
|
+
return self._table[key_attribute].keys()
|
|
113
|
+
|
|
114
|
+
@property
|
|
115
|
+
def num_collisions_ignored(self) -> int:
|
|
116
|
+
"""Returns the number of collisions that have been ignored."""
|
|
117
|
+
return self._num_collisions_ignored
|
|
118
|
+
|
|
119
|
+
def add(self, message_with_one_key_attribute: Message) -> None:
|
|
120
|
+
"""Adds the given message if it is not already present.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
message_with_one_key_attribute: The message we want to add to the lookup
|
|
124
|
+
table. It must have exactly one key attribute.
|
|
125
|
+
|
|
126
|
+
Raises:
|
|
127
|
+
`ValueError` if the given message does not contain exactly one key
|
|
128
|
+
attribute or if there is a collision with a message that has a different
|
|
129
|
+
hash value
|
|
130
|
+
"""
|
|
131
|
+
# extract the key pair
|
|
132
|
+
attributes = message_with_one_key_attribute.data.keys()
|
|
133
|
+
key_attributes = set(attributes).intersection(self.KEY_ATTRIBUTES)
|
|
134
|
+
if not key_attributes or len(key_attributes) != 1:
|
|
135
|
+
raise ValueError(
|
|
136
|
+
f"Expected exactly one attribute out of "
|
|
137
|
+
f"{self.KEY_ATTRIBUTES} but received {len(attributes)} attributes "
|
|
138
|
+
f"({attributes})."
|
|
139
|
+
)
|
|
140
|
+
key_attribute = list(key_attributes)[0] # noqa: RUF015
|
|
141
|
+
key_value = str(message_with_one_key_attribute.data[key_attribute])
|
|
142
|
+
# extract the message
|
|
143
|
+
existing_message = self._table[key_attribute].get(key_value)
|
|
144
|
+
if existing_message is not None:
|
|
145
|
+
if hash(existing_message) != hash(message_with_one_key_attribute):
|
|
146
|
+
raise ValueError(
|
|
147
|
+
f"Expected added message to be consistent. "
|
|
148
|
+
f"({key_attribute}, {key_value}) already maps "
|
|
149
|
+
f"to {existing_message}, but we want to add "
|
|
150
|
+
f"{message_with_one_key_attribute} now."
|
|
151
|
+
)
|
|
152
|
+
else:
|
|
153
|
+
self._num_collisions_ignored += 1
|
|
154
|
+
else:
|
|
155
|
+
self._table[key_attribute][key_value] = message_with_one_key_attribute
|
|
156
|
+
|
|
157
|
+
def add_all(self, messages_with_one_key_attribute: List[Message]) -> None:
|
|
158
|
+
"""Adds the given messages.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
messages_with_one_key_attribute: The messages that we want to add.
|
|
162
|
+
Each one must have exactly one key attribute.
|
|
163
|
+
|
|
164
|
+
Raises:
|
|
165
|
+
`ValueError` if we cannot create a key for the given message or if there is
|
|
166
|
+
a collisions with a message that has a different hash value
|
|
167
|
+
"""
|
|
168
|
+
for message in messages_with_one_key_attribute:
|
|
169
|
+
self.add(message)
|
|
170
|
+
|
|
171
|
+
def collect_features(
|
|
172
|
+
self, sub_state: SubState, attributes: Optional[Iterable[Text]] = None
|
|
173
|
+
) -> Dict[Text, List[Features]]:
|
|
174
|
+
"""Collects features for all attributes in the given substate.
|
|
175
|
+
|
|
176
|
+
There might be be multiple messages in the container that contain features
|
|
177
|
+
relevant for the given substate, e.g. this is the case if `TEXT` and
|
|
178
|
+
`INTENT` are present in the given substate. All of those messages will be
|
|
179
|
+
collected and their features combined.
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
sub_state: substate for which we want to extract the relevent features
|
|
183
|
+
attributes: if not `None`, this specifies the list of the attributes of the
|
|
184
|
+
`Features` that we're interested in (i.e. all other `Features` contained
|
|
185
|
+
in the relevant messages will be ignored)
|
|
186
|
+
|
|
187
|
+
Returns:
|
|
188
|
+
a dictionary that maps all the (requested) attributes to a list of `Features`
|
|
189
|
+
|
|
190
|
+
Raises:
|
|
191
|
+
`ValueError`: if there exists some key pair (i.e. key attribute and
|
|
192
|
+
corresponding value) from the given substate cannot be found
|
|
193
|
+
`RuntimeError`: if features for the same attribute are found in two
|
|
194
|
+
different messages that are associated with the given substate
|
|
195
|
+
"""
|
|
196
|
+
# If we specify a list of attributes, then we want a dict with one entry
|
|
197
|
+
# for each attribute back - even if the corresponding list of features is empty.
|
|
198
|
+
features: Dict[Text, List[Features]] = (
|
|
199
|
+
dict()
|
|
200
|
+
if attributes is None
|
|
201
|
+
else {attribute: [] for attribute in attributes}
|
|
202
|
+
)
|
|
203
|
+
# collect all relevant key attributes
|
|
204
|
+
key_attributes = set(sub_state.keys()).intersection(self.KEY_ATTRIBUTES)
|
|
205
|
+
for key_attribute in key_attributes:
|
|
206
|
+
key_value = str(sub_state[key_attribute])
|
|
207
|
+
message = self._table[key_attribute].get(key_value)
|
|
208
|
+
if not message:
|
|
209
|
+
raise ValueError(
|
|
210
|
+
f"Unknown key ({key_attribute},{key_value}). Cannot retrieve "
|
|
211
|
+
f"features for substate {sub_state}"
|
|
212
|
+
)
|
|
213
|
+
features_from_message = Features.groupby_attribute(
|
|
214
|
+
message.features, attributes=attributes
|
|
215
|
+
)
|
|
216
|
+
for feat_attribute, feat_value in features_from_message.items():
|
|
217
|
+
existing_values = features.get(feat_attribute)
|
|
218
|
+
# Note: the following if-s are needed because if we specify a list of
|
|
219
|
+
# attributes then `features_from_message` will contain one entry per
|
|
220
|
+
# attribute even if the corresponding feature list is empty.
|
|
221
|
+
if feat_value and existing_values:
|
|
222
|
+
raise RuntimeError(
|
|
223
|
+
f"Feature for attribute {feat_attribute} has already been "
|
|
224
|
+
f"extracted from a different message stored under a key "
|
|
225
|
+
f"in {key_attributes} "
|
|
226
|
+
f"that is different from {key_attribute}. This means there's a "
|
|
227
|
+
f"redundancy in the message container."
|
|
228
|
+
)
|
|
229
|
+
if feat_value:
|
|
230
|
+
features[feat_attribute] = feat_value
|
|
231
|
+
return features
|
|
232
|
+
|
|
233
|
+
def lookup_message(self, user_text: Text) -> Message:
|
|
234
|
+
"""Returns a message that contains the given user text.
|
|
235
|
+
|
|
236
|
+
Args:
|
|
237
|
+
user_text: the text of a user utterance
|
|
238
|
+
Raises:
|
|
239
|
+
`ValueError` if there is no message associated with the given user text
|
|
240
|
+
"""
|
|
241
|
+
message = self._table[TEXT].get(user_text)
|
|
242
|
+
if message is None:
|
|
243
|
+
raise ValueError(
|
|
244
|
+
f"Expected a message with key ({TEXT}, {user_text}) in lookup table."
|
|
245
|
+
)
|
|
246
|
+
return message
|
|
247
|
+
|
|
248
|
+
def derive_messages_from_domain_and_add(self, domain: Domain) -> None:
|
|
249
|
+
"""Adds all lookup table entries that can be derived from the domain.
|
|
250
|
+
|
|
251
|
+
That is, all action names, action texts, and intents defined in the domain
|
|
252
|
+
will be turned into a (separate) messages and added to this lookup table.
|
|
253
|
+
|
|
254
|
+
Args:
|
|
255
|
+
domain: the domain from which we extract the substates
|
|
256
|
+
"""
|
|
257
|
+
if (
|
|
258
|
+
domain.action_texts
|
|
259
|
+
and domain.action_names_or_texts[-len(domain.action_texts) :]
|
|
260
|
+
!= domain.action_texts
|
|
261
|
+
):
|
|
262
|
+
raise NotImplementedError(
|
|
263
|
+
"We assumed that domain's `action_names_or_texts` start with a list of "
|
|
264
|
+
"all action names, followed by the action texts. "
|
|
265
|
+
"Please update the code to grab the action_name and action_texts from "
|
|
266
|
+
"the domain correctly."
|
|
267
|
+
)
|
|
268
|
+
action_texts = domain.action_texts
|
|
269
|
+
action_names = domain.action_names_or_texts[
|
|
270
|
+
slice(0, -len(domain.action_texts) if domain.action_texts else None)
|
|
271
|
+
]
|
|
272
|
+
|
|
273
|
+
for key_attribute, actions in [
|
|
274
|
+
(ACTION_NAME, action_names),
|
|
275
|
+
(ACTION_TEXT, action_texts),
|
|
276
|
+
]:
|
|
277
|
+
for action in actions:
|
|
278
|
+
self.add(Message({key_attribute: action}))
|
|
279
|
+
|
|
280
|
+
for intent in domain.intent_properties.keys():
|
|
281
|
+
self.add(Message({INTENT: intent}))
|
|
282
|
+
|
|
283
|
+
def derive_messages_from_events_and_add(self, events: Iterable[Event]) -> None:
|
|
284
|
+
"""Adds all relevant messages that can be derived from the given events.
|
|
285
|
+
|
|
286
|
+
That is, each action name, action text, user text and intent that can be
|
|
287
|
+
found in the given events will be turned into a (separate) message and added
|
|
288
|
+
to this container.
|
|
289
|
+
|
|
290
|
+
Args:
|
|
291
|
+
events: list of events to extract the substate from
|
|
292
|
+
"""
|
|
293
|
+
for event in events:
|
|
294
|
+
key_value_list = []
|
|
295
|
+
if isinstance(event, UserUttered):
|
|
296
|
+
key_value_list = [(TEXT, event.text), (INTENT, event.intent_name)]
|
|
297
|
+
elif isinstance(event, ActionExecuted):
|
|
298
|
+
key_value_list = [
|
|
299
|
+
(ACTION_TEXT, event.action_text),
|
|
300
|
+
(ACTION_NAME, event.action_name),
|
|
301
|
+
]
|
|
302
|
+
for key, value in key_value_list:
|
|
303
|
+
if value is not None:
|
|
304
|
+
self.add(Message(data={key: value}))
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
class CoreFeaturizationInputConverter(GraphComponent):
|
|
308
|
+
"""Provides data for the featurization pipeline.
|
|
309
|
+
|
|
310
|
+
During training as well as during inference, the converter de-duplicates the given
|
|
311
|
+
data (i.e. story graph or list of messages) such that each text and intent from a
|
|
312
|
+
user message and each action name and action text appears exactly once.
|
|
313
|
+
"""
|
|
314
|
+
|
|
315
|
+
@classmethod
|
|
316
|
+
def create(
|
|
317
|
+
cls,
|
|
318
|
+
config: Dict[Text, Any],
|
|
319
|
+
model_storage: ModelStorage,
|
|
320
|
+
resource: Resource,
|
|
321
|
+
execution_context: ExecutionContext,
|
|
322
|
+
) -> CoreFeaturizationInputConverter:
|
|
323
|
+
"""Creates a new instance (see parent class for full docstring)."""
|
|
324
|
+
return cls()
|
|
325
|
+
|
|
326
|
+
def convert_for_training(
|
|
327
|
+
self, domain: Domain, story_graph: StoryGraph
|
|
328
|
+
) -> TrainingData:
|
|
329
|
+
"""Creates de-duplicated training data.
|
|
330
|
+
|
|
331
|
+
Each possible user text and intent and each action name and action text
|
|
332
|
+
that can be found in the given domain and story graph appears exactly once
|
|
333
|
+
in the resulting training data. Moreover, each item is contained in a separate
|
|
334
|
+
messsage.
|
|
335
|
+
|
|
336
|
+
Args:
|
|
337
|
+
domain: the domain
|
|
338
|
+
story_graph: a story graph
|
|
339
|
+
Returns:
|
|
340
|
+
training data
|
|
341
|
+
"""
|
|
342
|
+
container = MessageContainerForCoreFeaturization()
|
|
343
|
+
|
|
344
|
+
# collect all action and user (intent-only) substates known from domain
|
|
345
|
+
container.derive_messages_from_domain_and_add(domain=domain)
|
|
346
|
+
|
|
347
|
+
# collect all substates we see in the given data
|
|
348
|
+
all_events = (
|
|
349
|
+
event
|
|
350
|
+
for step in story_graph.story_steps
|
|
351
|
+
for event in step.events
|
|
352
|
+
if isinstance(event, UserUttered)
|
|
353
|
+
# because all action names and texts are known to the domain
|
|
354
|
+
)
|
|
355
|
+
container.derive_messages_from_events_and_add(events=all_events)
|
|
356
|
+
|
|
357
|
+
# Reminder: in case of complex recipes that train CountVectorizers, we'll have
|
|
358
|
+
# to make sure that there is at least one user substate with a TEXT to ensure
|
|
359
|
+
# `CountVectorizer` is trained...
|
|
360
|
+
|
|
361
|
+
return TrainingData(training_examples=container.all_messages())
|
|
362
|
+
|
|
363
|
+
def convert_for_inference(self, tracker: DialogueStateTracker) -> List[Message]:
|
|
364
|
+
"""Creates a list of messages containing single user and action attributes.
|
|
365
|
+
|
|
366
|
+
Each possible user text and intent and each action name and action text
|
|
367
|
+
that can be found in the events of the given tracker will appear exactly once
|
|
368
|
+
in the resulting messages. Moreover, each item is contained in a separate
|
|
369
|
+
messsage.
|
|
370
|
+
|
|
371
|
+
Args:
|
|
372
|
+
tracker: a dialogue state tracker containing events
|
|
373
|
+
Returns:
|
|
374
|
+
a list of messages
|
|
375
|
+
"""
|
|
376
|
+
# Note: `tracker.applied_events()` doesn't convert any events to a different
|
|
377
|
+
# type and hence just iterating over the events is quicker than "applying"
|
|
378
|
+
# events first and then iterating over results (again).
|
|
379
|
+
container = MessageContainerForCoreFeaturization()
|
|
380
|
+
container.derive_messages_from_events_and_add(tracker.events)
|
|
381
|
+
return container.all_messages()
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
class CoreFeaturizationCollector(GraphComponent):
|
|
385
|
+
"""Collects featurized messages for use by a policy."""
|
|
386
|
+
|
|
387
|
+
@classmethod
|
|
388
|
+
def create(
|
|
389
|
+
cls,
|
|
390
|
+
config: Dict[Text, Any],
|
|
391
|
+
model_storage: ModelStorage,
|
|
392
|
+
resource: Resource,
|
|
393
|
+
execution_context: ExecutionContext,
|
|
394
|
+
) -> CoreFeaturizationCollector:
|
|
395
|
+
"""Creates a new instance (see parent class for full docstring)."""
|
|
396
|
+
return cls()
|
|
397
|
+
|
|
398
|
+
def collect(
|
|
399
|
+
self, messages: Union[TrainingData, List[Message]]
|
|
400
|
+
) -> MessageContainerForCoreFeaturization:
|
|
401
|
+
"""Collects messages."""
|
|
402
|
+
if isinstance(messages, TrainingData):
|
|
403
|
+
messages = messages.training_examples
|
|
404
|
+
# Note that the input messages had been contained in a lookup table in
|
|
405
|
+
# `StoryToTrainingDataConverter. Hence, we don't need to worry about
|
|
406
|
+
# collisions here anymore.
|
|
407
|
+
container = MessageContainerForCoreFeaturization()
|
|
408
|
+
for message in messages:
|
|
409
|
+
container.add(message)
|
|
410
|
+
return container
|