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,293 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import logging
|
|
3
|
+
from rasa.nlu.tokenizers.tokenizer import Tokenizer
|
|
4
|
+
import typing
|
|
5
|
+
from typing import Any, Dict, List, Optional, Text, Type
|
|
6
|
+
|
|
7
|
+
from rasa.engine.graph import GraphComponent, ExecutionContext
|
|
8
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
9
|
+
from rasa.engine.storage.resource import Resource
|
|
10
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
11
|
+
from rasa.nlu.constants import TOKENS_NAMES
|
|
12
|
+
from rasa.shared.nlu.constants import (
|
|
13
|
+
ENTITY_ATTRIBUTE_CONFIDENCE,
|
|
14
|
+
ENTITY_ATTRIBUTE_START,
|
|
15
|
+
ENTITY_ATTRIBUTE_END,
|
|
16
|
+
ENTITY_ATTRIBUTE_TYPE,
|
|
17
|
+
ENTITY_ATTRIBUTE_VALUE,
|
|
18
|
+
TEXT,
|
|
19
|
+
ENTITIES,
|
|
20
|
+
)
|
|
21
|
+
from rasa.nlu.utils.mitie_utils import MitieModel, MitieNLP
|
|
22
|
+
from rasa.nlu.extractors.extractor import EntityExtractorMixin
|
|
23
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
24
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
25
|
+
import rasa.shared.utils.io
|
|
26
|
+
from rasa.shared.exceptions import InvalidConfigException
|
|
27
|
+
|
|
28
|
+
logger = logging.getLogger(__name__)
|
|
29
|
+
|
|
30
|
+
if typing.TYPE_CHECKING:
|
|
31
|
+
import mitie
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@DefaultV1Recipe.register(
|
|
35
|
+
DefaultV1Recipe.ComponentType.ENTITY_EXTRACTOR,
|
|
36
|
+
is_trainable=True,
|
|
37
|
+
model_from="MitieNLP",
|
|
38
|
+
)
|
|
39
|
+
class MitieEntityExtractor(GraphComponent, EntityExtractorMixin):
|
|
40
|
+
"""A Mitie Entity Extractor (which is a thin wrapper around `Dlib-ml`)."""
|
|
41
|
+
|
|
42
|
+
MITIE_RESOURCE_FILE = "mitie_ner.dat"
|
|
43
|
+
|
|
44
|
+
@classmethod
|
|
45
|
+
def required_components(cls) -> List[Type]:
|
|
46
|
+
"""Components that should be included in the pipeline before this component."""
|
|
47
|
+
return [MitieNLP, Tokenizer]
|
|
48
|
+
|
|
49
|
+
@staticmethod
|
|
50
|
+
def required_packages() -> List[Text]:
|
|
51
|
+
"""Any extra python dependencies required for this component to run."""
|
|
52
|
+
return ["mitie"]
|
|
53
|
+
|
|
54
|
+
@staticmethod
|
|
55
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
56
|
+
"""The component's default config (see parent class for full docstring)."""
|
|
57
|
+
return {"num_threads": 1}
|
|
58
|
+
|
|
59
|
+
def __init__(
|
|
60
|
+
self,
|
|
61
|
+
config: Dict[Text, Any],
|
|
62
|
+
model_storage: ModelStorage,
|
|
63
|
+
resource: Resource,
|
|
64
|
+
ner: Optional["mitie.named_entity_extractor"] = None,
|
|
65
|
+
) -> None:
|
|
66
|
+
"""Creates a new instance.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
config: The configuration.
|
|
70
|
+
model_storage: Storage which graph components can use to persist and load
|
|
71
|
+
themselves.
|
|
72
|
+
resource: Resource locator for this component which can be used to persist
|
|
73
|
+
and load itself from the `model_storage`.
|
|
74
|
+
ner: Mitie named entity extractor
|
|
75
|
+
"""
|
|
76
|
+
self._config = config
|
|
77
|
+
self._model_storage = model_storage
|
|
78
|
+
self._resource = resource
|
|
79
|
+
self.validate_config(self._config)
|
|
80
|
+
self._ner = ner
|
|
81
|
+
|
|
82
|
+
def validate_config(cls, config: Dict[Text, Any]) -> None:
|
|
83
|
+
"""Checks whether the given configuration is valid.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
config: a configuration for a Mitie entity extractor component
|
|
87
|
+
"""
|
|
88
|
+
num_threads = config.get("num_threads")
|
|
89
|
+
if num_threads is None or num_threads <= 0:
|
|
90
|
+
raise InvalidConfigException(
|
|
91
|
+
f"Expected `num_threads` to be some value >= 1 (default: 1)."
|
|
92
|
+
f"but received {num_threads}"
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
@classmethod
|
|
96
|
+
def create(
|
|
97
|
+
cls,
|
|
98
|
+
config: Dict[Text, Any],
|
|
99
|
+
model_storage: ModelStorage,
|
|
100
|
+
resource: Resource,
|
|
101
|
+
execution_context: ExecutionContext,
|
|
102
|
+
) -> GraphComponent:
|
|
103
|
+
"""Creates a new `MitieEntityExtractor`.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
config: This config overrides the `default_config`.
|
|
107
|
+
model_storage: Storage which graph components can use to persist and load
|
|
108
|
+
themselves.
|
|
109
|
+
resource: Resource locator for this component which can be used to persist
|
|
110
|
+
and load itself from the `model_storage`.
|
|
111
|
+
execution_context: Information about the current graph run. Unused.
|
|
112
|
+
|
|
113
|
+
Returns: An instantiated `MitieEntityExtractor`.
|
|
114
|
+
"""
|
|
115
|
+
return cls(config, model_storage, resource)
|
|
116
|
+
|
|
117
|
+
def train(self, training_data: TrainingData, model: MitieModel) -> Resource:
|
|
118
|
+
"""Trains a MITIE named entity recognizer.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
training_data: the training data
|
|
122
|
+
model: a MitieModel
|
|
123
|
+
Returns:
|
|
124
|
+
resource for loading the trained model
|
|
125
|
+
"""
|
|
126
|
+
import mitie
|
|
127
|
+
|
|
128
|
+
trainer = mitie.ner_trainer(str(model.model_path))
|
|
129
|
+
trainer.num_threads = self._config["num_threads"]
|
|
130
|
+
|
|
131
|
+
# check whether there are any (not pre-trained) entities in the training data
|
|
132
|
+
found_one_entity = False
|
|
133
|
+
|
|
134
|
+
# filter out pre-trained entity examples
|
|
135
|
+
filtered_entity_examples = self.filter_trainable_entities(
|
|
136
|
+
training_data.nlu_examples
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
for example in filtered_entity_examples:
|
|
140
|
+
sample = self._prepare_mitie_sample(example)
|
|
141
|
+
|
|
142
|
+
found_one_entity = sample.num_entities > 0 or found_one_entity
|
|
143
|
+
trainer.add(sample)
|
|
144
|
+
|
|
145
|
+
# Mitie will fail to train if there is not a single entity tagged
|
|
146
|
+
if found_one_entity:
|
|
147
|
+
self._ner = trainer.train()
|
|
148
|
+
else:
|
|
149
|
+
rasa.shared.utils.io.raise_warning(
|
|
150
|
+
f"{self.__class__.__name__} could not be trained because no trainable "
|
|
151
|
+
f"entities where found in the given training data. Please add some "
|
|
152
|
+
f"NLU training examples that include entities where the `extractor` "
|
|
153
|
+
f"is either `None` or '{self.__class__.__name__}'."
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
self.persist()
|
|
157
|
+
return self._resource
|
|
158
|
+
|
|
159
|
+
@staticmethod
|
|
160
|
+
def _prepare_mitie_sample(training_example: Message) -> Any:
|
|
161
|
+
"""Prepare a message so that it can be passed to a MITIE trainer."""
|
|
162
|
+
import mitie
|
|
163
|
+
|
|
164
|
+
text = training_example.get(TEXT)
|
|
165
|
+
tokens = training_example.get(TOKENS_NAMES[TEXT])
|
|
166
|
+
sample = mitie.ner_training_instance([t.text for t in tokens])
|
|
167
|
+
for ent in training_example.get(ENTITIES, []):
|
|
168
|
+
try:
|
|
169
|
+
# if the token is not aligned an exception will be raised
|
|
170
|
+
start, end = MitieEntityExtractor.find_entity(ent, text, tokens)
|
|
171
|
+
except ValueError as e:
|
|
172
|
+
rasa.shared.utils.io.raise_warning(
|
|
173
|
+
f"Failed to use example '{text}' to train MITIE "
|
|
174
|
+
f"entity extractor. Example will be skipped."
|
|
175
|
+
f"Error: {e}"
|
|
176
|
+
)
|
|
177
|
+
continue
|
|
178
|
+
try:
|
|
179
|
+
# mitie will raise an exception on malicious
|
|
180
|
+
# input - e.g. on overlapping entities
|
|
181
|
+
sample.add_entity(list(range(start, end)), ent["entity"])
|
|
182
|
+
except Exception as e:
|
|
183
|
+
rasa.shared.utils.io.raise_warning(
|
|
184
|
+
f"Failed to add entity example "
|
|
185
|
+
f"'{e!s}' of sentence '{text!s}'. "
|
|
186
|
+
f"Example will be ignored. Reason: "
|
|
187
|
+
f"{e}"
|
|
188
|
+
)
|
|
189
|
+
continue
|
|
190
|
+
return sample
|
|
191
|
+
|
|
192
|
+
def process(self, messages: List[Message], model: MitieModel) -> List[Message]:
|
|
193
|
+
"""Extracts entities from messages and appends them to the attribute.
|
|
194
|
+
|
|
195
|
+
If no patterns where found during training, then the given messages will not
|
|
196
|
+
be modified. In particular, if no `ENTITIES` attribute exists yet, then
|
|
197
|
+
it will *not* be created.
|
|
198
|
+
|
|
199
|
+
If no pattern can be found in the given message, then no entities will be
|
|
200
|
+
added to any existing list of entities. However, if no `ENTITIES` attribute
|
|
201
|
+
exists yet, then an `ENTITIES` attribute will be created.
|
|
202
|
+
|
|
203
|
+
Returns:
|
|
204
|
+
the given list of messages that have been modified
|
|
205
|
+
"""
|
|
206
|
+
if not self._ner:
|
|
207
|
+
return messages
|
|
208
|
+
|
|
209
|
+
for message in messages:
|
|
210
|
+
entities = self._extract_entities(message, mitie_model=model)
|
|
211
|
+
extracted = self.add_extractor_name(entities)
|
|
212
|
+
message.set(
|
|
213
|
+
ENTITIES, message.get(ENTITIES, []) + extracted, add_to_output=True
|
|
214
|
+
)
|
|
215
|
+
return messages
|
|
216
|
+
|
|
217
|
+
def _extract_entities(
|
|
218
|
+
self, message: Message, mitie_model: MitieModel
|
|
219
|
+
) -> List[Dict[Text, Any]]:
|
|
220
|
+
"""Extract entities of the given type from the given user message.
|
|
221
|
+
|
|
222
|
+
Args:
|
|
223
|
+
message: a user message
|
|
224
|
+
mitie_model: MitieModel containing a `mitie.total_word_feature_extractor`
|
|
225
|
+
|
|
226
|
+
Returns:
|
|
227
|
+
a list of dictionaries describing the entities
|
|
228
|
+
"""
|
|
229
|
+
text = message.get(TEXT)
|
|
230
|
+
tokens = message.get(TOKENS_NAMES[TEXT])
|
|
231
|
+
|
|
232
|
+
entities = []
|
|
233
|
+
token_texts = [token.text for token in tokens]
|
|
234
|
+
if self._ner is None:
|
|
235
|
+
mitie_entities = []
|
|
236
|
+
else:
|
|
237
|
+
mitie_entities = self._ner.extract_entities(
|
|
238
|
+
token_texts, mitie_model.word_feature_extractor
|
|
239
|
+
)
|
|
240
|
+
for e in mitie_entities:
|
|
241
|
+
if len(e[0]):
|
|
242
|
+
start = tokens[e[0][0]].start
|
|
243
|
+
end = tokens[e[0][-1]].end
|
|
244
|
+
|
|
245
|
+
entities.append(
|
|
246
|
+
{
|
|
247
|
+
ENTITY_ATTRIBUTE_TYPE: e[1],
|
|
248
|
+
ENTITY_ATTRIBUTE_VALUE: text[start:end],
|
|
249
|
+
ENTITY_ATTRIBUTE_START: start,
|
|
250
|
+
ENTITY_ATTRIBUTE_END: end,
|
|
251
|
+
ENTITY_ATTRIBUTE_CONFIDENCE: None,
|
|
252
|
+
}
|
|
253
|
+
)
|
|
254
|
+
return entities
|
|
255
|
+
|
|
256
|
+
@classmethod
|
|
257
|
+
def load(
|
|
258
|
+
cls,
|
|
259
|
+
config: Dict[Text, Any],
|
|
260
|
+
model_storage: ModelStorage,
|
|
261
|
+
resource: Resource,
|
|
262
|
+
execution_context: ExecutionContext,
|
|
263
|
+
**kwargs: Any,
|
|
264
|
+
) -> MitieEntityExtractor:
|
|
265
|
+
"""Loads trained component (see parent class for full docstring)."""
|
|
266
|
+
import mitie
|
|
267
|
+
|
|
268
|
+
try:
|
|
269
|
+
with model_storage.read_from(resource) as model_path:
|
|
270
|
+
ner_file = model_path / cls.MITIE_RESOURCE_FILE
|
|
271
|
+
if not ner_file.exists():
|
|
272
|
+
raise FileNotFoundError(
|
|
273
|
+
f"Expected a MITIE extractor file at {ner_file}."
|
|
274
|
+
)
|
|
275
|
+
ner = mitie.named_entity_extractor(str(ner_file))
|
|
276
|
+
return cls(config, model_storage, resource, ner=ner)
|
|
277
|
+
|
|
278
|
+
except (FileNotFoundError, ValueError) as e:
|
|
279
|
+
logger.debug(
|
|
280
|
+
f"Failed to load {cls.__name__} from model storage. "
|
|
281
|
+
f"This can happen if the model could not be trained because regexes "
|
|
282
|
+
f"could not be extracted from the given training data - and hence "
|
|
283
|
+
f"could not be persisted. Error: {e}."
|
|
284
|
+
)
|
|
285
|
+
return cls(config, model_storage, resource)
|
|
286
|
+
|
|
287
|
+
def persist(self) -> None:
|
|
288
|
+
"""Persist this model."""
|
|
289
|
+
if not self._ner:
|
|
290
|
+
return
|
|
291
|
+
with self._model_storage.write_to(self._resource) as model_path:
|
|
292
|
+
ner_file = model_path / self.MITIE_RESOURCE_FILE
|
|
293
|
+
self._ner.save_to_disk(str(ner_file), pure_model=True)
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import logging
|
|
3
|
+
import re
|
|
4
|
+
from typing import Any, Dict, List, Optional, Text
|
|
5
|
+
|
|
6
|
+
from rasa.engine.graph import GraphComponent, ExecutionContext
|
|
7
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
8
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
9
|
+
from rasa.engine.storage.resource import Resource
|
|
10
|
+
import rasa.shared.utils.io
|
|
11
|
+
import rasa.nlu.utils.pattern_utils as pattern_utils
|
|
12
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
13
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
14
|
+
from rasa.shared.nlu.constants import (
|
|
15
|
+
ENTITIES,
|
|
16
|
+
ENTITY_ATTRIBUTE_VALUE,
|
|
17
|
+
ENTITY_ATTRIBUTE_START,
|
|
18
|
+
ENTITY_ATTRIBUTE_END,
|
|
19
|
+
TEXT,
|
|
20
|
+
ENTITY_ATTRIBUTE_TYPE,
|
|
21
|
+
)
|
|
22
|
+
from rasa.nlu.extractors.extractor import EntityExtractorMixin
|
|
23
|
+
|
|
24
|
+
logger = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@DefaultV1Recipe.register(
|
|
28
|
+
DefaultV1Recipe.ComponentType.ENTITY_EXTRACTOR, is_trainable=True
|
|
29
|
+
)
|
|
30
|
+
class RegexEntityExtractor(GraphComponent, EntityExtractorMixin):
|
|
31
|
+
"""Extracts entities via lookup tables and regexes defined in the training data."""
|
|
32
|
+
|
|
33
|
+
REGEX_FILE_NAME = "regex.json"
|
|
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 {
|
|
39
|
+
# text will be processed with case insensitive as default
|
|
40
|
+
"case_sensitive": False,
|
|
41
|
+
# use lookup tables to extract entities
|
|
42
|
+
"use_lookup_tables": True,
|
|
43
|
+
# use regexes to extract entities
|
|
44
|
+
"use_regexes": True,
|
|
45
|
+
# use match word boundaries for lookup table
|
|
46
|
+
"use_word_boundaries": True,
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
@classmethod
|
|
50
|
+
def create(
|
|
51
|
+
cls,
|
|
52
|
+
config: Dict[Text, Any],
|
|
53
|
+
model_storage: ModelStorage,
|
|
54
|
+
resource: Resource,
|
|
55
|
+
execution_context: ExecutionContext,
|
|
56
|
+
) -> RegexEntityExtractor:
|
|
57
|
+
"""Creates a new `GraphComponent`.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
config: This config overrides the `default_config`.
|
|
61
|
+
model_storage: Storage which graph components can use to persist and load
|
|
62
|
+
themselves.
|
|
63
|
+
resource: Resource locator for this component which can be used to persist
|
|
64
|
+
and load itself from the `model_storage`.
|
|
65
|
+
execution_context: Information about the current graph run. Unused.
|
|
66
|
+
|
|
67
|
+
Returns: An instantiated `GraphComponent`.
|
|
68
|
+
"""
|
|
69
|
+
return cls(config, model_storage, resource)
|
|
70
|
+
|
|
71
|
+
def __init__(
|
|
72
|
+
self,
|
|
73
|
+
config: Dict[Text, Any],
|
|
74
|
+
model_storage: ModelStorage,
|
|
75
|
+
resource: Resource,
|
|
76
|
+
patterns: Optional[List[Dict[Text, Text]]] = None,
|
|
77
|
+
) -> None:
|
|
78
|
+
"""Creates a new instance.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
config: The configuration.
|
|
82
|
+
model_storage: Storage which graph components can use to persist and load
|
|
83
|
+
themselves.
|
|
84
|
+
resource: Resource locator for this component which can be used to persist
|
|
85
|
+
and load itself from the `model_storage`.
|
|
86
|
+
patterns: a list of patterns
|
|
87
|
+
"""
|
|
88
|
+
# graph component
|
|
89
|
+
self._config = {**self.get_default_config(), **config}
|
|
90
|
+
self._model_storage = model_storage
|
|
91
|
+
self._resource = resource
|
|
92
|
+
# extractor
|
|
93
|
+
self.case_sensitive = self._config["case_sensitive"]
|
|
94
|
+
self.patterns = patterns or []
|
|
95
|
+
|
|
96
|
+
def train(self, training_data: TrainingData) -> Resource:
|
|
97
|
+
"""Extract patterns from the training data.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
training_data: the training data
|
|
101
|
+
"""
|
|
102
|
+
self.patterns = pattern_utils.extract_patterns(
|
|
103
|
+
training_data,
|
|
104
|
+
use_lookup_tables=self._config["use_lookup_tables"],
|
|
105
|
+
use_regexes=self._config["use_regexes"],
|
|
106
|
+
use_only_entities=True,
|
|
107
|
+
use_word_boundaries=self._config["use_word_boundaries"],
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
if not self.patterns:
|
|
111
|
+
rasa.shared.utils.io.raise_warning(
|
|
112
|
+
"No lookup tables or regexes defined in the training data that have "
|
|
113
|
+
"a name equal to any entity in the training data. In order for this "
|
|
114
|
+
"component to work you need to define valid lookup tables or regexes "
|
|
115
|
+
"in the training data."
|
|
116
|
+
)
|
|
117
|
+
self.persist()
|
|
118
|
+
return self._resource
|
|
119
|
+
|
|
120
|
+
def process(self, messages: List[Message]) -> List[Message]:
|
|
121
|
+
"""Extracts entities from messages and appends them to the attribute.
|
|
122
|
+
|
|
123
|
+
If no patterns where found during training, then the given messages will not
|
|
124
|
+
be modified. In particular, if no `ENTITIES` attribute exists yet, then
|
|
125
|
+
it will *not* be created.
|
|
126
|
+
|
|
127
|
+
If no pattern can be found in the given message, then no entities will be
|
|
128
|
+
added to any existing list of entities. However, if no `ENTITIES` attribute
|
|
129
|
+
exists yet, then an `ENTITIES` attribute will be created.
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
the given list of messages that have been modified
|
|
133
|
+
"""
|
|
134
|
+
if not self.patterns:
|
|
135
|
+
rasa.shared.utils.io.raise_warning(
|
|
136
|
+
f"The {self.__class__.__name__} has not been "
|
|
137
|
+
f"trained properly yet. "
|
|
138
|
+
f"Continuing without extracting entities via this extractor."
|
|
139
|
+
)
|
|
140
|
+
return messages
|
|
141
|
+
|
|
142
|
+
for message in messages:
|
|
143
|
+
extracted_entities = self._extract_entities(message)
|
|
144
|
+
extracted_entities = self.add_extractor_name(extracted_entities)
|
|
145
|
+
message.set(
|
|
146
|
+
ENTITIES,
|
|
147
|
+
message.get(ENTITIES, []) + extracted_entities,
|
|
148
|
+
add_to_output=True,
|
|
149
|
+
)
|
|
150
|
+
return messages
|
|
151
|
+
|
|
152
|
+
def _extract_entities(self, message: Message) -> List[Dict[Text, Any]]:
|
|
153
|
+
"""Extract entities of the given type from the given user message.
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
message: a message
|
|
157
|
+
Returns:
|
|
158
|
+
a list of dictionaries describing the entities
|
|
159
|
+
"""
|
|
160
|
+
entities = []
|
|
161
|
+
|
|
162
|
+
flags = 0 # default flag
|
|
163
|
+
if not self.case_sensitive:
|
|
164
|
+
flags = re.IGNORECASE
|
|
165
|
+
|
|
166
|
+
for pattern in self.patterns:
|
|
167
|
+
matches = re.finditer(pattern["pattern"], message.get(TEXT), flags=flags)
|
|
168
|
+
|
|
169
|
+
for match in matches:
|
|
170
|
+
start_index = match.start()
|
|
171
|
+
end_index = match.end()
|
|
172
|
+
entities.append(
|
|
173
|
+
{
|
|
174
|
+
ENTITY_ATTRIBUTE_TYPE: pattern["name"],
|
|
175
|
+
ENTITY_ATTRIBUTE_START: start_index,
|
|
176
|
+
ENTITY_ATTRIBUTE_END: end_index,
|
|
177
|
+
ENTITY_ATTRIBUTE_VALUE: message.get(TEXT)[
|
|
178
|
+
start_index:end_index
|
|
179
|
+
],
|
|
180
|
+
}
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
return entities
|
|
184
|
+
|
|
185
|
+
@classmethod
|
|
186
|
+
def load(
|
|
187
|
+
cls,
|
|
188
|
+
config: Dict[Text, Any],
|
|
189
|
+
model_storage: ModelStorage,
|
|
190
|
+
resource: Resource,
|
|
191
|
+
execution_context: ExecutionContext,
|
|
192
|
+
**kwargs: Any,
|
|
193
|
+
) -> RegexEntityExtractor:
|
|
194
|
+
"""Loads trained component (see parent class for full docstring)."""
|
|
195
|
+
try:
|
|
196
|
+
with model_storage.read_from(resource) as model_path:
|
|
197
|
+
regex_file = model_path / cls.REGEX_FILE_NAME
|
|
198
|
+
patterns = rasa.shared.utils.io.read_json_file(regex_file)
|
|
199
|
+
return cls(
|
|
200
|
+
config,
|
|
201
|
+
model_storage=model_storage,
|
|
202
|
+
resource=resource,
|
|
203
|
+
patterns=patterns,
|
|
204
|
+
)
|
|
205
|
+
except (ValueError, FileNotFoundError):
|
|
206
|
+
rasa.shared.utils.io.raise_warning(
|
|
207
|
+
f"Failed to load {cls.__name__} from model storage. "
|
|
208
|
+
f"This can happen if the model could not be trained because regexes "
|
|
209
|
+
f"could not be extracted from the given training data - and hence "
|
|
210
|
+
f"could not be persisted."
|
|
211
|
+
)
|
|
212
|
+
return cls(config, model_storage=model_storage, resource=resource)
|
|
213
|
+
|
|
214
|
+
def persist(self) -> None:
|
|
215
|
+
"""Persist this model."""
|
|
216
|
+
if not self.patterns:
|
|
217
|
+
return
|
|
218
|
+
with self._model_storage.write_to(self._resource) as model_path:
|
|
219
|
+
regex_file = model_path / self.REGEX_FILE_NAME
|
|
220
|
+
rasa.shared.utils.io.dump_obj_as_json_to_file(regex_file, self.patterns)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import typing
|
|
2
|
+
from typing import Any, Dict, List, Text, Type
|
|
3
|
+
|
|
4
|
+
from rasa.engine.graph import ExecutionContext, GraphComponent
|
|
5
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
6
|
+
from rasa.engine.storage.resource import Resource
|
|
7
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
8
|
+
from rasa.shared.nlu.constants import ENTITIES, TEXT
|
|
9
|
+
from rasa.nlu.utils.spacy_utils import SpacyModel, SpacyNLP
|
|
10
|
+
from rasa.nlu.extractors.extractor import EntityExtractorMixin
|
|
11
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
12
|
+
|
|
13
|
+
if typing.TYPE_CHECKING:
|
|
14
|
+
from spacy.tokens.doc import Doc
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@DefaultV1Recipe.register(
|
|
18
|
+
DefaultV1Recipe.ComponentType.ENTITY_EXTRACTOR,
|
|
19
|
+
is_trainable=False,
|
|
20
|
+
model_from="SpacyNLP",
|
|
21
|
+
)
|
|
22
|
+
class SpacyEntityExtractor(GraphComponent, EntityExtractorMixin):
|
|
23
|
+
"""Entity extractor which uses SpaCy."""
|
|
24
|
+
|
|
25
|
+
@classmethod
|
|
26
|
+
def required_components(cls) -> List[Type]:
|
|
27
|
+
"""Components that should be included in the pipeline before this component."""
|
|
28
|
+
return [SpacyNLP]
|
|
29
|
+
|
|
30
|
+
@staticmethod
|
|
31
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
32
|
+
"""The component's default config (see parent class for full docstring)."""
|
|
33
|
+
return {
|
|
34
|
+
# by default all dimensions recognized by spacy are returned
|
|
35
|
+
# dimensions can be configured to contain an array of strings
|
|
36
|
+
# with the names of the dimensions to filter for
|
|
37
|
+
"dimensions": None
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
def __init__(self, config: Dict[Text, Any]) -> None:
|
|
41
|
+
"""Initialize SpacyEntityExtractor."""
|
|
42
|
+
self._config = config
|
|
43
|
+
|
|
44
|
+
@classmethod
|
|
45
|
+
def create(
|
|
46
|
+
cls,
|
|
47
|
+
config: Dict[Text, Any],
|
|
48
|
+
model_storage: ModelStorage,
|
|
49
|
+
resource: Resource,
|
|
50
|
+
execution_context: ExecutionContext,
|
|
51
|
+
) -> GraphComponent:
|
|
52
|
+
"""Creates a new component (see parent class for full docstring)."""
|
|
53
|
+
return cls(config)
|
|
54
|
+
|
|
55
|
+
@staticmethod
|
|
56
|
+
def required_packages() -> List[Text]:
|
|
57
|
+
"""Lists required dependencies (see parent class for full docstring)."""
|
|
58
|
+
return ["spacy"]
|
|
59
|
+
|
|
60
|
+
def process(self, messages: List[Message], model: SpacyModel) -> List[Message]:
|
|
61
|
+
"""Extract entities using SpaCy.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
messages: List of messages to process.
|
|
65
|
+
model: Container holding a loaded spacy nlp model.
|
|
66
|
+
|
|
67
|
+
Returns: The processed messages.
|
|
68
|
+
"""
|
|
69
|
+
for message in messages:
|
|
70
|
+
# can't use the existing doc here (spacy_doc on the message)
|
|
71
|
+
# because tokens are lower cased which is bad for NER
|
|
72
|
+
spacy_nlp = model.model
|
|
73
|
+
doc = spacy_nlp(message.get(TEXT))
|
|
74
|
+
all_extracted = self.add_extractor_name(self._extract_entities(doc))
|
|
75
|
+
dimensions = self._config["dimensions"]
|
|
76
|
+
extracted = self.filter_irrelevant_entities(all_extracted, dimensions)
|
|
77
|
+
message.set(
|
|
78
|
+
ENTITIES, message.get(ENTITIES, []) + extracted, add_to_output=True
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
return messages
|
|
82
|
+
|
|
83
|
+
@staticmethod
|
|
84
|
+
def _extract_entities(doc: "Doc") -> List[Dict[Text, Any]]:
|
|
85
|
+
entities = [
|
|
86
|
+
{
|
|
87
|
+
"entity": ent.label_,
|
|
88
|
+
"value": ent.text,
|
|
89
|
+
"start": ent.start_char,
|
|
90
|
+
"confidence": None,
|
|
91
|
+
"end": ent.end_char,
|
|
92
|
+
}
|
|
93
|
+
for ent in doc.ents
|
|
94
|
+
]
|
|
95
|
+
return entities
|
|
File without changes
|
|
File without changes
|