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,156 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import logging
|
|
3
|
+
from rasa.nlu.featurizers.featurizer import Featurizer
|
|
4
|
+
import typing
|
|
5
|
+
from typing import Any, Dict, List, Optional, Text, Type
|
|
6
|
+
|
|
7
|
+
from rasa.engine.graph import ExecutionContext, GraphComponent
|
|
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.classifiers.classifier import IntentClassifier
|
|
12
|
+
from rasa.nlu.utils.mitie_utils import MitieModel, MitieNLP
|
|
13
|
+
from rasa.nlu.constants import TOKENS_NAMES
|
|
14
|
+
from rasa.shared.nlu.constants import TEXT, INTENT
|
|
15
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
16
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
17
|
+
|
|
18
|
+
if typing.TYPE_CHECKING:
|
|
19
|
+
import mitie
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@DefaultV1Recipe.register(
|
|
25
|
+
DefaultV1Recipe.ComponentType.INTENT_CLASSIFIER,
|
|
26
|
+
is_trainable=True,
|
|
27
|
+
model_from="MitieNLP",
|
|
28
|
+
)
|
|
29
|
+
class MitieIntentClassifier(GraphComponent, IntentClassifier):
|
|
30
|
+
"""Intent classifier which uses the `mitie` library."""
|
|
31
|
+
|
|
32
|
+
@classmethod
|
|
33
|
+
def required_components(cls) -> List[Type]:
|
|
34
|
+
"""Components that should be included in the pipeline before this component."""
|
|
35
|
+
return [MitieNLP, Featurizer]
|
|
36
|
+
|
|
37
|
+
@staticmethod
|
|
38
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
39
|
+
"""Returns default config (see parent class for full docstring)."""
|
|
40
|
+
return {"num_threads": 1}
|
|
41
|
+
|
|
42
|
+
def __init__(
|
|
43
|
+
self,
|
|
44
|
+
config: Dict[Text, Any],
|
|
45
|
+
model_storage: ModelStorage,
|
|
46
|
+
resource: Resource,
|
|
47
|
+
clf: Optional["mitie.text_categorizer"] = None,
|
|
48
|
+
) -> None:
|
|
49
|
+
"""Constructs a new intent classifier using the MITIE framework."""
|
|
50
|
+
self._config = config
|
|
51
|
+
self._model_storage = model_storage
|
|
52
|
+
self._resource = resource
|
|
53
|
+
self._clf = clf
|
|
54
|
+
|
|
55
|
+
@staticmethod
|
|
56
|
+
def required_packages() -> List[Text]:
|
|
57
|
+
"""Lists required dependencies (see parent class for full docstring)."""
|
|
58
|
+
return ["mitie"]
|
|
59
|
+
|
|
60
|
+
def train(self, training_data: TrainingData, model: MitieModel) -> Resource:
|
|
61
|
+
"""Trains classifier.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
training_data: The NLU training data.
|
|
65
|
+
model: The loaded mitie model provided by `MitieNLP`.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
The resource locator for the trained classifier.
|
|
69
|
+
"""
|
|
70
|
+
import mitie
|
|
71
|
+
|
|
72
|
+
trainer = mitie.text_categorizer_trainer(str(model.model_path))
|
|
73
|
+
trainer.num_threads = self._config["num_threads"]
|
|
74
|
+
|
|
75
|
+
for example in training_data.intent_examples:
|
|
76
|
+
tokens = self._tokens_of_message(example)
|
|
77
|
+
trainer.add_labeled_text(tokens, example.get(INTENT))
|
|
78
|
+
|
|
79
|
+
if training_data.intent_examples:
|
|
80
|
+
# we can not call train if there are no examples!
|
|
81
|
+
clf = trainer.train()
|
|
82
|
+
self._persist(clf)
|
|
83
|
+
|
|
84
|
+
return self._resource
|
|
85
|
+
|
|
86
|
+
def process(self, messages: List[Message], model: MitieModel) -> List[Message]:
|
|
87
|
+
"""Make intent predictions using `mitie`.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
messages: The message which the intents should be predicted for.
|
|
91
|
+
model: The loaded mitie model provided by `MitieNLP`.
|
|
92
|
+
"""
|
|
93
|
+
for message in messages:
|
|
94
|
+
if self._clf:
|
|
95
|
+
token_strs = self._tokens_of_message(message)
|
|
96
|
+
intent, confidence = self._clf(token_strs, model.word_feature_extractor)
|
|
97
|
+
else:
|
|
98
|
+
# either the model didn't get trained or it wasn't
|
|
99
|
+
# provided with any data
|
|
100
|
+
intent = None
|
|
101
|
+
confidence = 0.0
|
|
102
|
+
|
|
103
|
+
message.set(
|
|
104
|
+
"intent", {"name": intent, "confidence": confidence}, add_to_output=True
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
return messages
|
|
108
|
+
|
|
109
|
+
@staticmethod
|
|
110
|
+
def _tokens_of_message(message: Message) -> List[Text]:
|
|
111
|
+
return [token.text for token in message.get(TOKENS_NAMES[TEXT], [])]
|
|
112
|
+
|
|
113
|
+
@classmethod
|
|
114
|
+
def create(
|
|
115
|
+
cls,
|
|
116
|
+
config: Dict[Text, Any],
|
|
117
|
+
model_storage: ModelStorage,
|
|
118
|
+
resource: Resource,
|
|
119
|
+
execution_context: ExecutionContext,
|
|
120
|
+
) -> MitieIntentClassifier:
|
|
121
|
+
"""Creates component for training see parent class for full docstring)."""
|
|
122
|
+
return cls(config, model_storage, resource)
|
|
123
|
+
|
|
124
|
+
@classmethod
|
|
125
|
+
def load(
|
|
126
|
+
cls,
|
|
127
|
+
config: Dict[Text, Any],
|
|
128
|
+
model_storage: ModelStorage,
|
|
129
|
+
resource: Resource,
|
|
130
|
+
execution_context: ExecutionContext,
|
|
131
|
+
**kwargs: Any,
|
|
132
|
+
) -> MitieIntentClassifier:
|
|
133
|
+
"""Loads component for inference see parent class for full docstring)."""
|
|
134
|
+
import mitie
|
|
135
|
+
|
|
136
|
+
text_categorizer = None
|
|
137
|
+
|
|
138
|
+
try:
|
|
139
|
+
with model_storage.read_from(resource) as directory:
|
|
140
|
+
text_categorizer = mitie.text_categorizer(str(directory / "model.dat"))
|
|
141
|
+
except (
|
|
142
|
+
ValueError,
|
|
143
|
+
Exception,
|
|
144
|
+
): # the latter is thrown by the `mitie.text_categorizer`
|
|
145
|
+
logger.warning(
|
|
146
|
+
f"Failed to load {cls.__class__.__name__} from model storage. Resource "
|
|
147
|
+
f"'{resource.name}' doesn't exist."
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
return cls(config, model_storage, resource, text_categorizer)
|
|
151
|
+
|
|
152
|
+
def _persist(self, text_categorizer: "mitie.text_categorizer") -> None:
|
|
153
|
+
"""Persists trained model (see parent class for full docstring)."""
|
|
154
|
+
with self._model_storage.write_to(self._resource) as directory:
|
|
155
|
+
classifier_file = directory / "model.dat"
|
|
156
|
+
text_categorizer.save_to_disk(str(classifier_file), pure_model=True)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Any, Dict, Optional, Text, List
|
|
4
|
+
|
|
5
|
+
from rasa.engine.graph import GraphComponent, ExecutionContext
|
|
6
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
7
|
+
from rasa.engine.storage.resource import Resource
|
|
8
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
9
|
+
from rasa.nlu.extractors.extractor import EntityExtractorMixin
|
|
10
|
+
from rasa.shared.core.domain import Domain
|
|
11
|
+
from rasa.shared.core.training_data.story_reader.yaml_story_reader import (
|
|
12
|
+
YAMLStoryReader,
|
|
13
|
+
)
|
|
14
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@DefaultV1Recipe.register(
|
|
20
|
+
DefaultV1Recipe.ComponentType.INTENT_CLASSIFIER, is_trainable=False
|
|
21
|
+
)
|
|
22
|
+
class RegexMessageHandler(GraphComponent, EntityExtractorMixin):
|
|
23
|
+
"""Handles hardcoded NLU predictions from messages starting with a `/`."""
|
|
24
|
+
|
|
25
|
+
@classmethod
|
|
26
|
+
def create(
|
|
27
|
+
cls,
|
|
28
|
+
config: Dict[Text, Any],
|
|
29
|
+
model_storage: ModelStorage,
|
|
30
|
+
resource: Resource,
|
|
31
|
+
execution_context: ExecutionContext,
|
|
32
|
+
) -> RegexMessageHandler:
|
|
33
|
+
"""Creates a new untrained component (see parent class for full docstring)."""
|
|
34
|
+
return cls()
|
|
35
|
+
|
|
36
|
+
# TODO: Handle empty domain (NLU only training)
|
|
37
|
+
def process(
|
|
38
|
+
self, messages: List[Message], domain: Optional[Domain] = None
|
|
39
|
+
) -> List[Message]:
|
|
40
|
+
"""Adds hardcoded intents and entities for messages starting with '/'.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
messages: The messages which should be handled.
|
|
44
|
+
domain: If given the domain is used to check whether the intent, entities
|
|
45
|
+
valid.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
The messages with potentially intent and entity prediction replaced
|
|
49
|
+
in case the message started with a `/`.
|
|
50
|
+
"""
|
|
51
|
+
return [
|
|
52
|
+
YAMLStoryReader.unpack_regex_message(
|
|
53
|
+
message, domain, entity_extractor_name=self.name
|
|
54
|
+
)
|
|
55
|
+
for message in messages
|
|
56
|
+
]
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import typing
|
|
5
|
+
import warnings
|
|
6
|
+
from typing import Any, Dict, List, Optional, Text, Tuple, Type
|
|
7
|
+
|
|
8
|
+
import numpy as np
|
|
9
|
+
|
|
10
|
+
import rasa.shared.utils.io
|
|
11
|
+
from rasa.engine.graph import GraphComponent, ExecutionContext
|
|
12
|
+
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
|
|
13
|
+
from rasa.engine.storage.resource import Resource
|
|
14
|
+
from rasa.engine.storage.storage import ModelStorage
|
|
15
|
+
from rasa.nlu.classifiers import LABEL_RANKING_LENGTH
|
|
16
|
+
from rasa.nlu.classifiers.classifier import IntentClassifier
|
|
17
|
+
from rasa.nlu.featurizers.dense_featurizer.dense_featurizer import DenseFeaturizer
|
|
18
|
+
from rasa.shared.constants import DOCS_URL_TRAINING_DATA_NLU
|
|
19
|
+
from rasa.shared.exceptions import RasaException
|
|
20
|
+
from rasa.shared.nlu.constants import TEXT
|
|
21
|
+
from rasa.shared.nlu.training_data.message import Message
|
|
22
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
23
|
+
from rasa.utils.tensorflow.constants import FEATURIZERS
|
|
24
|
+
|
|
25
|
+
logger = logging.getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
if typing.TYPE_CHECKING:
|
|
28
|
+
import sklearn
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@DefaultV1Recipe.register(
|
|
32
|
+
DefaultV1Recipe.ComponentType.INTENT_CLASSIFIER, is_trainable=True
|
|
33
|
+
)
|
|
34
|
+
class SklearnIntentClassifier(GraphComponent, IntentClassifier):
|
|
35
|
+
"""Intent classifier using the sklearn framework."""
|
|
36
|
+
|
|
37
|
+
@classmethod
|
|
38
|
+
def required_components(cls) -> List[Type]:
|
|
39
|
+
"""Components that should be included in the pipeline before this component."""
|
|
40
|
+
return [DenseFeaturizer]
|
|
41
|
+
|
|
42
|
+
@staticmethod
|
|
43
|
+
def get_default_config() -> Dict[Text, Any]:
|
|
44
|
+
"""The component's default config (see parent class for full docstring)."""
|
|
45
|
+
return {
|
|
46
|
+
# C parameter of the svm - cross validation will select the best value
|
|
47
|
+
"C": [1, 2, 5, 10, 20, 100],
|
|
48
|
+
# gamma parameter of the svm
|
|
49
|
+
"gamma": [0.1],
|
|
50
|
+
# the kernels to use for the svm training - cross validation will
|
|
51
|
+
# decide which one of them performs best
|
|
52
|
+
"kernels": ["linear"],
|
|
53
|
+
# We try to find a good number of cross folds to use during
|
|
54
|
+
# intent training, this specifies the max number of folds
|
|
55
|
+
"max_cross_validation_folds": 5,
|
|
56
|
+
# Scoring function used for evaluating the hyper parameters
|
|
57
|
+
# This can be a name or a function (cfr GridSearchCV doc for more info)
|
|
58
|
+
"scoring_function": "f1_weighted",
|
|
59
|
+
"num_threads": 1,
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
def __init__(
|
|
63
|
+
self,
|
|
64
|
+
config: Dict[Text, Any],
|
|
65
|
+
model_storage: ModelStorage,
|
|
66
|
+
resource: Resource,
|
|
67
|
+
clf: Optional["sklearn.model_selection.GridSearchCV"] = None,
|
|
68
|
+
le: Optional["sklearn.preprocessing.LabelEncoder"] = None,
|
|
69
|
+
) -> None:
|
|
70
|
+
"""Construct a new intent classifier using the sklearn framework."""
|
|
71
|
+
from sklearn.preprocessing import LabelEncoder
|
|
72
|
+
|
|
73
|
+
self.component_config = config
|
|
74
|
+
self._model_storage = model_storage
|
|
75
|
+
self._resource = resource
|
|
76
|
+
|
|
77
|
+
if le is not None:
|
|
78
|
+
self.le = le
|
|
79
|
+
else:
|
|
80
|
+
self.le = LabelEncoder()
|
|
81
|
+
self.clf = clf
|
|
82
|
+
|
|
83
|
+
@classmethod
|
|
84
|
+
def create(
|
|
85
|
+
cls,
|
|
86
|
+
config: Dict[Text, Any],
|
|
87
|
+
model_storage: ModelStorage,
|
|
88
|
+
resource: Resource,
|
|
89
|
+
execution_context: ExecutionContext,
|
|
90
|
+
) -> SklearnIntentClassifier:
|
|
91
|
+
"""Creates a new untrained component (see parent class for full docstring)."""
|
|
92
|
+
return cls(config, model_storage, resource)
|
|
93
|
+
|
|
94
|
+
@staticmethod
|
|
95
|
+
def required_packages() -> List[Text]:
|
|
96
|
+
"""Any extra python dependencies required for this component to run."""
|
|
97
|
+
return ["sklearn"]
|
|
98
|
+
|
|
99
|
+
def transform_labels_str2num(self, labels: List[Text]) -> np.ndarray:
|
|
100
|
+
"""Transforms a list of strings into numeric label representation.
|
|
101
|
+
|
|
102
|
+
:param labels: List of labels to convert to numeric representation
|
|
103
|
+
"""
|
|
104
|
+
return self.le.fit_transform(labels)
|
|
105
|
+
|
|
106
|
+
def transform_labels_num2str(self, y: np.ndarray) -> np.ndarray:
|
|
107
|
+
"""Transforms a list of strings into numeric label representation.
|
|
108
|
+
|
|
109
|
+
:param y: List of labels to convert to numeric representation
|
|
110
|
+
"""
|
|
111
|
+
return self.le.inverse_transform(y)
|
|
112
|
+
|
|
113
|
+
def train(self, training_data: TrainingData) -> Resource:
|
|
114
|
+
"""Train the intent classifier on a data set."""
|
|
115
|
+
num_threads = self.component_config["num_threads"]
|
|
116
|
+
|
|
117
|
+
labels = [e.get("intent") for e in training_data.intent_examples]
|
|
118
|
+
|
|
119
|
+
if len(set(labels)) < 2:
|
|
120
|
+
rasa.shared.utils.io.raise_warning(
|
|
121
|
+
"Can not train an intent classifier as there are not "
|
|
122
|
+
"enough intents. Need at least 2 different intents. "
|
|
123
|
+
"Skipping training of intent classifier.",
|
|
124
|
+
docs=DOCS_URL_TRAINING_DATA_NLU,
|
|
125
|
+
)
|
|
126
|
+
return self._resource
|
|
127
|
+
|
|
128
|
+
y = self.transform_labels_str2num(labels)
|
|
129
|
+
training_examples = [
|
|
130
|
+
message
|
|
131
|
+
for message in training_data.intent_examples
|
|
132
|
+
if message.features_present(
|
|
133
|
+
attribute=TEXT, featurizers=self.component_config.get(FEATURIZERS)
|
|
134
|
+
)
|
|
135
|
+
]
|
|
136
|
+
X = np.stack(
|
|
137
|
+
[self._get_sentence_features(example) for example in training_examples]
|
|
138
|
+
)
|
|
139
|
+
# reduce dimensionality
|
|
140
|
+
X = np.reshape(X, (len(X), -1))
|
|
141
|
+
|
|
142
|
+
self.clf = self._create_classifier(num_threads, y)
|
|
143
|
+
|
|
144
|
+
with warnings.catch_warnings():
|
|
145
|
+
# sklearn raises lots of
|
|
146
|
+
# "UndefinedMetricWarning: F - score is ill - defined"
|
|
147
|
+
# if there are few intent examples, this is needed to prevent it
|
|
148
|
+
warnings.simplefilter("ignore")
|
|
149
|
+
self.clf.fit(X, y)
|
|
150
|
+
|
|
151
|
+
self.persist()
|
|
152
|
+
return self._resource
|
|
153
|
+
|
|
154
|
+
@staticmethod
|
|
155
|
+
def _get_sentence_features(message: Message) -> np.ndarray:
|
|
156
|
+
_, sentence_features = message.get_dense_features(TEXT)
|
|
157
|
+
if sentence_features is not None:
|
|
158
|
+
return sentence_features.features[0]
|
|
159
|
+
|
|
160
|
+
raise ValueError(
|
|
161
|
+
"No sentence features present. Not able to train sklearn policy."
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
def _num_cv_splits(self, y: np.ndarray) -> int:
|
|
165
|
+
folds = self.component_config["max_cross_validation_folds"]
|
|
166
|
+
return max(2, min(folds, np.min(np.bincount(y)) // 5))
|
|
167
|
+
|
|
168
|
+
def _create_classifier(
|
|
169
|
+
self, num_threads: int, y: np.ndarray
|
|
170
|
+
) -> "sklearn.model_selection.GridSearchCV":
|
|
171
|
+
from sklearn.model_selection import GridSearchCV
|
|
172
|
+
from sklearn.svm import SVC
|
|
173
|
+
|
|
174
|
+
C = self.component_config["C"]
|
|
175
|
+
kernels = self.component_config["kernels"]
|
|
176
|
+
gamma = self.component_config["gamma"]
|
|
177
|
+
# dirty str fix because sklearn is expecting
|
|
178
|
+
# str not instance of basestr...
|
|
179
|
+
tuned_parameters = [
|
|
180
|
+
{"C": C, "gamma": gamma, "kernel": [str(k) for k in kernels]}
|
|
181
|
+
]
|
|
182
|
+
|
|
183
|
+
# aim for 5 examples in each fold
|
|
184
|
+
|
|
185
|
+
cv_splits = self._num_cv_splits(y)
|
|
186
|
+
|
|
187
|
+
return GridSearchCV(
|
|
188
|
+
SVC(C=1, probability=True, class_weight="balanced"),
|
|
189
|
+
param_grid=tuned_parameters,
|
|
190
|
+
n_jobs=num_threads,
|
|
191
|
+
cv=cv_splits,
|
|
192
|
+
scoring=self.component_config["scoring_function"],
|
|
193
|
+
verbose=1,
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
def process(self, messages: List[Message]) -> List[Message]:
|
|
197
|
+
"""Return the most likely intent and its probability for a message."""
|
|
198
|
+
for message in messages:
|
|
199
|
+
if self.clf is None or not message.features_present(
|
|
200
|
+
attribute=TEXT, featurizers=self.component_config.get(FEATURIZERS)
|
|
201
|
+
):
|
|
202
|
+
# component is either not trained or didn't
|
|
203
|
+
# receive enough training data or the input doesn't
|
|
204
|
+
# have required features.
|
|
205
|
+
intent = None
|
|
206
|
+
intent_ranking = []
|
|
207
|
+
else:
|
|
208
|
+
X = self._get_sentence_features(message).reshape(1, -1)
|
|
209
|
+
|
|
210
|
+
intent_ids, probabilities = self.predict(X)
|
|
211
|
+
intents = self.transform_labels_num2str(np.ravel(intent_ids))
|
|
212
|
+
# `predict` returns a matrix as it is supposed
|
|
213
|
+
# to work for multiple examples as well, hence we need to flatten
|
|
214
|
+
probabilities = probabilities.flatten()
|
|
215
|
+
|
|
216
|
+
if intents.size > 0 and probabilities.size > 0:
|
|
217
|
+
ranking = list(zip(list(intents), list(probabilities)))[
|
|
218
|
+
:LABEL_RANKING_LENGTH
|
|
219
|
+
]
|
|
220
|
+
|
|
221
|
+
intent = {"name": intents[0], "confidence": probabilities[0]}
|
|
222
|
+
|
|
223
|
+
intent_ranking = [
|
|
224
|
+
{"name": intent_name, "confidence": score}
|
|
225
|
+
for intent_name, score in ranking
|
|
226
|
+
]
|
|
227
|
+
else:
|
|
228
|
+
intent = {"name": None, "confidence": 0.0}
|
|
229
|
+
intent_ranking = []
|
|
230
|
+
|
|
231
|
+
message.set("intent", intent, add_to_output=True)
|
|
232
|
+
message.set("intent_ranking", intent_ranking, add_to_output=True)
|
|
233
|
+
|
|
234
|
+
return messages
|
|
235
|
+
|
|
236
|
+
def predict_prob(self, X: np.ndarray) -> np.ndarray:
|
|
237
|
+
"""Given a bow vector of an input text, predict the intent label.
|
|
238
|
+
|
|
239
|
+
Return probabilities for all labels.
|
|
240
|
+
|
|
241
|
+
:param X: bow of input text
|
|
242
|
+
:return: vector of probabilities containing one entry for each label.
|
|
243
|
+
"""
|
|
244
|
+
if self.clf is None:
|
|
245
|
+
raise RasaException(
|
|
246
|
+
"Sklearn intent classifier has not been initialised and trained."
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
return self.clf.predict_proba(X)
|
|
250
|
+
|
|
251
|
+
def predict(self, X: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
|
|
252
|
+
"""Given a bow vector of an input text, predict most probable label.
|
|
253
|
+
|
|
254
|
+
Return only the most likely label.
|
|
255
|
+
|
|
256
|
+
:param X: bow of input text
|
|
257
|
+
:return: tuple of first, the most probable label and second,
|
|
258
|
+
its probability.
|
|
259
|
+
"""
|
|
260
|
+
pred_result = self.predict_prob(X)
|
|
261
|
+
# sort the probabilities retrieving the indices of
|
|
262
|
+
# the elements in sorted order
|
|
263
|
+
|
|
264
|
+
sorted_indices = np.fliplr(np.argsort(pred_result, axis=1))
|
|
265
|
+
return sorted_indices, pred_result[:, sorted_indices]
|
|
266
|
+
|
|
267
|
+
def persist(self) -> None:
|
|
268
|
+
"""Persist this model into the passed directory."""
|
|
269
|
+
import skops.io as sio
|
|
270
|
+
|
|
271
|
+
with self._model_storage.write_to(self._resource) as model_dir:
|
|
272
|
+
file_name = self.__class__.__name__
|
|
273
|
+
classifier_file_name = model_dir / f"{file_name}_classifier.skops"
|
|
274
|
+
encoder_file_name = model_dir / f"{file_name}_encoder.json"
|
|
275
|
+
|
|
276
|
+
if self.clf and self.le:
|
|
277
|
+
# convert self.le.classes_ (numpy array of strings) to a list in order
|
|
278
|
+
# to use json dump
|
|
279
|
+
rasa.shared.utils.io.dump_obj_as_json_to_file(
|
|
280
|
+
encoder_file_name, list(self.le.classes_)
|
|
281
|
+
)
|
|
282
|
+
sio.dump(self.clf.best_estimator_, classifier_file_name)
|
|
283
|
+
|
|
284
|
+
@classmethod
|
|
285
|
+
def load(
|
|
286
|
+
cls,
|
|
287
|
+
config: Dict[Text, Any],
|
|
288
|
+
model_storage: ModelStorage,
|
|
289
|
+
resource: Resource,
|
|
290
|
+
execution_context: ExecutionContext,
|
|
291
|
+
**kwargs: Any,
|
|
292
|
+
) -> SklearnIntentClassifier:
|
|
293
|
+
"""Loads trained component (see parent class for full docstring)."""
|
|
294
|
+
from sklearn.preprocessing import LabelEncoder
|
|
295
|
+
import skops.io as sio
|
|
296
|
+
|
|
297
|
+
try:
|
|
298
|
+
with model_storage.read_from(resource) as model_dir:
|
|
299
|
+
file_name = cls.__name__
|
|
300
|
+
classifier_file = model_dir / f"{file_name}_classifier.skops"
|
|
301
|
+
|
|
302
|
+
if classifier_file.exists():
|
|
303
|
+
unknown_types = sio.get_untrusted_types(file=classifier_file)
|
|
304
|
+
|
|
305
|
+
if unknown_types:
|
|
306
|
+
logger.error(
|
|
307
|
+
f"Untrusted types ({unknown_types}) found when "
|
|
308
|
+
f"loading {classifier_file}!"
|
|
309
|
+
)
|
|
310
|
+
raise ValueError()
|
|
311
|
+
else:
|
|
312
|
+
classifier = sio.load(classifier_file, trusted=unknown_types)
|
|
313
|
+
|
|
314
|
+
encoder_file = model_dir / f"{file_name}_encoder.json"
|
|
315
|
+
classes = rasa.shared.utils.io.read_json_file(encoder_file)
|
|
316
|
+
|
|
317
|
+
encoder = LabelEncoder()
|
|
318
|
+
intent_classifier = cls(
|
|
319
|
+
config, model_storage, resource, classifier, encoder
|
|
320
|
+
)
|
|
321
|
+
# convert list of strings (class labels) back to numpy array of
|
|
322
|
+
# strings
|
|
323
|
+
intent_classifier.transform_labels_str2num(classes)
|
|
324
|
+
return intent_classifier
|
|
325
|
+
except ValueError:
|
|
326
|
+
logger.debug(
|
|
327
|
+
f"Failed to load '{cls.__name__}' from model storage. Resource "
|
|
328
|
+
f"'{resource.name}' doesn't exist."
|
|
329
|
+
)
|
|
330
|
+
return cls(config, model_storage, resource)
|
rasa/nlu/constants.py
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import rasa.shared.nlu.constants
|
|
2
|
+
from rasa.shared.nlu.constants import ENTITY_ATTRIBUTE_CONFIDENCE
|
|
3
|
+
|
|
4
|
+
BILOU_ENTITIES = "bilou_entities"
|
|
5
|
+
BILOU_ENTITIES_ROLE = "bilou_entities_role"
|
|
6
|
+
BILOU_ENTITIES_GROUP = "bilou_entities_group"
|
|
7
|
+
|
|
8
|
+
ENTITY_ATTRIBUTE_CONFIDENCE_TYPE = (
|
|
9
|
+
f"{ENTITY_ATTRIBUTE_CONFIDENCE}_{rasa.shared.nlu.constants.ENTITY_ATTRIBUTE_TYPE}"
|
|
10
|
+
)
|
|
11
|
+
ENTITY_ATTRIBUTE_CONFIDENCE_GROUP = (
|
|
12
|
+
f"{ENTITY_ATTRIBUTE_CONFIDENCE}_{rasa.shared.nlu.constants.ENTITY_ATTRIBUTE_GROUP}"
|
|
13
|
+
)
|
|
14
|
+
ENTITY_ATTRIBUTE_CONFIDENCE_ROLE = (
|
|
15
|
+
f"{ENTITY_ATTRIBUTE_CONFIDENCE}_{rasa.shared.nlu.constants.ENTITY_ATTRIBUTE_ROLE}"
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
EXTRACTOR = "extractor"
|
|
19
|
+
|
|
20
|
+
PRETRAINED_EXTRACTORS = {"DucklingEntityExtractor", "SpacyEntityExtractor"}
|
|
21
|
+
|
|
22
|
+
NUMBER_OF_SUB_TOKENS = "number_of_sub_tokens"
|
|
23
|
+
|
|
24
|
+
MESSAGE_ATTRIBUTES = [
|
|
25
|
+
rasa.shared.nlu.constants.TEXT,
|
|
26
|
+
rasa.shared.nlu.constants.INTENT,
|
|
27
|
+
rasa.shared.nlu.constants.RESPONSE,
|
|
28
|
+
rasa.shared.nlu.constants.ACTION_NAME,
|
|
29
|
+
rasa.shared.nlu.constants.ACTION_TEXT,
|
|
30
|
+
rasa.shared.nlu.constants.INTENT_RESPONSE_KEY,
|
|
31
|
+
]
|
|
32
|
+
# the dense featurizable attributes are essentially text attributes
|
|
33
|
+
DENSE_FEATURIZABLE_ATTRIBUTES = [
|
|
34
|
+
rasa.shared.nlu.constants.TEXT,
|
|
35
|
+
rasa.shared.nlu.constants.RESPONSE,
|
|
36
|
+
rasa.shared.nlu.constants.ACTION_TEXT,
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
LANGUAGE_MODEL_DOCS = {
|
|
40
|
+
rasa.shared.nlu.constants.TEXT: "text_language_model_doc",
|
|
41
|
+
rasa.shared.nlu.constants.RESPONSE: "response_language_model_doc",
|
|
42
|
+
rasa.shared.nlu.constants.ACTION_TEXT: "action_text_model_doc",
|
|
43
|
+
}
|
|
44
|
+
SPACY_DOCS = {
|
|
45
|
+
rasa.shared.nlu.constants.TEXT: "text_spacy_doc",
|
|
46
|
+
rasa.shared.nlu.constants.RESPONSE: "response_spacy_doc",
|
|
47
|
+
rasa.shared.nlu.constants.ACTION_TEXT: "action_text_spacy_doc",
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
TOKENS_NAMES = {
|
|
51
|
+
rasa.shared.nlu.constants.TEXT: "text_tokens",
|
|
52
|
+
rasa.shared.nlu.constants.INTENT: "intent_tokens",
|
|
53
|
+
rasa.shared.nlu.constants.RESPONSE: "response_tokens",
|
|
54
|
+
rasa.shared.nlu.constants.ACTION_NAME: "action_name_tokens",
|
|
55
|
+
rasa.shared.nlu.constants.ACTION_TEXT: "action_text_tokens",
|
|
56
|
+
rasa.shared.nlu.constants.INTENT_RESPONSE_KEY: "intent_response_key_tokens",
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
SEQUENCE_FEATURES = "sequence_features"
|
|
60
|
+
SENTENCE_FEATURES = "sentence_features"
|
|
61
|
+
|
|
62
|
+
RESPONSE_SELECTOR_PROPERTY_NAME = "response_selector"
|
|
63
|
+
RESPONSE_SELECTOR_RETRIEVAL_INTENTS = "all_retrieval_intents"
|
|
64
|
+
RESPONSE_SELECTOR_DEFAULT_INTENT = "default"
|
|
65
|
+
RESPONSE_SELECTOR_PREDICTION_KEY = "response"
|
|
66
|
+
RESPONSE_SELECTOR_RANKING_KEY = "ranking"
|
|
67
|
+
RESPONSE_SELECTOR_RESPONSES_KEY = "responses"
|
|
68
|
+
RESPONSE_SELECTOR_RESPONSE_TEMPLATES_KEY = "response_templates"
|
|
69
|
+
RESPONSE_SELECTOR_UTTER_ACTION_KEY = "utter_action"
|
|
70
|
+
RESPONSE_SELECTOR_TEMPLATE_NAME_KEY = "template_name"
|
|
71
|
+
RESPONSE_IDENTIFIER_DELIMITER = "/"
|
|
72
|
+
|
|
73
|
+
DEFAULT_TRANSFORMER_SIZE = 256
|
|
74
|
+
|
|
75
|
+
FEATURIZER_CLASS_ALIAS = "alias"
|
|
76
|
+
|
|
77
|
+
NO_LENGTH_RESTRICTION = -1
|
rasa/nlu/convert.py
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from typing import Text, Union
|
|
3
|
+
|
|
4
|
+
from rasa.shared.nlu.training_data.formats.rasa_yaml import RasaYAMLWriter
|
|
5
|
+
from rasa.shared.utils.cli import print_error
|
|
6
|
+
import rasa.shared.nlu.training_data.loading
|
|
7
|
+
from rasa.nlu.utils import write_to_file
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def convert_training_data(
|
|
11
|
+
data_file: Union[list, Text], out_file: Text, output_format: Text, language: Text
|
|
12
|
+
) -> None:
|
|
13
|
+
"""Convert training data.
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
data_file (Union[list, Text]): Path to the file or directory
|
|
17
|
+
containing Rasa data.
|
|
18
|
+
out_file (Text): File or existing path where to save
|
|
19
|
+
training data in Rasa format.
|
|
20
|
+
output_format (Text): Output format the training data
|
|
21
|
+
should be converted into.
|
|
22
|
+
language (Text): Language of the data.
|
|
23
|
+
"""
|
|
24
|
+
if isinstance(data_file, list):
|
|
25
|
+
data_file = data_file[0]
|
|
26
|
+
|
|
27
|
+
if not os.path.exists(str(data_file)):
|
|
28
|
+
print_error(
|
|
29
|
+
"Data file '{}' does not exist. Provide a valid NLU data file using "
|
|
30
|
+
"the '--data' argument.".format(data_file)
|
|
31
|
+
)
|
|
32
|
+
return
|
|
33
|
+
|
|
34
|
+
td = rasa.shared.nlu.training_data.loading.load_data(data_file, language)
|
|
35
|
+
if output_format == "json":
|
|
36
|
+
output = td.nlu_as_json(indent=2)
|
|
37
|
+
else:
|
|
38
|
+
output = RasaYAMLWriter().dumps(td)
|
|
39
|
+
|
|
40
|
+
write_to_file(out_file, output)
|
|
File without changes
|