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/core/agent.py
ADDED
|
@@ -0,0 +1,559 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import functools
|
|
4
|
+
import logging
|
|
5
|
+
import os
|
|
6
|
+
import uuid
|
|
7
|
+
from asyncio import AbstractEventLoop, CancelledError
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any, Callable, Dict, List, Optional, Text, Union
|
|
10
|
+
|
|
11
|
+
import aiohttp
|
|
12
|
+
from aiohttp import ClientError
|
|
13
|
+
|
|
14
|
+
import rasa.shared.utils.io
|
|
15
|
+
from rasa.core import jobs
|
|
16
|
+
from rasa.core.channels.channel import OutputChannel, UserMessage
|
|
17
|
+
from rasa.core.constants import DEFAULT_REQUEST_TIMEOUT
|
|
18
|
+
from rasa.core.exceptions import AgentNotReady
|
|
19
|
+
from rasa.core.http_interpreter import RasaNLUHttpInterpreter
|
|
20
|
+
from rasa.core.lock_store import InMemoryLockStore, LockStore
|
|
21
|
+
from rasa.core.nlg import NaturalLanguageGenerator, TemplatedNaturalLanguageGenerator
|
|
22
|
+
from rasa.core.persistor import StorageType
|
|
23
|
+
from rasa.core.policies.policy import PolicyPrediction
|
|
24
|
+
from rasa.core.processor import MessageProcessor
|
|
25
|
+
from rasa.core.tracker_store import (
|
|
26
|
+
FailSafeTrackerStore,
|
|
27
|
+
InMemoryTrackerStore,
|
|
28
|
+
TrackerStore,
|
|
29
|
+
)
|
|
30
|
+
from rasa.core.utils import AvailableEndpoints
|
|
31
|
+
from rasa.exceptions import ModelNotFound
|
|
32
|
+
from rasa.nlu.utils import is_url
|
|
33
|
+
from rasa.shared.constants import DEFAULT_SENDER_ID
|
|
34
|
+
from rasa.shared.core.domain import Domain
|
|
35
|
+
from rasa.shared.core.trackers import DialogueStateTracker, EventVerbosity
|
|
36
|
+
from rasa.shared.exceptions import RasaException
|
|
37
|
+
from rasa.utils.common import TempDirectoryPath, get_temp_dir_name
|
|
38
|
+
from rasa.utils.endpoints import EndpointConfig
|
|
39
|
+
|
|
40
|
+
logger = logging.getLogger(__name__)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
async def load_from_server(agent: Agent, model_server: EndpointConfig) -> Agent:
|
|
44
|
+
"""Load a persisted model from a server."""
|
|
45
|
+
# We are going to pull the model once first, and then schedule a recurring
|
|
46
|
+
# job. the benefit of this approach is that we can be sure that there
|
|
47
|
+
# is a model after this function completes -> allows to do proper
|
|
48
|
+
# "is alive" check on a startup server's `/status` endpoint. If the server
|
|
49
|
+
# is started, we can be sure that it also already loaded (or tried to)
|
|
50
|
+
# a model.
|
|
51
|
+
await _update_model_from_server(model_server, agent)
|
|
52
|
+
|
|
53
|
+
wait_time_between_pulls = model_server.kwargs.get("wait_time_between_pulls", 100)
|
|
54
|
+
|
|
55
|
+
if wait_time_between_pulls:
|
|
56
|
+
# continuously pull the model every `wait_time_between_pulls` seconds
|
|
57
|
+
await _schedule_model_pulling(model_server, int(wait_time_between_pulls), agent)
|
|
58
|
+
|
|
59
|
+
return agent
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _load_and_set_updated_model(
|
|
63
|
+
agent: Agent, model_directory: Text, fingerprint: Text
|
|
64
|
+
) -> None:
|
|
65
|
+
"""Load the persisted model into memory and set the model on the agent.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
agent: Instance of `Agent` to update with the new model.
|
|
69
|
+
model_directory: Rasa model directory.
|
|
70
|
+
fingerprint: Fingerprint of the supplied model at `model_directory`.
|
|
71
|
+
"""
|
|
72
|
+
logger.debug(f"Found new model with fingerprint {fingerprint}. Loading...")
|
|
73
|
+
agent.load_model(model_directory, fingerprint)
|
|
74
|
+
|
|
75
|
+
logger.debug("Finished updating agent to new model.")
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
async def _update_model_from_server(model_server: EndpointConfig, agent: Agent) -> None:
|
|
79
|
+
"""Load a zipped Rasa Core model from a URL and update the passed agent."""
|
|
80
|
+
if not is_url(model_server.url):
|
|
81
|
+
raise aiohttp.InvalidURL(model_server.url)
|
|
82
|
+
|
|
83
|
+
with TempDirectoryPath(get_temp_dir_name()) as temporary_directory:
|
|
84
|
+
try:
|
|
85
|
+
new_fingerprint = await _pull_model_and_fingerprint(
|
|
86
|
+
model_server, agent.fingerprint, temporary_directory
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
if new_fingerprint:
|
|
90
|
+
_load_and_set_updated_model(agent, temporary_directory, new_fingerprint)
|
|
91
|
+
else:
|
|
92
|
+
logger.debug(f"No new model found at URL {model_server.url}")
|
|
93
|
+
except Exception: # skipcq: PYL-W0703
|
|
94
|
+
# TODO: Make this exception more specific, possibly print different log
|
|
95
|
+
# for each one.
|
|
96
|
+
logger.exception(
|
|
97
|
+
"Failed to update model. The previous model will stay loaded instead."
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
async def _pull_model_and_fingerprint(
|
|
102
|
+
model_server: EndpointConfig, fingerprint: Optional[Text], model_directory: Text
|
|
103
|
+
) -> Optional[Text]:
|
|
104
|
+
"""Queries the model server.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
model_server: Model server endpoint information.
|
|
108
|
+
fingerprint: Current model fingerprint.
|
|
109
|
+
model_directory: Directory where to download model to.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
Value of the response's <ETag> header which contains the model
|
|
113
|
+
hash. Returns `None` if no new model is found.
|
|
114
|
+
"""
|
|
115
|
+
headers = {"If-None-Match": fingerprint}
|
|
116
|
+
|
|
117
|
+
logger.debug(f"Requesting model from server {model_server.url}...")
|
|
118
|
+
|
|
119
|
+
async with model_server.session() as session:
|
|
120
|
+
try:
|
|
121
|
+
params = model_server.combine_parameters()
|
|
122
|
+
async with session.request(
|
|
123
|
+
"GET",
|
|
124
|
+
model_server.url,
|
|
125
|
+
timeout=DEFAULT_REQUEST_TIMEOUT,
|
|
126
|
+
headers=headers,
|
|
127
|
+
params=params,
|
|
128
|
+
) as resp:
|
|
129
|
+
if resp.status in [204, 304]:
|
|
130
|
+
logger.debug(
|
|
131
|
+
"Model server returned {} status code, "
|
|
132
|
+
"indicating that no new model is available. "
|
|
133
|
+
"Current fingerprint: {}"
|
|
134
|
+
"".format(resp.status, fingerprint)
|
|
135
|
+
)
|
|
136
|
+
return None
|
|
137
|
+
elif resp.status == 404:
|
|
138
|
+
logger.debug(
|
|
139
|
+
"Model server could not find a model at the requested "
|
|
140
|
+
"endpoint '{}'. It's possible that no model has been "
|
|
141
|
+
"trained, or that the requested tag hasn't been "
|
|
142
|
+
"assigned.".format(model_server.url)
|
|
143
|
+
)
|
|
144
|
+
return None
|
|
145
|
+
elif resp.status != 200:
|
|
146
|
+
logger.debug(
|
|
147
|
+
"Tried to fetch model from server, but server response "
|
|
148
|
+
"status code is {}. We'll retry later..."
|
|
149
|
+
"".format(resp.status)
|
|
150
|
+
)
|
|
151
|
+
return None
|
|
152
|
+
|
|
153
|
+
model_path = Path(model_directory) / resp.headers.get(
|
|
154
|
+
"filename", "model.tar.gz"
|
|
155
|
+
)
|
|
156
|
+
with open(model_path, "wb") as file:
|
|
157
|
+
file.write(await resp.read())
|
|
158
|
+
|
|
159
|
+
logger.debug("Saved model to '{}'".format(os.path.abspath(model_path)))
|
|
160
|
+
|
|
161
|
+
# return the new fingerprint
|
|
162
|
+
return resp.headers.get("ETag")
|
|
163
|
+
|
|
164
|
+
except aiohttp.ClientError as e:
|
|
165
|
+
logger.debug(
|
|
166
|
+
"Tried to fetch model from server, but "
|
|
167
|
+
"couldn't reach server. We'll retry later... "
|
|
168
|
+
"Error: {}.".format(e)
|
|
169
|
+
)
|
|
170
|
+
return None
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
async def _run_model_pulling_worker(model_server: EndpointConfig, agent: Agent) -> None:
|
|
174
|
+
# noinspection PyBroadException
|
|
175
|
+
try:
|
|
176
|
+
await _update_model_from_server(model_server, agent)
|
|
177
|
+
except CancelledError:
|
|
178
|
+
logger.warning("Stopping model pulling (cancelled).")
|
|
179
|
+
except ClientError:
|
|
180
|
+
logger.exception(
|
|
181
|
+
"An exception was raised while fetching a model. Continuing anyways..."
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
async def _schedule_model_pulling(
|
|
186
|
+
model_server: EndpointConfig, wait_time_between_pulls: int, agent: Agent
|
|
187
|
+
) -> None:
|
|
188
|
+
(await jobs.scheduler()).add_job(
|
|
189
|
+
_run_model_pulling_worker,
|
|
190
|
+
"interval",
|
|
191
|
+
seconds=wait_time_between_pulls,
|
|
192
|
+
args=[model_server, agent],
|
|
193
|
+
id="pull-model-from-server",
|
|
194
|
+
replace_existing=True,
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
async def load_agent(
|
|
199
|
+
model_path: Optional[Text] = None,
|
|
200
|
+
model_server: Optional[EndpointConfig] = None,
|
|
201
|
+
remote_storage: Optional[StorageType] = None,
|
|
202
|
+
endpoints: Optional[AvailableEndpoints] = None,
|
|
203
|
+
loop: Optional[AbstractEventLoop] = None,
|
|
204
|
+
) -> Agent:
|
|
205
|
+
"""Loads agent from server, remote storage or disk.
|
|
206
|
+
|
|
207
|
+
Args:
|
|
208
|
+
model_path: Path to the model if it's on disk.
|
|
209
|
+
model_server: Configuration for a potential server which serves the model.
|
|
210
|
+
remote_storage: Remote storage to use for loading the model.
|
|
211
|
+
endpoints: Endpoint configuration.
|
|
212
|
+
loop: Optional async loop to pass to broker creation.
|
|
213
|
+
|
|
214
|
+
Returns:
|
|
215
|
+
The instantiated `Agent` or `None`.
|
|
216
|
+
"""
|
|
217
|
+
from rasa.core.brokers.broker import EventBroker
|
|
218
|
+
from rasa.core.tracker_store import TrackerStore
|
|
219
|
+
|
|
220
|
+
tracker_store = None
|
|
221
|
+
lock_store = None
|
|
222
|
+
generator = None
|
|
223
|
+
action_endpoint = None
|
|
224
|
+
http_interpreter = None
|
|
225
|
+
|
|
226
|
+
if endpoints:
|
|
227
|
+
broker = await EventBroker.create(endpoints.event_broker, loop=loop)
|
|
228
|
+
tracker_store = TrackerStore.create(
|
|
229
|
+
endpoints.tracker_store, event_broker=broker
|
|
230
|
+
)
|
|
231
|
+
lock_store = LockStore.create(endpoints.lock_store)
|
|
232
|
+
generator = endpoints.nlg
|
|
233
|
+
action_endpoint = endpoints.action
|
|
234
|
+
model_server = endpoints.model if endpoints.model else model_server
|
|
235
|
+
if endpoints.nlu:
|
|
236
|
+
http_interpreter = RasaNLUHttpInterpreter(endpoints.nlu)
|
|
237
|
+
|
|
238
|
+
agent = Agent(
|
|
239
|
+
generator=generator,
|
|
240
|
+
tracker_store=tracker_store,
|
|
241
|
+
lock_store=lock_store,
|
|
242
|
+
action_endpoint=action_endpoint,
|
|
243
|
+
model_server=model_server,
|
|
244
|
+
remote_storage=remote_storage,
|
|
245
|
+
http_interpreter=http_interpreter,
|
|
246
|
+
endpoints=endpoints,
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
try:
|
|
250
|
+
if model_server is not None:
|
|
251
|
+
return await load_from_server(agent, model_server)
|
|
252
|
+
|
|
253
|
+
elif remote_storage is not None:
|
|
254
|
+
agent.load_model_from_remote_storage(model_path)
|
|
255
|
+
|
|
256
|
+
elif model_path is not None and os.path.exists(model_path):
|
|
257
|
+
try:
|
|
258
|
+
agent.load_model(model_path)
|
|
259
|
+
except ModelNotFound:
|
|
260
|
+
rasa.shared.utils.io.raise_warning(
|
|
261
|
+
f"No valid model found at {model_path}!"
|
|
262
|
+
)
|
|
263
|
+
else:
|
|
264
|
+
rasa.shared.utils.io.raise_warning(
|
|
265
|
+
"No valid configuration given to load agent. "
|
|
266
|
+
"Agent loaded with no model!"
|
|
267
|
+
)
|
|
268
|
+
return agent
|
|
269
|
+
|
|
270
|
+
except Exception as e:
|
|
271
|
+
logger.error(f"Could not load model due to {e}.", exc_info=True)
|
|
272
|
+
return agent
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
def agent_must_be_ready(f: Callable[..., Any]) -> Callable[..., Any]:
|
|
276
|
+
"""Any Agent method decorated with this will raise if the agent is not ready."""
|
|
277
|
+
|
|
278
|
+
@functools.wraps(f)
|
|
279
|
+
def decorated(self: Agent, *args: Any, **kwargs: Any) -> Any:
|
|
280
|
+
if not self.is_ready():
|
|
281
|
+
raise AgentNotReady(
|
|
282
|
+
"Agent needs to be prepared before usage. You need to set a "
|
|
283
|
+
"processor and a tracker store."
|
|
284
|
+
)
|
|
285
|
+
return f(self, *args, **kwargs)
|
|
286
|
+
|
|
287
|
+
return decorated
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
class Agent:
|
|
291
|
+
"""The Agent class provides an interface for the most important Rasa functionality.
|
|
292
|
+
|
|
293
|
+
This includes training, handling messages, loading a dialogue model,
|
|
294
|
+
getting the next action, and handling a channel.
|
|
295
|
+
"""
|
|
296
|
+
|
|
297
|
+
def __init__(
|
|
298
|
+
self,
|
|
299
|
+
domain: Optional[Domain] = None,
|
|
300
|
+
generator: Union[EndpointConfig, NaturalLanguageGenerator, None] = None,
|
|
301
|
+
tracker_store: Optional[TrackerStore] = None,
|
|
302
|
+
lock_store: Optional[LockStore] = None,
|
|
303
|
+
action_endpoint: Optional[EndpointConfig] = None,
|
|
304
|
+
fingerprint: Optional[Text] = None,
|
|
305
|
+
model_server: Optional[EndpointConfig] = None,
|
|
306
|
+
remote_storage: Optional[StorageType] = None,
|
|
307
|
+
http_interpreter: Optional[RasaNLUHttpInterpreter] = None,
|
|
308
|
+
endpoints: Optional[AvailableEndpoints] = None,
|
|
309
|
+
):
|
|
310
|
+
"""Initializes an `Agent`."""
|
|
311
|
+
self.domain = domain
|
|
312
|
+
self.processor: Optional[MessageProcessor] = None
|
|
313
|
+
|
|
314
|
+
self.nlg = NaturalLanguageGenerator.create(generator, self.domain)
|
|
315
|
+
self.tracker_store = self._create_tracker_store(tracker_store, self.domain)
|
|
316
|
+
self.lock_store = self._create_lock_store(lock_store)
|
|
317
|
+
self.action_endpoint = action_endpoint
|
|
318
|
+
self.http_interpreter = http_interpreter
|
|
319
|
+
self.endpoints = endpoints
|
|
320
|
+
|
|
321
|
+
self._set_fingerprint(fingerprint)
|
|
322
|
+
self.model_server = model_server
|
|
323
|
+
self.remote_storage = remote_storage
|
|
324
|
+
|
|
325
|
+
@classmethod
|
|
326
|
+
def load(
|
|
327
|
+
cls,
|
|
328
|
+
model_path: Union[Text, Path],
|
|
329
|
+
domain: Optional[Domain] = None,
|
|
330
|
+
generator: Union[EndpointConfig, NaturalLanguageGenerator, None] = None,
|
|
331
|
+
tracker_store: Optional[TrackerStore] = None,
|
|
332
|
+
lock_store: Optional[LockStore] = None,
|
|
333
|
+
action_endpoint: Optional[EndpointConfig] = None,
|
|
334
|
+
fingerprint: Optional[Text] = None,
|
|
335
|
+
model_server: Optional[EndpointConfig] = None,
|
|
336
|
+
remote_storage: Optional[StorageType] = None,
|
|
337
|
+
http_interpreter: Optional[RasaNLUHttpInterpreter] = None,
|
|
338
|
+
endpoints: Optional[AvailableEndpoints] = None,
|
|
339
|
+
) -> Agent:
|
|
340
|
+
"""Constructs a new agent and loads the processor and model."""
|
|
341
|
+
agent = Agent(
|
|
342
|
+
domain=domain,
|
|
343
|
+
generator=generator,
|
|
344
|
+
tracker_store=tracker_store,
|
|
345
|
+
lock_store=lock_store,
|
|
346
|
+
action_endpoint=action_endpoint,
|
|
347
|
+
fingerprint=fingerprint,
|
|
348
|
+
model_server=model_server,
|
|
349
|
+
remote_storage=remote_storage,
|
|
350
|
+
http_interpreter=http_interpreter,
|
|
351
|
+
endpoints=endpoints,
|
|
352
|
+
)
|
|
353
|
+
agent.load_model(model_path=model_path, fingerprint=fingerprint)
|
|
354
|
+
return agent
|
|
355
|
+
|
|
356
|
+
def load_model(
|
|
357
|
+
self, model_path: Union[Text, Path], fingerprint: Optional[Text] = None
|
|
358
|
+
) -> None:
|
|
359
|
+
"""Loads the agent's model and processor given a new model path."""
|
|
360
|
+
self.processor = MessageProcessor(
|
|
361
|
+
model_path=model_path,
|
|
362
|
+
tracker_store=self.tracker_store,
|
|
363
|
+
lock_store=self.lock_store,
|
|
364
|
+
action_endpoint=self.action_endpoint,
|
|
365
|
+
generator=self.nlg,
|
|
366
|
+
http_interpreter=self.http_interpreter,
|
|
367
|
+
endpoints=self.endpoints,
|
|
368
|
+
)
|
|
369
|
+
self.domain = self.processor.domain
|
|
370
|
+
|
|
371
|
+
self._set_fingerprint(fingerprint)
|
|
372
|
+
|
|
373
|
+
# update domain on all instances
|
|
374
|
+
self.tracker_store.domain = self.domain
|
|
375
|
+
if isinstance(self.nlg, TemplatedNaturalLanguageGenerator):
|
|
376
|
+
self.nlg.responses = self.domain.responses if self.domain else {}
|
|
377
|
+
|
|
378
|
+
@property
|
|
379
|
+
def model_id(self) -> Optional[Text]:
|
|
380
|
+
"""Returns the model_id from processor's model_metadata."""
|
|
381
|
+
return self.processor.model_metadata.model_id if self.processor else None
|
|
382
|
+
|
|
383
|
+
@property
|
|
384
|
+
def model_name(self) -> Optional[Text]:
|
|
385
|
+
"""Returns the model name from processor's model_path."""
|
|
386
|
+
return self.processor.model_path.name if self.processor else None
|
|
387
|
+
|
|
388
|
+
def is_ready(self) -> bool:
|
|
389
|
+
"""Check if all necessary components are instantiated to use agent."""
|
|
390
|
+
return self.tracker_store is not None and self.processor is not None
|
|
391
|
+
|
|
392
|
+
@agent_must_be_ready
|
|
393
|
+
async def parse_message(self, message_data: Text) -> Dict[Text, Any]:
|
|
394
|
+
"""Handles message text and intent payload input messages.
|
|
395
|
+
|
|
396
|
+
The return value of this function is parsed_data.
|
|
397
|
+
|
|
398
|
+
Args:
|
|
399
|
+
message_data (Text): Contain the received message in text or\
|
|
400
|
+
intent payload format.
|
|
401
|
+
|
|
402
|
+
Returns:
|
|
403
|
+
The parsed message.
|
|
404
|
+
|
|
405
|
+
Example:
|
|
406
|
+
{\
|
|
407
|
+
"text": '/greet{"name":"Rasa"}',\
|
|
408
|
+
"intent": {"name": "greet", "confidence": 1.0},\
|
|
409
|
+
"intent_ranking": [{"name": "greet", "confidence": 1.0}],\
|
|
410
|
+
"entities": [{"entity": "name", "start": 6,\
|
|
411
|
+
"end": 21, "value": "Rasa"}],\
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
"""
|
|
415
|
+
message = UserMessage(message_data)
|
|
416
|
+
|
|
417
|
+
return await self.processor.parse_message(message) # type: ignore[union-attr]
|
|
418
|
+
|
|
419
|
+
async def handle_message(
|
|
420
|
+
self, message: UserMessage
|
|
421
|
+
) -> Optional[List[Dict[Text, Any]]]:
|
|
422
|
+
"""Handle a single message."""
|
|
423
|
+
if not self.is_ready():
|
|
424
|
+
logger.info("Ignoring message as there is no agent to handle it.")
|
|
425
|
+
return None
|
|
426
|
+
|
|
427
|
+
async with self.lock_store.lock(message.sender_id):
|
|
428
|
+
return await self.processor.handle_message( # type: ignore[union-attr]
|
|
429
|
+
message
|
|
430
|
+
)
|
|
431
|
+
|
|
432
|
+
@agent_must_be_ready
|
|
433
|
+
async def predict_next_for_sender_id(
|
|
434
|
+
self, sender_id: Text
|
|
435
|
+
) -> Optional[Dict[Text, Any]]:
|
|
436
|
+
"""Predict the next action for a sender id."""
|
|
437
|
+
return await self.processor.predict_next_for_sender_id( # type: ignore[union-attr]
|
|
438
|
+
sender_id
|
|
439
|
+
)
|
|
440
|
+
|
|
441
|
+
@agent_must_be_ready
|
|
442
|
+
async def predict_next_with_tracker(
|
|
443
|
+
self,
|
|
444
|
+
tracker: DialogueStateTracker,
|
|
445
|
+
verbosity: EventVerbosity = EventVerbosity.AFTER_RESTART,
|
|
446
|
+
) -> Optional[Dict[Text, Any]]:
|
|
447
|
+
"""Predicts the next action."""
|
|
448
|
+
return await self.processor.predict_next_with_tracker( # type: ignore[union-attr]
|
|
449
|
+
tracker, verbosity
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
@agent_must_be_ready
|
|
453
|
+
async def log_message(self, message: UserMessage) -> DialogueStateTracker:
|
|
454
|
+
"""Append a message to a dialogue - does not predict actions."""
|
|
455
|
+
return await self.processor.log_message(message) # type: ignore[union-attr]
|
|
456
|
+
|
|
457
|
+
@agent_must_be_ready
|
|
458
|
+
async def execute_action(
|
|
459
|
+
self,
|
|
460
|
+
sender_id: Text,
|
|
461
|
+
action: Text,
|
|
462
|
+
output_channel: OutputChannel,
|
|
463
|
+
policy: Optional[Text],
|
|
464
|
+
confidence: Optional[float],
|
|
465
|
+
) -> Optional[DialogueStateTracker]:
|
|
466
|
+
"""Executes an action."""
|
|
467
|
+
prediction = PolicyPrediction.for_action_name(
|
|
468
|
+
self.domain, action, policy, confidence or 0.0
|
|
469
|
+
)
|
|
470
|
+
return await self.processor.execute_action( # type: ignore[union-attr]
|
|
471
|
+
sender_id, action, output_channel, self.nlg, prediction
|
|
472
|
+
)
|
|
473
|
+
|
|
474
|
+
@agent_must_be_ready
|
|
475
|
+
async def trigger_intent(
|
|
476
|
+
self,
|
|
477
|
+
intent_name: Text,
|
|
478
|
+
entities: List[Dict[Text, Any]],
|
|
479
|
+
output_channel: OutputChannel,
|
|
480
|
+
tracker: DialogueStateTracker,
|
|
481
|
+
) -> None:
|
|
482
|
+
"""Trigger a user intent, e.g. triggered by an external event."""
|
|
483
|
+
await self.processor.trigger_external_user_uttered( # type: ignore[union-attr]
|
|
484
|
+
intent_name, entities, tracker, output_channel
|
|
485
|
+
)
|
|
486
|
+
|
|
487
|
+
@agent_must_be_ready
|
|
488
|
+
async def handle_text(
|
|
489
|
+
self,
|
|
490
|
+
text_message: Union[Text, Dict[Text, Any]],
|
|
491
|
+
output_channel: Optional[OutputChannel] = None,
|
|
492
|
+
sender_id: Optional[Text] = DEFAULT_SENDER_ID,
|
|
493
|
+
) -> Optional[List[Dict[Text, Any]]]:
|
|
494
|
+
"""Handle a single message.
|
|
495
|
+
|
|
496
|
+
If a message preprocessor is passed, the message will be passed to that
|
|
497
|
+
function first and the return value is then used as the
|
|
498
|
+
input for the dialogue engine.
|
|
499
|
+
|
|
500
|
+
The return value of this function depends on the ``output_channel``. If
|
|
501
|
+
the output channel is not set, set to ``None``, or set
|
|
502
|
+
to ``CollectingOutputChannel`` this function will return the messages
|
|
503
|
+
the bot wants to respond.
|
|
504
|
+
|
|
505
|
+
:Example:
|
|
506
|
+
|
|
507
|
+
>>> from rasa.core.agent import Agent
|
|
508
|
+
>>> agent = Agent.load("examples/moodbot/models")
|
|
509
|
+
>>> await agent.handle_text("hello")
|
|
510
|
+
[u'how can I help you?']
|
|
511
|
+
|
|
512
|
+
"""
|
|
513
|
+
if isinstance(text_message, str):
|
|
514
|
+
text_message = {"text": text_message}
|
|
515
|
+
|
|
516
|
+
msg = UserMessage(text_message.get("text"), output_channel, sender_id)
|
|
517
|
+
|
|
518
|
+
return await self.handle_message(msg)
|
|
519
|
+
|
|
520
|
+
def _set_fingerprint(self, fingerprint: Optional[Text] = None) -> None:
|
|
521
|
+
if fingerprint:
|
|
522
|
+
self.fingerprint = fingerprint
|
|
523
|
+
else:
|
|
524
|
+
self.fingerprint = uuid.uuid4().hex
|
|
525
|
+
|
|
526
|
+
@staticmethod
|
|
527
|
+
def _create_tracker_store(
|
|
528
|
+
store: Optional[TrackerStore], domain: Domain
|
|
529
|
+
) -> TrackerStore:
|
|
530
|
+
if store is not None:
|
|
531
|
+
store.domain = domain
|
|
532
|
+
tracker_store = store
|
|
533
|
+
else:
|
|
534
|
+
tracker_store = InMemoryTrackerStore(domain)
|
|
535
|
+
|
|
536
|
+
return FailSafeTrackerStore(tracker_store)
|
|
537
|
+
|
|
538
|
+
@staticmethod
|
|
539
|
+
def _create_lock_store(store: Optional[LockStore]) -> LockStore:
|
|
540
|
+
if store is not None:
|
|
541
|
+
return store
|
|
542
|
+
|
|
543
|
+
return InMemoryLockStore()
|
|
544
|
+
|
|
545
|
+
def load_model_from_remote_storage(self, model_name: Text) -> None:
|
|
546
|
+
"""Loads an Agent from remote storage."""
|
|
547
|
+
from rasa.core.persistor import get_persistor
|
|
548
|
+
|
|
549
|
+
persistor = get_persistor(self.remote_storage)
|
|
550
|
+
|
|
551
|
+
if persistor is not None:
|
|
552
|
+
with TempDirectoryPath(get_temp_dir_name()) as temporary_directory:
|
|
553
|
+
persistor.retrieve(model_name, temporary_directory)
|
|
554
|
+
self.load_model(temporary_directory)
|
|
555
|
+
|
|
556
|
+
else:
|
|
557
|
+
raise RasaException(
|
|
558
|
+
f"Persistor not found for remote storage: '{self.remote_storage}'."
|
|
559
|
+
)
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Iterable, Optional, Text
|
|
3
|
+
|
|
4
|
+
from rasa.core.brokers.broker import EventBroker
|
|
5
|
+
from rasa.core.tracker_store import TrackerStore, create_tracker_store
|
|
6
|
+
from rasa.shared.core.domain import Domain
|
|
7
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
8
|
+
from rasa.utils.endpoints import EndpointConfig
|
|
9
|
+
|
|
10
|
+
from rasa.core.secrets_manager.secret_manager import EndpointResolver
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
DEFAULT_RETRIES = 3
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class AuthRetryTrackerStore(TrackerStore):
|
|
18
|
+
"""Tracker store wrapper which implements retry mechanism in every abstract method.
|
|
19
|
+
|
|
20
|
+
The retry mechanism first updates credentials from the secret manager.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def __init__(
|
|
24
|
+
self,
|
|
25
|
+
domain: "Domain",
|
|
26
|
+
endpoint_config: "EndpointConfig",
|
|
27
|
+
retries: int = DEFAULT_RETRIES,
|
|
28
|
+
event_broker: Optional["EventBroker"] = None,
|
|
29
|
+
) -> None:
|
|
30
|
+
"""Initialise the tracker store wrapper."""
|
|
31
|
+
self.retries = self.validate_retries(retries)
|
|
32
|
+
self.endpoint_config = endpoint_config
|
|
33
|
+
|
|
34
|
+
self._tracker_store = self.recreate_tracker_store(domain, event_broker)
|
|
35
|
+
|
|
36
|
+
super().__init__(domain, event_broker)
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def domain(self) -> Domain:
|
|
40
|
+
"""Returns the domain of the wrapped tracker store."""
|
|
41
|
+
return self._tracker_store.domain
|
|
42
|
+
|
|
43
|
+
@domain.setter
|
|
44
|
+
def domain(self, domain: Optional[Domain]) -> None:
|
|
45
|
+
"""Sets the domain of wrapped tracker store."""
|
|
46
|
+
self._tracker_store.domain = domain or Domain.empty()
|
|
47
|
+
|
|
48
|
+
@staticmethod
|
|
49
|
+
def validate_retries(retries: int) -> int:
|
|
50
|
+
"""Validate the number of retries."""
|
|
51
|
+
if retries <= 0:
|
|
52
|
+
logger.warning(
|
|
53
|
+
f"Invalid number of retries: {retries}. "
|
|
54
|
+
f"Using default number of retries: {DEFAULT_RETRIES}."
|
|
55
|
+
)
|
|
56
|
+
return DEFAULT_RETRIES
|
|
57
|
+
else:
|
|
58
|
+
return retries
|
|
59
|
+
|
|
60
|
+
async def keys(self) -> Iterable[Text]:
|
|
61
|
+
"""Retries retrieving the keys if it fails."""
|
|
62
|
+
# add + 1 to retries because the retries are additional to the first attempt
|
|
63
|
+
for _ in range(self.retries + 1):
|
|
64
|
+
try:
|
|
65
|
+
return await self._tracker_store.keys()
|
|
66
|
+
except Exception as e:
|
|
67
|
+
logger.warning("Failed to retrieve keys. Retrying...", exc_info=e)
|
|
68
|
+
self._tracker_store = self.recreate_tracker_store(
|
|
69
|
+
self.domain, self.event_broker
|
|
70
|
+
)
|
|
71
|
+
else:
|
|
72
|
+
logger.error(f"Failed to retrieve keys after {self.retries} retries.")
|
|
73
|
+
return []
|
|
74
|
+
|
|
75
|
+
async def retrieve(self, sender_id: Text) -> Optional["DialogueStateTracker"]:
|
|
76
|
+
"""Retries retrieving the tracker if it fails."""
|
|
77
|
+
# add + 1 to retries because the retries are additional to the first attempt
|
|
78
|
+
for _ in range(self.retries + 1):
|
|
79
|
+
try:
|
|
80
|
+
return await self._tracker_store.retrieve(sender_id)
|
|
81
|
+
except Exception as e:
|
|
82
|
+
logger.warning(
|
|
83
|
+
f"Failed to retrieve tracker for {sender_id}. Retrying...",
|
|
84
|
+
exc_info=e,
|
|
85
|
+
)
|
|
86
|
+
self._tracker_store = self.recreate_tracker_store(
|
|
87
|
+
self.domain, self.event_broker
|
|
88
|
+
)
|
|
89
|
+
else:
|
|
90
|
+
logger.error(
|
|
91
|
+
f"Failed to retrieve tracker for {sender_id} "
|
|
92
|
+
f"after {self.retries} retries."
|
|
93
|
+
)
|
|
94
|
+
return None
|
|
95
|
+
|
|
96
|
+
async def save(self, tracker: "DialogueStateTracker") -> None:
|
|
97
|
+
"""Retries saving the tracker if it fails."""
|
|
98
|
+
# add + 1 to retries because the retries are additional to the first attempt
|
|
99
|
+
for _ in range(self.retries + 1):
|
|
100
|
+
try:
|
|
101
|
+
await self._tracker_store.save(tracker)
|
|
102
|
+
break
|
|
103
|
+
except Exception as e:
|
|
104
|
+
logger.warning(
|
|
105
|
+
f"Failed to save tracker for {tracker.sender_id}. Retrying...",
|
|
106
|
+
exc_info=e,
|
|
107
|
+
)
|
|
108
|
+
self._tracker_store = self.recreate_tracker_store(
|
|
109
|
+
self.domain, self.event_broker
|
|
110
|
+
)
|
|
111
|
+
else:
|
|
112
|
+
logger.error(
|
|
113
|
+
f"Failed to save tracker for {tracker.sender_id} "
|
|
114
|
+
f"after {self.retries} retries."
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
def recreate_tracker_store(
|
|
118
|
+
self, domain: "Domain", event_broker: Optional["EventBroker"] = None
|
|
119
|
+
) -> TrackerStore:
|
|
120
|
+
"""Recreate tracker store with updated credentials."""
|
|
121
|
+
endpoint_config = EndpointResolver.update_config(self.endpoint_config)
|
|
122
|
+
return create_tracker_store(endpoint_config, domain, event_broker)
|
|
File without changes
|