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
rasa/core/persistor.py
ADDED
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import abc
|
|
4
|
+
import os
|
|
5
|
+
import shutil
|
|
6
|
+
from enum import Enum
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import TYPE_CHECKING, List, Optional, Text, Tuple, Union
|
|
9
|
+
|
|
10
|
+
import structlog
|
|
11
|
+
|
|
12
|
+
from rasa.exceptions import ModelNotFound
|
|
13
|
+
import rasa.shared.utils.common
|
|
14
|
+
import rasa.utils.common
|
|
15
|
+
from rasa.constants import (
|
|
16
|
+
HTTP_STATUS_FORBIDDEN,
|
|
17
|
+
HTTP_STATUS_NOT_FOUND,
|
|
18
|
+
MODEL_ARCHIVE_EXTENSION,
|
|
19
|
+
DEFAULT_BUCKET_NAME,
|
|
20
|
+
)
|
|
21
|
+
from rasa.env import (
|
|
22
|
+
AWS_ENDPOINT_URL_ENV,
|
|
23
|
+
AZURE_ACCOUNT_KEY_ENV,
|
|
24
|
+
AZURE_ACCOUNT_NAME_ENV,
|
|
25
|
+
AZURE_CONTAINER_ENV,
|
|
26
|
+
BUCKET_NAME_ENV,
|
|
27
|
+
REMOTE_STORAGE_PATH_ENV,
|
|
28
|
+
)
|
|
29
|
+
from rasa.shared.exceptions import RasaException
|
|
30
|
+
from rasa.shared.utils.io import raise_warning
|
|
31
|
+
|
|
32
|
+
if TYPE_CHECKING:
|
|
33
|
+
from azure.storage.blob import ContainerClient
|
|
34
|
+
from botocore.exceptions import ClientError
|
|
35
|
+
|
|
36
|
+
structlogger = structlog.get_logger()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class RemoteStorageType(Enum):
|
|
40
|
+
"""Enum for the different remote storage types."""
|
|
41
|
+
|
|
42
|
+
AWS = "aws"
|
|
43
|
+
GCS = "gcs"
|
|
44
|
+
AZURE = "azure"
|
|
45
|
+
|
|
46
|
+
@classmethod
|
|
47
|
+
def list(cls) -> List[str]:
|
|
48
|
+
"""Returns a list of all available storage types."""
|
|
49
|
+
return [item.value for item in cls]
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
"""Storage can be a built-in one or a module path to a custom persistor."""
|
|
53
|
+
StorageType = Union[RemoteStorageType, str]
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def parse_remote_storage(value: str) -> StorageType:
|
|
57
|
+
try:
|
|
58
|
+
return RemoteStorageType(value)
|
|
59
|
+
except ValueError:
|
|
60
|
+
# if the value is not a valid storage type,
|
|
61
|
+
# but it is a string we assume it is a custom class
|
|
62
|
+
# and return it as is
|
|
63
|
+
|
|
64
|
+
supported_storages_help_text = (
|
|
65
|
+
f"Supported storages are: {RemoteStorageType.list()} "
|
|
66
|
+
"or path to a python class which implements `Persistor` interface."
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
if isinstance(value, str):
|
|
70
|
+
if value == "":
|
|
71
|
+
raise RasaException(
|
|
72
|
+
f"The value can't be an empty string."
|
|
73
|
+
f" {supported_storages_help_text}"
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
return value
|
|
77
|
+
|
|
78
|
+
raise RasaException(
|
|
79
|
+
f"Invalid storage type '{value}'. {supported_storages_help_text}"
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def get_persistor(storage: StorageType) -> Optional[Persistor]:
|
|
84
|
+
"""Returns an instance of the requested persistor.
|
|
85
|
+
|
|
86
|
+
Currently, `aws`, `gcs`, `azure` and providing module paths are supported remote
|
|
87
|
+
storages.
|
|
88
|
+
"""
|
|
89
|
+
storage = storage.value if isinstance(storage, RemoteStorageType) else storage
|
|
90
|
+
|
|
91
|
+
if storage == RemoteStorageType.AWS.value:
|
|
92
|
+
return AWSPersistor(
|
|
93
|
+
os.environ.get(BUCKET_NAME_ENV, DEFAULT_BUCKET_NAME),
|
|
94
|
+
os.environ.get(AWS_ENDPOINT_URL_ENV),
|
|
95
|
+
)
|
|
96
|
+
if storage == RemoteStorageType.GCS.value:
|
|
97
|
+
return GCSPersistor(os.environ.get(BUCKET_NAME_ENV, DEFAULT_BUCKET_NAME))
|
|
98
|
+
|
|
99
|
+
if storage == RemoteStorageType.AZURE.value:
|
|
100
|
+
return AzurePersistor(
|
|
101
|
+
os.environ.get(AZURE_CONTAINER_ENV, DEFAULT_BUCKET_NAME),
|
|
102
|
+
os.environ.get(AZURE_ACCOUNT_NAME_ENV),
|
|
103
|
+
os.environ.get(AZURE_ACCOUNT_KEY_ENV),
|
|
104
|
+
)
|
|
105
|
+
# If the persistor is not a built-in one, it is assumed to be a module path
|
|
106
|
+
# to a persistor implementation supplied by the user.
|
|
107
|
+
if storage:
|
|
108
|
+
try:
|
|
109
|
+
persistor = rasa.shared.utils.common.class_from_module_path(storage)
|
|
110
|
+
return persistor()
|
|
111
|
+
except ImportError:
|
|
112
|
+
raise ImportError(
|
|
113
|
+
f"Unknown model persistor {storage}. Please make sure to "
|
|
114
|
+
f"either use an included model persistor ({RemoteStorageType.list()}) "
|
|
115
|
+
f"or specify the module path to an external "
|
|
116
|
+
"model persistor."
|
|
117
|
+
)
|
|
118
|
+
return None
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
class Persistor(abc.ABC):
|
|
122
|
+
"""Store models in cloud and fetch them when needed."""
|
|
123
|
+
|
|
124
|
+
def persist(self, trained_model: str) -> None:
|
|
125
|
+
"""Uploads a trained model persisted in the `target_dir` to cloud storage."""
|
|
126
|
+
absolute_file_key = self._create_file_key(trained_model)
|
|
127
|
+
file_key = Path(absolute_file_key).name
|
|
128
|
+
self._persist_tar(file_key, trained_model)
|
|
129
|
+
|
|
130
|
+
def retrieve(self, model_name: Text, target_path: Text) -> Text:
|
|
131
|
+
"""Downloads a model that has been persisted to cloud storage.
|
|
132
|
+
|
|
133
|
+
Downloaded model will be saved to the `target_path`.
|
|
134
|
+
If `target_path` is a directory, the model will be saved to that directory.
|
|
135
|
+
If `target_path` is a file, the model will be saved to that file.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
model_name: The name of the model to retrieve.
|
|
139
|
+
target_path: The path to which the model should be saved.
|
|
140
|
+
"""
|
|
141
|
+
tar_name = model_name
|
|
142
|
+
if not model_name.endswith(MODEL_ARCHIVE_EXTENSION):
|
|
143
|
+
# ensure backward compatibility
|
|
144
|
+
tar_name = self._tar_name(model_name)
|
|
145
|
+
tar_name = self._create_file_key(tar_name)
|
|
146
|
+
target_filename = os.path.basename(tar_name)
|
|
147
|
+
self._retrieve_tar(target_filename)
|
|
148
|
+
self._copy(os.path.basename(tar_name), target_path)
|
|
149
|
+
|
|
150
|
+
if os.path.isdir(target_path):
|
|
151
|
+
return os.path.join(target_path, model_name)
|
|
152
|
+
|
|
153
|
+
return target_path
|
|
154
|
+
|
|
155
|
+
def size_of_persisted_model(self, model_name: Text) -> int:
|
|
156
|
+
"""Returns the size of the model that has been persisted to cloud storage.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
model_name: The name of the model to retrieve.
|
|
160
|
+
"""
|
|
161
|
+
tar_name = model_name
|
|
162
|
+
if not model_name.endswith(MODEL_ARCHIVE_EXTENSION):
|
|
163
|
+
# ensure backward compatibility
|
|
164
|
+
tar_name = self._tar_name(model_name)
|
|
165
|
+
tar_name = self._create_file_key(tar_name)
|
|
166
|
+
target_filename = os.path.basename(tar_name)
|
|
167
|
+
return self._retrieve_tar_size(target_filename)
|
|
168
|
+
|
|
169
|
+
def _retrieve_tar_size(self, filename: Text) -> int:
|
|
170
|
+
"""Returns the size of the model that has been persisted to cloud storage."""
|
|
171
|
+
structlogger.warning(
|
|
172
|
+
"persistor.retrieve_tar_size.not_implemented",
|
|
173
|
+
filename=filename,
|
|
174
|
+
event_info=(
|
|
175
|
+
"This method should be implemented in the persistor. "
|
|
176
|
+
"The default implementation will download the model "
|
|
177
|
+
"to calculate the size. Most persistors should override "
|
|
178
|
+
"this method to avoid downloading the model and get the "
|
|
179
|
+
"size directly from the cloud storage."
|
|
180
|
+
),
|
|
181
|
+
)
|
|
182
|
+
self._retrieve_tar(filename)
|
|
183
|
+
return os.path.getsize(os.path.basename(filename))
|
|
184
|
+
|
|
185
|
+
@abc.abstractmethod
|
|
186
|
+
def _retrieve_tar(self, filename: Text) -> None:
|
|
187
|
+
"""Downloads a model previously persisted to cloud storage."""
|
|
188
|
+
raise NotImplementedError
|
|
189
|
+
|
|
190
|
+
@abc.abstractmethod
|
|
191
|
+
def _persist_tar(self, filekey: Text, tarname: Text) -> None:
|
|
192
|
+
"""Uploads a model persisted in the `target_dir` to cloud storage."""
|
|
193
|
+
raise NotImplementedError
|
|
194
|
+
|
|
195
|
+
def _compress(self, model_directory: Text, model_name: Text) -> Tuple[Text, Text]:
|
|
196
|
+
"""Creates a compressed archive and returns key and tar."""
|
|
197
|
+
import tempfile
|
|
198
|
+
|
|
199
|
+
dirpath = tempfile.mkdtemp()
|
|
200
|
+
base_name = self._tar_name(model_name, include_extension=False)
|
|
201
|
+
tar_name = shutil.make_archive(
|
|
202
|
+
os.path.join(dirpath, base_name),
|
|
203
|
+
"gztar",
|
|
204
|
+
root_dir=model_directory,
|
|
205
|
+
base_dir="../nlu",
|
|
206
|
+
)
|
|
207
|
+
file_key = os.path.basename(tar_name)
|
|
208
|
+
return file_key, tar_name
|
|
209
|
+
|
|
210
|
+
@staticmethod
|
|
211
|
+
def _tar_name(model_name: Text, include_extension: bool = True) -> Text:
|
|
212
|
+
ext = f".{MODEL_ARCHIVE_EXTENSION}" if include_extension else ""
|
|
213
|
+
return f"{model_name}{ext}"
|
|
214
|
+
|
|
215
|
+
@staticmethod
|
|
216
|
+
def _copy(compressed_path: Text, target_path: Text) -> None:
|
|
217
|
+
shutil.copy2(compressed_path, target_path)
|
|
218
|
+
|
|
219
|
+
@staticmethod
|
|
220
|
+
def _create_file_key(model_path: str) -> Text:
|
|
221
|
+
"""Appends remote storage folders when provided to upload or retrieve file."""
|
|
222
|
+
bucket_object_path = os.environ.get(REMOTE_STORAGE_PATH_ENV)
|
|
223
|
+
|
|
224
|
+
# To keep the backward compatibility, if REMOTE_STORAGE_PATH is not provided,
|
|
225
|
+
# the model_name (which might be a complete path) will be returned as it is.
|
|
226
|
+
if bucket_object_path is None:
|
|
227
|
+
return str(model_path)
|
|
228
|
+
else:
|
|
229
|
+
raise_warning(
|
|
230
|
+
f"{REMOTE_STORAGE_PATH_ENV} is deprecated and will be "
|
|
231
|
+
"removed in future versions. "
|
|
232
|
+
"Please use the -m path/to/model.tar.gz option to "
|
|
233
|
+
"specify the model path when loading a model.",
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
file_key = os.path.basename(model_path)
|
|
237
|
+
file_key = os.path.join(bucket_object_path, file_key)
|
|
238
|
+
return file_key
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
class AWSPersistor(Persistor):
|
|
242
|
+
"""Store models on S3.
|
|
243
|
+
|
|
244
|
+
Fetches them when needed, instead of storing them on the local disk.
|
|
245
|
+
"""
|
|
246
|
+
|
|
247
|
+
def __init__(
|
|
248
|
+
self,
|
|
249
|
+
bucket_name: Text,
|
|
250
|
+
endpoint_url: Optional[Text] = None,
|
|
251
|
+
region_name: Optional[Text] = None,
|
|
252
|
+
) -> None:
|
|
253
|
+
import boto3
|
|
254
|
+
|
|
255
|
+
super().__init__()
|
|
256
|
+
self.s3 = boto3.resource(
|
|
257
|
+
"s3", endpoint_url=endpoint_url, region_name=region_name
|
|
258
|
+
)
|
|
259
|
+
self._ensure_bucket_exists(bucket_name, region_name)
|
|
260
|
+
self.bucket_name = bucket_name
|
|
261
|
+
self.bucket = self.s3.Bucket(bucket_name)
|
|
262
|
+
|
|
263
|
+
def _ensure_bucket_exists(
|
|
264
|
+
self, bucket_name: Text, region_name: Optional[Text] = None
|
|
265
|
+
) -> None:
|
|
266
|
+
from botocore import exceptions
|
|
267
|
+
|
|
268
|
+
# noinspection PyUnresolvedReferences
|
|
269
|
+
try:
|
|
270
|
+
self.s3.meta.client.head_bucket(Bucket=bucket_name)
|
|
271
|
+
except exceptions.ClientError as exc:
|
|
272
|
+
if self._error_code(exc) == HTTP_STATUS_FORBIDDEN:
|
|
273
|
+
log = (
|
|
274
|
+
f"Access to the specified bucket '{bucket_name}' is forbidden. "
|
|
275
|
+
"Please make sure you have the necessary "
|
|
276
|
+
"permission to access the bucket."
|
|
277
|
+
)
|
|
278
|
+
structlogger.error(
|
|
279
|
+
"aws_persistor.ensure_bucket_exists.bucket_access_forbidden",
|
|
280
|
+
bucket_name=bucket_name,
|
|
281
|
+
event_info=log,
|
|
282
|
+
)
|
|
283
|
+
raise RasaException(log)
|
|
284
|
+
elif self._error_code(exc) == HTTP_STATUS_NOT_FOUND:
|
|
285
|
+
log = (
|
|
286
|
+
f"The specified bucket '{bucket_name}' does not exist. "
|
|
287
|
+
"Please make sure to create the bucket first."
|
|
288
|
+
)
|
|
289
|
+
structlogger.error(
|
|
290
|
+
"aws_persistor.ensure_bucket_exists.bucket_not_found",
|
|
291
|
+
bucket_name=bucket_name,
|
|
292
|
+
event_info=log,
|
|
293
|
+
)
|
|
294
|
+
raise RasaException(log)
|
|
295
|
+
|
|
296
|
+
@staticmethod
|
|
297
|
+
def _error_code(e: "ClientError") -> int:
|
|
298
|
+
return int(e.response["Error"]["Code"])
|
|
299
|
+
|
|
300
|
+
def _persist_tar(self, file_key: Text, tar_path: Text) -> None:
|
|
301
|
+
"""Uploads a model persisted in the `target_dir` to s3."""
|
|
302
|
+
with open(tar_path, "rb") as f:
|
|
303
|
+
self.s3.Object(self.bucket_name, file_key).put(Body=f)
|
|
304
|
+
|
|
305
|
+
def _retrieve_tar_size(self, model_path: Text) -> int:
|
|
306
|
+
"""Returns the size of the model that has been persisted to s3."""
|
|
307
|
+
try:
|
|
308
|
+
obj = self.s3.Object(self.bucket_name, model_path)
|
|
309
|
+
return obj.content_length
|
|
310
|
+
except Exception:
|
|
311
|
+
raise ModelNotFound()
|
|
312
|
+
|
|
313
|
+
def _retrieve_tar(self, target_filename: str) -> None:
|
|
314
|
+
"""Downloads a model that has previously been persisted to s3."""
|
|
315
|
+
from botocore import exceptions
|
|
316
|
+
|
|
317
|
+
log = (
|
|
318
|
+
f"Model '{target_filename}' not found in the specified bucket "
|
|
319
|
+
f"'{self.bucket_name}'. Please make sure the model exists "
|
|
320
|
+
f"in the bucket."
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
try:
|
|
324
|
+
with open(target_filename, "wb") as f:
|
|
325
|
+
self.bucket.download_fileobj(target_filename, f)
|
|
326
|
+
|
|
327
|
+
structlogger.debug(
|
|
328
|
+
"aws_persistor.retrieve_tar.object_found", object_key=target_filename
|
|
329
|
+
)
|
|
330
|
+
except exceptions.ClientError as exc:
|
|
331
|
+
if self._error_code(exc) == HTTP_STATUS_NOT_FOUND:
|
|
332
|
+
structlogger.error(
|
|
333
|
+
"aws_persistor.retrieve_tar.model_not_found",
|
|
334
|
+
bucket_name=self.bucket_name,
|
|
335
|
+
target_filename=target_filename,
|
|
336
|
+
event_info=log,
|
|
337
|
+
)
|
|
338
|
+
raise ModelNotFound() from exc
|
|
339
|
+
except exceptions.BotoCoreError as exc:
|
|
340
|
+
structlogger.error(
|
|
341
|
+
"aws_persistor.retrieve_tar.model_download_error",
|
|
342
|
+
bucket_name=self.bucket_name,
|
|
343
|
+
target_filename=target_filename,
|
|
344
|
+
event_info=log,
|
|
345
|
+
)
|
|
346
|
+
raise ModelNotFound() from exc
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
class GCSPersistor(Persistor):
|
|
350
|
+
"""Store models on Google Cloud Storage.
|
|
351
|
+
|
|
352
|
+
Fetches them when needed, instead of storing them on the local disk.
|
|
353
|
+
"""
|
|
354
|
+
|
|
355
|
+
def __init__(self, bucket_name: Text) -> None:
|
|
356
|
+
"""Initialise class with client and bucket."""
|
|
357
|
+
# there are no type hints in this repo for now
|
|
358
|
+
# https://github.com/googleapis/python-storage/issues/393
|
|
359
|
+
from google.cloud import storage
|
|
360
|
+
|
|
361
|
+
super().__init__()
|
|
362
|
+
|
|
363
|
+
self.storage_client = storage.Client()
|
|
364
|
+
self._ensure_bucket_exists(bucket_name)
|
|
365
|
+
|
|
366
|
+
self.bucket_name = bucket_name
|
|
367
|
+
self.bucket = self.storage_client.bucket(bucket_name)
|
|
368
|
+
|
|
369
|
+
def _ensure_bucket_exists(self, bucket_name: Text) -> None:
|
|
370
|
+
from google.cloud import exceptions
|
|
371
|
+
from google.auth import exceptions as auth_exceptions
|
|
372
|
+
|
|
373
|
+
try:
|
|
374
|
+
self.storage_client.get_bucket(bucket_name)
|
|
375
|
+
except auth_exceptions.GoogleAuthError as exc:
|
|
376
|
+
log = (
|
|
377
|
+
f"An error occurred while authenticating with Google Cloud "
|
|
378
|
+
f"Storage. Please make sure you have the necessary credentials "
|
|
379
|
+
f"to access the bucket '{bucket_name}'."
|
|
380
|
+
)
|
|
381
|
+
structlogger.error(
|
|
382
|
+
"gcp_persistor.ensure_bucket_exists.authentication_error",
|
|
383
|
+
bucket_name=bucket_name,
|
|
384
|
+
event_info=log,
|
|
385
|
+
)
|
|
386
|
+
raise RasaException(log) from exc
|
|
387
|
+
except exceptions.NotFound as exc:
|
|
388
|
+
log = (
|
|
389
|
+
f"The specified Google Cloud Storage bucket '{bucket_name}' "
|
|
390
|
+
f"does not exist. Please make sure to create the bucket first or "
|
|
391
|
+
f"provide an alternative valid bucket name."
|
|
392
|
+
)
|
|
393
|
+
structlogger.error(
|
|
394
|
+
"gcp_persistor.ensure_bucket_exists.bucket_not_found",
|
|
395
|
+
bucket_name=bucket_name,
|
|
396
|
+
event_info=log,
|
|
397
|
+
)
|
|
398
|
+
raise RasaException(log) from exc
|
|
399
|
+
except exceptions.Forbidden as exc:
|
|
400
|
+
log = (
|
|
401
|
+
f"Access to the specified Google Cloud storage bucket '{bucket_name}' "
|
|
402
|
+
f"is forbidden. Please make sure you have the necessary "
|
|
403
|
+
f"permissions to access the bucket. "
|
|
404
|
+
)
|
|
405
|
+
structlogger.error(
|
|
406
|
+
"gcp_persistor.ensure_bucket_exists.bucket_access_forbidden",
|
|
407
|
+
bucket_name=bucket_name,
|
|
408
|
+
event_info=log,
|
|
409
|
+
)
|
|
410
|
+
raise RasaException(log) from exc
|
|
411
|
+
except ValueError as exc:
|
|
412
|
+
# bucket_name is None
|
|
413
|
+
log = (
|
|
414
|
+
"The specified Google Cloud Storage bucket name is None. Please "
|
|
415
|
+
"make sure to provide a valid bucket name."
|
|
416
|
+
)
|
|
417
|
+
structlogger.error(
|
|
418
|
+
"gcp_persistor.ensure_bucket_exists.bucket_name_none",
|
|
419
|
+
event_info=log,
|
|
420
|
+
)
|
|
421
|
+
raise RasaException(log) from exc
|
|
422
|
+
|
|
423
|
+
def _persist_tar(self, file_key: Text, tar_path: Text) -> None:
|
|
424
|
+
"""Uploads a model persisted in the `target_dir` to GCS."""
|
|
425
|
+
blob = self.bucket.blob(file_key)
|
|
426
|
+
blob.upload_from_filename(tar_path)
|
|
427
|
+
|
|
428
|
+
def _retrieve_tar_size(self, target_filename: Text) -> int:
|
|
429
|
+
"""Returns the size of the model that has been persisted to GCS."""
|
|
430
|
+
try:
|
|
431
|
+
blob = self.bucket.blob(target_filename)
|
|
432
|
+
return blob.size
|
|
433
|
+
except Exception:
|
|
434
|
+
raise ModelNotFound()
|
|
435
|
+
|
|
436
|
+
def _retrieve_tar(self, target_filename: Text) -> None:
|
|
437
|
+
"""Downloads a model that has previously been persisted to GCS."""
|
|
438
|
+
from google.api_core import exceptions
|
|
439
|
+
|
|
440
|
+
blob = self.bucket.blob(target_filename)
|
|
441
|
+
try:
|
|
442
|
+
blob.download_to_filename(target_filename)
|
|
443
|
+
|
|
444
|
+
structlogger.debug(
|
|
445
|
+
"gcs_persistor.retrieve_tar.object_found", object_key=target_filename
|
|
446
|
+
)
|
|
447
|
+
except exceptions.NotFound as exc:
|
|
448
|
+
log = (
|
|
449
|
+
f"Model '{target_filename}' not found in the specified bucket "
|
|
450
|
+
f"'{self.bucket_name}'. Please make sure the model exists "
|
|
451
|
+
f"in the bucket."
|
|
452
|
+
)
|
|
453
|
+
structlogger.error(
|
|
454
|
+
"gcp_persistor.retrieve_tar.model_not_found",
|
|
455
|
+
bucket_name=self.bucket_name,
|
|
456
|
+
target_filename=target_filename,
|
|
457
|
+
event_info=log,
|
|
458
|
+
)
|
|
459
|
+
raise ModelNotFound() from exc
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
class AzurePersistor(Persistor):
|
|
463
|
+
"""Store models on Azure."""
|
|
464
|
+
|
|
465
|
+
def __init__(
|
|
466
|
+
self, azure_container: Text, azure_account_name: Text, azure_account_key: Text
|
|
467
|
+
) -> None:
|
|
468
|
+
from azure.storage.blob import BlobServiceClient
|
|
469
|
+
|
|
470
|
+
super().__init__()
|
|
471
|
+
|
|
472
|
+
self.blob_service = BlobServiceClient(
|
|
473
|
+
account_url=f"https://{azure_account_name}.blob.core.windows.net/",
|
|
474
|
+
credential=azure_account_key,
|
|
475
|
+
)
|
|
476
|
+
self.container_name = azure_container
|
|
477
|
+
self._ensure_container_exists()
|
|
478
|
+
|
|
479
|
+
def _ensure_container_exists(self) -> None:
|
|
480
|
+
if self._container_client().exists():
|
|
481
|
+
pass
|
|
482
|
+
else:
|
|
483
|
+
log = (
|
|
484
|
+
f"The specified container '{self.container_name}' does not exist."
|
|
485
|
+
"Please make sure to create the bucket first or "
|
|
486
|
+
f"provide an alternative valid bucket name."
|
|
487
|
+
)
|
|
488
|
+
structlogger.error(
|
|
489
|
+
"azure_persistor.ensure_container_exists.container_not_found",
|
|
490
|
+
container_name=self.container_name,
|
|
491
|
+
event_info=log,
|
|
492
|
+
)
|
|
493
|
+
raise RasaException(log)
|
|
494
|
+
|
|
495
|
+
def _container_client(self) -> "ContainerClient":
|
|
496
|
+
return self.blob_service.get_container_client(self.container_name)
|
|
497
|
+
|
|
498
|
+
def _persist_tar(self, file_key: Text, tar_path: Text) -> None:
|
|
499
|
+
"""Uploads a model persisted in the `target_dir` to Azure."""
|
|
500
|
+
with open(tar_path, "rb") as data:
|
|
501
|
+
self._container_client().upload_blob(name=file_key, data=data)
|
|
502
|
+
|
|
503
|
+
def _retrieve_tar_size(self, target_filename: Text) -> int:
|
|
504
|
+
"""Returns the size of the model that has been persisted to Azure."""
|
|
505
|
+
try:
|
|
506
|
+
blob_client = self._container_client().get_blob_client(target_filename)
|
|
507
|
+
properties = blob_client.get_blob_properties()
|
|
508
|
+
return properties.size
|
|
509
|
+
except Exception:
|
|
510
|
+
raise ModelNotFound()
|
|
511
|
+
|
|
512
|
+
def _retrieve_tar(self, target_filename: Text) -> None:
|
|
513
|
+
"""Downloads a model that has previously been persisted to Azure."""
|
|
514
|
+
from azure.core.exceptions import AzureError
|
|
515
|
+
|
|
516
|
+
try:
|
|
517
|
+
with open(target_filename, "wb") as model_file:
|
|
518
|
+
blob_client = self._container_client().get_blob_client(target_filename)
|
|
519
|
+
download_stream = blob_client.download_blob()
|
|
520
|
+
model_file.write(download_stream.readall())
|
|
521
|
+
structlogger.debug(
|
|
522
|
+
"azure_persistor.retrieve_tar.blob_found", blob_name=target_filename
|
|
523
|
+
)
|
|
524
|
+
except AzureError as exc:
|
|
525
|
+
log = (
|
|
526
|
+
f"An exception occurred while trying to download "
|
|
527
|
+
f"the model '{target_filename}' in the specified container "
|
|
528
|
+
f"'{self.container_name}'. Please make sure the model exists "
|
|
529
|
+
f"in the container."
|
|
530
|
+
)
|
|
531
|
+
structlogger.error(
|
|
532
|
+
"azure_persistor.retrieve_tar.model_download_error",
|
|
533
|
+
container_name=self.container_name,
|
|
534
|
+
target_filename=target_filename,
|
|
535
|
+
event_info=log,
|
|
536
|
+
exception=exc,
|
|
537
|
+
)
|
|
538
|
+
raise ModelNotFound() from exc
|
|
File without changes
|