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,22 @@
|
|
|
1
|
+
The following is a friendly conversation
|
|
2
|
+
between a user and an AI assistant. The AI answers the user's
|
|
3
|
+
questions accurately. If the AI does not know the answer to a question,
|
|
4
|
+
it truthfully says it does not know. The assistant takes the history
|
|
5
|
+
of the conversation into account, but focuses on providing a helpful
|
|
6
|
+
answer to the user's most recent message.
|
|
7
|
+
|
|
8
|
+
Here are some example conversation between a user and the AI:
|
|
9
|
+
---
|
|
10
|
+
{% for conversation in conversations %}
|
|
11
|
+
{{ conversation }}
|
|
12
|
+
---
|
|
13
|
+
{% endfor %}
|
|
14
|
+
|
|
15
|
+
Here are some examples of what the AI assistant can say:
|
|
16
|
+
{% for response in responses %}
|
|
17
|
+
- AI: {{ response }}
|
|
18
|
+
{%- endfor %}
|
|
19
|
+
|
|
20
|
+
current conversation:
|
|
21
|
+
{{ current_conversation }}
|
|
22
|
+
AI:
|
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import copy
|
|
3
|
+
import zlib
|
|
4
|
+
|
|
5
|
+
import base64
|
|
6
|
+
import json
|
|
7
|
+
import logging
|
|
8
|
+
import structlog
|
|
9
|
+
|
|
10
|
+
from tqdm import tqdm
|
|
11
|
+
from typing import Optional, Any, Dict, List, Text
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
import rasa.utils.io
|
|
15
|
+
import rasa.shared.utils.io
|
|
16
|
+
from rasa.engine.graph import ExecutionContext
|
|
17
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
18
|
+
from rasa.engine.storage.resource import Resource
|
|
19
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
20
|
+
from rasa.shared.core.domain import State, Domain
|
|
21
|
+
from rasa.shared.core.events import ActionExecuted
|
|
22
|
+
from rasa.core.featurizers.tracker_featurizers import TrackerFeaturizer
|
|
23
|
+
from rasa.core.featurizers.tracker_featurizers import MaxHistoryTrackerFeaturizer
|
|
24
|
+
from rasa.core.featurizers.tracker_featurizers import FEATURIZER_FILE
|
|
25
|
+
from rasa.shared.exceptions import FileIOException
|
|
26
|
+
from rasa.core.policies.policy import PolicyPrediction, Policy, SupportedData
|
|
27
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
28
|
+
from rasa.shared.core.generator import TrackerWithCachedStates
|
|
29
|
+
from rasa.shared.utils.io import is_logging_disabled
|
|
30
|
+
from rasa.core.constants import (
|
|
31
|
+
MEMOIZATION_POLICY_PRIORITY,
|
|
32
|
+
DEFAULT_MAX_HISTORY,
|
|
33
|
+
POLICY_MAX_HISTORY,
|
|
34
|
+
POLICY_PRIORITY,
|
|
35
|
+
)
|
|
36
|
+
from rasa.shared.core.constants import ACTION_LISTEN_NAME
|
|
37
|
+
|
|
38
|
+
logger = logging.getLogger(__name__)
|
|
39
|
+
structlogger = structlog.get_logger()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@DefaultV1Recipe.register(
|
|
43
|
+
DefaultV1Recipe.ComponentType.POLICY_WITHOUT_END_TO_END_SUPPORT, is_trainable=True
|
|
44
|
+
)
|
|
45
|
+
class MemoizationPolicy(Policy):
|
|
46
|
+
"""A policy that follows exact examples of `max_history` turns in training stories.
|
|
47
|
+
|
|
48
|
+
Since `slots` that are set some time in the past are
|
|
49
|
+
preserved in all future feature vectors until they are set
|
|
50
|
+
to None, this policy implicitly remembers and most importantly
|
|
51
|
+
recalls examples in the context of the current dialogue
|
|
52
|
+
longer than `max_history`.
|
|
53
|
+
|
|
54
|
+
This policy is not supposed to be the only policy in an ensemble,
|
|
55
|
+
it is optimized for precision and not recall.
|
|
56
|
+
It should get a 100% precision because it emits probabilities of 1.1
|
|
57
|
+
along it's predictions, which makes every mistake fatal as
|
|
58
|
+
no other policy can overrule it.
|
|
59
|
+
|
|
60
|
+
If it is needed to recall turns from training dialogues where
|
|
61
|
+
some slots might not be set during prediction time, and there are
|
|
62
|
+
training stories for this, use AugmentedMemoizationPolicy.
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
@staticmethod
|
|
66
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
67
|
+
"""Returns the default config (see parent class for full docstring)."""
|
|
68
|
+
# please make sure to update the docs when changing a default parameter
|
|
69
|
+
return {
|
|
70
|
+
"enable_feature_string_compression": True,
|
|
71
|
+
"use_nlu_confidence_as_score": False,
|
|
72
|
+
POLICY_PRIORITY: MEMOIZATION_POLICY_PRIORITY,
|
|
73
|
+
POLICY_MAX_HISTORY: DEFAULT_MAX_HISTORY,
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
def _standard_featurizer(self) -> MaxHistoryTrackerFeaturizer:
|
|
77
|
+
# Memoization policy always uses MaxHistoryTrackerFeaturizer
|
|
78
|
+
# without state_featurizer
|
|
79
|
+
return MaxHistoryTrackerFeaturizer(
|
|
80
|
+
state_featurizer=None, max_history=self.config[POLICY_MAX_HISTORY]
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
def __init__(
|
|
84
|
+
self,
|
|
85
|
+
config: Dict[Text, Any],
|
|
86
|
+
model_storage: ModelStorage,
|
|
87
|
+
resource: Resource,
|
|
88
|
+
execution_context: ExecutionContext,
|
|
89
|
+
featurizer: Optional[TrackerFeaturizer] = None,
|
|
90
|
+
lookup: Optional[Dict] = None,
|
|
91
|
+
) -> None:
|
|
92
|
+
"""Initialize the policy."""
|
|
93
|
+
super().__init__(config, model_storage, resource, execution_context, featurizer)
|
|
94
|
+
self.lookup = lookup or {}
|
|
95
|
+
|
|
96
|
+
def _create_lookup_from_states(
|
|
97
|
+
self,
|
|
98
|
+
trackers_as_states: List[List[State]],
|
|
99
|
+
trackers_as_actions: List[List[Text]],
|
|
100
|
+
) -> Dict[Text, Text]:
|
|
101
|
+
"""Creates lookup dictionary from the tracker represented as states.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
trackers_as_states: representation of the trackers as a list of states
|
|
105
|
+
trackers_as_actions: representation of the trackers as a list of actions
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
lookup dictionary
|
|
109
|
+
"""
|
|
110
|
+
lookup: Dict[Text, Text] = {}
|
|
111
|
+
|
|
112
|
+
if not trackers_as_states:
|
|
113
|
+
return lookup
|
|
114
|
+
|
|
115
|
+
assert len(trackers_as_actions[0]) == 1, (
|
|
116
|
+
f"The second dimension of trackers_as_action should be 1, "
|
|
117
|
+
f"instead of {len(trackers_as_actions[0])}"
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
ambiguous_feature_keys = set()
|
|
121
|
+
|
|
122
|
+
pbar = tqdm(
|
|
123
|
+
zip(trackers_as_states, trackers_as_actions),
|
|
124
|
+
desc="Processed actions",
|
|
125
|
+
disable=is_logging_disabled(),
|
|
126
|
+
)
|
|
127
|
+
for states, actions in pbar:
|
|
128
|
+
action = actions[0]
|
|
129
|
+
|
|
130
|
+
feature_key = self._create_feature_key(states)
|
|
131
|
+
if not feature_key:
|
|
132
|
+
continue
|
|
133
|
+
|
|
134
|
+
if feature_key not in ambiguous_feature_keys:
|
|
135
|
+
if feature_key in lookup.keys():
|
|
136
|
+
if lookup[feature_key] != action:
|
|
137
|
+
# delete contradicting example created by
|
|
138
|
+
# partial history augmentation from memory
|
|
139
|
+
ambiguous_feature_keys.add(feature_key)
|
|
140
|
+
del lookup[feature_key]
|
|
141
|
+
else:
|
|
142
|
+
lookup[feature_key] = action
|
|
143
|
+
pbar.set_postfix({"# examples": "{:d}".format(len(lookup))})
|
|
144
|
+
|
|
145
|
+
return lookup
|
|
146
|
+
|
|
147
|
+
def _create_feature_key(self, states: List[State]) -> Optional[Text]:
|
|
148
|
+
if not states:
|
|
149
|
+
return None
|
|
150
|
+
|
|
151
|
+
# we sort keys to make sure that the same states
|
|
152
|
+
# represented as dictionaries have the same json strings
|
|
153
|
+
# quotes are removed for aesthetic reasons
|
|
154
|
+
feature_str = json.dumps(states, sort_keys=True).replace('"', "")
|
|
155
|
+
if self.config["enable_feature_string_compression"]:
|
|
156
|
+
compressed = zlib.compress(
|
|
157
|
+
bytes(feature_str, rasa.shared.utils.io.DEFAULT_ENCODING)
|
|
158
|
+
)
|
|
159
|
+
return base64.b64encode(compressed).decode(
|
|
160
|
+
rasa.shared.utils.io.DEFAULT_ENCODING
|
|
161
|
+
)
|
|
162
|
+
else:
|
|
163
|
+
return feature_str
|
|
164
|
+
|
|
165
|
+
def train(
|
|
166
|
+
self,
|
|
167
|
+
training_trackers: List[TrackerWithCachedStates],
|
|
168
|
+
domain: Domain,
|
|
169
|
+
**kwargs: Any,
|
|
170
|
+
) -> Resource:
|
|
171
|
+
# only considers original trackers (no augmented ones)
|
|
172
|
+
training_trackers = [
|
|
173
|
+
t
|
|
174
|
+
for t in training_trackers
|
|
175
|
+
if not hasattr(t, "is_augmented") or not t.is_augmented
|
|
176
|
+
]
|
|
177
|
+
training_trackers = SupportedData.trackers_for_supported_data(
|
|
178
|
+
self.supported_data(), training_trackers
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
(
|
|
182
|
+
trackers_as_states,
|
|
183
|
+
trackers_as_actions,
|
|
184
|
+
) = self.featurizer.training_states_and_labels(training_trackers, domain)
|
|
185
|
+
self.lookup = self._create_lookup_from_states(
|
|
186
|
+
trackers_as_states, trackers_as_actions
|
|
187
|
+
)
|
|
188
|
+
logger.debug(f"Memorized {len(self.lookup)} unique examples.")
|
|
189
|
+
|
|
190
|
+
self.persist()
|
|
191
|
+
return self._resource
|
|
192
|
+
|
|
193
|
+
def _recall_states(self, states: List[State]) -> Optional[Text]:
|
|
194
|
+
return self.lookup.get(self._create_feature_key(states))
|
|
195
|
+
|
|
196
|
+
def recall(
|
|
197
|
+
self,
|
|
198
|
+
states: List[State],
|
|
199
|
+
tracker: DialogueStateTracker,
|
|
200
|
+
domain: Domain,
|
|
201
|
+
rule_only_data: Optional[Dict[Text, Any]],
|
|
202
|
+
) -> Optional[Text]:
|
|
203
|
+
"""Finds the action based on the given states.
|
|
204
|
+
|
|
205
|
+
Args:
|
|
206
|
+
states: List of states.
|
|
207
|
+
tracker: The tracker.
|
|
208
|
+
domain: The Domain.
|
|
209
|
+
rule_only_data: Slots and loops which are specific to rules and hence
|
|
210
|
+
should be ignored by this policy.
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
The name of the action.
|
|
214
|
+
"""
|
|
215
|
+
return self._recall_states(states)
|
|
216
|
+
|
|
217
|
+
def _prediction_result(
|
|
218
|
+
self, action_name: Text, tracker: DialogueStateTracker, domain: Domain
|
|
219
|
+
) -> List[float]:
|
|
220
|
+
result = self._default_predictions(domain)
|
|
221
|
+
if action_name:
|
|
222
|
+
if (
|
|
223
|
+
self.config["use_nlu_confidence_as_score"]
|
|
224
|
+
and tracker.latest_message is not None
|
|
225
|
+
):
|
|
226
|
+
# the memoization will use the confidence of NLU on the latest
|
|
227
|
+
# user message to set the confidence of the action
|
|
228
|
+
score = tracker.latest_message.intent.get("confidence", 1.0)
|
|
229
|
+
else:
|
|
230
|
+
score = 1.0
|
|
231
|
+
|
|
232
|
+
result[domain.index_for_action(action_name)] = score
|
|
233
|
+
|
|
234
|
+
return result
|
|
235
|
+
|
|
236
|
+
async def predict_action_probabilities(
|
|
237
|
+
self,
|
|
238
|
+
tracker: DialogueStateTracker,
|
|
239
|
+
domain: Domain,
|
|
240
|
+
rule_only_data: Optional[Dict[Text, Any]] = None,
|
|
241
|
+
**kwargs: Any,
|
|
242
|
+
) -> PolicyPrediction:
|
|
243
|
+
"""Predicts the next action the bot should take after seeing the tracker.
|
|
244
|
+
|
|
245
|
+
Args:
|
|
246
|
+
tracker: the :class:`rasa.core.trackers.DialogueStateTracker`
|
|
247
|
+
domain: the :class:`rasa.shared.core.domain.Domain`
|
|
248
|
+
rule_only_data: Slots and loops which are specific to rules and hence
|
|
249
|
+
should be ignored by this policy.
|
|
250
|
+
**kwargs: Additional arguments.
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
The policy's prediction (e.g. the probabilities for the actions).
|
|
254
|
+
"""
|
|
255
|
+
result = self._default_predictions(domain)
|
|
256
|
+
if self.should_abstain_in_coexistence(tracker, False):
|
|
257
|
+
return self._prediction(result)
|
|
258
|
+
|
|
259
|
+
states = self._prediction_states(tracker, domain, rule_only_data=rule_only_data)
|
|
260
|
+
structlogger.debug(
|
|
261
|
+
"memoization.predict.actions", tracker_states=copy.deepcopy(states)
|
|
262
|
+
)
|
|
263
|
+
predicted_action_name = self.recall(
|
|
264
|
+
states, tracker, domain, rule_only_data=rule_only_data
|
|
265
|
+
)
|
|
266
|
+
if predicted_action_name is not None:
|
|
267
|
+
logger.debug(f"There is a memorised next action '{predicted_action_name}'")
|
|
268
|
+
result = self._prediction_result(predicted_action_name, tracker, domain)
|
|
269
|
+
else:
|
|
270
|
+
logger.debug("There is no memorised next action")
|
|
271
|
+
|
|
272
|
+
return self._prediction(result)
|
|
273
|
+
|
|
274
|
+
def _metadata(self) -> Dict[Text, Any]:
|
|
275
|
+
return {"lookup": self.lookup}
|
|
276
|
+
|
|
277
|
+
@classmethod
|
|
278
|
+
def _metadata_filename(cls) -> Text:
|
|
279
|
+
return "memorized_turns.json"
|
|
280
|
+
|
|
281
|
+
def persist(self) -> None:
|
|
282
|
+
"""Persists the policy to storage."""
|
|
283
|
+
with self._model_storage.write_to(self._resource) as path:
|
|
284
|
+
# not all policies have a featurizer
|
|
285
|
+
if self.featurizer is not None:
|
|
286
|
+
self.featurizer.persist(path)
|
|
287
|
+
|
|
288
|
+
file = Path(path) / self._metadata_filename()
|
|
289
|
+
|
|
290
|
+
rasa.shared.utils.io.create_directory_for_file(file)
|
|
291
|
+
rasa.shared.utils.io.dump_obj_as_json_to_file(file, self._metadata())
|
|
292
|
+
|
|
293
|
+
@classmethod
|
|
294
|
+
def load(
|
|
295
|
+
cls,
|
|
296
|
+
config: Dict[Text, Any],
|
|
297
|
+
model_storage: ModelStorage,
|
|
298
|
+
resource: Resource,
|
|
299
|
+
execution_context: ExecutionContext,
|
|
300
|
+
**kwargs: Any,
|
|
301
|
+
) -> MemoizationPolicy:
|
|
302
|
+
"""Loads a trained policy (see parent class for full docstring)."""
|
|
303
|
+
featurizer = None
|
|
304
|
+
lookup = None
|
|
305
|
+
|
|
306
|
+
try:
|
|
307
|
+
with model_storage.read_from(resource) as path:
|
|
308
|
+
metadata_file = Path(path) / cls._metadata_filename()
|
|
309
|
+
metadata = rasa.shared.utils.io.read_json_file(metadata_file)
|
|
310
|
+
lookup = metadata["lookup"]
|
|
311
|
+
|
|
312
|
+
if (Path(path) / FEATURIZER_FILE).is_file():
|
|
313
|
+
featurizer = TrackerFeaturizer.load(path)
|
|
314
|
+
|
|
315
|
+
except (ValueError, FileNotFoundError, FileIOException):
|
|
316
|
+
logger.warning(
|
|
317
|
+
f"Couldn't load metadata for policy '{cls.__name__}' as the persisted "
|
|
318
|
+
f"metadata couldn't be loaded."
|
|
319
|
+
)
|
|
320
|
+
|
|
321
|
+
return cls(
|
|
322
|
+
config,
|
|
323
|
+
model_storage,
|
|
324
|
+
resource,
|
|
325
|
+
execution_context,
|
|
326
|
+
featurizer=featurizer,
|
|
327
|
+
lookup=lookup,
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
@DefaultV1Recipe.register(
|
|
332
|
+
DefaultV1Recipe.ComponentType.POLICY_WITHOUT_END_TO_END_SUPPORT, is_trainable=True
|
|
333
|
+
)
|
|
334
|
+
class AugmentedMemoizationPolicy(MemoizationPolicy):
|
|
335
|
+
"""The policy that remembers examples from training stories for `max_history` turns.
|
|
336
|
+
|
|
337
|
+
If it is needed to recall turns from training dialogues
|
|
338
|
+
where some slots might not be set during prediction time,
|
|
339
|
+
add relevant stories without such slots to training data.
|
|
340
|
+
E.g. reminder stories.
|
|
341
|
+
|
|
342
|
+
Since `slots` that are set some time in the past are
|
|
343
|
+
preserved in all future feature vectors until they are set
|
|
344
|
+
to None, this policy has a capability to recall the turns
|
|
345
|
+
up to `max_history` from training stories during prediction
|
|
346
|
+
even if additional slots were filled in the past
|
|
347
|
+
for current dialogue.
|
|
348
|
+
"""
|
|
349
|
+
|
|
350
|
+
@staticmethod
|
|
351
|
+
def _strip_leading_events_until_action_executed(
|
|
352
|
+
tracker: DialogueStateTracker, again: bool = False
|
|
353
|
+
) -> Optional[DialogueStateTracker]:
|
|
354
|
+
"""Truncates the tracker to begin at the next `ActionExecuted` event.
|
|
355
|
+
|
|
356
|
+
Args:
|
|
357
|
+
tracker: The tracker to truncate.
|
|
358
|
+
again: When true, truncate tracker at the second action.
|
|
359
|
+
Otherwise truncate to the first action.
|
|
360
|
+
|
|
361
|
+
Returns:
|
|
362
|
+
The truncated tracker if there were actions present.
|
|
363
|
+
If none are found, returns `None`.
|
|
364
|
+
"""
|
|
365
|
+
idx_of_first_action = None
|
|
366
|
+
idx_of_second_action = None
|
|
367
|
+
|
|
368
|
+
applied_events = tracker.applied_events(True)
|
|
369
|
+
|
|
370
|
+
# we need to find second executed action
|
|
371
|
+
for e_i, event in enumerate(applied_events):
|
|
372
|
+
if isinstance(event, ActionExecuted):
|
|
373
|
+
if idx_of_first_action is None:
|
|
374
|
+
idx_of_first_action = e_i
|
|
375
|
+
else:
|
|
376
|
+
idx_of_second_action = e_i
|
|
377
|
+
break
|
|
378
|
+
|
|
379
|
+
# use first action, if we went first time and second action, if we went again
|
|
380
|
+
idx_to_use = idx_of_second_action if again else idx_of_first_action
|
|
381
|
+
if idx_to_use is None:
|
|
382
|
+
return None
|
|
383
|
+
|
|
384
|
+
# make second ActionExecuted the first one
|
|
385
|
+
events = applied_events[idx_to_use:]
|
|
386
|
+
if not events:
|
|
387
|
+
return None
|
|
388
|
+
|
|
389
|
+
truncated_tracker = tracker.init_copy()
|
|
390
|
+
for e in events:
|
|
391
|
+
truncated_tracker.update(e)
|
|
392
|
+
|
|
393
|
+
return truncated_tracker
|
|
394
|
+
|
|
395
|
+
def _recall_using_truncation(
|
|
396
|
+
self,
|
|
397
|
+
old_states: List[State],
|
|
398
|
+
tracker: DialogueStateTracker,
|
|
399
|
+
domain: Domain,
|
|
400
|
+
rule_only_data: Optional[Dict[Text, Any]],
|
|
401
|
+
) -> Optional[Text]:
|
|
402
|
+
"""Attempts to match memorized states to progressively shorter trackers.
|
|
403
|
+
|
|
404
|
+
This method iteratively removes the oldest events up to the next action
|
|
405
|
+
executed and checks if the truncated event sequence matches some memorized
|
|
406
|
+
states, until a match has been found or until the even sequence has been
|
|
407
|
+
exhausted.
|
|
408
|
+
|
|
409
|
+
Args:
|
|
410
|
+
old_states: List of states.
|
|
411
|
+
tracker: The tracker.
|
|
412
|
+
domain: The Domain.
|
|
413
|
+
rule_only_data: Slots and loops which are specific to rules and hence
|
|
414
|
+
should be ignored by this policy.
|
|
415
|
+
|
|
416
|
+
Returns:
|
|
417
|
+
The name of the action.
|
|
418
|
+
"""
|
|
419
|
+
logger.debug("Launch DeLorean...")
|
|
420
|
+
|
|
421
|
+
# Truncate the tracker based on `max_history`
|
|
422
|
+
truncated_tracker: Optional[DialogueStateTracker] = (
|
|
423
|
+
_trim_tracker_by_max_history(tracker, self.config[POLICY_MAX_HISTORY])
|
|
424
|
+
)
|
|
425
|
+
truncated_tracker = self._strip_leading_events_until_action_executed(
|
|
426
|
+
truncated_tracker
|
|
427
|
+
)
|
|
428
|
+
while truncated_tracker is not None:
|
|
429
|
+
states = self._prediction_states(
|
|
430
|
+
truncated_tracker, domain, rule_only_data=rule_only_data
|
|
431
|
+
)
|
|
432
|
+
|
|
433
|
+
if old_states != states:
|
|
434
|
+
# check if we like new futures
|
|
435
|
+
memorised = self._recall_states(states)
|
|
436
|
+
if memorised is not None:
|
|
437
|
+
structlogger.debug(
|
|
438
|
+
"memoization.states_recall", states=copy.deepcopy(states)
|
|
439
|
+
)
|
|
440
|
+
return memorised
|
|
441
|
+
old_states = states
|
|
442
|
+
|
|
443
|
+
# go back again
|
|
444
|
+
truncated_tracker = self._strip_leading_events_until_action_executed(
|
|
445
|
+
truncated_tracker, again=True
|
|
446
|
+
)
|
|
447
|
+
|
|
448
|
+
# No match found
|
|
449
|
+
structlogger.debug(
|
|
450
|
+
"memoization.states_recall", old_states=copy.deepcopy(old_states)
|
|
451
|
+
)
|
|
452
|
+
return None
|
|
453
|
+
|
|
454
|
+
def recall(
|
|
455
|
+
self,
|
|
456
|
+
states: List[State],
|
|
457
|
+
tracker: DialogueStateTracker,
|
|
458
|
+
domain: Domain,
|
|
459
|
+
rule_only_data: Optional[Dict[Text, Any]],
|
|
460
|
+
) -> Optional[Text]:
|
|
461
|
+
"""Finds the action based on the given states.
|
|
462
|
+
|
|
463
|
+
Uses back to the future idea to change the past and check whether the new future
|
|
464
|
+
can be used to recall the action.
|
|
465
|
+
|
|
466
|
+
Args:
|
|
467
|
+
states: List of states.
|
|
468
|
+
tracker: The tracker.
|
|
469
|
+
domain: The Domain.
|
|
470
|
+
rule_only_data: Slots and loops which are specific to rules and hence
|
|
471
|
+
should be ignored by this policy.
|
|
472
|
+
|
|
473
|
+
Returns:
|
|
474
|
+
The name of the action.
|
|
475
|
+
"""
|
|
476
|
+
predicted_action_name = self._recall_states(states)
|
|
477
|
+
if predicted_action_name is None:
|
|
478
|
+
# let's try a different method to recall that tracker
|
|
479
|
+
return self._recall_using_truncation(
|
|
480
|
+
states, tracker, domain, rule_only_data=rule_only_data
|
|
481
|
+
)
|
|
482
|
+
else:
|
|
483
|
+
return predicted_action_name
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
def _get_max_applied_events_for_max_history(
|
|
487
|
+
tracker: DialogueStateTracker, max_history: Optional[int]
|
|
488
|
+
) -> Optional[int]:
|
|
489
|
+
"""Computes the number of events in the tracker that correspond to max_history.
|
|
490
|
+
|
|
491
|
+
To ensure that the last user utterance is correctly included in the prediction
|
|
492
|
+
states, return the index of the most recent `action_listen` event occuring
|
|
493
|
+
before the tracker would be truncated according to the value of `max_history`.
|
|
494
|
+
|
|
495
|
+
Args:
|
|
496
|
+
tracker: Some tracker holding the events
|
|
497
|
+
max_history: The number of actions to count
|
|
498
|
+
|
|
499
|
+
Returns:
|
|
500
|
+
The number of events, as counted from the end of the event list, that should
|
|
501
|
+
be taken into accout according to the `max_history` setting. If all events
|
|
502
|
+
should be taken into account, the return value is `None`.
|
|
503
|
+
"""
|
|
504
|
+
if not max_history:
|
|
505
|
+
return None
|
|
506
|
+
num_events = 0
|
|
507
|
+
num_actions = 0
|
|
508
|
+
for event in reversed(tracker.applied_events(True)):
|
|
509
|
+
num_events += 1
|
|
510
|
+
if isinstance(event, ActionExecuted):
|
|
511
|
+
num_actions += 1
|
|
512
|
+
if num_actions > max_history and event.action_name == ACTION_LISTEN_NAME:
|
|
513
|
+
return num_events
|
|
514
|
+
return None
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
def _trim_tracker_by_max_history(
|
|
518
|
+
tracker: DialogueStateTracker, max_history: Optional[int]
|
|
519
|
+
) -> DialogueStateTracker:
|
|
520
|
+
"""Removes events from the tracker until it has `max_history` actions.
|
|
521
|
+
|
|
522
|
+
Args:
|
|
523
|
+
tracker: Some tracker.
|
|
524
|
+
max_history: Number of actions to keep.
|
|
525
|
+
|
|
526
|
+
Returns:
|
|
527
|
+
A new tracker with up to `max_history` actions, or the same tracker if
|
|
528
|
+
`max_history` is `None`.
|
|
529
|
+
"""
|
|
530
|
+
max_applied_events = _get_max_applied_events_for_max_history(tracker, max_history)
|
|
531
|
+
if not max_applied_events:
|
|
532
|
+
return tracker
|
|
533
|
+
|
|
534
|
+
applied_events = tracker.applied_events(True)[-max_applied_events:]
|
|
535
|
+
new_tracker = tracker.init_copy()
|
|
536
|
+
for event in applied_events:
|
|
537
|
+
new_tracker.update(event)
|
|
538
|
+
return new_tracker
|