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/utils/endpoints.py
ADDED
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import ssl
|
|
2
|
+
|
|
3
|
+
import aiohttp
|
|
4
|
+
import os
|
|
5
|
+
from aiohttp.client_exceptions import ContentTypeError
|
|
6
|
+
from sanic.request import Request
|
|
7
|
+
from typing import Any, Optional, Text, Dict
|
|
8
|
+
|
|
9
|
+
from rasa.shared.exceptions import FileNotFoundException
|
|
10
|
+
import structlog
|
|
11
|
+
from rasa.core.constants import DEFAULT_REQUEST_TIMEOUT
|
|
12
|
+
from rasa.shared.utils.yaml import read_config_file
|
|
13
|
+
|
|
14
|
+
structlogger = structlog.get_logger()
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def read_endpoint_config(
|
|
18
|
+
filename: Text, endpoint_type: Text
|
|
19
|
+
) -> Optional["EndpointConfig"]:
|
|
20
|
+
"""Read an endpoint configuration file from disk and extract one config."""
|
|
21
|
+
if not filename:
|
|
22
|
+
return None
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
content = read_config_file(filename)
|
|
26
|
+
|
|
27
|
+
if content.get(endpoint_type) is None:
|
|
28
|
+
return None
|
|
29
|
+
|
|
30
|
+
return EndpointConfig.from_dict(content[endpoint_type])
|
|
31
|
+
except FileNotFoundError:
|
|
32
|
+
structlogger.error(
|
|
33
|
+
"endpoint.read.failed_no_such_file",
|
|
34
|
+
filename=os.path.abspath(filename),
|
|
35
|
+
event_info=(
|
|
36
|
+
"Failed to read endpoint configuration file - "
|
|
37
|
+
"the file was not found."
|
|
38
|
+
),
|
|
39
|
+
)
|
|
40
|
+
return None
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def concat_url(base: Text, subpath: Optional[Text]) -> Text:
|
|
44
|
+
"""Append a subpath to a base url.
|
|
45
|
+
|
|
46
|
+
Strips leading slashes from the subpath if necessary. This behaves
|
|
47
|
+
differently than `urlparse.urljoin` and will not treat the subpath
|
|
48
|
+
as a base url if it starts with `/` but will always append it to the
|
|
49
|
+
`base`.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
base: Base URL.
|
|
53
|
+
subpath: Optional path to append to the base URL.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
Concatenated URL with base and subpath.
|
|
57
|
+
"""
|
|
58
|
+
if not subpath:
|
|
59
|
+
if base.endswith("/"):
|
|
60
|
+
structlogger.debug(
|
|
61
|
+
"endpoint.concat_url.trailing_slash",
|
|
62
|
+
url=base,
|
|
63
|
+
event_info=(
|
|
64
|
+
"The URL has a trailing slash. Please make sure the "
|
|
65
|
+
"target server supports trailing slashes for this endpoint."
|
|
66
|
+
),
|
|
67
|
+
)
|
|
68
|
+
return base
|
|
69
|
+
|
|
70
|
+
url = base
|
|
71
|
+
if not base.endswith("/"):
|
|
72
|
+
url += "/"
|
|
73
|
+
if subpath.startswith("/"):
|
|
74
|
+
subpath = subpath[1:]
|
|
75
|
+
return url + subpath
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class EndpointConfig:
|
|
79
|
+
"""Configuration for an external HTTP endpoint."""
|
|
80
|
+
|
|
81
|
+
def __init__(
|
|
82
|
+
self,
|
|
83
|
+
url: Optional[Text] = None,
|
|
84
|
+
params: Optional[Dict[Text, Any]] = None,
|
|
85
|
+
headers: Optional[Dict[Text, Any]] = None,
|
|
86
|
+
basic_auth: Optional[Dict[Text, Text]] = None,
|
|
87
|
+
token: Optional[Text] = None,
|
|
88
|
+
token_name: Text = "token",
|
|
89
|
+
cafile: Optional[Text] = None,
|
|
90
|
+
**kwargs: Any,
|
|
91
|
+
) -> None:
|
|
92
|
+
"""Creates an `EndpointConfig` instance."""
|
|
93
|
+
self.url = url
|
|
94
|
+
self.params = params or {}
|
|
95
|
+
self.headers = headers or {}
|
|
96
|
+
self.basic_auth = basic_auth or {}
|
|
97
|
+
self.token = token
|
|
98
|
+
self.token_name = token_name
|
|
99
|
+
self.type = kwargs.pop("store_type", kwargs.pop("type", None))
|
|
100
|
+
self.cafile = cafile
|
|
101
|
+
self.kwargs = kwargs
|
|
102
|
+
|
|
103
|
+
def session(self) -> aiohttp.ClientSession:
|
|
104
|
+
"""Creates and returns a configured aiohttp client session."""
|
|
105
|
+
# create authentication parameters
|
|
106
|
+
if self.basic_auth:
|
|
107
|
+
auth = aiohttp.BasicAuth(
|
|
108
|
+
self.basic_auth["username"], self.basic_auth["password"]
|
|
109
|
+
)
|
|
110
|
+
else:
|
|
111
|
+
auth = None
|
|
112
|
+
|
|
113
|
+
return aiohttp.ClientSession(
|
|
114
|
+
headers=self.headers,
|
|
115
|
+
auth=auth,
|
|
116
|
+
timeout=aiohttp.ClientTimeout(total=DEFAULT_REQUEST_TIMEOUT),
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
def combine_parameters(
|
|
120
|
+
self, kwargs: Optional[Dict[Text, Any]] = None
|
|
121
|
+
) -> Dict[Text, Any]:
|
|
122
|
+
# construct GET parameters
|
|
123
|
+
params = self.params.copy()
|
|
124
|
+
|
|
125
|
+
# set the authentication token if present
|
|
126
|
+
if self.token:
|
|
127
|
+
params[self.token_name] = self.token
|
|
128
|
+
|
|
129
|
+
if kwargs and "params" in kwargs:
|
|
130
|
+
params.update(kwargs["params"])
|
|
131
|
+
del kwargs["params"]
|
|
132
|
+
return params
|
|
133
|
+
|
|
134
|
+
async def request(
|
|
135
|
+
self,
|
|
136
|
+
method: Text = "post",
|
|
137
|
+
subpath: Optional[Text] = None,
|
|
138
|
+
content_type: Optional[Text] = "application/json",
|
|
139
|
+
compress: bool = False,
|
|
140
|
+
**kwargs: Any,
|
|
141
|
+
) -> Optional[Any]:
|
|
142
|
+
"""Send a HTTP request to the endpoint. Return json response, if available.
|
|
143
|
+
|
|
144
|
+
All additional arguments will get passed through
|
|
145
|
+
to aiohttp's `session.request`.
|
|
146
|
+
"""
|
|
147
|
+
# create the appropriate headers
|
|
148
|
+
headers = {}
|
|
149
|
+
if content_type:
|
|
150
|
+
headers["Content-Type"] = content_type
|
|
151
|
+
|
|
152
|
+
if "headers" in kwargs:
|
|
153
|
+
headers.update(kwargs["headers"])
|
|
154
|
+
del kwargs["headers"]
|
|
155
|
+
|
|
156
|
+
if self.headers:
|
|
157
|
+
headers.update(self.headers)
|
|
158
|
+
|
|
159
|
+
url = concat_url(self.url, subpath)
|
|
160
|
+
|
|
161
|
+
sslcontext = None
|
|
162
|
+
if self.cafile:
|
|
163
|
+
try:
|
|
164
|
+
sslcontext = ssl.create_default_context(cafile=self.cafile)
|
|
165
|
+
except FileNotFoundError as e:
|
|
166
|
+
raise FileNotFoundException(
|
|
167
|
+
f"Failed to find certificate file, "
|
|
168
|
+
f"'{os.path.abspath(self.cafile)}' does not exist."
|
|
169
|
+
) from e
|
|
170
|
+
|
|
171
|
+
async with self.session() as session:
|
|
172
|
+
async with session.request(
|
|
173
|
+
method,
|
|
174
|
+
url,
|
|
175
|
+
headers=headers,
|
|
176
|
+
params=self.combine_parameters(kwargs),
|
|
177
|
+
compress=compress,
|
|
178
|
+
ssl=sslcontext,
|
|
179
|
+
**kwargs,
|
|
180
|
+
) as response:
|
|
181
|
+
if response.status >= 400:
|
|
182
|
+
raise ClientResponseError(
|
|
183
|
+
response.status,
|
|
184
|
+
response.reason,
|
|
185
|
+
await response.content.read(),
|
|
186
|
+
)
|
|
187
|
+
try:
|
|
188
|
+
return await response.json()
|
|
189
|
+
except ContentTypeError:
|
|
190
|
+
return None
|
|
191
|
+
|
|
192
|
+
@classmethod
|
|
193
|
+
def from_dict(cls, data: Dict[Text, Any]) -> "EndpointConfig":
|
|
194
|
+
return EndpointConfig(**data)
|
|
195
|
+
|
|
196
|
+
def copy(self) -> "EndpointConfig":
|
|
197
|
+
return EndpointConfig(
|
|
198
|
+
self.url,
|
|
199
|
+
self.params,
|
|
200
|
+
self.headers,
|
|
201
|
+
self.basic_auth,
|
|
202
|
+
self.token,
|
|
203
|
+
self.token_name,
|
|
204
|
+
**self.kwargs,
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
def __eq__(self, other: Any) -> bool:
|
|
208
|
+
if isinstance(self, type(other)):
|
|
209
|
+
return (
|
|
210
|
+
other.url == self.url
|
|
211
|
+
and other.params == self.params
|
|
212
|
+
and other.headers == self.headers
|
|
213
|
+
and other.basic_auth == self.basic_auth
|
|
214
|
+
and other.token == self.token
|
|
215
|
+
and other.token_name == self.token_name
|
|
216
|
+
)
|
|
217
|
+
else:
|
|
218
|
+
return False
|
|
219
|
+
|
|
220
|
+
def __ne__(self, other: Any) -> bool:
|
|
221
|
+
return not self.__eq__(other)
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
class ClientResponseError(aiohttp.ClientError):
|
|
225
|
+
def __init__(self, status: int, message: Text, text: Text) -> None:
|
|
226
|
+
self.status = status
|
|
227
|
+
self.message = message
|
|
228
|
+
self.text = text
|
|
229
|
+
super().__init__(f"{status}, {message}, body='{text}'")
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def bool_arg(request: Request, name: Text, default: bool = True) -> bool:
|
|
233
|
+
"""Returns a passed boolean argument of the request or a default.
|
|
234
|
+
|
|
235
|
+
Checks the `name` parameter of the request if it contains a valid
|
|
236
|
+
boolean value. If not, `default` is returned.
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
request: Sanic request.
|
|
240
|
+
name: Name of argument.
|
|
241
|
+
default: Default value for `name` argument.
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
A bool value if `name` is a valid boolean, `default` otherwise.
|
|
245
|
+
"""
|
|
246
|
+
return str(request.args.get(name, default)).lower() == "true"
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def float_arg(
|
|
250
|
+
request: Request, key: Text, default: Optional[float] = None
|
|
251
|
+
) -> Optional[float]:
|
|
252
|
+
"""Returns a passed argument cast as a float or None.
|
|
253
|
+
|
|
254
|
+
Checks the `key` parameter of the request if it contains a valid
|
|
255
|
+
float value. If not, `default` is returned.
|
|
256
|
+
|
|
257
|
+
Args:
|
|
258
|
+
request: Sanic request.
|
|
259
|
+
key: Name of argument.
|
|
260
|
+
default: Default value for `key` argument.
|
|
261
|
+
|
|
262
|
+
Returns:
|
|
263
|
+
A float value if `key` is a valid float, `default` otherwise.
|
|
264
|
+
"""
|
|
265
|
+
arg = request.args.get(key, default)
|
|
266
|
+
|
|
267
|
+
if arg is default:
|
|
268
|
+
return arg
|
|
269
|
+
|
|
270
|
+
try:
|
|
271
|
+
return float(str(arg))
|
|
272
|
+
except (ValueError, TypeError):
|
|
273
|
+
structlogger.warning("endpoint.float_arg.convert_failed", arg=arg, key=key)
|
|
274
|
+
return default
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def int_arg(
|
|
278
|
+
request: Request, key: Text, default: Optional[int] = None
|
|
279
|
+
) -> Optional[int]:
|
|
280
|
+
"""Returns a passed argument cast as an int or None.
|
|
281
|
+
|
|
282
|
+
Checks the `key` parameter of the request if it contains a valid
|
|
283
|
+
int value. If not, `default` is returned.
|
|
284
|
+
|
|
285
|
+
Args:
|
|
286
|
+
request: Sanic request.
|
|
287
|
+
key: Name of argument.
|
|
288
|
+
default: Default value for `key` argument.
|
|
289
|
+
|
|
290
|
+
Returns:
|
|
291
|
+
An int value if `key` is a valid integer, `default` otherwise.
|
|
292
|
+
"""
|
|
293
|
+
arg = request.args.get(key, default)
|
|
294
|
+
|
|
295
|
+
if arg is default:
|
|
296
|
+
return arg
|
|
297
|
+
|
|
298
|
+
try:
|
|
299
|
+
return int(str(arg))
|
|
300
|
+
except (ValueError, TypeError):
|
|
301
|
+
structlogger.warning("endpoint.int_arg.convert_failed", arg=arg, key=key)
|
|
302
|
+
return default
|
rasa/utils/io.py
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import filecmp
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
5
|
+
import tempfile
|
|
6
|
+
import warnings
|
|
7
|
+
import re
|
|
8
|
+
from asyncio import AbstractEventLoop
|
|
9
|
+
from collections import OrderedDict
|
|
10
|
+
from io import StringIO
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import (
|
|
13
|
+
Optional,
|
|
14
|
+
Text,
|
|
15
|
+
Any,
|
|
16
|
+
Union,
|
|
17
|
+
List,
|
|
18
|
+
Type,
|
|
19
|
+
Callable,
|
|
20
|
+
TYPE_CHECKING,
|
|
21
|
+
Pattern,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
from ruamel import yaml
|
|
25
|
+
from ruamel.yaml import RoundTripRepresenter
|
|
26
|
+
from typing_extensions import Protocol
|
|
27
|
+
|
|
28
|
+
import rasa.shared.constants
|
|
29
|
+
import rasa.shared.utils.io
|
|
30
|
+
|
|
31
|
+
if TYPE_CHECKING:
|
|
32
|
+
from prompt_toolkit.validation import Validator
|
|
33
|
+
|
|
34
|
+
YAML_LINE_MAX_WIDTH = 4096
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class WriteRow(Protocol):
|
|
38
|
+
"""Describes a csv writer supporting a `writerow` method (workaround for typing)."""
|
|
39
|
+
|
|
40
|
+
def writerow(self, row: List[Text]) -> None:
|
|
41
|
+
"""Write the given row.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
row: the entries of a row as a list of strings
|
|
45
|
+
"""
|
|
46
|
+
...
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def configure_colored_logging(loglevel: Text) -> None:
|
|
50
|
+
"""Configures coloredlogs library for specified loglevel.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
loglevel: The loglevel to configure the library for
|
|
54
|
+
"""
|
|
55
|
+
import coloredlogs
|
|
56
|
+
|
|
57
|
+
loglevel = loglevel or os.environ.get(
|
|
58
|
+
rasa.shared.constants.ENV_LOG_LEVEL, rasa.shared.constants.DEFAULT_LOG_LEVEL
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
field_styles = coloredlogs.DEFAULT_FIELD_STYLES.copy()
|
|
62
|
+
field_styles["asctime"] = {}
|
|
63
|
+
level_styles = coloredlogs.DEFAULT_LEVEL_STYLES.copy()
|
|
64
|
+
level_styles["debug"] = {}
|
|
65
|
+
coloredlogs.install(
|
|
66
|
+
level=loglevel,
|
|
67
|
+
use_chroot=False,
|
|
68
|
+
fmt="%(asctime)s %(levelname)-8s %(name)s - %(message)s",
|
|
69
|
+
level_styles=level_styles,
|
|
70
|
+
field_styles=field_styles,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def enable_async_loop_debugging(
|
|
75
|
+
event_loop: AbstractEventLoop, slow_callback_duration: float = 0.1
|
|
76
|
+
) -> AbstractEventLoop:
|
|
77
|
+
"""Enables debugging on an event loop.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
event_loop: The event loop to enable debugging on
|
|
81
|
+
slow_callback_duration: The threshold at which a callback should be
|
|
82
|
+
alerted as slow.
|
|
83
|
+
"""
|
|
84
|
+
logging.info(
|
|
85
|
+
"Enabling coroutine debugging. Loop id {}.".format(id(asyncio.get_event_loop()))
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
# Enable debugging
|
|
89
|
+
event_loop.set_debug(True)
|
|
90
|
+
|
|
91
|
+
# Make the threshold for "slow" tasks very very small for
|
|
92
|
+
# illustration. The default is 0.1 (= 100 milliseconds).
|
|
93
|
+
event_loop.slow_callback_duration = slow_callback_duration
|
|
94
|
+
|
|
95
|
+
# Report all mistakes managing asynchronous resources.
|
|
96
|
+
warnings.simplefilter("always", ResourceWarning)
|
|
97
|
+
return event_loop
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def create_temporary_file(data: Any, suffix: Text = "", mode: Text = "w+") -> Text:
|
|
101
|
+
"""Creates a tempfile.NamedTemporaryFile object for data."""
|
|
102
|
+
encoding = None if "b" in mode else rasa.shared.utils.io.DEFAULT_ENCODING
|
|
103
|
+
f = tempfile.NamedTemporaryFile(
|
|
104
|
+
mode=mode, suffix=suffix, delete=False, encoding=encoding
|
|
105
|
+
)
|
|
106
|
+
f.write(data)
|
|
107
|
+
|
|
108
|
+
f.close()
|
|
109
|
+
return f.name
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def create_temporary_directory() -> Text:
|
|
113
|
+
"""Creates a tempfile.TemporaryDirectory."""
|
|
114
|
+
f = tempfile.TemporaryDirectory()
|
|
115
|
+
return f.name
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def create_path(file_path: Text) -> None:
|
|
119
|
+
"""Makes sure all directories in the 'file_path' exists."""
|
|
120
|
+
parent_dir = os.path.dirname(os.path.abspath(file_path))
|
|
121
|
+
if not os.path.exists(parent_dir):
|
|
122
|
+
os.makedirs(parent_dir)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def file_type_validator(
|
|
126
|
+
valid_file_types: List[Text], error_message: Text
|
|
127
|
+
) -> Type["Validator"]:
|
|
128
|
+
"""Creates a `Validator` class which can be used with `questionary` to validate
|
|
129
|
+
file paths.
|
|
130
|
+
"""
|
|
131
|
+
|
|
132
|
+
def is_valid(path: Text) -> bool:
|
|
133
|
+
return path is not None and any(
|
|
134
|
+
[path.endswith(file_type) for file_type in valid_file_types]
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
return create_validator(is_valid, error_message)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def not_empty_validator(error_message: Text) -> Type["Validator"]:
|
|
141
|
+
"""Creates a `Validator` class which can be used with `questionary` to validate
|
|
142
|
+
that the user entered something other than whitespace.
|
|
143
|
+
"""
|
|
144
|
+
|
|
145
|
+
def is_valid(input: Text) -> bool:
|
|
146
|
+
return input is not None and input.strip() != ""
|
|
147
|
+
|
|
148
|
+
return create_validator(is_valid, error_message)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def create_validator(
|
|
152
|
+
function: Callable[[Text], bool], error_message: Text
|
|
153
|
+
) -> Type["Validator"]:
|
|
154
|
+
"""Helper method to create `Validator` classes from callable functions. Should be
|
|
155
|
+
removed when questionary supports `Validator` objects.
|
|
156
|
+
"""
|
|
157
|
+
from prompt_toolkit.validation import Validator, ValidationError
|
|
158
|
+
from prompt_toolkit.document import Document
|
|
159
|
+
|
|
160
|
+
class FunctionValidator(Validator):
|
|
161
|
+
@staticmethod
|
|
162
|
+
def validate(document: Document) -> None:
|
|
163
|
+
is_valid = function(document.text)
|
|
164
|
+
if not is_valid:
|
|
165
|
+
raise ValidationError(message=error_message)
|
|
166
|
+
|
|
167
|
+
return FunctionValidator
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def get_emoji_regex() -> Pattern:
|
|
171
|
+
"""Returns regex to identify emojis."""
|
|
172
|
+
return re.compile(
|
|
173
|
+
"["
|
|
174
|
+
"\U0001f600-\U0001f64f" # emoticons
|
|
175
|
+
"\U0001f300-\U0001f5ff" # symbols & pictographs
|
|
176
|
+
"\U0001f680-\U0001f6ff" # transport & map symbols
|
|
177
|
+
"\U0001f1e0-\U0001f1ff" # flags (iOS)
|
|
178
|
+
"\U00002702-\U000027b0"
|
|
179
|
+
"\U000024c2-\U0001f251"
|
|
180
|
+
"\u200d" # zero width joiner
|
|
181
|
+
"\u200c" # zero width non-joiner
|
|
182
|
+
"]+",
|
|
183
|
+
flags=re.UNICODE,
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def are_directories_equal(dir1: Path, dir2: Path) -> bool:
|
|
188
|
+
"""Compares two directories recursively.
|
|
189
|
+
|
|
190
|
+
Files in each directory are
|
|
191
|
+
assumed to be equal if their names and contents are equal.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
dir1: The first directory.
|
|
195
|
+
dir2: The second directory.
|
|
196
|
+
|
|
197
|
+
Returns:
|
|
198
|
+
`True` if they are equal, `False` otherwise.
|
|
199
|
+
"""
|
|
200
|
+
dirs_cmp = filecmp.dircmp(dir1, dir2)
|
|
201
|
+
if dirs_cmp.left_only or dirs_cmp.right_only:
|
|
202
|
+
return False
|
|
203
|
+
|
|
204
|
+
(_, mismatches, errors) = filecmp.cmpfiles(
|
|
205
|
+
dir1, dir2, dirs_cmp.common_files, shallow=False
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
if mismatches or errors:
|
|
209
|
+
return False
|
|
210
|
+
|
|
211
|
+
for common_dir in dirs_cmp.common_dirs:
|
|
212
|
+
new_dir1 = Path(dir1, common_dir)
|
|
213
|
+
new_dir2 = Path(dir2, common_dir)
|
|
214
|
+
|
|
215
|
+
is_equal = are_directories_equal(new_dir1, new_dir2)
|
|
216
|
+
if not is_equal:
|
|
217
|
+
return False
|
|
218
|
+
|
|
219
|
+
return True
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def write_yaml(
|
|
223
|
+
data: Any,
|
|
224
|
+
target: Union[Text, Path, StringIO],
|
|
225
|
+
transform: Optional[Callable] = None,
|
|
226
|
+
should_preserve_key_order: bool = False,
|
|
227
|
+
) -> None:
|
|
228
|
+
"""Writes a yaml to the file or to the stream.
|
|
229
|
+
|
|
230
|
+
Args:
|
|
231
|
+
data: The data to write.
|
|
232
|
+
target: The path to the file which should be written or a stream object
|
|
233
|
+
transform: A function to transform the data before writing it.
|
|
234
|
+
should_preserve_key_order: Whether to force preserve key order in `data`.
|
|
235
|
+
"""
|
|
236
|
+
yaml.add_representer(
|
|
237
|
+
OrderedDict,
|
|
238
|
+
RoundTripRepresenter.represent_dict,
|
|
239
|
+
representer=RoundTripRepresenter,
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
if should_preserve_key_order:
|
|
243
|
+
data = rasa.shared.utils.io.convert_to_ordered_dict(data)
|
|
244
|
+
|
|
245
|
+
dumper = yaml.YAML()
|
|
246
|
+
# no wrap lines
|
|
247
|
+
dumper.width = YAML_LINE_MAX_WIDTH # type: ignore
|
|
248
|
+
|
|
249
|
+
# use `null` to represent `None`
|
|
250
|
+
dumper.representer.add_representer(
|
|
251
|
+
type(None),
|
|
252
|
+
lambda self, _: self.represent_scalar("tag:yaml.org,2002:null", "null"),
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
if isinstance(target, StringIO):
|
|
256
|
+
dumper.dump(data, target, transform=transform)
|
|
257
|
+
return
|
|
258
|
+
|
|
259
|
+
with Path(target).open("w", encoding="utf-8") as outfile:
|
|
260
|
+
dumper.dump(data, outfile, transform=transform)
|