rasa-pro 3.8.16__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 +380 -0
- rasa/__init__.py +10 -0
- rasa/__main__.py +151 -0
- rasa/anonymization/__init__.py +2 -0
- rasa/anonymization/anonymisation_rule_yaml_reader.py +91 -0
- rasa/anonymization/anonymization_pipeline.py +287 -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 +117 -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 +566 -0
- rasa/cli/evaluate.py +222 -0
- rasa/cli/export.py +251 -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 +33 -0
- rasa/cli/project_templates/calm/domain/list_contacts.yml +14 -0
- rasa/cli/project_templates/calm/domain/remove_contact.yml +31 -0
- rasa/cli/project_templates/calm/domain/shared.yml +5 -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/domain.yml +17 -0
- rasa/cli/project_templates/tutorial/endpoints.yml +45 -0
- rasa/cli/run.py +136 -0
- rasa/cli/scaffold.py +268 -0
- rasa/cli/shell.py +141 -0
- rasa/cli/studio/__init__.py +0 -0
- rasa/cli/studio/download.py +51 -0
- rasa/cli/studio/studio.py +110 -0
- rasa/cli/studio/train.py +59 -0
- rasa/cli/studio/upload.py +85 -0
- rasa/cli/telemetry.py +90 -0
- rasa/cli/test.py +280 -0
- rasa/cli/train.py +260 -0
- rasa/cli/utils.py +453 -0
- rasa/cli/visualize.py +40 -0
- rasa/cli/x.py +205 -0
- rasa/constants.py +37 -0
- rasa/core/__init__.py +17 -0
- rasa/core/actions/__init__.py +0 -0
- rasa/core/actions/action.py +1450 -0
- rasa/core/actions/action_clean_stack.py +59 -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 +2 -0
- rasa/core/actions/forms.py +737 -0
- rasa/core/actions/loops.py +111 -0
- rasa/core/actions/two_stage_fallback.py +186 -0
- rasa/core/agent.py +557 -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 +387 -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 +339 -0
- rasa/core/channels/callback.py +85 -0
- rasa/core/channels/channel.py +419 -0
- rasa/core/channels/console.py +243 -0
- rasa/core/channels/development_inspector.py +93 -0
- rasa/core/channels/facebook.py +422 -0
- rasa/core/channels/hangouts.py +335 -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-5623b6dc.js +1 -0
- rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
- rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-685c106a.js +10 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-8cbed007.js +2 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-5889cf12.js +2 -0
- rasa/core/channels/inspector/dist/assets/createText-62fc7601-24c249d7.js +7 -0
- rasa/core/channels/inspector/dist/assets/edges-f2ad444c-7dd06a75.js +4 -0
- rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-62c1e54c.js +51 -0
- rasa/core/channels/inspector/dist/assets/flowDb-1972c806-ce49b86f.js +6 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-4067e48f.js +4 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-85583a23.js +1 -0
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-59fe4051.js +139 -0
- rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-47e3a43b.js +266 -0
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-5a2ac0d9.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-268a75c0.js +1040 -0
- rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-dfb8efc4.js +1 -0
- rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
- rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-b0c470f2.js +7 -0
- rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
- rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-2edb829a.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-b6873d69.js +1 -0
- rasa/core/channels/inspector/dist/assets/line-1efc5781.js +1 -0
- rasa/core/channels/inspector/dist/assets/linear-661e9b94.js +1 -0
- rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-2d2e727f.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-9d3ea93d.js +35 -0
- rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-06a178a2.js +7 -0
- rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-0bfedffc.js +52 -0
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-d76d0a04.js +8 -0
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-37bb4341.js +122 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-f52f7f57.js +1 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-4a986a20.js +1 -0
- rasa/core/channels/inspector/dist/assets/styles-080da4f6-7dd9ae12.js +110 -0
- rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-46e1ca14.js +159 -0
- rasa/core/channels/inspector/dist/assets/styles-9c745c82-4a97439a.js +207 -0
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-823917a3.js +1 -0
- rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-9ea72896.js +61 -0
- rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-b631a8b6.js +7 -0
- rasa/core/channels/inspector/dist/index.html +39 -0
- rasa/core/channels/inspector/index.html +37 -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 +97 -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 +385 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +239 -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 +210 -0
- rasa/core/channels/rocketchat.py +175 -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 +135 -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 +925 -0
- rasa/core/evaluation/marker_stats.py +294 -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 +402 -0
- rasa/core/featurizers/tracker_featurizers.py +1172 -0
- rasa/core/http_interpreter.py +89 -0
- rasa/core/information_retrieval/__init__.py +0 -0
- rasa/core/information_retrieval/faiss.py +116 -0
- rasa/core/information_retrieval/information_retrieval.py +72 -0
- rasa/core/information_retrieval/milvus.py +59 -0
- rasa/core/information_retrieval/qdrant.py +102 -0
- rasa/core/jobs.py +63 -0
- rasa/core/lock.py +139 -0
- rasa/core/lock_store.py +344 -0
- rasa/core/migrate.py +404 -0
- rasa/core/nlg/__init__.py +3 -0
- rasa/core/nlg/callback.py +147 -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 +717 -0
- rasa/core/policies/enterprise_search_prompt_template.jinja2 +62 -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 +582 -0
- rasa/core/policies/flows/flow_step_result.py +43 -0
- rasa/core/policies/intentless_policy.py +924 -0
- rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
- rasa/core/policies/memoization.py +538 -0
- rasa/core/policies/policy.py +716 -0
- rasa/core/policies/rule_policy.py +1276 -0
- rasa/core/policies/ted_policy.py +2146 -0
- rasa/core/policies/unexpected_intent_policy.py +1015 -0
- rasa/core/processor.py +1331 -0
- rasa/core/run.py +315 -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 +576 -0
- rasa/core/test.py +1337 -0
- rasa/core/tracker_store.py +1664 -0
- rasa/core/train.py +107 -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 +1742 -0
- rasa/core/training/story_conflict.py +381 -0
- rasa/core/training/training.py +93 -0
- rasa/core/utils.py +344 -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 +189 -0
- rasa/dialogue_understanding/coexistence/llm_based_router.py +261 -0
- rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
- rasa/dialogue_understanding/commands/__init__.py +45 -0
- rasa/dialogue_understanding/commands/can_not_handle_command.py +61 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +116 -0
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +48 -0
- rasa/dialogue_understanding/commands/clarify_command.py +77 -0
- rasa/dialogue_understanding/commands/command.py +85 -0
- rasa/dialogue_understanding/commands/correct_slots_command.py +288 -0
- rasa/dialogue_understanding/commands/error_command.py +67 -0
- rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
- rasa/dialogue_understanding/commands/handle_code_change_command.py +64 -0
- rasa/dialogue_understanding/commands/human_handoff_command.py +57 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +48 -0
- rasa/dialogue_understanding/commands/noop_command.py +45 -0
- rasa/dialogue_understanding/commands/set_slot_command.py +125 -0
- rasa/dialogue_understanding/commands/skip_question_command.py +66 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +98 -0
- rasa/dialogue_understanding/generator/__init__.py +6 -0
- rasa/dialogue_understanding/generator/command_generator.py +257 -0
- rasa/dialogue_understanding/generator/command_prompt_template.jinja2 +57 -0
- rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +410 -0
- rasa/dialogue_understanding/generator/llm_command_generator.py +637 -0
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +157 -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 +243 -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 +578 -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 +10 -0
- rasa/e2e_test/e2e_test_case.py +322 -0
- rasa/e2e_test/e2e_test_result.py +34 -0
- rasa/e2e_test/e2e_test_runner.py +659 -0
- rasa/e2e_test/e2e_test_schema.yml +67 -0
- rasa/engine/__init__.py +0 -0
- rasa/engine/caching.py +464 -0
- rasa/engine/constants.py +17 -0
- rasa/engine/exceptions.py +14 -0
- rasa/engine/graph.py +625 -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 +1252 -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 +256 -0
- rasa/engine/runner/interface.py +49 -0
- rasa/engine/storage/__init__.py +0 -0
- rasa/engine/storage/local_model_storage.py +248 -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 +839 -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 +552 -0
- rasa/graph_components/validators/finetuning_validator.py +302 -0
- rasa/hooks.py +113 -0
- rasa/jupyter.py +63 -0
- rasa/keys +1 -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 +535 -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 +1874 -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 +240 -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 +309 -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 +672 -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 +449 -0
- rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +772 -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 +840 -0
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +539 -0
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +269 -0
- rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
- rasa/nlu/model.py +24 -0
- rasa/nlu/persistor.py +240 -0
- rasa/nlu/run.py +27 -0
- rasa/nlu/selectors/__init__.py +0 -0
- rasa/nlu/selectors/response_selector.py +990 -0
- rasa/nlu/test.py +1943 -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 +312 -0
- rasa/plugin.py +90 -0
- rasa/server.py +1536 -0
- rasa/shared/__init__.py +0 -0
- rasa/shared/constants.py +181 -0
- rasa/shared/core/__init__.py +0 -0
- rasa/shared/core/constants.py +168 -0
- rasa/shared/core/conversation.py +46 -0
- rasa/shared/core/domain.py +2106 -0
- rasa/shared/core/events.py +2507 -0
- rasa/shared/core/flows/__init__.py +7 -0
- rasa/shared/core/flows/flow.py +353 -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 +211 -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 +51 -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 +907 -0
- rasa/shared/core/slot_mappings.py +235 -0
- rasa/shared/core/slots.py +647 -0
- rasa/shared/core/trackers.py +1159 -0
- rasa/shared/core/training_data/__init__.py +0 -0
- rasa/shared/core/training_data/loading.py +90 -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 +442 -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 +192 -0
- rasa/shared/engine/__init__.py +0 -0
- rasa/shared/engine/caching.py +26 -0
- rasa/shared/exceptions.py +129 -0
- rasa/shared/importers/__init__.py +0 -0
- rasa/shared/importers/importer.py +705 -0
- rasa/shared/importers/multi_project.py +203 -0
- rasa/shared/importers/rasa.py +100 -0
- rasa/shared/importers/utils.py +34 -0
- rasa/shared/nlu/__init__.py +0 -0
- rasa/shared/nlu/constants.py +45 -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 +209 -0
- rasa/shared/nlu/training_data/features.py +374 -0
- rasa/shared/nlu/training_data/formats/__init__.py +10 -0
- rasa/shared/nlu/training_data/formats/dialogflow.py +162 -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 +605 -0
- rasa/shared/nlu/training_data/formats/readerwriter.py +245 -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 +477 -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 +732 -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 +1 -0
- rasa/shared/utils/io.py +403 -0
- rasa/shared/utils/llm.py +405 -0
- rasa/shared/utils/pykwalify_extensions.py +26 -0
- rasa/shared/utils/schemas/__init__.py +0 -0
- rasa/shared/utils/schemas/config.yml +2 -0
- rasa/shared/utils/schemas/domain.yml +142 -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 +777 -0
- rasa/studio/__init__.py +0 -0
- rasa/studio/auth.py +252 -0
- rasa/studio/config.py +127 -0
- rasa/studio/constants.py +16 -0
- rasa/studio/data_handler.py +352 -0
- rasa/studio/download.py +350 -0
- rasa/studio/train.py +136 -0
- rasa/studio/upload.py +408 -0
- rasa/telemetry.py +1583 -0
- rasa/tracing/__init__.py +0 -0
- rasa/tracing/config.py +338 -0
- rasa/tracing/constants.py +38 -0
- rasa/tracing/instrumentation/__init__.py +0 -0
- rasa/tracing/instrumentation/attribute_extractors.py +663 -0
- rasa/tracing/instrumentation/instrumentation.py +939 -0
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +142 -0
- rasa/tracing/instrumentation/metrics.py +206 -0
- rasa/tracing/metric_instrument_provider.py +125 -0
- rasa/utils/__init__.py +0 -0
- rasa/utils/beta.py +83 -0
- rasa/utils/cli.py +27 -0
- rasa/utils/common.py +635 -0
- rasa/utils/converter.py +53 -0
- rasa/utils/endpoints.py +303 -0
- rasa/utils/io.py +326 -0
- rasa/utils/licensing.py +319 -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/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 +991 -0
- rasa/utils/tensorflow/model_data_utils.py +500 -0
- rasa/utils/tensorflow/models.py +936 -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/yaml.py +54 -0
- rasa/validator.py +1035 -0
- rasa/version.py +3 -0
- rasa_pro-3.8.16.dist-info/METADATA +528 -0
- rasa_pro-3.8.16.dist-info/NOTICE +5 -0
- rasa_pro-3.8.16.dist-info/RECORD +644 -0
- rasa_pro-3.8.16.dist-info/WHEEL +4 -0
- rasa_pro-3.8.16.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any, Dict, List
|
|
5
|
+
|
|
6
|
+
import structlog
|
|
7
|
+
from rasa.dialogue_understanding.commands import Command
|
|
8
|
+
from rasa.dialogue_understanding.patterns.collect_information import (
|
|
9
|
+
CollectInformationPatternFlowStackFrame,
|
|
10
|
+
)
|
|
11
|
+
from rasa.dialogue_understanding.stack.utils import (
|
|
12
|
+
get_collect_steps_excluding_ask_before_filling_for_active_flow,
|
|
13
|
+
)
|
|
14
|
+
from rasa.shared.constants import ROUTE_TO_CALM_SLOT
|
|
15
|
+
from rasa.shared.core.events import Event, SlotSet
|
|
16
|
+
from rasa.shared.core.flows import FlowsList
|
|
17
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
18
|
+
|
|
19
|
+
structlogger = structlog.get_logger()
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def get_flows_predicted_to_start_from_tracker(
|
|
23
|
+
tracker: DialogueStateTracker,
|
|
24
|
+
) -> List[str]:
|
|
25
|
+
"""Returns the flows that are predicted to start from the current state.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
tracker: The tracker to use.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
The flows that are predicted to start from the current state.
|
|
32
|
+
"""
|
|
33
|
+
from rasa.dialogue_understanding.processor.command_processor import (
|
|
34
|
+
get_commands_from_tracker,
|
|
35
|
+
filter_start_flow_commands,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
commands = get_commands_from_tracker(tracker)
|
|
39
|
+
return filter_start_flow_commands(commands)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@dataclass
|
|
43
|
+
class SetSlotCommand(Command):
|
|
44
|
+
"""A command to set a slot."""
|
|
45
|
+
|
|
46
|
+
name: str
|
|
47
|
+
value: Any
|
|
48
|
+
|
|
49
|
+
@classmethod
|
|
50
|
+
def command(cls) -> str:
|
|
51
|
+
"""Returns the command type."""
|
|
52
|
+
return "set slot"
|
|
53
|
+
|
|
54
|
+
@classmethod
|
|
55
|
+
def from_dict(cls, data: Dict[str, Any]) -> SetSlotCommand:
|
|
56
|
+
"""Converts the dictionary to a command.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
The converted dictionary.
|
|
60
|
+
"""
|
|
61
|
+
try:
|
|
62
|
+
return SetSlotCommand(name=data["name"], value=data["value"])
|
|
63
|
+
except KeyError as e:
|
|
64
|
+
raise ValueError(f"Missing key when parsing SetSlotCommand: {e}") from e
|
|
65
|
+
|
|
66
|
+
def run_command_on_tracker(
|
|
67
|
+
self,
|
|
68
|
+
tracker: DialogueStateTracker,
|
|
69
|
+
all_flows: FlowsList,
|
|
70
|
+
original_tracker: DialogueStateTracker,
|
|
71
|
+
) -> List[Event]:
|
|
72
|
+
"""Runs the command on the tracker.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
tracker: The tracker to run the command on.
|
|
76
|
+
all_flows: All flows in the assistant.
|
|
77
|
+
original_tracker: The tracker before any command was executed.
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
The events to apply to the tracker.
|
|
81
|
+
"""
|
|
82
|
+
slot = tracker.slots.get(self.name)
|
|
83
|
+
if slot is None:
|
|
84
|
+
structlogger.debug(
|
|
85
|
+
"command_executor.skip_command.slot_not_in_domain", command=self
|
|
86
|
+
)
|
|
87
|
+
return []
|
|
88
|
+
|
|
89
|
+
if slot.has_same_coerced_value(self.value):
|
|
90
|
+
# value hasn't changed, skip this one
|
|
91
|
+
structlogger.debug(
|
|
92
|
+
"command_executor.skip_command.slot_already_set", command=self
|
|
93
|
+
)
|
|
94
|
+
return []
|
|
95
|
+
|
|
96
|
+
# Get slots of the active flow
|
|
97
|
+
slots_of_active_flow = (
|
|
98
|
+
get_collect_steps_excluding_ask_before_filling_for_active_flow(
|
|
99
|
+
tracker.stack, all_flows
|
|
100
|
+
)
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
# Add slots that are asked in the current collect step. This is needed
|
|
104
|
+
# to include slots that has ask_before_filling set to True.
|
|
105
|
+
top_frame = tracker.stack.top()
|
|
106
|
+
if isinstance(top_frame, CollectInformationPatternFlowStackFrame):
|
|
107
|
+
slots_of_active_flow.add(top_frame.collect)
|
|
108
|
+
|
|
109
|
+
if self.name not in slots_of_active_flow and self.name != ROUTE_TO_CALM_SLOT:
|
|
110
|
+
# Get the other predicted flows from the most recent message on the tracker.
|
|
111
|
+
predicted_flows = get_flows_predicted_to_start_from_tracker(tracker)
|
|
112
|
+
use_slot_fill = any(
|
|
113
|
+
step.collect == self.name and not step.ask_before_filling
|
|
114
|
+
for flow in all_flows.underlying_flows
|
|
115
|
+
if flow.id in predicted_flows
|
|
116
|
+
for step in flow.get_collect_steps()
|
|
117
|
+
)
|
|
118
|
+
if not use_slot_fill:
|
|
119
|
+
structlogger.debug(
|
|
120
|
+
"command_executor.skip_command.slot_not_asked_for", command=self
|
|
121
|
+
)
|
|
122
|
+
return []
|
|
123
|
+
|
|
124
|
+
structlogger.debug("command_executor.set_slot", command=self)
|
|
125
|
+
return [SlotSet(self.name, slot.coerce_value(self.value))]
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any, Dict, List
|
|
5
|
+
|
|
6
|
+
import structlog
|
|
7
|
+
from rasa.dialogue_understanding.commands import Command
|
|
8
|
+
from rasa.dialogue_understanding.patterns.skip_question import (
|
|
9
|
+
SkipQuestionPatternFlowStackFrame,
|
|
10
|
+
)
|
|
11
|
+
from rasa.dialogue_understanding.stack.utils import top_user_flow_frame
|
|
12
|
+
from rasa.shared.core.events import Event
|
|
13
|
+
from rasa.shared.core.flows.flows_list import FlowsList
|
|
14
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
15
|
+
|
|
16
|
+
structlogger = structlog.get_logger()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass
|
|
20
|
+
class SkipQuestionCommand(Command):
|
|
21
|
+
"""A command that registers the user intent to skip the current question / step in
|
|
22
|
+
the flow.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
@classmethod
|
|
26
|
+
def command(cls) -> str:
|
|
27
|
+
"""Returns the command type."""
|
|
28
|
+
return "skip question"
|
|
29
|
+
|
|
30
|
+
@classmethod
|
|
31
|
+
def from_dict(cls, data: Dict[str, Any]) -> SkipQuestionCommand:
|
|
32
|
+
"""Converts the dictionary to a command.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
The converted dictionary.
|
|
36
|
+
"""
|
|
37
|
+
return SkipQuestionCommand()
|
|
38
|
+
|
|
39
|
+
def run_command_on_tracker(
|
|
40
|
+
self,
|
|
41
|
+
tracker: DialogueStateTracker,
|
|
42
|
+
all_flows: FlowsList,
|
|
43
|
+
original_tracker: DialogueStateTracker,
|
|
44
|
+
) -> List[Event]:
|
|
45
|
+
"""Runs the command on the tracker.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
tracker: The tracker to run the command on.
|
|
49
|
+
all_flows: All flows in the assistant.
|
|
50
|
+
original_tracker: The tracker before any command was executed.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
The events to apply to the tracker.
|
|
54
|
+
"""
|
|
55
|
+
stack = tracker.stack
|
|
56
|
+
user_frame = top_user_flow_frame(original_tracker.stack)
|
|
57
|
+
current_flow = user_frame.flow(all_flows) if user_frame else None
|
|
58
|
+
|
|
59
|
+
if not current_flow:
|
|
60
|
+
structlogger.debug(
|
|
61
|
+
"command_executor.skip_question.no_active_flow", command=self
|
|
62
|
+
)
|
|
63
|
+
return []
|
|
64
|
+
|
|
65
|
+
stack.push(SkipQuestionPatternFlowStackFrame())
|
|
66
|
+
return tracker.create_stack_updated_events(stack)
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any, Dict, List
|
|
5
|
+
|
|
6
|
+
import structlog
|
|
7
|
+
from rasa.dialogue_understanding.commands import Command
|
|
8
|
+
from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
|
|
9
|
+
FlowStackFrameType,
|
|
10
|
+
UserFlowStackFrame,
|
|
11
|
+
)
|
|
12
|
+
from rasa.dialogue_understanding.stack.utils import (
|
|
13
|
+
top_user_flow_frame,
|
|
14
|
+
user_flows_on_the_stack,
|
|
15
|
+
)
|
|
16
|
+
from rasa.shared.core.events import Event, FlowInterrupted
|
|
17
|
+
from rasa.shared.core.flows import FlowsList
|
|
18
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
19
|
+
|
|
20
|
+
structlogger = structlog.get_logger()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass
|
|
24
|
+
class StartFlowCommand(Command):
|
|
25
|
+
"""A command to start a flow."""
|
|
26
|
+
|
|
27
|
+
flow: str
|
|
28
|
+
|
|
29
|
+
@classmethod
|
|
30
|
+
def command(cls) -> str:
|
|
31
|
+
"""Returns the command type."""
|
|
32
|
+
return "start flow"
|
|
33
|
+
|
|
34
|
+
@classmethod
|
|
35
|
+
def from_dict(cls, data: Dict[str, Any]) -> StartFlowCommand:
|
|
36
|
+
"""Converts the dictionary to a command.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
The converted dictionary.
|
|
40
|
+
"""
|
|
41
|
+
try:
|
|
42
|
+
return StartFlowCommand(flow=data["flow"])
|
|
43
|
+
except KeyError as e:
|
|
44
|
+
raise ValueError(
|
|
45
|
+
f"Missing parameter '{e}' while parsing StartFlowCommand."
|
|
46
|
+
) from e
|
|
47
|
+
|
|
48
|
+
def run_command_on_tracker(
|
|
49
|
+
self,
|
|
50
|
+
tracker: DialogueStateTracker,
|
|
51
|
+
all_flows: FlowsList,
|
|
52
|
+
original_tracker: DialogueStateTracker,
|
|
53
|
+
) -> List[Event]:
|
|
54
|
+
"""Runs the command on the tracker.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
tracker: The tracker to run the command on.
|
|
58
|
+
all_flows: All flows in the assistant.
|
|
59
|
+
original_tracker: The tracker before any command was executed.
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
The events to apply to the tracker.
|
|
63
|
+
"""
|
|
64
|
+
stack = tracker.stack
|
|
65
|
+
original_stack = original_tracker.stack
|
|
66
|
+
applied_events: List[Event] = []
|
|
67
|
+
|
|
68
|
+
if self.flow in user_flows_on_the_stack(stack):
|
|
69
|
+
structlogger.debug(
|
|
70
|
+
"command_executor.skip_command.already_started_flow", command=self
|
|
71
|
+
)
|
|
72
|
+
return []
|
|
73
|
+
elif self.flow not in all_flows.flow_ids:
|
|
74
|
+
structlogger.debug(
|
|
75
|
+
"command_executor.skip_command.start_invalid_flow_id", command=self
|
|
76
|
+
)
|
|
77
|
+
return []
|
|
78
|
+
|
|
79
|
+
original_user_frame = top_user_flow_frame(original_stack)
|
|
80
|
+
original_top_flow = (
|
|
81
|
+
original_user_frame.flow(all_flows) if original_user_frame else None
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
frame_type = FlowStackFrameType.REGULAR
|
|
85
|
+
|
|
86
|
+
if original_top_flow:
|
|
87
|
+
frame_type = FlowStackFrameType.INTERRUPT
|
|
88
|
+
|
|
89
|
+
if original_user_frame is not None:
|
|
90
|
+
applied_events.append(
|
|
91
|
+
FlowInterrupted(
|
|
92
|
+
original_user_frame.flow_id, original_user_frame.step_id
|
|
93
|
+
)
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
structlogger.debug("command_executor.start_flow", command=self)
|
|
97
|
+
stack.push(UserFlowStackFrame(flow_id=self.flow, frame_type=frame_type))
|
|
98
|
+
return applied_events + tracker.create_stack_updated_events(stack)
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Any, Dict, List, Optional, Text
|
|
3
|
+
|
|
4
|
+
import structlog
|
|
5
|
+
|
|
6
|
+
from rasa.dialogue_understanding.commands import Command, StartFlowCommand, ErrorCommand
|
|
7
|
+
from rasa.shared.core.flows import FlowsList
|
|
8
|
+
from rasa.shared.core.trackers import DialogueStateTracker
|
|
9
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
10
|
+
from rasa.shared.nlu.constants import COMMANDS, TEXT
|
|
11
|
+
from rasa.shared.utils.llm import DEFAULT_MAX_USER_INPUT_CHARACTERS
|
|
12
|
+
from rasa.shared.constants import (
|
|
13
|
+
RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_TOO_LONG,
|
|
14
|
+
RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_EMPTY,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
structlogger = structlog.get_logger()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass
|
|
21
|
+
class UserInputConfig:
|
|
22
|
+
"""Configuration class for user input settings."""
|
|
23
|
+
|
|
24
|
+
max_characters: int = DEFAULT_MAX_USER_INPUT_CHARACTERS
|
|
25
|
+
"""The maximum number of characters allowed in the user input."""
|
|
26
|
+
|
|
27
|
+
def __post_init__(self) -> None:
|
|
28
|
+
if self.max_characters is None:
|
|
29
|
+
self.max_characters = DEFAULT_MAX_USER_INPUT_CHARACTERS
|
|
30
|
+
|
|
31
|
+
@classmethod
|
|
32
|
+
def from_dict(cls, data: Dict[str, Any]) -> "UserInputConfig":
|
|
33
|
+
return cls(
|
|
34
|
+
max_characters=data.get("max_characters", DEFAULT_MAX_USER_INPUT_CHARACTERS)
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class CommandGenerator:
|
|
39
|
+
"""A command generator.
|
|
40
|
+
|
|
41
|
+
Parses a message and returns a list of commands. The commands are then
|
|
42
|
+
executed and will lead to tracker state modifications and action
|
|
43
|
+
predictions.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
def __init__(self, config: Dict[Text, Any]):
|
|
47
|
+
self.user_input_config = UserInputConfig.from_dict(
|
|
48
|
+
config.get("user_input") or {}
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
async def process(
|
|
52
|
+
self,
|
|
53
|
+
messages: List[Message],
|
|
54
|
+
flows: FlowsList,
|
|
55
|
+
tracker: Optional[DialogueStateTracker] = None,
|
|
56
|
+
) -> List[Message]:
|
|
57
|
+
"""Process a list of messages. For each message predict commands.
|
|
58
|
+
|
|
59
|
+
The result of the generation is added to the message as a list of
|
|
60
|
+
commands.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
messages: The messages to process.
|
|
64
|
+
tracker: The tracker containing the conversation history up to now.
|
|
65
|
+
flows: The flows to use for command prediction.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
The processed messages (usually this is just one during prediction).
|
|
69
|
+
"""
|
|
70
|
+
# Determines a set of startable flows by evaluating flow guard conditions.
|
|
71
|
+
startable_flows = self.get_startable_flows(flows, tracker)
|
|
72
|
+
# Get the currently active and called flow (if present).
|
|
73
|
+
# If they would be guarded, e.g. if: false, they would not be in the list
|
|
74
|
+
# of startable flows and not available inside the prompt.
|
|
75
|
+
active_flows = self.get_active_flows(flows, tracker)
|
|
76
|
+
available_flows = FlowsList.from_multiple_flows_lists(
|
|
77
|
+
startable_flows, active_flows
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
for message in messages:
|
|
81
|
+
|
|
82
|
+
if message.get(COMMANDS):
|
|
83
|
+
# do not overwrite commands if they are already present
|
|
84
|
+
# i.e. another command generator already predicted commands
|
|
85
|
+
continue
|
|
86
|
+
|
|
87
|
+
commands = await self._evaluate_and_predict(
|
|
88
|
+
message, available_flows, tracker
|
|
89
|
+
)
|
|
90
|
+
# Double check commands for guarded flows. Unlikely but the llm could
|
|
91
|
+
# have predicted a command for a flow that is not in the startable
|
|
92
|
+
# flow list supplied in the prompt.
|
|
93
|
+
commands = self._check_commands_against_startable_flows(
|
|
94
|
+
commands, startable_flows
|
|
95
|
+
)
|
|
96
|
+
commands_dicts = [command.as_dict() for command in commands]
|
|
97
|
+
message.set(COMMANDS, commands_dicts, add_to_output=True)
|
|
98
|
+
|
|
99
|
+
return messages
|
|
100
|
+
|
|
101
|
+
def get_startable_flows(
|
|
102
|
+
self, flows: FlowsList, tracker: Optional[DialogueStateTracker] = None
|
|
103
|
+
) -> FlowsList:
|
|
104
|
+
"""Determines a set of startable flows by evaluating flow guard conditions.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
flows: Underlying flows.
|
|
108
|
+
tracker: The tracker containing the conversation history up to now.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
FlowsList: All flows for which the starting conditions are met.
|
|
112
|
+
"""
|
|
113
|
+
if tracker is not None:
|
|
114
|
+
# if tracker is not None, evaluate the flow guard conditions with
|
|
115
|
+
# the current state of the tracker
|
|
116
|
+
return tracker.get_startable_flows(flows)
|
|
117
|
+
|
|
118
|
+
# else evaluate it without the tracker context
|
|
119
|
+
return flows.get_startable_flows({})
|
|
120
|
+
|
|
121
|
+
def get_active_flows(
|
|
122
|
+
self, flows: FlowsList, tracker: Optional[DialogueStateTracker]
|
|
123
|
+
) -> FlowsList:
|
|
124
|
+
"""Retrieve a list of currently active flows.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
flows: Underlying flows.
|
|
128
|
+
tracker: The tracker.
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
FlowsList: All currently active flows.
|
|
132
|
+
"""
|
|
133
|
+
if not tracker:
|
|
134
|
+
return FlowsList([])
|
|
135
|
+
return tracker.get_active_flows(flows)
|
|
136
|
+
|
|
137
|
+
async def _evaluate_and_predict(
|
|
138
|
+
self,
|
|
139
|
+
message: Message,
|
|
140
|
+
startable_flows: FlowsList,
|
|
141
|
+
tracker: Optional[DialogueStateTracker] = None,
|
|
142
|
+
) -> List[Command]:
|
|
143
|
+
"""Evaluates message for errors and predicts commands if no errors are found.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
message: The message to process.
|
|
147
|
+
tracker: The tracker containing the conversation history up to now.
|
|
148
|
+
startable_flows: The startable flows to use for command prediction.
|
|
149
|
+
|
|
150
|
+
Returns:
|
|
151
|
+
Errors or predicted commands
|
|
152
|
+
"""
|
|
153
|
+
# evaluate message for errors
|
|
154
|
+
if error_commands := self.evaluate_message(message):
|
|
155
|
+
return error_commands
|
|
156
|
+
|
|
157
|
+
# if no errors, try predicting commands
|
|
158
|
+
try:
|
|
159
|
+
return await self.predict_commands(message, startable_flows, tracker)
|
|
160
|
+
except NotImplementedError:
|
|
161
|
+
raise
|
|
162
|
+
except Exception as e:
|
|
163
|
+
structlogger.error("command_generator.predict.error", error=str(e))
|
|
164
|
+
return []
|
|
165
|
+
|
|
166
|
+
async def predict_commands(
|
|
167
|
+
self,
|
|
168
|
+
message: Message,
|
|
169
|
+
flows: FlowsList,
|
|
170
|
+
tracker: Optional[DialogueStateTracker] = None,
|
|
171
|
+
) -> List[Command]:
|
|
172
|
+
"""Predict commands for a single message.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
message: The message to predict commands for.
|
|
176
|
+
flows: The flows to use for command prediction.
|
|
177
|
+
tracker: The tracker containing the conversation history up to now.
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
The predicted commands.
|
|
181
|
+
"""
|
|
182
|
+
raise NotImplementedError()
|
|
183
|
+
|
|
184
|
+
def _check_commands_against_startable_flows(
|
|
185
|
+
self, commands: List[Command], startable_flows: FlowsList
|
|
186
|
+
) -> List[Command]:
|
|
187
|
+
"""Check if the start flow commands are only for startable flows.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
commands: The commands to check.
|
|
191
|
+
startable_flows: The flows which have their starting conditions statisfied.
|
|
192
|
+
|
|
193
|
+
Returns:
|
|
194
|
+
The commands that are startable.
|
|
195
|
+
"""
|
|
196
|
+
checked_commands = [
|
|
197
|
+
command
|
|
198
|
+
for command in commands
|
|
199
|
+
if not (
|
|
200
|
+
isinstance(command, StartFlowCommand)
|
|
201
|
+
and command.flow not in startable_flows.flow_ids
|
|
202
|
+
)
|
|
203
|
+
]
|
|
204
|
+
|
|
205
|
+
if commands and len(checked_commands) != len(commands):
|
|
206
|
+
structlogger.info(
|
|
207
|
+
"command_generator.check_commands_against_startable_flows.startable_commands",
|
|
208
|
+
commands=checked_commands,
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
return checked_commands
|
|
212
|
+
|
|
213
|
+
def evaluate_message(self, message: Message) -> List[Command]:
|
|
214
|
+
"""Evaluates the given message.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
message: The message to evaluate.
|
|
218
|
+
|
|
219
|
+
Returns:
|
|
220
|
+
A list of error commands indicating the type of error.
|
|
221
|
+
"""
|
|
222
|
+
errors: List[Command]
|
|
223
|
+
|
|
224
|
+
if self.check_if_message_is_empty(message):
|
|
225
|
+
# notify the user that the message is empty
|
|
226
|
+
errors = [
|
|
227
|
+
ErrorCommand(error_type=RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_EMPTY)
|
|
228
|
+
]
|
|
229
|
+
elif self.check_if_message_exceeds_limit(message):
|
|
230
|
+
# notify the user about message length
|
|
231
|
+
errors = [
|
|
232
|
+
ErrorCommand(
|
|
233
|
+
error_type=RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_TOO_LONG,
|
|
234
|
+
info={"max_characters": self.user_input_config.max_characters},
|
|
235
|
+
)
|
|
236
|
+
]
|
|
237
|
+
else:
|
|
238
|
+
return []
|
|
239
|
+
|
|
240
|
+
structlogger.info(
|
|
241
|
+
"command_generator.evaluate_message.error",
|
|
242
|
+
event_info="Invalid message",
|
|
243
|
+
errors=[e.as_dict() for e in errors],
|
|
244
|
+
message=message.get(TEXT),
|
|
245
|
+
)
|
|
246
|
+
return errors
|
|
247
|
+
|
|
248
|
+
def check_if_message_exceeds_limit(self, message: Message) -> bool:
|
|
249
|
+
"""Checks if the given message exceeds the predefined number of characters."""
|
|
250
|
+
# if limit was a negative number, omit it
|
|
251
|
+
if self.user_input_config.max_characters < 0:
|
|
252
|
+
return False
|
|
253
|
+
return len(message.get(TEXT, "")) > self.user_input_config.max_characters
|
|
254
|
+
|
|
255
|
+
def check_if_message_is_empty(self, message: Message) -> bool:
|
|
256
|
+
"""Checks if the given message is empty or whitespace-only."""
|
|
257
|
+
return len(message.get(TEXT, "").strip()) == 0
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
Your task is to analyze the current conversation context and generate a list of actions to start new business processes that we call flows, to extract slots, or respond to small talk and knowledge requests.
|
|
2
|
+
|
|
3
|
+
These are the flows that can be started, with their description and slots:
|
|
4
|
+
{% for flow in available_flows %}
|
|
5
|
+
{{ flow.name }}: {{ flow.description }}
|
|
6
|
+
{% for slot in flow.slots -%}
|
|
7
|
+
slot: {{ slot.name }}{% if slot.description %} ({{ slot.description }}){% endif %}{% if slot.allowed_values %}, allowed values: {{ slot.allowed_values }}{% endif %}
|
|
8
|
+
{% endfor %}
|
|
9
|
+
{%- endfor %}
|
|
10
|
+
|
|
11
|
+
===
|
|
12
|
+
Here is what happened previously in the conversation:
|
|
13
|
+
{{ current_conversation }}
|
|
14
|
+
|
|
15
|
+
===
|
|
16
|
+
{% if current_flow != None %}
|
|
17
|
+
You are currently in the flow "{{ current_flow }}".
|
|
18
|
+
You have just asked the user for the slot "{{ current_slot }}"{% if current_slot_description %} ({{ current_slot_description }}){% endif %}.
|
|
19
|
+
|
|
20
|
+
{% if flow_slots|length > 0 %}
|
|
21
|
+
Here are the slots of the currently active flow:
|
|
22
|
+
{% for slot in flow_slots -%}
|
|
23
|
+
- name: {{ slot.name }}, value: {{ slot.value }}, type: {{ slot.type }}, description: {{ slot.description}}{% if slot.allowed_values %}, allowed values: {{ slot.allowed_values }}{% endif %}
|
|
24
|
+
{% endfor %}
|
|
25
|
+
{% endif %}
|
|
26
|
+
{% else %}
|
|
27
|
+
You are currently not in any flow and so there are no active slots.
|
|
28
|
+
This means you can only set a slot if you first start a flow that requires that slot.
|
|
29
|
+
{% endif %}
|
|
30
|
+
If you start a flow, first start the flow and then optionally fill that flow's slots with information the user provided in their message.
|
|
31
|
+
|
|
32
|
+
The user just said """{{ user_message }}""".
|
|
33
|
+
|
|
34
|
+
===
|
|
35
|
+
Based on this information generate a list of actions you want to take. Your job is to start flows and to fill slots where appropriate. Any logic of what happens afterwards is handled by the flow engine. These are your available actions:
|
|
36
|
+
* Slot setting, described by "SetSlot(slot_name, slot_value)". An example would be "SetSlot(recipient, Freddy)"
|
|
37
|
+
* Starting another flow, described by "StartFlow(flow_name)". An example would be "StartFlow(transfer_money)"
|
|
38
|
+
* Cancelling the current flow, described by "CancelFlow()"
|
|
39
|
+
* Clarifying which flow should be started. An example would be Clarify(list_contacts, add_contact, remove_contact) if the user just wrote "contacts" and there are multiple potential candidates. It also works with a single flow name to confirm you understood correctly, as in Clarify(transfer_money).
|
|
40
|
+
* Intercepting and handle user messages with the intent to bypass the current step in the flow, described by "SkipQuestion()". Examples of user skip phrases are: "Go to the next question", "Ask me something else".
|
|
41
|
+
* Responding to knowledge-oriented user messages, described by "SearchAndReply()"
|
|
42
|
+
* Responding to a casual, non-task-oriented user message, described by "ChitChat()".
|
|
43
|
+
* Handing off to a human, in case the user seems frustrated or explicitly asks to speak to one, described by "HumanHandoff()".
|
|
44
|
+
|
|
45
|
+
===
|
|
46
|
+
Write out the actions you want to take, one per line, in the order they should take place.
|
|
47
|
+
Do not fill slots with abstract values or placeholders.
|
|
48
|
+
Only use information provided by the user.
|
|
49
|
+
Only start a flow if it's completely clear what the user wants. Imagine you were a person reading this message. If it's not 100% clear, clarify the next step.
|
|
50
|
+
Don't be overly confident. Take a conservative approach and clarify before proceeding.
|
|
51
|
+
If the user asks for two things which seem contradictory, clarify before starting a flow.
|
|
52
|
+
If it's not clear whether the user wants to skip the step or to cancel the flow, cancel the flow.
|
|
53
|
+
Strictly adhere to the provided action types listed above.
|
|
54
|
+
Focus on the last message and take it one step at a time.
|
|
55
|
+
Use the previous conversation steps only to aid understanding.
|
|
56
|
+
|
|
57
|
+
Your action list:
|