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/shared/utils/io.py
ADDED
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import errno
|
|
3
|
+
import glob
|
|
4
|
+
import json
|
|
5
|
+
import logging
|
|
6
|
+
import os
|
|
7
|
+
import random
|
|
8
|
+
import string
|
|
9
|
+
import sys
|
|
10
|
+
import warnings
|
|
11
|
+
from collections import OrderedDict
|
|
12
|
+
from functools import wraps
|
|
13
|
+
from hashlib import md5
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Any, cast, Callable, Dict, List, Optional, Text, Type, TypeVar, Union
|
|
16
|
+
|
|
17
|
+
import portalocker
|
|
18
|
+
|
|
19
|
+
from rasa.shared.constants import (
|
|
20
|
+
DEFAULT_LOG_LEVEL,
|
|
21
|
+
ENV_LOG_LEVEL,
|
|
22
|
+
NEXT_MAJOR_VERSION_FOR_DEPRECATIONS,
|
|
23
|
+
)
|
|
24
|
+
from rasa.shared.exceptions import (
|
|
25
|
+
FileIOException,
|
|
26
|
+
FileNotFoundException,
|
|
27
|
+
)
|
|
28
|
+
from rasa.shared.utils.constants import DEFAULT_ENCODING
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class bcolors:
|
|
32
|
+
HEADER = "\033[95m"
|
|
33
|
+
OKBLUE = "\033[94m"
|
|
34
|
+
OKGREEN = "\033[92m"
|
|
35
|
+
WARNING = "\033[93m"
|
|
36
|
+
FAIL = "\033[91m"
|
|
37
|
+
ENDC = "\033[0m"
|
|
38
|
+
BOLD = "\033[1m"
|
|
39
|
+
UNDERLINE = "\033[4m"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def wrap_with_color(*args: Any, color: Text) -> Text:
|
|
43
|
+
return color + " ".join(str(s) for s in args) + bcolors.ENDC
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def raise_warning(
|
|
47
|
+
message: Text,
|
|
48
|
+
category: Optional[Type[Warning]] = None,
|
|
49
|
+
docs: Optional[Text] = None,
|
|
50
|
+
**kwargs: Any,
|
|
51
|
+
) -> None:
|
|
52
|
+
"""Emit a `warnings.warn` with sensible defaults and a colored warning msg."""
|
|
53
|
+
original_formatter = warnings.formatwarning
|
|
54
|
+
|
|
55
|
+
def should_show_source_line() -> bool:
|
|
56
|
+
if "stacklevel" not in kwargs:
|
|
57
|
+
if category == UserWarning or category is None:
|
|
58
|
+
return False
|
|
59
|
+
if category == FutureWarning:
|
|
60
|
+
return False
|
|
61
|
+
return True
|
|
62
|
+
|
|
63
|
+
def formatwarning(
|
|
64
|
+
message: Union[Warning, Text],
|
|
65
|
+
category: Type[Warning],
|
|
66
|
+
filename: Text,
|
|
67
|
+
lineno: int,
|
|
68
|
+
line: Optional[Text] = None,
|
|
69
|
+
) -> Text:
|
|
70
|
+
"""Function to format a warning the standard way."""
|
|
71
|
+
if not should_show_source_line():
|
|
72
|
+
if docs:
|
|
73
|
+
line = f"More info at {docs}"
|
|
74
|
+
else:
|
|
75
|
+
line = ""
|
|
76
|
+
|
|
77
|
+
formatted_message = original_formatter(
|
|
78
|
+
message, category, filename, lineno, line
|
|
79
|
+
)
|
|
80
|
+
return wrap_with_color(formatted_message, color=bcolors.WARNING)
|
|
81
|
+
|
|
82
|
+
if "stacklevel" not in kwargs:
|
|
83
|
+
# try to set useful defaults for the most common warning categories
|
|
84
|
+
if category == DeprecationWarning:
|
|
85
|
+
kwargs["stacklevel"] = 3
|
|
86
|
+
elif category in (UserWarning, FutureWarning):
|
|
87
|
+
kwargs["stacklevel"] = 2
|
|
88
|
+
|
|
89
|
+
warnings.formatwarning = formatwarning
|
|
90
|
+
warnings.warn(message, category=category, **kwargs)
|
|
91
|
+
warnings.formatwarning = original_formatter
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def write_text_file(
|
|
95
|
+
content: Text,
|
|
96
|
+
file_path: Union[Text, Path],
|
|
97
|
+
encoding: Text = DEFAULT_ENCODING,
|
|
98
|
+
append: bool = False,
|
|
99
|
+
) -> None:
|
|
100
|
+
"""Writes text to a file.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
content: The content to write.
|
|
104
|
+
file_path: The path to which the content should be written.
|
|
105
|
+
encoding: The encoding which should be used.
|
|
106
|
+
append: Whether to append to the file or to truncate the file.
|
|
107
|
+
|
|
108
|
+
"""
|
|
109
|
+
mode = "a" if append else "w"
|
|
110
|
+
with open(file_path, mode, encoding=encoding) as file:
|
|
111
|
+
file.write(content)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def read_file(filename: Union[Text, Path], encoding: Text = DEFAULT_ENCODING) -> Any:
|
|
115
|
+
"""Read text from a file."""
|
|
116
|
+
try:
|
|
117
|
+
with open(filename, encoding=encoding) as f:
|
|
118
|
+
return f.read()
|
|
119
|
+
except FileNotFoundError:
|
|
120
|
+
raise FileNotFoundException(
|
|
121
|
+
f"Failed to read file, " f"'{os.path.abspath(filename)}' does not exist."
|
|
122
|
+
)
|
|
123
|
+
except UnicodeDecodeError:
|
|
124
|
+
raise FileIOException(
|
|
125
|
+
f"Failed to read file '{os.path.abspath(filename)}', "
|
|
126
|
+
f"could not read the file using {encoding} to decode "
|
|
127
|
+
f"it. Please make sure the file is stored with this "
|
|
128
|
+
f"encoding."
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def read_json_file(filename: Union[Text, Path]) -> Any:
|
|
133
|
+
"""Read json from a file."""
|
|
134
|
+
content = read_file(filename)
|
|
135
|
+
try:
|
|
136
|
+
return json.loads(content)
|
|
137
|
+
except ValueError as e:
|
|
138
|
+
raise FileIOException(
|
|
139
|
+
f"Failed to read json from '{os.path.abspath(filename)}'. Error: {e}"
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def read_jsonl_file(file_path: Union[Text, Path]) -> List[Any]:
|
|
144
|
+
"""Read JSONL from a file."""
|
|
145
|
+
content = read_file(file_path)
|
|
146
|
+
try:
|
|
147
|
+
return [json.loads(line) for line in content.splitlines()]
|
|
148
|
+
except ValueError as e:
|
|
149
|
+
raise FileIOException(
|
|
150
|
+
f"Failed to read JSONL from '{os.path.abspath(file_path)}'. Error: {e}"
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def list_directory(path: Text) -> List[Text]:
|
|
155
|
+
"""Returns all files and folders excluding hidden files.
|
|
156
|
+
|
|
157
|
+
If the path points to a file, returns the file. This is a recursive
|
|
158
|
+
implementation returning files in any depth of the path.
|
|
159
|
+
"""
|
|
160
|
+
if not isinstance(path, str):
|
|
161
|
+
raise ValueError(
|
|
162
|
+
f"`resource_name` must be a string type. " f"Got `{type(path)}` instead"
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
if os.path.isfile(path):
|
|
166
|
+
return [path]
|
|
167
|
+
elif os.path.isdir(path):
|
|
168
|
+
results: List[Text] = []
|
|
169
|
+
for base, dirs, files in os.walk(path, followlinks=True):
|
|
170
|
+
# sort files for same order across runs
|
|
171
|
+
files = sorted(files, key=_filename_without_prefix)
|
|
172
|
+
# add not hidden files
|
|
173
|
+
good_files = filter(lambda x: not x.startswith("."), files)
|
|
174
|
+
results.extend(os.path.join(base, f) for f in good_files)
|
|
175
|
+
# add not hidden directories
|
|
176
|
+
good_directories = filter(lambda x: not x.startswith("."), dirs)
|
|
177
|
+
results.extend(os.path.join(base, f) for f in good_directories)
|
|
178
|
+
return results
|
|
179
|
+
else:
|
|
180
|
+
raise ValueError(f"Could not locate the resource '{os.path.abspath(path)}'.")
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def list_files(path: Text) -> List[Text]:
|
|
184
|
+
"""Returns all files excluding hidden files.
|
|
185
|
+
|
|
186
|
+
If the path points to a file, returns the file.
|
|
187
|
+
"""
|
|
188
|
+
return [fn for fn in list_directory(path) if os.path.isfile(fn)]
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def _filename_without_prefix(file: Text) -> Text:
|
|
192
|
+
"""Splits of a filenames prefix until after the first ``_``."""
|
|
193
|
+
return "_".join(file.split("_")[1:])
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def list_subdirectories(path: Text) -> List[Text]:
|
|
197
|
+
"""Returns all folders excluding hidden files.
|
|
198
|
+
|
|
199
|
+
If the path points to a file, returns an empty list.
|
|
200
|
+
"""
|
|
201
|
+
return [fn for fn in glob.glob(os.path.join(path, "*")) if os.path.isdir(fn)]
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def deep_container_fingerprint(
|
|
205
|
+
obj: Union[List[Any], Dict[Any, Any], Any], encoding: Text = DEFAULT_ENCODING
|
|
206
|
+
) -> Text:
|
|
207
|
+
"""Calculate a hash which is stable.
|
|
208
|
+
|
|
209
|
+
Works for lists and dictionaries. For keys and values, we recursively call
|
|
210
|
+
`hash(...)` on them. In case of a dict, the hash is independent of the containers
|
|
211
|
+
key order. Keep in mind that a list with items in a different order
|
|
212
|
+
will not create the same hash!
|
|
213
|
+
|
|
214
|
+
Args:
|
|
215
|
+
obj: dictionary or list to be hashed.
|
|
216
|
+
encoding: encoding used for dumping objects as strings
|
|
217
|
+
|
|
218
|
+
Returns:
|
|
219
|
+
hash of the container.
|
|
220
|
+
"""
|
|
221
|
+
if isinstance(obj, dict):
|
|
222
|
+
return get_dictionary_fingerprint(obj, encoding)
|
|
223
|
+
elif isinstance(obj, list):
|
|
224
|
+
return get_list_fingerprint(obj, encoding)
|
|
225
|
+
elif hasattr(obj, "fingerprint") and callable(obj.fingerprint):
|
|
226
|
+
return obj.fingerprint()
|
|
227
|
+
else:
|
|
228
|
+
return get_text_hash(str(obj), encoding)
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def get_dictionary_fingerprint(
|
|
232
|
+
dictionary: Dict[Any, Any], encoding: Text = DEFAULT_ENCODING
|
|
233
|
+
) -> Text:
|
|
234
|
+
"""Calculate the fingerprint for a dictionary.
|
|
235
|
+
|
|
236
|
+
The dictionary can contain any keys and values which are either a dict,
|
|
237
|
+
a list or a elements which can be dumped as a string.
|
|
238
|
+
|
|
239
|
+
Args:
|
|
240
|
+
dictionary: dictionary to be hashed
|
|
241
|
+
encoding: encoding used for dumping objects as strings
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
The hash of the dictionary
|
|
245
|
+
"""
|
|
246
|
+
stringified = json.dumps(
|
|
247
|
+
{
|
|
248
|
+
deep_container_fingerprint(k, encoding): deep_container_fingerprint(
|
|
249
|
+
v, encoding
|
|
250
|
+
)
|
|
251
|
+
for k, v in dictionary.items()
|
|
252
|
+
},
|
|
253
|
+
sort_keys=True,
|
|
254
|
+
)
|
|
255
|
+
return get_text_hash(stringified, encoding)
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def get_list_fingerprint(
|
|
259
|
+
elements: List[Any], encoding: Text = DEFAULT_ENCODING
|
|
260
|
+
) -> Text:
|
|
261
|
+
"""Calculate a fingerprint for an unordered list.
|
|
262
|
+
|
|
263
|
+
Args:
|
|
264
|
+
elements: unordered list
|
|
265
|
+
encoding: encoding used for dumping objects as strings
|
|
266
|
+
|
|
267
|
+
Returns:
|
|
268
|
+
the fingerprint of the list
|
|
269
|
+
"""
|
|
270
|
+
stringified = json.dumps(
|
|
271
|
+
[deep_container_fingerprint(element, encoding) for element in elements]
|
|
272
|
+
)
|
|
273
|
+
return get_text_hash(stringified, encoding)
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def get_text_hash(text: Text, encoding: Text = DEFAULT_ENCODING) -> Text:
|
|
277
|
+
"""Calculate the md5 hash for a text."""
|
|
278
|
+
# deepcode ignore InsecureHash: Not used for a cryptographic purpose
|
|
279
|
+
return md5(text.encode(encoding)).hexdigest() # nosec
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def json_to_string(obj: Any, **kwargs: Any) -> Text:
|
|
283
|
+
"""Dumps a JSON-serializable object to string.
|
|
284
|
+
|
|
285
|
+
Args:
|
|
286
|
+
obj: JSON-serializable object.
|
|
287
|
+
kwargs: serialization options. Defaults to 2 space indentation
|
|
288
|
+
and disable escaping of non-ASCII characters.
|
|
289
|
+
|
|
290
|
+
Returns:
|
|
291
|
+
The objects serialized to JSON, as a string.
|
|
292
|
+
"""
|
|
293
|
+
indent = kwargs.pop("indent", 2)
|
|
294
|
+
ensure_ascii = kwargs.pop("ensure_ascii", False)
|
|
295
|
+
return json.dumps(obj, indent=indent, ensure_ascii=ensure_ascii, **kwargs)
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def convert_to_ordered_dict(obj: Any) -> Any:
|
|
299
|
+
"""Convert object to an `OrderedDict`.
|
|
300
|
+
|
|
301
|
+
Args:
|
|
302
|
+
obj: Object to convert.
|
|
303
|
+
|
|
304
|
+
Returns:
|
|
305
|
+
An `OrderedDict` with all nested dictionaries converted if `obj` is a
|
|
306
|
+
dictionary, otherwise the object itself.
|
|
307
|
+
"""
|
|
308
|
+
if isinstance(obj, OrderedDict):
|
|
309
|
+
return obj
|
|
310
|
+
# use recursion on lists
|
|
311
|
+
if isinstance(obj, list):
|
|
312
|
+
return [convert_to_ordered_dict(element) for element in obj]
|
|
313
|
+
|
|
314
|
+
if isinstance(obj, dict):
|
|
315
|
+
out = OrderedDict()
|
|
316
|
+
# use recursion on dictionaries
|
|
317
|
+
for k, v in obj.items():
|
|
318
|
+
out[k] = convert_to_ordered_dict(v)
|
|
319
|
+
|
|
320
|
+
return out
|
|
321
|
+
|
|
322
|
+
# return all other objects
|
|
323
|
+
return obj
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
def is_logging_disabled() -> bool:
|
|
327
|
+
"""Returns `True` if log level is set to WARNING or ERROR, `False` otherwise."""
|
|
328
|
+
log_level = os.environ.get(ENV_LOG_LEVEL, DEFAULT_LOG_LEVEL)
|
|
329
|
+
|
|
330
|
+
return log_level in ("ERROR", "WARNING")
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
def create_directory_for_file(file_path: Union[Text, Path]) -> None:
|
|
334
|
+
"""Creates any missing parent directories of this file path."""
|
|
335
|
+
create_directory(os.path.dirname(file_path))
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def dump_obj_as_json_to_file(filename: Union[Text, Path], obj: Any) -> None:
|
|
339
|
+
"""Dump an object as a json string to a file."""
|
|
340
|
+
write_text_file(json.dumps(obj, ensure_ascii=False, indent=2), filename)
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
def create_directory(directory_path: Text) -> None:
|
|
344
|
+
"""Creates a directory and its super paths.
|
|
345
|
+
|
|
346
|
+
Succeeds even if the path already exists.
|
|
347
|
+
"""
|
|
348
|
+
try:
|
|
349
|
+
os.makedirs(directory_path)
|
|
350
|
+
except OSError as e:
|
|
351
|
+
# be happy if someone already created the path
|
|
352
|
+
if e.errno != errno.EEXIST:
|
|
353
|
+
raise
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
def raise_deprecation_warning(
|
|
357
|
+
message: Text,
|
|
358
|
+
warn_until_version: Text = NEXT_MAJOR_VERSION_FOR_DEPRECATIONS,
|
|
359
|
+
docs: Optional[Text] = None,
|
|
360
|
+
**kwargs: Any,
|
|
361
|
+
) -> None:
|
|
362
|
+
"""Thin wrapper around `raise_warning()` to raise a deprecation warning.
|
|
363
|
+
|
|
364
|
+
It requires
|
|
365
|
+
a version until which we'll warn, and after which the support for the feature will
|
|
366
|
+
be removed.
|
|
367
|
+
"""
|
|
368
|
+
if warn_until_version not in message:
|
|
369
|
+
message = f"{message} (will be removed in {warn_until_version})"
|
|
370
|
+
|
|
371
|
+
# need the correct stacklevel now
|
|
372
|
+
kwargs.setdefault("stacklevel", 3)
|
|
373
|
+
# we're raising a `FutureWarning` instead of a `DeprecationWarning` because
|
|
374
|
+
# we want these warnings to be visible in the terminal of our users
|
|
375
|
+
# https://docs.python.org/3/library/warnings.html#warning-categories
|
|
376
|
+
raise_warning(message, FutureWarning, docs, **kwargs)
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
def is_subdirectory(path: Text, potential_parent_directory: Text) -> bool:
|
|
380
|
+
"""Checks if `path` is a subdirectory of `potential_parent_directory`.
|
|
381
|
+
|
|
382
|
+
Args:
|
|
383
|
+
path: Path to a file or directory.
|
|
384
|
+
potential_parent_directory: Potential parent directory.
|
|
385
|
+
|
|
386
|
+
Returns:
|
|
387
|
+
`True` if `path` is a subdirectory of `potential_parent_directory`.
|
|
388
|
+
"""
|
|
389
|
+
if path is None or potential_parent_directory is None:
|
|
390
|
+
return False
|
|
391
|
+
|
|
392
|
+
path = os.path.abspath(path)
|
|
393
|
+
potential_parent_directory = os.path.abspath(potential_parent_directory)
|
|
394
|
+
|
|
395
|
+
return potential_parent_directory in path
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
def random_string(length: int) -> Text:
|
|
399
|
+
"""Returns a random string of given length."""
|
|
400
|
+
return "".join(random.choices(string.ascii_uppercase + string.digits, k=length))
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
def handle_print_blocking(output: Text) -> None:
|
|
404
|
+
"""Handle print blocking (BlockingIOError) by getting the STDOUT lock.
|
|
405
|
+
|
|
406
|
+
Args:
|
|
407
|
+
output: Text to be printed to STDOUT.
|
|
408
|
+
"""
|
|
409
|
+
# Locking again to obtain STDOUT with a lock.
|
|
410
|
+
with portalocker.Lock(sys.stdout) as lock:
|
|
411
|
+
if sys.platform == "win32":
|
|
412
|
+
# colorama is used to fix a regression where colors can not be printed on
|
|
413
|
+
# windows. https://github.com/RasaHQ/rasa/issues/7053
|
|
414
|
+
from colorama import AnsiToWin32
|
|
415
|
+
|
|
416
|
+
lock = AnsiToWin32(lock).stream
|
|
417
|
+
|
|
418
|
+
print(output, file=lock, flush=True)
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
def file_as_bytes(file_path: Text) -> bytes:
|
|
422
|
+
"""Read in a file as a byte array."""
|
|
423
|
+
try:
|
|
424
|
+
with open(file_path, "rb") as f:
|
|
425
|
+
return f.read()
|
|
426
|
+
except FileNotFoundError:
|
|
427
|
+
raise FileNotFoundException(
|
|
428
|
+
f"Failed to read file, " f"'{os.path.abspath(file_path)}' does not exist."
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
F = TypeVar("F", bound=Callable[..., Any])
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
def suppress_logs(log_level: int = logging.WARNING) -> Callable[[F], F]:
|
|
436
|
+
"""Decorator to suppress logs during the execution of a function.
|
|
437
|
+
|
|
438
|
+
Args:
|
|
439
|
+
log_level: The log level to set during the execution of the function.
|
|
440
|
+
|
|
441
|
+
Returns:
|
|
442
|
+
The decorated function.
|
|
443
|
+
"""
|
|
444
|
+
|
|
445
|
+
def decorator(func: F) -> F:
|
|
446
|
+
@wraps(func)
|
|
447
|
+
async def async_wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
448
|
+
# Store the original logging level and set the new level.
|
|
449
|
+
original_logging_level = logging.getLogger().getEffectiveLevel()
|
|
450
|
+
logging.getLogger().setLevel(log_level)
|
|
451
|
+
try:
|
|
452
|
+
# Execute the async function.
|
|
453
|
+
result = await func(*args, **kwargs)
|
|
454
|
+
finally:
|
|
455
|
+
# Reset the logging level to the original level.
|
|
456
|
+
logging.getLogger().setLevel(original_logging_level)
|
|
457
|
+
return result
|
|
458
|
+
|
|
459
|
+
@wraps(func)
|
|
460
|
+
def sync_wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
461
|
+
# Store the original logging level and set the new level.
|
|
462
|
+
original_logging_level = logging.getLogger().getEffectiveLevel()
|
|
463
|
+
logging.getLogger().setLevel(log_level)
|
|
464
|
+
try:
|
|
465
|
+
# Execute the function.
|
|
466
|
+
result = func(*args, **kwargs)
|
|
467
|
+
finally:
|
|
468
|
+
# Reset the logging level to the original level.
|
|
469
|
+
logging.getLogger().setLevel(original_logging_level)
|
|
470
|
+
return result
|
|
471
|
+
|
|
472
|
+
# Determine if the function is async or not
|
|
473
|
+
if asyncio.iscoroutinefunction(func):
|
|
474
|
+
return cast(F, async_wrapper)
|
|
475
|
+
else:
|
|
476
|
+
return cast(F, sync_wrapper)
|
|
477
|
+
|
|
478
|
+
return decorator
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
def resolve_environment_variables(
|
|
482
|
+
value: Union[str, List[Any], Dict[str, Any]],
|
|
483
|
+
) -> Union[str, List[Any], Dict[str, Any]]:
|
|
484
|
+
"""Resolve environment variables in a string, list, or dictionary.
|
|
485
|
+
|
|
486
|
+
Args:
|
|
487
|
+
value: The value to resolve environment variables in.
|
|
488
|
+
|
|
489
|
+
Returns:
|
|
490
|
+
The value with environment variables resolved.
|
|
491
|
+
"""
|
|
492
|
+
if isinstance(value, str):
|
|
493
|
+
return os.path.expandvars(value)
|
|
494
|
+
elif isinstance(value, list):
|
|
495
|
+
return [resolve_environment_variables(item) for item in value]
|
|
496
|
+
elif isinstance(value, dict):
|
|
497
|
+
return {key: resolve_environment_variables(val) for key, val in value.items()}
|
|
498
|
+
else:
|
|
499
|
+
return value
|