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,320 @@
|
|
|
1
|
+
from typing import Any, Dict, Optional, Text
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
from jinja2 import Template
|
|
5
|
+
from rasa import telemetry
|
|
6
|
+
from rasa.core.nlg.response import TemplatedNaturalLanguageGenerator
|
|
7
|
+
from rasa.core.nlg.summarize import summarize_conversation
|
|
8
|
+
from rasa.shared.constants import (
|
|
9
|
+
LLM_CONFIG_KEY,
|
|
10
|
+
MODEL_CONFIG_KEY,
|
|
11
|
+
MODEL_NAME_CONFIG_KEY,
|
|
12
|
+
PROMPT_CONFIG_KEY,
|
|
13
|
+
PROVIDER_CONFIG_KEY,
|
|
14
|
+
OPENAI_PROVIDER,
|
|
15
|
+
TIMEOUT_CONFIG_KEY,
|
|
16
|
+
MODEL_GROUP_ID_CONFIG_KEY,
|
|
17
|
+
)
|
|
18
|
+
from rasa.shared.core.domain import KEY_RESPONSES_TEXT, Domain
|
|
19
|
+
from rasa.shared.core.events import BotUttered, UserUttered
|
|
20
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
21
|
+
from rasa.shared.utils.health_check.llm_health_check_mixin import LLMHealthCheckMixin
|
|
22
|
+
from rasa.shared.utils.llm import (
|
|
23
|
+
DEFAULT_OPENAI_GENERATE_MODEL_NAME,
|
|
24
|
+
DEFAULT_OPENAI_MAX_GENERATED_TOKENS,
|
|
25
|
+
USER,
|
|
26
|
+
combine_custom_and_default_config,
|
|
27
|
+
get_prompt_template,
|
|
28
|
+
llm_factory,
|
|
29
|
+
resolve_model_client_config,
|
|
30
|
+
)
|
|
31
|
+
from rasa.shared.utils.llm import (
|
|
32
|
+
tracker_as_readable_transcript,
|
|
33
|
+
)
|
|
34
|
+
from rasa.utils.endpoints import EndpointConfig
|
|
35
|
+
from rasa.utils.log_utils import log_llm
|
|
36
|
+
|
|
37
|
+
structlogger = structlog.get_logger()
|
|
38
|
+
|
|
39
|
+
RESPONSE_REPHRASING_KEY = "rephrase"
|
|
40
|
+
|
|
41
|
+
RESPONSE_REPHRASING_TEMPLATE_KEY = "rephrase_prompt"
|
|
42
|
+
|
|
43
|
+
RESPONSE_SUMMARISE_CONVERSATION_KEY = "summarize_conversation"
|
|
44
|
+
|
|
45
|
+
DEFAULT_REPHRASE_ALL = False
|
|
46
|
+
DEFAULT_SUMMARIZE_HISTORY = True
|
|
47
|
+
DEFAULT_MAX_HISTORICAL_TURNS = 5
|
|
48
|
+
|
|
49
|
+
DEFAULT_LLM_CONFIG = {
|
|
50
|
+
PROVIDER_CONFIG_KEY: OPENAI_PROVIDER,
|
|
51
|
+
MODEL_CONFIG_KEY: DEFAULT_OPENAI_GENERATE_MODEL_NAME,
|
|
52
|
+
"temperature": 0.3,
|
|
53
|
+
"max_tokens": DEFAULT_OPENAI_MAX_GENERATED_TOKENS,
|
|
54
|
+
TIMEOUT_CONFIG_KEY: 5,
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
DEFAULT_RESPONSE_VARIATION_PROMPT_TEMPLATE = """The following is a conversation with
|
|
58
|
+
an AI assistant. The assistant is helpful, creative, clever, and very friendly.
|
|
59
|
+
Rephrase the suggested AI response staying close to the original message and retaining
|
|
60
|
+
its meaning. Use simple english.
|
|
61
|
+
|
|
62
|
+
Context / previous conversation with the user:
|
|
63
|
+
{{history}}
|
|
64
|
+
|
|
65
|
+
{{current_input}}
|
|
66
|
+
|
|
67
|
+
Suggested AI Response: {{suggested_response}}
|
|
68
|
+
|
|
69
|
+
Rephrased AI Response:"""
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class ContextualResponseRephraser(
|
|
73
|
+
LLMHealthCheckMixin, TemplatedNaturalLanguageGenerator
|
|
74
|
+
):
|
|
75
|
+
"""Generates responses based on modified templates.
|
|
76
|
+
|
|
77
|
+
The templates are filled with the entities and slots that are available in the
|
|
78
|
+
tracker. The resulting response is then passed through the LLM to generate a
|
|
79
|
+
variation of the response.
|
|
80
|
+
|
|
81
|
+
The variation is only generated if the response is a text response and the
|
|
82
|
+
response explicitly set `rephrase` to `True`. This is to avoid
|
|
83
|
+
generating responses for templates that are to volatile to be
|
|
84
|
+
modified by the LLM.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
endpoint_config: The endpoint configuration for the LLM.
|
|
88
|
+
domain: The domain of the assistant.
|
|
89
|
+
|
|
90
|
+
Attributes:
|
|
91
|
+
nlg_endpoint: The endpoint configuration for the LLM.
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
def __init__(self, endpoint_config: EndpointConfig, domain: Domain) -> None:
|
|
95
|
+
super().__init__(domain.responses)
|
|
96
|
+
|
|
97
|
+
self.nlg_endpoint = endpoint_config
|
|
98
|
+
self.prompt_template = get_prompt_template(
|
|
99
|
+
self.nlg_endpoint.kwargs.get(PROMPT_CONFIG_KEY),
|
|
100
|
+
DEFAULT_RESPONSE_VARIATION_PROMPT_TEMPLATE,
|
|
101
|
+
)
|
|
102
|
+
self.rephrase_all = self.nlg_endpoint.kwargs.get(
|
|
103
|
+
"rephrase_all", DEFAULT_REPHRASE_ALL
|
|
104
|
+
)
|
|
105
|
+
self.trace_prompt_tokens = self.nlg_endpoint.kwargs.get(
|
|
106
|
+
"trace_prompt_tokens", False
|
|
107
|
+
)
|
|
108
|
+
self.summarize_history = self.nlg_endpoint.kwargs.get(
|
|
109
|
+
"summarize_history", DEFAULT_SUMMARIZE_HISTORY
|
|
110
|
+
)
|
|
111
|
+
self.max_historical_turns = self.nlg_endpoint.kwargs.get(
|
|
112
|
+
"max_historical_turns", DEFAULT_MAX_HISTORICAL_TURNS
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
self.llm_config = resolve_model_client_config(
|
|
116
|
+
self.nlg_endpoint.kwargs.get(LLM_CONFIG_KEY),
|
|
117
|
+
ContextualResponseRephraser.__name__,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
self.perform_llm_health_check(
|
|
121
|
+
self.llm_config,
|
|
122
|
+
DEFAULT_LLM_CONFIG,
|
|
123
|
+
"contextual_response_rephraser.init",
|
|
124
|
+
ContextualResponseRephraser.__name__,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
def _last_message_if_human(self, tracker: DialogueStateTracker) -> Optional[str]:
|
|
128
|
+
"""Returns the latest message from the tracker.
|
|
129
|
+
|
|
130
|
+
If the latest message is from the AI, it returns None.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
tracker: The tracker to get the latest message from.
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
The latest message from the tracker if it is from the user, else None.
|
|
137
|
+
"""
|
|
138
|
+
for event in reversed(tracker.events):
|
|
139
|
+
if isinstance(event, UserUttered):
|
|
140
|
+
return event.text
|
|
141
|
+
if isinstance(event, BotUttered):
|
|
142
|
+
return None
|
|
143
|
+
return None
|
|
144
|
+
|
|
145
|
+
async def _generate_llm_response(self, prompt: str) -> Optional[str]:
|
|
146
|
+
"""Use LLM to generate a response.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
prompt: the prompt to send to the LLM
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
generated text
|
|
153
|
+
"""
|
|
154
|
+
llm = llm_factory(self.llm_config, DEFAULT_LLM_CONFIG)
|
|
155
|
+
|
|
156
|
+
try:
|
|
157
|
+
llm_response = await llm.acompletion(prompt)
|
|
158
|
+
return llm_response.choices[0]
|
|
159
|
+
except Exception as e:
|
|
160
|
+
# unfortunately, langchain does not wrap LLM exceptions which means
|
|
161
|
+
# we have to catch all exceptions here
|
|
162
|
+
structlogger.error("nlg.llm.error", error=e)
|
|
163
|
+
return None
|
|
164
|
+
|
|
165
|
+
def llm_property(self, prop: str) -> Optional[str]:
|
|
166
|
+
"""Returns a property of the LLM provider."""
|
|
167
|
+
return combine_custom_and_default_config(
|
|
168
|
+
self.llm_config, DEFAULT_LLM_CONFIG
|
|
169
|
+
).get(prop)
|
|
170
|
+
|
|
171
|
+
def custom_prompt_template(self, prompt_template: str) -> Optional[str]:
|
|
172
|
+
"""Returns the custom prompt template if it is not the default one."""
|
|
173
|
+
if prompt_template != DEFAULT_RESPONSE_VARIATION_PROMPT_TEMPLATE:
|
|
174
|
+
return prompt_template
|
|
175
|
+
else:
|
|
176
|
+
return None
|
|
177
|
+
|
|
178
|
+
def _template_for_response_rephrasing(self, response: Dict[str, Any]) -> str:
|
|
179
|
+
"""Returns the template for the response rephrasing.
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
response: The response to rephrase.
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
The template for the response rephrasing.
|
|
186
|
+
"""
|
|
187
|
+
return response.get("metadata", {}).get(
|
|
188
|
+
RESPONSE_REPHRASING_TEMPLATE_KEY, self.prompt_template
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
async def _create_history(self, tracker: DialogueStateTracker) -> str:
|
|
192
|
+
"""Creates the history for the prompt.
|
|
193
|
+
|
|
194
|
+
Args:
|
|
195
|
+
tracker: The tracker to use for the history.
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
The history for the prompt.
|
|
200
|
+
"""
|
|
201
|
+
llm = llm_factory(self.llm_config, DEFAULT_LLM_CONFIG)
|
|
202
|
+
return await summarize_conversation(tracker, llm, max_turns=5)
|
|
203
|
+
|
|
204
|
+
async def rephrase(
|
|
205
|
+
self,
|
|
206
|
+
response: Dict[str, Any],
|
|
207
|
+
tracker: DialogueStateTracker,
|
|
208
|
+
) -> Dict[str, Any]:
|
|
209
|
+
"""Predicts a variation of the response.
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
response: The response to rephrase.
|
|
213
|
+
tracker: The tracker to use for the prediction.
|
|
214
|
+
model_name: The name of the model to use for the prediction.
|
|
215
|
+
|
|
216
|
+
Returns:
|
|
217
|
+
The response with the rephrased text.
|
|
218
|
+
"""
|
|
219
|
+
if not (response_text := response.get(KEY_RESPONSES_TEXT)):
|
|
220
|
+
return response
|
|
221
|
+
|
|
222
|
+
prompt_template_text = self._template_for_response_rephrasing(response)
|
|
223
|
+
|
|
224
|
+
# Retrieve inputs for the dynamic prompt
|
|
225
|
+
latest_message = self._last_message_if_human(tracker)
|
|
226
|
+
current_input = f"{USER}: {latest_message}" if latest_message else ""
|
|
227
|
+
|
|
228
|
+
# Only summarise conversation history if flagged
|
|
229
|
+
if self.summarize_history:
|
|
230
|
+
history = await self._create_history(tracker)
|
|
231
|
+
else:
|
|
232
|
+
# make sure the transcript/history contains the last user utterance
|
|
233
|
+
max_turns = max(self.max_historical_turns, 1)
|
|
234
|
+
history = tracker_as_readable_transcript(tracker, max_turns=max_turns)
|
|
235
|
+
# the history already contains the current input
|
|
236
|
+
current_input = ""
|
|
237
|
+
|
|
238
|
+
prompt = Template(prompt_template_text).render(
|
|
239
|
+
history=history,
|
|
240
|
+
suggested_response=response_text,
|
|
241
|
+
current_input=current_input,
|
|
242
|
+
slots=tracker.current_slot_values(),
|
|
243
|
+
)
|
|
244
|
+
log_llm(
|
|
245
|
+
logger=structlogger,
|
|
246
|
+
log_module="ContextualResponseRephraser",
|
|
247
|
+
log_event="nlg.rephrase.prompt_rendered",
|
|
248
|
+
prompt=prompt,
|
|
249
|
+
)
|
|
250
|
+
telemetry.track_response_rephrase(
|
|
251
|
+
rephrase_all=self.rephrase_all,
|
|
252
|
+
custom_prompt_template=self.custom_prompt_template(prompt_template_text),
|
|
253
|
+
llm_type=self.llm_property(PROVIDER_CONFIG_KEY),
|
|
254
|
+
llm_model=self.llm_property(MODEL_CONFIG_KEY)
|
|
255
|
+
or self.llm_property(MODEL_NAME_CONFIG_KEY),
|
|
256
|
+
llm_model_group_id=self.llm_property(MODEL_GROUP_ID_CONFIG_KEY),
|
|
257
|
+
)
|
|
258
|
+
if not (updated_text := await self._generate_llm_response(prompt)):
|
|
259
|
+
# If the LLM fails to generate a response, we
|
|
260
|
+
# return the original response.
|
|
261
|
+
return response
|
|
262
|
+
|
|
263
|
+
structlogger.debug(
|
|
264
|
+
"nlg.rewrite.complete",
|
|
265
|
+
response_text=response_text,
|
|
266
|
+
updated_text=updated_text,
|
|
267
|
+
)
|
|
268
|
+
response[KEY_RESPONSES_TEXT] = updated_text
|
|
269
|
+
return response
|
|
270
|
+
|
|
271
|
+
def does_response_allow_rephrasing(self, template: Dict[Text, Any]) -> bool:
|
|
272
|
+
"""Checks if the template allows variation.
|
|
273
|
+
|
|
274
|
+
Args:
|
|
275
|
+
template: The template to check.
|
|
276
|
+
|
|
277
|
+
Returns:
|
|
278
|
+
`True` if the template allows variation, else `False`.
|
|
279
|
+
"""
|
|
280
|
+
return template.get("metadata", {}).get(
|
|
281
|
+
RESPONSE_REPHRASING_KEY, self.rephrase_all
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
async def generate(
|
|
285
|
+
self,
|
|
286
|
+
utter_action: Text,
|
|
287
|
+
tracker: DialogueStateTracker,
|
|
288
|
+
output_channel: Text,
|
|
289
|
+
**kwargs: Any,
|
|
290
|
+
) -> Optional[Dict[Text, Any]]:
|
|
291
|
+
"""Generate a response for the requested utter action.
|
|
292
|
+
|
|
293
|
+
Args:
|
|
294
|
+
utter_action: The name of the utter action to generate a response for.
|
|
295
|
+
tracker: The tracker to use for the generation.
|
|
296
|
+
output_channel: The output channel to use for the generation.
|
|
297
|
+
**kwargs: Additional arguments to pass to the generation.
|
|
298
|
+
|
|
299
|
+
Returns:
|
|
300
|
+
The generated response.
|
|
301
|
+
"""
|
|
302
|
+
filled_slots = tracker.current_slot_values()
|
|
303
|
+
stack_context = tracker.stack.current_context()
|
|
304
|
+
templated_response = self.generate_from_slots(
|
|
305
|
+
utter_action=utter_action,
|
|
306
|
+
filled_slots=filled_slots,
|
|
307
|
+
stack_context=stack_context,
|
|
308
|
+
output_channel=output_channel,
|
|
309
|
+
**kwargs,
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
if templated_response and self.does_response_allow_rephrasing(
|
|
313
|
+
templated_response
|
|
314
|
+
):
|
|
315
|
+
return await self.rephrase(
|
|
316
|
+
templated_response,
|
|
317
|
+
tracker,
|
|
318
|
+
)
|
|
319
|
+
else:
|
|
320
|
+
return templated_response
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import List, Optional, Union, Text, Any, Dict
|
|
3
|
+
|
|
4
|
+
import rasa.shared.utils.common
|
|
5
|
+
import rasa.shared.utils.io
|
|
6
|
+
from rasa.shared.constants import CHANNEL, RESPONSE_CONDITION
|
|
7
|
+
from rasa.shared.core.domain import Domain
|
|
8
|
+
from rasa.utils.endpoints import EndpointConfig
|
|
9
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class NaturalLanguageGenerator:
|
|
15
|
+
"""Generate bot utterances based on a dialogue state."""
|
|
16
|
+
|
|
17
|
+
async def generate(
|
|
18
|
+
self,
|
|
19
|
+
utter_action: Text,
|
|
20
|
+
tracker: "DialogueStateTracker",
|
|
21
|
+
output_channel: Text,
|
|
22
|
+
**kwargs: Any,
|
|
23
|
+
) -> Optional[Dict[Text, Any]]:
|
|
24
|
+
"""Generate a response for the requested utter action.
|
|
25
|
+
|
|
26
|
+
There are a lot of different methods to implement this, e.g. the
|
|
27
|
+
generation can be based on responses or be fully ML based by feeding
|
|
28
|
+
the dialogue state into a machine learning NLG model.
|
|
29
|
+
"""
|
|
30
|
+
raise NotImplementedError
|
|
31
|
+
|
|
32
|
+
@staticmethod
|
|
33
|
+
def create(
|
|
34
|
+
obj: Union["NaturalLanguageGenerator", EndpointConfig, None],
|
|
35
|
+
domain: Optional[Domain] = None,
|
|
36
|
+
) -> "NaturalLanguageGenerator":
|
|
37
|
+
"""Factory to create a generator."""
|
|
38
|
+
if isinstance(obj, NaturalLanguageGenerator):
|
|
39
|
+
return obj
|
|
40
|
+
else:
|
|
41
|
+
return _create_from_endpoint_config(obj, domain)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _create_from_endpoint_config(
|
|
45
|
+
endpoint_config: Optional[EndpointConfig] = None, domain: Optional[Domain] = None
|
|
46
|
+
) -> "NaturalLanguageGenerator":
|
|
47
|
+
"""Given an endpoint configuration, create a proper NLG object."""
|
|
48
|
+
domain = domain or Domain.empty()
|
|
49
|
+
|
|
50
|
+
if endpoint_config is None:
|
|
51
|
+
from rasa.core.nlg import TemplatedNaturalLanguageGenerator
|
|
52
|
+
|
|
53
|
+
# this is the default type if no endpoint config is set
|
|
54
|
+
nlg: "NaturalLanguageGenerator" = TemplatedNaturalLanguageGenerator(
|
|
55
|
+
domain.responses
|
|
56
|
+
)
|
|
57
|
+
elif endpoint_config.type is None or endpoint_config.type.lower() == "callback":
|
|
58
|
+
from rasa.core.nlg import CallbackNaturalLanguageGenerator
|
|
59
|
+
|
|
60
|
+
# this is the default type if no nlg type is set
|
|
61
|
+
nlg = CallbackNaturalLanguageGenerator(endpoint_config=endpoint_config)
|
|
62
|
+
elif endpoint_config.type.lower() == "response":
|
|
63
|
+
from rasa.core.nlg import TemplatedNaturalLanguageGenerator
|
|
64
|
+
|
|
65
|
+
nlg = TemplatedNaturalLanguageGenerator(domain.responses)
|
|
66
|
+
elif endpoint_config.type.lower() == "rephrase":
|
|
67
|
+
from rasa.core.nlg.contextual_response_rephraser import (
|
|
68
|
+
ContextualResponseRephraser,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
nlg = ContextualResponseRephraser(
|
|
72
|
+
endpoint_config=endpoint_config, domain=domain
|
|
73
|
+
)
|
|
74
|
+
else:
|
|
75
|
+
nlg = _load_from_module_name_in_endpoint_config(endpoint_config, domain)
|
|
76
|
+
|
|
77
|
+
logger.debug(f"Instantiated NLG to '{nlg.__class__.__name__}'.")
|
|
78
|
+
return nlg
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _load_from_module_name_in_endpoint_config(
|
|
82
|
+
endpoint_config: EndpointConfig, domain: Domain
|
|
83
|
+
) -> "NaturalLanguageGenerator":
|
|
84
|
+
"""Initializes a custom natural language generator.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
domain: defines the universe in which the assistant operates
|
|
88
|
+
endpoint_config: the specific natural language generator
|
|
89
|
+
"""
|
|
90
|
+
try:
|
|
91
|
+
nlg_class = rasa.shared.utils.common.class_from_module_path(
|
|
92
|
+
endpoint_config.type
|
|
93
|
+
)
|
|
94
|
+
return nlg_class(endpoint_config=endpoint_config, domain=domain)
|
|
95
|
+
except (AttributeError, ImportError) as e:
|
|
96
|
+
raise Exception(
|
|
97
|
+
f"Could not find a class based on the module path "
|
|
98
|
+
f"'{endpoint_config.type}'. Failed to create a "
|
|
99
|
+
f"`NaturalLanguageGenerator` instance. Error: {e}"
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class ResponseVariationFilter:
|
|
104
|
+
"""Filters response variations based on the channel, action and condition."""
|
|
105
|
+
|
|
106
|
+
def __init__(self, responses: Dict[Text, List[Dict[Text, Any]]]) -> None:
|
|
107
|
+
self.responses = responses
|
|
108
|
+
|
|
109
|
+
@staticmethod
|
|
110
|
+
def _matches_filled_slots(
|
|
111
|
+
filled_slots: Dict[Text, Any], response: Dict[Text, Any]
|
|
112
|
+
) -> bool:
|
|
113
|
+
"""Checks if the conditional response variation matches the filled slots."""
|
|
114
|
+
constraints = response.get(RESPONSE_CONDITION, [])
|
|
115
|
+
for constraint in constraints:
|
|
116
|
+
name = constraint["name"]
|
|
117
|
+
value = constraint["value"]
|
|
118
|
+
filled_slots_value = filled_slots.get(name)
|
|
119
|
+
if isinstance(filled_slots_value, str) and isinstance(value, str):
|
|
120
|
+
if filled_slots_value.casefold() != value.casefold():
|
|
121
|
+
return False
|
|
122
|
+
# slot values can be of different data types
|
|
123
|
+
# such as int, float, bool, etc. hence, this check
|
|
124
|
+
# executes when slot values are not strings
|
|
125
|
+
elif filled_slots_value != value:
|
|
126
|
+
return False
|
|
127
|
+
|
|
128
|
+
return True
|
|
129
|
+
|
|
130
|
+
def responses_for_utter_action(
|
|
131
|
+
self,
|
|
132
|
+
utter_action: Text,
|
|
133
|
+
output_channel: Text,
|
|
134
|
+
filled_slots: Dict[Text, Any],
|
|
135
|
+
) -> List[Dict[Text, Any]]:
|
|
136
|
+
"""Returns array of responses that fit the channel, action and condition."""
|
|
137
|
+
# filter responses without a condition
|
|
138
|
+
default_responses = list(
|
|
139
|
+
filter(
|
|
140
|
+
lambda x: (x.get(RESPONSE_CONDITION) is None),
|
|
141
|
+
self.responses[utter_action],
|
|
142
|
+
)
|
|
143
|
+
)
|
|
144
|
+
# filter responses with a condition that matches the filled slots
|
|
145
|
+
conditional_responses = list(
|
|
146
|
+
filter(
|
|
147
|
+
lambda x: (
|
|
148
|
+
x.get(RESPONSE_CONDITION)
|
|
149
|
+
and self._matches_filled_slots(
|
|
150
|
+
filled_slots=filled_slots, response=x
|
|
151
|
+
)
|
|
152
|
+
),
|
|
153
|
+
self.responses[utter_action],
|
|
154
|
+
)
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
# filter conditional responses that match the channel
|
|
158
|
+
conditional_channel = list(
|
|
159
|
+
filter(lambda x: (x.get(CHANNEL) == output_channel), conditional_responses)
|
|
160
|
+
)
|
|
161
|
+
# filter conditional responses that don't match the channel
|
|
162
|
+
conditional_no_channel = list(
|
|
163
|
+
filter(lambda x: (x.get(CHANNEL) is None), conditional_responses)
|
|
164
|
+
)
|
|
165
|
+
# filter default responses that match the channel
|
|
166
|
+
default_channel = list(
|
|
167
|
+
filter(lambda x: (x.get(CHANNEL) == output_channel), default_responses)
|
|
168
|
+
)
|
|
169
|
+
# filter default responses that don't match the channel
|
|
170
|
+
default_no_channel = list(
|
|
171
|
+
filter(lambda x: (x.get(CHANNEL) is None), default_responses)
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
if conditional_channel:
|
|
175
|
+
return conditional_channel
|
|
176
|
+
|
|
177
|
+
if default_channel:
|
|
178
|
+
return default_channel
|
|
179
|
+
|
|
180
|
+
if conditional_no_channel:
|
|
181
|
+
return conditional_no_channel
|
|
182
|
+
|
|
183
|
+
return default_no_channel
|
|
184
|
+
|
|
185
|
+
def get_response_variation_id(
|
|
186
|
+
self,
|
|
187
|
+
utter_action: Text,
|
|
188
|
+
tracker: DialogueStateTracker,
|
|
189
|
+
output_channel: Text,
|
|
190
|
+
) -> Optional[Text]:
|
|
191
|
+
"""Returns the first matched response variation ID.
|
|
192
|
+
|
|
193
|
+
This ID corresponds to the response variation that fits
|
|
194
|
+
the channel, action and condition.
|
|
195
|
+
"""
|
|
196
|
+
filled_slots = tracker.current_slot_values()
|
|
197
|
+
if utter_action in self.responses:
|
|
198
|
+
eligible_variations = self.responses_for_utter_action(
|
|
199
|
+
utter_action, output_channel, filled_slots
|
|
200
|
+
)
|
|
201
|
+
response_ids_are_valid = self._validate_response_ids(eligible_variations)
|
|
202
|
+
|
|
203
|
+
if eligible_variations and response_ids_are_valid:
|
|
204
|
+
return eligible_variations[0].get("id")
|
|
205
|
+
|
|
206
|
+
return None
|
|
207
|
+
|
|
208
|
+
@staticmethod
|
|
209
|
+
def _validate_response_ids(response_variations: List[Dict[Text, Any]]) -> bool:
|
|
210
|
+
"""Checks that the response IDs of a particular utter_action are unique.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
response_variations: The response variations to validate.
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
True if the response IDs are unique, False otherwise.
|
|
217
|
+
"""
|
|
218
|
+
response_ids = set()
|
|
219
|
+
for response_variation in response_variations:
|
|
220
|
+
response_variation_id = response_variation.get("id")
|
|
221
|
+
if response_variation_id and response_variation_id in response_ids:
|
|
222
|
+
rasa.shared.utils.io.raise_warning(
|
|
223
|
+
f"Duplicate response id '{response_variation_id}' "
|
|
224
|
+
f"defined in the domain."
|
|
225
|
+
)
|
|
226
|
+
return False
|
|
227
|
+
|
|
228
|
+
response_ids.add(response_variation_id)
|
|
229
|
+
|
|
230
|
+
return True
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import copy
|
|
2
|
+
import re
|
|
3
|
+
import logging
|
|
4
|
+
from jinja2 import Template
|
|
5
|
+
import jinja2
|
|
6
|
+
import structlog
|
|
7
|
+
from typing import Text, Dict, Union, Any, List
|
|
8
|
+
|
|
9
|
+
from rasa.core.constants import JINJA2_TEMPLATE_ENGINE, RASA_FORMAT_TEMPLATE_ENGINE
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
structlogger = structlog.get_logger()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _get_variables_to_be_rendered(
|
|
16
|
+
response: Text, values: Dict[Text, Text]
|
|
17
|
+
) -> Dict[Text, Text]:
|
|
18
|
+
"""Get the variables that need to be rendered in the response.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
response: The response that should be interpolated.
|
|
22
|
+
values: A dictionary of keys and the values that those
|
|
23
|
+
keys should be replaced with.
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
The variables that need to be rendered.
|
|
27
|
+
"""
|
|
28
|
+
# The regex matches and captures all the strings that are enclosed in curly braces.
|
|
29
|
+
# The strings should not contain newlines or curly braces.
|
|
30
|
+
variables = re.findall(r"{([^\n{}]+?)}", response)
|
|
31
|
+
return {var: values[var] for var in variables if var in values}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def interpolate_format_template(response: Text, values: Dict[Text, Text]) -> Text:
|
|
35
|
+
"""Interpolate values into responses with placeholders.
|
|
36
|
+
|
|
37
|
+
Transform response tags from "{tag_name}" to "{0[tag_name]}" as described here:
|
|
38
|
+
https://stackoverflow.com/questions/7934620/python-dots-in-the-name-of-variable-in-a-format-string#comment9695339_7934969
|
|
39
|
+
Block characters, making sure not to allow:
|
|
40
|
+
(a) newline in slot name
|
|
41
|
+
(b) { or } in slot name
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
response: The piece of text that should be interpolated.
|
|
45
|
+
values: A dictionary of keys and the values that those
|
|
46
|
+
keys should be replaced with.
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
The piece of text with any replacements made.
|
|
50
|
+
"""
|
|
51
|
+
try:
|
|
52
|
+
values_to_be_rendered = _get_variables_to_be_rendered(response, values)
|
|
53
|
+
text = re.sub(r"{([^\n{}]+?)}", r"{0[\1]}", response)
|
|
54
|
+
text = text.format(values_to_be_rendered)
|
|
55
|
+
if "0[" in text:
|
|
56
|
+
# regex replaced tag but format did not replace
|
|
57
|
+
# likely cause would be that tag name was enclosed
|
|
58
|
+
# in double curly and format func simply escaped it.
|
|
59
|
+
# we don't want to return {0[SLOTNAME]} thus
|
|
60
|
+
# restoring original value with { being escaped.
|
|
61
|
+
return response.format({})
|
|
62
|
+
|
|
63
|
+
return text
|
|
64
|
+
except KeyError as e:
|
|
65
|
+
event_info = (
|
|
66
|
+
"The specified slot name does not exist, "
|
|
67
|
+
"and no explicit value was provided during the response invocation. "
|
|
68
|
+
"Return the response without populating it."
|
|
69
|
+
)
|
|
70
|
+
structlogger.exception(
|
|
71
|
+
"interpolator.interpolate.text",
|
|
72
|
+
response=copy.deepcopy(response),
|
|
73
|
+
placeholder_key=e.args[0],
|
|
74
|
+
event_info=event_info,
|
|
75
|
+
)
|
|
76
|
+
return response
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def interpolate_jinja_template(response: Text, values: Dict[Text, Any]) -> Text:
|
|
80
|
+
"""Interpolate values into responses with placeholders using jinja.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
response: The piece of text that should be interpolated.
|
|
84
|
+
values: A dictionary of keys and the values that those
|
|
85
|
+
keys should be replaced with.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
The piece of text with any replacements made.
|
|
89
|
+
"""
|
|
90
|
+
try:
|
|
91
|
+
return Template(response).render(values)
|
|
92
|
+
except jinja2.exceptions.UndefinedError as e:
|
|
93
|
+
event_info = (
|
|
94
|
+
"The specified slot name does not exist, "
|
|
95
|
+
"and no explicit value was provided during the response invocation. "
|
|
96
|
+
"Return the response without populating it."
|
|
97
|
+
)
|
|
98
|
+
structlogger.exception(
|
|
99
|
+
"interpolator.interpolate.text",
|
|
100
|
+
response=copy.deepcopy(response),
|
|
101
|
+
placeholder_key=e.args[0],
|
|
102
|
+
event_info=event_info,
|
|
103
|
+
)
|
|
104
|
+
return response
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def interpolate(
|
|
108
|
+
response: Union[List[Any], Dict[Text, Any], Text],
|
|
109
|
+
values: Dict[Text, Text],
|
|
110
|
+
method: str,
|
|
111
|
+
) -> Union[List[Any], Dict[Text, Any], Text]:
|
|
112
|
+
"""Recursively process response and interpolate any text keys.
|
|
113
|
+
|
|
114
|
+
Args:
|
|
115
|
+
response: The response that should be interpolated.
|
|
116
|
+
values: A dictionary of keys and the values that those
|
|
117
|
+
keys should be replaced with.
|
|
118
|
+
method: The method to use for interpolation. If `None` or `"format"`,
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
The response with any replacements made.
|
|
122
|
+
"""
|
|
123
|
+
if method == RASA_FORMAT_TEMPLATE_ENGINE:
|
|
124
|
+
interpolator = interpolate_format_template
|
|
125
|
+
elif method == JINJA2_TEMPLATE_ENGINE:
|
|
126
|
+
interpolator = interpolate_jinja_template
|
|
127
|
+
else:
|
|
128
|
+
raise ValueError(f"Unknown interpolator implementation '{method}'")
|
|
129
|
+
|
|
130
|
+
if isinstance(response, str):
|
|
131
|
+
return interpolator(response, values)
|
|
132
|
+
elif isinstance(response, dict):
|
|
133
|
+
for k, v in response.items():
|
|
134
|
+
if isinstance(v, dict):
|
|
135
|
+
interpolate(v, values, method)
|
|
136
|
+
elif isinstance(v, list):
|
|
137
|
+
response[k] = [interpolate(i, values, method) for i in v]
|
|
138
|
+
elif isinstance(v, str):
|
|
139
|
+
response[k] = interpolator(v, values)
|
|
140
|
+
return response
|
|
141
|
+
elif isinstance(response, list):
|
|
142
|
+
return [interpolate(i, values, method) for i in response]
|
|
143
|
+
return response
|