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/utils/common.py
ADDED
|
@@ -0,0 +1,639 @@
|
|
|
1
|
+
import copy
|
|
2
|
+
import inspect
|
|
3
|
+
import logging
|
|
4
|
+
import logging.config
|
|
5
|
+
import logging.handlers
|
|
6
|
+
import os
|
|
7
|
+
import shutil
|
|
8
|
+
import tempfile
|
|
9
|
+
import warnings
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from types import TracebackType
|
|
12
|
+
from typing import (
|
|
13
|
+
Any,
|
|
14
|
+
Coroutine,
|
|
15
|
+
Dict,
|
|
16
|
+
List,
|
|
17
|
+
Optional,
|
|
18
|
+
Text,
|
|
19
|
+
Type,
|
|
20
|
+
TypeVar,
|
|
21
|
+
Union,
|
|
22
|
+
ContextManager,
|
|
23
|
+
Set,
|
|
24
|
+
Tuple,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
from socket import SOCK_DGRAM, SOCK_STREAM
|
|
28
|
+
import numpy as np
|
|
29
|
+
import rasa.utils.io
|
|
30
|
+
from rasa.anonymization import ENV_LOG_LEVEL_FAKER, ENV_LOG_LEVEL_PRESIDIO
|
|
31
|
+
from rasa.constants import (
|
|
32
|
+
DEFAULT_LOG_LEVEL_LIBRARIES,
|
|
33
|
+
ENV_LOG_LEVEL_LIBRARIES,
|
|
34
|
+
ENV_LOG_LEVEL_MATPLOTLIB,
|
|
35
|
+
ENV_LOG_LEVEL_MLFLOW,
|
|
36
|
+
ENV_LOG_LEVEL_RABBITMQ,
|
|
37
|
+
ENV_LOG_LEVEL_KAFKA,
|
|
38
|
+
)
|
|
39
|
+
from rasa.shared.constants import DEFAULT_LOG_LEVEL, ENV_LOG_LEVEL, TCP_PROTOCOL
|
|
40
|
+
from rasa.shared.exceptions import RasaException
|
|
41
|
+
import rasa.shared.utils.io
|
|
42
|
+
from rasa.shared.utils.yaml import read_yaml_file, write_yaml, read_config_file
|
|
43
|
+
|
|
44
|
+
logger = logging.getLogger(__name__)
|
|
45
|
+
|
|
46
|
+
T = TypeVar("T")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
EXPECTED_WARNINGS: List[Tuple[Type[Warning], str]] = [
|
|
50
|
+
# TODO (issue #9932)
|
|
51
|
+
(
|
|
52
|
+
np.VisibleDeprecationWarning,
|
|
53
|
+
"Creating an ndarray from ragged nested sequences.*",
|
|
54
|
+
),
|
|
55
|
+
# raised by pycountry (rasa-plus anonymization), magic_filter, google rpc
|
|
56
|
+
# and probably other dependencies that use pkg_resources instead of importlib
|
|
57
|
+
(DeprecationWarning, ".*pkg_resources.*"),
|
|
58
|
+
# This warning is triggered by sanic-cors 2.0.0 and by langchain -> faiss.
|
|
59
|
+
# The warning can be removed after the packages are updated:
|
|
60
|
+
# sanic-cors: ^2.1.0
|
|
61
|
+
# packaging`: 23.2 (introduces breaking changes)
|
|
62
|
+
# pep440-version-utils (also requires update on packaging)
|
|
63
|
+
(
|
|
64
|
+
DeprecationWarning,
|
|
65
|
+
"distutils Version classes are deprecated. Use packaging.version instead",
|
|
66
|
+
),
|
|
67
|
+
# cf. https://github.com/tensorflow/tensorflow/issues/38168
|
|
68
|
+
(
|
|
69
|
+
UserWarning,
|
|
70
|
+
"Converting sparse IndexedSlices.* to a dense Tensor of unknown "
|
|
71
|
+
"shape. This may consume a large amount of memory.",
|
|
72
|
+
),
|
|
73
|
+
(UserWarning, "Slot auto-fill has been removed in 3.0 .*"),
|
|
74
|
+
# Cannot fix this deprecation warning since we need to support two
|
|
75
|
+
# numpy versions as long as we keep python 37 around
|
|
76
|
+
(DeprecationWarning, "the `interpolation=` argument to quantile was renamed"),
|
|
77
|
+
# the next two warnings are triggered by adding 3.10 support,
|
|
78
|
+
# for more info: https://docs.python.org/3.10/whatsnew/3.10.html#deprecated
|
|
79
|
+
(DeprecationWarning, "the load_module*"),
|
|
80
|
+
(ImportWarning, "_SixMetaPathImporter.find_spec*"),
|
|
81
|
+
# 3.10 specific warning: https://github.com/pytest-dev/pytest-asyncio/issues/212
|
|
82
|
+
(DeprecationWarning, "There is no current event loop"),
|
|
83
|
+
# UserWarning which is always issued if the default value for
|
|
84
|
+
# assistant_id key in config file is not changed
|
|
85
|
+
(UserWarning, "is missing a unique value for the 'assistant_id' mandatory key.*"),
|
|
86
|
+
(
|
|
87
|
+
DeprecationWarning,
|
|
88
|
+
"non-integer arguments to randrange\\(\\) have been deprecated since",
|
|
89
|
+
),
|
|
90
|
+
# Ignore Keras DeprecationWarning since it requires that we
|
|
91
|
+
# upgrade tensorflow-macos to 2.13.0 version.
|
|
92
|
+
(DeprecationWarning, "invalid escape sequence*"),
|
|
93
|
+
# Ignore importlib open_text and read_text warnings for now
|
|
94
|
+
(
|
|
95
|
+
DeprecationWarning,
|
|
96
|
+
"https://importlib-resources.readthedocs.io/en/latest/using.html#migrating-from-legacy",
|
|
97
|
+
),
|
|
98
|
+
]
|
|
99
|
+
|
|
100
|
+
PYTHON_LOGGING_SCHEMA_DOCS = (
|
|
101
|
+
"https://docs.python.org/3/library/logging.config.html#dictionary-schema-details"
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class TempDirectoryPath(str, ContextManager):
|
|
106
|
+
"""Represents a path to an temporary directory.
|
|
107
|
+
|
|
108
|
+
When used as a context manager, it erases the contents of the directory on exit.
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
def __enter__(self) -> "TempDirectoryPath":
|
|
112
|
+
return self
|
|
113
|
+
|
|
114
|
+
def __exit__(
|
|
115
|
+
self,
|
|
116
|
+
_exc: Optional[Type[BaseException]],
|
|
117
|
+
_value: Optional[BaseException],
|
|
118
|
+
_tb: Optional[TracebackType],
|
|
119
|
+
) -> None:
|
|
120
|
+
if os.path.exists(self):
|
|
121
|
+
shutil.rmtree(self)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def get_temp_dir_name() -> Text:
|
|
125
|
+
"""Returns the path name of a newly created temporary directory."""
|
|
126
|
+
tempdir_name = tempfile.mkdtemp()
|
|
127
|
+
|
|
128
|
+
return decode_bytes(tempdir_name)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def decode_bytes(name: Union[Text, bytes]) -> Text:
|
|
132
|
+
"""Converts bytes object to string."""
|
|
133
|
+
if isinstance(name, bytes):
|
|
134
|
+
name = name.decode("UTF-8")
|
|
135
|
+
|
|
136
|
+
return name
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def read_global_config(path: Text) -> Dict[Text, Any]:
|
|
140
|
+
"""Read global Rasa configuration.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
path: Path to the configuration
|
|
144
|
+
Returns:
|
|
145
|
+
The global configuration
|
|
146
|
+
"""
|
|
147
|
+
# noinspection PyBroadException
|
|
148
|
+
try:
|
|
149
|
+
return read_config_file(path)
|
|
150
|
+
except Exception:
|
|
151
|
+
# if things go south we pretend there is no config
|
|
152
|
+
return {}
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def configure_logging_from_file(logging_config_file: Text) -> None:
|
|
156
|
+
"""Parses YAML file content to configure logging.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
logging_config_file: YAML file containing logging configuration to handle
|
|
160
|
+
custom formatting
|
|
161
|
+
"""
|
|
162
|
+
logging_config_dict = read_yaml_file(logging_config_file)
|
|
163
|
+
|
|
164
|
+
try:
|
|
165
|
+
logging.config.dictConfig(logging_config_dict)
|
|
166
|
+
except (ValueError, TypeError, AttributeError, ImportError) as e:
|
|
167
|
+
logging.debug(
|
|
168
|
+
f"The logging config file {logging_config_file} could not "
|
|
169
|
+
f"be applied because it failed validation against "
|
|
170
|
+
f"the built-in Python logging schema. "
|
|
171
|
+
f"More info at {PYTHON_LOGGING_SCHEMA_DOCS}.",
|
|
172
|
+
exc_info=e,
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def configure_logging_and_warnings(
|
|
177
|
+
log_level: Optional[int] = None,
|
|
178
|
+
logging_config_file: Optional[Text] = None,
|
|
179
|
+
warn_only_once: bool = True,
|
|
180
|
+
filter_repeated_logs: bool = True,
|
|
181
|
+
) -> None:
|
|
182
|
+
"""Sets log levels of various loggers and sets up filters for warnings and logs.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
log_level: The log level to be used for the 'Rasa' logger. Pass `None` to use
|
|
186
|
+
either the environment variable 'LOG_LEVEL' if it is specified, or the
|
|
187
|
+
default log level otherwise.
|
|
188
|
+
logging_config_file: YAML file containing logging configuration to handle
|
|
189
|
+
custom formatting
|
|
190
|
+
warn_only_once: determines whether user warnings should be filtered by the
|
|
191
|
+
`warnings` module to appear only "once"
|
|
192
|
+
filter_repeated_logs: determines whether `RepeatedLogFilter`s are added to
|
|
193
|
+
the handlers of the root logger
|
|
194
|
+
"""
|
|
195
|
+
if logging_config_file is not None:
|
|
196
|
+
configure_logging_from_file(logging_config_file)
|
|
197
|
+
|
|
198
|
+
if log_level is None: # Log level NOTSET is 0 so we use `is None` here
|
|
199
|
+
log_level_name = os.environ.get(ENV_LOG_LEVEL, DEFAULT_LOG_LEVEL)
|
|
200
|
+
# Change log level from str to int (note that log_level in function parameter
|
|
201
|
+
# int already, coming from CLI argparse parameter).
|
|
202
|
+
log_level = logging.getLevelName(log_level_name)
|
|
203
|
+
|
|
204
|
+
logging.getLogger("rasa").setLevel(log_level)
|
|
205
|
+
# Assign log level to env variable in str format (not int). Why do we assign?
|
|
206
|
+
os.environ[ENV_LOG_LEVEL] = logging.getLevelName(log_level)
|
|
207
|
+
|
|
208
|
+
configure_library_logging()
|
|
209
|
+
|
|
210
|
+
if filter_repeated_logs:
|
|
211
|
+
for handler in logging.getLogger().handlers:
|
|
212
|
+
handler.addFilter(RepeatedLogFilter())
|
|
213
|
+
|
|
214
|
+
_filter_warnings(log_level=log_level, warn_only_once=warn_only_once)
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def _filter_warnings(log_level: Optional[int], warn_only_once: bool = True) -> None:
|
|
218
|
+
"""Sets up filters for warnings.
|
|
219
|
+
|
|
220
|
+
Args:
|
|
221
|
+
log_level: the current log level. Certain warnings will only be filtered out
|
|
222
|
+
if we're not in debug mode.
|
|
223
|
+
warn_only_once: determines whether user warnings should be filtered by the
|
|
224
|
+
`warnings` module to appear only "once"
|
|
225
|
+
"""
|
|
226
|
+
if warn_only_once:
|
|
227
|
+
warnings.filterwarnings("once", category=UserWarning)
|
|
228
|
+
if log_level and log_level > logging.DEBUG:
|
|
229
|
+
for warning_type, warning_message in EXPECTED_WARNINGS:
|
|
230
|
+
warnings.filterwarnings(
|
|
231
|
+
"ignore", message=f".*{warning_message}", category=warning_type
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def configure_library_logging() -> None:
|
|
236
|
+
"""Configures log levels of used libraries such as kafka, matplotlib, pika."""
|
|
237
|
+
library_log_level = os.environ.get(
|
|
238
|
+
ENV_LOG_LEVEL_LIBRARIES, DEFAULT_LOG_LEVEL_LIBRARIES
|
|
239
|
+
)
|
|
240
|
+
update_tensorflow_log_level()
|
|
241
|
+
update_asyncio_log_level()
|
|
242
|
+
update_apscheduler_log_level()
|
|
243
|
+
update_socketio_log_level()
|
|
244
|
+
update_matplotlib_log_level(library_log_level)
|
|
245
|
+
update_kafka_log_level(library_log_level)
|
|
246
|
+
update_rabbitmq_log_level(library_log_level)
|
|
247
|
+
update_presidio_log_level(library_log_level)
|
|
248
|
+
update_faker_log_level(library_log_level)
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def update_apscheduler_log_level() -> None:
|
|
252
|
+
"""Configures the log level of `apscheduler.*` loggers."""
|
|
253
|
+
log_level = os.environ.get(ENV_LOG_LEVEL_LIBRARIES, DEFAULT_LOG_LEVEL_LIBRARIES)
|
|
254
|
+
|
|
255
|
+
apscheduler_loggers = [
|
|
256
|
+
"apscheduler",
|
|
257
|
+
"apscheduler.scheduler",
|
|
258
|
+
"apscheduler.executors",
|
|
259
|
+
"apscheduler.executors.default",
|
|
260
|
+
]
|
|
261
|
+
|
|
262
|
+
for logger_name in apscheduler_loggers:
|
|
263
|
+
logging.getLogger(logger_name).setLevel(log_level)
|
|
264
|
+
logging.getLogger(logger_name).propagate = False
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def update_socketio_log_level() -> None:
|
|
268
|
+
"""Set the log level of socketio."""
|
|
269
|
+
log_level = os.environ.get(ENV_LOG_LEVEL_LIBRARIES, DEFAULT_LOG_LEVEL_LIBRARIES)
|
|
270
|
+
|
|
271
|
+
socketio_loggers = ["websockets.protocol", "engineio.server", "socketio.server"]
|
|
272
|
+
|
|
273
|
+
for logger_name in socketio_loggers:
|
|
274
|
+
logging.getLogger(logger_name).setLevel(log_level)
|
|
275
|
+
logging.getLogger(logger_name).propagate = False
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
def update_tensorflow_log_level() -> None:
|
|
279
|
+
"""Sets Tensorflow log level based on env variable 'LOG_LEVEL_LIBRARIES'."""
|
|
280
|
+
# Disables libvinfer, tensorRT, cuda, AVX2 and FMA warnings (CPU support).
|
|
281
|
+
# This variable needs to be set before the
|
|
282
|
+
# first import since some warnings are raised on the first import.
|
|
283
|
+
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
|
|
284
|
+
|
|
285
|
+
log_level = os.environ.get(ENV_LOG_LEVEL_LIBRARIES, DEFAULT_LOG_LEVEL_LIBRARIES)
|
|
286
|
+
|
|
287
|
+
if not log_level:
|
|
288
|
+
log_level = "ERROR"
|
|
289
|
+
|
|
290
|
+
logging.getLogger("tensorflow").setLevel(log_level)
|
|
291
|
+
logging.getLogger("tensorflow").propagate = False
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
def update_sanic_log_level(
|
|
295
|
+
log_file: Optional[Text] = None,
|
|
296
|
+
use_syslog: Optional[bool] = False,
|
|
297
|
+
syslog_address: Optional[Text] = None,
|
|
298
|
+
syslog_port: Optional[int] = None,
|
|
299
|
+
syslog_protocol: Optional[Text] = None,
|
|
300
|
+
) -> None:
|
|
301
|
+
"""Set the log level to 'LOG_LEVEL_LIBRARIES' environment variable ."""
|
|
302
|
+
from sanic.log import logger, error_logger, access_logger
|
|
303
|
+
|
|
304
|
+
log_level = os.environ.get(ENV_LOG_LEVEL_LIBRARIES, DEFAULT_LOG_LEVEL_LIBRARIES)
|
|
305
|
+
|
|
306
|
+
logger.setLevel(log_level)
|
|
307
|
+
error_logger.setLevel(log_level)
|
|
308
|
+
access_logger.setLevel(log_level)
|
|
309
|
+
|
|
310
|
+
logger.propagate = False
|
|
311
|
+
error_logger.propagate = False
|
|
312
|
+
access_logger.propagate = False
|
|
313
|
+
|
|
314
|
+
if log_file is not None:
|
|
315
|
+
formatter = logging.Formatter("%(asctime)s [%(levelname)-5.5s] %(message)s")
|
|
316
|
+
file_handler = logging.FileHandler(log_file)
|
|
317
|
+
file_handler.setFormatter(formatter)
|
|
318
|
+
|
|
319
|
+
logger.addHandler(file_handler)
|
|
320
|
+
error_logger.addHandler(file_handler)
|
|
321
|
+
access_logger.addHandler(file_handler)
|
|
322
|
+
if use_syslog:
|
|
323
|
+
formatter = logging.Formatter(
|
|
324
|
+
"%(asctime)s [%(levelname)-5.5s] [%(process)d]" " %(message)s"
|
|
325
|
+
)
|
|
326
|
+
socktype = SOCK_STREAM if syslog_protocol == TCP_PROTOCOL else SOCK_DGRAM
|
|
327
|
+
syslog_handler = logging.handlers.SysLogHandler(
|
|
328
|
+
address=(syslog_address, syslog_port), socktype=socktype
|
|
329
|
+
)
|
|
330
|
+
syslog_handler.setFormatter(formatter)
|
|
331
|
+
logger.addHandler(syslog_handler)
|
|
332
|
+
error_logger.addHandler(syslog_handler)
|
|
333
|
+
access_logger.addHandler(syslog_handler)
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
def update_asyncio_log_level() -> None:
|
|
337
|
+
"""Set the log level of asyncio to the log level.
|
|
338
|
+
|
|
339
|
+
Uses the log level specified in the environment variable 'LOG_LEVEL_LIBRARIES'.
|
|
340
|
+
"""
|
|
341
|
+
log_level = os.environ.get(ENV_LOG_LEVEL_LIBRARIES, DEFAULT_LOG_LEVEL_LIBRARIES)
|
|
342
|
+
logging.getLogger("asyncio").setLevel(log_level)
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def update_matplotlib_log_level(library_log_level: Text) -> None:
|
|
346
|
+
"""Set the log level of matplotlib.
|
|
347
|
+
|
|
348
|
+
Uses the library specific log level or the general libraries log level.
|
|
349
|
+
"""
|
|
350
|
+
log_level = os.environ.get(ENV_LOG_LEVEL_MATPLOTLIB, library_log_level)
|
|
351
|
+
logging.getLogger("matplotlib").setLevel(log_level)
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
def update_kafka_log_level(library_log_level: Text) -> None:
|
|
355
|
+
"""Set the log level of kafka.
|
|
356
|
+
|
|
357
|
+
Uses the library specific log level or the general libraries log level.
|
|
358
|
+
"""
|
|
359
|
+
log_level = os.environ.get(ENV_LOG_LEVEL_KAFKA, library_log_level)
|
|
360
|
+
logging.getLogger("kafka").setLevel(log_level)
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
def update_rabbitmq_log_level(library_log_level: Text) -> None:
|
|
364
|
+
"""Set the log level of pika.
|
|
365
|
+
|
|
366
|
+
Uses the library specific log level or the general libraries log level.
|
|
367
|
+
"""
|
|
368
|
+
log_level = os.environ.get(ENV_LOG_LEVEL_RABBITMQ, library_log_level)
|
|
369
|
+
logging.getLogger("aio_pika").setLevel(log_level)
|
|
370
|
+
logging.getLogger("aiormq").setLevel(log_level)
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
def update_presidio_log_level(library_log_level: Text) -> None:
|
|
374
|
+
"""Set the log level of presidio.
|
|
375
|
+
|
|
376
|
+
Uses the library specific log level or the general libraries log level.
|
|
377
|
+
"""
|
|
378
|
+
log_level = os.environ.get(ENV_LOG_LEVEL_PRESIDIO, library_log_level)
|
|
379
|
+
presidio_loggers = ["presidio_analyzer", "presidio_anonymizer"]
|
|
380
|
+
|
|
381
|
+
for logger_name in presidio_loggers:
|
|
382
|
+
logging.getLogger(logger_name).setLevel(log_level)
|
|
383
|
+
logging.getLogger(logger_name).propagate = False
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
def update_faker_log_level(library_log_level: Text) -> None:
|
|
387
|
+
"""Set the log level of faker.
|
|
388
|
+
|
|
389
|
+
Uses the library specific log level or the general libraries log level.
|
|
390
|
+
"""
|
|
391
|
+
log_level = os.environ.get(ENV_LOG_LEVEL_FAKER, library_log_level)
|
|
392
|
+
logging.getLogger("faker").setLevel(log_level)
|
|
393
|
+
logging.getLogger("faker").propagate = False
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
def update_mlflow_log_level() -> None:
|
|
397
|
+
"""Set the log level of mlflow.
|
|
398
|
+
|
|
399
|
+
Uses the library specific log level or the general libraries log level.
|
|
400
|
+
"""
|
|
401
|
+
library_log_level = os.environ.get(
|
|
402
|
+
ENV_LOG_LEVEL_LIBRARIES, DEFAULT_LOG_LEVEL_LIBRARIES
|
|
403
|
+
)
|
|
404
|
+
log_level = os.environ.get(ENV_LOG_LEVEL_MLFLOW, library_log_level)
|
|
405
|
+
logging.getLogger("mlflow").setLevel(log_level)
|
|
406
|
+
logging.getLogger("mlflow").propagate = False
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
def sort_list_of_dicts_by_first_key(dicts: List[Dict]) -> List[Dict]:
|
|
410
|
+
"""Sorts a list of dictionaries by their first key."""
|
|
411
|
+
return sorted(dicts, key=lambda d: next(iter(d.keys())))
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
def write_global_config_value(name: Text, value: Any) -> bool:
|
|
415
|
+
"""Read global Rasa configuration.
|
|
416
|
+
|
|
417
|
+
Args:
|
|
418
|
+
name: Name of the configuration key
|
|
419
|
+
value: Value the configuration key should be set to
|
|
420
|
+
|
|
421
|
+
Returns:
|
|
422
|
+
`True` if the operation was successful.
|
|
423
|
+
"""
|
|
424
|
+
# need to use `rasa.constants.GLOBAL_USER_CONFIG_PATH` to allow patching
|
|
425
|
+
# in tests
|
|
426
|
+
config_path = rasa.constants.GLOBAL_USER_CONFIG_PATH
|
|
427
|
+
try:
|
|
428
|
+
os.makedirs(os.path.dirname(config_path), exist_ok=True)
|
|
429
|
+
|
|
430
|
+
c = read_global_config(config_path)
|
|
431
|
+
c[name] = value
|
|
432
|
+
write_yaml(c, rasa.constants.GLOBAL_USER_CONFIG_PATH)
|
|
433
|
+
return True
|
|
434
|
+
except Exception as e:
|
|
435
|
+
logger.warning(f"Failed to write global config. Error: {e}. Skipping.")
|
|
436
|
+
return False
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
def read_global_config_value(name: Text, unavailable_ok: bool = True) -> Any:
|
|
440
|
+
"""Read a value from the global Rasa configuration."""
|
|
441
|
+
|
|
442
|
+
def not_found() -> None:
|
|
443
|
+
if unavailable_ok:
|
|
444
|
+
return None
|
|
445
|
+
else:
|
|
446
|
+
raise ValueError(f"Configuration '{name}' key not found.")
|
|
447
|
+
|
|
448
|
+
# need to use `rasa.constants.GLOBAL_USER_CONFIG_PATH` to allow patching
|
|
449
|
+
# in tests
|
|
450
|
+
config_path = rasa.constants.GLOBAL_USER_CONFIG_PATH
|
|
451
|
+
|
|
452
|
+
if not os.path.exists(config_path):
|
|
453
|
+
return not_found()
|
|
454
|
+
|
|
455
|
+
c = read_global_config(config_path)
|
|
456
|
+
|
|
457
|
+
if name in c:
|
|
458
|
+
return c[name]
|
|
459
|
+
else:
|
|
460
|
+
return not_found()
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
def update_existing_keys(
|
|
464
|
+
original: Dict[Any, Any], updates: Dict[Any, Any]
|
|
465
|
+
) -> Dict[Any, Any]:
|
|
466
|
+
"""Iterate through all the updates and update a value in the original dictionary.
|
|
467
|
+
|
|
468
|
+
If the updates contain a key that is not present in the original dict, it will
|
|
469
|
+
be ignored.
|
|
470
|
+
"""
|
|
471
|
+
updated = original.copy()
|
|
472
|
+
for k, v in updates.items():
|
|
473
|
+
if k in updated:
|
|
474
|
+
updated[k] = v
|
|
475
|
+
return updated
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
def override_defaults(
|
|
479
|
+
defaults: Optional[Dict[Text, Any]], custom: Optional[Dict[Text, Any]]
|
|
480
|
+
) -> Dict[Text, Any]:
|
|
481
|
+
"""Override default config with the given config.
|
|
482
|
+
|
|
483
|
+
We cannot use `dict.update` method because configs contain nested dicts.
|
|
484
|
+
|
|
485
|
+
Args:
|
|
486
|
+
defaults: default config
|
|
487
|
+
custom: user config containing new parameters
|
|
488
|
+
|
|
489
|
+
Returns:
|
|
490
|
+
updated config
|
|
491
|
+
"""
|
|
492
|
+
config = copy.deepcopy(defaults) if defaults else {}
|
|
493
|
+
|
|
494
|
+
if not custom:
|
|
495
|
+
return config
|
|
496
|
+
|
|
497
|
+
for key in custom.keys():
|
|
498
|
+
if isinstance(config.get(key), dict):
|
|
499
|
+
config[key].update(custom[key])
|
|
500
|
+
continue
|
|
501
|
+
config[key] = custom[key]
|
|
502
|
+
|
|
503
|
+
return config
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
class RepeatedLogFilter(logging.Filter):
|
|
507
|
+
"""Filter repeated log records."""
|
|
508
|
+
|
|
509
|
+
last_log = None
|
|
510
|
+
|
|
511
|
+
def filter(self, record: logging.LogRecord) -> bool:
|
|
512
|
+
"""Determines whether current log is different to last log."""
|
|
513
|
+
current_log = (
|
|
514
|
+
record.levelno,
|
|
515
|
+
record.pathname,
|
|
516
|
+
record.lineno,
|
|
517
|
+
record.msg,
|
|
518
|
+
record.args,
|
|
519
|
+
)
|
|
520
|
+
if current_log != self.last_log:
|
|
521
|
+
self.last_log = current_log
|
|
522
|
+
return True
|
|
523
|
+
return False
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
async def call_potential_coroutine(
|
|
527
|
+
coroutine_or_return_value: Union[Any, Coroutine],
|
|
528
|
+
) -> Any:
|
|
529
|
+
"""Awaits coroutine or returns value directly if it's not a coroutine.
|
|
530
|
+
|
|
531
|
+
Args:
|
|
532
|
+
coroutine_or_return_value: Either the return value of a synchronous function
|
|
533
|
+
call or a coroutine which needs to be await first.
|
|
534
|
+
|
|
535
|
+
Returns:
|
|
536
|
+
The return value of the function.
|
|
537
|
+
"""
|
|
538
|
+
if inspect.iscoroutine(coroutine_or_return_value):
|
|
539
|
+
return await coroutine_or_return_value
|
|
540
|
+
|
|
541
|
+
return coroutine_or_return_value
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
def directory_size_in_mb(
|
|
545
|
+
path: Path, filenames_to_exclude: Optional[List[Text]] = None
|
|
546
|
+
) -> float:
|
|
547
|
+
"""Calculates the size of a directory.
|
|
548
|
+
|
|
549
|
+
Args:
|
|
550
|
+
path: The path to the directory.
|
|
551
|
+
filenames_to_exclude: Allows excluding certain files from the calculation.
|
|
552
|
+
|
|
553
|
+
Returns:
|
|
554
|
+
Directory size in MiB.
|
|
555
|
+
"""
|
|
556
|
+
filenames_to_exclude = filenames_to_exclude or []
|
|
557
|
+
size = 0.0
|
|
558
|
+
for root, _dirs, files in os.walk(path):
|
|
559
|
+
for filename in files:
|
|
560
|
+
if filename in filenames_to_exclude:
|
|
561
|
+
continue
|
|
562
|
+
size += (Path(root) / filename).stat().st_size
|
|
563
|
+
|
|
564
|
+
# bytes to MiB
|
|
565
|
+
return size / 1_048_576
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
def copy_directory(source: Path, destination: Path) -> None:
|
|
569
|
+
"""Copies the content of one directory into another.
|
|
570
|
+
|
|
571
|
+
Args:
|
|
572
|
+
source: The directory whose contents should be copied to `destination`.
|
|
573
|
+
destination: The directory which should contain the content `source` in the end.
|
|
574
|
+
|
|
575
|
+
Raises:
|
|
576
|
+
ValueError: If destination is not empty.
|
|
577
|
+
"""
|
|
578
|
+
if not destination.exists():
|
|
579
|
+
destination.mkdir(parents=True)
|
|
580
|
+
|
|
581
|
+
if list(destination.glob("*")):
|
|
582
|
+
raise ValueError(
|
|
583
|
+
f"Destination path '{destination}' is not empty. Directories "
|
|
584
|
+
f"can only be copied to empty directories."
|
|
585
|
+
)
|
|
586
|
+
|
|
587
|
+
shutil.copytree(source, destination, dirs_exist_ok=True)
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
def find_unavailable_packages(package_names: List[Text]) -> Set[Text]:
|
|
591
|
+
"""Tries to import all package names and returns the packages where it failed.
|
|
592
|
+
|
|
593
|
+
Args:
|
|
594
|
+
package_names: The package names to import.
|
|
595
|
+
|
|
596
|
+
Returns:
|
|
597
|
+
Package names that could not be imported.
|
|
598
|
+
"""
|
|
599
|
+
import importlib
|
|
600
|
+
|
|
601
|
+
failed_imports = set()
|
|
602
|
+
for package in package_names:
|
|
603
|
+
try:
|
|
604
|
+
importlib.import_module(package)
|
|
605
|
+
except ImportError:
|
|
606
|
+
failed_imports.add(package)
|
|
607
|
+
|
|
608
|
+
return failed_imports
|
|
609
|
+
|
|
610
|
+
|
|
611
|
+
def module_path_from_class(clazz: Type) -> Text:
|
|
612
|
+
"""Return the module path of an instance's class."""
|
|
613
|
+
return clazz.__module__ + "." + clazz.__name__
|
|
614
|
+
|
|
615
|
+
|
|
616
|
+
def get_bool_env_variable(variable_name: str, default_variable_value: bool) -> bool:
|
|
617
|
+
"""Fetch bool value stored in environment variable.
|
|
618
|
+
|
|
619
|
+
If environment variable is set but value is
|
|
620
|
+
not of boolean nature, an exception will be raised.
|
|
621
|
+
|
|
622
|
+
Args: variable_name:
|
|
623
|
+
Name of the environment variable.
|
|
624
|
+
default_variable_value: Value to be returned if environment variable is not set.
|
|
625
|
+
|
|
626
|
+
Returns:
|
|
627
|
+
A boolean value stored in the environment variable
|
|
628
|
+
or default value if environment variable is not set.
|
|
629
|
+
"""
|
|
630
|
+
true_values = (str(True).lower(), str(1).lower())
|
|
631
|
+
false_values = (str(False).lower(), str(0).lower())
|
|
632
|
+
value = os.getenv(variable_name, default=str(default_variable_value))
|
|
633
|
+
|
|
634
|
+
if value.lower() not in true_values + false_values:
|
|
635
|
+
raise RasaException(
|
|
636
|
+
f"Invalid value `{value}` for variable `{variable_name}`. "
|
|
637
|
+
f"Available values are `{true_values + false_values}`"
|
|
638
|
+
)
|
|
639
|
+
return value.lower() in true_values
|
rasa/utils/converter.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from typing import Text
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class TrainingDataConverter:
|
|
6
|
+
"""Interface for any training data format conversion."""
|
|
7
|
+
|
|
8
|
+
@classmethod
|
|
9
|
+
def filter(cls, source_path: Path) -> bool:
|
|
10
|
+
"""Checks if the concrete implementation of TrainingDataConverter can convert
|
|
11
|
+
training data file.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
source_path: Path to the training data file.
|
|
15
|
+
|
|
16
|
+
Returns:
|
|
17
|
+
`True` if the given file can be converted, `False` otherwise
|
|
18
|
+
"""
|
|
19
|
+
raise NotImplementedError
|
|
20
|
+
|
|
21
|
+
@classmethod
|
|
22
|
+
async def convert_and_write(cls, source_path: Path, output_path: Path) -> None:
|
|
23
|
+
"""Converts the given training data file and saves it to the output directory.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
source_path: Path to the training data file.
|
|
27
|
+
output_path: Path to the output directory.
|
|
28
|
+
"""
|
|
29
|
+
raise NotImplementedError
|
|
30
|
+
|
|
31
|
+
@classmethod
|
|
32
|
+
def generate_path_for_converted_training_data_file(
|
|
33
|
+
cls, source_file_path: Path, output_directory: Path
|
|
34
|
+
) -> Path:
|
|
35
|
+
"""Generates path for a training data file converted to YAML format.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
source_file_path: Path to the original file.
|
|
39
|
+
output_directory: Path to the target directory.
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
Path to the target converted training data file.
|
|
43
|
+
"""
|
|
44
|
+
return (
|
|
45
|
+
output_directory / f"{source_file_path.stem}{cls.converted_file_suffix()}"
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
@classmethod
|
|
49
|
+
def converted_file_suffix(cls) -> Text:
|
|
50
|
+
"""Returns suffix that should be appended to the converted
|
|
51
|
+
training data file.
|
|
52
|
+
"""
|
|
53
|
+
return "_converted.yml"
|