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/utils.py
ADDED
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import argparse
|
|
3
|
+
import structlog
|
|
4
|
+
import importlib
|
|
5
|
+
import os
|
|
6
|
+
import sys
|
|
7
|
+
import time
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from types import FrameType
|
|
10
|
+
from typing import Any, Dict, List, Optional, TYPE_CHECKING, Text, Union, overload
|
|
11
|
+
import randomname
|
|
12
|
+
|
|
13
|
+
import rasa.shared.utils.cli
|
|
14
|
+
import rasa.shared.utils.io
|
|
15
|
+
from rasa.shared.importers.importer import TrainingDataImporter
|
|
16
|
+
from rasa.shared.constants import (
|
|
17
|
+
ASSISTANT_ID_DEFAULT_VALUE,
|
|
18
|
+
ASSISTANT_ID_KEY,
|
|
19
|
+
DEFAULT_CONFIG_PATH,
|
|
20
|
+
)
|
|
21
|
+
from rasa import telemetry
|
|
22
|
+
from rasa.shared.utils.yaml import read_config_file
|
|
23
|
+
from rasa.utils.io import write_yaml
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from questionary import Question
|
|
27
|
+
from typing_extensions import Literal
|
|
28
|
+
from rasa.validator import Validator
|
|
29
|
+
|
|
30
|
+
structlogger = structlog.get_logger()
|
|
31
|
+
|
|
32
|
+
FREE_TEXT_INPUT_PROMPT = "Type out your own message..."
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@overload
|
|
36
|
+
def get_validated_path(
|
|
37
|
+
current: Optional[Union[Path, Text]],
|
|
38
|
+
parameter: Text,
|
|
39
|
+
default: Optional[Union[Path, Text, List[Text]]] = ...,
|
|
40
|
+
none_is_valid: "Literal[False]" = ...,
|
|
41
|
+
) -> Union[Path, Text]: ...
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@overload
|
|
45
|
+
def get_validated_path(
|
|
46
|
+
current: Optional[Union[Path, Text]],
|
|
47
|
+
parameter: Text,
|
|
48
|
+
default: Optional[Union[Path, Text, List[Text]]] = ...,
|
|
49
|
+
none_is_valid: "Literal[True]" = ...,
|
|
50
|
+
) -> Optional[Union[Path, Text]]: ...
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def get_validated_path(
|
|
54
|
+
current: Optional[Union[Path, Text]],
|
|
55
|
+
parameter: Text,
|
|
56
|
+
default: Optional[Union[Path, Text, List[Text]]] = None,
|
|
57
|
+
none_is_valid: bool = False,
|
|
58
|
+
) -> Optional[Union[Path, Text]]:
|
|
59
|
+
"""Checks whether a file path or its default value is valid and returns it.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
current: The parsed value.
|
|
63
|
+
parameter: The name of the parameter.
|
|
64
|
+
default: one or multiple default values of the parameter.
|
|
65
|
+
none_is_valid: `True` if `None` is valid value for the path,
|
|
66
|
+
else `False``
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
The current value if valid,
|
|
70
|
+
otherwise one of the default values of the argument if valid,
|
|
71
|
+
otherwise `None` if allowed,
|
|
72
|
+
otherwise raises an error and exits.
|
|
73
|
+
"""
|
|
74
|
+
if current and os.path.exists(current):
|
|
75
|
+
return current
|
|
76
|
+
|
|
77
|
+
# try to find a valid option among the defaults
|
|
78
|
+
if isinstance(default, str) or isinstance(default, Path):
|
|
79
|
+
default_options = [str(default)]
|
|
80
|
+
elif isinstance(default, list):
|
|
81
|
+
default_options = default
|
|
82
|
+
else:
|
|
83
|
+
default_options = []
|
|
84
|
+
|
|
85
|
+
valid_options = (option for option in default_options if os.path.exists(option))
|
|
86
|
+
chosen_option = next(valid_options, None)
|
|
87
|
+
|
|
88
|
+
# warn and log if user-chosen parameter wasn't found and thus overwritten
|
|
89
|
+
if chosen_option:
|
|
90
|
+
shared_info = f"Using default location '{chosen_option}' instead."
|
|
91
|
+
if current is None:
|
|
92
|
+
structlogger.debug(
|
|
93
|
+
"cli.get_validated_path.parameter_not_set",
|
|
94
|
+
parameter=parameter,
|
|
95
|
+
event_info=(f"Parameter '{parameter}' was not set. {shared_info}"),
|
|
96
|
+
)
|
|
97
|
+
else:
|
|
98
|
+
structlogger.warn(
|
|
99
|
+
"cli.get_validated_path.path_does_not_exists",
|
|
100
|
+
path=current,
|
|
101
|
+
event_info=(
|
|
102
|
+
f"The path '{current}' does not seem to exist. {shared_info}"
|
|
103
|
+
),
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
if chosen_option is None and not none_is_valid:
|
|
107
|
+
cancel_cause_not_found(current, parameter, default)
|
|
108
|
+
|
|
109
|
+
return chosen_option
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def missing_config_keys(
|
|
113
|
+
path: Union["Path", Text], mandatory_keys: List[Text]
|
|
114
|
+
) -> List[Text]:
|
|
115
|
+
"""Checks whether the config file at `path` contains the `mandatory_keys`.
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
path: The path to the config file.
|
|
119
|
+
mandatory_keys: A list of mandatory config keys.
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
The list of missing config keys.
|
|
123
|
+
"""
|
|
124
|
+
if not os.path.exists(path):
|
|
125
|
+
return mandatory_keys
|
|
126
|
+
|
|
127
|
+
config_data = read_config_file(path)
|
|
128
|
+
|
|
129
|
+
return [k for k in mandatory_keys if k not in config_data or config_data[k] is None]
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def validate_assistant_id_in_config(config_file: Union["Path", Text]) -> None:
|
|
133
|
+
"""Verifies that the assistant_id key exists and has a unique value in config.
|
|
134
|
+
|
|
135
|
+
Issues a warning if the key does not exist or has the default value and replaces it
|
|
136
|
+
with a pseudo-random string value.
|
|
137
|
+
"""
|
|
138
|
+
config_data = read_config_file(config_file, reader_type=["safe", "rt"])
|
|
139
|
+
assistant_id = config_data.get(ASSISTANT_ID_KEY)
|
|
140
|
+
|
|
141
|
+
if assistant_id is None or assistant_id == ASSISTANT_ID_DEFAULT_VALUE:
|
|
142
|
+
structlogger.warn(
|
|
143
|
+
"cli.validate_assistant_id_in_config.missing_unique_assistant_id_key",
|
|
144
|
+
config=config_file,
|
|
145
|
+
missing_key=ASSISTANT_ID_KEY,
|
|
146
|
+
event_info=(
|
|
147
|
+
f"The config file '{config_file!s}' is "
|
|
148
|
+
f"missing a unique value for the "
|
|
149
|
+
f"'{ASSISTANT_ID_KEY}' mandatory key. "
|
|
150
|
+
f"Proceeding with generating a random "
|
|
151
|
+
f"value and overwriting the '{ASSISTANT_ID_KEY}'"
|
|
152
|
+
f" in the config file."
|
|
153
|
+
),
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
# add random value for assistant id, overwrite config file
|
|
157
|
+
time_format = "%Y%m%d-%H%M%S"
|
|
158
|
+
config_data[ASSISTANT_ID_KEY] = (
|
|
159
|
+
f"{time.strftime(time_format)}-{randomname.get_name()}"
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
write_yaml(data=config_data, target=config_file, should_preserve_key_order=True)
|
|
163
|
+
|
|
164
|
+
return
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def validate_config_path(
|
|
168
|
+
config: Optional[Union[Text, "Path"]],
|
|
169
|
+
default_config: Text = DEFAULT_CONFIG_PATH,
|
|
170
|
+
) -> Text:
|
|
171
|
+
"""Verifies that the config path exists.
|
|
172
|
+
|
|
173
|
+
Exit if the config file does not exist.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
config: Path to the config file.
|
|
177
|
+
default_config: default config to use if the file at `config` doesn't exist.
|
|
178
|
+
|
|
179
|
+
Returns: The path to the config file.
|
|
180
|
+
"""
|
|
181
|
+
config = rasa.cli.utils.get_validated_path(config, "config", default_config)
|
|
182
|
+
|
|
183
|
+
if not config or not os.path.exists(config):
|
|
184
|
+
structlogger.error(
|
|
185
|
+
"cli.validate_config_path.does_not_exists",
|
|
186
|
+
config=config,
|
|
187
|
+
event_info=(
|
|
188
|
+
f"The config file '{config}' does not exist. "
|
|
189
|
+
f"Use '--config' to specify a valid config file."
|
|
190
|
+
),
|
|
191
|
+
)
|
|
192
|
+
sys.exit(1)
|
|
193
|
+
|
|
194
|
+
return str(config)
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def validate_mandatory_config_keys(
|
|
198
|
+
config: Union[Text, "Path"],
|
|
199
|
+
mandatory_keys: List[Text],
|
|
200
|
+
) -> Text:
|
|
201
|
+
"""Get a config from a config file and check if it is valid.
|
|
202
|
+
|
|
203
|
+
Exit if the config isn't valid.
|
|
204
|
+
|
|
205
|
+
Args:
|
|
206
|
+
config: Path to the config file.
|
|
207
|
+
mandatory_keys: The keys that have to be specified in the config file.
|
|
208
|
+
|
|
209
|
+
Returns: The path to the config file if the config is valid.
|
|
210
|
+
"""
|
|
211
|
+
missing_keys = set(rasa.cli.utils.missing_config_keys(config, mandatory_keys))
|
|
212
|
+
if missing_keys:
|
|
213
|
+
structlogger.error(
|
|
214
|
+
"cli.validate_mandatory_config_keys.missing_keys",
|
|
215
|
+
config=config,
|
|
216
|
+
missing_keys=missing_keys,
|
|
217
|
+
event_info=(
|
|
218
|
+
"The config file '{}' is missing mandatory parameters: "
|
|
219
|
+
"'{}'. Add missing parameters to config file and try again.".format(
|
|
220
|
+
config, "', '".join(missing_keys)
|
|
221
|
+
)
|
|
222
|
+
),
|
|
223
|
+
)
|
|
224
|
+
sys.exit(1)
|
|
225
|
+
|
|
226
|
+
return str(config)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def get_validated_config(
|
|
230
|
+
config: Optional[Union[Text, "Path"]],
|
|
231
|
+
mandatory_keys: List[Text],
|
|
232
|
+
default_config: Text = DEFAULT_CONFIG_PATH,
|
|
233
|
+
) -> Text:
|
|
234
|
+
"""Validates config and returns path to validated config file."""
|
|
235
|
+
config = validate_config_path(config, default_config)
|
|
236
|
+
validate_assistant_id_in_config(config)
|
|
237
|
+
|
|
238
|
+
config = validate_mandatory_config_keys(config, mandatory_keys)
|
|
239
|
+
|
|
240
|
+
return config
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def validate_files(
|
|
244
|
+
fail_on_warnings: bool,
|
|
245
|
+
max_history: Optional[int],
|
|
246
|
+
importer: TrainingDataImporter,
|
|
247
|
+
stories_only: bool = False,
|
|
248
|
+
flows_only: bool = False,
|
|
249
|
+
) -> None:
|
|
250
|
+
"""Validates either the story structure or the entire project.
|
|
251
|
+
|
|
252
|
+
Args:
|
|
253
|
+
fail_on_warnings: `True` if the process should exit with a non-zero status
|
|
254
|
+
max_history: The max history to use when validating the story structure.
|
|
255
|
+
importer: The `TrainingDataImporter` to use to load the training data.
|
|
256
|
+
stories_only: If `True`, only the story structure is validated.
|
|
257
|
+
flows_only: If `True`, only the flows are validated.
|
|
258
|
+
"""
|
|
259
|
+
from rasa.validator import Validator
|
|
260
|
+
|
|
261
|
+
validator = Validator.from_importer(importer)
|
|
262
|
+
|
|
263
|
+
if stories_only:
|
|
264
|
+
all_good = _validate_story_structure(validator, max_history, fail_on_warnings)
|
|
265
|
+
elif flows_only:
|
|
266
|
+
all_good = validator.verify_flows()
|
|
267
|
+
else:
|
|
268
|
+
if importer.get_domain().is_empty():
|
|
269
|
+
structlogger.error(
|
|
270
|
+
"cli.validate_files.empty_domain",
|
|
271
|
+
event_info="Encountered empty domain during validation.",
|
|
272
|
+
)
|
|
273
|
+
sys.exit(1)
|
|
274
|
+
|
|
275
|
+
valid_domain = _validate_domain(validator)
|
|
276
|
+
valid_nlu = _validate_nlu(validator, fail_on_warnings)
|
|
277
|
+
valid_stories = _validate_story_structure(
|
|
278
|
+
validator, max_history, fail_on_warnings
|
|
279
|
+
)
|
|
280
|
+
valid_flows = validator.verify_flows()
|
|
281
|
+
valid_CALM_slot_mappings = validator.validate_CALM_slot_mappings()
|
|
282
|
+
|
|
283
|
+
all_good = (
|
|
284
|
+
valid_domain
|
|
285
|
+
and valid_nlu
|
|
286
|
+
and valid_stories
|
|
287
|
+
and valid_flows
|
|
288
|
+
and valid_CALM_slot_mappings
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
validator.warn_if_config_mandatory_keys_are_not_set()
|
|
292
|
+
|
|
293
|
+
telemetry.track_validate_files(all_good)
|
|
294
|
+
if not all_good:
|
|
295
|
+
structlogger.error(
|
|
296
|
+
"cli.validate_files.project_validation_error",
|
|
297
|
+
event_info="Project validation completed with errors.",
|
|
298
|
+
)
|
|
299
|
+
sys.exit(1)
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
def _validate_domain(validator: "Validator") -> bool:
|
|
303
|
+
valid_domain_validity = validator.verify_domain_validity()
|
|
304
|
+
valid_actions_in_stories_rules = validator.verify_actions_in_stories_rules()
|
|
305
|
+
valid_forms_in_stories_rules = validator.verify_forms_in_stories_rules()
|
|
306
|
+
valid_form_slots = validator.verify_form_slots()
|
|
307
|
+
valid_slot_mappings = validator.verify_slot_mappings()
|
|
308
|
+
valid_responses = validator.check_for_no_empty_paranthesis_in_responses()
|
|
309
|
+
valid_buttons = validator.validate_button_payloads()
|
|
310
|
+
return (
|
|
311
|
+
valid_domain_validity
|
|
312
|
+
and valid_actions_in_stories_rules
|
|
313
|
+
and valid_forms_in_stories_rules
|
|
314
|
+
and valid_form_slots
|
|
315
|
+
and valid_slot_mappings
|
|
316
|
+
and valid_responses
|
|
317
|
+
and valid_buttons
|
|
318
|
+
)
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
def _validate_nlu(validator: "Validator", fail_on_warnings: bool) -> bool:
|
|
322
|
+
return validator.verify_nlu(not fail_on_warnings)
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
def _validate_story_structure(
|
|
326
|
+
validator: "Validator", max_history: Optional[int], fail_on_warnings: bool
|
|
327
|
+
) -> bool:
|
|
328
|
+
# Check if a valid setting for `max_history` was given
|
|
329
|
+
if isinstance(max_history, int) and max_history < 1:
|
|
330
|
+
raise argparse.ArgumentTypeError(
|
|
331
|
+
f"The value of `--max-history {max_history}` " f"is not a positive integer."
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
return validator.verify_story_structure(
|
|
335
|
+
not fail_on_warnings, max_history=max_history
|
|
336
|
+
)
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
def cancel_cause_not_found(
|
|
340
|
+
current: Optional[Union["Path", Text]],
|
|
341
|
+
parameter: Text,
|
|
342
|
+
default: Optional[Union["Path", Text, List[Text]]],
|
|
343
|
+
) -> None:
|
|
344
|
+
"""Exits with an error because the given path was not valid.
|
|
345
|
+
|
|
346
|
+
Args:
|
|
347
|
+
current: The path given by the user.
|
|
348
|
+
parameter: The name of the parameter.
|
|
349
|
+
default: The default value of the parameter.
|
|
350
|
+
|
|
351
|
+
"""
|
|
352
|
+
default_clause = ""
|
|
353
|
+
if default and isinstance(default, str):
|
|
354
|
+
default_clause = f"use the default location ('{default}') or"
|
|
355
|
+
elif default and isinstance(default, list):
|
|
356
|
+
default_clause = f"use one of the default locations ({', '.join(default)}) or"
|
|
357
|
+
|
|
358
|
+
structlogger.error(
|
|
359
|
+
"cli.path_does_not_exist",
|
|
360
|
+
path=current,
|
|
361
|
+
event_info=(
|
|
362
|
+
f"The path '{current}' does not exist. "
|
|
363
|
+
f"Please make sure to {default_clause} specify it "
|
|
364
|
+
f"with '--{parameter}'."
|
|
365
|
+
),
|
|
366
|
+
)
|
|
367
|
+
sys.exit(1)
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
def parse_last_positional_argument_as_model_path() -> None:
|
|
371
|
+
"""Fixes the parsing of a potential positional model path argument."""
|
|
372
|
+
if (
|
|
373
|
+
len(sys.argv) >= 2
|
|
374
|
+
# support relevant commands ...
|
|
375
|
+
and sys.argv[1] in ["run", "shell", "interactive"]
|
|
376
|
+
# but avoid interpreting subparser commands as model paths
|
|
377
|
+
and sys.argv[1:] != ["run", "actions"]
|
|
378
|
+
and not sys.argv[-2].startswith("-")
|
|
379
|
+
and os.path.exists(sys.argv[-1])
|
|
380
|
+
):
|
|
381
|
+
sys.argv.append(sys.argv[-1])
|
|
382
|
+
sys.argv[-2] = "--model"
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
def button_to_string(button: Dict[Text, Any], idx: int = 0) -> Text:
|
|
386
|
+
"""Create a string representation of a button."""
|
|
387
|
+
title = button.pop("title", "")
|
|
388
|
+
|
|
389
|
+
if "payload" in button:
|
|
390
|
+
payload = " ({})".format(button.pop("payload"))
|
|
391
|
+
else:
|
|
392
|
+
payload = ""
|
|
393
|
+
|
|
394
|
+
# if there are any additional attributes, we append them to the output
|
|
395
|
+
if button:
|
|
396
|
+
details = " - {}".format(json.dumps(button, sort_keys=True))
|
|
397
|
+
else:
|
|
398
|
+
details = ""
|
|
399
|
+
|
|
400
|
+
button_string = "{idx}: {title}{payload}{details}".format(
|
|
401
|
+
idx=idx + 1, title=title, payload=payload, details=details
|
|
402
|
+
)
|
|
403
|
+
|
|
404
|
+
return button_string
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
def element_to_string(element: Dict[Text, Any], idx: int = 0) -> Text:
|
|
408
|
+
"""Create a string representation of an element."""
|
|
409
|
+
title = element.pop("title", "")
|
|
410
|
+
|
|
411
|
+
element_string = "{idx}: {title} - {element}".format(
|
|
412
|
+
idx=idx + 1, title=title, element=json.dumps(element, sort_keys=True)
|
|
413
|
+
)
|
|
414
|
+
|
|
415
|
+
return element_string
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
def button_choices_from_message_data(
|
|
419
|
+
message: Dict[Text, Any], allow_free_text_input: bool = True
|
|
420
|
+
) -> List[Text]:
|
|
421
|
+
"""Return list of choices to present to the user.
|
|
422
|
+
|
|
423
|
+
If allow_free_text_input is True, an additional option is added
|
|
424
|
+
at the end along with the response buttons that allows the user
|
|
425
|
+
to type in free text.
|
|
426
|
+
"""
|
|
427
|
+
choices = [
|
|
428
|
+
button_to_string(button, idx)
|
|
429
|
+
for idx, button in enumerate(message.get("buttons"))
|
|
430
|
+
]
|
|
431
|
+
if allow_free_text_input:
|
|
432
|
+
choices.append(FREE_TEXT_INPUT_PROMPT)
|
|
433
|
+
return choices
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
async def payload_from_button_question(button_question: "Question") -> Text:
|
|
437
|
+
"""Prompt user with a button question and returns the nlu payload."""
|
|
438
|
+
response = await button_question.ask_async()
|
|
439
|
+
if response != FREE_TEXT_INPUT_PROMPT:
|
|
440
|
+
# Extract intent slash command if it's a button
|
|
441
|
+
response = response[response.rfind("(") + 1 : response.rfind(")")]
|
|
442
|
+
return response
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
def signal_handler(_: int, __: FrameType) -> None:
|
|
446
|
+
"""Kills Rasa when OS signal is received."""
|
|
447
|
+
print("Goodbye 👋")
|
|
448
|
+
sys.exit(0)
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
def warn_if_rasa_plus_package_installed() -> None:
|
|
452
|
+
"""Issue a user warning in case the `rasa_plus` package is installed."""
|
|
453
|
+
rasa_plus_package = "rasa_plus"
|
|
454
|
+
if importlib.util.find_spec(rasa_plus_package) is not None:
|
|
455
|
+
rasa.shared.utils.io.raise_warning(
|
|
456
|
+
f"{rasa_plus_package} python package is no longer necessary "
|
|
457
|
+
f"for using Rasa Pro. Please uninstall it.",
|
|
458
|
+
UserWarning,
|
|
459
|
+
)
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
def check_if_studio_command() -> bool:
|
|
463
|
+
"""Checks if the command is a Rasa Studio command."""
|
|
464
|
+
return len(sys.argv) >= 2 and sys.argv[1] == "studio"
|
rasa/cli/visualize.py
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import os
|
|
3
|
+
from typing import List
|
|
4
|
+
|
|
5
|
+
from rasa.cli import SubParsersAction
|
|
6
|
+
from rasa.cli.arguments import visualize as arguments
|
|
7
|
+
from rasa.shared.constants import DEFAULT_DATA_PATH
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def add_subparser(
|
|
11
|
+
subparsers: SubParsersAction, parents: List[argparse.ArgumentParser]
|
|
12
|
+
) -> None:
|
|
13
|
+
"""Add all visualization parsers.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
subparsers: subparser we are going to attach to
|
|
17
|
+
parents: Parent parsers, needed to ensure tree structure in argparse
|
|
18
|
+
"""
|
|
19
|
+
visualize_parser = subparsers.add_parser(
|
|
20
|
+
"visualize",
|
|
21
|
+
parents=parents,
|
|
22
|
+
conflict_handler="resolve",
|
|
23
|
+
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
|
24
|
+
help="Visualize stories.",
|
|
25
|
+
)
|
|
26
|
+
visualize_parser.set_defaults(func=visualize_stories)
|
|
27
|
+
|
|
28
|
+
arguments.set_visualize_stories_arguments(visualize_parser)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def visualize_stories(args: argparse.Namespace) -> None:
|
|
32
|
+
import rasa.core.visualize
|
|
33
|
+
|
|
34
|
+
args.stories = rasa.shared.data.get_core_directory(args.stories)
|
|
35
|
+
if args.nlu is None and os.path.exists(DEFAULT_DATA_PATH):
|
|
36
|
+
args.nlu = rasa.shared.data.get_nlu_directory(DEFAULT_DATA_PATH)
|
|
37
|
+
|
|
38
|
+
rasa.core.visualize.visualize(
|
|
39
|
+
args.domain, args.stories, args.nlu, args.out, args.max_history
|
|
40
|
+
)
|
rasa/cli/x.py
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import asyncio
|
|
3
|
+
import logging
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
import signal
|
|
6
|
+
from typing import Iterable, List, Optional, Text, Tuple, Union
|
|
7
|
+
|
|
8
|
+
import aiohttp
|
|
9
|
+
import ruamel.yaml as yaml
|
|
10
|
+
|
|
11
|
+
from rasa.cli import SubParsersAction
|
|
12
|
+
from rasa.cli.arguments import x as arguments
|
|
13
|
+
import rasa.cli.utils
|
|
14
|
+
from rasa.shared.constants import (
|
|
15
|
+
DEFAULT_CREDENTIALS_PATH,
|
|
16
|
+
DEFAULT_ENDPOINTS_PATH,
|
|
17
|
+
)
|
|
18
|
+
from rasa.core.utils import AvailableEndpoints
|
|
19
|
+
import rasa.shared.utils.cli
|
|
20
|
+
import rasa.shared.utils.io
|
|
21
|
+
import rasa.utils.common
|
|
22
|
+
import rasa.utils.io
|
|
23
|
+
from rasa.shared.utils.yaml import read_config_file
|
|
24
|
+
|
|
25
|
+
logger = logging.getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def add_subparser(
|
|
29
|
+
subparsers: SubParsersAction, parents: List[argparse.ArgumentParser]
|
|
30
|
+
) -> None:
|
|
31
|
+
"""Add all rasa x parsers.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
subparsers: subparser we are going to attach to
|
|
35
|
+
parents: Parent parsers, needed to ensure tree structure in argparse
|
|
36
|
+
"""
|
|
37
|
+
x_parser_args = {
|
|
38
|
+
"parents": parents,
|
|
39
|
+
"conflict_handler": "resolve",
|
|
40
|
+
"formatter_class": argparse.ArgumentDefaultsHelpFormatter,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
x_parser_args["help"] = (
|
|
44
|
+
"Run a Rasa server in a mode that enables connecting "
|
|
45
|
+
"to Rasa Enterprise as the config endpoint."
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
shell_parser = subparsers.add_parser("x", **x_parser_args)
|
|
49
|
+
shell_parser.set_defaults(func=rasa_x)
|
|
50
|
+
|
|
51
|
+
arguments.set_x_arguments(shell_parser)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _rasa_service(
|
|
55
|
+
args: argparse.Namespace,
|
|
56
|
+
endpoints: AvailableEndpoints,
|
|
57
|
+
rasa_x_url: Optional[Text] = None,
|
|
58
|
+
credentials_path: Optional[Text] = None,
|
|
59
|
+
) -> None:
|
|
60
|
+
"""Starts the Rasa application."""
|
|
61
|
+
from rasa.core.run import serve_application
|
|
62
|
+
|
|
63
|
+
# needs separate logging configuration as it is started in its own process
|
|
64
|
+
rasa.utils.common.configure_logging_and_warnings(args.loglevel)
|
|
65
|
+
rasa.utils.io.configure_colored_logging(args.loglevel)
|
|
66
|
+
|
|
67
|
+
if not credentials_path:
|
|
68
|
+
credentials_path = _prepare_credentials_for_rasa_x(
|
|
69
|
+
args.credentials, rasa_x_url=rasa_x_url
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
serve_application(
|
|
73
|
+
endpoints=endpoints,
|
|
74
|
+
port=args.port,
|
|
75
|
+
credentials=credentials_path,
|
|
76
|
+
cors=args.cors,
|
|
77
|
+
auth_token=args.auth_token,
|
|
78
|
+
enable_api=True,
|
|
79
|
+
jwt_secret=args.jwt_secret,
|
|
80
|
+
jwt_method=args.jwt_method,
|
|
81
|
+
ssl_certificate=args.ssl_certificate,
|
|
82
|
+
ssl_keyfile=args.ssl_keyfile,
|
|
83
|
+
ssl_ca_file=args.ssl_ca_file,
|
|
84
|
+
ssl_password=args.ssl_password,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _prepare_credentials_for_rasa_x(
|
|
89
|
+
credentials_path: Optional[Text], rasa_x_url: Optional[Text] = None
|
|
90
|
+
) -> Text:
|
|
91
|
+
if credentials_path:
|
|
92
|
+
credentials_path = str(
|
|
93
|
+
rasa.cli.utils.get_validated_path(
|
|
94
|
+
credentials_path, "credentials", DEFAULT_CREDENTIALS_PATH, True
|
|
95
|
+
)
|
|
96
|
+
)
|
|
97
|
+
credentials = read_config_file(credentials_path)
|
|
98
|
+
else:
|
|
99
|
+
credentials = {}
|
|
100
|
+
|
|
101
|
+
# this makes sure the Rasa X is properly configured no matter what
|
|
102
|
+
if rasa_x_url:
|
|
103
|
+
credentials["rasa"] = {"url": rasa_x_url}
|
|
104
|
+
dumped_credentials = yaml.dump(credentials, default_flow_style=False)
|
|
105
|
+
tmp_credentials = rasa.utils.io.create_temporary_file(dumped_credentials, "yml")
|
|
106
|
+
|
|
107
|
+
return tmp_credentials
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def rasa_x(args: argparse.Namespace) -> None:
|
|
111
|
+
"""Run Rasa with the `x` subcommand."""
|
|
112
|
+
from rasa.cli.utils import signal_handler
|
|
113
|
+
|
|
114
|
+
signal.signal(signal.SIGINT, signal_handler)
|
|
115
|
+
|
|
116
|
+
if args.production:
|
|
117
|
+
run_in_enterprise_connection_mode(args)
|
|
118
|
+
else:
|
|
119
|
+
rasa.shared.utils.io.raise_warning(
|
|
120
|
+
"Running Rasa X in local mode is no longer supported as Rasa has "
|
|
121
|
+
"stopped supporting the Community Edition (free version) of ‘Rasa X’."
|
|
122
|
+
"For more information please see "
|
|
123
|
+
"https://rasa.com/blog/rasa-x-community-edition-changes/",
|
|
124
|
+
UserWarning,
|
|
125
|
+
)
|
|
126
|
+
exit()
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
async def _pull_runtime_config_from_server(
|
|
130
|
+
config_endpoint: Optional[Text],
|
|
131
|
+
attempts: int = 60,
|
|
132
|
+
wait_time_between_pulls: float = 5,
|
|
133
|
+
keys: Iterable[Text] = ("endpoints", "credentials"),
|
|
134
|
+
) -> List[Text]:
|
|
135
|
+
"""Pull runtime config from `config_endpoint`.
|
|
136
|
+
|
|
137
|
+
Returns a list of paths to yaml dumps, each containing the contents of one of
|
|
138
|
+
`keys`.
|
|
139
|
+
"""
|
|
140
|
+
while attempts:
|
|
141
|
+
try:
|
|
142
|
+
async with aiohttp.ClientSession() as session:
|
|
143
|
+
async with session.get(config_endpoint) as resp:
|
|
144
|
+
if resp.status == 200:
|
|
145
|
+
rjs = await resp.json()
|
|
146
|
+
try:
|
|
147
|
+
return [
|
|
148
|
+
rasa.utils.io.create_temporary_file(rjs[k])
|
|
149
|
+
for k in keys
|
|
150
|
+
]
|
|
151
|
+
except KeyError as e:
|
|
152
|
+
rasa.shared.utils.cli.print_error_and_exit(
|
|
153
|
+
"Failed to find key '{}' in runtime config. "
|
|
154
|
+
"Exiting.".format(e)
|
|
155
|
+
)
|
|
156
|
+
else:
|
|
157
|
+
logger.debug(
|
|
158
|
+
"Failed to get a proper response from remote "
|
|
159
|
+
"server. Status Code: {}. Response: '{}'"
|
|
160
|
+
"".format(resp.status, await resp.text())
|
|
161
|
+
)
|
|
162
|
+
except aiohttp.ClientError as e:
|
|
163
|
+
logger.debug(f"Failed to connect to server. Retrying. {e}")
|
|
164
|
+
|
|
165
|
+
await asyncio.sleep(wait_time_between_pulls)
|
|
166
|
+
attempts -= 1
|
|
167
|
+
|
|
168
|
+
rasa.shared.utils.cli.print_error_and_exit(
|
|
169
|
+
"Could not fetch runtime config from server at '{}'. Exiting.".format(
|
|
170
|
+
config_endpoint
|
|
171
|
+
)
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def run_in_enterprise_connection_mode(args: argparse.Namespace) -> None:
|
|
176
|
+
"""Run Rasa in a mode that enables using Rasa X as the config endpoint."""
|
|
177
|
+
from rasa.shared.utils.cli import print_success
|
|
178
|
+
|
|
179
|
+
print_success("Starting a Rasa server in Rasa Enterprise connection mode... 🚀")
|
|
180
|
+
|
|
181
|
+
credentials_path, endpoints_path = _get_credentials_and_endpoints_paths(args)
|
|
182
|
+
endpoints = AvailableEndpoints.read_endpoints(endpoints_path)
|
|
183
|
+
|
|
184
|
+
_rasa_service(args, endpoints, None, credentials_path)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def _get_credentials_and_endpoints_paths(
|
|
188
|
+
args: argparse.Namespace,
|
|
189
|
+
) -> Tuple[Optional[Text], Optional[Text]]:
|
|
190
|
+
config_endpoint = args.config_endpoint
|
|
191
|
+
endpoints_config_path: Optional[Union[Path, Text]]
|
|
192
|
+
|
|
193
|
+
if config_endpoint:
|
|
194
|
+
endpoints_config_path, credentials_path = asyncio.run(
|
|
195
|
+
_pull_runtime_config_from_server(config_endpoint)
|
|
196
|
+
)
|
|
197
|
+
else:
|
|
198
|
+
endpoints_config_path = rasa.cli.utils.get_validated_path(
|
|
199
|
+
args.endpoints, "endpoints", DEFAULT_ENDPOINTS_PATH, True
|
|
200
|
+
)
|
|
201
|
+
credentials_path = None
|
|
202
|
+
|
|
203
|
+
return (
|
|
204
|
+
credentials_path,
|
|
205
|
+
str(endpoints_config_path) if endpoints_config_path else None,
|
|
206
|
+
)
|