rasa-pro 3.8.16__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 +380 -0
- rasa/__init__.py +10 -0
- rasa/__main__.py +151 -0
- rasa/anonymization/__init__.py +2 -0
- rasa/anonymization/anonymisation_rule_yaml_reader.py +91 -0
- rasa/anonymization/anonymization_pipeline.py +287 -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 +117 -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 +566 -0
- rasa/cli/evaluate.py +222 -0
- rasa/cli/export.py +251 -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 +33 -0
- rasa/cli/project_templates/calm/domain/list_contacts.yml +14 -0
- rasa/cli/project_templates/calm/domain/remove_contact.yml +31 -0
- rasa/cli/project_templates/calm/domain/shared.yml +5 -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/domain.yml +17 -0
- rasa/cli/project_templates/tutorial/endpoints.yml +45 -0
- rasa/cli/run.py +136 -0
- rasa/cli/scaffold.py +268 -0
- rasa/cli/shell.py +141 -0
- rasa/cli/studio/__init__.py +0 -0
- rasa/cli/studio/download.py +51 -0
- rasa/cli/studio/studio.py +110 -0
- rasa/cli/studio/train.py +59 -0
- rasa/cli/studio/upload.py +85 -0
- rasa/cli/telemetry.py +90 -0
- rasa/cli/test.py +280 -0
- rasa/cli/train.py +260 -0
- rasa/cli/utils.py +453 -0
- rasa/cli/visualize.py +40 -0
- rasa/cli/x.py +205 -0
- rasa/constants.py +37 -0
- rasa/core/__init__.py +17 -0
- rasa/core/actions/__init__.py +0 -0
- rasa/core/actions/action.py +1450 -0
- rasa/core/actions/action_clean_stack.py +59 -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 +2 -0
- rasa/core/actions/forms.py +737 -0
- rasa/core/actions/loops.py +111 -0
- rasa/core/actions/two_stage_fallback.py +186 -0
- rasa/core/agent.py +557 -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 +387 -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 +339 -0
- rasa/core/channels/callback.py +85 -0
- rasa/core/channels/channel.py +419 -0
- rasa/core/channels/console.py +243 -0
- rasa/core/channels/development_inspector.py +93 -0
- rasa/core/channels/facebook.py +422 -0
- rasa/core/channels/hangouts.py +335 -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-5623b6dc.js +1 -0
- rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
- rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-685c106a.js +10 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-8cbed007.js +2 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-5889cf12.js +2 -0
- rasa/core/channels/inspector/dist/assets/createText-62fc7601-24c249d7.js +7 -0
- rasa/core/channels/inspector/dist/assets/edges-f2ad444c-7dd06a75.js +4 -0
- rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-62c1e54c.js +51 -0
- rasa/core/channels/inspector/dist/assets/flowDb-1972c806-ce49b86f.js +6 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-4067e48f.js +4 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-85583a23.js +1 -0
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-59fe4051.js +139 -0
- rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-47e3a43b.js +266 -0
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-5a2ac0d9.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-268a75c0.js +1040 -0
- rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-dfb8efc4.js +1 -0
- rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
- rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-b0c470f2.js +7 -0
- rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
- rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-2edb829a.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-b6873d69.js +1 -0
- rasa/core/channels/inspector/dist/assets/line-1efc5781.js +1 -0
- rasa/core/channels/inspector/dist/assets/linear-661e9b94.js +1 -0
- rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-2d2e727f.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-9d3ea93d.js +35 -0
- rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-06a178a2.js +7 -0
- rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-0bfedffc.js +52 -0
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-d76d0a04.js +8 -0
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-37bb4341.js +122 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-f52f7f57.js +1 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-4a986a20.js +1 -0
- rasa/core/channels/inspector/dist/assets/styles-080da4f6-7dd9ae12.js +110 -0
- rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-46e1ca14.js +159 -0
- rasa/core/channels/inspector/dist/assets/styles-9c745c82-4a97439a.js +207 -0
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-823917a3.js +1 -0
- rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-9ea72896.js +61 -0
- rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-b631a8b6.js +7 -0
- rasa/core/channels/inspector/dist/index.html +39 -0
- rasa/core/channels/inspector/index.html +37 -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 +97 -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 +385 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +239 -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 +210 -0
- rasa/core/channels/rocketchat.py +175 -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 +135 -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 +925 -0
- rasa/core/evaluation/marker_stats.py +294 -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 +402 -0
- rasa/core/featurizers/tracker_featurizers.py +1172 -0
- rasa/core/http_interpreter.py +89 -0
- rasa/core/information_retrieval/__init__.py +0 -0
- rasa/core/information_retrieval/faiss.py +116 -0
- rasa/core/information_retrieval/information_retrieval.py +72 -0
- rasa/core/information_retrieval/milvus.py +59 -0
- rasa/core/information_retrieval/qdrant.py +102 -0
- rasa/core/jobs.py +63 -0
- rasa/core/lock.py +139 -0
- rasa/core/lock_store.py +344 -0
- rasa/core/migrate.py +404 -0
- rasa/core/nlg/__init__.py +3 -0
- rasa/core/nlg/callback.py +147 -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 +717 -0
- rasa/core/policies/enterprise_search_prompt_template.jinja2 +62 -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 +582 -0
- rasa/core/policies/flows/flow_step_result.py +43 -0
- rasa/core/policies/intentless_policy.py +924 -0
- rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
- rasa/core/policies/memoization.py +538 -0
- rasa/core/policies/policy.py +716 -0
- rasa/core/policies/rule_policy.py +1276 -0
- rasa/core/policies/ted_policy.py +2146 -0
- rasa/core/policies/unexpected_intent_policy.py +1015 -0
- rasa/core/processor.py +1331 -0
- rasa/core/run.py +315 -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 +576 -0
- rasa/core/test.py +1337 -0
- rasa/core/tracker_store.py +1664 -0
- rasa/core/train.py +107 -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 +1742 -0
- rasa/core/training/story_conflict.py +381 -0
- rasa/core/training/training.py +93 -0
- rasa/core/utils.py +344 -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 +189 -0
- rasa/dialogue_understanding/coexistence/llm_based_router.py +261 -0
- rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
- rasa/dialogue_understanding/commands/__init__.py +45 -0
- rasa/dialogue_understanding/commands/can_not_handle_command.py +61 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +116 -0
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +48 -0
- rasa/dialogue_understanding/commands/clarify_command.py +77 -0
- rasa/dialogue_understanding/commands/command.py +85 -0
- rasa/dialogue_understanding/commands/correct_slots_command.py +288 -0
- rasa/dialogue_understanding/commands/error_command.py +67 -0
- rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
- rasa/dialogue_understanding/commands/handle_code_change_command.py +64 -0
- rasa/dialogue_understanding/commands/human_handoff_command.py +57 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +48 -0
- rasa/dialogue_understanding/commands/noop_command.py +45 -0
- rasa/dialogue_understanding/commands/set_slot_command.py +125 -0
- rasa/dialogue_understanding/commands/skip_question_command.py +66 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +98 -0
- rasa/dialogue_understanding/generator/__init__.py +6 -0
- rasa/dialogue_understanding/generator/command_generator.py +257 -0
- rasa/dialogue_understanding/generator/command_prompt_template.jinja2 +57 -0
- rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +410 -0
- rasa/dialogue_understanding/generator/llm_command_generator.py +637 -0
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +157 -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 +243 -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 +578 -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 +10 -0
- rasa/e2e_test/e2e_test_case.py +322 -0
- rasa/e2e_test/e2e_test_result.py +34 -0
- rasa/e2e_test/e2e_test_runner.py +659 -0
- rasa/e2e_test/e2e_test_schema.yml +67 -0
- rasa/engine/__init__.py +0 -0
- rasa/engine/caching.py +464 -0
- rasa/engine/constants.py +17 -0
- rasa/engine/exceptions.py +14 -0
- rasa/engine/graph.py +625 -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 +1252 -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 +256 -0
- rasa/engine/runner/interface.py +49 -0
- rasa/engine/storage/__init__.py +0 -0
- rasa/engine/storage/local_model_storage.py +248 -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 +839 -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 +552 -0
- rasa/graph_components/validators/finetuning_validator.py +302 -0
- rasa/hooks.py +113 -0
- rasa/jupyter.py +63 -0
- rasa/keys +1 -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 +535 -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 +1874 -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 +240 -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 +309 -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 +672 -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 +449 -0
- rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +772 -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 +840 -0
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +539 -0
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +269 -0
- rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
- rasa/nlu/model.py +24 -0
- rasa/nlu/persistor.py +240 -0
- rasa/nlu/run.py +27 -0
- rasa/nlu/selectors/__init__.py +0 -0
- rasa/nlu/selectors/response_selector.py +990 -0
- rasa/nlu/test.py +1943 -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 +312 -0
- rasa/plugin.py +90 -0
- rasa/server.py +1536 -0
- rasa/shared/__init__.py +0 -0
- rasa/shared/constants.py +181 -0
- rasa/shared/core/__init__.py +0 -0
- rasa/shared/core/constants.py +168 -0
- rasa/shared/core/conversation.py +46 -0
- rasa/shared/core/domain.py +2106 -0
- rasa/shared/core/events.py +2507 -0
- rasa/shared/core/flows/__init__.py +7 -0
- rasa/shared/core/flows/flow.py +353 -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 +211 -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 +51 -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 +907 -0
- rasa/shared/core/slot_mappings.py +235 -0
- rasa/shared/core/slots.py +647 -0
- rasa/shared/core/trackers.py +1159 -0
- rasa/shared/core/training_data/__init__.py +0 -0
- rasa/shared/core/training_data/loading.py +90 -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 +442 -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 +192 -0
- rasa/shared/engine/__init__.py +0 -0
- rasa/shared/engine/caching.py +26 -0
- rasa/shared/exceptions.py +129 -0
- rasa/shared/importers/__init__.py +0 -0
- rasa/shared/importers/importer.py +705 -0
- rasa/shared/importers/multi_project.py +203 -0
- rasa/shared/importers/rasa.py +100 -0
- rasa/shared/importers/utils.py +34 -0
- rasa/shared/nlu/__init__.py +0 -0
- rasa/shared/nlu/constants.py +45 -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 +209 -0
- rasa/shared/nlu/training_data/features.py +374 -0
- rasa/shared/nlu/training_data/formats/__init__.py +10 -0
- rasa/shared/nlu/training_data/formats/dialogflow.py +162 -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 +605 -0
- rasa/shared/nlu/training_data/formats/readerwriter.py +245 -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 +477 -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 +732 -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 +1 -0
- rasa/shared/utils/io.py +403 -0
- rasa/shared/utils/llm.py +405 -0
- rasa/shared/utils/pykwalify_extensions.py +26 -0
- rasa/shared/utils/schemas/__init__.py +0 -0
- rasa/shared/utils/schemas/config.yml +2 -0
- rasa/shared/utils/schemas/domain.yml +142 -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 +777 -0
- rasa/studio/__init__.py +0 -0
- rasa/studio/auth.py +252 -0
- rasa/studio/config.py +127 -0
- rasa/studio/constants.py +16 -0
- rasa/studio/data_handler.py +352 -0
- rasa/studio/download.py +350 -0
- rasa/studio/train.py +136 -0
- rasa/studio/upload.py +408 -0
- rasa/telemetry.py +1583 -0
- rasa/tracing/__init__.py +0 -0
- rasa/tracing/config.py +338 -0
- rasa/tracing/constants.py +38 -0
- rasa/tracing/instrumentation/__init__.py +0 -0
- rasa/tracing/instrumentation/attribute_extractors.py +663 -0
- rasa/tracing/instrumentation/instrumentation.py +939 -0
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +142 -0
- rasa/tracing/instrumentation/metrics.py +206 -0
- rasa/tracing/metric_instrument_provider.py +125 -0
- rasa/utils/__init__.py +0 -0
- rasa/utils/beta.py +83 -0
- rasa/utils/cli.py +27 -0
- rasa/utils/common.py +635 -0
- rasa/utils/converter.py +53 -0
- rasa/utils/endpoints.py +303 -0
- rasa/utils/io.py +326 -0
- rasa/utils/licensing.py +319 -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/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 +991 -0
- rasa/utils/tensorflow/model_data_utils.py +500 -0
- rasa/utils/tensorflow/models.py +936 -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/yaml.py +54 -0
- rasa/validator.py +1035 -0
- rasa/version.py +3 -0
- rasa_pro-3.8.16.dist-info/METADATA +528 -0
- rasa_pro-3.8.16.dist-info/NOTICE +5 -0
- rasa_pro-3.8.16.dist-info/RECORD +644 -0
- rasa_pro-3.8.16.dist-info/WHEEL +4 -0
- rasa_pro-3.8.16.dist-info/entry_points.txt +3 -0
rasa/utils/licensing.py
ADDED
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import hashlib
|
|
2
|
+
import logging
|
|
3
|
+
import os
|
|
4
|
+
import re
|
|
5
|
+
import time
|
|
6
|
+
import uuid
|
|
7
|
+
from datetime import datetime, timezone
|
|
8
|
+
from typing import Any, Callable, Dict, Optional, Set, Text
|
|
9
|
+
|
|
10
|
+
import jwt
|
|
11
|
+
from dotenv import dotenv_values
|
|
12
|
+
|
|
13
|
+
LICENSE_ENV_VAR = "RASA_PRO_LICENSE"
|
|
14
|
+
ALGORITHM = "RS256"
|
|
15
|
+
# deepcode ignore HardcodedKey: This is a public key - not a security issue.
|
|
16
|
+
PUBLIC_KEY = """-----BEGIN PUBLIC KEY-----
|
|
17
|
+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6L90HBMIeiEUkLw85aRx
|
|
18
|
+
L8qisVwiJwy3E4E/MPKHEuzguUJG3KwQE3Yb37HWi6I8EXOI5UfP2RvbNPKbmYFo
|
|
19
|
+
90P27rKpvhZRCG9sy3cNu3Xr1XcQ6Eue2e12LWBAgzBZSqjzwkCOtt+L6LIm3lPf
|
|
20
|
+
2QYSFORTZR9PtOvI1b677W1lVjioRrbg1IG6UXGVOTCmeSFT/JzbsYzR7QFzFdWe
|
|
21
|
+
ytjHVgeb/R9inY1/LeiP2KCHYcYUF2sGc+6CsGvr9Kkio5KS10jBF27EeBaeVpXO
|
|
22
|
+
JH5viXVuRPCu5ymvnih5Rk4VYK3X3rG1rf5oju9OBDPLq7lKklY1pPZjBHADPU3o
|
|
23
|
+
/QIDAQAB
|
|
24
|
+
-----END PUBLIC KEY-----"""
|
|
25
|
+
|
|
26
|
+
# If a license must be revoked before expiration, add its JTI to this list.
|
|
27
|
+
# Adding to this list requires cutting a new release for the change to affect users.
|
|
28
|
+
# Versions prior to the one including the blocked JTI will still
|
|
29
|
+
# be available to blocked users until the regular expiration date
|
|
30
|
+
JTI_BLOCKLIST: Set[Text] = set([])
|
|
31
|
+
|
|
32
|
+
SCOPE_DELIMITER = ":"
|
|
33
|
+
PRODUCT_AREA = "rasa:pro:plus"
|
|
34
|
+
VOICE_SCOPE = "rasa:voice"
|
|
35
|
+
|
|
36
|
+
logger = logging.getLogger(__name__)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class LicenseValidationException(Exception):
|
|
40
|
+
"""Parent class for exceptions raised when handling licenses."""
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class LicenseSchemaException(LicenseValidationException):
|
|
44
|
+
"""Exception raised when a license does not contain the correct fields."""
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class LicenseScopeException(LicenseValidationException):
|
|
48
|
+
"""Exception raised when a license does not contain the correct scope."""
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class LicenseEncodingException(LicenseValidationException):
|
|
52
|
+
"""Exception raised when the JWT representing a license is not well-formed."""
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class LicenseSignatureInvalidException(LicenseValidationException):
|
|
56
|
+
"""Exception raised when a license signature could not be verified."""
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class LicenseExpiredException(LicenseValidationException):
|
|
60
|
+
"""Exception raised when a license has expired (exp)."""
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class LicenseNotYetValidException(LicenseValidationException):
|
|
64
|
+
"""Exception raised when a license is not valid yet (nbf)."""
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class License:
|
|
68
|
+
"""Represents a Rasa Pro license.
|
|
69
|
+
|
|
70
|
+
There a are two ways of instancing an `License` object:
|
|
71
|
+
- Via `decode`: This is the option that should be used 99% of the times.
|
|
72
|
+
This option allows callers to decode a JWT into an `License`
|
|
73
|
+
object, which means that only correctly signed JWT will be decodable.
|
|
74
|
+
Other checks will be performed on the JWT as well. This implies that any
|
|
75
|
+
`License` obtained via `decode` is guaranteed to represent a
|
|
76
|
+
valid license, that is, a license that was obtained via a
|
|
77
|
+
contract/deal/etc. with Rasa Inc (i.e. the owner of the private key).
|
|
78
|
+
- Via `__init__`: This creates an `License` object directly, without
|
|
79
|
+
performing any validations. Useful only for creating new licenses (which
|
|
80
|
+
requires access to the private key to then encode) or for testing
|
|
81
|
+
purposes.
|
|
82
|
+
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
__slots__ = ["jti", "iat", "nbf", "scope", "exp", "email", "company"]
|
|
86
|
+
|
|
87
|
+
def __init__(
|
|
88
|
+
self,
|
|
89
|
+
*,
|
|
90
|
+
company: Text,
|
|
91
|
+
email: Text,
|
|
92
|
+
exp: int,
|
|
93
|
+
scope: Text,
|
|
94
|
+
jti: Optional[Text] = None,
|
|
95
|
+
iat: Optional[int] = None,
|
|
96
|
+
nbf: Optional[int] = None,
|
|
97
|
+
) -> None:
|
|
98
|
+
"""Initializes an instance of `License`.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
company: Company this license is issued to.
|
|
102
|
+
email: Contact email for this license.
|
|
103
|
+
exp: Expiration date (UNIX epoch time).
|
|
104
|
+
scope: The license scope
|
|
105
|
+
jti: JWT unique identifier - a unique identifier for this
|
|
106
|
+
license. Defaults to a UUID4 if not set.
|
|
107
|
+
iat: Created at (UNIX epoch time).
|
|
108
|
+
Defaults to current time if not set.
|
|
109
|
+
nbf: Time at which the license starts being valid (UNIX epoch time).
|
|
110
|
+
Defaults to current time if not set.
|
|
111
|
+
"""
|
|
112
|
+
self.company = company
|
|
113
|
+
self.email = email
|
|
114
|
+
self.exp = exp
|
|
115
|
+
self.jti = jti or str(uuid.uuid4())
|
|
116
|
+
self.iat = iat or int(time.time())
|
|
117
|
+
self.nbf = nbf or self.iat
|
|
118
|
+
self.scope = scope
|
|
119
|
+
|
|
120
|
+
def as_dict(self) -> Dict[Text, Any]:
|
|
121
|
+
"""Returns this license as a dictionary object.
|
|
122
|
+
|
|
123
|
+
Returns:
|
|
124
|
+
License represented using a `dict`.
|
|
125
|
+
"""
|
|
126
|
+
return {attr: getattr(self, attr) for attr in License.__slots__}
|
|
127
|
+
|
|
128
|
+
def __str__(self) -> Text:
|
|
129
|
+
"""Returns a text representation of this license.
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
String representing this license.
|
|
133
|
+
"""
|
|
134
|
+
return f"License <{self.as_dict()}>"
|
|
135
|
+
|
|
136
|
+
@staticmethod
|
|
137
|
+
def decode(
|
|
138
|
+
encoded_license: Text,
|
|
139
|
+
check_not_before: Optional[bool] = True,
|
|
140
|
+
check_expiration: Optional[bool] = True,
|
|
141
|
+
product_area: Text = PRODUCT_AREA,
|
|
142
|
+
) -> "License":
|
|
143
|
+
"""Returns an instance of `License` from an encoded JWT.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
encoded_license: JWT in encoded form.
|
|
147
|
+
check_not_before: Check if not_before is in the future.
|
|
148
|
+
check_expiration: Check if token has expired.
|
|
149
|
+
product_area: The product scope of the license.
|
|
150
|
+
|
|
151
|
+
Raises:
|
|
152
|
+
LicenseSignatureInvalidException: If the license signature could
|
|
153
|
+
not be validated.
|
|
154
|
+
LicenseNotYetValidException: If the license is not valid yet.
|
|
155
|
+
LicenseExpiredException: If the license has expired, or has been
|
|
156
|
+
blocklisted.
|
|
157
|
+
LicenseEncodingException: If the JWT was not correctly encoded.
|
|
158
|
+
LicenseSchemaException: If the license contains unknown or extra
|
|
159
|
+
fields, or if it is missing fields.
|
|
160
|
+
|
|
161
|
+
Returns:
|
|
162
|
+
A validated enterprise license.
|
|
163
|
+
"""
|
|
164
|
+
try:
|
|
165
|
+
decoded = jwt.decode(
|
|
166
|
+
encoded_license,
|
|
167
|
+
key=PUBLIC_KEY,
|
|
168
|
+
algorithms=[ALGORITHM],
|
|
169
|
+
options={
|
|
170
|
+
"verify_nbf": check_not_before,
|
|
171
|
+
"verify_exp": check_expiration,
|
|
172
|
+
},
|
|
173
|
+
)
|
|
174
|
+
except jwt.exceptions.InvalidSignatureError:
|
|
175
|
+
raise LicenseSignatureInvalidException(
|
|
176
|
+
"Could not verify the license's signature."
|
|
177
|
+
)
|
|
178
|
+
except jwt.exceptions.ImmatureSignatureError:
|
|
179
|
+
raise LicenseNotYetValidException("The license is not valid yet (nbf).")
|
|
180
|
+
except jwt.exceptions.ExpiredSignatureError:
|
|
181
|
+
raise LicenseExpiredException("The license has already expired (exp).")
|
|
182
|
+
except jwt.exceptions.DecodeError:
|
|
183
|
+
# Handle `DecodeError` last since other more specific exceptions
|
|
184
|
+
# such as `InvalidSignatureError` inherit from it.
|
|
185
|
+
raise LicenseEncodingException("Could not decode license as JWT.")
|
|
186
|
+
|
|
187
|
+
if set(decoded.keys()) != set(License.__slots__):
|
|
188
|
+
raise LicenseSchemaException("Invalid license schema.")
|
|
189
|
+
|
|
190
|
+
license_scope = decoded.get("scope", "")
|
|
191
|
+
if not is_valid_license_scope(product_area, license_scope):
|
|
192
|
+
raise LicenseScopeException(
|
|
193
|
+
f"The product scope of your issued license does not "
|
|
194
|
+
f"include {product_area}."
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
if decoded["jti"] in JTI_BLOCKLIST:
|
|
198
|
+
raise LicenseExpiredException("The license has already expired.")
|
|
199
|
+
|
|
200
|
+
return License(**decoded)
|
|
201
|
+
|
|
202
|
+
def encode(self, private_key: Text) -> Text:
|
|
203
|
+
"""Encodes this license into a JWT.
|
|
204
|
+
|
|
205
|
+
NOTE: This method is only useful in the context of testing, or when
|
|
206
|
+
using administrative scripts such as `license.py`. It
|
|
207
|
+
should not be used otherwise.
|
|
208
|
+
|
|
209
|
+
Args:
|
|
210
|
+
private_key: Private key to use. Should correspond to `PUBLIC_KEY`.
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
Encoded license.
|
|
214
|
+
"""
|
|
215
|
+
return jwt.encode(self.as_dict(), key=private_key, algorithm=ALGORITHM)
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def date_as_unix_timestamp(utc_date: Text) -> int:
|
|
219
|
+
"""Returns a date represented as a UNIX timestamp.
|
|
220
|
+
|
|
221
|
+
Args:
|
|
222
|
+
utc_date: Date as text (YYYY-MM-DD), UTC timezone.
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
Date as UNIX timestamp.
|
|
226
|
+
"""
|
|
227
|
+
dt = datetime.strptime(utc_date, "%Y-%m-%d")
|
|
228
|
+
return int(dt.replace(tzinfo=timezone.utc).timestamp())
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def retrieve_license_from_env() -> Text:
|
|
232
|
+
"""Return the license found in the env var."""
|
|
233
|
+
stored_env_values = dotenv_values(".env")
|
|
234
|
+
license_from_env = os.environ.get(LICENSE_ENV_VAR)
|
|
235
|
+
license = license_from_env or stored_env_values.get(LICENSE_ENV_VAR)
|
|
236
|
+
if not license:
|
|
237
|
+
raise SystemExit(
|
|
238
|
+
f"A Rasa Pro license is required. "
|
|
239
|
+
f"Please set the environmental variable "
|
|
240
|
+
f"`{LICENSE_ENV_VAR}` to a valid license string. "
|
|
241
|
+
)
|
|
242
|
+
return license
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def validate_license_from_env(product_area: Text = PRODUCT_AREA) -> None:
|
|
246
|
+
license = retrieve_license_from_env()
|
|
247
|
+
try:
|
|
248
|
+
License.decode(license, product_area=product_area)
|
|
249
|
+
except LicenseValidationException as e:
|
|
250
|
+
logger.error(e)
|
|
251
|
+
raise SystemExit(
|
|
252
|
+
f"Failed to validate Rasa Pro license "
|
|
253
|
+
f"which was read from environmental variable `{LICENSE_ENV_VAR}`. "
|
|
254
|
+
f"Please ensure `{LICENSE_ENV_VAR}` is set to a valid license string. "
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def is_valid_license_scope(product_area: Text, license_scope: Text) -> bool:
|
|
259
|
+
"""Verifies that the license scope matches the rasa-plus product area."""
|
|
260
|
+
required_scopes = derive_scope_hierarchy(product_area)
|
|
261
|
+
licensed_product_areas = derive_scope_hierarchy(license_scope)
|
|
262
|
+
|
|
263
|
+
# update scopes that are required but not present in the license scope
|
|
264
|
+
required_scopes.difference_update(licensed_product_areas)
|
|
265
|
+
|
|
266
|
+
# this is dependent on a format where each product area is separated
|
|
267
|
+
# by whitespace in the license scope field value
|
|
268
|
+
licensed_scopes = license_scope.split()
|
|
269
|
+
|
|
270
|
+
# initialise a variable to count matches of
|
|
271
|
+
# licensed sub product scope pattern found in the required scopes set
|
|
272
|
+
sub_product_scope_match_count = 0
|
|
273
|
+
|
|
274
|
+
for required in required_scopes:
|
|
275
|
+
for licensed in licensed_scopes:
|
|
276
|
+
if re.search(licensed, required) is not None:
|
|
277
|
+
sub_product_scope_match_count += 1
|
|
278
|
+
|
|
279
|
+
return sub_product_scope_match_count == len(required_scopes)
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def derive_scope_hierarchy(scope: Text) -> Set[Text]:
|
|
283
|
+
"""Derives all upper levels of the specified scopes and adds to a resulting set.
|
|
284
|
+
|
|
285
|
+
For example, the `rasa:pro:plus` scope would result in the following set:
|
|
286
|
+
{rasa, rasa:pro, rasa:pro:plus}.
|
|
287
|
+
"""
|
|
288
|
+
product_hierarchy = [area.split(SCOPE_DELIMITER) for area in scope.split()]
|
|
289
|
+
required_scopes = [
|
|
290
|
+
SCOPE_DELIMITER.join(hierarchy[0:end])
|
|
291
|
+
for hierarchy in product_hierarchy
|
|
292
|
+
for end in range(1, len(hierarchy) + 1)
|
|
293
|
+
]
|
|
294
|
+
|
|
295
|
+
return set(required_scopes)
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def property_of_active_license(prop: Callable[[License], str]) -> Optional[str]:
|
|
299
|
+
"""Return a property for this installation based on license.
|
|
300
|
+
|
|
301
|
+
Returns:
|
|
302
|
+
The property of the license if it exists, otherwise None.
|
|
303
|
+
"""
|
|
304
|
+
retrieved_license = os.environ.get(LICENSE_ENV_VAR)
|
|
305
|
+
if not retrieved_license:
|
|
306
|
+
return None
|
|
307
|
+
|
|
308
|
+
try:
|
|
309
|
+
decoded = License.decode(retrieved_license)
|
|
310
|
+
return prop(decoded)
|
|
311
|
+
except LicenseValidationException as e:
|
|
312
|
+
logger.warning("The provided license is invalid.", exc_info=e)
|
|
313
|
+
return None
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def get_license_hash() -> Optional[Text]:
|
|
317
|
+
"""Return the hash of the current active license."""
|
|
318
|
+
license_value = retrieve_license_from_env()
|
|
319
|
+
return hashlib.sha256(license_value.encode("utf-8")).hexdigest()
|
rasa/utils/log_utils.py
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import os
|
|
3
|
+
import logging
|
|
4
|
+
import sys
|
|
5
|
+
from typing import Any, Dict, Optional
|
|
6
|
+
|
|
7
|
+
import structlog
|
|
8
|
+
from structlog_sentry import SentryProcessor
|
|
9
|
+
from structlog.dev import ConsoleRenderer
|
|
10
|
+
from structlog.typing import EventDict, WrappedLogger
|
|
11
|
+
from rasa.shared.constants import (
|
|
12
|
+
ENV_LOG_LEVEL,
|
|
13
|
+
DEFAULT_LOG_LEVEL,
|
|
14
|
+
ENV_LOG_LEVEL_LLM,
|
|
15
|
+
ENV_LOG_LEVEL_LLM_MODULE_NAMES,
|
|
16
|
+
DEFAULT_LOG_LEVEL_LLM,
|
|
17
|
+
)
|
|
18
|
+
from rasa.plugin import plugin_manager
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
FORCE_JSON_LOGGING = os.environ.get("FORCE_JSON_LOGGING")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class HumanConsoleRenderer(ConsoleRenderer):
|
|
25
|
+
"""Console renderer that outputs human-readable logs."""
|
|
26
|
+
|
|
27
|
+
def __call__(self, logger: WrappedLogger, name: str, event_dict: EventDict) -> str:
|
|
28
|
+
if "event_info" in event_dict:
|
|
29
|
+
event_key = event_dict["event"]
|
|
30
|
+
event_dict["event"] = event_dict["event_info"]
|
|
31
|
+
event_dict["event_key"] = event_key
|
|
32
|
+
del event_dict["event_info"]
|
|
33
|
+
|
|
34
|
+
return super().__call__(logger, name, event_dict)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _anonymizer(
|
|
38
|
+
_: structlog.BoundLogger, __: str, event_dict: Dict[str, Any]
|
|
39
|
+
) -> Dict[str, Any]:
|
|
40
|
+
"""Anonymizes event dict."""
|
|
41
|
+
anonymizable_keys = [
|
|
42
|
+
"text",
|
|
43
|
+
"response_text",
|
|
44
|
+
"user_text",
|
|
45
|
+
"slots",
|
|
46
|
+
"parse_data_text",
|
|
47
|
+
"parse_data_entities",
|
|
48
|
+
"prediction_events",
|
|
49
|
+
"tracker_latest_message",
|
|
50
|
+
"prefilled_slots",
|
|
51
|
+
"message",
|
|
52
|
+
"response",
|
|
53
|
+
"slot_candidates",
|
|
54
|
+
"rasa_event",
|
|
55
|
+
"rasa_events",
|
|
56
|
+
"tracker_states",
|
|
57
|
+
"current_states",
|
|
58
|
+
"old_states",
|
|
59
|
+
"current_states",
|
|
60
|
+
"successes",
|
|
61
|
+
"current_entity",
|
|
62
|
+
"next_entity",
|
|
63
|
+
"states",
|
|
64
|
+
"entity",
|
|
65
|
+
"token_text",
|
|
66
|
+
"user_message",
|
|
67
|
+
"json_message",
|
|
68
|
+
]
|
|
69
|
+
anonymization_pipeline = plugin_manager().hook.get_anonymization_pipeline()
|
|
70
|
+
|
|
71
|
+
if anonymization_pipeline:
|
|
72
|
+
for key in anonymizable_keys:
|
|
73
|
+
if key in event_dict:
|
|
74
|
+
anonymized_value = anonymization_pipeline.log_run(event_dict[key])
|
|
75
|
+
event_dict[key] = anonymized_value
|
|
76
|
+
return event_dict
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def configure_structlog(
|
|
80
|
+
log_level: Optional[int] = None,
|
|
81
|
+
) -> None:
|
|
82
|
+
"""Configure logging of the server."""
|
|
83
|
+
if log_level is None: # Log level NOTSET is 0 so we use `is None` here
|
|
84
|
+
log_level_name = os.environ.get(ENV_LOG_LEVEL, DEFAULT_LOG_LEVEL)
|
|
85
|
+
# Change log level from str to int (note that log_level in function parameter
|
|
86
|
+
# int already, coming from CLI argparse parameter).
|
|
87
|
+
log_level = logging.getLevelName(log_level_name)
|
|
88
|
+
|
|
89
|
+
logging.basicConfig(
|
|
90
|
+
format="%(message)s",
|
|
91
|
+
stream=sys.stdout,
|
|
92
|
+
level=log_level,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
shared_processors = [
|
|
96
|
+
_anonymizer,
|
|
97
|
+
# Processors that have nothing to do with output,
|
|
98
|
+
# e.g., add timestamps or log level names.
|
|
99
|
+
# If log level is too low, abort pipeline and throw away log entry.
|
|
100
|
+
structlog.stdlib.filter_by_level,
|
|
101
|
+
structlog.contextvars.merge_contextvars,
|
|
102
|
+
# Add the name of the logger to event dict.
|
|
103
|
+
# structlog.stdlib.add_logger_name,
|
|
104
|
+
# Add log level to event dict.
|
|
105
|
+
structlog.processors.add_log_level,
|
|
106
|
+
# If the "stack_info" key in the event dict is true, remove it and
|
|
107
|
+
# render the current stack trace in the "stack" key.
|
|
108
|
+
structlog.processors.StackInfoRenderer(),
|
|
109
|
+
# If some value is in bytes, decode it to a unicode str.
|
|
110
|
+
structlog.processors.UnicodeDecoder(),
|
|
111
|
+
structlog.dev.set_exc_info,
|
|
112
|
+
# add structlog sentry integration. only log fatal log entries
|
|
113
|
+
# as events as we are tracking exceptions anyways
|
|
114
|
+
SentryProcessor(event_level=logging.FATAL),
|
|
115
|
+
]
|
|
116
|
+
|
|
117
|
+
if not FORCE_JSON_LOGGING and sys.stderr.isatty():
|
|
118
|
+
# Pretty printing when we run in a terminal session.
|
|
119
|
+
# Automatically prints pretty tracebacks when "rich" is installed
|
|
120
|
+
processors = shared_processors + [
|
|
121
|
+
HumanConsoleRenderer(),
|
|
122
|
+
]
|
|
123
|
+
else:
|
|
124
|
+
# Print JSON when we run, e.g., in a Docker container.
|
|
125
|
+
# Also print structured tracebacks.
|
|
126
|
+
processors = shared_processors + [
|
|
127
|
+
structlog.processors.dict_tracebacks,
|
|
128
|
+
structlog.processors.JSONRenderer(),
|
|
129
|
+
]
|
|
130
|
+
|
|
131
|
+
structlog.configure(
|
|
132
|
+
processors=processors, # type: ignore
|
|
133
|
+
context_class=dict,
|
|
134
|
+
# `logger_factory` is used to create wrapped loggers that are used for
|
|
135
|
+
# OUTPUT. This one returns a `logging.Logger`. The final value (a JSON
|
|
136
|
+
# string) from the final processor (`JSONRenderer`) will be passed to
|
|
137
|
+
# the method of the same name as that you've called on the bound logger.
|
|
138
|
+
logger_factory=structlog.stdlib.LoggerFactory(),
|
|
139
|
+
# `wrapper_class` is the bound logger that you get back from
|
|
140
|
+
# get_logger(). This one imitates the API of `logging.Logger`.
|
|
141
|
+
wrapper_class=structlog.make_filtering_bound_logger(log_level),
|
|
142
|
+
# Effectively freeze configuration after creating the first bound
|
|
143
|
+
# logger.
|
|
144
|
+
cache_logger_on_first_use=True,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def log_llm(logger: Any, log_module: str, log_event: str, **kwargs: Any) -> None:
|
|
149
|
+
"""Logs LLM-specific events depending on a flag passed through an environment
|
|
150
|
+
variable. If the module's flag is set to INFO (e.g.
|
|
151
|
+
LOG_PROMPT_LLM_COMMAND_GENERATOR=INFO), its prompt is logged at INFO level,
|
|
152
|
+
overriding the general log level setting.
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
logger: instance of the structlogger of the component
|
|
156
|
+
log_module: name of the module/component logging the event
|
|
157
|
+
log_event: string describing the log event
|
|
158
|
+
**kwargs: dictionary of additional logging context
|
|
159
|
+
"""
|
|
160
|
+
log_level_llm_name = os.environ.get(ENV_LOG_LEVEL_LLM, DEFAULT_LOG_LEVEL_LLM)
|
|
161
|
+
log_level_llm = logging.getLevelName(log_level_llm_name.upper())
|
|
162
|
+
|
|
163
|
+
module_env_variable = ENV_LOG_LEVEL_LLM_MODULE_NAMES.get(
|
|
164
|
+
log_module, "LOG_LEVEL_LLM_" + log_module.upper()
|
|
165
|
+
)
|
|
166
|
+
log_level_llm_module_name = os.environ.get(
|
|
167
|
+
module_env_variable, DEFAULT_LOG_LEVEL_LLM
|
|
168
|
+
)
|
|
169
|
+
log_level_llm_module = logging.getLevelName(log_level_llm_module_name.upper())
|
|
170
|
+
|
|
171
|
+
# log at the highest specified level, e.g. max(DEBUG=10, INFO=20)
|
|
172
|
+
log_level = max(log_level_llm, log_level_llm_module)
|
|
173
|
+
|
|
174
|
+
logger.log(log_level, log_event, **kwargs)
|
rasa/utils/mapper.py
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from typing import Dict, List, Optional, Text, Union
|
|
3
|
+
|
|
4
|
+
import rasa.shared.data
|
|
5
|
+
import rasa.shared.utils.io
|
|
6
|
+
from rasa.shared.core.domain import (
|
|
7
|
+
KEY_ACTIONS,
|
|
8
|
+
KEY_ENTITIES,
|
|
9
|
+
KEY_FORMS,
|
|
10
|
+
KEY_INTENTS,
|
|
11
|
+
KEY_RESPONSES,
|
|
12
|
+
KEY_SLOTS,
|
|
13
|
+
Domain,
|
|
14
|
+
)
|
|
15
|
+
from rasa.shared.core.flows.yaml_flows_io import KEY_FLOWS, is_flows_file
|
|
16
|
+
from rasa.shared.core.training_data.story_reader.yaml_story_reader import (
|
|
17
|
+
KEY_RULE_NAME,
|
|
18
|
+
KEY_RULES,
|
|
19
|
+
KEY_STORIES,
|
|
20
|
+
KEY_STORY_NAME,
|
|
21
|
+
YAMLStoryReader,
|
|
22
|
+
)
|
|
23
|
+
from rasa.shared.nlu.training_data.formats.rasa_yaml import (
|
|
24
|
+
KEY_INTENT,
|
|
25
|
+
KEY_NLU,
|
|
26
|
+
)
|
|
27
|
+
from rasa.shared.utils.yaml import read_yaml_file
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class RasaPrimitiveStorageMapper:
|
|
31
|
+
"""Maps the Rasa primitives to the file its located in."""
|
|
32
|
+
|
|
33
|
+
def __init__(
|
|
34
|
+
self,
|
|
35
|
+
domain_path: Optional[Union[Text, Path]] = None,
|
|
36
|
+
training_data_paths: Optional[Union[List[Text], List[Path], Text, Path]] = None,
|
|
37
|
+
):
|
|
38
|
+
self._primitives: Dict[str, Dict] = {
|
|
39
|
+
"entities": {},
|
|
40
|
+
"slots": {},
|
|
41
|
+
"forms": {},
|
|
42
|
+
"intents": {},
|
|
43
|
+
"stories": {},
|
|
44
|
+
"rules": {},
|
|
45
|
+
"actions": {},
|
|
46
|
+
"responses": {},
|
|
47
|
+
"flows": {},
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if domain_path:
|
|
51
|
+
self._load_domain(domain_path)
|
|
52
|
+
|
|
53
|
+
if training_data_paths:
|
|
54
|
+
self._load_training_data(training_data_paths)
|
|
55
|
+
|
|
56
|
+
def _load_domain(self, domain_path: Union[Text, Path]) -> None:
|
|
57
|
+
self._resolve_domain_files(domain_path)
|
|
58
|
+
self._parse_domain_files()
|
|
59
|
+
|
|
60
|
+
def _load_training_data(
|
|
61
|
+
self, training_data_paths: Union[List[Text], List[Path], Text, Path]
|
|
62
|
+
) -> None:
|
|
63
|
+
self._resolve_training_data_files(training_data_paths)
|
|
64
|
+
|
|
65
|
+
self._nlu_files = rasa.shared.data.get_data_files(
|
|
66
|
+
self._training_data_paths, rasa.shared.data.is_nlu_file
|
|
67
|
+
)
|
|
68
|
+
self._parse_nlu_data()
|
|
69
|
+
|
|
70
|
+
self._story_files = rasa.shared.data.get_data_files(
|
|
71
|
+
self._training_data_paths, YAMLStoryReader.is_stories_file
|
|
72
|
+
)
|
|
73
|
+
self._parse_story_data()
|
|
74
|
+
|
|
75
|
+
self._flow_files = rasa.shared.data.get_data_files(
|
|
76
|
+
self._training_data_paths, is_flows_file
|
|
77
|
+
)
|
|
78
|
+
self._parse_flow_data()
|
|
79
|
+
|
|
80
|
+
def _resolve_training_data_files(
|
|
81
|
+
self, training_data_paths: Union[List[Text], List[Path], Text, Path]
|
|
82
|
+
) -> None:
|
|
83
|
+
if isinstance(training_data_paths, list):
|
|
84
|
+
training_data_paths = [Path(p) for p in training_data_paths]
|
|
85
|
+
elif isinstance(training_data_paths, str):
|
|
86
|
+
training_data_paths = [Path(training_data_paths)]
|
|
87
|
+
elif isinstance(training_data_paths, Path):
|
|
88
|
+
training_data_paths = [training_data_paths]
|
|
89
|
+
|
|
90
|
+
self._training_data_paths = training_data_paths
|
|
91
|
+
|
|
92
|
+
def _resolve_domain_files(self, domain_path: Union[Text, Path]) -> None:
|
|
93
|
+
domain_path = Path(domain_path) if isinstance(domain_path, str) else domain_path
|
|
94
|
+
|
|
95
|
+
if domain_path.is_dir():
|
|
96
|
+
self._domain_files = [
|
|
97
|
+
file for file in domain_path.iterdir() if Domain.is_domain_file(file)
|
|
98
|
+
]
|
|
99
|
+
else:
|
|
100
|
+
self._domain_files = [domain_path]
|
|
101
|
+
|
|
102
|
+
def _parse_domain_files(self) -> None:
|
|
103
|
+
for domain_file in self._domain_files:
|
|
104
|
+
content = read_yaml_file(domain_file)
|
|
105
|
+
for entity in content.get(KEY_ENTITIES, []): # type: ignore[union-attr]
|
|
106
|
+
self._assign_value(
|
|
107
|
+
self._primitives["entities"], "domain", domain_file, entity
|
|
108
|
+
)
|
|
109
|
+
for intent in content.get(KEY_INTENTS, []): # type: ignore[union-attr]
|
|
110
|
+
self._assign_value(
|
|
111
|
+
self._primitives["intents"], "domain", domain_file, intent
|
|
112
|
+
)
|
|
113
|
+
for slot in content.get(KEY_SLOTS, []): # type: ignore[union-attr]
|
|
114
|
+
self._assign_value(
|
|
115
|
+
self._primitives["slots"], "domain", domain_file, slot
|
|
116
|
+
)
|
|
117
|
+
for form in content.get(KEY_FORMS, []): # type: ignore[union-attr]
|
|
118
|
+
self._assign_value(
|
|
119
|
+
self._primitives["forms"], "domain", domain_file, form
|
|
120
|
+
)
|
|
121
|
+
for action in content.get(KEY_ACTIONS, []): # type: ignore[union-attr]
|
|
122
|
+
self._assign_value(
|
|
123
|
+
self._primitives["actions"], "domain", domain_file, action
|
|
124
|
+
)
|
|
125
|
+
for response in content.get(KEY_RESPONSES, []): # type: ignore[union-attr]
|
|
126
|
+
self._assign_value(
|
|
127
|
+
self._primitives["responses"], "domain", domain_file, response
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
def _parse_nlu_data(self) -> None:
|
|
131
|
+
"""Parses the nlu data and extracts the intents."""
|
|
132
|
+
for nlu_file in self._nlu_files:
|
|
133
|
+
content = read_yaml_file(nlu_file)
|
|
134
|
+
for intent in content.get(KEY_NLU, []): # type: ignore[union-attr]
|
|
135
|
+
if KEY_INTENT in intent:
|
|
136
|
+
self._assign_value(
|
|
137
|
+
self._primitives["intents"],
|
|
138
|
+
"training",
|
|
139
|
+
nlu_file,
|
|
140
|
+
intent.get(KEY_INTENT),
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
def _parse_story_data(self) -> None:
|
|
144
|
+
"""Parses the story data and extracts the stories and rules."""
|
|
145
|
+
for story_file in self._story_files:
|
|
146
|
+
content = read_yaml_file(story_file)
|
|
147
|
+
for story in content.get(KEY_STORIES, []): # type: ignore[union-attr]
|
|
148
|
+
self._assign_value(
|
|
149
|
+
self._primitives["stories"],
|
|
150
|
+
"training",
|
|
151
|
+
story_file,
|
|
152
|
+
story[KEY_STORY_NAME],
|
|
153
|
+
)
|
|
154
|
+
for rule in content.get(KEY_RULES, []): # type: ignore[union-attr]
|
|
155
|
+
self._assign_value(
|
|
156
|
+
self._primitives["rules"],
|
|
157
|
+
"training",
|
|
158
|
+
story_file,
|
|
159
|
+
rule[KEY_RULE_NAME],
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
def _parse_flow_data(self) -> None:
|
|
163
|
+
"""Parses the flow data and extracts the flow ids."""
|
|
164
|
+
for flow_file in self._flow_files:
|
|
165
|
+
content = read_yaml_file(flow_file)
|
|
166
|
+
for flow in content.get(KEY_FLOWS, []): # type: ignore[union-attr]
|
|
167
|
+
self._assign_value(
|
|
168
|
+
self._primitives["flows"],
|
|
169
|
+
"training",
|
|
170
|
+
flow_file,
|
|
171
|
+
flow,
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
@staticmethod
|
|
175
|
+
def _assign_value(
|
|
176
|
+
primitive: Dict, file_type: str, value: Union[str, Path], key: str
|
|
177
|
+
) -> None:
|
|
178
|
+
if not isinstance(value, Path):
|
|
179
|
+
value = Path(value)
|
|
180
|
+
|
|
181
|
+
if isinstance(key, dict):
|
|
182
|
+
key = next(iter(key.keys()))
|
|
183
|
+
|
|
184
|
+
if key in primitive:
|
|
185
|
+
if file_type in primitive[key]:
|
|
186
|
+
primitive[key][file_type].append(value)
|
|
187
|
+
else:
|
|
188
|
+
primitive[key][file_type] = [value]
|
|
189
|
+
else:
|
|
190
|
+
primitive[key] = {file_type: [value]}
|
|
191
|
+
|
|
192
|
+
def get_file(self, primitive: Text, primitive_type: Text) -> Dict[str, List[Path]]:
|
|
193
|
+
"""Returns the file where the primitive is located.
|
|
194
|
+
|
|
195
|
+
If the primitive is not found, empty dict is returned.
|
|
196
|
+
|
|
197
|
+
Args:
|
|
198
|
+
primitive: The name or ID of the primitive to search for.
|
|
199
|
+
primitive_type: The type of the primitive to search for.
|
|
200
|
+
either entities, slots, forms, intents, stories or rules.
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
A dictionary containing the file type and the list of file paths.
|
|
204
|
+
file_type can be either domain or training.
|
|
205
|
+
get_file()[file_type] -> List[Path]
|
|
206
|
+
"""
|
|
207
|
+
try:
|
|
208
|
+
return self._primitives[primitive_type][primitive]
|
|
209
|
+
except KeyError:
|
|
210
|
+
return {}
|