rasa-pro 3.12.0.dev1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- README.md +41 -0
- rasa/__init__.py +9 -0
- rasa/__main__.py +177 -0
- rasa/anonymization/__init__.py +2 -0
- rasa/anonymization/anonymisation_rule_yaml_reader.py +91 -0
- rasa/anonymization/anonymization_pipeline.py +286 -0
- rasa/anonymization/anonymization_rule_executor.py +260 -0
- rasa/anonymization/anonymization_rule_orchestrator.py +120 -0
- rasa/anonymization/schemas/config.yml +47 -0
- rasa/anonymization/utils.py +118 -0
- rasa/api.py +160 -0
- rasa/cli/__init__.py +5 -0
- rasa/cli/arguments/__init__.py +0 -0
- rasa/cli/arguments/data.py +106 -0
- rasa/cli/arguments/default_arguments.py +207 -0
- rasa/cli/arguments/evaluate.py +65 -0
- rasa/cli/arguments/export.py +51 -0
- rasa/cli/arguments/interactive.py +74 -0
- rasa/cli/arguments/run.py +219 -0
- rasa/cli/arguments/shell.py +17 -0
- rasa/cli/arguments/test.py +211 -0
- rasa/cli/arguments/train.py +279 -0
- rasa/cli/arguments/visualize.py +34 -0
- rasa/cli/arguments/x.py +30 -0
- rasa/cli/data.py +354 -0
- rasa/cli/dialogue_understanding_test.py +251 -0
- rasa/cli/e2e_test.py +259 -0
- rasa/cli/evaluate.py +222 -0
- rasa/cli/export.py +250 -0
- rasa/cli/inspect.py +75 -0
- rasa/cli/interactive.py +166 -0
- rasa/cli/license.py +65 -0
- rasa/cli/llm_fine_tuning.py +403 -0
- rasa/cli/markers.py +78 -0
- rasa/cli/project_templates/__init__.py +0 -0
- rasa/cli/project_templates/calm/actions/__init__.py +0 -0
- rasa/cli/project_templates/calm/actions/action_template.py +27 -0
- rasa/cli/project_templates/calm/actions/add_contact.py +30 -0
- rasa/cli/project_templates/calm/actions/db.py +57 -0
- rasa/cli/project_templates/calm/actions/list_contacts.py +22 -0
- rasa/cli/project_templates/calm/actions/remove_contact.py +35 -0
- rasa/cli/project_templates/calm/config.yml +10 -0
- rasa/cli/project_templates/calm/credentials.yml +33 -0
- rasa/cli/project_templates/calm/data/flows/add_contact.yml +31 -0
- rasa/cli/project_templates/calm/data/flows/list_contacts.yml +14 -0
- rasa/cli/project_templates/calm/data/flows/remove_contact.yml +29 -0
- rasa/cli/project_templates/calm/db/contacts.json +10 -0
- rasa/cli/project_templates/calm/domain/add_contact.yml +39 -0
- rasa/cli/project_templates/calm/domain/list_contacts.yml +17 -0
- rasa/cli/project_templates/calm/domain/remove_contact.yml +38 -0
- rasa/cli/project_templates/calm/domain/shared.yml +10 -0
- rasa/cli/project_templates/calm/e2e_tests/cancelations/user_cancels_during_a_correction.yml +16 -0
- rasa/cli/project_templates/calm/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +7 -0
- rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_handle.yml +20 -0
- rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_name.yml +19 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +15 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_lists_contacts.yml +5 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact.yml +11 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact_from_list.yml +12 -0
- rasa/cli/project_templates/calm/endpoints.yml +58 -0
- rasa/cli/project_templates/default/actions/__init__.py +0 -0
- rasa/cli/project_templates/default/actions/actions.py +27 -0
- rasa/cli/project_templates/default/config.yml +44 -0
- rasa/cli/project_templates/default/credentials.yml +33 -0
- rasa/cli/project_templates/default/data/nlu.yml +91 -0
- rasa/cli/project_templates/default/data/rules.yml +13 -0
- rasa/cli/project_templates/default/data/stories.yml +30 -0
- rasa/cli/project_templates/default/domain.yml +34 -0
- rasa/cli/project_templates/default/endpoints.yml +42 -0
- rasa/cli/project_templates/default/tests/test_stories.yml +91 -0
- rasa/cli/project_templates/tutorial/actions/__init__.py +0 -0
- rasa/cli/project_templates/tutorial/actions/actions.py +22 -0
- rasa/cli/project_templates/tutorial/config.yml +12 -0
- rasa/cli/project_templates/tutorial/credentials.yml +33 -0
- rasa/cli/project_templates/tutorial/data/flows.yml +8 -0
- rasa/cli/project_templates/tutorial/data/patterns.yml +11 -0
- rasa/cli/project_templates/tutorial/domain.yml +35 -0
- rasa/cli/project_templates/tutorial/endpoints.yml +55 -0
- rasa/cli/run.py +143 -0
- rasa/cli/scaffold.py +273 -0
- rasa/cli/shell.py +141 -0
- rasa/cli/studio/__init__.py +0 -0
- rasa/cli/studio/download.py +62 -0
- rasa/cli/studio/studio.py +296 -0
- rasa/cli/studio/train.py +59 -0
- rasa/cli/studio/upload.py +62 -0
- rasa/cli/telemetry.py +102 -0
- rasa/cli/test.py +280 -0
- rasa/cli/train.py +278 -0
- rasa/cli/utils.py +484 -0
- rasa/cli/visualize.py +40 -0
- rasa/cli/x.py +206 -0
- rasa/constants.py +45 -0
- rasa/core/__init__.py +17 -0
- rasa/core/actions/__init__.py +0 -0
- rasa/core/actions/action.py +1318 -0
- rasa/core/actions/action_clean_stack.py +59 -0
- rasa/core/actions/action_exceptions.py +24 -0
- rasa/core/actions/action_hangup.py +29 -0
- rasa/core/actions/action_repeat_bot_messages.py +89 -0
- rasa/core/actions/action_run_slot_rejections.py +210 -0
- rasa/core/actions/action_trigger_chitchat.py +31 -0
- rasa/core/actions/action_trigger_flow.py +109 -0
- rasa/core/actions/action_trigger_search.py +31 -0
- rasa/core/actions/constants.py +5 -0
- rasa/core/actions/custom_action_executor.py +191 -0
- rasa/core/actions/direct_custom_actions_executor.py +109 -0
- rasa/core/actions/e2e_stub_custom_action_executor.py +72 -0
- rasa/core/actions/forms.py +741 -0
- rasa/core/actions/grpc_custom_action_executor.py +251 -0
- rasa/core/actions/http_custom_action_executor.py +145 -0
- rasa/core/actions/loops.py +114 -0
- rasa/core/actions/two_stage_fallback.py +186 -0
- rasa/core/agent.py +559 -0
- rasa/core/auth_retry_tracker_store.py +122 -0
- rasa/core/brokers/__init__.py +0 -0
- rasa/core/brokers/broker.py +126 -0
- rasa/core/brokers/file.py +58 -0
- rasa/core/brokers/kafka.py +324 -0
- rasa/core/brokers/pika.py +388 -0
- rasa/core/brokers/sql.py +86 -0
- rasa/core/channels/__init__.py +61 -0
- rasa/core/channels/botframework.py +338 -0
- rasa/core/channels/callback.py +84 -0
- rasa/core/channels/channel.py +456 -0
- rasa/core/channels/console.py +241 -0
- rasa/core/channels/development_inspector.py +197 -0
- rasa/core/channels/facebook.py +419 -0
- rasa/core/channels/hangouts.py +329 -0
- rasa/core/channels/inspector/.eslintrc.cjs +25 -0
- rasa/core/channels/inspector/.gitignore +23 -0
- rasa/core/channels/inspector/README.md +54 -0
- rasa/core/channels/inspector/assets/favicon.ico +0 -0
- rasa/core/channels/inspector/assets/rasa-chat.js +2 -0
- rasa/core/channels/inspector/custom.d.ts +3 -0
- rasa/core/channels/inspector/dist/assets/arc-861ddd57.js +1 -0
- rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
- rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-921f02db.js +10 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-b436c4f8.js +2 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-511a23cb.js +2 -0
- rasa/core/channels/inspector/dist/assets/createText-62fc7601-ef476ecd.js +7 -0
- rasa/core/channels/inspector/dist/assets/edges-f2ad444c-f1878e0a.js +4 -0
- rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-fac75185.js +51 -0
- rasa/core/channels/inspector/dist/assets/flowDb-1972c806-201c5bbc.js +6 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-f904ae41.js +4 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +1 -0
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-1813da66.js +139 -0
- rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-872af172.js +266 -0
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-34a0af5a.js +70 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-128cfa44.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-21dbcb97.woff +0 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-222b5e26.svg +329 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-9ad89b2a.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-42ba3e3d.js +1 -0
- rasa/core/channels/inspector/dist/assets/index-37817b51.js +1317 -0
- rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
- rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-6b731386.js +7 -0
- rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
- rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-e8579ac6.js +139 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-60c05ee4.woff +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-8335d9b8.svg +438 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-9cc39c75.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-ead13ccf.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-16705655.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-5aeb07f9.woff +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9c459044.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9e2898a4.svg +435 -0
- rasa/core/channels/inspector/dist/assets/layout-89e6403a.js +1 -0
- rasa/core/channels/inspector/dist/assets/line-dc73d3fc.js +1 -0
- rasa/core/channels/inspector/dist/assets/linear-f5b1d2bc.js +1 -0
- rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-82cb74fa.js +109 -0
- rasa/core/channels/inspector/dist/assets/ordinal-ba9b4969.js +1 -0
- rasa/core/channels/inspector/dist/assets/path-53f90ab3.js +1 -0
- rasa/core/channels/inspector/dist/assets/pieDiagram-dbbf0591-bdf5f29b.js +35 -0
- rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-c7a0cbe4.js +7 -0
- rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-7ec5410f.js +52 -0
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-caee5554.js +8 -0
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-2935f8db.js +122 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-8f5d9693.js +1 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-d565d1de.js +1 -0
- rasa/core/channels/inspector/dist/assets/styles-080da4f6-75ad421d.js +110 -0
- rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-7e764226.js +159 -0
- rasa/core/channels/inspector/dist/assets/styles-9c745c82-7a4e0e61.js +207 -0
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-4019d1bf.js +1 -0
- rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-01ea12df.js +61 -0
- rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-89407137.js +7 -0
- rasa/core/channels/inspector/dist/index.html +42 -0
- rasa/core/channels/inspector/index.html +40 -0
- rasa/core/channels/inspector/jest.config.ts +13 -0
- rasa/core/channels/inspector/package.json +52 -0
- rasa/core/channels/inspector/setupTests.ts +2 -0
- rasa/core/channels/inspector/src/App.tsx +220 -0
- rasa/core/channels/inspector/src/components/Chat.tsx +95 -0
- rasa/core/channels/inspector/src/components/DiagramFlow.tsx +108 -0
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
- rasa/core/channels/inspector/src/components/DialogueStack.tsx +136 -0
- rasa/core/channels/inspector/src/components/ExpandIcon.tsx +16 -0
- rasa/core/channels/inspector/src/components/FullscreenButton.tsx +45 -0
- rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +22 -0
- rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +21 -0
- rasa/core/channels/inspector/src/components/RasaLogo.tsx +32 -0
- rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +39 -0
- rasa/core/channels/inspector/src/components/Slots.tsx +91 -0
- rasa/core/channels/inspector/src/components/Welcome.tsx +54 -0
- rasa/core/channels/inspector/src/helpers/audiostream.ts +191 -0
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +392 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +306 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +127 -0
- rasa/core/channels/inspector/src/main.tsx +13 -0
- rasa/core/channels/inspector/src/theme/Button/Button.ts +29 -0
- rasa/core/channels/inspector/src/theme/Heading/Heading.ts +31 -0
- rasa/core/channels/inspector/src/theme/Input/Input.ts +27 -0
- rasa/core/channels/inspector/src/theme/Link/Link.ts +10 -0
- rasa/core/channels/inspector/src/theme/Modal/Modal.ts +47 -0
- rasa/core/channels/inspector/src/theme/Table/Table.tsx +38 -0
- rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +12 -0
- rasa/core/channels/inspector/src/theme/base/breakpoints.ts +8 -0
- rasa/core/channels/inspector/src/theme/base/colors.ts +88 -0
- rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +29 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.svg +329 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.svg +438 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.svg +435 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/radii.ts +9 -0
- rasa/core/channels/inspector/src/theme/base/shadows.ts +7 -0
- rasa/core/channels/inspector/src/theme/base/sizes.ts +7 -0
- rasa/core/channels/inspector/src/theme/base/space.ts +15 -0
- rasa/core/channels/inspector/src/theme/base/styles.ts +13 -0
- rasa/core/channels/inspector/src/theme/base/typography.ts +24 -0
- rasa/core/channels/inspector/src/theme/base/zIndices.ts +19 -0
- rasa/core/channels/inspector/src/theme/index.ts +101 -0
- rasa/core/channels/inspector/src/types.ts +84 -0
- rasa/core/channels/inspector/src/vite-env.d.ts +1 -0
- rasa/core/channels/inspector/tests/__mocks__/fileMock.ts +1 -0
- rasa/core/channels/inspector/tests/__mocks__/matchMedia.ts +16 -0
- rasa/core/channels/inspector/tests/__mocks__/styleMock.ts +1 -0
- rasa/core/channels/inspector/tests/renderWithProviders.tsx +14 -0
- rasa/core/channels/inspector/tsconfig.json +26 -0
- rasa/core/channels/inspector/tsconfig.node.json +10 -0
- rasa/core/channels/inspector/vite.config.ts +8 -0
- rasa/core/channels/inspector/yarn.lock +6249 -0
- rasa/core/channels/mattermost.py +229 -0
- rasa/core/channels/rasa_chat.py +126 -0
- rasa/core/channels/rest.py +230 -0
- rasa/core/channels/rocketchat.py +174 -0
- rasa/core/channels/slack.py +620 -0
- rasa/core/channels/socketio.py +302 -0
- rasa/core/channels/telegram.py +298 -0
- rasa/core/channels/twilio.py +169 -0
- rasa/core/channels/vier_cvg.py +374 -0
- rasa/core/channels/voice_ready/__init__.py +0 -0
- rasa/core/channels/voice_ready/audiocodes.py +501 -0
- rasa/core/channels/voice_ready/jambonz.py +121 -0
- rasa/core/channels/voice_ready/jambonz_protocol.py +396 -0
- rasa/core/channels/voice_ready/twilio_voice.py +403 -0
- rasa/core/channels/voice_ready/utils.py +37 -0
- rasa/core/channels/voice_stream/__init__.py +0 -0
- rasa/core/channels/voice_stream/asr/__init__.py +0 -0
- rasa/core/channels/voice_stream/asr/asr_engine.py +89 -0
- rasa/core/channels/voice_stream/asr/asr_event.py +18 -0
- rasa/core/channels/voice_stream/asr/azure.py +130 -0
- rasa/core/channels/voice_stream/asr/deepgram.py +90 -0
- rasa/core/channels/voice_stream/audio_bytes.py +8 -0
- rasa/core/channels/voice_stream/browser_audio.py +107 -0
- rasa/core/channels/voice_stream/call_state.py +23 -0
- rasa/core/channels/voice_stream/tts/__init__.py +0 -0
- rasa/core/channels/voice_stream/tts/azure.py +106 -0
- rasa/core/channels/voice_stream/tts/cartesia.py +118 -0
- rasa/core/channels/voice_stream/tts/tts_cache.py +27 -0
- rasa/core/channels/voice_stream/tts/tts_engine.py +58 -0
- rasa/core/channels/voice_stream/twilio_media_streams.py +173 -0
- rasa/core/channels/voice_stream/util.py +57 -0
- rasa/core/channels/voice_stream/voice_channel.py +427 -0
- rasa/core/channels/webexteams.py +134 -0
- rasa/core/concurrent_lock_store.py +210 -0
- rasa/core/constants.py +112 -0
- rasa/core/evaluation/__init__.py +0 -0
- rasa/core/evaluation/marker.py +267 -0
- rasa/core/evaluation/marker_base.py +923 -0
- rasa/core/evaluation/marker_stats.py +293 -0
- rasa/core/evaluation/marker_tracker_loader.py +103 -0
- rasa/core/exceptions.py +29 -0
- rasa/core/exporter.py +284 -0
- rasa/core/featurizers/__init__.py +0 -0
- rasa/core/featurizers/precomputation.py +410 -0
- rasa/core/featurizers/single_state_featurizer.py +421 -0
- rasa/core/featurizers/tracker_featurizers.py +1262 -0
- rasa/core/http_interpreter.py +89 -0
- rasa/core/information_retrieval/__init__.py +7 -0
- rasa/core/information_retrieval/faiss.py +124 -0
- rasa/core/information_retrieval/information_retrieval.py +137 -0
- rasa/core/information_retrieval/milvus.py +59 -0
- rasa/core/information_retrieval/qdrant.py +96 -0
- rasa/core/jobs.py +63 -0
- rasa/core/lock.py +139 -0
- rasa/core/lock_store.py +343 -0
- rasa/core/migrate.py +403 -0
- rasa/core/nlg/__init__.py +3 -0
- rasa/core/nlg/callback.py +146 -0
- rasa/core/nlg/contextual_response_rephraser.py +320 -0
- rasa/core/nlg/generator.py +230 -0
- rasa/core/nlg/interpolator.py +143 -0
- rasa/core/nlg/response.py +155 -0
- rasa/core/nlg/summarize.py +70 -0
- rasa/core/persistor.py +538 -0
- rasa/core/policies/__init__.py +0 -0
- rasa/core/policies/ensemble.py +329 -0
- rasa/core/policies/enterprise_search_policy.py +905 -0
- rasa/core/policies/enterprise_search_prompt_template.jinja2 +25 -0
- rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +60 -0
- rasa/core/policies/flow_policy.py +205 -0
- rasa/core/policies/flows/__init__.py +0 -0
- rasa/core/policies/flows/flow_exceptions.py +44 -0
- rasa/core/policies/flows/flow_executor.py +754 -0
- rasa/core/policies/flows/flow_step_result.py +43 -0
- rasa/core/policies/intentless_policy.py +1031 -0
- rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
- rasa/core/policies/memoization.py +538 -0
- rasa/core/policies/policy.py +725 -0
- rasa/core/policies/rule_policy.py +1273 -0
- rasa/core/policies/ted_policy.py +2169 -0
- rasa/core/policies/unexpected_intent_policy.py +1022 -0
- rasa/core/processor.py +1465 -0
- rasa/core/run.py +342 -0
- rasa/core/secrets_manager/__init__.py +0 -0
- rasa/core/secrets_manager/constants.py +36 -0
- rasa/core/secrets_manager/endpoints.py +391 -0
- rasa/core/secrets_manager/factory.py +241 -0
- rasa/core/secrets_manager/secret_manager.py +262 -0
- rasa/core/secrets_manager/vault.py +584 -0
- rasa/core/test.py +1335 -0
- rasa/core/tracker_store.py +1703 -0
- rasa/core/train.py +105 -0
- rasa/core/training/__init__.py +89 -0
- rasa/core/training/converters/__init__.py +0 -0
- rasa/core/training/converters/responses_prefix_converter.py +119 -0
- rasa/core/training/interactive.py +1744 -0
- rasa/core/training/story_conflict.py +381 -0
- rasa/core/training/training.py +93 -0
- rasa/core/utils.py +366 -0
- rasa/core/visualize.py +70 -0
- rasa/dialogue_understanding/__init__.py +0 -0
- rasa/dialogue_understanding/coexistence/__init__.py +0 -0
- rasa/dialogue_understanding/coexistence/constants.py +4 -0
- rasa/dialogue_understanding/coexistence/intent_based_router.py +196 -0
- rasa/dialogue_understanding/coexistence/llm_based_router.py +327 -0
- rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
- rasa/dialogue_understanding/commands/__init__.py +61 -0
- rasa/dialogue_understanding/commands/can_not_handle_command.py +70 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +125 -0
- rasa/dialogue_understanding/commands/change_flow_command.py +44 -0
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +57 -0
- rasa/dialogue_understanding/commands/clarify_command.py +86 -0
- rasa/dialogue_understanding/commands/command.py +85 -0
- rasa/dialogue_understanding/commands/correct_slots_command.py +297 -0
- rasa/dialogue_understanding/commands/error_command.py +79 -0
- rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
- rasa/dialogue_understanding/commands/handle_code_change_command.py +73 -0
- rasa/dialogue_understanding/commands/human_handoff_command.py +66 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +57 -0
- rasa/dialogue_understanding/commands/noop_command.py +54 -0
- rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +60 -0
- rasa/dialogue_understanding/commands/restart_command.py +58 -0
- rasa/dialogue_understanding/commands/session_end_command.py +61 -0
- rasa/dialogue_understanding/commands/session_start_command.py +59 -0
- rasa/dialogue_understanding/commands/set_slot_command.py +160 -0
- rasa/dialogue_understanding/commands/skip_question_command.py +75 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +107 -0
- rasa/dialogue_understanding/commands/user_silence_command.py +59 -0
- rasa/dialogue_understanding/commands/utils.py +45 -0
- rasa/dialogue_understanding/generator/__init__.py +21 -0
- rasa/dialogue_understanding/generator/command_generator.py +464 -0
- rasa/dialogue_understanding/generator/constants.py +27 -0
- rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +466 -0
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +500 -0
- rasa/dialogue_understanding/generator/llm_command_generator.py +67 -0
- rasa/dialogue_understanding/generator/multi_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/multi_step/fill_slots_prompt.jinja2 +62 -0
- rasa/dialogue_understanding/generator/multi_step/handle_flows_prompt.jinja2 +38 -0
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +920 -0
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +261 -0
- rasa/dialogue_understanding/generator/single_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2 +60 -0
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +486 -0
- rasa/dialogue_understanding/patterns/__init__.py +0 -0
- rasa/dialogue_understanding/patterns/cancel.py +111 -0
- rasa/dialogue_understanding/patterns/cannot_handle.py +43 -0
- rasa/dialogue_understanding/patterns/chitchat.py +37 -0
- rasa/dialogue_understanding/patterns/clarify.py +97 -0
- rasa/dialogue_understanding/patterns/code_change.py +41 -0
- rasa/dialogue_understanding/patterns/collect_information.py +90 -0
- rasa/dialogue_understanding/patterns/completed.py +40 -0
- rasa/dialogue_understanding/patterns/continue_interrupted.py +42 -0
- rasa/dialogue_understanding/patterns/correction.py +278 -0
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +301 -0
- rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
- rasa/dialogue_understanding/patterns/internal_error.py +47 -0
- rasa/dialogue_understanding/patterns/repeat.py +37 -0
- rasa/dialogue_understanding/patterns/restart.py +37 -0
- rasa/dialogue_understanding/patterns/search.py +37 -0
- rasa/dialogue_understanding/patterns/session_start.py +37 -0
- rasa/dialogue_understanding/patterns/skip_question.py +38 -0
- rasa/dialogue_understanding/patterns/user_silence.py +37 -0
- rasa/dialogue_understanding/processor/__init__.py +0 -0
- rasa/dialogue_understanding/processor/command_processor.py +720 -0
- rasa/dialogue_understanding/processor/command_processor_component.py +43 -0
- rasa/dialogue_understanding/stack/__init__.py +0 -0
- rasa/dialogue_understanding/stack/dialogue_stack.py +178 -0
- rasa/dialogue_understanding/stack/frames/__init__.py +19 -0
- rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +27 -0
- rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +137 -0
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +157 -0
- rasa/dialogue_understanding/stack/frames/pattern_frame.py +10 -0
- rasa/dialogue_understanding/stack/frames/search_frame.py +27 -0
- rasa/dialogue_understanding/stack/utils.py +211 -0
- rasa/dialogue_understanding/utils.py +14 -0
- rasa/dialogue_understanding_test/__init__.py +0 -0
- rasa/dialogue_understanding_test/command_metric_calculation.py +12 -0
- rasa/dialogue_understanding_test/constants.py +17 -0
- rasa/dialogue_understanding_test/du_test_case.py +118 -0
- rasa/dialogue_understanding_test/du_test_result.py +11 -0
- rasa/dialogue_understanding_test/du_test_runner.py +93 -0
- rasa/dialogue_understanding_test/io.py +54 -0
- rasa/dialogue_understanding_test/validation.py +22 -0
- rasa/e2e_test/__init__.py +0 -0
- rasa/e2e_test/aggregate_test_stats_calculator.py +134 -0
- rasa/e2e_test/assertions.py +1345 -0
- rasa/e2e_test/assertions_schema.yml +129 -0
- rasa/e2e_test/constants.py +31 -0
- rasa/e2e_test/e2e_config.py +220 -0
- rasa/e2e_test/e2e_config_schema.yml +26 -0
- rasa/e2e_test/e2e_test_case.py +569 -0
- rasa/e2e_test/e2e_test_converter.py +363 -0
- rasa/e2e_test/e2e_test_converter_prompt.jinja2 +70 -0
- rasa/e2e_test/e2e_test_coverage_report.py +364 -0
- rasa/e2e_test/e2e_test_result.py +54 -0
- rasa/e2e_test/e2e_test_runner.py +1192 -0
- rasa/e2e_test/e2e_test_schema.yml +181 -0
- rasa/e2e_test/pykwalify_extensions.py +39 -0
- rasa/e2e_test/stub_custom_action.py +70 -0
- rasa/e2e_test/utils/__init__.py +0 -0
- rasa/e2e_test/utils/e2e_yaml_utils.py +55 -0
- rasa/e2e_test/utils/io.py +598 -0
- rasa/e2e_test/utils/validation.py +178 -0
- rasa/engine/__init__.py +0 -0
- rasa/engine/caching.py +463 -0
- rasa/engine/constants.py +17 -0
- rasa/engine/exceptions.py +14 -0
- rasa/engine/graph.py +642 -0
- rasa/engine/loader.py +48 -0
- rasa/engine/recipes/__init__.py +0 -0
- rasa/engine/recipes/config_files/default_config.yml +41 -0
- rasa/engine/recipes/default_components.py +97 -0
- rasa/engine/recipes/default_recipe.py +1272 -0
- rasa/engine/recipes/graph_recipe.py +79 -0
- rasa/engine/recipes/recipe.py +93 -0
- rasa/engine/runner/__init__.py +0 -0
- rasa/engine/runner/dask.py +250 -0
- rasa/engine/runner/interface.py +49 -0
- rasa/engine/storage/__init__.py +0 -0
- rasa/engine/storage/local_model_storage.py +244 -0
- rasa/engine/storage/resource.py +110 -0
- rasa/engine/storage/storage.py +199 -0
- rasa/engine/training/__init__.py +0 -0
- rasa/engine/training/components.py +176 -0
- rasa/engine/training/fingerprinting.py +64 -0
- rasa/engine/training/graph_trainer.py +256 -0
- rasa/engine/training/hooks.py +164 -0
- rasa/engine/validation.py +1451 -0
- rasa/env.py +14 -0
- rasa/exceptions.py +69 -0
- rasa/graph_components/__init__.py +0 -0
- rasa/graph_components/converters/__init__.py +0 -0
- rasa/graph_components/converters/nlu_message_converter.py +48 -0
- rasa/graph_components/providers/__init__.py +0 -0
- rasa/graph_components/providers/domain_for_core_training_provider.py +87 -0
- rasa/graph_components/providers/domain_provider.py +71 -0
- rasa/graph_components/providers/flows_provider.py +74 -0
- rasa/graph_components/providers/forms_provider.py +44 -0
- rasa/graph_components/providers/nlu_training_data_provider.py +56 -0
- rasa/graph_components/providers/responses_provider.py +44 -0
- rasa/graph_components/providers/rule_only_provider.py +49 -0
- rasa/graph_components/providers/story_graph_provider.py +96 -0
- rasa/graph_components/providers/training_tracker_provider.py +55 -0
- rasa/graph_components/validators/__init__.py +0 -0
- rasa/graph_components/validators/default_recipe_validator.py +550 -0
- rasa/graph_components/validators/finetuning_validator.py +302 -0
- rasa/hooks.py +111 -0
- rasa/jupyter.py +63 -0
- rasa/llm_fine_tuning/__init__.py +0 -0
- rasa/llm_fine_tuning/annotation_module.py +241 -0
- rasa/llm_fine_tuning/conversations.py +144 -0
- rasa/llm_fine_tuning/llm_data_preparation_module.py +178 -0
- rasa/llm_fine_tuning/paraphrasing/__init__.py +0 -0
- rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +281 -0
- rasa/llm_fine_tuning/paraphrasing/default_rephrase_prompt_template.jina2 +44 -0
- rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +121 -0
- rasa/llm_fine_tuning/paraphrasing/rephrased_user_message.py +10 -0
- rasa/llm_fine_tuning/paraphrasing_module.py +128 -0
- rasa/llm_fine_tuning/storage.py +174 -0
- rasa/llm_fine_tuning/train_test_split_module.py +441 -0
- rasa/markers/__init__.py +0 -0
- rasa/markers/marker.py +269 -0
- rasa/markers/marker_base.py +828 -0
- rasa/markers/upload.py +74 -0
- rasa/markers/validate.py +21 -0
- rasa/model.py +118 -0
- rasa/model_manager/__init__.py +0 -0
- rasa/model_manager/config.py +40 -0
- rasa/model_manager/model_api.py +559 -0
- rasa/model_manager/runner_service.py +286 -0
- rasa/model_manager/socket_bridge.py +146 -0
- rasa/model_manager/studio_jwt_auth.py +86 -0
- rasa/model_manager/trainer_service.py +325 -0
- rasa/model_manager/utils.py +87 -0
- rasa/model_manager/warm_rasa_process.py +187 -0
- rasa/model_service.py +112 -0
- rasa/model_testing.py +457 -0
- rasa/model_training.py +596 -0
- rasa/nlu/__init__.py +7 -0
- rasa/nlu/classifiers/__init__.py +3 -0
- rasa/nlu/classifiers/classifier.py +5 -0
- rasa/nlu/classifiers/diet_classifier.py +1881 -0
- rasa/nlu/classifiers/fallback_classifier.py +192 -0
- rasa/nlu/classifiers/keyword_intent_classifier.py +188 -0
- rasa/nlu/classifiers/logistic_regression_classifier.py +253 -0
- rasa/nlu/classifiers/mitie_intent_classifier.py +156 -0
- rasa/nlu/classifiers/regex_message_handler.py +56 -0
- rasa/nlu/classifiers/sklearn_intent_classifier.py +330 -0
- rasa/nlu/constants.py +77 -0
- rasa/nlu/convert.py +40 -0
- rasa/nlu/emulators/__init__.py +0 -0
- rasa/nlu/emulators/dialogflow.py +55 -0
- rasa/nlu/emulators/emulator.py +49 -0
- rasa/nlu/emulators/luis.py +86 -0
- rasa/nlu/emulators/no_emulator.py +10 -0
- rasa/nlu/emulators/wit.py +56 -0
- rasa/nlu/extractors/__init__.py +0 -0
- rasa/nlu/extractors/crf_entity_extractor.py +715 -0
- rasa/nlu/extractors/duckling_entity_extractor.py +206 -0
- rasa/nlu/extractors/entity_synonyms.py +178 -0
- rasa/nlu/extractors/extractor.py +470 -0
- rasa/nlu/extractors/mitie_entity_extractor.py +293 -0
- rasa/nlu/extractors/regex_entity_extractor.py +220 -0
- rasa/nlu/extractors/spacy_entity_extractor.py +95 -0
- rasa/nlu/featurizers/__init__.py +0 -0
- rasa/nlu/featurizers/dense_featurizer/__init__.py +0 -0
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +445 -0
- rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +768 -0
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +170 -0
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +132 -0
- rasa/nlu/featurizers/featurizer.py +89 -0
- rasa/nlu/featurizers/sparse_featurizer/__init__.py +0 -0
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +867 -0
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +571 -0
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +271 -0
- rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
- rasa/nlu/model.py +24 -0
- rasa/nlu/run.py +27 -0
- rasa/nlu/selectors/__init__.py +0 -0
- rasa/nlu/selectors/response_selector.py +987 -0
- rasa/nlu/test.py +1940 -0
- rasa/nlu/tokenizers/__init__.py +0 -0
- rasa/nlu/tokenizers/jieba_tokenizer.py +148 -0
- rasa/nlu/tokenizers/mitie_tokenizer.py +75 -0
- rasa/nlu/tokenizers/spacy_tokenizer.py +72 -0
- rasa/nlu/tokenizers/tokenizer.py +239 -0
- rasa/nlu/tokenizers/whitespace_tokenizer.py +95 -0
- rasa/nlu/utils/__init__.py +35 -0
- rasa/nlu/utils/bilou_utils.py +462 -0
- rasa/nlu/utils/hugging_face/__init__.py +0 -0
- rasa/nlu/utils/hugging_face/registry.py +108 -0
- rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +311 -0
- rasa/nlu/utils/mitie_utils.py +113 -0
- rasa/nlu/utils/pattern_utils.py +168 -0
- rasa/nlu/utils/spacy_utils.py +310 -0
- rasa/plugin.py +90 -0
- rasa/server.py +1588 -0
- rasa/shared/__init__.py +0 -0
- rasa/shared/constants.py +311 -0
- rasa/shared/core/__init__.py +0 -0
- rasa/shared/core/command_payload_reader.py +109 -0
- rasa/shared/core/constants.py +180 -0
- rasa/shared/core/conversation.py +46 -0
- rasa/shared/core/domain.py +2172 -0
- rasa/shared/core/events.py +2559 -0
- rasa/shared/core/flows/__init__.py +7 -0
- rasa/shared/core/flows/flow.py +562 -0
- rasa/shared/core/flows/flow_path.py +84 -0
- rasa/shared/core/flows/flow_step.py +146 -0
- rasa/shared/core/flows/flow_step_links.py +319 -0
- rasa/shared/core/flows/flow_step_sequence.py +70 -0
- rasa/shared/core/flows/flows_list.py +258 -0
- rasa/shared/core/flows/flows_yaml_schema.json +303 -0
- rasa/shared/core/flows/nlu_trigger.py +117 -0
- rasa/shared/core/flows/steps/__init__.py +24 -0
- rasa/shared/core/flows/steps/action.py +56 -0
- rasa/shared/core/flows/steps/call.py +64 -0
- rasa/shared/core/flows/steps/collect.py +112 -0
- rasa/shared/core/flows/steps/constants.py +5 -0
- rasa/shared/core/flows/steps/continuation.py +36 -0
- rasa/shared/core/flows/steps/end.py +22 -0
- rasa/shared/core/flows/steps/internal.py +44 -0
- rasa/shared/core/flows/steps/link.py +51 -0
- rasa/shared/core/flows/steps/no_operation.py +48 -0
- rasa/shared/core/flows/steps/set_slots.py +50 -0
- rasa/shared/core/flows/steps/start.py +30 -0
- rasa/shared/core/flows/utils.py +39 -0
- rasa/shared/core/flows/validation.py +735 -0
- rasa/shared/core/flows/yaml_flows_io.py +405 -0
- rasa/shared/core/generator.py +908 -0
- rasa/shared/core/slot_mappings.py +526 -0
- rasa/shared/core/slots.py +654 -0
- rasa/shared/core/trackers.py +1183 -0
- rasa/shared/core/training_data/__init__.py +0 -0
- rasa/shared/core/training_data/loading.py +89 -0
- rasa/shared/core/training_data/story_reader/__init__.py +0 -0
- rasa/shared/core/training_data/story_reader/story_reader.py +129 -0
- rasa/shared/core/training_data/story_reader/story_step_builder.py +168 -0
- rasa/shared/core/training_data/story_reader/yaml_story_reader.py +888 -0
- rasa/shared/core/training_data/story_writer/__init__.py +0 -0
- rasa/shared/core/training_data/story_writer/story_writer.py +76 -0
- rasa/shared/core/training_data/story_writer/yaml_story_writer.py +444 -0
- rasa/shared/core/training_data/structures.py +858 -0
- rasa/shared/core/training_data/visualization.html +146 -0
- rasa/shared/core/training_data/visualization.py +603 -0
- rasa/shared/data.py +249 -0
- rasa/shared/engine/__init__.py +0 -0
- rasa/shared/engine/caching.py +26 -0
- rasa/shared/exceptions.py +167 -0
- rasa/shared/importers/__init__.py +0 -0
- rasa/shared/importers/importer.py +770 -0
- rasa/shared/importers/multi_project.py +215 -0
- rasa/shared/importers/rasa.py +108 -0
- rasa/shared/importers/remote_importer.py +196 -0
- rasa/shared/importers/utils.py +36 -0
- rasa/shared/nlu/__init__.py +0 -0
- rasa/shared/nlu/constants.py +53 -0
- rasa/shared/nlu/interpreter.py +10 -0
- rasa/shared/nlu/training_data/__init__.py +0 -0
- rasa/shared/nlu/training_data/entities_parser.py +208 -0
- rasa/shared/nlu/training_data/features.py +492 -0
- rasa/shared/nlu/training_data/formats/__init__.py +10 -0
- rasa/shared/nlu/training_data/formats/dialogflow.py +163 -0
- rasa/shared/nlu/training_data/formats/luis.py +87 -0
- rasa/shared/nlu/training_data/formats/rasa.py +135 -0
- rasa/shared/nlu/training_data/formats/rasa_yaml.py +618 -0
- rasa/shared/nlu/training_data/formats/readerwriter.py +244 -0
- rasa/shared/nlu/training_data/formats/wit.py +52 -0
- rasa/shared/nlu/training_data/loading.py +137 -0
- rasa/shared/nlu/training_data/lookup_tables_parser.py +30 -0
- rasa/shared/nlu/training_data/message.py +490 -0
- rasa/shared/nlu/training_data/schemas/__init__.py +0 -0
- rasa/shared/nlu/training_data/schemas/data_schema.py +85 -0
- rasa/shared/nlu/training_data/schemas/nlu.yml +53 -0
- rasa/shared/nlu/training_data/schemas/responses.yml +70 -0
- rasa/shared/nlu/training_data/synonyms_parser.py +42 -0
- rasa/shared/nlu/training_data/training_data.py +729 -0
- rasa/shared/nlu/training_data/util.py +223 -0
- rasa/shared/providers/__init__.py +0 -0
- rasa/shared/providers/_configs/__init__.py +0 -0
- rasa/shared/providers/_configs/azure_openai_client_config.py +677 -0
- rasa/shared/providers/_configs/client_config.py +59 -0
- rasa/shared/providers/_configs/default_litellm_client_config.py +132 -0
- rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +236 -0
- rasa/shared/providers/_configs/litellm_router_client_config.py +222 -0
- rasa/shared/providers/_configs/model_group_config.py +173 -0
- rasa/shared/providers/_configs/openai_client_config.py +177 -0
- rasa/shared/providers/_configs/rasa_llm_client_config.py +75 -0
- rasa/shared/providers/_configs/self_hosted_llm_client_config.py +178 -0
- rasa/shared/providers/_configs/utils.py +117 -0
- rasa/shared/providers/_ssl_verification_utils.py +124 -0
- rasa/shared/providers/_utils.py +79 -0
- rasa/shared/providers/constants.py +7 -0
- rasa/shared/providers/embedding/__init__.py +0 -0
- rasa/shared/providers/embedding/_base_litellm_embedding_client.py +243 -0
- rasa/shared/providers/embedding/_langchain_embedding_client_adapter.py +74 -0
- rasa/shared/providers/embedding/azure_openai_embedding_client.py +335 -0
- rasa/shared/providers/embedding/default_litellm_embedding_client.py +126 -0
- rasa/shared/providers/embedding/embedding_client.py +90 -0
- rasa/shared/providers/embedding/embedding_response.py +41 -0
- rasa/shared/providers/embedding/huggingface_local_embedding_client.py +191 -0
- rasa/shared/providers/embedding/litellm_router_embedding_client.py +138 -0
- rasa/shared/providers/embedding/openai_embedding_client.py +172 -0
- rasa/shared/providers/llm/__init__.py +0 -0
- rasa/shared/providers/llm/_base_litellm_client.py +265 -0
- rasa/shared/providers/llm/azure_openai_llm_client.py +415 -0
- rasa/shared/providers/llm/default_litellm_llm_client.py +110 -0
- rasa/shared/providers/llm/litellm_router_llm_client.py +202 -0
- rasa/shared/providers/llm/llm_client.py +78 -0
- rasa/shared/providers/llm/llm_response.py +50 -0
- rasa/shared/providers/llm/openai_llm_client.py +161 -0
- rasa/shared/providers/llm/rasa_llm_client.py +120 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +276 -0
- rasa/shared/providers/mappings.py +94 -0
- rasa/shared/providers/router/__init__.py +0 -0
- rasa/shared/providers/router/_base_litellm_router_client.py +185 -0
- rasa/shared/providers/router/router_client.py +75 -0
- rasa/shared/utils/__init__.py +0 -0
- rasa/shared/utils/cli.py +102 -0
- rasa/shared/utils/common.py +324 -0
- rasa/shared/utils/constants.py +4 -0
- rasa/shared/utils/health_check/__init__.py +0 -0
- rasa/shared/utils/health_check/embeddings_health_check_mixin.py +31 -0
- rasa/shared/utils/health_check/health_check.py +258 -0
- rasa/shared/utils/health_check/llm_health_check_mixin.py +31 -0
- rasa/shared/utils/io.py +499 -0
- rasa/shared/utils/llm.py +764 -0
- rasa/shared/utils/pykwalify_extensions.py +27 -0
- rasa/shared/utils/schemas/__init__.py +0 -0
- rasa/shared/utils/schemas/config.yml +2 -0
- rasa/shared/utils/schemas/domain.yml +145 -0
- rasa/shared/utils/schemas/events.py +214 -0
- rasa/shared/utils/schemas/model_config.yml +36 -0
- rasa/shared/utils/schemas/stories.yml +173 -0
- rasa/shared/utils/yaml.py +1068 -0
- rasa/studio/__init__.py +0 -0
- rasa/studio/auth.py +270 -0
- rasa/studio/config.py +136 -0
- rasa/studio/constants.py +19 -0
- rasa/studio/data_handler.py +368 -0
- rasa/studio/download.py +489 -0
- rasa/studio/results_logger.py +137 -0
- rasa/studio/train.py +134 -0
- rasa/studio/upload.py +563 -0
- rasa/telemetry.py +1876 -0
- rasa/tracing/__init__.py +0 -0
- rasa/tracing/config.py +355 -0
- rasa/tracing/constants.py +62 -0
- rasa/tracing/instrumentation/__init__.py +0 -0
- rasa/tracing/instrumentation/attribute_extractors.py +765 -0
- rasa/tracing/instrumentation/instrumentation.py +1306 -0
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +144 -0
- rasa/tracing/instrumentation/metrics.py +294 -0
- rasa/tracing/metric_instrument_provider.py +205 -0
- rasa/utils/__init__.py +0 -0
- rasa/utils/beta.py +83 -0
- rasa/utils/cli.py +28 -0
- rasa/utils/common.py +639 -0
- rasa/utils/converter.py +53 -0
- rasa/utils/endpoints.py +331 -0
- rasa/utils/io.py +252 -0
- rasa/utils/json_utils.py +60 -0
- rasa/utils/licensing.py +542 -0
- rasa/utils/log_utils.py +181 -0
- rasa/utils/mapper.py +210 -0
- rasa/utils/ml_utils.py +147 -0
- rasa/utils/plotting.py +362 -0
- rasa/utils/sanic_error_handler.py +32 -0
- rasa/utils/singleton.py +23 -0
- rasa/utils/tensorflow/__init__.py +0 -0
- rasa/utils/tensorflow/callback.py +112 -0
- rasa/utils/tensorflow/constants.py +116 -0
- rasa/utils/tensorflow/crf.py +492 -0
- rasa/utils/tensorflow/data_generator.py +440 -0
- rasa/utils/tensorflow/environment.py +161 -0
- rasa/utils/tensorflow/exceptions.py +5 -0
- rasa/utils/tensorflow/feature_array.py +366 -0
- rasa/utils/tensorflow/layers.py +1565 -0
- rasa/utils/tensorflow/layers_utils.py +113 -0
- rasa/utils/tensorflow/metrics.py +281 -0
- rasa/utils/tensorflow/model_data.py +798 -0
- rasa/utils/tensorflow/model_data_utils.py +499 -0
- rasa/utils/tensorflow/models.py +935 -0
- rasa/utils/tensorflow/rasa_layers.py +1094 -0
- rasa/utils/tensorflow/transformer.py +640 -0
- rasa/utils/tensorflow/types.py +6 -0
- rasa/utils/train_utils.py +572 -0
- rasa/utils/url_tools.py +53 -0
- rasa/utils/yaml.py +54 -0
- rasa/validator.py +1644 -0
- rasa/version.py +3 -0
- rasa_pro-3.12.0.dev1.dist-info/METADATA +199 -0
- rasa_pro-3.12.0.dev1.dist-info/NOTICE +5 -0
- rasa_pro-3.12.0.dev1.dist-info/RECORD +790 -0
- rasa_pro-3.12.0.dev1.dist-info/WHEEL +4 -0
- rasa_pro-3.12.0.dev1.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import importlib
|
|
4
|
+
from typing import Any, Dict, List, Optional
|
|
5
|
+
|
|
6
|
+
import structlog
|
|
7
|
+
from jinja2 import Template
|
|
8
|
+
|
|
9
|
+
import rasa.shared.utils.io
|
|
10
|
+
from rasa.dialogue_understanding.coexistence.constants import (
|
|
11
|
+
CALM_ENTRY,
|
|
12
|
+
NLU_ENTRY,
|
|
13
|
+
STICKY,
|
|
14
|
+
NON_STICKY,
|
|
15
|
+
)
|
|
16
|
+
from rasa.dialogue_understanding.commands import Command, SetSlotCommand
|
|
17
|
+
from rasa.dialogue_understanding.commands.noop_command import NoopCommand
|
|
18
|
+
from rasa.dialogue_understanding.generator.constants import (
|
|
19
|
+
LLM_CONFIG_KEY,
|
|
20
|
+
)
|
|
21
|
+
from rasa.engine.graph import ExecutionContext, GraphComponent
|
|
22
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
23
|
+
from rasa.engine.storage.resource import Resource
|
|
24
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
25
|
+
from rasa.shared.constants import (
|
|
26
|
+
ROUTE_TO_CALM_SLOT,
|
|
27
|
+
PROMPT_CONFIG_KEY,
|
|
28
|
+
PROVIDER_CONFIG_KEY,
|
|
29
|
+
MODEL_CONFIG_KEY,
|
|
30
|
+
OPENAI_PROVIDER,
|
|
31
|
+
TIMEOUT_CONFIG_KEY,
|
|
32
|
+
)
|
|
33
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
34
|
+
from rasa.shared.exceptions import InvalidConfigException, FileIOException
|
|
35
|
+
from rasa.shared.nlu.constants import COMMANDS, TEXT
|
|
36
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
37
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
38
|
+
from rasa.shared.utils.health_check.llm_health_check_mixin import LLMHealthCheckMixin
|
|
39
|
+
from rasa.shared.utils.io import deep_container_fingerprint
|
|
40
|
+
from rasa.shared.utils.llm import (
|
|
41
|
+
DEFAULT_OPENAI_CHAT_MODEL_NAME,
|
|
42
|
+
get_prompt_template,
|
|
43
|
+
llm_factory,
|
|
44
|
+
resolve_model_client_config,
|
|
45
|
+
)
|
|
46
|
+
from rasa.utils.log_utils import log_llm
|
|
47
|
+
|
|
48
|
+
LLM_BASED_ROUTER_PROMPT_FILE_NAME = "llm_based_router_prompt.jinja2"
|
|
49
|
+
DEFAULT_COMMAND_PROMPT_TEMPLATE = importlib.resources.read_text(
|
|
50
|
+
"rasa.dialogue_understanding.coexistence", "router_template.jinja2"
|
|
51
|
+
)
|
|
52
|
+
LLM_BASED_ROUTER_CONFIG_FILE_NAME = "config.json"
|
|
53
|
+
|
|
54
|
+
# Token ids for gpt 3.5 and gpt 4 corresponding to space + capitalized Letter
|
|
55
|
+
A_TO_C_TOKEN_IDS_CHATGPT = [
|
|
56
|
+
362, # " A"
|
|
57
|
+
426, # " B"
|
|
58
|
+
356, # " C"
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
DEFAULT_LLM_CONFIG = {
|
|
62
|
+
PROVIDER_CONFIG_KEY: OPENAI_PROVIDER,
|
|
63
|
+
MODEL_CONFIG_KEY: DEFAULT_OPENAI_CHAT_MODEL_NAME,
|
|
64
|
+
TIMEOUT_CONFIG_KEY: 7,
|
|
65
|
+
"temperature": 0.0,
|
|
66
|
+
"max_tokens": 1,
|
|
67
|
+
"logit_bias": {str(token_id): 100 for token_id in A_TO_C_TOKEN_IDS_CHATGPT},
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
structlogger = structlog.get_logger()
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@DefaultV1Recipe.register(
|
|
74
|
+
[
|
|
75
|
+
DefaultV1Recipe.ComponentType.COEXISTENCE_ROUTER,
|
|
76
|
+
],
|
|
77
|
+
is_trainable=True,
|
|
78
|
+
)
|
|
79
|
+
class LLMBasedRouter(LLMHealthCheckMixin, GraphComponent):
|
|
80
|
+
@staticmethod
|
|
81
|
+
def get_default_config() -> Dict[str, Any]:
|
|
82
|
+
"""The component's default config (see parent class for full docstring)."""
|
|
83
|
+
return {
|
|
84
|
+
PROMPT_CONFIG_KEY: None,
|
|
85
|
+
CALM_ENTRY: {STICKY: None},
|
|
86
|
+
NLU_ENTRY: {
|
|
87
|
+
NON_STICKY: "handles chitchat",
|
|
88
|
+
STICKY: "handles everything else",
|
|
89
|
+
},
|
|
90
|
+
LLM_CONFIG_KEY: None,
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
def __init__(
|
|
94
|
+
self,
|
|
95
|
+
config: Dict[str, Any],
|
|
96
|
+
model_storage: ModelStorage,
|
|
97
|
+
resource: Resource,
|
|
98
|
+
prompt_template: Optional[str] = None,
|
|
99
|
+
) -> None:
|
|
100
|
+
self.config = {**self.get_default_config(), **config}
|
|
101
|
+
self.config[LLM_CONFIG_KEY] = resolve_model_client_config(
|
|
102
|
+
self.config.get(LLM_CONFIG_KEY), LLMBasedRouter.__name__
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
self.prompt_template = (
|
|
106
|
+
prompt_template
|
|
107
|
+
or get_prompt_template(
|
|
108
|
+
config.get(PROMPT_CONFIG_KEY),
|
|
109
|
+
DEFAULT_COMMAND_PROMPT_TEMPLATE,
|
|
110
|
+
).strip()
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
self._model_storage = model_storage
|
|
114
|
+
self._resource = resource
|
|
115
|
+
self.validate_config()
|
|
116
|
+
|
|
117
|
+
def validate_config(self) -> None:
|
|
118
|
+
"""Validate the config of the router."""
|
|
119
|
+
if (
|
|
120
|
+
self.config[CALM_ENTRY] is None
|
|
121
|
+
or not isinstance(self.config[CALM_ENTRY], dict)
|
|
122
|
+
or STICKY not in self.config[CALM_ENTRY]
|
|
123
|
+
or self.config[CALM_ENTRY][STICKY] is None
|
|
124
|
+
):
|
|
125
|
+
raise ValueError(
|
|
126
|
+
"The LLMBasedRouter component needs a proper "
|
|
127
|
+
"description of the capabilities implemented in the CALM "
|
|
128
|
+
"part of the bot."
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
def persist(self) -> None:
|
|
132
|
+
"""Persist this component to disk for future loading."""
|
|
133
|
+
with self._model_storage.write_to(self._resource) as path:
|
|
134
|
+
rasa.shared.utils.io.write_text_file(
|
|
135
|
+
self.prompt_template, path / LLM_BASED_ROUTER_PROMPT_FILE_NAME
|
|
136
|
+
)
|
|
137
|
+
rasa.shared.utils.io.dump_obj_as_json_to_file(
|
|
138
|
+
path / LLM_BASED_ROUTER_CONFIG_FILE_NAME, self.config
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
def train(self, training_data: TrainingData) -> Resource:
|
|
142
|
+
"""Train the intent classifier on a data set."""
|
|
143
|
+
self.perform_llm_health_check(
|
|
144
|
+
self.config.get(LLM_CONFIG_KEY),
|
|
145
|
+
DEFAULT_LLM_CONFIG,
|
|
146
|
+
"llm_based_router.train",
|
|
147
|
+
LLMBasedRouter.__name__,
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
self.persist()
|
|
151
|
+
return self._resource
|
|
152
|
+
|
|
153
|
+
@classmethod
|
|
154
|
+
def load(
|
|
155
|
+
cls,
|
|
156
|
+
config: Dict[str, Any],
|
|
157
|
+
model_storage: ModelStorage,
|
|
158
|
+
resource: Resource,
|
|
159
|
+
execution_context: ExecutionContext,
|
|
160
|
+
**kwargs: Any,
|
|
161
|
+
) -> "LLMBasedRouter":
|
|
162
|
+
"""Loads trained component (see parent class for full docstring)."""
|
|
163
|
+
|
|
164
|
+
# Perform health check on the resolved LLM client config
|
|
165
|
+
llm_config = resolve_model_client_config(config.get(LLM_CONFIG_KEY, {}))
|
|
166
|
+
cls.perform_llm_health_check(
|
|
167
|
+
llm_config,
|
|
168
|
+
DEFAULT_LLM_CONFIG,
|
|
169
|
+
"llm_based_router.load",
|
|
170
|
+
LLMBasedRouter.__name__,
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
prompt_template = None
|
|
174
|
+
try:
|
|
175
|
+
with model_storage.read_from(resource) as path:
|
|
176
|
+
prompt_template = rasa.shared.utils.io.read_file(
|
|
177
|
+
path / LLM_BASED_ROUTER_PROMPT_FILE_NAME
|
|
178
|
+
)
|
|
179
|
+
except (FileNotFoundError, FileIOException) as e:
|
|
180
|
+
structlogger.warning(
|
|
181
|
+
"llm_based_router.load.failed", error=e, resource=resource.name
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
return cls(config, model_storage, resource, prompt_template=prompt_template)
|
|
185
|
+
|
|
186
|
+
@classmethod
|
|
187
|
+
def create(
|
|
188
|
+
cls,
|
|
189
|
+
config: Dict[str, Any],
|
|
190
|
+
model_storage: ModelStorage,
|
|
191
|
+
resource: Resource,
|
|
192
|
+
execution_context: ExecutionContext,
|
|
193
|
+
) -> LLMBasedRouter:
|
|
194
|
+
"""Creates component (see parent class for full docstring)."""
|
|
195
|
+
return cls(config, model_storage, resource)
|
|
196
|
+
|
|
197
|
+
async def process(
|
|
198
|
+
self,
|
|
199
|
+
messages: List[Message],
|
|
200
|
+
tracker: Optional[DialogueStateTracker] = None,
|
|
201
|
+
) -> List[Message]:
|
|
202
|
+
"""Process a list of messages."""
|
|
203
|
+
if tracker is None:
|
|
204
|
+
# cannot do anything if there is no tracker (happens during 'rasa test nlu')
|
|
205
|
+
return messages
|
|
206
|
+
|
|
207
|
+
for message in messages:
|
|
208
|
+
commands = await self.predict_commands(message, tracker)
|
|
209
|
+
commands_dicts = [command.as_dict() for command in commands]
|
|
210
|
+
message.set(COMMANDS, commands_dicts, add_to_output=True)
|
|
211
|
+
|
|
212
|
+
return messages
|
|
213
|
+
|
|
214
|
+
async def predict_commands(
|
|
215
|
+
self,
|
|
216
|
+
message: Message,
|
|
217
|
+
tracker: DialogueStateTracker,
|
|
218
|
+
) -> List[Command]:
|
|
219
|
+
if not tracker.has_coexistence_routing_slot:
|
|
220
|
+
raise InvalidConfigException(
|
|
221
|
+
f"Tried to run the LLMBasedRouter component "
|
|
222
|
+
f"without the slot to track coexistence routing ({ROUTE_TO_CALM_SLOT})."
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
route_session_to_calm = tracker.get_slot(ROUTE_TO_CALM_SLOT)
|
|
226
|
+
if route_session_to_calm is None:
|
|
227
|
+
prompt = self.render_template(message)
|
|
228
|
+
log_llm(
|
|
229
|
+
logger=structlogger,
|
|
230
|
+
log_module="LLMBasedRouter",
|
|
231
|
+
log_event="llm_based_router.prompt_rendered",
|
|
232
|
+
prompt=prompt,
|
|
233
|
+
)
|
|
234
|
+
# generating answer
|
|
235
|
+
answer = await self._generate_answer_using_llm(prompt)
|
|
236
|
+
log_llm(
|
|
237
|
+
logger=structlogger,
|
|
238
|
+
log_module="LLMBasedRouter",
|
|
239
|
+
log_event="llm_based_router.llm_answer",
|
|
240
|
+
answer=answer,
|
|
241
|
+
)
|
|
242
|
+
commands = self.parse_answer(answer)
|
|
243
|
+
log_llm(
|
|
244
|
+
logger=structlogger,
|
|
245
|
+
log_module="LLMBasedRouter",
|
|
246
|
+
log_event="llm_based_router.final_commands",
|
|
247
|
+
commands=commands,
|
|
248
|
+
)
|
|
249
|
+
return commands
|
|
250
|
+
elif route_session_to_calm is True:
|
|
251
|
+
# don't set any commands so that a `LLMBasedCommandGenerator` is triggered
|
|
252
|
+
# and can predict the actual commands.
|
|
253
|
+
return []
|
|
254
|
+
else:
|
|
255
|
+
# If the session is assigned to DM1 add a `NoopCommand` to silence
|
|
256
|
+
# the other command generators.
|
|
257
|
+
return [NoopCommand()]
|
|
258
|
+
|
|
259
|
+
@staticmethod
|
|
260
|
+
def parse_answer(answer: Optional[str]) -> List[Command]:
|
|
261
|
+
if answer is None:
|
|
262
|
+
structlogger.warn(
|
|
263
|
+
"llm_based_router.parse_answer.invalid_answer", answer=answer
|
|
264
|
+
)
|
|
265
|
+
return [SetSlotCommand(ROUTE_TO_CALM_SLOT, False)]
|
|
266
|
+
|
|
267
|
+
# removing any whitespaces from the token
|
|
268
|
+
answer = answer.strip()
|
|
269
|
+
|
|
270
|
+
# to calm
|
|
271
|
+
if answer == "A":
|
|
272
|
+
return []
|
|
273
|
+
# to dm1
|
|
274
|
+
elif answer == "C":
|
|
275
|
+
return [SetSlotCommand(ROUTE_TO_CALM_SLOT, False)]
|
|
276
|
+
# to dm1 for a single chitchat turn
|
|
277
|
+
elif answer == "B":
|
|
278
|
+
return [NoopCommand()]
|
|
279
|
+
else:
|
|
280
|
+
structlogger.warn(
|
|
281
|
+
"llm_based_router.parse_answer.invalid_answer", answer=answer
|
|
282
|
+
)
|
|
283
|
+
return [SetSlotCommand(ROUTE_TO_CALM_SLOT, False)]
|
|
284
|
+
|
|
285
|
+
def render_template(self, message: Message) -> str:
|
|
286
|
+
inputs = {
|
|
287
|
+
"user_message": message.get(TEXT),
|
|
288
|
+
f"{CALM_ENTRY}_{STICKY}": self.config[CALM_ENTRY][STICKY],
|
|
289
|
+
f"{NLU_ENTRY}_{STICKY}": self.config[NLU_ENTRY][STICKY],
|
|
290
|
+
f"{NLU_ENTRY}_{NON_STICKY}": self.config[NLU_ENTRY][NON_STICKY],
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return Template(self.prompt_template).render(**inputs)
|
|
294
|
+
|
|
295
|
+
async def _generate_answer_using_llm(self, prompt: str) -> Optional[str]:
|
|
296
|
+
"""Use LLM to generate a response.
|
|
297
|
+
|
|
298
|
+
Args:
|
|
299
|
+
prompt: The prompt to send to the LLM.
|
|
300
|
+
|
|
301
|
+
Returns:
|
|
302
|
+
The generated text.
|
|
303
|
+
"""
|
|
304
|
+
llm = llm_factory(self.config.get(LLM_CONFIG_KEY), DEFAULT_LLM_CONFIG)
|
|
305
|
+
|
|
306
|
+
try:
|
|
307
|
+
llm_response = await llm.acompletion(prompt)
|
|
308
|
+
return llm_response.choices[0]
|
|
309
|
+
except Exception as e:
|
|
310
|
+
# unfortunately, langchain does not wrap LLM exceptions which means
|
|
311
|
+
# we have to catch all exceptions here
|
|
312
|
+
structlogger.error("llm_based_router.llm.error", error=e)
|
|
313
|
+
return None
|
|
314
|
+
|
|
315
|
+
@classmethod
|
|
316
|
+
def fingerprint_addon(cls, config: Dict[str, Any]) -> Optional[str]:
|
|
317
|
+
"""Add a fingerprint of llm based router for the graph."""
|
|
318
|
+
prompt_template = get_prompt_template(
|
|
319
|
+
config.get(PROMPT_CONFIG_KEY),
|
|
320
|
+
DEFAULT_COMMAND_PROMPT_TEMPLATE,
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
llm_config = resolve_model_client_config(
|
|
324
|
+
config.get(LLM_CONFIG_KEY), LLMBasedRouter.__name__
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
return deep_container_fingerprint([prompt_template, llm_config])
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
You have to forward the user message to the right assistant.
|
|
2
|
+
|
|
3
|
+
The following assistants are available:
|
|
4
|
+
|
|
5
|
+
Assistant A: {{ calm_entry_sticky }}
|
|
6
|
+
Assistant B: {{ nlu_entry_non_sticky }}
|
|
7
|
+
Assistant C: {{ nlu_entry_sticky }}
|
|
8
|
+
|
|
9
|
+
The user said: """{{ user_message }}"""
|
|
10
|
+
|
|
11
|
+
Answer which assistant needs to get this message:
|
|
12
|
+
The message is for the assistant with the letter
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from rasa.dialogue_understanding.commands.command import Command
|
|
2
|
+
from rasa.dialogue_understanding.commands.free_form_answer_command import (
|
|
3
|
+
FreeFormAnswerCommand,
|
|
4
|
+
)
|
|
5
|
+
from rasa.dialogue_understanding.commands.cancel_flow_command import CancelFlowCommand
|
|
6
|
+
from rasa.dialogue_understanding.commands.knowledge_answer_command import (
|
|
7
|
+
KnowledgeAnswerCommand,
|
|
8
|
+
)
|
|
9
|
+
from rasa.dialogue_understanding.commands.chit_chat_answer_command import (
|
|
10
|
+
ChitChatAnswerCommand,
|
|
11
|
+
)
|
|
12
|
+
from rasa.dialogue_understanding.commands.restart_command import RestartCommand
|
|
13
|
+
from rasa.dialogue_understanding.commands.skip_question_command import (
|
|
14
|
+
SkipQuestionCommand,
|
|
15
|
+
)
|
|
16
|
+
from rasa.dialogue_understanding.commands.can_not_handle_command import (
|
|
17
|
+
CannotHandleCommand,
|
|
18
|
+
)
|
|
19
|
+
from rasa.dialogue_understanding.commands.clarify_command import ClarifyCommand
|
|
20
|
+
from rasa.dialogue_understanding.commands.error_command import ErrorCommand
|
|
21
|
+
from rasa.dialogue_understanding.commands.set_slot_command import SetSlotCommand
|
|
22
|
+
from rasa.dialogue_understanding.commands.start_flow_command import StartFlowCommand
|
|
23
|
+
from rasa.dialogue_understanding.commands.human_handoff_command import (
|
|
24
|
+
HumanHandoffCommand,
|
|
25
|
+
)
|
|
26
|
+
from rasa.dialogue_understanding.commands.correct_slots_command import (
|
|
27
|
+
CorrectSlotsCommand,
|
|
28
|
+
CorrectedSlot,
|
|
29
|
+
)
|
|
30
|
+
from rasa.dialogue_understanding.commands.noop_command import NoopCommand
|
|
31
|
+
from rasa.dialogue_understanding.commands.change_flow_command import ChangeFlowCommand
|
|
32
|
+
from rasa.dialogue_understanding.commands.session_start_command import (
|
|
33
|
+
SessionStartCommand,
|
|
34
|
+
)
|
|
35
|
+
from rasa.dialogue_understanding.commands.session_end_command import SessionEndCommand
|
|
36
|
+
from rasa.dialogue_understanding.commands.repeat_bot_messages_command import (
|
|
37
|
+
RepeatBotMessagesCommand,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
__all__ = [
|
|
41
|
+
"Command",
|
|
42
|
+
"FreeFormAnswerCommand",
|
|
43
|
+
"CancelFlowCommand",
|
|
44
|
+
"KnowledgeAnswerCommand",
|
|
45
|
+
"ChitChatAnswerCommand",
|
|
46
|
+
"SkipQuestionCommand",
|
|
47
|
+
"CannotHandleCommand",
|
|
48
|
+
"ClarifyCommand",
|
|
49
|
+
"SetSlotCommand",
|
|
50
|
+
"StartFlowCommand",
|
|
51
|
+
"HumanHandoffCommand",
|
|
52
|
+
"CorrectSlotsCommand",
|
|
53
|
+
"CorrectedSlot",
|
|
54
|
+
"ErrorCommand",
|
|
55
|
+
"NoopCommand",
|
|
56
|
+
"ChangeFlowCommand",
|
|
57
|
+
"SessionStartCommand",
|
|
58
|
+
"SessionEndCommand",
|
|
59
|
+
"RepeatBotMessagesCommand",
|
|
60
|
+
"RestartCommand",
|
|
61
|
+
]
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any, Dict, List, Optional, Text
|
|
5
|
+
|
|
6
|
+
from rasa.dialogue_understanding.commands import Command
|
|
7
|
+
from rasa.dialogue_understanding.patterns.cannot_handle import (
|
|
8
|
+
CannotHandlePatternFlowStackFrame,
|
|
9
|
+
)
|
|
10
|
+
from rasa.shared.constants import RASA_PATTERN_CANNOT_HANDLE_DEFAULT
|
|
11
|
+
from rasa.shared.core.events import Event
|
|
12
|
+
from rasa.shared.core.flows import FlowsList
|
|
13
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class CannotHandleCommand(Command):
|
|
18
|
+
"""A command to indicate that the bot can't handle the user's input."""
|
|
19
|
+
|
|
20
|
+
reason: Optional[Text] = RASA_PATTERN_CANNOT_HANDLE_DEFAULT
|
|
21
|
+
"""Reason for cannot handle used in switch-case of the
|
|
22
|
+
cannot handle pattern flow."""
|
|
23
|
+
|
|
24
|
+
@classmethod
|
|
25
|
+
def command(cls) -> str:
|
|
26
|
+
"""Returns the command type."""
|
|
27
|
+
return "cannot handle"
|
|
28
|
+
|
|
29
|
+
@classmethod
|
|
30
|
+
def from_dict(cls, data: Dict[str, Any]) -> CannotHandleCommand:
|
|
31
|
+
"""Converts the dictionary to a command.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
The converted dictionary.
|
|
35
|
+
"""
|
|
36
|
+
return CannotHandleCommand(
|
|
37
|
+
data.get("reason", RASA_PATTERN_CANNOT_HANDLE_DEFAULT)
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
def run_command_on_tracker(
|
|
41
|
+
self,
|
|
42
|
+
tracker: DialogueStateTracker,
|
|
43
|
+
all_flows: FlowsList,
|
|
44
|
+
original_tracker: DialogueStateTracker,
|
|
45
|
+
) -> List[Event]:
|
|
46
|
+
"""Runs the command on the tracker.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
tracker: The tracker to run the command on.
|
|
50
|
+
all_flows: All flows in the assistant.
|
|
51
|
+
original_tracker: The tracker before any command was executed.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
The events to apply to the tracker.
|
|
55
|
+
"""
|
|
56
|
+
stack = tracker.stack
|
|
57
|
+
if self.reason is not None:
|
|
58
|
+
stack.push(CannotHandlePatternFlowStackFrame(reason=self.reason))
|
|
59
|
+
else:
|
|
60
|
+
stack.push(CannotHandlePatternFlowStackFrame())
|
|
61
|
+
return tracker.create_stack_updated_events(stack)
|
|
62
|
+
|
|
63
|
+
def __hash__(self) -> int:
|
|
64
|
+
return hash(self.reason)
|
|
65
|
+
|
|
66
|
+
def __eq__(self, other: object) -> bool:
|
|
67
|
+
if not isinstance(other, CannotHandleCommand):
|
|
68
|
+
return False
|
|
69
|
+
|
|
70
|
+
return other.reason == self.reason
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any, Dict, List
|
|
5
|
+
|
|
6
|
+
import structlog
|
|
7
|
+
|
|
8
|
+
from rasa.dialogue_understanding.commands import Command
|
|
9
|
+
from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
|
|
10
|
+
from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
|
|
11
|
+
from rasa.dialogue_understanding.stack.frames import UserFlowStackFrame
|
|
12
|
+
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import FlowStackFrameType
|
|
13
|
+
from rasa.shared.core.events import Event, FlowCancelled
|
|
14
|
+
from rasa.shared.core.flows import FlowsList
|
|
15
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
16
|
+
from rasa.dialogue_understanding.stack.utils import top_user_flow_frame
|
|
17
|
+
|
|
18
|
+
structlogger = structlog.get_logger()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass
|
|
22
|
+
class CancelFlowCommand(Command):
|
|
23
|
+
"""A command to cancel the current flow."""
|
|
24
|
+
|
|
25
|
+
@classmethod
|
|
26
|
+
def command(cls) -> str:
|
|
27
|
+
"""Returns the command type."""
|
|
28
|
+
return "cancel flow"
|
|
29
|
+
|
|
30
|
+
@classmethod
|
|
31
|
+
def from_dict(cls, data: Dict[str, Any]) -> CancelFlowCommand:
|
|
32
|
+
"""Converts the dictionary to a command.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
The converted dictionary.
|
|
36
|
+
"""
|
|
37
|
+
return CancelFlowCommand()
|
|
38
|
+
|
|
39
|
+
@staticmethod
|
|
40
|
+
def select_canceled_frames(stack: DialogueStack) -> List[str]:
|
|
41
|
+
"""Selects the frames that were canceled.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
dialogue_stack: The dialogue stack.
|
|
45
|
+
current_flow: The current flow.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
The frames that were canceled."""
|
|
49
|
+
canceled_frames = []
|
|
50
|
+
# we need to go through the original stack dump in reverse order
|
|
51
|
+
# to find the frames that were canceled. we cancel everything from
|
|
52
|
+
# the top of the stack until we hit the user flow that was canceled.
|
|
53
|
+
# this will also cancel any patterns put on top of that user flow,
|
|
54
|
+
# e.g. corrections.
|
|
55
|
+
for frame in reversed(stack.frames):
|
|
56
|
+
canceled_frames.append(frame.frame_id)
|
|
57
|
+
if (
|
|
58
|
+
isinstance(frame, UserFlowStackFrame)
|
|
59
|
+
and frame.frame_type != FlowStackFrameType.CALL
|
|
60
|
+
):
|
|
61
|
+
return canceled_frames
|
|
62
|
+
else:
|
|
63
|
+
# we should never get here as we should always find the user flow
|
|
64
|
+
# that was canceled.
|
|
65
|
+
raise ValueError(
|
|
66
|
+
f"Could not find a user flow frame to cancel. "
|
|
67
|
+
f"Current stack: {stack}."
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
def run_command_on_tracker(
|
|
71
|
+
self,
|
|
72
|
+
tracker: DialogueStateTracker,
|
|
73
|
+
all_flows: FlowsList,
|
|
74
|
+
original_tracker: DialogueStateTracker,
|
|
75
|
+
) -> List[Event]:
|
|
76
|
+
"""Runs the command on the tracker.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
tracker: The tracker to run the command on.
|
|
80
|
+
all_flows: All flows in the assistant.
|
|
81
|
+
original_tracker: The tracker before any command was executed.
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
The events to apply to the tracker.
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
stack = tracker.stack
|
|
88
|
+
original_stack = original_tracker.stack
|
|
89
|
+
|
|
90
|
+
applied_events: List[Event] = []
|
|
91
|
+
|
|
92
|
+
user_frame = top_user_flow_frame(original_stack)
|
|
93
|
+
current_flow = user_frame.flow(all_flows) if user_frame else None
|
|
94
|
+
|
|
95
|
+
if not current_flow:
|
|
96
|
+
structlogger.debug(
|
|
97
|
+
"command_executor.skip_cancel_flow.no_active_flow", command=self
|
|
98
|
+
)
|
|
99
|
+
return []
|
|
100
|
+
|
|
101
|
+
# we pass in the original dialogue stack (before any of the currently
|
|
102
|
+
# predicted commands were applied) to make sure we don't cancel any
|
|
103
|
+
# frames that were added by the currently predicted commands.
|
|
104
|
+
canceled_frames = self.select_canceled_frames(original_stack)
|
|
105
|
+
|
|
106
|
+
stack.push(
|
|
107
|
+
CancelPatternFlowStackFrame(
|
|
108
|
+
canceled_name=current_flow.readable_name(),
|
|
109
|
+
canceled_frames=canceled_frames,
|
|
110
|
+
)
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
if user_frame:
|
|
114
|
+
applied_events.append(FlowCancelled(user_frame.flow_id, user_frame.step_id))
|
|
115
|
+
|
|
116
|
+
return applied_events + tracker.create_stack_updated_events(stack)
|
|
117
|
+
|
|
118
|
+
def __hash__(self) -> int:
|
|
119
|
+
return hash(self.command())
|
|
120
|
+
|
|
121
|
+
def __eq__(self, other: object) -> bool:
|
|
122
|
+
if not isinstance(other, CancelFlowCommand):
|
|
123
|
+
return False
|
|
124
|
+
|
|
125
|
+
return True
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any, Dict, List
|
|
5
|
+
from rasa.dialogue_understanding.commands import Command
|
|
6
|
+
from rasa.shared.core.events import Event
|
|
7
|
+
from rasa.shared.core.flows import FlowsList
|
|
8
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclass
|
|
12
|
+
class ChangeFlowCommand(Command):
|
|
13
|
+
"""A command to indicate a change of flows was requested by the command
|
|
14
|
+
generator."""
|
|
15
|
+
|
|
16
|
+
@classmethod
|
|
17
|
+
def command(cls) -> str:
|
|
18
|
+
"""Returns the command type."""
|
|
19
|
+
return "change_flow"
|
|
20
|
+
|
|
21
|
+
@classmethod
|
|
22
|
+
def from_dict(cls, data: Dict[str, Any]) -> ChangeFlowCommand:
|
|
23
|
+
"""Converts the dictionary to a command.
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
The converted dictionary.
|
|
27
|
+
"""
|
|
28
|
+
return ChangeFlowCommand()
|
|
29
|
+
|
|
30
|
+
def run_command_on_tracker(
|
|
31
|
+
self,
|
|
32
|
+
tracker: DialogueStateTracker,
|
|
33
|
+
all_flows: FlowsList,
|
|
34
|
+
original_tracker: DialogueStateTracker,
|
|
35
|
+
) -> List[Event]:
|
|
36
|
+
# the change flow command is not actually pushing anything to the tracker,
|
|
37
|
+
# but it is predicted by the MultiStepLLMCommandGenerator and used internally
|
|
38
|
+
return []
|
|
39
|
+
|
|
40
|
+
def __eq__(self, other: Any) -> bool:
|
|
41
|
+
return isinstance(other, ChangeFlowCommand)
|
|
42
|
+
|
|
43
|
+
def __hash__(self) -> int:
|
|
44
|
+
return hash(self.command())
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any, Dict, List
|
|
5
|
+
from rasa.dialogue_understanding.commands import FreeFormAnswerCommand
|
|
6
|
+
from rasa.dialogue_understanding.patterns.chitchat import ChitchatPatternFlowStackFrame
|
|
7
|
+
from rasa.shared.core.events import Event
|
|
8
|
+
from rasa.shared.core.flows import FlowsList
|
|
9
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass
|
|
13
|
+
class ChitChatAnswerCommand(FreeFormAnswerCommand):
|
|
14
|
+
"""A command to indicate a chitchat style free-form answer by the bot."""
|
|
15
|
+
|
|
16
|
+
@classmethod
|
|
17
|
+
def command(cls) -> str:
|
|
18
|
+
"""Returns the command type."""
|
|
19
|
+
return "chitchat"
|
|
20
|
+
|
|
21
|
+
@classmethod
|
|
22
|
+
def from_dict(cls, data: Dict[str, Any]) -> ChitChatAnswerCommand:
|
|
23
|
+
"""Converts the dictionary to a command.
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
The converted dictionary.
|
|
27
|
+
"""
|
|
28
|
+
return ChitChatAnswerCommand()
|
|
29
|
+
|
|
30
|
+
def run_command_on_tracker(
|
|
31
|
+
self,
|
|
32
|
+
tracker: DialogueStateTracker,
|
|
33
|
+
all_flows: FlowsList,
|
|
34
|
+
original_tracker: DialogueStateTracker,
|
|
35
|
+
) -> List[Event]:
|
|
36
|
+
"""Runs the command on the tracker.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
tracker: The tracker to run the command on.
|
|
40
|
+
all_flows: All flows in the assistant.
|
|
41
|
+
original_tracker: The tracker before any command was executed.
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
The events to apply to the tracker.
|
|
45
|
+
"""
|
|
46
|
+
stack = tracker.stack
|
|
47
|
+
stack.push(ChitchatPatternFlowStackFrame())
|
|
48
|
+
return tracker.create_stack_updated_events(stack)
|
|
49
|
+
|
|
50
|
+
def __hash__(self) -> int:
|
|
51
|
+
return hash(self.command())
|
|
52
|
+
|
|
53
|
+
def __eq__(self, other: object) -> bool:
|
|
54
|
+
if not isinstance(other, ChitChatAnswerCommand):
|
|
55
|
+
return False
|
|
56
|
+
|
|
57
|
+
return True
|