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,486 @@
|
|
|
1
|
+
import importlib.resources
|
|
2
|
+
import re
|
|
3
|
+
from typing import Dict, Any, List, Optional, Text
|
|
4
|
+
|
|
5
|
+
import structlog
|
|
6
|
+
|
|
7
|
+
import rasa.shared.utils.io
|
|
8
|
+
from rasa.dialogue_understanding.commands import (
|
|
9
|
+
Command,
|
|
10
|
+
ErrorCommand,
|
|
11
|
+
SetSlotCommand,
|
|
12
|
+
CancelFlowCommand,
|
|
13
|
+
HumanHandoffCommand,
|
|
14
|
+
ChitChatAnswerCommand,
|
|
15
|
+
SkipQuestionCommand,
|
|
16
|
+
KnowledgeAnswerCommand,
|
|
17
|
+
ClarifyCommand,
|
|
18
|
+
CannotHandleCommand,
|
|
19
|
+
RepeatBotMessagesCommand,
|
|
20
|
+
)
|
|
21
|
+
from rasa.dialogue_understanding.generator.constants import (
|
|
22
|
+
LLM_CONFIG_KEY,
|
|
23
|
+
USER_INPUT_CONFIG_KEY,
|
|
24
|
+
FLOW_RETRIEVAL_KEY,
|
|
25
|
+
DEFAULT_LLM_CONFIG,
|
|
26
|
+
)
|
|
27
|
+
from rasa.dialogue_understanding.generator.flow_retrieval import (
|
|
28
|
+
FlowRetrieval,
|
|
29
|
+
)
|
|
30
|
+
from rasa.dialogue_understanding.generator.llm_based_command_generator import (
|
|
31
|
+
LLMBasedCommandGenerator,
|
|
32
|
+
)
|
|
33
|
+
from rasa.dialogue_understanding.stack.utils import top_flow_frame
|
|
34
|
+
from rasa.engine.graph import ExecutionContext
|
|
35
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
36
|
+
from rasa.engine.storage.resource import Resource
|
|
37
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
38
|
+
from rasa.shared.constants import (
|
|
39
|
+
ROUTE_TO_CALM_SLOT,
|
|
40
|
+
PROMPT_CONFIG_KEY,
|
|
41
|
+
PROMPT_TEMPLATE_CONFIG_KEY,
|
|
42
|
+
EMBEDDINGS_CONFIG_KEY,
|
|
43
|
+
)
|
|
44
|
+
from rasa.shared.core.flows import FlowsList
|
|
45
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
46
|
+
from rasa.shared.exceptions import ProviderClientAPIException
|
|
47
|
+
from rasa.shared.nlu.constants import TEXT, LLM_COMMANDS, LLM_PROMPT
|
|
48
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
49
|
+
from rasa.shared.utils.io import deep_container_fingerprint
|
|
50
|
+
from rasa.shared.utils.llm import (
|
|
51
|
+
get_prompt_template,
|
|
52
|
+
tracker_as_readable_transcript,
|
|
53
|
+
sanitize_message_for_prompt,
|
|
54
|
+
resolve_model_client_config,
|
|
55
|
+
)
|
|
56
|
+
from rasa.utils.beta import ensure_beta_feature_is_enabled, BetaNotEnabledException
|
|
57
|
+
from rasa.utils.log_utils import log_llm
|
|
58
|
+
|
|
59
|
+
COMMAND_PROMPT_FILE_NAME = "command_prompt.jinja2"
|
|
60
|
+
|
|
61
|
+
DEFAULT_COMMAND_PROMPT_TEMPLATE = importlib.resources.read_text(
|
|
62
|
+
"rasa.dialogue_understanding.generator.single_step",
|
|
63
|
+
"command_prompt_template.jinja2",
|
|
64
|
+
)
|
|
65
|
+
SINGLE_STEP_LLM_COMMAND_GENERATOR_CONFIG_FILE = "config.json"
|
|
66
|
+
|
|
67
|
+
structlogger = structlog.get_logger()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@DefaultV1Recipe.register(
|
|
71
|
+
[
|
|
72
|
+
DefaultV1Recipe.ComponentType.COMMAND_GENERATOR,
|
|
73
|
+
],
|
|
74
|
+
is_trainable=True,
|
|
75
|
+
)
|
|
76
|
+
class SingleStepLLMCommandGenerator(LLMBasedCommandGenerator):
|
|
77
|
+
"""A single step LLM-based command generator."""
|
|
78
|
+
|
|
79
|
+
def __init__(
|
|
80
|
+
self,
|
|
81
|
+
config: Dict[str, Any],
|
|
82
|
+
model_storage: ModelStorage,
|
|
83
|
+
resource: Resource,
|
|
84
|
+
prompt_template: Optional[Text] = None,
|
|
85
|
+
**kwargs: Any,
|
|
86
|
+
) -> None:
|
|
87
|
+
super().__init__(
|
|
88
|
+
config,
|
|
89
|
+
model_storage,
|
|
90
|
+
resource,
|
|
91
|
+
prompt_template=prompt_template,
|
|
92
|
+
**kwargs,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
# Set the prompt template
|
|
96
|
+
if config.get(PROMPT_CONFIG_KEY):
|
|
97
|
+
structlogger.warning(
|
|
98
|
+
"single_step_llm_command_generator.init",
|
|
99
|
+
event_info=(
|
|
100
|
+
"The config parameter 'prompt' is deprecated "
|
|
101
|
+
"and will be removed in Rasa 4.0.0. "
|
|
102
|
+
"Please use the config parameter 'prompt_template' instead. "
|
|
103
|
+
),
|
|
104
|
+
)
|
|
105
|
+
config_prompt = (
|
|
106
|
+
config.get(PROMPT_CONFIG_KEY)
|
|
107
|
+
or config.get(PROMPT_TEMPLATE_CONFIG_KEY)
|
|
108
|
+
or None
|
|
109
|
+
)
|
|
110
|
+
self.prompt_template = prompt_template or get_prompt_template(
|
|
111
|
+
config_prompt,
|
|
112
|
+
DEFAULT_COMMAND_PROMPT_TEMPLATE,
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
self.trace_prompt_tokens = self.config.get("trace_prompt_tokens", False)
|
|
116
|
+
self.repeat_command_enabled = self.is_repeat_command_enabled()
|
|
117
|
+
|
|
118
|
+
### Implementations of LLMBasedCommandGenerator parent
|
|
119
|
+
@staticmethod
|
|
120
|
+
def get_default_config() -> Dict[str, Any]:
|
|
121
|
+
"""The component's default config (see parent class for full docstring)."""
|
|
122
|
+
return {
|
|
123
|
+
PROMPT_CONFIG_KEY: None, # Legacy
|
|
124
|
+
PROMPT_TEMPLATE_CONFIG_KEY: None,
|
|
125
|
+
USER_INPUT_CONFIG_KEY: None,
|
|
126
|
+
LLM_CONFIG_KEY: None,
|
|
127
|
+
FLOW_RETRIEVAL_KEY: FlowRetrieval.get_default_config(),
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
@classmethod
|
|
131
|
+
def load(
|
|
132
|
+
cls: Any,
|
|
133
|
+
config: Dict[str, Any],
|
|
134
|
+
model_storage: ModelStorage,
|
|
135
|
+
resource: Resource,
|
|
136
|
+
execution_context: ExecutionContext,
|
|
137
|
+
**kwargs: Any,
|
|
138
|
+
) -> "SingleStepLLMCommandGenerator":
|
|
139
|
+
"""Loads trained component (see parent class for full docstring)."""
|
|
140
|
+
# Perform health check of the LLM API endpoint
|
|
141
|
+
llm_config = resolve_model_client_config(config.get(LLM_CONFIG_KEY, {}))
|
|
142
|
+
cls.perform_llm_health_check(
|
|
143
|
+
llm_config,
|
|
144
|
+
DEFAULT_LLM_CONFIG,
|
|
145
|
+
"single_step_llm_command_generator.load",
|
|
146
|
+
SingleStepLLMCommandGenerator.__name__,
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
# load prompt template from the model storage.
|
|
150
|
+
prompt_template = cls.load_prompt_template_from_model_storage(
|
|
151
|
+
model_storage, resource, COMMAND_PROMPT_FILE_NAME
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
# init base command generator
|
|
155
|
+
command_generator = cls(config, model_storage, resource, prompt_template)
|
|
156
|
+
# load flow retrieval if enabled
|
|
157
|
+
if command_generator.enabled_flow_retrieval:
|
|
158
|
+
command_generator.flow_retrieval = cls.load_flow_retrival(
|
|
159
|
+
command_generator.config, model_storage, resource
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
return command_generator
|
|
163
|
+
|
|
164
|
+
def persist(self) -> None:
|
|
165
|
+
"""Persist this component to disk for future loading."""
|
|
166
|
+
self._persist_prompt_template()
|
|
167
|
+
self._persist_config()
|
|
168
|
+
if self.flow_retrieval is not None:
|
|
169
|
+
self.flow_retrieval.persist()
|
|
170
|
+
|
|
171
|
+
def _persist_prompt_template(self) -> None:
|
|
172
|
+
"""Persist prompt template for future loading."""
|
|
173
|
+
with self._model_storage.write_to(self._resource) as path:
|
|
174
|
+
rasa.shared.utils.io.write_text_file(
|
|
175
|
+
self.prompt_template, path / COMMAND_PROMPT_FILE_NAME
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
def _persist_config(self) -> None:
|
|
179
|
+
"""Persist config as a source of truth for resolved clients."""
|
|
180
|
+
with self._model_storage.write_to(self._resource) as path:
|
|
181
|
+
rasa.shared.utils.io.dump_obj_as_json_to_file(
|
|
182
|
+
path / SINGLE_STEP_LLM_COMMAND_GENERATOR_CONFIG_FILE, self.config
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
async def predict_commands(
|
|
186
|
+
self,
|
|
187
|
+
message: Message,
|
|
188
|
+
flows: FlowsList,
|
|
189
|
+
tracker: Optional[DialogueStateTracker] = None,
|
|
190
|
+
**kwargs: Any,
|
|
191
|
+
) -> List[Command]:
|
|
192
|
+
"""Predict commands using the LLM.
|
|
193
|
+
|
|
194
|
+
Args:
|
|
195
|
+
message: The message from the user.
|
|
196
|
+
flows: The flows available to the user.
|
|
197
|
+
tracker: The tracker containing the current state of the conversation.
|
|
198
|
+
**kwargs: Keyword arguments for forward compatibility.
|
|
199
|
+
|
|
200
|
+
Returns:
|
|
201
|
+
The commands generated by the llm.
|
|
202
|
+
"""
|
|
203
|
+
if tracker is None or flows.is_empty():
|
|
204
|
+
# cannot do anything if there are no flows or no tracker
|
|
205
|
+
return []
|
|
206
|
+
|
|
207
|
+
try:
|
|
208
|
+
commands = await self._predict_commands(message, flows, tracker)
|
|
209
|
+
except ProviderClientAPIException:
|
|
210
|
+
# if command predictions resulted in API exception
|
|
211
|
+
# "predict" the ErrorCommand
|
|
212
|
+
commands = [ErrorCommand()]
|
|
213
|
+
|
|
214
|
+
if not commands:
|
|
215
|
+
# no commands are parsed or there's an invalid command
|
|
216
|
+
structlogger.warning(
|
|
217
|
+
"single_step_llm_command_generator.predict_commands",
|
|
218
|
+
message="No commands were predicted as the LLM response could "
|
|
219
|
+
"not be parsed or the LLM responded with an invalid command."
|
|
220
|
+
"Returning a CannotHandleCommand instead.",
|
|
221
|
+
)
|
|
222
|
+
commands = [CannotHandleCommand()]
|
|
223
|
+
|
|
224
|
+
if tracker.has_coexistence_routing_slot:
|
|
225
|
+
# if coexistence feature is used, set the routing slot
|
|
226
|
+
commands += [SetSlotCommand(ROUTE_TO_CALM_SLOT, True)]
|
|
227
|
+
|
|
228
|
+
log_llm(
|
|
229
|
+
logger=structlogger,
|
|
230
|
+
log_module="SingleStepLLMCommandGenerator",
|
|
231
|
+
log_event="llm_command_generator.predict_commands.finished",
|
|
232
|
+
commands=commands,
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
return commands
|
|
236
|
+
|
|
237
|
+
async def _predict_commands(
|
|
238
|
+
self,
|
|
239
|
+
message: Message,
|
|
240
|
+
flows: FlowsList,
|
|
241
|
+
tracker: Optional[DialogueStateTracker] = None,
|
|
242
|
+
) -> List[Command]:
|
|
243
|
+
"""Predict commands using the LLM.
|
|
244
|
+
|
|
245
|
+
Args:
|
|
246
|
+
message: The message from the user.
|
|
247
|
+
flows: The flows available to the user.
|
|
248
|
+
tracker: The tracker containing the current state of the conversation.
|
|
249
|
+
|
|
250
|
+
Returns:
|
|
251
|
+
The commands generated by the llm.
|
|
252
|
+
|
|
253
|
+
Raises:
|
|
254
|
+
ProviderClientAPIException: If API calls raised an error.
|
|
255
|
+
"""
|
|
256
|
+
# retrieve flows
|
|
257
|
+
filtered_flows = await self.filter_flows(message, flows, tracker)
|
|
258
|
+
|
|
259
|
+
flow_prompt = self.render_template(message, tracker, filtered_flows, flows)
|
|
260
|
+
log_llm(
|
|
261
|
+
logger=structlogger,
|
|
262
|
+
log_module="SingleStepLLMCommandGenerator",
|
|
263
|
+
log_event="llm_command_generator.predict_commands.prompt_rendered",
|
|
264
|
+
prompt=flow_prompt,
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
action_list = await self.invoke_llm(flow_prompt)
|
|
268
|
+
# The check for 'None' maintains compatibility with older versions
|
|
269
|
+
# of LLMCommandGenerator. In previous implementations, 'invoke_llm'
|
|
270
|
+
# might return 'None' to indicate a failure to generate actions.
|
|
271
|
+
if action_list is None:
|
|
272
|
+
return [ErrorCommand()]
|
|
273
|
+
|
|
274
|
+
log_llm(
|
|
275
|
+
logger=structlogger,
|
|
276
|
+
log_module="SingleStepLLMCommandGenerator",
|
|
277
|
+
log_event="llm_command_generator.predict_commands.actions_generated",
|
|
278
|
+
action_list=action_list,
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
commands = self.parse_commands(action_list, tracker, flows)
|
|
282
|
+
|
|
283
|
+
self._update_message_parse_data_for_fine_tuning(message, commands, flow_prompt)
|
|
284
|
+
self._add_commands_to_message_parse_data(
|
|
285
|
+
message, SingleStepLLMCommandGenerator.__name__, commands
|
|
286
|
+
)
|
|
287
|
+
self._add_prompt_to_message_parse_data(
|
|
288
|
+
message,
|
|
289
|
+
SingleStepLLMCommandGenerator.__name__,
|
|
290
|
+
"command_generator_prompt",
|
|
291
|
+
flow_prompt,
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
return commands
|
|
295
|
+
|
|
296
|
+
@staticmethod
|
|
297
|
+
def _update_message_parse_data_for_fine_tuning(
|
|
298
|
+
message: Message, commands: List[Command], prompt: str
|
|
299
|
+
) -> None:
|
|
300
|
+
from rasa.llm_fine_tuning.annotation_module import preparing_fine_tuning_data
|
|
301
|
+
|
|
302
|
+
if preparing_fine_tuning_data:
|
|
303
|
+
# Add commands and prompt to the message object in order to create
|
|
304
|
+
# prompt -> commands pairs for fine-tuning
|
|
305
|
+
message.set(
|
|
306
|
+
LLM_COMMANDS,
|
|
307
|
+
[command.as_dict() for command in commands],
|
|
308
|
+
add_to_output=True,
|
|
309
|
+
)
|
|
310
|
+
message.set(LLM_PROMPT, prompt, add_to_output=True)
|
|
311
|
+
|
|
312
|
+
@classmethod
|
|
313
|
+
def parse_commands(
|
|
314
|
+
cls, actions: Optional[str], tracker: DialogueStateTracker, flows: FlowsList
|
|
315
|
+
) -> List[Command]:
|
|
316
|
+
"""Parse the actions returned by the llm into intent and entities.
|
|
317
|
+
|
|
318
|
+
Args:
|
|
319
|
+
actions: The actions returned by the llm.
|
|
320
|
+
tracker: The tracker containing the current state of the conversation.
|
|
321
|
+
flows: the list of flows
|
|
322
|
+
|
|
323
|
+
Returns:
|
|
324
|
+
The parsed commands.
|
|
325
|
+
"""
|
|
326
|
+
if actions is None:
|
|
327
|
+
return []
|
|
328
|
+
|
|
329
|
+
commands: List[Command] = []
|
|
330
|
+
|
|
331
|
+
slot_set_re = re.compile(
|
|
332
|
+
r"""SetSlot\(['"]?([a-zA-Z_][a-zA-Z0-9_-]*)['"]?, ?['"]?(.*)['"]?\)"""
|
|
333
|
+
)
|
|
334
|
+
start_flow_re = re.compile(r"StartFlow\(['\"]?([a-zA-Z0-9_-]+)['\"]?\)")
|
|
335
|
+
cancel_flow_re = re.compile(r"CancelFlow\(\)")
|
|
336
|
+
chitchat_re = re.compile(r"ChitChat\(\)")
|
|
337
|
+
skip_question_re = re.compile(r"SkipQuestion\(\)")
|
|
338
|
+
knowledge_re = re.compile(r"SearchAndReply\(\)")
|
|
339
|
+
humand_handoff_re = re.compile(r"HumanHandoff\(\)")
|
|
340
|
+
clarify_re = re.compile(r"Clarify\(([\"\'a-zA-Z0-9_, ]+)\)")
|
|
341
|
+
repeat_re = re.compile(r"RepeatLastBotMessages\(\)")
|
|
342
|
+
|
|
343
|
+
for action in actions.strip().splitlines():
|
|
344
|
+
if match := slot_set_re.search(action):
|
|
345
|
+
slot_name = match.group(1).strip()
|
|
346
|
+
slot_value = cls.clean_extracted_value(match.group(2))
|
|
347
|
+
# error case where the llm tries to start a flow using a slot set
|
|
348
|
+
if slot_name == "flow_name":
|
|
349
|
+
commands.extend(cls.start_flow_by_name(slot_value, flows))
|
|
350
|
+
else:
|
|
351
|
+
typed_slot_value = cls.get_nullable_slot_value(slot_value)
|
|
352
|
+
commands.append(
|
|
353
|
+
SetSlotCommand(name=slot_name, value=typed_slot_value)
|
|
354
|
+
)
|
|
355
|
+
elif match := start_flow_re.search(action):
|
|
356
|
+
flow_name = match.group(1).strip()
|
|
357
|
+
commands.extend(cls.start_flow_by_name(flow_name, flows))
|
|
358
|
+
elif cancel_flow_re.search(action):
|
|
359
|
+
commands.append(CancelFlowCommand())
|
|
360
|
+
elif chitchat_re.search(action):
|
|
361
|
+
commands.append(ChitChatAnswerCommand())
|
|
362
|
+
elif skip_question_re.search(action):
|
|
363
|
+
commands.append(SkipQuestionCommand())
|
|
364
|
+
elif knowledge_re.search(action):
|
|
365
|
+
commands.append(KnowledgeAnswerCommand())
|
|
366
|
+
elif humand_handoff_re.search(action):
|
|
367
|
+
commands.append(HumanHandoffCommand())
|
|
368
|
+
elif repeat_re.search(action):
|
|
369
|
+
commands.append(RepeatBotMessagesCommand())
|
|
370
|
+
elif match := clarify_re.search(action):
|
|
371
|
+
options = sorted([opt.strip() for opt in match.group(1).split(",")])
|
|
372
|
+
# Remove surrounding quotes if present
|
|
373
|
+
cleaned_options = []
|
|
374
|
+
for flow in options:
|
|
375
|
+
if (flow.startswith('"') and flow.endswith('"')) or (
|
|
376
|
+
flow.startswith("'") and flow.endswith("'")
|
|
377
|
+
):
|
|
378
|
+
cleaned_options.append(flow[1:-1])
|
|
379
|
+
else:
|
|
380
|
+
cleaned_options.append(flow)
|
|
381
|
+
# check if flow is valid
|
|
382
|
+
valid_options = [
|
|
383
|
+
flow for flow in cleaned_options if flow in flows.user_flow_ids
|
|
384
|
+
]
|
|
385
|
+
if len(set(valid_options)) == 1:
|
|
386
|
+
commands.extend(cls.start_flow_by_name(valid_options[0], flows))
|
|
387
|
+
elif len(valid_options) > 1:
|
|
388
|
+
commands.append(ClarifyCommand(valid_options))
|
|
389
|
+
|
|
390
|
+
if not commands:
|
|
391
|
+
structlogger.debug(
|
|
392
|
+
"single_step_llm_command_generator.parse_commands",
|
|
393
|
+
message="No commands were parsed from the LLM actions.",
|
|
394
|
+
actions=actions,
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
return commands
|
|
398
|
+
|
|
399
|
+
@classmethod
|
|
400
|
+
def fingerprint_addon(cls: Any, config: Dict[str, Any]) -> Optional[str]:
|
|
401
|
+
"""Add a fingerprint for the graph."""
|
|
402
|
+
config_prompt = (
|
|
403
|
+
config.get(PROMPT_CONFIG_KEY)
|
|
404
|
+
or config.get(PROMPT_TEMPLATE_CONFIG_KEY)
|
|
405
|
+
or None
|
|
406
|
+
)
|
|
407
|
+
prompt_template = get_prompt_template(
|
|
408
|
+
config_prompt,
|
|
409
|
+
DEFAULT_COMMAND_PROMPT_TEMPLATE,
|
|
410
|
+
)
|
|
411
|
+
llm_config = resolve_model_client_config(
|
|
412
|
+
config.get(LLM_CONFIG_KEY), SingleStepLLMCommandGenerator.__name__
|
|
413
|
+
)
|
|
414
|
+
embedding_config = resolve_model_client_config(
|
|
415
|
+
config.get(FLOW_RETRIEVAL_KEY, {}).get(EMBEDDINGS_CONFIG_KEY),
|
|
416
|
+
FlowRetrieval.__name__,
|
|
417
|
+
)
|
|
418
|
+
return deep_container_fingerprint(
|
|
419
|
+
[prompt_template, llm_config, embedding_config]
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
### Helper methods
|
|
423
|
+
def render_template(
|
|
424
|
+
self,
|
|
425
|
+
message: Message,
|
|
426
|
+
tracker: DialogueStateTracker,
|
|
427
|
+
startable_flows: FlowsList,
|
|
428
|
+
all_flows: FlowsList,
|
|
429
|
+
) -> str:
|
|
430
|
+
"""Render the jinja template to create the prompt for the LLM.
|
|
431
|
+
|
|
432
|
+
Args:
|
|
433
|
+
message: The current message from the user.
|
|
434
|
+
tracker: The tracker containing the current state of the conversation.
|
|
435
|
+
startable_flows: The flows startable at this point in time by the user.
|
|
436
|
+
all_flows: all flows present in the assistant
|
|
437
|
+
|
|
438
|
+
Returns:
|
|
439
|
+
The rendered prompt template.
|
|
440
|
+
"""
|
|
441
|
+
# need to make this distinction here because current step of the
|
|
442
|
+
# top_calling_frame would be the call step, but we need the collect step from
|
|
443
|
+
# the called frame. If no call is active calling and called frame are the same.
|
|
444
|
+
top_calling_frame = top_flow_frame(tracker.stack)
|
|
445
|
+
top_called_frame = top_flow_frame(tracker.stack, ignore_call_frames=False)
|
|
446
|
+
|
|
447
|
+
top_flow = top_calling_frame.flow(all_flows) if top_calling_frame else None
|
|
448
|
+
current_step = top_called_frame.step(all_flows) if top_called_frame else None
|
|
449
|
+
|
|
450
|
+
flow_slots = self.prepare_current_flow_slots_for_template(
|
|
451
|
+
top_flow, current_step, tracker
|
|
452
|
+
)
|
|
453
|
+
current_slot, current_slot_description = self.prepare_current_slot_for_template(
|
|
454
|
+
current_step
|
|
455
|
+
)
|
|
456
|
+
current_conversation = tracker_as_readable_transcript(tracker)
|
|
457
|
+
latest_user_message = sanitize_message_for_prompt(message.get(TEXT))
|
|
458
|
+
current_conversation += f"\nUSER: {latest_user_message}"
|
|
459
|
+
|
|
460
|
+
inputs = {
|
|
461
|
+
"available_flows": self.prepare_flows_for_template(
|
|
462
|
+
startable_flows, tracker
|
|
463
|
+
),
|
|
464
|
+
"current_conversation": current_conversation,
|
|
465
|
+
"flow_slots": flow_slots,
|
|
466
|
+
"current_flow": top_flow.id if top_flow is not None else None,
|
|
467
|
+
"current_slot": current_slot,
|
|
468
|
+
"current_slot_description": current_slot_description,
|
|
469
|
+
"user_message": latest_user_message,
|
|
470
|
+
"is_repeat_command_enabled": self.repeat_command_enabled,
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
return self.compile_template(self.prompt_template).render(**inputs)
|
|
474
|
+
|
|
475
|
+
def is_repeat_command_enabled(self) -> bool:
|
|
476
|
+
"""Check for feature flag"""
|
|
477
|
+
RASA_PRO_BETA_REPEAT_COMMAND_ENV_VAR_NAME = "RASA_PRO_BETA_REPEAT_COMMAND"
|
|
478
|
+
try:
|
|
479
|
+
ensure_beta_feature_is_enabled(
|
|
480
|
+
"Repeat Command",
|
|
481
|
+
env_flag=RASA_PRO_BETA_REPEAT_COMMAND_ENV_VAR_NAME,
|
|
482
|
+
)
|
|
483
|
+
except BetaNotEnabledException:
|
|
484
|
+
return False
|
|
485
|
+
|
|
486
|
+
return True
|
|
File without changes
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from dataclasses import dataclass, field
|
|
3
|
+
from typing import Any, Dict, List, Optional
|
|
4
|
+
|
|
5
|
+
import structlog
|
|
6
|
+
from rasa.core.actions import action
|
|
7
|
+
from rasa.core.channels.channel import OutputChannel
|
|
8
|
+
from rasa.core.nlg.generator import NaturalLanguageGenerator
|
|
9
|
+
from rasa.dialogue_understanding.stack.frames import (
|
|
10
|
+
BaseFlowStackFrame,
|
|
11
|
+
PatternFlowStackFrame,
|
|
12
|
+
)
|
|
13
|
+
from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
|
|
14
|
+
from rasa.shared.core.constants import ACTION_CANCEL_FLOW
|
|
15
|
+
from rasa.shared.core.domain import Domain
|
|
16
|
+
from rasa.shared.core.events import Event
|
|
17
|
+
from rasa.shared.core.flows.steps.constants import END_STEP
|
|
18
|
+
from rasa.shared.core.flows.steps.continuation import ContinueFlowStep
|
|
19
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
structlogger = structlog.get_logger()
|
|
23
|
+
|
|
24
|
+
FLOW_PATTERN_CANCEL = RASA_DEFAULT_FLOW_PATTERN_PREFIX + "cancel_flow"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass
|
|
28
|
+
class CancelPatternFlowStackFrame(PatternFlowStackFrame):
|
|
29
|
+
"""A pattern flow stack frame which cancels a flow.
|
|
30
|
+
|
|
31
|
+
The frame contains the information about the stack frames that should
|
|
32
|
+
be canceled."""
|
|
33
|
+
|
|
34
|
+
flow_id: str = FLOW_PATTERN_CANCEL
|
|
35
|
+
"""The ID of the flow."""
|
|
36
|
+
canceled_name: str = ""
|
|
37
|
+
"""The name of the flow that should be canceled."""
|
|
38
|
+
canceled_frames: List[str] = field(default_factory=list)
|
|
39
|
+
"""The stack frames that should be canceled. These can be multiple
|
|
40
|
+
frames since the user frame that is getting canceled might have
|
|
41
|
+
created patterns that should be canceled as well."""
|
|
42
|
+
|
|
43
|
+
@classmethod
|
|
44
|
+
def type(cls) -> str:
|
|
45
|
+
"""Returns the type of the frame."""
|
|
46
|
+
return FLOW_PATTERN_CANCEL
|
|
47
|
+
|
|
48
|
+
@staticmethod
|
|
49
|
+
def from_dict(data: Dict[str, Any]) -> CancelPatternFlowStackFrame:
|
|
50
|
+
"""Creates a `DialogueStackFrame` from a dictionary.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
data: The dictionary to create the `DialogueStackFrame` from.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
The created `DialogueStackFrame`.
|
|
57
|
+
"""
|
|
58
|
+
return CancelPatternFlowStackFrame(
|
|
59
|
+
frame_id=data["frame_id"],
|
|
60
|
+
step_id=data["step_id"],
|
|
61
|
+
canceled_name=data["canceled_name"],
|
|
62
|
+
canceled_frames=data["canceled_frames"],
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class ActionCancelFlow(action.Action):
|
|
67
|
+
"""Action which cancels a flow from the stack."""
|
|
68
|
+
|
|
69
|
+
def __init__(self) -> None:
|
|
70
|
+
"""Creates a `ActionCancelFlow`."""
|
|
71
|
+
super().__init__()
|
|
72
|
+
|
|
73
|
+
def name(self) -> str:
|
|
74
|
+
"""Return the flow name."""
|
|
75
|
+
return ACTION_CANCEL_FLOW
|
|
76
|
+
|
|
77
|
+
async def run(
|
|
78
|
+
self,
|
|
79
|
+
output_channel: OutputChannel,
|
|
80
|
+
nlg: NaturalLanguageGenerator,
|
|
81
|
+
tracker: DialogueStateTracker,
|
|
82
|
+
domain: Domain,
|
|
83
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
84
|
+
) -> List[Event]:
|
|
85
|
+
"""Cancel the flow."""
|
|
86
|
+
stack = tracker.stack
|
|
87
|
+
if not (top := stack.top()):
|
|
88
|
+
structlogger.warning("action.cancel_flow.no_active_flow")
|
|
89
|
+
return []
|
|
90
|
+
|
|
91
|
+
if not isinstance(top, CancelPatternFlowStackFrame):
|
|
92
|
+
structlogger.warning("action.cancel_flow.no_cancel_frame", top=top)
|
|
93
|
+
return []
|
|
94
|
+
|
|
95
|
+
for canceled_frame_id in top.canceled_frames:
|
|
96
|
+
for frame in stack.frames:
|
|
97
|
+
if frame.frame_id == canceled_frame_id and isinstance(
|
|
98
|
+
frame, BaseFlowStackFrame
|
|
99
|
+
):
|
|
100
|
+
# Setting the stack frame to the end step so it is properly
|
|
101
|
+
# wrapped up by the flow policy
|
|
102
|
+
frame.step_id = ContinueFlowStep.continue_step_for_id(END_STEP)
|
|
103
|
+
break
|
|
104
|
+
else:
|
|
105
|
+
structlogger.warning(
|
|
106
|
+
"action.cancel_flow.frame_not_found",
|
|
107
|
+
dialogue_stack=stack,
|
|
108
|
+
frame_id=canceled_frame_id,
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
return tracker.create_stack_updated_events(stack)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import Any, Dict, Optional, Text
|
|
4
|
+
|
|
5
|
+
from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
|
|
6
|
+
from rasa.shared.constants import (
|
|
7
|
+
RASA_DEFAULT_FLOW_PATTERN_PREFIX,
|
|
8
|
+
RASA_PATTERN_CANNOT_HANDLE_DEFAULT,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
FLOW_PATTERN_CANNOT_HANDLE = RASA_DEFAULT_FLOW_PATTERN_PREFIX + "cannot_handle"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
class CannotHandlePatternFlowStackFrame(PatternFlowStackFrame):
|
|
16
|
+
"""A pattern flow stack frame that gets added when that the
|
|
17
|
+
bot can't handle the user's input."""
|
|
18
|
+
|
|
19
|
+
flow_id: str = FLOW_PATTERN_CANNOT_HANDLE
|
|
20
|
+
"""The ID of the flow."""
|
|
21
|
+
|
|
22
|
+
reason: Optional[Text] = RASA_PATTERN_CANNOT_HANDLE_DEFAULT
|
|
23
|
+
"""Reason for cannot handle used in switch-case of the
|
|
24
|
+
cannot handle pattern flow."""
|
|
25
|
+
|
|
26
|
+
@classmethod
|
|
27
|
+
def type(cls) -> str:
|
|
28
|
+
"""Returns the type of the frame."""
|
|
29
|
+
return FLOW_PATTERN_CANNOT_HANDLE
|
|
30
|
+
|
|
31
|
+
@staticmethod
|
|
32
|
+
def from_dict(data: Dict[str, Any]) -> CannotHandlePatternFlowStackFrame:
|
|
33
|
+
"""Creates a `DialogueStackFrame` from a dictionary.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
data: The dictionary to create the `DialogueStackFrame` from.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
The created `DialogueStackFrame`.
|
|
40
|
+
"""
|
|
41
|
+
return CannotHandlePatternFlowStackFrame(
|
|
42
|
+
frame_id=data["frame_id"], step_id=data["step_id"], reason=data["reason"]
|
|
43
|
+
)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import Any, Dict
|
|
4
|
+
|
|
5
|
+
from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
|
|
6
|
+
from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
FLOW_PATTERN_CHITCHAT = RASA_DEFAULT_FLOW_PATTERN_PREFIX + "chitchat"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass
|
|
13
|
+
class ChitchatPatternFlowStackFrame(PatternFlowStackFrame):
|
|
14
|
+
"""A flow stack frame that gets added to respond to Chitchat."""
|
|
15
|
+
|
|
16
|
+
flow_id: str = FLOW_PATTERN_CHITCHAT
|
|
17
|
+
"""The ID of the flow."""
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def type(cls) -> str:
|
|
21
|
+
"""Returns the type of the frame."""
|
|
22
|
+
return FLOW_PATTERN_CHITCHAT
|
|
23
|
+
|
|
24
|
+
@staticmethod
|
|
25
|
+
def from_dict(data: Dict[str, Any]) -> ChitchatPatternFlowStackFrame:
|
|
26
|
+
"""Creates a `DialogueStackFrame` from a dictionary.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
data: The dictionary to create the `DialogueStackFrame` from.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
The created `DialogueStackFrame`.
|
|
33
|
+
"""
|
|
34
|
+
return ChitchatPatternFlowStackFrame(
|
|
35
|
+
frame_id=data["frame_id"],
|
|
36
|
+
step_id=data["step_id"],
|
|
37
|
+
)
|