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,920 @@
|
|
|
1
|
+
import importlib.resources
|
|
2
|
+
import re
|
|
3
|
+
from typing import Dict, Any, List, Optional, Tuple, Union, Text
|
|
4
|
+
|
|
5
|
+
import structlog
|
|
6
|
+
from jinja2 import Template
|
|
7
|
+
|
|
8
|
+
import rasa.shared.utils.io
|
|
9
|
+
from rasa.dialogue_understanding.commands import (
|
|
10
|
+
Command,
|
|
11
|
+
ErrorCommand,
|
|
12
|
+
SetSlotCommand,
|
|
13
|
+
CancelFlowCommand,
|
|
14
|
+
StartFlowCommand,
|
|
15
|
+
HumanHandoffCommand,
|
|
16
|
+
ChitChatAnswerCommand,
|
|
17
|
+
SkipQuestionCommand,
|
|
18
|
+
KnowledgeAnswerCommand,
|
|
19
|
+
ClarifyCommand,
|
|
20
|
+
CannotHandleCommand,
|
|
21
|
+
)
|
|
22
|
+
from rasa.dialogue_understanding.commands.change_flow_command import ChangeFlowCommand
|
|
23
|
+
from rasa.dialogue_understanding.generator.constants import (
|
|
24
|
+
LLM_CONFIG_KEY,
|
|
25
|
+
USER_INPUT_CONFIG_KEY,
|
|
26
|
+
FLOW_RETRIEVAL_KEY,
|
|
27
|
+
DEFAULT_LLM_CONFIG,
|
|
28
|
+
)
|
|
29
|
+
from rasa.dialogue_understanding.generator.flow_retrieval import FlowRetrieval
|
|
30
|
+
from rasa.dialogue_understanding.generator.llm_based_command_generator import (
|
|
31
|
+
LLMBasedCommandGenerator,
|
|
32
|
+
)
|
|
33
|
+
from rasa.dialogue_understanding.stack.frames import UserFlowStackFrame
|
|
34
|
+
from rasa.dialogue_understanding.stack.utils import (
|
|
35
|
+
top_flow_frame,
|
|
36
|
+
top_user_flow_frame,
|
|
37
|
+
user_flows_on_the_stack,
|
|
38
|
+
)
|
|
39
|
+
from rasa.engine.graph import ExecutionContext
|
|
40
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
41
|
+
from rasa.engine.storage.resource import Resource
|
|
42
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
43
|
+
from rasa.shared.constants import (
|
|
44
|
+
RASA_PATTERN_CANNOT_HANDLE_NOT_SUPPORTED,
|
|
45
|
+
EMBEDDINGS_CONFIG_KEY,
|
|
46
|
+
)
|
|
47
|
+
from rasa.shared.constants import ROUTE_TO_CALM_SLOT
|
|
48
|
+
from rasa.shared.core.flows import FlowStep, Flow, FlowsList
|
|
49
|
+
from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
|
|
50
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
51
|
+
from rasa.shared.exceptions import ProviderClientAPIException
|
|
52
|
+
from rasa.shared.nlu.constants import TEXT
|
|
53
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
54
|
+
from rasa.shared.utils.io import deep_container_fingerprint
|
|
55
|
+
from rasa.shared.utils.llm import (
|
|
56
|
+
get_prompt_template,
|
|
57
|
+
tracker_as_readable_transcript,
|
|
58
|
+
sanitize_message_for_prompt,
|
|
59
|
+
allowed_values_for_slot,
|
|
60
|
+
resolve_model_client_config,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
# multistep template keys
|
|
64
|
+
HANDLE_FLOWS_KEY = "handle_flows"
|
|
65
|
+
FILL_SLOTS_KEY = "fill_slots"
|
|
66
|
+
|
|
67
|
+
# multistep template file names
|
|
68
|
+
HANDLE_FLOWS_PROMPT_FILE_NAME = "handle_flows_prompt.jinja2"
|
|
69
|
+
FILL_SLOTS_PROMPT_FILE_NAME = "fill_slots_prompt.jinja2"
|
|
70
|
+
|
|
71
|
+
# multistep templates
|
|
72
|
+
DEFAULT_HANDLE_FLOWS_TEMPLATE = importlib.resources.read_text(
|
|
73
|
+
"rasa.dialogue_understanding.generator.multi_step", "handle_flows_prompt.jinja2"
|
|
74
|
+
).strip()
|
|
75
|
+
DEFAULT_FILL_SLOTS_TEMPLATE = importlib.resources.read_text(
|
|
76
|
+
"rasa.dialogue_understanding.generator.multi_step", "fill_slots_prompt.jinja2"
|
|
77
|
+
).strip()
|
|
78
|
+
MULTI_STEP_LLM_COMMAND_GENERATOR_CONFIG_FILE = "config.json"
|
|
79
|
+
|
|
80
|
+
# dictionary of template names and associated file names and default values
|
|
81
|
+
PROMPT_TEMPLATES = {
|
|
82
|
+
HANDLE_FLOWS_KEY: (
|
|
83
|
+
HANDLE_FLOWS_PROMPT_FILE_NAME,
|
|
84
|
+
DEFAULT_HANDLE_FLOWS_TEMPLATE,
|
|
85
|
+
),
|
|
86
|
+
FILL_SLOTS_KEY: (
|
|
87
|
+
FILL_SLOTS_PROMPT_FILE_NAME,
|
|
88
|
+
DEFAULT_FILL_SLOTS_TEMPLATE,
|
|
89
|
+
),
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
FILE_PATH_KEY = "file_path"
|
|
93
|
+
|
|
94
|
+
structlogger = structlog.get_logger()
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@DefaultV1Recipe.register(
|
|
98
|
+
[
|
|
99
|
+
DefaultV1Recipe.ComponentType.COMMAND_GENERATOR,
|
|
100
|
+
],
|
|
101
|
+
is_trainable=True,
|
|
102
|
+
)
|
|
103
|
+
class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
|
|
104
|
+
"""An multi step command generator using LLM."""
|
|
105
|
+
|
|
106
|
+
def __init__(
|
|
107
|
+
self,
|
|
108
|
+
config: Dict[Text, Any],
|
|
109
|
+
model_storage: ModelStorage,
|
|
110
|
+
resource: Resource,
|
|
111
|
+
prompt_templates: Optional[Dict[Text, Optional[Text]]] = None,
|
|
112
|
+
**kwargs: Any,
|
|
113
|
+
) -> None:
|
|
114
|
+
super().__init__(
|
|
115
|
+
config, model_storage, resource, prompt_templates=prompt_templates, **kwargs
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
self._prompts: Dict[Text, Optional[Text]] = {
|
|
119
|
+
HANDLE_FLOWS_KEY: None,
|
|
120
|
+
FILL_SLOTS_KEY: None,
|
|
121
|
+
}
|
|
122
|
+
self._init_prompt_templates(prompt_templates)
|
|
123
|
+
|
|
124
|
+
self.trace_prompt_tokens = self.config.get("trace_prompt_tokens", False)
|
|
125
|
+
|
|
126
|
+
### Implementations of LLMBasedCommandGenerator parent
|
|
127
|
+
@staticmethod
|
|
128
|
+
def get_default_config() -> Dict[str, Any]:
|
|
129
|
+
"""The component's default config (see parent class for full docstring)."""
|
|
130
|
+
return {
|
|
131
|
+
"prompt_templates": {},
|
|
132
|
+
USER_INPUT_CONFIG_KEY: None,
|
|
133
|
+
LLM_CONFIG_KEY: None,
|
|
134
|
+
FLOW_RETRIEVAL_KEY: FlowRetrieval.get_default_config(),
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
@classmethod
|
|
138
|
+
def load(
|
|
139
|
+
cls: Any,
|
|
140
|
+
config: Dict[str, Any],
|
|
141
|
+
model_storage: ModelStorage,
|
|
142
|
+
resource: Resource,
|
|
143
|
+
execution_context: ExecutionContext,
|
|
144
|
+
**kwargs: Any,
|
|
145
|
+
) -> "MultiStepLLMCommandGenerator":
|
|
146
|
+
"""Loads trained component (see parent class for full docstring)."""
|
|
147
|
+
# Perform health check of the LLM client config
|
|
148
|
+
llm_config = resolve_model_client_config(config.get(LLM_CONFIG_KEY, {}))
|
|
149
|
+
cls.perform_llm_health_check(
|
|
150
|
+
llm_config,
|
|
151
|
+
DEFAULT_LLM_CONFIG,
|
|
152
|
+
"multi_step_llm_command_generator.load",
|
|
153
|
+
MultiStepLLMCommandGenerator.__name__,
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
prompts = cls._load_prompt_templates(model_storage, resource)
|
|
157
|
+
|
|
158
|
+
# init base command generator
|
|
159
|
+
command_generator = cls(config, model_storage, resource, prompts)
|
|
160
|
+
# load flow retrieval if enabled
|
|
161
|
+
if command_generator.enabled_flow_retrieval:
|
|
162
|
+
command_generator.flow_retrieval = cls.load_flow_retrival(
|
|
163
|
+
command_generator.config, model_storage, resource
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
return command_generator
|
|
167
|
+
|
|
168
|
+
def persist(self) -> None:
|
|
169
|
+
"""Persist this component to disk for future loading."""
|
|
170
|
+
self._persist_prompt_templates()
|
|
171
|
+
self._persist_config()
|
|
172
|
+
if self.flow_retrieval is not None:
|
|
173
|
+
self.flow_retrieval.persist()
|
|
174
|
+
|
|
175
|
+
async def predict_commands(
|
|
176
|
+
self,
|
|
177
|
+
message: Message,
|
|
178
|
+
flows: FlowsList,
|
|
179
|
+
tracker: Optional[DialogueStateTracker] = None,
|
|
180
|
+
**kwargs: Any,
|
|
181
|
+
) -> List[Command]:
|
|
182
|
+
"""Predict commands using the LLM.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
message: The message from the user.
|
|
186
|
+
flows: The flows available to the user.
|
|
187
|
+
tracker: The tracker containing the current state of the conversation.
|
|
188
|
+
**kwargs: Keyword arguments for forward compatibility.
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
The commands generated by the llm.
|
|
192
|
+
"""
|
|
193
|
+
if tracker is None or flows.is_empty():
|
|
194
|
+
# cannot do anything if there are no flows or no tracker
|
|
195
|
+
return []
|
|
196
|
+
|
|
197
|
+
try:
|
|
198
|
+
commands = await self._predict_commands_with_multi_step(
|
|
199
|
+
message, flows, tracker
|
|
200
|
+
)
|
|
201
|
+
commands = self._clean_up_commands(commands)
|
|
202
|
+
self._add_commands_to_message_parse_data(
|
|
203
|
+
message, MultiStepLLMCommandGenerator.__name__, commands
|
|
204
|
+
)
|
|
205
|
+
except ProviderClientAPIException:
|
|
206
|
+
# if any step resulted in API exception, the command prediction cannot
|
|
207
|
+
# be completed, "predict" the ErrorCommand
|
|
208
|
+
commands = [ErrorCommand()]
|
|
209
|
+
|
|
210
|
+
if not commands:
|
|
211
|
+
# if for any reason the final list of commands is empty,
|
|
212
|
+
# "predict" CannotHandle
|
|
213
|
+
commands = [CannotHandleCommand()]
|
|
214
|
+
|
|
215
|
+
if tracker.has_coexistence_routing_slot:
|
|
216
|
+
# if coexistence feature is used, set the routing slot
|
|
217
|
+
commands += [SetSlotCommand(ROUTE_TO_CALM_SLOT, True)]
|
|
218
|
+
|
|
219
|
+
structlogger.debug(
|
|
220
|
+
"multi_step_llm_command_generator.predict_commands.finished",
|
|
221
|
+
commands=commands,
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
return commands
|
|
225
|
+
|
|
226
|
+
@classmethod
|
|
227
|
+
def parse_commands(
|
|
228
|
+
cls,
|
|
229
|
+
actions: Optional[str],
|
|
230
|
+
tracker: DialogueStateTracker,
|
|
231
|
+
flows: FlowsList,
|
|
232
|
+
is_handle_flows_prompt: bool = False,
|
|
233
|
+
) -> List[Command]:
|
|
234
|
+
"""Parse the actions returned by the llm into intent and entities.
|
|
235
|
+
|
|
236
|
+
Args:
|
|
237
|
+
actions: The actions returned by the llm.
|
|
238
|
+
tracker: The tracker containing the current state of the conversation.
|
|
239
|
+
flows: The list of flows.
|
|
240
|
+
is_handle_flows_prompt: bool
|
|
241
|
+
|
|
242
|
+
Returns:
|
|
243
|
+
The parsed commands.
|
|
244
|
+
"""
|
|
245
|
+
if not actions:
|
|
246
|
+
return []
|
|
247
|
+
|
|
248
|
+
commands: List[Command] = []
|
|
249
|
+
|
|
250
|
+
slot_set_re = re.compile(
|
|
251
|
+
r"""SetSlot\(['"]?([a-zA-Z_][a-zA-Z0-9_-]*)['"]?, ?['"]?(.*)['"]?\)"""
|
|
252
|
+
)
|
|
253
|
+
start_flow_re = re.compile(r"StartFlow\(['\"]?([a-zA-Z0-9_-]+)['\"]?\)")
|
|
254
|
+
change_flow_re = re.compile(r"ChangeFlow\(\)")
|
|
255
|
+
cancel_flow_re = re.compile(r"CancelFlow\(\)")
|
|
256
|
+
chitchat_re = re.compile(r"ChitChat\(\)")
|
|
257
|
+
skip_question_re = re.compile(r"SkipQuestion\(\)")
|
|
258
|
+
knowledge_re = re.compile(r"SearchAndReply\(\)")
|
|
259
|
+
humand_handoff_re = re.compile(r"HumanHandoff\(\)")
|
|
260
|
+
clarify_re = re.compile(r"Clarify\(([\"\'a-zA-Z0-9_, ]+)\)")
|
|
261
|
+
cannot_handle_re = re.compile(r"CannotHandle\(\)")
|
|
262
|
+
|
|
263
|
+
for action in actions.strip().splitlines():
|
|
264
|
+
if is_handle_flows_prompt:
|
|
265
|
+
if (
|
|
266
|
+
len(commands) >= 2
|
|
267
|
+
or len(commands) == 1
|
|
268
|
+
and isinstance(commands[0], ClarifyCommand)
|
|
269
|
+
):
|
|
270
|
+
break
|
|
271
|
+
|
|
272
|
+
if cannot_handle_re.search(action):
|
|
273
|
+
commands.append(
|
|
274
|
+
CannotHandleCommand(RASA_PATTERN_CANNOT_HANDLE_NOT_SUPPORTED)
|
|
275
|
+
)
|
|
276
|
+
if match := slot_set_re.search(action):
|
|
277
|
+
slot_name = cls.clean_extracted_value(match.group(1).strip())
|
|
278
|
+
slot_value = cls.clean_extracted_value(match.group(2))
|
|
279
|
+
# error case where the llm tries to start a flow using a slot set
|
|
280
|
+
if slot_name == "flow_name":
|
|
281
|
+
commands.extend(cls.start_flow_by_name(slot_value, flows))
|
|
282
|
+
else:
|
|
283
|
+
typed_slot_value = cls.get_nullable_slot_value(slot_value)
|
|
284
|
+
commands.append(
|
|
285
|
+
SetSlotCommand(name=slot_name, value=typed_slot_value)
|
|
286
|
+
)
|
|
287
|
+
elif match := start_flow_re.search(action):
|
|
288
|
+
flow_name = match.group(1).strip()
|
|
289
|
+
commands.extend(cls.start_flow_by_name(flow_name, flows))
|
|
290
|
+
elif cancel_flow_re.search(action):
|
|
291
|
+
commands.append(CancelFlowCommand())
|
|
292
|
+
elif chitchat_re.search(action):
|
|
293
|
+
commands.append(ChitChatAnswerCommand())
|
|
294
|
+
elif skip_question_re.search(action):
|
|
295
|
+
commands.append(SkipQuestionCommand())
|
|
296
|
+
elif knowledge_re.search(action):
|
|
297
|
+
commands.append(KnowledgeAnswerCommand())
|
|
298
|
+
elif humand_handoff_re.search(action):
|
|
299
|
+
commands.append(HumanHandoffCommand())
|
|
300
|
+
elif match := clarify_re.search(action):
|
|
301
|
+
options = sorted([opt.strip() for opt in match.group(1).split(",")])
|
|
302
|
+
# Remove surrounding quotes if present
|
|
303
|
+
cleaned_options = []
|
|
304
|
+
for flow in options:
|
|
305
|
+
if (flow.startswith('"') and flow.endswith('"')) or (
|
|
306
|
+
flow.startswith("'") and flow.endswith("'")
|
|
307
|
+
):
|
|
308
|
+
cleaned_options.append(flow[1:-1])
|
|
309
|
+
else:
|
|
310
|
+
cleaned_options.append(flow)
|
|
311
|
+
# check if flow is valid
|
|
312
|
+
valid_options = [
|
|
313
|
+
flow
|
|
314
|
+
for flow in cleaned_options
|
|
315
|
+
if flow in flows.user_flow_ids
|
|
316
|
+
and flow not in user_flows_on_the_stack(tracker.stack)
|
|
317
|
+
]
|
|
318
|
+
if len(valid_options) == 1:
|
|
319
|
+
commands.extend(cls.start_flow_by_name(valid_options[0], flows))
|
|
320
|
+
elif 1 < len(valid_options) <= 5:
|
|
321
|
+
commands.append(ClarifyCommand(valid_options))
|
|
322
|
+
elif change_flow_re.search(action):
|
|
323
|
+
commands.append(ChangeFlowCommand())
|
|
324
|
+
|
|
325
|
+
if not commands:
|
|
326
|
+
structlogger.debug(
|
|
327
|
+
"multi_step_llm_command_generator.parse_commands",
|
|
328
|
+
message="No commands were parsed from the LLM actions.",
|
|
329
|
+
actions=actions,
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
return commands
|
|
333
|
+
|
|
334
|
+
### Helper methods
|
|
335
|
+
@property
|
|
336
|
+
def handle_flows_prompt(self) -> Optional[Text]:
|
|
337
|
+
return self._prompts[HANDLE_FLOWS_KEY]
|
|
338
|
+
|
|
339
|
+
@property
|
|
340
|
+
def fill_slots_prompt(self) -> Optional[Text]:
|
|
341
|
+
return self._prompts[FILL_SLOTS_KEY]
|
|
342
|
+
|
|
343
|
+
def _init_prompt_templates(self, prompt_templates: Dict[Text, Any]) -> None:
|
|
344
|
+
for key in self._prompts.keys():
|
|
345
|
+
_, default_template = PROMPT_TEMPLATES[key]
|
|
346
|
+
self._prompts[key] = self._resolve_prompt_template(
|
|
347
|
+
prompt_templates, self.config, key, default_template
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
@staticmethod
|
|
351
|
+
def _resolve_prompt_template(
|
|
352
|
+
prompt_templates: Optional[Dict[Text, Optional[Text]]],
|
|
353
|
+
config: Dict[Text, Any],
|
|
354
|
+
key: Text,
|
|
355
|
+
default_value: Text,
|
|
356
|
+
) -> Text:
|
|
357
|
+
"""Determines and retrieves a prompt template for a specific step in the
|
|
358
|
+
multistep command generator process using a given key. If the prompt
|
|
359
|
+
associated with the key is missing in both the `prompt_templates` and the
|
|
360
|
+
`config`, this method defaults to using a predefined prompt template. Each key
|
|
361
|
+
is uniquely associated with a distinct step of the command generation process.
|
|
362
|
+
|
|
363
|
+
Args:
|
|
364
|
+
prompt_templates: A dictionary of override templates.
|
|
365
|
+
config: The components config that may contain the file paths to the prompt
|
|
366
|
+
templates.
|
|
367
|
+
key: The key for the desired template.
|
|
368
|
+
default_value: The default template to use if no other is found.
|
|
369
|
+
|
|
370
|
+
Returns:
|
|
371
|
+
Prompt template.
|
|
372
|
+
"""
|
|
373
|
+
if (
|
|
374
|
+
prompt_templates is not None
|
|
375
|
+
and key in prompt_templates
|
|
376
|
+
and prompt_templates[key] is not None
|
|
377
|
+
):
|
|
378
|
+
return prompt_templates[key] # type: ignore[return-value]
|
|
379
|
+
return get_prompt_template(
|
|
380
|
+
config.get("prompt_templates", {}).get(key, {}).get(FILE_PATH_KEY),
|
|
381
|
+
default_value,
|
|
382
|
+
)
|
|
383
|
+
|
|
384
|
+
@classmethod
|
|
385
|
+
def _load_prompt_templates(
|
|
386
|
+
cls, model_storage: ModelStorage, resource: Resource
|
|
387
|
+
) -> Dict[Text, Text]:
|
|
388
|
+
"""Loads persisted prompt templates from the model storage. If a prompt template
|
|
389
|
+
cannot be loaded, default value is used.
|
|
390
|
+
"""
|
|
391
|
+
prompts = {}
|
|
392
|
+
for key, (file_name, default_value) in PROMPT_TEMPLATES.items():
|
|
393
|
+
prompt_template = cls.load_prompt_template_from_model_storage(
|
|
394
|
+
model_storage, resource, file_name
|
|
395
|
+
)
|
|
396
|
+
prompts[key] = prompt_template if prompt_template else default_value
|
|
397
|
+
return prompts
|
|
398
|
+
|
|
399
|
+
def _persist_prompt_templates(self) -> None:
|
|
400
|
+
"""Persist the prompt templates to disk for future loading."""
|
|
401
|
+
with self._model_storage.write_to(self._resource) as path:
|
|
402
|
+
for key, template in self._prompts.items():
|
|
403
|
+
file_name, _ = PROMPT_TEMPLATES[key]
|
|
404
|
+
file_path = path / file_name
|
|
405
|
+
rasa.shared.utils.io.write_text_file(template, file_path)
|
|
406
|
+
|
|
407
|
+
def _persist_config(self) -> None:
|
|
408
|
+
"""Persist config as a source of truth for resolved clients."""
|
|
409
|
+
with self._model_storage.write_to(self._resource) as path:
|
|
410
|
+
rasa.shared.utils.io.dump_obj_as_json_to_file(
|
|
411
|
+
path / MULTI_STEP_LLM_COMMAND_GENERATOR_CONFIG_FILE, self.config
|
|
412
|
+
)
|
|
413
|
+
|
|
414
|
+
async def _predict_commands_with_multi_step(
|
|
415
|
+
self,
|
|
416
|
+
message: Message,
|
|
417
|
+
flows: FlowsList,
|
|
418
|
+
tracker: DialogueStateTracker,
|
|
419
|
+
) -> List[Command]:
|
|
420
|
+
"""Predict commands using the LLM.
|
|
421
|
+
|
|
422
|
+
Args:
|
|
423
|
+
message: The message from the user.
|
|
424
|
+
flows: The flows available to the user.
|
|
425
|
+
tracker: The tracker containing the current state of the conversation.
|
|
426
|
+
|
|
427
|
+
Returns:
|
|
428
|
+
The commands generated by the llm.
|
|
429
|
+
|
|
430
|
+
Raises:
|
|
431
|
+
ProviderClientAPIException: If API calls raised an error.
|
|
432
|
+
"""
|
|
433
|
+
# retrieve relevant flows
|
|
434
|
+
filtered_flows = await self.filter_flows(message, flows, tracker)
|
|
435
|
+
|
|
436
|
+
# 1st step: Handle active flow
|
|
437
|
+
if tracker.has_active_user_flow:
|
|
438
|
+
commands_from_active_flow = await self._predict_commands_for_active_flow(
|
|
439
|
+
message,
|
|
440
|
+
tracker,
|
|
441
|
+
available_flows=filtered_flows,
|
|
442
|
+
all_flows=flows,
|
|
443
|
+
)
|
|
444
|
+
else:
|
|
445
|
+
commands_from_active_flow = []
|
|
446
|
+
|
|
447
|
+
# 2nd step: Check if we need to switch to another flow
|
|
448
|
+
contains_change_flow_command = any(
|
|
449
|
+
isinstance(command, ChangeFlowCommand)
|
|
450
|
+
for command in commands_from_active_flow
|
|
451
|
+
)
|
|
452
|
+
should_change_flows = (
|
|
453
|
+
not commands_from_active_flow or contains_change_flow_command
|
|
454
|
+
)
|
|
455
|
+
|
|
456
|
+
if should_change_flows:
|
|
457
|
+
commands_for_handling_flows = (
|
|
458
|
+
await self._predict_commands_for_handling_flows(
|
|
459
|
+
message,
|
|
460
|
+
tracker,
|
|
461
|
+
available_flows=filtered_flows,
|
|
462
|
+
all_flows=flows,
|
|
463
|
+
)
|
|
464
|
+
)
|
|
465
|
+
else:
|
|
466
|
+
commands_for_handling_flows = []
|
|
467
|
+
|
|
468
|
+
if contains_change_flow_command:
|
|
469
|
+
commands_from_active_flow.pop(
|
|
470
|
+
commands_from_active_flow.index(ChangeFlowCommand())
|
|
471
|
+
)
|
|
472
|
+
|
|
473
|
+
# 3rd step: Fill slots for started flows
|
|
474
|
+
newly_started_flows = FlowsList(
|
|
475
|
+
[
|
|
476
|
+
flow
|
|
477
|
+
for command in commands_for_handling_flows
|
|
478
|
+
if (
|
|
479
|
+
isinstance(command, StartFlowCommand)
|
|
480
|
+
and (flow := filtered_flows.flow_by_id(command.flow)) is not None
|
|
481
|
+
)
|
|
482
|
+
]
|
|
483
|
+
)
|
|
484
|
+
|
|
485
|
+
commands_for_newly_started_flows = (
|
|
486
|
+
await self._predict_commands_for_newly_started_flows(
|
|
487
|
+
message,
|
|
488
|
+
tracker,
|
|
489
|
+
newly_started_flows=newly_started_flows,
|
|
490
|
+
all_flows=flows,
|
|
491
|
+
)
|
|
492
|
+
)
|
|
493
|
+
|
|
494
|
+
# concatenate predicted commands
|
|
495
|
+
commands = list(
|
|
496
|
+
set(
|
|
497
|
+
commands_from_active_flow
|
|
498
|
+
+ commands_for_handling_flows
|
|
499
|
+
+ commands_for_newly_started_flows
|
|
500
|
+
)
|
|
501
|
+
)
|
|
502
|
+
|
|
503
|
+
return commands
|
|
504
|
+
|
|
505
|
+
async def _predict_commands_for_active_flow(
|
|
506
|
+
self,
|
|
507
|
+
message: Message,
|
|
508
|
+
tracker: DialogueStateTracker,
|
|
509
|
+
available_flows: FlowsList,
|
|
510
|
+
all_flows: FlowsList,
|
|
511
|
+
) -> List[Command]:
|
|
512
|
+
"""Predicts set slots commands for currently active flow.
|
|
513
|
+
|
|
514
|
+
Args:
|
|
515
|
+
message: The message from the user.
|
|
516
|
+
tracker: The tracker containing the current state of the conversation.
|
|
517
|
+
available_flows: Startable and active flows.
|
|
518
|
+
all_flows: All flows.
|
|
519
|
+
|
|
520
|
+
inputs = self._prepare_inputs(message, tracker, startable_flows, all_flows)
|
|
521
|
+
|
|
522
|
+
Returns:
|
|
523
|
+
Predicted commands for the active flow.
|
|
524
|
+
"""
|
|
525
|
+
inputs = self._prepare_inputs(message, tracker, available_flows, all_flows)
|
|
526
|
+
|
|
527
|
+
if inputs["current_flow"] is None:
|
|
528
|
+
return []
|
|
529
|
+
|
|
530
|
+
prompt = Template(self.fill_slots_prompt).render(**inputs).strip()
|
|
531
|
+
structlogger.debug(
|
|
532
|
+
"multi_step_llm_command_generator"
|
|
533
|
+
".predict_commands_for_active_flow"
|
|
534
|
+
".prompt_rendered",
|
|
535
|
+
prompt=prompt,
|
|
536
|
+
)
|
|
537
|
+
|
|
538
|
+
actions = await self.invoke_llm(prompt)
|
|
539
|
+
structlogger.debug(
|
|
540
|
+
"multi_step_llm_command_generator"
|
|
541
|
+
".predict_commands_for_active_flow"
|
|
542
|
+
".actions_generated",
|
|
543
|
+
action_list=actions,
|
|
544
|
+
)
|
|
545
|
+
|
|
546
|
+
commands = self.parse_commands(actions, tracker, available_flows)
|
|
547
|
+
|
|
548
|
+
if commands:
|
|
549
|
+
self._add_prompt_to_message_parse_data(
|
|
550
|
+
message,
|
|
551
|
+
MultiStepLLMCommandGenerator.__name__,
|
|
552
|
+
"fill_slots_for_active_flow_prompt",
|
|
553
|
+
prompt,
|
|
554
|
+
)
|
|
555
|
+
|
|
556
|
+
return commands
|
|
557
|
+
|
|
558
|
+
async def _predict_commands_for_handling_flows(
|
|
559
|
+
self,
|
|
560
|
+
message: Message,
|
|
561
|
+
tracker: DialogueStateTracker,
|
|
562
|
+
available_flows: FlowsList,
|
|
563
|
+
all_flows: FlowsList,
|
|
564
|
+
) -> List[Command]:
|
|
565
|
+
"""Predicts commands for starting and canceling flows.
|
|
566
|
+
|
|
567
|
+
Args:
|
|
568
|
+
message: The message from the user.
|
|
569
|
+
tracker: The tracker containing the current state of the conversation.
|
|
570
|
+
available_flows: Startable and active flows.
|
|
571
|
+
all_flows: All flows.
|
|
572
|
+
|
|
573
|
+
inputs = self._prepare_inputs(message, tracker, startable_flows, all_flows, 2)
|
|
574
|
+
|
|
575
|
+
Returns:
|
|
576
|
+
Predicted commands for the starting/canceling flows.
|
|
577
|
+
"""
|
|
578
|
+
inputs = self._prepare_inputs(message, tracker, available_flows, all_flows, 2)
|
|
579
|
+
prompt = Template(self.handle_flows_prompt).render(**inputs).strip()
|
|
580
|
+
structlogger.debug(
|
|
581
|
+
"multi_step_llm_command_generator"
|
|
582
|
+
".predict_commands_for_handling_flows"
|
|
583
|
+
".prompt_rendered",
|
|
584
|
+
prompt=prompt,
|
|
585
|
+
)
|
|
586
|
+
|
|
587
|
+
actions = await self.invoke_llm(prompt)
|
|
588
|
+
structlogger.debug(
|
|
589
|
+
"multi_step_llm_command_generator"
|
|
590
|
+
".predict_commands_for_handling_flows"
|
|
591
|
+
".actions_generated",
|
|
592
|
+
action_list=actions,
|
|
593
|
+
)
|
|
594
|
+
|
|
595
|
+
commands = self.parse_commands(actions, tracker, available_flows, True)
|
|
596
|
+
# filter out flows that are already started and active
|
|
597
|
+
commands = self._filter_redundant_start_flow_commands(tracker, commands)
|
|
598
|
+
|
|
599
|
+
if commands:
|
|
600
|
+
self._add_prompt_to_message_parse_data(
|
|
601
|
+
message,
|
|
602
|
+
MultiStepLLMCommandGenerator.__name__,
|
|
603
|
+
"handle_flows_prompt",
|
|
604
|
+
prompt,
|
|
605
|
+
)
|
|
606
|
+
|
|
607
|
+
return commands
|
|
608
|
+
|
|
609
|
+
@staticmethod
|
|
610
|
+
def _filter_redundant_start_flow_commands(
|
|
611
|
+
tracker: DialogueStateTracker, commands: List[Command]
|
|
612
|
+
) -> List[Command]:
|
|
613
|
+
"""Filters out StartFlowCommand commands for flows that are already active,
|
|
614
|
+
based on the current tracker state.
|
|
615
|
+
"""
|
|
616
|
+
frames = tracker.stack.frames
|
|
617
|
+
active_user_flows = {
|
|
618
|
+
frame.flow_id for frame in frames if isinstance(frame, UserFlowStackFrame)
|
|
619
|
+
}
|
|
620
|
+
commands = [
|
|
621
|
+
command
|
|
622
|
+
for command in commands
|
|
623
|
+
if not (
|
|
624
|
+
isinstance(command, StartFlowCommand)
|
|
625
|
+
and command.flow in active_user_flows
|
|
626
|
+
)
|
|
627
|
+
]
|
|
628
|
+
return commands
|
|
629
|
+
|
|
630
|
+
async def _predict_commands_for_newly_started_flows(
|
|
631
|
+
self,
|
|
632
|
+
message: Message,
|
|
633
|
+
tracker: DialogueStateTracker,
|
|
634
|
+
newly_started_flows: FlowsList,
|
|
635
|
+
all_flows: FlowsList,
|
|
636
|
+
) -> List[Command]:
|
|
637
|
+
"""Predict set slot commands for newly started flows."""
|
|
638
|
+
commands_for_newly_started_flows = []
|
|
639
|
+
for newly_started_flow in newly_started_flows:
|
|
640
|
+
commands_for_newly_started_flows += (
|
|
641
|
+
await self._predict_commands_for_newly_started_flow(
|
|
642
|
+
newly_started_flow, message, tracker, newly_started_flows
|
|
643
|
+
)
|
|
644
|
+
)
|
|
645
|
+
return commands_for_newly_started_flows
|
|
646
|
+
|
|
647
|
+
async def _predict_commands_for_newly_started_flow(
|
|
648
|
+
self,
|
|
649
|
+
newly_started_flow: Flow,
|
|
650
|
+
message: Message,
|
|
651
|
+
tracker: DialogueStateTracker,
|
|
652
|
+
newly_started_flows: FlowsList,
|
|
653
|
+
) -> List[Command]:
|
|
654
|
+
inputs = self._prepare_inputs_for_single_flow(
|
|
655
|
+
message, tracker, newly_started_flow, max_turns=20
|
|
656
|
+
)
|
|
657
|
+
|
|
658
|
+
if len(inputs["flow_slots"]) == 0:
|
|
659
|
+
# return empty if the newly started flow does not have any slots
|
|
660
|
+
return []
|
|
661
|
+
|
|
662
|
+
prompt = Template(self.fill_slots_prompt).render(**inputs)
|
|
663
|
+
structlogger.debug(
|
|
664
|
+
"multi_step_llm_command_generator"
|
|
665
|
+
".predict_commands_for_newly_started_flow"
|
|
666
|
+
".prompt_rendered",
|
|
667
|
+
flow=newly_started_flow.id,
|
|
668
|
+
prompt=prompt,
|
|
669
|
+
)
|
|
670
|
+
|
|
671
|
+
actions = await self.invoke_llm(prompt)
|
|
672
|
+
structlogger.debug(
|
|
673
|
+
"multi_step_llm_command_generator"
|
|
674
|
+
".predict_commands_for_newly_started_flow"
|
|
675
|
+
".actions_generated",
|
|
676
|
+
flow=newly_started_flow.id,
|
|
677
|
+
action_list=actions,
|
|
678
|
+
)
|
|
679
|
+
|
|
680
|
+
commands = self.parse_commands(actions, tracker, newly_started_flows)
|
|
681
|
+
|
|
682
|
+
# filter out all commands that unset values for newly started flow
|
|
683
|
+
commands = [
|
|
684
|
+
command
|
|
685
|
+
for command in commands
|
|
686
|
+
if isinstance(command, SetSlotCommand) and command.value
|
|
687
|
+
]
|
|
688
|
+
structlogger.debug(
|
|
689
|
+
"multi_step_llm_command_generator"
|
|
690
|
+
".predict_commands_for_newly_started_flow"
|
|
691
|
+
".filtered_commands",
|
|
692
|
+
flow=newly_started_flow.id,
|
|
693
|
+
commands=commands,
|
|
694
|
+
)
|
|
695
|
+
|
|
696
|
+
if commands:
|
|
697
|
+
self._add_prompt_to_message_parse_data(
|
|
698
|
+
message,
|
|
699
|
+
MultiStepLLMCommandGenerator.__name__,
|
|
700
|
+
"fill_slots_for_new_flow_prompt",
|
|
701
|
+
prompt,
|
|
702
|
+
)
|
|
703
|
+
|
|
704
|
+
return commands
|
|
705
|
+
|
|
706
|
+
def _prepare_inputs(
|
|
707
|
+
self,
|
|
708
|
+
message: Message,
|
|
709
|
+
tracker: DialogueStateTracker,
|
|
710
|
+
available_flows: FlowsList,
|
|
711
|
+
all_flows: FlowsList,
|
|
712
|
+
max_turns: int = 1,
|
|
713
|
+
) -> Dict[str, Any]:
|
|
714
|
+
"""Prepare input information to be used by prompt template.
|
|
715
|
+
|
|
716
|
+
Args:
|
|
717
|
+
message: The message from the user.
|
|
718
|
+
tracker: The tracker containing the current state of the conversation.
|
|
719
|
+
available_flows: Startable and active flows.
|
|
720
|
+
all_flows: All flows.
|
|
721
|
+
max_turns: Max turns of the conversation history between the user
|
|
722
|
+
and the assistant
|
|
723
|
+
|
|
724
|
+
Returns:
|
|
725
|
+
Dictionary of inputs.
|
|
726
|
+
"""
|
|
727
|
+
top_relevant_frame = top_flow_frame(tracker.stack)
|
|
728
|
+
top_flow = top_relevant_frame.flow(all_flows) if top_relevant_frame else None
|
|
729
|
+
current_step = (
|
|
730
|
+
top_relevant_frame.step(all_flows) if top_relevant_frame else None
|
|
731
|
+
)
|
|
732
|
+
if top_flow is not None:
|
|
733
|
+
flow_slots = self.prepare_current_flow_slots_for_template(
|
|
734
|
+
top_flow, current_step, tracker
|
|
735
|
+
)
|
|
736
|
+
top_flow_is_pattern = top_flow.is_rasa_default_flow
|
|
737
|
+
else:
|
|
738
|
+
flow_slots = []
|
|
739
|
+
top_flow_is_pattern = False
|
|
740
|
+
|
|
741
|
+
if top_flow_is_pattern:
|
|
742
|
+
top_user_frame = top_user_flow_frame(tracker.stack)
|
|
743
|
+
top_user_flow = (
|
|
744
|
+
top_user_frame.flow(available_flows) if top_user_frame else None
|
|
745
|
+
)
|
|
746
|
+
top_user_flow_step = (
|
|
747
|
+
top_user_frame.step(available_flows) if top_user_frame else None
|
|
748
|
+
)
|
|
749
|
+
top_user_flow_slots = self.prepare_current_flow_slots_for_template(
|
|
750
|
+
top_user_flow, top_user_flow_step, tracker
|
|
751
|
+
)
|
|
752
|
+
else:
|
|
753
|
+
top_user_flow = None
|
|
754
|
+
top_user_flow_slots = []
|
|
755
|
+
|
|
756
|
+
current_slot, current_slot_description = self.prepare_current_slot_for_template(
|
|
757
|
+
current_step
|
|
758
|
+
)
|
|
759
|
+
current_slot_type = None
|
|
760
|
+
current_slot_allowed_values = None
|
|
761
|
+
if current_slot:
|
|
762
|
+
current_slot_type = (
|
|
763
|
+
slot.type_name
|
|
764
|
+
if (slot := tracker.slots.get(current_slot)) is not None
|
|
765
|
+
else None
|
|
766
|
+
)
|
|
767
|
+
current_slot_allowed_values = allowed_values_for_slot(
|
|
768
|
+
tracker.slots.get(current_slot)
|
|
769
|
+
)
|
|
770
|
+
(
|
|
771
|
+
current_conversation,
|
|
772
|
+
latest_user_message,
|
|
773
|
+
) = self.prepare_conversation_context_for_template(message, tracker, max_turns)
|
|
774
|
+
|
|
775
|
+
inputs = {
|
|
776
|
+
"available_flows": self.prepare_flows_for_template(
|
|
777
|
+
available_flows, tracker
|
|
778
|
+
),
|
|
779
|
+
"current_conversation": current_conversation,
|
|
780
|
+
"current_flow": top_flow.id if top_flow is not None else None,
|
|
781
|
+
"current_slot": current_slot,
|
|
782
|
+
"current_slot_description": current_slot_description,
|
|
783
|
+
"current_slot_type": current_slot_type,
|
|
784
|
+
"current_slot_allowed_values": current_slot_allowed_values,
|
|
785
|
+
"last_user_message": latest_user_message,
|
|
786
|
+
"flow_slots": flow_slots,
|
|
787
|
+
"top_flow_is_pattern": top_flow_is_pattern,
|
|
788
|
+
"top_user_flow": top_user_flow.id if top_user_flow is not None else None,
|
|
789
|
+
"top_user_flow_slots": top_user_flow_slots,
|
|
790
|
+
"flow_active": True,
|
|
791
|
+
}
|
|
792
|
+
return inputs
|
|
793
|
+
|
|
794
|
+
def _prepare_inputs_for_single_flow(
|
|
795
|
+
self,
|
|
796
|
+
message: Message,
|
|
797
|
+
tracker: DialogueStateTracker,
|
|
798
|
+
flow: Flow,
|
|
799
|
+
max_turns: int = 1,
|
|
800
|
+
) -> Dict[Text, Any]:
|
|
801
|
+
flow_slots = self.prepare_current_flow_slots_for_template(
|
|
802
|
+
flow, flow.first_step_in_flow(), tracker
|
|
803
|
+
)
|
|
804
|
+
(
|
|
805
|
+
current_conversation,
|
|
806
|
+
latest_user_message,
|
|
807
|
+
) = self.prepare_conversation_context_for_template(message, tracker, max_turns)
|
|
808
|
+
inputs = {
|
|
809
|
+
"current_conversation": current_conversation,
|
|
810
|
+
"flow_slots": flow_slots,
|
|
811
|
+
"current_flow": flow.id,
|
|
812
|
+
"last_user_message": latest_user_message,
|
|
813
|
+
"flow_active": False,
|
|
814
|
+
}
|
|
815
|
+
return inputs
|
|
816
|
+
|
|
817
|
+
@classmethod
|
|
818
|
+
def fingerprint_addon(cls, config: Dict[str, Any]) -> Optional[str]:
|
|
819
|
+
"""Add a fingerprint for the graph."""
|
|
820
|
+
handle_flows_template = get_prompt_template(
|
|
821
|
+
config.get("prompt_templates", {})
|
|
822
|
+
.get(HANDLE_FLOWS_KEY, {})
|
|
823
|
+
.get(FILE_PATH_KEY),
|
|
824
|
+
DEFAULT_HANDLE_FLOWS_TEMPLATE,
|
|
825
|
+
)
|
|
826
|
+
fill_slots_template = get_prompt_template(
|
|
827
|
+
config.get("prompt_templates", {})
|
|
828
|
+
.get(FILL_SLOTS_KEY, {})
|
|
829
|
+
.get(FILE_PATH_KEY),
|
|
830
|
+
DEFAULT_FILL_SLOTS_TEMPLATE,
|
|
831
|
+
)
|
|
832
|
+
|
|
833
|
+
llm_config = resolve_model_client_config(
|
|
834
|
+
config.get(LLM_CONFIG_KEY), MultiStepLLMCommandGenerator.__name__
|
|
835
|
+
)
|
|
836
|
+
embedding_config = resolve_model_client_config(
|
|
837
|
+
config.get(FLOW_RETRIEVAL_KEY, {}).get(EMBEDDINGS_CONFIG_KEY),
|
|
838
|
+
FlowRetrieval.__name__,
|
|
839
|
+
)
|
|
840
|
+
|
|
841
|
+
return deep_container_fingerprint(
|
|
842
|
+
[handle_flows_template, fill_slots_template, llm_config, embedding_config]
|
|
843
|
+
)
|
|
844
|
+
|
|
845
|
+
@staticmethod
|
|
846
|
+
def prepare_conversation_context_for_template(
|
|
847
|
+
message: Message, tracker: DialogueStateTracker, max_turns: int = 20
|
|
848
|
+
) -> Tuple[Text, Text]:
|
|
849
|
+
current_conversation = tracker_as_readable_transcript(
|
|
850
|
+
tracker, max_turns=max_turns
|
|
851
|
+
)
|
|
852
|
+
latest_user_message = sanitize_message_for_prompt(message.get(TEXT))
|
|
853
|
+
current_conversation += f"\nUSER: {latest_user_message}"
|
|
854
|
+
return current_conversation, latest_user_message
|
|
855
|
+
|
|
856
|
+
def prepare_current_flow_slots_for_template(
|
|
857
|
+
self, top_flow: Flow, current_step: FlowStep, tracker: DialogueStateTracker
|
|
858
|
+
) -> List[Dict[Text, Any]]:
|
|
859
|
+
"""Prepare the current flow slots for the template.
|
|
860
|
+
|
|
861
|
+
Args:
|
|
862
|
+
top_flow: The top flow.
|
|
863
|
+
current_step: The current step in the flow.
|
|
864
|
+
tracker: The tracker containing the current state of the conversation.
|
|
865
|
+
|
|
866
|
+
Returns:
|
|
867
|
+
The slots with values, types, allowed values and a description.
|
|
868
|
+
"""
|
|
869
|
+
if top_flow is not None:
|
|
870
|
+
flow_slots = [
|
|
871
|
+
{
|
|
872
|
+
"name": collect_step.collect,
|
|
873
|
+
"value": self.get_slot_value(tracker, collect_step.collect),
|
|
874
|
+
"type": tracker.slots[collect_step.collect].type_name,
|
|
875
|
+
"allowed_values": allowed_values_for_slot(
|
|
876
|
+
tracker.slots[collect_step.collect]
|
|
877
|
+
),
|
|
878
|
+
"description": collect_step.description,
|
|
879
|
+
}
|
|
880
|
+
for collect_step in top_flow.get_collect_steps()
|
|
881
|
+
if self.is_extractable(collect_step, tracker, current_step)
|
|
882
|
+
]
|
|
883
|
+
else:
|
|
884
|
+
flow_slots = []
|
|
885
|
+
return flow_slots
|
|
886
|
+
|
|
887
|
+
@staticmethod
|
|
888
|
+
def prepare_current_slot_for_template(
|
|
889
|
+
current_step: FlowStep,
|
|
890
|
+
) -> Tuple[Union[str, None], Union[str, None]]:
|
|
891
|
+
"""Prepare the current slot for the template."""
|
|
892
|
+
return (
|
|
893
|
+
(current_step.collect, current_step.description)
|
|
894
|
+
if isinstance(current_step, CollectInformationFlowStep)
|
|
895
|
+
else (None, None)
|
|
896
|
+
)
|
|
897
|
+
|
|
898
|
+
@staticmethod
|
|
899
|
+
def _clean_up_commands(commands: List[Command]) -> List[Command]:
|
|
900
|
+
"""Cleans the list of commands by removing CannotHandleCommand,
|
|
901
|
+
if it exists and there are other commands in the list.
|
|
902
|
+
"""
|
|
903
|
+
other_commands_count = sum(
|
|
904
|
+
not isinstance(command, CannotHandleCommand) for command in commands
|
|
905
|
+
)
|
|
906
|
+
|
|
907
|
+
if other_commands_count == len(commands):
|
|
908
|
+
# no cannot handle command found
|
|
909
|
+
return commands
|
|
910
|
+
|
|
911
|
+
if other_commands_count:
|
|
912
|
+
# remove cannot handle commands
|
|
913
|
+
return [
|
|
914
|
+
command
|
|
915
|
+
for command in commands
|
|
916
|
+
if not isinstance(command, CannotHandleCommand)
|
|
917
|
+
]
|
|
918
|
+
|
|
919
|
+
# only cannot handle commands present
|
|
920
|
+
return [CannotHandleCommand(RASA_PATTERN_CANNOT_HANDLE_NOT_SUPPORTED)]
|