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,210 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
import time
|
|
4
|
+
from collections import deque
|
|
5
|
+
from typing import Deque, Optional, Text
|
|
6
|
+
|
|
7
|
+
from rasa.core.lock import Ticket, TicketLock
|
|
8
|
+
from rasa.core.lock_store import (
|
|
9
|
+
DEFAULT_SOCKET_TIMEOUT_IN_SECONDS,
|
|
10
|
+
LOCK_LIFETIME,
|
|
11
|
+
LockError,
|
|
12
|
+
LockStore,
|
|
13
|
+
)
|
|
14
|
+
from rasa.utils.endpoints import EndpointConfig
|
|
15
|
+
|
|
16
|
+
DEFAULT_REDIS_DB = 1
|
|
17
|
+
|
|
18
|
+
DEFAULT_PORT = 6379
|
|
19
|
+
|
|
20
|
+
DEFAULT_HOSTNAME = "localhost"
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
LAST_ISSUED_TICKET_NUMBER_SUFFIX = "last_issued_ticket_number"
|
|
25
|
+
|
|
26
|
+
DEFAULT_CONCURRENT_REDIS_LOCK_STORE_KEY_PREFIX = "concurrent_lock:"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ConcurrentTicketLock(TicketLock):
|
|
30
|
+
def concurrent_issue_ticket(self, lifetime: float, ticket_number: int) -> int:
|
|
31
|
+
"""Issue a new ticket and return its number.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
lifetime: The length of time after which the ticket expires.
|
|
35
|
+
ticket_number: Integer representing the ticket number.
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
ticket_number integer.
|
|
39
|
+
|
|
40
|
+
"""
|
|
41
|
+
ticket = Ticket(ticket_number, time.time() + lifetime)
|
|
42
|
+
self.tickets.append(ticket)
|
|
43
|
+
|
|
44
|
+
return ticket_number
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class ConcurrentRedisLockStore(LockStore):
|
|
48
|
+
"""Concurrent implementation of a Redis store for ticket locks."""
|
|
49
|
+
|
|
50
|
+
def __init__(
|
|
51
|
+
self,
|
|
52
|
+
endpoint_config: EndpointConfig,
|
|
53
|
+
) -> None:
|
|
54
|
+
"""Create a lock store which uses Redis for persistence.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
endpoint_config: The endpointConfig defined the lock store.
|
|
58
|
+
|
|
59
|
+
Can contain the following properties:
|
|
60
|
+
host - The host of the redis server.
|
|
61
|
+
port - The port of the redis server.
|
|
62
|
+
db - The name of the database within Redis which should be used by Rasa
|
|
63
|
+
Open Source.
|
|
64
|
+
username - The username which should be used for authentication with the
|
|
65
|
+
Redis database.
|
|
66
|
+
password - The password which should be used for authentication with the
|
|
67
|
+
Redis database.
|
|
68
|
+
use_ssl - `True` if SSL should be used for the connection to Redis.
|
|
69
|
+
ssl_certfile - Path to the SSL certificate file.
|
|
70
|
+
ssl_keyfile - Path to the SSL private key file.
|
|
71
|
+
ssl_ca_certs - Path to the SSL CA certificate file.
|
|
72
|
+
key_prefix - prefix to prepend to all keys used by the lock store. Must be
|
|
73
|
+
alphanumeric.
|
|
74
|
+
socket_timeout - Timeout in seconds after which an exception will be raised
|
|
75
|
+
in case Redis doesn't respond within `socket_timeout` seconds.
|
|
76
|
+
"""
|
|
77
|
+
import redis
|
|
78
|
+
|
|
79
|
+
host = endpoint_config.kwargs.get("host", DEFAULT_HOSTNAME)
|
|
80
|
+
port = endpoint_config.kwargs.get("port", DEFAULT_PORT)
|
|
81
|
+
db = endpoint_config.kwargs.get("db", DEFAULT_REDIS_DB)
|
|
82
|
+
username = endpoint_config.kwargs.get("username")
|
|
83
|
+
password = endpoint_config.kwargs.get("password")
|
|
84
|
+
use_ssl = bool(endpoint_config.kwargs.get("use_ssl", False))
|
|
85
|
+
ssl_certfile = endpoint_config.kwargs.get("ssl_certfile")
|
|
86
|
+
ssl_keyfile = endpoint_config.kwargs.get("ssl_keyfile")
|
|
87
|
+
ssl_ca_certs = endpoint_config.kwargs.get("ssl_ca_certs")
|
|
88
|
+
key_prefix = endpoint_config.kwargs.get("key_prefix")
|
|
89
|
+
socket_timeout = endpoint_config.kwargs.get(
|
|
90
|
+
"socket_timeout", DEFAULT_SOCKET_TIMEOUT_IN_SECONDS
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
self.red = redis.StrictRedis(
|
|
94
|
+
host=host,
|
|
95
|
+
port=int(port),
|
|
96
|
+
db=int(db),
|
|
97
|
+
username=username,
|
|
98
|
+
password=password,
|
|
99
|
+
ssl=use_ssl,
|
|
100
|
+
ssl_certfile=ssl_certfile,
|
|
101
|
+
ssl_keyfile=ssl_keyfile,
|
|
102
|
+
ssl_ca_certs=ssl_ca_certs,
|
|
103
|
+
socket_timeout=socket_timeout,
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
self.key_prefix = DEFAULT_CONCURRENT_REDIS_LOCK_STORE_KEY_PREFIX
|
|
107
|
+
if key_prefix:
|
|
108
|
+
logger.debug(f"Setting non-default redis key prefix: '{key_prefix}'.")
|
|
109
|
+
self._set_key_prefix(key_prefix)
|
|
110
|
+
|
|
111
|
+
super().__init__()
|
|
112
|
+
|
|
113
|
+
def _set_key_prefix(self, key_prefix: Text) -> None:
|
|
114
|
+
if isinstance(key_prefix, str) and key_prefix.isalnum():
|
|
115
|
+
self.key_prefix = (
|
|
116
|
+
key_prefix + ":" + DEFAULT_CONCURRENT_REDIS_LOCK_STORE_KEY_PREFIX
|
|
117
|
+
)
|
|
118
|
+
else:
|
|
119
|
+
logger.warning(
|
|
120
|
+
f"Omitting provided non-alphanumeric redis key prefix: '{key_prefix}'. "
|
|
121
|
+
f"Using default '{self.key_prefix}' instead."
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
def issue_ticket(
|
|
125
|
+
self, conversation_id: Text, lock_lifetime: float = LOCK_LIFETIME
|
|
126
|
+
) -> int:
|
|
127
|
+
"""Issue new ticket for a conversation.
|
|
128
|
+
|
|
129
|
+
It's configured with `lock_lifetime` and associated with `conversation_id`.
|
|
130
|
+
Creates a new lock if none is found.
|
|
131
|
+
"""
|
|
132
|
+
logger.debug(f"Issuing ticket for conversation '{conversation_id}'.")
|
|
133
|
+
try:
|
|
134
|
+
lock = self.get_or_create_lock(conversation_id)
|
|
135
|
+
lock.remove_expired_tickets()
|
|
136
|
+
ticket_number = self.increment_ticket_number(lock)
|
|
137
|
+
ticket = lock.concurrent_issue_ticket(lock_lifetime, ticket_number) # type: ignore[attr-defined]
|
|
138
|
+
self.save_lock(lock)
|
|
139
|
+
|
|
140
|
+
return ticket
|
|
141
|
+
except Exception as e:
|
|
142
|
+
raise LockError(f"Error while acquiring lock. Error:\n{e}")
|
|
143
|
+
|
|
144
|
+
def get_lock(self, conversation_id: Text) -> Optional[ConcurrentTicketLock]:
|
|
145
|
+
"""Retrieves lock (see parent docstring for more information)."""
|
|
146
|
+
tickets: Deque[Ticket] = deque()
|
|
147
|
+
|
|
148
|
+
pattern = self.key_prefix + conversation_id + ":" + "[0-9]*"
|
|
149
|
+
redis_keys = self.red.keys(pattern)
|
|
150
|
+
|
|
151
|
+
for key in redis_keys:
|
|
152
|
+
serialised_ticket = self.red.get(key)
|
|
153
|
+
if serialised_ticket:
|
|
154
|
+
ticket = Ticket.from_dict(json.loads(serialised_ticket))
|
|
155
|
+
tickets.appendleft(ticket)
|
|
156
|
+
|
|
157
|
+
tickets = deque(sorted(tickets, key=lambda x: x.number))
|
|
158
|
+
|
|
159
|
+
return ConcurrentTicketLock(conversation_id, tickets)
|
|
160
|
+
|
|
161
|
+
def delete_lock(self, conversation_id: Text) -> None:
|
|
162
|
+
"""Deletes lock for conversation ID."""
|
|
163
|
+
pattern = self.key_prefix + conversation_id + ":*"
|
|
164
|
+
redis_keys = self.red.keys(pattern)
|
|
165
|
+
|
|
166
|
+
if not redis_keys:
|
|
167
|
+
logger.debug(
|
|
168
|
+
f"The lock store does not contain any key-value "
|
|
169
|
+
f"items for conversation '{conversation_id}'."
|
|
170
|
+
)
|
|
171
|
+
return None
|
|
172
|
+
|
|
173
|
+
deletion_successful = self.red.delete(*redis_keys)
|
|
174
|
+
if deletion_successful == 0:
|
|
175
|
+
self._log_deletion(conversation_id, False)
|
|
176
|
+
else:
|
|
177
|
+
self._log_deletion(conversation_id, True)
|
|
178
|
+
|
|
179
|
+
def save_lock(self, lock: TicketLock) -> None:
|
|
180
|
+
"""Commit individual tickets and last issued ticket number to storage."""
|
|
181
|
+
last_issued_ticket = lock.tickets[-1]
|
|
182
|
+
serialised_ticket = last_issued_ticket.dumps()
|
|
183
|
+
key = (
|
|
184
|
+
self.key_prefix
|
|
185
|
+
+ lock.conversation_id
|
|
186
|
+
+ ":"
|
|
187
|
+
+ str(last_issued_ticket.number)
|
|
188
|
+
)
|
|
189
|
+
self.red.set(
|
|
190
|
+
name=key, value=serialised_ticket, ex=int(last_issued_ticket.expires)
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
def increment_ticket_number(self, lock: TicketLock) -> int:
|
|
194
|
+
"""Uses Redis atomic transaction to increment ticket number."""
|
|
195
|
+
last_issued_key = (
|
|
196
|
+
self.key_prefix
|
|
197
|
+
+ lock.conversation_id
|
|
198
|
+
+ ":"
|
|
199
|
+
+ LAST_ISSUED_TICKET_NUMBER_SUFFIX
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
return self.red.incr(name=last_issued_key)
|
|
203
|
+
|
|
204
|
+
def finish_serving(self, conversation_id: Text, ticket_number: int) -> None:
|
|
205
|
+
"""Finish serving ticket with `ticket_number` for `conversation_id`.
|
|
206
|
+
|
|
207
|
+
Removes ticket from storage.
|
|
208
|
+
"""
|
|
209
|
+
ticket_key = self.key_prefix + conversation_id + ":" + str(ticket_number)
|
|
210
|
+
self.red.delete(ticket_key)
|
rasa/core/constants.py
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
DEFAULT_SERVER_PORT = 5005
|
|
2
|
+
|
|
3
|
+
DEFAULT_SERVER_INTERFACE = "0.0.0.0"
|
|
4
|
+
|
|
5
|
+
DEFAULT_SERVER_FORMAT = "{}://localhost:{}"
|
|
6
|
+
|
|
7
|
+
DEFAULT_SERVER_URL = DEFAULT_SERVER_FORMAT.format("http", DEFAULT_SERVER_PORT)
|
|
8
|
+
|
|
9
|
+
DEFAULT_INTERACTIVE_SERVER_URL = "{}://localhost:{}"
|
|
10
|
+
|
|
11
|
+
DEFAULT_NLU_FALLBACK_THRESHOLD = 0.3
|
|
12
|
+
|
|
13
|
+
DEFAULT_NLU_FALLBACK_AMBIGUITY_THRESHOLD = 0.1
|
|
14
|
+
|
|
15
|
+
DEFAULT_CORE_FALLBACK_THRESHOLD = 0.3
|
|
16
|
+
|
|
17
|
+
DEFAULT_MAX_HISTORY = None # Core policy history is unbounded by default.
|
|
18
|
+
|
|
19
|
+
DEFAULT_RESPONSE_TIMEOUT = 60 * 60 # 1 hour
|
|
20
|
+
|
|
21
|
+
DEFAULT_REQUEST_TIMEOUT = 60 * 5 # 5 minutes
|
|
22
|
+
|
|
23
|
+
DEFAULT_STREAM_READING_TIMEOUT = 10 # in seconds
|
|
24
|
+
|
|
25
|
+
DEFAULT_LOCK_LIFETIME = 60 # in seconds
|
|
26
|
+
|
|
27
|
+
DEFAULT_KEEP_ALIVE_TIMEOUT = 120 # in seconds
|
|
28
|
+
|
|
29
|
+
BEARER_TOKEN_PREFIX = "Bearer "
|
|
30
|
+
|
|
31
|
+
# The lowest priority is intended to be used by machine learning policies.
|
|
32
|
+
DEFAULT_POLICY_PRIORITY = 1
|
|
33
|
+
|
|
34
|
+
# The priority of intent-prediction policies.
|
|
35
|
+
# This should be below all rule based policies but higher than ML
|
|
36
|
+
# based policies. This enables a loop inside ensemble where if none
|
|
37
|
+
# of the rule based policies predict an action and intent prediction
|
|
38
|
+
# policy predicts one, its prediction is chosen by the ensemble and
|
|
39
|
+
# then the ML based policies are again run to get the prediction for
|
|
40
|
+
# an actual action. To prevent an infinite loop, intent prediction
|
|
41
|
+
# policies only predict an action if the last event in
|
|
42
|
+
# the tracker is of type `UserUttered`. Hence, they make at most
|
|
43
|
+
# one action prediction in each conversation turn. This allows other
|
|
44
|
+
# policies to predict a winning action prediction.
|
|
45
|
+
UNLIKELY_INTENT_POLICY_PRIORITY = DEFAULT_POLICY_PRIORITY + 1
|
|
46
|
+
|
|
47
|
+
# The priority intended to be used by memoization policies.
|
|
48
|
+
# It is higher than default to prioritize training stories.
|
|
49
|
+
MEMOIZATION_POLICY_PRIORITY = UNLIKELY_INTENT_POLICY_PRIORITY + 1
|
|
50
|
+
|
|
51
|
+
# The priority of the `RulePolicy` is higher than all other policies since
|
|
52
|
+
# rule execution takes precedence over training stories or predicted actions.
|
|
53
|
+
RULE_POLICY_PRIORITY = MEMOIZATION_POLICY_PRIORITY + 1
|
|
54
|
+
|
|
55
|
+
# chat policy priority
|
|
56
|
+
CHAT_POLICY_PRIORITY = RULE_POLICY_PRIORITY + 1
|
|
57
|
+
|
|
58
|
+
# search policy priority
|
|
59
|
+
SEARCH_POLICY_PRIORITY = CHAT_POLICY_PRIORITY + 1
|
|
60
|
+
|
|
61
|
+
# flow policy priority
|
|
62
|
+
FLOW_POLICY_PRIORITY = SEARCH_POLICY_PRIORITY + 1
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
DIALOGUE = "dialogue"
|
|
66
|
+
|
|
67
|
+
# RabbitMQ message property header added to events published using `rasa export`
|
|
68
|
+
RASA_EXPORT_PROCESS_ID_HEADER_NAME = "rasa-export-process-id"
|
|
69
|
+
|
|
70
|
+
# Name of the environment variable defining the PostgreSQL schema to access. See
|
|
71
|
+
# https://www.postgresql.org/docs/9.1/ddl-schemas.html for more details.
|
|
72
|
+
POSTGRESQL_SCHEMA = "POSTGRESQL_SCHEMA"
|
|
73
|
+
|
|
74
|
+
# Names of the environment variables defining PostgreSQL pool size and max overflow
|
|
75
|
+
POSTGRESQL_POOL_SIZE = "SQL_POOL_SIZE"
|
|
76
|
+
POSTGRESQL_MAX_OVERFLOW = "SQL_MAX_OVERFLOW"
|
|
77
|
+
|
|
78
|
+
# File names for testing
|
|
79
|
+
CONFUSION_MATRIX_STORIES_FILE = "story_confusion_matrix.png"
|
|
80
|
+
REPORT_STORIES_FILE = "story_report.json"
|
|
81
|
+
FAILED_STORIES_FILE = "failed_test_stories.yml"
|
|
82
|
+
SUCCESSFUL_STORIES_FILE = "successful_test_stories.yml"
|
|
83
|
+
STORIES_WITH_WARNINGS_FILE = "stories_with_warnings.yml"
|
|
84
|
+
|
|
85
|
+
POLICY_PRIORITY = "priority"
|
|
86
|
+
POLICY_FEATURIZER = "featurizer"
|
|
87
|
+
POLICY_MAX_HISTORY = "max_history"
|
|
88
|
+
|
|
89
|
+
DEFAULT_PROTOCOL = "UDP"
|
|
90
|
+
DEFAULT_SYSLOG_HOST = "localhost"
|
|
91
|
+
DEFAULT_SYSLOG_PORT = 514
|
|
92
|
+
|
|
93
|
+
COMPRESS_ACTION_SERVER_REQUEST_ENV_NAME = "COMPRESS_ACTION_SERVER_REQUEST"
|
|
94
|
+
DEFAULT_COMPRESS_ACTION_SERVER_REQUEST = False
|
|
95
|
+
|
|
96
|
+
# uses python like string formatting for the interpolation of templates
|
|
97
|
+
RASA_FORMAT_TEMPLATE_ENGINE = "format"
|
|
98
|
+
|
|
99
|
+
# uses jinja for the interpolation of templates
|
|
100
|
+
JINJA2_TEMPLATE_ENGINE = "jinja"
|
|
101
|
+
|
|
102
|
+
# default engine used if no engine is specified in the response
|
|
103
|
+
DEFAULT_TEMPLATE_ENGINE = RASA_FORMAT_TEMPLATE_ENGINE
|
|
104
|
+
|
|
105
|
+
# configuration parameter used to specify the template engine to use
|
|
106
|
+
# for a response
|
|
107
|
+
TEMPLATE_ENGINE_CONFIG_KEY = "template"
|
|
File without changes
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
from rasa.shared.core.domain import Domain
|
|
2
|
+
from typing import Optional, Text, List
|
|
3
|
+
from rasa.core.evaluation.marker_base import (
|
|
4
|
+
OperatorMarker,
|
|
5
|
+
ConditionMarker,
|
|
6
|
+
MarkerRegistry,
|
|
7
|
+
Marker,
|
|
8
|
+
)
|
|
9
|
+
from rasa.shared.core.events import ActionExecuted, SlotSet, UserUttered, Event
|
|
10
|
+
import logging
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@MarkerRegistry.configurable_marker
|
|
16
|
+
class AndMarker(OperatorMarker):
|
|
17
|
+
"""Checks that all sub-markers apply."""
|
|
18
|
+
|
|
19
|
+
@staticmethod
|
|
20
|
+
def positive_tag() -> Text:
|
|
21
|
+
"""Returns the tag to be used in a config file."""
|
|
22
|
+
return "and"
|
|
23
|
+
|
|
24
|
+
@staticmethod
|
|
25
|
+
def negated_tag() -> Text:
|
|
26
|
+
"""Returns the tag to be used in a config file for the negated version."""
|
|
27
|
+
return "at_least_one_not"
|
|
28
|
+
|
|
29
|
+
def _non_negated_version_applies_at(self, event: Event) -> bool:
|
|
30
|
+
return all(marker.history[-1] for marker in self.sub_markers)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@MarkerRegistry.configurable_marker
|
|
34
|
+
class OrMarker(OperatorMarker):
|
|
35
|
+
"""Checks that at least one sub-marker applies."""
|
|
36
|
+
|
|
37
|
+
@staticmethod
|
|
38
|
+
def positive_tag() -> Text:
|
|
39
|
+
"""Returns the tag to be used in a config file."""
|
|
40
|
+
return "or"
|
|
41
|
+
|
|
42
|
+
def _non_negated_version_applies_at(self, event: Event) -> bool:
|
|
43
|
+
return any(marker.history[-1] for marker in self.sub_markers)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@MarkerRegistry.configurable_marker
|
|
47
|
+
class NotMarker(OperatorMarker):
|
|
48
|
+
"""Checks that at least one sub-marker applies."""
|
|
49
|
+
|
|
50
|
+
@staticmethod
|
|
51
|
+
def positive_tag() -> Text:
|
|
52
|
+
"""Returns the tag to be used in a config file."""
|
|
53
|
+
return "not"
|
|
54
|
+
|
|
55
|
+
@staticmethod
|
|
56
|
+
def expected_number_of_sub_markers() -> Optional[int]:
|
|
57
|
+
"""Returns the expected number of sub-markers (if there is any)."""
|
|
58
|
+
return 1
|
|
59
|
+
|
|
60
|
+
def _non_negated_version_applies_at(self, event: Event) -> bool:
|
|
61
|
+
return not self.sub_markers[0].history[-1]
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@MarkerRegistry.configurable_marker
|
|
65
|
+
class SequenceMarker(OperatorMarker):
|
|
66
|
+
"""Checks that all sub-markers apply consecutively in the specified order.
|
|
67
|
+
|
|
68
|
+
The sequence marker application follows two rules:
|
|
69
|
+
(1) Given a sequence of sub-markers `m_0, m_1,...,m_n`, the sequence marker applies
|
|
70
|
+
at the `i`-th event if all sub-markers successively applied to some previous
|
|
71
|
+
events and the last sub-marker applies at the current `i`-th events.
|
|
72
|
+
(2) If the sequence marker applies at the `i`-th event, then for it's next
|
|
73
|
+
application the events up to the `i`-th event will be ignored.
|
|
74
|
+
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
def __init__(
|
|
78
|
+
self, markers: List[Marker], negated: bool = False, name: Optional[Text] = None
|
|
79
|
+
) -> None:
|
|
80
|
+
"""Instantiate a new sequence marker.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
markers: the sub-markers listed in the expected order
|
|
84
|
+
negated: whether this marker should be negated (i.e. a negated marker
|
|
85
|
+
applies if and only if the non-negated marker does not apply)
|
|
86
|
+
name: a custom name that can be used to replace the default string
|
|
87
|
+
conversion of this marker
|
|
88
|
+
"""
|
|
89
|
+
super().__init__(markers=markers, negated=negated, name=name)
|
|
90
|
+
self._progress: int = 0
|
|
91
|
+
|
|
92
|
+
@staticmethod
|
|
93
|
+
def positive_tag() -> Text:
|
|
94
|
+
"""Returns the tag to be used in a config file."""
|
|
95
|
+
return "seq"
|
|
96
|
+
|
|
97
|
+
def _to_str_with(self, tag: Text) -> Text:
|
|
98
|
+
sub_markers_str = " -> ".join(str(marker) for marker in self.sub_markers)
|
|
99
|
+
return f"{tag}({sub_markers_str})"
|
|
100
|
+
|
|
101
|
+
def _non_negated_version_applies_at(self, event: Event) -> bool:
|
|
102
|
+
# Remember that all the sub-markers have been updated before this tracker.
|
|
103
|
+
# Hence, whether the sub-markers apply to the current `event` is stored in the
|
|
104
|
+
# last item of their history. Hence, to check if we made some progress in
|
|
105
|
+
# identifying a sequence, we can simply check:
|
|
106
|
+
if self.sub_markers[self._progress].history[-1]:
|
|
107
|
+
self._progress += 1
|
|
108
|
+
# If we were able to apply every sub-marker once, we reset our progress:
|
|
109
|
+
if self._progress == len(self.sub_markers):
|
|
110
|
+
self._progress = 0
|
|
111
|
+
return True
|
|
112
|
+
return False
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
@MarkerRegistry.configurable_marker
|
|
116
|
+
class OccurrenceMarker(OperatorMarker):
|
|
117
|
+
"""Checks that all sub-markers applied at least once in history.
|
|
118
|
+
|
|
119
|
+
It doesn't matter if the sub markers stop applying later in history. If they
|
|
120
|
+
applied at least once they will always evaluate to `True`.
|
|
121
|
+
"""
|
|
122
|
+
|
|
123
|
+
@staticmethod
|
|
124
|
+
def positive_tag() -> Text:
|
|
125
|
+
"""Returns the tag to be used in a config file."""
|
|
126
|
+
return "at_least_once"
|
|
127
|
+
|
|
128
|
+
@staticmethod
|
|
129
|
+
def negated_tag() -> Optional[Text]:
|
|
130
|
+
"""Returns the tag to be used in a config file for the negated version."""
|
|
131
|
+
return "never"
|
|
132
|
+
|
|
133
|
+
@staticmethod
|
|
134
|
+
def expected_number_of_sub_markers() -> Optional[int]:
|
|
135
|
+
"""Returns the expected number of sub-markers (if there is any)."""
|
|
136
|
+
return 1
|
|
137
|
+
|
|
138
|
+
def _non_negated_version_applies_at(self, event: Event) -> bool:
|
|
139
|
+
occurred_before = False
|
|
140
|
+
|
|
141
|
+
if self.history:
|
|
142
|
+
occurred_before = self.history[-1]
|
|
143
|
+
if self.negated:
|
|
144
|
+
occurred_before = not occurred_before
|
|
145
|
+
|
|
146
|
+
return occurred_before or self.sub_markers[0].history[-1]
|
|
147
|
+
|
|
148
|
+
def relevant_events(self) -> List[int]:
|
|
149
|
+
"""Only return index of first match (see parent class for full docstring)."""
|
|
150
|
+
try:
|
|
151
|
+
return [self.history.index(True)]
|
|
152
|
+
except ValueError:
|
|
153
|
+
return []
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
@MarkerRegistry.configurable_marker
|
|
157
|
+
class ActionExecutedMarker(ConditionMarker):
|
|
158
|
+
"""Checks whether an action is executed at the current step."""
|
|
159
|
+
|
|
160
|
+
@staticmethod
|
|
161
|
+
def positive_tag() -> Text:
|
|
162
|
+
"""Returns the tag to be used in a config file."""
|
|
163
|
+
return "action"
|
|
164
|
+
|
|
165
|
+
@staticmethod
|
|
166
|
+
def negated_tag() -> Optional[Text]:
|
|
167
|
+
"""Returns the tag to be used in a config file for the negated version."""
|
|
168
|
+
return "not_action"
|
|
169
|
+
|
|
170
|
+
def validate_against_domain(self, domain: Domain) -> bool:
|
|
171
|
+
"""Checks that this marker (and its children) refer to entries in the domain.
|
|
172
|
+
|
|
173
|
+
Args:
|
|
174
|
+
domain: The domain to check against
|
|
175
|
+
"""
|
|
176
|
+
valid = self.text in domain.action_names_or_texts
|
|
177
|
+
|
|
178
|
+
if not valid:
|
|
179
|
+
logger.error(
|
|
180
|
+
f"Referenced action '{self.text}' does not exist in the domain"
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
return valid
|
|
184
|
+
|
|
185
|
+
def _non_negated_version_applies_at(self, event: Event) -> bool:
|
|
186
|
+
return isinstance(event, ActionExecuted) and event.action_name == self.text
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
@MarkerRegistry.configurable_marker
|
|
190
|
+
class IntentDetectedMarker(ConditionMarker):
|
|
191
|
+
"""Checks whether an intent is expressed at the current step.
|
|
192
|
+
|
|
193
|
+
More precisely it applies at an event if this event is a `UserUttered` event
|
|
194
|
+
where either (1) the retrieval intent or (2) just the intent coincides with
|
|
195
|
+
the specified text.
|
|
196
|
+
"""
|
|
197
|
+
|
|
198
|
+
@staticmethod
|
|
199
|
+
def positive_tag() -> Text:
|
|
200
|
+
"""Returns the tag to be used in a config file."""
|
|
201
|
+
return "intent"
|
|
202
|
+
|
|
203
|
+
@staticmethod
|
|
204
|
+
def negated_tag() -> Optional[Text]:
|
|
205
|
+
"""Returns the tag to be used in a config file for the negated version."""
|
|
206
|
+
return "not_intent"
|
|
207
|
+
|
|
208
|
+
def validate_against_domain(self, domain: Domain) -> bool:
|
|
209
|
+
"""Checks that this marker (and its children) refer to entries in the domain.
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
domain: The domain to check against
|
|
213
|
+
"""
|
|
214
|
+
valid = self.text in domain.intent_properties
|
|
215
|
+
|
|
216
|
+
if not valid:
|
|
217
|
+
logger.error(
|
|
218
|
+
f"Referenced intent '{self.text}' does not exist in the domain"
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
return valid
|
|
222
|
+
|
|
223
|
+
def _non_negated_version_applies_at(self, event: Event) -> bool:
|
|
224
|
+
return isinstance(event, UserUttered) and self.text in [
|
|
225
|
+
event.intent_name,
|
|
226
|
+
event.full_retrieval_intent_name,
|
|
227
|
+
]
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
@MarkerRegistry.configurable_marker
|
|
231
|
+
class SlotSetMarker(ConditionMarker):
|
|
232
|
+
"""Checks whether a slot is set at the current step.
|
|
233
|
+
|
|
234
|
+
The actual `SlotSet` event might have happened at an earlier step.
|
|
235
|
+
"""
|
|
236
|
+
|
|
237
|
+
@staticmethod
|
|
238
|
+
def positive_tag() -> Text:
|
|
239
|
+
"""Returns the tag to be used in a config file."""
|
|
240
|
+
return "slot_was_set"
|
|
241
|
+
|
|
242
|
+
@staticmethod
|
|
243
|
+
def negated_tag() -> Optional[Text]:
|
|
244
|
+
"""Returns the tag to be used in a config file for the negated version."""
|
|
245
|
+
return "slot_was_not_set"
|
|
246
|
+
|
|
247
|
+
def validate_against_domain(self, domain: Domain) -> bool:
|
|
248
|
+
"""Checks that this marker (and its children) refer to entries in the domain.
|
|
249
|
+
|
|
250
|
+
Args:
|
|
251
|
+
domain: The domain to check against.
|
|
252
|
+
"""
|
|
253
|
+
valid = any(self.text == slot.name for slot in domain.slots)
|
|
254
|
+
|
|
255
|
+
if not valid:
|
|
256
|
+
logger.error(f"Referenced slot '{self.text}' does not exist in the domain")
|
|
257
|
+
|
|
258
|
+
return valid
|
|
259
|
+
|
|
260
|
+
def _non_negated_version_applies_at(self, event: Event) -> bool:
|
|
261
|
+
if isinstance(event, SlotSet) and event.key == self.text:
|
|
262
|
+
# slot is set if and only if it's value is not `None`
|
|
263
|
+
return event.value is not None
|
|
264
|
+
if self.history:
|
|
265
|
+
was_set = self.history[-1] if not self.negated else not self.history[-1]
|
|
266
|
+
return was_set
|
|
267
|
+
return False
|