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
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from functools import reduce
|
|
3
|
+
from typing import Text, Set, Dict, Optional, List, Union, Any
|
|
4
|
+
import os
|
|
5
|
+
|
|
6
|
+
import rasa.shared.data
|
|
7
|
+
import rasa.shared.utils.io
|
|
8
|
+
from rasa.shared.core.domain import Domain
|
|
9
|
+
from rasa.shared.importers.importer import TrainingDataImporter
|
|
10
|
+
from rasa.shared.importers import utils
|
|
11
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
12
|
+
from rasa.shared.core.training_data.structures import StoryGraph
|
|
13
|
+
from rasa.shared.utils.common import mark_as_experimental_feature
|
|
14
|
+
from rasa.shared.core.training_data.story_reader.yaml_story_reader import (
|
|
15
|
+
YAMLStoryReader,
|
|
16
|
+
)
|
|
17
|
+
from rasa.shared.utils.yaml import read_config_file, read_model_configuration
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class MultiProjectImporter(TrainingDataImporter):
|
|
23
|
+
def __init__(
|
|
24
|
+
self,
|
|
25
|
+
config_file: Text,
|
|
26
|
+
domain_path: Optional[Text] = None,
|
|
27
|
+
training_data_paths: Optional[Union[List[Text], Text]] = None,
|
|
28
|
+
project_directory: Optional[Text] = None,
|
|
29
|
+
):
|
|
30
|
+
self.config = read_model_configuration(config_file)
|
|
31
|
+
if domain_path:
|
|
32
|
+
self._domain_paths = [domain_path]
|
|
33
|
+
else:
|
|
34
|
+
self._domain_paths = []
|
|
35
|
+
self._story_paths = []
|
|
36
|
+
self._e2e_story_paths: List[Text] = []
|
|
37
|
+
self._nlu_paths = []
|
|
38
|
+
self._imports: List[Text] = []
|
|
39
|
+
self._additional_paths = training_data_paths or []
|
|
40
|
+
self._project_directory = project_directory or os.path.dirname(config_file)
|
|
41
|
+
|
|
42
|
+
self._init_from_dict(self.config, self._project_directory)
|
|
43
|
+
|
|
44
|
+
extra_nlu_files = rasa.shared.data.get_data_files(
|
|
45
|
+
training_data_paths, rasa.shared.data.is_nlu_file
|
|
46
|
+
)
|
|
47
|
+
extra_story_files = rasa.shared.data.get_data_files(
|
|
48
|
+
training_data_paths, YAMLStoryReader.is_stories_file
|
|
49
|
+
)
|
|
50
|
+
self._story_paths += extra_story_files
|
|
51
|
+
self._nlu_paths += extra_nlu_files
|
|
52
|
+
|
|
53
|
+
logger.debug(
|
|
54
|
+
"Selected projects: {}".format("".join([f"\n-{i}" for i in self._imports]))
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
mark_as_experimental_feature(feature_name="MultiProjectImporter")
|
|
58
|
+
|
|
59
|
+
def get_config_file_for_auto_config(self) -> Optional[Text]:
|
|
60
|
+
"""Returns config file path for auto-config only if there is a single one."""
|
|
61
|
+
return None
|
|
62
|
+
|
|
63
|
+
def _init_from_path(self, path: Text) -> None:
|
|
64
|
+
if os.path.isfile(path):
|
|
65
|
+
self._init_from_file(path)
|
|
66
|
+
elif os.path.isdir(path):
|
|
67
|
+
self._init_from_directory(path)
|
|
68
|
+
|
|
69
|
+
def _init_from_file(self, path: Text) -> None:
|
|
70
|
+
path = os.path.abspath(path)
|
|
71
|
+
if os.path.exists(path) and rasa.shared.data.is_config_file(path):
|
|
72
|
+
config = read_config_file(path)
|
|
73
|
+
|
|
74
|
+
parent_directory = os.path.dirname(path)
|
|
75
|
+
self._init_from_dict(config, parent_directory)
|
|
76
|
+
else:
|
|
77
|
+
rasa.shared.utils.io.raise_warning(
|
|
78
|
+
f"'{path}' does not exist or is not a valid config file."
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
def _init_from_dict(self, _dict: Dict[Text, Any], parent_directory: Text) -> None:
|
|
82
|
+
imports = _dict.get("imports") or []
|
|
83
|
+
imports = [os.path.join(parent_directory, i) for i in imports]
|
|
84
|
+
# clean out relative paths
|
|
85
|
+
imports = [os.path.abspath(i) for i in imports]
|
|
86
|
+
|
|
87
|
+
# remove duplication
|
|
88
|
+
import_candidates = []
|
|
89
|
+
for i in imports:
|
|
90
|
+
if i not in import_candidates and not self._is_explicitly_imported(i):
|
|
91
|
+
import_candidates.append(i)
|
|
92
|
+
|
|
93
|
+
self._imports.extend(import_candidates)
|
|
94
|
+
|
|
95
|
+
# import config files from paths which have not been processed so far
|
|
96
|
+
for p in import_candidates:
|
|
97
|
+
self._init_from_path(p)
|
|
98
|
+
|
|
99
|
+
def _is_explicitly_imported(self, path: Text) -> bool:
|
|
100
|
+
return not self.no_skills_selected() and self.is_imported(path)
|
|
101
|
+
|
|
102
|
+
def _init_from_directory(self, path: Text) -> None:
|
|
103
|
+
for parent, _, files in os.walk(path, followlinks=True):
|
|
104
|
+
for file in files:
|
|
105
|
+
full_path = os.path.join(parent, file)
|
|
106
|
+
if not self.is_imported(full_path):
|
|
107
|
+
# Check next file
|
|
108
|
+
continue
|
|
109
|
+
|
|
110
|
+
if YAMLStoryReader.is_test_stories_file(full_path):
|
|
111
|
+
self._e2e_story_paths.append(full_path)
|
|
112
|
+
elif Domain.is_domain_file(full_path):
|
|
113
|
+
self._domain_paths.append(full_path)
|
|
114
|
+
elif rasa.shared.data.is_nlu_file(full_path):
|
|
115
|
+
self._nlu_paths.append(full_path)
|
|
116
|
+
elif YAMLStoryReader.is_stories_file(full_path):
|
|
117
|
+
self._story_paths.append(full_path)
|
|
118
|
+
elif rasa.shared.data.is_config_file(full_path):
|
|
119
|
+
self._init_from_file(full_path)
|
|
120
|
+
|
|
121
|
+
def no_skills_selected(self) -> bool:
|
|
122
|
+
return not self._imports
|
|
123
|
+
|
|
124
|
+
def training_paths(self) -> Set[Text]:
|
|
125
|
+
"""Returns the paths which should be searched for training data."""
|
|
126
|
+
# only include extra paths if they are not part of the current project directory
|
|
127
|
+
training_paths = {
|
|
128
|
+
i
|
|
129
|
+
for i in self._imports
|
|
130
|
+
if not self._project_directory or self._project_directory not in i
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if self._project_directory:
|
|
134
|
+
training_paths.add(self._project_directory)
|
|
135
|
+
|
|
136
|
+
return training_paths
|
|
137
|
+
|
|
138
|
+
def is_imported(self, path: Text) -> bool:
|
|
139
|
+
"""Checks whether a path is imported by a skill.
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
path: File or directory path which should be checked.
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
`True` if path is imported by a skill, `False` if not.
|
|
146
|
+
"""
|
|
147
|
+
absolute_path = os.path.abspath(path)
|
|
148
|
+
|
|
149
|
+
return (
|
|
150
|
+
self.no_skills_selected()
|
|
151
|
+
or self._is_in_project_directory(absolute_path)
|
|
152
|
+
or self._is_in_additional_paths(absolute_path)
|
|
153
|
+
or self._is_in_imported_paths(absolute_path)
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
def _is_in_project_directory(self, path: Text) -> bool:
|
|
157
|
+
if os.path.isfile(path):
|
|
158
|
+
parent_directory = os.path.abspath(os.path.dirname(path))
|
|
159
|
+
|
|
160
|
+
return parent_directory == self._project_directory
|
|
161
|
+
else:
|
|
162
|
+
return path == self._project_directory
|
|
163
|
+
|
|
164
|
+
def _is_in_additional_paths(self, path: Text) -> bool:
|
|
165
|
+
included = path in self._additional_paths
|
|
166
|
+
|
|
167
|
+
if not included and os.path.isfile(path):
|
|
168
|
+
parent_directory = os.path.abspath(os.path.dirname(path))
|
|
169
|
+
included = parent_directory in self._additional_paths
|
|
170
|
+
|
|
171
|
+
return included
|
|
172
|
+
|
|
173
|
+
def _is_in_imported_paths(self, path: Text) -> bool:
|
|
174
|
+
return any(
|
|
175
|
+
[rasa.shared.utils.io.is_subdirectory(path, i) for i in self._imports]
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
def get_domain(self) -> Domain:
|
|
179
|
+
"""Retrieves model domain (see parent class for full docstring)."""
|
|
180
|
+
domains = [Domain.load(path) for path in self._domain_paths]
|
|
181
|
+
return reduce(
|
|
182
|
+
lambda merged, other: merged.merge(other),
|
|
183
|
+
domains,
|
|
184
|
+
Domain.empty(),
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
def get_stories(self, exclusion_percentage: Optional[int] = None) -> StoryGraph:
|
|
188
|
+
"""Retrieves training stories / rules (see parent class for full docstring)."""
|
|
189
|
+
return utils.story_graph_from_paths(
|
|
190
|
+
self._story_paths, self.get_domain(), exclusion_percentage
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
def get_conversation_tests(self) -> StoryGraph:
|
|
194
|
+
"""Retrieves conversation test stories (see parent class for full docstring)."""
|
|
195
|
+
return utils.story_graph_from_paths(self._e2e_story_paths, self.get_domain())
|
|
196
|
+
|
|
197
|
+
def get_config(self) -> Dict:
|
|
198
|
+
"""Retrieves model config (see parent class for full docstring)."""
|
|
199
|
+
return self.config
|
|
200
|
+
|
|
201
|
+
def get_nlu_data(self, language: Optional[Text] = "en") -> TrainingData:
|
|
202
|
+
"""Retrieves NLU training data (see parent class for full docstring)."""
|
|
203
|
+
return utils.training_data_from_paths(self._nlu_paths, language)
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
from typing import Dict, List, Optional, Text, Union
|
|
4
|
+
|
|
5
|
+
import rasa.shared.core.flows.yaml_flows_io
|
|
6
|
+
from rasa.shared.core.flows import FlowsList
|
|
7
|
+
|
|
8
|
+
import rasa.shared.data
|
|
9
|
+
import rasa.shared.utils.common
|
|
10
|
+
import rasa.shared.utils.io
|
|
11
|
+
from rasa.shared.core.training_data.structures import StoryGraph
|
|
12
|
+
from rasa.shared.importers import utils
|
|
13
|
+
from rasa.shared.importers.importer import TrainingDataImporter
|
|
14
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
15
|
+
from rasa.shared.core.domain import InvalidDomain, Domain
|
|
16
|
+
from rasa.shared.core.training_data.story_reader.yaml_story_reader import (
|
|
17
|
+
YAMLStoryReader,
|
|
18
|
+
)
|
|
19
|
+
from rasa.shared.utils.yaml import read_model_configuration
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class RasaFileImporter(TrainingDataImporter):
|
|
25
|
+
"""Default `TrainingFileImporter` implementation."""
|
|
26
|
+
|
|
27
|
+
def __init__(
|
|
28
|
+
self,
|
|
29
|
+
config_file: Optional[Text] = None,
|
|
30
|
+
domain_path: Optional[Text] = None,
|
|
31
|
+
training_data_paths: Optional[Union[List[Text], Text]] = None,
|
|
32
|
+
):
|
|
33
|
+
|
|
34
|
+
self._domain_path = domain_path
|
|
35
|
+
|
|
36
|
+
self._nlu_files = rasa.shared.data.get_data_files(
|
|
37
|
+
training_data_paths, rasa.shared.data.is_nlu_file
|
|
38
|
+
)
|
|
39
|
+
self._story_files = rasa.shared.data.get_data_files(
|
|
40
|
+
training_data_paths, YAMLStoryReader.is_stories_file
|
|
41
|
+
)
|
|
42
|
+
self._flow_files = rasa.shared.data.get_data_files(
|
|
43
|
+
training_data_paths, rasa.shared.core.flows.yaml_flows_io.is_flows_file
|
|
44
|
+
)
|
|
45
|
+
self._conversation_test_files = rasa.shared.data.get_data_files(
|
|
46
|
+
training_data_paths, YAMLStoryReader.is_test_stories_file
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
self.config_file = config_file
|
|
50
|
+
|
|
51
|
+
def get_config(self) -> Dict:
|
|
52
|
+
"""Retrieves model config (see parent class for full docstring)."""
|
|
53
|
+
if not self.config_file or not os.path.exists(self.config_file):
|
|
54
|
+
logger.debug("No configuration file was provided to the RasaFileImporter.")
|
|
55
|
+
return {}
|
|
56
|
+
|
|
57
|
+
config = read_model_configuration(self.config_file)
|
|
58
|
+
return config
|
|
59
|
+
|
|
60
|
+
@rasa.shared.utils.common.cached_method
|
|
61
|
+
def get_config_file_for_auto_config(self) -> Optional[Text]:
|
|
62
|
+
"""Returns config file path for auto-config only if there is a single one."""
|
|
63
|
+
return self.config_file
|
|
64
|
+
|
|
65
|
+
def get_stories(self, exclusion_percentage: Optional[int] = None) -> StoryGraph:
|
|
66
|
+
"""Retrieves training stories / rules (see parent class for full docstring)."""
|
|
67
|
+
return utils.story_graph_from_paths(
|
|
68
|
+
self._story_files, self.get_domain(), exclusion_percentage
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
def get_flows(self) -> FlowsList:
|
|
72
|
+
"""Retrieves training stories / rules (see parent class for full docstring)."""
|
|
73
|
+
return utils.flows_from_paths(self._flow_files)
|
|
74
|
+
|
|
75
|
+
def get_conversation_tests(self) -> StoryGraph:
|
|
76
|
+
"""Retrieves conversation test stories (see parent class for full docstring)."""
|
|
77
|
+
return utils.story_graph_from_paths(
|
|
78
|
+
self._conversation_test_files, self.get_domain()
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
def get_nlu_data(self, language: Optional[Text] = "en") -> TrainingData:
|
|
82
|
+
"""Retrieves NLU training data (see parent class for full docstring)."""
|
|
83
|
+
return utils.training_data_from_paths(self._nlu_files, language)
|
|
84
|
+
|
|
85
|
+
def get_domain(self) -> Domain:
|
|
86
|
+
"""Retrieves model domain (see parent class for full docstring)."""
|
|
87
|
+
domain = Domain.empty()
|
|
88
|
+
|
|
89
|
+
# If domain path is None, return an empty domain
|
|
90
|
+
if not self._domain_path:
|
|
91
|
+
return domain
|
|
92
|
+
try:
|
|
93
|
+
domain = Domain.load(self._domain_path)
|
|
94
|
+
except InvalidDomain as e:
|
|
95
|
+
rasa.shared.utils.io.raise_warning(
|
|
96
|
+
f"Loading domain from '{self._domain_path}' failed. Using "
|
|
97
|
+
f"empty domain. Error: '{e}'"
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
return domain
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from typing import Iterable, Text, Optional, List
|
|
2
|
+
|
|
3
|
+
from rasa.shared.core.domain import Domain
|
|
4
|
+
from rasa.shared.core.flows import FlowsList
|
|
5
|
+
from rasa.shared.core.training_data.structures import StoryGraph
|
|
6
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def training_data_from_paths(paths: Iterable[Text], language: Text) -> TrainingData:
|
|
10
|
+
from rasa.shared.nlu.training_data import loading
|
|
11
|
+
|
|
12
|
+
training_data_sets = [loading.load_data(nlu_file, language) for nlu_file in paths]
|
|
13
|
+
return TrainingData().merge(*training_data_sets)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def story_graph_from_paths(
|
|
17
|
+
files: List[Text], domain: Domain, exclusion_percentage: Optional[int] = None
|
|
18
|
+
) -> StoryGraph:
|
|
19
|
+
"""Returns the `StoryGraph` from paths."""
|
|
20
|
+
from rasa.shared.core.training_data import loading
|
|
21
|
+
|
|
22
|
+
story_steps = loading.load_data_from_files(files, domain, exclusion_percentage)
|
|
23
|
+
return StoryGraph(story_steps)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def flows_from_paths(files: List[Text]) -> FlowsList:
|
|
27
|
+
"""Returns the flows from paths."""
|
|
28
|
+
from rasa.shared.core.flows.yaml_flows_io import YAMLFlowsReader
|
|
29
|
+
|
|
30
|
+
flows = FlowsList(underlying_flows=[])
|
|
31
|
+
for file in files:
|
|
32
|
+
flows = flows.merge(YAMLFlowsReader.read_from_file(file))
|
|
33
|
+
flows.validate()
|
|
34
|
+
return flows
|
|
File without changes
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
TEXT = "text"
|
|
2
|
+
TEXT_TOKENS = "text_tokens"
|
|
3
|
+
INTENT = "intent"
|
|
4
|
+
COMMANDS = "commands"
|
|
5
|
+
FLOWS_FROM_SEMANTIC_SEARCH = "flows_from_semantic_search"
|
|
6
|
+
FLOWS_IN_PROMPT = "flows_in_prompt"
|
|
7
|
+
NOT_INTENT = "not_intent"
|
|
8
|
+
RESPONSE = "response"
|
|
9
|
+
RESPONSE_SELECTOR = "response_selector"
|
|
10
|
+
INTENT_RESPONSE_KEY = "intent_response_key"
|
|
11
|
+
ACTION_TEXT = "action_text"
|
|
12
|
+
ACTION_NAME = "action_name"
|
|
13
|
+
INTENT_NAME_KEY = "name"
|
|
14
|
+
FULL_RETRIEVAL_INTENT_NAME_KEY = "full_retrieval_intent_name"
|
|
15
|
+
METADATA = "metadata"
|
|
16
|
+
METADATA_INTENT = "intent"
|
|
17
|
+
METADATA_EXAMPLE = "example"
|
|
18
|
+
METADATA_MODEL_ID = "model_id"
|
|
19
|
+
INTENT_RANKING_KEY = "intent_ranking"
|
|
20
|
+
PREDICTED_CONFIDENCE_KEY = "confidence"
|
|
21
|
+
|
|
22
|
+
RESPONSE_IDENTIFIER_DELIMITER = "/"
|
|
23
|
+
|
|
24
|
+
FEATURE_TYPE_SENTENCE = "sentence"
|
|
25
|
+
FEATURE_TYPE_SEQUENCE = "sequence"
|
|
26
|
+
VALID_FEATURE_TYPES = [FEATURE_TYPE_SEQUENCE, FEATURE_TYPE_SENTENCE]
|
|
27
|
+
|
|
28
|
+
EXTRACTOR = "extractor"
|
|
29
|
+
PRETRAINED_EXTRACTORS = {"DucklingEntityExtractor", "SpacyEntityExtractor"}
|
|
30
|
+
TRAINABLE_EXTRACTORS = {"MitieEntityExtractor", "CRFEntityExtractor", "DIETClassifier"}
|
|
31
|
+
|
|
32
|
+
ENTITIES = "entities"
|
|
33
|
+
ENTITY_TAGS = "entity_tags"
|
|
34
|
+
ENTITY_ATTRIBUTE_TYPE = "entity"
|
|
35
|
+
ENTITY_ATTRIBUTE_GROUP = "group"
|
|
36
|
+
ENTITY_ATTRIBUTE_ROLE = "role"
|
|
37
|
+
ENTITY_ATTRIBUTE_VALUE = "value"
|
|
38
|
+
ENTITY_ATTRIBUTE_START = "start"
|
|
39
|
+
ENTITY_ATTRIBUTE_END = "end"
|
|
40
|
+
ENTITY_ATTRIBUTE_TEXT = "text"
|
|
41
|
+
ENTITY_ATTRIBUTE_CONFIDENCE = "confidence"
|
|
42
|
+
NO_ENTITY_TAG = "O"
|
|
43
|
+
SPLIT_ENTITIES_BY_COMMA = "split_entities_by_comma"
|
|
44
|
+
SPLIT_ENTITIES_BY_COMMA_DEFAULT_VALUE = True
|
|
45
|
+
SINGLE_ENTITY_ALLOWED_INTERLEAVING_CHARSET = {".", ",", " ", ";"}
|
|
File without changes
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from json import JSONDecodeError
|
|
3
|
+
from typing import Text, List, Dict, Match, Optional, NamedTuple, Any
|
|
4
|
+
import logging
|
|
5
|
+
|
|
6
|
+
import rasa.shared.nlu.training_data.util
|
|
7
|
+
from rasa.shared.constants import DOCS_URL_TRAINING_DATA_NLU
|
|
8
|
+
from rasa.shared.exceptions import InvalidEntityFormatException
|
|
9
|
+
from rasa.shared.nlu.constants import (
|
|
10
|
+
ENTITY_ATTRIBUTE_VALUE,
|
|
11
|
+
ENTITY_ATTRIBUTE_TYPE,
|
|
12
|
+
ENTITY_ATTRIBUTE_GROUP,
|
|
13
|
+
ENTITY_ATTRIBUTE_ROLE,
|
|
14
|
+
)
|
|
15
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
GROUP_ENTITY_VALUE = "value"
|
|
19
|
+
GROUP_ENTITY_TYPE = "entity"
|
|
20
|
+
GROUP_ENTITY_DICT = "entity_dict"
|
|
21
|
+
GROUP_ENTITY_DICT_LIST = "list_entity_dicts"
|
|
22
|
+
GROUP_ENTITY_TEXT = "entity_text"
|
|
23
|
+
GROUP_COMPLETE_MATCH = 0
|
|
24
|
+
|
|
25
|
+
# regex for: `[entity_text]((entity_type(:entity_synonym)?)|{entity_dict}|[list_entity_dicts])` # noqa: E501
|
|
26
|
+
ENTITY_REGEX = re.compile(
|
|
27
|
+
r"\[(?P<entity_text>[^\]]+?)\](\((?P<entity>[^:)]+?)(?:\:(?P<value>[^)]+))?\)|\{(?P<entity_dict>[^}]+?)\}|\[(?P<list_entity_dicts>.*?)\])" # noqa: E501
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
SINGLE_ENTITY_DICT = re.compile(r"{(?P<entity_dict>[^}]+?)\}")
|
|
31
|
+
|
|
32
|
+
logger = logging.getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class EntityAttributes(NamedTuple):
|
|
36
|
+
"""Attributes of an entity defined in markdown data."""
|
|
37
|
+
|
|
38
|
+
type: Text
|
|
39
|
+
value: Text
|
|
40
|
+
text: Text
|
|
41
|
+
group: Optional[Text]
|
|
42
|
+
role: Optional[Text]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def find_entities_in_training_example(example: Text) -> List[Dict[Text, Any]]:
|
|
46
|
+
"""Extracts entities from an annotated utterance.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
example: Annotated utterance.
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
Extracted entities.
|
|
53
|
+
"""
|
|
54
|
+
entities = []
|
|
55
|
+
offset = 0
|
|
56
|
+
|
|
57
|
+
for match in re.finditer(ENTITY_REGEX, example):
|
|
58
|
+
logger.debug(f"Entity annotation regex match: {match}")
|
|
59
|
+
if match.groupdict()[GROUP_ENTITY_DICT] or match.groupdict()[GROUP_ENTITY_TYPE]:
|
|
60
|
+
# Text is annotated with a single entity
|
|
61
|
+
entity_attributes = extract_entity_attributes(match)
|
|
62
|
+
|
|
63
|
+
start_index = match.start() - offset
|
|
64
|
+
end_index = start_index + len(entity_attributes.text)
|
|
65
|
+
offset += len(match.group(0)) - len(entity_attributes.text)
|
|
66
|
+
|
|
67
|
+
entity = rasa.shared.nlu.training_data.util.build_entity(
|
|
68
|
+
start_index,
|
|
69
|
+
end_index,
|
|
70
|
+
entity_attributes.value,
|
|
71
|
+
entity_attributes.type,
|
|
72
|
+
entity_attributes.role,
|
|
73
|
+
entity_attributes.group,
|
|
74
|
+
)
|
|
75
|
+
entities.append(entity)
|
|
76
|
+
else:
|
|
77
|
+
# Text is annotated with multiple entities for the same text
|
|
78
|
+
entity_text = match.groupdict()[GROUP_ENTITY_TEXT]
|
|
79
|
+
|
|
80
|
+
start_index = match.start() - offset
|
|
81
|
+
end_index = start_index + len(entity_text)
|
|
82
|
+
offset += len(match.group(0)) - len(entity_text)
|
|
83
|
+
|
|
84
|
+
for match_inner in re.finditer(
|
|
85
|
+
SINGLE_ENTITY_DICT, match.groupdict()[GROUP_ENTITY_DICT_LIST]
|
|
86
|
+
):
|
|
87
|
+
|
|
88
|
+
entity_attributes = extract_entity_attributes_from_dict(
|
|
89
|
+
entity_text=entity_text, match=match_inner
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
entity = rasa.shared.nlu.training_data.util.build_entity(
|
|
93
|
+
start_index,
|
|
94
|
+
end_index,
|
|
95
|
+
entity_attributes.value,
|
|
96
|
+
entity_attributes.type,
|
|
97
|
+
entity_attributes.role,
|
|
98
|
+
entity_attributes.group,
|
|
99
|
+
)
|
|
100
|
+
entities.append(entity)
|
|
101
|
+
|
|
102
|
+
return entities
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def extract_entity_attributes(match: Match) -> EntityAttributes:
|
|
106
|
+
"""Extract the entity attributes, i.e. type, value, etc., from the
|
|
107
|
+
regex match.
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
match: Regex match to extract the entity attributes from.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
EntityAttributes object.
|
|
114
|
+
"""
|
|
115
|
+
entity_text = match.groupdict()[GROUP_ENTITY_TEXT]
|
|
116
|
+
|
|
117
|
+
if match.groupdict()[GROUP_ENTITY_DICT]:
|
|
118
|
+
return extract_entity_attributes_from_dict(entity_text, match)
|
|
119
|
+
|
|
120
|
+
entity_type = match.groupdict()[GROUP_ENTITY_TYPE]
|
|
121
|
+
|
|
122
|
+
if match.groupdict()[GROUP_ENTITY_VALUE]:
|
|
123
|
+
entity_value = match.groupdict()[GROUP_ENTITY_VALUE]
|
|
124
|
+
else:
|
|
125
|
+
entity_value = entity_text
|
|
126
|
+
|
|
127
|
+
return EntityAttributes(entity_type, entity_value, entity_text, None, None)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def extract_entity_attributes_from_dict(
|
|
131
|
+
entity_text: Text, match: Match
|
|
132
|
+
) -> EntityAttributes:
|
|
133
|
+
"""Extract entity attributes from dict format.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
entity_text: Original entity text.
|
|
137
|
+
match: Regex match.
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
Extracted entity attributes.
|
|
141
|
+
"""
|
|
142
|
+
entity_dict_str = match.groupdict()[GROUP_ENTITY_DICT]
|
|
143
|
+
entity_dict = get_validated_dict(entity_dict_str)
|
|
144
|
+
return EntityAttributes(
|
|
145
|
+
entity_dict.get(ENTITY_ATTRIBUTE_TYPE),
|
|
146
|
+
entity_dict.get(ENTITY_ATTRIBUTE_VALUE, entity_text),
|
|
147
|
+
entity_text,
|
|
148
|
+
entity_dict.get(ENTITY_ATTRIBUTE_GROUP),
|
|
149
|
+
entity_dict.get(ENTITY_ATTRIBUTE_ROLE),
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def get_validated_dict(json_str: Text) -> Dict[Text, Text]:
|
|
154
|
+
"""Converts the provided `json_str` to a valid dict containing the entity
|
|
155
|
+
attributes.
|
|
156
|
+
|
|
157
|
+
Users can specify entity roles, synonyms, groups for an entity in a dict, e.g.
|
|
158
|
+
[LA]{"entity": "city", "role": "to", "value": "Los Angeles"}.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
json_str: The entity dict as string without "{}".
|
|
162
|
+
|
|
163
|
+
Raises:
|
|
164
|
+
SchemaValidationError if validation of parsed entity fails.
|
|
165
|
+
InvalidEntityFormatException if provided entity is not valid json.
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
Deserialized and validated `json_str`.
|
|
169
|
+
"""
|
|
170
|
+
import json
|
|
171
|
+
from rasa.shared.utils.yaml import validate_training_data
|
|
172
|
+
import rasa.shared.nlu.training_data.schemas.data_schema as schema
|
|
173
|
+
|
|
174
|
+
# add {} as they are not part of the regex
|
|
175
|
+
try:
|
|
176
|
+
data = json.loads(f"{{{json_str}}}")
|
|
177
|
+
except JSONDecodeError as e:
|
|
178
|
+
raise InvalidEntityFormatException.create_from(
|
|
179
|
+
e,
|
|
180
|
+
f"Incorrect training data format ('{{{json_str}}}'). "
|
|
181
|
+
f"More info at {DOCS_URL_TRAINING_DATA_NLU}",
|
|
182
|
+
) from e
|
|
183
|
+
|
|
184
|
+
validate_training_data(data, schema.entity_dict_schema())
|
|
185
|
+
|
|
186
|
+
return data
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def replace_entities(training_example: Text) -> Text:
|
|
190
|
+
"""Replace special symbols related to the entities in the provided
|
|
191
|
+
training example.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
training_example: Original training example with special symbols.
|
|
195
|
+
|
|
196
|
+
Returns:
|
|
197
|
+
String with removed special symbols.
|
|
198
|
+
"""
|
|
199
|
+
return re.sub(
|
|
200
|
+
ENTITY_REGEX, lambda m: m.groupdict()[GROUP_ENTITY_TEXT], training_example
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def parse_training_example(example: Text, intent: Optional[Text] = None) -> "Message":
|
|
205
|
+
"""Extract entities and synonyms, and convert to plain text."""
|
|
206
|
+
entities = find_entities_in_training_example(example)
|
|
207
|
+
plain_text = replace_entities(example)
|
|
208
|
+
|
|
209
|
+
return Message.build(plain_text, intent, entities)
|