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,500 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from functools import lru_cache
|
|
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
|
+
StartFlowCommand,
|
|
12
|
+
)
|
|
13
|
+
from rasa.dialogue_understanding.generator import CommandGenerator
|
|
14
|
+
from rasa.dialogue_understanding.generator.constants import (
|
|
15
|
+
DEFAULT_LLM_CONFIG,
|
|
16
|
+
LLM_CONFIG_KEY,
|
|
17
|
+
FLOW_RETRIEVAL_KEY,
|
|
18
|
+
FLOW_RETRIEVAL_ACTIVE_KEY,
|
|
19
|
+
FLOW_RETRIEVAL_FLOW_THRESHOLD,
|
|
20
|
+
)
|
|
21
|
+
from rasa.dialogue_understanding.generator.flow_retrieval import FlowRetrieval
|
|
22
|
+
from rasa.engine.graph import GraphComponent, ExecutionContext
|
|
23
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
24
|
+
from rasa.engine.storage.resource import Resource
|
|
25
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
26
|
+
from rasa.shared.core.domain import Domain
|
|
27
|
+
from rasa.shared.core.flows import FlowStep, Flow, FlowsList
|
|
28
|
+
from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
|
|
29
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
30
|
+
from rasa.shared.exceptions import FileIOException
|
|
31
|
+
from rasa.shared.exceptions import ProviderClientAPIException
|
|
32
|
+
from rasa.shared.nlu.constants import FLOWS_IN_PROMPT
|
|
33
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
34
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
35
|
+
from rasa.shared.utils.health_check.llm_health_check_mixin import LLMHealthCheckMixin
|
|
36
|
+
from rasa.shared.utils.llm import (
|
|
37
|
+
allowed_values_for_slot,
|
|
38
|
+
llm_factory,
|
|
39
|
+
resolve_model_client_config,
|
|
40
|
+
)
|
|
41
|
+
from rasa.utils.log_utils import log_llm
|
|
42
|
+
|
|
43
|
+
structlogger = structlog.get_logger()
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@DefaultV1Recipe.register(
|
|
47
|
+
[
|
|
48
|
+
DefaultV1Recipe.ComponentType.COMMAND_GENERATOR,
|
|
49
|
+
],
|
|
50
|
+
is_trainable=True,
|
|
51
|
+
)
|
|
52
|
+
class LLMBasedCommandGenerator(
|
|
53
|
+
LLMHealthCheckMixin, GraphComponent, CommandGenerator, ABC
|
|
54
|
+
):
|
|
55
|
+
"""An abstract class defining interface and common functionality
|
|
56
|
+
of an LLM-based command generators.
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
def __init__(
|
|
60
|
+
self,
|
|
61
|
+
config: Dict[str, Any],
|
|
62
|
+
model_storage: ModelStorage,
|
|
63
|
+
resource: Resource,
|
|
64
|
+
**kwargs: Any,
|
|
65
|
+
) -> None:
|
|
66
|
+
super().__init__(config)
|
|
67
|
+
self.config = {**self.get_default_config(), **config}
|
|
68
|
+
self.config[LLM_CONFIG_KEY] = resolve_model_client_config(
|
|
69
|
+
self.config.get(LLM_CONFIG_KEY), LLMBasedCommandGenerator.__name__
|
|
70
|
+
)
|
|
71
|
+
self._model_storage = model_storage
|
|
72
|
+
self._resource = resource
|
|
73
|
+
self.flow_retrieval: Optional[FlowRetrieval]
|
|
74
|
+
|
|
75
|
+
if self.enabled_flow_retrieval:
|
|
76
|
+
self.flow_retrieval = FlowRetrieval(
|
|
77
|
+
self.config[FLOW_RETRIEVAL_KEY], model_storage, resource
|
|
78
|
+
)
|
|
79
|
+
structlogger.info("llm_based_command_generator.flow_retrieval.enabled")
|
|
80
|
+
self.config[FLOW_RETRIEVAL_KEY] = self.flow_retrieval.config
|
|
81
|
+
else:
|
|
82
|
+
self.flow_retrieval = None
|
|
83
|
+
|
|
84
|
+
### Abstract methods
|
|
85
|
+
@staticmethod
|
|
86
|
+
@abstractmethod
|
|
87
|
+
def get_default_config() -> Dict[str, Any]:
|
|
88
|
+
"""The component's default config."""
|
|
89
|
+
pass
|
|
90
|
+
|
|
91
|
+
@classmethod
|
|
92
|
+
@abstractmethod
|
|
93
|
+
def load(
|
|
94
|
+
cls: Any,
|
|
95
|
+
config: Dict[str, Any],
|
|
96
|
+
model_storage: ModelStorage,
|
|
97
|
+
resource: Resource,
|
|
98
|
+
execution_context: ExecutionContext,
|
|
99
|
+
**kwargs: Any,
|
|
100
|
+
) -> "LLMBasedCommandGenerator":
|
|
101
|
+
"""Loads trained component (see parent class for full docstring)."""
|
|
102
|
+
pass
|
|
103
|
+
|
|
104
|
+
@abstractmethod
|
|
105
|
+
def persist(self) -> None:
|
|
106
|
+
"""Persist the component to disk for future loading."""
|
|
107
|
+
pass
|
|
108
|
+
|
|
109
|
+
@abstractmethod
|
|
110
|
+
async def predict_commands(
|
|
111
|
+
self,
|
|
112
|
+
message: Message,
|
|
113
|
+
flows: FlowsList,
|
|
114
|
+
tracker: Optional[DialogueStateTracker] = None,
|
|
115
|
+
**kwargs: Any,
|
|
116
|
+
) -> List[Command]:
|
|
117
|
+
"""Predict commands using the LLM.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
message: The message from the user.
|
|
121
|
+
flows: The flows available to the user.
|
|
122
|
+
tracker: The tracker containing the current state of the conversation.
|
|
123
|
+
**kwargs: Keyword arguments for forward compatibility.
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
The commands generated by the llm.
|
|
127
|
+
"""
|
|
128
|
+
pass
|
|
129
|
+
|
|
130
|
+
@abstractmethod
|
|
131
|
+
def parse_commands(
|
|
132
|
+
cls, actions: Optional[str], tracker: DialogueStateTracker, flows: FlowsList
|
|
133
|
+
) -> List[Command]:
|
|
134
|
+
"""Parse the actions returned by the llm into intent and entities.
|
|
135
|
+
|
|
136
|
+
Args:
|
|
137
|
+
actions: The actions returned by the llm.
|
|
138
|
+
tracker: The tracker containing the current state of the conversation.
|
|
139
|
+
flows: the list of flows
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
The parsed commands.
|
|
143
|
+
"""
|
|
144
|
+
pass
|
|
145
|
+
|
|
146
|
+
@classmethod
|
|
147
|
+
@abstractmethod
|
|
148
|
+
def fingerprint_addon(cls: Any, config: Dict[str, Any]) -> Optional[str]:
|
|
149
|
+
"""Add a fingerprint of the knowledge base for the graph."""
|
|
150
|
+
pass
|
|
151
|
+
|
|
152
|
+
### Shared implementations of GraphComponent parent
|
|
153
|
+
@classmethod
|
|
154
|
+
def create(
|
|
155
|
+
cls,
|
|
156
|
+
config: Dict[str, Any],
|
|
157
|
+
model_storage: ModelStorage,
|
|
158
|
+
resource: Resource,
|
|
159
|
+
execution_context: ExecutionContext,
|
|
160
|
+
) -> "LLMBasedCommandGenerator":
|
|
161
|
+
"""Creates a new untrained component (see parent class for full docstring)."""
|
|
162
|
+
return cls(config, model_storage, resource)
|
|
163
|
+
|
|
164
|
+
def train(
|
|
165
|
+
self, training_data: TrainingData, flows: FlowsList, domain: Domain
|
|
166
|
+
) -> Resource:
|
|
167
|
+
"""Train the llm based command generator. Stores all flows into a vector
|
|
168
|
+
store.
|
|
169
|
+
"""
|
|
170
|
+
self.perform_llm_health_check(
|
|
171
|
+
self.config.get(LLM_CONFIG_KEY),
|
|
172
|
+
DEFAULT_LLM_CONFIG,
|
|
173
|
+
"llm_based_command_generator.train",
|
|
174
|
+
LLMBasedCommandGenerator.__name__,
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
if (
|
|
178
|
+
self.flow_retrieval is None
|
|
179
|
+
and len(flows.user_flows) > FLOW_RETRIEVAL_FLOW_THRESHOLD
|
|
180
|
+
):
|
|
181
|
+
structlogger.warn(
|
|
182
|
+
"llm_based_command_generator.flow_retrieval.disabled",
|
|
183
|
+
event_info=(
|
|
184
|
+
f"You have {len(flows.user_flows)} user flows but flow "
|
|
185
|
+
f"retrieval is disabled. "
|
|
186
|
+
f"It is recommended to enable flow retrieval if the "
|
|
187
|
+
f"total number of user flows exceed "
|
|
188
|
+
f"{FLOW_RETRIEVAL_FLOW_THRESHOLD}. "
|
|
189
|
+
f"Keeping it disabled can result in deterioration of "
|
|
190
|
+
f"command generator's functional "
|
|
191
|
+
f"performance and higher costs because of increased "
|
|
192
|
+
f"number of tokens in the prompt. For more"
|
|
193
|
+
"information see:\n"
|
|
194
|
+
"https://rasa.com/docs/rasa-pro/concepts/dialogue-understanding#how-the-llmcommandgenerator-works"
|
|
195
|
+
),
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
# flow retrieval is populated with only user-defined flows
|
|
199
|
+
try:
|
|
200
|
+
if self.flow_retrieval is not None and not flows.is_empty():
|
|
201
|
+
self.flow_retrieval.populate(flows.user_flows, domain)
|
|
202
|
+
except Exception as e:
|
|
203
|
+
structlogger.error(
|
|
204
|
+
"llm_based_command_generator.train.failed",
|
|
205
|
+
event_info="Flow retrieval store is inaccessible.",
|
|
206
|
+
error=e,
|
|
207
|
+
)
|
|
208
|
+
raise
|
|
209
|
+
|
|
210
|
+
self.persist()
|
|
211
|
+
return self._resource
|
|
212
|
+
|
|
213
|
+
### Helper methods
|
|
214
|
+
@property
|
|
215
|
+
def enabled_flow_retrieval(self) -> bool:
|
|
216
|
+
return self.config[FLOW_RETRIEVAL_KEY].get(FLOW_RETRIEVAL_ACTIVE_KEY, True)
|
|
217
|
+
|
|
218
|
+
@lru_cache
|
|
219
|
+
def compile_template(self, template: str) -> Template:
|
|
220
|
+
"""Compile the prompt template.
|
|
221
|
+
|
|
222
|
+
Compiling the template is an expensive operation,
|
|
223
|
+
so we cache the result.
|
|
224
|
+
"""
|
|
225
|
+
return Template(template)
|
|
226
|
+
|
|
227
|
+
@classmethod
|
|
228
|
+
def load_prompt_template_from_model_storage(
|
|
229
|
+
cls,
|
|
230
|
+
model_storage: ModelStorage,
|
|
231
|
+
resource: Resource,
|
|
232
|
+
prompt_template_file_name: str,
|
|
233
|
+
) -> Optional[Text]:
|
|
234
|
+
try:
|
|
235
|
+
with model_storage.read_from(resource) as path:
|
|
236
|
+
return rasa.shared.utils.io.read_file(path / prompt_template_file_name)
|
|
237
|
+
except (FileNotFoundError, FileIOException) as e:
|
|
238
|
+
structlogger.warning(
|
|
239
|
+
"llm_based_command_generator.load_prompt_template.failed",
|
|
240
|
+
error=e,
|
|
241
|
+
resource=resource.name,
|
|
242
|
+
)
|
|
243
|
+
return None
|
|
244
|
+
|
|
245
|
+
@classmethod
|
|
246
|
+
def load_flow_retrival(
|
|
247
|
+
cls,
|
|
248
|
+
config: Dict[str, Any],
|
|
249
|
+
model_storage: ModelStorage,
|
|
250
|
+
resource: Resource,
|
|
251
|
+
) -> Optional[FlowRetrieval]:
|
|
252
|
+
"""Load the FlowRetrieval component if it is enabled in the configuration."""
|
|
253
|
+
enable_flow_retrieval = config.get(FLOW_RETRIEVAL_KEY, {}).get(
|
|
254
|
+
FLOW_RETRIEVAL_ACTIVE_KEY, True
|
|
255
|
+
)
|
|
256
|
+
if enable_flow_retrieval:
|
|
257
|
+
return FlowRetrieval.load(
|
|
258
|
+
config=config.get(FLOW_RETRIEVAL_KEY),
|
|
259
|
+
model_storage=model_storage,
|
|
260
|
+
resource=resource,
|
|
261
|
+
)
|
|
262
|
+
return None
|
|
263
|
+
|
|
264
|
+
async def filter_flows(
|
|
265
|
+
self,
|
|
266
|
+
message: Message,
|
|
267
|
+
flows: FlowsList,
|
|
268
|
+
tracker: Optional[DialogueStateTracker] = None,
|
|
269
|
+
) -> FlowsList:
|
|
270
|
+
"""Filters the available flows.
|
|
271
|
+
|
|
272
|
+
Args:
|
|
273
|
+
message: The message from the user.
|
|
274
|
+
flows: The flows available to the user.
|
|
275
|
+
tracker: The tracker containing the current state of the conversation.
|
|
276
|
+
|
|
277
|
+
Returns:
|
|
278
|
+
Filtered list of flows.
|
|
279
|
+
"""
|
|
280
|
+
# If the flow retrieval is disabled, use the all the provided flows.
|
|
281
|
+
filtered_flows = (
|
|
282
|
+
await self.flow_retrieval.filter_flows(tracker, message, flows)
|
|
283
|
+
if self.flow_retrieval is not None
|
|
284
|
+
else flows
|
|
285
|
+
)
|
|
286
|
+
# Filter flows based on current context (tracker and message)
|
|
287
|
+
# to identify which flows LLM can potentially start.
|
|
288
|
+
if tracker:
|
|
289
|
+
filtered_flows = tracker.get_startable_flows(filtered_flows)
|
|
290
|
+
else:
|
|
291
|
+
filtered_flows = filtered_flows
|
|
292
|
+
|
|
293
|
+
# add the filtered flows to the message for evaluation purposes
|
|
294
|
+
message.set(
|
|
295
|
+
FLOWS_IN_PROMPT, list(filtered_flows.user_flow_ids), add_to_output=True
|
|
296
|
+
)
|
|
297
|
+
log_llm(
|
|
298
|
+
logger=structlogger,
|
|
299
|
+
log_module="LLMBasedCommandGenerator",
|
|
300
|
+
log_event="llm_based_command_generator.predict_commands.filtered_flows",
|
|
301
|
+
message=message.data,
|
|
302
|
+
enabled_flow_retrieval=self.flow_retrieval is not None,
|
|
303
|
+
relevant_flows=list(filtered_flows.user_flow_ids),
|
|
304
|
+
)
|
|
305
|
+
return filtered_flows
|
|
306
|
+
|
|
307
|
+
async def invoke_llm(self, prompt: Text) -> Optional[Text]:
|
|
308
|
+
"""Use LLM to generate a response.
|
|
309
|
+
|
|
310
|
+
Args:
|
|
311
|
+
prompt: The prompt to send to the LLM.
|
|
312
|
+
|
|
313
|
+
Returns:
|
|
314
|
+
The generated text.
|
|
315
|
+
|
|
316
|
+
Raises:
|
|
317
|
+
ProviderClientAPIException if an error during API call.
|
|
318
|
+
"""
|
|
319
|
+
llm = llm_factory(self.config.get(LLM_CONFIG_KEY), DEFAULT_LLM_CONFIG)
|
|
320
|
+
try:
|
|
321
|
+
llm_response = await llm.acompletion(prompt)
|
|
322
|
+
return llm_response.choices[0]
|
|
323
|
+
except Exception as e:
|
|
324
|
+
# unfortunately, langchain does not wrap LLM exceptions which means
|
|
325
|
+
# we have to catch all exceptions here
|
|
326
|
+
structlogger.error("llm_based_command_generator.llm.error", error=e)
|
|
327
|
+
raise ProviderClientAPIException(
|
|
328
|
+
message="LLM call exception", original_exception=e
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
@staticmethod
|
|
332
|
+
def start_flow_by_name(flow_name: str, flows: FlowsList) -> List[Command]:
|
|
333
|
+
"""Start a flow by name.
|
|
334
|
+
|
|
335
|
+
If the flow does not exist, no command is returned.
|
|
336
|
+
"""
|
|
337
|
+
if flow_name in flows.user_flow_ids:
|
|
338
|
+
return [StartFlowCommand(flow=flow_name)]
|
|
339
|
+
else:
|
|
340
|
+
structlogger.debug(
|
|
341
|
+
"llm_command_generator.flow.start_invalid_flow_id", flow=flow_name
|
|
342
|
+
)
|
|
343
|
+
return []
|
|
344
|
+
|
|
345
|
+
@staticmethod
|
|
346
|
+
def is_none_value(value: str) -> bool:
|
|
347
|
+
"""Check if the value is a none value."""
|
|
348
|
+
return value in {
|
|
349
|
+
"[missing information]",
|
|
350
|
+
"[missing]",
|
|
351
|
+
"None",
|
|
352
|
+
"undefined",
|
|
353
|
+
"null",
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
@staticmethod
|
|
357
|
+
def clean_extracted_value(value: str) -> str:
|
|
358
|
+
"""Clean up the extracted value from the llm."""
|
|
359
|
+
# replace any combination of single quotes, double quotes, and spaces
|
|
360
|
+
# from the beginning and end of the string
|
|
361
|
+
return value.strip("'\" ")
|
|
362
|
+
|
|
363
|
+
@classmethod
|
|
364
|
+
def get_nullable_slot_value(cls, slot_value: str) -> Union[str, None]:
|
|
365
|
+
"""Get the slot value or None if the value is a none value.
|
|
366
|
+
|
|
367
|
+
Args:
|
|
368
|
+
slot_value: the value to coerce
|
|
369
|
+
|
|
370
|
+
Returns:
|
|
371
|
+
The slot value or None if the value is a none value.
|
|
372
|
+
"""
|
|
373
|
+
return slot_value if not cls.is_none_value(slot_value) else None
|
|
374
|
+
|
|
375
|
+
def prepare_flows_for_template(
|
|
376
|
+
self, flows: FlowsList, tracker: DialogueStateTracker
|
|
377
|
+
) -> List[Dict[str, Any]]:
|
|
378
|
+
"""Format data on available flows for insertion into the prompt template.
|
|
379
|
+
|
|
380
|
+
Args:
|
|
381
|
+
flows: The flows available to the user.
|
|
382
|
+
tracker: The tracker containing the current state of the conversation.
|
|
383
|
+
|
|
384
|
+
Returns:
|
|
385
|
+
The inputs for the prompt template.
|
|
386
|
+
"""
|
|
387
|
+
result = []
|
|
388
|
+
for flow in flows.user_flows:
|
|
389
|
+
slots_with_info = [
|
|
390
|
+
{
|
|
391
|
+
"name": q.collect,
|
|
392
|
+
"description": q.description,
|
|
393
|
+
"allowed_values": allowed_values_for_slot(tracker.slots[q.collect]),
|
|
394
|
+
}
|
|
395
|
+
for q in flow.get_collect_steps()
|
|
396
|
+
if self.is_extractable(q, tracker)
|
|
397
|
+
]
|
|
398
|
+
result.append(
|
|
399
|
+
{
|
|
400
|
+
"name": flow.id,
|
|
401
|
+
"description": flow.description,
|
|
402
|
+
"slots": slots_with_info,
|
|
403
|
+
}
|
|
404
|
+
)
|
|
405
|
+
return result
|
|
406
|
+
|
|
407
|
+
@staticmethod
|
|
408
|
+
def is_extractable(
|
|
409
|
+
collect_step: CollectInformationFlowStep,
|
|
410
|
+
tracker: DialogueStateTracker,
|
|
411
|
+
current_step: Optional[FlowStep] = None,
|
|
412
|
+
) -> bool:
|
|
413
|
+
"""Check if the `collect` can be filled.
|
|
414
|
+
|
|
415
|
+
A collect slot can only be filled if the slot exist
|
|
416
|
+
and either the collect has been asked already or the
|
|
417
|
+
slot has been filled already.
|
|
418
|
+
|
|
419
|
+
Args:
|
|
420
|
+
collect_step: The collect_information step.
|
|
421
|
+
tracker: The tracker containing the current state of the conversation.
|
|
422
|
+
current_step: The current step in the flow.
|
|
423
|
+
|
|
424
|
+
Returns:
|
|
425
|
+
`True` if the slot can be filled, `False` otherwise.
|
|
426
|
+
"""
|
|
427
|
+
slot = tracker.slots.get(collect_step.collect)
|
|
428
|
+
if slot is None:
|
|
429
|
+
return False
|
|
430
|
+
|
|
431
|
+
return (
|
|
432
|
+
# we can fill because this is a slot that can be filled ahead of time
|
|
433
|
+
not collect_step.ask_before_filling
|
|
434
|
+
# we can fill because the slot has been filled already
|
|
435
|
+
or slot.has_been_set
|
|
436
|
+
# we can fill because the is currently getting asked
|
|
437
|
+
or (
|
|
438
|
+
current_step is not None
|
|
439
|
+
and isinstance(current_step, CollectInformationFlowStep)
|
|
440
|
+
and current_step.collect == collect_step.collect
|
|
441
|
+
)
|
|
442
|
+
)
|
|
443
|
+
|
|
444
|
+
@staticmethod
|
|
445
|
+
def get_slot_value(tracker: DialogueStateTracker, slot_name: str) -> str:
|
|
446
|
+
"""Get the slot value from the tracker.
|
|
447
|
+
|
|
448
|
+
Args:
|
|
449
|
+
tracker: The tracker containing the current state of the conversation.
|
|
450
|
+
slot_name: The name of the slot.
|
|
451
|
+
|
|
452
|
+
Returns:
|
|
453
|
+
The slot value as a string.
|
|
454
|
+
"""
|
|
455
|
+
slot_value = tracker.get_slot(slot_name)
|
|
456
|
+
if slot_value is None:
|
|
457
|
+
return "undefined"
|
|
458
|
+
else:
|
|
459
|
+
return str(slot_value)
|
|
460
|
+
|
|
461
|
+
def prepare_current_flow_slots_for_template(
|
|
462
|
+
self, top_flow: Flow, current_step: FlowStep, tracker: DialogueStateTracker
|
|
463
|
+
) -> List[Dict[str, Any]]:
|
|
464
|
+
"""Prepare the current flow slots for the template.
|
|
465
|
+
|
|
466
|
+
Args:
|
|
467
|
+
top_flow: The top flow.
|
|
468
|
+
current_step: The current step in the flow.
|
|
469
|
+
tracker: The tracker containing the current state of the conversation.
|
|
470
|
+
|
|
471
|
+
Returns:
|
|
472
|
+
The slots with values, types, allowed values and a description.
|
|
473
|
+
"""
|
|
474
|
+
if top_flow is not None:
|
|
475
|
+
flow_slots = [
|
|
476
|
+
{
|
|
477
|
+
"name": collect_step.collect,
|
|
478
|
+
"value": self.get_slot_value(tracker, collect_step.collect),
|
|
479
|
+
"type": tracker.slots[collect_step.collect].type_name,
|
|
480
|
+
"allowed_values": allowed_values_for_slot(
|
|
481
|
+
tracker.slots[collect_step.collect]
|
|
482
|
+
),
|
|
483
|
+
"description": collect_step.description,
|
|
484
|
+
}
|
|
485
|
+
for collect_step in top_flow.get_collect_steps()
|
|
486
|
+
if self.is_extractable(collect_step, tracker, current_step)
|
|
487
|
+
]
|
|
488
|
+
else:
|
|
489
|
+
flow_slots = []
|
|
490
|
+
return flow_slots
|
|
491
|
+
|
|
492
|
+
def prepare_current_slot_for_template(
|
|
493
|
+
self, current_step: FlowStep
|
|
494
|
+
) -> Tuple[Union[str, None], Union[str, None]]:
|
|
495
|
+
"""Prepare the current slot for the template."""
|
|
496
|
+
return (
|
|
497
|
+
(current_step.collect, current_step.description)
|
|
498
|
+
if isinstance(current_step, CollectInformationFlowStep)
|
|
499
|
+
else (None, None)
|
|
500
|
+
)
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
from typing import Any, Dict, Optional, Text
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
from deprecated import deprecated # type: ignore[import]
|
|
5
|
+
|
|
6
|
+
from rasa.dialogue_understanding.generator.single_step.single_step_llm_command_generator import ( # noqa: E501
|
|
7
|
+
SingleStepLLMCommandGenerator,
|
|
8
|
+
)
|
|
9
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
10
|
+
from rasa.engine.storage.resource import Resource
|
|
11
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
12
|
+
from rasa.shared.exceptions import ProviderClientAPIException
|
|
13
|
+
from rasa.shared.utils.io import raise_deprecation_warning
|
|
14
|
+
|
|
15
|
+
structlogger = structlog.get_logger()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@DefaultV1Recipe.register(
|
|
19
|
+
[
|
|
20
|
+
DefaultV1Recipe.ComponentType.COMMAND_GENERATOR,
|
|
21
|
+
],
|
|
22
|
+
is_trainable=True,
|
|
23
|
+
)
|
|
24
|
+
@deprecated(
|
|
25
|
+
reason=(
|
|
26
|
+
"The LLMCommandGenerator is deprecated and will be removed in Rasa 4.0.0. "
|
|
27
|
+
"Please use use SingleStepLLMCommandGenerator instead."
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
class LLMCommandGenerator(SingleStepLLMCommandGenerator):
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
config: Dict[str, Any],
|
|
34
|
+
model_storage: ModelStorage,
|
|
35
|
+
resource: Resource,
|
|
36
|
+
prompt_template: Optional[Text] = None,
|
|
37
|
+
**kwargs: Any,
|
|
38
|
+
) -> None:
|
|
39
|
+
raise_deprecation_warning(
|
|
40
|
+
message="`LLMCommandGenerator` has been renamed "
|
|
41
|
+
"to `SingleStepLLMCommandGenerator`."
|
|
42
|
+
"Support for the former name `LLMCommandGenerator` "
|
|
43
|
+
"will be removed in Rasa `4.0.0`."
|
|
44
|
+
"Please modify your assistant's configuration to "
|
|
45
|
+
"use `SingleStepLLMCommandGenerator` instead."
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
super().__init__(
|
|
49
|
+
config,
|
|
50
|
+
model_storage,
|
|
51
|
+
resource,
|
|
52
|
+
prompt_template=prompt_template,
|
|
53
|
+
**kwargs,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
async def invoke_llm(self, prompt: Text) -> Optional[Text]:
|
|
57
|
+
try:
|
|
58
|
+
return await super().invoke_llm(prompt)
|
|
59
|
+
except ProviderClientAPIException:
|
|
60
|
+
# Returning 'None' in case of a ProviderClientAPIException ensures
|
|
61
|
+
# backward compatibility with previous versions. In earlier
|
|
62
|
+
# implementations, 'invoke_llm' was expected to return 'None' when
|
|
63
|
+
# encountering API-related issues. This practice is maintained here
|
|
64
|
+
# to prevent breaking changes in how exceptions are handled and
|
|
65
|
+
# propagated in existing integrations, where callers might not yet
|
|
66
|
+
# be prepared to manage exceptions directly.
|
|
67
|
+
return None
|
|
File without changes
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{% if flow_active %}
|
|
2
|
+
Your task is to extract slots from a task-oriented conversation. We call these tasks flows.
|
|
3
|
+
|
|
4
|
+
===
|
|
5
|
+
Here are the available flows, read them carefully. They represent the central business logic:
|
|
6
|
+
{% for flow in available_flows %}
|
|
7
|
+
- {{ flow.name }}: {{ flow.description }}
|
|
8
|
+
{%- endfor %}
|
|
9
|
+
{% else %}
|
|
10
|
+
Extract slots for a business process.
|
|
11
|
+
|
|
12
|
+
The current user message started the process "{{ current_flow }}".
|
|
13
|
+
Here are its slots: {% for slot in flow_slots -%}
|
|
14
|
+
- {{ slot.name }} ({{slot.type}}){% if slot.description %}: {{ slot.description}} {% endif %}{% if slot.allowed_values %}(allowed values: {{ slot.allowed_values }}){% endif %}
|
|
15
|
+
{% endfor %}
|
|
16
|
+
{% endif %}
|
|
17
|
+
===
|
|
18
|
+
Here is the current conversation:
|
|
19
|
+
{{ current_conversation }}
|
|
20
|
+
|
|
21
|
+
===
|
|
22
|
+
{% if flow_active %}
|
|
23
|
+
You are currently in the flow {% if top_flow_is_pattern%}"{{ top_user_flow }}"{% else %}"{{ current_flow }}"{% endif %}.
|
|
24
|
+
This flow has the following slots:
|
|
25
|
+
{% for slot in flow_slots -%}
|
|
26
|
+
- {{ slot.name }}
|
|
27
|
+
{% endfor %}{% if top_flow_is_pattern%}{% for slot in top_user_flow_slots -%}
|
|
28
|
+
- {{ slot.name }}
|
|
29
|
+
{% endfor %}{% endif %}
|
|
30
|
+
You have just asked the user for the slot "{{ current_slot }}" ({{current_slot_type}}).
|
|
31
|
+
{% if current_slot_description %}Slot description: "{{ current_slot_description }}"{% endif %}
|
|
32
|
+
{% if current_slot_allowed_values %}Allowed values for this slot: {{ current_slot_allowed_values }}{% endif %}
|
|
33
|
+
The user answered "{{ last_user_message }}".
|
|
34
|
+
|
|
35
|
+
===
|
|
36
|
+
{% endif %}
|
|
37
|
+
Based on this information, generate a list of actions. These are the available actions:
|
|
38
|
+
1. Setting or correcting slots, described by "SetSlot(slot_name, slot_value)". An example would be
|
|
39
|
+
"SetSlot(recipient, Freddy)". DO NOT set a slot with an arbitrary value!
|
|
40
|
+
{% if flow_active %}
|
|
41
|
+
2. Indicating that the users intent goes beyond responding to a question from the AI and setting a slot, described by
|
|
42
|
+
"ChangeFlow()". Add this action, for example, if the user might want to start a different flow, cancel the current one,
|
|
43
|
+
skip a question, ask a question or engages in chitchat. DO NOT add the name of the flow inside "ChangeFlow" command.
|
|
44
|
+
{% else %}
|
|
45
|
+
2. Finishing your action list, described by "Done()" once everything is taken care of.
|
|
46
|
+
|
|
47
|
+
===
|
|
48
|
+
Analyze the latest user message and see if there is any additional information the user already provided to fill the
|
|
49
|
+
slots.
|
|
50
|
+
If they did not provide information for the slots already, do not fill them.
|
|
51
|
+
Also, if they had provided some information but had cancelled the process and are now trying to restart the process do
|
|
52
|
+
not fill slots with information given previously when they cancelled the process.
|
|
53
|
+
{% endif %}
|
|
54
|
+
===
|
|
55
|
+
|
|
56
|
+
Summarize the last user message in the context of the conversation. Then generate a final list of actions.
|
|
57
|
+
===
|
|
58
|
+
{% if flow_active %}
|
|
59
|
+
The user saying "{{ last_user_message }}" after being asked for the slot "{{ current_slot }}" means that they might
|
|
60
|
+
{% else %}
|
|
61
|
+
The user saying "{{ last_user_message }}" means that they might
|
|
62
|
+
{% endif %}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
Your task is to analyze the current situation and to start and/or end business processes that we call flows.
|
|
2
|
+
|
|
3
|
+
===
|
|
4
|
+
Here are the available flows, read them carefully. They represent the central business logic:
|
|
5
|
+
{% for flow in available_flows %}
|
|
6
|
+
- {{ flow.name }}: {{ flow.description }}
|
|
7
|
+
{%- endfor %}
|
|
8
|
+
|
|
9
|
+
===
|
|
10
|
+
Here is the current conversation:
|
|
11
|
+
{{ current_conversation }}
|
|
12
|
+
|
|
13
|
+
===
|
|
14
|
+
{% if current_flow != None and not top_flow_is_pattern%}You are currently in the flow "{{ current_flow }}".{% else %}You are currently not in any flow.{% endif %}
|
|
15
|
+
|
|
16
|
+
===
|
|
17
|
+
Based on this information generate a list of actions, you want to take. Any logic of what happens afterwards is handled
|
|
18
|
+
by the flow engine. These are your available actions:
|
|
19
|
+
1. Starting a flow, described by "StartFlow(flow_name)".
|
|
20
|
+
2. If unsure which flow should be started, clarify candidate flows, described by "Clarify(flow_name_1, flow_name_2, ...)". This is particularly useful for short messages.{% if current_flow != None %}
|
|
21
|
+
3. Stopping the current flow on request of the user, described by "CancelFlow()".{% endif %}
|
|
22
|
+
4. Indicating that the users intent goes beyond starting, clarifying or canceling a flow, described by "CannotHandle()".
|
|
23
|
+
|
|
24
|
+
===
|
|
25
|
+
Here are some examples of user messages -> action list:
|
|
26
|
+
1. "book" -> Clarify(book_hotel, book_restaurant, book_flight)
|
|
27
|
+
2. "I want to book a hotel in Paris." -> StartFlow(book_hotel)
|
|
28
|
+
3. "Can you help me with my booking?" -> Clarify(book_hotel, book_restaurant, book_flight)
|
|
29
|
+
4. "Nevermind, stop it." -> CancelFlow()
|
|
30
|
+
===
|
|
31
|
+
Write out the actions you want to take for the last user message, one per line.
|
|
32
|
+
Do not take unnecessary actions.
|
|
33
|
+
Strictly adhere to the provided actions and their format listed above.
|
|
34
|
+
Use the previous conversation steps only to aid understanding.
|
|
35
|
+
|
|
36
|
+
Summarize the last user message in the context of the conversation. Then generate a final list of actions.
|
|
37
|
+
===
|
|
38
|
+
The user saying "{{ last_user_message }}" means that they might
|