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,1262 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from abc import abstractmethod
|
|
5
|
+
from collections import defaultdict
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import (
|
|
8
|
+
Tuple,
|
|
9
|
+
List,
|
|
10
|
+
Optional,
|
|
11
|
+
Dict,
|
|
12
|
+
Text,
|
|
13
|
+
Union,
|
|
14
|
+
Any,
|
|
15
|
+
Iterator,
|
|
16
|
+
Set,
|
|
17
|
+
DefaultDict,
|
|
18
|
+
cast,
|
|
19
|
+
Type,
|
|
20
|
+
Callable,
|
|
21
|
+
ClassVar,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
import numpy as np
|
|
25
|
+
from tqdm import tqdm
|
|
26
|
+
|
|
27
|
+
import rasa.shared.core.trackers
|
|
28
|
+
import rasa.shared.utils.io
|
|
29
|
+
from rasa.core.exceptions import InvalidTrackerFeaturizerUsageError
|
|
30
|
+
from rasa.core.featurizers.precomputation import MessageContainerForCoreFeaturization
|
|
31
|
+
from rasa.core.featurizers.single_state_featurizer import SingleStateFeaturizer
|
|
32
|
+
from rasa.shared.core.constants import (
|
|
33
|
+
USER,
|
|
34
|
+
ACTION_UNLIKELY_INTENT_NAME,
|
|
35
|
+
PREVIOUS_ACTION,
|
|
36
|
+
)
|
|
37
|
+
from rasa.shared.core.domain import State, Domain
|
|
38
|
+
from rasa.shared.core.events import Event, ActionExecuted, UserUttered
|
|
39
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
40
|
+
from rasa.shared.exceptions import RasaException
|
|
41
|
+
from rasa.shared.nlu.constants import TEXT, INTENT, ENTITIES, ACTION_NAME
|
|
42
|
+
from rasa.shared.nlu.training_data.features import Features
|
|
43
|
+
from rasa.utils.tensorflow.constants import LABEL_PAD_ID
|
|
44
|
+
from rasa.utils.tensorflow.model_data import ragged_array_to_ndarray
|
|
45
|
+
|
|
46
|
+
FEATURIZER_FILE = "featurizer.json"
|
|
47
|
+
|
|
48
|
+
logger = logging.getLogger(__name__)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class InvalidStory(RasaException):
|
|
52
|
+
"""Exception that can be raised if story cannot be featurized."""
|
|
53
|
+
|
|
54
|
+
def __init__(self, message: Text) -> None:
|
|
55
|
+
"""Creates an InvalidStory exception.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
message: a custom exception message.
|
|
59
|
+
"""
|
|
60
|
+
self.message = message
|
|
61
|
+
super(InvalidStory, self).__init__()
|
|
62
|
+
|
|
63
|
+
def __str__(self) -> Text:
|
|
64
|
+
return self.message
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class TrackerFeaturizer:
|
|
68
|
+
"""Base class for actual tracker featurizers."""
|
|
69
|
+
|
|
70
|
+
# Class registry to store all subclasses
|
|
71
|
+
_registry: ClassVar[Dict[str, Type["TrackerFeaturizer"]]] = {}
|
|
72
|
+
_featurizer_type: str = "TrackerFeaturizer"
|
|
73
|
+
|
|
74
|
+
def __init__(
|
|
75
|
+
self, state_featurizer: Optional[SingleStateFeaturizer] = None
|
|
76
|
+
) -> None:
|
|
77
|
+
"""Initializes the tracker featurizer.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
state_featurizer: The state featurizer used to encode tracker states.
|
|
81
|
+
"""
|
|
82
|
+
self.state_featurizer = state_featurizer
|
|
83
|
+
|
|
84
|
+
@classmethod
|
|
85
|
+
def register(cls, featurizer_type: str) -> Callable:
|
|
86
|
+
"""Decorator to register featurizer subclasses."""
|
|
87
|
+
|
|
88
|
+
def wrapper(subclass: Type["TrackerFeaturizer"]) -> Type["TrackerFeaturizer"]:
|
|
89
|
+
cls._registry[featurizer_type] = subclass
|
|
90
|
+
# Store the type identifier in the class for serialization
|
|
91
|
+
subclass._featurizer_type = featurizer_type
|
|
92
|
+
return subclass
|
|
93
|
+
|
|
94
|
+
return wrapper
|
|
95
|
+
|
|
96
|
+
@classmethod
|
|
97
|
+
def from_dict(cls, data: Dict[str, Any]) -> "TrackerFeaturizer":
|
|
98
|
+
"""Create featurizer instance from dictionary."""
|
|
99
|
+
featurizer_type = data.pop("type")
|
|
100
|
+
|
|
101
|
+
if featurizer_type not in cls._registry:
|
|
102
|
+
raise ValueError(f"Unknown featurizer type: {featurizer_type}")
|
|
103
|
+
|
|
104
|
+
# Get the correct subclass and instantiate it
|
|
105
|
+
subclass = cls._registry[featurizer_type]
|
|
106
|
+
return subclass.create_from_dict(data)
|
|
107
|
+
|
|
108
|
+
@classmethod
|
|
109
|
+
@abstractmethod
|
|
110
|
+
def create_from_dict(cls, data: Dict[str, Any]) -> "TrackerFeaturizer":
|
|
111
|
+
"""Each subclass must implement its own creation from dict method."""
|
|
112
|
+
pass
|
|
113
|
+
|
|
114
|
+
@staticmethod
|
|
115
|
+
def _create_states(
|
|
116
|
+
tracker: DialogueStateTracker,
|
|
117
|
+
domain: Domain,
|
|
118
|
+
omit_unset_slots: bool = False,
|
|
119
|
+
ignore_rule_only_turns: bool = False,
|
|
120
|
+
rule_only_data: Optional[Dict[Text, Any]] = None,
|
|
121
|
+
) -> List[State]:
|
|
122
|
+
"""Creates states for the given tracker.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
tracker: The tracker to transform to states.
|
|
126
|
+
domain: The domain of the tracker.
|
|
127
|
+
omit_unset_slots: If `True` do not include the initial values of slots.
|
|
128
|
+
ignore_rule_only_turns: If `True` ignore dialogue turns that are present
|
|
129
|
+
only in rules.
|
|
130
|
+
rule_only_data: Slots and loops,
|
|
131
|
+
which only occur in rules but not in stories.
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
Trackers as states.
|
|
135
|
+
"""
|
|
136
|
+
return tracker.past_states(
|
|
137
|
+
domain,
|
|
138
|
+
omit_unset_slots=omit_unset_slots,
|
|
139
|
+
ignore_rule_only_turns=ignore_rule_only_turns,
|
|
140
|
+
rule_only_data=rule_only_data,
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
def _featurize_states(
|
|
144
|
+
self,
|
|
145
|
+
trackers_as_states: List[List[State]],
|
|
146
|
+
precomputations: Optional[MessageContainerForCoreFeaturization],
|
|
147
|
+
) -> List[List[Dict[Text, List[Features]]]]:
|
|
148
|
+
"""Featurizes state histories with `state_featurizer`.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
trackers_as_states: Lists of states produced by a `DialogueStateTracker`
|
|
152
|
+
instance.
|
|
153
|
+
precomputations: Contains precomputed features and attributes.
|
|
154
|
+
|
|
155
|
+
Returns:
|
|
156
|
+
Featurized tracker states.
|
|
157
|
+
"""
|
|
158
|
+
if self.state_featurizer is None:
|
|
159
|
+
return [[{}]]
|
|
160
|
+
else:
|
|
161
|
+
return [
|
|
162
|
+
[
|
|
163
|
+
self.state_featurizer.encode_state(state, precomputations)
|
|
164
|
+
for state in tracker_states
|
|
165
|
+
]
|
|
166
|
+
for tracker_states in trackers_as_states
|
|
167
|
+
]
|
|
168
|
+
|
|
169
|
+
@staticmethod
|
|
170
|
+
def _convert_labels_to_ids(
|
|
171
|
+
trackers_as_actions: List[List[Text]], domain: Domain
|
|
172
|
+
) -> np.ndarray:
|
|
173
|
+
"""Converts actions to label ids for each tracker.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
trackers_as_actions: A list of tracker labels.
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
Label IDs for each tracker
|
|
180
|
+
"""
|
|
181
|
+
# store labels in numpy arrays so that it corresponds to np arrays of input
|
|
182
|
+
# features
|
|
183
|
+
return ragged_array_to_ndarray(
|
|
184
|
+
[
|
|
185
|
+
np.array(
|
|
186
|
+
[domain.index_for_action(action) for action in tracker_actions]
|
|
187
|
+
)
|
|
188
|
+
for tracker_actions in trackers_as_actions
|
|
189
|
+
]
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
def _create_entity_tags(
|
|
193
|
+
self,
|
|
194
|
+
trackers_as_entities: List[List[Dict[Text, Any]]],
|
|
195
|
+
precomputations: Optional[MessageContainerForCoreFeaturization],
|
|
196
|
+
bilou_tagging: bool = False,
|
|
197
|
+
) -> List[List[Dict[Text, List[Features]]]]:
|
|
198
|
+
"""Featurizes extracted entities with `state_featurizer`.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
trackers_as_entities: Extracted entities from trackers.
|
|
202
|
+
precomputations: Contains precomputed features and attributes.
|
|
203
|
+
bilou_tagging: When `True` use the BILOU tagging scheme.
|
|
204
|
+
|
|
205
|
+
Returns:
|
|
206
|
+
Trackers as entity features.
|
|
207
|
+
"""
|
|
208
|
+
if self.state_featurizer is None:
|
|
209
|
+
return [[{}]]
|
|
210
|
+
else:
|
|
211
|
+
return [
|
|
212
|
+
[
|
|
213
|
+
self.state_featurizer.encode_entities(
|
|
214
|
+
entity_data, precomputations, bilou_tagging
|
|
215
|
+
)
|
|
216
|
+
for entity_data in trackers_entities
|
|
217
|
+
]
|
|
218
|
+
for trackers_entities in trackers_as_entities
|
|
219
|
+
]
|
|
220
|
+
|
|
221
|
+
@staticmethod
|
|
222
|
+
def _entity_data(event: UserUttered) -> Dict[Text, Any]:
|
|
223
|
+
"""Extracts entities from event if not using intents.
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
event: The event from which to extract entities.
|
|
227
|
+
|
|
228
|
+
Returns:
|
|
229
|
+
Event text and entities if no intent is present.
|
|
230
|
+
"""
|
|
231
|
+
# train stories support both text and intent,
|
|
232
|
+
# but if intent is present, the text is ignored
|
|
233
|
+
if event.text and not event.intent_name:
|
|
234
|
+
return {TEXT: event.text, ENTITIES: event.entities}
|
|
235
|
+
|
|
236
|
+
# input is not textual, so add empty dict
|
|
237
|
+
return {}
|
|
238
|
+
|
|
239
|
+
@staticmethod
|
|
240
|
+
def _remove_user_text_if_intent(trackers_as_states: List[List[State]]) -> None:
|
|
241
|
+
"""Deletes user text from state dictionaries if intent is present.
|
|
242
|
+
|
|
243
|
+
Only featurizing either the intent or user text is currently supported. When
|
|
244
|
+
both are present in a state, the user text is removed so that only the intent
|
|
245
|
+
is featurized.
|
|
246
|
+
|
|
247
|
+
`trackers_as_states` is modified in place.
|
|
248
|
+
|
|
249
|
+
Args:
|
|
250
|
+
trackers_as_states: States produced by a `DialogueStateTracker` instance.
|
|
251
|
+
"""
|
|
252
|
+
for states in trackers_as_states:
|
|
253
|
+
for state in states:
|
|
254
|
+
# remove text features to only use intent
|
|
255
|
+
if state.get(USER, {}).get(INTENT) and state.get(USER, {}).get(TEXT):
|
|
256
|
+
del state[USER][TEXT]
|
|
257
|
+
|
|
258
|
+
def training_states_and_labels(
|
|
259
|
+
self,
|
|
260
|
+
trackers: List[DialogueStateTracker],
|
|
261
|
+
domain: Domain,
|
|
262
|
+
omit_unset_slots: bool = False,
|
|
263
|
+
ignore_action_unlikely_intent: bool = False,
|
|
264
|
+
) -> Tuple[List[List[State]], List[List[Text]]]:
|
|
265
|
+
"""Transforms trackers to states and labels.
|
|
266
|
+
|
|
267
|
+
Args:
|
|
268
|
+
trackers: The trackers to transform.
|
|
269
|
+
domain: The domain.
|
|
270
|
+
omit_unset_slots: If `True` do not include the initial values of slots.
|
|
271
|
+
ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
|
|
272
|
+
from training states.
|
|
273
|
+
|
|
274
|
+
Returns:
|
|
275
|
+
Trackers as states and labels.
|
|
276
|
+
"""
|
|
277
|
+
(
|
|
278
|
+
trackers_as_states,
|
|
279
|
+
trackers_as_labels,
|
|
280
|
+
_,
|
|
281
|
+
) = self.training_states_labels_and_entities(
|
|
282
|
+
trackers,
|
|
283
|
+
domain,
|
|
284
|
+
omit_unset_slots=omit_unset_slots,
|
|
285
|
+
ignore_action_unlikely_intent=ignore_action_unlikely_intent,
|
|
286
|
+
)
|
|
287
|
+
return trackers_as_states, trackers_as_labels
|
|
288
|
+
|
|
289
|
+
@abstractmethod
|
|
290
|
+
def training_states_labels_and_entities(
|
|
291
|
+
self,
|
|
292
|
+
trackers: List[DialogueStateTracker],
|
|
293
|
+
domain: Domain,
|
|
294
|
+
omit_unset_slots: bool = False,
|
|
295
|
+
ignore_action_unlikely_intent: bool = False,
|
|
296
|
+
) -> Tuple[List[List[State]], List[List[Text]], List[List[Dict[Text, Any]]]]:
|
|
297
|
+
"""Transforms trackers to states, labels, and entity data.
|
|
298
|
+
|
|
299
|
+
Args:
|
|
300
|
+
trackers: The trackers to transform.
|
|
301
|
+
domain: The domain.
|
|
302
|
+
omit_unset_slots: If `True` do not include the initial values of slots.
|
|
303
|
+
ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
|
|
304
|
+
from training states.
|
|
305
|
+
|
|
306
|
+
Returns:
|
|
307
|
+
Trackers as states, labels, and entity data.
|
|
308
|
+
"""
|
|
309
|
+
raise NotImplementedError(
|
|
310
|
+
f"`{self.__class__.__name__}` should implement how to "
|
|
311
|
+
f"encode trackers as feature vectors"
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
def prepare_for_featurization(
|
|
315
|
+
self, domain: Domain, bilou_tagging: bool = False
|
|
316
|
+
) -> None:
|
|
317
|
+
"""Ensures that the featurizer is ready to be called during training.
|
|
318
|
+
|
|
319
|
+
State featurizer needs to build its vocabulary from the domain
|
|
320
|
+
for it to be ready to be used during training.
|
|
321
|
+
|
|
322
|
+
Args:
|
|
323
|
+
domain: Domain of the assistant.
|
|
324
|
+
bilou_tagging: Whether to consider bilou tagging.
|
|
325
|
+
"""
|
|
326
|
+
if self.state_featurizer is None:
|
|
327
|
+
raise InvalidTrackerFeaturizerUsageError(
|
|
328
|
+
f"Instance variable 'state_featurizer' is not set. "
|
|
329
|
+
f"During initialization set 'state_featurizer' to an instance of "
|
|
330
|
+
f"'{SingleStateFeaturizer.__class__.__name__}' class "
|
|
331
|
+
f"to get numerical features for trackers."
|
|
332
|
+
)
|
|
333
|
+
self.state_featurizer.prepare_for_training(domain, bilou_tagging)
|
|
334
|
+
|
|
335
|
+
def featurize_trackers(
|
|
336
|
+
self,
|
|
337
|
+
trackers: List[DialogueStateTracker],
|
|
338
|
+
domain: Domain,
|
|
339
|
+
precomputations: Optional[MessageContainerForCoreFeaturization],
|
|
340
|
+
bilou_tagging: bool = False,
|
|
341
|
+
ignore_action_unlikely_intent: bool = False,
|
|
342
|
+
) -> Tuple[
|
|
343
|
+
List[List[Dict[Text, List[Features]]]],
|
|
344
|
+
np.ndarray,
|
|
345
|
+
List[List[Dict[Text, List[Features]]]],
|
|
346
|
+
]:
|
|
347
|
+
"""Featurizes the training trackers.
|
|
348
|
+
|
|
349
|
+
Args:
|
|
350
|
+
trackers: list of training trackers
|
|
351
|
+
domain: the domain
|
|
352
|
+
precomputations: Contains precomputed features and attributes.
|
|
353
|
+
bilou_tagging: indicates whether BILOU tagging should be used or not
|
|
354
|
+
ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
|
|
355
|
+
from training state features.
|
|
356
|
+
|
|
357
|
+
Returns:
|
|
358
|
+
- a dictionary of state types (INTENT, TEXT, ACTION_NAME, ACTION_TEXT,
|
|
359
|
+
ENTITIES, SLOTS, ACTIVE_LOOP) to a list of features for all dialogue
|
|
360
|
+
turns in all training trackers
|
|
361
|
+
- the label ids (e.g. action ids) for every dialogue turn in all training
|
|
362
|
+
trackers
|
|
363
|
+
- A dictionary of entity type (ENTITY_TAGS) to a list of features
|
|
364
|
+
containing entity tag ids for text user inputs otherwise empty dict
|
|
365
|
+
for all dialogue turns in all training trackers
|
|
366
|
+
"""
|
|
367
|
+
self.prepare_for_featurization(domain, bilou_tagging)
|
|
368
|
+
(
|
|
369
|
+
trackers_as_states,
|
|
370
|
+
trackers_as_labels,
|
|
371
|
+
trackers_as_entities,
|
|
372
|
+
) = self.training_states_labels_and_entities(
|
|
373
|
+
trackers,
|
|
374
|
+
domain,
|
|
375
|
+
ignore_action_unlikely_intent=ignore_action_unlikely_intent,
|
|
376
|
+
)
|
|
377
|
+
|
|
378
|
+
tracker_state_features = self._featurize_states(
|
|
379
|
+
trackers_as_states, precomputations
|
|
380
|
+
)
|
|
381
|
+
|
|
382
|
+
if not tracker_state_features and not trackers_as_labels:
|
|
383
|
+
# If input and output were empty, it means there is
|
|
384
|
+
# no data on which the policy can be trained
|
|
385
|
+
# hence return them as it is. They'll be handled
|
|
386
|
+
# appropriately inside the policy.
|
|
387
|
+
return tracker_state_features, np.ndarray(trackers_as_labels), []
|
|
388
|
+
|
|
389
|
+
label_ids = self._convert_labels_to_ids(trackers_as_labels, domain)
|
|
390
|
+
|
|
391
|
+
entity_tags = self._create_entity_tags(
|
|
392
|
+
trackers_as_entities, precomputations, bilou_tagging
|
|
393
|
+
)
|
|
394
|
+
|
|
395
|
+
return tracker_state_features, label_ids, entity_tags
|
|
396
|
+
|
|
397
|
+
def _choose_last_user_input(
|
|
398
|
+
self, trackers_as_states: List[List[State]], use_text_for_last_user_input: bool
|
|
399
|
+
) -> None:
|
|
400
|
+
for states in trackers_as_states:
|
|
401
|
+
last_state = states[-1]
|
|
402
|
+
# only update the state of the real user utterance
|
|
403
|
+
if not rasa.shared.core.trackers.is_prev_action_listen_in_state(last_state):
|
|
404
|
+
continue
|
|
405
|
+
|
|
406
|
+
if use_text_for_last_user_input:
|
|
407
|
+
# remove intent features to only use text
|
|
408
|
+
if last_state.get(USER, {}).get(INTENT):
|
|
409
|
+
del last_state[USER][INTENT]
|
|
410
|
+
# don't add entities if text is used for featurization
|
|
411
|
+
if last_state.get(USER, {}).get(ENTITIES):
|
|
412
|
+
del last_state[USER][ENTITIES]
|
|
413
|
+
else:
|
|
414
|
+
# remove text features to only use intent
|
|
415
|
+
if last_state.get(USER, {}).get(TEXT):
|
|
416
|
+
del last_state[USER][TEXT]
|
|
417
|
+
|
|
418
|
+
# make sure that all dialogue steps are either intent or text based
|
|
419
|
+
self._remove_user_text_if_intent(trackers_as_states)
|
|
420
|
+
|
|
421
|
+
def prediction_states(
|
|
422
|
+
self,
|
|
423
|
+
trackers: List[DialogueStateTracker],
|
|
424
|
+
domain: Domain,
|
|
425
|
+
use_text_for_last_user_input: bool = False,
|
|
426
|
+
ignore_rule_only_turns: bool = False,
|
|
427
|
+
rule_only_data: Optional[Dict[Text, Any]] = None,
|
|
428
|
+
ignore_action_unlikely_intent: bool = False,
|
|
429
|
+
) -> List[List[State]]:
|
|
430
|
+
"""Transforms trackers to states for prediction.
|
|
431
|
+
|
|
432
|
+
Args:
|
|
433
|
+
trackers: The trackers to transform.
|
|
434
|
+
domain: The domain.
|
|
435
|
+
use_text_for_last_user_input: Indicates whether to use text or intent label
|
|
436
|
+
for featurizing last user input.
|
|
437
|
+
ignore_rule_only_turns: If True ignore dialogue turns that are present
|
|
438
|
+
only in rules.
|
|
439
|
+
rule_only_data: Slots and loops,
|
|
440
|
+
which only occur in rules but not in stories.
|
|
441
|
+
ignore_action_unlikely_intent: Whether to remove states containing
|
|
442
|
+
`action_unlikely_intent` from prediction states.
|
|
443
|
+
|
|
444
|
+
Returns:
|
|
445
|
+
Trackers as states for prediction.
|
|
446
|
+
"""
|
|
447
|
+
raise NotImplementedError(
|
|
448
|
+
"Featurizer must have the capacity to create feature vector"
|
|
449
|
+
)
|
|
450
|
+
|
|
451
|
+
def create_state_features(
|
|
452
|
+
self,
|
|
453
|
+
trackers: List[DialogueStateTracker],
|
|
454
|
+
domain: Domain,
|
|
455
|
+
precomputations: Optional[MessageContainerForCoreFeaturization],
|
|
456
|
+
use_text_for_last_user_input: bool = False,
|
|
457
|
+
ignore_rule_only_turns: bool = False,
|
|
458
|
+
rule_only_data: Optional[Dict[Text, Any]] = None,
|
|
459
|
+
ignore_action_unlikely_intent: bool = False,
|
|
460
|
+
) -> List[List[Dict[Text, List[Features]]]]:
|
|
461
|
+
"""Creates state features for prediction.
|
|
462
|
+
|
|
463
|
+
Args:
|
|
464
|
+
trackers: A list of state trackers
|
|
465
|
+
domain: The domain
|
|
466
|
+
precomputations: Contains precomputed features and attributes.
|
|
467
|
+
use_text_for_last_user_input: Indicates whether to use text or intent label
|
|
468
|
+
for featurizing last user input.
|
|
469
|
+
ignore_rule_only_turns: If True ignore dialogue turns that are present
|
|
470
|
+
only in rules.
|
|
471
|
+
rule_only_data: Slots and loops,
|
|
472
|
+
which only occur in rules but not in stories.
|
|
473
|
+
ignore_action_unlikely_intent: Whether to remove any states containing
|
|
474
|
+
`action_unlikely_intent` from state features.
|
|
475
|
+
|
|
476
|
+
Returns:
|
|
477
|
+
Dictionaries of state type (INTENT, TEXT, ACTION_NAME, ACTION_TEXT,
|
|
478
|
+
ENTITIES, SLOTS, ACTIVE_LOOP) to a list of features for all dialogue
|
|
479
|
+
turns in all trackers.
|
|
480
|
+
"""
|
|
481
|
+
trackers_as_states = self.prediction_states(
|
|
482
|
+
trackers,
|
|
483
|
+
domain,
|
|
484
|
+
use_text_for_last_user_input,
|
|
485
|
+
ignore_rule_only_turns,
|
|
486
|
+
rule_only_data,
|
|
487
|
+
ignore_action_unlikely_intent=ignore_action_unlikely_intent,
|
|
488
|
+
)
|
|
489
|
+
return self._featurize_states(trackers_as_states, precomputations)
|
|
490
|
+
|
|
491
|
+
def persist(self, path: Union[Text, Path]) -> None:
|
|
492
|
+
"""Persists the tracker featurizer to the given path.
|
|
493
|
+
|
|
494
|
+
Args:
|
|
495
|
+
path: The path to persist the tracker featurizer to.
|
|
496
|
+
"""
|
|
497
|
+
featurizer_file = Path(path) / FEATURIZER_FILE
|
|
498
|
+
rasa.shared.utils.io.create_directory_for_file(featurizer_file)
|
|
499
|
+
|
|
500
|
+
# entity tags are persisted in TED policy, they are not needed for prediction
|
|
501
|
+
if self.state_featurizer is not None:
|
|
502
|
+
self.state_featurizer.entity_tag_specs = []
|
|
503
|
+
|
|
504
|
+
# noinspection PyTypeChecker
|
|
505
|
+
rasa.shared.utils.io.dump_obj_as_json_to_file(featurizer_file, self.to_dict())
|
|
506
|
+
|
|
507
|
+
@staticmethod
|
|
508
|
+
def load(path: Union[Text, Path]) -> Optional[TrackerFeaturizer]:
|
|
509
|
+
"""Loads the featurizer from file.
|
|
510
|
+
|
|
511
|
+
Args:
|
|
512
|
+
path: The path to load the tracker featurizer from.
|
|
513
|
+
|
|
514
|
+
Returns:
|
|
515
|
+
The loaded tracker featurizer.
|
|
516
|
+
"""
|
|
517
|
+
featurizer_file = Path(path) / FEATURIZER_FILE
|
|
518
|
+
if featurizer_file.is_file():
|
|
519
|
+
data = rasa.shared.utils.io.read_json_file(featurizer_file)
|
|
520
|
+
|
|
521
|
+
if "type" not in data:
|
|
522
|
+
logger.error(
|
|
523
|
+
f"Couldn't load featurizer for policy. "
|
|
524
|
+
f"File '{featurizer_file}' does not contain all "
|
|
525
|
+
f"necessary information. 'type' is missing."
|
|
526
|
+
)
|
|
527
|
+
return None
|
|
528
|
+
|
|
529
|
+
return TrackerFeaturizer.from_dict(data)
|
|
530
|
+
|
|
531
|
+
logger.error(
|
|
532
|
+
f"Couldn't load featurizer for policy. "
|
|
533
|
+
f"File '{featurizer_file}' doesn't exist."
|
|
534
|
+
)
|
|
535
|
+
return None
|
|
536
|
+
|
|
537
|
+
@staticmethod
|
|
538
|
+
def _remove_action_unlikely_intent_from_states(states: List[State]) -> List[State]:
|
|
539
|
+
return [
|
|
540
|
+
state
|
|
541
|
+
for state in states
|
|
542
|
+
if not _is_prev_action_unlikely_intent_in_state(state)
|
|
543
|
+
]
|
|
544
|
+
|
|
545
|
+
@staticmethod
|
|
546
|
+
def _remove_action_unlikely_intent_from_events(events: List[Event]) -> List[Event]:
|
|
547
|
+
return [
|
|
548
|
+
event
|
|
549
|
+
for event in events
|
|
550
|
+
if (
|
|
551
|
+
not isinstance(event, ActionExecuted)
|
|
552
|
+
or event.action_name != ACTION_UNLIKELY_INTENT_NAME
|
|
553
|
+
)
|
|
554
|
+
]
|
|
555
|
+
|
|
556
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
557
|
+
return {
|
|
558
|
+
"type": self.__class__._featurizer_type,
|
|
559
|
+
"state_featurizer": (
|
|
560
|
+
self.state_featurizer.to_dict() if self.state_featurizer else None
|
|
561
|
+
),
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
@TrackerFeaturizer.register("FullDialogueTrackerFeaturizer")
|
|
566
|
+
class FullDialogueTrackerFeaturizer(TrackerFeaturizer):
|
|
567
|
+
"""Creates full dialogue training data for time distributed architectures.
|
|
568
|
+
|
|
569
|
+
Creates training data that uses each time output for prediction.
|
|
570
|
+
"""
|
|
571
|
+
|
|
572
|
+
def training_states_labels_and_entities(
|
|
573
|
+
self,
|
|
574
|
+
trackers: List[DialogueStateTracker],
|
|
575
|
+
domain: Domain,
|
|
576
|
+
omit_unset_slots: bool = False,
|
|
577
|
+
ignore_action_unlikely_intent: bool = False,
|
|
578
|
+
) -> Tuple[List[List[State]], List[List[Text]], List[List[Dict[Text, Any]]]]:
|
|
579
|
+
"""Transforms trackers to states, action labels, and entity data.
|
|
580
|
+
|
|
581
|
+
Args:
|
|
582
|
+
trackers: The trackers to transform.
|
|
583
|
+
domain: The domain.
|
|
584
|
+
omit_unset_slots: If `True` do not include the initial values of slots.
|
|
585
|
+
ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
|
|
586
|
+
from training states.
|
|
587
|
+
|
|
588
|
+
Returns:
|
|
589
|
+
Trackers as states, action labels, and entity data.
|
|
590
|
+
"""
|
|
591
|
+
trackers_as_states = []
|
|
592
|
+
trackers_as_actions = []
|
|
593
|
+
trackers_as_entities = []
|
|
594
|
+
|
|
595
|
+
logger.debug(
|
|
596
|
+
"Creating states and action examples from "
|
|
597
|
+
"collected trackers (by {}({}))..."
|
|
598
|
+
"".format(type(self).__name__, type(self.state_featurizer).__name__)
|
|
599
|
+
)
|
|
600
|
+
pbar = tqdm(
|
|
601
|
+
trackers,
|
|
602
|
+
desc="Processed trackers",
|
|
603
|
+
disable=rasa.shared.utils.io.is_logging_disabled(),
|
|
604
|
+
)
|
|
605
|
+
for tracker in pbar:
|
|
606
|
+
states = self._create_states(
|
|
607
|
+
tracker, domain, omit_unset_slots=omit_unset_slots
|
|
608
|
+
)
|
|
609
|
+
events = tracker.applied_events(True)
|
|
610
|
+
|
|
611
|
+
if ignore_action_unlikely_intent:
|
|
612
|
+
states = self._remove_action_unlikely_intent_from_states(states)
|
|
613
|
+
events = self._remove_action_unlikely_intent_from_events(events)
|
|
614
|
+
|
|
615
|
+
delete_first_state = False
|
|
616
|
+
actions = []
|
|
617
|
+
entities = []
|
|
618
|
+
entity_data = {}
|
|
619
|
+
for event in events:
|
|
620
|
+
if isinstance(event, UserUttered):
|
|
621
|
+
entity_data = self._entity_data(event)
|
|
622
|
+
|
|
623
|
+
if not isinstance(event, ActionExecuted):
|
|
624
|
+
continue
|
|
625
|
+
|
|
626
|
+
if not event.unpredictable:
|
|
627
|
+
# only actions which can be
|
|
628
|
+
# predicted at a stories start
|
|
629
|
+
action = event.action_name or event.action_text
|
|
630
|
+
if action is not None:
|
|
631
|
+
actions.append(action)
|
|
632
|
+
entities.append(entity_data)
|
|
633
|
+
else:
|
|
634
|
+
# unpredictable actions can be
|
|
635
|
+
# only the first in the story
|
|
636
|
+
if delete_first_state:
|
|
637
|
+
raise InvalidStory(
|
|
638
|
+
f"Found two unpredictable actions in one story "
|
|
639
|
+
f"'{tracker.sender_id}'. Check your story files."
|
|
640
|
+
)
|
|
641
|
+
delete_first_state = True
|
|
642
|
+
|
|
643
|
+
# reset entity_data for the the next turn
|
|
644
|
+
entity_data = {}
|
|
645
|
+
|
|
646
|
+
if delete_first_state:
|
|
647
|
+
states = states[1:]
|
|
648
|
+
|
|
649
|
+
trackers_as_states.append(states[:-1])
|
|
650
|
+
trackers_as_actions.append(actions)
|
|
651
|
+
trackers_as_entities.append(entities)
|
|
652
|
+
|
|
653
|
+
self._remove_user_text_if_intent(trackers_as_states)
|
|
654
|
+
|
|
655
|
+
return trackers_as_states, trackers_as_actions, trackers_as_entities
|
|
656
|
+
|
|
657
|
+
def prediction_states(
|
|
658
|
+
self,
|
|
659
|
+
trackers: List[DialogueStateTracker],
|
|
660
|
+
domain: Domain,
|
|
661
|
+
use_text_for_last_user_input: bool = False,
|
|
662
|
+
ignore_rule_only_turns: bool = False,
|
|
663
|
+
rule_only_data: Optional[Dict[Text, Any]] = None,
|
|
664
|
+
ignore_action_unlikely_intent: bool = False,
|
|
665
|
+
) -> List[List[State]]:
|
|
666
|
+
"""Transforms trackers to states for prediction.
|
|
667
|
+
|
|
668
|
+
Args:
|
|
669
|
+
trackers: The trackers to transform.
|
|
670
|
+
domain: The domain.
|
|
671
|
+
use_text_for_last_user_input: Indicates whether to use text or intent label
|
|
672
|
+
for featurizing last user input.
|
|
673
|
+
ignore_rule_only_turns: If True ignore dialogue turns that are present
|
|
674
|
+
only in rules.
|
|
675
|
+
rule_only_data: Slots and loops,
|
|
676
|
+
which only occur in rules but not in stories.
|
|
677
|
+
ignore_action_unlikely_intent: Whether to remove any states containing
|
|
678
|
+
`action_unlikely_intent` from prediction states.
|
|
679
|
+
|
|
680
|
+
Returns:
|
|
681
|
+
Trackers as states for prediction.
|
|
682
|
+
"""
|
|
683
|
+
trackers_as_states = [
|
|
684
|
+
self._create_states(
|
|
685
|
+
tracker,
|
|
686
|
+
domain,
|
|
687
|
+
ignore_rule_only_turns=ignore_rule_only_turns,
|
|
688
|
+
rule_only_data=rule_only_data,
|
|
689
|
+
)
|
|
690
|
+
for tracker in trackers
|
|
691
|
+
]
|
|
692
|
+
|
|
693
|
+
if ignore_action_unlikely_intent:
|
|
694
|
+
trackers_as_states = [
|
|
695
|
+
self._remove_action_unlikely_intent_from_states(states)
|
|
696
|
+
for states in trackers_as_states
|
|
697
|
+
]
|
|
698
|
+
|
|
699
|
+
self._choose_last_user_input(trackers_as_states, use_text_for_last_user_input)
|
|
700
|
+
|
|
701
|
+
return trackers_as_states
|
|
702
|
+
|
|
703
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
704
|
+
return super().to_dict()
|
|
705
|
+
|
|
706
|
+
@classmethod
|
|
707
|
+
def create_from_dict(cls, data: Dict[str, Any]) -> "FullDialogueTrackerFeaturizer":
|
|
708
|
+
state_featurizer = SingleStateFeaturizer.create_from_dict(
|
|
709
|
+
data["state_featurizer"]
|
|
710
|
+
)
|
|
711
|
+
return cls(
|
|
712
|
+
state_featurizer,
|
|
713
|
+
)
|
|
714
|
+
|
|
715
|
+
|
|
716
|
+
@TrackerFeaturizer.register("MaxHistoryTrackerFeaturizer")
|
|
717
|
+
class MaxHistoryTrackerFeaturizer(TrackerFeaturizer):
|
|
718
|
+
"""Truncates the tracker history into `max_history` long sequences.
|
|
719
|
+
|
|
720
|
+
Creates training data from trackers where actions are the output prediction
|
|
721
|
+
labels. Tracker state sequences which represent policy input are truncated
|
|
722
|
+
to not excede `max_history` states.
|
|
723
|
+
"""
|
|
724
|
+
|
|
725
|
+
LABEL_NAME = "action"
|
|
726
|
+
|
|
727
|
+
def __init__(
|
|
728
|
+
self,
|
|
729
|
+
state_featurizer: Optional[SingleStateFeaturizer] = None,
|
|
730
|
+
max_history: Optional[int] = None,
|
|
731
|
+
remove_duplicates: bool = True,
|
|
732
|
+
) -> None:
|
|
733
|
+
"""Initializes the tracker featurizer.
|
|
734
|
+
|
|
735
|
+
Args:
|
|
736
|
+
state_featurizer: The state featurizer used to encode the states.
|
|
737
|
+
max_history: The maximum length of an extracted state sequence.
|
|
738
|
+
remove_duplicates: Keep only unique training state sequence/label pairs.
|
|
739
|
+
"""
|
|
740
|
+
super().__init__(state_featurizer)
|
|
741
|
+
self.max_history = max_history
|
|
742
|
+
self.remove_duplicates = remove_duplicates
|
|
743
|
+
|
|
744
|
+
@staticmethod
|
|
745
|
+
def slice_state_history(
|
|
746
|
+
states: List[State], slice_length: Optional[int]
|
|
747
|
+
) -> List[State]:
|
|
748
|
+
"""Slices states from the trackers history.
|
|
749
|
+
|
|
750
|
+
Args:
|
|
751
|
+
states: The states
|
|
752
|
+
slice_length: The slice length
|
|
753
|
+
|
|
754
|
+
Returns:
|
|
755
|
+
The sliced states.
|
|
756
|
+
"""
|
|
757
|
+
if not slice_length:
|
|
758
|
+
return states
|
|
759
|
+
|
|
760
|
+
return states[-slice_length:]
|
|
761
|
+
|
|
762
|
+
@staticmethod
|
|
763
|
+
def _hash_example(states: List[State], labels: Optional[List[Text]] = None) -> int:
|
|
764
|
+
"""Hashes states (and optionally label).
|
|
765
|
+
|
|
766
|
+
Produces a hash of the tracker state sequence (and optionally the labels).
|
|
767
|
+
If `labels` is `None`, labels don't get hashed.
|
|
768
|
+
|
|
769
|
+
Args:
|
|
770
|
+
states: The tracker state sequence to hash.
|
|
771
|
+
labels: Label strings associated with this state sequence.
|
|
772
|
+
|
|
773
|
+
Returns:
|
|
774
|
+
The hash of the states and (optionally) the label.
|
|
775
|
+
"""
|
|
776
|
+
frozen_states = tuple(
|
|
777
|
+
s if s is None else DialogueStateTracker.freeze_current_state(s)
|
|
778
|
+
for s in states
|
|
779
|
+
)
|
|
780
|
+
if labels is not None:
|
|
781
|
+
frozen_labels = tuple(labels)
|
|
782
|
+
return hash((frozen_states, frozen_labels))
|
|
783
|
+
else:
|
|
784
|
+
return hash(frozen_states)
|
|
785
|
+
|
|
786
|
+
def training_states_labels_and_entities(
|
|
787
|
+
self,
|
|
788
|
+
trackers: List[DialogueStateTracker],
|
|
789
|
+
domain: Domain,
|
|
790
|
+
omit_unset_slots: bool = False,
|
|
791
|
+
ignore_action_unlikely_intent: bool = False,
|
|
792
|
+
) -> Tuple[List[List[State]], List[List[Text]], List[List[Dict[Text, Any]]]]:
|
|
793
|
+
"""Transforms trackers to states, action labels, and entity data.
|
|
794
|
+
|
|
795
|
+
Args:
|
|
796
|
+
trackers: The trackers to transform.
|
|
797
|
+
domain: The domain.
|
|
798
|
+
omit_unset_slots: If `True` do not include the initial values of slots.
|
|
799
|
+
ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
|
|
800
|
+
from training states.
|
|
801
|
+
|
|
802
|
+
Returns:
|
|
803
|
+
Trackers as states, labels, and entity data.
|
|
804
|
+
"""
|
|
805
|
+
example_states = []
|
|
806
|
+
example_labels = []
|
|
807
|
+
example_entities = []
|
|
808
|
+
|
|
809
|
+
# Store of example hashes for removing duplicate training examples.
|
|
810
|
+
hashed_examples = set()
|
|
811
|
+
|
|
812
|
+
logger.debug(
|
|
813
|
+
f"Creating states and {self.LABEL_NAME} label examples from "
|
|
814
|
+
f"collected trackers "
|
|
815
|
+
f"(by {type(self).__name__}({type(self.state_featurizer).__name__}))..."
|
|
816
|
+
)
|
|
817
|
+
pbar = tqdm(
|
|
818
|
+
trackers,
|
|
819
|
+
desc="Processed trackers",
|
|
820
|
+
disable=rasa.shared.utils.io.is_logging_disabled(),
|
|
821
|
+
)
|
|
822
|
+
for tracker in pbar:
|
|
823
|
+
for states, label, entities in self._extract_examples(
|
|
824
|
+
tracker,
|
|
825
|
+
domain,
|
|
826
|
+
omit_unset_slots=omit_unset_slots,
|
|
827
|
+
ignore_action_unlikely_intent=ignore_action_unlikely_intent,
|
|
828
|
+
):
|
|
829
|
+
if self.remove_duplicates:
|
|
830
|
+
hashed = self._hash_example(states, label)
|
|
831
|
+
if hashed in hashed_examples:
|
|
832
|
+
continue
|
|
833
|
+
hashed_examples.add(hashed)
|
|
834
|
+
|
|
835
|
+
example_states.append(states)
|
|
836
|
+
example_labels.append(label)
|
|
837
|
+
example_entities.append(entities)
|
|
838
|
+
|
|
839
|
+
pbar.set_postfix({f"# {self.LABEL_NAME}": f"{len(example_labels):d}"})
|
|
840
|
+
|
|
841
|
+
self._remove_user_text_if_intent(example_states)
|
|
842
|
+
|
|
843
|
+
logger.debug(f"Created {len(example_states)} {self.LABEL_NAME} examples.")
|
|
844
|
+
|
|
845
|
+
return example_states, example_labels, example_entities
|
|
846
|
+
|
|
847
|
+
def _extract_examples(
|
|
848
|
+
self,
|
|
849
|
+
tracker: DialogueStateTracker,
|
|
850
|
+
domain: Domain,
|
|
851
|
+
omit_unset_slots: bool = False,
|
|
852
|
+
ignore_action_unlikely_intent: bool = False,
|
|
853
|
+
) -> Iterator[Tuple[List[State], List[Text], List[Dict[Text, Any]]]]:
|
|
854
|
+
"""Creates an iterator over training examples from a tracker.
|
|
855
|
+
|
|
856
|
+
Args:
|
|
857
|
+
trackers: The tracker from which to extract training examples.
|
|
858
|
+
domain: The domain of the training data.
|
|
859
|
+
omit_unset_slots: If `True` do not include the initial values of slots.
|
|
860
|
+
ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
|
|
861
|
+
from training states.
|
|
862
|
+
|
|
863
|
+
Returns:
|
|
864
|
+
An iterator over example states, labels, and entity data.
|
|
865
|
+
"""
|
|
866
|
+
tracker_states = self._create_states(
|
|
867
|
+
tracker, domain, omit_unset_slots=omit_unset_slots
|
|
868
|
+
)
|
|
869
|
+
events = tracker.applied_events(True)
|
|
870
|
+
|
|
871
|
+
if ignore_action_unlikely_intent:
|
|
872
|
+
tracker_states = self._remove_action_unlikely_intent_from_states(
|
|
873
|
+
tracker_states
|
|
874
|
+
)
|
|
875
|
+
events = self._remove_action_unlikely_intent_from_events(events)
|
|
876
|
+
|
|
877
|
+
label_index = 0
|
|
878
|
+
entity_data = {}
|
|
879
|
+
for event in events:
|
|
880
|
+
if isinstance(event, UserUttered):
|
|
881
|
+
entity_data = self._entity_data(event)
|
|
882
|
+
|
|
883
|
+
elif isinstance(event, ActionExecuted):
|
|
884
|
+
label_index += 1
|
|
885
|
+
|
|
886
|
+
# use only actions which can be predicted at a stories start
|
|
887
|
+
if event.unpredictable:
|
|
888
|
+
continue
|
|
889
|
+
|
|
890
|
+
sliced_states = self.slice_state_history(
|
|
891
|
+
tracker_states[:label_index], self.max_history
|
|
892
|
+
)
|
|
893
|
+
label = cast(List[Text], [event.action_name or event.action_text])
|
|
894
|
+
entities = [entity_data]
|
|
895
|
+
|
|
896
|
+
yield sliced_states, label, entities
|
|
897
|
+
|
|
898
|
+
# reset entity_data for the the next turn
|
|
899
|
+
entity_data = {}
|
|
900
|
+
|
|
901
|
+
def prediction_states(
|
|
902
|
+
self,
|
|
903
|
+
trackers: List[DialogueStateTracker],
|
|
904
|
+
domain: Domain,
|
|
905
|
+
use_text_for_last_user_input: bool = False,
|
|
906
|
+
ignore_rule_only_turns: bool = False,
|
|
907
|
+
rule_only_data: Optional[Dict[Text, Any]] = None,
|
|
908
|
+
ignore_action_unlikely_intent: bool = False,
|
|
909
|
+
) -> List[List[State]]:
|
|
910
|
+
"""Transforms trackers to states for prediction.
|
|
911
|
+
|
|
912
|
+
Args:
|
|
913
|
+
trackers: The trackers to transform.
|
|
914
|
+
domain: The domain.
|
|
915
|
+
use_text_for_last_user_input: Indicates whether to use text or intent label
|
|
916
|
+
for featurizing last user input.
|
|
917
|
+
ignore_rule_only_turns: If True ignore dialogue turns that are present
|
|
918
|
+
only in rules.
|
|
919
|
+
rule_only_data: Slots and loops,
|
|
920
|
+
which only occur in rules but not in stories.
|
|
921
|
+
ignore_action_unlikely_intent: Whether to remove any states containing
|
|
922
|
+
`action_unlikely_intent` from prediction states.
|
|
923
|
+
|
|
924
|
+
Returns:
|
|
925
|
+
Trackers as states for prediction.
|
|
926
|
+
"""
|
|
927
|
+
trackers_as_states = [
|
|
928
|
+
self._create_states(
|
|
929
|
+
tracker,
|
|
930
|
+
domain,
|
|
931
|
+
ignore_rule_only_turns=ignore_rule_only_turns,
|
|
932
|
+
rule_only_data=rule_only_data,
|
|
933
|
+
)
|
|
934
|
+
for tracker in trackers
|
|
935
|
+
]
|
|
936
|
+
|
|
937
|
+
# Remove `action_unlikely_intent` from `trackers_as_states`.
|
|
938
|
+
# This must be done before state history slicing to ensure the
|
|
939
|
+
# max history of the sliced states matches training time.
|
|
940
|
+
if ignore_action_unlikely_intent:
|
|
941
|
+
trackers_as_states = [
|
|
942
|
+
self._remove_action_unlikely_intent_from_states(states)
|
|
943
|
+
for states in trackers_as_states
|
|
944
|
+
]
|
|
945
|
+
|
|
946
|
+
trackers_as_states = [
|
|
947
|
+
self.slice_state_history(states, self.max_history)
|
|
948
|
+
for states in trackers_as_states
|
|
949
|
+
]
|
|
950
|
+
self._choose_last_user_input(trackers_as_states, use_text_for_last_user_input)
|
|
951
|
+
|
|
952
|
+
return trackers_as_states
|
|
953
|
+
|
|
954
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
955
|
+
data = super().to_dict()
|
|
956
|
+
data.update(
|
|
957
|
+
{
|
|
958
|
+
"remove_duplicates": self.remove_duplicates,
|
|
959
|
+
"max_history": self.max_history,
|
|
960
|
+
}
|
|
961
|
+
)
|
|
962
|
+
return data
|
|
963
|
+
|
|
964
|
+
@classmethod
|
|
965
|
+
def create_from_dict(cls, data: Dict[str, Any]) -> "MaxHistoryTrackerFeaturizer":
|
|
966
|
+
state_featurizer = SingleStateFeaturizer.create_from_dict(
|
|
967
|
+
data["state_featurizer"]
|
|
968
|
+
)
|
|
969
|
+
return cls(state_featurizer, data["max_history"], data["remove_duplicates"])
|
|
970
|
+
|
|
971
|
+
|
|
972
|
+
@TrackerFeaturizer.register("IntentMaxHistoryTrackerFeaturizer")
|
|
973
|
+
class IntentMaxHistoryTrackerFeaturizer(MaxHistoryTrackerFeaturizer):
|
|
974
|
+
"""Truncates the tracker history into `max_history` long sequences.
|
|
975
|
+
|
|
976
|
+
Creates training data from trackers where intents are the output prediction
|
|
977
|
+
labels. Tracker state sequences which represent policy input are truncated
|
|
978
|
+
to not excede `max_history` states.
|
|
979
|
+
"""
|
|
980
|
+
|
|
981
|
+
LABEL_NAME = "intent"
|
|
982
|
+
|
|
983
|
+
@classmethod
|
|
984
|
+
def _convert_labels_to_ids(
|
|
985
|
+
cls, trackers_as_intents: List[List[Text]], domain: Domain
|
|
986
|
+
) -> np.ndarray:
|
|
987
|
+
"""Converts a list of labels to a matrix of label ids.
|
|
988
|
+
|
|
989
|
+
The number of rows is equal to `len(trackers_as_intents)`. The number of
|
|
990
|
+
columns is equal to the maximum number of positive labels that any training
|
|
991
|
+
example is associated with. Rows are padded with `LABEL_PAD_ID` if not all rows
|
|
992
|
+
have the same number of labels.
|
|
993
|
+
|
|
994
|
+
Args:
|
|
995
|
+
trackers_as_intents: Positive example label ids
|
|
996
|
+
associated with each training example.
|
|
997
|
+
domain: The domain of the training data.
|
|
998
|
+
|
|
999
|
+
Returns:
|
|
1000
|
+
A matrix of label ids.
|
|
1001
|
+
"""
|
|
1002
|
+
# store labels in numpy arrays so that it corresponds to np arrays
|
|
1003
|
+
# of input features
|
|
1004
|
+
label_ids = [
|
|
1005
|
+
[domain.intents.index(intent) for intent in tracker_intents]
|
|
1006
|
+
for tracker_intents in trackers_as_intents
|
|
1007
|
+
]
|
|
1008
|
+
|
|
1009
|
+
return np.array(cls._pad_label_ids(label_ids))
|
|
1010
|
+
|
|
1011
|
+
@staticmethod
|
|
1012
|
+
def _pad_label_ids(label_ids: List[List[int]]) -> List[List[int]]:
|
|
1013
|
+
"""Pads label ids so that all are of the same length.
|
|
1014
|
+
|
|
1015
|
+
Args:
|
|
1016
|
+
label_ids: Label ids of varying lengths
|
|
1017
|
+
|
|
1018
|
+
Returns:
|
|
1019
|
+
Label ids padded to be of uniform length.
|
|
1020
|
+
"""
|
|
1021
|
+
# If `label_ids` is an empty list, no padding needs to be added.
|
|
1022
|
+
if not label_ids:
|
|
1023
|
+
return label_ids
|
|
1024
|
+
|
|
1025
|
+
# Add `LABEL_PAD_ID` padding to labels array so that
|
|
1026
|
+
# each example has equal number of labels
|
|
1027
|
+
multiple_labels_count = [len(a) for a in label_ids]
|
|
1028
|
+
max_labels_count = max(multiple_labels_count)
|
|
1029
|
+
num_padding_needed = [max_labels_count - len(a) for a in label_ids]
|
|
1030
|
+
|
|
1031
|
+
padded_label_ids = []
|
|
1032
|
+
for ids, num_pads in zip(label_ids, num_padding_needed):
|
|
1033
|
+
padded_row = list(ids) + [LABEL_PAD_ID] * num_pads
|
|
1034
|
+
padded_label_ids.append(padded_row)
|
|
1035
|
+
return padded_label_ids
|
|
1036
|
+
|
|
1037
|
+
def training_states_labels_and_entities(
|
|
1038
|
+
self,
|
|
1039
|
+
trackers: List[DialogueStateTracker],
|
|
1040
|
+
domain: Domain,
|
|
1041
|
+
omit_unset_slots: bool = False,
|
|
1042
|
+
ignore_action_unlikely_intent: bool = False,
|
|
1043
|
+
) -> Tuple[List[List[State]], List[List[Text]], List[List[Dict[Text, Any]]]]:
|
|
1044
|
+
"""Transforms trackers to states, intent labels, and entity data.
|
|
1045
|
+
|
|
1046
|
+
Args:
|
|
1047
|
+
trackers: The trackers to transform.
|
|
1048
|
+
domain: The domain.
|
|
1049
|
+
omit_unset_slots: If `True` do not include the initial values of slots.
|
|
1050
|
+
ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
|
|
1051
|
+
from training states.
|
|
1052
|
+
|
|
1053
|
+
Returns:
|
|
1054
|
+
Trackers as states, labels, and entity data.
|
|
1055
|
+
"""
|
|
1056
|
+
example_states = []
|
|
1057
|
+
example_entities = []
|
|
1058
|
+
|
|
1059
|
+
# Store of example hashes (of both states and labels) for removing
|
|
1060
|
+
# duplicate training examples.
|
|
1061
|
+
hashed_examples = set()
|
|
1062
|
+
# Mapping of example state hash to set of
|
|
1063
|
+
# positive labels associated with the state.
|
|
1064
|
+
state_hash_to_label_set: DefaultDict[int, Set[Text]] = defaultdict(set)
|
|
1065
|
+
|
|
1066
|
+
logger.debug(
|
|
1067
|
+
f"Creating states and {self.LABEL_NAME} label examples from "
|
|
1068
|
+
f"collected trackers "
|
|
1069
|
+
f"(by {type(self).__name__}({type(self.state_featurizer).__name__}))..."
|
|
1070
|
+
)
|
|
1071
|
+
pbar = tqdm(
|
|
1072
|
+
trackers,
|
|
1073
|
+
desc="Processed trackers",
|
|
1074
|
+
disable=rasa.shared.utils.io.is_logging_disabled(),
|
|
1075
|
+
)
|
|
1076
|
+
for tracker in pbar:
|
|
1077
|
+
for states, label, entities in self._extract_examples(
|
|
1078
|
+
tracker,
|
|
1079
|
+
domain,
|
|
1080
|
+
omit_unset_slots=omit_unset_slots,
|
|
1081
|
+
ignore_action_unlikely_intent=ignore_action_unlikely_intent,
|
|
1082
|
+
):
|
|
1083
|
+
if self.remove_duplicates:
|
|
1084
|
+
hashed = self._hash_example(states, label)
|
|
1085
|
+
if hashed in hashed_examples:
|
|
1086
|
+
continue
|
|
1087
|
+
hashed_examples.add(hashed)
|
|
1088
|
+
|
|
1089
|
+
# Store all positive labels associated with a training state.
|
|
1090
|
+
state_hash = self._hash_example(states)
|
|
1091
|
+
|
|
1092
|
+
# Only add unique example states unless `remove_duplicates` is `False`.
|
|
1093
|
+
if (
|
|
1094
|
+
not self.remove_duplicates
|
|
1095
|
+
or state_hash not in state_hash_to_label_set
|
|
1096
|
+
):
|
|
1097
|
+
example_states.append(states)
|
|
1098
|
+
example_entities.append(entities)
|
|
1099
|
+
|
|
1100
|
+
state_hash_to_label_set[state_hash].add(label[0])
|
|
1101
|
+
|
|
1102
|
+
pbar.set_postfix({f"# {self.LABEL_NAME}": f"{len(example_states):d}"})
|
|
1103
|
+
|
|
1104
|
+
# Collect positive labels for each state example.
|
|
1105
|
+
example_labels = [
|
|
1106
|
+
list(state_hash_to_label_set[self._hash_example(state)])
|
|
1107
|
+
for state in example_states
|
|
1108
|
+
]
|
|
1109
|
+
|
|
1110
|
+
self._remove_user_text_if_intent(example_states)
|
|
1111
|
+
|
|
1112
|
+
logger.debug(f"Created {len(example_states)} {self.LABEL_NAME} examples.")
|
|
1113
|
+
|
|
1114
|
+
return example_states, example_labels, example_entities
|
|
1115
|
+
|
|
1116
|
+
def _extract_examples(
|
|
1117
|
+
self,
|
|
1118
|
+
tracker: DialogueStateTracker,
|
|
1119
|
+
domain: Domain,
|
|
1120
|
+
omit_unset_slots: bool = False,
|
|
1121
|
+
ignore_action_unlikely_intent: bool = False,
|
|
1122
|
+
) -> Iterator[Tuple[List[State], List[Text], List[Dict[Text, Any]]]]:
|
|
1123
|
+
"""Creates an iterator over training examples from a tracker.
|
|
1124
|
+
|
|
1125
|
+
Args:
|
|
1126
|
+
tracker: The tracker from which to extract training examples.
|
|
1127
|
+
domain: The domain of the training data.
|
|
1128
|
+
omit_unset_slots: If `True` do not include the initial values of slots.
|
|
1129
|
+
ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
|
|
1130
|
+
from training states.
|
|
1131
|
+
|
|
1132
|
+
Returns:
|
|
1133
|
+
An iterator over example states, labels, and entity data.
|
|
1134
|
+
"""
|
|
1135
|
+
tracker_states = self._create_states(
|
|
1136
|
+
tracker, domain, omit_unset_slots=omit_unset_slots
|
|
1137
|
+
)
|
|
1138
|
+
events = tracker.applied_events(True)
|
|
1139
|
+
|
|
1140
|
+
if ignore_action_unlikely_intent:
|
|
1141
|
+
tracker_states = self._remove_action_unlikely_intent_from_states(
|
|
1142
|
+
tracker_states
|
|
1143
|
+
)
|
|
1144
|
+
events = self._remove_action_unlikely_intent_from_events(events)
|
|
1145
|
+
|
|
1146
|
+
label_index = 0
|
|
1147
|
+
for event in events:
|
|
1148
|
+
if isinstance(event, ActionExecuted):
|
|
1149
|
+
label_index += 1
|
|
1150
|
+
|
|
1151
|
+
elif isinstance(event, UserUttered):
|
|
1152
|
+
sliced_states = self.slice_state_history(
|
|
1153
|
+
tracker_states[:label_index], self.max_history
|
|
1154
|
+
)
|
|
1155
|
+
label = cast(List[Text], [event.intent_name or event.text])
|
|
1156
|
+
entities: List[Dict[Text, Any]] = [{}]
|
|
1157
|
+
|
|
1158
|
+
yield sliced_states, label, entities
|
|
1159
|
+
|
|
1160
|
+
@staticmethod
|
|
1161
|
+
def _cleanup_last_user_state_with_action_listen(
|
|
1162
|
+
trackers_as_states: List[List[State]],
|
|
1163
|
+
) -> List[List[State]]:
|
|
1164
|
+
"""Removes the last tracker state if the previous action is `action_listen`.
|
|
1165
|
+
|
|
1166
|
+
States with the previous action equal to `action_listen` correspond to states
|
|
1167
|
+
with a new user intent. This information is what `UnexpecTEDIntentPolicy` is
|
|
1168
|
+
trying to predict so it needs to be removed before obtaining a prediction.
|
|
1169
|
+
|
|
1170
|
+
Args:
|
|
1171
|
+
trackers_as_states: Trackers converted to states
|
|
1172
|
+
|
|
1173
|
+
Returns:
|
|
1174
|
+
Filtered states with last `action_listen` removed.
|
|
1175
|
+
"""
|
|
1176
|
+
for states in trackers_as_states:
|
|
1177
|
+
if not states:
|
|
1178
|
+
continue
|
|
1179
|
+
last_state = states[-1]
|
|
1180
|
+
if rasa.shared.core.trackers.is_prev_action_listen_in_state(last_state):
|
|
1181
|
+
del states[-1]
|
|
1182
|
+
|
|
1183
|
+
return trackers_as_states
|
|
1184
|
+
|
|
1185
|
+
def prediction_states(
|
|
1186
|
+
self,
|
|
1187
|
+
trackers: List[DialogueStateTracker],
|
|
1188
|
+
domain: Domain,
|
|
1189
|
+
use_text_for_last_user_input: bool = False,
|
|
1190
|
+
ignore_rule_only_turns: bool = False,
|
|
1191
|
+
rule_only_data: Optional[Dict[Text, Any]] = None,
|
|
1192
|
+
ignore_action_unlikely_intent: bool = False,
|
|
1193
|
+
) -> List[List[State]]:
|
|
1194
|
+
"""Transforms trackers to states for prediction.
|
|
1195
|
+
|
|
1196
|
+
Args:
|
|
1197
|
+
trackers: The trackers to transform.
|
|
1198
|
+
domain: The domain.
|
|
1199
|
+
use_text_for_last_user_input: Indicates whether to use text or intent label
|
|
1200
|
+
for featurizing last user input.
|
|
1201
|
+
ignore_rule_only_turns: If True ignore dialogue turns that are present
|
|
1202
|
+
only in rules.
|
|
1203
|
+
rule_only_data: Slots and loops,
|
|
1204
|
+
which only occur in rules but not in stories.
|
|
1205
|
+
ignore_action_unlikely_intent: Whether to remove any states containing
|
|
1206
|
+
`action_unlikely_intent` from prediction states.
|
|
1207
|
+
|
|
1208
|
+
Returns:
|
|
1209
|
+
Trackers as states for prediction.
|
|
1210
|
+
"""
|
|
1211
|
+
trackers_as_states = [
|
|
1212
|
+
self._create_states(
|
|
1213
|
+
tracker,
|
|
1214
|
+
domain,
|
|
1215
|
+
ignore_rule_only_turns=ignore_rule_only_turns,
|
|
1216
|
+
rule_only_data=rule_only_data,
|
|
1217
|
+
)
|
|
1218
|
+
for tracker in trackers
|
|
1219
|
+
]
|
|
1220
|
+
|
|
1221
|
+
# Remove `action_unlikely_intent` from `trackers_as_states`.
|
|
1222
|
+
# This must be done before state history slicing to ensure the
|
|
1223
|
+
# max history of the sliced states matches training time.
|
|
1224
|
+
if ignore_action_unlikely_intent:
|
|
1225
|
+
trackers_as_states = [
|
|
1226
|
+
self._remove_action_unlikely_intent_from_states(states)
|
|
1227
|
+
for states in trackers_as_states
|
|
1228
|
+
]
|
|
1229
|
+
|
|
1230
|
+
self._choose_last_user_input(trackers_as_states, use_text_for_last_user_input)
|
|
1231
|
+
|
|
1232
|
+
# `tracker_as_states` contain a state with intent = last intent
|
|
1233
|
+
# and previous action = action_listen. This state needs to be
|
|
1234
|
+
# removed as it was not present during training as well because
|
|
1235
|
+
# predicting the last intent is what the policies using this
|
|
1236
|
+
# featurizer do. This is specifically done before state history
|
|
1237
|
+
# is sliced so that the number of past states is same as `max_history`.
|
|
1238
|
+
self._cleanup_last_user_state_with_action_listen(trackers_as_states)
|
|
1239
|
+
|
|
1240
|
+
trackers_as_states = [
|
|
1241
|
+
self.slice_state_history(states, self.max_history)
|
|
1242
|
+
for states in trackers_as_states
|
|
1243
|
+
]
|
|
1244
|
+
|
|
1245
|
+
return trackers_as_states
|
|
1246
|
+
|
|
1247
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
1248
|
+
return super().to_dict()
|
|
1249
|
+
|
|
1250
|
+
@classmethod
|
|
1251
|
+
def create_from_dict(
|
|
1252
|
+
cls, data: Dict[str, Any]
|
|
1253
|
+
) -> "IntentMaxHistoryTrackerFeaturizer":
|
|
1254
|
+
state_featurizer = SingleStateFeaturizer.create_from_dict(
|
|
1255
|
+
data["state_featurizer"]
|
|
1256
|
+
)
|
|
1257
|
+
return cls(state_featurizer, data["max_history"], data["remove_duplicates"])
|
|
1258
|
+
|
|
1259
|
+
|
|
1260
|
+
def _is_prev_action_unlikely_intent_in_state(state: State) -> bool:
|
|
1261
|
+
prev_action_name = state.get(PREVIOUS_ACTION, {}).get(ACTION_NAME)
|
|
1262
|
+
return prev_action_name == ACTION_UNLIKELY_INTENT_NAME
|