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,253 @@
|
|
|
1
|
+
from typing import Any, Text, Dict, List, Type, Tuple
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
from scipy.sparse import hstack, vstack, csr_matrix
|
|
5
|
+
from sklearn.exceptions import NotFittedError
|
|
6
|
+
from sklearn.linear_model import LogisticRegression
|
|
7
|
+
from sklearn.utils.validation import check_is_fitted
|
|
8
|
+
|
|
9
|
+
from rasa.engine.graph import ExecutionContext, GraphComponent
|
|
10
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
11
|
+
from rasa.engine.storage.resource import Resource
|
|
12
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
13
|
+
from rasa.nlu.classifiers import LABEL_RANKING_LENGTH
|
|
14
|
+
from rasa.nlu.classifiers.classifier import IntentClassifier
|
|
15
|
+
from rasa.nlu.featurizers.featurizer import Featurizer
|
|
16
|
+
from rasa.shared.nlu.constants import TEXT, INTENT
|
|
17
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
18
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
19
|
+
from rasa.utils.tensorflow.constants import RANKING_LENGTH
|
|
20
|
+
|
|
21
|
+
structlogger = structlog.get_logger()
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@DefaultV1Recipe.register(
|
|
25
|
+
DefaultV1Recipe.ComponentType.INTENT_CLASSIFIER, is_trainable=True
|
|
26
|
+
)
|
|
27
|
+
class LogisticRegressionClassifier(IntentClassifier, GraphComponent):
|
|
28
|
+
"""Intent classifier using the Logistic Regression."""
|
|
29
|
+
|
|
30
|
+
@classmethod
|
|
31
|
+
def required_components(cls) -> List[Type]:
|
|
32
|
+
"""Components that should be included in the pipeline before this component."""
|
|
33
|
+
return [Featurizer]
|
|
34
|
+
|
|
35
|
+
@staticmethod
|
|
36
|
+
def required_packages() -> List[Text]:
|
|
37
|
+
"""Any extra python dependencies required for this component to run."""
|
|
38
|
+
return ["sklearn"]
|
|
39
|
+
|
|
40
|
+
@staticmethod
|
|
41
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
42
|
+
"""The component's default config (see parent class for full docstring)."""
|
|
43
|
+
return {
|
|
44
|
+
"max_iter": 100,
|
|
45
|
+
"solver": "lbfgs",
|
|
46
|
+
"tol": 1e-4,
|
|
47
|
+
"random_state": 42,
|
|
48
|
+
RANKING_LENGTH: LABEL_RANKING_LENGTH,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
def __init__(
|
|
52
|
+
self,
|
|
53
|
+
config: Dict[Text, Any],
|
|
54
|
+
name: Text,
|
|
55
|
+
model_storage: ModelStorage,
|
|
56
|
+
resource: Resource,
|
|
57
|
+
) -> None:
|
|
58
|
+
"""Construct a new classifier."""
|
|
59
|
+
self.name = name
|
|
60
|
+
self.config = {**self.get_default_config(), **config}
|
|
61
|
+
self.clf = LogisticRegression(
|
|
62
|
+
solver=self.config["solver"],
|
|
63
|
+
max_iter=self.config["max_iter"],
|
|
64
|
+
class_weight="balanced",
|
|
65
|
+
tol=self.config["tol"],
|
|
66
|
+
random_state=self.config["random_state"],
|
|
67
|
+
# Added these parameters to ensure sklearn changes won't affect us.
|
|
68
|
+
# Should a sklearn update the defaults, we won't be affected.
|
|
69
|
+
dual=False,
|
|
70
|
+
fit_intercept=True,
|
|
71
|
+
intercept_scaling=1,
|
|
72
|
+
multi_class="auto",
|
|
73
|
+
verbose=0,
|
|
74
|
+
warm_start=False,
|
|
75
|
+
n_jobs=None,
|
|
76
|
+
l1_ratio=None,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
# We need to use these later when saving the trained component.
|
|
80
|
+
self._model_storage = model_storage
|
|
81
|
+
self._resource = resource
|
|
82
|
+
|
|
83
|
+
def _create_X(self, messages: List[Message]) -> csr_matrix:
|
|
84
|
+
"""This method creates a sparse X array that can be used for predicting."""
|
|
85
|
+
X = []
|
|
86
|
+
for e in messages:
|
|
87
|
+
# First element is sequence features, second is sentence features
|
|
88
|
+
sparse_feats = e.get_sparse_features(attribute=TEXT)[1]
|
|
89
|
+
# First element is sequence features, second is sentence features
|
|
90
|
+
dense_feats = e.get_dense_features(attribute=TEXT)[1]
|
|
91
|
+
together = hstack(
|
|
92
|
+
[
|
|
93
|
+
csr_matrix(sparse_feats.features if sparse_feats else []),
|
|
94
|
+
csr_matrix(dense_feats.features if dense_feats else []),
|
|
95
|
+
]
|
|
96
|
+
)
|
|
97
|
+
X.append(together)
|
|
98
|
+
return vstack(X)
|
|
99
|
+
|
|
100
|
+
def _create_training_matrix(
|
|
101
|
+
self, training_data: TrainingData
|
|
102
|
+
) -> Tuple[csr_matrix, List[str]]:
|
|
103
|
+
"""This method creates a scikit-learn compatible (X, y) training pairs."""
|
|
104
|
+
y = []
|
|
105
|
+
|
|
106
|
+
examples = [
|
|
107
|
+
e
|
|
108
|
+
for e in training_data.intent_examples
|
|
109
|
+
if (e.get("intent") and e.get("text"))
|
|
110
|
+
]
|
|
111
|
+
|
|
112
|
+
for e in examples:
|
|
113
|
+
y.append(e.get(INTENT))
|
|
114
|
+
|
|
115
|
+
return self._create_X(examples), y
|
|
116
|
+
|
|
117
|
+
def train(self, training_data: TrainingData) -> Resource:
|
|
118
|
+
"""Train the intent classifier on a data set."""
|
|
119
|
+
if not training_data.intent_examples:
|
|
120
|
+
structlogger.warning(
|
|
121
|
+
"logistic_regression_classifier.not_able_to_train",
|
|
122
|
+
event_info=(
|
|
123
|
+
f"Cannot train '{self.__class__.__name__}'. No data was provided. "
|
|
124
|
+
f"Skipping training of the classifier."
|
|
125
|
+
),
|
|
126
|
+
)
|
|
127
|
+
return self._resource
|
|
128
|
+
|
|
129
|
+
X, y = self._create_training_matrix(training_data)
|
|
130
|
+
if X.shape[0] == 0:
|
|
131
|
+
structlogger.debug(
|
|
132
|
+
"logistic_regression_classifier.not_able_to_train",
|
|
133
|
+
event_info=(
|
|
134
|
+
f"Cannot train '{self.__class__.__name__}'. No data was provided. "
|
|
135
|
+
f"Skipping training of the classifier."
|
|
136
|
+
),
|
|
137
|
+
)
|
|
138
|
+
return self._resource
|
|
139
|
+
|
|
140
|
+
self.clf.fit(X, y)
|
|
141
|
+
self.persist()
|
|
142
|
+
|
|
143
|
+
return self._resource
|
|
144
|
+
|
|
145
|
+
@classmethod
|
|
146
|
+
def create(
|
|
147
|
+
cls,
|
|
148
|
+
config: Dict[Text, Any],
|
|
149
|
+
model_storage: ModelStorage,
|
|
150
|
+
resource: Resource,
|
|
151
|
+
execution_context: ExecutionContext,
|
|
152
|
+
) -> "LogisticRegressionClassifier":
|
|
153
|
+
"""Creates a new untrained component (see parent class for full docstring)."""
|
|
154
|
+
return cls(config, execution_context.node_name, model_storage, resource)
|
|
155
|
+
|
|
156
|
+
def process(self, messages: List[Message]) -> List[Message]:
|
|
157
|
+
"""Return the most likely intent and its probability for a message."""
|
|
158
|
+
# Check if the classifier is trained
|
|
159
|
+
if not self.is_trained():
|
|
160
|
+
structlogger.warning(
|
|
161
|
+
"logistic_regression_classifier.not_trained.skip_intent_prediction",
|
|
162
|
+
event_info=(
|
|
163
|
+
f"The '{self.__class__.__name__}' is not trained. "
|
|
164
|
+
f"Skipping intent prediction."
|
|
165
|
+
),
|
|
166
|
+
)
|
|
167
|
+
return messages
|
|
168
|
+
|
|
169
|
+
X = self._create_X(messages)
|
|
170
|
+
probas = self.clf.predict_proba(X)
|
|
171
|
+
for idx, message in enumerate(messages):
|
|
172
|
+
intents = self.clf.classes_
|
|
173
|
+
intent_ranking = [
|
|
174
|
+
{"name": k, "confidence": v} for k, v in zip(intents, probas[idx])
|
|
175
|
+
]
|
|
176
|
+
sorted_ranking = sorted(intent_ranking, key=lambda e: -e["confidence"])
|
|
177
|
+
intent = sorted_ranking[0]
|
|
178
|
+
if self.config[RANKING_LENGTH] > 0:
|
|
179
|
+
sorted_ranking = sorted_ranking[: self.config[RANKING_LENGTH]]
|
|
180
|
+
message.set("intent", intent, add_to_output=True)
|
|
181
|
+
message.set("intent_ranking", sorted_ranking, add_to_output=True)
|
|
182
|
+
return messages
|
|
183
|
+
|
|
184
|
+
def persist(self) -> None:
|
|
185
|
+
"""Persist this model into the passed directory."""
|
|
186
|
+
import skops.io as sio
|
|
187
|
+
|
|
188
|
+
with self._model_storage.write_to(self._resource) as model_dir:
|
|
189
|
+
path = model_dir / f"{self._resource.name}.skops"
|
|
190
|
+
sio.dump(self.clf, path)
|
|
191
|
+
structlogger.debug(
|
|
192
|
+
"logistic_regression_classifier.persist",
|
|
193
|
+
event_info=f"Saved intent classifier to '{path}'.",
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
@classmethod
|
|
197
|
+
def load(
|
|
198
|
+
cls,
|
|
199
|
+
config: Dict[Text, Any],
|
|
200
|
+
model_storage: ModelStorage,
|
|
201
|
+
resource: Resource,
|
|
202
|
+
execution_context: ExecutionContext,
|
|
203
|
+
**kwargs: Any,
|
|
204
|
+
) -> "LogisticRegressionClassifier":
|
|
205
|
+
"""Loads trained component (see parent class for full docstring)."""
|
|
206
|
+
import skops.io as sio
|
|
207
|
+
|
|
208
|
+
try:
|
|
209
|
+
with model_storage.read_from(resource) as model_dir:
|
|
210
|
+
classifier_file = model_dir / f"{resource.name}.skops"
|
|
211
|
+
unknown_types = sio.get_untrusted_types(file=classifier_file)
|
|
212
|
+
|
|
213
|
+
if unknown_types:
|
|
214
|
+
structlogger.error(
|
|
215
|
+
f"Untrusted types found when loading {classifier_file}!",
|
|
216
|
+
unknown_types=unknown_types,
|
|
217
|
+
)
|
|
218
|
+
raise ValueError()
|
|
219
|
+
|
|
220
|
+
classifier = sio.load(classifier_file, trusted=unknown_types)
|
|
221
|
+
component = cls(
|
|
222
|
+
config, execution_context.node_name, model_storage, resource
|
|
223
|
+
)
|
|
224
|
+
component.clf = classifier
|
|
225
|
+
return component
|
|
226
|
+
except ValueError:
|
|
227
|
+
structlogger.debug(
|
|
228
|
+
"logistic_regression_classifier.load",
|
|
229
|
+
event_info=(
|
|
230
|
+
f"Failed to load {cls.__class__.__name__} from model storage. "
|
|
231
|
+
f"Resource '{resource.name}' doesn't exist."
|
|
232
|
+
),
|
|
233
|
+
)
|
|
234
|
+
return cls.create(config, model_storage, resource, execution_context)
|
|
235
|
+
|
|
236
|
+
def process_training_data(self, training_data: TrainingData) -> TrainingData:
|
|
237
|
+
"""Process the training data."""
|
|
238
|
+
self.process(training_data.training_examples)
|
|
239
|
+
return training_data
|
|
240
|
+
|
|
241
|
+
@classmethod
|
|
242
|
+
def validate_config(cls, config: Dict[Text, Any]) -> None:
|
|
243
|
+
"""Validates that the component is configured properly."""
|
|
244
|
+
pass
|
|
245
|
+
|
|
246
|
+
def is_trained(self) -> bool:
|
|
247
|
+
"""Checks if the model has been trained."""
|
|
248
|
+
try:
|
|
249
|
+
# This will raise a NotFittedError if the classifier isn't fitted
|
|
250
|
+
check_is_fitted(self.clf)
|
|
251
|
+
return True
|
|
252
|
+
except NotFittedError:
|
|
253
|
+
return False
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import logging
|
|
3
|
+
from rasa.nlu.featurizers.featurizer import Featurizer
|
|
4
|
+
import typing
|
|
5
|
+
from typing import Any, Dict, List, Optional, Text, Type
|
|
6
|
+
|
|
7
|
+
from rasa.engine.graph import ExecutionContext, GraphComponent
|
|
8
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
9
|
+
from rasa.engine.storage.resource import Resource
|
|
10
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
11
|
+
from rasa.nlu.classifiers.classifier import IntentClassifier
|
|
12
|
+
from rasa.nlu.utils.mitie_utils import MitieModel, MitieNLP
|
|
13
|
+
from rasa.nlu.constants import TOKENS_NAMES
|
|
14
|
+
from rasa.shared.nlu.constants import TEXT, INTENT
|
|
15
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
16
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
17
|
+
|
|
18
|
+
if typing.TYPE_CHECKING:
|
|
19
|
+
import mitie
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@DefaultV1Recipe.register(
|
|
25
|
+
DefaultV1Recipe.ComponentType.INTENT_CLASSIFIER,
|
|
26
|
+
is_trainable=True,
|
|
27
|
+
model_from="MitieNLP",
|
|
28
|
+
)
|
|
29
|
+
class MitieIntentClassifier(GraphComponent, IntentClassifier):
|
|
30
|
+
"""Intent classifier which uses the `mitie` library."""
|
|
31
|
+
|
|
32
|
+
@classmethod
|
|
33
|
+
def required_components(cls) -> List[Type]:
|
|
34
|
+
"""Components that should be included in the pipeline before this component."""
|
|
35
|
+
return [MitieNLP, Featurizer]
|
|
36
|
+
|
|
37
|
+
@staticmethod
|
|
38
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
39
|
+
"""Returns default config (see parent class for full docstring)."""
|
|
40
|
+
return {"num_threads": 1}
|
|
41
|
+
|
|
42
|
+
def __init__(
|
|
43
|
+
self,
|
|
44
|
+
config: Dict[Text, Any],
|
|
45
|
+
model_storage: ModelStorage,
|
|
46
|
+
resource: Resource,
|
|
47
|
+
clf: Optional["mitie.text_categorizer"] = None,
|
|
48
|
+
) -> None:
|
|
49
|
+
"""Constructs a new intent classifier using the MITIE framework."""
|
|
50
|
+
self._config = config
|
|
51
|
+
self._model_storage = model_storage
|
|
52
|
+
self._resource = resource
|
|
53
|
+
self._clf = clf
|
|
54
|
+
|
|
55
|
+
@staticmethod
|
|
56
|
+
def required_packages() -> List[Text]:
|
|
57
|
+
"""Lists required dependencies (see parent class for full docstring)."""
|
|
58
|
+
return ["mitie"]
|
|
59
|
+
|
|
60
|
+
def train(self, training_data: TrainingData, model: MitieModel) -> Resource:
|
|
61
|
+
"""Trains classifier.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
training_data: The NLU training data.
|
|
65
|
+
model: The loaded mitie model provided by `MitieNLP`.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
The resource locator for the trained classifier.
|
|
69
|
+
"""
|
|
70
|
+
import mitie
|
|
71
|
+
|
|
72
|
+
trainer = mitie.text_categorizer_trainer(str(model.model_path))
|
|
73
|
+
trainer.num_threads = self._config["num_threads"]
|
|
74
|
+
|
|
75
|
+
for example in training_data.intent_examples:
|
|
76
|
+
tokens = self._tokens_of_message(example)
|
|
77
|
+
trainer.add_labeled_text(tokens, example.get(INTENT))
|
|
78
|
+
|
|
79
|
+
if training_data.intent_examples:
|
|
80
|
+
# we can not call train if there are no examples!
|
|
81
|
+
clf = trainer.train()
|
|
82
|
+
self._persist(clf)
|
|
83
|
+
|
|
84
|
+
return self._resource
|
|
85
|
+
|
|
86
|
+
def process(self, messages: List[Message], model: MitieModel) -> List[Message]:
|
|
87
|
+
"""Make intent predictions using `mitie`.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
messages: The message which the intents should be predicted for.
|
|
91
|
+
model: The loaded mitie model provided by `MitieNLP`.
|
|
92
|
+
"""
|
|
93
|
+
for message in messages:
|
|
94
|
+
if self._clf:
|
|
95
|
+
token_strs = self._tokens_of_message(message)
|
|
96
|
+
intent, confidence = self._clf(token_strs, model.word_feature_extractor)
|
|
97
|
+
else:
|
|
98
|
+
# either the model didn't get trained or it wasn't
|
|
99
|
+
# provided with any data
|
|
100
|
+
intent = None
|
|
101
|
+
confidence = 0.0
|
|
102
|
+
|
|
103
|
+
message.set(
|
|
104
|
+
"intent", {"name": intent, "confidence": confidence}, add_to_output=True
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
return messages
|
|
108
|
+
|
|
109
|
+
@staticmethod
|
|
110
|
+
def _tokens_of_message(message: Message) -> List[Text]:
|
|
111
|
+
return [token.text for token in message.get(TOKENS_NAMES[TEXT], [])]
|
|
112
|
+
|
|
113
|
+
@classmethod
|
|
114
|
+
def create(
|
|
115
|
+
cls,
|
|
116
|
+
config: Dict[Text, Any],
|
|
117
|
+
model_storage: ModelStorage,
|
|
118
|
+
resource: Resource,
|
|
119
|
+
execution_context: ExecutionContext,
|
|
120
|
+
) -> MitieIntentClassifier:
|
|
121
|
+
"""Creates component for training see parent class for full docstring)."""
|
|
122
|
+
return cls(config, model_storage, resource)
|
|
123
|
+
|
|
124
|
+
@classmethod
|
|
125
|
+
def load(
|
|
126
|
+
cls,
|
|
127
|
+
config: Dict[Text, Any],
|
|
128
|
+
model_storage: ModelStorage,
|
|
129
|
+
resource: Resource,
|
|
130
|
+
execution_context: ExecutionContext,
|
|
131
|
+
**kwargs: Any,
|
|
132
|
+
) -> MitieIntentClassifier:
|
|
133
|
+
"""Loads component for inference see parent class for full docstring)."""
|
|
134
|
+
import mitie
|
|
135
|
+
|
|
136
|
+
text_categorizer = None
|
|
137
|
+
|
|
138
|
+
try:
|
|
139
|
+
with model_storage.read_from(resource) as directory:
|
|
140
|
+
text_categorizer = mitie.text_categorizer(str(directory / "model.dat"))
|
|
141
|
+
except (
|
|
142
|
+
ValueError,
|
|
143
|
+
Exception,
|
|
144
|
+
): # the latter is thrown by the `mitie.text_categorizer`
|
|
145
|
+
logger.warning(
|
|
146
|
+
f"Failed to load {cls.__class__.__name__} from model storage. Resource "
|
|
147
|
+
f"'{resource.name}' doesn't exist."
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
return cls(config, model_storage, resource, text_categorizer)
|
|
151
|
+
|
|
152
|
+
def _persist(self, text_categorizer: "mitie.text_categorizer") -> None:
|
|
153
|
+
"""Persists trained model (see parent class for full docstring)."""
|
|
154
|
+
with self._model_storage.write_to(self._resource) as directory:
|
|
155
|
+
classifier_file = directory / "model.dat"
|
|
156
|
+
text_categorizer.save_to_disk(str(classifier_file), pure_model=True)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Any, Dict, Optional, Text, List
|
|
4
|
+
|
|
5
|
+
from rasa.engine.graph import GraphComponent, ExecutionContext
|
|
6
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
7
|
+
from rasa.engine.storage.resource import Resource
|
|
8
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
9
|
+
from rasa.nlu.extractors.extractor import EntityExtractorMixin
|
|
10
|
+
from rasa.shared.core.domain import Domain
|
|
11
|
+
from rasa.shared.core.training_data.story_reader.yaml_story_reader import (
|
|
12
|
+
YAMLStoryReader,
|
|
13
|
+
)
|
|
14
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@DefaultV1Recipe.register(
|
|
20
|
+
DefaultV1Recipe.ComponentType.INTENT_CLASSIFIER, is_trainable=False
|
|
21
|
+
)
|
|
22
|
+
class RegexMessageHandler(GraphComponent, EntityExtractorMixin):
|
|
23
|
+
"""Handles hardcoded NLU predictions from messages starting with a `/`."""
|
|
24
|
+
|
|
25
|
+
@classmethod
|
|
26
|
+
def create(
|
|
27
|
+
cls,
|
|
28
|
+
config: Dict[Text, Any],
|
|
29
|
+
model_storage: ModelStorage,
|
|
30
|
+
resource: Resource,
|
|
31
|
+
execution_context: ExecutionContext,
|
|
32
|
+
) -> RegexMessageHandler:
|
|
33
|
+
"""Creates a new untrained component (see parent class for full docstring)."""
|
|
34
|
+
return cls()
|
|
35
|
+
|
|
36
|
+
# TODO: Handle empty domain (NLU only training)
|
|
37
|
+
def process(
|
|
38
|
+
self, messages: List[Message], domain: Optional[Domain] = None
|
|
39
|
+
) -> List[Message]:
|
|
40
|
+
"""Adds hardcoded intents and entities for messages starting with '/'.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
messages: The messages which should be handled.
|
|
44
|
+
domain: If given the domain is used to check whether the intent, entities
|
|
45
|
+
valid.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
The messages with potentially intent and entity prediction replaced
|
|
49
|
+
in case the message started with a `/`.
|
|
50
|
+
"""
|
|
51
|
+
return [
|
|
52
|
+
YAMLStoryReader.unpack_regex_message(
|
|
53
|
+
message, domain, entity_extractor_name=self.name
|
|
54
|
+
)
|
|
55
|
+
for message in messages
|
|
56
|
+
]
|