rasa-pro 3.12.0.dev1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- README.md +41 -0
- rasa/__init__.py +9 -0
- rasa/__main__.py +177 -0
- rasa/anonymization/__init__.py +2 -0
- rasa/anonymization/anonymisation_rule_yaml_reader.py +91 -0
- rasa/anonymization/anonymization_pipeline.py +286 -0
- rasa/anonymization/anonymization_rule_executor.py +260 -0
- rasa/anonymization/anonymization_rule_orchestrator.py +120 -0
- rasa/anonymization/schemas/config.yml +47 -0
- rasa/anonymization/utils.py +118 -0
- rasa/api.py +160 -0
- rasa/cli/__init__.py +5 -0
- rasa/cli/arguments/__init__.py +0 -0
- rasa/cli/arguments/data.py +106 -0
- rasa/cli/arguments/default_arguments.py +207 -0
- rasa/cli/arguments/evaluate.py +65 -0
- rasa/cli/arguments/export.py +51 -0
- rasa/cli/arguments/interactive.py +74 -0
- rasa/cli/arguments/run.py +219 -0
- rasa/cli/arguments/shell.py +17 -0
- rasa/cli/arguments/test.py +211 -0
- rasa/cli/arguments/train.py +279 -0
- rasa/cli/arguments/visualize.py +34 -0
- rasa/cli/arguments/x.py +30 -0
- rasa/cli/data.py +354 -0
- rasa/cli/dialogue_understanding_test.py +251 -0
- rasa/cli/e2e_test.py +259 -0
- rasa/cli/evaluate.py +222 -0
- rasa/cli/export.py +250 -0
- rasa/cli/inspect.py +75 -0
- rasa/cli/interactive.py +166 -0
- rasa/cli/license.py +65 -0
- rasa/cli/llm_fine_tuning.py +403 -0
- rasa/cli/markers.py +78 -0
- rasa/cli/project_templates/__init__.py +0 -0
- rasa/cli/project_templates/calm/actions/__init__.py +0 -0
- rasa/cli/project_templates/calm/actions/action_template.py +27 -0
- rasa/cli/project_templates/calm/actions/add_contact.py +30 -0
- rasa/cli/project_templates/calm/actions/db.py +57 -0
- rasa/cli/project_templates/calm/actions/list_contacts.py +22 -0
- rasa/cli/project_templates/calm/actions/remove_contact.py +35 -0
- rasa/cli/project_templates/calm/config.yml +10 -0
- rasa/cli/project_templates/calm/credentials.yml +33 -0
- rasa/cli/project_templates/calm/data/flows/add_contact.yml +31 -0
- rasa/cli/project_templates/calm/data/flows/list_contacts.yml +14 -0
- rasa/cli/project_templates/calm/data/flows/remove_contact.yml +29 -0
- rasa/cli/project_templates/calm/db/contacts.json +10 -0
- rasa/cli/project_templates/calm/domain/add_contact.yml +39 -0
- rasa/cli/project_templates/calm/domain/list_contacts.yml +17 -0
- rasa/cli/project_templates/calm/domain/remove_contact.yml +38 -0
- rasa/cli/project_templates/calm/domain/shared.yml +10 -0
- rasa/cli/project_templates/calm/e2e_tests/cancelations/user_cancels_during_a_correction.yml +16 -0
- rasa/cli/project_templates/calm/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +7 -0
- rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_handle.yml +20 -0
- rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_name.yml +19 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +15 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_lists_contacts.yml +5 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact.yml +11 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact_from_list.yml +12 -0
- rasa/cli/project_templates/calm/endpoints.yml +58 -0
- rasa/cli/project_templates/default/actions/__init__.py +0 -0
- rasa/cli/project_templates/default/actions/actions.py +27 -0
- rasa/cli/project_templates/default/config.yml +44 -0
- rasa/cli/project_templates/default/credentials.yml +33 -0
- rasa/cli/project_templates/default/data/nlu.yml +91 -0
- rasa/cli/project_templates/default/data/rules.yml +13 -0
- rasa/cli/project_templates/default/data/stories.yml +30 -0
- rasa/cli/project_templates/default/domain.yml +34 -0
- rasa/cli/project_templates/default/endpoints.yml +42 -0
- rasa/cli/project_templates/default/tests/test_stories.yml +91 -0
- rasa/cli/project_templates/tutorial/actions/__init__.py +0 -0
- rasa/cli/project_templates/tutorial/actions/actions.py +22 -0
- rasa/cli/project_templates/tutorial/config.yml +12 -0
- rasa/cli/project_templates/tutorial/credentials.yml +33 -0
- rasa/cli/project_templates/tutorial/data/flows.yml +8 -0
- rasa/cli/project_templates/tutorial/data/patterns.yml +11 -0
- rasa/cli/project_templates/tutorial/domain.yml +35 -0
- rasa/cli/project_templates/tutorial/endpoints.yml +55 -0
- rasa/cli/run.py +143 -0
- rasa/cli/scaffold.py +273 -0
- rasa/cli/shell.py +141 -0
- rasa/cli/studio/__init__.py +0 -0
- rasa/cli/studio/download.py +62 -0
- rasa/cli/studio/studio.py +296 -0
- rasa/cli/studio/train.py +59 -0
- rasa/cli/studio/upload.py +62 -0
- rasa/cli/telemetry.py +102 -0
- rasa/cli/test.py +280 -0
- rasa/cli/train.py +278 -0
- rasa/cli/utils.py +484 -0
- rasa/cli/visualize.py +40 -0
- rasa/cli/x.py +206 -0
- rasa/constants.py +45 -0
- rasa/core/__init__.py +17 -0
- rasa/core/actions/__init__.py +0 -0
- rasa/core/actions/action.py +1318 -0
- rasa/core/actions/action_clean_stack.py +59 -0
- rasa/core/actions/action_exceptions.py +24 -0
- rasa/core/actions/action_hangup.py +29 -0
- rasa/core/actions/action_repeat_bot_messages.py +89 -0
- rasa/core/actions/action_run_slot_rejections.py +210 -0
- rasa/core/actions/action_trigger_chitchat.py +31 -0
- rasa/core/actions/action_trigger_flow.py +109 -0
- rasa/core/actions/action_trigger_search.py +31 -0
- rasa/core/actions/constants.py +5 -0
- rasa/core/actions/custom_action_executor.py +191 -0
- rasa/core/actions/direct_custom_actions_executor.py +109 -0
- rasa/core/actions/e2e_stub_custom_action_executor.py +72 -0
- rasa/core/actions/forms.py +741 -0
- rasa/core/actions/grpc_custom_action_executor.py +251 -0
- rasa/core/actions/http_custom_action_executor.py +145 -0
- rasa/core/actions/loops.py +114 -0
- rasa/core/actions/two_stage_fallback.py +186 -0
- rasa/core/agent.py +559 -0
- rasa/core/auth_retry_tracker_store.py +122 -0
- rasa/core/brokers/__init__.py +0 -0
- rasa/core/brokers/broker.py +126 -0
- rasa/core/brokers/file.py +58 -0
- rasa/core/brokers/kafka.py +324 -0
- rasa/core/brokers/pika.py +388 -0
- rasa/core/brokers/sql.py +86 -0
- rasa/core/channels/__init__.py +61 -0
- rasa/core/channels/botframework.py +338 -0
- rasa/core/channels/callback.py +84 -0
- rasa/core/channels/channel.py +456 -0
- rasa/core/channels/console.py +241 -0
- rasa/core/channels/development_inspector.py +197 -0
- rasa/core/channels/facebook.py +419 -0
- rasa/core/channels/hangouts.py +329 -0
- rasa/core/channels/inspector/.eslintrc.cjs +25 -0
- rasa/core/channels/inspector/.gitignore +23 -0
- rasa/core/channels/inspector/README.md +54 -0
- rasa/core/channels/inspector/assets/favicon.ico +0 -0
- rasa/core/channels/inspector/assets/rasa-chat.js +2 -0
- rasa/core/channels/inspector/custom.d.ts +3 -0
- rasa/core/channels/inspector/dist/assets/arc-861ddd57.js +1 -0
- rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
- rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-921f02db.js +10 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-b436c4f8.js +2 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-511a23cb.js +2 -0
- rasa/core/channels/inspector/dist/assets/createText-62fc7601-ef476ecd.js +7 -0
- rasa/core/channels/inspector/dist/assets/edges-f2ad444c-f1878e0a.js +4 -0
- rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-fac75185.js +51 -0
- rasa/core/channels/inspector/dist/assets/flowDb-1972c806-201c5bbc.js +6 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-f904ae41.js +4 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +1 -0
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-1813da66.js +139 -0
- rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-872af172.js +266 -0
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-34a0af5a.js +70 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-128cfa44.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-21dbcb97.woff +0 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-222b5e26.svg +329 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-9ad89b2a.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-42ba3e3d.js +1 -0
- rasa/core/channels/inspector/dist/assets/index-37817b51.js +1317 -0
- rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
- rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-6b731386.js +7 -0
- rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
- rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-e8579ac6.js +139 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-60c05ee4.woff +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-8335d9b8.svg +438 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-9cc39c75.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-ead13ccf.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-16705655.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-5aeb07f9.woff +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9c459044.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9e2898a4.svg +435 -0
- rasa/core/channels/inspector/dist/assets/layout-89e6403a.js +1 -0
- rasa/core/channels/inspector/dist/assets/line-dc73d3fc.js +1 -0
- rasa/core/channels/inspector/dist/assets/linear-f5b1d2bc.js +1 -0
- rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-82cb74fa.js +109 -0
- rasa/core/channels/inspector/dist/assets/ordinal-ba9b4969.js +1 -0
- rasa/core/channels/inspector/dist/assets/path-53f90ab3.js +1 -0
- rasa/core/channels/inspector/dist/assets/pieDiagram-dbbf0591-bdf5f29b.js +35 -0
- rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-c7a0cbe4.js +7 -0
- rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-7ec5410f.js +52 -0
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-caee5554.js +8 -0
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-2935f8db.js +122 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-8f5d9693.js +1 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-d565d1de.js +1 -0
- rasa/core/channels/inspector/dist/assets/styles-080da4f6-75ad421d.js +110 -0
- rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-7e764226.js +159 -0
- rasa/core/channels/inspector/dist/assets/styles-9c745c82-7a4e0e61.js +207 -0
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-4019d1bf.js +1 -0
- rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-01ea12df.js +61 -0
- rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-89407137.js +7 -0
- rasa/core/channels/inspector/dist/index.html +42 -0
- rasa/core/channels/inspector/index.html +40 -0
- rasa/core/channels/inspector/jest.config.ts +13 -0
- rasa/core/channels/inspector/package.json +52 -0
- rasa/core/channels/inspector/setupTests.ts +2 -0
- rasa/core/channels/inspector/src/App.tsx +220 -0
- rasa/core/channels/inspector/src/components/Chat.tsx +95 -0
- rasa/core/channels/inspector/src/components/DiagramFlow.tsx +108 -0
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
- rasa/core/channels/inspector/src/components/DialogueStack.tsx +136 -0
- rasa/core/channels/inspector/src/components/ExpandIcon.tsx +16 -0
- rasa/core/channels/inspector/src/components/FullscreenButton.tsx +45 -0
- rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +22 -0
- rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +21 -0
- rasa/core/channels/inspector/src/components/RasaLogo.tsx +32 -0
- rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +39 -0
- rasa/core/channels/inspector/src/components/Slots.tsx +91 -0
- rasa/core/channels/inspector/src/components/Welcome.tsx +54 -0
- rasa/core/channels/inspector/src/helpers/audiostream.ts +191 -0
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +392 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +306 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +127 -0
- rasa/core/channels/inspector/src/main.tsx +13 -0
- rasa/core/channels/inspector/src/theme/Button/Button.ts +29 -0
- rasa/core/channels/inspector/src/theme/Heading/Heading.ts +31 -0
- rasa/core/channels/inspector/src/theme/Input/Input.ts +27 -0
- rasa/core/channels/inspector/src/theme/Link/Link.ts +10 -0
- rasa/core/channels/inspector/src/theme/Modal/Modal.ts +47 -0
- rasa/core/channels/inspector/src/theme/Table/Table.tsx +38 -0
- rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +12 -0
- rasa/core/channels/inspector/src/theme/base/breakpoints.ts +8 -0
- rasa/core/channels/inspector/src/theme/base/colors.ts +88 -0
- rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +29 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.svg +329 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.svg +438 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.svg +435 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/radii.ts +9 -0
- rasa/core/channels/inspector/src/theme/base/shadows.ts +7 -0
- rasa/core/channels/inspector/src/theme/base/sizes.ts +7 -0
- rasa/core/channels/inspector/src/theme/base/space.ts +15 -0
- rasa/core/channels/inspector/src/theme/base/styles.ts +13 -0
- rasa/core/channels/inspector/src/theme/base/typography.ts +24 -0
- rasa/core/channels/inspector/src/theme/base/zIndices.ts +19 -0
- rasa/core/channels/inspector/src/theme/index.ts +101 -0
- rasa/core/channels/inspector/src/types.ts +84 -0
- rasa/core/channels/inspector/src/vite-env.d.ts +1 -0
- rasa/core/channels/inspector/tests/__mocks__/fileMock.ts +1 -0
- rasa/core/channels/inspector/tests/__mocks__/matchMedia.ts +16 -0
- rasa/core/channels/inspector/tests/__mocks__/styleMock.ts +1 -0
- rasa/core/channels/inspector/tests/renderWithProviders.tsx +14 -0
- rasa/core/channels/inspector/tsconfig.json +26 -0
- rasa/core/channels/inspector/tsconfig.node.json +10 -0
- rasa/core/channels/inspector/vite.config.ts +8 -0
- rasa/core/channels/inspector/yarn.lock +6249 -0
- rasa/core/channels/mattermost.py +229 -0
- rasa/core/channels/rasa_chat.py +126 -0
- rasa/core/channels/rest.py +230 -0
- rasa/core/channels/rocketchat.py +174 -0
- rasa/core/channels/slack.py +620 -0
- rasa/core/channels/socketio.py +302 -0
- rasa/core/channels/telegram.py +298 -0
- rasa/core/channels/twilio.py +169 -0
- rasa/core/channels/vier_cvg.py +374 -0
- rasa/core/channels/voice_ready/__init__.py +0 -0
- rasa/core/channels/voice_ready/audiocodes.py +501 -0
- rasa/core/channels/voice_ready/jambonz.py +121 -0
- rasa/core/channels/voice_ready/jambonz_protocol.py +396 -0
- rasa/core/channels/voice_ready/twilio_voice.py +403 -0
- rasa/core/channels/voice_ready/utils.py +37 -0
- rasa/core/channels/voice_stream/__init__.py +0 -0
- rasa/core/channels/voice_stream/asr/__init__.py +0 -0
- rasa/core/channels/voice_stream/asr/asr_engine.py +89 -0
- rasa/core/channels/voice_stream/asr/asr_event.py +18 -0
- rasa/core/channels/voice_stream/asr/azure.py +130 -0
- rasa/core/channels/voice_stream/asr/deepgram.py +90 -0
- rasa/core/channels/voice_stream/audio_bytes.py +8 -0
- rasa/core/channels/voice_stream/browser_audio.py +107 -0
- rasa/core/channels/voice_stream/call_state.py +23 -0
- rasa/core/channels/voice_stream/tts/__init__.py +0 -0
- rasa/core/channels/voice_stream/tts/azure.py +106 -0
- rasa/core/channels/voice_stream/tts/cartesia.py +118 -0
- rasa/core/channels/voice_stream/tts/tts_cache.py +27 -0
- rasa/core/channels/voice_stream/tts/tts_engine.py +58 -0
- rasa/core/channels/voice_stream/twilio_media_streams.py +173 -0
- rasa/core/channels/voice_stream/util.py +57 -0
- rasa/core/channels/voice_stream/voice_channel.py +427 -0
- rasa/core/channels/webexteams.py +134 -0
- rasa/core/concurrent_lock_store.py +210 -0
- rasa/core/constants.py +112 -0
- rasa/core/evaluation/__init__.py +0 -0
- rasa/core/evaluation/marker.py +267 -0
- rasa/core/evaluation/marker_base.py +923 -0
- rasa/core/evaluation/marker_stats.py +293 -0
- rasa/core/evaluation/marker_tracker_loader.py +103 -0
- rasa/core/exceptions.py +29 -0
- rasa/core/exporter.py +284 -0
- rasa/core/featurizers/__init__.py +0 -0
- rasa/core/featurizers/precomputation.py +410 -0
- rasa/core/featurizers/single_state_featurizer.py +421 -0
- rasa/core/featurizers/tracker_featurizers.py +1262 -0
- rasa/core/http_interpreter.py +89 -0
- rasa/core/information_retrieval/__init__.py +7 -0
- rasa/core/information_retrieval/faiss.py +124 -0
- rasa/core/information_retrieval/information_retrieval.py +137 -0
- rasa/core/information_retrieval/milvus.py +59 -0
- rasa/core/information_retrieval/qdrant.py +96 -0
- rasa/core/jobs.py +63 -0
- rasa/core/lock.py +139 -0
- rasa/core/lock_store.py +343 -0
- rasa/core/migrate.py +403 -0
- rasa/core/nlg/__init__.py +3 -0
- rasa/core/nlg/callback.py +146 -0
- rasa/core/nlg/contextual_response_rephraser.py +320 -0
- rasa/core/nlg/generator.py +230 -0
- rasa/core/nlg/interpolator.py +143 -0
- rasa/core/nlg/response.py +155 -0
- rasa/core/nlg/summarize.py +70 -0
- rasa/core/persistor.py +538 -0
- rasa/core/policies/__init__.py +0 -0
- rasa/core/policies/ensemble.py +329 -0
- rasa/core/policies/enterprise_search_policy.py +905 -0
- rasa/core/policies/enterprise_search_prompt_template.jinja2 +25 -0
- rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +60 -0
- rasa/core/policies/flow_policy.py +205 -0
- rasa/core/policies/flows/__init__.py +0 -0
- rasa/core/policies/flows/flow_exceptions.py +44 -0
- rasa/core/policies/flows/flow_executor.py +754 -0
- rasa/core/policies/flows/flow_step_result.py +43 -0
- rasa/core/policies/intentless_policy.py +1031 -0
- rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
- rasa/core/policies/memoization.py +538 -0
- rasa/core/policies/policy.py +725 -0
- rasa/core/policies/rule_policy.py +1273 -0
- rasa/core/policies/ted_policy.py +2169 -0
- rasa/core/policies/unexpected_intent_policy.py +1022 -0
- rasa/core/processor.py +1465 -0
- rasa/core/run.py +342 -0
- rasa/core/secrets_manager/__init__.py +0 -0
- rasa/core/secrets_manager/constants.py +36 -0
- rasa/core/secrets_manager/endpoints.py +391 -0
- rasa/core/secrets_manager/factory.py +241 -0
- rasa/core/secrets_manager/secret_manager.py +262 -0
- rasa/core/secrets_manager/vault.py +584 -0
- rasa/core/test.py +1335 -0
- rasa/core/tracker_store.py +1703 -0
- rasa/core/train.py +105 -0
- rasa/core/training/__init__.py +89 -0
- rasa/core/training/converters/__init__.py +0 -0
- rasa/core/training/converters/responses_prefix_converter.py +119 -0
- rasa/core/training/interactive.py +1744 -0
- rasa/core/training/story_conflict.py +381 -0
- rasa/core/training/training.py +93 -0
- rasa/core/utils.py +366 -0
- rasa/core/visualize.py +70 -0
- rasa/dialogue_understanding/__init__.py +0 -0
- rasa/dialogue_understanding/coexistence/__init__.py +0 -0
- rasa/dialogue_understanding/coexistence/constants.py +4 -0
- rasa/dialogue_understanding/coexistence/intent_based_router.py +196 -0
- rasa/dialogue_understanding/coexistence/llm_based_router.py +327 -0
- rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
- rasa/dialogue_understanding/commands/__init__.py +61 -0
- rasa/dialogue_understanding/commands/can_not_handle_command.py +70 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +125 -0
- rasa/dialogue_understanding/commands/change_flow_command.py +44 -0
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +57 -0
- rasa/dialogue_understanding/commands/clarify_command.py +86 -0
- rasa/dialogue_understanding/commands/command.py +85 -0
- rasa/dialogue_understanding/commands/correct_slots_command.py +297 -0
- rasa/dialogue_understanding/commands/error_command.py +79 -0
- rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
- rasa/dialogue_understanding/commands/handle_code_change_command.py +73 -0
- rasa/dialogue_understanding/commands/human_handoff_command.py +66 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +57 -0
- rasa/dialogue_understanding/commands/noop_command.py +54 -0
- rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +60 -0
- rasa/dialogue_understanding/commands/restart_command.py +58 -0
- rasa/dialogue_understanding/commands/session_end_command.py +61 -0
- rasa/dialogue_understanding/commands/session_start_command.py +59 -0
- rasa/dialogue_understanding/commands/set_slot_command.py +160 -0
- rasa/dialogue_understanding/commands/skip_question_command.py +75 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +107 -0
- rasa/dialogue_understanding/commands/user_silence_command.py +59 -0
- rasa/dialogue_understanding/commands/utils.py +45 -0
- rasa/dialogue_understanding/generator/__init__.py +21 -0
- rasa/dialogue_understanding/generator/command_generator.py +464 -0
- rasa/dialogue_understanding/generator/constants.py +27 -0
- rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +466 -0
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +500 -0
- rasa/dialogue_understanding/generator/llm_command_generator.py +67 -0
- rasa/dialogue_understanding/generator/multi_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/multi_step/fill_slots_prompt.jinja2 +62 -0
- rasa/dialogue_understanding/generator/multi_step/handle_flows_prompt.jinja2 +38 -0
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +920 -0
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +261 -0
- rasa/dialogue_understanding/generator/single_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2 +60 -0
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +486 -0
- rasa/dialogue_understanding/patterns/__init__.py +0 -0
- rasa/dialogue_understanding/patterns/cancel.py +111 -0
- rasa/dialogue_understanding/patterns/cannot_handle.py +43 -0
- rasa/dialogue_understanding/patterns/chitchat.py +37 -0
- rasa/dialogue_understanding/patterns/clarify.py +97 -0
- rasa/dialogue_understanding/patterns/code_change.py +41 -0
- rasa/dialogue_understanding/patterns/collect_information.py +90 -0
- rasa/dialogue_understanding/patterns/completed.py +40 -0
- rasa/dialogue_understanding/patterns/continue_interrupted.py +42 -0
- rasa/dialogue_understanding/patterns/correction.py +278 -0
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +301 -0
- rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
- rasa/dialogue_understanding/patterns/internal_error.py +47 -0
- rasa/dialogue_understanding/patterns/repeat.py +37 -0
- rasa/dialogue_understanding/patterns/restart.py +37 -0
- rasa/dialogue_understanding/patterns/search.py +37 -0
- rasa/dialogue_understanding/patterns/session_start.py +37 -0
- rasa/dialogue_understanding/patterns/skip_question.py +38 -0
- rasa/dialogue_understanding/patterns/user_silence.py +37 -0
- rasa/dialogue_understanding/processor/__init__.py +0 -0
- rasa/dialogue_understanding/processor/command_processor.py +720 -0
- rasa/dialogue_understanding/processor/command_processor_component.py +43 -0
- rasa/dialogue_understanding/stack/__init__.py +0 -0
- rasa/dialogue_understanding/stack/dialogue_stack.py +178 -0
- rasa/dialogue_understanding/stack/frames/__init__.py +19 -0
- rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +27 -0
- rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +137 -0
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +157 -0
- rasa/dialogue_understanding/stack/frames/pattern_frame.py +10 -0
- rasa/dialogue_understanding/stack/frames/search_frame.py +27 -0
- rasa/dialogue_understanding/stack/utils.py +211 -0
- rasa/dialogue_understanding/utils.py +14 -0
- rasa/dialogue_understanding_test/__init__.py +0 -0
- rasa/dialogue_understanding_test/command_metric_calculation.py +12 -0
- rasa/dialogue_understanding_test/constants.py +17 -0
- rasa/dialogue_understanding_test/du_test_case.py +118 -0
- rasa/dialogue_understanding_test/du_test_result.py +11 -0
- rasa/dialogue_understanding_test/du_test_runner.py +93 -0
- rasa/dialogue_understanding_test/io.py +54 -0
- rasa/dialogue_understanding_test/validation.py +22 -0
- rasa/e2e_test/__init__.py +0 -0
- rasa/e2e_test/aggregate_test_stats_calculator.py +134 -0
- rasa/e2e_test/assertions.py +1345 -0
- rasa/e2e_test/assertions_schema.yml +129 -0
- rasa/e2e_test/constants.py +31 -0
- rasa/e2e_test/e2e_config.py +220 -0
- rasa/e2e_test/e2e_config_schema.yml +26 -0
- rasa/e2e_test/e2e_test_case.py +569 -0
- rasa/e2e_test/e2e_test_converter.py +363 -0
- rasa/e2e_test/e2e_test_converter_prompt.jinja2 +70 -0
- rasa/e2e_test/e2e_test_coverage_report.py +364 -0
- rasa/e2e_test/e2e_test_result.py +54 -0
- rasa/e2e_test/e2e_test_runner.py +1192 -0
- rasa/e2e_test/e2e_test_schema.yml +181 -0
- rasa/e2e_test/pykwalify_extensions.py +39 -0
- rasa/e2e_test/stub_custom_action.py +70 -0
- rasa/e2e_test/utils/__init__.py +0 -0
- rasa/e2e_test/utils/e2e_yaml_utils.py +55 -0
- rasa/e2e_test/utils/io.py +598 -0
- rasa/e2e_test/utils/validation.py +178 -0
- rasa/engine/__init__.py +0 -0
- rasa/engine/caching.py +463 -0
- rasa/engine/constants.py +17 -0
- rasa/engine/exceptions.py +14 -0
- rasa/engine/graph.py +642 -0
- rasa/engine/loader.py +48 -0
- rasa/engine/recipes/__init__.py +0 -0
- rasa/engine/recipes/config_files/default_config.yml +41 -0
- rasa/engine/recipes/default_components.py +97 -0
- rasa/engine/recipes/default_recipe.py +1272 -0
- rasa/engine/recipes/graph_recipe.py +79 -0
- rasa/engine/recipes/recipe.py +93 -0
- rasa/engine/runner/__init__.py +0 -0
- rasa/engine/runner/dask.py +250 -0
- rasa/engine/runner/interface.py +49 -0
- rasa/engine/storage/__init__.py +0 -0
- rasa/engine/storage/local_model_storage.py +244 -0
- rasa/engine/storage/resource.py +110 -0
- rasa/engine/storage/storage.py +199 -0
- rasa/engine/training/__init__.py +0 -0
- rasa/engine/training/components.py +176 -0
- rasa/engine/training/fingerprinting.py +64 -0
- rasa/engine/training/graph_trainer.py +256 -0
- rasa/engine/training/hooks.py +164 -0
- rasa/engine/validation.py +1451 -0
- rasa/env.py +14 -0
- rasa/exceptions.py +69 -0
- rasa/graph_components/__init__.py +0 -0
- rasa/graph_components/converters/__init__.py +0 -0
- rasa/graph_components/converters/nlu_message_converter.py +48 -0
- rasa/graph_components/providers/__init__.py +0 -0
- rasa/graph_components/providers/domain_for_core_training_provider.py +87 -0
- rasa/graph_components/providers/domain_provider.py +71 -0
- rasa/graph_components/providers/flows_provider.py +74 -0
- rasa/graph_components/providers/forms_provider.py +44 -0
- rasa/graph_components/providers/nlu_training_data_provider.py +56 -0
- rasa/graph_components/providers/responses_provider.py +44 -0
- rasa/graph_components/providers/rule_only_provider.py +49 -0
- rasa/graph_components/providers/story_graph_provider.py +96 -0
- rasa/graph_components/providers/training_tracker_provider.py +55 -0
- rasa/graph_components/validators/__init__.py +0 -0
- rasa/graph_components/validators/default_recipe_validator.py +550 -0
- rasa/graph_components/validators/finetuning_validator.py +302 -0
- rasa/hooks.py +111 -0
- rasa/jupyter.py +63 -0
- rasa/llm_fine_tuning/__init__.py +0 -0
- rasa/llm_fine_tuning/annotation_module.py +241 -0
- rasa/llm_fine_tuning/conversations.py +144 -0
- rasa/llm_fine_tuning/llm_data_preparation_module.py +178 -0
- rasa/llm_fine_tuning/paraphrasing/__init__.py +0 -0
- rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +281 -0
- rasa/llm_fine_tuning/paraphrasing/default_rephrase_prompt_template.jina2 +44 -0
- rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +121 -0
- rasa/llm_fine_tuning/paraphrasing/rephrased_user_message.py +10 -0
- rasa/llm_fine_tuning/paraphrasing_module.py +128 -0
- rasa/llm_fine_tuning/storage.py +174 -0
- rasa/llm_fine_tuning/train_test_split_module.py +441 -0
- rasa/markers/__init__.py +0 -0
- rasa/markers/marker.py +269 -0
- rasa/markers/marker_base.py +828 -0
- rasa/markers/upload.py +74 -0
- rasa/markers/validate.py +21 -0
- rasa/model.py +118 -0
- rasa/model_manager/__init__.py +0 -0
- rasa/model_manager/config.py +40 -0
- rasa/model_manager/model_api.py +559 -0
- rasa/model_manager/runner_service.py +286 -0
- rasa/model_manager/socket_bridge.py +146 -0
- rasa/model_manager/studio_jwt_auth.py +86 -0
- rasa/model_manager/trainer_service.py +325 -0
- rasa/model_manager/utils.py +87 -0
- rasa/model_manager/warm_rasa_process.py +187 -0
- rasa/model_service.py +112 -0
- rasa/model_testing.py +457 -0
- rasa/model_training.py +596 -0
- rasa/nlu/__init__.py +7 -0
- rasa/nlu/classifiers/__init__.py +3 -0
- rasa/nlu/classifiers/classifier.py +5 -0
- rasa/nlu/classifiers/diet_classifier.py +1881 -0
- rasa/nlu/classifiers/fallback_classifier.py +192 -0
- rasa/nlu/classifiers/keyword_intent_classifier.py +188 -0
- rasa/nlu/classifiers/logistic_regression_classifier.py +253 -0
- rasa/nlu/classifiers/mitie_intent_classifier.py +156 -0
- rasa/nlu/classifiers/regex_message_handler.py +56 -0
- rasa/nlu/classifiers/sklearn_intent_classifier.py +330 -0
- rasa/nlu/constants.py +77 -0
- rasa/nlu/convert.py +40 -0
- rasa/nlu/emulators/__init__.py +0 -0
- rasa/nlu/emulators/dialogflow.py +55 -0
- rasa/nlu/emulators/emulator.py +49 -0
- rasa/nlu/emulators/luis.py +86 -0
- rasa/nlu/emulators/no_emulator.py +10 -0
- rasa/nlu/emulators/wit.py +56 -0
- rasa/nlu/extractors/__init__.py +0 -0
- rasa/nlu/extractors/crf_entity_extractor.py +715 -0
- rasa/nlu/extractors/duckling_entity_extractor.py +206 -0
- rasa/nlu/extractors/entity_synonyms.py +178 -0
- rasa/nlu/extractors/extractor.py +470 -0
- rasa/nlu/extractors/mitie_entity_extractor.py +293 -0
- rasa/nlu/extractors/regex_entity_extractor.py +220 -0
- rasa/nlu/extractors/spacy_entity_extractor.py +95 -0
- rasa/nlu/featurizers/__init__.py +0 -0
- rasa/nlu/featurizers/dense_featurizer/__init__.py +0 -0
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +445 -0
- rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +768 -0
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +170 -0
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +132 -0
- rasa/nlu/featurizers/featurizer.py +89 -0
- rasa/nlu/featurizers/sparse_featurizer/__init__.py +0 -0
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +867 -0
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +571 -0
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +271 -0
- rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
- rasa/nlu/model.py +24 -0
- rasa/nlu/run.py +27 -0
- rasa/nlu/selectors/__init__.py +0 -0
- rasa/nlu/selectors/response_selector.py +987 -0
- rasa/nlu/test.py +1940 -0
- rasa/nlu/tokenizers/__init__.py +0 -0
- rasa/nlu/tokenizers/jieba_tokenizer.py +148 -0
- rasa/nlu/tokenizers/mitie_tokenizer.py +75 -0
- rasa/nlu/tokenizers/spacy_tokenizer.py +72 -0
- rasa/nlu/tokenizers/tokenizer.py +239 -0
- rasa/nlu/tokenizers/whitespace_tokenizer.py +95 -0
- rasa/nlu/utils/__init__.py +35 -0
- rasa/nlu/utils/bilou_utils.py +462 -0
- rasa/nlu/utils/hugging_face/__init__.py +0 -0
- rasa/nlu/utils/hugging_face/registry.py +108 -0
- rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +311 -0
- rasa/nlu/utils/mitie_utils.py +113 -0
- rasa/nlu/utils/pattern_utils.py +168 -0
- rasa/nlu/utils/spacy_utils.py +310 -0
- rasa/plugin.py +90 -0
- rasa/server.py +1588 -0
- rasa/shared/__init__.py +0 -0
- rasa/shared/constants.py +311 -0
- rasa/shared/core/__init__.py +0 -0
- rasa/shared/core/command_payload_reader.py +109 -0
- rasa/shared/core/constants.py +180 -0
- rasa/shared/core/conversation.py +46 -0
- rasa/shared/core/domain.py +2172 -0
- rasa/shared/core/events.py +2559 -0
- rasa/shared/core/flows/__init__.py +7 -0
- rasa/shared/core/flows/flow.py +562 -0
- rasa/shared/core/flows/flow_path.py +84 -0
- rasa/shared/core/flows/flow_step.py +146 -0
- rasa/shared/core/flows/flow_step_links.py +319 -0
- rasa/shared/core/flows/flow_step_sequence.py +70 -0
- rasa/shared/core/flows/flows_list.py +258 -0
- rasa/shared/core/flows/flows_yaml_schema.json +303 -0
- rasa/shared/core/flows/nlu_trigger.py +117 -0
- rasa/shared/core/flows/steps/__init__.py +24 -0
- rasa/shared/core/flows/steps/action.py +56 -0
- rasa/shared/core/flows/steps/call.py +64 -0
- rasa/shared/core/flows/steps/collect.py +112 -0
- rasa/shared/core/flows/steps/constants.py +5 -0
- rasa/shared/core/flows/steps/continuation.py +36 -0
- rasa/shared/core/flows/steps/end.py +22 -0
- rasa/shared/core/flows/steps/internal.py +44 -0
- rasa/shared/core/flows/steps/link.py +51 -0
- rasa/shared/core/flows/steps/no_operation.py +48 -0
- rasa/shared/core/flows/steps/set_slots.py +50 -0
- rasa/shared/core/flows/steps/start.py +30 -0
- rasa/shared/core/flows/utils.py +39 -0
- rasa/shared/core/flows/validation.py +735 -0
- rasa/shared/core/flows/yaml_flows_io.py +405 -0
- rasa/shared/core/generator.py +908 -0
- rasa/shared/core/slot_mappings.py +526 -0
- rasa/shared/core/slots.py +654 -0
- rasa/shared/core/trackers.py +1183 -0
- rasa/shared/core/training_data/__init__.py +0 -0
- rasa/shared/core/training_data/loading.py +89 -0
- rasa/shared/core/training_data/story_reader/__init__.py +0 -0
- rasa/shared/core/training_data/story_reader/story_reader.py +129 -0
- rasa/shared/core/training_data/story_reader/story_step_builder.py +168 -0
- rasa/shared/core/training_data/story_reader/yaml_story_reader.py +888 -0
- rasa/shared/core/training_data/story_writer/__init__.py +0 -0
- rasa/shared/core/training_data/story_writer/story_writer.py +76 -0
- rasa/shared/core/training_data/story_writer/yaml_story_writer.py +444 -0
- rasa/shared/core/training_data/structures.py +858 -0
- rasa/shared/core/training_data/visualization.html +146 -0
- rasa/shared/core/training_data/visualization.py +603 -0
- rasa/shared/data.py +249 -0
- rasa/shared/engine/__init__.py +0 -0
- rasa/shared/engine/caching.py +26 -0
- rasa/shared/exceptions.py +167 -0
- rasa/shared/importers/__init__.py +0 -0
- rasa/shared/importers/importer.py +770 -0
- rasa/shared/importers/multi_project.py +215 -0
- rasa/shared/importers/rasa.py +108 -0
- rasa/shared/importers/remote_importer.py +196 -0
- rasa/shared/importers/utils.py +36 -0
- rasa/shared/nlu/__init__.py +0 -0
- rasa/shared/nlu/constants.py +53 -0
- rasa/shared/nlu/interpreter.py +10 -0
- rasa/shared/nlu/training_data/__init__.py +0 -0
- rasa/shared/nlu/training_data/entities_parser.py +208 -0
- rasa/shared/nlu/training_data/features.py +492 -0
- rasa/shared/nlu/training_data/formats/__init__.py +10 -0
- rasa/shared/nlu/training_data/formats/dialogflow.py +163 -0
- rasa/shared/nlu/training_data/formats/luis.py +87 -0
- rasa/shared/nlu/training_data/formats/rasa.py +135 -0
- rasa/shared/nlu/training_data/formats/rasa_yaml.py +618 -0
- rasa/shared/nlu/training_data/formats/readerwriter.py +244 -0
- rasa/shared/nlu/training_data/formats/wit.py +52 -0
- rasa/shared/nlu/training_data/loading.py +137 -0
- rasa/shared/nlu/training_data/lookup_tables_parser.py +30 -0
- rasa/shared/nlu/training_data/message.py +490 -0
- rasa/shared/nlu/training_data/schemas/__init__.py +0 -0
- rasa/shared/nlu/training_data/schemas/data_schema.py +85 -0
- rasa/shared/nlu/training_data/schemas/nlu.yml +53 -0
- rasa/shared/nlu/training_data/schemas/responses.yml +70 -0
- rasa/shared/nlu/training_data/synonyms_parser.py +42 -0
- rasa/shared/nlu/training_data/training_data.py +729 -0
- rasa/shared/nlu/training_data/util.py +223 -0
- rasa/shared/providers/__init__.py +0 -0
- rasa/shared/providers/_configs/__init__.py +0 -0
- rasa/shared/providers/_configs/azure_openai_client_config.py +677 -0
- rasa/shared/providers/_configs/client_config.py +59 -0
- rasa/shared/providers/_configs/default_litellm_client_config.py +132 -0
- rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +236 -0
- rasa/shared/providers/_configs/litellm_router_client_config.py +222 -0
- rasa/shared/providers/_configs/model_group_config.py +173 -0
- rasa/shared/providers/_configs/openai_client_config.py +177 -0
- rasa/shared/providers/_configs/rasa_llm_client_config.py +75 -0
- rasa/shared/providers/_configs/self_hosted_llm_client_config.py +178 -0
- rasa/shared/providers/_configs/utils.py +117 -0
- rasa/shared/providers/_ssl_verification_utils.py +124 -0
- rasa/shared/providers/_utils.py +79 -0
- rasa/shared/providers/constants.py +7 -0
- rasa/shared/providers/embedding/__init__.py +0 -0
- rasa/shared/providers/embedding/_base_litellm_embedding_client.py +243 -0
- rasa/shared/providers/embedding/_langchain_embedding_client_adapter.py +74 -0
- rasa/shared/providers/embedding/azure_openai_embedding_client.py +335 -0
- rasa/shared/providers/embedding/default_litellm_embedding_client.py +126 -0
- rasa/shared/providers/embedding/embedding_client.py +90 -0
- rasa/shared/providers/embedding/embedding_response.py +41 -0
- rasa/shared/providers/embedding/huggingface_local_embedding_client.py +191 -0
- rasa/shared/providers/embedding/litellm_router_embedding_client.py +138 -0
- rasa/shared/providers/embedding/openai_embedding_client.py +172 -0
- rasa/shared/providers/llm/__init__.py +0 -0
- rasa/shared/providers/llm/_base_litellm_client.py +265 -0
- rasa/shared/providers/llm/azure_openai_llm_client.py +415 -0
- rasa/shared/providers/llm/default_litellm_llm_client.py +110 -0
- rasa/shared/providers/llm/litellm_router_llm_client.py +202 -0
- rasa/shared/providers/llm/llm_client.py +78 -0
- rasa/shared/providers/llm/llm_response.py +50 -0
- rasa/shared/providers/llm/openai_llm_client.py +161 -0
- rasa/shared/providers/llm/rasa_llm_client.py +120 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +276 -0
- rasa/shared/providers/mappings.py +94 -0
- rasa/shared/providers/router/__init__.py +0 -0
- rasa/shared/providers/router/_base_litellm_router_client.py +185 -0
- rasa/shared/providers/router/router_client.py +75 -0
- rasa/shared/utils/__init__.py +0 -0
- rasa/shared/utils/cli.py +102 -0
- rasa/shared/utils/common.py +324 -0
- rasa/shared/utils/constants.py +4 -0
- rasa/shared/utils/health_check/__init__.py +0 -0
- rasa/shared/utils/health_check/embeddings_health_check_mixin.py +31 -0
- rasa/shared/utils/health_check/health_check.py +258 -0
- rasa/shared/utils/health_check/llm_health_check_mixin.py +31 -0
- rasa/shared/utils/io.py +499 -0
- rasa/shared/utils/llm.py +764 -0
- rasa/shared/utils/pykwalify_extensions.py +27 -0
- rasa/shared/utils/schemas/__init__.py +0 -0
- rasa/shared/utils/schemas/config.yml +2 -0
- rasa/shared/utils/schemas/domain.yml +145 -0
- rasa/shared/utils/schemas/events.py +214 -0
- rasa/shared/utils/schemas/model_config.yml +36 -0
- rasa/shared/utils/schemas/stories.yml +173 -0
- rasa/shared/utils/yaml.py +1068 -0
- rasa/studio/__init__.py +0 -0
- rasa/studio/auth.py +270 -0
- rasa/studio/config.py +136 -0
- rasa/studio/constants.py +19 -0
- rasa/studio/data_handler.py +368 -0
- rasa/studio/download.py +489 -0
- rasa/studio/results_logger.py +137 -0
- rasa/studio/train.py +134 -0
- rasa/studio/upload.py +563 -0
- rasa/telemetry.py +1876 -0
- rasa/tracing/__init__.py +0 -0
- rasa/tracing/config.py +355 -0
- rasa/tracing/constants.py +62 -0
- rasa/tracing/instrumentation/__init__.py +0 -0
- rasa/tracing/instrumentation/attribute_extractors.py +765 -0
- rasa/tracing/instrumentation/instrumentation.py +1306 -0
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +144 -0
- rasa/tracing/instrumentation/metrics.py +294 -0
- rasa/tracing/metric_instrument_provider.py +205 -0
- rasa/utils/__init__.py +0 -0
- rasa/utils/beta.py +83 -0
- rasa/utils/cli.py +28 -0
- rasa/utils/common.py +639 -0
- rasa/utils/converter.py +53 -0
- rasa/utils/endpoints.py +331 -0
- rasa/utils/io.py +252 -0
- rasa/utils/json_utils.py +60 -0
- rasa/utils/licensing.py +542 -0
- rasa/utils/log_utils.py +181 -0
- rasa/utils/mapper.py +210 -0
- rasa/utils/ml_utils.py +147 -0
- rasa/utils/plotting.py +362 -0
- rasa/utils/sanic_error_handler.py +32 -0
- rasa/utils/singleton.py +23 -0
- rasa/utils/tensorflow/__init__.py +0 -0
- rasa/utils/tensorflow/callback.py +112 -0
- rasa/utils/tensorflow/constants.py +116 -0
- rasa/utils/tensorflow/crf.py +492 -0
- rasa/utils/tensorflow/data_generator.py +440 -0
- rasa/utils/tensorflow/environment.py +161 -0
- rasa/utils/tensorflow/exceptions.py +5 -0
- rasa/utils/tensorflow/feature_array.py +366 -0
- rasa/utils/tensorflow/layers.py +1565 -0
- rasa/utils/tensorflow/layers_utils.py +113 -0
- rasa/utils/tensorflow/metrics.py +281 -0
- rasa/utils/tensorflow/model_data.py +798 -0
- rasa/utils/tensorflow/model_data_utils.py +499 -0
- rasa/utils/tensorflow/models.py +935 -0
- rasa/utils/tensorflow/rasa_layers.py +1094 -0
- rasa/utils/tensorflow/transformer.py +640 -0
- rasa/utils/tensorflow/types.py +6 -0
- rasa/utils/train_utils.py +572 -0
- rasa/utils/url_tools.py +53 -0
- rasa/utils/yaml.py +54 -0
- rasa/validator.py +1644 -0
- rasa/version.py +3 -0
- rasa_pro-3.12.0.dev1.dist-info/METADATA +199 -0
- rasa_pro-3.12.0.dev1.dist-info/NOTICE +5 -0
- rasa_pro-3.12.0.dev1.dist-info/RECORD +790 -0
- rasa_pro-3.12.0.dev1.dist-info/WHEEL +4 -0
- rasa_pro-3.12.0.dev1.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
import math
|
|
2
|
+
from typing import List, Union, Text, Optional, Any, Tuple, Dict, cast
|
|
3
|
+
|
|
4
|
+
import logging
|
|
5
|
+
import scipy.sparse
|
|
6
|
+
import numpy as np
|
|
7
|
+
from tensorflow.keras.utils import Sequence
|
|
8
|
+
|
|
9
|
+
from rasa.utils.tensorflow.constants import SEQUENCE, BALANCED
|
|
10
|
+
from rasa.utils.tensorflow.model_data import RasaModelData, Data, FeatureArray
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class RasaDataGenerator(Sequence):
|
|
16
|
+
"""Abstract data generator."""
|
|
17
|
+
|
|
18
|
+
def __init__(
|
|
19
|
+
self,
|
|
20
|
+
model_data: RasaModelData,
|
|
21
|
+
batch_size: Union[int, List[int]],
|
|
22
|
+
batch_strategy: Text = SEQUENCE,
|
|
23
|
+
shuffle: bool = True,
|
|
24
|
+
):
|
|
25
|
+
"""Initializes the data generator.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
model_data: The model data to use.
|
|
29
|
+
batch_size: The batch size(s).
|
|
30
|
+
batch_strategy: The batch strategy.
|
|
31
|
+
shuffle: If 'True', data should be shuffled.
|
|
32
|
+
"""
|
|
33
|
+
self.model_data = model_data
|
|
34
|
+
self.batch_size = batch_size
|
|
35
|
+
self.shuffle = shuffle
|
|
36
|
+
self.batch_strategy = batch_strategy
|
|
37
|
+
|
|
38
|
+
def __len__(self) -> int:
|
|
39
|
+
"""Number of batches in the Sequence.
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
The number of batches in the Sequence.
|
|
43
|
+
"""
|
|
44
|
+
raise NotImplementedError
|
|
45
|
+
|
|
46
|
+
def __getitem__(self, index: int) -> Tuple[Any, Any]:
|
|
47
|
+
"""Gets batch at position `index`.
|
|
48
|
+
|
|
49
|
+
Arguments:
|
|
50
|
+
index: position of the batch in the Sequence.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
A batch (tuple of input data and target data).
|
|
54
|
+
"""
|
|
55
|
+
raise NotImplementedError
|
|
56
|
+
|
|
57
|
+
def on_epoch_end(self) -> None:
|
|
58
|
+
"""Update the data after every epoch."""
|
|
59
|
+
raise NotImplementedError
|
|
60
|
+
|
|
61
|
+
def _shuffle_and_balance(self, batch_size: int) -> Data:
|
|
62
|
+
data = self.model_data.data
|
|
63
|
+
|
|
64
|
+
if self.shuffle:
|
|
65
|
+
data = self.model_data.shuffled_data(data)
|
|
66
|
+
|
|
67
|
+
if self.batch_strategy == BALANCED:
|
|
68
|
+
data = self.model_data.balanced_data(data, batch_size, self.shuffle)
|
|
69
|
+
|
|
70
|
+
# do not override self.model_data.data, because we need original data for
|
|
71
|
+
# balancing on the next epoch
|
|
72
|
+
return data
|
|
73
|
+
|
|
74
|
+
@staticmethod
|
|
75
|
+
def prepare_batch(
|
|
76
|
+
data: Data,
|
|
77
|
+
start: Optional[int] = None,
|
|
78
|
+
end: Optional[int] = None,
|
|
79
|
+
tuple_sizes: Optional[Dict[Text, int]] = None,
|
|
80
|
+
) -> Tuple[Optional[np.ndarray], ...]:
|
|
81
|
+
"""Slices model data into batch using given start and end value.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
data: The data to prepare.
|
|
85
|
+
start: The start index of the batch
|
|
86
|
+
end: The end index of the batch
|
|
87
|
+
tuple_sizes: In case the feature is not present we propagate the batch with
|
|
88
|
+
None. Tuple sizes contains the number of how many None values to add for
|
|
89
|
+
what kind of feature.
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
The features of the batch.
|
|
93
|
+
"""
|
|
94
|
+
batch_data = []
|
|
95
|
+
|
|
96
|
+
for key, attribute_data in data.items():
|
|
97
|
+
for sub_key, f_data in attribute_data.items():
|
|
98
|
+
# add None for not present values during processing
|
|
99
|
+
if not f_data:
|
|
100
|
+
if tuple_sizes:
|
|
101
|
+
batch_data += [None] * tuple_sizes[key]
|
|
102
|
+
else:
|
|
103
|
+
batch_data.append(None)
|
|
104
|
+
continue
|
|
105
|
+
|
|
106
|
+
for v in f_data:
|
|
107
|
+
if start is not None and end is not None:
|
|
108
|
+
_data = v[start:end]
|
|
109
|
+
elif start is not None:
|
|
110
|
+
_data = v[start:]
|
|
111
|
+
elif end is not None:
|
|
112
|
+
_data = v[:end]
|
|
113
|
+
else:
|
|
114
|
+
_data = v[:]
|
|
115
|
+
|
|
116
|
+
if cast(FeatureArray, _data).is_sparse:
|
|
117
|
+
batch_data.extend(
|
|
118
|
+
RasaDataGenerator._scipy_matrix_to_values(_data)
|
|
119
|
+
)
|
|
120
|
+
else:
|
|
121
|
+
batch_data.append(RasaDataGenerator._pad_dense_data(_data))
|
|
122
|
+
|
|
123
|
+
# len of batch_data is equal to the number of keys in model data
|
|
124
|
+
return tuple(batch_data)
|
|
125
|
+
|
|
126
|
+
@staticmethod
|
|
127
|
+
def _pad_dense_data(array_of_dense: FeatureArray) -> np.ndarray:
|
|
128
|
+
"""Pad data of different lengths.
|
|
129
|
+
|
|
130
|
+
Sequential data is padded with zeros. Zeros are added to the end of data.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
array_of_dense: The array to pad.
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
The padded array.
|
|
137
|
+
"""
|
|
138
|
+
if array_of_dense.number_of_dimensions == 4:
|
|
139
|
+
return RasaDataGenerator._pad_4d_dense_data(array_of_dense)
|
|
140
|
+
|
|
141
|
+
if array_of_dense[0].ndim < 2:
|
|
142
|
+
# data doesn't contain a sequence
|
|
143
|
+
return array_of_dense.astype(np.float32)
|
|
144
|
+
|
|
145
|
+
data_size = len(array_of_dense)
|
|
146
|
+
max_seq_len = max([x.shape[0] for x in array_of_dense])
|
|
147
|
+
|
|
148
|
+
data_padded = np.zeros(
|
|
149
|
+
[data_size, max_seq_len, array_of_dense[0].shape[-1]],
|
|
150
|
+
dtype=array_of_dense[0].dtype,
|
|
151
|
+
)
|
|
152
|
+
for i in range(data_size):
|
|
153
|
+
data_padded[i, : array_of_dense[i].shape[0], :] = array_of_dense[i]
|
|
154
|
+
|
|
155
|
+
return data_padded.astype(np.float32)
|
|
156
|
+
|
|
157
|
+
@staticmethod
|
|
158
|
+
def _pad_4d_dense_data(feature_array: FeatureArray) -> np.ndarray:
|
|
159
|
+
# in case of dialogue data we may have 4 dimensions
|
|
160
|
+
# batch size x dialogue history length x sequence length x number of features
|
|
161
|
+
|
|
162
|
+
# as transformers cannot handle 4D tensors pad and reshape the data
|
|
163
|
+
# so that the resulting tensor is 3D
|
|
164
|
+
# the shape is (sum of dialogue history length for all tensors in the
|
|
165
|
+
# batch x max sequence length x number of features)
|
|
166
|
+
# the original shape and the original dialogue length is passed on to the model
|
|
167
|
+
# it can be used to transform the 3D tensor back into 4D
|
|
168
|
+
|
|
169
|
+
# in order to create 4d tensor inputs, we created "fake" zero features
|
|
170
|
+
# for nonexistent inputs. To save calculation we filter this features before
|
|
171
|
+
# input to tf methods.
|
|
172
|
+
number_of_features = feature_array[0][0].shape[-1]
|
|
173
|
+
array_of_array_of_dense = RasaDataGenerator._filter_out_fake_inputs(
|
|
174
|
+
feature_array
|
|
175
|
+
)
|
|
176
|
+
if not array_of_array_of_dense:
|
|
177
|
+
# return empty 3d array with appropriate last dims
|
|
178
|
+
return np.zeros((0, 0, number_of_features), dtype=np.float32)
|
|
179
|
+
|
|
180
|
+
combined_dialogue_len = sum(
|
|
181
|
+
len(array_of_dense) for array_of_dense in array_of_array_of_dense
|
|
182
|
+
)
|
|
183
|
+
max_seq_len = max(
|
|
184
|
+
[
|
|
185
|
+
x.shape[0]
|
|
186
|
+
for array_of_dense in array_of_array_of_dense
|
|
187
|
+
for x in array_of_dense
|
|
188
|
+
]
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
data_padded = np.zeros(
|
|
192
|
+
[combined_dialogue_len, max_seq_len, number_of_features],
|
|
193
|
+
dtype=array_of_array_of_dense[0][0].dtype,
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
current_sum_dialogue_len = 0
|
|
197
|
+
for i, array_of_dense in enumerate(array_of_array_of_dense):
|
|
198
|
+
for j, dense in enumerate(array_of_dense):
|
|
199
|
+
data_padded[current_sum_dialogue_len + j, : dense.shape[0], :] = dense
|
|
200
|
+
current_sum_dialogue_len += len(array_of_dense)
|
|
201
|
+
|
|
202
|
+
return data_padded.astype(np.float32)
|
|
203
|
+
|
|
204
|
+
@staticmethod
|
|
205
|
+
def _scipy_matrix_to_values(array_of_sparse: FeatureArray) -> List[np.ndarray]:
|
|
206
|
+
"""Convert a scipy matrix into indices, data, and shape.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
array_of_sparse: The sparse data array.
|
|
210
|
+
|
|
211
|
+
Returns:
|
|
212
|
+
A list of dense numpy arrays representing the sparse data.
|
|
213
|
+
"""
|
|
214
|
+
if array_of_sparse.number_of_dimensions == 4:
|
|
215
|
+
return RasaDataGenerator._4d_scipy_matrix_to_values(array_of_sparse)
|
|
216
|
+
|
|
217
|
+
# we need to make sure that the matrices are coo_matrices otherwise the
|
|
218
|
+
# transformation does not work (e.g. you cannot access x.row, x.col)
|
|
219
|
+
if not isinstance(array_of_sparse[0], scipy.sparse.coo_matrix):
|
|
220
|
+
array_of_sparse = [x.tocoo() for x in array_of_sparse] # type: ignore[assignment]
|
|
221
|
+
|
|
222
|
+
max_seq_len = max([x.shape[0] for x in array_of_sparse])
|
|
223
|
+
|
|
224
|
+
# get the indices of values
|
|
225
|
+
indices = np.hstack(
|
|
226
|
+
[
|
|
227
|
+
np.vstack([i * np.ones_like(x.row), x.row, x.col])
|
|
228
|
+
for i, x in enumerate(array_of_sparse)
|
|
229
|
+
]
|
|
230
|
+
).T
|
|
231
|
+
|
|
232
|
+
data = np.hstack([x.data for x in array_of_sparse])
|
|
233
|
+
|
|
234
|
+
number_of_features = array_of_sparse[0].shape[-1]
|
|
235
|
+
shape = np.array((len(array_of_sparse), max_seq_len, number_of_features))
|
|
236
|
+
|
|
237
|
+
return [
|
|
238
|
+
indices.astype(np.int64),
|
|
239
|
+
data.astype(np.float32),
|
|
240
|
+
shape.astype(np.int64),
|
|
241
|
+
]
|
|
242
|
+
|
|
243
|
+
@staticmethod
|
|
244
|
+
def _4d_scipy_matrix_to_values(feature_array: FeatureArray) -> List[np.ndarray]:
|
|
245
|
+
# in case of dialogue data we may have 4 dimensions
|
|
246
|
+
# batch size x dialogue history length x sequence length x number of features
|
|
247
|
+
|
|
248
|
+
# transformers cannot handle 4D tensors, therefore pad and reshape the data
|
|
249
|
+
# so that the resulting tensor is 3D
|
|
250
|
+
# the shape is (sum of dialogue history length for all tensors in the
|
|
251
|
+
# batch x max sequence length x number of features)
|
|
252
|
+
# the original shape and the original dialogue length is passed on to the model
|
|
253
|
+
# it can be used to transform the 3D tensor back into 4D
|
|
254
|
+
|
|
255
|
+
# in order to create 4d tensor inputs, we created "fake" zero features
|
|
256
|
+
# for nonexistent inputs. To save calculation we filter this features before
|
|
257
|
+
# input to tf methods.
|
|
258
|
+
number_of_features = feature_array[0][0].shape[-1]
|
|
259
|
+
array_of_array_of_sparse = RasaDataGenerator._filter_out_fake_inputs(
|
|
260
|
+
feature_array
|
|
261
|
+
)
|
|
262
|
+
if not array_of_array_of_sparse:
|
|
263
|
+
# create empty array with appropriate last dims
|
|
264
|
+
return [
|
|
265
|
+
np.empty((0, 3), dtype=np.int64),
|
|
266
|
+
np.array([], dtype=np.float32),
|
|
267
|
+
np.array([0, 0, number_of_features], dtype=np.int64),
|
|
268
|
+
]
|
|
269
|
+
|
|
270
|
+
# we need to make sure that the matrices are coo_matrices otherwise the
|
|
271
|
+
# transformation does not work (e.g. you cannot access x.row, x.col)
|
|
272
|
+
if not isinstance(array_of_array_of_sparse[0][0], scipy.sparse.coo_matrix):
|
|
273
|
+
array_of_array_of_sparse = [
|
|
274
|
+
[
|
|
275
|
+
x.tocoo() if isinstance(x, scipy.sparse.spmatrix) else x
|
|
276
|
+
for x in array_of_sparse
|
|
277
|
+
]
|
|
278
|
+
for array_of_sparse in array_of_array_of_sparse
|
|
279
|
+
]
|
|
280
|
+
|
|
281
|
+
dialogue_len = [
|
|
282
|
+
len(array_of_sparse) for array_of_sparse in array_of_array_of_sparse
|
|
283
|
+
]
|
|
284
|
+
combined_dialogue_len = sum(dialogue_len)
|
|
285
|
+
max_seq_len = max(
|
|
286
|
+
[
|
|
287
|
+
x.shape[0]
|
|
288
|
+
for array_of_sparse in array_of_array_of_sparse
|
|
289
|
+
for x in array_of_sparse
|
|
290
|
+
]
|
|
291
|
+
)
|
|
292
|
+
# get the indices of values
|
|
293
|
+
indices = np.hstack(
|
|
294
|
+
[
|
|
295
|
+
np.vstack(
|
|
296
|
+
[sum(dialogue_len[:i]) + j * np.ones_like(x.row), x.row, x.col]
|
|
297
|
+
)
|
|
298
|
+
for i, array_of_sparse in enumerate(array_of_array_of_sparse)
|
|
299
|
+
for j, x in enumerate(array_of_sparse)
|
|
300
|
+
]
|
|
301
|
+
).T
|
|
302
|
+
|
|
303
|
+
data = np.hstack(
|
|
304
|
+
[
|
|
305
|
+
x.data
|
|
306
|
+
for array_of_sparse in array_of_array_of_sparse
|
|
307
|
+
for x in array_of_sparse
|
|
308
|
+
]
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
shape = np.array((combined_dialogue_len, max_seq_len, number_of_features))
|
|
312
|
+
|
|
313
|
+
return [
|
|
314
|
+
indices.astype(np.int64),
|
|
315
|
+
data.astype(np.float32),
|
|
316
|
+
shape.astype(np.int64),
|
|
317
|
+
]
|
|
318
|
+
|
|
319
|
+
@staticmethod
|
|
320
|
+
def _filter_out_fake_inputs(
|
|
321
|
+
array_of_array_of_features: FeatureArray,
|
|
322
|
+
) -> Union[List[List[np.ndarray]], List[List[scipy.sparse.spmatrix]]]:
|
|
323
|
+
return list(
|
|
324
|
+
filter(
|
|
325
|
+
# filter empty lists created by another filter
|
|
326
|
+
lambda x: len(x) > 0,
|
|
327
|
+
[
|
|
328
|
+
# filter all the "fake" inputs, we know the input is "fake",
|
|
329
|
+
# when sequence dimension is `0`
|
|
330
|
+
list(filter(lambda x: x.shape[0] > 0, array_of_features))
|
|
331
|
+
for array_of_features in array_of_array_of_features
|
|
332
|
+
],
|
|
333
|
+
)
|
|
334
|
+
)
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
class RasaBatchDataGenerator(RasaDataGenerator):
|
|
338
|
+
"""Data generator with an optional increasing batch size."""
|
|
339
|
+
|
|
340
|
+
def __init__(
|
|
341
|
+
self,
|
|
342
|
+
model_data: RasaModelData,
|
|
343
|
+
batch_size: Union[List[int], int],
|
|
344
|
+
epochs: int = 1,
|
|
345
|
+
batch_strategy: Text = SEQUENCE,
|
|
346
|
+
shuffle: bool = True,
|
|
347
|
+
drop_small_last_batch: bool = False,
|
|
348
|
+
):
|
|
349
|
+
"""Initializes the increasing batch size data generator.
|
|
350
|
+
|
|
351
|
+
Args:
|
|
352
|
+
model_data: The model data to use.
|
|
353
|
+
batch_size: The batch size.
|
|
354
|
+
epochs: The total number of epochs.
|
|
355
|
+
batch_strategy: The batch strategy.
|
|
356
|
+
shuffle: If 'True', data will be shuffled.
|
|
357
|
+
drop_small_last_batch: if 'True', the last batch in an epoch will be dropped
|
|
358
|
+
if it has less examples than half the batch size
|
|
359
|
+
"""
|
|
360
|
+
super().__init__(model_data, batch_size, batch_strategy, shuffle)
|
|
361
|
+
|
|
362
|
+
if isinstance(batch_size, list):
|
|
363
|
+
logger.debug(
|
|
364
|
+
"The provided batch size is a list, this data generator will use a "
|
|
365
|
+
"linear increasing batch size."
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
self._epochs = epochs
|
|
369
|
+
# we use `on_epoch_end` method to prepare data for the next epoch
|
|
370
|
+
# set current epoch to `-1`, so that `on_epoch_end` will increase it to `0`
|
|
371
|
+
self._current_epoch = -1
|
|
372
|
+
# actual batch size will be set inside `on_epoch_end`
|
|
373
|
+
self._current_batch_size = 0
|
|
374
|
+
# create separate data variable that will store modified data for each batch
|
|
375
|
+
self._data: Data = {}
|
|
376
|
+
self.drop_small_last_batch = drop_small_last_batch
|
|
377
|
+
self.on_epoch_end()
|
|
378
|
+
|
|
379
|
+
def __len__(self) -> int:
|
|
380
|
+
"""Number of batches in the Sequence.
|
|
381
|
+
|
|
382
|
+
Returns:
|
|
383
|
+
The number of batches in the Sequence.
|
|
384
|
+
"""
|
|
385
|
+
# data was rebalanced, so need to recalculate number of examples
|
|
386
|
+
num_examples = self.model_data.number_of_examples(self._data)
|
|
387
|
+
batch_size = self._current_batch_size
|
|
388
|
+
if self.drop_small_last_batch:
|
|
389
|
+
# keep last batch only if it has at least half a batch size of examples
|
|
390
|
+
last_batch_half_full = num_examples % batch_size >= math.ceil(
|
|
391
|
+
batch_size / 2
|
|
392
|
+
)
|
|
393
|
+
num_batches = num_examples // batch_size + int(last_batch_half_full)
|
|
394
|
+
# Return at least 1 if there is an example
|
|
395
|
+
return max(num_batches, int(num_examples > 0))
|
|
396
|
+
else:
|
|
397
|
+
return num_examples // batch_size + int(num_examples % batch_size > 0)
|
|
398
|
+
|
|
399
|
+
def __getitem__(self, index: int) -> Tuple[Any, Any]:
|
|
400
|
+
"""Gets batch at position `index`.
|
|
401
|
+
|
|
402
|
+
Arguments:
|
|
403
|
+
index: position of the batch in the Sequence.
|
|
404
|
+
|
|
405
|
+
Returns:
|
|
406
|
+
A batch (tuple of input data and target data).
|
|
407
|
+
"""
|
|
408
|
+
start = index * self._current_batch_size
|
|
409
|
+
end = start + self._current_batch_size
|
|
410
|
+
|
|
411
|
+
# return input and target data, as our target data is inside the input
|
|
412
|
+
# data return None for the target data
|
|
413
|
+
return self.prepare_batch(self._data, start, end), None
|
|
414
|
+
|
|
415
|
+
def on_epoch_end(self) -> None:
|
|
416
|
+
"""Update the data after every epoch."""
|
|
417
|
+
self._current_epoch += 1
|
|
418
|
+
self._current_batch_size = self._linearly_increasing_batch_size()
|
|
419
|
+
self._data = self._shuffle_and_balance(self._current_batch_size)
|
|
420
|
+
|
|
421
|
+
def _linearly_increasing_batch_size(self) -> int:
|
|
422
|
+
"""Linearly increase batch size with every epoch.
|
|
423
|
+
|
|
424
|
+
The idea comes from https://arxiv.org/abs/1711.00489.
|
|
425
|
+
|
|
426
|
+
Returns:
|
|
427
|
+
The batch size to use in this epoch.
|
|
428
|
+
"""
|
|
429
|
+
if not isinstance(self.batch_size, list):
|
|
430
|
+
return int(self.batch_size)
|
|
431
|
+
|
|
432
|
+
if self._epochs > 1:
|
|
433
|
+
return int(
|
|
434
|
+
self.batch_size[0]
|
|
435
|
+
+ self._current_epoch
|
|
436
|
+
* (self.batch_size[1] - self.batch_size[0])
|
|
437
|
+
/ (self._epochs - 1)
|
|
438
|
+
)
|
|
439
|
+
else:
|
|
440
|
+
return int(self.batch_size[0])
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
from typing import Text, Dict
|
|
4
|
+
import typing
|
|
5
|
+
|
|
6
|
+
import rasa.shared.utils.io
|
|
7
|
+
from rasa.constants import (
|
|
8
|
+
ENV_GPU_CONFIG,
|
|
9
|
+
ENV_CPU_INTER_OP_CONFIG,
|
|
10
|
+
ENV_CPU_INTRA_OP_CONFIG,
|
|
11
|
+
)
|
|
12
|
+
from rasa.utils.tensorflow.constants import TF_DETERMINISTIC_OPS
|
|
13
|
+
from rasa.shared.utils import io as shared_io_utils
|
|
14
|
+
|
|
15
|
+
if typing.TYPE_CHECKING:
|
|
16
|
+
from tensorflow import config as tf_config
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _setup_gpu_environment() -> None:
|
|
22
|
+
"""Sets configuration for TensorFlow GPU environment based on env variable."""
|
|
23
|
+
gpu_memory_config = os.getenv(ENV_GPU_CONFIG)
|
|
24
|
+
|
|
25
|
+
if not gpu_memory_config:
|
|
26
|
+
return
|
|
27
|
+
|
|
28
|
+
# Import from tensorflow only if necessary (environment variable was set)
|
|
29
|
+
from tensorflow import config as tf_config
|
|
30
|
+
|
|
31
|
+
parsed_gpu_config = _parse_gpu_config(gpu_memory_config)
|
|
32
|
+
physical_gpus = tf_config.list_physical_devices("GPU")
|
|
33
|
+
|
|
34
|
+
# Logic taken from https://www.tensorflow.org/guide/gpu
|
|
35
|
+
if physical_gpus:
|
|
36
|
+
for gpu_id, gpu_id_memory in parsed_gpu_config.items():
|
|
37
|
+
_allocate_gpu_memory(physical_gpus[gpu_id], gpu_id_memory)
|
|
38
|
+
|
|
39
|
+
else:
|
|
40
|
+
rasa.shared.utils.io.raise_warning(
|
|
41
|
+
f"You have an environment variable '{ENV_GPU_CONFIG}' set but no GPUs were "
|
|
42
|
+
f"detected to configure."
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _allocate_gpu_memory(
|
|
47
|
+
gpu_instance: "tf_config.PhysicalDevice", logical_memory: int
|
|
48
|
+
) -> None:
|
|
49
|
+
"""Create a new logical device for the requested amount of memory.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
gpu_instance: PhysicalDevice instance of a GPU device.
|
|
53
|
+
logical_memory: Absolute amount of memory to be allocated to the new logical
|
|
54
|
+
device.
|
|
55
|
+
"""
|
|
56
|
+
from tensorflow import config as tf_config
|
|
57
|
+
|
|
58
|
+
try:
|
|
59
|
+
tf_config.experimental.set_virtual_device_configuration(
|
|
60
|
+
gpu_instance,
|
|
61
|
+
[
|
|
62
|
+
tf_config.experimental.VirtualDeviceConfiguration(
|
|
63
|
+
memory_limit=logical_memory
|
|
64
|
+
)
|
|
65
|
+
],
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
except RuntimeError:
|
|
69
|
+
# Helper explanation of where the error comes from
|
|
70
|
+
raise RuntimeError(
|
|
71
|
+
"Error while setting up tensorflow environment. "
|
|
72
|
+
"Virtual devices must be set before GPUs have been initialized."
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _parse_gpu_config(gpu_memory_config: Text) -> Dict[int, int]:
|
|
77
|
+
"""Parse GPU configuration variable from a string to a dict.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
gpu_memory_config: String containing the configuration for GPU usage.
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
Parsed configuration as a dictionary with GPU IDs as keys and requested memory
|
|
84
|
+
as the value.
|
|
85
|
+
"""
|
|
86
|
+
# gpu_config is of format "gpu_id_1:gpu_id_1_memory, gpu_id_2: gpu_id_2_memory"
|
|
87
|
+
# Parse it and store in a dictionary
|
|
88
|
+
parsed_gpu_config: Dict[int, int] = {}
|
|
89
|
+
|
|
90
|
+
try:
|
|
91
|
+
for instance in gpu_memory_config.split(","):
|
|
92
|
+
instance_gpu_id, instance_gpu_mem = instance.split(":")
|
|
93
|
+
parsed_instance_gpu_id = int(instance_gpu_id)
|
|
94
|
+
parsed_instance_gpu_mem = int(instance_gpu_mem)
|
|
95
|
+
|
|
96
|
+
parsed_gpu_config[parsed_instance_gpu_id] = parsed_instance_gpu_mem
|
|
97
|
+
except ValueError:
|
|
98
|
+
# Helper explanation of where the error comes from
|
|
99
|
+
raise ValueError(
|
|
100
|
+
f"Error parsing GPU configuration. Please cross-check the format of "
|
|
101
|
+
f"'{ENV_GPU_CONFIG}' at https://rasa.com/docs/rasa-pro/nlu-based-assistants/tuning-your-model"
|
|
102
|
+
f"#restricting-absolute-gpu-memory-available ."
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
return parsed_gpu_config
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _setup_cpu_environment() -> None:
|
|
109
|
+
"""Set configuration for the CPU environment based on environment variable."""
|
|
110
|
+
inter_op_parallel_threads = os.getenv(ENV_CPU_INTER_OP_CONFIG)
|
|
111
|
+
intra_op_parallel_threads = os.getenv(ENV_CPU_INTRA_OP_CONFIG)
|
|
112
|
+
|
|
113
|
+
if not inter_op_parallel_threads and not intra_op_parallel_threads:
|
|
114
|
+
return
|
|
115
|
+
|
|
116
|
+
from tensorflow import config as tf_config
|
|
117
|
+
|
|
118
|
+
if inter_op_parallel_threads:
|
|
119
|
+
try:
|
|
120
|
+
inter_op_parallel_threads_number = int(inter_op_parallel_threads.strip())
|
|
121
|
+
except ValueError:
|
|
122
|
+
raise ValueError(
|
|
123
|
+
f"Error parsing the environment variable '{ENV_CPU_INTER_OP_CONFIG}'. "
|
|
124
|
+
f"Please cross-check the value."
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
tf_config.threading.set_inter_op_parallelism_threads(
|
|
128
|
+
inter_op_parallel_threads_number
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
if intra_op_parallel_threads:
|
|
132
|
+
try:
|
|
133
|
+
intra_op_parallel_threads_number = int(intra_op_parallel_threads.strip())
|
|
134
|
+
except ValueError:
|
|
135
|
+
raise ValueError(
|
|
136
|
+
f"Error parsing the environment variable '{ENV_CPU_INTRA_OP_CONFIG}'. "
|
|
137
|
+
f"Please cross-check the value."
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
tf_config.threading.set_intra_op_parallelism_threads(
|
|
141
|
+
intra_op_parallel_threads_number
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def setup_tf_environment() -> None:
|
|
146
|
+
"""Setup CPU and GPU related environment settings for TensorFlow."""
|
|
147
|
+
_setup_cpu_environment()
|
|
148
|
+
_setup_gpu_environment()
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def check_deterministic_ops() -> None:
|
|
152
|
+
"""Warn user if they have set TF_DETERMINISTIC_OPS."""
|
|
153
|
+
if os.getenv(TF_DETERMINISTIC_OPS, False):
|
|
154
|
+
shared_io_utils.raise_warning(
|
|
155
|
+
f"You have set '{TF_DETERMINISTIC_OPS}' to 1. If you are "
|
|
156
|
+
f"using one or more GPU(s) and use any of 'SparseFeaturizer', "
|
|
157
|
+
f"'TEDPolicy', 'DIETClassifier', 'UnexpecTEDIntentPolicy', or "
|
|
158
|
+
f"'ResponseSelector' training and testing will fail as there are no "
|
|
159
|
+
f"deterministic GPU implementations of some underlying TF ops.",
|
|
160
|
+
category=UserWarning,
|
|
161
|
+
)
|