rasa-pro 3.9.18__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- README.md +415 -0
- rasa/__init__.py +10 -0
- rasa/__main__.py +156 -0
- rasa/anonymization/__init__.py +2 -0
- rasa/anonymization/anonymisation_rule_yaml_reader.py +91 -0
- rasa/anonymization/anonymization_pipeline.py +286 -0
- rasa/anonymization/anonymization_rule_executor.py +260 -0
- rasa/anonymization/anonymization_rule_orchestrator.py +120 -0
- rasa/anonymization/schemas/config.yml +47 -0
- rasa/anonymization/utils.py +118 -0
- rasa/api.py +146 -0
- rasa/cli/__init__.py +5 -0
- rasa/cli/arguments/__init__.py +0 -0
- rasa/cli/arguments/data.py +81 -0
- rasa/cli/arguments/default_arguments.py +165 -0
- rasa/cli/arguments/evaluate.py +65 -0
- rasa/cli/arguments/export.py +51 -0
- rasa/cli/arguments/interactive.py +74 -0
- rasa/cli/arguments/run.py +204 -0
- rasa/cli/arguments/shell.py +13 -0
- rasa/cli/arguments/test.py +211 -0
- rasa/cli/arguments/train.py +263 -0
- rasa/cli/arguments/visualize.py +34 -0
- rasa/cli/arguments/x.py +30 -0
- rasa/cli/data.py +292 -0
- rasa/cli/e2e_test.py +586 -0
- rasa/cli/evaluate.py +222 -0
- rasa/cli/export.py +250 -0
- rasa/cli/inspect.py +63 -0
- rasa/cli/interactive.py +164 -0
- rasa/cli/license.py +65 -0
- rasa/cli/markers.py +78 -0
- rasa/cli/project_templates/__init__.py +0 -0
- rasa/cli/project_templates/calm/actions/__init__.py +0 -0
- rasa/cli/project_templates/calm/actions/action_template.py +27 -0
- rasa/cli/project_templates/calm/actions/add_contact.py +30 -0
- rasa/cli/project_templates/calm/actions/db.py +57 -0
- rasa/cli/project_templates/calm/actions/list_contacts.py +22 -0
- rasa/cli/project_templates/calm/actions/remove_contact.py +35 -0
- rasa/cli/project_templates/calm/config.yml +12 -0
- rasa/cli/project_templates/calm/credentials.yml +33 -0
- rasa/cli/project_templates/calm/data/flows/add_contact.yml +31 -0
- rasa/cli/project_templates/calm/data/flows/list_contacts.yml +14 -0
- rasa/cli/project_templates/calm/data/flows/remove_contact.yml +29 -0
- rasa/cli/project_templates/calm/db/contacts.json +10 -0
- rasa/cli/project_templates/calm/domain/add_contact.yml +39 -0
- rasa/cli/project_templates/calm/domain/list_contacts.yml +17 -0
- rasa/cli/project_templates/calm/domain/remove_contact.yml +38 -0
- rasa/cli/project_templates/calm/domain/shared.yml +10 -0
- rasa/cli/project_templates/calm/e2e_tests/cancelations/user_cancels_during_a_correction.yml +16 -0
- rasa/cli/project_templates/calm/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +7 -0
- rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_handle.yml +20 -0
- rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_name.yml +19 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +15 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_lists_contacts.yml +5 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact.yml +11 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact_from_list.yml +12 -0
- rasa/cli/project_templates/calm/endpoints.yml +45 -0
- rasa/cli/project_templates/default/actions/__init__.py +0 -0
- rasa/cli/project_templates/default/actions/actions.py +27 -0
- rasa/cli/project_templates/default/config.yml +44 -0
- rasa/cli/project_templates/default/credentials.yml +33 -0
- rasa/cli/project_templates/default/data/nlu.yml +91 -0
- rasa/cli/project_templates/default/data/rules.yml +13 -0
- rasa/cli/project_templates/default/data/stories.yml +30 -0
- rasa/cli/project_templates/default/domain.yml +34 -0
- rasa/cli/project_templates/default/endpoints.yml +42 -0
- rasa/cli/project_templates/default/tests/test_stories.yml +91 -0
- rasa/cli/project_templates/tutorial/actions.py +22 -0
- rasa/cli/project_templates/tutorial/config.yml +11 -0
- rasa/cli/project_templates/tutorial/credentials.yml +33 -0
- rasa/cli/project_templates/tutorial/data/flows.yml +8 -0
- rasa/cli/project_templates/tutorial/data/patterns.yml +6 -0
- rasa/cli/project_templates/tutorial/domain.yml +21 -0
- rasa/cli/project_templates/tutorial/endpoints.yml +45 -0
- rasa/cli/run.py +135 -0
- rasa/cli/scaffold.py +269 -0
- rasa/cli/shell.py +141 -0
- rasa/cli/studio/__init__.py +0 -0
- rasa/cli/studio/download.py +62 -0
- rasa/cli/studio/studio.py +266 -0
- rasa/cli/studio/train.py +59 -0
- rasa/cli/studio/upload.py +77 -0
- rasa/cli/telemetry.py +102 -0
- rasa/cli/test.py +280 -0
- rasa/cli/train.py +260 -0
- rasa/cli/utils.py +464 -0
- rasa/cli/visualize.py +40 -0
- rasa/cli/x.py +206 -0
- rasa/constants.py +37 -0
- rasa/core/__init__.py +17 -0
- rasa/core/actions/__init__.py +0 -0
- rasa/core/actions/action.py +1225 -0
- rasa/core/actions/action_clean_stack.py +59 -0
- rasa/core/actions/action_exceptions.py +24 -0
- rasa/core/actions/action_run_slot_rejections.py +207 -0
- rasa/core/actions/action_trigger_chitchat.py +31 -0
- rasa/core/actions/action_trigger_flow.py +109 -0
- rasa/core/actions/action_trigger_search.py +31 -0
- rasa/core/actions/constants.py +5 -0
- rasa/core/actions/custom_action_executor.py +188 -0
- rasa/core/actions/forms.py +741 -0
- rasa/core/actions/grpc_custom_action_executor.py +251 -0
- rasa/core/actions/http_custom_action_executor.py +140 -0
- rasa/core/actions/loops.py +114 -0
- rasa/core/actions/two_stage_fallback.py +186 -0
- rasa/core/agent.py +555 -0
- rasa/core/auth_retry_tracker_store.py +122 -0
- rasa/core/brokers/__init__.py +0 -0
- rasa/core/brokers/broker.py +126 -0
- rasa/core/brokers/file.py +58 -0
- rasa/core/brokers/kafka.py +322 -0
- rasa/core/brokers/pika.py +386 -0
- rasa/core/brokers/sql.py +86 -0
- rasa/core/channels/__init__.py +55 -0
- rasa/core/channels/audiocodes.py +463 -0
- rasa/core/channels/botframework.py +338 -0
- rasa/core/channels/callback.py +84 -0
- rasa/core/channels/channel.py +419 -0
- rasa/core/channels/console.py +241 -0
- rasa/core/channels/development_inspector.py +93 -0
- rasa/core/channels/facebook.py +419 -0
- rasa/core/channels/hangouts.py +329 -0
- rasa/core/channels/inspector/.eslintrc.cjs +25 -0
- rasa/core/channels/inspector/.gitignore +23 -0
- rasa/core/channels/inspector/README.md +54 -0
- rasa/core/channels/inspector/assets/favicon.ico +0 -0
- rasa/core/channels/inspector/assets/rasa-chat.js +2 -0
- rasa/core/channels/inspector/custom.d.ts +3 -0
- rasa/core/channels/inspector/dist/assets/arc-b6e548fe.js +1 -0
- rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
- rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-fa03ac9e.js +10 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-ee67392a.js +2 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-9b283fae.js +2 -0
- rasa/core/channels/inspector/dist/assets/createText-62fc7601-8b6fcc2a.js +7 -0
- rasa/core/channels/inspector/dist/assets/edges-f2ad444c-22e77f4f.js +4 -0
- rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-60ffc87f.js +51 -0
- rasa/core/channels/inspector/dist/assets/flowDb-1972c806-9dd802e4.js +6 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-5fa1912f.js +4 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-1844e5a5.js +1 -0
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-622a1fd2.js +139 -0
- rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-e285a63a.js +266 -0
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-f237bdca.js +70 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-128cfa44.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-21dbcb97.woff +0 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-222b5e26.svg +329 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-9ad89b2a.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-4b03d70e.js +1 -0
- rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
- rasa/core/channels/inspector/dist/assets/index-a5d3e69d.js +1040 -0
- rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-72a0fa5f.js +7 -0
- rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
- rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-82218c41.js +139 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-60c05ee4.woff +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-8335d9b8.svg +438 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-9cc39c75.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-ead13ccf.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-16705655.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-5aeb07f9.woff +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9c459044.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9e2898a4.svg +435 -0
- rasa/core/channels/inspector/dist/assets/layout-78cff630.js +1 -0
- rasa/core/channels/inspector/dist/assets/line-5038b469.js +1 -0
- rasa/core/channels/inspector/dist/assets/linear-c4fc4098.js +1 -0
- rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-c33c8ea6.js +109 -0
- rasa/core/channels/inspector/dist/assets/ordinal-ba9b4969.js +1 -0
- rasa/core/channels/inspector/dist/assets/path-53f90ab3.js +1 -0
- rasa/core/channels/inspector/dist/assets/pieDiagram-dbbf0591-a8d03059.js +35 -0
- rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-6a0e56b2.js +7 -0
- rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-2dc7c7bd.js +52 -0
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-2360fe39.js +8 -0
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-41b9f9ad.js +122 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-0aad326f.js +1 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-9847d984.js +1 -0
- rasa/core/channels/inspector/dist/assets/styles-080da4f6-564d890e.js +110 -0
- rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-38957613.js +159 -0
- rasa/core/channels/inspector/dist/assets/styles-9c745c82-f0fc6921.js +207 -0
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-ef3c5a77.js +1 -0
- rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-bf3e91c1.js +61 -0
- rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-4d4026c0.js +7 -0
- rasa/core/channels/inspector/dist/index.html +41 -0
- rasa/core/channels/inspector/index.html +39 -0
- rasa/core/channels/inspector/jest.config.ts +13 -0
- rasa/core/channels/inspector/package.json +48 -0
- rasa/core/channels/inspector/setupTests.ts +2 -0
- rasa/core/channels/inspector/src/App.tsx +170 -0
- rasa/core/channels/inspector/src/components/DiagramFlow.tsx +107 -0
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
- rasa/core/channels/inspector/src/components/DialogueStack.tsx +151 -0
- rasa/core/channels/inspector/src/components/ExpandIcon.tsx +16 -0
- rasa/core/channels/inspector/src/components/FullscreenButton.tsx +45 -0
- rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +19 -0
- rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +21 -0
- rasa/core/channels/inspector/src/components/RasaLogo.tsx +32 -0
- rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +39 -0
- rasa/core/channels/inspector/src/components/Slots.tsx +91 -0
- rasa/core/channels/inspector/src/components/Welcome.tsx +54 -0
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +382 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +240 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +42 -0
- rasa/core/channels/inspector/src/main.tsx +13 -0
- rasa/core/channels/inspector/src/theme/Button/Button.ts +29 -0
- rasa/core/channels/inspector/src/theme/Heading/Heading.ts +31 -0
- rasa/core/channels/inspector/src/theme/Input/Input.ts +27 -0
- rasa/core/channels/inspector/src/theme/Link/Link.ts +10 -0
- rasa/core/channels/inspector/src/theme/Modal/Modal.ts +47 -0
- rasa/core/channels/inspector/src/theme/Table/Table.tsx +38 -0
- rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +12 -0
- rasa/core/channels/inspector/src/theme/base/breakpoints.ts +8 -0
- rasa/core/channels/inspector/src/theme/base/colors.ts +88 -0
- rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +29 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.svg +329 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.svg +438 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.svg +435 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/radii.ts +9 -0
- rasa/core/channels/inspector/src/theme/base/shadows.ts +7 -0
- rasa/core/channels/inspector/src/theme/base/sizes.ts +7 -0
- rasa/core/channels/inspector/src/theme/base/space.ts +15 -0
- rasa/core/channels/inspector/src/theme/base/styles.ts +13 -0
- rasa/core/channels/inspector/src/theme/base/typography.ts +24 -0
- rasa/core/channels/inspector/src/theme/base/zIndices.ts +19 -0
- rasa/core/channels/inspector/src/theme/index.ts +101 -0
- rasa/core/channels/inspector/src/types.ts +64 -0
- rasa/core/channels/inspector/src/vite-env.d.ts +1 -0
- rasa/core/channels/inspector/tests/__mocks__/fileMock.ts +1 -0
- rasa/core/channels/inspector/tests/__mocks__/matchMedia.ts +16 -0
- rasa/core/channels/inspector/tests/__mocks__/styleMock.ts +1 -0
- rasa/core/channels/inspector/tests/renderWithProviders.tsx +14 -0
- rasa/core/channels/inspector/tsconfig.json +26 -0
- rasa/core/channels/inspector/tsconfig.node.json +10 -0
- rasa/core/channels/inspector/vite.config.ts +8 -0
- rasa/core/channels/inspector/yarn.lock +6156 -0
- rasa/core/channels/mattermost.py +229 -0
- rasa/core/channels/rasa_chat.py +126 -0
- rasa/core/channels/rest.py +225 -0
- rasa/core/channels/rocketchat.py +174 -0
- rasa/core/channels/slack.py +620 -0
- rasa/core/channels/socketio.py +274 -0
- rasa/core/channels/telegram.py +298 -0
- rasa/core/channels/twilio.py +169 -0
- rasa/core/channels/twilio_voice.py +367 -0
- rasa/core/channels/vier_cvg.py +374 -0
- rasa/core/channels/webexteams.py +134 -0
- rasa/core/concurrent_lock_store.py +210 -0
- rasa/core/constants.py +107 -0
- rasa/core/evaluation/__init__.py +0 -0
- rasa/core/evaluation/marker.py +267 -0
- rasa/core/evaluation/marker_base.py +923 -0
- rasa/core/evaluation/marker_stats.py +293 -0
- rasa/core/evaluation/marker_tracker_loader.py +103 -0
- rasa/core/exceptions.py +29 -0
- rasa/core/exporter.py +284 -0
- rasa/core/featurizers/__init__.py +0 -0
- rasa/core/featurizers/precomputation.py +410 -0
- rasa/core/featurizers/single_state_featurizer.py +421 -0
- rasa/core/featurizers/tracker_featurizers.py +1262 -0
- rasa/core/http_interpreter.py +89 -0
- rasa/core/information_retrieval/__init__.py +7 -0
- rasa/core/information_retrieval/faiss.py +121 -0
- rasa/core/information_retrieval/information_retrieval.py +129 -0
- rasa/core/information_retrieval/milvus.py +52 -0
- rasa/core/information_retrieval/qdrant.py +95 -0
- rasa/core/jobs.py +63 -0
- rasa/core/lock.py +139 -0
- rasa/core/lock_store.py +343 -0
- rasa/core/migrate.py +403 -0
- rasa/core/nlg/__init__.py +3 -0
- rasa/core/nlg/callback.py +146 -0
- rasa/core/nlg/contextual_response_rephraser.py +270 -0
- rasa/core/nlg/generator.py +230 -0
- rasa/core/nlg/interpolator.py +143 -0
- rasa/core/nlg/response.py +155 -0
- rasa/core/nlg/summarize.py +69 -0
- rasa/core/policies/__init__.py +0 -0
- rasa/core/policies/ensemble.py +329 -0
- rasa/core/policies/enterprise_search_policy.py +781 -0
- rasa/core/policies/enterprise_search_prompt_template.jinja2 +25 -0
- rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +60 -0
- rasa/core/policies/flow_policy.py +205 -0
- rasa/core/policies/flows/__init__.py +0 -0
- rasa/core/policies/flows/flow_exceptions.py +44 -0
- rasa/core/policies/flows/flow_executor.py +705 -0
- rasa/core/policies/flows/flow_step_result.py +43 -0
- rasa/core/policies/intentless_policy.py +922 -0
- rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
- rasa/core/policies/memoization.py +538 -0
- rasa/core/policies/policy.py +725 -0
- rasa/core/policies/rule_policy.py +1273 -0
- rasa/core/policies/ted_policy.py +2169 -0
- rasa/core/policies/unexpected_intent_policy.py +1022 -0
- rasa/core/processor.py +1422 -0
- rasa/core/run.py +331 -0
- rasa/core/secrets_manager/__init__.py +0 -0
- rasa/core/secrets_manager/constants.py +32 -0
- rasa/core/secrets_manager/endpoints.py +391 -0
- rasa/core/secrets_manager/factory.py +233 -0
- rasa/core/secrets_manager/secret_manager.py +262 -0
- rasa/core/secrets_manager/vault.py +574 -0
- rasa/core/test.py +1335 -0
- rasa/core/tracker_store.py +1699 -0
- rasa/core/train.py +105 -0
- rasa/core/training/__init__.py +89 -0
- rasa/core/training/converters/__init__.py +0 -0
- rasa/core/training/converters/responses_prefix_converter.py +119 -0
- rasa/core/training/interactive.py +1745 -0
- rasa/core/training/story_conflict.py +381 -0
- rasa/core/training/training.py +93 -0
- rasa/core/utils.py +339 -0
- rasa/core/visualize.py +70 -0
- rasa/dialogue_understanding/__init__.py +0 -0
- rasa/dialogue_understanding/coexistence/__init__.py +0 -0
- rasa/dialogue_understanding/coexistence/constants.py +4 -0
- rasa/dialogue_understanding/coexistence/intent_based_router.py +196 -0
- rasa/dialogue_understanding/coexistence/llm_based_router.py +260 -0
- rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
- rasa/dialogue_understanding/commands/__init__.py +49 -0
- rasa/dialogue_understanding/commands/can_not_handle_command.py +70 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +125 -0
- rasa/dialogue_understanding/commands/change_flow_command.py +44 -0
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +57 -0
- rasa/dialogue_understanding/commands/clarify_command.py +86 -0
- rasa/dialogue_understanding/commands/command.py +85 -0
- rasa/dialogue_understanding/commands/correct_slots_command.py +297 -0
- rasa/dialogue_understanding/commands/error_command.py +79 -0
- rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
- rasa/dialogue_understanding/commands/handle_code_change_command.py +73 -0
- rasa/dialogue_understanding/commands/human_handoff_command.py +66 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +57 -0
- rasa/dialogue_understanding/commands/noop_command.py +54 -0
- rasa/dialogue_understanding/commands/set_slot_command.py +160 -0
- rasa/dialogue_understanding/commands/skip_question_command.py +75 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +107 -0
- rasa/dialogue_understanding/generator/__init__.py +21 -0
- rasa/dialogue_understanding/generator/command_generator.py +343 -0
- rasa/dialogue_understanding/generator/constants.py +18 -0
- rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +412 -0
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +467 -0
- rasa/dialogue_understanding/generator/llm_command_generator.py +67 -0
- rasa/dialogue_understanding/generator/multi_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/multi_step/fill_slots_prompt.jinja2 +62 -0
- rasa/dialogue_understanding/generator/multi_step/handle_flows_prompt.jinja2 +38 -0
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +827 -0
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +218 -0
- rasa/dialogue_understanding/generator/single_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2 +57 -0
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +345 -0
- rasa/dialogue_understanding/patterns/__init__.py +0 -0
- rasa/dialogue_understanding/patterns/cancel.py +111 -0
- rasa/dialogue_understanding/patterns/cannot_handle.py +43 -0
- rasa/dialogue_understanding/patterns/chitchat.py +37 -0
- rasa/dialogue_understanding/patterns/clarify.py +97 -0
- rasa/dialogue_understanding/patterns/code_change.py +41 -0
- rasa/dialogue_understanding/patterns/collect_information.py +90 -0
- rasa/dialogue_understanding/patterns/completed.py +40 -0
- rasa/dialogue_understanding/patterns/continue_interrupted.py +42 -0
- rasa/dialogue_understanding/patterns/correction.py +278 -0
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +248 -0
- rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
- rasa/dialogue_understanding/patterns/internal_error.py +47 -0
- rasa/dialogue_understanding/patterns/search.py +37 -0
- rasa/dialogue_understanding/patterns/skip_question.py +38 -0
- rasa/dialogue_understanding/processor/__init__.py +0 -0
- rasa/dialogue_understanding/processor/command_processor.py +687 -0
- rasa/dialogue_understanding/processor/command_processor_component.py +39 -0
- rasa/dialogue_understanding/stack/__init__.py +0 -0
- rasa/dialogue_understanding/stack/dialogue_stack.py +178 -0
- rasa/dialogue_understanding/stack/frames/__init__.py +19 -0
- rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +27 -0
- rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +137 -0
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +157 -0
- rasa/dialogue_understanding/stack/frames/pattern_frame.py +10 -0
- rasa/dialogue_understanding/stack/frames/search_frame.py +27 -0
- rasa/dialogue_understanding/stack/utils.py +211 -0
- rasa/e2e_test/__init__.py +0 -0
- rasa/e2e_test/constants.py +11 -0
- rasa/e2e_test/e2e_test_case.py +366 -0
- rasa/e2e_test/e2e_test_result.py +34 -0
- rasa/e2e_test/e2e_test_runner.py +768 -0
- rasa/e2e_test/e2e_test_schema.yml +85 -0
- rasa/engine/__init__.py +0 -0
- rasa/engine/caching.py +463 -0
- rasa/engine/constants.py +17 -0
- rasa/engine/exceptions.py +14 -0
- rasa/engine/graph.py +637 -0
- rasa/engine/loader.py +36 -0
- rasa/engine/recipes/__init__.py +0 -0
- rasa/engine/recipes/config_files/default_config.yml +44 -0
- rasa/engine/recipes/default_components.py +99 -0
- rasa/engine/recipes/default_recipe.py +1251 -0
- rasa/engine/recipes/graph_recipe.py +79 -0
- rasa/engine/recipes/recipe.py +93 -0
- rasa/engine/runner/__init__.py +0 -0
- rasa/engine/runner/dask.py +250 -0
- rasa/engine/runner/interface.py +49 -0
- rasa/engine/storage/__init__.py +0 -0
- rasa/engine/storage/local_model_storage.py +246 -0
- rasa/engine/storage/resource.py +110 -0
- rasa/engine/storage/storage.py +203 -0
- rasa/engine/training/__init__.py +0 -0
- rasa/engine/training/components.py +176 -0
- rasa/engine/training/fingerprinting.py +64 -0
- rasa/engine/training/graph_trainer.py +256 -0
- rasa/engine/training/hooks.py +164 -0
- rasa/engine/validation.py +873 -0
- rasa/env.py +5 -0
- rasa/exceptions.py +69 -0
- rasa/graph_components/__init__.py +0 -0
- rasa/graph_components/converters/__init__.py +0 -0
- rasa/graph_components/converters/nlu_message_converter.py +48 -0
- rasa/graph_components/providers/__init__.py +0 -0
- rasa/graph_components/providers/domain_for_core_training_provider.py +87 -0
- rasa/graph_components/providers/domain_provider.py +71 -0
- rasa/graph_components/providers/flows_provider.py +74 -0
- rasa/graph_components/providers/forms_provider.py +44 -0
- rasa/graph_components/providers/nlu_training_data_provider.py +56 -0
- rasa/graph_components/providers/responses_provider.py +44 -0
- rasa/graph_components/providers/rule_only_provider.py +49 -0
- rasa/graph_components/providers/story_graph_provider.py +43 -0
- rasa/graph_components/providers/training_tracker_provider.py +55 -0
- rasa/graph_components/validators/__init__.py +0 -0
- rasa/graph_components/validators/default_recipe_validator.py +550 -0
- rasa/graph_components/validators/finetuning_validator.py +302 -0
- rasa/hooks.py +112 -0
- rasa/jupyter.py +63 -0
- rasa/markers/__init__.py +0 -0
- rasa/markers/marker.py +269 -0
- rasa/markers/marker_base.py +828 -0
- rasa/markers/upload.py +74 -0
- rasa/markers/validate.py +21 -0
- rasa/model.py +118 -0
- rasa/model_testing.py +457 -0
- rasa/model_training.py +536 -0
- rasa/nlu/__init__.py +7 -0
- rasa/nlu/classifiers/__init__.py +3 -0
- rasa/nlu/classifiers/classifier.py +5 -0
- rasa/nlu/classifiers/diet_classifier.py +1881 -0
- rasa/nlu/classifiers/fallback_classifier.py +192 -0
- rasa/nlu/classifiers/keyword_intent_classifier.py +188 -0
- rasa/nlu/classifiers/llm_intent_classifier.py +519 -0
- rasa/nlu/classifiers/logistic_regression_classifier.py +253 -0
- rasa/nlu/classifiers/mitie_intent_classifier.py +156 -0
- rasa/nlu/classifiers/regex_message_handler.py +56 -0
- rasa/nlu/classifiers/sklearn_intent_classifier.py +330 -0
- rasa/nlu/constants.py +77 -0
- rasa/nlu/convert.py +40 -0
- rasa/nlu/emulators/__init__.py +0 -0
- rasa/nlu/emulators/dialogflow.py +55 -0
- rasa/nlu/emulators/emulator.py +49 -0
- rasa/nlu/emulators/luis.py +86 -0
- rasa/nlu/emulators/no_emulator.py +10 -0
- rasa/nlu/emulators/wit.py +56 -0
- rasa/nlu/extractors/__init__.py +0 -0
- rasa/nlu/extractors/crf_entity_extractor.py +715 -0
- rasa/nlu/extractors/duckling_entity_extractor.py +206 -0
- rasa/nlu/extractors/entity_synonyms.py +178 -0
- rasa/nlu/extractors/extractor.py +470 -0
- rasa/nlu/extractors/mitie_entity_extractor.py +293 -0
- rasa/nlu/extractors/regex_entity_extractor.py +220 -0
- rasa/nlu/extractors/spacy_entity_extractor.py +95 -0
- rasa/nlu/featurizers/__init__.py +0 -0
- rasa/nlu/featurizers/dense_featurizer/__init__.py +0 -0
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +445 -0
- rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +768 -0
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +170 -0
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +132 -0
- rasa/nlu/featurizers/featurizer.py +89 -0
- rasa/nlu/featurizers/sparse_featurizer/__init__.py +0 -0
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +867 -0
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +571 -0
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +271 -0
- rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
- rasa/nlu/model.py +24 -0
- rasa/nlu/persistor.py +282 -0
- rasa/nlu/run.py +27 -0
- rasa/nlu/selectors/__init__.py +0 -0
- rasa/nlu/selectors/response_selector.py +987 -0
- rasa/nlu/test.py +1940 -0
- rasa/nlu/tokenizers/__init__.py +0 -0
- rasa/nlu/tokenizers/jieba_tokenizer.py +148 -0
- rasa/nlu/tokenizers/mitie_tokenizer.py +75 -0
- rasa/nlu/tokenizers/spacy_tokenizer.py +72 -0
- rasa/nlu/tokenizers/tokenizer.py +239 -0
- rasa/nlu/tokenizers/whitespace_tokenizer.py +106 -0
- rasa/nlu/utils/__init__.py +35 -0
- rasa/nlu/utils/bilou_utils.py +462 -0
- rasa/nlu/utils/hugging_face/__init__.py +0 -0
- rasa/nlu/utils/hugging_face/registry.py +108 -0
- rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +311 -0
- rasa/nlu/utils/mitie_utils.py +113 -0
- rasa/nlu/utils/pattern_utils.py +168 -0
- rasa/nlu/utils/spacy_utils.py +310 -0
- rasa/plugin.py +90 -0
- rasa/server.py +1551 -0
- rasa/shared/__init__.py +0 -0
- rasa/shared/constants.py +192 -0
- rasa/shared/core/__init__.py +0 -0
- rasa/shared/core/command_payload_reader.py +109 -0
- rasa/shared/core/constants.py +167 -0
- rasa/shared/core/conversation.py +46 -0
- rasa/shared/core/domain.py +2107 -0
- rasa/shared/core/events.py +2504 -0
- rasa/shared/core/flows/__init__.py +7 -0
- rasa/shared/core/flows/flow.py +362 -0
- rasa/shared/core/flows/flow_step.py +146 -0
- rasa/shared/core/flows/flow_step_links.py +319 -0
- rasa/shared/core/flows/flow_step_sequence.py +70 -0
- rasa/shared/core/flows/flows_list.py +223 -0
- rasa/shared/core/flows/flows_yaml_schema.json +217 -0
- rasa/shared/core/flows/nlu_trigger.py +117 -0
- rasa/shared/core/flows/steps/__init__.py +24 -0
- rasa/shared/core/flows/steps/action.py +56 -0
- rasa/shared/core/flows/steps/call.py +64 -0
- rasa/shared/core/flows/steps/collect.py +112 -0
- rasa/shared/core/flows/steps/constants.py +5 -0
- rasa/shared/core/flows/steps/continuation.py +36 -0
- rasa/shared/core/flows/steps/end.py +22 -0
- rasa/shared/core/flows/steps/internal.py +44 -0
- rasa/shared/core/flows/steps/link.py +51 -0
- rasa/shared/core/flows/steps/no_operation.py +48 -0
- rasa/shared/core/flows/steps/set_slots.py +50 -0
- rasa/shared/core/flows/steps/start.py +30 -0
- rasa/shared/core/flows/validation.py +527 -0
- rasa/shared/core/flows/yaml_flows_io.py +278 -0
- rasa/shared/core/generator.py +908 -0
- rasa/shared/core/slot_mappings.py +526 -0
- rasa/shared/core/slots.py +649 -0
- rasa/shared/core/trackers.py +1177 -0
- rasa/shared/core/training_data/__init__.py +0 -0
- rasa/shared/core/training_data/loading.py +89 -0
- rasa/shared/core/training_data/story_reader/__init__.py +0 -0
- rasa/shared/core/training_data/story_reader/story_reader.py +129 -0
- rasa/shared/core/training_data/story_reader/story_step_builder.py +168 -0
- rasa/shared/core/training_data/story_reader/yaml_story_reader.py +888 -0
- rasa/shared/core/training_data/story_writer/__init__.py +0 -0
- rasa/shared/core/training_data/story_writer/story_writer.py +76 -0
- rasa/shared/core/training_data/story_writer/yaml_story_writer.py +444 -0
- rasa/shared/core/training_data/structures.py +838 -0
- rasa/shared/core/training_data/visualization.html +146 -0
- rasa/shared/core/training_data/visualization.py +603 -0
- rasa/shared/data.py +249 -0
- rasa/shared/engine/__init__.py +0 -0
- rasa/shared/engine/caching.py +26 -0
- rasa/shared/exceptions.py +163 -0
- rasa/shared/importers/__init__.py +0 -0
- rasa/shared/importers/importer.py +704 -0
- rasa/shared/importers/multi_project.py +203 -0
- rasa/shared/importers/rasa.py +99 -0
- rasa/shared/importers/utils.py +34 -0
- rasa/shared/nlu/__init__.py +0 -0
- rasa/shared/nlu/constants.py +47 -0
- rasa/shared/nlu/interpreter.py +10 -0
- rasa/shared/nlu/training_data/__init__.py +0 -0
- rasa/shared/nlu/training_data/entities_parser.py +208 -0
- rasa/shared/nlu/training_data/features.py +492 -0
- rasa/shared/nlu/training_data/formats/__init__.py +10 -0
- rasa/shared/nlu/training_data/formats/dialogflow.py +163 -0
- rasa/shared/nlu/training_data/formats/luis.py +87 -0
- rasa/shared/nlu/training_data/formats/rasa.py +135 -0
- rasa/shared/nlu/training_data/formats/rasa_yaml.py +603 -0
- rasa/shared/nlu/training_data/formats/readerwriter.py +244 -0
- rasa/shared/nlu/training_data/formats/wit.py +52 -0
- rasa/shared/nlu/training_data/loading.py +137 -0
- rasa/shared/nlu/training_data/lookup_tables_parser.py +30 -0
- rasa/shared/nlu/training_data/message.py +490 -0
- rasa/shared/nlu/training_data/schemas/__init__.py +0 -0
- rasa/shared/nlu/training_data/schemas/data_schema.py +85 -0
- rasa/shared/nlu/training_data/schemas/nlu.yml +53 -0
- rasa/shared/nlu/training_data/schemas/responses.yml +70 -0
- rasa/shared/nlu/training_data/synonyms_parser.py +42 -0
- rasa/shared/nlu/training_data/training_data.py +730 -0
- rasa/shared/nlu/training_data/util.py +223 -0
- rasa/shared/providers/__init__.py +0 -0
- rasa/shared/providers/openai/__init__.py +0 -0
- rasa/shared/providers/openai/clients.py +43 -0
- rasa/shared/providers/openai/session_handler.py +110 -0
- rasa/shared/utils/__init__.py +0 -0
- rasa/shared/utils/cli.py +72 -0
- rasa/shared/utils/common.py +308 -0
- rasa/shared/utils/constants.py +4 -0
- rasa/shared/utils/io.py +415 -0
- rasa/shared/utils/llm.py +404 -0
- rasa/shared/utils/pykwalify_extensions.py +27 -0
- rasa/shared/utils/schemas/__init__.py +0 -0
- rasa/shared/utils/schemas/config.yml +2 -0
- rasa/shared/utils/schemas/domain.yml +145 -0
- rasa/shared/utils/schemas/events.py +212 -0
- rasa/shared/utils/schemas/model_config.yml +46 -0
- rasa/shared/utils/schemas/stories.yml +173 -0
- rasa/shared/utils/yaml.py +786 -0
- rasa/studio/__init__.py +0 -0
- rasa/studio/auth.py +268 -0
- rasa/studio/config.py +127 -0
- rasa/studio/constants.py +18 -0
- rasa/studio/data_handler.py +359 -0
- rasa/studio/download.py +483 -0
- rasa/studio/results_logger.py +137 -0
- rasa/studio/train.py +135 -0
- rasa/studio/upload.py +433 -0
- rasa/telemetry.py +1737 -0
- rasa/tracing/__init__.py +0 -0
- rasa/tracing/config.py +353 -0
- rasa/tracing/constants.py +62 -0
- rasa/tracing/instrumentation/__init__.py +0 -0
- rasa/tracing/instrumentation/attribute_extractors.py +672 -0
- rasa/tracing/instrumentation/instrumentation.py +1185 -0
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +144 -0
- rasa/tracing/instrumentation/metrics.py +294 -0
- rasa/tracing/metric_instrument_provider.py +205 -0
- rasa/utils/__init__.py +0 -0
- rasa/utils/beta.py +83 -0
- rasa/utils/cli.py +28 -0
- rasa/utils/common.py +635 -0
- rasa/utils/converter.py +53 -0
- rasa/utils/endpoints.py +302 -0
- rasa/utils/io.py +260 -0
- rasa/utils/licensing.py +534 -0
- rasa/utils/log_utils.py +174 -0
- rasa/utils/mapper.py +210 -0
- rasa/utils/ml_utils.py +145 -0
- rasa/utils/plotting.py +362 -0
- rasa/utils/singleton.py +23 -0
- rasa/utils/tensorflow/__init__.py +0 -0
- rasa/utils/tensorflow/callback.py +112 -0
- rasa/utils/tensorflow/constants.py +116 -0
- rasa/utils/tensorflow/crf.py +492 -0
- rasa/utils/tensorflow/data_generator.py +440 -0
- rasa/utils/tensorflow/environment.py +161 -0
- rasa/utils/tensorflow/exceptions.py +5 -0
- rasa/utils/tensorflow/feature_array.py +366 -0
- rasa/utils/tensorflow/layers.py +1565 -0
- rasa/utils/tensorflow/layers_utils.py +113 -0
- rasa/utils/tensorflow/metrics.py +281 -0
- rasa/utils/tensorflow/model_data.py +798 -0
- rasa/utils/tensorflow/model_data_utils.py +499 -0
- rasa/utils/tensorflow/models.py +935 -0
- rasa/utils/tensorflow/rasa_layers.py +1094 -0
- rasa/utils/tensorflow/transformer.py +640 -0
- rasa/utils/tensorflow/types.py +6 -0
- rasa/utils/train_utils.py +572 -0
- rasa/utils/url_tools.py +53 -0
- rasa/utils/yaml.py +54 -0
- rasa/validator.py +1337 -0
- rasa/version.py +3 -0
- rasa_pro-3.9.18.dist-info/METADATA +563 -0
- rasa_pro-3.9.18.dist-info/NOTICE +5 -0
- rasa_pro-3.9.18.dist-info/RECORD +662 -0
- rasa_pro-3.9.18.dist-info/WHEEL +4 -0
- rasa_pro-3.9.18.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import re
|
|
5
|
+
from typing import Any, Dict, List, Optional, Text, Tuple, Type
|
|
6
|
+
|
|
7
|
+
import numpy as np
|
|
8
|
+
import scipy.sparse
|
|
9
|
+
|
|
10
|
+
from rasa.nlu.tokenizers.tokenizer import Tokenizer
|
|
11
|
+
import rasa.shared.utils.io
|
|
12
|
+
import rasa.utils.io
|
|
13
|
+
import rasa.nlu.utils.pattern_utils as pattern_utils
|
|
14
|
+
from rasa.engine.graph import ExecutionContext, GraphComponent
|
|
15
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
16
|
+
from rasa.engine.storage.resource import Resource
|
|
17
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
18
|
+
from rasa.nlu.constants import TOKENS_NAMES
|
|
19
|
+
from rasa.nlu.featurizers.sparse_featurizer.sparse_featurizer import SparseFeaturizer
|
|
20
|
+
from rasa.shared.nlu.constants import TEXT, RESPONSE, ACTION_TEXT
|
|
21
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
22
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
23
|
+
|
|
24
|
+
logger = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@DefaultV1Recipe.register(
|
|
28
|
+
DefaultV1Recipe.ComponentType.MESSAGE_FEATURIZER, is_trainable=True
|
|
29
|
+
)
|
|
30
|
+
class RegexFeaturizer(SparseFeaturizer, GraphComponent):
|
|
31
|
+
"""Adds message features based on regex expressions."""
|
|
32
|
+
|
|
33
|
+
@classmethod
|
|
34
|
+
def required_components(cls) -> List[Type]:
|
|
35
|
+
"""Components that should be included in the pipeline before this component."""
|
|
36
|
+
return [Tokenizer]
|
|
37
|
+
|
|
38
|
+
@staticmethod
|
|
39
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
40
|
+
"""Returns the component's default config."""
|
|
41
|
+
return {
|
|
42
|
+
**SparseFeaturizer.get_default_config(),
|
|
43
|
+
# text will be processed with case sensitive as default
|
|
44
|
+
"case_sensitive": True,
|
|
45
|
+
# use lookup tables to generate features
|
|
46
|
+
"use_lookup_tables": True,
|
|
47
|
+
# use regexes to generate features
|
|
48
|
+
"use_regexes": True,
|
|
49
|
+
# use match word boundaries for lookup table
|
|
50
|
+
"use_word_boundaries": True,
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
def __init__(
|
|
54
|
+
self,
|
|
55
|
+
config: Dict[Text, Any],
|
|
56
|
+
model_storage: ModelStorage,
|
|
57
|
+
resource: Resource,
|
|
58
|
+
execution_context: ExecutionContext,
|
|
59
|
+
known_patterns: Optional[List[Dict[Text, Text]]] = None,
|
|
60
|
+
) -> None:
|
|
61
|
+
"""Constructs new features for regexes and lookup table using regex expressions.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
config: Configuration for the component.
|
|
65
|
+
model_storage: Storage which graph components can use to persist and load
|
|
66
|
+
themselves.
|
|
67
|
+
resource: Resource locator for this component which can be used to persist
|
|
68
|
+
and load itself from the `model_storage`.
|
|
69
|
+
execution_context: Information about the current graph run.
|
|
70
|
+
known_patterns: Regex Patterns the component should pre-load itself with.
|
|
71
|
+
"""
|
|
72
|
+
super().__init__(execution_context.node_name, config)
|
|
73
|
+
|
|
74
|
+
self._model_storage = model_storage
|
|
75
|
+
self._resource = resource
|
|
76
|
+
|
|
77
|
+
self.known_patterns = known_patterns if known_patterns else []
|
|
78
|
+
self.case_sensitive = config["case_sensitive"]
|
|
79
|
+
self.finetune_mode = execution_context.is_finetuning
|
|
80
|
+
|
|
81
|
+
@classmethod
|
|
82
|
+
def create(
|
|
83
|
+
cls,
|
|
84
|
+
config: Dict[Text, Any],
|
|
85
|
+
model_storage: ModelStorage,
|
|
86
|
+
resource: Resource,
|
|
87
|
+
execution_context: ExecutionContext,
|
|
88
|
+
) -> RegexFeaturizer:
|
|
89
|
+
"""Creates a new untrained component (see parent class for full docstring)."""
|
|
90
|
+
return cls(config, model_storage, resource, execution_context)
|
|
91
|
+
|
|
92
|
+
def _merge_new_patterns(self, new_patterns: List[Dict[Text, Text]]) -> None:
|
|
93
|
+
"""Updates already known patterns with new patterns extracted from data.
|
|
94
|
+
|
|
95
|
+
New patterns should always be added to the end of the existing
|
|
96
|
+
patterns and the order of the existing patterns should not be disturbed.
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
new_patterns: Patterns extracted from training data and to be merged with
|
|
100
|
+
known patterns.
|
|
101
|
+
"""
|
|
102
|
+
pattern_name_index_map = {
|
|
103
|
+
pattern["name"]: index for index, pattern in enumerate(self.known_patterns)
|
|
104
|
+
}
|
|
105
|
+
for extra_pattern in new_patterns:
|
|
106
|
+
new_pattern_name = extra_pattern["name"]
|
|
107
|
+
|
|
108
|
+
# Some patterns may have just new examples added
|
|
109
|
+
# to them. These do not count as additional pattern.
|
|
110
|
+
if new_pattern_name in pattern_name_index_map:
|
|
111
|
+
self.known_patterns[pattern_name_index_map[new_pattern_name]][
|
|
112
|
+
"pattern"
|
|
113
|
+
] = extra_pattern["pattern"]
|
|
114
|
+
else:
|
|
115
|
+
self.known_patterns.append(extra_pattern)
|
|
116
|
+
|
|
117
|
+
def train(self, training_data: TrainingData) -> Resource:
|
|
118
|
+
"""Trains the component with all patterns extracted from training data."""
|
|
119
|
+
patterns_from_data = pattern_utils.extract_patterns(
|
|
120
|
+
training_data,
|
|
121
|
+
use_lookup_tables=self._config["use_lookup_tables"],
|
|
122
|
+
use_regexes=self._config["use_regexes"],
|
|
123
|
+
use_word_boundaries=self._config["use_word_boundaries"],
|
|
124
|
+
)
|
|
125
|
+
if self.finetune_mode:
|
|
126
|
+
# Merge patterns extracted from data with known patterns
|
|
127
|
+
self._merge_new_patterns(patterns_from_data)
|
|
128
|
+
else:
|
|
129
|
+
self.known_patterns = patterns_from_data
|
|
130
|
+
|
|
131
|
+
self._persist()
|
|
132
|
+
return self._resource
|
|
133
|
+
|
|
134
|
+
def process_training_data(self, training_data: TrainingData) -> TrainingData:
|
|
135
|
+
"""Processes the training examples (see parent class for full docstring)."""
|
|
136
|
+
for example in training_data.training_examples:
|
|
137
|
+
for attribute in [TEXT, RESPONSE, ACTION_TEXT]:
|
|
138
|
+
self._text_features_with_regex(example, attribute)
|
|
139
|
+
|
|
140
|
+
return training_data
|
|
141
|
+
|
|
142
|
+
def process(self, messages: List[Message]) -> List[Message]:
|
|
143
|
+
"""Featurizes all given messages in-place.
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
the given list of messages which have been modified in-place
|
|
147
|
+
"""
|
|
148
|
+
for message in messages:
|
|
149
|
+
self._text_features_with_regex(message, TEXT)
|
|
150
|
+
|
|
151
|
+
return messages
|
|
152
|
+
|
|
153
|
+
def _text_features_with_regex(self, message: Message, attribute: Text) -> None:
|
|
154
|
+
"""Helper method to extract features and set them appropriately in the message.
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
message: Message to be featurized.
|
|
158
|
+
attribute: Attribute of message to be featurized.
|
|
159
|
+
"""
|
|
160
|
+
if self.known_patterns:
|
|
161
|
+
sequence_features, sentence_features = self._features_for_patterns(
|
|
162
|
+
message, attribute
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
self.add_features_to_message(
|
|
166
|
+
sequence_features, sentence_features, attribute, message
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
def _features_for_patterns(
|
|
170
|
+
self, message: Message, attribute: Text
|
|
171
|
+
) -> Tuple[Optional[scipy.sparse.coo_matrix], Optional[scipy.sparse.coo_matrix]]:
|
|
172
|
+
"""Checks which known patterns match the message.
|
|
173
|
+
|
|
174
|
+
Given a sentence, returns a vector of {1,0} values indicating which
|
|
175
|
+
regexes did match. Furthermore, if the
|
|
176
|
+
message is tokenized, the function will mark all tokens with a dict
|
|
177
|
+
relating the name of the regex to whether it was matched.
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
message: Message to be featurized.
|
|
181
|
+
attribute: Attribute of message to be featurized.
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
Token and sentence level features of message attribute.
|
|
185
|
+
"""
|
|
186
|
+
# Attribute not set (e.g. response not present)
|
|
187
|
+
if not message.get(attribute):
|
|
188
|
+
return None, None
|
|
189
|
+
|
|
190
|
+
tokens = message.get(TOKENS_NAMES[attribute], [])
|
|
191
|
+
|
|
192
|
+
if not tokens:
|
|
193
|
+
# nothing to featurize
|
|
194
|
+
return None, None
|
|
195
|
+
|
|
196
|
+
flags = 0 # default flag
|
|
197
|
+
if not self.case_sensitive:
|
|
198
|
+
flags = re.IGNORECASE
|
|
199
|
+
|
|
200
|
+
sequence_length = len(tokens)
|
|
201
|
+
|
|
202
|
+
num_patterns = len(self.known_patterns)
|
|
203
|
+
|
|
204
|
+
sequence_features = np.zeros([sequence_length, num_patterns])
|
|
205
|
+
sentence_features = np.zeros([1, num_patterns])
|
|
206
|
+
|
|
207
|
+
for pattern_index, pattern in enumerate(self.known_patterns):
|
|
208
|
+
matches = list(
|
|
209
|
+
re.finditer(pattern["pattern"], message.get(attribute), flags=flags)
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
for token_index, t in enumerate(tokens):
|
|
213
|
+
patterns = t.get("pattern", default={})
|
|
214
|
+
patterns[pattern["name"]] = False
|
|
215
|
+
|
|
216
|
+
for match in matches:
|
|
217
|
+
if t.start < match.end() and t.end > match.start():
|
|
218
|
+
patterns[pattern["name"]] = True
|
|
219
|
+
sequence_features[token_index][pattern_index] = 1.0
|
|
220
|
+
if attribute in [RESPONSE, TEXT, ACTION_TEXT]:
|
|
221
|
+
# sentence vector should contain all patterns
|
|
222
|
+
sentence_features[0][pattern_index] = 1.0
|
|
223
|
+
|
|
224
|
+
t.set("pattern", patterns)
|
|
225
|
+
|
|
226
|
+
return (
|
|
227
|
+
scipy.sparse.coo_matrix(sequence_features),
|
|
228
|
+
scipy.sparse.coo_matrix(sentence_features),
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
@classmethod
|
|
232
|
+
def load(
|
|
233
|
+
cls,
|
|
234
|
+
config: Dict[Text, Any],
|
|
235
|
+
model_storage: ModelStorage,
|
|
236
|
+
resource: Resource,
|
|
237
|
+
execution_context: ExecutionContext,
|
|
238
|
+
**kwargs: Any,
|
|
239
|
+
) -> RegexFeaturizer:
|
|
240
|
+
"""Loads trained component (see parent class for full docstring)."""
|
|
241
|
+
known_patterns = None
|
|
242
|
+
|
|
243
|
+
try:
|
|
244
|
+
with model_storage.read_from(resource) as model_dir:
|
|
245
|
+
patterns_file_name = model_dir / "patterns.json"
|
|
246
|
+
known_patterns = rasa.shared.utils.io.read_json_file(patterns_file_name)
|
|
247
|
+
except (ValueError, FileNotFoundError):
|
|
248
|
+
logger.warning(
|
|
249
|
+
f"Failed to load `{cls.__class__.__name__}` from model storage. "
|
|
250
|
+
f"Resource '{resource.name}' doesn't exist."
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
return cls(
|
|
254
|
+
config,
|
|
255
|
+
model_storage,
|
|
256
|
+
resource,
|
|
257
|
+
execution_context,
|
|
258
|
+
known_patterns=known_patterns,
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
def _persist(self) -> None:
|
|
262
|
+
with self._model_storage.write_to(self._resource) as model_dir:
|
|
263
|
+
regex_file = model_dir / "patterns.json"
|
|
264
|
+
rasa.shared.utils.io.dump_obj_as_json_to_file(
|
|
265
|
+
regex_file, self.known_patterns
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
@classmethod
|
|
269
|
+
def validate_config(cls, config: Dict[Text, Any]) -> None:
|
|
270
|
+
"""Validates that the component is configured properly."""
|
|
271
|
+
pass
|
rasa/nlu/model.py
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Text
|
|
3
|
+
|
|
4
|
+
from rasa.shared.exceptions import RasaException
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# TODO: remove/move
|
|
11
|
+
class InvalidModelError(RasaException):
|
|
12
|
+
"""Raised when a model failed to load.
|
|
13
|
+
|
|
14
|
+
Attributes:
|
|
15
|
+
message -- explanation of why the model is invalid
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def __init__(self, message: Text) -> None:
|
|
19
|
+
"""Initialize message attribute."""
|
|
20
|
+
self.message = message
|
|
21
|
+
super(InvalidModelError, self).__init__(message)
|
|
22
|
+
|
|
23
|
+
def __str__(self) -> Text:
|
|
24
|
+
return self.message
|
rasa/nlu/persistor.py
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
import structlog
|
|
3
|
+
import os
|
|
4
|
+
import shutil
|
|
5
|
+
from typing import Optional, Text, Tuple, TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
from rasa.shared.exceptions import RasaException
|
|
8
|
+
|
|
9
|
+
import rasa.shared.utils.common
|
|
10
|
+
import rasa.utils.common
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from azure.storage.blob import ContainerClient
|
|
14
|
+
|
|
15
|
+
structlogger = structlog.get_logger()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def get_persistor(name: Text) -> Optional["Persistor"]:
|
|
19
|
+
"""Returns an instance of the requested persistor.
|
|
20
|
+
|
|
21
|
+
Currently, `aws`, `gcs`, `azure` and providing module paths are supported remote
|
|
22
|
+
storages.
|
|
23
|
+
"""
|
|
24
|
+
if name == "aws":
|
|
25
|
+
return AWSPersistor(
|
|
26
|
+
os.environ.get("BUCKET_NAME"), os.environ.get("AWS_ENDPOINT_URL")
|
|
27
|
+
)
|
|
28
|
+
if name == "gcs":
|
|
29
|
+
return GCSPersistor(os.environ.get("BUCKET_NAME"))
|
|
30
|
+
|
|
31
|
+
if name == "azure":
|
|
32
|
+
return AzurePersistor(
|
|
33
|
+
os.environ.get("AZURE_CONTAINER"),
|
|
34
|
+
os.environ.get("AZURE_ACCOUNT_NAME"),
|
|
35
|
+
os.environ.get("AZURE_ACCOUNT_KEY"),
|
|
36
|
+
)
|
|
37
|
+
if name:
|
|
38
|
+
try:
|
|
39
|
+
persistor = rasa.shared.utils.common.class_from_module_path(name)
|
|
40
|
+
return persistor()
|
|
41
|
+
except ImportError:
|
|
42
|
+
raise ImportError(
|
|
43
|
+
f"Unknown model persistor {name}. Please make sure to "
|
|
44
|
+
"either use an included model persistor (`aws`, `gcs` "
|
|
45
|
+
"or `azure`) or specify the module path to an external "
|
|
46
|
+
"model persistor."
|
|
47
|
+
)
|
|
48
|
+
return None
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class Persistor(abc.ABC):
|
|
52
|
+
"""Store models in cloud and fetch them when needed."""
|
|
53
|
+
|
|
54
|
+
def persist(self, model_directory: Text, model_name: Text) -> None:
|
|
55
|
+
"""Uploads a model persisted in the `target_dir` to cloud storage."""
|
|
56
|
+
if not os.path.isdir(model_directory):
|
|
57
|
+
raise ValueError(f"Target directory '{model_directory}' not found.")
|
|
58
|
+
|
|
59
|
+
file_key, tar_path = self._compress(model_directory, model_name)
|
|
60
|
+
self._persist_tar(file_key, tar_path)
|
|
61
|
+
|
|
62
|
+
def retrieve(self, model_name: Text, target_path: Text) -> None:
|
|
63
|
+
"""Downloads a model that has been persisted to cloud storage."""
|
|
64
|
+
tar_name = model_name
|
|
65
|
+
|
|
66
|
+
if not model_name.endswith("tar.gz"):
|
|
67
|
+
# ensure backward compatibility
|
|
68
|
+
tar_name = self._tar_name(model_name)
|
|
69
|
+
|
|
70
|
+
self._retrieve_tar(tar_name)
|
|
71
|
+
self._copy(os.path.basename(tar_name), target_path)
|
|
72
|
+
|
|
73
|
+
@abc.abstractmethod
|
|
74
|
+
def _retrieve_tar(self, filename: Text) -> None:
|
|
75
|
+
"""Downloads a model previously persisted to cloud storage."""
|
|
76
|
+
raise NotImplementedError
|
|
77
|
+
|
|
78
|
+
@abc.abstractmethod
|
|
79
|
+
def _persist_tar(self, filekey: Text, tarname: Text) -> None:
|
|
80
|
+
"""Uploads a model persisted in the `target_dir` to cloud storage."""
|
|
81
|
+
raise NotImplementedError
|
|
82
|
+
|
|
83
|
+
def _compress(self, model_directory: Text, model_name: Text) -> Tuple[Text, Text]:
|
|
84
|
+
"""Creates a compressed archive and returns key and tar."""
|
|
85
|
+
import tempfile
|
|
86
|
+
|
|
87
|
+
dirpath = tempfile.mkdtemp()
|
|
88
|
+
base_name = self._tar_name(model_name, include_extension=False)
|
|
89
|
+
tar_name = shutil.make_archive(
|
|
90
|
+
os.path.join(dirpath, base_name),
|
|
91
|
+
"gztar",
|
|
92
|
+
root_dir=model_directory,
|
|
93
|
+
base_dir=".",
|
|
94
|
+
)
|
|
95
|
+
file_key = os.path.basename(tar_name)
|
|
96
|
+
return file_key, tar_name
|
|
97
|
+
|
|
98
|
+
@staticmethod
|
|
99
|
+
def _tar_name(model_name: Text, include_extension: bool = True) -> Text:
|
|
100
|
+
ext = ".tar.gz" if include_extension else ""
|
|
101
|
+
return f"{model_name}{ext}"
|
|
102
|
+
|
|
103
|
+
@staticmethod
|
|
104
|
+
def _copy(compressed_path: Text, target_path: Text) -> None:
|
|
105
|
+
shutil.copy2(compressed_path, target_path)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class AWSPersistor(Persistor):
|
|
109
|
+
"""Store models on S3.
|
|
110
|
+
|
|
111
|
+
Fetches them when needed, instead of storing them on the local disk.
|
|
112
|
+
"""
|
|
113
|
+
|
|
114
|
+
def __init__(
|
|
115
|
+
self,
|
|
116
|
+
bucket_name: Text,
|
|
117
|
+
endpoint_url: Optional[Text] = None,
|
|
118
|
+
region_name: Optional[Text] = None,
|
|
119
|
+
) -> None:
|
|
120
|
+
import boto3
|
|
121
|
+
|
|
122
|
+
super().__init__()
|
|
123
|
+
self.s3 = boto3.resource(
|
|
124
|
+
"s3", endpoint_url=endpoint_url, region_name=region_name
|
|
125
|
+
)
|
|
126
|
+
self._ensure_bucket_exists(bucket_name, region_name)
|
|
127
|
+
self.bucket_name = bucket_name
|
|
128
|
+
self.bucket = self.s3.Bucket(bucket_name)
|
|
129
|
+
|
|
130
|
+
def _ensure_bucket_exists(
|
|
131
|
+
self, bucket_name: Text, region_name: Optional[Text] = None
|
|
132
|
+
) -> None:
|
|
133
|
+
import botocore
|
|
134
|
+
|
|
135
|
+
# noinspection PyUnresolvedReferences
|
|
136
|
+
try:
|
|
137
|
+
self.s3.meta.client.head_bucket(Bucket=bucket_name)
|
|
138
|
+
except botocore.exceptions.ClientError as e:
|
|
139
|
+
error_code = int(e.response["Error"]["Code"])
|
|
140
|
+
if error_code == 403:
|
|
141
|
+
log = (
|
|
142
|
+
f"Access to the specified bucket '{bucket_name}' is forbidden. "
|
|
143
|
+
"Please make sure you have the necessary "
|
|
144
|
+
"permission to access the bucket."
|
|
145
|
+
)
|
|
146
|
+
structlogger.error(
|
|
147
|
+
"aws_persistor.ensure_bucket_exists.bucket_access_forbidden",
|
|
148
|
+
bucket_name=bucket_name,
|
|
149
|
+
event_info=log,
|
|
150
|
+
)
|
|
151
|
+
raise RasaException(log)
|
|
152
|
+
elif error_code == 404:
|
|
153
|
+
log = (
|
|
154
|
+
f"The specified bucket '{bucket_name}' does not exist. "
|
|
155
|
+
"Please make sure to create the bucket first."
|
|
156
|
+
)
|
|
157
|
+
structlogger.error(
|
|
158
|
+
"aws_persistor.ensure_bucket_exists.bucket_not_found",
|
|
159
|
+
bucket_name=bucket_name,
|
|
160
|
+
event_info=log,
|
|
161
|
+
)
|
|
162
|
+
raise RasaException(log)
|
|
163
|
+
|
|
164
|
+
def _persist_tar(self, file_key: Text, tar_path: Text) -> None:
|
|
165
|
+
"""Uploads a model persisted in the `target_dir` to s3."""
|
|
166
|
+
with open(tar_path, "rb") as f:
|
|
167
|
+
self.s3.Object(self.bucket_name, file_key).put(Body=f)
|
|
168
|
+
|
|
169
|
+
def _retrieve_tar(self, model_path: Text) -> None:
|
|
170
|
+
"""Downloads a model that has previously been persisted to s3."""
|
|
171
|
+
tar_name = os.path.basename(model_path)
|
|
172
|
+
with open(tar_name, "wb") as f:
|
|
173
|
+
self.bucket.download_fileobj(model_path, f)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class GCSPersistor(Persistor):
|
|
177
|
+
"""Store models on Google Cloud Storage.
|
|
178
|
+
|
|
179
|
+
Fetches them when needed, instead of storing them on the local disk.
|
|
180
|
+
"""
|
|
181
|
+
|
|
182
|
+
def __init__(self, bucket_name: Text) -> None:
|
|
183
|
+
"""Initialise class with client and bucket."""
|
|
184
|
+
# there are no type hints in this repo for now
|
|
185
|
+
# https://github.com/googleapis/python-storage/issues/393
|
|
186
|
+
from google.cloud import storage # type: ignore[attr-defined]
|
|
187
|
+
|
|
188
|
+
super().__init__()
|
|
189
|
+
|
|
190
|
+
self.storage_client = storage.Client()
|
|
191
|
+
self._ensure_bucket_exists(bucket_name)
|
|
192
|
+
|
|
193
|
+
self.bucket_name = bucket_name
|
|
194
|
+
self.bucket = self.storage_client.bucket(bucket_name)
|
|
195
|
+
|
|
196
|
+
def _ensure_bucket_exists(self, bucket_name: Text) -> None:
|
|
197
|
+
from google.cloud import exceptions
|
|
198
|
+
|
|
199
|
+
try:
|
|
200
|
+
self.storage_client.get_bucket(bucket_name)
|
|
201
|
+
except exceptions.NotFound:
|
|
202
|
+
log = (
|
|
203
|
+
f"The specified bucket '{bucket_name}' does not exist. "
|
|
204
|
+
"Please make sure to create the bucket first."
|
|
205
|
+
)
|
|
206
|
+
structlogger.error(
|
|
207
|
+
"gcp_persistor.ensure_bucket_exists.bucket_not_found",
|
|
208
|
+
bucket_name=bucket_name,
|
|
209
|
+
event_info=log,
|
|
210
|
+
)
|
|
211
|
+
raise RasaException(log)
|
|
212
|
+
except exceptions.Forbidden:
|
|
213
|
+
log = (
|
|
214
|
+
f"Access to the specified bucket '{bucket_name}' is forbidden. "
|
|
215
|
+
"Please make sure you have the necessary "
|
|
216
|
+
"permission to access the bucket. "
|
|
217
|
+
)
|
|
218
|
+
structlogger.error(
|
|
219
|
+
"gcp_persistor.ensure_bucket_exists.bucket_access_forbidden",
|
|
220
|
+
bucket_name=bucket_name,
|
|
221
|
+
event_info=log,
|
|
222
|
+
)
|
|
223
|
+
raise RasaException(log)
|
|
224
|
+
|
|
225
|
+
def _persist_tar(self, file_key: Text, tar_path: Text) -> None:
|
|
226
|
+
"""Uploads a model persisted in the `target_dir` to GCS."""
|
|
227
|
+
blob = self.bucket.blob(file_key)
|
|
228
|
+
blob.upload_from_filename(tar_path)
|
|
229
|
+
|
|
230
|
+
def _retrieve_tar(self, target_filename: Text) -> None:
|
|
231
|
+
"""Downloads a model that has previously been persisted to GCS."""
|
|
232
|
+
blob = self.bucket.blob(target_filename)
|
|
233
|
+
blob.download_to_filename(target_filename)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
class AzurePersistor(Persistor):
|
|
237
|
+
"""Store models on Azure."""
|
|
238
|
+
|
|
239
|
+
def __init__(
|
|
240
|
+
self, azure_container: Text, azure_account_name: Text, azure_account_key: Text
|
|
241
|
+
) -> None:
|
|
242
|
+
from azure.storage.blob import BlobServiceClient
|
|
243
|
+
|
|
244
|
+
super().__init__()
|
|
245
|
+
|
|
246
|
+
self.blob_service = BlobServiceClient(
|
|
247
|
+
account_url=f"https://{azure_account_name}.blob.core.windows.net/",
|
|
248
|
+
credential=azure_account_key,
|
|
249
|
+
)
|
|
250
|
+
self.container_name = azure_container
|
|
251
|
+
self._ensure_container_exists()
|
|
252
|
+
|
|
253
|
+
def _ensure_container_exists(self) -> None:
|
|
254
|
+
if self._container_client().exists():
|
|
255
|
+
pass
|
|
256
|
+
else:
|
|
257
|
+
log = (
|
|
258
|
+
f"The specified container '{self.container_name}' does not exist."
|
|
259
|
+
"Please make sure to create the container first."
|
|
260
|
+
)
|
|
261
|
+
structlogger.error(
|
|
262
|
+
"azure_persistor.ensure_container_exists.container_not_found",
|
|
263
|
+
container_name=self.container_name,
|
|
264
|
+
event_info=log,
|
|
265
|
+
)
|
|
266
|
+
raise RasaException(log)
|
|
267
|
+
|
|
268
|
+
def _container_client(self) -> "ContainerClient":
|
|
269
|
+
return self.blob_service.get_container_client(self.container_name)
|
|
270
|
+
|
|
271
|
+
def _persist_tar(self, file_key: Text, tar_path: Text) -> None:
|
|
272
|
+
"""Uploads a model persisted in the `target_dir` to Azure."""
|
|
273
|
+
with open(tar_path, "rb") as data:
|
|
274
|
+
self._container_client().upload_blob(name=file_key, data=data)
|
|
275
|
+
|
|
276
|
+
def _retrieve_tar(self, target_filename: Text) -> None:
|
|
277
|
+
"""Downloads a model that has previously been persisted to Azure."""
|
|
278
|
+
blob_client = self._container_client().get_blob_client(target_filename)
|
|
279
|
+
|
|
280
|
+
with open(target_filename, "wb") as blob:
|
|
281
|
+
download_stream = blob_client.download_blob()
|
|
282
|
+
blob.write(download_stream.readall())
|
rasa/nlu/run.py
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Text
|
|
4
|
+
|
|
5
|
+
from rasa.core.agent import Agent
|
|
6
|
+
from rasa.shared.utils.cli import print_info, print_success
|
|
7
|
+
from rasa.shared.utils.io import json_to_string
|
|
8
|
+
|
|
9
|
+
logger = logging.getLogger(__name__)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def run_cmdline(model_path: Text) -> None:
|
|
13
|
+
"""Loops over CLI input, passing each message to a loaded NLU model."""
|
|
14
|
+
agent = Agent.load(model_path)
|
|
15
|
+
|
|
16
|
+
print_success("NLU model loaded. Type a message and press enter to parse it.")
|
|
17
|
+
while True:
|
|
18
|
+
print_success("Next message:")
|
|
19
|
+
try:
|
|
20
|
+
message = input().strip()
|
|
21
|
+
except (EOFError, KeyboardInterrupt):
|
|
22
|
+
print_info("Wrapping up command line chat...")
|
|
23
|
+
break
|
|
24
|
+
|
|
25
|
+
result = asyncio.run(agent.parse_message(message))
|
|
26
|
+
|
|
27
|
+
print(json_to_string(result))
|
|
File without changes
|