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
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections import defaultdict
|
|
4
|
+
import re
|
|
5
|
+
from typing import Optional, Set, Text, List
|
|
6
|
+
import typing
|
|
7
|
+
from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
|
|
8
|
+
|
|
9
|
+
from rasa.shared.core.flows.flow_step import (
|
|
10
|
+
FlowStep,
|
|
11
|
+
)
|
|
12
|
+
from rasa.shared.core.flows.flow_step_links import (
|
|
13
|
+
BranchingFlowStepLink,
|
|
14
|
+
IfFlowStepLink,
|
|
15
|
+
ElseFlowStepLink,
|
|
16
|
+
)
|
|
17
|
+
from rasa.shared.core.flows.flow_step_sequence import FlowStepSequence
|
|
18
|
+
from rasa.shared.core.flows.steps.constants import CONTINUE_STEP_PREFIX, DEFAULT_STEPS
|
|
19
|
+
from rasa.shared.core.flows.steps.call import CallFlowStep
|
|
20
|
+
from rasa.shared.core.flows.steps.link import LinkFlowStep
|
|
21
|
+
from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
|
|
22
|
+
from rasa.shared.core.flows.flow import Flow
|
|
23
|
+
from rasa.shared.exceptions import RasaException
|
|
24
|
+
|
|
25
|
+
if typing.TYPE_CHECKING:
|
|
26
|
+
from rasa.shared.core.flows.flows_list import FlowsList
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
FLOW_ID_REGEX = r"""^[a-zA-Z0-9_][a-zA-Z0-9_-]*?$"""
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class UnreachableFlowStepException(RasaException):
|
|
33
|
+
"""Raised when a flow step is unreachable."""
|
|
34
|
+
|
|
35
|
+
def __init__(self, step_id: str, flow_id: str) -> None:
|
|
36
|
+
"""Initializes the exception."""
|
|
37
|
+
self.step_id = step_id
|
|
38
|
+
self.flow_id = flow_id
|
|
39
|
+
|
|
40
|
+
def __str__(self) -> str:
|
|
41
|
+
"""Return a string representation of the exception."""
|
|
42
|
+
return (
|
|
43
|
+
f"Step '{self.step_id}' in flow '{self.flow_id}' can not be reached "
|
|
44
|
+
f"from the start step. Please make sure that all steps can be reached "
|
|
45
|
+
f"from the start step, e.g. by "
|
|
46
|
+
f"checking that another step points to this step."
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class MissingNextLinkException(RasaException):
|
|
51
|
+
"""Raised when a flow step is missing a next link."""
|
|
52
|
+
|
|
53
|
+
def __init__(self, step_id: str, flow_id: str) -> None:
|
|
54
|
+
"""Initializes the exception."""
|
|
55
|
+
self.step_id = step_id
|
|
56
|
+
self.flow_id = flow_id
|
|
57
|
+
|
|
58
|
+
def __str__(self) -> str:
|
|
59
|
+
"""Return a string representation of the exception."""
|
|
60
|
+
return (
|
|
61
|
+
f"Step '{self.step_id}' in flow '{self.flow_id}' is missing a `next`. "
|
|
62
|
+
f"As a last step of a branch, it is required to have one. "
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class ReservedFlowStepIdException(RasaException):
|
|
67
|
+
"""Raised when a flow step is using a reserved id."""
|
|
68
|
+
|
|
69
|
+
def __init__(self, step_id: str, flow_id: str) -> None:
|
|
70
|
+
"""Initializes the exception."""
|
|
71
|
+
self.step_id = step_id
|
|
72
|
+
self.flow_id = flow_id
|
|
73
|
+
|
|
74
|
+
def __str__(self) -> str:
|
|
75
|
+
"""Return a string representation of the exception."""
|
|
76
|
+
return (
|
|
77
|
+
f"Step '{self.step_id}' in flow '{self.flow_id}' is using the reserved id "
|
|
78
|
+
f"'{self.step_id}'. Please use a different id for your step."
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class DuplicatedStepIdException(RasaException):
|
|
83
|
+
"""Raised when a flow step is using the same id as another step."""
|
|
84
|
+
|
|
85
|
+
def __init__(self, step_id: str, flow_id: str) -> None:
|
|
86
|
+
"""Initializes the exception."""
|
|
87
|
+
self.step_id = step_id
|
|
88
|
+
self.flow_id = flow_id
|
|
89
|
+
|
|
90
|
+
def __str__(self) -> str:
|
|
91
|
+
"""Return a string representation of the exception."""
|
|
92
|
+
return (
|
|
93
|
+
f"Step '{self.step_id}' in flow '{self.flow_id}' is using the same id as "
|
|
94
|
+
f"another step. Step ids must be unique across all steps of a flow. "
|
|
95
|
+
f"Please use a different id for your step."
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class MissingElseBranchException(RasaException):
|
|
100
|
+
"""Raised when a flow step is missing an else branch."""
|
|
101
|
+
|
|
102
|
+
def __init__(self, step_id: str, flow_id: str) -> None:
|
|
103
|
+
"""Initializes the exception."""
|
|
104
|
+
self.step_id = step_id
|
|
105
|
+
self.flow_id = flow_id
|
|
106
|
+
|
|
107
|
+
def __str__(self) -> str:
|
|
108
|
+
"""Return a string representation of the exception."""
|
|
109
|
+
return (
|
|
110
|
+
f"Step '{self.step_id}' in flow '{self.flow_id}' is missing an `else` "
|
|
111
|
+
f"branch. If a steps `next` statement contains an `if` it always "
|
|
112
|
+
f"also needs an `else` branch. Please add the missing `else` branch."
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class NoNextAllowedForLinkException(RasaException):
|
|
117
|
+
"""Raised when a flow step has a next link but is not allowed to have one."""
|
|
118
|
+
|
|
119
|
+
def __init__(self, step_id: str, flow_id: str) -> None:
|
|
120
|
+
"""Initializes the exception."""
|
|
121
|
+
self.step_id = step_id
|
|
122
|
+
self.flow_id = flow_id
|
|
123
|
+
|
|
124
|
+
def __str__(self) -> str:
|
|
125
|
+
"""Return a string representation of the exception."""
|
|
126
|
+
return (
|
|
127
|
+
f"Link step '{self.step_id}' in flow '{self.flow_id}' has a `next` but "
|
|
128
|
+
f"as a link step is not allowed to have one."
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class ReferenceToPatternException(RasaException):
|
|
133
|
+
"""Raised when a flow step is referencing a pattern, which is not allowed."""
|
|
134
|
+
|
|
135
|
+
def __init__(self, referenced_pattern: str, flow_id: str, step_id: str) -> None:
|
|
136
|
+
"""Initializes the exception."""
|
|
137
|
+
self.step_id = step_id
|
|
138
|
+
self.flow_id = flow_id
|
|
139
|
+
self.referenced_pattern = referenced_pattern
|
|
140
|
+
|
|
141
|
+
def __str__(self) -> str:
|
|
142
|
+
"""Return a string representation of the exception."""
|
|
143
|
+
return (
|
|
144
|
+
f"Step '{self.step_id}' in flow '{self.flow_id}' is referencing a pattern "
|
|
145
|
+
f"'{self.referenced_pattern}', which is not allowed. "
|
|
146
|
+
f"Patterns can not be used as a target for a link or call step."
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
class PatternReferencedFlowException(RasaException):
|
|
151
|
+
"""Raised when a pattern is referencing a flow, which is not allowed."""
|
|
152
|
+
|
|
153
|
+
def __init__(self, flow_id: str, step_id: str) -> None:
|
|
154
|
+
"""Initializes the exception."""
|
|
155
|
+
self.step_id = step_id
|
|
156
|
+
self.flow_id = flow_id
|
|
157
|
+
|
|
158
|
+
def __str__(self) -> str:
|
|
159
|
+
"""Return a string representation of the exception."""
|
|
160
|
+
return (
|
|
161
|
+
f"Step '{self.step_id}' in flow '{self.flow_id}' is referencing a flow "
|
|
162
|
+
f"which is not allowed. "
|
|
163
|
+
f"Patterns can not use link or call steps."
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
class NoLinkAllowedInCalledFlowException(RasaException):
|
|
168
|
+
"""Raised when a flow is called from another flow but is also using a link."""
|
|
169
|
+
|
|
170
|
+
def __init__(self, step_id: str, flow_id: str, called_flow_id: str) -> None:
|
|
171
|
+
"""Initializes the exception."""
|
|
172
|
+
self.step_id = step_id
|
|
173
|
+
self.flow_id = flow_id
|
|
174
|
+
self.called_flow_id = called_flow_id
|
|
175
|
+
|
|
176
|
+
def __str__(self) -> str:
|
|
177
|
+
"""Return a string representation of the exception."""
|
|
178
|
+
return (
|
|
179
|
+
f"Flow '{self.flow_id}' is calling another flow (call step). "
|
|
180
|
+
f"The flow that is getting called ('{self.called_flow_id}') is "
|
|
181
|
+
f"using a link step, which is not allowed. "
|
|
182
|
+
f"Either this flow can not be called or the link step in {self.step_id} "
|
|
183
|
+
f"needs to be removed."
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
class UnresolvedFlowException(RasaException):
|
|
188
|
+
"""Raised when a flow is called or linked from another flow but doesn't exist."""
|
|
189
|
+
|
|
190
|
+
def __init__(self, flow_id: str, calling_flow_id: str, step_id: str) -> None:
|
|
191
|
+
"""Initializes the exception."""
|
|
192
|
+
self.flow_id = flow_id
|
|
193
|
+
self.calling_flow_id = calling_flow_id
|
|
194
|
+
self.step_id = step_id
|
|
195
|
+
|
|
196
|
+
def __str__(self) -> str:
|
|
197
|
+
"""Return a string representation of the exception."""
|
|
198
|
+
return (
|
|
199
|
+
f"Flow '{self.flow_id}' is called or linked from flow "
|
|
200
|
+
f"'{self.calling_flow_id}' in step '{self.step_id}', "
|
|
201
|
+
f"but it doesn't exist. "
|
|
202
|
+
f"Please make sure that a flow with id '{self.flow_id}' exists."
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
class UnresolvedFlowStepIdException(RasaException):
|
|
207
|
+
"""Raised when a flow step is referenced, but its id can not be resolved."""
|
|
208
|
+
|
|
209
|
+
def __init__(
|
|
210
|
+
self, step_id: str, flow_id: str, referenced_from_step_id: Optional[str]
|
|
211
|
+
) -> None:
|
|
212
|
+
"""Initializes the exception."""
|
|
213
|
+
self.step_id = step_id
|
|
214
|
+
self.flow_id = flow_id
|
|
215
|
+
self.referenced_from_step_id = referenced_from_step_id
|
|
216
|
+
|
|
217
|
+
def __str__(self) -> str:
|
|
218
|
+
"""Return a string representation of the exception."""
|
|
219
|
+
if self.referenced_from_step_id:
|
|
220
|
+
exception_message = (
|
|
221
|
+
f"Step with id '{self.step_id}' could not be resolved. "
|
|
222
|
+
f"'Step '{self.referenced_from_step_id}' in flow '{self.flow_id}' "
|
|
223
|
+
f"referenced this step but it does not exist. "
|
|
224
|
+
)
|
|
225
|
+
else:
|
|
226
|
+
exception_message = (
|
|
227
|
+
f"Step '{self.step_id}' in flow '{self.flow_id}' can not be resolved. "
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
return exception_message + (
|
|
231
|
+
"Please make sure that the step is defined in the same flow."
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
class EmptyStepSequenceException(RasaException):
|
|
236
|
+
"""Raised when an empty step sequence is encountered."""
|
|
237
|
+
|
|
238
|
+
def __init__(self, flow_id: str, step_id: str) -> None:
|
|
239
|
+
"""Initializes the exception."""
|
|
240
|
+
self.flow_id = flow_id
|
|
241
|
+
self.step_id = step_id
|
|
242
|
+
|
|
243
|
+
def __str__(self) -> str:
|
|
244
|
+
"""Return a string representation of the exception."""
|
|
245
|
+
return (
|
|
246
|
+
f"Encountered an empty step sequence in flow '{self.flow_id}' "
|
|
247
|
+
f"and step '{self.step_id}'."
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
class EmptyFlowException(RasaException):
|
|
252
|
+
"""Raised when a flow is completely empty."""
|
|
253
|
+
|
|
254
|
+
def __init__(self, flow_id: str) -> None:
|
|
255
|
+
"""Initializes the exception."""
|
|
256
|
+
self.flow_id = flow_id
|
|
257
|
+
|
|
258
|
+
def __str__(self) -> str:
|
|
259
|
+
"""Return a string representation of the exception."""
|
|
260
|
+
return f"Flow '{self.flow_id}' does not have any steps."
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
class DuplicateNLUTriggerException(RasaException):
|
|
264
|
+
"""Raised when multiple flows can be started by the same intent."""
|
|
265
|
+
|
|
266
|
+
def __init__(self, intent: str, flow_names: List[str]) -> None:
|
|
267
|
+
"""Initializes the exception."""
|
|
268
|
+
self.intent = intent
|
|
269
|
+
self.flow_names = flow_names
|
|
270
|
+
|
|
271
|
+
def __str__(self) -> Text:
|
|
272
|
+
"""Return a string representation of the exception."""
|
|
273
|
+
return (
|
|
274
|
+
f"The intent '{self.intent}' is used as 'nlu_trigger' "
|
|
275
|
+
f"in multiple flows: {self.flow_names}. "
|
|
276
|
+
f"An intent should just trigger one flow, not multiple."
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
class SlotNamingException(RasaException):
|
|
281
|
+
"""Raised when a slot name to be collected does not adhere to naming convention."""
|
|
282
|
+
|
|
283
|
+
def __init__(self, flow_id: str, step_id: str, slot_name: str) -> None:
|
|
284
|
+
"""Initializes the exception."""
|
|
285
|
+
self.flow_id = flow_id
|
|
286
|
+
self.step_id = step_id
|
|
287
|
+
self.slot_name = slot_name
|
|
288
|
+
|
|
289
|
+
def __str__(self) -> str:
|
|
290
|
+
"""Return a string representation of the exception."""
|
|
291
|
+
return (
|
|
292
|
+
f"For the flow '{self.flow_id}', collect step '{self.step_id}' "
|
|
293
|
+
f"the slot name was set to : {self.slot_name}, while it has "
|
|
294
|
+
f"to adhere to the following pattern: [a-zA-Z_][a-zA-Z0-9_-]*?."
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
class FlowIdNamingException(RasaException):
|
|
299
|
+
"""Raised when a flow ID defined does not adhere to naming convention."""
|
|
300
|
+
|
|
301
|
+
def __init__(self, flow_id: str) -> None:
|
|
302
|
+
"""Initializes the exception."""
|
|
303
|
+
self.flow_id = flow_id
|
|
304
|
+
|
|
305
|
+
def __str__(self) -> str:
|
|
306
|
+
"""Return a string representation of the exception."""
|
|
307
|
+
return (
|
|
308
|
+
f"The flow ID was set to : {self.flow_id}, while it has "
|
|
309
|
+
f"to adhere to the following pattern: [a-zA-Z0-9_][a-zA-Z0-9_-]*?."
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
def validate_flow(flow: Flow) -> None:
|
|
314
|
+
"""Validates the flow configuration.
|
|
315
|
+
|
|
316
|
+
This ensures that the flow semantically makes sense. E.g. it
|
|
317
|
+
checks:
|
|
318
|
+
- whether all next links point to existing steps
|
|
319
|
+
- whether all steps can be reached from the start step
|
|
320
|
+
"""
|
|
321
|
+
validate_flow_not_empty(flow)
|
|
322
|
+
validate_no_empty_step_sequences(flow)
|
|
323
|
+
validate_all_steps_next_property(flow)
|
|
324
|
+
validate_all_next_ids_are_available_steps(flow)
|
|
325
|
+
validate_all_steps_can_be_reached(flow)
|
|
326
|
+
validate_all_branches_have_an_else(flow)
|
|
327
|
+
validate_not_using_builtin_ids(flow)
|
|
328
|
+
validate_slot_names_to_be_collected(flow)
|
|
329
|
+
validate_flow_id(flow)
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def validate_flow_not_empty(flow: Flow) -> None:
|
|
333
|
+
"""Validate that the flow is not empty."""
|
|
334
|
+
if len(flow.steps) == 0:
|
|
335
|
+
raise EmptyFlowException(flow.id)
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def validate_no_empty_step_sequences(flow: Flow) -> None:
|
|
339
|
+
"""Validate that the flow does not have any empty step sequences."""
|
|
340
|
+
for step in flow.steps:
|
|
341
|
+
for link in step.next.links:
|
|
342
|
+
if (
|
|
343
|
+
isinstance(link, BranchingFlowStepLink)
|
|
344
|
+
and isinstance(link.target_reference, FlowStepSequence)
|
|
345
|
+
and len(link.target_reference.child_steps) == 0
|
|
346
|
+
):
|
|
347
|
+
raise EmptyStepSequenceException(flow.id, step.id)
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
def validate_not_using_builtin_ids(flow: Flow) -> None:
|
|
351
|
+
"""Validates that the flow does not use any of the build in ids."""
|
|
352
|
+
for step in flow.steps:
|
|
353
|
+
if step.id in DEFAULT_STEPS or step.id.startswith(CONTINUE_STEP_PREFIX):
|
|
354
|
+
raise ReservedFlowStepIdException(step.id, flow.id)
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
def validate_all_branches_have_an_else(flow: Flow) -> None:
|
|
358
|
+
"""Validates that all branches have an else link."""
|
|
359
|
+
for step in flow.steps:
|
|
360
|
+
links = step.next.links
|
|
361
|
+
|
|
362
|
+
has_an_if = any(isinstance(link, IfFlowStepLink) for link in links)
|
|
363
|
+
has_an_else = any(isinstance(link, ElseFlowStepLink) for link in links)
|
|
364
|
+
|
|
365
|
+
if has_an_if and not has_an_else:
|
|
366
|
+
raise MissingElseBranchException(step.id, flow.id)
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
def validate_all_steps_next_property(flow: Flow) -> None:
|
|
370
|
+
"""Validates that every step that must have a `next` has one."""
|
|
371
|
+
for step in flow.steps:
|
|
372
|
+
if isinstance(step, LinkFlowStep):
|
|
373
|
+
# link steps can't have a next link!
|
|
374
|
+
if not step.next.no_link_available():
|
|
375
|
+
raise NoNextAllowedForLinkException(step.id, flow.id)
|
|
376
|
+
elif step.next.no_link_available():
|
|
377
|
+
# all other steps should have a next link
|
|
378
|
+
raise MissingNextLinkException(step.id, flow.id)
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
def validate_all_next_ids_are_available_steps(flow: Flow) -> None:
|
|
382
|
+
"""Validates that all next links point to existing steps."""
|
|
383
|
+
available_steps = {step.id for step in flow.steps} | DEFAULT_STEPS
|
|
384
|
+
for step in flow.steps:
|
|
385
|
+
for link in step.next.links:
|
|
386
|
+
if link.target not in available_steps:
|
|
387
|
+
raise UnresolvedFlowStepIdException(link.target, flow.id, step.id)
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
def validate_all_steps_can_be_reached(flow: Flow) -> None:
|
|
391
|
+
"""Validates that all steps can be reached from the start step."""
|
|
392
|
+
|
|
393
|
+
def _reachable_steps(
|
|
394
|
+
step: Optional[FlowStep], reached_steps: Set[Text]
|
|
395
|
+
) -> Set[Text]:
|
|
396
|
+
"""Validates that the given step can be reached from the start step."""
|
|
397
|
+
if step is None or step.id in reached_steps:
|
|
398
|
+
return reached_steps
|
|
399
|
+
|
|
400
|
+
reached_steps.add(step.id)
|
|
401
|
+
for link in step.next.links:
|
|
402
|
+
reached_steps = _reachable_steps(
|
|
403
|
+
flow.step_by_id(link.target), reached_steps
|
|
404
|
+
)
|
|
405
|
+
return reached_steps
|
|
406
|
+
|
|
407
|
+
reached_steps = _reachable_steps(flow.first_step_in_flow(), set())
|
|
408
|
+
|
|
409
|
+
for step in flow.steps:
|
|
410
|
+
if step.id not in reached_steps:
|
|
411
|
+
raise UnreachableFlowStepException(step.id, flow.id)
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
def validate_nlu_trigger(flows: List[Flow]) -> None:
|
|
415
|
+
"""Validates that an intent can just trigger one flow."""
|
|
416
|
+
nlu_trigger_to_flows = defaultdict(list)
|
|
417
|
+
|
|
418
|
+
for flow in flows:
|
|
419
|
+
intents = flow.get_trigger_intents()
|
|
420
|
+
for intent in intents:
|
|
421
|
+
nlu_trigger_to_flows[intent].append(flow.name)
|
|
422
|
+
|
|
423
|
+
for intent, flow_names in nlu_trigger_to_flows.items():
|
|
424
|
+
if len(flow_names) > 1:
|
|
425
|
+
raise DuplicateNLUTriggerException(intent, flow_names)
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
def validate_link_in_call_restriction(flows: "FlowsList") -> None:
|
|
429
|
+
"""Validates that a flow is not called from another flow and uses a link step."""
|
|
430
|
+
|
|
431
|
+
def does_flow_use_link(flow_id: str) -> bool:
|
|
432
|
+
if flow := flows.flow_by_id(flow_id):
|
|
433
|
+
for step in flow.steps:
|
|
434
|
+
if isinstance(step, LinkFlowStep):
|
|
435
|
+
return True
|
|
436
|
+
return False
|
|
437
|
+
|
|
438
|
+
for flow in flows.underlying_flows:
|
|
439
|
+
for step in flow.steps:
|
|
440
|
+
if isinstance(step, CallFlowStep) and does_flow_use_link(step.call):
|
|
441
|
+
raise NoLinkAllowedInCalledFlowException(step.id, flow.id, step.call)
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
def validate_called_flows_exists(flows: "FlowsList") -> None:
|
|
445
|
+
"""Validates that all called flows exist."""
|
|
446
|
+
for flow in flows.underlying_flows:
|
|
447
|
+
for step in flow.steps:
|
|
448
|
+
if not isinstance(step, CallFlowStep):
|
|
449
|
+
continue
|
|
450
|
+
|
|
451
|
+
if flows.flow_by_id(step.call) is None:
|
|
452
|
+
raise UnresolvedFlowException(step.call, flow.id, step.id)
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
def validate_linked_flows_exists(flows: "FlowsList") -> None:
|
|
456
|
+
"""Validates that all linked flows exist."""
|
|
457
|
+
for flow in flows.underlying_flows:
|
|
458
|
+
for step in flow.steps:
|
|
459
|
+
if not isinstance(step, LinkFlowStep):
|
|
460
|
+
continue
|
|
461
|
+
|
|
462
|
+
if flows.flow_by_id(step.link) is None:
|
|
463
|
+
raise UnresolvedFlowException(step.link, flow.id, step.id)
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
def validate_patterns_are_not_called_or_linked(flows: "FlowsList") -> None:
|
|
467
|
+
"""Validates that patterns are never called or linked."""
|
|
468
|
+
for flow in flows.underlying_flows:
|
|
469
|
+
for step in flow.steps:
|
|
470
|
+
if isinstance(step, LinkFlowStep) and step.link.startswith(
|
|
471
|
+
RASA_DEFAULT_FLOW_PATTERN_PREFIX
|
|
472
|
+
):
|
|
473
|
+
raise ReferenceToPatternException(step.link, flow.id, step.id)
|
|
474
|
+
|
|
475
|
+
if isinstance(step, CallFlowStep) and step.call.startswith(
|
|
476
|
+
RASA_DEFAULT_FLOW_PATTERN_PREFIX
|
|
477
|
+
):
|
|
478
|
+
raise ReferenceToPatternException(step.call, flow.id, step.id)
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
def validate_patterns_are_not_calling_or_linking_other_flows(
|
|
482
|
+
flows: "FlowsList",
|
|
483
|
+
) -> None:
|
|
484
|
+
"""Validates that patterns do not contain call or link steps."""
|
|
485
|
+
for flow in flows.underlying_flows:
|
|
486
|
+
if not flow.is_rasa_default_flow:
|
|
487
|
+
continue
|
|
488
|
+
for step in flow.steps:
|
|
489
|
+
if isinstance(step, (LinkFlowStep, CallFlowStep)):
|
|
490
|
+
raise PatternReferencedFlowException(flow.id, step.id)
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
def validate_step_ids_are_unique(flows: "FlowsList") -> None:
|
|
494
|
+
"""Validates that step ids are unique within a flow and any called flows."""
|
|
495
|
+
for flow in flows.underlying_flows:
|
|
496
|
+
used_ids: Set[str] = set()
|
|
497
|
+
|
|
498
|
+
# check that the ids used in the flow are unique
|
|
499
|
+
for step in flow.steps:
|
|
500
|
+
if step.id in used_ids:
|
|
501
|
+
raise DuplicatedStepIdException(step.id, flow.id)
|
|
502
|
+
|
|
503
|
+
used_ids.add(step.id)
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
def validate_slot_names_to_be_collected(flow: Flow) -> None:
|
|
507
|
+
"""Validates that slot names to be collected comply with a specified regex."""
|
|
508
|
+
slot_re = re.compile(r"""^[a-zA-Z_][a-zA-Z0-9_-]*?$""")
|
|
509
|
+
for step in flow.steps:
|
|
510
|
+
if isinstance(step, CollectInformationFlowStep):
|
|
511
|
+
slot_name = step.collect
|
|
512
|
+
if not slot_re.search(slot_name):
|
|
513
|
+
raise SlotNamingException(flow.id, step.id, slot_name)
|
|
514
|
+
|
|
515
|
+
|
|
516
|
+
def validate_flow_id(flow: Flow) -> None:
|
|
517
|
+
"""Validates if the flow id comply with a specified regex.
|
|
518
|
+
Flow IDs can start with an alphanumeric character or an underscore.
|
|
519
|
+
Followed by zero or more alphanumeric characters, hyphens, or underscores.
|
|
520
|
+
Args:
|
|
521
|
+
flow: The flow to validate.
|
|
522
|
+
Raises:
|
|
523
|
+
FlowIdNamingException: If the flow id does not comply with the regex.
|
|
524
|
+
"""
|
|
525
|
+
flow_re = re.compile(FLOW_ID_REGEX)
|
|
526
|
+
if not flow_re.search(flow.id):
|
|
527
|
+
raise FlowIdNamingException(flow.id)
|