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,584 @@
|
|
|
1
|
+
import base64
|
|
2
|
+
import logging
|
|
3
|
+
import re
|
|
4
|
+
import time
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from datetime import datetime, timedelta
|
|
7
|
+
from typing import Any, Dict, Optional, Text, Union, cast
|
|
8
|
+
|
|
9
|
+
import hvac.exceptions
|
|
10
|
+
from apscheduler.schedulers.background import BackgroundScheduler
|
|
11
|
+
from apscheduler.triggers.interval import IntervalTrigger
|
|
12
|
+
from rasa.shared.exceptions import RasaException
|
|
13
|
+
from rasa.utils.endpoints import EndpointConfig
|
|
14
|
+
|
|
15
|
+
from rasa.core.secrets_manager.constants import (
|
|
16
|
+
TRACKER_STORE_ENDPOINT_TYPE,
|
|
17
|
+
TRANSIT_KEY_FOR_ENCRYPTION_LABEL,
|
|
18
|
+
VAULT_MOUNT_POINT_DEFAULT_VALUE,
|
|
19
|
+
VAULT_SECRET_MANAGER_NAME,
|
|
20
|
+
)
|
|
21
|
+
from rasa.core.secrets_manager.endpoints import (
|
|
22
|
+
CredentialsLocation,
|
|
23
|
+
EndpointReader,
|
|
24
|
+
EndpointTrait,
|
|
25
|
+
TrackerStoreEndpointValidator,
|
|
26
|
+
)
|
|
27
|
+
from rasa.core.secrets_manager.secret_manager import SecretManagerConfig, SecretsManager
|
|
28
|
+
|
|
29
|
+
logger = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class VaultCredentialsLocation:
|
|
33
|
+
"""Represents where the secret is stored in Vault.
|
|
34
|
+
|
|
35
|
+
Secret can be encrypted with vault's transit engine.
|
|
36
|
+
|
|
37
|
+
source: The source of the secret.
|
|
38
|
+
secret_key: The key of the secret.
|
|
39
|
+
transit_key: The key used to encrypt the secret.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
def __init__(
|
|
43
|
+
self,
|
|
44
|
+
source: Text,
|
|
45
|
+
secret_key: Text,
|
|
46
|
+
transit_key: Optional[Text] = None,
|
|
47
|
+
) -> None:
|
|
48
|
+
"""Initialise the secret.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
source: The source of the secret.
|
|
52
|
+
secret_key: The key of the secret.
|
|
53
|
+
transit_key: The key used to encrypt the secret.
|
|
54
|
+
"""
|
|
55
|
+
self.source = source
|
|
56
|
+
self.secret_key = secret_key
|
|
57
|
+
self.transit_key = transit_key
|
|
58
|
+
|
|
59
|
+
@classmethod
|
|
60
|
+
def from_credentials_location(
|
|
61
|
+
cls, credentials_location: CredentialsLocation
|
|
62
|
+
) -> "VaultCredentialsLocation":
|
|
63
|
+
"""Initialise the secret from CredentialsLocation.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
credentials_location: The CredentialsLocation.
|
|
67
|
+
"""
|
|
68
|
+
transit_key = (
|
|
69
|
+
credentials_location.kwargs.get(TRANSIT_KEY_FOR_ENCRYPTION_LABEL)
|
|
70
|
+
if credentials_location.kwargs
|
|
71
|
+
else None
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
return cls(
|
|
75
|
+
source=credentials_location.source,
|
|
76
|
+
secret_key=credentials_location.secret_key,
|
|
77
|
+
transit_key=transit_key,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
@staticmethod
|
|
81
|
+
def is_vault_credential_location_instance(
|
|
82
|
+
value: Union[str, "VaultCredentialsLocation"],
|
|
83
|
+
) -> bool:
|
|
84
|
+
"""Check if the config key is a vault encrypted secret.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
value: The config key.
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
True if value is an instance of VaultCredentialsLocation.
|
|
91
|
+
"""
|
|
92
|
+
return isinstance(value, VaultCredentialsLocation)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class VaultEndpointConfigReader:
|
|
96
|
+
"""Used to read Vault location specification in the endpoint config."""
|
|
97
|
+
|
|
98
|
+
def __init__(self, endpoint_config: "EndpointConfig") -> None:
|
|
99
|
+
"""Initialize the Vault endpoint processor.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
endpoint_config: The endpoint config.
|
|
103
|
+
"""
|
|
104
|
+
self._endpoint_config_reader = EndpointReader(endpoint_config=endpoint_config)
|
|
105
|
+
|
|
106
|
+
def get_credentials_location(
|
|
107
|
+
self,
|
|
108
|
+
property_name: Text,
|
|
109
|
+
) -> Optional[VaultCredentialsLocation]:
|
|
110
|
+
"""Get the VaultCredentialsLocation for an endpoint property.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
property_name: The name of the endpoint's property
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
The VaultCredentialsLocation for the property.
|
|
117
|
+
"""
|
|
118
|
+
property_value = self._endpoint_config_reader.get_property_value(property_name)
|
|
119
|
+
|
|
120
|
+
if property_value and CredentialsLocation.is_credentials_location_instance(
|
|
121
|
+
property_value
|
|
122
|
+
):
|
|
123
|
+
credentials_location = cast(CredentialsLocation, property_value)
|
|
124
|
+
if (
|
|
125
|
+
credentials_location.get_secret_manager_name()
|
|
126
|
+
== VAULT_SECRET_MANAGER_NAME
|
|
127
|
+
):
|
|
128
|
+
return VaultCredentialsLocation.from_credentials_location(
|
|
129
|
+
credentials_location=credentials_location
|
|
130
|
+
)
|
|
131
|
+
else:
|
|
132
|
+
raise RasaException(
|
|
133
|
+
f"Secret manager {credentials_location.source} is not supported."
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
return None
|
|
137
|
+
|
|
138
|
+
def get_transit_keys_per_endpoint_property(self) -> Optional[Dict[Text, Text]]:
|
|
139
|
+
"""Get the transit keys for endpoint's properties.
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
A dictionary of the transit keys per endpoint's properties.
|
|
143
|
+
|
|
144
|
+
Example:
|
|
145
|
+
{
|
|
146
|
+
"username": "transit_key_for_username",
|
|
147
|
+
"password": "transit_key_for_password"
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
"""
|
|
151
|
+
transit_keys = {}
|
|
152
|
+
|
|
153
|
+
for config_key_name in self._endpoint_config_reader.get_keys():
|
|
154
|
+
credentials_location = self.get_credentials_location(
|
|
155
|
+
property_name=config_key_name
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
if (
|
|
159
|
+
credentials_location
|
|
160
|
+
and VaultCredentialsLocation.is_vault_credential_location_instance(
|
|
161
|
+
credentials_location
|
|
162
|
+
)
|
|
163
|
+
):
|
|
164
|
+
if credentials_location.transit_key:
|
|
165
|
+
transit_keys[credentials_location.secret_key] = (
|
|
166
|
+
credentials_location.transit_key
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
return transit_keys if transit_keys else None
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
class VaultSecretsManager(SecretsManager):
|
|
173
|
+
"""Secrets Manager for Vault.
|
|
174
|
+
|
|
175
|
+
It supports both transit secret and kv engines.
|
|
176
|
+
"""
|
|
177
|
+
|
|
178
|
+
def __init__(
|
|
179
|
+
self,
|
|
180
|
+
host: Text,
|
|
181
|
+
token: Text,
|
|
182
|
+
secrets_path: Text,
|
|
183
|
+
transit_mount_point: Optional[Text] = None,
|
|
184
|
+
namespace: Optional[Text] = None,
|
|
185
|
+
mount_point: Optional[Text] = None,
|
|
186
|
+
):
|
|
187
|
+
"""Initialise the VaultSecretsManager.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
host: The host of the vault server.
|
|
191
|
+
token: The token to authenticate with the vault server.
|
|
192
|
+
secrets_path: The path to the secrets in the vault server.
|
|
193
|
+
transit_mount_point: The mount point of the transit engine.
|
|
194
|
+
namespace: The namespace in which secrets reside in.
|
|
195
|
+
mount_point: The mount point of the kv engine.
|
|
196
|
+
"""
|
|
197
|
+
self.host = host
|
|
198
|
+
self.transit_mount_point = transit_mount_point
|
|
199
|
+
self.token = token
|
|
200
|
+
self.secrets_path = secrets_path
|
|
201
|
+
self.mount_point = mount_point or VAULT_MOUNT_POINT_DEFAULT_VALUE
|
|
202
|
+
self.namespace = namespace
|
|
203
|
+
|
|
204
|
+
# Create client
|
|
205
|
+
self.client = hvac.Client(
|
|
206
|
+
url=self.host,
|
|
207
|
+
token=self.token,
|
|
208
|
+
namespace=self.namespace,
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
self.vault_token_manager = VaultTokenManager(host=self.host, token=self.token)
|
|
212
|
+
|
|
213
|
+
self.vault_token_manager.start()
|
|
214
|
+
|
|
215
|
+
def name(self) -> Text:
|
|
216
|
+
"""Return unique identifier of the secret manager.
|
|
217
|
+
|
|
218
|
+
Returns:
|
|
219
|
+
The unique identifier of the secret manager.
|
|
220
|
+
"""
|
|
221
|
+
return VAULT_SECRET_MANAGER_NAME
|
|
222
|
+
|
|
223
|
+
def load_secrets(self, endpoint_trait: "EndpointTrait") -> Dict[Text, Any]:
|
|
224
|
+
"""Load secrets from vault server.
|
|
225
|
+
|
|
226
|
+
If secrets are encrypted with transit engine,
|
|
227
|
+
they will be decrypted if transit_keys are provided.
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
endpoint_trait: The endpoint trait.
|
|
231
|
+
|
|
232
|
+
Returns:
|
|
233
|
+
The secrets mapped to their endpoint property.
|
|
234
|
+
|
|
235
|
+
Example:
|
|
236
|
+
{
|
|
237
|
+
"username": "username stored in vault
|
|
238
|
+
"password": "password stored in vault"
|
|
239
|
+
}
|
|
240
|
+
"""
|
|
241
|
+
logger.info(f"Loading secrets from vault server at {self.host}.")
|
|
242
|
+
read_response = self.client.secrets.kv.read_secret_version(
|
|
243
|
+
mount_point=self.mount_point, path=self.secrets_path
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
secrets = read_response["data"]["data"]
|
|
247
|
+
|
|
248
|
+
reader = get_vault_endpoint_reader(endpoint_trait=endpoint_trait)
|
|
249
|
+
|
|
250
|
+
if reader is None:
|
|
251
|
+
raise RasaException(
|
|
252
|
+
f"Failed to create endpoint processor "
|
|
253
|
+
f"for endpoint {endpoint_trait.endpoint_type}"
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
transit_keys = reader.get_transit_keys_per_endpoint_property()
|
|
257
|
+
|
|
258
|
+
if transit_keys is not None:
|
|
259
|
+
self._decode_transit_secrets(secrets=secrets, transit_keys=transit_keys)
|
|
260
|
+
|
|
261
|
+
logger.info(f"Successfully loaded secrets from vault server at {self.host}.")
|
|
262
|
+
|
|
263
|
+
return secrets
|
|
264
|
+
|
|
265
|
+
@staticmethod
|
|
266
|
+
def _is_vault_transit_cipher(cipher: Text) -> bool:
|
|
267
|
+
"""Check if the cipher is a transit cipher.
|
|
268
|
+
|
|
269
|
+
Args:
|
|
270
|
+
cipher: The cipher to check.
|
|
271
|
+
|
|
272
|
+
Returns:
|
|
273
|
+
True if the cipher is a transit cipher, False otherwise.
|
|
274
|
+
"""
|
|
275
|
+
# if cipher starts with vault:v/d: it is a transit cipher
|
|
276
|
+
regexp = re.compile(r"^vault:v\d+:")
|
|
277
|
+
return re.search(regexp, cipher) is not None
|
|
278
|
+
|
|
279
|
+
def _decrypt_transit_cipher(self, cipher: Text, transit_key_name: Text) -> Text:
|
|
280
|
+
"""Decrypt the cipher using the transit key.
|
|
281
|
+
|
|
282
|
+
Args:
|
|
283
|
+
cipher: The cipher to decrypt.
|
|
284
|
+
transit_key_name: The name of the transit key to use.
|
|
285
|
+
|
|
286
|
+
Returns:
|
|
287
|
+
The cipher decrypted with the transit key.
|
|
288
|
+
"""
|
|
289
|
+
logger.info("Decrypting cipher using transit key.")
|
|
290
|
+
decrypted_data = self.client.secrets.transit.decrypt_data(
|
|
291
|
+
name=transit_key_name,
|
|
292
|
+
ciphertext=cipher,
|
|
293
|
+
mount_point=self.transit_mount_point,
|
|
294
|
+
)
|
|
295
|
+
logger.info("Finished decrypting cipher using transit key.")
|
|
296
|
+
|
|
297
|
+
return (
|
|
298
|
+
base64.standard_b64decode(decrypted_data.get("data").get("plaintext"))
|
|
299
|
+
.decode("utf-8")
|
|
300
|
+
.strip()
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
def _decode_transit_secrets(
|
|
304
|
+
self, secrets: Dict[Text, Text], transit_keys: Optional[Dict[Text, Text]] = None
|
|
305
|
+
) -> None:
|
|
306
|
+
"""Decode values from tracker_store if they are encrypted with transit engine.
|
|
307
|
+
|
|
308
|
+
Args:
|
|
309
|
+
secrets: Map of secrets to decode. The values will be updated in place.
|
|
310
|
+
transit_keys: Map of secrets to transit keys.
|
|
311
|
+
"""
|
|
312
|
+
if transit_keys is None:
|
|
313
|
+
return
|
|
314
|
+
|
|
315
|
+
logger.info("Start to decrypt secrets using transit secrets engine.")
|
|
316
|
+
for secret_name, secret_value in secrets.items():
|
|
317
|
+
if self._is_vault_transit_cipher(secret_value):
|
|
318
|
+
transit_key_name = transit_keys.get(secret_name)
|
|
319
|
+
if transit_key_name is not None:
|
|
320
|
+
secrets[secret_name] = self._decrypt_transit_cipher(
|
|
321
|
+
cipher=secret_value, transit_key_name=transit_key_name
|
|
322
|
+
)
|
|
323
|
+
logger.info("Finished decrypting secrets using transit secrets engine.")
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
class VaultTokenManager:
|
|
327
|
+
"""VaultTokenManager renews the vault token if it renewable."""
|
|
328
|
+
|
|
329
|
+
TOKEN_MINIMAL_REMAINING_LIFE_IN_SECONDS = 1
|
|
330
|
+
TOKEN_MINIMAL_REFRESH_TIME_IN_SECONDS = 1
|
|
331
|
+
# The bottom threshold for token's TTL (time to live) in seconds.
|
|
332
|
+
# Set to 15 seconds to compensate for possible network latency
|
|
333
|
+
TOKEN_TTL_BOTTOM_THRESHOLD_IN_SECONDS = 15
|
|
334
|
+
DEFAULT_NUMBER_OF_RETRIES_FOR_TOKEN_REFRESH = 5
|
|
335
|
+
TIME_TO_WAIT_BETWEEN_RETRIES_IN_SECONDS = 1
|
|
336
|
+
|
|
337
|
+
def __init__(
|
|
338
|
+
self,
|
|
339
|
+
host: Text,
|
|
340
|
+
token: Text,
|
|
341
|
+
number_of_retries: int = DEFAULT_NUMBER_OF_RETRIES_FOR_TOKEN_REFRESH,
|
|
342
|
+
):
|
|
343
|
+
"""Initialise the VaultTokenManager.
|
|
344
|
+
|
|
345
|
+
Args:
|
|
346
|
+
host: The host of the vault server.
|
|
347
|
+
token: The token to authenticate with the vault server.
|
|
348
|
+
If the token is expiring, it will be automatically refreshed.
|
|
349
|
+
number_of_retries: The number of retries to refresh the token.
|
|
350
|
+
"""
|
|
351
|
+
self.host = host
|
|
352
|
+
self.token = token
|
|
353
|
+
self.number_of_retries = number_of_retries
|
|
354
|
+
|
|
355
|
+
self.client = hvac.Client(
|
|
356
|
+
url=self.host,
|
|
357
|
+
token=self.token,
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
def start(self) -> None:
|
|
361
|
+
"""Start refreshing the token if it is expiring."""
|
|
362
|
+
renew_response: Dict[Text, Dict[Text, Any]] = (
|
|
363
|
+
self.client.auth.token.lookup_self()
|
|
364
|
+
)
|
|
365
|
+
is_token_expiring = renew_response["data"]["renewable"]
|
|
366
|
+
if is_token_expiring:
|
|
367
|
+
refresh_interval_in_seconds = renew_response["data"]["creation_ttl"]
|
|
368
|
+
first_expiring_period_in_seconds = renew_response["data"]["ttl"]
|
|
369
|
+
logger.info("Token is expiring. Starting periodic token refresh.")
|
|
370
|
+
self._start_token_refresh(
|
|
371
|
+
first_expiring_period_in_seconds, refresh_interval_in_seconds
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
def _renew_token(self) -> None:
|
|
375
|
+
"""Renew the token."""
|
|
376
|
+
index = 0
|
|
377
|
+
for index in range(self.number_of_retries):
|
|
378
|
+
try:
|
|
379
|
+
logger.info("Renewing vault token.")
|
|
380
|
+
self.client.auth.token.renew_self()
|
|
381
|
+
logger.info("Finished renewing vault token.")
|
|
382
|
+
break
|
|
383
|
+
except Exception as e:
|
|
384
|
+
if index == self.number_of_retries - 1:
|
|
385
|
+
raise RasaException(
|
|
386
|
+
f"Failed to renew vault token after "
|
|
387
|
+
f"{self.number_of_retries} retries."
|
|
388
|
+
)
|
|
389
|
+
|
|
390
|
+
logger.warning(
|
|
391
|
+
f"Failed to renew vault token. "
|
|
392
|
+
f"Error: {e}. "
|
|
393
|
+
f"Trying again in "
|
|
394
|
+
f"{self.TIME_TO_WAIT_BETWEEN_RETRIES_IN_SECONDS} second(s)"
|
|
395
|
+
)
|
|
396
|
+
time.sleep(self.TIME_TO_WAIT_BETWEEN_RETRIES_IN_SECONDS)
|
|
397
|
+
|
|
398
|
+
def _start_token_refresh(
|
|
399
|
+
self, remaining_life_in_seconds: int, refresh_interval_in_seconds: int
|
|
400
|
+
) -> None:
|
|
401
|
+
"""Start a background job to refresh the token.
|
|
402
|
+
|
|
403
|
+
Args:
|
|
404
|
+
remaining_life_in_seconds: The remaining life of the token in seconds.
|
|
405
|
+
This period can be shorter than the token's TTL.
|
|
406
|
+
refresh_interval_in_seconds: The refresh interval in seconds.
|
|
407
|
+
It matches the token's TTL (creation_ttl).
|
|
408
|
+
This interval is used after the remaining life.
|
|
409
|
+
"""
|
|
410
|
+
self.scheduler = BackgroundScheduler()
|
|
411
|
+
self.scheduler.start()
|
|
412
|
+
|
|
413
|
+
# Reduce the refresh interval and the remaining life by
|
|
414
|
+
# TOKEN_TTL_BOTTOM_THRESHOLD_IN_SECONDS
|
|
415
|
+
# to compensate for possible network latency.
|
|
416
|
+
# If token's TTL and remaining TTL is less than
|
|
417
|
+
# TOKEN_TTL_BOTTOM_THRESHOLD_IN_SECONDS
|
|
418
|
+
# we must not reduce the refresh interval and the remaining life
|
|
419
|
+
if refresh_interval_in_seconds > self.TOKEN_TTL_BOTTOM_THRESHOLD_IN_SECONDS:
|
|
420
|
+
refresh_interval_in_seconds -= self.TOKEN_TTL_BOTTOM_THRESHOLD_IN_SECONDS
|
|
421
|
+
else:
|
|
422
|
+
logger.info(
|
|
423
|
+
f"Token's refresh interval is less than "
|
|
424
|
+
f"{self.TOKEN_TTL_BOTTOM_THRESHOLD_IN_SECONDS} seconds. "
|
|
425
|
+
f"Readjusting the refresh interval to "
|
|
426
|
+
f"{self.TOKEN_MINIMAL_REFRESH_TIME_IN_SECONDS} seconds."
|
|
427
|
+
)
|
|
428
|
+
refresh_interval_in_seconds = self.TOKEN_MINIMAL_REFRESH_TIME_IN_SECONDS
|
|
429
|
+
|
|
430
|
+
if remaining_life_in_seconds > self.TOKEN_TTL_BOTTOM_THRESHOLD_IN_SECONDS:
|
|
431
|
+
remaining_life_in_seconds -= self.TOKEN_TTL_BOTTOM_THRESHOLD_IN_SECONDS
|
|
432
|
+
else:
|
|
433
|
+
logger.info(
|
|
434
|
+
f"Token's TTL is less than "
|
|
435
|
+
f"{self.TOKEN_TTL_BOTTOM_THRESHOLD_IN_SECONDS} seconds. "
|
|
436
|
+
f"Readjusting the refresh interval to "
|
|
437
|
+
f"{self.TOKEN_MINIMAL_REMAINING_LIFE_IN_SECONDS} seconds."
|
|
438
|
+
)
|
|
439
|
+
remaining_life_in_seconds = self.TOKEN_MINIMAL_REMAINING_LIFE_IN_SECONDS
|
|
440
|
+
|
|
441
|
+
self.scheduler.add_job(
|
|
442
|
+
func=self._renew_token,
|
|
443
|
+
trigger=IntervalTrigger(
|
|
444
|
+
# add seconds to current time to make sure that the first refresh
|
|
445
|
+
start_date=datetime.now()
|
|
446
|
+
+ timedelta(seconds=remaining_life_in_seconds),
|
|
447
|
+
seconds=refresh_interval_in_seconds,
|
|
448
|
+
),
|
|
449
|
+
)
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
class VaultSecretManagerConfig(SecretManagerConfig):
|
|
453
|
+
"""Configuration for the Vault secret manager."""
|
|
454
|
+
|
|
455
|
+
def __init__(
|
|
456
|
+
self,
|
|
457
|
+
url: Text,
|
|
458
|
+
token: Text,
|
|
459
|
+
secrets_path: Text,
|
|
460
|
+
transit_mount_point: Text = "transit",
|
|
461
|
+
namespace: Optional[Text] = None,
|
|
462
|
+
mount_point: Optional[Text] = None,
|
|
463
|
+
) -> None:
|
|
464
|
+
"""Initialise the VaultSecretManagerConfig.
|
|
465
|
+
|
|
466
|
+
Args:
|
|
467
|
+
url: The URL of the vault server.
|
|
468
|
+
token: The token to authenticate with the vault server.
|
|
469
|
+
secrets_path: The path to the secrets in the vault server.
|
|
470
|
+
transit_mount_point: The mount point of the transit engine.
|
|
471
|
+
namespace: The namespace in which secrets reside in.
|
|
472
|
+
"""
|
|
473
|
+
super().__init__(VAULT_SECRET_MANAGER_NAME)
|
|
474
|
+
self.url = url
|
|
475
|
+
self.token = token
|
|
476
|
+
self.secrets_path = secrets_path
|
|
477
|
+
self.transit_mount_point = transit_mount_point
|
|
478
|
+
self.namespace = namespace
|
|
479
|
+
self.mount_point = mount_point
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
@dataclass
|
|
483
|
+
class VaultSecretManagerNonStrictConfig:
|
|
484
|
+
"""Non-Strict configuration for the Vault secret manager.
|
|
485
|
+
|
|
486
|
+
It is used to validate and merge configurations
|
|
487
|
+
from environment variables and endpoints.yml file.
|
|
488
|
+
"""
|
|
489
|
+
|
|
490
|
+
url: Optional[Text]
|
|
491
|
+
token: Optional[Text]
|
|
492
|
+
secrets_path: Optional[Text]
|
|
493
|
+
transit_mount_point: Optional[Text]
|
|
494
|
+
namespace: Optional[Text] = None
|
|
495
|
+
mount_point: Optional[Text] = None
|
|
496
|
+
|
|
497
|
+
def is_empty(self) -> bool:
|
|
498
|
+
"""Check if all the values are empty."""
|
|
499
|
+
return (
|
|
500
|
+
(self.url is None or self.url == "")
|
|
501
|
+
and (self.token is None or self.token == "")
|
|
502
|
+
and (self.secrets_path is None or self.secrets_path == "")
|
|
503
|
+
and (self.transit_mount_point is None or self.transit_mount_point == "")
|
|
504
|
+
and (self.namespace is None or self.namespace == "")
|
|
505
|
+
and (self.mount_point is None or self.mount_point == "")
|
|
506
|
+
)
|
|
507
|
+
|
|
508
|
+
def is_valid(self) -> bool:
|
|
509
|
+
"""Check if all the values are valid.
|
|
510
|
+
|
|
511
|
+
url and token are required,
|
|
512
|
+
secrets_path is required,
|
|
513
|
+
transit_mount_point is optional, but if provided, it must not be empty.
|
|
514
|
+
|
|
515
|
+
Returns:
|
|
516
|
+
True if all the values are valid, False otherwise.
|
|
517
|
+
"""
|
|
518
|
+
return (
|
|
519
|
+
self.url is not None
|
|
520
|
+
and self.url != ""
|
|
521
|
+
and self.token is not None
|
|
522
|
+
and self.token != ""
|
|
523
|
+
and self.secrets_path is not None
|
|
524
|
+
and self.secrets_path != ""
|
|
525
|
+
and self._is_optional_value_valid(self.transit_mount_point)
|
|
526
|
+
and self._is_optional_value_valid(self.namespace)
|
|
527
|
+
and self._is_optional_value_valid(self.mount_point)
|
|
528
|
+
)
|
|
529
|
+
|
|
530
|
+
@staticmethod
|
|
531
|
+
def _is_optional_value_valid(value: Optional[Text]) -> bool:
|
|
532
|
+
"""Check if the optional value is valid.
|
|
533
|
+
|
|
534
|
+
Args:
|
|
535
|
+
value: The optional value to check.
|
|
536
|
+
|
|
537
|
+
Returns:
|
|
538
|
+
True if the optional value is valid, False otherwise.
|
|
539
|
+
"""
|
|
540
|
+
return value is None or value != ""
|
|
541
|
+
|
|
542
|
+
def merge(
|
|
543
|
+
self, other: "VaultSecretManagerNonStrictConfig"
|
|
544
|
+
) -> "VaultSecretManagerNonStrictConfig":
|
|
545
|
+
"""Merge two VaultSecretManagerEnvConfig objects.
|
|
546
|
+
|
|
547
|
+
Args:
|
|
548
|
+
other: The other VaultSecretManagerEnvConfig object.
|
|
549
|
+
|
|
550
|
+
Returns:
|
|
551
|
+
The merged VaultSecretManagerEnvConfig object.
|
|
552
|
+
"""
|
|
553
|
+
return VaultSecretManagerNonStrictConfig(
|
|
554
|
+
url=self.url or other.url,
|
|
555
|
+
token=self.token or other.token,
|
|
556
|
+
secrets_path=self.secrets_path or other.secrets_path,
|
|
557
|
+
transit_mount_point=self.transit_mount_point or other.transit_mount_point,
|
|
558
|
+
namespace=self.namespace or other.namespace,
|
|
559
|
+
mount_point=self.mount_point or other.mount_point,
|
|
560
|
+
)
|
|
561
|
+
|
|
562
|
+
|
|
563
|
+
def get_vault_endpoint_reader(
|
|
564
|
+
endpoint_trait: EndpointTrait,
|
|
565
|
+
) -> Optional[VaultEndpointConfigReader]:
|
|
566
|
+
"""Return VaultEndpointConfigReader for a given endpoint type.
|
|
567
|
+
|
|
568
|
+
Args:
|
|
569
|
+
endpoint_trait: The endpoint trait to create the reader for.
|
|
570
|
+
|
|
571
|
+
Returns:
|
|
572
|
+
The reader associated with the endpoint's type.
|
|
573
|
+
"""
|
|
574
|
+
if (
|
|
575
|
+
endpoint_trait.endpoint_type == TRACKER_STORE_ENDPOINT_TYPE
|
|
576
|
+
and TrackerStoreEndpointValidator(
|
|
577
|
+
endpoint_reader=EndpointReader(
|
|
578
|
+
endpoint_config=endpoint_trait.endpoint_config
|
|
579
|
+
)
|
|
580
|
+
).is_endpoint_config_valid()
|
|
581
|
+
):
|
|
582
|
+
return VaultEndpointConfigReader(endpoint_config=endpoint_trait.endpoint_config)
|
|
583
|
+
|
|
584
|
+
return None
|