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
|
File without changes
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import glob
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
5
|
+
import shutil
|
|
6
|
+
from typing import Any, Dict, List, Optional, Text
|
|
7
|
+
|
|
8
|
+
from rasa.engine.graph import ExecutionContext
|
|
9
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
10
|
+
from rasa.engine.storage.resource import Resource
|
|
11
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
12
|
+
|
|
13
|
+
from rasa.nlu.tokenizers.tokenizer import Token, Tokenizer
|
|
14
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
15
|
+
|
|
16
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@DefaultV1Recipe.register(
|
|
22
|
+
DefaultV1Recipe.ComponentType.MESSAGE_TOKENIZER, is_trainable=True
|
|
23
|
+
)
|
|
24
|
+
class JiebaTokenizer(Tokenizer):
|
|
25
|
+
"""This tokenizer is a wrapper for Jieba (https://github.com/fxsjy/jieba)."""
|
|
26
|
+
|
|
27
|
+
@staticmethod
|
|
28
|
+
def supported_languages() -> Optional[List[Text]]:
|
|
29
|
+
"""Supported languages (see parent class for full docstring)."""
|
|
30
|
+
return ["zh"]
|
|
31
|
+
|
|
32
|
+
@staticmethod
|
|
33
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
34
|
+
"""Returns default config (see parent class for full docstring)."""
|
|
35
|
+
return {
|
|
36
|
+
# default don't load custom dictionary
|
|
37
|
+
"dictionary_path": None,
|
|
38
|
+
# Flag to check whether to split intents
|
|
39
|
+
"intent_tokenization_flag": False,
|
|
40
|
+
# Symbol on which intent should be split
|
|
41
|
+
"intent_split_symbol": "_",
|
|
42
|
+
# Regular expression to detect tokens
|
|
43
|
+
"token_pattern": None,
|
|
44
|
+
# Symbol on which prefix should be split
|
|
45
|
+
"prefix_separator_symbol": None,
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
def __init__(
|
|
49
|
+
self, config: Dict[Text, Any], model_storage: ModelStorage, resource: Resource
|
|
50
|
+
) -> None:
|
|
51
|
+
"""Initialize the tokenizer."""
|
|
52
|
+
super().__init__(config)
|
|
53
|
+
self._model_storage = model_storage
|
|
54
|
+
self._resource = resource
|
|
55
|
+
|
|
56
|
+
@classmethod
|
|
57
|
+
def create(
|
|
58
|
+
cls,
|
|
59
|
+
config: Dict[Text, Any],
|
|
60
|
+
model_storage: ModelStorage,
|
|
61
|
+
resource: Resource,
|
|
62
|
+
execution_context: ExecutionContext,
|
|
63
|
+
) -> JiebaTokenizer:
|
|
64
|
+
"""Creates a new component (see parent class for full docstring)."""
|
|
65
|
+
# Path to the dictionaries on the local filesystem.
|
|
66
|
+
dictionary_path = config["dictionary_path"]
|
|
67
|
+
|
|
68
|
+
if dictionary_path is not None:
|
|
69
|
+
cls._load_custom_dictionary(dictionary_path)
|
|
70
|
+
return cls(config, model_storage, resource)
|
|
71
|
+
|
|
72
|
+
@staticmethod
|
|
73
|
+
def required_packages() -> List[Text]:
|
|
74
|
+
"""Any extra python dependencies required for this component to run."""
|
|
75
|
+
return ["jieba"]
|
|
76
|
+
|
|
77
|
+
@staticmethod
|
|
78
|
+
def _load_custom_dictionary(path: Text) -> None:
|
|
79
|
+
"""Load all the custom dictionaries stored in the path.
|
|
80
|
+
|
|
81
|
+
More information about the dictionaries file format can
|
|
82
|
+
be found in the documentation of jieba.
|
|
83
|
+
https://github.com/fxsjy/jieba#load-dictionary
|
|
84
|
+
"""
|
|
85
|
+
import jieba
|
|
86
|
+
|
|
87
|
+
jieba_userdicts = glob.glob(f"{path}/*")
|
|
88
|
+
for jieba_userdict in jieba_userdicts:
|
|
89
|
+
logger.info(f"Loading Jieba User Dictionary at {jieba_userdict}")
|
|
90
|
+
jieba.load_userdict(jieba_userdict)
|
|
91
|
+
|
|
92
|
+
def train(self, training_data: TrainingData) -> Resource:
|
|
93
|
+
"""Copies the dictionary to the model storage."""
|
|
94
|
+
self.persist()
|
|
95
|
+
return self._resource
|
|
96
|
+
|
|
97
|
+
def tokenize(self, message: Message, attribute: Text) -> List[Token]:
|
|
98
|
+
"""Tokenizes the text of the provided attribute of the incoming message."""
|
|
99
|
+
import jieba
|
|
100
|
+
|
|
101
|
+
text = message.get(attribute)
|
|
102
|
+
|
|
103
|
+
tokenized = jieba.tokenize(text)
|
|
104
|
+
tokens = [Token(word, start) for (word, start, end) in tokenized]
|
|
105
|
+
|
|
106
|
+
return self._apply_token_pattern(tokens)
|
|
107
|
+
|
|
108
|
+
@classmethod
|
|
109
|
+
def load(
|
|
110
|
+
cls,
|
|
111
|
+
config: Dict[Text, Any],
|
|
112
|
+
model_storage: ModelStorage,
|
|
113
|
+
resource: Resource,
|
|
114
|
+
execution_context: ExecutionContext,
|
|
115
|
+
**kwargs: Any,
|
|
116
|
+
) -> JiebaTokenizer:
|
|
117
|
+
"""Loads a custom dictionary from model storage."""
|
|
118
|
+
dictionary_path = config["dictionary_path"]
|
|
119
|
+
|
|
120
|
+
# If a custom dictionary path is in the config we know that it should have
|
|
121
|
+
# been saved to the model storage.
|
|
122
|
+
if dictionary_path is not None:
|
|
123
|
+
try:
|
|
124
|
+
with model_storage.read_from(resource) as resource_directory:
|
|
125
|
+
cls._load_custom_dictionary(str(resource_directory))
|
|
126
|
+
except ValueError:
|
|
127
|
+
logger.debug(
|
|
128
|
+
f"Failed to load {cls.__name__} from model storage. "
|
|
129
|
+
f"Resource '{resource.name}' doesn't exist."
|
|
130
|
+
)
|
|
131
|
+
return cls(config, model_storage, resource)
|
|
132
|
+
|
|
133
|
+
@staticmethod
|
|
134
|
+
def _copy_files_dir_to_dir(input_dir: Text, output_dir: Text) -> None:
|
|
135
|
+
# make sure target path exists
|
|
136
|
+
if not os.path.exists(output_dir):
|
|
137
|
+
os.makedirs(output_dir)
|
|
138
|
+
|
|
139
|
+
target_file_list = glob.glob(f"{input_dir}/*")
|
|
140
|
+
for target_file in target_file_list:
|
|
141
|
+
shutil.copy2(target_file, output_dir)
|
|
142
|
+
|
|
143
|
+
def persist(self) -> None:
|
|
144
|
+
"""Persist the custom dictionaries."""
|
|
145
|
+
dictionary_path = self._config["dictionary_path"]
|
|
146
|
+
if dictionary_path is not None:
|
|
147
|
+
with self._model_storage.write_to(self._resource) as resource_directory:
|
|
148
|
+
self._copy_files_dir_to_dir(dictionary_path, str(resource_directory))
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import List, Text, Dict, Any
|
|
3
|
+
|
|
4
|
+
from rasa.engine.graph import ExecutionContext
|
|
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.nlu.tokenizers.tokenizer import Token, Tokenizer
|
|
9
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
10
|
+
|
|
11
|
+
from rasa.shared.utils.io import DEFAULT_ENCODING
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@DefaultV1Recipe.register(
|
|
15
|
+
DefaultV1Recipe.ComponentType.MESSAGE_TOKENIZER, is_trainable=False
|
|
16
|
+
)
|
|
17
|
+
class MitieTokenizer(Tokenizer):
|
|
18
|
+
"""Tokenizes messages using the `mitie` library.."""
|
|
19
|
+
|
|
20
|
+
@staticmethod
|
|
21
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
22
|
+
"""Returns default config (see parent class for full docstring)."""
|
|
23
|
+
return {
|
|
24
|
+
# Flag to check whether to split intents
|
|
25
|
+
"intent_tokenization_flag": False,
|
|
26
|
+
# Symbol on which intent should be split
|
|
27
|
+
"intent_split_symbol": "_",
|
|
28
|
+
# Regular expression to detect tokens
|
|
29
|
+
"token_pattern": None,
|
|
30
|
+
# Symbol on which prefix should be split
|
|
31
|
+
"prefix_separator_symbol": None,
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@staticmethod
|
|
35
|
+
def required_packages() -> List[Text]:
|
|
36
|
+
"""Any extra python dependencies required for this component to run."""
|
|
37
|
+
return ["mitie"]
|
|
38
|
+
|
|
39
|
+
@classmethod
|
|
40
|
+
def create(
|
|
41
|
+
cls,
|
|
42
|
+
config: Dict[Text, Any],
|
|
43
|
+
model_storage: ModelStorage,
|
|
44
|
+
resource: Resource,
|
|
45
|
+
execution_context: ExecutionContext,
|
|
46
|
+
) -> MitieTokenizer:
|
|
47
|
+
"""Creates a new component (see parent class for full docstring)."""
|
|
48
|
+
return cls(config)
|
|
49
|
+
|
|
50
|
+
def tokenize(self, message: Message, attribute: Text) -> List[Token]:
|
|
51
|
+
"""Tokenizes the text of the provided attribute of the incoming message."""
|
|
52
|
+
import mitie
|
|
53
|
+
|
|
54
|
+
text = message.get(attribute)
|
|
55
|
+
|
|
56
|
+
encoded_sentence = text.encode(DEFAULT_ENCODING)
|
|
57
|
+
tokenized = mitie.tokenize_with_offsets(encoded_sentence)
|
|
58
|
+
tokens = [
|
|
59
|
+
self._token_from_offset(token, offset, encoded_sentence)
|
|
60
|
+
for token, offset in tokenized
|
|
61
|
+
]
|
|
62
|
+
|
|
63
|
+
return self._apply_token_pattern(tokens)
|
|
64
|
+
|
|
65
|
+
def _token_from_offset(
|
|
66
|
+
self, text: bytes, offset: int, encoded_sentence: bytes
|
|
67
|
+
) -> Token:
|
|
68
|
+
return Token(
|
|
69
|
+
text.decode(DEFAULT_ENCODING),
|
|
70
|
+
self._byte_to_char_offset(encoded_sentence, offset),
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
@staticmethod
|
|
74
|
+
def _byte_to_char_offset(text: bytes, byte_offset: int) -> int:
|
|
75
|
+
return len(text[:byte_offset].decode(DEFAULT_ENCODING))
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import typing
|
|
2
|
+
from typing import Dict, Text, List, Any, Optional, Type
|
|
3
|
+
|
|
4
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
5
|
+
from rasa.nlu.utils.spacy_utils import SpacyNLP
|
|
6
|
+
from rasa.nlu.tokenizers.tokenizer import Token, Tokenizer
|
|
7
|
+
from rasa.nlu.constants import SPACY_DOCS
|
|
8
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
9
|
+
|
|
10
|
+
if typing.TYPE_CHECKING:
|
|
11
|
+
from spacy.tokens.doc import Doc
|
|
12
|
+
|
|
13
|
+
POS_TAG_KEY = "pos"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@DefaultV1Recipe.register(
|
|
17
|
+
DefaultV1Recipe.ComponentType.MESSAGE_TOKENIZER, is_trainable=False
|
|
18
|
+
)
|
|
19
|
+
class SpacyTokenizer(Tokenizer):
|
|
20
|
+
"""Tokenizer that uses SpaCy."""
|
|
21
|
+
|
|
22
|
+
@classmethod
|
|
23
|
+
def required_components(cls) -> List[Type]:
|
|
24
|
+
"""Components that should be included in the pipeline before this component."""
|
|
25
|
+
return [SpacyNLP]
|
|
26
|
+
|
|
27
|
+
@staticmethod
|
|
28
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
29
|
+
"""The component's default config (see parent class for full docstring)."""
|
|
30
|
+
return {
|
|
31
|
+
# Flag to check whether to split intents
|
|
32
|
+
"intent_tokenization_flag": False,
|
|
33
|
+
# Symbol on which intent should be split
|
|
34
|
+
"intent_split_symbol": "_",
|
|
35
|
+
# Regular expression to detect tokens
|
|
36
|
+
"token_pattern": None,
|
|
37
|
+
# Symbol on which prefix should be split
|
|
38
|
+
"prefix_separator_symbol": None,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@staticmethod
|
|
42
|
+
def required_packages() -> List[Text]:
|
|
43
|
+
"""Any extra python dependencies required for this component to run."""
|
|
44
|
+
return ["spacy"]
|
|
45
|
+
|
|
46
|
+
def _get_doc(self, message: Message, attribute: Text) -> Optional["Doc"]:
|
|
47
|
+
return message.get(SPACY_DOCS[attribute])
|
|
48
|
+
|
|
49
|
+
def tokenize(self, message: Message, attribute: Text) -> List[Token]:
|
|
50
|
+
"""Tokenizes the text of the provided attribute of the incoming message."""
|
|
51
|
+
doc = self._get_doc(message, attribute)
|
|
52
|
+
if not doc:
|
|
53
|
+
return []
|
|
54
|
+
|
|
55
|
+
tokens = [
|
|
56
|
+
Token(
|
|
57
|
+
t.text, t.idx, lemma=t.lemma_, data={POS_TAG_KEY: self._tag_of_token(t)}
|
|
58
|
+
)
|
|
59
|
+
for t in doc
|
|
60
|
+
if t.text and t.text.strip()
|
|
61
|
+
]
|
|
62
|
+
|
|
63
|
+
return self._apply_token_pattern(tokens)
|
|
64
|
+
|
|
65
|
+
@staticmethod
|
|
66
|
+
def _tag_of_token(token: Any) -> Text:
|
|
67
|
+
import spacy
|
|
68
|
+
|
|
69
|
+
if spacy.about.__version__ > "2" and token._.has("tag"):
|
|
70
|
+
return token._.get("tag")
|
|
71
|
+
else:
|
|
72
|
+
return token.tag_
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
import logging
|
|
3
|
+
import re
|
|
4
|
+
|
|
5
|
+
from typing import Text, List, Dict, Any, Optional
|
|
6
|
+
|
|
7
|
+
from rasa.engine.graph import ExecutionContext, GraphComponent
|
|
8
|
+
from rasa.engine.storage.resource import Resource
|
|
9
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
10
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
11
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
12
|
+
from rasa.nlu.constants import TOKENS_NAMES, MESSAGE_ATTRIBUTES
|
|
13
|
+
from rasa.shared.nlu.constants import (
|
|
14
|
+
INTENT,
|
|
15
|
+
INTENT_RESPONSE_KEY,
|
|
16
|
+
RESPONSE_IDENTIFIER_DELIMITER,
|
|
17
|
+
ACTION_NAME,
|
|
18
|
+
)
|
|
19
|
+
import rasa.shared.utils.io
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class Token:
|
|
25
|
+
"""Used by `Tokenizers` which split a single message into multiple `Token`s."""
|
|
26
|
+
|
|
27
|
+
def __init__(
|
|
28
|
+
self,
|
|
29
|
+
text: Text,
|
|
30
|
+
start: int,
|
|
31
|
+
end: Optional[int] = None,
|
|
32
|
+
data: Optional[Dict[Text, Any]] = None,
|
|
33
|
+
lemma: Optional[Text] = None,
|
|
34
|
+
) -> None:
|
|
35
|
+
"""Create a `Token`.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
text: The token text.
|
|
39
|
+
start: The start index of the token within the entire message.
|
|
40
|
+
end: The end index of the token within the entire message.
|
|
41
|
+
data: Additional token data.
|
|
42
|
+
lemma: An optional lemmatized version of the token text.
|
|
43
|
+
"""
|
|
44
|
+
self.text = text
|
|
45
|
+
self.start = start
|
|
46
|
+
self.end = end if end else start + len(text)
|
|
47
|
+
|
|
48
|
+
self.data = data if data else {}
|
|
49
|
+
self.lemma = lemma or text
|
|
50
|
+
|
|
51
|
+
def set(self, prop: Text, info: Any) -> None:
|
|
52
|
+
"""Set property value."""
|
|
53
|
+
self.data[prop] = info
|
|
54
|
+
|
|
55
|
+
def get(self, prop: Text, default: Optional[Any] = None) -> Any:
|
|
56
|
+
"""Returns token value."""
|
|
57
|
+
return self.data.get(prop, default)
|
|
58
|
+
|
|
59
|
+
def __eq__(self, other: Any) -> bool:
|
|
60
|
+
if not isinstance(other, Token):
|
|
61
|
+
return NotImplemented
|
|
62
|
+
return (self.start, self.end, self.text, self.lemma) == (
|
|
63
|
+
other.start,
|
|
64
|
+
other.end,
|
|
65
|
+
other.text,
|
|
66
|
+
other.lemma,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
def __lt__(self, other: Any) -> bool:
|
|
70
|
+
if not isinstance(other, Token):
|
|
71
|
+
return NotImplemented
|
|
72
|
+
return (self.start, self.end, self.text, self.lemma) < (
|
|
73
|
+
other.start,
|
|
74
|
+
other.end,
|
|
75
|
+
other.text,
|
|
76
|
+
other.lemma,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
def __repr__(self) -> Text:
|
|
80
|
+
return f"<Token object value='{self.text}' start={self.start} end={self.end} \
|
|
81
|
+
at {hex(id(self))}>"
|
|
82
|
+
|
|
83
|
+
def fingerprint(self) -> Text:
|
|
84
|
+
"""Returns a stable hash for this Token."""
|
|
85
|
+
return rasa.shared.utils.io.deep_container_fingerprint(
|
|
86
|
+
[self.text, self.start, self.end, self.lemma, self.data]
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class Tokenizer(GraphComponent, abc.ABC):
|
|
91
|
+
"""Base class for tokenizers."""
|
|
92
|
+
|
|
93
|
+
def __init__(self, config: Dict[Text, Any]) -> None:
|
|
94
|
+
"""Construct a new tokenizer."""
|
|
95
|
+
self._config = config
|
|
96
|
+
# flag to check whether to split intents
|
|
97
|
+
self.intent_tokenization_flag = config["intent_tokenization_flag"]
|
|
98
|
+
# split symbol for intents
|
|
99
|
+
self.intent_split_symbol = config["intent_split_symbol"]
|
|
100
|
+
# token pattern to further split tokens
|
|
101
|
+
token_pattern = config.get("token_pattern")
|
|
102
|
+
self.token_pattern_regex = None
|
|
103
|
+
if token_pattern:
|
|
104
|
+
self.token_pattern_regex = re.compile(token_pattern)
|
|
105
|
+
# split intent to prefix and suffix greedily, None means don't split
|
|
106
|
+
self.prefix_separator_symbol = config.get("prefix_separator_symbol")
|
|
107
|
+
|
|
108
|
+
@classmethod
|
|
109
|
+
def create(
|
|
110
|
+
cls,
|
|
111
|
+
config: Dict[Text, Any],
|
|
112
|
+
model_storage: ModelStorage,
|
|
113
|
+
resource: Resource,
|
|
114
|
+
execution_context: ExecutionContext,
|
|
115
|
+
) -> GraphComponent:
|
|
116
|
+
"""Creates a new component (see parent class for full docstring)."""
|
|
117
|
+
return cls(config)
|
|
118
|
+
|
|
119
|
+
@abc.abstractmethod
|
|
120
|
+
def tokenize(self, message: Message, attribute: Text) -> List[Token]:
|
|
121
|
+
"""Tokenizes the text of the provided attribute of the incoming message."""
|
|
122
|
+
...
|
|
123
|
+
|
|
124
|
+
def process_training_data(self, training_data: TrainingData) -> TrainingData:
|
|
125
|
+
"""Tokenize all training data."""
|
|
126
|
+
for example in training_data.training_examples:
|
|
127
|
+
for attribute in MESSAGE_ATTRIBUTES:
|
|
128
|
+
if (
|
|
129
|
+
example.get(attribute) is not None
|
|
130
|
+
and not example.get(attribute) == ""
|
|
131
|
+
):
|
|
132
|
+
if attribute in [INTENT, ACTION_NAME, INTENT_RESPONSE_KEY]:
|
|
133
|
+
tokens = self._split_name(example, attribute)
|
|
134
|
+
else:
|
|
135
|
+
tokens = self.tokenize(example, attribute)
|
|
136
|
+
example.set(TOKENS_NAMES[attribute], tokens)
|
|
137
|
+
return training_data
|
|
138
|
+
|
|
139
|
+
def process(self, messages: List[Message]) -> List[Message]:
|
|
140
|
+
"""Tokenize the incoming messages."""
|
|
141
|
+
for message in messages:
|
|
142
|
+
for attribute in MESSAGE_ATTRIBUTES:
|
|
143
|
+
if isinstance(message.get(attribute), str):
|
|
144
|
+
if attribute in [
|
|
145
|
+
INTENT,
|
|
146
|
+
ACTION_NAME,
|
|
147
|
+
RESPONSE_IDENTIFIER_DELIMITER,
|
|
148
|
+
]:
|
|
149
|
+
tokens = self._split_name(message, attribute)
|
|
150
|
+
else:
|
|
151
|
+
tokens = self.tokenize(message, attribute)
|
|
152
|
+
|
|
153
|
+
message.set(TOKENS_NAMES[attribute], tokens)
|
|
154
|
+
return messages
|
|
155
|
+
|
|
156
|
+
def _tokenize_on_split_symbol(self, text: Text) -> List[Text]:
|
|
157
|
+
words = (
|
|
158
|
+
text.split(self.intent_split_symbol)
|
|
159
|
+
if self.intent_tokenization_flag
|
|
160
|
+
else [text]
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
return words
|
|
164
|
+
|
|
165
|
+
def _split_name(self, message: Message, attribute: Text = INTENT) -> List[Token]:
|
|
166
|
+
orig_text = message.get(attribute)
|
|
167
|
+
|
|
168
|
+
if (
|
|
169
|
+
self.prefix_separator_symbol is not None
|
|
170
|
+
and self.prefix_separator_symbol in orig_text
|
|
171
|
+
):
|
|
172
|
+
prefix, text = orig_text.split(self.prefix_separator_symbol, maxsplit=1)
|
|
173
|
+
else:
|
|
174
|
+
prefix, text = None, orig_text
|
|
175
|
+
|
|
176
|
+
# for INTENT_RESPONSE_KEY attribute,
|
|
177
|
+
# first split by RESPONSE_IDENTIFIER_DELIMITER
|
|
178
|
+
if attribute == INTENT_RESPONSE_KEY:
|
|
179
|
+
intent, response_key = text.split(RESPONSE_IDENTIFIER_DELIMITER)
|
|
180
|
+
words = self._tokenize_on_split_symbol(
|
|
181
|
+
intent
|
|
182
|
+
) + self._tokenize_on_split_symbol(response_key)
|
|
183
|
+
|
|
184
|
+
else:
|
|
185
|
+
words = self._tokenize_on_split_symbol(text)
|
|
186
|
+
|
|
187
|
+
if prefix is not None:
|
|
188
|
+
words = self._tokenize_on_split_symbol(prefix) + words
|
|
189
|
+
|
|
190
|
+
return self._convert_words_to_tokens(words, orig_text)
|
|
191
|
+
|
|
192
|
+
def _apply_token_pattern(self, tokens: List[Token]) -> List[Token]:
|
|
193
|
+
"""Apply the token pattern to the given tokens.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
tokens: list of tokens to split
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
List of tokens.
|
|
200
|
+
"""
|
|
201
|
+
if not self.token_pattern_regex:
|
|
202
|
+
return tokens
|
|
203
|
+
|
|
204
|
+
final_tokens = []
|
|
205
|
+
for token in tokens:
|
|
206
|
+
new_tokens = self.token_pattern_regex.findall(token.text)
|
|
207
|
+
new_tokens = [t for t in new_tokens if t]
|
|
208
|
+
|
|
209
|
+
if not new_tokens:
|
|
210
|
+
final_tokens.append(token)
|
|
211
|
+
|
|
212
|
+
running_offset = 0
|
|
213
|
+
for new_token in new_tokens:
|
|
214
|
+
word_offset = token.text.index(new_token, running_offset)
|
|
215
|
+
word_len = len(new_token)
|
|
216
|
+
running_offset = word_offset + word_len
|
|
217
|
+
final_tokens.append(
|
|
218
|
+
Token(
|
|
219
|
+
new_token,
|
|
220
|
+
token.start + word_offset,
|
|
221
|
+
data=token.data,
|
|
222
|
+
lemma=token.lemma,
|
|
223
|
+
)
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
return final_tokens
|
|
227
|
+
|
|
228
|
+
@staticmethod
|
|
229
|
+
def _convert_words_to_tokens(words: List[Text], text: Text) -> List[Token]:
|
|
230
|
+
running_offset = 0
|
|
231
|
+
tokens = []
|
|
232
|
+
|
|
233
|
+
for word in words:
|
|
234
|
+
word_offset = text.index(word, running_offset)
|
|
235
|
+
word_len = len(word)
|
|
236
|
+
running_offset = word_offset + word_len
|
|
237
|
+
tokens.append(Token(word, word_offset))
|
|
238
|
+
|
|
239
|
+
return tokens
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import Any, Dict, List, Optional, Text
|
|
3
|
+
|
|
4
|
+
import regex
|
|
5
|
+
|
|
6
|
+
import rasa.shared.utils.io
|
|
7
|
+
import rasa.utils.io
|
|
8
|
+
|
|
9
|
+
from rasa.engine.graph import ExecutionContext
|
|
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.tokenizers.tokenizer import Token, Tokenizer
|
|
14
|
+
from rasa.shared.constants import DOCS_URL_COMPONENTS
|
|
15
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@DefaultV1Recipe.register(
|
|
19
|
+
DefaultV1Recipe.ComponentType.MESSAGE_TOKENIZER, is_trainable=False
|
|
20
|
+
)
|
|
21
|
+
class WhitespaceTokenizer(Tokenizer):
|
|
22
|
+
"""Creates features for entity extraction."""
|
|
23
|
+
|
|
24
|
+
@staticmethod
|
|
25
|
+
def not_supported_languages() -> Optional[List[Text]]:
|
|
26
|
+
"""The languages that are not supported."""
|
|
27
|
+
return ["zh", "ja", "th"]
|
|
28
|
+
|
|
29
|
+
@staticmethod
|
|
30
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
31
|
+
"""Returns the component's default config."""
|
|
32
|
+
return {
|
|
33
|
+
# Flag to check whether to split intents
|
|
34
|
+
"intent_tokenization_flag": False,
|
|
35
|
+
# Symbol on which intent should be split
|
|
36
|
+
"intent_split_symbol": "_",
|
|
37
|
+
# Regular expression to detect tokens
|
|
38
|
+
"token_pattern": None,
|
|
39
|
+
# Symbol on which prefix should be split
|
|
40
|
+
"prefix_separator_symbol": None,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
def __init__(self, config: Dict[Text, Any]) -> None:
|
|
44
|
+
"""Initialize the tokenizer."""
|
|
45
|
+
super().__init__(config)
|
|
46
|
+
if "case_sensitive" in self._config:
|
|
47
|
+
rasa.shared.utils.io.raise_warning(
|
|
48
|
+
"The option 'case_sensitive' was moved from the tokenizers to the "
|
|
49
|
+
"featurizers.",
|
|
50
|
+
docs=DOCS_URL_COMPONENTS,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
@classmethod
|
|
54
|
+
def create(
|
|
55
|
+
cls,
|
|
56
|
+
config: Dict[Text, Any],
|
|
57
|
+
model_storage: ModelStorage,
|
|
58
|
+
resource: Resource,
|
|
59
|
+
execution_context: ExecutionContext,
|
|
60
|
+
) -> WhitespaceTokenizer:
|
|
61
|
+
"""Creates a new component (see parent class for full docstring)."""
|
|
62
|
+
# Path to the dictionaries on the local filesystem.
|
|
63
|
+
return cls(config)
|
|
64
|
+
|
|
65
|
+
def tokenize(self, message: Message, attribute: Text) -> List[Token]:
|
|
66
|
+
original_text = message.get(attribute)
|
|
67
|
+
text = rasa.utils.io.remove_emojis(original_text)
|
|
68
|
+
# we need to use regex instead of re, because of
|
|
69
|
+
# https://stackoverflow.com/questions/12746458/python-unicode-regular-expression-matching-failing-with-some-unicode-characters
|
|
70
|
+
|
|
71
|
+
# remove 'not a word character' if
|
|
72
|
+
words = regex.sub(
|
|
73
|
+
# there is a space or an end of a string after it
|
|
74
|
+
r"[^\w#@&]+(?=\s|$)|"
|
|
75
|
+
# there is a space or beginning of a string before it
|
|
76
|
+
# not followed by a number
|
|
77
|
+
r"(\s|^)[^\w#@&]+(?=[^0-9\s])|"
|
|
78
|
+
# not in between numbers and not . or @ or & or - or #
|
|
79
|
+
# e.g. 10'000.00 or blabla@gmail.com
|
|
80
|
+
# and not url characters
|
|
81
|
+
r"(?<=[^0-9\s])[^\w._~:/?#\[\]()@!$&*+,;=-]+(?=[^0-9\s])",
|
|
82
|
+
" ",
|
|
83
|
+
text,
|
|
84
|
+
).split()
|
|
85
|
+
|
|
86
|
+
words = [w for w in words if w]
|
|
87
|
+
|
|
88
|
+
# if we removed everything like smiles `:)`, use the whole text as 1 token
|
|
89
|
+
if not words:
|
|
90
|
+
text = original_text
|
|
91
|
+
words = [text]
|
|
92
|
+
|
|
93
|
+
tokens = self._convert_words_to_tokens(words, text)
|
|
94
|
+
|
|
95
|
+
return self._apply_token_pattern(tokens)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from typing import Any, Text
|
|
2
|
+
|
|
3
|
+
import rasa.shared.utils.io
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def write_json_to_file(filename: Text, obj: Any, **kwargs: Any) -> None:
|
|
7
|
+
"""Write an object as a json string to a file."""
|
|
8
|
+
write_to_file(filename, rasa.shared.utils.io.json_to_string(obj, **kwargs))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def write_to_file(filename: Text, text: Any) -> None:
|
|
12
|
+
"""Write a text to a file."""
|
|
13
|
+
rasa.shared.utils.io.write_text_file(str(text), filename)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def is_url(resource_name: Text) -> bool:
|
|
17
|
+
"""Check whether the url specified is a well formed one.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
resource_name: Remote URL to validate
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
`True` if valid, otherwise `False`.
|
|
24
|
+
"""
|
|
25
|
+
from urllib import parse
|
|
26
|
+
|
|
27
|
+
try:
|
|
28
|
+
result = parse.urlparse(resource_name)
|
|
29
|
+
except Exception:
|
|
30
|
+
return False
|
|
31
|
+
|
|
32
|
+
if result.scheme == "file":
|
|
33
|
+
return bool(result.path)
|
|
34
|
+
|
|
35
|
+
return bool(result.scheme in ["http", "https", "ftp", "ftps"] and result.netloc)
|