rasa-pro 3.9.18__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rasa-pro might be problematic. Click here for more details.
- README.md +415 -0
- rasa/__init__.py +10 -0
- rasa/__main__.py +156 -0
- rasa/anonymization/__init__.py +2 -0
- rasa/anonymization/anonymisation_rule_yaml_reader.py +91 -0
- rasa/anonymization/anonymization_pipeline.py +286 -0
- rasa/anonymization/anonymization_rule_executor.py +260 -0
- rasa/anonymization/anonymization_rule_orchestrator.py +120 -0
- rasa/anonymization/schemas/config.yml +47 -0
- rasa/anonymization/utils.py +118 -0
- rasa/api.py +146 -0
- rasa/cli/__init__.py +5 -0
- rasa/cli/arguments/__init__.py +0 -0
- rasa/cli/arguments/data.py +81 -0
- rasa/cli/arguments/default_arguments.py +165 -0
- rasa/cli/arguments/evaluate.py +65 -0
- rasa/cli/arguments/export.py +51 -0
- rasa/cli/arguments/interactive.py +74 -0
- rasa/cli/arguments/run.py +204 -0
- rasa/cli/arguments/shell.py +13 -0
- rasa/cli/arguments/test.py +211 -0
- rasa/cli/arguments/train.py +263 -0
- rasa/cli/arguments/visualize.py +34 -0
- rasa/cli/arguments/x.py +30 -0
- rasa/cli/data.py +292 -0
- rasa/cli/e2e_test.py +586 -0
- rasa/cli/evaluate.py +222 -0
- rasa/cli/export.py +250 -0
- rasa/cli/inspect.py +63 -0
- rasa/cli/interactive.py +164 -0
- rasa/cli/license.py +65 -0
- rasa/cli/markers.py +78 -0
- rasa/cli/project_templates/__init__.py +0 -0
- rasa/cli/project_templates/calm/actions/__init__.py +0 -0
- rasa/cli/project_templates/calm/actions/action_template.py +27 -0
- rasa/cli/project_templates/calm/actions/add_contact.py +30 -0
- rasa/cli/project_templates/calm/actions/db.py +57 -0
- rasa/cli/project_templates/calm/actions/list_contacts.py +22 -0
- rasa/cli/project_templates/calm/actions/remove_contact.py +35 -0
- rasa/cli/project_templates/calm/config.yml +12 -0
- rasa/cli/project_templates/calm/credentials.yml +33 -0
- rasa/cli/project_templates/calm/data/flows/add_contact.yml +31 -0
- rasa/cli/project_templates/calm/data/flows/list_contacts.yml +14 -0
- rasa/cli/project_templates/calm/data/flows/remove_contact.yml +29 -0
- rasa/cli/project_templates/calm/db/contacts.json +10 -0
- rasa/cli/project_templates/calm/domain/add_contact.yml +39 -0
- rasa/cli/project_templates/calm/domain/list_contacts.yml +17 -0
- rasa/cli/project_templates/calm/domain/remove_contact.yml +38 -0
- rasa/cli/project_templates/calm/domain/shared.yml +10 -0
- rasa/cli/project_templates/calm/e2e_tests/cancelations/user_cancels_during_a_correction.yml +16 -0
- rasa/cli/project_templates/calm/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +7 -0
- rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_handle.yml +20 -0
- rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_name.yml +19 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +15 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_lists_contacts.yml +5 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact.yml +11 -0
- rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact_from_list.yml +12 -0
- rasa/cli/project_templates/calm/endpoints.yml +45 -0
- rasa/cli/project_templates/default/actions/__init__.py +0 -0
- rasa/cli/project_templates/default/actions/actions.py +27 -0
- rasa/cli/project_templates/default/config.yml +44 -0
- rasa/cli/project_templates/default/credentials.yml +33 -0
- rasa/cli/project_templates/default/data/nlu.yml +91 -0
- rasa/cli/project_templates/default/data/rules.yml +13 -0
- rasa/cli/project_templates/default/data/stories.yml +30 -0
- rasa/cli/project_templates/default/domain.yml +34 -0
- rasa/cli/project_templates/default/endpoints.yml +42 -0
- rasa/cli/project_templates/default/tests/test_stories.yml +91 -0
- rasa/cli/project_templates/tutorial/actions.py +22 -0
- rasa/cli/project_templates/tutorial/config.yml +11 -0
- rasa/cli/project_templates/tutorial/credentials.yml +33 -0
- rasa/cli/project_templates/tutorial/data/flows.yml +8 -0
- rasa/cli/project_templates/tutorial/data/patterns.yml +6 -0
- rasa/cli/project_templates/tutorial/domain.yml +21 -0
- rasa/cli/project_templates/tutorial/endpoints.yml +45 -0
- rasa/cli/run.py +135 -0
- rasa/cli/scaffold.py +269 -0
- rasa/cli/shell.py +141 -0
- rasa/cli/studio/__init__.py +0 -0
- rasa/cli/studio/download.py +62 -0
- rasa/cli/studio/studio.py +266 -0
- rasa/cli/studio/train.py +59 -0
- rasa/cli/studio/upload.py +77 -0
- rasa/cli/telemetry.py +102 -0
- rasa/cli/test.py +280 -0
- rasa/cli/train.py +260 -0
- rasa/cli/utils.py +464 -0
- rasa/cli/visualize.py +40 -0
- rasa/cli/x.py +206 -0
- rasa/constants.py +37 -0
- rasa/core/__init__.py +17 -0
- rasa/core/actions/__init__.py +0 -0
- rasa/core/actions/action.py +1225 -0
- rasa/core/actions/action_clean_stack.py +59 -0
- rasa/core/actions/action_exceptions.py +24 -0
- rasa/core/actions/action_run_slot_rejections.py +207 -0
- rasa/core/actions/action_trigger_chitchat.py +31 -0
- rasa/core/actions/action_trigger_flow.py +109 -0
- rasa/core/actions/action_trigger_search.py +31 -0
- rasa/core/actions/constants.py +5 -0
- rasa/core/actions/custom_action_executor.py +188 -0
- rasa/core/actions/forms.py +741 -0
- rasa/core/actions/grpc_custom_action_executor.py +251 -0
- rasa/core/actions/http_custom_action_executor.py +140 -0
- rasa/core/actions/loops.py +114 -0
- rasa/core/actions/two_stage_fallback.py +186 -0
- rasa/core/agent.py +555 -0
- rasa/core/auth_retry_tracker_store.py +122 -0
- rasa/core/brokers/__init__.py +0 -0
- rasa/core/brokers/broker.py +126 -0
- rasa/core/brokers/file.py +58 -0
- rasa/core/brokers/kafka.py +322 -0
- rasa/core/brokers/pika.py +386 -0
- rasa/core/brokers/sql.py +86 -0
- rasa/core/channels/__init__.py +55 -0
- rasa/core/channels/audiocodes.py +463 -0
- rasa/core/channels/botframework.py +338 -0
- rasa/core/channels/callback.py +84 -0
- rasa/core/channels/channel.py +419 -0
- rasa/core/channels/console.py +241 -0
- rasa/core/channels/development_inspector.py +93 -0
- rasa/core/channels/facebook.py +419 -0
- rasa/core/channels/hangouts.py +329 -0
- rasa/core/channels/inspector/.eslintrc.cjs +25 -0
- rasa/core/channels/inspector/.gitignore +23 -0
- rasa/core/channels/inspector/README.md +54 -0
- rasa/core/channels/inspector/assets/favicon.ico +0 -0
- rasa/core/channels/inspector/assets/rasa-chat.js +2 -0
- rasa/core/channels/inspector/custom.d.ts +3 -0
- rasa/core/channels/inspector/dist/assets/arc-b6e548fe.js +1 -0
- rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
- rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-fa03ac9e.js +10 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-ee67392a.js +2 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-9b283fae.js +2 -0
- rasa/core/channels/inspector/dist/assets/createText-62fc7601-8b6fcc2a.js +7 -0
- rasa/core/channels/inspector/dist/assets/edges-f2ad444c-22e77f4f.js +4 -0
- rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-60ffc87f.js +51 -0
- rasa/core/channels/inspector/dist/assets/flowDb-1972c806-9dd802e4.js +6 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-5fa1912f.js +4 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-1844e5a5.js +1 -0
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-622a1fd2.js +139 -0
- rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-e285a63a.js +266 -0
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-f237bdca.js +70 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-128cfa44.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-21dbcb97.woff +0 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-222b5e26.svg +329 -0
- rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-9ad89b2a.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-4b03d70e.js +1 -0
- rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
- rasa/core/channels/inspector/dist/assets/index-a5d3e69d.js +1040 -0
- rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-72a0fa5f.js +7 -0
- rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
- rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-82218c41.js +139 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-60c05ee4.woff +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-8335d9b8.svg +438 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-9cc39c75.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-ead13ccf.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-16705655.woff2 +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-5aeb07f9.woff +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9c459044.ttf +0 -0
- rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9e2898a4.svg +435 -0
- rasa/core/channels/inspector/dist/assets/layout-78cff630.js +1 -0
- rasa/core/channels/inspector/dist/assets/line-5038b469.js +1 -0
- rasa/core/channels/inspector/dist/assets/linear-c4fc4098.js +1 -0
- rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-c33c8ea6.js +109 -0
- rasa/core/channels/inspector/dist/assets/ordinal-ba9b4969.js +1 -0
- rasa/core/channels/inspector/dist/assets/path-53f90ab3.js +1 -0
- rasa/core/channels/inspector/dist/assets/pieDiagram-dbbf0591-a8d03059.js +35 -0
- rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-6a0e56b2.js +7 -0
- rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-2dc7c7bd.js +52 -0
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-2360fe39.js +8 -0
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-41b9f9ad.js +122 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-0aad326f.js +1 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-9847d984.js +1 -0
- rasa/core/channels/inspector/dist/assets/styles-080da4f6-564d890e.js +110 -0
- rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-38957613.js +159 -0
- rasa/core/channels/inspector/dist/assets/styles-9c745c82-f0fc6921.js +207 -0
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-ef3c5a77.js +1 -0
- rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-bf3e91c1.js +61 -0
- rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-4d4026c0.js +7 -0
- rasa/core/channels/inspector/dist/index.html +41 -0
- rasa/core/channels/inspector/index.html +39 -0
- rasa/core/channels/inspector/jest.config.ts +13 -0
- rasa/core/channels/inspector/package.json +48 -0
- rasa/core/channels/inspector/setupTests.ts +2 -0
- rasa/core/channels/inspector/src/App.tsx +170 -0
- rasa/core/channels/inspector/src/components/DiagramFlow.tsx +107 -0
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
- rasa/core/channels/inspector/src/components/DialogueStack.tsx +151 -0
- rasa/core/channels/inspector/src/components/ExpandIcon.tsx +16 -0
- rasa/core/channels/inspector/src/components/FullscreenButton.tsx +45 -0
- rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +19 -0
- rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +21 -0
- rasa/core/channels/inspector/src/components/RasaLogo.tsx +32 -0
- rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +39 -0
- rasa/core/channels/inspector/src/components/Slots.tsx +91 -0
- rasa/core/channels/inspector/src/components/Welcome.tsx +54 -0
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +382 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +240 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +42 -0
- rasa/core/channels/inspector/src/main.tsx +13 -0
- rasa/core/channels/inspector/src/theme/Button/Button.ts +29 -0
- rasa/core/channels/inspector/src/theme/Heading/Heading.ts +31 -0
- rasa/core/channels/inspector/src/theme/Input/Input.ts +27 -0
- rasa/core/channels/inspector/src/theme/Link/Link.ts +10 -0
- rasa/core/channels/inspector/src/theme/Modal/Modal.ts +47 -0
- rasa/core/channels/inspector/src/theme/Table/Table.tsx +38 -0
- rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +12 -0
- rasa/core/channels/inspector/src/theme/base/breakpoints.ts +8 -0
- rasa/core/channels/inspector/src/theme/base/colors.ts +88 -0
- rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +29 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.svg +329 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.svg +438 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.eot +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.svg +435 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.ttf +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff +0 -0
- rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff2 +0 -0
- rasa/core/channels/inspector/src/theme/base/radii.ts +9 -0
- rasa/core/channels/inspector/src/theme/base/shadows.ts +7 -0
- rasa/core/channels/inspector/src/theme/base/sizes.ts +7 -0
- rasa/core/channels/inspector/src/theme/base/space.ts +15 -0
- rasa/core/channels/inspector/src/theme/base/styles.ts +13 -0
- rasa/core/channels/inspector/src/theme/base/typography.ts +24 -0
- rasa/core/channels/inspector/src/theme/base/zIndices.ts +19 -0
- rasa/core/channels/inspector/src/theme/index.ts +101 -0
- rasa/core/channels/inspector/src/types.ts +64 -0
- rasa/core/channels/inspector/src/vite-env.d.ts +1 -0
- rasa/core/channels/inspector/tests/__mocks__/fileMock.ts +1 -0
- rasa/core/channels/inspector/tests/__mocks__/matchMedia.ts +16 -0
- rasa/core/channels/inspector/tests/__mocks__/styleMock.ts +1 -0
- rasa/core/channels/inspector/tests/renderWithProviders.tsx +14 -0
- rasa/core/channels/inspector/tsconfig.json +26 -0
- rasa/core/channels/inspector/tsconfig.node.json +10 -0
- rasa/core/channels/inspector/vite.config.ts +8 -0
- rasa/core/channels/inspector/yarn.lock +6156 -0
- rasa/core/channels/mattermost.py +229 -0
- rasa/core/channels/rasa_chat.py +126 -0
- rasa/core/channels/rest.py +225 -0
- rasa/core/channels/rocketchat.py +174 -0
- rasa/core/channels/slack.py +620 -0
- rasa/core/channels/socketio.py +274 -0
- rasa/core/channels/telegram.py +298 -0
- rasa/core/channels/twilio.py +169 -0
- rasa/core/channels/twilio_voice.py +367 -0
- rasa/core/channels/vier_cvg.py +374 -0
- rasa/core/channels/webexteams.py +134 -0
- rasa/core/concurrent_lock_store.py +210 -0
- rasa/core/constants.py +107 -0
- rasa/core/evaluation/__init__.py +0 -0
- rasa/core/evaluation/marker.py +267 -0
- rasa/core/evaluation/marker_base.py +923 -0
- rasa/core/evaluation/marker_stats.py +293 -0
- rasa/core/evaluation/marker_tracker_loader.py +103 -0
- rasa/core/exceptions.py +29 -0
- rasa/core/exporter.py +284 -0
- rasa/core/featurizers/__init__.py +0 -0
- rasa/core/featurizers/precomputation.py +410 -0
- rasa/core/featurizers/single_state_featurizer.py +421 -0
- rasa/core/featurizers/tracker_featurizers.py +1262 -0
- rasa/core/http_interpreter.py +89 -0
- rasa/core/information_retrieval/__init__.py +7 -0
- rasa/core/information_retrieval/faiss.py +121 -0
- rasa/core/information_retrieval/information_retrieval.py +129 -0
- rasa/core/information_retrieval/milvus.py +52 -0
- rasa/core/information_retrieval/qdrant.py +95 -0
- rasa/core/jobs.py +63 -0
- rasa/core/lock.py +139 -0
- rasa/core/lock_store.py +343 -0
- rasa/core/migrate.py +403 -0
- rasa/core/nlg/__init__.py +3 -0
- rasa/core/nlg/callback.py +146 -0
- rasa/core/nlg/contextual_response_rephraser.py +270 -0
- rasa/core/nlg/generator.py +230 -0
- rasa/core/nlg/interpolator.py +143 -0
- rasa/core/nlg/response.py +155 -0
- rasa/core/nlg/summarize.py +69 -0
- rasa/core/policies/__init__.py +0 -0
- rasa/core/policies/ensemble.py +329 -0
- rasa/core/policies/enterprise_search_policy.py +781 -0
- rasa/core/policies/enterprise_search_prompt_template.jinja2 +25 -0
- rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +60 -0
- rasa/core/policies/flow_policy.py +205 -0
- rasa/core/policies/flows/__init__.py +0 -0
- rasa/core/policies/flows/flow_exceptions.py +44 -0
- rasa/core/policies/flows/flow_executor.py +705 -0
- rasa/core/policies/flows/flow_step_result.py +43 -0
- rasa/core/policies/intentless_policy.py +922 -0
- rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
- rasa/core/policies/memoization.py +538 -0
- rasa/core/policies/policy.py +725 -0
- rasa/core/policies/rule_policy.py +1273 -0
- rasa/core/policies/ted_policy.py +2169 -0
- rasa/core/policies/unexpected_intent_policy.py +1022 -0
- rasa/core/processor.py +1422 -0
- rasa/core/run.py +331 -0
- rasa/core/secrets_manager/__init__.py +0 -0
- rasa/core/secrets_manager/constants.py +32 -0
- rasa/core/secrets_manager/endpoints.py +391 -0
- rasa/core/secrets_manager/factory.py +233 -0
- rasa/core/secrets_manager/secret_manager.py +262 -0
- rasa/core/secrets_manager/vault.py +574 -0
- rasa/core/test.py +1335 -0
- rasa/core/tracker_store.py +1699 -0
- rasa/core/train.py +105 -0
- rasa/core/training/__init__.py +89 -0
- rasa/core/training/converters/__init__.py +0 -0
- rasa/core/training/converters/responses_prefix_converter.py +119 -0
- rasa/core/training/interactive.py +1745 -0
- rasa/core/training/story_conflict.py +381 -0
- rasa/core/training/training.py +93 -0
- rasa/core/utils.py +339 -0
- rasa/core/visualize.py +70 -0
- rasa/dialogue_understanding/__init__.py +0 -0
- rasa/dialogue_understanding/coexistence/__init__.py +0 -0
- rasa/dialogue_understanding/coexistence/constants.py +4 -0
- rasa/dialogue_understanding/coexistence/intent_based_router.py +196 -0
- rasa/dialogue_understanding/coexistence/llm_based_router.py +260 -0
- rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
- rasa/dialogue_understanding/commands/__init__.py +49 -0
- rasa/dialogue_understanding/commands/can_not_handle_command.py +70 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +125 -0
- rasa/dialogue_understanding/commands/change_flow_command.py +44 -0
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +57 -0
- rasa/dialogue_understanding/commands/clarify_command.py +86 -0
- rasa/dialogue_understanding/commands/command.py +85 -0
- rasa/dialogue_understanding/commands/correct_slots_command.py +297 -0
- rasa/dialogue_understanding/commands/error_command.py +79 -0
- rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
- rasa/dialogue_understanding/commands/handle_code_change_command.py +73 -0
- rasa/dialogue_understanding/commands/human_handoff_command.py +66 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +57 -0
- rasa/dialogue_understanding/commands/noop_command.py +54 -0
- rasa/dialogue_understanding/commands/set_slot_command.py +160 -0
- rasa/dialogue_understanding/commands/skip_question_command.py +75 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +107 -0
- rasa/dialogue_understanding/generator/__init__.py +21 -0
- rasa/dialogue_understanding/generator/command_generator.py +343 -0
- rasa/dialogue_understanding/generator/constants.py +18 -0
- rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +412 -0
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +467 -0
- rasa/dialogue_understanding/generator/llm_command_generator.py +67 -0
- rasa/dialogue_understanding/generator/multi_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/multi_step/fill_slots_prompt.jinja2 +62 -0
- rasa/dialogue_understanding/generator/multi_step/handle_flows_prompt.jinja2 +38 -0
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +827 -0
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +218 -0
- rasa/dialogue_understanding/generator/single_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2 +57 -0
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +345 -0
- rasa/dialogue_understanding/patterns/__init__.py +0 -0
- rasa/dialogue_understanding/patterns/cancel.py +111 -0
- rasa/dialogue_understanding/patterns/cannot_handle.py +43 -0
- rasa/dialogue_understanding/patterns/chitchat.py +37 -0
- rasa/dialogue_understanding/patterns/clarify.py +97 -0
- rasa/dialogue_understanding/patterns/code_change.py +41 -0
- rasa/dialogue_understanding/patterns/collect_information.py +90 -0
- rasa/dialogue_understanding/patterns/completed.py +40 -0
- rasa/dialogue_understanding/patterns/continue_interrupted.py +42 -0
- rasa/dialogue_understanding/patterns/correction.py +278 -0
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +248 -0
- rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
- rasa/dialogue_understanding/patterns/internal_error.py +47 -0
- rasa/dialogue_understanding/patterns/search.py +37 -0
- rasa/dialogue_understanding/patterns/skip_question.py +38 -0
- rasa/dialogue_understanding/processor/__init__.py +0 -0
- rasa/dialogue_understanding/processor/command_processor.py +687 -0
- rasa/dialogue_understanding/processor/command_processor_component.py +39 -0
- rasa/dialogue_understanding/stack/__init__.py +0 -0
- rasa/dialogue_understanding/stack/dialogue_stack.py +178 -0
- rasa/dialogue_understanding/stack/frames/__init__.py +19 -0
- rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +27 -0
- rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +137 -0
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +157 -0
- rasa/dialogue_understanding/stack/frames/pattern_frame.py +10 -0
- rasa/dialogue_understanding/stack/frames/search_frame.py +27 -0
- rasa/dialogue_understanding/stack/utils.py +211 -0
- rasa/e2e_test/__init__.py +0 -0
- rasa/e2e_test/constants.py +11 -0
- rasa/e2e_test/e2e_test_case.py +366 -0
- rasa/e2e_test/e2e_test_result.py +34 -0
- rasa/e2e_test/e2e_test_runner.py +768 -0
- rasa/e2e_test/e2e_test_schema.yml +85 -0
- rasa/engine/__init__.py +0 -0
- rasa/engine/caching.py +463 -0
- rasa/engine/constants.py +17 -0
- rasa/engine/exceptions.py +14 -0
- rasa/engine/graph.py +637 -0
- rasa/engine/loader.py +36 -0
- rasa/engine/recipes/__init__.py +0 -0
- rasa/engine/recipes/config_files/default_config.yml +44 -0
- rasa/engine/recipes/default_components.py +99 -0
- rasa/engine/recipes/default_recipe.py +1251 -0
- rasa/engine/recipes/graph_recipe.py +79 -0
- rasa/engine/recipes/recipe.py +93 -0
- rasa/engine/runner/__init__.py +0 -0
- rasa/engine/runner/dask.py +250 -0
- rasa/engine/runner/interface.py +49 -0
- rasa/engine/storage/__init__.py +0 -0
- rasa/engine/storage/local_model_storage.py +246 -0
- rasa/engine/storage/resource.py +110 -0
- rasa/engine/storage/storage.py +203 -0
- rasa/engine/training/__init__.py +0 -0
- rasa/engine/training/components.py +176 -0
- rasa/engine/training/fingerprinting.py +64 -0
- rasa/engine/training/graph_trainer.py +256 -0
- rasa/engine/training/hooks.py +164 -0
- rasa/engine/validation.py +873 -0
- rasa/env.py +5 -0
- rasa/exceptions.py +69 -0
- rasa/graph_components/__init__.py +0 -0
- rasa/graph_components/converters/__init__.py +0 -0
- rasa/graph_components/converters/nlu_message_converter.py +48 -0
- rasa/graph_components/providers/__init__.py +0 -0
- rasa/graph_components/providers/domain_for_core_training_provider.py +87 -0
- rasa/graph_components/providers/domain_provider.py +71 -0
- rasa/graph_components/providers/flows_provider.py +74 -0
- rasa/graph_components/providers/forms_provider.py +44 -0
- rasa/graph_components/providers/nlu_training_data_provider.py +56 -0
- rasa/graph_components/providers/responses_provider.py +44 -0
- rasa/graph_components/providers/rule_only_provider.py +49 -0
- rasa/graph_components/providers/story_graph_provider.py +43 -0
- rasa/graph_components/providers/training_tracker_provider.py +55 -0
- rasa/graph_components/validators/__init__.py +0 -0
- rasa/graph_components/validators/default_recipe_validator.py +550 -0
- rasa/graph_components/validators/finetuning_validator.py +302 -0
- rasa/hooks.py +112 -0
- rasa/jupyter.py +63 -0
- rasa/markers/__init__.py +0 -0
- rasa/markers/marker.py +269 -0
- rasa/markers/marker_base.py +828 -0
- rasa/markers/upload.py +74 -0
- rasa/markers/validate.py +21 -0
- rasa/model.py +118 -0
- rasa/model_testing.py +457 -0
- rasa/model_training.py +536 -0
- rasa/nlu/__init__.py +7 -0
- rasa/nlu/classifiers/__init__.py +3 -0
- rasa/nlu/classifiers/classifier.py +5 -0
- rasa/nlu/classifiers/diet_classifier.py +1881 -0
- rasa/nlu/classifiers/fallback_classifier.py +192 -0
- rasa/nlu/classifiers/keyword_intent_classifier.py +188 -0
- rasa/nlu/classifiers/llm_intent_classifier.py +519 -0
- rasa/nlu/classifiers/logistic_regression_classifier.py +253 -0
- rasa/nlu/classifiers/mitie_intent_classifier.py +156 -0
- rasa/nlu/classifiers/regex_message_handler.py +56 -0
- rasa/nlu/classifiers/sklearn_intent_classifier.py +330 -0
- rasa/nlu/constants.py +77 -0
- rasa/nlu/convert.py +40 -0
- rasa/nlu/emulators/__init__.py +0 -0
- rasa/nlu/emulators/dialogflow.py +55 -0
- rasa/nlu/emulators/emulator.py +49 -0
- rasa/nlu/emulators/luis.py +86 -0
- rasa/nlu/emulators/no_emulator.py +10 -0
- rasa/nlu/emulators/wit.py +56 -0
- rasa/nlu/extractors/__init__.py +0 -0
- rasa/nlu/extractors/crf_entity_extractor.py +715 -0
- rasa/nlu/extractors/duckling_entity_extractor.py +206 -0
- rasa/nlu/extractors/entity_synonyms.py +178 -0
- rasa/nlu/extractors/extractor.py +470 -0
- rasa/nlu/extractors/mitie_entity_extractor.py +293 -0
- rasa/nlu/extractors/regex_entity_extractor.py +220 -0
- rasa/nlu/extractors/spacy_entity_extractor.py +95 -0
- rasa/nlu/featurizers/__init__.py +0 -0
- rasa/nlu/featurizers/dense_featurizer/__init__.py +0 -0
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +445 -0
- rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +768 -0
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +170 -0
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +132 -0
- rasa/nlu/featurizers/featurizer.py +89 -0
- rasa/nlu/featurizers/sparse_featurizer/__init__.py +0 -0
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +867 -0
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +571 -0
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +271 -0
- rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
- rasa/nlu/model.py +24 -0
- rasa/nlu/persistor.py +282 -0
- rasa/nlu/run.py +27 -0
- rasa/nlu/selectors/__init__.py +0 -0
- rasa/nlu/selectors/response_selector.py +987 -0
- rasa/nlu/test.py +1940 -0
- rasa/nlu/tokenizers/__init__.py +0 -0
- rasa/nlu/tokenizers/jieba_tokenizer.py +148 -0
- rasa/nlu/tokenizers/mitie_tokenizer.py +75 -0
- rasa/nlu/tokenizers/spacy_tokenizer.py +72 -0
- rasa/nlu/tokenizers/tokenizer.py +239 -0
- rasa/nlu/tokenizers/whitespace_tokenizer.py +106 -0
- rasa/nlu/utils/__init__.py +35 -0
- rasa/nlu/utils/bilou_utils.py +462 -0
- rasa/nlu/utils/hugging_face/__init__.py +0 -0
- rasa/nlu/utils/hugging_face/registry.py +108 -0
- rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +311 -0
- rasa/nlu/utils/mitie_utils.py +113 -0
- rasa/nlu/utils/pattern_utils.py +168 -0
- rasa/nlu/utils/spacy_utils.py +310 -0
- rasa/plugin.py +90 -0
- rasa/server.py +1551 -0
- rasa/shared/__init__.py +0 -0
- rasa/shared/constants.py +192 -0
- rasa/shared/core/__init__.py +0 -0
- rasa/shared/core/command_payload_reader.py +109 -0
- rasa/shared/core/constants.py +167 -0
- rasa/shared/core/conversation.py +46 -0
- rasa/shared/core/domain.py +2107 -0
- rasa/shared/core/events.py +2504 -0
- rasa/shared/core/flows/__init__.py +7 -0
- rasa/shared/core/flows/flow.py +362 -0
- rasa/shared/core/flows/flow_step.py +146 -0
- rasa/shared/core/flows/flow_step_links.py +319 -0
- rasa/shared/core/flows/flow_step_sequence.py +70 -0
- rasa/shared/core/flows/flows_list.py +223 -0
- rasa/shared/core/flows/flows_yaml_schema.json +217 -0
- rasa/shared/core/flows/nlu_trigger.py +117 -0
- rasa/shared/core/flows/steps/__init__.py +24 -0
- rasa/shared/core/flows/steps/action.py +56 -0
- rasa/shared/core/flows/steps/call.py +64 -0
- rasa/shared/core/flows/steps/collect.py +112 -0
- rasa/shared/core/flows/steps/constants.py +5 -0
- rasa/shared/core/flows/steps/continuation.py +36 -0
- rasa/shared/core/flows/steps/end.py +22 -0
- rasa/shared/core/flows/steps/internal.py +44 -0
- rasa/shared/core/flows/steps/link.py +51 -0
- rasa/shared/core/flows/steps/no_operation.py +48 -0
- rasa/shared/core/flows/steps/set_slots.py +50 -0
- rasa/shared/core/flows/steps/start.py +30 -0
- rasa/shared/core/flows/validation.py +527 -0
- rasa/shared/core/flows/yaml_flows_io.py +278 -0
- rasa/shared/core/generator.py +908 -0
- rasa/shared/core/slot_mappings.py +526 -0
- rasa/shared/core/slots.py +649 -0
- rasa/shared/core/trackers.py +1177 -0
- rasa/shared/core/training_data/__init__.py +0 -0
- rasa/shared/core/training_data/loading.py +89 -0
- rasa/shared/core/training_data/story_reader/__init__.py +0 -0
- rasa/shared/core/training_data/story_reader/story_reader.py +129 -0
- rasa/shared/core/training_data/story_reader/story_step_builder.py +168 -0
- rasa/shared/core/training_data/story_reader/yaml_story_reader.py +888 -0
- rasa/shared/core/training_data/story_writer/__init__.py +0 -0
- rasa/shared/core/training_data/story_writer/story_writer.py +76 -0
- rasa/shared/core/training_data/story_writer/yaml_story_writer.py +444 -0
- rasa/shared/core/training_data/structures.py +838 -0
- rasa/shared/core/training_data/visualization.html +146 -0
- rasa/shared/core/training_data/visualization.py +603 -0
- rasa/shared/data.py +249 -0
- rasa/shared/engine/__init__.py +0 -0
- rasa/shared/engine/caching.py +26 -0
- rasa/shared/exceptions.py +163 -0
- rasa/shared/importers/__init__.py +0 -0
- rasa/shared/importers/importer.py +704 -0
- rasa/shared/importers/multi_project.py +203 -0
- rasa/shared/importers/rasa.py +99 -0
- rasa/shared/importers/utils.py +34 -0
- rasa/shared/nlu/__init__.py +0 -0
- rasa/shared/nlu/constants.py +47 -0
- rasa/shared/nlu/interpreter.py +10 -0
- rasa/shared/nlu/training_data/__init__.py +0 -0
- rasa/shared/nlu/training_data/entities_parser.py +208 -0
- rasa/shared/nlu/training_data/features.py +492 -0
- rasa/shared/nlu/training_data/formats/__init__.py +10 -0
- rasa/shared/nlu/training_data/formats/dialogflow.py +163 -0
- rasa/shared/nlu/training_data/formats/luis.py +87 -0
- rasa/shared/nlu/training_data/formats/rasa.py +135 -0
- rasa/shared/nlu/training_data/formats/rasa_yaml.py +603 -0
- rasa/shared/nlu/training_data/formats/readerwriter.py +244 -0
- rasa/shared/nlu/training_data/formats/wit.py +52 -0
- rasa/shared/nlu/training_data/loading.py +137 -0
- rasa/shared/nlu/training_data/lookup_tables_parser.py +30 -0
- rasa/shared/nlu/training_data/message.py +490 -0
- rasa/shared/nlu/training_data/schemas/__init__.py +0 -0
- rasa/shared/nlu/training_data/schemas/data_schema.py +85 -0
- rasa/shared/nlu/training_data/schemas/nlu.yml +53 -0
- rasa/shared/nlu/training_data/schemas/responses.yml +70 -0
- rasa/shared/nlu/training_data/synonyms_parser.py +42 -0
- rasa/shared/nlu/training_data/training_data.py +730 -0
- rasa/shared/nlu/training_data/util.py +223 -0
- rasa/shared/providers/__init__.py +0 -0
- rasa/shared/providers/openai/__init__.py +0 -0
- rasa/shared/providers/openai/clients.py +43 -0
- rasa/shared/providers/openai/session_handler.py +110 -0
- rasa/shared/utils/__init__.py +0 -0
- rasa/shared/utils/cli.py +72 -0
- rasa/shared/utils/common.py +308 -0
- rasa/shared/utils/constants.py +4 -0
- rasa/shared/utils/io.py +415 -0
- rasa/shared/utils/llm.py +404 -0
- rasa/shared/utils/pykwalify_extensions.py +27 -0
- rasa/shared/utils/schemas/__init__.py +0 -0
- rasa/shared/utils/schemas/config.yml +2 -0
- rasa/shared/utils/schemas/domain.yml +145 -0
- rasa/shared/utils/schemas/events.py +212 -0
- rasa/shared/utils/schemas/model_config.yml +46 -0
- rasa/shared/utils/schemas/stories.yml +173 -0
- rasa/shared/utils/yaml.py +786 -0
- rasa/studio/__init__.py +0 -0
- rasa/studio/auth.py +268 -0
- rasa/studio/config.py +127 -0
- rasa/studio/constants.py +18 -0
- rasa/studio/data_handler.py +359 -0
- rasa/studio/download.py +483 -0
- rasa/studio/results_logger.py +137 -0
- rasa/studio/train.py +135 -0
- rasa/studio/upload.py +433 -0
- rasa/telemetry.py +1737 -0
- rasa/tracing/__init__.py +0 -0
- rasa/tracing/config.py +353 -0
- rasa/tracing/constants.py +62 -0
- rasa/tracing/instrumentation/__init__.py +0 -0
- rasa/tracing/instrumentation/attribute_extractors.py +672 -0
- rasa/tracing/instrumentation/instrumentation.py +1185 -0
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +144 -0
- rasa/tracing/instrumentation/metrics.py +294 -0
- rasa/tracing/metric_instrument_provider.py +205 -0
- rasa/utils/__init__.py +0 -0
- rasa/utils/beta.py +83 -0
- rasa/utils/cli.py +28 -0
- rasa/utils/common.py +635 -0
- rasa/utils/converter.py +53 -0
- rasa/utils/endpoints.py +302 -0
- rasa/utils/io.py +260 -0
- rasa/utils/licensing.py +534 -0
- rasa/utils/log_utils.py +174 -0
- rasa/utils/mapper.py +210 -0
- rasa/utils/ml_utils.py +145 -0
- rasa/utils/plotting.py +362 -0
- rasa/utils/singleton.py +23 -0
- rasa/utils/tensorflow/__init__.py +0 -0
- rasa/utils/tensorflow/callback.py +112 -0
- rasa/utils/tensorflow/constants.py +116 -0
- rasa/utils/tensorflow/crf.py +492 -0
- rasa/utils/tensorflow/data_generator.py +440 -0
- rasa/utils/tensorflow/environment.py +161 -0
- rasa/utils/tensorflow/exceptions.py +5 -0
- rasa/utils/tensorflow/feature_array.py +366 -0
- rasa/utils/tensorflow/layers.py +1565 -0
- rasa/utils/tensorflow/layers_utils.py +113 -0
- rasa/utils/tensorflow/metrics.py +281 -0
- rasa/utils/tensorflow/model_data.py +798 -0
- rasa/utils/tensorflow/model_data_utils.py +499 -0
- rasa/utils/tensorflow/models.py +935 -0
- rasa/utils/tensorflow/rasa_layers.py +1094 -0
- rasa/utils/tensorflow/transformer.py +640 -0
- rasa/utils/tensorflow/types.py +6 -0
- rasa/utils/train_utils.py +572 -0
- rasa/utils/url_tools.py +53 -0
- rasa/utils/yaml.py +54 -0
- rasa/validator.py +1337 -0
- rasa/version.py +3 -0
- rasa_pro-3.9.18.dist-info/METADATA +563 -0
- rasa_pro-3.9.18.dist-info/NOTICE +5 -0
- rasa_pro-3.9.18.dist-info/RECORD +662 -0
- rasa_pro-3.9.18.dist-info/WHEEL +4 -0
- rasa_pro-3.9.18.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import itertools
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import Iterable, Union, Text, Optional, List, Any, Tuple, Dict, Set
|
|
6
|
+
|
|
7
|
+
import numpy as np
|
|
8
|
+
import scipy.sparse
|
|
9
|
+
from safetensors.numpy import save_file, load_file
|
|
10
|
+
|
|
11
|
+
import rasa.shared.nlu.training_data.util
|
|
12
|
+
import rasa.shared.utils.io
|
|
13
|
+
from rasa.shared.nlu.constants import FEATURE_TYPE_SEQUENCE, FEATURE_TYPE_SENTENCE
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class FeatureMetadata:
|
|
18
|
+
data_type: str
|
|
19
|
+
attribute: str
|
|
20
|
+
origin: Union[str, List[str]]
|
|
21
|
+
is_sparse: bool
|
|
22
|
+
shape: tuple
|
|
23
|
+
safetensors_key: str
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def save_features(
|
|
27
|
+
features_dict: Dict[Text, List[Features]], file_name: str
|
|
28
|
+
) -> Dict[str, Any]:
|
|
29
|
+
"""Save a dictionary of Features lists to disk using safetensors.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
features_dict: Dictionary mapping strings to lists of Features objects
|
|
33
|
+
file_name: File to save the features to
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
The metadata to reconstruct the features.
|
|
37
|
+
"""
|
|
38
|
+
# All tensors are stored in a single safetensors file
|
|
39
|
+
tensors_to_save = {}
|
|
40
|
+
# Metadata will be stored separately
|
|
41
|
+
metadata = {}
|
|
42
|
+
|
|
43
|
+
for key, features_list in features_dict.items():
|
|
44
|
+
feature_metadata_list = []
|
|
45
|
+
|
|
46
|
+
for idx, feature in enumerate(features_list):
|
|
47
|
+
# Create a unique key for this tensor in the safetensors file
|
|
48
|
+
safetensors_key = f"{key}_{idx}"
|
|
49
|
+
|
|
50
|
+
# Convert sparse matrices to dense if needed
|
|
51
|
+
if feature.is_sparse():
|
|
52
|
+
# For sparse matrices, use the COO format
|
|
53
|
+
coo = feature.features.tocoo() # type:ignore[union-attr]
|
|
54
|
+
# Save data, row indices and col indices separately
|
|
55
|
+
tensors_to_save[f"{safetensors_key}_data"] = coo.data
|
|
56
|
+
tensors_to_save[f"{safetensors_key}_row"] = coo.row
|
|
57
|
+
tensors_to_save[f"{safetensors_key}_col"] = coo.col
|
|
58
|
+
else:
|
|
59
|
+
tensors_to_save[safetensors_key] = feature.features
|
|
60
|
+
|
|
61
|
+
# Store metadata
|
|
62
|
+
metadata_item = FeatureMetadata(
|
|
63
|
+
data_type=feature.type,
|
|
64
|
+
attribute=feature.attribute,
|
|
65
|
+
origin=feature.origin,
|
|
66
|
+
is_sparse=feature.is_sparse(),
|
|
67
|
+
shape=feature.features.shape,
|
|
68
|
+
safetensors_key=safetensors_key,
|
|
69
|
+
)
|
|
70
|
+
feature_metadata_list.append(vars(metadata_item))
|
|
71
|
+
|
|
72
|
+
metadata[key] = feature_metadata_list
|
|
73
|
+
|
|
74
|
+
# Save tensors
|
|
75
|
+
save_file(tensors_to_save, file_name)
|
|
76
|
+
|
|
77
|
+
return metadata
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def load_features(
|
|
81
|
+
filename: str, metadata: Dict[str, Any]
|
|
82
|
+
) -> Dict[Text, List[Features]]:
|
|
83
|
+
"""Load Features dictionary from disk.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
filename: File name of the safetensors file.
|
|
87
|
+
metadata: Metadata to reconstruct the features.
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
Dictionary mapping strings to lists of Features objects
|
|
91
|
+
"""
|
|
92
|
+
# Load tensors
|
|
93
|
+
tensors = load_file(filename)
|
|
94
|
+
|
|
95
|
+
# Reconstruct the features dictionary
|
|
96
|
+
features_dict: Dict[Text, List[Features]] = {}
|
|
97
|
+
|
|
98
|
+
for key, feature_metadata_list in metadata.items():
|
|
99
|
+
features_list = []
|
|
100
|
+
|
|
101
|
+
for meta in feature_metadata_list:
|
|
102
|
+
safetensors_key = meta["safetensors_key"]
|
|
103
|
+
|
|
104
|
+
if meta["is_sparse"]:
|
|
105
|
+
# Reconstruct sparse matrix from COO format
|
|
106
|
+
data = tensors[f"{safetensors_key}_data"]
|
|
107
|
+
row = tensors[f"{safetensors_key}_row"]
|
|
108
|
+
col = tensors[f"{safetensors_key}_col"]
|
|
109
|
+
|
|
110
|
+
features_matrix = scipy.sparse.coo_matrix(
|
|
111
|
+
(data, (row, col)), shape=tuple(meta["shape"])
|
|
112
|
+
).tocsr() # Convert back to CSR format
|
|
113
|
+
else:
|
|
114
|
+
features_matrix = tensors[safetensors_key]
|
|
115
|
+
|
|
116
|
+
# Reconstruct Features object
|
|
117
|
+
features = Features(
|
|
118
|
+
features=features_matrix,
|
|
119
|
+
feature_type=meta["data_type"],
|
|
120
|
+
attribute=meta["attribute"],
|
|
121
|
+
origin=meta["origin"],
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
features_list.append(features)
|
|
125
|
+
|
|
126
|
+
features_dict[key] = features_list
|
|
127
|
+
|
|
128
|
+
return features_dict
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class Features:
|
|
132
|
+
"""Stores the features produced by any featurizer."""
|
|
133
|
+
|
|
134
|
+
def __init__(
|
|
135
|
+
self,
|
|
136
|
+
features: Union[np.ndarray, scipy.sparse.spmatrix],
|
|
137
|
+
feature_type: Text,
|
|
138
|
+
attribute: Text,
|
|
139
|
+
origin: Union[Text, List[Text]],
|
|
140
|
+
) -> None:
|
|
141
|
+
"""Initializes the Features object.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
features: The features.
|
|
145
|
+
feature_type: Type of the feature, e.g. FEATURE_TYPE_SENTENCE.
|
|
146
|
+
attribute: Message attribute, e.g. INTENT or TEXT.
|
|
147
|
+
origin: Name of the component that created the features.
|
|
148
|
+
"""
|
|
149
|
+
self.features = features
|
|
150
|
+
self.type = feature_type
|
|
151
|
+
self.origin = origin
|
|
152
|
+
self.attribute = attribute
|
|
153
|
+
self._cached_fingerprint: Optional[Text] = None
|
|
154
|
+
if not self.is_dense() and not self.is_sparse():
|
|
155
|
+
raise ValueError(
|
|
156
|
+
"Features must either be a numpy array for dense "
|
|
157
|
+
"features or a scipy sparse matrix for sparse features."
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
def __repr__(self) -> Text:
|
|
161
|
+
return (
|
|
162
|
+
f"{self.__class__.__name__}("
|
|
163
|
+
f"features={self.features}, "
|
|
164
|
+
f"type={self.type}, "
|
|
165
|
+
f"origin={self.origin}, "
|
|
166
|
+
f"attribute={self.attribute})"
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
def __str__(self) -> Text:
|
|
170
|
+
return (
|
|
171
|
+
f"{self.__class__.__name__}("
|
|
172
|
+
f"features.shape={self.features.shape}, "
|
|
173
|
+
f"is_sparse={self.is_sparse()}, "
|
|
174
|
+
f"type={self.type}, "
|
|
175
|
+
f"origin={self.origin}, "
|
|
176
|
+
f"attribute={self.attribute})"
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
def is_sparse(self) -> bool:
|
|
180
|
+
"""Checks if features are sparse or not.
|
|
181
|
+
|
|
182
|
+
Returns:
|
|
183
|
+
True, if features are sparse, false otherwise.
|
|
184
|
+
"""
|
|
185
|
+
return isinstance(self.features, scipy.sparse.spmatrix)
|
|
186
|
+
|
|
187
|
+
def is_dense(self) -> bool:
|
|
188
|
+
"""Checks if features are dense or not.
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
True, if features are dense, false otherwise.
|
|
192
|
+
"""
|
|
193
|
+
return not self.is_sparse()
|
|
194
|
+
|
|
195
|
+
def combine_with_features(self, additional_features: Optional[Features]) -> None:
|
|
196
|
+
"""Combine the incoming features with this instance's features.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
additional_features: additional features to add
|
|
200
|
+
|
|
201
|
+
Returns:
|
|
202
|
+
Combined features.
|
|
203
|
+
"""
|
|
204
|
+
if additional_features is None:
|
|
205
|
+
return
|
|
206
|
+
|
|
207
|
+
if self.is_dense() and additional_features.is_dense():
|
|
208
|
+
self._combine_dense_features(additional_features)
|
|
209
|
+
elif self.is_sparse() and additional_features.is_sparse():
|
|
210
|
+
self._combine_sparse_features(additional_features)
|
|
211
|
+
else:
|
|
212
|
+
raise ValueError("Cannot combine sparse and dense features.")
|
|
213
|
+
|
|
214
|
+
def _combine_dense_features(self, additional_features: Features) -> None:
|
|
215
|
+
if self.features.ndim != additional_features.features.ndim:
|
|
216
|
+
raise ValueError(
|
|
217
|
+
f"Cannot combine dense features as sequence dimensions do not "
|
|
218
|
+
f"match: {self.features.ndim} != {additional_features.features.ndim}."
|
|
219
|
+
)
|
|
220
|
+
self.features = np.concatenate(
|
|
221
|
+
(self.features, additional_features.features), axis=-1
|
|
222
|
+
)
|
|
223
|
+
self._cached_fingerprint = None
|
|
224
|
+
|
|
225
|
+
def _combine_sparse_features(self, additional_features: Features) -> None:
|
|
226
|
+
from scipy.sparse import hstack
|
|
227
|
+
|
|
228
|
+
if self.features.shape[0] != additional_features.features.shape[0]:
|
|
229
|
+
raise ValueError(
|
|
230
|
+
f"Cannot combine sparse features as sequence dimensions do not "
|
|
231
|
+
f"match: {self.features.shape[0]} != "
|
|
232
|
+
f"{additional_features.features.shape[0]}."
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
self.features = hstack([self.features, additional_features.features])
|
|
236
|
+
self._cached_fingerprint = None
|
|
237
|
+
|
|
238
|
+
def __key__(
|
|
239
|
+
self,
|
|
240
|
+
) -> Tuple[
|
|
241
|
+
Text, Text, Union[np.ndarray, scipy.sparse.spmatrix], Union[Text, List[Text]]
|
|
242
|
+
]:
|
|
243
|
+
"""Returns a 4-tuple of defining properties.
|
|
244
|
+
|
|
245
|
+
Returns:
|
|
246
|
+
Tuple of type, attribute, features, and origin properties.
|
|
247
|
+
"""
|
|
248
|
+
return self.type, self.attribute, self.features, self.origin
|
|
249
|
+
|
|
250
|
+
def __eq__(self, other: Any) -> bool:
|
|
251
|
+
"""Tests if the `self` `Feature` equals to the `other`.
|
|
252
|
+
|
|
253
|
+
Args:
|
|
254
|
+
other: The other object.
|
|
255
|
+
|
|
256
|
+
Returns:
|
|
257
|
+
`True` when the other object is a `Feature` and has the same
|
|
258
|
+
type, attribute, and feature tensors.
|
|
259
|
+
"""
|
|
260
|
+
if not isinstance(other, Features):
|
|
261
|
+
return False
|
|
262
|
+
|
|
263
|
+
return (
|
|
264
|
+
other.type == self.type
|
|
265
|
+
and other.attribute == self.attribute
|
|
266
|
+
and other.features == self.features
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
def fingerprint(self) -> Text:
|
|
270
|
+
"""Calculate a stable string fingerprint for the features."""
|
|
271
|
+
if self._cached_fingerprint is None:
|
|
272
|
+
if self.is_dense():
|
|
273
|
+
f_as_text = self.features.tobytes()
|
|
274
|
+
else:
|
|
275
|
+
f_as_text = rasa.shared.nlu.training_data.util.sparse_matrix_to_string(
|
|
276
|
+
self.features
|
|
277
|
+
)
|
|
278
|
+
self._cached_fingerprint = rasa.shared.utils.io.deep_container_fingerprint(
|
|
279
|
+
[self.type, self.origin, self.attribute, f_as_text]
|
|
280
|
+
)
|
|
281
|
+
return self._cached_fingerprint
|
|
282
|
+
|
|
283
|
+
@staticmethod
|
|
284
|
+
def filter(
|
|
285
|
+
features_list: List[Features],
|
|
286
|
+
attributes: Optional[Iterable[Text]] = None,
|
|
287
|
+
type: Optional[Text] = None,
|
|
288
|
+
origin: Optional[List[Text]] = None,
|
|
289
|
+
is_sparse: Optional[bool] = None,
|
|
290
|
+
) -> List[Features]:
|
|
291
|
+
"""Filters the given list of features.
|
|
292
|
+
|
|
293
|
+
Args:
|
|
294
|
+
features_list: list of features to be filtered
|
|
295
|
+
attributes: List of attributes that we're interested in. Set this to `None`
|
|
296
|
+
to disable this filter.
|
|
297
|
+
type: The type of feature we're interested in. Set this to `None`
|
|
298
|
+
to disable this filter.
|
|
299
|
+
origin: If specified, this method will check that the exact order of origins
|
|
300
|
+
matches the given list of origins. The reason for this is that if
|
|
301
|
+
multiple origins are listed for a Feature, this means that this feature
|
|
302
|
+
has been created by concatenating Features from the listed origins in
|
|
303
|
+
that particular order.
|
|
304
|
+
is_sparse: Defines whether all features that we're interested in should be
|
|
305
|
+
sparse. Set this to `None` to disable this filter.
|
|
306
|
+
|
|
307
|
+
Returns:
|
|
308
|
+
sub-list of features with the desired properties
|
|
309
|
+
"""
|
|
310
|
+
filtered = features_list
|
|
311
|
+
if attributes is not None:
|
|
312
|
+
attributes = set(attributes)
|
|
313
|
+
filtered = [f for f in filtered if f.attribute in attributes]
|
|
314
|
+
if origin is not None:
|
|
315
|
+
filtered = [
|
|
316
|
+
f
|
|
317
|
+
for f in filtered
|
|
318
|
+
if (f.origin if not isinstance(f.origin, Text) else list([f.origin]))
|
|
319
|
+
== origin
|
|
320
|
+
]
|
|
321
|
+
if type is not None:
|
|
322
|
+
filtered = [f for f in filtered if f.type == type]
|
|
323
|
+
if is_sparse is not None:
|
|
324
|
+
filtered = [f for f in filtered if f.is_sparse() == is_sparse]
|
|
325
|
+
return filtered
|
|
326
|
+
|
|
327
|
+
@staticmethod
|
|
328
|
+
def groupby_attribute(
|
|
329
|
+
features_list: List[Features], attributes: Optional[Iterable[Text]] = None
|
|
330
|
+
) -> Dict[Text, List[Features]]:
|
|
331
|
+
"""Groups the given features according to their attribute.
|
|
332
|
+
|
|
333
|
+
Args:
|
|
334
|
+
features_list: list of features to be grouped
|
|
335
|
+
attributes: If specified, the result will be a grouping with respect to
|
|
336
|
+
the given attributes. If some specified attribute has no features attached
|
|
337
|
+
to it, then the resulting dictionary will map it to an empty list.
|
|
338
|
+
If this is None, the result will be a grouping according to all attributes
|
|
339
|
+
for which features can be found.
|
|
340
|
+
|
|
341
|
+
Returns:
|
|
342
|
+
a mapping from the requested attributes to the list of correspoding
|
|
343
|
+
features
|
|
344
|
+
"""
|
|
345
|
+
# ensure all requested attributes are present in the output - regardless
|
|
346
|
+
# of whether we find features later
|
|
347
|
+
extracted: Dict[Text, List[Features]] = (
|
|
348
|
+
dict()
|
|
349
|
+
if attributes is None
|
|
350
|
+
else {attribute: [] for attribute in attributes}
|
|
351
|
+
)
|
|
352
|
+
# extract features for all (requested) attributes
|
|
353
|
+
for feat in features_list:
|
|
354
|
+
if attributes is None or feat.attribute in attributes:
|
|
355
|
+
extracted.setdefault(feat.attribute, []).append(feat)
|
|
356
|
+
return extracted
|
|
357
|
+
|
|
358
|
+
@staticmethod
|
|
359
|
+
def combine(
|
|
360
|
+
features_list: List[Features], expected_origins: Optional[List[Text]] = None
|
|
361
|
+
) -> Features:
|
|
362
|
+
"""Combine features of the same type and level that describe the same attribute.
|
|
363
|
+
|
|
364
|
+
If sequence features are to be combined, then they must have the same
|
|
365
|
+
sequence dimension.
|
|
366
|
+
|
|
367
|
+
Args:
|
|
368
|
+
features: Non-empty list of Features of the same type and level that
|
|
369
|
+
describe the same attribute.
|
|
370
|
+
expected_origins: The expected origins of the given features. This method
|
|
371
|
+
will check that the origin information of each feature is as expected, i.e.
|
|
372
|
+
the origin of the i-th feature in the given list is the i-th origin
|
|
373
|
+
in this list of origins.
|
|
374
|
+
|
|
375
|
+
Raises:
|
|
376
|
+
`ValueError` will be raised
|
|
377
|
+
- if the given list is empty
|
|
378
|
+
- if there are inconsistencies in the given list of `Features`
|
|
379
|
+
- if the origins aren't as expected
|
|
380
|
+
"""
|
|
381
|
+
if len(features_list) == 0:
|
|
382
|
+
raise ValueError("Expected a non-empty list of Features.")
|
|
383
|
+
if len(features_list) == 1:
|
|
384
|
+
# nothing to combine here
|
|
385
|
+
return features_list[0]
|
|
386
|
+
|
|
387
|
+
# Un-Pack the Origin information
|
|
388
|
+
origin_of_combination = [f.origin for f in features_list]
|
|
389
|
+
origin_of_combination = [
|
|
390
|
+
featurizer_name
|
|
391
|
+
for origin in origin_of_combination
|
|
392
|
+
for featurizer_name in (origin if isinstance(origin, List) else [origin])
|
|
393
|
+
]
|
|
394
|
+
|
|
395
|
+
# Sanity Checks
|
|
396
|
+
# (1) origins must be as expected
|
|
397
|
+
if expected_origins is not None:
|
|
398
|
+
if origin_of_combination is not None:
|
|
399
|
+
for idx, (expected, actual) in enumerate(
|
|
400
|
+
itertools.zip_longest(expected_origins, origin_of_combination)
|
|
401
|
+
):
|
|
402
|
+
if expected != actual:
|
|
403
|
+
raise ValueError(
|
|
404
|
+
f"Expected '{expected}' to be the origin of the {idx}-th "
|
|
405
|
+
f"feature (because of `origin_of_combination`) but found a "
|
|
406
|
+
f"feature from '{actual}'."
|
|
407
|
+
)
|
|
408
|
+
# (2) attributes (is_sparse, type, attribute) must coincide
|
|
409
|
+
# Note: we could also use `filter` for this check, but then the error msgs
|
|
410
|
+
# aren't as nice.
|
|
411
|
+
sparseness: Set[bool] = set(f.is_sparse() for f in features_list)
|
|
412
|
+
if len(sparseness) > 1:
|
|
413
|
+
raise ValueError(
|
|
414
|
+
"Expected all Features to have the same sparseness property but "
|
|
415
|
+
"found both (sparse and dense)."
|
|
416
|
+
)
|
|
417
|
+
types: Set[Text] = set(f.type for f in features_list)
|
|
418
|
+
if len(types) > 1:
|
|
419
|
+
raise ValueError(
|
|
420
|
+
f"Expected all Features to have the same type but found the "
|
|
421
|
+
f"following types {types}."
|
|
422
|
+
)
|
|
423
|
+
attributes: Set[Text] = set(f.attribute for f in features_list)
|
|
424
|
+
if len(attributes) > 1:
|
|
425
|
+
raise ValueError(
|
|
426
|
+
f"Expected all Features to describe the same attribute but found "
|
|
427
|
+
f"attributes: {attributes}."
|
|
428
|
+
)
|
|
429
|
+
# (3) dimensions must match
|
|
430
|
+
# Note: We shouldn't have to check sentence-level features here but it doesn't
|
|
431
|
+
# hurt either.
|
|
432
|
+
dimensions = set(f.features.shape[0] for f in features_list)
|
|
433
|
+
if len(dimensions) > 1:
|
|
434
|
+
raise ValueError(
|
|
435
|
+
f"Expected all sequence dimensions to match but found {dimensions}."
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
# Combine the features
|
|
439
|
+
arbitrary_feature = features_list[0]
|
|
440
|
+
if not arbitrary_feature.is_sparse():
|
|
441
|
+
features = np.concatenate([f.features for f in features_list], axis=-1)
|
|
442
|
+
else:
|
|
443
|
+
features = scipy.sparse.hstack([f.features for f in features_list])
|
|
444
|
+
return Features(
|
|
445
|
+
features=features,
|
|
446
|
+
feature_type=arbitrary_feature.type,
|
|
447
|
+
attribute=arbitrary_feature.attribute,
|
|
448
|
+
origin=origin_of_combination,
|
|
449
|
+
)
|
|
450
|
+
|
|
451
|
+
@staticmethod
|
|
452
|
+
def reduce(
|
|
453
|
+
features_list: List[Features], expected_origins: Optional[List[Text]] = None
|
|
454
|
+
) -> List[Features]:
|
|
455
|
+
"""Combines features of same type and level into one Feature.
|
|
456
|
+
|
|
457
|
+
Args:
|
|
458
|
+
features_list: list of Features which must all describe the same attribute
|
|
459
|
+
expected_origins: if specified, this list will be used to validate that
|
|
460
|
+
the features from the right featurizers are combined in the right order
|
|
461
|
+
(cf. `Features.combine`)
|
|
462
|
+
|
|
463
|
+
Returns:
|
|
464
|
+
a list of the combined Features, i.e. at most 4 Features, where
|
|
465
|
+
- all the sparse features are listed before the dense features
|
|
466
|
+
- sequence feature is always listed before the sentence feature with the
|
|
467
|
+
same sparseness property
|
|
468
|
+
"""
|
|
469
|
+
if len(features_list) == 1:
|
|
470
|
+
return features_list
|
|
471
|
+
# sanity check
|
|
472
|
+
different_settings = set(f.attribute for f in features_list)
|
|
473
|
+
if len(different_settings) > 1:
|
|
474
|
+
raise ValueError(
|
|
475
|
+
f"Expected all Features to describe the same attribute but found "
|
|
476
|
+
f" {different_settings}."
|
|
477
|
+
)
|
|
478
|
+
output = []
|
|
479
|
+
for is_sparse in [True, False]:
|
|
480
|
+
# all sparse features before all dense features
|
|
481
|
+
for type in [FEATURE_TYPE_SEQUENCE, FEATURE_TYPE_SENTENCE]:
|
|
482
|
+
# sequence feature that is (not) sparse before sentence feature that is
|
|
483
|
+
# (not) sparse
|
|
484
|
+
sublist = Features.filter(
|
|
485
|
+
features_list=features_list, type=type, is_sparse=is_sparse
|
|
486
|
+
)
|
|
487
|
+
if sublist:
|
|
488
|
+
combined_feature = Features.combine(
|
|
489
|
+
sublist, expected_origins=expected_origins
|
|
490
|
+
)
|
|
491
|
+
output.append(combined_feature)
|
|
492
|
+
return output
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
from rasa.shared.nlu.training_data.formats.rasa_yaml import RasaYAMLReader # noqa: F401
|
|
2
|
+
from rasa.shared.nlu.training_data.formats.dialogflow import ( # noqa: F401
|
|
3
|
+
DialogflowReader,
|
|
4
|
+
)
|
|
5
|
+
from rasa.shared.nlu.training_data.formats.luis import LuisReader # noqa: F401
|
|
6
|
+
from rasa.shared.nlu.training_data.formats.rasa import ( # noqa: F401
|
|
7
|
+
RasaReader,
|
|
8
|
+
RasaWriter,
|
|
9
|
+
)
|
|
10
|
+
from rasa.shared.nlu.training_data.formats.wit import WitReader # noqa: F401
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Any, Dict, Optional, Text, List, Tuple, Union
|
|
5
|
+
|
|
6
|
+
import rasa.shared.nlu.training_data.util
|
|
7
|
+
from rasa.shared.constants import DOCS_BASE_URL
|
|
8
|
+
from rasa.shared.nlu.training_data.formats.readerwriter import TrainingDataReader
|
|
9
|
+
from rasa.shared.nlu.training_data.util import transform_entity_synonyms
|
|
10
|
+
import rasa.shared.utils.io
|
|
11
|
+
|
|
12
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
13
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
DOCS_URL_MIGRATE_GOOGLE = DOCS_BASE_URL + "/migrate-from/google-dialogflow-to-rasa/"
|
|
18
|
+
|
|
19
|
+
DIALOGFLOW_PACKAGE = "dialogflow_package"
|
|
20
|
+
DIALOGFLOW_AGENT = "dialogflow_agent"
|
|
21
|
+
DIALOGFLOW_INTENT = "dialogflow_intent"
|
|
22
|
+
DIALOGFLOW_INTENT_EXAMPLES = "dialogflow_intent_examples"
|
|
23
|
+
DIALOGFLOW_ENTITIES = "dialogflow_entities"
|
|
24
|
+
DIALOGFLOW_ENTITY_ENTRIES = "dialogflow_entity_entries"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class DialogflowReader(TrainingDataReader):
|
|
28
|
+
"""Reader for NLU training data."""
|
|
29
|
+
|
|
30
|
+
def read(self, filename: Union[Text, Path], **kwargs: Any) -> "TrainingData":
|
|
31
|
+
"""Loads training data stored in the Dialogflow data format."""
|
|
32
|
+
language = kwargs["language"]
|
|
33
|
+
fformat = kwargs["fformat"]
|
|
34
|
+
|
|
35
|
+
if fformat not in {DIALOGFLOW_INTENT, DIALOGFLOW_ENTITIES}:
|
|
36
|
+
raise ValueError(
|
|
37
|
+
"fformat must be either {}, or {}".format(
|
|
38
|
+
DIALOGFLOW_INTENT, DIALOGFLOW_ENTITIES
|
|
39
|
+
)
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
root_js = rasa.shared.utils.io.read_json_file(filename)
|
|
43
|
+
|
|
44
|
+
if isinstance(filename, Path):
|
|
45
|
+
filename = str(filename)
|
|
46
|
+
|
|
47
|
+
examples = self._read_examples(filename, language, fformat)
|
|
48
|
+
|
|
49
|
+
if not examples:
|
|
50
|
+
rasa.shared.utils.io.raise_warning(
|
|
51
|
+
f"No training examples found for dialogflow file {filename}!",
|
|
52
|
+
docs=DOCS_URL_MIGRATE_GOOGLE,
|
|
53
|
+
)
|
|
54
|
+
return TrainingData()
|
|
55
|
+
elif fformat == DIALOGFLOW_INTENT:
|
|
56
|
+
return self._read_intent(root_js, examples)
|
|
57
|
+
else: # path for DIALOGFLOW_ENTITIES
|
|
58
|
+
return self._read_entities(root_js, examples)
|
|
59
|
+
|
|
60
|
+
def _read_intent(
|
|
61
|
+
self, intent: Dict[Text, Any], examples: List[Dict[Text, Any]]
|
|
62
|
+
) -> "TrainingData":
|
|
63
|
+
"""Reads the intent and examples from respective jsons."""
|
|
64
|
+
intent_name = intent.get("name")
|
|
65
|
+
|
|
66
|
+
training_examples = []
|
|
67
|
+
for ex in examples:
|
|
68
|
+
text, entities = self._join_text_chunks(ex["data"])
|
|
69
|
+
training_examples.append(Message.build(text, intent_name, entities))
|
|
70
|
+
|
|
71
|
+
return TrainingData(training_examples)
|
|
72
|
+
|
|
73
|
+
def _join_text_chunks(
|
|
74
|
+
self, chunks: List[Dict[Text, Any]]
|
|
75
|
+
) -> Tuple[Text, List[Dict[Text, Any]]]:
|
|
76
|
+
"""Combines text chunks and extracts entities."""
|
|
77
|
+
utterance = ""
|
|
78
|
+
entities = []
|
|
79
|
+
for chunk in chunks:
|
|
80
|
+
entity = self._extract_entity(chunk, len(utterance))
|
|
81
|
+
if entity:
|
|
82
|
+
entities.append(entity)
|
|
83
|
+
utterance += chunk["text"]
|
|
84
|
+
|
|
85
|
+
return utterance, entities
|
|
86
|
+
|
|
87
|
+
@staticmethod
|
|
88
|
+
def _extract_entity(
|
|
89
|
+
chunk: Dict[Text, Any], current_offset: int
|
|
90
|
+
) -> Optional[Dict[Text, Any]]:
|
|
91
|
+
"""Extract an entity from a chunk if present."""
|
|
92
|
+
entity = None
|
|
93
|
+
if "meta" in chunk or "alias" in chunk:
|
|
94
|
+
start = current_offset
|
|
95
|
+
text = chunk["text"]
|
|
96
|
+
end = start + len(text)
|
|
97
|
+
entity_type = chunk.get("alias", chunk["meta"])
|
|
98
|
+
if entity_type != "@sys.ignore":
|
|
99
|
+
entity = rasa.shared.nlu.training_data.util.build_entity(
|
|
100
|
+
start, end, text, entity_type
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
return entity
|
|
104
|
+
|
|
105
|
+
@staticmethod
|
|
106
|
+
def _flatten(list_of_lists: List[List[Any]]) -> List[Any]:
|
|
107
|
+
return [item for items in list_of_lists for item in items]
|
|
108
|
+
|
|
109
|
+
@staticmethod
|
|
110
|
+
def _extract_lookup_tables(
|
|
111
|
+
entity: Dict[Text, Any], examples: List[Dict[Text, Any]]
|
|
112
|
+
) -> Optional[List[Dict[Text, Any]]]:
|
|
113
|
+
"""Extracts the lookup table from the entity synonyms."""
|
|
114
|
+
synonyms = [e["synonyms"] for e in examples if "synonyms" in e]
|
|
115
|
+
synonyms = DialogflowReader._flatten(synonyms)
|
|
116
|
+
elements = [synonym for synonym in synonyms if "@" not in synonym]
|
|
117
|
+
|
|
118
|
+
if len(elements) == 0:
|
|
119
|
+
return None
|
|
120
|
+
return [{"name": entity.get("name"), "elements": elements}]
|
|
121
|
+
|
|
122
|
+
@staticmethod
|
|
123
|
+
def _extract_regex_features(
|
|
124
|
+
entity: Dict[Text, Any], examples: List[Dict[Text, Any]]
|
|
125
|
+
) -> List[Dict[Text, Any]]:
|
|
126
|
+
"""Extract the regex features from the entity synonyms."""
|
|
127
|
+
synonyms = [e["synonyms"] for e in examples if "synonyms" in e]
|
|
128
|
+
synonyms = DialogflowReader._flatten(synonyms)
|
|
129
|
+
return [
|
|
130
|
+
{"name": entity.get("name"), "pattern": synonym} for synonym in synonyms
|
|
131
|
+
]
|
|
132
|
+
|
|
133
|
+
@staticmethod
|
|
134
|
+
def _read_entities(
|
|
135
|
+
entity: Dict[Text, Any], examples: List[Dict[Text, Any]]
|
|
136
|
+
) -> "TrainingData":
|
|
137
|
+
entity_synonyms = transform_entity_synonyms(examples)
|
|
138
|
+
|
|
139
|
+
if entity["isRegexp"]:
|
|
140
|
+
regex_features = DialogflowReader._extract_regex_features(entity, examples)
|
|
141
|
+
return TrainingData([], entity_synonyms, regex_features, [])
|
|
142
|
+
else:
|
|
143
|
+
lookup_tables = DialogflowReader._extract_lookup_tables(entity, examples)
|
|
144
|
+
return TrainingData([], entity_synonyms, [], lookup_tables)
|
|
145
|
+
|
|
146
|
+
@staticmethod
|
|
147
|
+
def _read_examples(
|
|
148
|
+
fn: Text, language: Text, fformat: Text
|
|
149
|
+
) -> Optional[List[Dict[Text, Any]]]:
|
|
150
|
+
"""Infer and load example file based on root filename and root format."""
|
|
151
|
+
if fformat == DIALOGFLOW_INTENT:
|
|
152
|
+
examples_type = "usersays"
|
|
153
|
+
else:
|
|
154
|
+
examples_type = "entries"
|
|
155
|
+
examples_fn_ending = f"_{examples_type}_{language}.json"
|
|
156
|
+
examples_fn = fn.replace(".json", examples_fn_ending)
|
|
157
|
+
if os.path.isfile(examples_fn):
|
|
158
|
+
return rasa.shared.utils.io.read_json_file(examples_fn)
|
|
159
|
+
else:
|
|
160
|
+
return None
|
|
161
|
+
|
|
162
|
+
def reads(self, s: Text, **kwargs: Any) -> "TrainingData":
|
|
163
|
+
raise NotImplementedError
|