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,59 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict, List, Optional
|
|
4
|
+
|
|
5
|
+
import structlog
|
|
6
|
+
|
|
7
|
+
from rasa.core.actions.action import Action
|
|
8
|
+
from rasa.core.channels import OutputChannel
|
|
9
|
+
from rasa.core.nlg import NaturalLanguageGenerator
|
|
10
|
+
from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
|
|
11
|
+
from rasa.dialogue_understanding.stack.frames import (
|
|
12
|
+
BaseFlowStackFrame,
|
|
13
|
+
UserFlowStackFrame,
|
|
14
|
+
)
|
|
15
|
+
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import FlowStackFrameType
|
|
16
|
+
from rasa.shared.core.constants import ACTION_CLEAN_STACK
|
|
17
|
+
from rasa.shared.core.domain import Domain
|
|
18
|
+
from rasa.shared.core.events import Event
|
|
19
|
+
from rasa.shared.core.flows.steps.constants import END_STEP
|
|
20
|
+
from rasa.shared.core.flows.steps.continuation import ContinueFlowStep
|
|
21
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
22
|
+
|
|
23
|
+
structlogger = structlog.get_logger()
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ActionCleanStack(Action):
|
|
27
|
+
"""Action which cancels a flow from the stack."""
|
|
28
|
+
|
|
29
|
+
def name(self) -> str:
|
|
30
|
+
"""Return the flow name."""
|
|
31
|
+
return ACTION_CLEAN_STACK
|
|
32
|
+
|
|
33
|
+
async def run(
|
|
34
|
+
self,
|
|
35
|
+
output_channel: OutputChannel,
|
|
36
|
+
nlg: NaturalLanguageGenerator,
|
|
37
|
+
tracker: DialogueStateTracker,
|
|
38
|
+
domain: Domain,
|
|
39
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
40
|
+
) -> List[Event]:
|
|
41
|
+
"""Clean the stack."""
|
|
42
|
+
structlogger.debug("action_clean_stack.run")
|
|
43
|
+
new_frames = []
|
|
44
|
+
# Set all frames to their end step, filter out any non-BaseFlowStackFrames
|
|
45
|
+
for frame in tracker.stack.frames:
|
|
46
|
+
if isinstance(frame, BaseFlowStackFrame):
|
|
47
|
+
structlogger.debug(
|
|
48
|
+
"action_clean_stack.terminating_frame",
|
|
49
|
+
frame_id=frame.frame_id,
|
|
50
|
+
flow_id=frame.flow_id,
|
|
51
|
+
)
|
|
52
|
+
frame.step_id = ContinueFlowStep.continue_step_for_id(END_STEP)
|
|
53
|
+
if isinstance(frame, UserFlowStackFrame):
|
|
54
|
+
# Making sure there are no "continue interrupts" triggered
|
|
55
|
+
frame.frame_type = FlowStackFrameType.REGULAR
|
|
56
|
+
new_frames.append(frame)
|
|
57
|
+
new_stack = DialogueStack.from_dict([frame.as_dict() for frame in new_frames])
|
|
58
|
+
|
|
59
|
+
return tracker.create_stack_updated_events(new_stack)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from rasa.shared.exceptions import RasaException
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ActionExecutionRejection(RasaException):
|
|
7
|
+
"""Raising this exception allows other policies to predict a different action."""
|
|
8
|
+
|
|
9
|
+
def __init__(self, action_name: str, message: Optional[str] = None) -> None:
|
|
10
|
+
"""Create a new ActionExecutionRejection exception."""
|
|
11
|
+
self.action_name = action_name
|
|
12
|
+
self.message = message or "Custom action '{}' rejected to run".format(
|
|
13
|
+
action_name
|
|
14
|
+
)
|
|
15
|
+
super(ActionExecutionRejection, self).__init__()
|
|
16
|
+
|
|
17
|
+
def __str__(self) -> str:
|
|
18
|
+
return self.message
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class DomainNotFound(Exception):
|
|
22
|
+
"""Exception raised when domain is not found."""
|
|
23
|
+
|
|
24
|
+
pass
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
from typing import Any, Dict, List, Optional, TYPE_CHECKING, Text, Union
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
from jinja2 import Template
|
|
5
|
+
from pypred import Predicate
|
|
6
|
+
|
|
7
|
+
from rasa.core.actions.action import Action, create_bot_utterance
|
|
8
|
+
from rasa.dialogue_understanding.patterns.collect_information import (
|
|
9
|
+
CollectInformationPatternFlowStackFrame,
|
|
10
|
+
)
|
|
11
|
+
from rasa.shared.core.constants import ACTION_RUN_SLOT_REJECTIONS_NAME
|
|
12
|
+
from rasa.shared.core.events import Event, SlotSet
|
|
13
|
+
from rasa.shared.core.flows.steps.collect import SlotRejection
|
|
14
|
+
from rasa.shared.core.slots import (
|
|
15
|
+
BooleanSlot,
|
|
16
|
+
CategoricalSlot,
|
|
17
|
+
FloatSlot,
|
|
18
|
+
Slot,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
from rasa.core.nlg import NaturalLanguageGenerator
|
|
23
|
+
from rasa.core.channels.channel import OutputChannel
|
|
24
|
+
from rasa.shared.core.domain import Domain
|
|
25
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
26
|
+
|
|
27
|
+
structlogger = structlog.get_logger()
|
|
28
|
+
|
|
29
|
+
UTTERANCE_NOT_DEFINED_BY_USER = "TO.UPDATE.VALUE.BUT.MISSING.UTTERANCE"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def utterance_for_slot_type(slot: Slot) -> Optional[str]:
|
|
33
|
+
"""Return the utterance to use for the slot type."""
|
|
34
|
+
if isinstance(slot, BooleanSlot):
|
|
35
|
+
return "utter_boolean_slot_rejection"
|
|
36
|
+
elif isinstance(slot, FloatSlot):
|
|
37
|
+
return "utter_float_slot_rejection"
|
|
38
|
+
elif isinstance(slot, CategoricalSlot):
|
|
39
|
+
return "utter_categorical_slot_rejection"
|
|
40
|
+
return None
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def coerce_slot_value(
|
|
44
|
+
slot_value: str, slot_name: str, tracker: "DialogueStateTracker"
|
|
45
|
+
) -> Union[str, bool, float, None]:
|
|
46
|
+
"""Coerce the slot value to the correct type.
|
|
47
|
+
|
|
48
|
+
Tries to coerce the slot value to the correct type. If the
|
|
49
|
+
conversion fails, `None` is returned.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
slot_value: The value to coerce.
|
|
53
|
+
slot_name: The name of the slot.
|
|
54
|
+
tracker: The tracker containing the current state of the conversation.
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
The coerced value or `None` if the conversion failed.
|
|
58
|
+
"""
|
|
59
|
+
if slot_name not in tracker.slots:
|
|
60
|
+
return slot_value
|
|
61
|
+
|
|
62
|
+
slot = tracker.slots[slot_name]
|
|
63
|
+
|
|
64
|
+
if not slot.is_valid_value(slot_value):
|
|
65
|
+
structlogger.debug(
|
|
66
|
+
"run.rejection.slot_value_not_valid",
|
|
67
|
+
rejection=slot_value,
|
|
68
|
+
)
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
return slot.coerce_value(slot_value)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def run_rejections(
|
|
75
|
+
slot_value: Union[str, bool, float, None],
|
|
76
|
+
slot_name: str,
|
|
77
|
+
rejections: List[SlotRejection],
|
|
78
|
+
) -> Optional[str]:
|
|
79
|
+
"""Run the predicate checks under rejections."""
|
|
80
|
+
violation = False
|
|
81
|
+
internal_error = False
|
|
82
|
+
current_context = {"slots": {slot_name: slot_value}}
|
|
83
|
+
|
|
84
|
+
structlogger.debug("run.predicate.context", context=current_context)
|
|
85
|
+
document = current_context.copy()
|
|
86
|
+
|
|
87
|
+
for rejection in rejections:
|
|
88
|
+
condition = rejection.if_
|
|
89
|
+
utterance = rejection.utter
|
|
90
|
+
|
|
91
|
+
try:
|
|
92
|
+
rendered_template = Template(condition).render(current_context)
|
|
93
|
+
predicate = Predicate(rendered_template)
|
|
94
|
+
violation = predicate.evaluate(document)
|
|
95
|
+
structlogger.debug(
|
|
96
|
+
"run.predicate.result",
|
|
97
|
+
predicate=predicate.description(),
|
|
98
|
+
violation=violation,
|
|
99
|
+
)
|
|
100
|
+
except (TypeError, Exception) as e:
|
|
101
|
+
structlogger.error(
|
|
102
|
+
"run.predicate.error",
|
|
103
|
+
predicate=condition,
|
|
104
|
+
document=document,
|
|
105
|
+
error=str(e),
|
|
106
|
+
)
|
|
107
|
+
violation = True
|
|
108
|
+
internal_error = True
|
|
109
|
+
|
|
110
|
+
if violation:
|
|
111
|
+
break
|
|
112
|
+
|
|
113
|
+
if not violation:
|
|
114
|
+
return None
|
|
115
|
+
if internal_error:
|
|
116
|
+
utterance = "utter_internal_error_rasa"
|
|
117
|
+
if not isinstance(utterance, str):
|
|
118
|
+
utterance = UTTERANCE_NOT_DEFINED_BY_USER
|
|
119
|
+
return utterance
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class ActionRunSlotRejections(Action):
|
|
123
|
+
"""Action which evaluates the predicate checks under rejections."""
|
|
124
|
+
|
|
125
|
+
def name(self) -> Text:
|
|
126
|
+
"""Return the name of the action."""
|
|
127
|
+
return ACTION_RUN_SLOT_REJECTIONS_NAME
|
|
128
|
+
|
|
129
|
+
async def run(
|
|
130
|
+
self,
|
|
131
|
+
output_channel: "OutputChannel",
|
|
132
|
+
nlg: "NaturalLanguageGenerator",
|
|
133
|
+
tracker: "DialogueStateTracker",
|
|
134
|
+
domain: "Domain",
|
|
135
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
136
|
+
) -> List[Event]:
|
|
137
|
+
"""Run the predicate checks."""
|
|
138
|
+
utterance = None
|
|
139
|
+
top_frame = tracker.stack.top()
|
|
140
|
+
if not isinstance(top_frame, CollectInformationPatternFlowStackFrame):
|
|
141
|
+
return []
|
|
142
|
+
|
|
143
|
+
slot_name = top_frame.collect
|
|
144
|
+
slot_instance = tracker.slots.get(slot_name)
|
|
145
|
+
if slot_instance and not slot_instance.has_been_set:
|
|
146
|
+
# this is the first time the assistant asks for the slot value,
|
|
147
|
+
# therefore we skip the predicate validation because the slot
|
|
148
|
+
# value has not been provided
|
|
149
|
+
structlogger.debug(
|
|
150
|
+
"first.collect.slot.not.set",
|
|
151
|
+
slot_name=slot_name,
|
|
152
|
+
slot_value=slot_instance.value,
|
|
153
|
+
)
|
|
154
|
+
return []
|
|
155
|
+
|
|
156
|
+
slot_value = tracker.get_slot(slot_name)
|
|
157
|
+
|
|
158
|
+
if slot_instance and slot_instance.has_been_set and slot_value is None:
|
|
159
|
+
return []
|
|
160
|
+
|
|
161
|
+
typed_slot_value = coerce_slot_value(slot_value, slot_name, tracker)
|
|
162
|
+
if typed_slot_value is None:
|
|
163
|
+
# the slot value could not be coerced to the correct type
|
|
164
|
+
utterance = utterance_for_slot_type(slot_instance)
|
|
165
|
+
elif top_frame.rejections:
|
|
166
|
+
# run the predicate checks under rejections
|
|
167
|
+
utterance = run_rejections(
|
|
168
|
+
typed_slot_value, slot_name, top_frame.rejections
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
events: List[Event] = []
|
|
172
|
+
if utterance:
|
|
173
|
+
# the slot value has been rejected
|
|
174
|
+
events.append(SlotSet(slot_name, None))
|
|
175
|
+
elif slot_value != typed_slot_value or type(slot_value) != type(
|
|
176
|
+
typed_slot_value
|
|
177
|
+
):
|
|
178
|
+
# the slot value has been coerced to the correct type
|
|
179
|
+
return [SlotSet(slot_name, typed_slot_value)]
|
|
180
|
+
elif slot_value == typed_slot_value:
|
|
181
|
+
# the slot value has not changed and no utterance present
|
|
182
|
+
return []
|
|
183
|
+
|
|
184
|
+
if utterance == UTTERANCE_NOT_DEFINED_BY_USER:
|
|
185
|
+
structlogger.error(
|
|
186
|
+
"run.rejection.missing.utter",
|
|
187
|
+
utterance=None,
|
|
188
|
+
)
|
|
189
|
+
return events
|
|
190
|
+
|
|
191
|
+
message = await nlg.generate(
|
|
192
|
+
utterance,
|
|
193
|
+
tracker,
|
|
194
|
+
output_channel.name(),
|
|
195
|
+
value=slot_value,
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
if message is None:
|
|
199
|
+
structlogger.error(
|
|
200
|
+
"run.rejection.failed.finding.utter",
|
|
201
|
+
utterance=utterance,
|
|
202
|
+
)
|
|
203
|
+
else:
|
|
204
|
+
message["utter_action"] = utterance
|
|
205
|
+
events.append(create_bot_utterance(message))
|
|
206
|
+
|
|
207
|
+
return events
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from typing import Optional, Dict, Any, List
|
|
2
|
+
|
|
3
|
+
from rasa.core.actions.action import Action
|
|
4
|
+
from rasa.core.channels import OutputChannel
|
|
5
|
+
from rasa.core.nlg import NaturalLanguageGenerator
|
|
6
|
+
from rasa.dialogue_understanding.stack.frames import ChitChatStackFrame
|
|
7
|
+
from rasa.shared.core.constants import ACTION_TRIGGER_CHITCHAT
|
|
8
|
+
from rasa.shared.core.domain import Domain
|
|
9
|
+
from rasa.shared.core.events import Event
|
|
10
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ActionTriggerChitchat(Action):
|
|
14
|
+
"""Action which triggers a chitchat answer."""
|
|
15
|
+
|
|
16
|
+
def name(self) -> str:
|
|
17
|
+
"""Return the name of the action."""
|
|
18
|
+
return ACTION_TRIGGER_CHITCHAT
|
|
19
|
+
|
|
20
|
+
async def run(
|
|
21
|
+
self,
|
|
22
|
+
output_channel: OutputChannel,
|
|
23
|
+
nlg: NaturalLanguageGenerator,
|
|
24
|
+
tracker: DialogueStateTracker,
|
|
25
|
+
domain: Domain,
|
|
26
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
27
|
+
) -> List[Event]:
|
|
28
|
+
"""Run the predicate checks."""
|
|
29
|
+
stack = tracker.stack
|
|
30
|
+
stack.push(ChitChatStackFrame())
|
|
31
|
+
return tracker.create_stack_updated_events(stack)
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
from typing import Any, Dict, Optional, Text, List
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
5
|
+
FlowStackFrameType,
|
|
6
|
+
UserFlowStackFrame,
|
|
7
|
+
)
|
|
8
|
+
from rasa.dialogue_understanding.stack.utils import top_user_flow_frame
|
|
9
|
+
from rasa.core.actions import action
|
|
10
|
+
from rasa.core.channels import OutputChannel
|
|
11
|
+
from rasa.shared.constants import FLOW_PREFIX
|
|
12
|
+
|
|
13
|
+
from rasa.shared.core.domain import Domain
|
|
14
|
+
from rasa.shared.core.events import (
|
|
15
|
+
ActiveLoop,
|
|
16
|
+
Event,
|
|
17
|
+
FlowInterrupted,
|
|
18
|
+
SlotSet,
|
|
19
|
+
)
|
|
20
|
+
from rasa.core.nlg import NaturalLanguageGenerator
|
|
21
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
22
|
+
|
|
23
|
+
structlogger = structlog.get_logger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ActionTriggerFlow(action.Action):
|
|
27
|
+
"""Action which triggers a flow by putting it on the dialogue stack."""
|
|
28
|
+
|
|
29
|
+
def __init__(self, flow_action_name: Text) -> None:
|
|
30
|
+
"""Creates a `ActionTriggerFlow`.
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
flow_action_name: Name of the flow.
|
|
34
|
+
"""
|
|
35
|
+
super().__init__()
|
|
36
|
+
|
|
37
|
+
if not flow_action_name.startswith(FLOW_PREFIX):
|
|
38
|
+
raise ValueError(
|
|
39
|
+
f"Flow action name '{flow_action_name}' needs to start with "
|
|
40
|
+
f"'{FLOW_PREFIX}'."
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
self._flow_name = flow_action_name[len(FLOW_PREFIX) :]
|
|
44
|
+
self._flow_action_name = flow_action_name
|
|
45
|
+
|
|
46
|
+
def name(self) -> Text:
|
|
47
|
+
"""Return the flow name."""
|
|
48
|
+
return self._flow_action_name
|
|
49
|
+
|
|
50
|
+
def create_events_to_start_flow(self, tracker: DialogueStateTracker) -> List[Event]:
|
|
51
|
+
"""Create events to start the flow.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
tracker: The tracker to start the flow on.
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
The event to start the flow."""
|
|
58
|
+
stack = tracker.stack
|
|
59
|
+
events: List[Event] = []
|
|
60
|
+
|
|
61
|
+
frame_type = FlowStackFrameType.REGULAR
|
|
62
|
+
|
|
63
|
+
if not stack.is_empty():
|
|
64
|
+
frame_type = FlowStackFrameType.INTERRUPT
|
|
65
|
+
top_user_frame = top_user_flow_frame(stack)
|
|
66
|
+
if top_user_frame is not None:
|
|
67
|
+
events.append(
|
|
68
|
+
FlowInterrupted(top_user_frame.flow_id, top_user_frame.step_id)
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
stack.push(
|
|
72
|
+
UserFlowStackFrame(
|
|
73
|
+
flow_id=self._flow_name,
|
|
74
|
+
frame_type=frame_type,
|
|
75
|
+
)
|
|
76
|
+
)
|
|
77
|
+
return events + tracker.create_stack_updated_events(stack)
|
|
78
|
+
|
|
79
|
+
def create_events_to_set_flow_slots(self, metadata: Dict[str, Any]) -> List[Event]:
|
|
80
|
+
"""Create events to set the flow slots.
|
|
81
|
+
|
|
82
|
+
Set additional slots to prefill information for the flow.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
metadata: The metadata to set the slots from.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
The events to set the flow slots.
|
|
89
|
+
"""
|
|
90
|
+
slots_to_be_set = metadata.get("slots", {}) if metadata else {}
|
|
91
|
+
return [SlotSet(key, value) for key, value in slots_to_be_set.items()]
|
|
92
|
+
|
|
93
|
+
async def run(
|
|
94
|
+
self,
|
|
95
|
+
output_channel: "OutputChannel",
|
|
96
|
+
nlg: "NaturalLanguageGenerator",
|
|
97
|
+
tracker: "DialogueStateTracker",
|
|
98
|
+
domain: "Domain",
|
|
99
|
+
metadata: Optional[Dict[Text, Any]] = None,
|
|
100
|
+
) -> List[Event]:
|
|
101
|
+
"""Trigger the flow."""
|
|
102
|
+
events: List[Event] = self.create_events_to_start_flow(tracker)
|
|
103
|
+
events.extend(self.create_events_to_set_flow_slots(metadata))
|
|
104
|
+
|
|
105
|
+
if tracker.active_loop_name:
|
|
106
|
+
# end any active loop to ensure we are progressing the started flow
|
|
107
|
+
events.append(ActiveLoop(None))
|
|
108
|
+
|
|
109
|
+
return events
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from typing import Optional, Dict, Any, List
|
|
2
|
+
|
|
3
|
+
from rasa.core.actions.action import Action
|
|
4
|
+
from rasa.core.channels import OutputChannel
|
|
5
|
+
from rasa.core.nlg import NaturalLanguageGenerator
|
|
6
|
+
from rasa.dialogue_understanding.stack.frames import SearchStackFrame
|
|
7
|
+
from rasa.shared.core.constants import ACTION_TRIGGER_SEARCH
|
|
8
|
+
from rasa.shared.core.domain import Domain
|
|
9
|
+
from rasa.shared.core.events import Event
|
|
10
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ActionTriggerSearch(Action):
|
|
14
|
+
"""Action which triggers a search"""
|
|
15
|
+
|
|
16
|
+
def name(self) -> str:
|
|
17
|
+
"""Return the name of the action."""
|
|
18
|
+
return ACTION_TRIGGER_SEARCH
|
|
19
|
+
|
|
20
|
+
async def run(
|
|
21
|
+
self,
|
|
22
|
+
output_channel: OutputChannel,
|
|
23
|
+
nlg: NaturalLanguageGenerator,
|
|
24
|
+
tracker: DialogueStateTracker,
|
|
25
|
+
domain: Domain,
|
|
26
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
27
|
+
) -> List[Event]:
|
|
28
|
+
"""Run the predicate checks."""
|
|
29
|
+
stack = tracker.stack
|
|
30
|
+
stack.push(SearchStackFrame())
|
|
31
|
+
return tracker.create_stack_updated_events(stack)
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
import logging
|
|
3
|
+
from typing import TYPE_CHECKING, Any, Dict, Text
|
|
4
|
+
|
|
5
|
+
import rasa
|
|
6
|
+
from rasa.core.actions.action_exceptions import DomainNotFound
|
|
7
|
+
from rasa.core.actions.constants import DEFAULT_SELECTIVE_DOMAIN, SELECTIVE_DOMAIN
|
|
8
|
+
from rasa.shared.constants import DOCS_BASE_URL
|
|
9
|
+
from rasa.shared.exceptions import RasaException
|
|
10
|
+
from rasa.utils.endpoints import EndpointConfig
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from rasa.shared.core.domain import Domain
|
|
14
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class CustomActionExecutor(abc.ABC):
|
|
21
|
+
"""Interface for custom action executors.
|
|
22
|
+
|
|
23
|
+
Provides an abstraction layer for executing custom actions
|
|
24
|
+
regardless of the communication protocol.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
@abc.abstractmethod
|
|
28
|
+
async def run(
|
|
29
|
+
self,
|
|
30
|
+
tracker: "DialogueStateTracker",
|
|
31
|
+
domain: "Domain",
|
|
32
|
+
include_domain: bool = False,
|
|
33
|
+
) -> Dict[Text, Any]:
|
|
34
|
+
"""Executes the custom action.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
tracker: The current state of the dialogue.
|
|
38
|
+
domain: The domain object containing domain-specific information.
|
|
39
|
+
include_domain: If True, the domain information is included in the request.
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
The response from the execution of the custom action.
|
|
43
|
+
"""
|
|
44
|
+
pass
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class NoEndpointCustomActionExecutor(CustomActionExecutor):
|
|
48
|
+
"""Implementation of a custom action executor when endpoint is not set.
|
|
49
|
+
|
|
50
|
+
Used to handle the case where no endpoint is configured.
|
|
51
|
+
|
|
52
|
+
Raises RasaException when executed.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
def __init__(self, action_name: str) -> None:
|
|
56
|
+
"""Initializes the custom action executor.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
action_name: The name of the custom action.
|
|
60
|
+
"""
|
|
61
|
+
self.action_name = action_name
|
|
62
|
+
|
|
63
|
+
async def run(
|
|
64
|
+
self,
|
|
65
|
+
tracker: "DialogueStateTracker",
|
|
66
|
+
domain: "Domain",
|
|
67
|
+
include_domain: bool = False,
|
|
68
|
+
) -> Dict[Text, Any]:
|
|
69
|
+
"""Executes the custom action.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
tracker: The current state of the dialogue.
|
|
73
|
+
domain: The domain object containing domain-specific information.
|
|
74
|
+
include_domain: If True, the domain information
|
|
75
|
+
is included in the request.
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
The response from the execution of the custom action.
|
|
79
|
+
"""
|
|
80
|
+
raise RasaException(
|
|
81
|
+
f"Failed to execute custom action '{self.action_name}' "
|
|
82
|
+
f"because no endpoint is configured to run this "
|
|
83
|
+
f"custom action. Please take a look at "
|
|
84
|
+
f"the docs and set an endpoint configuration via the "
|
|
85
|
+
f"--endpoints flag. "
|
|
86
|
+
f"{DOCS_BASE_URL}/custom-actions"
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class CustomActionRequestWriter:
|
|
91
|
+
"""Writes the request payload for a custom action."""
|
|
92
|
+
|
|
93
|
+
def __init__(self, action_name: str, action_endpoint: EndpointConfig) -> None:
|
|
94
|
+
"""Initializes the request writer.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
action_name: The name of the custom action.
|
|
98
|
+
action_endpoint: The endpoint configuration for the action server.
|
|
99
|
+
"""
|
|
100
|
+
self.action_name = action_name
|
|
101
|
+
self.action_endpoint = action_endpoint
|
|
102
|
+
|
|
103
|
+
def _is_selective_domain_enabled(self) -> bool:
|
|
104
|
+
"""Check if selective domain handling is enabled.
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
True if selective domain handling is enabled, otherwise False.
|
|
108
|
+
"""
|
|
109
|
+
if self.action_endpoint is None:
|
|
110
|
+
return False
|
|
111
|
+
return bool(
|
|
112
|
+
self.action_endpoint.kwargs.get(SELECTIVE_DOMAIN, DEFAULT_SELECTIVE_DOMAIN)
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
def create(
|
|
116
|
+
self,
|
|
117
|
+
tracker: "DialogueStateTracker",
|
|
118
|
+
domain: "Domain",
|
|
119
|
+
include_domain: bool = False,
|
|
120
|
+
) -> Dict[str, Any]:
|
|
121
|
+
"""Create the JSON payload for the action server request.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
tracker: The current state of the dialogue.
|
|
125
|
+
domain: The domain object containing domain-specific information.
|
|
126
|
+
include_domain: If True, the domain information is included in the request.
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
A JSON payload to be sent to the action server.
|
|
130
|
+
"""
|
|
131
|
+
from rasa.shared.core.trackers import EventVerbosity
|
|
132
|
+
|
|
133
|
+
tracker_state = tracker.current_state(EventVerbosity.ALL)
|
|
134
|
+
|
|
135
|
+
result = {
|
|
136
|
+
"next_action": self.action_name,
|
|
137
|
+
"sender_id": tracker.sender_id,
|
|
138
|
+
"tracker": tracker_state,
|
|
139
|
+
"version": rasa.__version__,
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if include_domain and (
|
|
143
|
+
not self._is_selective_domain_enabled()
|
|
144
|
+
or domain.does_custom_action_explicitly_need_domain(self.action_name)
|
|
145
|
+
):
|
|
146
|
+
result["domain"] = domain.as_dict()
|
|
147
|
+
|
|
148
|
+
result["domain_digest"] = domain.fingerprint()
|
|
149
|
+
|
|
150
|
+
return result
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class RetryCustomActionExecutor(CustomActionExecutor):
|
|
154
|
+
"""Retries the execution of a custom action."""
|
|
155
|
+
|
|
156
|
+
def __init__(self, custom_action_executor: CustomActionExecutor) -> None:
|
|
157
|
+
self._custom_action_executor = custom_action_executor
|
|
158
|
+
|
|
159
|
+
async def run(
|
|
160
|
+
self,
|
|
161
|
+
tracker: "DialogueStateTracker",
|
|
162
|
+
domain: "Domain",
|
|
163
|
+
include_domain: bool = False,
|
|
164
|
+
) -> Dict[Text, Any]:
|
|
165
|
+
"""Runs the wrapped custom action executor.
|
|
166
|
+
|
|
167
|
+
First request to the action server is made with/without the domain
|
|
168
|
+
as specified by the `include_domain` parameter.
|
|
169
|
+
|
|
170
|
+
If the action server responds with a `DomainNotFound` error, by running the
|
|
171
|
+
custom action executor again with the domain information.
|
|
172
|
+
|
|
173
|
+
Args:
|
|
174
|
+
tracker: The current state of the dialogue.
|
|
175
|
+
domain: The domain object containing domain-specific information.
|
|
176
|
+
include_domain: If True, the domain information is included in the request
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
The response from the execution of the custom action.
|
|
180
|
+
"""
|
|
181
|
+
try:
|
|
182
|
+
return await self._custom_action_executor.run(
|
|
183
|
+
tracker, domain, include_domain=include_domain
|
|
184
|
+
)
|
|
185
|
+
except DomainNotFound:
|
|
186
|
+
return await self._custom_action_executor.run(
|
|
187
|
+
tracker, domain, include_domain=True
|
|
188
|
+
)
|