rasa-pro 3.9.18__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 +415 -0
- rasa/__init__.py +10 -0
- rasa/__main__.py +156 -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 +146 -0
- rasa/cli/__init__.py +5 -0
- rasa/cli/arguments/__init__.py +0 -0
- rasa/cli/arguments/data.py +81 -0
- rasa/cli/arguments/default_arguments.py +165 -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 +204 -0
- rasa/cli/arguments/shell.py +13 -0
- rasa/cli/arguments/test.py +211 -0
- rasa/cli/arguments/train.py +263 -0
- rasa/cli/arguments/visualize.py +34 -0
- rasa/cli/arguments/x.py +30 -0
- rasa/cli/data.py +292 -0
- rasa/cli/e2e_test.py +586 -0
- rasa/cli/evaluate.py +222 -0
- rasa/cli/export.py +250 -0
- rasa/cli/inspect.py +63 -0
- rasa/cli/interactive.py +164 -0
- rasa/cli/license.py +65 -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 +12 -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 +45 -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.py +22 -0
- rasa/cli/project_templates/tutorial/config.yml +11 -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 +6 -0
- rasa/cli/project_templates/tutorial/domain.yml +21 -0
- rasa/cli/project_templates/tutorial/endpoints.yml +45 -0
- rasa/cli/run.py +135 -0
- rasa/cli/scaffold.py +269 -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 +266 -0
- rasa/cli/studio/train.py +59 -0
- rasa/cli/studio/upload.py +77 -0
- rasa/cli/telemetry.py +102 -0
- rasa/cli/test.py +280 -0
- rasa/cli/train.py +260 -0
- rasa/cli/utils.py +464 -0
- rasa/cli/visualize.py +40 -0
- rasa/cli/x.py +206 -0
- rasa/constants.py +37 -0
- rasa/core/__init__.py +17 -0
- rasa/core/actions/__init__.py +0 -0
- rasa/core/actions/action.py +1225 -0
- rasa/core/actions/action_clean_stack.py +59 -0
- rasa/core/actions/action_exceptions.py +24 -0
- rasa/core/actions/action_run_slot_rejections.py +207 -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 +188 -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 +140 -0
- rasa/core/actions/loops.py +114 -0
- rasa/core/actions/two_stage_fallback.py +186 -0
- rasa/core/agent.py +555 -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 +322 -0
- rasa/core/brokers/pika.py +386 -0
- rasa/core/brokers/sql.py +86 -0
- rasa/core/channels/__init__.py +55 -0
- rasa/core/channels/audiocodes.py +463 -0
- rasa/core/channels/botframework.py +338 -0
- rasa/core/channels/callback.py +84 -0
- rasa/core/channels/channel.py +419 -0
- rasa/core/channels/console.py +241 -0
- rasa/core/channels/development_inspector.py +93 -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-b6e548fe.js +1 -0
- rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
- rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-fa03ac9e.js +10 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-ee67392a.js +2 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-9b283fae.js +2 -0
- rasa/core/channels/inspector/dist/assets/createText-62fc7601-8b6fcc2a.js +7 -0
- rasa/core/channels/inspector/dist/assets/edges-f2ad444c-22e77f4f.js +4 -0
- rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-60ffc87f.js +51 -0
- rasa/core/channels/inspector/dist/assets/flowDb-1972c806-9dd802e4.js +6 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-5fa1912f.js +4 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-1844e5a5.js +1 -0
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-622a1fd2.js +139 -0
- rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-e285a63a.js +266 -0
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-f237bdca.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-4b03d70e.js +1 -0
- rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
- rasa/core/channels/inspector/dist/assets/index-a5d3e69d.js +1040 -0
- rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-72a0fa5f.js +7 -0
- rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
- rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-82218c41.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-78cff630.js +1 -0
- rasa/core/channels/inspector/dist/assets/line-5038b469.js +1 -0
- rasa/core/channels/inspector/dist/assets/linear-c4fc4098.js +1 -0
- rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-c33c8ea6.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-a8d03059.js +35 -0
- rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-6a0e56b2.js +7 -0
- rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-2dc7c7bd.js +52 -0
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-2360fe39.js +8 -0
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-41b9f9ad.js +122 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-0aad326f.js +1 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-9847d984.js +1 -0
- rasa/core/channels/inspector/dist/assets/styles-080da4f6-564d890e.js +110 -0
- rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-38957613.js +159 -0
- rasa/core/channels/inspector/dist/assets/styles-9c745c82-f0fc6921.js +207 -0
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-ef3c5a77.js +1 -0
- rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-bf3e91c1.js +61 -0
- rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-4d4026c0.js +7 -0
- rasa/core/channels/inspector/dist/index.html +41 -0
- rasa/core/channels/inspector/index.html +39 -0
- rasa/core/channels/inspector/jest.config.ts +13 -0
- rasa/core/channels/inspector/package.json +48 -0
- rasa/core/channels/inspector/setupTests.ts +2 -0
- rasa/core/channels/inspector/src/App.tsx +170 -0
- rasa/core/channels/inspector/src/components/DiagramFlow.tsx +107 -0
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
- rasa/core/channels/inspector/src/components/DialogueStack.tsx +151 -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 +19 -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/formatters.test.ts +382 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +240 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +42 -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 +64 -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 +6156 -0
- rasa/core/channels/mattermost.py +229 -0
- rasa/core/channels/rasa_chat.py +126 -0
- rasa/core/channels/rest.py +225 -0
- rasa/core/channels/rocketchat.py +174 -0
- rasa/core/channels/slack.py +620 -0
- rasa/core/channels/socketio.py +274 -0
- rasa/core/channels/telegram.py +298 -0
- rasa/core/channels/twilio.py +169 -0
- rasa/core/channels/twilio_voice.py +367 -0
- rasa/core/channels/vier_cvg.py +374 -0
- rasa/core/channels/webexteams.py +134 -0
- rasa/core/concurrent_lock_store.py +210 -0
- rasa/core/constants.py +107 -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 +121 -0
- rasa/core/information_retrieval/information_retrieval.py +129 -0
- rasa/core/information_retrieval/milvus.py +52 -0
- rasa/core/information_retrieval/qdrant.py +95 -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 +270 -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 +69 -0
- rasa/core/policies/__init__.py +0 -0
- rasa/core/policies/ensemble.py +329 -0
- rasa/core/policies/enterprise_search_policy.py +781 -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 +705 -0
- rasa/core/policies/flows/flow_step_result.py +43 -0
- rasa/core/policies/intentless_policy.py +922 -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 +1422 -0
- rasa/core/run.py +331 -0
- rasa/core/secrets_manager/__init__.py +0 -0
- rasa/core/secrets_manager/constants.py +32 -0
- rasa/core/secrets_manager/endpoints.py +391 -0
- rasa/core/secrets_manager/factory.py +233 -0
- rasa/core/secrets_manager/secret_manager.py +262 -0
- rasa/core/secrets_manager/vault.py +574 -0
- rasa/core/test.py +1335 -0
- rasa/core/tracker_store.py +1699 -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 +1745 -0
- rasa/core/training/story_conflict.py +381 -0
- rasa/core/training/training.py +93 -0
- rasa/core/utils.py +339 -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 +260 -0
- rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
- rasa/dialogue_understanding/commands/__init__.py +49 -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/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/generator/__init__.py +21 -0
- rasa/dialogue_understanding/generator/command_generator.py +343 -0
- rasa/dialogue_understanding/generator/constants.py +18 -0
- rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +412 -0
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +467 -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 +827 -0
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +218 -0
- rasa/dialogue_understanding/generator/single_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2 +57 -0
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +345 -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 +248 -0
- rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
- rasa/dialogue_understanding/patterns/internal_error.py +47 -0
- rasa/dialogue_understanding/patterns/search.py +37 -0
- rasa/dialogue_understanding/patterns/skip_question.py +38 -0
- rasa/dialogue_understanding/processor/__init__.py +0 -0
- rasa/dialogue_understanding/processor/command_processor.py +687 -0
- rasa/dialogue_understanding/processor/command_processor_component.py +39 -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/e2e_test/__init__.py +0 -0
- rasa/e2e_test/constants.py +11 -0
- rasa/e2e_test/e2e_test_case.py +366 -0
- rasa/e2e_test/e2e_test_result.py +34 -0
- rasa/e2e_test/e2e_test_runner.py +768 -0
- rasa/e2e_test/e2e_test_schema.yml +85 -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 +637 -0
- rasa/engine/loader.py +36 -0
- rasa/engine/recipes/__init__.py +0 -0
- rasa/engine/recipes/config_files/default_config.yml +44 -0
- rasa/engine/recipes/default_components.py +99 -0
- rasa/engine/recipes/default_recipe.py +1251 -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 +246 -0
- rasa/engine/storage/resource.py +110 -0
- rasa/engine/storage/storage.py +203 -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 +873 -0
- rasa/env.py +5 -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 +43 -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/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_testing.py +457 -0
- rasa/model_training.py +536 -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/llm_intent_classifier.py +519 -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/persistor.py +282 -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 +106 -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 +1551 -0
- rasa/shared/__init__.py +0 -0
- rasa/shared/constants.py +192 -0
- rasa/shared/core/__init__.py +0 -0
- rasa/shared/core/command_payload_reader.py +109 -0
- rasa/shared/core/constants.py +167 -0
- rasa/shared/core/conversation.py +46 -0
- rasa/shared/core/domain.py +2107 -0
- rasa/shared/core/events.py +2504 -0
- rasa/shared/core/flows/__init__.py +7 -0
- rasa/shared/core/flows/flow.py +362 -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 +223 -0
- rasa/shared/core/flows/flows_yaml_schema.json +217 -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/validation.py +527 -0
- rasa/shared/core/flows/yaml_flows_io.py +278 -0
- rasa/shared/core/generator.py +908 -0
- rasa/shared/core/slot_mappings.py +526 -0
- rasa/shared/core/slots.py +649 -0
- rasa/shared/core/trackers.py +1177 -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 +838 -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 +163 -0
- rasa/shared/importers/__init__.py +0 -0
- rasa/shared/importers/importer.py +704 -0
- rasa/shared/importers/multi_project.py +203 -0
- rasa/shared/importers/rasa.py +99 -0
- rasa/shared/importers/utils.py +34 -0
- rasa/shared/nlu/__init__.py +0 -0
- rasa/shared/nlu/constants.py +47 -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 +603 -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 +730 -0
- rasa/shared/nlu/training_data/util.py +223 -0
- rasa/shared/providers/__init__.py +0 -0
- rasa/shared/providers/openai/__init__.py +0 -0
- rasa/shared/providers/openai/clients.py +43 -0
- rasa/shared/providers/openai/session_handler.py +110 -0
- rasa/shared/utils/__init__.py +0 -0
- rasa/shared/utils/cli.py +72 -0
- rasa/shared/utils/common.py +308 -0
- rasa/shared/utils/constants.py +4 -0
- rasa/shared/utils/io.py +415 -0
- rasa/shared/utils/llm.py +404 -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 +212 -0
- rasa/shared/utils/schemas/model_config.yml +46 -0
- rasa/shared/utils/schemas/stories.yml +173 -0
- rasa/shared/utils/yaml.py +786 -0
- rasa/studio/__init__.py +0 -0
- rasa/studio/auth.py +268 -0
- rasa/studio/config.py +127 -0
- rasa/studio/constants.py +18 -0
- rasa/studio/data_handler.py +359 -0
- rasa/studio/download.py +483 -0
- rasa/studio/results_logger.py +137 -0
- rasa/studio/train.py +135 -0
- rasa/studio/upload.py +433 -0
- rasa/telemetry.py +1737 -0
- rasa/tracing/__init__.py +0 -0
- rasa/tracing/config.py +353 -0
- rasa/tracing/constants.py +62 -0
- rasa/tracing/instrumentation/__init__.py +0 -0
- rasa/tracing/instrumentation/attribute_extractors.py +672 -0
- rasa/tracing/instrumentation/instrumentation.py +1185 -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 +635 -0
- rasa/utils/converter.py +53 -0
- rasa/utils/endpoints.py +302 -0
- rasa/utils/io.py +260 -0
- rasa/utils/licensing.py +534 -0
- rasa/utils/log_utils.py +174 -0
- rasa/utils/mapper.py +210 -0
- rasa/utils/ml_utils.py +145 -0
- rasa/utils/plotting.py +362 -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 +1337 -0
- rasa/version.py +3 -0
- rasa_pro-3.9.18.dist-info/METADATA +563 -0
- rasa_pro-3.9.18.dist-info/NOTICE +5 -0
- rasa_pro-3.9.18.dist-info/RECORD +662 -0
- rasa_pro-3.9.18.dist-info/WHEEL +4 -0
- rasa_pro-3.9.18.dist-info/entry_points.txt +3 -0
rasa/cli/e2e_test.py
ADDED
|
@@ -0,0 +1,586 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import asyncio
|
|
3
|
+
import logging
|
|
4
|
+
import math
|
|
5
|
+
import shutil
|
|
6
|
+
import sys
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from textwrap import dedent
|
|
9
|
+
from typing import Any, Dict, Generator, List, Optional, Text, Tuple, Union
|
|
10
|
+
|
|
11
|
+
import rasa.cli.arguments.run
|
|
12
|
+
import rasa.cli.utils
|
|
13
|
+
import rasa.shared.data
|
|
14
|
+
import rasa.shared.utils.cli
|
|
15
|
+
import rasa.shared.utils.io
|
|
16
|
+
import rich
|
|
17
|
+
from rasa.cli import SubParsersAction
|
|
18
|
+
from rasa.cli.arguments.default_arguments import add_endpoint_param, add_model_param
|
|
19
|
+
from rasa.core.exceptions import AgentNotReady
|
|
20
|
+
from rasa.core.utils import AvailableEndpoints
|
|
21
|
+
from rasa.exceptions import RasaException
|
|
22
|
+
from rasa.shared.constants import DEFAULT_ENDPOINTS_PATH, DEFAULT_MODELS_PATH
|
|
23
|
+
|
|
24
|
+
from rasa.e2e_test.constants import SCHEMA_FILE_PATH, KEY_TEST_CASE
|
|
25
|
+
from rasa.e2e_test.e2e_test_case import (
|
|
26
|
+
KEY_FIXTURES,
|
|
27
|
+
KEY_METADATA,
|
|
28
|
+
Fixture,
|
|
29
|
+
Metadata,
|
|
30
|
+
TestCase,
|
|
31
|
+
TestSuite,
|
|
32
|
+
)
|
|
33
|
+
from rasa.e2e_test.e2e_test_result import TestResult
|
|
34
|
+
from rasa.e2e_test.e2e_test_runner import E2ETestRunner
|
|
35
|
+
import rasa.utils.io
|
|
36
|
+
from rasa.shared.utils.yaml import (
|
|
37
|
+
parse_raw_yaml,
|
|
38
|
+
read_schema_file,
|
|
39
|
+
validate_yaml_content_using_schema,
|
|
40
|
+
is_key_in_yaml,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
DEFAULT_E2E_INPUT_TESTS_PATH = "tests/e2e_test_cases.yml"
|
|
44
|
+
DEFAULT_E2E_OUTPUT_TESTS_PATH = "tests/e2e_results.yml"
|
|
45
|
+
KEY_TEST_CASES = "test_cases"
|
|
46
|
+
|
|
47
|
+
logger = logging.getLogger(__name__)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def add_subparser(
|
|
51
|
+
subparsers: SubParsersAction, parents: List[argparse.ArgumentParser]
|
|
52
|
+
) -> None:
|
|
53
|
+
"""Add the e2e subparser to `rasa test`.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
subparsers: subparser we are going to attach to
|
|
57
|
+
parents: Parent parsers, needed to ensure tree structure in argparse
|
|
58
|
+
"""
|
|
59
|
+
for subparser in subparsers.choices.values():
|
|
60
|
+
if subparser.prog == "rasa test":
|
|
61
|
+
e2e_test_subparser = create_e2e_test_subparser(parents)
|
|
62
|
+
|
|
63
|
+
for action in subparser._subparsers._actions:
|
|
64
|
+
if action.choices is not None:
|
|
65
|
+
action.choices["e2e"] = e2e_test_subparser
|
|
66
|
+
return
|
|
67
|
+
|
|
68
|
+
# If we get here, we couldn't hook the subparser to `rasa test`
|
|
69
|
+
raise RasaException(
|
|
70
|
+
"Hooking the e2e subparser to `rasa test` command "
|
|
71
|
+
"could not be completed. Cannot run end-to-end testing."
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def create_e2e_test_subparser(
|
|
76
|
+
parents: List[argparse.ArgumentParser],
|
|
77
|
+
) -> argparse.ArgumentParser:
|
|
78
|
+
"""Create e2e test subparser."""
|
|
79
|
+
e2e_test_subparser = argparse.ArgumentParser(
|
|
80
|
+
prog="rasa test e2e",
|
|
81
|
+
parents=parents,
|
|
82
|
+
conflict_handler="resolve",
|
|
83
|
+
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
|
84
|
+
description="Runs end-to-end testing.",
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
e2e_test_subparser.set_defaults(func=execute_e2e_tests)
|
|
88
|
+
|
|
89
|
+
add_e2e_test_arguments(e2e_test_subparser)
|
|
90
|
+
add_model_param(e2e_test_subparser, add_positional_arg=False)
|
|
91
|
+
add_endpoint_param(
|
|
92
|
+
e2e_test_subparser,
|
|
93
|
+
help_text="Configuration file for the model server and the connectors as a "
|
|
94
|
+
"yml file.",
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
return e2e_test_subparser
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def add_e2e_test_arguments(parser: argparse.ArgumentParser) -> None:
|
|
101
|
+
"""Arguments for running E2E tests directly using `rasa e2e`."""
|
|
102
|
+
e2e_arguments = parser.add_argument_group("Testing Settings")
|
|
103
|
+
e2e_arguments.add_argument(
|
|
104
|
+
"path-to-test-cases",
|
|
105
|
+
nargs="?",
|
|
106
|
+
type=str,
|
|
107
|
+
help="Input file or folder containing end-to-end test cases.",
|
|
108
|
+
default=DEFAULT_E2E_INPUT_TESTS_PATH,
|
|
109
|
+
)
|
|
110
|
+
e2e_arguments.add_argument(
|
|
111
|
+
"--fail-fast",
|
|
112
|
+
action="store_true",
|
|
113
|
+
help="Fail the test suite as soon as a unit test fails.",
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
parser.add_argument(
|
|
117
|
+
"-o",
|
|
118
|
+
"--e2e-results",
|
|
119
|
+
action="store_const",
|
|
120
|
+
const=DEFAULT_E2E_OUTPUT_TESTS_PATH,
|
|
121
|
+
help="Results file containing end-to-end testing summary.",
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
parser.add_argument(
|
|
125
|
+
"--remote-storage",
|
|
126
|
+
help="Set the remote location where your Rasa model is stored, e.g. on AWS.",
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def split_into_passed_failed(
|
|
131
|
+
results: List[TestResult],
|
|
132
|
+
) -> Tuple[List[TestResult], List[TestResult]]:
|
|
133
|
+
"""Get the summary of the test results.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
results: List of test results.
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
Tuple consisting of passed count, failed count and failed test cases.
|
|
140
|
+
"""
|
|
141
|
+
passed_cases = [r for r in results if r.pass_status]
|
|
142
|
+
failed_cases = [r for r in results if not r.pass_status]
|
|
143
|
+
|
|
144
|
+
return passed_cases, failed_cases
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def is_test_case_file(file_path: Union[Text, Path]) -> bool:
|
|
148
|
+
"""Check if file contains test cases.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
file_path: Path of the file to check.
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
`True` if the file contains test cases, `False` otherwise.
|
|
155
|
+
"""
|
|
156
|
+
return rasa.shared.data.is_likely_yaml_file(file_path) and is_key_in_yaml(
|
|
157
|
+
file_path, KEY_TEST_CASES
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def validate_path_to_test_cases(path: Text) -> None:
|
|
162
|
+
"""Validate that path to test cases exists."""
|
|
163
|
+
if not Path(path).exists():
|
|
164
|
+
rasa.shared.utils.io.raise_warning(
|
|
165
|
+
f"Path to test cases does not exist: {path}. "
|
|
166
|
+
f"Please provide a valid path to test cases. "
|
|
167
|
+
f"Exiting...",
|
|
168
|
+
UserWarning,
|
|
169
|
+
)
|
|
170
|
+
sys.exit(1)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def extract_test_case_from_path(path: Text) -> Tuple[Text, Text]:
|
|
174
|
+
"""Extract test case from path if specified.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
path: Path to the file or folder containing test cases.
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
Tuple consisting of the path to test cases and the extracted test case name.
|
|
181
|
+
"""
|
|
182
|
+
test_case_name = ""
|
|
183
|
+
|
|
184
|
+
if "::" in str(path):
|
|
185
|
+
splitted_path = path.split("::")
|
|
186
|
+
test_case_name = splitted_path[-1]
|
|
187
|
+
path = splitted_path[0]
|
|
188
|
+
|
|
189
|
+
return path, test_case_name
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def validate_test_case(test_case_name: Text, input_test_cases: List[TestCase]) -> None:
|
|
193
|
+
"""Validate that test case exists."""
|
|
194
|
+
if test_case_name and not input_test_cases:
|
|
195
|
+
rasa.shared.utils.io.raise_warning(
|
|
196
|
+
f"Test case does not exist: {test_case_name}. "
|
|
197
|
+
f"Please check for typos and provide a valid test case name. "
|
|
198
|
+
f"Exiting...",
|
|
199
|
+
UserWarning,
|
|
200
|
+
)
|
|
201
|
+
sys.exit(1)
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def read_test_cases(path: Text) -> TestSuite:
|
|
205
|
+
"""Read test cases from the given path.
|
|
206
|
+
|
|
207
|
+
Args:
|
|
208
|
+
path: Path to the file or folder containing test cases.
|
|
209
|
+
|
|
210
|
+
Returns:
|
|
211
|
+
TestSuite.
|
|
212
|
+
"""
|
|
213
|
+
path, test_case_name = extract_test_case_from_path(path)
|
|
214
|
+
validate_path_to_test_cases(path)
|
|
215
|
+
|
|
216
|
+
test_files = rasa.shared.data.get_data_files([path], is_test_case_file)
|
|
217
|
+
e2e_test_schema = read_e2e_test_schema()
|
|
218
|
+
|
|
219
|
+
input_test_cases = []
|
|
220
|
+
fixtures: Dict[Text, Fixture] = {}
|
|
221
|
+
metadata: Dict[Text, Metadata] = {}
|
|
222
|
+
|
|
223
|
+
for test_file in test_files:
|
|
224
|
+
test_file_content = parse_raw_yaml(Path(test_file).read_text())
|
|
225
|
+
validate_yaml_content_using_schema(test_file_content, e2e_test_schema)
|
|
226
|
+
|
|
227
|
+
test_cases_content = test_file_content.get(KEY_TEST_CASES) or []
|
|
228
|
+
|
|
229
|
+
if test_case_name:
|
|
230
|
+
test_cases = [
|
|
231
|
+
TestCase.from_dict(test_case_dict, file=test_file)
|
|
232
|
+
for test_case_dict in test_cases_content
|
|
233
|
+
if test_case_name == test_case_dict.get(KEY_TEST_CASE)
|
|
234
|
+
]
|
|
235
|
+
else:
|
|
236
|
+
test_cases = [
|
|
237
|
+
TestCase.from_dict(test_case_dict, file=test_file)
|
|
238
|
+
for test_case_dict in test_cases_content
|
|
239
|
+
]
|
|
240
|
+
|
|
241
|
+
input_test_cases.extend(test_cases)
|
|
242
|
+
fixtures_content = test_file_content.get(KEY_FIXTURES) or []
|
|
243
|
+
metadata_contents = test_file_content.get(KEY_METADATA) or []
|
|
244
|
+
for fixture in fixtures_content:
|
|
245
|
+
fixture_obj = Fixture.from_dict(fixture_dict=fixture)
|
|
246
|
+
|
|
247
|
+
# avoid adding duplicates from across multiple files
|
|
248
|
+
if fixtures.get(fixture_obj.name) is None:
|
|
249
|
+
fixtures[fixture_obj.name] = fixture_obj
|
|
250
|
+
|
|
251
|
+
for metadata_content in metadata_contents:
|
|
252
|
+
metadata_obj = Metadata.from_dict(metadata_dict=metadata_content)
|
|
253
|
+
|
|
254
|
+
# avoid adding duplicates from across multiple files
|
|
255
|
+
if metadata.get(metadata_obj.name) is None:
|
|
256
|
+
metadata[metadata_obj.name] = metadata_obj
|
|
257
|
+
|
|
258
|
+
validate_test_case(test_case_name, input_test_cases)
|
|
259
|
+
return TestSuite(input_test_cases, list(fixtures.values()), list(metadata.values()))
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
def execute_e2e_tests(args: argparse.Namespace) -> None:
|
|
263
|
+
"""Run the end-to-end tests.
|
|
264
|
+
|
|
265
|
+
Args:
|
|
266
|
+
args: Commandline arguments.
|
|
267
|
+
"""
|
|
268
|
+
args.endpoints = rasa.cli.utils.get_validated_path(
|
|
269
|
+
args.endpoints, "endpoints", DEFAULT_ENDPOINTS_PATH, True
|
|
270
|
+
)
|
|
271
|
+
endpoints = AvailableEndpoints.read_endpoints(args.endpoints)
|
|
272
|
+
|
|
273
|
+
# Ignore all endpoints apart from action server, model, nlu and nlg
|
|
274
|
+
# to ensure InMemoryTrackerStore is being used instead of production
|
|
275
|
+
# tracker store
|
|
276
|
+
endpoints.tracker_store = None
|
|
277
|
+
endpoints.lock_store = None
|
|
278
|
+
endpoints.event_broker = None
|
|
279
|
+
|
|
280
|
+
if endpoints.model is None:
|
|
281
|
+
args.model = validate_model_path(args.model, "model", DEFAULT_MODELS_PATH)
|
|
282
|
+
|
|
283
|
+
path_to_test_cases = getattr(
|
|
284
|
+
args, "path-to-test-cases", DEFAULT_E2E_INPUT_TESTS_PATH
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
test_suite = read_test_cases(path_to_test_cases)
|
|
288
|
+
|
|
289
|
+
try:
|
|
290
|
+
test_runner = E2ETestRunner(
|
|
291
|
+
remote_storage=args.remote_storage,
|
|
292
|
+
model_path=args.model,
|
|
293
|
+
model_server=endpoints.model,
|
|
294
|
+
endpoints=endpoints,
|
|
295
|
+
)
|
|
296
|
+
except AgentNotReady as error:
|
|
297
|
+
logger.error(msg=error.message)
|
|
298
|
+
sys.exit(1)
|
|
299
|
+
|
|
300
|
+
results = asyncio.run(
|
|
301
|
+
test_runner.run_tests(
|
|
302
|
+
test_suite.test_cases,
|
|
303
|
+
test_suite.fixtures,
|
|
304
|
+
args.fail_fast,
|
|
305
|
+
input_metadata=test_suite.metadata,
|
|
306
|
+
)
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
if args.e2e_results is not None:
|
|
310
|
+
write_test_results_to_file(results, args.e2e_results)
|
|
311
|
+
|
|
312
|
+
passed, failed = split_into_passed_failed(results)
|
|
313
|
+
print_test_result(passed, failed, args.fail_fast)
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def write_test_results_to_file(results: List[TestResult], output_file: Text) -> None:
|
|
317
|
+
"""Write test results to a file.
|
|
318
|
+
|
|
319
|
+
Args:
|
|
320
|
+
results: List of test results.
|
|
321
|
+
output_file: Path to the output file.
|
|
322
|
+
"""
|
|
323
|
+
Path(output_file).touch()
|
|
324
|
+
|
|
325
|
+
data = {"test_results": [test_result.as_dict() for test_result in results]}
|
|
326
|
+
|
|
327
|
+
rasa.utils.io.write_yaml(
|
|
328
|
+
data, target=output_file, transform=transform_results_output_to_yaml
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
rasa.shared.utils.cli.print_info(
|
|
332
|
+
f"Overall results have been saved at path: {output_file}."
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
def transform_results_output_to_yaml(yaml_string: Text) -> Text:
|
|
337
|
+
"""Transform the output of the YAML writer to make it more readable.
|
|
338
|
+
|
|
339
|
+
Args:
|
|
340
|
+
yaml_string: The YAML string to transform.
|
|
341
|
+
|
|
342
|
+
Returns:
|
|
343
|
+
The transformed YAML string.
|
|
344
|
+
"""
|
|
345
|
+
result = []
|
|
346
|
+
for s in yaml_string.splitlines(True):
|
|
347
|
+
if s.startswith("- name"):
|
|
348
|
+
result.append("\n")
|
|
349
|
+
result.append(s)
|
|
350
|
+
elif s.startswith("\n"):
|
|
351
|
+
result.append(s.strip())
|
|
352
|
+
else:
|
|
353
|
+
result.append(s)
|
|
354
|
+
return "".join(result)
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
def pad(text: Text, char: Text = "=", min: int = 3) -> Text:
|
|
358
|
+
"""Pad text to a certain length.
|
|
359
|
+
|
|
360
|
+
Uses `char` to pad the text to the specified length. If the text is longer
|
|
361
|
+
than the specified length, at least `min` are used.
|
|
362
|
+
|
|
363
|
+
The padding is applied to the left and right of the text (almost) equally.
|
|
364
|
+
|
|
365
|
+
Example:
|
|
366
|
+
>>> pad("Hello")
|
|
367
|
+
"========= Hello ========"
|
|
368
|
+
>>> pad("Hello", char="-")
|
|
369
|
+
"--------- Hello --------"
|
|
370
|
+
|
|
371
|
+
Args:
|
|
372
|
+
text: Text to pad.
|
|
373
|
+
min: Minimum length of the padding.
|
|
374
|
+
char: Character to pad with.
|
|
375
|
+
|
|
376
|
+
Returns:
|
|
377
|
+
Padded text.
|
|
378
|
+
"""
|
|
379
|
+
width = shutil.get_terminal_size((80, 20)).columns
|
|
380
|
+
padding = max(width - len(text) - 2, min * 2)
|
|
381
|
+
|
|
382
|
+
return char * (padding // 2) + " " + text + " " + char * math.ceil(padding / 2)
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
def color_difference(diff: List[Text]) -> Generator[Text, None, None]:
|
|
386
|
+
"""Colorize the difference between two strings.
|
|
387
|
+
|
|
388
|
+
Example:
|
|
389
|
+
>>> color_difference(["+ Hello", "- World"])
|
|
390
|
+
["<ansigreen>+ Hello</ansigreen>", "<ansired>- World</ansired>"]
|
|
391
|
+
|
|
392
|
+
Args:
|
|
393
|
+
diff: List of lines of the diff.
|
|
394
|
+
|
|
395
|
+
Returns:
|
|
396
|
+
Generator of colored lines.
|
|
397
|
+
"""
|
|
398
|
+
for line in diff:
|
|
399
|
+
if line.startswith("+"):
|
|
400
|
+
yield "[green3]" + line + "[/green3]"
|
|
401
|
+
elif line.startswith("-"):
|
|
402
|
+
yield "[red3]" + line + "[/red3]"
|
|
403
|
+
elif line.startswith("^"):
|
|
404
|
+
yield "[blue3]" + line + "[/blue3]"
|
|
405
|
+
elif line.startswith("?"):
|
|
406
|
+
yield "[grey37]" + line + "[/grey37]"
|
|
407
|
+
else:
|
|
408
|
+
yield line
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
def print_failed_case(fail: TestResult) -> None:
|
|
412
|
+
"""Print the details of a failed test case.
|
|
413
|
+
|
|
414
|
+
Example:
|
|
415
|
+
>>> print_failed_case(TestResult(TestCase("test", "test.md"), 1,
|
|
416
|
+
... ["- Hello", "+ World"]))
|
|
417
|
+
---------------------- test in test.md failed ----------------------
|
|
418
|
+
Mismatch starting at test.md:1:
|
|
419
|
+
<ansired>- Hello</ansired>
|
|
420
|
+
<ansigreen>+ World</ansigreen>
|
|
421
|
+
"""
|
|
422
|
+
fail_headline = (
|
|
423
|
+
f"'{fail.test_case.name}' in {fail.test_case.file_with_line()} failed"
|
|
424
|
+
)
|
|
425
|
+
rasa.shared.utils.cli.print_error(f"{pad(fail_headline, char='-')}\n")
|
|
426
|
+
print(f"Mismatch starting at {fail.test_case.file}:{fail.error_line}: \n")
|
|
427
|
+
rich.print(("\n".join(color_difference(fail.difference))))
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
def print_test_summary(failed: List[TestResult]) -> None:
|
|
431
|
+
"""Print the summary of the test run.
|
|
432
|
+
|
|
433
|
+
Example:
|
|
434
|
+
>>> print_test_summary([TestResult(TestCase("test", "test.md"), 1,
|
|
435
|
+
... ["- Hello", "+ World"])])
|
|
436
|
+
=================== short test summary info ===================
|
|
437
|
+
FAILED test.md::test
|
|
438
|
+
"""
|
|
439
|
+
rasa.shared.utils.cli.print_info(pad("short test summary info"))
|
|
440
|
+
|
|
441
|
+
for f in failed:
|
|
442
|
+
rasa.shared.utils.cli.print_error(
|
|
443
|
+
f"FAILED {f.test_case.file}::{f.test_case.name}"
|
|
444
|
+
)
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
def print_final_line(
|
|
448
|
+
passed: List[TestResult], failed: List[TestResult], has_failed: bool
|
|
449
|
+
) -> None:
|
|
450
|
+
"""Print the final line of the test output.
|
|
451
|
+
|
|
452
|
+
Args:
|
|
453
|
+
passed: List of passed test cases.
|
|
454
|
+
failed: List of failed test cases.
|
|
455
|
+
has_failed: Boolean, true if the test run has failed.
|
|
456
|
+
"""
|
|
457
|
+
final_line_color = "green3" if not has_failed else "red3"
|
|
458
|
+
|
|
459
|
+
width = shutil.get_terminal_size((80, 20)).columns
|
|
460
|
+
|
|
461
|
+
# calculate the length of the text - this is a bit hacky but works
|
|
462
|
+
text_lengt = (
|
|
463
|
+
math.ceil(len(passed) / 10) # length of the number of passed tests
|
|
464
|
+
+ math.ceil(len(failed) / 10) # length of the number of failed tests
|
|
465
|
+
+ 18 # length of the text " failed, passed "
|
|
466
|
+
)
|
|
467
|
+
# we can't use the padding function here as the text contains html tags
|
|
468
|
+
# which are not taken into account when calculating the length
|
|
469
|
+
padding = max(6, width - text_lengt)
|
|
470
|
+
pre_pad = "=" * max(3, padding // 2)
|
|
471
|
+
post_pad = "=" * max(3, math.ceil(padding / 2))
|
|
472
|
+
rich.print(
|
|
473
|
+
f"[{final_line_color}]{pre_pad} "
|
|
474
|
+
f"[bold red3]{len(failed)} failed[/bold red3]"
|
|
475
|
+
f"[bright_white], [/bright_white]"
|
|
476
|
+
f"[bold green3]{len(passed)} passed[/bold green3]"
|
|
477
|
+
f" {post_pad}[/{final_line_color}]"
|
|
478
|
+
)
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
def print_test_result(
|
|
482
|
+
passed: List[TestResult],
|
|
483
|
+
failed: List[TestResult],
|
|
484
|
+
fail_fast: bool = False,
|
|
485
|
+
) -> None:
|
|
486
|
+
"""Print the result of the test run.
|
|
487
|
+
|
|
488
|
+
Args:
|
|
489
|
+
passed: List of passed test cases.
|
|
490
|
+
failed: List of failed test cases.
|
|
491
|
+
fail_fast: If true, stop after the first failure.
|
|
492
|
+
"""
|
|
493
|
+
if failed:
|
|
494
|
+
# print failure headline
|
|
495
|
+
print("\n")
|
|
496
|
+
rich.print(f"[bold]{pad('FAILURES', char='=')}[/bold]")
|
|
497
|
+
|
|
498
|
+
# print failed test_Case
|
|
499
|
+
for fail in failed:
|
|
500
|
+
print_failed_case(fail)
|
|
501
|
+
|
|
502
|
+
print_test_summary(failed)
|
|
503
|
+
|
|
504
|
+
if fail_fast:
|
|
505
|
+
rasa.shared.utils.cli.print_error(pad("stopping after 1 failure", char="!"))
|
|
506
|
+
has_failed = True
|
|
507
|
+
elif len(failed) + len(passed) == 0:
|
|
508
|
+
# no tests were run, print error
|
|
509
|
+
rasa.shared.utils.cli.print_error(pad("no test cases found", char="!"))
|
|
510
|
+
print_e2e_help()
|
|
511
|
+
has_failed = True
|
|
512
|
+
elif failed:
|
|
513
|
+
has_failed = True
|
|
514
|
+
else:
|
|
515
|
+
has_failed = False
|
|
516
|
+
|
|
517
|
+
print_final_line(passed, failed, has_failed=has_failed)
|
|
518
|
+
sys.exit(1 if has_failed else 0)
|
|
519
|
+
|
|
520
|
+
|
|
521
|
+
def print_e2e_help() -> None:
|
|
522
|
+
"""Print help guiding users how to write e2e tests."""
|
|
523
|
+
rasa.shared.utils.cli.print_info(
|
|
524
|
+
dedent(
|
|
525
|
+
"""\
|
|
526
|
+
To start using e2e tests create a yaml file in a test directory, e.g.
|
|
527
|
+
'tests/test_cases.yml'. You can find example test cases in the starter
|
|
528
|
+
pack at
|
|
529
|
+
|
|
530
|
+
https://github.com/RasaHQ/starter-pack-intentless-policy#testing-the-policy
|
|
531
|
+
|
|
532
|
+
Here is an example of a test case in yaml format:
|
|
533
|
+
|
|
534
|
+
test_cases:
|
|
535
|
+
- test_case: "test_greet"
|
|
536
|
+
steps:
|
|
537
|
+
- user: "hello there!"
|
|
538
|
+
- bot: "Hey! How are you?"
|
|
539
|
+
|
|
540
|
+
To run the e2e tests, execute:
|
|
541
|
+
>>> rasa test e2e <path-to-test-cases>
|
|
542
|
+
"""
|
|
543
|
+
)
|
|
544
|
+
)
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
def validate_model_path(
|
|
548
|
+
model_path: Optional[Text], parameter: Text, default: Text
|
|
549
|
+
) -> Text:
|
|
550
|
+
"""Validate the model path.
|
|
551
|
+
|
|
552
|
+
Args:
|
|
553
|
+
model_path: Path to the model.
|
|
554
|
+
parameter: Name of the parameter.
|
|
555
|
+
default: Default path to the model.
|
|
556
|
+
|
|
557
|
+
Returns:
|
|
558
|
+
Path to the model.
|
|
559
|
+
"""
|
|
560
|
+
if model_path and Path(model_path).exists():
|
|
561
|
+
return model_path
|
|
562
|
+
|
|
563
|
+
if model_path and not Path(model_path).exists():
|
|
564
|
+
rasa.shared.utils.io.raise_warning(
|
|
565
|
+
f"The provided model path '{model_path}' could not be found. "
|
|
566
|
+
f"Using default location '{default}' instead.",
|
|
567
|
+
UserWarning,
|
|
568
|
+
)
|
|
569
|
+
|
|
570
|
+
elif model_path is None:
|
|
571
|
+
logger.info(
|
|
572
|
+
f"Parameter '{parameter}' is not set. "
|
|
573
|
+
f"Using default location '{default}' instead."
|
|
574
|
+
)
|
|
575
|
+
|
|
576
|
+
Path(default).mkdir(exist_ok=True)
|
|
577
|
+
return default
|
|
578
|
+
|
|
579
|
+
|
|
580
|
+
def read_e2e_test_schema() -> Union[List[Any], Dict[Text, Any]]:
|
|
581
|
+
"""Read the schema for the e2e test files.
|
|
582
|
+
|
|
583
|
+
Returns:
|
|
584
|
+
The content of the schema.
|
|
585
|
+
"""
|
|
586
|
+
return read_schema_file(SCHEMA_FILE_PATH)
|