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,391 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import Any, Dict, List, Optional, Text, Union, cast
|
|
4
|
+
|
|
5
|
+
from rasa.shared.exceptions import RasaException
|
|
6
|
+
from rasa.utils.endpoints import EndpointConfig
|
|
7
|
+
|
|
8
|
+
from rasa.core.secrets_manager.constants import (
|
|
9
|
+
SECRET_KEY_LABEL,
|
|
10
|
+
SECRET_MANAGER_PREFIX,
|
|
11
|
+
SOURCE_KEY_LABEL,
|
|
12
|
+
SUPPORTED_SECRET_MANAGERS,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class CredentialsLocation:
|
|
19
|
+
"""Points to where secret is stored.
|
|
20
|
+
|
|
21
|
+
This is a DTO object which is used to pass the configuration to the secret manager.
|
|
22
|
+
More specific configuration is created based on this DTO and
|
|
23
|
+
a secret manager which is used.
|
|
24
|
+
For example: VaultSecretsManager will create VaultStoredSecret
|
|
25
|
+
based on this DTO.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(self, source: Text, secret_key: Text, **kwargs: Optional[Any]) -> None:
|
|
29
|
+
"""Initialise the CredentialsLocation.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
source: The source of the secret.
|
|
33
|
+
secret_key: The key of the secret.
|
|
34
|
+
**kwargs: Additional arguments.
|
|
35
|
+
"""
|
|
36
|
+
self.source = source
|
|
37
|
+
self.secret_key = secret_key
|
|
38
|
+
self.kwargs = kwargs
|
|
39
|
+
|
|
40
|
+
def get_secret_manager_name(self) -> Text:
|
|
41
|
+
"""Get the name of the targeted secret manager.
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
The name of the secret manager.
|
|
45
|
+
"""
|
|
46
|
+
return self.source.replace(f"{SECRET_MANAGER_PREFIX}.", "")
|
|
47
|
+
|
|
48
|
+
@staticmethod
|
|
49
|
+
def is_credentials_location_instance(
|
|
50
|
+
value: Union[Text, "CredentialsLocation"],
|
|
51
|
+
) -> bool:
|
|
52
|
+
"""Check if the value is a CredentialsLocation.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
value: The value to check.
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
True if the value is an instance CredentialsLocation.
|
|
59
|
+
"""
|
|
60
|
+
return isinstance(value, CredentialsLocation)
|
|
61
|
+
|
|
62
|
+
@staticmethod
|
|
63
|
+
def is_property_non_empty_string(
|
|
64
|
+
credentials_location: Dict[Text, Text], property_name: Text
|
|
65
|
+
) -> bool:
|
|
66
|
+
"""Check if the property of credentials location is valid.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
credentials_location: The credentials location to check.
|
|
70
|
+
property_name: The property to check.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
True if the property is valid.
|
|
74
|
+
"""
|
|
75
|
+
if property_name not in credentials_location.keys():
|
|
76
|
+
return False
|
|
77
|
+
|
|
78
|
+
if not isinstance(credentials_location.get(property_name), str):
|
|
79
|
+
return False
|
|
80
|
+
|
|
81
|
+
if credentials_location.get(property_name) == "":
|
|
82
|
+
return False
|
|
83
|
+
|
|
84
|
+
return True
|
|
85
|
+
|
|
86
|
+
@staticmethod
|
|
87
|
+
def is_credentials_location_valid(
|
|
88
|
+
raw_credentials_location: Dict[Text, Text],
|
|
89
|
+
) -> bool:
|
|
90
|
+
"""Check if the configuration is a secret manager configuration.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
raw_credentials_location: A dictionary of values to check.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
True if the value is a valid credentials' location.
|
|
97
|
+
"""
|
|
98
|
+
if not isinstance(raw_credentials_location, dict):
|
|
99
|
+
return False
|
|
100
|
+
|
|
101
|
+
if not CredentialsLocation._is_source_valid(
|
|
102
|
+
raw_credentials_location=raw_credentials_location
|
|
103
|
+
):
|
|
104
|
+
return False
|
|
105
|
+
|
|
106
|
+
if not CredentialsLocation.is_property_non_empty_string(
|
|
107
|
+
credentials_location=raw_credentials_location,
|
|
108
|
+
property_name=SECRET_KEY_LABEL,
|
|
109
|
+
):
|
|
110
|
+
return False
|
|
111
|
+
|
|
112
|
+
return True
|
|
113
|
+
|
|
114
|
+
@staticmethod
|
|
115
|
+
def _is_source_valid(raw_credentials_location: Dict[Text, Text]) -> bool:
|
|
116
|
+
"""Check if the source is valid.
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
raw_credentials_location: A dictionary of values to check.
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
True if the source is valid.
|
|
123
|
+
"""
|
|
124
|
+
is_source_non_empty_string = CredentialsLocation.is_property_non_empty_string(
|
|
125
|
+
credentials_location=raw_credentials_location,
|
|
126
|
+
property_name=SOURCE_KEY_LABEL,
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
if not is_source_non_empty_string:
|
|
130
|
+
return False
|
|
131
|
+
|
|
132
|
+
source_value = raw_credentials_location.get(SOURCE_KEY_LABEL)
|
|
133
|
+
if not source_value or source_value == "":
|
|
134
|
+
return False
|
|
135
|
+
|
|
136
|
+
parts = source_value.split(".")
|
|
137
|
+
|
|
138
|
+
return (
|
|
139
|
+
is_source_non_empty_string
|
|
140
|
+
and len(parts) == 2
|
|
141
|
+
and parts[0] == SECRET_MANAGER_PREFIX
|
|
142
|
+
and parts[1] != ""
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
@staticmethod
|
|
146
|
+
def are_required_properties_valid(
|
|
147
|
+
value: Dict[Text, Any], endpoint_property: Text
|
|
148
|
+
) -> bool:
|
|
149
|
+
"""Check if required properties of raw credentials location are valid.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
value: a raw credentials location value
|
|
153
|
+
endpoint_property: name of the property to which raw
|
|
154
|
+
credentials value is assigned to
|
|
155
|
+
|
|
156
|
+
Returns:
|
|
157
|
+
True if source and secret_key are valid.
|
|
158
|
+
Otherwise, it returns False.
|
|
159
|
+
"""
|
|
160
|
+
if not CredentialsLocation.is_property_non_empty_string(
|
|
161
|
+
value, SOURCE_KEY_LABEL
|
|
162
|
+
):
|
|
163
|
+
logger.error(
|
|
164
|
+
f"Property '{SOURCE_KEY_LABEL}' is missing or invalid for "
|
|
165
|
+
f"'{endpoint_property}'."
|
|
166
|
+
)
|
|
167
|
+
return False
|
|
168
|
+
|
|
169
|
+
if not CredentialsLocation.is_property_non_empty_string(
|
|
170
|
+
value, SECRET_KEY_LABEL
|
|
171
|
+
):
|
|
172
|
+
logger.error(
|
|
173
|
+
f"Property '{SECRET_KEY_LABEL}' is missing or invalid for "
|
|
174
|
+
f"'{endpoint_property}'."
|
|
175
|
+
)
|
|
176
|
+
return False
|
|
177
|
+
|
|
178
|
+
return True
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
@dataclass
|
|
182
|
+
class EndpointTrait:
|
|
183
|
+
"""Represents a trait of an endpoint.
|
|
184
|
+
|
|
185
|
+
Args:
|
|
186
|
+
endpoint_config: The config for an endpoint.
|
|
187
|
+
endpoint_type: The type of the endpoint. Like tracker_store, event_broker etc.
|
|
188
|
+
"""
|
|
189
|
+
|
|
190
|
+
endpoint_config: "EndpointConfig"
|
|
191
|
+
endpoint_type: Text
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
class EndpointReader:
|
|
195
|
+
"""Reads and validates parts of endpoint configuration.
|
|
196
|
+
|
|
197
|
+
This is a helper class for the `EndpointConfig` class.
|
|
198
|
+
"""
|
|
199
|
+
|
|
200
|
+
def __init__(self, endpoint_config: "EndpointConfig"):
|
|
201
|
+
"""Initialise the endpoint reader.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
endpoint_config: The configuration for an endpoint.
|
|
205
|
+
"""
|
|
206
|
+
self.endpoint_config = endpoint_config
|
|
207
|
+
|
|
208
|
+
def get_property_value(
|
|
209
|
+
self,
|
|
210
|
+
endpoint_property_name: Text,
|
|
211
|
+
) -> Optional[Union[str, CredentialsLocation]]:
|
|
212
|
+
"""Return a value stored in the endpoint's property.
|
|
213
|
+
|
|
214
|
+
It is constrained to work only on string values and dictionaries which
|
|
215
|
+
hold credentials' location.
|
|
216
|
+
|
|
217
|
+
Args:
|
|
218
|
+
endpoint_property_name: The endpoint's property name.
|
|
219
|
+
|
|
220
|
+
Returns:
|
|
221
|
+
The value of the property. It can be a string or a CredentialsLocation.
|
|
222
|
+
We have constrained it to work only on string values and dictionaries
|
|
223
|
+
because they are the only types which are supported by the
|
|
224
|
+
endpoint's properties we are currently interested in.
|
|
225
|
+
"""
|
|
226
|
+
endpoint_property_value = self._get_raw_property_value(endpoint_property_name)
|
|
227
|
+
|
|
228
|
+
if (
|
|
229
|
+
CredentialsLocation.is_credentials_location_valid(
|
|
230
|
+
raw_credentials_location=endpoint_property_value
|
|
231
|
+
)
|
|
232
|
+
and endpoint_property_value.get(SOURCE_KEY_LABEL).replace(
|
|
233
|
+
f"{SECRET_MANAGER_PREFIX}.", ""
|
|
234
|
+
)
|
|
235
|
+
in SUPPORTED_SECRET_MANAGERS
|
|
236
|
+
):
|
|
237
|
+
return CredentialsLocation(
|
|
238
|
+
**endpoint_property_value,
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
return endpoint_property_value
|
|
242
|
+
|
|
243
|
+
def _get_raw_property_value(self, property_name: Text) -> Any:
|
|
244
|
+
"""Get the raw value of a property in EndpointsConfig.
|
|
245
|
+
|
|
246
|
+
Args:
|
|
247
|
+
property_name: The key of the property.
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
The raw value of the property.
|
|
251
|
+
"""
|
|
252
|
+
# check if it is stored in kwargs
|
|
253
|
+
property_value = self.endpoint_config.kwargs.get(property_name)
|
|
254
|
+
|
|
255
|
+
if property_value is None:
|
|
256
|
+
# check if it is an attribute of EndpointsConfig
|
|
257
|
+
if property_name in self.endpoint_config.__dict__.keys():
|
|
258
|
+
property_value = self.endpoint_config.__dict__.get(property_name)
|
|
259
|
+
else:
|
|
260
|
+
raise RasaException(
|
|
261
|
+
f"Property {property_name} is not defined in the "
|
|
262
|
+
f"endpoint's configuration."
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
return property_value
|
|
266
|
+
|
|
267
|
+
def has_property(
|
|
268
|
+
self,
|
|
269
|
+
property_name: Text,
|
|
270
|
+
) -> bool:
|
|
271
|
+
"""Return True if an endpoint has a given property.
|
|
272
|
+
|
|
273
|
+
Otherwise, returns False.
|
|
274
|
+
"""
|
|
275
|
+
return property_name in self.get_keys()
|
|
276
|
+
|
|
277
|
+
def is_endpoint_property_valid(
|
|
278
|
+
self,
|
|
279
|
+
endpoint_property: Text,
|
|
280
|
+
) -> bool:
|
|
281
|
+
"""Validate the value of endpoint's property.
|
|
282
|
+
|
|
283
|
+
Args:
|
|
284
|
+
endpoint_property: name of the property to validate
|
|
285
|
+
|
|
286
|
+
Returns:
|
|
287
|
+
True if the value of the property is valid.
|
|
288
|
+
Otherwise, it returns False.
|
|
289
|
+
"""
|
|
290
|
+
value = self.get_property_value(endpoint_property_name=endpoint_property)
|
|
291
|
+
if isinstance(value, str) and value == "":
|
|
292
|
+
logger.error(f"Property '{endpoint_property}' is empty.")
|
|
293
|
+
return False
|
|
294
|
+
|
|
295
|
+
if isinstance(value, dict):
|
|
296
|
+
return CredentialsLocation.are_required_properties_valid(
|
|
297
|
+
value=value, endpoint_property=endpoint_property
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
return True
|
|
301
|
+
|
|
302
|
+
def get_endpoint_properties_managed_by_secret_manager(
|
|
303
|
+
self,
|
|
304
|
+
) -> Optional[Dict[Text, List[Text]]]:
|
|
305
|
+
"""Get endpoint's properties that are managed by the secret manager.
|
|
306
|
+
|
|
307
|
+
Returns:
|
|
308
|
+
A dictionary of the endpoint's properties that are managed
|
|
309
|
+
by the secret manager.
|
|
310
|
+
The key is the name of the secret manager and the value is a list of the
|
|
311
|
+
endpoint's properties that are managed by the secret manager.
|
|
312
|
+
|
|
313
|
+
For example, if the endpoint's properties `username` and `password`
|
|
314
|
+
are managed by the Vault secret manager, the returned dictionary will be:
|
|
315
|
+
{
|
|
316
|
+
vault: ["username", "password"]
|
|
317
|
+
}
|
|
318
|
+
"""
|
|
319
|
+
config_keys: Dict[Text, List[Text]] = {}
|
|
320
|
+
|
|
321
|
+
for config_key_name in self.get_keys():
|
|
322
|
+
config = self.get_property_value(endpoint_property_name=config_key_name)
|
|
323
|
+
|
|
324
|
+
if config and CredentialsLocation.is_credentials_location_instance(config):
|
|
325
|
+
credentials_location = cast(CredentialsLocation, config)
|
|
326
|
+
secret_manager_name = credentials_location.source.replace(
|
|
327
|
+
f"{SECRET_MANAGER_PREFIX}.", ""
|
|
328
|
+
)
|
|
329
|
+
if secret_manager_name not in config_keys.keys():
|
|
330
|
+
config_keys[secret_manager_name] = []
|
|
331
|
+
|
|
332
|
+
config_keys[secret_manager_name].append(config_key_name)
|
|
333
|
+
|
|
334
|
+
return config_keys if len(config_keys.keys()) > 0 else None
|
|
335
|
+
|
|
336
|
+
def get_keys(self) -> List[Text]:
|
|
337
|
+
"""Get the list of all properties of the endpoint's configuration.
|
|
338
|
+
|
|
339
|
+
Returns:
|
|
340
|
+
The list of all properties of the endpoint's configuration.
|
|
341
|
+
"""
|
|
342
|
+
return [key for key in self.endpoint_config.kwargs.keys()] + [
|
|
343
|
+
key for key in self.endpoint_config.__dict__.keys()
|
|
344
|
+
]
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
class TrackerStoreEndpointValidator:
|
|
348
|
+
"""Processes the tracker store key's related to vault configuration."""
|
|
349
|
+
|
|
350
|
+
USERNAME_PROPERTY = "username"
|
|
351
|
+
PASSWORD_PROPERTY = "password"
|
|
352
|
+
|
|
353
|
+
def __init__(self, endpoint_reader: EndpointReader):
|
|
354
|
+
"""Initialise the TrackerStoreEndpointValidator.
|
|
355
|
+
|
|
356
|
+
Args:
|
|
357
|
+
endpoint_reader: The reader of endpoint's configuration.
|
|
358
|
+
"""
|
|
359
|
+
self.endpoint_reader = endpoint_reader
|
|
360
|
+
|
|
361
|
+
def is_endpoint_config_valid(self) -> bool:
|
|
362
|
+
"""Check if the endpoint config is valid.
|
|
363
|
+
|
|
364
|
+
Returns:
|
|
365
|
+
True if the endpoint config is valid, False otherwise.
|
|
366
|
+
"""
|
|
367
|
+
return self._is_username_valid() and self._is_password_valid()
|
|
368
|
+
|
|
369
|
+
def _is_username_valid(self) -> bool:
|
|
370
|
+
"""Check if the username property is valid.
|
|
371
|
+
|
|
372
|
+
Returns:
|
|
373
|
+
True if the username property is valid, False otherwise.
|
|
374
|
+
"""
|
|
375
|
+
return not self.endpoint_reader.has_property(
|
|
376
|
+
property_name=self.USERNAME_PROPERTY
|
|
377
|
+
) or self.endpoint_reader.is_endpoint_property_valid(
|
|
378
|
+
endpoint_property=self.USERNAME_PROPERTY
|
|
379
|
+
)
|
|
380
|
+
|
|
381
|
+
def _is_password_valid(self) -> bool:
|
|
382
|
+
"""Check if the password property is valid.
|
|
383
|
+
|
|
384
|
+
Returns:
|
|
385
|
+
True if the password property is valid, False otherwise.
|
|
386
|
+
"""
|
|
387
|
+
return self.endpoint_reader.has_property(
|
|
388
|
+
property_name=self.PASSWORD_PROPERTY
|
|
389
|
+
) and self.endpoint_reader.is_endpoint_property_valid(
|
|
390
|
+
endpoint_property=self.PASSWORD_PROPERTY
|
|
391
|
+
)
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from typing import Optional, Text, cast
|
|
3
|
+
|
|
4
|
+
from rasa.shared.exceptions import RasaException
|
|
5
|
+
from rasa.utils.endpoints import EndpointConfig, read_endpoint_config
|
|
6
|
+
|
|
7
|
+
from rasa.core.secrets_manager.constants import (
|
|
8
|
+
SECRET_MANAGER_ENV_NAME,
|
|
9
|
+
VAULT_DEFAULT_RASA_SECRETS_PATH,
|
|
10
|
+
VAULT_ENDPOINT_MOUNT_POINT_LABEL,
|
|
11
|
+
VAULT_ENDPOINT_NAMESPACE_LABEL,
|
|
12
|
+
VAULT_ENDPOINT_SECRETS_PATH_LABEL,
|
|
13
|
+
VAULT_ENDPOINT_TRANSIT_MOUNT_POINT_LABEL,
|
|
14
|
+
VAULT_MOUNT_POINT_ENV_NAME,
|
|
15
|
+
VAULT_NAMESPACE_ENV_NAME,
|
|
16
|
+
VAULT_RASA_SECRETS_PATH_ENV_NAME,
|
|
17
|
+
VAULT_SECRET_MANAGER_NAME,
|
|
18
|
+
VAULT_TOKEN_ENV_NAME,
|
|
19
|
+
VAULT_TRANSIT_MOUNT_POINT_ENV_NAME,
|
|
20
|
+
VAULT_URL_ENV_NAME,
|
|
21
|
+
)
|
|
22
|
+
from rasa.core.secrets_manager.secret_manager import (
|
|
23
|
+
SecretManagerConfig,
|
|
24
|
+
SecretsManager,
|
|
25
|
+
SecretsManagerProvider,
|
|
26
|
+
)
|
|
27
|
+
from rasa.core.secrets_manager.vault import (
|
|
28
|
+
VaultSecretManagerConfig,
|
|
29
|
+
VaultSecretManagerNonStrictConfig,
|
|
30
|
+
VaultSecretsManager,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def create(config: SecretManagerConfig) -> Optional[SecretsManager]:
|
|
35
|
+
"""Create a SecretsManager based on the configuration.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
config: SecretManagerConfig
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
SecretsManager created based on the configuration
|
|
42
|
+
"""
|
|
43
|
+
secret_manager = None
|
|
44
|
+
|
|
45
|
+
if config.secret_manager_type == VAULT_SECRET_MANAGER_NAME:
|
|
46
|
+
vault_config = cast(VaultSecretManagerConfig, config)
|
|
47
|
+
secret_manager = VaultSecretsManager(
|
|
48
|
+
host=vault_config.url,
|
|
49
|
+
token=vault_config.token,
|
|
50
|
+
transit_mount_point=vault_config.transit_mount_point,
|
|
51
|
+
secrets_path=vault_config.secrets_path,
|
|
52
|
+
namespace=vault_config.namespace,
|
|
53
|
+
mount_point=vault_config.mount_point,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
return secret_manager
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def read_vault_endpoint_config(
|
|
60
|
+
endpoints_file: Optional[Text],
|
|
61
|
+
) -> Optional[VaultSecretManagerNonStrictConfig]:
|
|
62
|
+
"""Read endpoints file to discover vault config.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
endpoints_file: Path to the endpoints file
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
A configuration for the vault secret manager
|
|
69
|
+
"""
|
|
70
|
+
if endpoints_file is None:
|
|
71
|
+
return None
|
|
72
|
+
|
|
73
|
+
endpoint_config = read_endpoint_config(
|
|
74
|
+
filename=endpoints_file, endpoint_type="secrets_manager"
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
if endpoint_config:
|
|
78
|
+
url = endpoint_config.url
|
|
79
|
+
token = endpoint_config.token
|
|
80
|
+
transit_mount_point = endpoint_config.kwargs.get(
|
|
81
|
+
VAULT_ENDPOINT_TRANSIT_MOUNT_POINT_LABEL
|
|
82
|
+
)
|
|
83
|
+
secrets_path = endpoint_config.kwargs.get(VAULT_ENDPOINT_SECRETS_PATH_LABEL)
|
|
84
|
+
namespace = endpoint_config.kwargs.get(VAULT_ENDPOINT_NAMESPACE_LABEL)
|
|
85
|
+
mount_point = endpoint_config.kwargs.get(VAULT_ENDPOINT_MOUNT_POINT_LABEL)
|
|
86
|
+
|
|
87
|
+
return VaultSecretManagerNonStrictConfig(
|
|
88
|
+
url=url,
|
|
89
|
+
token=token,
|
|
90
|
+
transit_mount_point=transit_mount_point,
|
|
91
|
+
secrets_path=secrets_path or VAULT_DEFAULT_RASA_SECRETS_PATH,
|
|
92
|
+
namespace=namespace,
|
|
93
|
+
mount_point=mount_point,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
return None
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def read_vault_env_vars() -> VaultSecretManagerNonStrictConfig:
|
|
100
|
+
"""Read environment variables to discover vault config.
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
A configuration for the vault secret manager
|
|
104
|
+
"""
|
|
105
|
+
url = os.getenv(VAULT_URL_ENV_NAME)
|
|
106
|
+
token = os.getenv(VAULT_TOKEN_ENV_NAME)
|
|
107
|
+
transit_mount_point = os.getenv(VAULT_TRANSIT_MOUNT_POINT_ENV_NAME)
|
|
108
|
+
secrets_path = os.getenv(VAULT_RASA_SECRETS_PATH_ENV_NAME)
|
|
109
|
+
namespace = os.getenv(VAULT_NAMESPACE_ENV_NAME)
|
|
110
|
+
mount_point = os.getenv(VAULT_MOUNT_POINT_ENV_NAME)
|
|
111
|
+
|
|
112
|
+
return VaultSecretManagerNonStrictConfig(
|
|
113
|
+
url=url,
|
|
114
|
+
token=token,
|
|
115
|
+
transit_mount_point=transit_mount_point,
|
|
116
|
+
secrets_path=secrets_path,
|
|
117
|
+
namespace=namespace,
|
|
118
|
+
mount_point=mount_point,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def read_vault_config(
|
|
123
|
+
endpoints_file: Optional[Text],
|
|
124
|
+
) -> Optional[VaultSecretManagerConfig]:
|
|
125
|
+
"""Read endpoints file to discover vault config.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
endpoints_file: Path to the endpoints file
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
A configuration for the vault secret manager
|
|
132
|
+
"""
|
|
133
|
+
env_config = read_vault_env_vars()
|
|
134
|
+
endpoint_config = read_vault_endpoint_config(endpoints_file)
|
|
135
|
+
|
|
136
|
+
if env_config.is_valid() and endpoint_config is None:
|
|
137
|
+
return VaultSecretManagerConfig(
|
|
138
|
+
**env_config.__dict__,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
if endpoint_config is not None:
|
|
142
|
+
vault_config = env_config.merge(endpoint_config)
|
|
143
|
+
|
|
144
|
+
if vault_config.is_empty():
|
|
145
|
+
return None
|
|
146
|
+
|
|
147
|
+
if vault_config.is_valid():
|
|
148
|
+
return VaultSecretManagerConfig(
|
|
149
|
+
**vault_config.__dict__,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
raise RasaException(
|
|
153
|
+
f"Cannot start Vault secret manager based on configuration from env vars "
|
|
154
|
+
f"{VAULT_URL_ENV_NAME} = {env_config.url}, "
|
|
155
|
+
f"{VAULT_TOKEN_ENV_NAME} = {env_config.token}, "
|
|
156
|
+
f"{VAULT_RASA_SECRETS_PATH_ENV_NAME} = {env_config.secrets_path}, "
|
|
157
|
+
f"{VAULT_TRANSIT_MOUNT_POINT_ENV_NAME} = {env_config.transit_mount_point}. "
|
|
158
|
+
f"{VAULT_NAMESPACE_ENV_NAME} = {env_config.namespace}. "
|
|
159
|
+
f"{VAULT_MOUNT_POINT_ENV_NAME} = {env_config.mount_point}. "
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def read_secret_manager_from_endpoint_config(
|
|
164
|
+
endpoints_file: Text,
|
|
165
|
+
) -> Optional[EndpointConfig]:
|
|
166
|
+
"""Read endpoints file to discover secret manager.
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
endpoints_file: Path to the endpoints file
|
|
170
|
+
|
|
171
|
+
Returns:
|
|
172
|
+
A secret manager
|
|
173
|
+
"""
|
|
174
|
+
secret_manager_config = read_endpoint_config(
|
|
175
|
+
filename=endpoints_file, endpoint_type="secrets_manager"
|
|
176
|
+
)
|
|
177
|
+
if secret_manager_config is None:
|
|
178
|
+
return None
|
|
179
|
+
|
|
180
|
+
return secret_manager_config
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def read_secret_manager_config(
|
|
184
|
+
endpoints_file: Optional[Text],
|
|
185
|
+
) -> Optional[SecretManagerConfig]:
|
|
186
|
+
"""Read endpoints file to discover secret manager config.
|
|
187
|
+
|
|
188
|
+
If the secret manager is configured, set the environment variables required
|
|
189
|
+
to connect to the secret manager.
|
|
190
|
+
The above steps are skipped if the environment variables are already set.
|
|
191
|
+
|
|
192
|
+
Args:
|
|
193
|
+
endpoints_file: Path to the endpoints file
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
A configuration for the secret manager
|
|
197
|
+
"""
|
|
198
|
+
secret_manager_name = os.getenv(SECRET_MANAGER_ENV_NAME)
|
|
199
|
+
|
|
200
|
+
if secret_manager_name is None:
|
|
201
|
+
if endpoints_file is None:
|
|
202
|
+
return None
|
|
203
|
+
|
|
204
|
+
secret_manager_config = read_secret_manager_from_endpoint_config(
|
|
205
|
+
endpoints_file=endpoints_file
|
|
206
|
+
)
|
|
207
|
+
if secret_manager_config is None:
|
|
208
|
+
return None
|
|
209
|
+
|
|
210
|
+
secret_manager_name = secret_manager_config.type
|
|
211
|
+
|
|
212
|
+
if secret_manager_name == VAULT_SECRET_MANAGER_NAME:
|
|
213
|
+
return read_vault_config(endpoints_file)
|
|
214
|
+
|
|
215
|
+
return None
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def load_secret_manager(endpoints_file: Optional[Text]) -> Optional[SecretsManager]:
|
|
219
|
+
"""Create secret manager based on the configuration in the endpoints file.
|
|
220
|
+
|
|
221
|
+
Args:
|
|
222
|
+
endpoints_file: Path to the endpoints file.
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
The secret manager or `None` if no secret manager is configured.
|
|
226
|
+
"""
|
|
227
|
+
secret_manager_config = read_secret_manager_config(endpoints_file=endpoints_file)
|
|
228
|
+
|
|
229
|
+
if (
|
|
230
|
+
secret_manager_config is None
|
|
231
|
+
or secret_manager_config.secret_manager_type is None
|
|
232
|
+
):
|
|
233
|
+
return None
|
|
234
|
+
|
|
235
|
+
provider = SecretsManagerProvider()
|
|
236
|
+
secret_manager = create(secret_manager_config)
|
|
237
|
+
|
|
238
|
+
if secret_manager is not None:
|
|
239
|
+
provider.register_secret_manager(secret_manager)
|
|
240
|
+
|
|
241
|
+
return secret_manager
|