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
README.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<h1 align="center">Rasa Pro</h1>
|
|
2
|
+
|
|
3
|
+
<div align="center">
|
|
4
|
+
|
|
5
|
+
[](https://github.com/RasaHQ/rasa-private/actions)
|
|
6
|
+
[](https://sonarcloud.io/summary/new_code?id=RasaHQ_rasa)
|
|
7
|
+
[](https://rasa.com/docs/rasa-pro/)
|
|
8
|
+
|
|
9
|
+
</div>
|
|
10
|
+
|
|
11
|
+
<hr />
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
Rasa Pro is a framework for building scalable, dynamic conversational AI assistants that integrate large language models (LLMs) to enable more contextually aware and agentic interactions. Whether you’re new to conversational AI or an experienced developer, Rasa Pro offers enhanced flexibility, control, and performance for mission-critical applications.
|
|
15
|
+
|
|
16
|
+
Building on the foundation of Rasa Open Source, Rasa Pro adds advanced features like CALM (Conversational AI with Language Models) and Dialogue Understanding (DU), which enable developers to shift from traditional intent-driven systems to LLM-based agents. This allows for more robust, responsive interactions that adhere strictly to business logic, while reducing risks like prompt injection and minimizing hallucinations.
|
|
17
|
+
|
|
18
|
+
**Key Features:**
|
|
19
|
+
|
|
20
|
+
- **Flows for Business Logic:** Easily define business logic through Flows, a simplified way to describe how your AI assistant should handle conversations. Flows help streamline the development process, focusing on key tasks and reducing the complexity involved in managing conversations.
|
|
21
|
+
- **Automatic Conversation Repair:** Ensure seamless interactions by automatically handling interruptions or unexpected inputs. Developers have full control to customize these repairs based on specific use cases.
|
|
22
|
+
- **Customizable and Open:** Fully customizable code that allows developers to modify Rasa Pro to meet specific requirements, ensuring flexibility and adaptability to various conversational AI needs.
|
|
23
|
+
- **Robustness and Control:** Maintain strict adherence to business logic, preventing unwanted behaviors like prompt injection and hallucinations, leading to more reliable responses and secure interactions.
|
|
24
|
+
- **Built-in Security:** Safeguard sensitive data, control access, and ensure secure deployment, essential for production environments that demand high levels of security and compliance.
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
A [free developer license](https://rasa.com/docs/rasa-pro/developer-edition/) is available so you can explore and get to know Rasa Pro. For small production deployments, the Extended Developer License allows you to take your assistant live in a limited capacity. A paid license is required for larger-scale production use, but all code is visible and can be customized as needed.
|
|
29
|
+
|
|
30
|
+
To get started right now, you can
|
|
31
|
+
|
|
32
|
+
`pip install rasa-pro`
|
|
33
|
+
|
|
34
|
+
Check out our
|
|
35
|
+
|
|
36
|
+
- [Rasa-pro Quickstart](https://rasa.com/docs/rasa-pro/installation/quickstart/),
|
|
37
|
+
- [Conversational AI with Language Models (CALM) conceptual rundown](https://rasa.com/docs/rasa-pro/calm/),
|
|
38
|
+
- [Rasa Pro / CALM tutorial](https://rasa.com/docs/rasa-pro/tutorial), and
|
|
39
|
+
- [Rasa pro changelog](https://rasa.com/docs/rasa/rasa-pro-changelog/)
|
|
40
|
+
|
|
41
|
+
for more. Also feel free to reach out to us on the [Rasa forum](https://forum.rasa.com/).
|
rasa/__init__.py
ADDED
rasa/__main__.py
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
from typing import Optional, List
|
|
3
|
+
import structlog
|
|
4
|
+
import os
|
|
5
|
+
import platform
|
|
6
|
+
import sys
|
|
7
|
+
|
|
8
|
+
from rasa_sdk import __version__ as rasa_sdk_version
|
|
9
|
+
from rasa.constants import MINIMUM_COMPATIBLE_VERSION
|
|
10
|
+
from rasa.utils.log_utils import configure_structlog
|
|
11
|
+
|
|
12
|
+
import rasa.telemetry
|
|
13
|
+
import rasa.utils.io
|
|
14
|
+
import rasa.utils.tensorflow.environment as tf_env
|
|
15
|
+
from rasa import version
|
|
16
|
+
from rasa.cli import (
|
|
17
|
+
data,
|
|
18
|
+
export,
|
|
19
|
+
interactive,
|
|
20
|
+
run,
|
|
21
|
+
scaffold,
|
|
22
|
+
shell,
|
|
23
|
+
telemetry,
|
|
24
|
+
test,
|
|
25
|
+
train,
|
|
26
|
+
visualize,
|
|
27
|
+
x,
|
|
28
|
+
evaluate,
|
|
29
|
+
llm_fine_tuning,
|
|
30
|
+
)
|
|
31
|
+
from rasa.cli.arguments.default_arguments import add_logging_options
|
|
32
|
+
from rasa.cli.utils import (
|
|
33
|
+
parse_last_positional_argument_as_model_path,
|
|
34
|
+
warn_if_rasa_plus_package_installed,
|
|
35
|
+
check_if_studio_command,
|
|
36
|
+
)
|
|
37
|
+
from rasa.plugin import plugin_manager
|
|
38
|
+
from rasa.shared.exceptions import RasaException
|
|
39
|
+
from rasa.utils.common import configure_logging_and_warnings
|
|
40
|
+
|
|
41
|
+
structlogger = structlog.get_logger()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def create_argument_parser() -> argparse.ArgumentParser:
|
|
45
|
+
"""Parse all the command line arguments for the training script."""
|
|
46
|
+
parser = argparse.ArgumentParser(
|
|
47
|
+
prog="rasa",
|
|
48
|
+
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
|
49
|
+
description="Rasa command line interface. Rasa allows you to build "
|
|
50
|
+
"your own conversational assistants 🤖. The 'rasa' command "
|
|
51
|
+
"allows you to easily run most common commands like "
|
|
52
|
+
"creating a new bot, training or evaluating models.",
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
parser.add_argument(
|
|
56
|
+
"--version",
|
|
57
|
+
action="store_true",
|
|
58
|
+
default=argparse.SUPPRESS,
|
|
59
|
+
help="Print installed Rasa version",
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
parent_parser = argparse.ArgumentParser(add_help=False)
|
|
63
|
+
add_logging_options(parent_parser)
|
|
64
|
+
parent_parsers = [parent_parser]
|
|
65
|
+
|
|
66
|
+
subparsers = parser.add_subparsers(help="Rasa commands")
|
|
67
|
+
|
|
68
|
+
scaffold.add_subparser(subparsers, parents=parent_parsers)
|
|
69
|
+
run.add_subparser(subparsers, parents=parent_parsers)
|
|
70
|
+
shell.add_subparser(subparsers, parents=parent_parsers)
|
|
71
|
+
train.add_subparser(subparsers, parents=parent_parsers)
|
|
72
|
+
interactive.add_subparser(subparsers, parents=parent_parsers)
|
|
73
|
+
telemetry.add_subparser(subparsers, parents=parent_parsers)
|
|
74
|
+
test.add_subparser(subparsers, parents=parent_parsers)
|
|
75
|
+
visualize.add_subparser(subparsers, parents=parent_parsers)
|
|
76
|
+
data.add_subparser(subparsers, parents=parent_parsers)
|
|
77
|
+
export.add_subparser(subparsers, parents=parent_parsers)
|
|
78
|
+
x.add_subparser(subparsers, parents=parent_parsers)
|
|
79
|
+
evaluate.add_subparser(subparsers, parents=parent_parsers)
|
|
80
|
+
llm_fine_tuning.add_subparser(subparsers, parent_parsers)
|
|
81
|
+
plugin_manager().hook.refine_cli(
|
|
82
|
+
subparsers=subparsers, parent_parsers=parent_parsers
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
return parser
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def print_version() -> None:
|
|
89
|
+
"""Prints version information of rasa tooling and python."""
|
|
90
|
+
from rasa.utils.licensing import get_license_expiration_date
|
|
91
|
+
|
|
92
|
+
print(f"Rasa Pro Version : {version.__version__}")
|
|
93
|
+
print(f"Minimum Compatible Version: {MINIMUM_COMPATIBLE_VERSION}")
|
|
94
|
+
print(f"Rasa SDK Version : {rasa_sdk_version}")
|
|
95
|
+
print(f"Python Version : {platform.python_version()}")
|
|
96
|
+
print(f"Operating System : {platform.platform()}")
|
|
97
|
+
print(f"Python Path : {sys.executable}")
|
|
98
|
+
print(f"License Expires : {get_license_expiration_date()}")
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def main(raw_arguments: Optional[List[str]] = None) -> None:
|
|
102
|
+
"""Run as standalone python application.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
raw_arguments: Arguments to parse. If not provided,
|
|
106
|
+
arguments will be taken from the command line.
|
|
107
|
+
"""
|
|
108
|
+
warn_if_rasa_plus_package_installed()
|
|
109
|
+
parse_last_positional_argument_as_model_path()
|
|
110
|
+
arg_parser = create_argument_parser()
|
|
111
|
+
cmdline_arguments = arg_parser.parse_args(raw_arguments)
|
|
112
|
+
|
|
113
|
+
log_level = getattr(cmdline_arguments, "loglevel", None)
|
|
114
|
+
logging_config_file = getattr(cmdline_arguments, "logging_config_file", None)
|
|
115
|
+
configure_logging_and_warnings(
|
|
116
|
+
log_level, logging_config_file, warn_only_once=True, filter_repeated_logs=True
|
|
117
|
+
)
|
|
118
|
+
# TODO: we shouldn't configure colored logging, since we are using structlog
|
|
119
|
+
# for logging - should be removed as part of logs cleanup
|
|
120
|
+
rasa.utils.io.configure_colored_logging(log_level)
|
|
121
|
+
configure_structlog(log_level)
|
|
122
|
+
|
|
123
|
+
tf_env.setup_tf_environment()
|
|
124
|
+
tf_env.check_deterministic_ops()
|
|
125
|
+
|
|
126
|
+
# insert current path in syspath so custom modules are found
|
|
127
|
+
sys.path.insert(1, os.getcwd())
|
|
128
|
+
|
|
129
|
+
try:
|
|
130
|
+
if hasattr(cmdline_arguments, "func"):
|
|
131
|
+
is_studio_command = check_if_studio_command()
|
|
132
|
+
|
|
133
|
+
if not is_studio_command:
|
|
134
|
+
result = plugin_manager().hook.configure_commandline(
|
|
135
|
+
cmdline_arguments=cmdline_arguments
|
|
136
|
+
)
|
|
137
|
+
endpoints_file = result[0] if result else None
|
|
138
|
+
|
|
139
|
+
rasa.telemetry.initialize_telemetry()
|
|
140
|
+
rasa.telemetry.initialize_error_reporting()
|
|
141
|
+
if not is_studio_command:
|
|
142
|
+
plugin_manager().hook.init_telemetry(endpoints_file=endpoints_file)
|
|
143
|
+
plugin_manager().hook.init_managers(endpoints_file=endpoints_file)
|
|
144
|
+
plugin_manager().hook.init_anonymization_pipeline(
|
|
145
|
+
endpoints_file=endpoints_file
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
cmdline_arguments.func(cmdline_arguments)
|
|
149
|
+
elif hasattr(cmdline_arguments, "version"):
|
|
150
|
+
print_version()
|
|
151
|
+
else:
|
|
152
|
+
# user has not provided a subcommand, let's print the help
|
|
153
|
+
structlogger.error("cli.no_command", event_info="No command specified.")
|
|
154
|
+
arg_parser.print_help()
|
|
155
|
+
sys.exit(1)
|
|
156
|
+
except RasaException as exc:
|
|
157
|
+
# these are exceptions we expect to happen (e.g. invalid training data format)
|
|
158
|
+
# it doesn't make sense to print a stacktrace for these if we are not in
|
|
159
|
+
# debug mode
|
|
160
|
+
structlogger.debug(
|
|
161
|
+
"cli.exception.details",
|
|
162
|
+
event_info="Failed to run CLI command due to an exception.",
|
|
163
|
+
exc_info=exc,
|
|
164
|
+
)
|
|
165
|
+
structlogger.error("cli.exception.rasa_exception", event_info=f"{exc}")
|
|
166
|
+
sys.exit(1)
|
|
167
|
+
except Exception as exc:
|
|
168
|
+
structlogger.error(
|
|
169
|
+
"cli.exception.general_exception",
|
|
170
|
+
event_info=f"{exc.__class__.__name__}: {exc}",
|
|
171
|
+
exc_info=exc,
|
|
172
|
+
)
|
|
173
|
+
sys.exit(1)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
if __name__ == "__main__":
|
|
177
|
+
main()
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
from typing import List, Optional, Text
|
|
2
|
+
|
|
3
|
+
import pycountry
|
|
4
|
+
from rasa.shared.exceptions import RasaException
|
|
5
|
+
|
|
6
|
+
from rasa.anonymization.anonymization_rule_executor import (
|
|
7
|
+
AnonymizationRule,
|
|
8
|
+
AnonymizationRuleList,
|
|
9
|
+
)
|
|
10
|
+
from rasa.anonymization.utils import (
|
|
11
|
+
read_endpoint_config,
|
|
12
|
+
validate_anonymization_yaml,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
KEY_ANONYMIZATION_RULES = "anonymization"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class AnonymizationRulesYamlReader:
|
|
19
|
+
"""Reads anonymization rules in YAML."""
|
|
20
|
+
|
|
21
|
+
def __init__(self, endpoints_filename: Optional[Text] = None) -> None:
|
|
22
|
+
"""Initializes the reader with the endpoints' filename."""
|
|
23
|
+
self.endpoints_filename = endpoints_filename
|
|
24
|
+
|
|
25
|
+
def read_anonymization_rules(self) -> List[AnonymizationRuleList]:
|
|
26
|
+
"""Reads Anonymization rules from a YAML file.
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
Parsed Anonymization rules.
|
|
30
|
+
"""
|
|
31
|
+
yaml_content = read_endpoint_config(
|
|
32
|
+
self.endpoints_filename, KEY_ANONYMIZATION_RULES
|
|
33
|
+
)
|
|
34
|
+
if yaml_content is None:
|
|
35
|
+
return []
|
|
36
|
+
|
|
37
|
+
validate_anonymization_yaml(yaml_content)
|
|
38
|
+
|
|
39
|
+
anonymization_rules = []
|
|
40
|
+
|
|
41
|
+
for key, value in yaml_content.items():
|
|
42
|
+
if key == KEY_ANONYMIZATION_RULES:
|
|
43
|
+
metadata = value.get("metadata", {})
|
|
44
|
+
rule_lists = value.get("rule_lists", [])
|
|
45
|
+
|
|
46
|
+
lang_code = metadata.get("language")
|
|
47
|
+
self.validate_language(lang_code)
|
|
48
|
+
|
|
49
|
+
model_provider = metadata.get("model_provider")
|
|
50
|
+
model_name = metadata.get("model_name")
|
|
51
|
+
|
|
52
|
+
for rule in rule_lists:
|
|
53
|
+
identifier = rule.get("id")
|
|
54
|
+
rules = rule.get("rules", [])
|
|
55
|
+
rule_list = []
|
|
56
|
+
|
|
57
|
+
for item in rules:
|
|
58
|
+
entity_name = item.get("entity")
|
|
59
|
+
substitution = item.get("substitution", "mask")
|
|
60
|
+
value = item.get("value")
|
|
61
|
+
|
|
62
|
+
rule_obj = AnonymizationRule(
|
|
63
|
+
entity_name=entity_name,
|
|
64
|
+
substitution=substitution,
|
|
65
|
+
value=value,
|
|
66
|
+
)
|
|
67
|
+
rule_list.append(rule_obj)
|
|
68
|
+
anonymization_rule_list_obj = AnonymizationRuleList(
|
|
69
|
+
id=identifier,
|
|
70
|
+
rule_list=rule_list,
|
|
71
|
+
language=lang_code,
|
|
72
|
+
model_provider=model_provider,
|
|
73
|
+
models=model_name,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
anonymization_rules.append(anonymization_rule_list_obj)
|
|
77
|
+
|
|
78
|
+
return anonymization_rules
|
|
79
|
+
|
|
80
|
+
def validate_language(self, lang_code: Text) -> None:
|
|
81
|
+
"""Checks if the language is a valid ISO 639-2 code."""
|
|
82
|
+
language = pycountry.languages.get(alpha_2=lang_code)
|
|
83
|
+
if language is None:
|
|
84
|
+
raise RasaException(
|
|
85
|
+
f"Provided language code '{lang_code}' is invalid. "
|
|
86
|
+
f"In order to proceed with anonymization, "
|
|
87
|
+
f"please provide a valid ISO 639-2 language code in "
|
|
88
|
+
f"the {self.endpoints_filename} file."
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
return None
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import copy
|
|
4
|
+
import json
|
|
5
|
+
import logging
|
|
6
|
+
import queue
|
|
7
|
+
from typing import Any, Dict, List, Optional, Text
|
|
8
|
+
|
|
9
|
+
from apscheduler.schedulers.background import BackgroundScheduler
|
|
10
|
+
from rasa.core.brokers.kafka import KafkaEventBroker
|
|
11
|
+
from rasa.shared.core.events import Event
|
|
12
|
+
from rasa.utils.endpoints import EndpointConfig, read_endpoint_config
|
|
13
|
+
|
|
14
|
+
from rasa.anonymization.anonymisation_rule_yaml_reader import (
|
|
15
|
+
AnonymizationRulesYamlReader,
|
|
16
|
+
)
|
|
17
|
+
from rasa.anonymization.anonymization_rule_executor import AnonymizationRuleList
|
|
18
|
+
from rasa.anonymization.anonymization_rule_orchestrator import (
|
|
19
|
+
AnonymizationRuleOrchestrator,
|
|
20
|
+
)
|
|
21
|
+
from rasa.utils.singleton import Singleton
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class AnonymizationPipeline:
|
|
27
|
+
def run(self, event: Dict[Text, Any]) -> None:
|
|
28
|
+
"""Run the anonymization pipeline on the given event.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
event: The event to anonymize
|
|
32
|
+
"""
|
|
33
|
+
...
|
|
34
|
+
|
|
35
|
+
def log_run(self, data: Any) -> Any:
|
|
36
|
+
"""Anonymize the log data.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
data: log data to anonymize
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
Anonymized log data
|
|
43
|
+
"""
|
|
44
|
+
...
|
|
45
|
+
|
|
46
|
+
def stop(self) -> None:
|
|
47
|
+
"""Stop the anonymization pipeline."""
|
|
48
|
+
...
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class BackgroundAnonymizationPipeline(AnonymizationPipeline):
|
|
52
|
+
EVENT_QUEUE_PROCESSING_TIMEOUT_IN_SECONDS = 2.0
|
|
53
|
+
|
|
54
|
+
def __init__(self, anonymization_pipeline: AnonymizationPipeline):
|
|
55
|
+
self.anonymization_pipeline = anonymization_pipeline
|
|
56
|
+
|
|
57
|
+
# Order of the initialisation is important
|
|
58
|
+
# The event queue must be created before the scheduler
|
|
59
|
+
# The can_consume_event_queue must be set to True before the scheduler starts
|
|
60
|
+
self.event_queue: queue.Queue = queue.Queue()
|
|
61
|
+
|
|
62
|
+
# This flag is used to stop the scheduler
|
|
63
|
+
self.can_consume_from_event_queue = True
|
|
64
|
+
self.event_anonymisation_scheduler = BackgroundScheduler()
|
|
65
|
+
self.event_anonymisation_scheduler.add_job(
|
|
66
|
+
self._consumer_queue, max_instances=1
|
|
67
|
+
)
|
|
68
|
+
self.event_anonymisation_scheduler.start()
|
|
69
|
+
|
|
70
|
+
def stop(self) -> None:
|
|
71
|
+
logger.debug("Shutting down the anonymization pipeline...")
|
|
72
|
+
self.can_consume_from_event_queue = False
|
|
73
|
+
self.event_anonymisation_scheduler.shutdown()
|
|
74
|
+
|
|
75
|
+
def run(self, event: Dict[Text, Any]) -> None:
|
|
76
|
+
self.event_queue.put(event)
|
|
77
|
+
|
|
78
|
+
def log_run(self, data: Any) -> Any:
|
|
79
|
+
return self.anonymization_pipeline.log_run(data)
|
|
80
|
+
|
|
81
|
+
def _consumer_queue(self) -> None:
|
|
82
|
+
while self.can_consume_from_event_queue:
|
|
83
|
+
try:
|
|
84
|
+
# Wait for 2 seconds for an event to be added to the queue
|
|
85
|
+
# If no event is added to the queue, continue
|
|
86
|
+
# This is done to avoid the scheduler to be stuck in the while loop
|
|
87
|
+
# when we want to stop the scheduler
|
|
88
|
+
event = self.event_queue.get(
|
|
89
|
+
timeout=self.EVENT_QUEUE_PROCESSING_TIMEOUT_IN_SECONDS
|
|
90
|
+
)
|
|
91
|
+
self.anonymization_pipeline.run(event)
|
|
92
|
+
self.event_queue.task_done()
|
|
93
|
+
except queue.Empty:
|
|
94
|
+
continue
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class SyncAnonymizationPipeline(AnonymizationPipeline):
|
|
98
|
+
"""Pipeline for anonymizing events."""
|
|
99
|
+
|
|
100
|
+
def __init__(self, orchestrators: List[AnonymizationRuleOrchestrator]) -> None:
|
|
101
|
+
"""Initializes the pipeline."""
|
|
102
|
+
self.orchestrators = orchestrators
|
|
103
|
+
|
|
104
|
+
def stop(self) -> None:
|
|
105
|
+
pass
|
|
106
|
+
|
|
107
|
+
def run(self, event: Dict[Text, Any]) -> None:
|
|
108
|
+
"""Runs the anonymization pipeline."""
|
|
109
|
+
logger.debug("Running the anonymization pipeline for event...")
|
|
110
|
+
|
|
111
|
+
for orchestrator in self.orchestrators:
|
|
112
|
+
anonymized_event = orchestrator.anonymize_event(event)
|
|
113
|
+
is_anonymized = True if event != anonymized_event else False
|
|
114
|
+
orchestrator.publish_event(anonymized_event, is_anonymized)
|
|
115
|
+
|
|
116
|
+
def log_run(self, data: Any) -> Any:
|
|
117
|
+
"""Runs the anonymization pipeline for logging."""
|
|
118
|
+
logger.debug("Running the anonymization pipeline for logs....")
|
|
119
|
+
|
|
120
|
+
anonymized_data = None
|
|
121
|
+
|
|
122
|
+
# this is to make sure that the original data is not modified
|
|
123
|
+
data_copy = copy.deepcopy(data)
|
|
124
|
+
|
|
125
|
+
for orchestrator in self.orchestrators:
|
|
126
|
+
# orchestrator for anonymizing logs has its event broker set to None
|
|
127
|
+
if isinstance(orchestrator.event_broker, KafkaEventBroker):
|
|
128
|
+
continue
|
|
129
|
+
|
|
130
|
+
if isinstance(data_copy, str):
|
|
131
|
+
anonymized_data = orchestrator.anonymize_log_message(data_copy)
|
|
132
|
+
|
|
133
|
+
elif isinstance(data_copy, list):
|
|
134
|
+
anonymized_data = [
|
|
135
|
+
Event.from_parameters(orchestrator.anonymize_event(item.as_dict()))
|
|
136
|
+
if isinstance(item, Event)
|
|
137
|
+
else orchestrator.anonymize_log_message(str(item["value"]))
|
|
138
|
+
if isinstance(item, dict) and item.get("value") is not None
|
|
139
|
+
else item
|
|
140
|
+
for item in data_copy
|
|
141
|
+
]
|
|
142
|
+
|
|
143
|
+
elif isinstance(data_copy, dict) and "event" in data_copy:
|
|
144
|
+
anonymized_data = orchestrator.anonymize_event(data_copy)
|
|
145
|
+
|
|
146
|
+
elif isinstance(data_copy, dict):
|
|
147
|
+
anonymized_data = {}
|
|
148
|
+
|
|
149
|
+
for key, value in data_copy.items():
|
|
150
|
+
try:
|
|
151
|
+
serialized_value = json.dumps(value)
|
|
152
|
+
except TypeError as error:
|
|
153
|
+
logger.error(
|
|
154
|
+
f"Failed to serialize value of type '{type(value)}' "
|
|
155
|
+
f"for key '{key}' before anonymization. "
|
|
156
|
+
f"Encountered error: {error}. "
|
|
157
|
+
f"Setting value to None."
|
|
158
|
+
)
|
|
159
|
+
serialized_value = None
|
|
160
|
+
|
|
161
|
+
anonymized_data[key] = (
|
|
162
|
+
orchestrator.anonymize_log_message(serialized_value)
|
|
163
|
+
if serialized_value is not None
|
|
164
|
+
else None
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
else:
|
|
168
|
+
logger.debug("Unsupported data type for logging anonymization.")
|
|
169
|
+
|
|
170
|
+
if anonymized_data:
|
|
171
|
+
return anonymized_data
|
|
172
|
+
return data
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
class AnonymizationPipelineProvider(metaclass=Singleton):
|
|
176
|
+
"""Represents a provider for anonymization pipeline."""
|
|
177
|
+
|
|
178
|
+
anonymization_pipeline: Optional[AnonymizationPipeline] = None
|
|
179
|
+
|
|
180
|
+
def register_anonymization_pipeline(self, pipeline: AnonymizationPipeline) -> None:
|
|
181
|
+
"""Register an anonymization pipeline.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
pipeline: The anonymization pipeline to register.
|
|
185
|
+
"""
|
|
186
|
+
self.anonymization_pipeline = pipeline
|
|
187
|
+
|
|
188
|
+
def get_anonymization_pipeline(self) -> Optional[AnonymizationPipeline]:
|
|
189
|
+
"""Get the anonymization pipeline.
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
The anonymization pipeline.
|
|
193
|
+
"""
|
|
194
|
+
return self.anonymization_pipeline
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def load_anonymization_pipeline(endpoints_file: Optional[Text]) -> None:
|
|
198
|
+
"""Creates an anonymization pipeline."""
|
|
199
|
+
yaml_reader = AnonymizationRulesYamlReader(endpoints_filename=endpoints_file)
|
|
200
|
+
anonymization_rules = yaml_reader.read_anonymization_rules()
|
|
201
|
+
|
|
202
|
+
if anonymization_rules is None:
|
|
203
|
+
return None
|
|
204
|
+
|
|
205
|
+
event_broker_config = read_endpoint_config(
|
|
206
|
+
endpoints_file, endpoint_type="event_broker"
|
|
207
|
+
)
|
|
208
|
+
logging_config = read_endpoint_config(endpoints_file, endpoint_type="logger")
|
|
209
|
+
|
|
210
|
+
orchestrators = _load_orchestrators(
|
|
211
|
+
logging_config, event_broker_config, anonymization_rules
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
if not orchestrators:
|
|
215
|
+
return None
|
|
216
|
+
|
|
217
|
+
pipeline = SyncAnonymizationPipeline(orchestrators)
|
|
218
|
+
async_anonymization_pipeline = BackgroundAnonymizationPipeline(pipeline)
|
|
219
|
+
provider = AnonymizationPipelineProvider()
|
|
220
|
+
provider.register_anonymization_pipeline(async_anonymization_pipeline)
|
|
221
|
+
|
|
222
|
+
return None
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def create_event_broker(
|
|
226
|
+
topic_name: Text, event_broker_config: EndpointConfig
|
|
227
|
+
) -> Optional[KafkaEventBroker]:
|
|
228
|
+
"""Create a KafkaEventBroker object.
|
|
229
|
+
|
|
230
|
+
Returns None if the event broker config is not of type 'kafka'.
|
|
231
|
+
"""
|
|
232
|
+
if event_broker_config.type != "kafka":
|
|
233
|
+
logger.warning(
|
|
234
|
+
f"Unsupported event broker config provided. "
|
|
235
|
+
f"Expected type 'kafka' but got "
|
|
236
|
+
f"'{event_broker_config.type}'. "
|
|
237
|
+
f"Setting event broker to None."
|
|
238
|
+
)
|
|
239
|
+
event_broker = None
|
|
240
|
+
else:
|
|
241
|
+
logger.debug(f"Setting topic to '{topic_name}'.")
|
|
242
|
+
event_broker_config.kwargs["topic"] = topic_name
|
|
243
|
+
event_broker = KafkaEventBroker(
|
|
244
|
+
event_broker_config.url, **event_broker_config.kwargs
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
return event_broker
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def _load_orchestrators(
|
|
251
|
+
logging_config: EndpointConfig,
|
|
252
|
+
event_broker_config: EndpointConfig,
|
|
253
|
+
anonymization_rules: List[AnonymizationRuleList],
|
|
254
|
+
) -> List[AnonymizationRuleOrchestrator]:
|
|
255
|
+
orchestrators = []
|
|
256
|
+
|
|
257
|
+
if logging_config:
|
|
258
|
+
formatter = logging_config.kwargs.get("formatter", "")
|
|
259
|
+
logging_rule = formatter.get("anonymization_rules")
|
|
260
|
+
|
|
261
|
+
for rule_list in anonymization_rules:
|
|
262
|
+
if rule_list.id == logging_rule:
|
|
263
|
+
orchestrators.append(AnonymizationRuleOrchestrator(None, rule_list))
|
|
264
|
+
|
|
265
|
+
if event_broker_config:
|
|
266
|
+
anonymization_topics = event_broker_config.kwargs.get(
|
|
267
|
+
"anonymization_topics", []
|
|
268
|
+
)
|
|
269
|
+
visited_topics = []
|
|
270
|
+
|
|
271
|
+
for rule_list in anonymization_rules:
|
|
272
|
+
for topic in anonymization_topics:
|
|
273
|
+
topic_name = topic.get("name")
|
|
274
|
+
|
|
275
|
+
if topic_name in visited_topics:
|
|
276
|
+
continue
|
|
277
|
+
|
|
278
|
+
if rule_list.id == topic.get("anonymization_rules"):
|
|
279
|
+
event_broker = create_event_broker(topic_name, event_broker_config)
|
|
280
|
+
|
|
281
|
+
orchestrators.append(
|
|
282
|
+
AnonymizationRuleOrchestrator(event_broker, rule_list)
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
visited_topics.append(topic_name)
|
|
286
|
+
return orchestrators
|