rasa-pro 3.11.3a1.dev2__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/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 +1320 -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 +200 -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 +306 -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 +379 -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 +973 -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 +778 -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 +472 -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 +502 -0
- rasa/dialogue_understanding/generator/llm_command_generator.py +68 -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 +935 -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 +489 -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/constants.py +15 -0
- rasa/dialogue_understanding_test/du_test_case.py +118 -0
- rasa/dialogue_understanding_test/du_test_result.py +11 -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 +1190 -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 +112 -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 +287 -0
- rasa/model_manager/socket_bridge.py +152 -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 +321 -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 +54 -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 +183 -0
- rasa/shared/providers/_configs/client_config.py +57 -0
- rasa/shared/providers/_configs/default_litellm_client_config.py +130 -0
- rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +234 -0
- rasa/shared/providers/_configs/litellm_router_client_config.py +220 -0
- rasa/shared/providers/_configs/model_group_config.py +167 -0
- rasa/shared/providers/_configs/openai_client_config.py +175 -0
- rasa/shared/providers/_configs/rasa_llm_client_config.py +73 -0
- rasa/shared/providers/_configs/self_hosted_llm_client_config.py +177 -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/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 +310 -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 +135 -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 +263 -0
- rasa/shared/providers/llm/azure_openai_llm_client.py +359 -0
- rasa/shared/providers/llm/default_litellm_llm_client.py +108 -0
- rasa/shared/providers/llm/litellm_router_llm_client.py +182 -0
- rasa/shared/providers/llm/llm_client.py +76 -0
- rasa/shared/providers/llm/llm_response.py +79 -0
- rasa/shared/providers/llm/openai_llm_client.py +155 -0
- rasa/shared/providers/llm/rasa_llm_client.py +112 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +269 -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 +183 -0
- rasa/shared/providers/router/router_client.py +73 -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 +760 -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.11.3a1.dev2.dist-info/METADATA +198 -0
- rasa_pro-3.11.3a1.dev2.dist-info/NOTICE +5 -0
- rasa_pro-3.11.3a1.dev2.dist-info/RECORD +784 -0
- rasa_pro-3.11.3a1.dev2.dist-info/WHEEL +4 -0
- rasa_pro-3.11.3a1.dev2.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
from collections import OrderedDict
|
|
2
|
+
from collections import defaultdict
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any, Dict, List, Optional, Text, Union
|
|
5
|
+
|
|
6
|
+
import structlog
|
|
7
|
+
|
|
8
|
+
from rasa.dialogue_understanding_test.du_test_case import DialogueUnderstandingTestCase
|
|
9
|
+
from rasa.e2e_test.assertions import Assertion
|
|
10
|
+
from rasa.e2e_test.constants import (
|
|
11
|
+
KEY_ASSERTIONS,
|
|
12
|
+
KEY_ASSERTION_ORDER_ENABLED,
|
|
13
|
+
KEY_BOT_INPUT,
|
|
14
|
+
KEY_BOT_UTTERED,
|
|
15
|
+
KEY_FIXTURES,
|
|
16
|
+
KEY_METADATA,
|
|
17
|
+
KEY_STUB_CUSTOM_ACTIONS,
|
|
18
|
+
KEY_SLOT_NOT_SET,
|
|
19
|
+
KEY_SLOT_SET,
|
|
20
|
+
KEY_STEPS,
|
|
21
|
+
KEY_TEST_CASE,
|
|
22
|
+
KEY_TEST_CASES,
|
|
23
|
+
KEY_USER_INPUT,
|
|
24
|
+
)
|
|
25
|
+
from rasa.e2e_test.stub_custom_action import StubCustomAction
|
|
26
|
+
from rasa.shared.constants import DOCS_BASE_URL
|
|
27
|
+
from rasa.shared.core.events import BotUttered, SlotSet, UserUttered
|
|
28
|
+
from rasa.shared.exceptions import RasaException
|
|
29
|
+
|
|
30
|
+
structlogger = structlog.get_logger(__name__)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass(frozen=True)
|
|
34
|
+
class Fixture:
|
|
35
|
+
"""Class for storing an input fixture."""
|
|
36
|
+
|
|
37
|
+
name: Text
|
|
38
|
+
slots_set: Dict[Text, Any]
|
|
39
|
+
|
|
40
|
+
@staticmethod
|
|
41
|
+
def from_dict(fixture_dict: Dict[Text, Any]) -> "Fixture":
|
|
42
|
+
"""Creates a fixture from a dictionary.
|
|
43
|
+
|
|
44
|
+
Example:
|
|
45
|
+
>>> Fixture.from_dict({"some_fixture": [{"slot_name": "slot_value"}]})
|
|
46
|
+
Fixture(name="some_fixture", slots_set={"slot_name": "slot_value"})
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
fixture_dict: Dictionary containing the fixture.
|
|
50
|
+
"""
|
|
51
|
+
return Fixture(
|
|
52
|
+
name=next(iter(fixture_dict.keys())),
|
|
53
|
+
slots_set={
|
|
54
|
+
slot_name: slot_value
|
|
55
|
+
for slots_list in fixture_dict.values()
|
|
56
|
+
for slot_dict in slots_list
|
|
57
|
+
for slot_name, slot_value in slot_dict.items()
|
|
58
|
+
},
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
def as_dict(self) -> Dict[Text, Any]:
|
|
62
|
+
"""Returns the fixture as a dictionary."""
|
|
63
|
+
return {
|
|
64
|
+
self.name: [
|
|
65
|
+
{slot_name: slot_value}
|
|
66
|
+
for slot_name, slot_value in self.slots_set.items()
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@dataclass(frozen=True)
|
|
72
|
+
class TestStep:
|
|
73
|
+
"""Class for storing the input test step.
|
|
74
|
+
|
|
75
|
+
Instances are frozen to make sure the underlying dictionary stays in sync
|
|
76
|
+
with the text and actor attributes.
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
actor: Text
|
|
80
|
+
text: Optional[Text] = None
|
|
81
|
+
template: Optional[Text] = None
|
|
82
|
+
line: Optional[int] = None
|
|
83
|
+
slot_was_set: bool = False
|
|
84
|
+
slot_was_not_set: bool = False
|
|
85
|
+
_slot_instance: Optional[Union[Text, Dict[Text, Any]]] = None
|
|
86
|
+
_underlying: Optional[Dict[Text, Any]] = None
|
|
87
|
+
metadata_name: Optional[Text] = None
|
|
88
|
+
assertions: Optional[List[Assertion]] = None
|
|
89
|
+
assertion_order_enabled: bool = False
|
|
90
|
+
|
|
91
|
+
@staticmethod
|
|
92
|
+
def from_dict(test_step_dict: Dict[Text, Any]) -> "TestStep":
|
|
93
|
+
"""Creates a test step from a dictionary.
|
|
94
|
+
|
|
95
|
+
Example:
|
|
96
|
+
>>> TestStep.from_dict({"user": "hello"})
|
|
97
|
+
TestStep(text="hello", actor="user")
|
|
98
|
+
>>> TestStep.from_dict({"user": "hello", "metadata": "some_metadata"})
|
|
99
|
+
TestStep(text="hello", actor="user", metadata_name="some_metadata")
|
|
100
|
+
>>> TestStep.from_dict({"bot": "hello world"})
|
|
101
|
+
TestStep(text="hello world", actor="bot")
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
test_step_dict: Dictionary containing the test step.
|
|
105
|
+
"""
|
|
106
|
+
TestStep._validate_input_dict(test_step_dict)
|
|
107
|
+
slot_instance = test_step_dict.get(KEY_SLOT_SET)
|
|
108
|
+
if test_step_dict.get(KEY_SLOT_NOT_SET):
|
|
109
|
+
slot_instance = test_step_dict.get(KEY_SLOT_NOT_SET)
|
|
110
|
+
|
|
111
|
+
assertions = (
|
|
112
|
+
[
|
|
113
|
+
Assertion.create_typed_assertion(data)
|
|
114
|
+
for data in test_step_dict.get(KEY_ASSERTIONS, [])
|
|
115
|
+
]
|
|
116
|
+
if KEY_ASSERTIONS in test_step_dict
|
|
117
|
+
else None
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
return TestStep(
|
|
121
|
+
text=test_step_dict.get(
|
|
122
|
+
KEY_USER_INPUT, test_step_dict.get(KEY_BOT_INPUT, "")
|
|
123
|
+
).strip()
|
|
124
|
+
or None,
|
|
125
|
+
template=test_step_dict.get(KEY_BOT_UTTERED),
|
|
126
|
+
actor=KEY_USER_INPUT if KEY_USER_INPUT in test_step_dict else KEY_BOT_INPUT,
|
|
127
|
+
line=test_step_dict.lc.line + 1 if hasattr(test_step_dict, "lc") else None,
|
|
128
|
+
slot_was_set=bool(test_step_dict.get(KEY_SLOT_SET)),
|
|
129
|
+
slot_was_not_set=bool(test_step_dict.get(KEY_SLOT_NOT_SET)),
|
|
130
|
+
_slot_instance=slot_instance,
|
|
131
|
+
_underlying=test_step_dict,
|
|
132
|
+
metadata_name=test_step_dict.get(KEY_METADATA, ""),
|
|
133
|
+
assertions=assertions,
|
|
134
|
+
assertion_order_enabled=test_step_dict.get(
|
|
135
|
+
KEY_ASSERTION_ORDER_ENABLED, False
|
|
136
|
+
),
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
@staticmethod
|
|
140
|
+
def _validate_input_dict(test_step_dict: Dict[Text, Any]) -> None:
|
|
141
|
+
if (
|
|
142
|
+
KEY_USER_INPUT not in test_step_dict
|
|
143
|
+
and KEY_BOT_INPUT not in test_step_dict
|
|
144
|
+
and KEY_BOT_UTTERED not in test_step_dict
|
|
145
|
+
and KEY_SLOT_SET not in test_step_dict
|
|
146
|
+
and KEY_SLOT_NOT_SET not in test_step_dict
|
|
147
|
+
):
|
|
148
|
+
raise RasaException(
|
|
149
|
+
f"Test step is missing either the {KEY_USER_INPUT}, {KEY_BOT_INPUT}, "
|
|
150
|
+
f"{KEY_SLOT_NOT_SET}, {KEY_SLOT_SET} "
|
|
151
|
+
f"or {KEY_BOT_UTTERED} key: {test_step_dict}"
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
if (
|
|
155
|
+
test_step_dict.get(KEY_SLOT_SET) is not None
|
|
156
|
+
and test_step_dict.get(KEY_SLOT_NOT_SET) is not None
|
|
157
|
+
):
|
|
158
|
+
raise RasaException(
|
|
159
|
+
f"Test step has both {KEY_SLOT_SET} and {KEY_SLOT_NOT_SET} keys: "
|
|
160
|
+
f"{test_step_dict}. You must only use one of the keys in a test step."
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
if KEY_USER_INPUT not in test_step_dict and KEY_ASSERTIONS in test_step_dict:
|
|
164
|
+
raise RasaException(
|
|
165
|
+
f"Test step with assertions must only be used with the "
|
|
166
|
+
f"'{KEY_USER_INPUT}' key: {test_step_dict}"
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
if (
|
|
170
|
+
KEY_USER_INPUT not in test_step_dict
|
|
171
|
+
and KEY_ASSERTION_ORDER_ENABLED in test_step_dict
|
|
172
|
+
):
|
|
173
|
+
raise RasaException(
|
|
174
|
+
f"Test step with '{KEY_ASSERTION_ORDER_ENABLED}' key must "
|
|
175
|
+
f"only be used with the '{KEY_USER_INPUT}' key: "
|
|
176
|
+
f"{test_step_dict}"
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
if (
|
|
180
|
+
KEY_ASSERTION_ORDER_ENABLED in test_step_dict
|
|
181
|
+
and KEY_ASSERTIONS not in test_step_dict
|
|
182
|
+
):
|
|
183
|
+
raise RasaException(
|
|
184
|
+
f"You must specify the '{KEY_ASSERTIONS}' key in the user test step "
|
|
185
|
+
f"where you are using '{KEY_ASSERTION_ORDER_ENABLED}' key: "
|
|
186
|
+
f"{test_step_dict}"
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
def as_dict(self) -> Dict[Text, Any]:
|
|
190
|
+
"""Returns the underlying dictionary of the test step."""
|
|
191
|
+
return self._underlying or {}
|
|
192
|
+
|
|
193
|
+
def as_dict_yaml_format(self) -> Dict[Text, Any]:
|
|
194
|
+
"""Returns the test step as a dictionary in YAML format."""
|
|
195
|
+
if not self._underlying:
|
|
196
|
+
return {}
|
|
197
|
+
|
|
198
|
+
result = self._underlying.copy()
|
|
199
|
+
|
|
200
|
+
def _handle_slots(key: str) -> None:
|
|
201
|
+
"""Slots should be a list of strings or dicts."""
|
|
202
|
+
if (
|
|
203
|
+
self._underlying
|
|
204
|
+
and key in self._underlying
|
|
205
|
+
and isinstance(self._underlying[key], OrderedDict)
|
|
206
|
+
):
|
|
207
|
+
result[key] = [
|
|
208
|
+
{key: value} for key, value in self._underlying[key].items()
|
|
209
|
+
]
|
|
210
|
+
elif (
|
|
211
|
+
self._underlying
|
|
212
|
+
and key in self._underlying
|
|
213
|
+
and isinstance(self._underlying[key], str)
|
|
214
|
+
):
|
|
215
|
+
result[key] = [self._underlying[key]]
|
|
216
|
+
|
|
217
|
+
_handle_slots(KEY_SLOT_SET)
|
|
218
|
+
_handle_slots(KEY_SLOT_NOT_SET)
|
|
219
|
+
|
|
220
|
+
return result
|
|
221
|
+
|
|
222
|
+
def matches_event(self, other: Union[BotUttered, SlotSet, None]) -> bool:
|
|
223
|
+
"""Compares the test step with BotUttered or SlotSet event.
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
other: BotUttered or SlotSet event to compare with.
|
|
227
|
+
|
|
228
|
+
Returns:
|
|
229
|
+
`True` if the event and step match, `False` otherwise.
|
|
230
|
+
"""
|
|
231
|
+
if other is None or self.actor != "bot":
|
|
232
|
+
return False
|
|
233
|
+
|
|
234
|
+
if isinstance(other, BotUttered):
|
|
235
|
+
return self._do_utterances_match(other)
|
|
236
|
+
elif isinstance(other, SlotSet):
|
|
237
|
+
return self._do_slots_match(other)
|
|
238
|
+
|
|
239
|
+
return False
|
|
240
|
+
|
|
241
|
+
def _do_utterances_match(self, other: BotUttered) -> bool:
|
|
242
|
+
if self.text:
|
|
243
|
+
return other.text == self.text
|
|
244
|
+
elif self.template:
|
|
245
|
+
# we do set this utter_action metadata in the `ActionBotResponse`
|
|
246
|
+
# action, so we can check if the template is the same
|
|
247
|
+
return other.metadata.get("utter_action") == self.template
|
|
248
|
+
|
|
249
|
+
return False
|
|
250
|
+
|
|
251
|
+
def _do_slots_match(self, other: SlotSet) -> bool:
|
|
252
|
+
if self._slot_instance:
|
|
253
|
+
slot_name, slot_value = self.get_slot_name(), self.get_slot_value()
|
|
254
|
+
if isinstance(self._slot_instance, dict):
|
|
255
|
+
return other.key == slot_name and other.value == slot_value
|
|
256
|
+
return other.key == slot_name
|
|
257
|
+
|
|
258
|
+
return False
|
|
259
|
+
|
|
260
|
+
def get_slot_name(self) -> Optional[Text]:
|
|
261
|
+
"""Returns the slot name if the test step is a slot action."""
|
|
262
|
+
if isinstance(self._slot_instance, str):
|
|
263
|
+
return self._slot_instance
|
|
264
|
+
if isinstance(self._slot_instance, dict):
|
|
265
|
+
return next(iter(self._slot_instance.keys()))
|
|
266
|
+
return None
|
|
267
|
+
|
|
268
|
+
def get_slot_value(self) -> Optional[Any]:
|
|
269
|
+
"""Returns the slot value if the test step is a slot action."""
|
|
270
|
+
if isinstance(self._slot_instance, dict):
|
|
271
|
+
return next(iter(self._slot_instance.values()))
|
|
272
|
+
return None
|
|
273
|
+
|
|
274
|
+
def is_slot_instance_dict(self) -> bool:
|
|
275
|
+
"""Asserts if the slot instance is a dictionary."""
|
|
276
|
+
return isinstance(self._slot_instance, dict)
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
@dataclass
|
|
280
|
+
class ActualStepOutput:
|
|
281
|
+
"""Class for storing the events that are generated as a response from the bot."""
|
|
282
|
+
|
|
283
|
+
actor: Text
|
|
284
|
+
text: Optional[Text]
|
|
285
|
+
events: List[Union[BotUttered, UserUttered, SlotSet]]
|
|
286
|
+
bot_uttered_events: List[BotUttered]
|
|
287
|
+
user_uttered_events: List[UserUttered]
|
|
288
|
+
slot_set_events: List[SlotSet]
|
|
289
|
+
|
|
290
|
+
@staticmethod
|
|
291
|
+
def from_test_step(
|
|
292
|
+
test_step: TestStep,
|
|
293
|
+
events: List[Union[BotUttered, UserUttered, SlotSet]],
|
|
294
|
+
) -> "ActualStepOutput":
|
|
295
|
+
"""Creates a test step response from a test step and events.
|
|
296
|
+
|
|
297
|
+
Example:
|
|
298
|
+
>>> ActualStepOutput.from_test_step(TestStep(text="hello", actor="bot"))
|
|
299
|
+
ActualStepOutput(text="hello", actor="bot")
|
|
300
|
+
|
|
301
|
+
Args:
|
|
302
|
+
test_step: Test step.
|
|
303
|
+
events: Events generated by the bot.
|
|
304
|
+
"""
|
|
305
|
+
bot_uttered_events, user_uttered_events, slot_set_events = [], [], []
|
|
306
|
+
for event in events or []:
|
|
307
|
+
if isinstance(event, BotUttered):
|
|
308
|
+
bot_uttered_events.append(event)
|
|
309
|
+
elif isinstance(event, UserUttered):
|
|
310
|
+
user_uttered_events.append(event)
|
|
311
|
+
elif isinstance(event, SlotSet):
|
|
312
|
+
slot_set_events.append(event)
|
|
313
|
+
|
|
314
|
+
return ActualStepOutput(
|
|
315
|
+
text=test_step.text,
|
|
316
|
+
actor=test_step.actor,
|
|
317
|
+
events=events,
|
|
318
|
+
bot_uttered_events=bot_uttered_events,
|
|
319
|
+
user_uttered_events=user_uttered_events,
|
|
320
|
+
slot_set_events=slot_set_events,
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
def remove_bot_uttered_event(self, bot_utter: BotUttered) -> None:
|
|
324
|
+
"""Removes bot_uttered_event from the ActualStepOutput."""
|
|
325
|
+
if bot_utter in self.bot_uttered_events:
|
|
326
|
+
self.bot_uttered_events.remove(bot_utter)
|
|
327
|
+
self.events.remove(bot_utter)
|
|
328
|
+
|
|
329
|
+
def remove_user_uttered_event(self, user_utter: UserUttered) -> None:
|
|
330
|
+
"""Removes user_uttered_event from the ActualStepOutput."""
|
|
331
|
+
if user_utter in self.user_uttered_events:
|
|
332
|
+
self.user_uttered_events.remove(user_utter)
|
|
333
|
+
self.events.remove(user_utter)
|
|
334
|
+
|
|
335
|
+
def remove_slot_set_event(self, slot_set: SlotSet) -> None:
|
|
336
|
+
"""Removes slot_set_event from the ActualStepOutput."""
|
|
337
|
+
if slot_set in self.slot_set_events:
|
|
338
|
+
self.slot_set_events.remove(slot_set)
|
|
339
|
+
self.events.remove(slot_set)
|
|
340
|
+
|
|
341
|
+
def get_user_uttered_event(self) -> Optional[UserUttered]:
|
|
342
|
+
"""Returns the user_uttered_event from the ActualStepOutput."""
|
|
343
|
+
if self.user_uttered_events:
|
|
344
|
+
# we assume that there is only one user_uttered_event
|
|
345
|
+
# in the ActualStepOutput since the response is
|
|
346
|
+
# only from one TestStep with one user utterance
|
|
347
|
+
try:
|
|
348
|
+
return self.user_uttered_events[0]
|
|
349
|
+
except IndexError:
|
|
350
|
+
structlogger.debug(
|
|
351
|
+
"e2e_test_case.get_user_uttered_event.no_user_uttered_event",
|
|
352
|
+
event_info=f"Could not find `UserUttered` event in the "
|
|
353
|
+
f"ActualStepOutput: {self}",
|
|
354
|
+
)
|
|
355
|
+
return None
|
|
356
|
+
return None
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
@dataclass
|
|
360
|
+
class TestCase:
|
|
361
|
+
"""Class for storing the input test case."""
|
|
362
|
+
|
|
363
|
+
name: Text
|
|
364
|
+
steps: List[TestStep]
|
|
365
|
+
file: Optional[Text] = None
|
|
366
|
+
line: Optional[int] = None
|
|
367
|
+
fixture_names: Optional[List[Text]] = None
|
|
368
|
+
metadata_name: Optional[Text] = None
|
|
369
|
+
|
|
370
|
+
@staticmethod
|
|
371
|
+
def from_dict(
|
|
372
|
+
input_test_case: Dict[Text, Any], file: Optional[Text] = None
|
|
373
|
+
) -> "TestCase":
|
|
374
|
+
"""Creates a test case from a dictionary.
|
|
375
|
+
|
|
376
|
+
Example:
|
|
377
|
+
>>> TestCase.from_dict({"test_case": "test", "steps": [{"user": "hello"}]})
|
|
378
|
+
TestCase(name="test", steps=[TestStep(text="hello", actor="user")])
|
|
379
|
+
|
|
380
|
+
Args:
|
|
381
|
+
input_test_case: Dictionary containing the test case.
|
|
382
|
+
file: File name of the test case.
|
|
383
|
+
|
|
384
|
+
Returns:
|
|
385
|
+
Test case object.
|
|
386
|
+
"""
|
|
387
|
+
steps = []
|
|
388
|
+
|
|
389
|
+
for step in input_test_case.get(KEY_STEPS, []):
|
|
390
|
+
if KEY_SLOT_SET in step:
|
|
391
|
+
for slot in step[KEY_SLOT_SET]:
|
|
392
|
+
step_copy = step.copy()
|
|
393
|
+
step_copy[KEY_SLOT_SET] = slot
|
|
394
|
+
steps.append(TestStep.from_dict(step_copy))
|
|
395
|
+
elif KEY_SLOT_NOT_SET in step:
|
|
396
|
+
for slot in step[KEY_SLOT_NOT_SET]:
|
|
397
|
+
step_copy = step.copy()
|
|
398
|
+
step_copy[KEY_SLOT_NOT_SET] = slot
|
|
399
|
+
steps.append(TestStep.from_dict(step_copy))
|
|
400
|
+
else:
|
|
401
|
+
steps.append(TestStep.from_dict(step))
|
|
402
|
+
|
|
403
|
+
test_case = TestCase(
|
|
404
|
+
name=input_test_case.get(KEY_TEST_CASE, "default"),
|
|
405
|
+
steps=steps,
|
|
406
|
+
file=file,
|
|
407
|
+
line=(
|
|
408
|
+
input_test_case.lc.line + 1 if hasattr(input_test_case, "lc") else None
|
|
409
|
+
),
|
|
410
|
+
fixture_names=input_test_case.get(KEY_FIXTURES),
|
|
411
|
+
metadata_name=input_test_case.get(KEY_METADATA),
|
|
412
|
+
)
|
|
413
|
+
test_case.validate()
|
|
414
|
+
return test_case
|
|
415
|
+
|
|
416
|
+
def validate(self) -> None:
|
|
417
|
+
"""Validates the test case.
|
|
418
|
+
|
|
419
|
+
This method calls all validation methods required for the test case.
|
|
420
|
+
"""
|
|
421
|
+
if self.uses_assertions():
|
|
422
|
+
self.validate_duplicate_user_messages_metadata()
|
|
423
|
+
|
|
424
|
+
def validate_duplicate_user_messages_metadata(self) -> None:
|
|
425
|
+
"""Validates that duplicate user messages use metadata correctly.
|
|
426
|
+
|
|
427
|
+
Ensures that each duplicate user message uses unique metadata.
|
|
428
|
+
|
|
429
|
+
Raises warnings if any issues are found.
|
|
430
|
+
"""
|
|
431
|
+
docs_link = (
|
|
432
|
+
f"{DOCS_BASE_URL}/testing/e2e-testing-assertions/assertions-how-to-guide/"
|
|
433
|
+
"#how-to-handle-duplicate-user-text-messages-in-the-same-test-case"
|
|
434
|
+
)
|
|
435
|
+
no_metadata_event_info = (
|
|
436
|
+
"Test case '{name}' has duplicate user steps with text '{text}', "
|
|
437
|
+
"and user step at line {line} lacks metadata. When using "
|
|
438
|
+
"duplicate user messages, metadata should be set on each step to ensure "
|
|
439
|
+
f"correct processing. Please refer to the documentation: {docs_link}"
|
|
440
|
+
)
|
|
441
|
+
non_unique_metadata_event_info = (
|
|
442
|
+
"Test case '{name}' has duplicate user steps with text '{text}', "
|
|
443
|
+
"and user step at line {line} has duplicate metadata "
|
|
444
|
+
"name '{metadata_name}'. Metadata names should be unique for each user "
|
|
445
|
+
"step among duplicates. This may cause issues in processing "
|
|
446
|
+
f"user messages. Please refer to the documentation: {docs_link}"
|
|
447
|
+
)
|
|
448
|
+
|
|
449
|
+
# Use dict[str, list] structure to group steps by user message text to easily
|
|
450
|
+
# identify and validate instances with duplicate messages and their metadata.
|
|
451
|
+
message_steps = defaultdict(list)
|
|
452
|
+
|
|
453
|
+
# Collect user steps by text
|
|
454
|
+
for step in self.steps:
|
|
455
|
+
if step.actor == KEY_USER_INPUT and step.text:
|
|
456
|
+
message_steps[step.text].append(step)
|
|
457
|
+
|
|
458
|
+
# Check for duplicate messages
|
|
459
|
+
for text, steps in message_steps.items():
|
|
460
|
+
if len(steps) <= 1:
|
|
461
|
+
continue
|
|
462
|
+
|
|
463
|
+
metadata_names_used = set()
|
|
464
|
+
for step in steps:
|
|
465
|
+
if not step.metadata_name:
|
|
466
|
+
structlogger.warning(
|
|
467
|
+
"e2e_test_case.validate_duplicate_user_messages_metadata.no_metadata",
|
|
468
|
+
event_info=no_metadata_event_info.format(
|
|
469
|
+
name=self.name,
|
|
470
|
+
text=text,
|
|
471
|
+
line=step.line,
|
|
472
|
+
),
|
|
473
|
+
)
|
|
474
|
+
break
|
|
475
|
+
elif step.metadata_name in metadata_names_used:
|
|
476
|
+
structlogger.warning(
|
|
477
|
+
"e2e_test_case.validate_duplicate_user_messages_metadata.non_unique_metadata",
|
|
478
|
+
event_info=non_unique_metadata_event_info.format(
|
|
479
|
+
name=self.name,
|
|
480
|
+
text=text,
|
|
481
|
+
line=step.line,
|
|
482
|
+
metadata_name=step.metadata_name,
|
|
483
|
+
),
|
|
484
|
+
)
|
|
485
|
+
break
|
|
486
|
+
else:
|
|
487
|
+
metadata_names_used.add(step.metadata_name)
|
|
488
|
+
|
|
489
|
+
def as_dict(self) -> Dict[Text, Any]:
|
|
490
|
+
"""Returns the test case as a dictionary."""
|
|
491
|
+
result = {
|
|
492
|
+
KEY_TEST_CASE: self.name,
|
|
493
|
+
KEY_STEPS: [step.as_dict_yaml_format() for step in self.steps],
|
|
494
|
+
}
|
|
495
|
+
if self.fixture_names:
|
|
496
|
+
result[KEY_FIXTURES] = self.fixture_names
|
|
497
|
+
if self.metadata_name:
|
|
498
|
+
result[KEY_METADATA] = self.metadata_name
|
|
499
|
+
return result
|
|
500
|
+
|
|
501
|
+
def file_with_line(self) -> Text:
|
|
502
|
+
"""Returns the file name and line number of the test case."""
|
|
503
|
+
if not self.file:
|
|
504
|
+
return ""
|
|
505
|
+
|
|
506
|
+
line = str(self.line) if self.line is not None else ""
|
|
507
|
+
return f"{self.file}:{line}"
|
|
508
|
+
|
|
509
|
+
def uses_assertions(self) -> bool:
|
|
510
|
+
"""Checks if the test case uses assertions."""
|
|
511
|
+
try:
|
|
512
|
+
next(step for step in self.steps if step.assertions is not None)
|
|
513
|
+
except StopIteration:
|
|
514
|
+
return False
|
|
515
|
+
|
|
516
|
+
return True
|
|
517
|
+
|
|
518
|
+
|
|
519
|
+
@dataclass(frozen=True)
|
|
520
|
+
class Metadata:
|
|
521
|
+
"""Class for storing an input metadata."""
|
|
522
|
+
|
|
523
|
+
name: Text
|
|
524
|
+
metadata: Dict[Text, Any]
|
|
525
|
+
|
|
526
|
+
@staticmethod
|
|
527
|
+
def from_dict(metadata_dict: Dict[Text, Any]) -> "Metadata":
|
|
528
|
+
"""Creates a metadata from a dictionary.
|
|
529
|
+
|
|
530
|
+
Example:
|
|
531
|
+
>>> Metadata.from_dict({"some_metadata": {"room": "test_room"}})
|
|
532
|
+
Metadata(name="some_metadata", metadata={"room": "test_room"})
|
|
533
|
+
|
|
534
|
+
Args:
|
|
535
|
+
metadata_dict: Dictionary containing the metadata.
|
|
536
|
+
"""
|
|
537
|
+
return Metadata(
|
|
538
|
+
name=next(iter(metadata_dict.keys())),
|
|
539
|
+
metadata={
|
|
540
|
+
metadata_name: metadata_value
|
|
541
|
+
for metadata in metadata_dict.values()
|
|
542
|
+
for metadata_name, metadata_value in metadata.items()
|
|
543
|
+
},
|
|
544
|
+
)
|
|
545
|
+
|
|
546
|
+
def as_dict(self) -> Dict[Text, Any]:
|
|
547
|
+
"""Returns the metadata as a dictionary."""
|
|
548
|
+
return {self.name: self.metadata}
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
@dataclass(frozen=True)
|
|
552
|
+
class TestSuite:
|
|
553
|
+
"""Class for representing all top level test suite keys."""
|
|
554
|
+
|
|
555
|
+
test_cases: List[Union[TestCase, DialogueUnderstandingTestCase]]
|
|
556
|
+
fixtures: List[Fixture]
|
|
557
|
+
metadata: List[Metadata]
|
|
558
|
+
stub_custom_actions: Dict[Text, StubCustomAction]
|
|
559
|
+
|
|
560
|
+
def as_dict(self) -> Dict[Text, Any]:
|
|
561
|
+
"""Returns the test suite as a dictionary."""
|
|
562
|
+
return {
|
|
563
|
+
KEY_FIXTURES: [fixture.as_dict() for fixture in self.fixtures],
|
|
564
|
+
KEY_METADATA: [metadata.as_dict() for metadata in self.metadata],
|
|
565
|
+
KEY_STUB_CUSTOM_ACTIONS: {
|
|
566
|
+
key: value.as_dict() for key, value in self.stub_custom_actions.items()
|
|
567
|
+
},
|
|
568
|
+
KEY_TEST_CASES: [test_case.as_dict() for test_case in self.test_cases],
|
|
569
|
+
}
|