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,781 @@
|
|
|
1
|
+
import importlib.resources
|
|
2
|
+
import json
|
|
3
|
+
import re
|
|
4
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text
|
|
5
|
+
|
|
6
|
+
import dotenv
|
|
7
|
+
import structlog
|
|
8
|
+
from jinja2 import Template
|
|
9
|
+
from pydantic import ValidationError
|
|
10
|
+
|
|
11
|
+
import rasa.shared.utils.io
|
|
12
|
+
from rasa.telemetry import (
|
|
13
|
+
track_enterprise_search_policy_predict,
|
|
14
|
+
track_enterprise_search_policy_train_completed,
|
|
15
|
+
track_enterprise_search_policy_train_started,
|
|
16
|
+
)
|
|
17
|
+
from rasa.shared.exceptions import RasaException
|
|
18
|
+
from rasa.core.constants import (
|
|
19
|
+
POLICY_MAX_HISTORY,
|
|
20
|
+
POLICY_PRIORITY,
|
|
21
|
+
SEARCH_POLICY_PRIORITY,
|
|
22
|
+
)
|
|
23
|
+
from rasa.core.policies.policy import Policy, PolicyPrediction
|
|
24
|
+
from rasa.core.utils import AvailableEndpoints
|
|
25
|
+
from rasa.dialogue_understanding.patterns.internal_error import (
|
|
26
|
+
InternalErrorPatternFlowStackFrame,
|
|
27
|
+
)
|
|
28
|
+
from rasa.dialogue_understanding.patterns.cannot_handle import (
|
|
29
|
+
CannotHandlePatternFlowStackFrame,
|
|
30
|
+
)
|
|
31
|
+
from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
|
|
32
|
+
from rasa.dialogue_understanding.stack.frames import (
|
|
33
|
+
DialogueStackFrame,
|
|
34
|
+
SearchStackFrame,
|
|
35
|
+
)
|
|
36
|
+
from rasa.engine.graph import ExecutionContext
|
|
37
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
38
|
+
from rasa.engine.storage.resource import Resource
|
|
39
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
40
|
+
from rasa.graph_components.providers.forms_provider import Forms
|
|
41
|
+
from rasa.graph_components.providers.responses_provider import Responses
|
|
42
|
+
from rasa.shared.core.constants import (
|
|
43
|
+
ACTION_CANCEL_FLOW,
|
|
44
|
+
ACTION_SEND_TEXT_NAME,
|
|
45
|
+
DEFAULT_SLOT_NAMES,
|
|
46
|
+
)
|
|
47
|
+
from rasa.shared.core.domain import Domain
|
|
48
|
+
from rasa.shared.core.events import Event
|
|
49
|
+
from rasa.shared.core.generator import TrackerWithCachedStates
|
|
50
|
+
from rasa.shared.core.trackers import DialogueStateTracker, EventVerbosity
|
|
51
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
52
|
+
from rasa.shared.utils.cli import print_error_and_exit
|
|
53
|
+
from rasa.shared.utils.io import deep_container_fingerprint
|
|
54
|
+
from rasa.shared.utils.llm import (
|
|
55
|
+
DEFAULT_OPENAI_CHAT_MODEL_NAME,
|
|
56
|
+
DEFAULT_OPENAI_EMBEDDING_MODEL_NAME,
|
|
57
|
+
embedder_factory,
|
|
58
|
+
get_prompt_template,
|
|
59
|
+
llm_factory,
|
|
60
|
+
sanitize_message_for_prompt,
|
|
61
|
+
tracker_as_readable_transcript,
|
|
62
|
+
)
|
|
63
|
+
from rasa.core.information_retrieval.faiss import FAISS_Store
|
|
64
|
+
from rasa.core.information_retrieval import (
|
|
65
|
+
InformationRetrieval,
|
|
66
|
+
SearchResult,
|
|
67
|
+
InformationRetrievalException,
|
|
68
|
+
create_from_endpoint_config,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
if TYPE_CHECKING:
|
|
72
|
+
from langchain.schema.embeddings import Embeddings
|
|
73
|
+
from langchain.llms.base import BaseLLM
|
|
74
|
+
from rasa.core.featurizers.tracker_featurizers import TrackerFeaturizer
|
|
75
|
+
|
|
76
|
+
from rasa.utils.log_utils import log_llm
|
|
77
|
+
|
|
78
|
+
logger = structlog.get_logger()
|
|
79
|
+
|
|
80
|
+
dotenv.load_dotenv("./.env")
|
|
81
|
+
|
|
82
|
+
SOURCE_PROPERTY = "source"
|
|
83
|
+
VECTOR_STORE_TYPE_PROPERTY = "type"
|
|
84
|
+
VECTOR_STORE_PROPERTY = "vector_store"
|
|
85
|
+
VECTOR_STORE_THRESHOLD_PROPERTY = "threshold"
|
|
86
|
+
TRACE_TOKENS_PROPERTY = "trace_prompt_tokens"
|
|
87
|
+
CITATION_ENABLED_PROPERTY = "citation_enabled"
|
|
88
|
+
USE_LLM_PROPERTY = "use_generative_llm"
|
|
89
|
+
|
|
90
|
+
DEFAULT_VECTOR_STORE_TYPE = "faiss"
|
|
91
|
+
DEFAULT_VECTOR_STORE_THRESHOLD = 0.0
|
|
92
|
+
DEFAULT_VECTOR_STORE = {
|
|
93
|
+
VECTOR_STORE_TYPE_PROPERTY: DEFAULT_VECTOR_STORE_TYPE,
|
|
94
|
+
SOURCE_PROPERTY: "./docs",
|
|
95
|
+
VECTOR_STORE_THRESHOLD_PROPERTY: DEFAULT_VECTOR_STORE_THRESHOLD,
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
DEFAULT_LLM_CONFIG = {
|
|
99
|
+
"_type": "openai",
|
|
100
|
+
"request_timeout": 10,
|
|
101
|
+
"temperature": 0.0,
|
|
102
|
+
"max_tokens": 256,
|
|
103
|
+
"model_name": DEFAULT_OPENAI_CHAT_MODEL_NAME,
|
|
104
|
+
"max_retries": 1,
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
DEFAULT_EMBEDDINGS_CONFIG = {
|
|
108
|
+
"_type": "openai",
|
|
109
|
+
"model": DEFAULT_OPENAI_EMBEDDING_MODEL_NAME,
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
EMBEDDINGS_CONFIG_KEY = "embeddings"
|
|
113
|
+
LLM_CONFIG_KEY = "llm"
|
|
114
|
+
ENTERPRISE_SEARCH_PROMPT_FILE_NAME = "enterprise_search_policy_prompt.jinja2"
|
|
115
|
+
|
|
116
|
+
DEFAULT_ENTERPRISE_SEARCH_PROMPT_TEMPLATE = importlib.resources.read_text(
|
|
117
|
+
"rasa.core.policies", "enterprise_search_prompt_template.jinja2"
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
DEFAULT_ENTERPRISE_SEARCH_PROMPT_WITH_CITATION_TEMPLATE = importlib.resources.read_text(
|
|
121
|
+
"rasa.core.policies", "enterprise_search_prompt_with_citation_template.jinja2"
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class VectorStoreConnectionError(RasaException):
|
|
126
|
+
"""Exception raised for errors in connecting to the vector store."""
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class VectorStoreConfigurationError(RasaException):
|
|
130
|
+
"""Exception raised for errors in vector store configuration."""
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
@DefaultV1Recipe.register(
|
|
134
|
+
DefaultV1Recipe.ComponentType.POLICY_WITH_END_TO_END_SUPPORT, is_trainable=True
|
|
135
|
+
)
|
|
136
|
+
class EnterpriseSearchPolicy(Policy):
|
|
137
|
+
"""Policy which uses a vector store and LLMs to respond to user messages.
|
|
138
|
+
|
|
139
|
+
The policy uses a vector store and LLMs to respond to user messages. The
|
|
140
|
+
vector store is used to retrieve the most relevant responses to the user
|
|
141
|
+
message. The LLMs are used to rank the responses and select the best
|
|
142
|
+
response. The policy can be used to respond to user messages without
|
|
143
|
+
training data.
|
|
144
|
+
|
|
145
|
+
Example Configuration:
|
|
146
|
+
|
|
147
|
+
policies:
|
|
148
|
+
# - ...
|
|
149
|
+
- name: EnterpriseSearchPolicy
|
|
150
|
+
vector_store:
|
|
151
|
+
type: "milvus"
|
|
152
|
+
<vector_store_config>
|
|
153
|
+
# - ...
|
|
154
|
+
"""
|
|
155
|
+
|
|
156
|
+
@staticmethod
|
|
157
|
+
def does_support_stack_frame(frame: DialogueStackFrame) -> bool:
|
|
158
|
+
"""Checks if the policy supports the given stack frame."""
|
|
159
|
+
return isinstance(frame, SearchStackFrame)
|
|
160
|
+
|
|
161
|
+
@staticmethod
|
|
162
|
+
def get_default_config() -> Dict[str, Any]:
|
|
163
|
+
"""Returns the default config of the policy."""
|
|
164
|
+
return {
|
|
165
|
+
POLICY_PRIORITY: SEARCH_POLICY_PRIORITY,
|
|
166
|
+
VECTOR_STORE_PROPERTY: DEFAULT_VECTOR_STORE,
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
def __init__(
|
|
170
|
+
self,
|
|
171
|
+
config: Dict[Text, Any],
|
|
172
|
+
model_storage: ModelStorage,
|
|
173
|
+
resource: Resource,
|
|
174
|
+
execution_context: ExecutionContext,
|
|
175
|
+
vector_store: Optional[InformationRetrieval] = None,
|
|
176
|
+
featurizer: Optional["TrackerFeaturizer"] = None,
|
|
177
|
+
prompt_template: Optional[Text] = None,
|
|
178
|
+
) -> None:
|
|
179
|
+
"""Constructs a new Policy object."""
|
|
180
|
+
super().__init__(config, model_storage, resource, execution_context, featurizer)
|
|
181
|
+
|
|
182
|
+
self.vector_store = vector_store
|
|
183
|
+
self.vector_store_config = config.get(
|
|
184
|
+
VECTOR_STORE_PROPERTY, DEFAULT_VECTOR_STORE
|
|
185
|
+
)
|
|
186
|
+
self.llm_config = self.config.get(LLM_CONFIG_KEY, DEFAULT_LLM_CONFIG)
|
|
187
|
+
self.embeddings_config = self.config.get(
|
|
188
|
+
EMBEDDINGS_CONFIG_KEY, DEFAULT_EMBEDDINGS_CONFIG
|
|
189
|
+
)
|
|
190
|
+
self.max_history = self.config.get(POLICY_MAX_HISTORY)
|
|
191
|
+
self.prompt_template = prompt_template or get_prompt_template(
|
|
192
|
+
self.config.get("prompt"),
|
|
193
|
+
DEFAULT_ENTERPRISE_SEARCH_PROMPT_TEMPLATE,
|
|
194
|
+
)
|
|
195
|
+
self.trace_prompt_tokens = self.config.get(TRACE_TOKENS_PROPERTY, False)
|
|
196
|
+
self.use_llm = self.config.get(USE_LLM_PROPERTY, True)
|
|
197
|
+
self.citation_enabled = self.config.get(CITATION_ENABLED_PROPERTY, False)
|
|
198
|
+
self.citation_prompt_template = get_prompt_template(
|
|
199
|
+
self.config.get("prompt"),
|
|
200
|
+
DEFAULT_ENTERPRISE_SEARCH_PROMPT_WITH_CITATION_TEMPLATE,
|
|
201
|
+
)
|
|
202
|
+
if self.citation_enabled:
|
|
203
|
+
self.prompt_template = self.citation_prompt_template
|
|
204
|
+
|
|
205
|
+
@classmethod
|
|
206
|
+
def _create_plain_embedder(cls, config: Dict[Text, Any]) -> "Embeddings":
|
|
207
|
+
"""Creates an embedder based on the given configuration.
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
The embedder.
|
|
211
|
+
"""
|
|
212
|
+
return embedder_factory(
|
|
213
|
+
config.get(EMBEDDINGS_CONFIG_KEY), DEFAULT_EMBEDDINGS_CONFIG
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
def train( # type: ignore[override]
|
|
217
|
+
self,
|
|
218
|
+
training_trackers: List[TrackerWithCachedStates],
|
|
219
|
+
domain: Domain,
|
|
220
|
+
responses: Responses,
|
|
221
|
+
forms: Forms,
|
|
222
|
+
training_data: TrainingData,
|
|
223
|
+
**kwargs: Any,
|
|
224
|
+
) -> Resource:
|
|
225
|
+
"""Trains a policy.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
training_trackers: The story and rules trackers from the training data.
|
|
229
|
+
domain: The model's domain.
|
|
230
|
+
responses: The model's responses.
|
|
231
|
+
forms: The model's forms.
|
|
232
|
+
training_data: The model's training data.
|
|
233
|
+
**kwargs: Depending on the specified `needs` section and the resulting
|
|
234
|
+
graph structure the policy can use different input to train itself.
|
|
235
|
+
|
|
236
|
+
Returns:
|
|
237
|
+
A policy must return its resource locator so that potential children nodes
|
|
238
|
+
can load the policy from the resource.
|
|
239
|
+
"""
|
|
240
|
+
store_type = self.vector_store_config.get(VECTOR_STORE_TYPE_PROPERTY)
|
|
241
|
+
|
|
242
|
+
# telemetry call to track training start
|
|
243
|
+
track_enterprise_search_policy_train_started()
|
|
244
|
+
|
|
245
|
+
# validate embedding configuration
|
|
246
|
+
try:
|
|
247
|
+
embeddings = self._create_plain_embedder(self.config)
|
|
248
|
+
except ValidationError as e:
|
|
249
|
+
print_error_and_exit(
|
|
250
|
+
"Unable to create embedder. Please make sure you specified the "
|
|
251
|
+
f"required environment variables. Error: {e}"
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
# validate llm configuration
|
|
255
|
+
try:
|
|
256
|
+
llm_factory(self.config.get(LLM_CONFIG_KEY), DEFAULT_LLM_CONFIG)
|
|
257
|
+
except (ImportError, ValueError, ValidationError) as e:
|
|
258
|
+
# ImportError: llm library is likely not installed
|
|
259
|
+
# ValueError: llm config is likely invalid
|
|
260
|
+
# ValidationError: environment variables are likely not set
|
|
261
|
+
print_error_and_exit(f"Unable to create LLM. Error: {e}")
|
|
262
|
+
|
|
263
|
+
if store_type == DEFAULT_VECTOR_STORE_TYPE:
|
|
264
|
+
logger.info("enterprise_search_policy.train.faiss")
|
|
265
|
+
with self._model_storage.write_to(self._resource) as path:
|
|
266
|
+
self.vector_store = FAISS_Store(
|
|
267
|
+
docs_folder=self.vector_store_config.get(SOURCE_PROPERTY),
|
|
268
|
+
embeddings=embeddings,
|
|
269
|
+
index_path=path,
|
|
270
|
+
create_index=True,
|
|
271
|
+
)
|
|
272
|
+
else:
|
|
273
|
+
logger.info("enterprise_search_policy.train.custom", store_type=store_type)
|
|
274
|
+
|
|
275
|
+
# telemetry call to track training completion
|
|
276
|
+
track_enterprise_search_policy_train_completed(
|
|
277
|
+
vector_store_type=store_type,
|
|
278
|
+
embeddings_type=self.embeddings_config.get("_type"),
|
|
279
|
+
embeddings_model=self.embeddings_config.get("model")
|
|
280
|
+
or self.embeddings_config.get("model_name"),
|
|
281
|
+
llm_type=self.llm_config.get("_type"),
|
|
282
|
+
llm_model=self.llm_config.get("model") or self.llm_config.get("model_name"),
|
|
283
|
+
citation_enabled=self.citation_enabled,
|
|
284
|
+
)
|
|
285
|
+
self.persist()
|
|
286
|
+
return self._resource
|
|
287
|
+
|
|
288
|
+
def persist(self) -> None:
|
|
289
|
+
"""Persists the policy to storage."""
|
|
290
|
+
with self._model_storage.write_to(self._resource) as path:
|
|
291
|
+
rasa.shared.utils.io.write_text_file(
|
|
292
|
+
self.prompt_template, path / ENTERPRISE_SEARCH_PROMPT_FILE_NAME
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
def _prepare_slots_for_template(
|
|
296
|
+
self, tracker: DialogueStateTracker
|
|
297
|
+
) -> List[Dict[str, str]]:
|
|
298
|
+
"""Prepares the slots for the template.
|
|
299
|
+
|
|
300
|
+
Args:
|
|
301
|
+
tracker: The tracker containing the conversation history up to now.
|
|
302
|
+
|
|
303
|
+
Returns:
|
|
304
|
+
The non-empty slots.
|
|
305
|
+
"""
|
|
306
|
+
template_slots = []
|
|
307
|
+
for name, slot in tracker.slots.items():
|
|
308
|
+
if name not in DEFAULT_SLOT_NAMES and slot.value is not None:
|
|
309
|
+
template_slots.append(
|
|
310
|
+
{
|
|
311
|
+
"name": name,
|
|
312
|
+
"value": str(slot.value),
|
|
313
|
+
"type": slot.type_name,
|
|
314
|
+
}
|
|
315
|
+
)
|
|
316
|
+
return template_slots
|
|
317
|
+
|
|
318
|
+
def _connect_vector_store_or_raise(
|
|
319
|
+
self, endpoints: Optional[AvailableEndpoints]
|
|
320
|
+
) -> None:
|
|
321
|
+
"""Connects to the vector store or raises an exception.
|
|
322
|
+
|
|
323
|
+
Raise exceptions for the following cases:
|
|
324
|
+
- The configuration is not specified
|
|
325
|
+
- Unable to connect to the vector store
|
|
326
|
+
|
|
327
|
+
Args:
|
|
328
|
+
endpoints: Endpoints configuration.
|
|
329
|
+
"""
|
|
330
|
+
config = endpoints.vector_store if endpoints else None
|
|
331
|
+
store_type = self.vector_store_config.get(VECTOR_STORE_TYPE_PROPERTY)
|
|
332
|
+
if config is None and store_type != DEFAULT_VECTOR_STORE_TYPE:
|
|
333
|
+
logger.error(
|
|
334
|
+
"enterprise_search_policy._connect_vector_store_or_raise.no_config"
|
|
335
|
+
)
|
|
336
|
+
raise VectorStoreConfigurationError(
|
|
337
|
+
"""No vector store specified. Please specify a vector
|
|
338
|
+
store in the endpoints configuration"""
|
|
339
|
+
)
|
|
340
|
+
try:
|
|
341
|
+
self.vector_store.connect(config) # type: ignore
|
|
342
|
+
except Exception as e:
|
|
343
|
+
logger.error(
|
|
344
|
+
"enterprise_search_policy._connect_vector_store_or_raise.connect_error",
|
|
345
|
+
error=e,
|
|
346
|
+
)
|
|
347
|
+
raise VectorStoreConnectionError(
|
|
348
|
+
f"Unable to connect to the vector store. Error: {e}"
|
|
349
|
+
)
|
|
350
|
+
|
|
351
|
+
def _get_last_user_message(self, tracker: DialogueStateTracker) -> str:
|
|
352
|
+
"""Get the last user message from the tracker.
|
|
353
|
+
|
|
354
|
+
Args:
|
|
355
|
+
tracker: The tracker containing the conversation history up to now.
|
|
356
|
+
|
|
357
|
+
Returns:
|
|
358
|
+
The last user message.
|
|
359
|
+
"""
|
|
360
|
+
for event in reversed(tracker.events):
|
|
361
|
+
if isinstance(event, rasa.shared.core.events.UserUttered):
|
|
362
|
+
return sanitize_message_for_prompt(event.text)
|
|
363
|
+
return ""
|
|
364
|
+
|
|
365
|
+
async def predict_action_probabilities( # type: ignore[override]
|
|
366
|
+
self,
|
|
367
|
+
tracker: DialogueStateTracker,
|
|
368
|
+
domain: Domain,
|
|
369
|
+
endpoints: Optional[AvailableEndpoints],
|
|
370
|
+
rule_only_data: Optional[Dict[Text, Any]] = None,
|
|
371
|
+
**kwargs: Any,
|
|
372
|
+
) -> PolicyPrediction:
|
|
373
|
+
"""Predicts the next action the bot should take after seeing the tracker.
|
|
374
|
+
|
|
375
|
+
Args:
|
|
376
|
+
tracker: The tracker containing the conversation history up to now.
|
|
377
|
+
domain: The model's domain.
|
|
378
|
+
endpoints: The model's endpoints.
|
|
379
|
+
rule_only_data: Slots and loops which are specific to rules and hence
|
|
380
|
+
should be ignored by this policy.
|
|
381
|
+
**kwargs: Depending on the specified `needs` section and the resulting
|
|
382
|
+
graph structure the policy can use different input to make predictions.
|
|
383
|
+
|
|
384
|
+
Returns:
|
|
385
|
+
The prediction.
|
|
386
|
+
"""
|
|
387
|
+
logger_key = "enterprise_search_policy.predict_action_probabilities"
|
|
388
|
+
vector_search_threshold = self.vector_store_config.get(
|
|
389
|
+
VECTOR_STORE_THRESHOLD_PROPERTY, DEFAULT_VECTOR_STORE_THRESHOLD
|
|
390
|
+
)
|
|
391
|
+
llm = llm_factory(self.config.get(LLM_CONFIG_KEY), DEFAULT_LLM_CONFIG)
|
|
392
|
+
if not self.supports_current_stack_frame(
|
|
393
|
+
tracker, False, False
|
|
394
|
+
) or self.should_abstain_in_coexistence(tracker, True):
|
|
395
|
+
return self._prediction(self._default_predictions(domain))
|
|
396
|
+
|
|
397
|
+
if not self.vector_store:
|
|
398
|
+
logger.error(f"{logger_key}.no_vector_store")
|
|
399
|
+
return self._create_prediction_internal_error(domain, tracker)
|
|
400
|
+
|
|
401
|
+
try:
|
|
402
|
+
self._connect_vector_store_or_raise(endpoints)
|
|
403
|
+
except (VectorStoreConfigurationError, VectorStoreConnectionError) as e:
|
|
404
|
+
logger.error(f"{logger_key}.connection_error", error=e)
|
|
405
|
+
return self._create_prediction_internal_error(domain, tracker)
|
|
406
|
+
|
|
407
|
+
search_query = self._get_last_user_message(tracker)
|
|
408
|
+
tracker_state = tracker.current_state(EventVerbosity.AFTER_RESTART)
|
|
409
|
+
|
|
410
|
+
try:
|
|
411
|
+
documents = await self.vector_store.search(
|
|
412
|
+
query=search_query,
|
|
413
|
+
tracker_state=tracker_state,
|
|
414
|
+
threshold=vector_search_threshold,
|
|
415
|
+
)
|
|
416
|
+
except InformationRetrievalException as e:
|
|
417
|
+
logger.error(f"{logger_key}.search_error", error=e)
|
|
418
|
+
return self._create_prediction_internal_error(domain, tracker)
|
|
419
|
+
|
|
420
|
+
if not documents.results:
|
|
421
|
+
logger.info(f"{logger_key}.no_documents")
|
|
422
|
+
return self._create_prediction_cannot_handle(domain, tracker)
|
|
423
|
+
|
|
424
|
+
if self.use_llm:
|
|
425
|
+
prompt = self._render_prompt(tracker, documents.results)
|
|
426
|
+
llm_answer = await self._generate_llm_answer(llm, prompt)
|
|
427
|
+
|
|
428
|
+
if self.citation_enabled:
|
|
429
|
+
llm_answer = self.post_process_citations(llm_answer)
|
|
430
|
+
|
|
431
|
+
logger.debug(f"{logger_key}.llm_answer", llm_answer=llm_answer)
|
|
432
|
+
response = llm_answer
|
|
433
|
+
else:
|
|
434
|
+
response = documents.results[0].metadata.get("answer", None)
|
|
435
|
+
if not response:
|
|
436
|
+
logger.error(
|
|
437
|
+
f"{logger_key}.answer_key_missing_in_metadata",
|
|
438
|
+
search_results=documents.results,
|
|
439
|
+
)
|
|
440
|
+
logger.debug(
|
|
441
|
+
"enterprise_search_policy.predict_action_probabilities.no_llm",
|
|
442
|
+
search_results=documents,
|
|
443
|
+
)
|
|
444
|
+
|
|
445
|
+
if response is None:
|
|
446
|
+
return self._create_prediction_internal_error(domain, tracker)
|
|
447
|
+
|
|
448
|
+
action_metadata = {
|
|
449
|
+
"message": {
|
|
450
|
+
"text": response,
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
# telemetry call to track policy prediction
|
|
455
|
+
track_enterprise_search_policy_predict(
|
|
456
|
+
vector_store_type=self.vector_store_config.get(VECTOR_STORE_TYPE_PROPERTY),
|
|
457
|
+
embeddings_type=self.embeddings_config.get("_type"),
|
|
458
|
+
embeddings_model=self.embeddings_config.get("model")
|
|
459
|
+
or self.embeddings_config.get("model_name"),
|
|
460
|
+
llm_type=self.llm_config.get("_type"),
|
|
461
|
+
llm_model=self.llm_config.get("model") or self.llm_config.get("model_name"),
|
|
462
|
+
citation_enabled=self.citation_enabled,
|
|
463
|
+
)
|
|
464
|
+
return self._create_prediction(
|
|
465
|
+
domain=domain, tracker=tracker, action_metadata=action_metadata
|
|
466
|
+
)
|
|
467
|
+
|
|
468
|
+
def _render_prompt(
|
|
469
|
+
self, tracker: DialogueStateTracker, documents: List[SearchResult]
|
|
470
|
+
) -> Text:
|
|
471
|
+
"""Renders the prompt from the template.
|
|
472
|
+
|
|
473
|
+
Args:
|
|
474
|
+
tracker: The tracker containing the conversation history up to now.
|
|
475
|
+
documents: The documents retrieved from search
|
|
476
|
+
|
|
477
|
+
Returns:
|
|
478
|
+
The rendered prompt.
|
|
479
|
+
"""
|
|
480
|
+
inputs = {
|
|
481
|
+
"current_conversation": tracker_as_readable_transcript(
|
|
482
|
+
tracker, max_turns=self.max_history
|
|
483
|
+
),
|
|
484
|
+
"docs": documents,
|
|
485
|
+
"slots": self._prepare_slots_for_template(tracker),
|
|
486
|
+
"citation_enabled": self.citation_enabled,
|
|
487
|
+
}
|
|
488
|
+
prompt = Template(self.prompt_template).render(**inputs)
|
|
489
|
+
log_llm(
|
|
490
|
+
logger=logger,
|
|
491
|
+
log_module="EnterpriseSearchPolicy",
|
|
492
|
+
log_event="enterprise_search_policy._render_prompt.prompt_rendered",
|
|
493
|
+
prompt=prompt,
|
|
494
|
+
)
|
|
495
|
+
return prompt
|
|
496
|
+
|
|
497
|
+
async def _generate_llm_answer(
|
|
498
|
+
self, llm: "BaseLLM", prompt: Text
|
|
499
|
+
) -> Optional[Text]:
|
|
500
|
+
try:
|
|
501
|
+
llm_answer = await llm.apredict(prompt)
|
|
502
|
+
except Exception as e:
|
|
503
|
+
# unfortunately, langchain does not wrap LLM exceptions which means
|
|
504
|
+
# we have to catch all exceptions here
|
|
505
|
+
logger.error(
|
|
506
|
+
"enterprise_search_policy._generate_llm_answer.llm_error",
|
|
507
|
+
error=e,
|
|
508
|
+
)
|
|
509
|
+
llm_answer = None
|
|
510
|
+
|
|
511
|
+
return llm_answer
|
|
512
|
+
|
|
513
|
+
def _create_prediction(
|
|
514
|
+
self,
|
|
515
|
+
domain: Domain,
|
|
516
|
+
tracker: DialogueStateTracker,
|
|
517
|
+
action_metadata: Dict[Text, Any],
|
|
518
|
+
) -> PolicyPrediction:
|
|
519
|
+
"""Create a policy prediction result with ACTION_SEND_TEXT_NAME.
|
|
520
|
+
|
|
521
|
+
Args:
|
|
522
|
+
domain: The model's domain.
|
|
523
|
+
tracker: The tracker containing the conversation history up to now.
|
|
524
|
+
action_metadata: The metadata for the predicted action.
|
|
525
|
+
|
|
526
|
+
Returns:
|
|
527
|
+
The prediction.
|
|
528
|
+
"""
|
|
529
|
+
result = self._prediction_result(ACTION_SEND_TEXT_NAME, domain)
|
|
530
|
+
stack = tracker.stack
|
|
531
|
+
if not stack.is_empty():
|
|
532
|
+
stack.pop()
|
|
533
|
+
events: List[Event] = tracker.create_stack_updated_events(stack)
|
|
534
|
+
else:
|
|
535
|
+
events = []
|
|
536
|
+
|
|
537
|
+
return self._prediction(result, action_metadata=action_metadata, events=events)
|
|
538
|
+
|
|
539
|
+
def _create_prediction_internal_error(
|
|
540
|
+
self, domain: Domain, tracker: DialogueStateTracker
|
|
541
|
+
) -> PolicyPrediction:
|
|
542
|
+
return self._create_prediction_for_pattern(
|
|
543
|
+
domain, tracker, InternalErrorPatternFlowStackFrame()
|
|
544
|
+
)
|
|
545
|
+
|
|
546
|
+
def _create_prediction_cannot_handle(
|
|
547
|
+
self, domain: Domain, tracker: DialogueStateTracker
|
|
548
|
+
) -> PolicyPrediction:
|
|
549
|
+
return self._create_prediction_for_pattern(
|
|
550
|
+
domain, tracker, CannotHandlePatternFlowStackFrame()
|
|
551
|
+
)
|
|
552
|
+
|
|
553
|
+
def _create_prediction_for_pattern(
|
|
554
|
+
self,
|
|
555
|
+
domain: Domain,
|
|
556
|
+
tracker: DialogueStateTracker,
|
|
557
|
+
pattern_stack_frame: PatternFlowStackFrame,
|
|
558
|
+
) -> PolicyPrediction:
|
|
559
|
+
"""Create a policy prediction result for error.
|
|
560
|
+
|
|
561
|
+
We should cancel the current flow (hence ACTION_CANCEL_FLOW) and push a
|
|
562
|
+
pattern stack frame (Internal Error Pattern by default) to start the pattern.
|
|
563
|
+
|
|
564
|
+
Args:
|
|
565
|
+
domain: The model's domain.
|
|
566
|
+
tracker: The tracker containing the conversation history up to now.
|
|
567
|
+
pattern_stack_frame: The pattern stack frame to push.
|
|
568
|
+
|
|
569
|
+
Returns:
|
|
570
|
+
The prediction.
|
|
571
|
+
"""
|
|
572
|
+
# TODO: replace ACTION_CANCEL_FLOW (ATO-2097)
|
|
573
|
+
result = self._prediction_result(ACTION_CANCEL_FLOW, domain)
|
|
574
|
+
stack = tracker.stack
|
|
575
|
+
if not stack.is_empty():
|
|
576
|
+
stack.pop()
|
|
577
|
+
stack.push(pattern_stack_frame)
|
|
578
|
+
events: List[Event] = tracker.create_stack_updated_events(stack)
|
|
579
|
+
return self._prediction(result, action_metadata=None, events=events)
|
|
580
|
+
|
|
581
|
+
def _prediction_result(
|
|
582
|
+
self, action_name: Optional[Text], domain: Domain, score: Optional[float] = 1.0
|
|
583
|
+
) -> List[float]:
|
|
584
|
+
"""Creates a prediction result.
|
|
585
|
+
|
|
586
|
+
Args:
|
|
587
|
+
action_name: The name of the predicted action.
|
|
588
|
+
domain: The model's domain.
|
|
589
|
+
score: The score of the predicted action.
|
|
590
|
+
|
|
591
|
+
Returns:
|
|
592
|
+
The prediction result where the score is used for one hot encoding.
|
|
593
|
+
"""
|
|
594
|
+
result = self._default_predictions(domain)
|
|
595
|
+
if action_name:
|
|
596
|
+
result[domain.index_for_action(action_name)] = score # type: ignore[assignment]
|
|
597
|
+
return result
|
|
598
|
+
|
|
599
|
+
@classmethod
|
|
600
|
+
def load(
|
|
601
|
+
cls,
|
|
602
|
+
config: Dict[Text, Any],
|
|
603
|
+
model_storage: ModelStorage,
|
|
604
|
+
resource: Resource,
|
|
605
|
+
execution_context: ExecutionContext,
|
|
606
|
+
**kwargs: Any,
|
|
607
|
+
) -> "EnterpriseSearchPolicy":
|
|
608
|
+
"""Loads a trained policy (see parent class for full docstring)."""
|
|
609
|
+
prompt_template = None
|
|
610
|
+
store_type = config.get(VECTOR_STORE_PROPERTY, {}).get(
|
|
611
|
+
VECTOR_STORE_TYPE_PROPERTY
|
|
612
|
+
)
|
|
613
|
+
|
|
614
|
+
embeddings = cls._create_plain_embedder(config)
|
|
615
|
+
logger.info("enterprise_search_policy.load", config=config)
|
|
616
|
+
if store_type == DEFAULT_VECTOR_STORE_TYPE:
|
|
617
|
+
# if a vector store is not specified,
|
|
618
|
+
# default to using FAISS with the index stored in the model
|
|
619
|
+
# TODO figure out a way to get path without context manager
|
|
620
|
+
with model_storage.read_from(resource) as path:
|
|
621
|
+
vector_store = FAISS_Store(
|
|
622
|
+
embeddings=embeddings,
|
|
623
|
+
index_path=path,
|
|
624
|
+
docs_folder=None,
|
|
625
|
+
create_index=False,
|
|
626
|
+
)
|
|
627
|
+
else:
|
|
628
|
+
vector_store = create_from_endpoint_config(
|
|
629
|
+
config_type=store_type,
|
|
630
|
+
embeddings=embeddings,
|
|
631
|
+
) # type: ignore
|
|
632
|
+
try:
|
|
633
|
+
with model_storage.read_from(resource) as path:
|
|
634
|
+
prompt_template = rasa.shared.utils.io.read_file(
|
|
635
|
+
path / ENTERPRISE_SEARCH_PROMPT_FILE_NAME
|
|
636
|
+
)
|
|
637
|
+
|
|
638
|
+
except (FileNotFoundError, FileNotFoundError) as e:
|
|
639
|
+
logger.warning(
|
|
640
|
+
"enterprise_search_policy.load.failed", error=e, resource=resource.name
|
|
641
|
+
)
|
|
642
|
+
|
|
643
|
+
return cls(
|
|
644
|
+
config,
|
|
645
|
+
model_storage,
|
|
646
|
+
resource,
|
|
647
|
+
execution_context,
|
|
648
|
+
vector_store=vector_store,
|
|
649
|
+
prompt_template=prompt_template,
|
|
650
|
+
)
|
|
651
|
+
|
|
652
|
+
@classmethod
|
|
653
|
+
def _get_local_knowledge_data(cls, config: Dict[str, Any]) -> Optional[List[str]]:
|
|
654
|
+
"""This is required only for local knowledge base types.
|
|
655
|
+
|
|
656
|
+
e.g. FAISS, to ensure that the graph component is retrained when the knowledge
|
|
657
|
+
base is updated.
|
|
658
|
+
"""
|
|
659
|
+
merged_config = {**cls.get_default_config(), **config}
|
|
660
|
+
|
|
661
|
+
store_type = merged_config.get(VECTOR_STORE_PROPERTY, {}).get(
|
|
662
|
+
VECTOR_STORE_TYPE_PROPERTY
|
|
663
|
+
)
|
|
664
|
+
if store_type != DEFAULT_VECTOR_STORE_TYPE:
|
|
665
|
+
return None
|
|
666
|
+
|
|
667
|
+
source = merged_config.get(VECTOR_STORE_PROPERTY, {}).get(SOURCE_PROPERTY)
|
|
668
|
+
if not source:
|
|
669
|
+
return None
|
|
670
|
+
|
|
671
|
+
docs = FAISS_Store.load_documents(source)
|
|
672
|
+
|
|
673
|
+
if len(docs) == 0:
|
|
674
|
+
return None
|
|
675
|
+
|
|
676
|
+
docs_as_strings = [
|
|
677
|
+
json.dumps(doc.dict(), ensure_ascii=False, sort_keys=True) for doc in docs
|
|
678
|
+
]
|
|
679
|
+
return sorted(docs_as_strings)
|
|
680
|
+
|
|
681
|
+
@classmethod
|
|
682
|
+
def fingerprint_addon(cls, config: Dict[str, Any]) -> Optional[str]:
|
|
683
|
+
"""Add a fingerprint of the knowledge base and prompt template for the graph."""
|
|
684
|
+
local_knowledge_data = cls._get_local_knowledge_data(config)
|
|
685
|
+
|
|
686
|
+
prompt_template = get_prompt_template(
|
|
687
|
+
config.get("prompt"),
|
|
688
|
+
DEFAULT_ENTERPRISE_SEARCH_PROMPT_TEMPLATE,
|
|
689
|
+
)
|
|
690
|
+
return deep_container_fingerprint([prompt_template, local_knowledge_data])
|
|
691
|
+
|
|
692
|
+
@staticmethod
|
|
693
|
+
def post_process_citations(llm_answer: str) -> str:
|
|
694
|
+
"""Post-process the LLM answer.
|
|
695
|
+
|
|
696
|
+
Re-writes the bracketed numbers to start from 1 and
|
|
697
|
+
re-arranges the sources to follow the enumeration order.
|
|
698
|
+
|
|
699
|
+
Args:
|
|
700
|
+
llm_answer: The LLM answer.
|
|
701
|
+
|
|
702
|
+
Returns:
|
|
703
|
+
The post-processed LLM answer.
|
|
704
|
+
"""
|
|
705
|
+
logger.debug(
|
|
706
|
+
"enterprise_search_policy.post_process_citations", llm_answer=llm_answer
|
|
707
|
+
)
|
|
708
|
+
|
|
709
|
+
# Split llm_answer into answer and citations
|
|
710
|
+
try:
|
|
711
|
+
answer, citations = llm_answer.rsplit("Sources:", 1)
|
|
712
|
+
except ValueError:
|
|
713
|
+
# if there is no "Sources:" in the llm_answer
|
|
714
|
+
return llm_answer
|
|
715
|
+
|
|
716
|
+
# Find all source references in the answer
|
|
717
|
+
pattern = r"\[\s*(\d+(?:\s*,\s*\d+)*)\s*\]"
|
|
718
|
+
matches = re.findall(pattern, answer)
|
|
719
|
+
old_source_indices = [
|
|
720
|
+
int(num.strip()) for match in matches for num in match.split(",")
|
|
721
|
+
]
|
|
722
|
+
|
|
723
|
+
# Map old source references to the correct enumeration
|
|
724
|
+
renumber_mapping = {num: idx + 1 for idx, num in enumerate(old_source_indices)}
|
|
725
|
+
|
|
726
|
+
# remove whitespace from original source citations in answer
|
|
727
|
+
for match in matches:
|
|
728
|
+
answer = answer.replace(f"[{match}]", f"[{match.replace(' ', '')}]")
|
|
729
|
+
|
|
730
|
+
new_answer = []
|
|
731
|
+
for word in answer.split():
|
|
732
|
+
matches = re.findall(pattern, word)
|
|
733
|
+
if matches:
|
|
734
|
+
for match in matches:
|
|
735
|
+
if "," in match:
|
|
736
|
+
old_indices = [
|
|
737
|
+
int(num.strip()) for num in match.split(",") if num
|
|
738
|
+
]
|
|
739
|
+
new_indices = [
|
|
740
|
+
renumber_mapping[old_index]
|
|
741
|
+
for old_index in old_indices
|
|
742
|
+
if old_index in renumber_mapping
|
|
743
|
+
]
|
|
744
|
+
if not new_indices:
|
|
745
|
+
continue
|
|
746
|
+
|
|
747
|
+
word = word.replace(
|
|
748
|
+
match, f"{', '.join(map(str, new_indices))}"
|
|
749
|
+
)
|
|
750
|
+
else:
|
|
751
|
+
old_index = int(match.strip("[].,:;?!"))
|
|
752
|
+
new_index = renumber_mapping.get(old_index)
|
|
753
|
+
if not new_index:
|
|
754
|
+
continue
|
|
755
|
+
|
|
756
|
+
word = word.replace(str(old_index), str(new_index))
|
|
757
|
+
new_answer.append(word)
|
|
758
|
+
|
|
759
|
+
# join the words
|
|
760
|
+
joined_answer = " ".join(new_answer)
|
|
761
|
+
joined_answer += "\nSources:\n"
|
|
762
|
+
|
|
763
|
+
new_sources: List[str] = []
|
|
764
|
+
|
|
765
|
+
for line in citations.split("\n"):
|
|
766
|
+
pattern = r"(?<=\[)\d+"
|
|
767
|
+
match = re.search(pattern, line)
|
|
768
|
+
if match:
|
|
769
|
+
old_index = int(match.group(0))
|
|
770
|
+
new_index = renumber_mapping[old_index]
|
|
771
|
+
# replace only the first occurrence of the old index
|
|
772
|
+
line = line.replace(f"[{old_index}]", f"[{new_index}]", 1)
|
|
773
|
+
|
|
774
|
+
# insert the line into the new_index position
|
|
775
|
+
new_sources.insert(new_index - 1, line)
|
|
776
|
+
elif line.strip():
|
|
777
|
+
new_sources.append(line)
|
|
778
|
+
|
|
779
|
+
joined_sources = "\n".join(new_sources)
|
|
780
|
+
|
|
781
|
+
return joined_answer + joined_sources
|