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,206 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import time
|
|
3
|
+
import json
|
|
4
|
+
import logging
|
|
5
|
+
import os
|
|
6
|
+
import requests
|
|
7
|
+
from typing import Any, List, Optional, Text, Dict
|
|
8
|
+
|
|
9
|
+
import rasa.utils.endpoints as endpoints_utils
|
|
10
|
+
from rasa.engine.graph import GraphComponent, ExecutionContext
|
|
11
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
12
|
+
from rasa.engine.storage.resource import Resource
|
|
13
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
14
|
+
from rasa.shared.constants import DOCS_URL_COMPONENTS
|
|
15
|
+
from rasa.shared.nlu.constants import ENTITIES, TEXT
|
|
16
|
+
from rasa.nlu.extractors.extractor import EntityExtractorMixin
|
|
17
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
18
|
+
import rasa.shared.utils.io
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def extract_value(match: Dict[Text, Any]) -> Dict[Text, Any]:
|
|
25
|
+
if match["value"].get("type") == "interval":
|
|
26
|
+
value = {
|
|
27
|
+
"to": match["value"].get("to", {}).get("value"),
|
|
28
|
+
"from": match["value"].get("from", {}).get("value"),
|
|
29
|
+
}
|
|
30
|
+
else:
|
|
31
|
+
value = match["value"].get("value")
|
|
32
|
+
|
|
33
|
+
return value
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def convert_duckling_format_to_rasa(
|
|
37
|
+
matches: List[Dict[Text, Any]]
|
|
38
|
+
) -> List[Dict[Text, Any]]:
|
|
39
|
+
extracted = []
|
|
40
|
+
|
|
41
|
+
for match in matches:
|
|
42
|
+
value = extract_value(match)
|
|
43
|
+
entity = {
|
|
44
|
+
"start": match["start"],
|
|
45
|
+
"end": match["end"],
|
|
46
|
+
"text": match.get("body", match.get("text", None)),
|
|
47
|
+
"value": value,
|
|
48
|
+
"confidence": 1.0,
|
|
49
|
+
"additional_info": match["value"],
|
|
50
|
+
"entity": match["dim"],
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
extracted.append(entity)
|
|
54
|
+
|
|
55
|
+
return extracted
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@DefaultV1Recipe.register(
|
|
59
|
+
DefaultV1Recipe.ComponentType.ENTITY_EXTRACTOR, is_trainable=False
|
|
60
|
+
)
|
|
61
|
+
class DucklingEntityExtractor(GraphComponent, EntityExtractorMixin):
|
|
62
|
+
"""Searches for structured entities, e.g. dates, using a duckling server."""
|
|
63
|
+
|
|
64
|
+
@staticmethod
|
|
65
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
66
|
+
"""The component's default config (see parent class for full docstring)."""
|
|
67
|
+
return {
|
|
68
|
+
# by default all dimensions recognized by duckling are returned
|
|
69
|
+
# dimensions can be configured to contain an array of strings
|
|
70
|
+
# with the names of the dimensions to filter for
|
|
71
|
+
"dimensions": None,
|
|
72
|
+
# http url of the running duckling server
|
|
73
|
+
"url": None,
|
|
74
|
+
# locale - if not set, we will use the language of the model
|
|
75
|
+
"locale": None,
|
|
76
|
+
# timezone like Europe/Berlin
|
|
77
|
+
# if not set the default timezone of Duckling is going to be used
|
|
78
|
+
"timezone": None,
|
|
79
|
+
# Timeout for receiving response from HTTP URL of the running
|
|
80
|
+
# duckling server. If not set the default timeout of duckling HTTP URL
|
|
81
|
+
# is set to 3 seconds.
|
|
82
|
+
"timeout": 3,
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
def __init__(self, config: Dict[Text, Any]) -> None:
|
|
86
|
+
"""Creates the extractor.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
config: The extractor's config.
|
|
90
|
+
"""
|
|
91
|
+
self.component_config = config
|
|
92
|
+
|
|
93
|
+
@classmethod
|
|
94
|
+
def create(
|
|
95
|
+
cls,
|
|
96
|
+
config: Dict[Text, Any],
|
|
97
|
+
model_storage: ModelStorage,
|
|
98
|
+
resource: Resource,
|
|
99
|
+
execution_context: ExecutionContext,
|
|
100
|
+
) -> DucklingEntityExtractor:
|
|
101
|
+
"""Creates component (see parent class for full docstring)."""
|
|
102
|
+
return cls(config)
|
|
103
|
+
|
|
104
|
+
def _url(self) -> Optional[Text]:
|
|
105
|
+
"""Return url of the duckling service. Environment var will override."""
|
|
106
|
+
if os.environ.get("RASA_DUCKLING_HTTP_URL"):
|
|
107
|
+
return os.environ["RASA_DUCKLING_HTTP_URL"]
|
|
108
|
+
|
|
109
|
+
return self.component_config.get("url")
|
|
110
|
+
|
|
111
|
+
def _payload(self, text: Text, reference_time: int) -> Dict[Text, Any]:
|
|
112
|
+
dimensions = self.component_config["dimensions"]
|
|
113
|
+
return {
|
|
114
|
+
"text": text,
|
|
115
|
+
"locale": self.component_config["locale"],
|
|
116
|
+
"tz": self.component_config.get("timezone"),
|
|
117
|
+
"dims": json.dumps(dimensions),
|
|
118
|
+
"reftime": reference_time,
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
def _duckling_parse(self, text: Text, reference_time: int) -> List[Dict[Text, Any]]:
|
|
122
|
+
"""Sends the request to the duckling server and parses the result.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
text: Text for duckling server to parse.
|
|
126
|
+
reference_time: Reference time in milliseconds.
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
JSON response from duckling server with parse data.
|
|
130
|
+
"""
|
|
131
|
+
parse_url = endpoints_utils.concat_url(self._url(), "/parse")
|
|
132
|
+
try:
|
|
133
|
+
payload = self._payload(text, reference_time)
|
|
134
|
+
headers = {
|
|
135
|
+
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
|
|
136
|
+
}
|
|
137
|
+
response = requests.post(
|
|
138
|
+
parse_url,
|
|
139
|
+
data=payload,
|
|
140
|
+
headers=headers,
|
|
141
|
+
timeout=self.component_config.get("timeout"),
|
|
142
|
+
)
|
|
143
|
+
if response.status_code == 200:
|
|
144
|
+
return response.json()
|
|
145
|
+
else:
|
|
146
|
+
logger.error(
|
|
147
|
+
f"Failed to get a proper response from remote "
|
|
148
|
+
f"duckling at '{parse_url}. "
|
|
149
|
+
f"Status Code: {response.status_code}. "
|
|
150
|
+
f"Response: {response.text}"
|
|
151
|
+
)
|
|
152
|
+
return []
|
|
153
|
+
except (
|
|
154
|
+
requests.exceptions.ConnectionError,
|
|
155
|
+
requests.exceptions.ReadTimeout,
|
|
156
|
+
) as e:
|
|
157
|
+
logger.error(
|
|
158
|
+
"Failed to connect to duckling http server. Make sure "
|
|
159
|
+
"the duckling server is running/healthy/not stale and the proper host "
|
|
160
|
+
"and port are set in the configuration. More "
|
|
161
|
+
"information on how to run the server can be found on "
|
|
162
|
+
"github: "
|
|
163
|
+
"https://github.com/facebook/duckling#quickstart "
|
|
164
|
+
"Error: {}".format(e)
|
|
165
|
+
)
|
|
166
|
+
return []
|
|
167
|
+
|
|
168
|
+
@staticmethod
|
|
169
|
+
def _reference_time_from_message(message: Message) -> int:
|
|
170
|
+
if message.time is not None:
|
|
171
|
+
try:
|
|
172
|
+
return message.time * 1000
|
|
173
|
+
except ValueError as e:
|
|
174
|
+
logging.warning(
|
|
175
|
+
"Could not parse timestamp {}. Instead "
|
|
176
|
+
"current UTC time will be passed to "
|
|
177
|
+
"duckling. Error: {}".format(message.time, e)
|
|
178
|
+
)
|
|
179
|
+
# fallbacks to current time, multiplied by 1000 because duckling
|
|
180
|
+
# requires the reftime in milliseconds
|
|
181
|
+
return int(time.time()) * 1000
|
|
182
|
+
|
|
183
|
+
def process(self, messages: List[Message]) -> List[Message]:
|
|
184
|
+
"""Augments the message with potentially extracted entities."""
|
|
185
|
+
if self._url() is None:
|
|
186
|
+
rasa.shared.utils.io.raise_warning(
|
|
187
|
+
"Duckling HTTP component in pipeline, but no "
|
|
188
|
+
"`url` configuration in the config "
|
|
189
|
+
"file nor is `RASA_DUCKLING_HTTP_URL` "
|
|
190
|
+
"set as an environment variable. No entities will be extracted!",
|
|
191
|
+
docs=DOCS_URL_COMPONENTS + "#DucklingEntityExtractor",
|
|
192
|
+
)
|
|
193
|
+
return messages
|
|
194
|
+
|
|
195
|
+
for message in messages:
|
|
196
|
+
reference_time = self._reference_time_from_message(message)
|
|
197
|
+
matches = self._duckling_parse(message.get(TEXT), reference_time)
|
|
198
|
+
all_extracted = convert_duckling_format_to_rasa(matches)
|
|
199
|
+
dimensions = self.component_config["dimensions"]
|
|
200
|
+
extracted = self.filter_irrelevant_entities(all_extracted, dimensions)
|
|
201
|
+
extracted = self.add_extractor_name(extracted)
|
|
202
|
+
message.set(
|
|
203
|
+
ENTITIES, message.get(ENTITIES, []) + extracted, add_to_output=True
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
return messages
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import os
|
|
3
|
+
from typing import Any, Dict, List, Optional, Text
|
|
4
|
+
import logging
|
|
5
|
+
|
|
6
|
+
from rasa.engine.graph import GraphComponent, ExecutionContext
|
|
7
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
8
|
+
from rasa.shared.constants import DOCS_URL_TRAINING_DATA
|
|
9
|
+
from rasa.shared.nlu.constants import ENTITIES, TEXT
|
|
10
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
11
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
12
|
+
from rasa.nlu.utils import write_json_to_file
|
|
13
|
+
from rasa.nlu.extractors.extractor import EntityExtractorMixin
|
|
14
|
+
import rasa.utils.io
|
|
15
|
+
import rasa.shared.utils.io
|
|
16
|
+
from rasa.engine.storage.resource import Resource
|
|
17
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@DefaultV1Recipe.register(
|
|
23
|
+
DefaultV1Recipe.ComponentType.ENTITY_EXTRACTOR, is_trainable=True
|
|
24
|
+
)
|
|
25
|
+
class EntitySynonymMapper(GraphComponent, EntityExtractorMixin):
|
|
26
|
+
"""Maps entities to their synonyms if they appear in the training data."""
|
|
27
|
+
|
|
28
|
+
SYNONYM_FILENAME = "synonyms.json"
|
|
29
|
+
|
|
30
|
+
def __init__(
|
|
31
|
+
self,
|
|
32
|
+
config: Optional[Dict[Text, Any]],
|
|
33
|
+
model_storage: ModelStorage,
|
|
34
|
+
resource: Resource,
|
|
35
|
+
synonyms: Optional[Dict[Text, Any]] = None,
|
|
36
|
+
) -> None:
|
|
37
|
+
"""Creates the mapper.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
config: The mapper's config.
|
|
41
|
+
model_storage: Storage which the component can use to persist and load
|
|
42
|
+
itself.
|
|
43
|
+
resource: Resource locator for this component which can be used to persist
|
|
44
|
+
and load itself from the `model_storage`.
|
|
45
|
+
synonyms: A dictionary of previously known synonyms.
|
|
46
|
+
"""
|
|
47
|
+
self._config = config
|
|
48
|
+
self._model_storage = model_storage
|
|
49
|
+
self._resource = resource
|
|
50
|
+
|
|
51
|
+
self.synonyms = synonyms if synonyms else {}
|
|
52
|
+
|
|
53
|
+
@classmethod
|
|
54
|
+
def create(
|
|
55
|
+
cls,
|
|
56
|
+
config: Dict[Text, Any],
|
|
57
|
+
model_storage: ModelStorage,
|
|
58
|
+
resource: Resource,
|
|
59
|
+
execution_context: ExecutionContext,
|
|
60
|
+
synonyms: Optional[Dict[Text, Any]] = None,
|
|
61
|
+
) -> EntitySynonymMapper:
|
|
62
|
+
"""Creates component (see parent class for full docstring)."""
|
|
63
|
+
return cls(config, model_storage, resource, synonyms)
|
|
64
|
+
|
|
65
|
+
def train(self, training_data: TrainingData) -> Resource:
|
|
66
|
+
"""Trains the synonym lookup table."""
|
|
67
|
+
for key, value in list(training_data.entity_synonyms.items()):
|
|
68
|
+
self._add_entities_if_synonyms(key, value)
|
|
69
|
+
|
|
70
|
+
for example in training_data.entity_examples:
|
|
71
|
+
for entity in example.get(ENTITIES, []):
|
|
72
|
+
entity_val = example.get(TEXT)[entity["start"] : entity["end"]]
|
|
73
|
+
self._add_entities_if_synonyms(entity_val, str(entity.get("value")))
|
|
74
|
+
|
|
75
|
+
self._persist()
|
|
76
|
+
return self._resource
|
|
77
|
+
|
|
78
|
+
def process(self, messages: List[Message]) -> List[Message]:
|
|
79
|
+
"""Modifies entities attached to message to resolve synonyms.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
messages: List containing the latest user message
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
List containing the latest user message with entities resolved to
|
|
86
|
+
synonyms if there is a match.
|
|
87
|
+
"""
|
|
88
|
+
for message in messages:
|
|
89
|
+
updated_entities = message.get(ENTITIES, [])[:]
|
|
90
|
+
self.replace_synonyms(updated_entities)
|
|
91
|
+
message.set(ENTITIES, updated_entities, add_to_output=True)
|
|
92
|
+
|
|
93
|
+
return messages
|
|
94
|
+
|
|
95
|
+
def _persist(self) -> None:
|
|
96
|
+
if self.synonyms:
|
|
97
|
+
with self._model_storage.write_to(self._resource) as storage:
|
|
98
|
+
entity_synonyms_file = storage / EntitySynonymMapper.SYNONYM_FILENAME
|
|
99
|
+
|
|
100
|
+
write_json_to_file(
|
|
101
|
+
entity_synonyms_file, self.synonyms, separators=(",", ": ")
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
# Adapt to get path from model storage and resource
|
|
105
|
+
@classmethod
|
|
106
|
+
def load(
|
|
107
|
+
cls,
|
|
108
|
+
config: Dict[Text, Any],
|
|
109
|
+
model_storage: ModelStorage,
|
|
110
|
+
resource: Resource,
|
|
111
|
+
execution_context: ExecutionContext,
|
|
112
|
+
**kwargs: Any,
|
|
113
|
+
) -> EntitySynonymMapper:
|
|
114
|
+
"""Loads trained component (see parent class for full docstring)."""
|
|
115
|
+
synonyms = None
|
|
116
|
+
try:
|
|
117
|
+
with model_storage.read_from(resource) as storage:
|
|
118
|
+
entity_synonyms_file = storage / EntitySynonymMapper.SYNONYM_FILENAME
|
|
119
|
+
|
|
120
|
+
if os.path.isfile(entity_synonyms_file):
|
|
121
|
+
synonyms = rasa.shared.utils.io.read_json_file(entity_synonyms_file)
|
|
122
|
+
else:
|
|
123
|
+
synonyms = None
|
|
124
|
+
rasa.shared.utils.io.raise_warning(
|
|
125
|
+
f"Failed to load synonyms file from '{entity_synonyms_file}'.",
|
|
126
|
+
docs=DOCS_URL_TRAINING_DATA + "#synonyms",
|
|
127
|
+
)
|
|
128
|
+
except ValueError:
|
|
129
|
+
logger.debug(
|
|
130
|
+
f"Failed to load {cls.__class__.__name__} from model storage. Resource "
|
|
131
|
+
f"'{resource.name}' doesn't exist."
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
return cls(config, model_storage, resource, synonyms)
|
|
135
|
+
|
|
136
|
+
def replace_synonyms(self, entities: List[Dict[Text, Any]]) -> None:
|
|
137
|
+
"""Replace any entities which match a synonym with the synonymous entity."""
|
|
138
|
+
for entity in entities:
|
|
139
|
+
# need to wrap in `str` to handle e.g. entity values of type int
|
|
140
|
+
entity_value = str(entity["value"])
|
|
141
|
+
if entity_value.lower() in self.synonyms:
|
|
142
|
+
entity["value"] = self.synonyms[entity_value.lower()]
|
|
143
|
+
self.add_processor_name(entity)
|
|
144
|
+
|
|
145
|
+
def _add_entities_if_synonyms(self, entity: Text, synonym: Optional[Text]) -> None:
|
|
146
|
+
"""Adds entities to the synonym lookup table.
|
|
147
|
+
|
|
148
|
+
Lowercase is used as keys to make the lookup case-insensitive.
|
|
149
|
+
"""
|
|
150
|
+
if synonym is not None:
|
|
151
|
+
entity = str(entity)
|
|
152
|
+
synonym = str(synonym)
|
|
153
|
+
if entity != synonym:
|
|
154
|
+
entity_lowercase = entity.lower()
|
|
155
|
+
if (
|
|
156
|
+
entity_lowercase in self.synonyms
|
|
157
|
+
and self.synonyms[entity_lowercase] != synonym
|
|
158
|
+
):
|
|
159
|
+
rasa.shared.utils.io.raise_warning(
|
|
160
|
+
f"Found conflicting synonym definitions "
|
|
161
|
+
f"for {entity_lowercase!r}. Overwriting target "
|
|
162
|
+
f"{self.synonyms[entity_lowercase]!r} with "
|
|
163
|
+
f"{synonym!r}. "
|
|
164
|
+
f"Check your training data and remove "
|
|
165
|
+
f"conflicting synonym definitions to "
|
|
166
|
+
f"prevent this from happening.",
|
|
167
|
+
docs=DOCS_URL_TRAINING_DATA + "#synonyms",
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
self.synonyms[entity_lowercase] = synonym
|
|
171
|
+
|
|
172
|
+
# add a self-reference to handle entities extracted in alternate cases
|
|
173
|
+
# i.e. for a synonym Austria,
|
|
174
|
+
# entities extracted as AUSTRIA, austria, ausTRIA, etc
|
|
175
|
+
# should also have the value of `Austria`
|
|
176
|
+
synonym_lowercase = synonym.lower()
|
|
177
|
+
if synonym_lowercase not in self.synonyms:
|
|
178
|
+
self.synonyms[synonym_lowercase] = synonym
|