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,155 @@
|
|
|
1
|
+
import copy
|
|
2
|
+
import logging
|
|
3
|
+
from rasa.core.constants import DEFAULT_TEMPLATE_ENGINE, TEMPLATE_ENGINE_CONFIG_KEY
|
|
4
|
+
|
|
5
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
6
|
+
from typing import Text, Any, Dict, Optional, List
|
|
7
|
+
|
|
8
|
+
from rasa.core.nlg import interpolator
|
|
9
|
+
from rasa.core.nlg.generator import NaturalLanguageGenerator, ResponseVariationFilter
|
|
10
|
+
from rasa.shared.constants import RESPONSE_CONDITION
|
|
11
|
+
from rasa.shared.core.domain import RESPONSE_KEYS_TO_INTERPOLATE
|
|
12
|
+
from rasa.shared.nlu.constants import METADATA
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class TemplatedNaturalLanguageGenerator(NaturalLanguageGenerator):
|
|
18
|
+
"""Natural language generator that generates messages based on responses.
|
|
19
|
+
|
|
20
|
+
The responses can use variables to customize the utterances based on the
|
|
21
|
+
state of the dialogue.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def __init__(self, responses: Dict[Text, List[Dict[Text, Any]]]) -> None:
|
|
25
|
+
"""Creates a Template Natural Language Generator.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
responses: responses that will be used to generate messages.
|
|
29
|
+
"""
|
|
30
|
+
self.responses = responses
|
|
31
|
+
|
|
32
|
+
# noinspection PyUnusedLocal
|
|
33
|
+
def _random_response_for(
|
|
34
|
+
self, utter_action: Text, output_channel: Text, filled_slots: Dict[Text, Any]
|
|
35
|
+
) -> Optional[Dict[Text, Any]]:
|
|
36
|
+
"""Select random response for the utter action from available ones.
|
|
37
|
+
|
|
38
|
+
If channel-specific responses for the current output channel are given,
|
|
39
|
+
only choose from channel-specific ones.
|
|
40
|
+
"""
|
|
41
|
+
import numpy as np
|
|
42
|
+
|
|
43
|
+
if utter_action in self.responses:
|
|
44
|
+
response_filter = ResponseVariationFilter(self.responses)
|
|
45
|
+
suitable_responses = response_filter.responses_for_utter_action(
|
|
46
|
+
utter_action, output_channel, filled_slots
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
if suitable_responses:
|
|
50
|
+
selected_response = np.random.choice(suitable_responses)
|
|
51
|
+
condition = selected_response.get(RESPONSE_CONDITION)
|
|
52
|
+
if condition:
|
|
53
|
+
formatted_response_conditions = self._format_response_conditions(
|
|
54
|
+
condition
|
|
55
|
+
)
|
|
56
|
+
logger.debug(
|
|
57
|
+
"Selecting response variation with conditions:"
|
|
58
|
+
f"{formatted_response_conditions}"
|
|
59
|
+
)
|
|
60
|
+
return selected_response
|
|
61
|
+
else:
|
|
62
|
+
return None
|
|
63
|
+
else:
|
|
64
|
+
return None
|
|
65
|
+
|
|
66
|
+
async def generate(
|
|
67
|
+
self,
|
|
68
|
+
utter_action: Text,
|
|
69
|
+
tracker: DialogueStateTracker,
|
|
70
|
+
output_channel: Text,
|
|
71
|
+
**kwargs: Any,
|
|
72
|
+
) -> Optional[Dict[Text, Any]]:
|
|
73
|
+
"""Generate a response for the requested utter action."""
|
|
74
|
+
filled_slots = tracker.current_slot_values()
|
|
75
|
+
stack_context = tracker.stack.current_context()
|
|
76
|
+
return self.generate_from_slots(
|
|
77
|
+
utter_action, filled_slots, stack_context, output_channel, **kwargs
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
def generate_from_slots(
|
|
81
|
+
self,
|
|
82
|
+
utter_action: Text,
|
|
83
|
+
filled_slots: Dict[Text, Any],
|
|
84
|
+
stack_context: Dict[Text, Any],
|
|
85
|
+
output_channel: Text,
|
|
86
|
+
**kwargs: Any,
|
|
87
|
+
) -> Optional[Dict[Text, Any]]:
|
|
88
|
+
"""Generate a response for the requested utter action."""
|
|
89
|
+
# Fetching a random response for the passed utter action
|
|
90
|
+
r = copy.deepcopy(
|
|
91
|
+
self._random_response_for(utter_action, output_channel, filled_slots)
|
|
92
|
+
)
|
|
93
|
+
# Filling the slots in the response with placeholders and returning the response
|
|
94
|
+
if r is not None:
|
|
95
|
+
return self._fill_response(r, filled_slots, stack_context, **kwargs)
|
|
96
|
+
else:
|
|
97
|
+
return None
|
|
98
|
+
|
|
99
|
+
def _fill_response(
|
|
100
|
+
self,
|
|
101
|
+
response: Dict[Text, Any],
|
|
102
|
+
filled_slots: Dict[Text, Any],
|
|
103
|
+
stack_context: Dict[Text, Any],
|
|
104
|
+
**kwargs: Any,
|
|
105
|
+
) -> Dict[Text, Any]:
|
|
106
|
+
"""Combine slot values and key word arguments to fill responses."""
|
|
107
|
+
# Getting the slot values in the response variables
|
|
108
|
+
response_vars = self._response_variables(filled_slots, stack_context, kwargs)
|
|
109
|
+
|
|
110
|
+
# template formatting method
|
|
111
|
+
method = response.get(METADATA, {}).get(
|
|
112
|
+
TEMPLATE_ENGINE_CONFIG_KEY, DEFAULT_TEMPLATE_ENGINE
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
if response_vars:
|
|
116
|
+
for key in RESPONSE_KEYS_TO_INTERPOLATE:
|
|
117
|
+
if key in response:
|
|
118
|
+
response[key] = interpolator.interpolate(
|
|
119
|
+
response[key],
|
|
120
|
+
response_vars,
|
|
121
|
+
method=method,
|
|
122
|
+
)
|
|
123
|
+
return response
|
|
124
|
+
|
|
125
|
+
@staticmethod
|
|
126
|
+
def _response_variables(
|
|
127
|
+
filled_slots: Dict[Text, Any],
|
|
128
|
+
stack_context: Dict[Text, Any],
|
|
129
|
+
kwargs: Dict[Text, Any],
|
|
130
|
+
) -> Dict[Text, Any]:
|
|
131
|
+
"""Combine slot values and key word arguments to fill responses."""
|
|
132
|
+
if filled_slots is None:
|
|
133
|
+
filled_slots = {}
|
|
134
|
+
|
|
135
|
+
# copy in the context from the stack
|
|
136
|
+
response_vars = {"context": stack_context}
|
|
137
|
+
# Copying the filled slots in the response variables.
|
|
138
|
+
response_vars.update(filled_slots)
|
|
139
|
+
response_vars.update(kwargs)
|
|
140
|
+
return response_vars
|
|
141
|
+
|
|
142
|
+
@staticmethod
|
|
143
|
+
def _format_response_conditions(response_conditions: List[Dict[Text, Any]]) -> Text:
|
|
144
|
+
formatted_response_conditions = [""]
|
|
145
|
+
for index, condition in enumerate(response_conditions):
|
|
146
|
+
constraints = []
|
|
147
|
+
constraints.append(f"type: {condition['type']!s}")
|
|
148
|
+
constraints.append(f"name: {condition['name']!s}")
|
|
149
|
+
constraints.append(f"value: {condition['value']!s}")
|
|
150
|
+
|
|
151
|
+
condition_message = " | ".join(constraints)
|
|
152
|
+
formatted_condition = f"[condition {index + 1!s}] {condition_message}"
|
|
153
|
+
formatted_response_conditions.append(formatted_condition)
|
|
154
|
+
|
|
155
|
+
return "\n".join(formatted_response_conditions)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
from jinja2 import Template
|
|
5
|
+
from langchain.llms.base import BaseLLM
|
|
6
|
+
from rasa.core.tracker_store import DialogueStateTracker
|
|
7
|
+
from rasa.shared.utils.llm import (
|
|
8
|
+
tracker_as_readable_transcript,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
structlogger = structlog.get_logger()
|
|
12
|
+
|
|
13
|
+
_DEFAULT_SUMMARIZER_TEMPLATE = """Summarize the provided conversation between
|
|
14
|
+
a user and a conversational AI. The summary should be a short text that
|
|
15
|
+
captures the main points of the conversation.
|
|
16
|
+
|
|
17
|
+
Conversation:
|
|
18
|
+
{{conversation}}
|
|
19
|
+
|
|
20
|
+
Summary:"""
|
|
21
|
+
SUMMARY_PROMPT_TEMPLATE = Template(_DEFAULT_SUMMARIZER_TEMPLATE)
|
|
22
|
+
MAX_TURNS_DEFAULT = 20
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _create_summarization_prompt(
|
|
26
|
+
tracker: DialogueStateTracker, max_turns: Optional[int]
|
|
27
|
+
) -> str:
|
|
28
|
+
"""Creates an LLM prompt to summarize the conversation in the tracker.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
tracker: tracker of the conversation to be summarized
|
|
32
|
+
max_turns: maximum number of turns to summarize
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
The prompt to summarize the conversation.
|
|
37
|
+
"""
|
|
38
|
+
transcript = tracker_as_readable_transcript(tracker, max_turns=max_turns)
|
|
39
|
+
return SUMMARY_PROMPT_TEMPLATE.render(
|
|
40
|
+
conversation=transcript,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
async def summarize_conversation(
|
|
45
|
+
tracker: DialogueStateTracker,
|
|
46
|
+
llm: BaseLLM,
|
|
47
|
+
max_turns: Optional[int] = MAX_TURNS_DEFAULT,
|
|
48
|
+
) -> str:
|
|
49
|
+
"""Summarizes the dialogue using the LLM.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
tracker: the tracker to summarize
|
|
53
|
+
llm: the LLM to use for summarization
|
|
54
|
+
max_turns: maximum number of turns to summarize
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
The summary of the dialogue.
|
|
58
|
+
"""
|
|
59
|
+
prompt = _create_summarization_prompt(tracker, max_turns)
|
|
60
|
+
try:
|
|
61
|
+
summarization = (await llm.apredict(prompt)).strip()
|
|
62
|
+
structlogger.debug(
|
|
63
|
+
"summarization.success", summarization=summarization, prompt=prompt
|
|
64
|
+
)
|
|
65
|
+
return summarization
|
|
66
|
+
except Exception as e:
|
|
67
|
+
transcript = tracker_as_readable_transcript(tracker, max_turns=max_turns)
|
|
68
|
+
structlogger.error("summarization.error", error=e)
|
|
69
|
+
return transcript
|
|
File without changes
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from abc import abstractmethod, ABC
|
|
3
|
+
from typing import Optional, Text, List, Dict, Any
|
|
4
|
+
import logging
|
|
5
|
+
|
|
6
|
+
from rasa.engine.graph import GraphComponent
|
|
7
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
8
|
+
from rasa.engine.storage.resource import Resource
|
|
9
|
+
from rasa.engine.runner.interface import ExecutionContext
|
|
10
|
+
from rasa.core.policies.policy import PolicyPrediction
|
|
11
|
+
from rasa.shared.exceptions import RasaException, InvalidConfigException
|
|
12
|
+
from rasa.shared.core.constants import ACTION_LISTEN_NAME
|
|
13
|
+
from rasa.shared.core.domain import Domain
|
|
14
|
+
from rasa.shared.core.events import (
|
|
15
|
+
ActionExecutionRejected,
|
|
16
|
+
ActionExecuted,
|
|
17
|
+
DefinePrevUserUtteredFeaturization,
|
|
18
|
+
)
|
|
19
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def is_not_in_training_data(
|
|
25
|
+
policy_name: Optional[Text], max_confidence: Optional[float] = None
|
|
26
|
+
) -> bool:
|
|
27
|
+
"""Checks whether the prediction is empty or by a policy which did not memoize data.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
policy_name: The name of the policy.
|
|
31
|
+
max_confidence: The max confidence of the policy's prediction.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
`False` if and only if an action was predicted (i.e. `max_confidence` > 0) by
|
|
35
|
+
a `MemoizationPolicy`
|
|
36
|
+
"""
|
|
37
|
+
from rasa.core.policies.rule_policy import RulePolicy
|
|
38
|
+
from rasa.core.policies.memoization import (
|
|
39
|
+
MemoizationPolicy,
|
|
40
|
+
AugmentedMemoizationPolicy,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
if not policy_name:
|
|
44
|
+
return True
|
|
45
|
+
|
|
46
|
+
memorizing_policies = [
|
|
47
|
+
RulePolicy.__name__,
|
|
48
|
+
MemoizationPolicy.__name__,
|
|
49
|
+
AugmentedMemoizationPolicy.__name__,
|
|
50
|
+
]
|
|
51
|
+
is_memorized = any(
|
|
52
|
+
policy_name.endswith(f"_{memoizing_policy}")
|
|
53
|
+
for memoizing_policy in memorizing_policies
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
# also check if confidence is 0, than it cannot be count as prediction
|
|
57
|
+
return not is_memorized or max_confidence == 0.0
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class InvalidPolicyEnsembleConfig(RasaException):
|
|
61
|
+
"""Exception that can be raised when the policy ensemble is not valid."""
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class PolicyPredictionEnsemble(ABC):
|
|
65
|
+
"""Interface for any policy prediction ensemble.
|
|
66
|
+
|
|
67
|
+
Given a list of predictions from policies, which include some meta data about the
|
|
68
|
+
policies themselves, an "ensemble" decides what the final prediction should be, in
|
|
69
|
+
the following way:
|
|
70
|
+
1. If the previously predicted action was rejected, then the ensemble sets the
|
|
71
|
+
probability for this action to 0.0 (in all given predictions).
|
|
72
|
+
2. It combines the information from the single predictions, which include some
|
|
73
|
+
meta data about the policies (e.g. priority), into a final prediction.
|
|
74
|
+
3. If the sequence of events given at the time of prediction ends with a user
|
|
75
|
+
utterance, then the ensemble adds a special event to the event-list included in
|
|
76
|
+
the final prediction that indicates whether the final prediction was made based
|
|
77
|
+
on the actual text of that user utterance.
|
|
78
|
+
|
|
79
|
+
Observe that policies predict "mandatory" as well as "optional"
|
|
80
|
+
events. The ensemble decides which of the optional events should
|
|
81
|
+
be passed on.
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
def combine_predictions_from_kwargs(
|
|
85
|
+
self, tracker: DialogueStateTracker, domain: Domain, **kwargs: Any
|
|
86
|
+
) -> PolicyPrediction:
|
|
87
|
+
"""Derives a single prediction from predictions given as kwargs.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
tracker: dialogue state tracker holding the state of the conversation,
|
|
91
|
+
which may influence the combination of predictions as well
|
|
92
|
+
domain: the common domain
|
|
93
|
+
**kwargs: arbitrary keyword arguments. All policy predictions passed as
|
|
94
|
+
kwargs will be combined.
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
a single prediction
|
|
98
|
+
"""
|
|
99
|
+
predictions = [
|
|
100
|
+
value for value in kwargs.values() if isinstance(value, PolicyPrediction)
|
|
101
|
+
]
|
|
102
|
+
return self.combine_predictions(
|
|
103
|
+
predictions=predictions, tracker=tracker, domain=domain
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
@abstractmethod
|
|
107
|
+
def combine_predictions(
|
|
108
|
+
self,
|
|
109
|
+
predictions: List[PolicyPrediction],
|
|
110
|
+
tracker: DialogueStateTracker,
|
|
111
|
+
domain: Domain,
|
|
112
|
+
) -> PolicyPrediction:
|
|
113
|
+
"""Derives a single prediction from the given list of predictions.
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
predictions: a list of policy predictions that include "confidence scores"
|
|
117
|
+
which are non-negative but *do not* necessarily up to 1
|
|
118
|
+
tracker: dialogue state tracker holding the state of the conversation,
|
|
119
|
+
which may influence the combination of predictions as well
|
|
120
|
+
domain: the common domain
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
a single prediction
|
|
124
|
+
"""
|
|
125
|
+
...
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class DefaultPolicyPredictionEnsemble(PolicyPredictionEnsemble, GraphComponent):
|
|
129
|
+
"""An ensemble that picks the "best" prediction and combines events from all.
|
|
130
|
+
|
|
131
|
+
The following rules determine which prediction is the "best":
|
|
132
|
+
1. "No user" predictions overrule all other predictions.
|
|
133
|
+
|
|
134
|
+
2. End-to-end predictions overrule all other predictions based on
|
|
135
|
+
user input - if and only if *no* "no user" prediction is present in the
|
|
136
|
+
given ensemble.
|
|
137
|
+
|
|
138
|
+
3. Given two predictions, if the maximum confidence of one prediction is
|
|
139
|
+
strictly larger than that of the other, then the prediction with the
|
|
140
|
+
strictly larger maximum confidence is considered to be "better".
|
|
141
|
+
The priorities of the policies that made these predictions does not matter.
|
|
142
|
+
|
|
143
|
+
4. Given two predictions of policies that are equally confident, the
|
|
144
|
+
prediction of the policy with the higher priority is considered to be
|
|
145
|
+
"better".
|
|
146
|
+
|
|
147
|
+
Observe that this comparison is *not* symmetric if the priorities are allowed to
|
|
148
|
+
coincide (i.e. if we cannot distinguish two predictions using 1.-4., then
|
|
149
|
+
the first prediction is considered to be "better").
|
|
150
|
+
|
|
151
|
+
The list of events in the final prediction will contain all mandatory
|
|
152
|
+
events contained in the given predictions, the optional events given in the
|
|
153
|
+
"best" prediction, and `DefinePrevUserUtteredFeaturization` event (if the
|
|
154
|
+
prediction was made for a sequence of events ending with a user utterance).
|
|
155
|
+
"""
|
|
156
|
+
|
|
157
|
+
@classmethod
|
|
158
|
+
def create(
|
|
159
|
+
cls,
|
|
160
|
+
config: Dict[Text, Any],
|
|
161
|
+
model_storage: ModelStorage,
|
|
162
|
+
resource: Resource,
|
|
163
|
+
execution_context: ExecutionContext,
|
|
164
|
+
) -> DefaultPolicyPredictionEnsemble:
|
|
165
|
+
"""Creates a new instance (see parent class for full docstring)."""
|
|
166
|
+
return cls()
|
|
167
|
+
|
|
168
|
+
def __str__(self) -> Text:
|
|
169
|
+
return f"{self.__class__.__name__}()"
|
|
170
|
+
|
|
171
|
+
@staticmethod
|
|
172
|
+
def _pick_best_policy(predictions: List[PolicyPrediction]) -> PolicyPrediction:
|
|
173
|
+
"""Picks the best policy prediction based on probabilities and policy priority.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
predictions: a list containing policy predictions
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
The index of the best prediction
|
|
180
|
+
"""
|
|
181
|
+
best_confidence = (-1.0, -1)
|
|
182
|
+
best_index = -1
|
|
183
|
+
|
|
184
|
+
# different type of predictions have different priorities
|
|
185
|
+
# No user predictions overrule all other predictions.
|
|
186
|
+
is_no_user_prediction = any(
|
|
187
|
+
prediction.is_no_user_prediction for prediction in predictions
|
|
188
|
+
)
|
|
189
|
+
# End-to-end predictions overrule all other predictions based on user input.
|
|
190
|
+
is_end_to_end_prediction = any(
|
|
191
|
+
prediction.is_end_to_end_prediction for prediction in predictions
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
policy_events = []
|
|
195
|
+
for idx, prediction in enumerate(predictions):
|
|
196
|
+
policy_events += prediction.events
|
|
197
|
+
|
|
198
|
+
# No user predictions (e.g. happy path loop predictions)
|
|
199
|
+
# overrule all other predictions.
|
|
200
|
+
if prediction.is_no_user_prediction != is_no_user_prediction:
|
|
201
|
+
continue
|
|
202
|
+
|
|
203
|
+
# End-to-end predictions overrule all other predictions based on user input.
|
|
204
|
+
if (
|
|
205
|
+
not is_no_user_prediction
|
|
206
|
+
and prediction.is_end_to_end_prediction != is_end_to_end_prediction
|
|
207
|
+
):
|
|
208
|
+
continue
|
|
209
|
+
|
|
210
|
+
confidence = (prediction.max_confidence, prediction.policy_priority)
|
|
211
|
+
if confidence > best_confidence:
|
|
212
|
+
# pick the best policy
|
|
213
|
+
best_confidence = confidence
|
|
214
|
+
best_index = idx
|
|
215
|
+
|
|
216
|
+
if best_index < 0:
|
|
217
|
+
raise InvalidConfigException(
|
|
218
|
+
"No best prediction found. Please check your model configuration."
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
best_prediction = predictions[best_index]
|
|
222
|
+
policy_events += best_prediction.optional_events
|
|
223
|
+
|
|
224
|
+
return PolicyPrediction(
|
|
225
|
+
best_prediction.probabilities,
|
|
226
|
+
best_prediction.policy_name,
|
|
227
|
+
best_prediction.policy_priority,
|
|
228
|
+
policy_events,
|
|
229
|
+
is_end_to_end_prediction=best_prediction.is_end_to_end_prediction,
|
|
230
|
+
is_no_user_prediction=best_prediction.is_no_user_prediction,
|
|
231
|
+
diagnostic_data=best_prediction.diagnostic_data,
|
|
232
|
+
hide_rule_turn=best_prediction.hide_rule_turn,
|
|
233
|
+
action_metadata=best_prediction.action_metadata,
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
@staticmethod
|
|
237
|
+
def _best_policy_prediction(
|
|
238
|
+
predictions: List[PolicyPrediction],
|
|
239
|
+
tracker: DialogueStateTracker,
|
|
240
|
+
domain: Domain,
|
|
241
|
+
) -> PolicyPrediction:
|
|
242
|
+
"""Finds the best policy prediction.
|
|
243
|
+
|
|
244
|
+
Args:
|
|
245
|
+
predictions: a list of policy predictions that include "confidence scores"
|
|
246
|
+
which are non-negative but *do not* necessarily up to 1
|
|
247
|
+
tracker: dialogue state tracker holding the state of the conversation,
|
|
248
|
+
which may influence the combination of predictions as well
|
|
249
|
+
domain: the common domain
|
|
250
|
+
|
|
251
|
+
Returns:
|
|
252
|
+
The winning policy prediction.
|
|
253
|
+
"""
|
|
254
|
+
last_action_event = next(
|
|
255
|
+
(
|
|
256
|
+
event
|
|
257
|
+
for event in reversed(tracker.events)
|
|
258
|
+
if isinstance(event, (ActionExecutionRejected, ActionExecuted))
|
|
259
|
+
),
|
|
260
|
+
None,
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
rejected_action_name = None
|
|
264
|
+
if len(tracker.events) > 0 and isinstance(
|
|
265
|
+
last_action_event, ActionExecutionRejected
|
|
266
|
+
):
|
|
267
|
+
rejected_action_name = last_action_event.action_name
|
|
268
|
+
|
|
269
|
+
if rejected_action_name:
|
|
270
|
+
logger.debug(
|
|
271
|
+
f"Execution of '{rejected_action_name}' was rejected. "
|
|
272
|
+
f"Setting its confidence to 0.0 in all predictions."
|
|
273
|
+
)
|
|
274
|
+
index_of_rejected_action = domain.index_for_action(rejected_action_name)
|
|
275
|
+
for prediction in predictions:
|
|
276
|
+
prediction.probabilities[index_of_rejected_action] = 0.0
|
|
277
|
+
|
|
278
|
+
return DefaultPolicyPredictionEnsemble._pick_best_policy(predictions)
|
|
279
|
+
|
|
280
|
+
def combine_predictions(
|
|
281
|
+
self,
|
|
282
|
+
predictions: List[PolicyPrediction],
|
|
283
|
+
tracker: DialogueStateTracker,
|
|
284
|
+
domain: Domain,
|
|
285
|
+
) -> PolicyPrediction:
|
|
286
|
+
"""Derives a single prediction from the given list of predictions.
|
|
287
|
+
|
|
288
|
+
Note that you might get unexpected results if the priorities are non-unique.
|
|
289
|
+
Moreover, the order of events in the result is determined by the order of the
|
|
290
|
+
predictions passed to this method.
|
|
291
|
+
|
|
292
|
+
Args:
|
|
293
|
+
predictions: a list of policy predictions that include "probabilities"
|
|
294
|
+
which are non-negative but *do not* necessarily up to 1
|
|
295
|
+
tracker: dialogue state tracker holding the state of the conversation
|
|
296
|
+
domain: the common domain
|
|
297
|
+
|
|
298
|
+
Returns:
|
|
299
|
+
The "best" prediction.
|
|
300
|
+
"""
|
|
301
|
+
if not predictions:
|
|
302
|
+
raise InvalidConfigException(
|
|
303
|
+
"Expected at least one prediction. Please check your model "
|
|
304
|
+
"configuration."
|
|
305
|
+
)
|
|
306
|
+
# Reminder: If just a single policy is given, we do *not* just return it because
|
|
307
|
+
# it is expected that the final prediction contains mandatory and optional
|
|
308
|
+
# events in the `events` attribute and no optional events.
|
|
309
|
+
|
|
310
|
+
winning_prediction = self._best_policy_prediction(
|
|
311
|
+
predictions=predictions, domain=domain, tracker=tracker
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
if tracker.latest_action_name == ACTION_LISTEN_NAME:
|
|
315
|
+
if winning_prediction.is_end_to_end_prediction:
|
|
316
|
+
logger.debug("Made e2e prediction using user text.")
|
|
317
|
+
logger.debug("Added `DefinePrevUserUtteredFeaturization(True)` event.")
|
|
318
|
+
winning_prediction.events.append(
|
|
319
|
+
DefinePrevUserUtteredFeaturization(True)
|
|
320
|
+
)
|
|
321
|
+
else:
|
|
322
|
+
logger.debug("Made prediction using user intent.")
|
|
323
|
+
logger.debug("Added `DefinePrevUserUtteredFeaturization(False)` event.")
|
|
324
|
+
winning_prediction.events.append(
|
|
325
|
+
DefinePrevUserUtteredFeaturization(False)
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
logger.debug(f"Predicted next action using {winning_prediction.policy_name}.")
|
|
329
|
+
return winning_prediction
|