rasa-pro 3.12.0.dev1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- README.md +41 -0
- rasa/__init__.py +9 -0
- rasa/__main__.py +177 -0
- rasa/anonymization/__init__.py +2 -0
- rasa/anonymization/anonymisation_rule_yaml_reader.py +91 -0
- rasa/anonymization/anonymization_pipeline.py +286 -0
- rasa/anonymization/anonymization_rule_executor.py +260 -0
- rasa/anonymization/anonymization_rule_orchestrator.py +120 -0
- rasa/anonymization/schemas/config.yml +47 -0
- rasa/anonymization/utils.py +118 -0
- rasa/api.py +160 -0
- rasa/cli/__init__.py +5 -0
- rasa/cli/arguments/__init__.py +0 -0
- rasa/cli/arguments/data.py +106 -0
- rasa/cli/arguments/default_arguments.py +207 -0
- rasa/cli/arguments/evaluate.py +65 -0
- rasa/cli/arguments/export.py +51 -0
- rasa/cli/arguments/interactive.py +74 -0
- rasa/cli/arguments/run.py +219 -0
- rasa/cli/arguments/shell.py +17 -0
- rasa/cli/arguments/test.py +211 -0
- rasa/cli/arguments/train.py +279 -0
- rasa/cli/arguments/visualize.py +34 -0
- rasa/cli/arguments/x.py +30 -0
- rasa/cli/data.py +354 -0
- rasa/cli/dialogue_understanding_test.py +251 -0
- rasa/cli/e2e_test.py +259 -0
- rasa/cli/evaluate.py +222 -0
- rasa/cli/export.py +250 -0
- rasa/cli/inspect.py +75 -0
- rasa/cli/interactive.py +166 -0
- rasa/cli/license.py +65 -0
- rasa/cli/llm_fine_tuning.py +403 -0
- rasa/cli/markers.py +78 -0
- rasa/cli/project_templates/__init__.py +0 -0
- rasa/cli/project_templates/calm/actions/__init__.py +0 -0
- rasa/cli/project_templates/calm/actions/action_template.py +27 -0
- rasa/cli/project_templates/calm/actions/add_contact.py +30 -0
- rasa/cli/project_templates/calm/actions/db.py +57 -0
- rasa/cli/project_templates/calm/actions/list_contacts.py +22 -0
- rasa/cli/project_templates/calm/actions/remove_contact.py +35 -0
- rasa/cli/project_templates/calm/config.yml +10 -0
- rasa/cli/project_templates/calm/credentials.yml +33 -0
- rasa/cli/project_templates/calm/data/flows/add_contact.yml +31 -0
- rasa/cli/project_templates/calm/data/flows/list_contacts.yml +14 -0
- rasa/cli/project_templates/calm/data/flows/remove_contact.yml +29 -0
- rasa/cli/project_templates/calm/db/contacts.json +10 -0
- rasa/cli/project_templates/calm/domain/add_contact.yml +39 -0
- rasa/cli/project_templates/calm/domain/list_contacts.yml +17 -0
- rasa/cli/project_templates/calm/domain/remove_contact.yml +38 -0
- rasa/cli/project_templates/calm/domain/shared.yml +10 -0
- rasa/cli/project_templates/calm/e2e_tests/cancelations/user_cancels_during_a_correction.yml +16 -0
- rasa/cli/project_templates/calm/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +7 -0
- rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_handle.yml +20 -0
- rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_name.yml +19 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +15 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_lists_contacts.yml +5 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact.yml +11 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact_from_list.yml +12 -0
- rasa/cli/project_templates/calm/endpoints.yml +58 -0
- rasa/cli/project_templates/default/actions/__init__.py +0 -0
- rasa/cli/project_templates/default/actions/actions.py +27 -0
- rasa/cli/project_templates/default/config.yml +44 -0
- rasa/cli/project_templates/default/credentials.yml +33 -0
- rasa/cli/project_templates/default/data/nlu.yml +91 -0
- rasa/cli/project_templates/default/data/rules.yml +13 -0
- rasa/cli/project_templates/default/data/stories.yml +30 -0
- rasa/cli/project_templates/default/domain.yml +34 -0
- rasa/cli/project_templates/default/endpoints.yml +42 -0
- rasa/cli/project_templates/default/tests/test_stories.yml +91 -0
- rasa/cli/project_templates/tutorial/actions/__init__.py +0 -0
- rasa/cli/project_templates/tutorial/actions/actions.py +22 -0
- rasa/cli/project_templates/tutorial/config.yml +12 -0
- rasa/cli/project_templates/tutorial/credentials.yml +33 -0
- rasa/cli/project_templates/tutorial/data/flows.yml +8 -0
- rasa/cli/project_templates/tutorial/data/patterns.yml +11 -0
- rasa/cli/project_templates/tutorial/domain.yml +35 -0
- rasa/cli/project_templates/tutorial/endpoints.yml +55 -0
- rasa/cli/run.py +143 -0
- rasa/cli/scaffold.py +273 -0
- rasa/cli/shell.py +141 -0
- rasa/cli/studio/__init__.py +0 -0
- rasa/cli/studio/download.py +62 -0
- rasa/cli/studio/studio.py +296 -0
- rasa/cli/studio/train.py +59 -0
- rasa/cli/studio/upload.py +62 -0
- rasa/cli/telemetry.py +102 -0
- rasa/cli/test.py +280 -0
- rasa/cli/train.py +278 -0
- rasa/cli/utils.py +484 -0
- rasa/cli/visualize.py +40 -0
- rasa/cli/x.py +206 -0
- rasa/constants.py +45 -0
- rasa/core/__init__.py +17 -0
- rasa/core/actions/__init__.py +0 -0
- rasa/core/actions/action.py +1318 -0
- rasa/core/actions/action_clean_stack.py +59 -0
- rasa/core/actions/action_exceptions.py +24 -0
- rasa/core/actions/action_hangup.py +29 -0
- rasa/core/actions/action_repeat_bot_messages.py +89 -0
- rasa/core/actions/action_run_slot_rejections.py +210 -0
- rasa/core/actions/action_trigger_chitchat.py +31 -0
- rasa/core/actions/action_trigger_flow.py +109 -0
- rasa/core/actions/action_trigger_search.py +31 -0
- rasa/core/actions/constants.py +5 -0
- rasa/core/actions/custom_action_executor.py +191 -0
- rasa/core/actions/direct_custom_actions_executor.py +109 -0
- rasa/core/actions/e2e_stub_custom_action_executor.py +72 -0
- rasa/core/actions/forms.py +741 -0
- rasa/core/actions/grpc_custom_action_executor.py +251 -0
- rasa/core/actions/http_custom_action_executor.py +145 -0
- rasa/core/actions/loops.py +114 -0
- rasa/core/actions/two_stage_fallback.py +186 -0
- rasa/core/agent.py +559 -0
- rasa/core/auth_retry_tracker_store.py +122 -0
- rasa/core/brokers/__init__.py +0 -0
- rasa/core/brokers/broker.py +126 -0
- rasa/core/brokers/file.py +58 -0
- rasa/core/brokers/kafka.py +324 -0
- rasa/core/brokers/pika.py +388 -0
- rasa/core/brokers/sql.py +86 -0
- rasa/core/channels/__init__.py +61 -0
- rasa/core/channels/botframework.py +338 -0
- rasa/core/channels/callback.py +84 -0
- rasa/core/channels/channel.py +456 -0
- rasa/core/channels/console.py +241 -0
- rasa/core/channels/development_inspector.py +197 -0
- rasa/core/channels/facebook.py +419 -0
- rasa/core/channels/hangouts.py +329 -0
- rasa/core/channels/inspector/.eslintrc.cjs +25 -0
- rasa/core/channels/inspector/.gitignore +23 -0
- rasa/core/channels/inspector/README.md +54 -0
- rasa/core/channels/inspector/assets/favicon.ico +0 -0
- rasa/core/channels/inspector/assets/rasa-chat.js +2 -0
- rasa/core/channels/inspector/custom.d.ts +3 -0
- rasa/core/channels/inspector/dist/assets/arc-861ddd57.js +1 -0
- rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
- rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-921f02db.js +10 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-b436c4f8.js +2 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-511a23cb.js +2 -0
- rasa/core/channels/inspector/dist/assets/createText-62fc7601-ef476ecd.js +7 -0
- rasa/core/channels/inspector/dist/assets/edges-f2ad444c-f1878e0a.js +4 -0
- rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-fac75185.js +51 -0
- rasa/core/channels/inspector/dist/assets/flowDb-1972c806-201c5bbc.js +6 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-f904ae41.js +4 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +1 -0
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-1813da66.js +139 -0
- rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-872af172.js +266 -0
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-34a0af5a.js +70 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-128cfa44.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-21dbcb97.woff +0 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-222b5e26.svg +329 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-9ad89b2a.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-42ba3e3d.js +1 -0
- rasa/core/channels/inspector/dist/assets/index-37817b51.js +1317 -0
- rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
- rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-6b731386.js +7 -0
- rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
- rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-e8579ac6.js +139 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-60c05ee4.woff +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-8335d9b8.svg +438 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-9cc39c75.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-ead13ccf.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-16705655.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-5aeb07f9.woff +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9c459044.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9e2898a4.svg +435 -0
- rasa/core/channels/inspector/dist/assets/layout-89e6403a.js +1 -0
- rasa/core/channels/inspector/dist/assets/line-dc73d3fc.js +1 -0
- rasa/core/channels/inspector/dist/assets/linear-f5b1d2bc.js +1 -0
- rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-82cb74fa.js +109 -0
- rasa/core/channels/inspector/dist/assets/ordinal-ba9b4969.js +1 -0
- rasa/core/channels/inspector/dist/assets/path-53f90ab3.js +1 -0
- rasa/core/channels/inspector/dist/assets/pieDiagram-dbbf0591-bdf5f29b.js +35 -0
- rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-c7a0cbe4.js +7 -0
- rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-7ec5410f.js +52 -0
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-caee5554.js +8 -0
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-2935f8db.js +122 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-8f5d9693.js +1 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-d565d1de.js +1 -0
- rasa/core/channels/inspector/dist/assets/styles-080da4f6-75ad421d.js +110 -0
- rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-7e764226.js +159 -0
- rasa/core/channels/inspector/dist/assets/styles-9c745c82-7a4e0e61.js +207 -0
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-4019d1bf.js +1 -0
- rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-01ea12df.js +61 -0
- rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-89407137.js +7 -0
- rasa/core/channels/inspector/dist/index.html +42 -0
- rasa/core/channels/inspector/index.html +40 -0
- rasa/core/channels/inspector/jest.config.ts +13 -0
- rasa/core/channels/inspector/package.json +52 -0
- rasa/core/channels/inspector/setupTests.ts +2 -0
- rasa/core/channels/inspector/src/App.tsx +220 -0
- rasa/core/channels/inspector/src/components/Chat.tsx +95 -0
- rasa/core/channels/inspector/src/components/DiagramFlow.tsx +108 -0
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
- rasa/core/channels/inspector/src/components/DialogueStack.tsx +136 -0
- rasa/core/channels/inspector/src/components/ExpandIcon.tsx +16 -0
- rasa/core/channels/inspector/src/components/FullscreenButton.tsx +45 -0
- rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +22 -0
- rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +21 -0
- rasa/core/channels/inspector/src/components/RasaLogo.tsx +32 -0
- rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +39 -0
- rasa/core/channels/inspector/src/components/Slots.tsx +91 -0
- rasa/core/channels/inspector/src/components/Welcome.tsx +54 -0
- rasa/core/channels/inspector/src/helpers/audiostream.ts +191 -0
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +392 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +306 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +127 -0
- rasa/core/channels/inspector/src/main.tsx +13 -0
- rasa/core/channels/inspector/src/theme/Button/Button.ts +29 -0
- rasa/core/channels/inspector/src/theme/Heading/Heading.ts +31 -0
- rasa/core/channels/inspector/src/theme/Input/Input.ts +27 -0
- rasa/core/channels/inspector/src/theme/Link/Link.ts +10 -0
- rasa/core/channels/inspector/src/theme/Modal/Modal.ts +47 -0
- rasa/core/channels/inspector/src/theme/Table/Table.tsx +38 -0
- rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +12 -0
- rasa/core/channels/inspector/src/theme/base/breakpoints.ts +8 -0
- rasa/core/channels/inspector/src/theme/base/colors.ts +88 -0
- rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +29 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.svg +329 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.svg +438 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.svg +435 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/radii.ts +9 -0
- rasa/core/channels/inspector/src/theme/base/shadows.ts +7 -0
- rasa/core/channels/inspector/src/theme/base/sizes.ts +7 -0
- rasa/core/channels/inspector/src/theme/base/space.ts +15 -0
- rasa/core/channels/inspector/src/theme/base/styles.ts +13 -0
- rasa/core/channels/inspector/src/theme/base/typography.ts +24 -0
- rasa/core/channels/inspector/src/theme/base/zIndices.ts +19 -0
- rasa/core/channels/inspector/src/theme/index.ts +101 -0
- rasa/core/channels/inspector/src/types.ts +84 -0
- rasa/core/channels/inspector/src/vite-env.d.ts +1 -0
- rasa/core/channels/inspector/tests/__mocks__/fileMock.ts +1 -0
- rasa/core/channels/inspector/tests/__mocks__/matchMedia.ts +16 -0
- rasa/core/channels/inspector/tests/__mocks__/styleMock.ts +1 -0
- rasa/core/channels/inspector/tests/renderWithProviders.tsx +14 -0
- rasa/core/channels/inspector/tsconfig.json +26 -0
- rasa/core/channels/inspector/tsconfig.node.json +10 -0
- rasa/core/channels/inspector/vite.config.ts +8 -0
- rasa/core/channels/inspector/yarn.lock +6249 -0
- rasa/core/channels/mattermost.py +229 -0
- rasa/core/channels/rasa_chat.py +126 -0
- rasa/core/channels/rest.py +230 -0
- rasa/core/channels/rocketchat.py +174 -0
- rasa/core/channels/slack.py +620 -0
- rasa/core/channels/socketio.py +302 -0
- rasa/core/channels/telegram.py +298 -0
- rasa/core/channels/twilio.py +169 -0
- rasa/core/channels/vier_cvg.py +374 -0
- rasa/core/channels/voice_ready/__init__.py +0 -0
- rasa/core/channels/voice_ready/audiocodes.py +501 -0
- rasa/core/channels/voice_ready/jambonz.py +121 -0
- rasa/core/channels/voice_ready/jambonz_protocol.py +396 -0
- rasa/core/channels/voice_ready/twilio_voice.py +403 -0
- rasa/core/channels/voice_ready/utils.py +37 -0
- rasa/core/channels/voice_stream/__init__.py +0 -0
- rasa/core/channels/voice_stream/asr/__init__.py +0 -0
- rasa/core/channels/voice_stream/asr/asr_engine.py +89 -0
- rasa/core/channels/voice_stream/asr/asr_event.py +18 -0
- rasa/core/channels/voice_stream/asr/azure.py +130 -0
- rasa/core/channels/voice_stream/asr/deepgram.py +90 -0
- rasa/core/channels/voice_stream/audio_bytes.py +8 -0
- rasa/core/channels/voice_stream/browser_audio.py +107 -0
- rasa/core/channels/voice_stream/call_state.py +23 -0
- rasa/core/channels/voice_stream/tts/__init__.py +0 -0
- rasa/core/channels/voice_stream/tts/azure.py +106 -0
- rasa/core/channels/voice_stream/tts/cartesia.py +118 -0
- rasa/core/channels/voice_stream/tts/tts_cache.py +27 -0
- rasa/core/channels/voice_stream/tts/tts_engine.py +58 -0
- rasa/core/channels/voice_stream/twilio_media_streams.py +173 -0
- rasa/core/channels/voice_stream/util.py +57 -0
- rasa/core/channels/voice_stream/voice_channel.py +427 -0
- rasa/core/channels/webexteams.py +134 -0
- rasa/core/concurrent_lock_store.py +210 -0
- rasa/core/constants.py +112 -0
- rasa/core/evaluation/__init__.py +0 -0
- rasa/core/evaluation/marker.py +267 -0
- rasa/core/evaluation/marker_base.py +923 -0
- rasa/core/evaluation/marker_stats.py +293 -0
- rasa/core/evaluation/marker_tracker_loader.py +103 -0
- rasa/core/exceptions.py +29 -0
- rasa/core/exporter.py +284 -0
- rasa/core/featurizers/__init__.py +0 -0
- rasa/core/featurizers/precomputation.py +410 -0
- rasa/core/featurizers/single_state_featurizer.py +421 -0
- rasa/core/featurizers/tracker_featurizers.py +1262 -0
- rasa/core/http_interpreter.py +89 -0
- rasa/core/information_retrieval/__init__.py +7 -0
- rasa/core/information_retrieval/faiss.py +124 -0
- rasa/core/information_retrieval/information_retrieval.py +137 -0
- rasa/core/information_retrieval/milvus.py +59 -0
- rasa/core/information_retrieval/qdrant.py +96 -0
- rasa/core/jobs.py +63 -0
- rasa/core/lock.py +139 -0
- rasa/core/lock_store.py +343 -0
- rasa/core/migrate.py +403 -0
- rasa/core/nlg/__init__.py +3 -0
- rasa/core/nlg/callback.py +146 -0
- rasa/core/nlg/contextual_response_rephraser.py +320 -0
- rasa/core/nlg/generator.py +230 -0
- rasa/core/nlg/interpolator.py +143 -0
- rasa/core/nlg/response.py +155 -0
- rasa/core/nlg/summarize.py +70 -0
- rasa/core/persistor.py +538 -0
- rasa/core/policies/__init__.py +0 -0
- rasa/core/policies/ensemble.py +329 -0
- rasa/core/policies/enterprise_search_policy.py +905 -0
- rasa/core/policies/enterprise_search_prompt_template.jinja2 +25 -0
- rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +60 -0
- rasa/core/policies/flow_policy.py +205 -0
- rasa/core/policies/flows/__init__.py +0 -0
- rasa/core/policies/flows/flow_exceptions.py +44 -0
- rasa/core/policies/flows/flow_executor.py +754 -0
- rasa/core/policies/flows/flow_step_result.py +43 -0
- rasa/core/policies/intentless_policy.py +1031 -0
- rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
- rasa/core/policies/memoization.py +538 -0
- rasa/core/policies/policy.py +725 -0
- rasa/core/policies/rule_policy.py +1273 -0
- rasa/core/policies/ted_policy.py +2169 -0
- rasa/core/policies/unexpected_intent_policy.py +1022 -0
- rasa/core/processor.py +1465 -0
- rasa/core/run.py +342 -0
- rasa/core/secrets_manager/__init__.py +0 -0
- rasa/core/secrets_manager/constants.py +36 -0
- rasa/core/secrets_manager/endpoints.py +391 -0
- rasa/core/secrets_manager/factory.py +241 -0
- rasa/core/secrets_manager/secret_manager.py +262 -0
- rasa/core/secrets_manager/vault.py +584 -0
- rasa/core/test.py +1335 -0
- rasa/core/tracker_store.py +1703 -0
- rasa/core/train.py +105 -0
- rasa/core/training/__init__.py +89 -0
- rasa/core/training/converters/__init__.py +0 -0
- rasa/core/training/converters/responses_prefix_converter.py +119 -0
- rasa/core/training/interactive.py +1744 -0
- rasa/core/training/story_conflict.py +381 -0
- rasa/core/training/training.py +93 -0
- rasa/core/utils.py +366 -0
- rasa/core/visualize.py +70 -0
- rasa/dialogue_understanding/__init__.py +0 -0
- rasa/dialogue_understanding/coexistence/__init__.py +0 -0
- rasa/dialogue_understanding/coexistence/constants.py +4 -0
- rasa/dialogue_understanding/coexistence/intent_based_router.py +196 -0
- rasa/dialogue_understanding/coexistence/llm_based_router.py +327 -0
- rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
- rasa/dialogue_understanding/commands/__init__.py +61 -0
- rasa/dialogue_understanding/commands/can_not_handle_command.py +70 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +125 -0
- rasa/dialogue_understanding/commands/change_flow_command.py +44 -0
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +57 -0
- rasa/dialogue_understanding/commands/clarify_command.py +86 -0
- rasa/dialogue_understanding/commands/command.py +85 -0
- rasa/dialogue_understanding/commands/correct_slots_command.py +297 -0
- rasa/dialogue_understanding/commands/error_command.py +79 -0
- rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
- rasa/dialogue_understanding/commands/handle_code_change_command.py +73 -0
- rasa/dialogue_understanding/commands/human_handoff_command.py +66 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +57 -0
- rasa/dialogue_understanding/commands/noop_command.py +54 -0
- rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +60 -0
- rasa/dialogue_understanding/commands/restart_command.py +58 -0
- rasa/dialogue_understanding/commands/session_end_command.py +61 -0
- rasa/dialogue_understanding/commands/session_start_command.py +59 -0
- rasa/dialogue_understanding/commands/set_slot_command.py +160 -0
- rasa/dialogue_understanding/commands/skip_question_command.py +75 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +107 -0
- rasa/dialogue_understanding/commands/user_silence_command.py +59 -0
- rasa/dialogue_understanding/commands/utils.py +45 -0
- rasa/dialogue_understanding/generator/__init__.py +21 -0
- rasa/dialogue_understanding/generator/command_generator.py +464 -0
- rasa/dialogue_understanding/generator/constants.py +27 -0
- rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +466 -0
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +500 -0
- rasa/dialogue_understanding/generator/llm_command_generator.py +67 -0
- rasa/dialogue_understanding/generator/multi_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/multi_step/fill_slots_prompt.jinja2 +62 -0
- rasa/dialogue_understanding/generator/multi_step/handle_flows_prompt.jinja2 +38 -0
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +920 -0
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +261 -0
- rasa/dialogue_understanding/generator/single_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2 +60 -0
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +486 -0
- rasa/dialogue_understanding/patterns/__init__.py +0 -0
- rasa/dialogue_understanding/patterns/cancel.py +111 -0
- rasa/dialogue_understanding/patterns/cannot_handle.py +43 -0
- rasa/dialogue_understanding/patterns/chitchat.py +37 -0
- rasa/dialogue_understanding/patterns/clarify.py +97 -0
- rasa/dialogue_understanding/patterns/code_change.py +41 -0
- rasa/dialogue_understanding/patterns/collect_information.py +90 -0
- rasa/dialogue_understanding/patterns/completed.py +40 -0
- rasa/dialogue_understanding/patterns/continue_interrupted.py +42 -0
- rasa/dialogue_understanding/patterns/correction.py +278 -0
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +301 -0
- rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
- rasa/dialogue_understanding/patterns/internal_error.py +47 -0
- rasa/dialogue_understanding/patterns/repeat.py +37 -0
- rasa/dialogue_understanding/patterns/restart.py +37 -0
- rasa/dialogue_understanding/patterns/search.py +37 -0
- rasa/dialogue_understanding/patterns/session_start.py +37 -0
- rasa/dialogue_understanding/patterns/skip_question.py +38 -0
- rasa/dialogue_understanding/patterns/user_silence.py +37 -0
- rasa/dialogue_understanding/processor/__init__.py +0 -0
- rasa/dialogue_understanding/processor/command_processor.py +720 -0
- rasa/dialogue_understanding/processor/command_processor_component.py +43 -0
- rasa/dialogue_understanding/stack/__init__.py +0 -0
- rasa/dialogue_understanding/stack/dialogue_stack.py +178 -0
- rasa/dialogue_understanding/stack/frames/__init__.py +19 -0
- rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +27 -0
- rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +137 -0
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +157 -0
- rasa/dialogue_understanding/stack/frames/pattern_frame.py +10 -0
- rasa/dialogue_understanding/stack/frames/search_frame.py +27 -0
- rasa/dialogue_understanding/stack/utils.py +211 -0
- rasa/dialogue_understanding/utils.py +14 -0
- rasa/dialogue_understanding_test/__init__.py +0 -0
- rasa/dialogue_understanding_test/command_metric_calculation.py +12 -0
- rasa/dialogue_understanding_test/constants.py +17 -0
- rasa/dialogue_understanding_test/du_test_case.py +118 -0
- rasa/dialogue_understanding_test/du_test_result.py +11 -0
- rasa/dialogue_understanding_test/du_test_runner.py +93 -0
- rasa/dialogue_understanding_test/io.py +54 -0
- rasa/dialogue_understanding_test/validation.py +22 -0
- rasa/e2e_test/__init__.py +0 -0
- rasa/e2e_test/aggregate_test_stats_calculator.py +134 -0
- rasa/e2e_test/assertions.py +1345 -0
- rasa/e2e_test/assertions_schema.yml +129 -0
- rasa/e2e_test/constants.py +31 -0
- rasa/e2e_test/e2e_config.py +220 -0
- rasa/e2e_test/e2e_config_schema.yml +26 -0
- rasa/e2e_test/e2e_test_case.py +569 -0
- rasa/e2e_test/e2e_test_converter.py +363 -0
- rasa/e2e_test/e2e_test_converter_prompt.jinja2 +70 -0
- rasa/e2e_test/e2e_test_coverage_report.py +364 -0
- rasa/e2e_test/e2e_test_result.py +54 -0
- rasa/e2e_test/e2e_test_runner.py +1192 -0
- rasa/e2e_test/e2e_test_schema.yml +181 -0
- rasa/e2e_test/pykwalify_extensions.py +39 -0
- rasa/e2e_test/stub_custom_action.py +70 -0
- rasa/e2e_test/utils/__init__.py +0 -0
- rasa/e2e_test/utils/e2e_yaml_utils.py +55 -0
- rasa/e2e_test/utils/io.py +598 -0
- rasa/e2e_test/utils/validation.py +178 -0
- rasa/engine/__init__.py +0 -0
- rasa/engine/caching.py +463 -0
- rasa/engine/constants.py +17 -0
- rasa/engine/exceptions.py +14 -0
- rasa/engine/graph.py +642 -0
- rasa/engine/loader.py +48 -0
- rasa/engine/recipes/__init__.py +0 -0
- rasa/engine/recipes/config_files/default_config.yml +41 -0
- rasa/engine/recipes/default_components.py +97 -0
- rasa/engine/recipes/default_recipe.py +1272 -0
- rasa/engine/recipes/graph_recipe.py +79 -0
- rasa/engine/recipes/recipe.py +93 -0
- rasa/engine/runner/__init__.py +0 -0
- rasa/engine/runner/dask.py +250 -0
- rasa/engine/runner/interface.py +49 -0
- rasa/engine/storage/__init__.py +0 -0
- rasa/engine/storage/local_model_storage.py +244 -0
- rasa/engine/storage/resource.py +110 -0
- rasa/engine/storage/storage.py +199 -0
- rasa/engine/training/__init__.py +0 -0
- rasa/engine/training/components.py +176 -0
- rasa/engine/training/fingerprinting.py +64 -0
- rasa/engine/training/graph_trainer.py +256 -0
- rasa/engine/training/hooks.py +164 -0
- rasa/engine/validation.py +1451 -0
- rasa/env.py +14 -0
- rasa/exceptions.py +69 -0
- rasa/graph_components/__init__.py +0 -0
- rasa/graph_components/converters/__init__.py +0 -0
- rasa/graph_components/converters/nlu_message_converter.py +48 -0
- rasa/graph_components/providers/__init__.py +0 -0
- rasa/graph_components/providers/domain_for_core_training_provider.py +87 -0
- rasa/graph_components/providers/domain_provider.py +71 -0
- rasa/graph_components/providers/flows_provider.py +74 -0
- rasa/graph_components/providers/forms_provider.py +44 -0
- rasa/graph_components/providers/nlu_training_data_provider.py +56 -0
- rasa/graph_components/providers/responses_provider.py +44 -0
- rasa/graph_components/providers/rule_only_provider.py +49 -0
- rasa/graph_components/providers/story_graph_provider.py +96 -0
- rasa/graph_components/providers/training_tracker_provider.py +55 -0
- rasa/graph_components/validators/__init__.py +0 -0
- rasa/graph_components/validators/default_recipe_validator.py +550 -0
- rasa/graph_components/validators/finetuning_validator.py +302 -0
- rasa/hooks.py +111 -0
- rasa/jupyter.py +63 -0
- rasa/llm_fine_tuning/__init__.py +0 -0
- rasa/llm_fine_tuning/annotation_module.py +241 -0
- rasa/llm_fine_tuning/conversations.py +144 -0
- rasa/llm_fine_tuning/llm_data_preparation_module.py +178 -0
- rasa/llm_fine_tuning/paraphrasing/__init__.py +0 -0
- rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +281 -0
- rasa/llm_fine_tuning/paraphrasing/default_rephrase_prompt_template.jina2 +44 -0
- rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +121 -0
- rasa/llm_fine_tuning/paraphrasing/rephrased_user_message.py +10 -0
- rasa/llm_fine_tuning/paraphrasing_module.py +128 -0
- rasa/llm_fine_tuning/storage.py +174 -0
- rasa/llm_fine_tuning/train_test_split_module.py +441 -0
- rasa/markers/__init__.py +0 -0
- rasa/markers/marker.py +269 -0
- rasa/markers/marker_base.py +828 -0
- rasa/markers/upload.py +74 -0
- rasa/markers/validate.py +21 -0
- rasa/model.py +118 -0
- rasa/model_manager/__init__.py +0 -0
- rasa/model_manager/config.py +40 -0
- rasa/model_manager/model_api.py +559 -0
- rasa/model_manager/runner_service.py +286 -0
- rasa/model_manager/socket_bridge.py +146 -0
- rasa/model_manager/studio_jwt_auth.py +86 -0
- rasa/model_manager/trainer_service.py +325 -0
- rasa/model_manager/utils.py +87 -0
- rasa/model_manager/warm_rasa_process.py +187 -0
- rasa/model_service.py +112 -0
- rasa/model_testing.py +457 -0
- rasa/model_training.py +596 -0
- rasa/nlu/__init__.py +7 -0
- rasa/nlu/classifiers/__init__.py +3 -0
- rasa/nlu/classifiers/classifier.py +5 -0
- rasa/nlu/classifiers/diet_classifier.py +1881 -0
- rasa/nlu/classifiers/fallback_classifier.py +192 -0
- rasa/nlu/classifiers/keyword_intent_classifier.py +188 -0
- rasa/nlu/classifiers/logistic_regression_classifier.py +253 -0
- rasa/nlu/classifiers/mitie_intent_classifier.py +156 -0
- rasa/nlu/classifiers/regex_message_handler.py +56 -0
- rasa/nlu/classifiers/sklearn_intent_classifier.py +330 -0
- rasa/nlu/constants.py +77 -0
- rasa/nlu/convert.py +40 -0
- rasa/nlu/emulators/__init__.py +0 -0
- rasa/nlu/emulators/dialogflow.py +55 -0
- rasa/nlu/emulators/emulator.py +49 -0
- rasa/nlu/emulators/luis.py +86 -0
- rasa/nlu/emulators/no_emulator.py +10 -0
- rasa/nlu/emulators/wit.py +56 -0
- rasa/nlu/extractors/__init__.py +0 -0
- rasa/nlu/extractors/crf_entity_extractor.py +715 -0
- rasa/nlu/extractors/duckling_entity_extractor.py +206 -0
- rasa/nlu/extractors/entity_synonyms.py +178 -0
- rasa/nlu/extractors/extractor.py +470 -0
- rasa/nlu/extractors/mitie_entity_extractor.py +293 -0
- rasa/nlu/extractors/regex_entity_extractor.py +220 -0
- rasa/nlu/extractors/spacy_entity_extractor.py +95 -0
- rasa/nlu/featurizers/__init__.py +0 -0
- rasa/nlu/featurizers/dense_featurizer/__init__.py +0 -0
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +445 -0
- rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +768 -0
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +170 -0
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +132 -0
- rasa/nlu/featurizers/featurizer.py +89 -0
- rasa/nlu/featurizers/sparse_featurizer/__init__.py +0 -0
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +867 -0
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +571 -0
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +271 -0
- rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
- rasa/nlu/model.py +24 -0
- rasa/nlu/run.py +27 -0
- rasa/nlu/selectors/__init__.py +0 -0
- rasa/nlu/selectors/response_selector.py +987 -0
- rasa/nlu/test.py +1940 -0
- rasa/nlu/tokenizers/__init__.py +0 -0
- rasa/nlu/tokenizers/jieba_tokenizer.py +148 -0
- rasa/nlu/tokenizers/mitie_tokenizer.py +75 -0
- rasa/nlu/tokenizers/spacy_tokenizer.py +72 -0
- rasa/nlu/tokenizers/tokenizer.py +239 -0
- rasa/nlu/tokenizers/whitespace_tokenizer.py +95 -0
- rasa/nlu/utils/__init__.py +35 -0
- rasa/nlu/utils/bilou_utils.py +462 -0
- rasa/nlu/utils/hugging_face/__init__.py +0 -0
- rasa/nlu/utils/hugging_face/registry.py +108 -0
- rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +311 -0
- rasa/nlu/utils/mitie_utils.py +113 -0
- rasa/nlu/utils/pattern_utils.py +168 -0
- rasa/nlu/utils/spacy_utils.py +310 -0
- rasa/plugin.py +90 -0
- rasa/server.py +1588 -0
- rasa/shared/__init__.py +0 -0
- rasa/shared/constants.py +311 -0
- rasa/shared/core/__init__.py +0 -0
- rasa/shared/core/command_payload_reader.py +109 -0
- rasa/shared/core/constants.py +180 -0
- rasa/shared/core/conversation.py +46 -0
- rasa/shared/core/domain.py +2172 -0
- rasa/shared/core/events.py +2559 -0
- rasa/shared/core/flows/__init__.py +7 -0
- rasa/shared/core/flows/flow.py +562 -0
- rasa/shared/core/flows/flow_path.py +84 -0
- rasa/shared/core/flows/flow_step.py +146 -0
- rasa/shared/core/flows/flow_step_links.py +319 -0
- rasa/shared/core/flows/flow_step_sequence.py +70 -0
- rasa/shared/core/flows/flows_list.py +258 -0
- rasa/shared/core/flows/flows_yaml_schema.json +303 -0
- rasa/shared/core/flows/nlu_trigger.py +117 -0
- rasa/shared/core/flows/steps/__init__.py +24 -0
- rasa/shared/core/flows/steps/action.py +56 -0
- rasa/shared/core/flows/steps/call.py +64 -0
- rasa/shared/core/flows/steps/collect.py +112 -0
- rasa/shared/core/flows/steps/constants.py +5 -0
- rasa/shared/core/flows/steps/continuation.py +36 -0
- rasa/shared/core/flows/steps/end.py +22 -0
- rasa/shared/core/flows/steps/internal.py +44 -0
- rasa/shared/core/flows/steps/link.py +51 -0
- rasa/shared/core/flows/steps/no_operation.py +48 -0
- rasa/shared/core/flows/steps/set_slots.py +50 -0
- rasa/shared/core/flows/steps/start.py +30 -0
- rasa/shared/core/flows/utils.py +39 -0
- rasa/shared/core/flows/validation.py +735 -0
- rasa/shared/core/flows/yaml_flows_io.py +405 -0
- rasa/shared/core/generator.py +908 -0
- rasa/shared/core/slot_mappings.py +526 -0
- rasa/shared/core/slots.py +654 -0
- rasa/shared/core/trackers.py +1183 -0
- rasa/shared/core/training_data/__init__.py +0 -0
- rasa/shared/core/training_data/loading.py +89 -0
- rasa/shared/core/training_data/story_reader/__init__.py +0 -0
- rasa/shared/core/training_data/story_reader/story_reader.py +129 -0
- rasa/shared/core/training_data/story_reader/story_step_builder.py +168 -0
- rasa/shared/core/training_data/story_reader/yaml_story_reader.py +888 -0
- rasa/shared/core/training_data/story_writer/__init__.py +0 -0
- rasa/shared/core/training_data/story_writer/story_writer.py +76 -0
- rasa/shared/core/training_data/story_writer/yaml_story_writer.py +444 -0
- rasa/shared/core/training_data/structures.py +858 -0
- rasa/shared/core/training_data/visualization.html +146 -0
- rasa/shared/core/training_data/visualization.py +603 -0
- rasa/shared/data.py +249 -0
- rasa/shared/engine/__init__.py +0 -0
- rasa/shared/engine/caching.py +26 -0
- rasa/shared/exceptions.py +167 -0
- rasa/shared/importers/__init__.py +0 -0
- rasa/shared/importers/importer.py +770 -0
- rasa/shared/importers/multi_project.py +215 -0
- rasa/shared/importers/rasa.py +108 -0
- rasa/shared/importers/remote_importer.py +196 -0
- rasa/shared/importers/utils.py +36 -0
- rasa/shared/nlu/__init__.py +0 -0
- rasa/shared/nlu/constants.py +53 -0
- rasa/shared/nlu/interpreter.py +10 -0
- rasa/shared/nlu/training_data/__init__.py +0 -0
- rasa/shared/nlu/training_data/entities_parser.py +208 -0
- rasa/shared/nlu/training_data/features.py +492 -0
- rasa/shared/nlu/training_data/formats/__init__.py +10 -0
- rasa/shared/nlu/training_data/formats/dialogflow.py +163 -0
- rasa/shared/nlu/training_data/formats/luis.py +87 -0
- rasa/shared/nlu/training_data/formats/rasa.py +135 -0
- rasa/shared/nlu/training_data/formats/rasa_yaml.py +618 -0
- rasa/shared/nlu/training_data/formats/readerwriter.py +244 -0
- rasa/shared/nlu/training_data/formats/wit.py +52 -0
- rasa/shared/nlu/training_data/loading.py +137 -0
- rasa/shared/nlu/training_data/lookup_tables_parser.py +30 -0
- rasa/shared/nlu/training_data/message.py +490 -0
- rasa/shared/nlu/training_data/schemas/__init__.py +0 -0
- rasa/shared/nlu/training_data/schemas/data_schema.py +85 -0
- rasa/shared/nlu/training_data/schemas/nlu.yml +53 -0
- rasa/shared/nlu/training_data/schemas/responses.yml +70 -0
- rasa/shared/nlu/training_data/synonyms_parser.py +42 -0
- rasa/shared/nlu/training_data/training_data.py +729 -0
- rasa/shared/nlu/training_data/util.py +223 -0
- rasa/shared/providers/__init__.py +0 -0
- rasa/shared/providers/_configs/__init__.py +0 -0
- rasa/shared/providers/_configs/azure_openai_client_config.py +677 -0
- rasa/shared/providers/_configs/client_config.py +59 -0
- rasa/shared/providers/_configs/default_litellm_client_config.py +132 -0
- rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +236 -0
- rasa/shared/providers/_configs/litellm_router_client_config.py +222 -0
- rasa/shared/providers/_configs/model_group_config.py +173 -0
- rasa/shared/providers/_configs/openai_client_config.py +177 -0
- rasa/shared/providers/_configs/rasa_llm_client_config.py +75 -0
- rasa/shared/providers/_configs/self_hosted_llm_client_config.py +178 -0
- rasa/shared/providers/_configs/utils.py +117 -0
- rasa/shared/providers/_ssl_verification_utils.py +124 -0
- rasa/shared/providers/_utils.py +79 -0
- rasa/shared/providers/constants.py +7 -0
- rasa/shared/providers/embedding/__init__.py +0 -0
- rasa/shared/providers/embedding/_base_litellm_embedding_client.py +243 -0
- rasa/shared/providers/embedding/_langchain_embedding_client_adapter.py +74 -0
- rasa/shared/providers/embedding/azure_openai_embedding_client.py +335 -0
- rasa/shared/providers/embedding/default_litellm_embedding_client.py +126 -0
- rasa/shared/providers/embedding/embedding_client.py +90 -0
- rasa/shared/providers/embedding/embedding_response.py +41 -0
- rasa/shared/providers/embedding/huggingface_local_embedding_client.py +191 -0
- rasa/shared/providers/embedding/litellm_router_embedding_client.py +138 -0
- rasa/shared/providers/embedding/openai_embedding_client.py +172 -0
- rasa/shared/providers/llm/__init__.py +0 -0
- rasa/shared/providers/llm/_base_litellm_client.py +265 -0
- rasa/shared/providers/llm/azure_openai_llm_client.py +415 -0
- rasa/shared/providers/llm/default_litellm_llm_client.py +110 -0
- rasa/shared/providers/llm/litellm_router_llm_client.py +202 -0
- rasa/shared/providers/llm/llm_client.py +78 -0
- rasa/shared/providers/llm/llm_response.py +50 -0
- rasa/shared/providers/llm/openai_llm_client.py +161 -0
- rasa/shared/providers/llm/rasa_llm_client.py +120 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +276 -0
- rasa/shared/providers/mappings.py +94 -0
- rasa/shared/providers/router/__init__.py +0 -0
- rasa/shared/providers/router/_base_litellm_router_client.py +185 -0
- rasa/shared/providers/router/router_client.py +75 -0
- rasa/shared/utils/__init__.py +0 -0
- rasa/shared/utils/cli.py +102 -0
- rasa/shared/utils/common.py +324 -0
- rasa/shared/utils/constants.py +4 -0
- rasa/shared/utils/health_check/__init__.py +0 -0
- rasa/shared/utils/health_check/embeddings_health_check_mixin.py +31 -0
- rasa/shared/utils/health_check/health_check.py +258 -0
- rasa/shared/utils/health_check/llm_health_check_mixin.py +31 -0
- rasa/shared/utils/io.py +499 -0
- rasa/shared/utils/llm.py +764 -0
- rasa/shared/utils/pykwalify_extensions.py +27 -0
- rasa/shared/utils/schemas/__init__.py +0 -0
- rasa/shared/utils/schemas/config.yml +2 -0
- rasa/shared/utils/schemas/domain.yml +145 -0
- rasa/shared/utils/schemas/events.py +214 -0
- rasa/shared/utils/schemas/model_config.yml +36 -0
- rasa/shared/utils/schemas/stories.yml +173 -0
- rasa/shared/utils/yaml.py +1068 -0
- rasa/studio/__init__.py +0 -0
- rasa/studio/auth.py +270 -0
- rasa/studio/config.py +136 -0
- rasa/studio/constants.py +19 -0
- rasa/studio/data_handler.py +368 -0
- rasa/studio/download.py +489 -0
- rasa/studio/results_logger.py +137 -0
- rasa/studio/train.py +134 -0
- rasa/studio/upload.py +563 -0
- rasa/telemetry.py +1876 -0
- rasa/tracing/__init__.py +0 -0
- rasa/tracing/config.py +355 -0
- rasa/tracing/constants.py +62 -0
- rasa/tracing/instrumentation/__init__.py +0 -0
- rasa/tracing/instrumentation/attribute_extractors.py +765 -0
- rasa/tracing/instrumentation/instrumentation.py +1306 -0
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +144 -0
- rasa/tracing/instrumentation/metrics.py +294 -0
- rasa/tracing/metric_instrument_provider.py +205 -0
- rasa/utils/__init__.py +0 -0
- rasa/utils/beta.py +83 -0
- rasa/utils/cli.py +28 -0
- rasa/utils/common.py +639 -0
- rasa/utils/converter.py +53 -0
- rasa/utils/endpoints.py +331 -0
- rasa/utils/io.py +252 -0
- rasa/utils/json_utils.py +60 -0
- rasa/utils/licensing.py +542 -0
- rasa/utils/log_utils.py +181 -0
- rasa/utils/mapper.py +210 -0
- rasa/utils/ml_utils.py +147 -0
- rasa/utils/plotting.py +362 -0
- rasa/utils/sanic_error_handler.py +32 -0
- rasa/utils/singleton.py +23 -0
- rasa/utils/tensorflow/__init__.py +0 -0
- rasa/utils/tensorflow/callback.py +112 -0
- rasa/utils/tensorflow/constants.py +116 -0
- rasa/utils/tensorflow/crf.py +492 -0
- rasa/utils/tensorflow/data_generator.py +440 -0
- rasa/utils/tensorflow/environment.py +161 -0
- rasa/utils/tensorflow/exceptions.py +5 -0
- rasa/utils/tensorflow/feature_array.py +366 -0
- rasa/utils/tensorflow/layers.py +1565 -0
- rasa/utils/tensorflow/layers_utils.py +113 -0
- rasa/utils/tensorflow/metrics.py +281 -0
- rasa/utils/tensorflow/model_data.py +798 -0
- rasa/utils/tensorflow/model_data_utils.py +499 -0
- rasa/utils/tensorflow/models.py +935 -0
- rasa/utils/tensorflow/rasa_layers.py +1094 -0
- rasa/utils/tensorflow/transformer.py +640 -0
- rasa/utils/tensorflow/types.py +6 -0
- rasa/utils/train_utils.py +572 -0
- rasa/utils/url_tools.py +53 -0
- rasa/utils/yaml.py +54 -0
- rasa/validator.py +1644 -0
- rasa/version.py +3 -0
- rasa_pro-3.12.0.dev1.dist-info/METADATA +199 -0
- rasa_pro-3.12.0.dev1.dist-info/NOTICE +5 -0
- rasa_pro-3.12.0.dev1.dist-info/RECORD +790 -0
- rasa_pro-3.12.0.dev1.dist-info/WHEEL +4 -0
- rasa_pro-3.12.0.dev1.dist-info/entry_points.txt +3 -0
rasa/engine/graph.py
ADDED
|
@@ -0,0 +1,642 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import dataclasses
|
|
4
|
+
from abc import ABC, abstractmethod
|
|
5
|
+
from dataclasses import dataclass, field
|
|
6
|
+
from typing import Any, Callable, Dict, List, Optional, Text, Type, Tuple, Union
|
|
7
|
+
|
|
8
|
+
import structlog
|
|
9
|
+
import asyncio
|
|
10
|
+
|
|
11
|
+
import rasa.shared.utils.common
|
|
12
|
+
import rasa.utils.common
|
|
13
|
+
from rasa.engine.exceptions import (
|
|
14
|
+
GraphComponentException,
|
|
15
|
+
GraphRunError,
|
|
16
|
+
GraphSchemaException,
|
|
17
|
+
)
|
|
18
|
+
from rasa.engine.storage.resource import Resource
|
|
19
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
20
|
+
from rasa.shared.data import TrainingType
|
|
21
|
+
from rasa.shared.exceptions import InvalidConfigException, RasaException
|
|
22
|
+
|
|
23
|
+
structlogger = structlog.get_logger()
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclass
|
|
27
|
+
class SchemaNode:
|
|
28
|
+
"""Represents one node in the schema.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
needs: describes which parameters in `fn` (or `constructor_name`
|
|
32
|
+
if `eager==False`) are filled by which parent nodes.
|
|
33
|
+
uses: The class which models the behavior of this specific graph node.
|
|
34
|
+
constructor_name: The name of the constructor which should be used to
|
|
35
|
+
instantiate the component. If `eager==False` then the `constructor` can
|
|
36
|
+
also specify parameters which are filled by parent nodes. This is e.g.
|
|
37
|
+
useful if a parent node returns a `Resource` and this node wants to
|
|
38
|
+
directly load itself from this resource.
|
|
39
|
+
fn: The name of the function which should be called on the instantiated
|
|
40
|
+
component when the graph is executed. The parameters from `needs` are
|
|
41
|
+
filled from the parent nodes.
|
|
42
|
+
config: The user's configuration for this graph node. This configuration
|
|
43
|
+
does not need to be specify all possible parameters; the default values
|
|
44
|
+
for missing parameters will be filled in later.
|
|
45
|
+
eager: If `eager` then the component is instantiated before the graph is run.
|
|
46
|
+
Otherwise it's instantiated as the graph runs (lazily). Usually we always
|
|
47
|
+
instantiated lazily during training and eagerly during inference (to
|
|
48
|
+
avoid that the first prediction takes longer).
|
|
49
|
+
is_target: If `True` then this node can't be pruned during fingerprinting
|
|
50
|
+
(it might be replaced with a cached value though). This is e.g. used for
|
|
51
|
+
all components which train as their result always needs to be added to
|
|
52
|
+
the model archive so that the data is available during inference.
|
|
53
|
+
is_input: Nodes with `is_input` are _always_ run (also during the fingerprint
|
|
54
|
+
run). This makes sure that we e.g. detect changes in file contents.
|
|
55
|
+
resource: If given, then the graph node is loaded from an existing resource
|
|
56
|
+
instead of instantiated from scratch. This is e.g. used to load a trained
|
|
57
|
+
component for predictions.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
needs: Dict[Text, Text]
|
|
61
|
+
uses: Type[GraphComponent]
|
|
62
|
+
constructor_name: Text
|
|
63
|
+
fn: Text
|
|
64
|
+
config: Dict[Text, Any]
|
|
65
|
+
eager: bool = False
|
|
66
|
+
is_target: bool = False
|
|
67
|
+
is_input: bool = False
|
|
68
|
+
resource: Optional[Resource] = None
|
|
69
|
+
|
|
70
|
+
def matches_type(self, node_type: Type, include_subtypes: bool = True) -> bool:
|
|
71
|
+
"""Checks if schema node's 'uses' is of specified node type.
|
|
72
|
+
By default, it also checks for subtypes of the specified node type.
|
|
73
|
+
"""
|
|
74
|
+
return (self.uses is node_type) or (
|
|
75
|
+
include_subtypes and issubclass(self.uses, node_type)
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@dataclass
|
|
80
|
+
class GraphSchema:
|
|
81
|
+
"""Represents a graph for training a model or making predictions."""
|
|
82
|
+
|
|
83
|
+
nodes: Dict[Text, SchemaNode]
|
|
84
|
+
|
|
85
|
+
def as_dict(self) -> Dict[Text, Any]:
|
|
86
|
+
"""Returns graph schema in a serializable format.
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
The graph schema in a format which can be dumped as JSON or other formats.
|
|
90
|
+
"""
|
|
91
|
+
serializable_graph_schema: Dict[Text, Dict[Text, Any]] = {"nodes": {}}
|
|
92
|
+
for node_name, node in self.nodes.items():
|
|
93
|
+
serializable = dataclasses.asdict(node)
|
|
94
|
+
|
|
95
|
+
# Classes are not JSON serializable (surprise)
|
|
96
|
+
serializable["uses"] = f"{node.uses.__module__}.{node.uses.__name__}"
|
|
97
|
+
|
|
98
|
+
serializable_graph_schema["nodes"][node_name] = serializable
|
|
99
|
+
|
|
100
|
+
return serializable_graph_schema
|
|
101
|
+
|
|
102
|
+
@classmethod
|
|
103
|
+
def from_dict(cls, serialized_graph_schema: Dict[Text, Any]) -> GraphSchema:
|
|
104
|
+
"""Loads a graph schema which has been serialized using `schema.as_dict()`.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
serialized_graph_schema: A serialized graph schema.
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
A properly loaded schema.
|
|
111
|
+
|
|
112
|
+
Raises:
|
|
113
|
+
GraphSchemaException: In case the component class for a node couldn't be
|
|
114
|
+
found.
|
|
115
|
+
"""
|
|
116
|
+
nodes = {}
|
|
117
|
+
for node_name, serialized_node in serialized_graph_schema["nodes"].items():
|
|
118
|
+
try:
|
|
119
|
+
serialized_node["uses"] = (
|
|
120
|
+
rasa.shared.utils.common.class_from_module_path(
|
|
121
|
+
serialized_node["uses"]
|
|
122
|
+
)
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
resource = serialized_node["resource"]
|
|
126
|
+
if resource:
|
|
127
|
+
serialized_node["resource"] = Resource(**resource)
|
|
128
|
+
|
|
129
|
+
except ImportError as e:
|
|
130
|
+
raise GraphSchemaException(
|
|
131
|
+
"Error deserializing graph schema. Can't "
|
|
132
|
+
"find class for graph component type "
|
|
133
|
+
f"'{serialized_node['uses']}'."
|
|
134
|
+
) from e
|
|
135
|
+
|
|
136
|
+
nodes[node_name] = SchemaNode(**serialized_node)
|
|
137
|
+
|
|
138
|
+
return GraphSchema(nodes)
|
|
139
|
+
|
|
140
|
+
@property
|
|
141
|
+
def target_names(self) -> List[Text]:
|
|
142
|
+
"""Returns the names of all target nodes."""
|
|
143
|
+
return [node_name for node_name, node in self.nodes.items() if node.is_target]
|
|
144
|
+
|
|
145
|
+
def minimal_graph_schema(self, targets: Optional[List[Text]] = None) -> GraphSchema:
|
|
146
|
+
"""Returns a new schema where all nodes are a descendant of a target."""
|
|
147
|
+
dependencies = self._all_dependencies_schema(
|
|
148
|
+
targets if targets else self.target_names
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
return GraphSchema(
|
|
152
|
+
{
|
|
153
|
+
node_name: node
|
|
154
|
+
for node_name, node in self.nodes.items()
|
|
155
|
+
if node_name in dependencies
|
|
156
|
+
}
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
def _all_dependencies_schema(self, targets: List[Text]) -> List[Text]:
|
|
160
|
+
required = []
|
|
161
|
+
for target in targets:
|
|
162
|
+
required.append(target)
|
|
163
|
+
try:
|
|
164
|
+
target_dependencies = self.nodes[target].needs.values()
|
|
165
|
+
except KeyError: # This can happen if the target is an input placeholder.
|
|
166
|
+
continue
|
|
167
|
+
for dependency in target_dependencies:
|
|
168
|
+
required += self._all_dependencies_schema([dependency])
|
|
169
|
+
|
|
170
|
+
return required
|
|
171
|
+
|
|
172
|
+
def has_node(self, node_type: Type, include_subtypes: bool = True) -> bool:
|
|
173
|
+
"""Checks if the graph schema contains a node of the specified node type.
|
|
174
|
+
By default, it also checks for subtypes of the specified node type.
|
|
175
|
+
"""
|
|
176
|
+
for node in self.nodes.values():
|
|
177
|
+
if node.matches_type(node_type, include_subtypes):
|
|
178
|
+
return True
|
|
179
|
+
return False
|
|
180
|
+
|
|
181
|
+
def count_nodes_of_a_given_type(
|
|
182
|
+
self, node_type: Type, include_subtypes: bool = True
|
|
183
|
+
) -> int:
|
|
184
|
+
"""Counts the number of the nodes of specified class"""
|
|
185
|
+
counter = 0
|
|
186
|
+
for node in self.nodes.values():
|
|
187
|
+
if (node.uses is node_type) or (
|
|
188
|
+
include_subtypes and issubclass(node.uses, node_type)
|
|
189
|
+
):
|
|
190
|
+
counter += 1
|
|
191
|
+
return counter
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
class GraphComponent(ABC):
|
|
195
|
+
"""Interface for any component which will run in a graph."""
|
|
196
|
+
|
|
197
|
+
@classmethod
|
|
198
|
+
def required_components(cls) -> List[Type]:
|
|
199
|
+
"""Components that should be included in the pipeline before this component."""
|
|
200
|
+
return []
|
|
201
|
+
|
|
202
|
+
@classmethod
|
|
203
|
+
@abstractmethod
|
|
204
|
+
def create(
|
|
205
|
+
cls,
|
|
206
|
+
config: Dict[Text, Any],
|
|
207
|
+
model_storage: ModelStorage,
|
|
208
|
+
resource: Resource,
|
|
209
|
+
execution_context: ExecutionContext,
|
|
210
|
+
) -> GraphComponent:
|
|
211
|
+
"""Creates a new `GraphComponent`.
|
|
212
|
+
|
|
213
|
+
Args:
|
|
214
|
+
config: This config overrides the `default_config`.
|
|
215
|
+
model_storage: Storage which graph components can use to persist and load
|
|
216
|
+
themselves.
|
|
217
|
+
resource: Resource locator for this component which can be used to persist
|
|
218
|
+
and load itself from the `model_storage`.
|
|
219
|
+
execution_context: Information about the current graph run.
|
|
220
|
+
|
|
221
|
+
Returns: An instantiated `GraphComponent`.
|
|
222
|
+
"""
|
|
223
|
+
...
|
|
224
|
+
|
|
225
|
+
@classmethod
|
|
226
|
+
def load(
|
|
227
|
+
cls: Any,
|
|
228
|
+
config: Dict[Text, Any],
|
|
229
|
+
model_storage: ModelStorage,
|
|
230
|
+
resource: Resource,
|
|
231
|
+
execution_context: ExecutionContext,
|
|
232
|
+
**kwargs: Any,
|
|
233
|
+
) -> GraphComponent:
|
|
234
|
+
"""Creates a component using a persisted version of itself.
|
|
235
|
+
|
|
236
|
+
If not overridden this method merely calls `create`.
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
config: The config for this graph component. This is the default config of
|
|
240
|
+
the component merged with config specified by the user.
|
|
241
|
+
model_storage: Storage which graph components can use to persist and load
|
|
242
|
+
themselves.
|
|
243
|
+
resource: Resource locator for this component which can be used to persist
|
|
244
|
+
and load itself from the `model_storage`.
|
|
245
|
+
execution_context: Information about the current graph run.
|
|
246
|
+
kwargs: Output values from previous nodes might be passed in as `kwargs`.
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
An instantiated, loaded `GraphComponent`.
|
|
250
|
+
"""
|
|
251
|
+
return cls.create(config, model_storage, resource, execution_context)
|
|
252
|
+
|
|
253
|
+
@staticmethod
|
|
254
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
255
|
+
"""Returns the component's default config.
|
|
256
|
+
|
|
257
|
+
Default config and user config are merged by the `GraphNode` before the
|
|
258
|
+
config is passed to the `create` and `load` method of the component.
|
|
259
|
+
|
|
260
|
+
Returns:
|
|
261
|
+
The default config of the component.
|
|
262
|
+
"""
|
|
263
|
+
return {}
|
|
264
|
+
|
|
265
|
+
@staticmethod
|
|
266
|
+
def supported_languages() -> Optional[List[Text]]:
|
|
267
|
+
"""Determines which languages this component can work with.
|
|
268
|
+
|
|
269
|
+
Returns: A list of supported languages, or `None` to signify all are supported.
|
|
270
|
+
"""
|
|
271
|
+
return None
|
|
272
|
+
|
|
273
|
+
@staticmethod
|
|
274
|
+
def not_supported_languages() -> Optional[List[Text]]:
|
|
275
|
+
"""Determines which languages this component cannot work with.
|
|
276
|
+
|
|
277
|
+
Returns: A list of not supported languages, or
|
|
278
|
+
`None` to signify all are supported.
|
|
279
|
+
"""
|
|
280
|
+
return None
|
|
281
|
+
|
|
282
|
+
@staticmethod
|
|
283
|
+
def required_packages() -> List[Text]:
|
|
284
|
+
"""Any extra python dependencies required for this component to run."""
|
|
285
|
+
return []
|
|
286
|
+
|
|
287
|
+
@classmethod
|
|
288
|
+
def fingerprint_addon(cls: Any, config: Dict[str, Any]) -> Optional[str]:
|
|
289
|
+
"""Adds additional data to the fingerprint calculation.
|
|
290
|
+
|
|
291
|
+
This is useful if a component uses external data that is not provided
|
|
292
|
+
by the graph.
|
|
293
|
+
"""
|
|
294
|
+
return None
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
class GraphNodeHook(ABC):
|
|
298
|
+
"""Holds functionality to be run before and after a `GraphNode`."""
|
|
299
|
+
|
|
300
|
+
@abstractmethod
|
|
301
|
+
def on_before_node(
|
|
302
|
+
self,
|
|
303
|
+
node_name: Text,
|
|
304
|
+
execution_context: ExecutionContext,
|
|
305
|
+
config: Dict[Text, Any],
|
|
306
|
+
received_inputs: Dict[Text, Any],
|
|
307
|
+
) -> Dict:
|
|
308
|
+
"""Runs before the `GraphNode` executes.
|
|
309
|
+
|
|
310
|
+
Args:
|
|
311
|
+
node_name: The name of the node being run.
|
|
312
|
+
execution_context: The execution context of the current graph run.
|
|
313
|
+
config: The node's config.
|
|
314
|
+
received_inputs: Mapping from parameter name to input value.
|
|
315
|
+
|
|
316
|
+
Returns:
|
|
317
|
+
Data that is then passed to `on_after_node`
|
|
318
|
+
|
|
319
|
+
"""
|
|
320
|
+
...
|
|
321
|
+
|
|
322
|
+
@abstractmethod
|
|
323
|
+
def on_after_node(
|
|
324
|
+
self,
|
|
325
|
+
node_name: Text,
|
|
326
|
+
execution_context: ExecutionContext,
|
|
327
|
+
config: Dict[Text, Any],
|
|
328
|
+
output: Any,
|
|
329
|
+
input_hook_data: Dict,
|
|
330
|
+
) -> None:
|
|
331
|
+
"""Runs after the `GraphNode` as executed.
|
|
332
|
+
|
|
333
|
+
Args:
|
|
334
|
+
node_name: The name of the node that has run.
|
|
335
|
+
execution_context: The execution context of the current graph run.
|
|
336
|
+
config: The node's config.
|
|
337
|
+
output: The output of the node.
|
|
338
|
+
input_hook_data: Data returned from `on_before_node`.
|
|
339
|
+
"""
|
|
340
|
+
...
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
@dataclass
|
|
344
|
+
class ExecutionContext:
|
|
345
|
+
"""Holds information about a single graph run."""
|
|
346
|
+
|
|
347
|
+
graph_schema: GraphSchema = field(repr=False)
|
|
348
|
+
model_id: Optional[Text] = None
|
|
349
|
+
should_add_diagnostic_data: bool = False
|
|
350
|
+
is_finetuning: bool = False
|
|
351
|
+
# This is set by the `GraphNode` before it is passed to the `GraphComponent`.
|
|
352
|
+
node_name: Optional[Text] = None
|
|
353
|
+
|
|
354
|
+
def has_node(self, node_type: Type, include_subtypes: bool = True) -> bool:
|
|
355
|
+
"""Checks if the graph node of the given type is present in the graph schema.
|
|
356
|
+
By default, it also checks for subtypes of the specified node type.
|
|
357
|
+
"""
|
|
358
|
+
return self.graph_schema.has_node(node_type, include_subtypes)
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
class GraphNode:
|
|
362
|
+
"""Instantiates and runs a `GraphComponent` within a graph.
|
|
363
|
+
|
|
364
|
+
A `GraphNode` is a wrapper for a `GraphComponent` that allows it to be executed
|
|
365
|
+
in the context of a graph. It is responsible for instantiating the component at the
|
|
366
|
+
correct time, collecting the inputs from the parent nodes, running the run function
|
|
367
|
+
of the component and passing the output onwards.
|
|
368
|
+
"""
|
|
369
|
+
|
|
370
|
+
def __init__(
|
|
371
|
+
self,
|
|
372
|
+
node_name: Text,
|
|
373
|
+
component_class: Type[GraphComponent],
|
|
374
|
+
constructor_name: Text,
|
|
375
|
+
component_config: Dict[Text, Any],
|
|
376
|
+
fn_name: Text,
|
|
377
|
+
inputs: Dict[Text, Text],
|
|
378
|
+
eager: bool,
|
|
379
|
+
model_storage: ModelStorage,
|
|
380
|
+
resource: Optional[Resource],
|
|
381
|
+
execution_context: ExecutionContext,
|
|
382
|
+
hooks: Optional[List[GraphNodeHook]] = None,
|
|
383
|
+
) -> None:
|
|
384
|
+
"""Initializes `GraphNode`.
|
|
385
|
+
|
|
386
|
+
Args:
|
|
387
|
+
node_name: The name of the node in the schema.
|
|
388
|
+
component_class: The class to be instantiated and run.
|
|
389
|
+
constructor_name: The method used to instantiate the component.
|
|
390
|
+
component_config: Config to be passed to the component.
|
|
391
|
+
fn_name: The function on the instantiated `GraphComponent` to be run when
|
|
392
|
+
the node executes.
|
|
393
|
+
inputs: A map from input name to parent node name that provides it.
|
|
394
|
+
eager: Determines if the node is instantiated right away, or just before
|
|
395
|
+
being run.
|
|
396
|
+
model_storage: Storage which graph components can use to persist and load
|
|
397
|
+
themselves.
|
|
398
|
+
resource: If given the `GraphComponent` will be loaded from the
|
|
399
|
+
`model_storage` using the given resource.
|
|
400
|
+
execution_context: Information about the current graph run.
|
|
401
|
+
hooks: These are called before and after execution.
|
|
402
|
+
"""
|
|
403
|
+
self._node_name: Text = node_name
|
|
404
|
+
self._component_class: Type[GraphComponent] = component_class
|
|
405
|
+
self._constructor_name: Text = constructor_name
|
|
406
|
+
self._constructor_fn: Callable = getattr(
|
|
407
|
+
self._component_class, self._constructor_name
|
|
408
|
+
)
|
|
409
|
+
self._component_config: Dict[Text, Any] = rasa.utils.common.override_defaults(
|
|
410
|
+
self._component_class.get_default_config(), component_config
|
|
411
|
+
)
|
|
412
|
+
self._fn_name: Text = fn_name
|
|
413
|
+
self._fn: Callable = getattr(self._component_class, self._fn_name)
|
|
414
|
+
self._inputs: Dict[Text, Text] = inputs
|
|
415
|
+
self._eager: bool = eager
|
|
416
|
+
|
|
417
|
+
self._model_storage = model_storage
|
|
418
|
+
self._existing_resource = resource
|
|
419
|
+
|
|
420
|
+
self._execution_context: ExecutionContext = dataclasses.replace(
|
|
421
|
+
execution_context, node_name=self._node_name
|
|
422
|
+
)
|
|
423
|
+
|
|
424
|
+
self._hooks: List[GraphNodeHook] = hooks if hooks else []
|
|
425
|
+
|
|
426
|
+
self._component: Optional[GraphComponent] = None
|
|
427
|
+
if self._eager:
|
|
428
|
+
self._load_component()
|
|
429
|
+
|
|
430
|
+
def _load_component(self, **kwargs: Any) -> None:
|
|
431
|
+
structlogger.debug(
|
|
432
|
+
"graph.node.loading_component",
|
|
433
|
+
node_name=self._node_name,
|
|
434
|
+
clazz=self._component_class.__name__,
|
|
435
|
+
constructor=self._constructor_name,
|
|
436
|
+
kwargs=kwargs,
|
|
437
|
+
)
|
|
438
|
+
|
|
439
|
+
constructor = getattr(self._component_class, self._constructor_name)
|
|
440
|
+
try:
|
|
441
|
+
self._component: GraphComponent = constructor( # type: ignore[no-redef]
|
|
442
|
+
config=self._component_config,
|
|
443
|
+
model_storage=self._model_storage,
|
|
444
|
+
resource=self._get_resource(kwargs),
|
|
445
|
+
execution_context=self._execution_context,
|
|
446
|
+
**kwargs,
|
|
447
|
+
)
|
|
448
|
+
except InvalidConfigException:
|
|
449
|
+
# Pass through somewhat expected exception to allow more fine granular
|
|
450
|
+
# handling of exceptions.
|
|
451
|
+
raise
|
|
452
|
+
except Exception as e:
|
|
453
|
+
if not isinstance(e, RasaException):
|
|
454
|
+
raise GraphComponentException(
|
|
455
|
+
f"Error initializing graph component for node {self._node_name}."
|
|
456
|
+
) from e
|
|
457
|
+
else:
|
|
458
|
+
structlogger.error(
|
|
459
|
+
"graph.node.error_loading_component",
|
|
460
|
+
node_name=self._node_name,
|
|
461
|
+
)
|
|
462
|
+
raise
|
|
463
|
+
|
|
464
|
+
def _get_resource(self, kwargs: Dict[Text, Any]) -> Resource:
|
|
465
|
+
if "resource" in kwargs:
|
|
466
|
+
# A parent node provides resource during training. The component wrapped
|
|
467
|
+
# by this `GraphNode` will load itself from this resource.
|
|
468
|
+
return kwargs.pop("resource")
|
|
469
|
+
|
|
470
|
+
if self._existing_resource:
|
|
471
|
+
# The component should be loaded from a trained resource during inference.
|
|
472
|
+
# E.g. a classifier might train and persist itself during training and will
|
|
473
|
+
# then load itself from this resource during inference.
|
|
474
|
+
return self._existing_resource
|
|
475
|
+
|
|
476
|
+
# The component gets a chance to persist itself
|
|
477
|
+
return Resource(self._node_name)
|
|
478
|
+
|
|
479
|
+
async def __call__(
|
|
480
|
+
self, *inputs_from_previous_nodes: Union[Tuple[Text, Any], Text]
|
|
481
|
+
) -> Tuple[Text, Any]:
|
|
482
|
+
"""Calls the `GraphComponent` run method when the node executes in the graph.
|
|
483
|
+
|
|
484
|
+
Args:
|
|
485
|
+
*inputs_from_previous_nodes: The output of all parent nodes. Each is a
|
|
486
|
+
dictionary with a single item mapping the node's name to its output.
|
|
487
|
+
If the node couldn't be resolved and has no output, the node name is
|
|
488
|
+
provided instead of a tuple.
|
|
489
|
+
|
|
490
|
+
Returns:
|
|
491
|
+
The node name and its output.
|
|
492
|
+
"""
|
|
493
|
+
# filter out arguments that dask couldn't lookup
|
|
494
|
+
received_inputs: Dict[Text, Any] = {}
|
|
495
|
+
for i in inputs_from_previous_nodes:
|
|
496
|
+
if isinstance(i, tuple):
|
|
497
|
+
node_name, node_output = i
|
|
498
|
+
received_inputs[node_name] = node_output
|
|
499
|
+
else:
|
|
500
|
+
structlogger.warning(
|
|
501
|
+
"graph.node.input_not_resolved",
|
|
502
|
+
node_name=self._node_name,
|
|
503
|
+
input_name=i,
|
|
504
|
+
event_info=(
|
|
505
|
+
"Node input was not resolved, there is no putput. "
|
|
506
|
+
"Another component should have provided this as an output."
|
|
507
|
+
),
|
|
508
|
+
)
|
|
509
|
+
|
|
510
|
+
kwargs = {}
|
|
511
|
+
for input_name, input_provider_node_name in self._inputs.items():
|
|
512
|
+
if input_provider_node_name not in received_inputs:
|
|
513
|
+
raise GraphRunError(
|
|
514
|
+
f"Missing input to run node '{self._node_name}'. "
|
|
515
|
+
f"Expected input '{input_provider_node_name}' to "
|
|
516
|
+
f"provide parameter '{input_name}'."
|
|
517
|
+
)
|
|
518
|
+
kwargs[input_name] = received_inputs[input_provider_node_name]
|
|
519
|
+
|
|
520
|
+
input_hook_outputs = self._run_before_hooks(kwargs)
|
|
521
|
+
|
|
522
|
+
if not self._eager:
|
|
523
|
+
constructor_kwargs = rasa.shared.utils.common.minimal_kwargs(
|
|
524
|
+
kwargs, self._constructor_fn
|
|
525
|
+
)
|
|
526
|
+
self._load_component(**constructor_kwargs)
|
|
527
|
+
run_kwargs = {
|
|
528
|
+
k: v for k, v in kwargs.items() if k not in constructor_kwargs
|
|
529
|
+
}
|
|
530
|
+
else:
|
|
531
|
+
run_kwargs = kwargs
|
|
532
|
+
|
|
533
|
+
structlogger.debug(
|
|
534
|
+
"graph.node.running_component",
|
|
535
|
+
node_name=self._node_name,
|
|
536
|
+
clazz=self._component_class.__name__,
|
|
537
|
+
fn=self._fn_name,
|
|
538
|
+
)
|
|
539
|
+
|
|
540
|
+
try:
|
|
541
|
+
if asyncio.iscoroutinefunction(self._fn):
|
|
542
|
+
output = await self._fn(self._component, **run_kwargs)
|
|
543
|
+
else:
|
|
544
|
+
output = self._fn(self._component, **run_kwargs)
|
|
545
|
+
except InvalidConfigException:
|
|
546
|
+
# Pass through somewhat expected exception to allow more fine granular
|
|
547
|
+
# handling of exceptions.
|
|
548
|
+
raise
|
|
549
|
+
except Exception as e:
|
|
550
|
+
if not isinstance(e, RasaException):
|
|
551
|
+
raise GraphComponentException(
|
|
552
|
+
f"Error running graph component for node {self._node_name}."
|
|
553
|
+
) from e
|
|
554
|
+
else:
|
|
555
|
+
structlogger.error(
|
|
556
|
+
"graph.node.error_running_component",
|
|
557
|
+
node_name=self._node_name,
|
|
558
|
+
)
|
|
559
|
+
raise
|
|
560
|
+
|
|
561
|
+
self._run_after_hooks(input_hook_outputs, output)
|
|
562
|
+
|
|
563
|
+
return self._node_name, output
|
|
564
|
+
|
|
565
|
+
def _run_after_hooks(self, input_hook_outputs: List[Dict], output: Any) -> None:
|
|
566
|
+
for hook, hook_data in zip(self._hooks, input_hook_outputs):
|
|
567
|
+
try:
|
|
568
|
+
structlogger.debug(
|
|
569
|
+
"graph.node.hook.on_after_node",
|
|
570
|
+
node_name=self._node_name,
|
|
571
|
+
hook_name=hook.__class__.__name__,
|
|
572
|
+
)
|
|
573
|
+
hook.on_after_node(
|
|
574
|
+
node_name=self._node_name,
|
|
575
|
+
execution_context=self._execution_context,
|
|
576
|
+
config=self._component_config,
|
|
577
|
+
output=output,
|
|
578
|
+
input_hook_data=hook_data,
|
|
579
|
+
)
|
|
580
|
+
except Exception as e:
|
|
581
|
+
raise GraphComponentException(
|
|
582
|
+
f"Error running after hook for node '{self._node_name}'."
|
|
583
|
+
) from e
|
|
584
|
+
|
|
585
|
+
def _run_before_hooks(self, received_inputs: Dict[Text, Any]) -> List[Dict]:
|
|
586
|
+
input_hook_outputs = []
|
|
587
|
+
for hook in self._hooks:
|
|
588
|
+
try:
|
|
589
|
+
structlogger.debug(
|
|
590
|
+
"graph.node.hook.on_before_node",
|
|
591
|
+
node_name=self._node_name,
|
|
592
|
+
hook_name=hook.__class__.__name__,
|
|
593
|
+
)
|
|
594
|
+
hook_output = hook.on_before_node(
|
|
595
|
+
node_name=self._node_name,
|
|
596
|
+
execution_context=self._execution_context,
|
|
597
|
+
config=self._component_config,
|
|
598
|
+
received_inputs=received_inputs,
|
|
599
|
+
)
|
|
600
|
+
input_hook_outputs.append(hook_output)
|
|
601
|
+
except Exception as e:
|
|
602
|
+
raise GraphComponentException(
|
|
603
|
+
f"Error running before hook for node '{self._node_name}'."
|
|
604
|
+
) from e
|
|
605
|
+
return input_hook_outputs
|
|
606
|
+
|
|
607
|
+
@classmethod
|
|
608
|
+
def from_schema_node(
|
|
609
|
+
cls,
|
|
610
|
+
node_name: Text,
|
|
611
|
+
schema_node: SchemaNode,
|
|
612
|
+
model_storage: ModelStorage,
|
|
613
|
+
execution_context: ExecutionContext,
|
|
614
|
+
hooks: Optional[List[GraphNodeHook]] = None,
|
|
615
|
+
) -> GraphNode:
|
|
616
|
+
"""Creates a `GraphNode` from a `SchemaNode`."""
|
|
617
|
+
return cls(
|
|
618
|
+
node_name=node_name,
|
|
619
|
+
component_class=schema_node.uses,
|
|
620
|
+
constructor_name=schema_node.constructor_name,
|
|
621
|
+
component_config=schema_node.config,
|
|
622
|
+
fn_name=schema_node.fn,
|
|
623
|
+
inputs=schema_node.needs,
|
|
624
|
+
eager=schema_node.eager,
|
|
625
|
+
model_storage=model_storage,
|
|
626
|
+
execution_context=execution_context,
|
|
627
|
+
resource=schema_node.resource,
|
|
628
|
+
hooks=hooks,
|
|
629
|
+
)
|
|
630
|
+
|
|
631
|
+
|
|
632
|
+
@dataclass()
|
|
633
|
+
class GraphModelConfiguration:
|
|
634
|
+
"""The model configuration to run as a graph during training and prediction."""
|
|
635
|
+
|
|
636
|
+
train_schema: GraphSchema
|
|
637
|
+
predict_schema: GraphSchema
|
|
638
|
+
training_type: TrainingType
|
|
639
|
+
assistant_id: Optional[Text]
|
|
640
|
+
language: Optional[Text]
|
|
641
|
+
core_target: Optional[Text]
|
|
642
|
+
nlu_target: Optional[Text]
|
rasa/engine/loader.py
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from typing import Tuple, Type
|
|
3
|
+
|
|
4
|
+
from rasa.engine.graph import ExecutionContext
|
|
5
|
+
from rasa.engine.runner.interface import GraphRunner
|
|
6
|
+
from rasa.engine.storage.storage import ModelMetadata, ModelStorage
|
|
7
|
+
from rasa.engine.validation import (
|
|
8
|
+
validate_model_client_configuration_setup_during_inference_time,
|
|
9
|
+
validate_model_group_configuration_setup,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def load_predict_graph_runner(
|
|
14
|
+
storage_path: Path,
|
|
15
|
+
model_archive_path: Path,
|
|
16
|
+
model_storage_class: Type[ModelStorage],
|
|
17
|
+
graph_runner_class: Type[GraphRunner],
|
|
18
|
+
) -> Tuple[ModelMetadata, GraphRunner]:
|
|
19
|
+
"""Loads a model from an archive and creates the prediction graph runner.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
storage_path: Directory which contains the persisted graph components.
|
|
23
|
+
model_archive_path: The path to the model archive.
|
|
24
|
+
model_storage_class: The class to instantiate the model storage from.
|
|
25
|
+
graph_runner_class: The class to instantiate the runner from.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
A tuple containing the model metadata and the prediction graph runner.
|
|
29
|
+
"""
|
|
30
|
+
model_storage, model_metadata = model_storage_class.from_model_archive(
|
|
31
|
+
storage_path=storage_path, model_archive_path=model_archive_path
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
# Components using LLMs or embeddings can reference model groups defined in
|
|
35
|
+
# the endpoints.yml file for their client configurations. To ensure they will work
|
|
36
|
+
# properly validate model group references before loading
|
|
37
|
+
# the components.
|
|
38
|
+
validate_model_group_configuration_setup()
|
|
39
|
+
validate_model_client_configuration_setup_during_inference_time(model_metadata)
|
|
40
|
+
|
|
41
|
+
runner = graph_runner_class.create(
|
|
42
|
+
graph_schema=model_metadata.predict_schema,
|
|
43
|
+
model_storage=model_storage,
|
|
44
|
+
execution_context=ExecutionContext(
|
|
45
|
+
graph_schema=model_metadata.predict_schema, model_id=model_metadata.model_id
|
|
46
|
+
),
|
|
47
|
+
)
|
|
48
|
+
return model_metadata, runner
|
|
File without changes
|