rasa-pro 3.12.0.dev1__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 +41 -0
- rasa/__init__.py +9 -0
- rasa/__main__.py +177 -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 +160 -0
- rasa/cli/__init__.py +5 -0
- rasa/cli/arguments/__init__.py +0 -0
- rasa/cli/arguments/data.py +106 -0
- rasa/cli/arguments/default_arguments.py +207 -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 +219 -0
- rasa/cli/arguments/shell.py +17 -0
- rasa/cli/arguments/test.py +211 -0
- rasa/cli/arguments/train.py +279 -0
- rasa/cli/arguments/visualize.py +34 -0
- rasa/cli/arguments/x.py +30 -0
- rasa/cli/data.py +354 -0
- rasa/cli/dialogue_understanding_test.py +251 -0
- rasa/cli/e2e_test.py +259 -0
- rasa/cli/evaluate.py +222 -0
- rasa/cli/export.py +250 -0
- rasa/cli/inspect.py +75 -0
- rasa/cli/interactive.py +166 -0
- rasa/cli/license.py +65 -0
- rasa/cli/llm_fine_tuning.py +403 -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 +10 -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 +58 -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/__init__.py +0 -0
- rasa/cli/project_templates/tutorial/actions/actions.py +22 -0
- rasa/cli/project_templates/tutorial/config.yml +12 -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 +11 -0
- rasa/cli/project_templates/tutorial/domain.yml +35 -0
- rasa/cli/project_templates/tutorial/endpoints.yml +55 -0
- rasa/cli/run.py +143 -0
- rasa/cli/scaffold.py +273 -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 +296 -0
- rasa/cli/studio/train.py +59 -0
- rasa/cli/studio/upload.py +62 -0
- rasa/cli/telemetry.py +102 -0
- rasa/cli/test.py +280 -0
- rasa/cli/train.py +278 -0
- rasa/cli/utils.py +484 -0
- rasa/cli/visualize.py +40 -0
- rasa/cli/x.py +206 -0
- rasa/constants.py +45 -0
- rasa/core/__init__.py +17 -0
- rasa/core/actions/__init__.py +0 -0
- rasa/core/actions/action.py +1318 -0
- rasa/core/actions/action_clean_stack.py +59 -0
- rasa/core/actions/action_exceptions.py +24 -0
- rasa/core/actions/action_hangup.py +29 -0
- rasa/core/actions/action_repeat_bot_messages.py +89 -0
- rasa/core/actions/action_run_slot_rejections.py +210 -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 +191 -0
- rasa/core/actions/direct_custom_actions_executor.py +109 -0
- rasa/core/actions/e2e_stub_custom_action_executor.py +72 -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 +145 -0
- rasa/core/actions/loops.py +114 -0
- rasa/core/actions/two_stage_fallback.py +186 -0
- rasa/core/agent.py +559 -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 +324 -0
- rasa/core/brokers/pika.py +388 -0
- rasa/core/brokers/sql.py +86 -0
- rasa/core/channels/__init__.py +61 -0
- rasa/core/channels/botframework.py +338 -0
- rasa/core/channels/callback.py +84 -0
- rasa/core/channels/channel.py +456 -0
- rasa/core/channels/console.py +241 -0
- rasa/core/channels/development_inspector.py +197 -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-861ddd57.js +1 -0
- rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
- rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-921f02db.js +10 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-b436c4f8.js +2 -0
- rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-511a23cb.js +2 -0
- rasa/core/channels/inspector/dist/assets/createText-62fc7601-ef476ecd.js +7 -0
- rasa/core/channels/inspector/dist/assets/edges-f2ad444c-f1878e0a.js +4 -0
- rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-fac75185.js +51 -0
- rasa/core/channels/inspector/dist/assets/flowDb-1972c806-201c5bbc.js +6 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-f904ae41.js +4 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +1 -0
- rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-1813da66.js +139 -0
- rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-872af172.js +266 -0
- rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-34a0af5a.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-42ba3e3d.js +1 -0
- rasa/core/channels/inspector/dist/assets/index-37817b51.js +1317 -0
- rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
- rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-6b731386.js +7 -0
- rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
- rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-e8579ac6.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-89e6403a.js +1 -0
- rasa/core/channels/inspector/dist/assets/line-dc73d3fc.js +1 -0
- rasa/core/channels/inspector/dist/assets/linear-f5b1d2bc.js +1 -0
- rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-82cb74fa.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-bdf5f29b.js +35 -0
- rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-c7a0cbe4.js +7 -0
- rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-7ec5410f.js +52 -0
- rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-caee5554.js +8 -0
- rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-2935f8db.js +122 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-8f5d9693.js +1 -0
- rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-d565d1de.js +1 -0
- rasa/core/channels/inspector/dist/assets/styles-080da4f6-75ad421d.js +110 -0
- rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-7e764226.js +159 -0
- rasa/core/channels/inspector/dist/assets/styles-9c745c82-7a4e0e61.js +207 -0
- rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-4019d1bf.js +1 -0
- rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-01ea12df.js +61 -0
- rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-89407137.js +7 -0
- rasa/core/channels/inspector/dist/index.html +42 -0
- rasa/core/channels/inspector/index.html +40 -0
- rasa/core/channels/inspector/jest.config.ts +13 -0
- rasa/core/channels/inspector/package.json +52 -0
- rasa/core/channels/inspector/setupTests.ts +2 -0
- rasa/core/channels/inspector/src/App.tsx +220 -0
- rasa/core/channels/inspector/src/components/Chat.tsx +95 -0
- rasa/core/channels/inspector/src/components/DiagramFlow.tsx +108 -0
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
- rasa/core/channels/inspector/src/components/DialogueStack.tsx +136 -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 +22 -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/audiostream.ts +191 -0
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +392 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +306 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +127 -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 +84 -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 +6249 -0
- rasa/core/channels/mattermost.py +229 -0
- rasa/core/channels/rasa_chat.py +126 -0
- rasa/core/channels/rest.py +230 -0
- rasa/core/channels/rocketchat.py +174 -0
- rasa/core/channels/slack.py +620 -0
- rasa/core/channels/socketio.py +302 -0
- rasa/core/channels/telegram.py +298 -0
- rasa/core/channels/twilio.py +169 -0
- rasa/core/channels/vier_cvg.py +374 -0
- rasa/core/channels/voice_ready/__init__.py +0 -0
- rasa/core/channels/voice_ready/audiocodes.py +501 -0
- rasa/core/channels/voice_ready/jambonz.py +121 -0
- rasa/core/channels/voice_ready/jambonz_protocol.py +396 -0
- rasa/core/channels/voice_ready/twilio_voice.py +403 -0
- rasa/core/channels/voice_ready/utils.py +37 -0
- rasa/core/channels/voice_stream/__init__.py +0 -0
- rasa/core/channels/voice_stream/asr/__init__.py +0 -0
- rasa/core/channels/voice_stream/asr/asr_engine.py +89 -0
- rasa/core/channels/voice_stream/asr/asr_event.py +18 -0
- rasa/core/channels/voice_stream/asr/azure.py +130 -0
- rasa/core/channels/voice_stream/asr/deepgram.py +90 -0
- rasa/core/channels/voice_stream/audio_bytes.py +8 -0
- rasa/core/channels/voice_stream/browser_audio.py +107 -0
- rasa/core/channels/voice_stream/call_state.py +23 -0
- rasa/core/channels/voice_stream/tts/__init__.py +0 -0
- rasa/core/channels/voice_stream/tts/azure.py +106 -0
- rasa/core/channels/voice_stream/tts/cartesia.py +118 -0
- rasa/core/channels/voice_stream/tts/tts_cache.py +27 -0
- rasa/core/channels/voice_stream/tts/tts_engine.py +58 -0
- rasa/core/channels/voice_stream/twilio_media_streams.py +173 -0
- rasa/core/channels/voice_stream/util.py +57 -0
- rasa/core/channels/voice_stream/voice_channel.py +427 -0
- rasa/core/channels/webexteams.py +134 -0
- rasa/core/concurrent_lock_store.py +210 -0
- rasa/core/constants.py +112 -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 +124 -0
- rasa/core/information_retrieval/information_retrieval.py +137 -0
- rasa/core/information_retrieval/milvus.py +59 -0
- rasa/core/information_retrieval/qdrant.py +96 -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 +320 -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 +70 -0
- rasa/core/persistor.py +538 -0
- rasa/core/policies/__init__.py +0 -0
- rasa/core/policies/ensemble.py +329 -0
- rasa/core/policies/enterprise_search_policy.py +905 -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 +754 -0
- rasa/core/policies/flows/flow_step_result.py +43 -0
- rasa/core/policies/intentless_policy.py +1031 -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 +1465 -0
- rasa/core/run.py +342 -0
- rasa/core/secrets_manager/__init__.py +0 -0
- rasa/core/secrets_manager/constants.py +36 -0
- rasa/core/secrets_manager/endpoints.py +391 -0
- rasa/core/secrets_manager/factory.py +241 -0
- rasa/core/secrets_manager/secret_manager.py +262 -0
- rasa/core/secrets_manager/vault.py +584 -0
- rasa/core/test.py +1335 -0
- rasa/core/tracker_store.py +1703 -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 +1744 -0
- rasa/core/training/story_conflict.py +381 -0
- rasa/core/training/training.py +93 -0
- rasa/core/utils.py +366 -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 +327 -0
- rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
- rasa/dialogue_understanding/commands/__init__.py +61 -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/repeat_bot_messages_command.py +60 -0
- rasa/dialogue_understanding/commands/restart_command.py +58 -0
- rasa/dialogue_understanding/commands/session_end_command.py +61 -0
- rasa/dialogue_understanding/commands/session_start_command.py +59 -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/commands/user_silence_command.py +59 -0
- rasa/dialogue_understanding/commands/utils.py +45 -0
- rasa/dialogue_understanding/generator/__init__.py +21 -0
- rasa/dialogue_understanding/generator/command_generator.py +464 -0
- rasa/dialogue_understanding/generator/constants.py +27 -0
- rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +466 -0
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +500 -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 +920 -0
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +261 -0
- rasa/dialogue_understanding/generator/single_step/__init__.py +0 -0
- rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2 +60 -0
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +486 -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 +301 -0
- rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
- rasa/dialogue_understanding/patterns/internal_error.py +47 -0
- rasa/dialogue_understanding/patterns/repeat.py +37 -0
- rasa/dialogue_understanding/patterns/restart.py +37 -0
- rasa/dialogue_understanding/patterns/search.py +37 -0
- rasa/dialogue_understanding/patterns/session_start.py +37 -0
- rasa/dialogue_understanding/patterns/skip_question.py +38 -0
- rasa/dialogue_understanding/patterns/user_silence.py +37 -0
- rasa/dialogue_understanding/processor/__init__.py +0 -0
- rasa/dialogue_understanding/processor/command_processor.py +720 -0
- rasa/dialogue_understanding/processor/command_processor_component.py +43 -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/dialogue_understanding/utils.py +14 -0
- rasa/dialogue_understanding_test/__init__.py +0 -0
- rasa/dialogue_understanding_test/command_metric_calculation.py +12 -0
- rasa/dialogue_understanding_test/constants.py +17 -0
- rasa/dialogue_understanding_test/du_test_case.py +118 -0
- rasa/dialogue_understanding_test/du_test_result.py +11 -0
- rasa/dialogue_understanding_test/du_test_runner.py +93 -0
- rasa/dialogue_understanding_test/io.py +54 -0
- rasa/dialogue_understanding_test/validation.py +22 -0
- rasa/e2e_test/__init__.py +0 -0
- rasa/e2e_test/aggregate_test_stats_calculator.py +134 -0
- rasa/e2e_test/assertions.py +1345 -0
- rasa/e2e_test/assertions_schema.yml +129 -0
- rasa/e2e_test/constants.py +31 -0
- rasa/e2e_test/e2e_config.py +220 -0
- rasa/e2e_test/e2e_config_schema.yml +26 -0
- rasa/e2e_test/e2e_test_case.py +569 -0
- rasa/e2e_test/e2e_test_converter.py +363 -0
- rasa/e2e_test/e2e_test_converter_prompt.jinja2 +70 -0
- rasa/e2e_test/e2e_test_coverage_report.py +364 -0
- rasa/e2e_test/e2e_test_result.py +54 -0
- rasa/e2e_test/e2e_test_runner.py +1192 -0
- rasa/e2e_test/e2e_test_schema.yml +181 -0
- rasa/e2e_test/pykwalify_extensions.py +39 -0
- rasa/e2e_test/stub_custom_action.py +70 -0
- rasa/e2e_test/utils/__init__.py +0 -0
- rasa/e2e_test/utils/e2e_yaml_utils.py +55 -0
- rasa/e2e_test/utils/io.py +598 -0
- rasa/e2e_test/utils/validation.py +178 -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 +642 -0
- rasa/engine/loader.py +48 -0
- rasa/engine/recipes/__init__.py +0 -0
- rasa/engine/recipes/config_files/default_config.yml +41 -0
- rasa/engine/recipes/default_components.py +97 -0
- rasa/engine/recipes/default_recipe.py +1272 -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 +244 -0
- rasa/engine/storage/resource.py +110 -0
- rasa/engine/storage/storage.py +199 -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 +1451 -0
- rasa/env.py +14 -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 +96 -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 +111 -0
- rasa/jupyter.py +63 -0
- rasa/llm_fine_tuning/__init__.py +0 -0
- rasa/llm_fine_tuning/annotation_module.py +241 -0
- rasa/llm_fine_tuning/conversations.py +144 -0
- rasa/llm_fine_tuning/llm_data_preparation_module.py +178 -0
- rasa/llm_fine_tuning/paraphrasing/__init__.py +0 -0
- rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +281 -0
- rasa/llm_fine_tuning/paraphrasing/default_rephrase_prompt_template.jina2 +44 -0
- rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +121 -0
- rasa/llm_fine_tuning/paraphrasing/rephrased_user_message.py +10 -0
- rasa/llm_fine_tuning/paraphrasing_module.py +128 -0
- rasa/llm_fine_tuning/storage.py +174 -0
- rasa/llm_fine_tuning/train_test_split_module.py +441 -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_manager/__init__.py +0 -0
- rasa/model_manager/config.py +40 -0
- rasa/model_manager/model_api.py +559 -0
- rasa/model_manager/runner_service.py +286 -0
- rasa/model_manager/socket_bridge.py +146 -0
- rasa/model_manager/studio_jwt_auth.py +86 -0
- rasa/model_manager/trainer_service.py +325 -0
- rasa/model_manager/utils.py +87 -0
- rasa/model_manager/warm_rasa_process.py +187 -0
- rasa/model_service.py +112 -0
- rasa/model_testing.py +457 -0
- rasa/model_training.py +596 -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/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/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 +95 -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 +1588 -0
- rasa/shared/__init__.py +0 -0
- rasa/shared/constants.py +311 -0
- rasa/shared/core/__init__.py +0 -0
- rasa/shared/core/command_payload_reader.py +109 -0
- rasa/shared/core/constants.py +180 -0
- rasa/shared/core/conversation.py +46 -0
- rasa/shared/core/domain.py +2172 -0
- rasa/shared/core/events.py +2559 -0
- rasa/shared/core/flows/__init__.py +7 -0
- rasa/shared/core/flows/flow.py +562 -0
- rasa/shared/core/flows/flow_path.py +84 -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 +258 -0
- rasa/shared/core/flows/flows_yaml_schema.json +303 -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/utils.py +39 -0
- rasa/shared/core/flows/validation.py +735 -0
- rasa/shared/core/flows/yaml_flows_io.py +405 -0
- rasa/shared/core/generator.py +908 -0
- rasa/shared/core/slot_mappings.py +526 -0
- rasa/shared/core/slots.py +654 -0
- rasa/shared/core/trackers.py +1183 -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 +858 -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 +167 -0
- rasa/shared/importers/__init__.py +0 -0
- rasa/shared/importers/importer.py +770 -0
- rasa/shared/importers/multi_project.py +215 -0
- rasa/shared/importers/rasa.py +108 -0
- rasa/shared/importers/remote_importer.py +196 -0
- rasa/shared/importers/utils.py +36 -0
- rasa/shared/nlu/__init__.py +0 -0
- rasa/shared/nlu/constants.py +53 -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 +618 -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 +729 -0
- rasa/shared/nlu/training_data/util.py +223 -0
- rasa/shared/providers/__init__.py +0 -0
- rasa/shared/providers/_configs/__init__.py +0 -0
- rasa/shared/providers/_configs/azure_openai_client_config.py +677 -0
- rasa/shared/providers/_configs/client_config.py +59 -0
- rasa/shared/providers/_configs/default_litellm_client_config.py +132 -0
- rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +236 -0
- rasa/shared/providers/_configs/litellm_router_client_config.py +222 -0
- rasa/shared/providers/_configs/model_group_config.py +173 -0
- rasa/shared/providers/_configs/openai_client_config.py +177 -0
- rasa/shared/providers/_configs/rasa_llm_client_config.py +75 -0
- rasa/shared/providers/_configs/self_hosted_llm_client_config.py +178 -0
- rasa/shared/providers/_configs/utils.py +117 -0
- rasa/shared/providers/_ssl_verification_utils.py +124 -0
- rasa/shared/providers/_utils.py +79 -0
- rasa/shared/providers/constants.py +7 -0
- rasa/shared/providers/embedding/__init__.py +0 -0
- rasa/shared/providers/embedding/_base_litellm_embedding_client.py +243 -0
- rasa/shared/providers/embedding/_langchain_embedding_client_adapter.py +74 -0
- rasa/shared/providers/embedding/azure_openai_embedding_client.py +335 -0
- rasa/shared/providers/embedding/default_litellm_embedding_client.py +126 -0
- rasa/shared/providers/embedding/embedding_client.py +90 -0
- rasa/shared/providers/embedding/embedding_response.py +41 -0
- rasa/shared/providers/embedding/huggingface_local_embedding_client.py +191 -0
- rasa/shared/providers/embedding/litellm_router_embedding_client.py +138 -0
- rasa/shared/providers/embedding/openai_embedding_client.py +172 -0
- rasa/shared/providers/llm/__init__.py +0 -0
- rasa/shared/providers/llm/_base_litellm_client.py +265 -0
- rasa/shared/providers/llm/azure_openai_llm_client.py +415 -0
- rasa/shared/providers/llm/default_litellm_llm_client.py +110 -0
- rasa/shared/providers/llm/litellm_router_llm_client.py +202 -0
- rasa/shared/providers/llm/llm_client.py +78 -0
- rasa/shared/providers/llm/llm_response.py +50 -0
- rasa/shared/providers/llm/openai_llm_client.py +161 -0
- rasa/shared/providers/llm/rasa_llm_client.py +120 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +276 -0
- rasa/shared/providers/mappings.py +94 -0
- rasa/shared/providers/router/__init__.py +0 -0
- rasa/shared/providers/router/_base_litellm_router_client.py +185 -0
- rasa/shared/providers/router/router_client.py +75 -0
- rasa/shared/utils/__init__.py +0 -0
- rasa/shared/utils/cli.py +102 -0
- rasa/shared/utils/common.py +324 -0
- rasa/shared/utils/constants.py +4 -0
- rasa/shared/utils/health_check/__init__.py +0 -0
- rasa/shared/utils/health_check/embeddings_health_check_mixin.py +31 -0
- rasa/shared/utils/health_check/health_check.py +258 -0
- rasa/shared/utils/health_check/llm_health_check_mixin.py +31 -0
- rasa/shared/utils/io.py +499 -0
- rasa/shared/utils/llm.py +764 -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 +214 -0
- rasa/shared/utils/schemas/model_config.yml +36 -0
- rasa/shared/utils/schemas/stories.yml +173 -0
- rasa/shared/utils/yaml.py +1068 -0
- rasa/studio/__init__.py +0 -0
- rasa/studio/auth.py +270 -0
- rasa/studio/config.py +136 -0
- rasa/studio/constants.py +19 -0
- rasa/studio/data_handler.py +368 -0
- rasa/studio/download.py +489 -0
- rasa/studio/results_logger.py +137 -0
- rasa/studio/train.py +134 -0
- rasa/studio/upload.py +563 -0
- rasa/telemetry.py +1876 -0
- rasa/tracing/__init__.py +0 -0
- rasa/tracing/config.py +355 -0
- rasa/tracing/constants.py +62 -0
- rasa/tracing/instrumentation/__init__.py +0 -0
- rasa/tracing/instrumentation/attribute_extractors.py +765 -0
- rasa/tracing/instrumentation/instrumentation.py +1306 -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 +639 -0
- rasa/utils/converter.py +53 -0
- rasa/utils/endpoints.py +331 -0
- rasa/utils/io.py +252 -0
- rasa/utils/json_utils.py +60 -0
- rasa/utils/licensing.py +542 -0
- rasa/utils/log_utils.py +181 -0
- rasa/utils/mapper.py +210 -0
- rasa/utils/ml_utils.py +147 -0
- rasa/utils/plotting.py +362 -0
- rasa/utils/sanic_error_handler.py +32 -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 +1644 -0
- rasa/version.py +3 -0
- rasa_pro-3.12.0.dev1.dist-info/METADATA +199 -0
- rasa_pro-3.12.0.dev1.dist-info/NOTICE +5 -0
- rasa_pro-3.12.0.dev1.dist-info/RECORD +790 -0
- rasa_pro-3.12.0.dev1.dist-info/WHEEL +4 -0
- rasa_pro-3.12.0.dev1.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import copy
|
|
3
|
+
import logging
|
|
4
|
+
from typing import Any, List, Text, Dict, Type, Union, Tuple, Optional
|
|
5
|
+
|
|
6
|
+
from rasa.engine.graph import GraphComponent, ExecutionContext
|
|
7
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
8
|
+
from rasa.engine.storage.resource import Resource
|
|
9
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
10
|
+
from rasa.shared.constants import DEFAULT_NLU_FALLBACK_INTENT_NAME
|
|
11
|
+
from rasa.core.constants import (
|
|
12
|
+
DEFAULT_NLU_FALLBACK_THRESHOLD,
|
|
13
|
+
DEFAULT_NLU_FALLBACK_AMBIGUITY_THRESHOLD,
|
|
14
|
+
)
|
|
15
|
+
from rasa.nlu.classifiers.classifier import IntentClassifier
|
|
16
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
17
|
+
from rasa.shared.nlu.constants import (
|
|
18
|
+
INTENT,
|
|
19
|
+
INTENT_NAME_KEY,
|
|
20
|
+
INTENT_RANKING_KEY,
|
|
21
|
+
PREDICTED_CONFIDENCE_KEY,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
THRESHOLD_KEY = "threshold"
|
|
25
|
+
AMBIGUITY_THRESHOLD_KEY = "ambiguity_threshold"
|
|
26
|
+
|
|
27
|
+
logger = logging.getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@DefaultV1Recipe.register(
|
|
31
|
+
DefaultV1Recipe.ComponentType.INTENT_CLASSIFIER, is_trainable=False
|
|
32
|
+
)
|
|
33
|
+
class FallbackClassifier(GraphComponent, IntentClassifier):
|
|
34
|
+
"""Handles incoming messages with low NLU confidence."""
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def required_components(cls) -> List[Type]:
|
|
38
|
+
"""Components that should be included in the pipeline before this component."""
|
|
39
|
+
return [IntentClassifier]
|
|
40
|
+
|
|
41
|
+
@staticmethod
|
|
42
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
43
|
+
"""The component's default config (see parent class for full docstring)."""
|
|
44
|
+
# please make sure to update the docs when changing a default parameter
|
|
45
|
+
return {
|
|
46
|
+
# If all intent confidence scores are beyond this threshold, set the current
|
|
47
|
+
# intent to `FALLBACK_INTENT_NAME`
|
|
48
|
+
THRESHOLD_KEY: DEFAULT_NLU_FALLBACK_THRESHOLD,
|
|
49
|
+
# If the confidence scores for the top two intent predictions are closer
|
|
50
|
+
# than `AMBIGUITY_THRESHOLD_KEY`,
|
|
51
|
+
# then `FALLBACK_INTENT_NAME` is predicted.
|
|
52
|
+
AMBIGUITY_THRESHOLD_KEY: DEFAULT_NLU_FALLBACK_AMBIGUITY_THRESHOLD,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
def __init__(self, config: Dict[Text, Any]) -> None:
|
|
56
|
+
"""Constructs a new fallback classifier."""
|
|
57
|
+
self.component_config = config
|
|
58
|
+
|
|
59
|
+
@classmethod
|
|
60
|
+
def create(
|
|
61
|
+
cls,
|
|
62
|
+
config: Dict[Text, Any],
|
|
63
|
+
model_storage: ModelStorage,
|
|
64
|
+
resource: Resource,
|
|
65
|
+
execution_context: ExecutionContext,
|
|
66
|
+
) -> FallbackClassifier:
|
|
67
|
+
"""Creates a new component (see parent class for full docstring)."""
|
|
68
|
+
return cls(config)
|
|
69
|
+
|
|
70
|
+
def process(self, messages: List[Message]) -> List[Message]:
|
|
71
|
+
"""Process a list of incoming messages.
|
|
72
|
+
|
|
73
|
+
This is the component's chance to process incoming
|
|
74
|
+
messages. The component can rely on
|
|
75
|
+
any context attribute to be present, that gets created
|
|
76
|
+
by a call to :meth:`rasa.nlu.components.Component.create`
|
|
77
|
+
of ANY component and
|
|
78
|
+
on any context attributes created by a call to
|
|
79
|
+
:meth:`rasa.nlu.components.Component.process`
|
|
80
|
+
of components previous to this one.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
messages: List containing :class:
|
|
84
|
+
`rasa.shared.nlu.training_data.message.Message` to process.
|
|
85
|
+
"""
|
|
86
|
+
for message in messages:
|
|
87
|
+
if not self._should_fallback(message):
|
|
88
|
+
continue
|
|
89
|
+
|
|
90
|
+
# we assume that the fallback confidence
|
|
91
|
+
# is the same as the fallback threshold
|
|
92
|
+
confidence = self.component_config[THRESHOLD_KEY]
|
|
93
|
+
message.data[INTENT] = _fallback_intent(confidence)
|
|
94
|
+
message.data.setdefault(INTENT_RANKING_KEY, [])
|
|
95
|
+
message.data[INTENT_RANKING_KEY].insert(0, _fallback_intent(confidence))
|
|
96
|
+
|
|
97
|
+
return messages
|
|
98
|
+
|
|
99
|
+
def _should_fallback(self, message: Message) -> bool:
|
|
100
|
+
"""Check if the fallback intent should be predicted.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
message: The current message and its intent predictions.
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
`True` if the fallback intent should be predicted.
|
|
107
|
+
"""
|
|
108
|
+
intent_name = message.data[INTENT].get(INTENT_NAME_KEY)
|
|
109
|
+
below_threshold, nlu_confidence = self._nlu_confidence_below_threshold(message)
|
|
110
|
+
|
|
111
|
+
if below_threshold:
|
|
112
|
+
logger.debug(
|
|
113
|
+
f"NLU confidence {nlu_confidence} for intent '{intent_name}' is lower "
|
|
114
|
+
f"than NLU threshold {self.component_config[THRESHOLD_KEY]:.2f}."
|
|
115
|
+
)
|
|
116
|
+
return True
|
|
117
|
+
|
|
118
|
+
ambiguous_prediction, confidence_delta = self._nlu_prediction_ambiguous(message)
|
|
119
|
+
if ambiguous_prediction:
|
|
120
|
+
logger.debug(
|
|
121
|
+
f"The difference in NLU confidences "
|
|
122
|
+
f"for the top two intents ({confidence_delta}) is lower than "
|
|
123
|
+
f"the ambiguity threshold "
|
|
124
|
+
f"{self.component_config[AMBIGUITY_THRESHOLD_KEY]:.2f}. Predicting "
|
|
125
|
+
f"intent '{DEFAULT_NLU_FALLBACK_INTENT_NAME}' instead of "
|
|
126
|
+
f"'{intent_name}'."
|
|
127
|
+
)
|
|
128
|
+
return True
|
|
129
|
+
|
|
130
|
+
return False
|
|
131
|
+
|
|
132
|
+
def _nlu_confidence_below_threshold(self, message: Message) -> Tuple[bool, float]:
|
|
133
|
+
nlu_confidence = message.data[INTENT].get(PREDICTED_CONFIDENCE_KEY)
|
|
134
|
+
return nlu_confidence < self.component_config[THRESHOLD_KEY], nlu_confidence
|
|
135
|
+
|
|
136
|
+
def _nlu_prediction_ambiguous(
|
|
137
|
+
self, message: Message
|
|
138
|
+
) -> Tuple[bool, Optional[float]]:
|
|
139
|
+
intents = message.data.get(INTENT_RANKING_KEY, [])
|
|
140
|
+
if len(intents) >= 2:
|
|
141
|
+
first_confidence = intents[0].get(PREDICTED_CONFIDENCE_KEY, 1.0)
|
|
142
|
+
second_confidence = intents[1].get(PREDICTED_CONFIDENCE_KEY, 1.0)
|
|
143
|
+
difference = first_confidence - second_confidence
|
|
144
|
+
return (
|
|
145
|
+
difference < self.component_config[AMBIGUITY_THRESHOLD_KEY],
|
|
146
|
+
difference,
|
|
147
|
+
)
|
|
148
|
+
return False, None
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _fallback_intent(confidence: float) -> Dict[Text, Union[Text, float]]:
|
|
152
|
+
return {
|
|
153
|
+
INTENT_NAME_KEY: DEFAULT_NLU_FALLBACK_INTENT_NAME,
|
|
154
|
+
PREDICTED_CONFIDENCE_KEY: confidence,
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def is_fallback_classifier_prediction(prediction: Dict[Text, Any]) -> bool:
|
|
159
|
+
"""Checks if the intent was predicted by the `FallbackClassifier`.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
prediction: The prediction of the NLU model.
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
`True` if the top classified intent was the fallback intent.
|
|
166
|
+
"""
|
|
167
|
+
return (
|
|
168
|
+
prediction.get(INTENT, {}).get(INTENT_NAME_KEY)
|
|
169
|
+
== DEFAULT_NLU_FALLBACK_INTENT_NAME
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def undo_fallback_prediction(prediction: Dict[Text, Any]) -> Dict[Text, Any]:
|
|
174
|
+
"""Undo the prediction of the fallback intent.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
prediction: The prediction of the NLU model.
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
The prediction as if the `FallbackClassifier` wasn't present in the pipeline.
|
|
181
|
+
If the fallback intent is the only intent, return the prediction as it was
|
|
182
|
+
provided.
|
|
183
|
+
"""
|
|
184
|
+
intent_ranking = prediction.get(INTENT_RANKING_KEY, [])
|
|
185
|
+
if len(intent_ranking) < 2:
|
|
186
|
+
return prediction
|
|
187
|
+
|
|
188
|
+
prediction = copy.deepcopy(prediction)
|
|
189
|
+
prediction[INTENT] = intent_ranking[1]
|
|
190
|
+
prediction[INTENT_RANKING_KEY] = prediction[INTENT_RANKING_KEY][1:]
|
|
191
|
+
|
|
192
|
+
return prediction
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import logging
|
|
3
|
+
import re
|
|
4
|
+
from typing import Any, Dict, Optional, Text, List
|
|
5
|
+
|
|
6
|
+
from rasa.engine.graph import GraphComponent, ExecutionContext
|
|
7
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
8
|
+
from rasa.engine.storage.resource import Resource
|
|
9
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
10
|
+
from rasa.shared.constants import DOCS_URL_COMPONENTS
|
|
11
|
+
from rasa.nlu.classifiers.classifier import IntentClassifier
|
|
12
|
+
from rasa.shared.nlu.constants import (
|
|
13
|
+
INTENT,
|
|
14
|
+
TEXT,
|
|
15
|
+
INTENT_NAME_KEY,
|
|
16
|
+
PREDICTED_CONFIDENCE_KEY,
|
|
17
|
+
)
|
|
18
|
+
import rasa.shared.utils.io
|
|
19
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
20
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@DefaultV1Recipe.register(
|
|
26
|
+
DefaultV1Recipe.ComponentType.INTENT_CLASSIFIER, is_trainable=True
|
|
27
|
+
)
|
|
28
|
+
class KeywordIntentClassifier(GraphComponent, IntentClassifier):
|
|
29
|
+
"""Intent classifier using simple keyword matching.
|
|
30
|
+
|
|
31
|
+
The classifier takes a list of keywords and associated intents as an input.
|
|
32
|
+
An input sentence is checked for the keywords and the intent is returned.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
@staticmethod
|
|
36
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
37
|
+
"""The component's default config (see parent class for full docstring)."""
|
|
38
|
+
return {"case_sensitive": True}
|
|
39
|
+
|
|
40
|
+
def __init__(
|
|
41
|
+
self,
|
|
42
|
+
config: Dict[Text, Any],
|
|
43
|
+
model_storage: ModelStorage,
|
|
44
|
+
resource: Resource,
|
|
45
|
+
execution_context: ExecutionContext,
|
|
46
|
+
intent_keyword_map: Optional[Dict] = None,
|
|
47
|
+
) -> None:
|
|
48
|
+
"""Creates classifier."""
|
|
49
|
+
self.component_config = config
|
|
50
|
+
self._model_storage = model_storage
|
|
51
|
+
self._resource = resource
|
|
52
|
+
self._execution_context = execution_context
|
|
53
|
+
|
|
54
|
+
self.case_sensitive = self.component_config.get("case_sensitive")
|
|
55
|
+
self.intent_keyword_map = intent_keyword_map or {}
|
|
56
|
+
|
|
57
|
+
@classmethod
|
|
58
|
+
def create(
|
|
59
|
+
cls,
|
|
60
|
+
config: Dict[Text, Any],
|
|
61
|
+
model_storage: ModelStorage,
|
|
62
|
+
resource: Resource,
|
|
63
|
+
execution_context: ExecutionContext,
|
|
64
|
+
) -> KeywordIntentClassifier:
|
|
65
|
+
"""Creates a new untrained component (see parent class for full docstring)."""
|
|
66
|
+
return cls(config, model_storage, resource, execution_context)
|
|
67
|
+
|
|
68
|
+
def train(self, training_data: TrainingData) -> Resource:
|
|
69
|
+
"""Trains the intent classifier on a data set."""
|
|
70
|
+
duplicate_examples = set()
|
|
71
|
+
for ex in training_data.intent_examples:
|
|
72
|
+
if (
|
|
73
|
+
ex.get(TEXT) in self.intent_keyword_map.keys()
|
|
74
|
+
and ex.get(INTENT) != self.intent_keyword_map[ex.get(TEXT)]
|
|
75
|
+
):
|
|
76
|
+
duplicate_examples.add(ex.get(TEXT))
|
|
77
|
+
rasa.shared.utils.io.raise_warning(
|
|
78
|
+
f"Keyword '{ex.get(TEXT)}' is a keyword to trigger intent "
|
|
79
|
+
f"'{self.intent_keyword_map[ex.get(TEXT)]}' and also "
|
|
80
|
+
f"intent '{ex.get(INTENT)}', it will be removed "
|
|
81
|
+
f"from the list of keywords for both of them. "
|
|
82
|
+
f"Remove (one of) the duplicates from the training data.",
|
|
83
|
+
docs=DOCS_URL_COMPONENTS + "#keyword-intent-classifier",
|
|
84
|
+
)
|
|
85
|
+
else:
|
|
86
|
+
self.intent_keyword_map[ex.get(TEXT)] = ex.get(INTENT)
|
|
87
|
+
for keyword in duplicate_examples:
|
|
88
|
+
self.intent_keyword_map.pop(keyword)
|
|
89
|
+
logger.debug(
|
|
90
|
+
f"Removed '{keyword}' from the list of keywords because it was "
|
|
91
|
+
"a keyword for more than one intent."
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
self._validate_keyword_map()
|
|
95
|
+
self.persist()
|
|
96
|
+
return self._resource
|
|
97
|
+
|
|
98
|
+
def _validate_keyword_map(self) -> None:
|
|
99
|
+
re_flag = 0 if self.case_sensitive else re.IGNORECASE
|
|
100
|
+
|
|
101
|
+
ambiguous_mappings = []
|
|
102
|
+
for keyword1, intent1 in self.intent_keyword_map.items():
|
|
103
|
+
for keyword2, intent2 in self.intent_keyword_map.items():
|
|
104
|
+
if (
|
|
105
|
+
re.search(r"\b" + keyword1 + r"\b", keyword2, flags=re_flag)
|
|
106
|
+
and intent1 != intent2
|
|
107
|
+
):
|
|
108
|
+
ambiguous_mappings.append((intent1, keyword1))
|
|
109
|
+
rasa.shared.utils.io.raise_warning(
|
|
110
|
+
f"Keyword '{keyword1}' is a keyword of intent '{intent1}', "
|
|
111
|
+
f"but also a substring of '{keyword2}', which is a "
|
|
112
|
+
f"keyword of intent '{intent2}."
|
|
113
|
+
f" '{keyword1}' will be removed from the list of keywords.\n"
|
|
114
|
+
f"Remove (one of) the conflicting keywords from the"
|
|
115
|
+
f" training data.",
|
|
116
|
+
docs=DOCS_URL_COMPONENTS + "#keyword-intent-classifier",
|
|
117
|
+
)
|
|
118
|
+
for intent, keyword in ambiguous_mappings:
|
|
119
|
+
self.intent_keyword_map.pop(keyword)
|
|
120
|
+
logger.debug(
|
|
121
|
+
f"Removed keyword '{keyword}' from intent "
|
|
122
|
+
f"'{intent}' because it matched a "
|
|
123
|
+
f"keyword of another intent."
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
def process(self, messages: List[Message]) -> List[Message]:
|
|
127
|
+
"""Sets the message intent and add it to the output if it exists."""
|
|
128
|
+
for message in messages:
|
|
129
|
+
intent_name = self._map_keyword_to_intent(message.get(TEXT))
|
|
130
|
+
|
|
131
|
+
confidence = 0.0 if intent_name is None else 1.0
|
|
132
|
+
intent = {
|
|
133
|
+
INTENT_NAME_KEY: intent_name,
|
|
134
|
+
PREDICTED_CONFIDENCE_KEY: confidence,
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if message.get(INTENT) is None or intent_name is not None:
|
|
138
|
+
message.set(INTENT, intent, add_to_output=True)
|
|
139
|
+
|
|
140
|
+
return messages
|
|
141
|
+
|
|
142
|
+
def _map_keyword_to_intent(self, text: Text) -> Optional[Text]:
|
|
143
|
+
re_flag = 0 if self.case_sensitive else re.IGNORECASE
|
|
144
|
+
|
|
145
|
+
for keyword, intent in self.intent_keyword_map.items():
|
|
146
|
+
if re.search(r"\b" + keyword + r"\b", text, flags=re_flag):
|
|
147
|
+
logger.debug(
|
|
148
|
+
f"KeywordClassifier matched keyword '{keyword}' to"
|
|
149
|
+
f" intent '{intent}'."
|
|
150
|
+
)
|
|
151
|
+
return intent
|
|
152
|
+
|
|
153
|
+
logger.debug("KeywordClassifier did not find any keywords in the message.")
|
|
154
|
+
return None
|
|
155
|
+
|
|
156
|
+
def persist(self) -> None:
|
|
157
|
+
"""Persist this model into the passed directory."""
|
|
158
|
+
with self._model_storage.write_to(self._resource) as model_dir:
|
|
159
|
+
file_name = f"{self.__class__.__name__}.json"
|
|
160
|
+
keyword_file = model_dir / file_name
|
|
161
|
+
rasa.shared.utils.io.dump_obj_as_json_to_file(
|
|
162
|
+
keyword_file, self.intent_keyword_map
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
@classmethod
|
|
166
|
+
def load(
|
|
167
|
+
cls,
|
|
168
|
+
config: Dict[Text, Any],
|
|
169
|
+
model_storage: ModelStorage,
|
|
170
|
+
resource: Resource,
|
|
171
|
+
execution_context: ExecutionContext,
|
|
172
|
+
**kwargs: Any,
|
|
173
|
+
) -> KeywordIntentClassifier:
|
|
174
|
+
"""Loads trained component (see parent class for full docstring)."""
|
|
175
|
+
try:
|
|
176
|
+
with model_storage.read_from(resource) as model_dir:
|
|
177
|
+
keyword_file = model_dir / f"{cls.__name__}.json"
|
|
178
|
+
intent_keyword_map = rasa.shared.utils.io.read_json_file(keyword_file)
|
|
179
|
+
except ValueError:
|
|
180
|
+
logger.warning(
|
|
181
|
+
f"Failed to load {cls.__class__.__name__} from model storage. Resource "
|
|
182
|
+
f"'{resource.name}' doesn't exist."
|
|
183
|
+
)
|
|
184
|
+
intent_keyword_map = None
|
|
185
|
+
|
|
186
|
+
return cls(
|
|
187
|
+
config, model_storage, resource, execution_context, intent_keyword_map
|
|
188
|
+
)
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
from typing import Any, Text, Dict, List, Type, Tuple
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
from scipy.sparse import hstack, vstack, csr_matrix
|
|
5
|
+
from sklearn.exceptions import NotFittedError
|
|
6
|
+
from sklearn.linear_model import LogisticRegression
|
|
7
|
+
from sklearn.utils.validation import check_is_fitted
|
|
8
|
+
|
|
9
|
+
from rasa.engine.graph import ExecutionContext, GraphComponent
|
|
10
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
11
|
+
from rasa.engine.storage.resource import Resource
|
|
12
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
13
|
+
from rasa.nlu.classifiers import LABEL_RANKING_LENGTH
|
|
14
|
+
from rasa.nlu.classifiers.classifier import IntentClassifier
|
|
15
|
+
from rasa.nlu.featurizers.featurizer import Featurizer
|
|
16
|
+
from rasa.shared.nlu.constants import TEXT, INTENT
|
|
17
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
18
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
19
|
+
from rasa.utils.tensorflow.constants import RANKING_LENGTH
|
|
20
|
+
|
|
21
|
+
structlogger = structlog.get_logger()
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@DefaultV1Recipe.register(
|
|
25
|
+
DefaultV1Recipe.ComponentType.INTENT_CLASSIFIER, is_trainable=True
|
|
26
|
+
)
|
|
27
|
+
class LogisticRegressionClassifier(IntentClassifier, GraphComponent):
|
|
28
|
+
"""Intent classifier using the Logistic Regression."""
|
|
29
|
+
|
|
30
|
+
@classmethod
|
|
31
|
+
def required_components(cls) -> List[Type]:
|
|
32
|
+
"""Components that should be included in the pipeline before this component."""
|
|
33
|
+
return [Featurizer]
|
|
34
|
+
|
|
35
|
+
@staticmethod
|
|
36
|
+
def required_packages() -> List[Text]:
|
|
37
|
+
"""Any extra python dependencies required for this component to run."""
|
|
38
|
+
return ["sklearn"]
|
|
39
|
+
|
|
40
|
+
@staticmethod
|
|
41
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
42
|
+
"""The component's default config (see parent class for full docstring)."""
|
|
43
|
+
return {
|
|
44
|
+
"max_iter": 100,
|
|
45
|
+
"solver": "lbfgs",
|
|
46
|
+
"tol": 1e-4,
|
|
47
|
+
"random_state": 42,
|
|
48
|
+
RANKING_LENGTH: LABEL_RANKING_LENGTH,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
def __init__(
|
|
52
|
+
self,
|
|
53
|
+
config: Dict[Text, Any],
|
|
54
|
+
name: Text,
|
|
55
|
+
model_storage: ModelStorage,
|
|
56
|
+
resource: Resource,
|
|
57
|
+
) -> None:
|
|
58
|
+
"""Construct a new classifier."""
|
|
59
|
+
self.name = name
|
|
60
|
+
self.config = {**self.get_default_config(), **config}
|
|
61
|
+
self.clf = LogisticRegression(
|
|
62
|
+
solver=self.config["solver"],
|
|
63
|
+
max_iter=self.config["max_iter"],
|
|
64
|
+
class_weight="balanced",
|
|
65
|
+
tol=self.config["tol"],
|
|
66
|
+
random_state=self.config["random_state"],
|
|
67
|
+
# Added these parameters to ensure sklearn changes won't affect us.
|
|
68
|
+
# Should a sklearn update the defaults, we won't be affected.
|
|
69
|
+
dual=False,
|
|
70
|
+
fit_intercept=True,
|
|
71
|
+
intercept_scaling=1,
|
|
72
|
+
multi_class="auto",
|
|
73
|
+
verbose=0,
|
|
74
|
+
warm_start=False,
|
|
75
|
+
n_jobs=None,
|
|
76
|
+
l1_ratio=None,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
# We need to use these later when saving the trained component.
|
|
80
|
+
self._model_storage = model_storage
|
|
81
|
+
self._resource = resource
|
|
82
|
+
|
|
83
|
+
def _create_X(self, messages: List[Message]) -> csr_matrix:
|
|
84
|
+
"""This method creates a sparse X array that can be used for predicting."""
|
|
85
|
+
X = []
|
|
86
|
+
for e in messages:
|
|
87
|
+
# First element is sequence features, second is sentence features
|
|
88
|
+
sparse_feats = e.get_sparse_features(attribute=TEXT)[1]
|
|
89
|
+
# First element is sequence features, second is sentence features
|
|
90
|
+
dense_feats = e.get_dense_features(attribute=TEXT)[1]
|
|
91
|
+
together = hstack(
|
|
92
|
+
[
|
|
93
|
+
csr_matrix(sparse_feats.features if sparse_feats else []),
|
|
94
|
+
csr_matrix(dense_feats.features if dense_feats else []),
|
|
95
|
+
]
|
|
96
|
+
)
|
|
97
|
+
X.append(together)
|
|
98
|
+
return vstack(X)
|
|
99
|
+
|
|
100
|
+
def _create_training_matrix(
|
|
101
|
+
self, training_data: TrainingData
|
|
102
|
+
) -> Tuple[csr_matrix, List[str]]:
|
|
103
|
+
"""This method creates a scikit-learn compatible (X, y) training pairs."""
|
|
104
|
+
y = []
|
|
105
|
+
|
|
106
|
+
examples = [
|
|
107
|
+
e
|
|
108
|
+
for e in training_data.intent_examples
|
|
109
|
+
if (e.get("intent") and e.get("text"))
|
|
110
|
+
]
|
|
111
|
+
|
|
112
|
+
for e in examples:
|
|
113
|
+
y.append(e.get(INTENT))
|
|
114
|
+
|
|
115
|
+
return self._create_X(examples), y
|
|
116
|
+
|
|
117
|
+
def train(self, training_data: TrainingData) -> Resource:
|
|
118
|
+
"""Train the intent classifier on a data set."""
|
|
119
|
+
if not training_data.intent_examples:
|
|
120
|
+
structlogger.warning(
|
|
121
|
+
"logistic_regression_classifier.not_able_to_train",
|
|
122
|
+
event_info=(
|
|
123
|
+
f"Cannot train '{self.__class__.__name__}'. No data was provided. "
|
|
124
|
+
f"Skipping training of the classifier."
|
|
125
|
+
),
|
|
126
|
+
)
|
|
127
|
+
return self._resource
|
|
128
|
+
|
|
129
|
+
X, y = self._create_training_matrix(training_data)
|
|
130
|
+
if X.shape[0] == 0:
|
|
131
|
+
structlogger.debug(
|
|
132
|
+
"logistic_regression_classifier.not_able_to_train",
|
|
133
|
+
event_info=(
|
|
134
|
+
f"Cannot train '{self.__class__.__name__}'. No data was provided. "
|
|
135
|
+
f"Skipping training of the classifier."
|
|
136
|
+
),
|
|
137
|
+
)
|
|
138
|
+
return self._resource
|
|
139
|
+
|
|
140
|
+
self.clf.fit(X, y)
|
|
141
|
+
self.persist()
|
|
142
|
+
|
|
143
|
+
return self._resource
|
|
144
|
+
|
|
145
|
+
@classmethod
|
|
146
|
+
def create(
|
|
147
|
+
cls,
|
|
148
|
+
config: Dict[Text, Any],
|
|
149
|
+
model_storage: ModelStorage,
|
|
150
|
+
resource: Resource,
|
|
151
|
+
execution_context: ExecutionContext,
|
|
152
|
+
) -> "LogisticRegressionClassifier":
|
|
153
|
+
"""Creates a new untrained component (see parent class for full docstring)."""
|
|
154
|
+
return cls(config, execution_context.node_name, model_storage, resource)
|
|
155
|
+
|
|
156
|
+
def process(self, messages: List[Message]) -> List[Message]:
|
|
157
|
+
"""Return the most likely intent and its probability for a message."""
|
|
158
|
+
# Check if the classifier is trained
|
|
159
|
+
if not self.is_trained():
|
|
160
|
+
structlogger.warning(
|
|
161
|
+
"logistic_regression_classifier.not_trained.skip_intent_prediction",
|
|
162
|
+
event_info=(
|
|
163
|
+
f"The '{self.__class__.__name__}' is not trained. "
|
|
164
|
+
f"Skipping intent prediction."
|
|
165
|
+
),
|
|
166
|
+
)
|
|
167
|
+
return messages
|
|
168
|
+
|
|
169
|
+
X = self._create_X(messages)
|
|
170
|
+
probas = self.clf.predict_proba(X)
|
|
171
|
+
for idx, message in enumerate(messages):
|
|
172
|
+
intents = self.clf.classes_
|
|
173
|
+
intent_ranking = [
|
|
174
|
+
{"name": k, "confidence": v} for k, v in zip(intents, probas[idx])
|
|
175
|
+
]
|
|
176
|
+
sorted_ranking = sorted(intent_ranking, key=lambda e: -e["confidence"])
|
|
177
|
+
intent = sorted_ranking[0]
|
|
178
|
+
if self.config[RANKING_LENGTH] > 0:
|
|
179
|
+
sorted_ranking = sorted_ranking[: self.config[RANKING_LENGTH]]
|
|
180
|
+
message.set("intent", intent, add_to_output=True)
|
|
181
|
+
message.set("intent_ranking", sorted_ranking, add_to_output=True)
|
|
182
|
+
return messages
|
|
183
|
+
|
|
184
|
+
def persist(self) -> None:
|
|
185
|
+
"""Persist this model into the passed directory."""
|
|
186
|
+
import skops.io as sio
|
|
187
|
+
|
|
188
|
+
with self._model_storage.write_to(self._resource) as model_dir:
|
|
189
|
+
path = model_dir / f"{self._resource.name}.skops"
|
|
190
|
+
sio.dump(self.clf, path)
|
|
191
|
+
structlogger.debug(
|
|
192
|
+
"logistic_regression_classifier.persist",
|
|
193
|
+
event_info=f"Saved intent classifier to '{path}'.",
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
@classmethod
|
|
197
|
+
def load(
|
|
198
|
+
cls,
|
|
199
|
+
config: Dict[Text, Any],
|
|
200
|
+
model_storage: ModelStorage,
|
|
201
|
+
resource: Resource,
|
|
202
|
+
execution_context: ExecutionContext,
|
|
203
|
+
**kwargs: Any,
|
|
204
|
+
) -> "LogisticRegressionClassifier":
|
|
205
|
+
"""Loads trained component (see parent class for full docstring)."""
|
|
206
|
+
import skops.io as sio
|
|
207
|
+
|
|
208
|
+
try:
|
|
209
|
+
with model_storage.read_from(resource) as model_dir:
|
|
210
|
+
classifier_file = model_dir / f"{resource.name}.skops"
|
|
211
|
+
unknown_types = sio.get_untrusted_types(file=classifier_file)
|
|
212
|
+
|
|
213
|
+
if unknown_types:
|
|
214
|
+
structlogger.error(
|
|
215
|
+
f"Untrusted types found when loading {classifier_file}!",
|
|
216
|
+
unknown_types=unknown_types,
|
|
217
|
+
)
|
|
218
|
+
raise ValueError()
|
|
219
|
+
|
|
220
|
+
classifier = sio.load(classifier_file, trusted=unknown_types)
|
|
221
|
+
component = cls(
|
|
222
|
+
config, execution_context.node_name, model_storage, resource
|
|
223
|
+
)
|
|
224
|
+
component.clf = classifier
|
|
225
|
+
return component
|
|
226
|
+
except ValueError:
|
|
227
|
+
structlogger.debug(
|
|
228
|
+
"logistic_regression_classifier.load",
|
|
229
|
+
event_info=(
|
|
230
|
+
f"Failed to load {cls.__class__.__name__} from model storage. "
|
|
231
|
+
f"Resource '{resource.name}' doesn't exist."
|
|
232
|
+
),
|
|
233
|
+
)
|
|
234
|
+
return cls.create(config, model_storage, resource, execution_context)
|
|
235
|
+
|
|
236
|
+
def process_training_data(self, training_data: TrainingData) -> TrainingData:
|
|
237
|
+
"""Process the training data."""
|
|
238
|
+
self.process(training_data.training_examples)
|
|
239
|
+
return training_data
|
|
240
|
+
|
|
241
|
+
@classmethod
|
|
242
|
+
def validate_config(cls, config: Dict[Text, Any]) -> None:
|
|
243
|
+
"""Validates that the component is configured properly."""
|
|
244
|
+
pass
|
|
245
|
+
|
|
246
|
+
def is_trained(self) -> bool:
|
|
247
|
+
"""Checks if the model has been trained."""
|
|
248
|
+
try:
|
|
249
|
+
# This will raise a NotFittedError if the classifier isn't fitted
|
|
250
|
+
check_is_fitted(self.clf)
|
|
251
|
+
return True
|
|
252
|
+
except NotFittedError:
|
|
253
|
+
return False
|