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
rasa/model_service.py
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from sanic import Sanic
|
|
4
|
+
import structlog
|
|
5
|
+
|
|
6
|
+
from rasa.cli.scaffold import print_error_and_exit
|
|
7
|
+
from rasa.core.persistor import RemoteStorageType, get_persistor
|
|
8
|
+
from rasa.core.utils import list_routes
|
|
9
|
+
from rasa.model_manager import model_api
|
|
10
|
+
from rasa.model_manager import config
|
|
11
|
+
from rasa.model_manager.config import SERVER_BASE_URL, SERVER_PORT
|
|
12
|
+
from rasa.utils.common import configure_logging_and_warnings
|
|
13
|
+
import rasa.utils.licensing
|
|
14
|
+
from urllib.parse import urlparse
|
|
15
|
+
|
|
16
|
+
from rasa.utils.log_utils import configure_structlog
|
|
17
|
+
from rasa.utils.sanic_error_handler import register_custom_sanic_error_handler
|
|
18
|
+
|
|
19
|
+
structlogger = structlog.get_logger()
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def url_prefix_from_base_url() -> str:
|
|
23
|
+
"""Return the path prefix from the base URL."""
|
|
24
|
+
# return path without any trailing slashes
|
|
25
|
+
prefix = urlparse(SERVER_BASE_URL).path.rstrip("/") if SERVER_BASE_URL else ""
|
|
26
|
+
|
|
27
|
+
# can't be empty
|
|
28
|
+
return prefix or config.DEFAULT_SERVER_PATH_PREFIX
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def validate_model_storage_type() -> None:
|
|
32
|
+
"""Validate the storage type if remote storage is used for models."""
|
|
33
|
+
if config.SERVER_MODEL_REMOTE_STORAGE:
|
|
34
|
+
if config.SERVER_MODEL_REMOTE_STORAGE not in RemoteStorageType.list():
|
|
35
|
+
print_error_and_exit(
|
|
36
|
+
f"Invalid storage type '{config.SERVER_MODEL_REMOTE_STORAGE}'. "
|
|
37
|
+
f"Supported storage types: {', '.join(RemoteStorageType.list())}."
|
|
38
|
+
f"Alternatively, unset the remote storage type to store models locally."
|
|
39
|
+
)
|
|
40
|
+
else:
|
|
41
|
+
structlogger.info(
|
|
42
|
+
"model_api.storage.remote_storage_enabled",
|
|
43
|
+
remote_storage=config.SERVER_MODEL_REMOTE_STORAGE,
|
|
44
|
+
)
|
|
45
|
+
# try to create a client to validate the configuration
|
|
46
|
+
get_persistor(config.SERVER_MODEL_REMOTE_STORAGE)
|
|
47
|
+
else:
|
|
48
|
+
structlogger.info(
|
|
49
|
+
"model_api.storage.local_storage_enabled",
|
|
50
|
+
base_path=config.SERVER_BASE_WORKING_DIRECTORY,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _register_update_task(app: Sanic) -> None:
|
|
55
|
+
app.add_task(
|
|
56
|
+
model_api.continuously_update_process_status,
|
|
57
|
+
name="continuously_update_process_status",
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def main() -> None:
|
|
62
|
+
"""Start the Rasa Model Manager server.
|
|
63
|
+
|
|
64
|
+
The API server can receive requests to train models, run bots, and manage
|
|
65
|
+
the lifecycle of models and bots.
|
|
66
|
+
"""
|
|
67
|
+
log_level = logging.DEBUG
|
|
68
|
+
configure_logging_and_warnings(
|
|
69
|
+
log_level=log_level,
|
|
70
|
+
logging_config_file=None,
|
|
71
|
+
warn_only_once=True,
|
|
72
|
+
filter_repeated_logs=True,
|
|
73
|
+
)
|
|
74
|
+
configure_structlog(log_level, include_time=True)
|
|
75
|
+
|
|
76
|
+
rasa.utils.licensing.validate_license_from_env()
|
|
77
|
+
|
|
78
|
+
try:
|
|
79
|
+
model_api.prepare_working_directories()
|
|
80
|
+
except Exception as e:
|
|
81
|
+
structlogger.error(
|
|
82
|
+
"model_api.prepare_directories.failed",
|
|
83
|
+
error=str(e),
|
|
84
|
+
base_directory=config.SERVER_BASE_WORKING_DIRECTORY,
|
|
85
|
+
)
|
|
86
|
+
print_error_and_exit(
|
|
87
|
+
f"Failed to create working directories. Please make sure the "
|
|
88
|
+
f"server base directory at '{config.SERVER_BASE_WORKING_DIRECTORY}' "
|
|
89
|
+
f"is writable by the current user."
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
validate_model_storage_type()
|
|
93
|
+
|
|
94
|
+
structlogger.debug("model_api.starting_server", port=SERVER_PORT)
|
|
95
|
+
|
|
96
|
+
url_prefix = url_prefix_from_base_url()
|
|
97
|
+
# configure the sanic application
|
|
98
|
+
app = Sanic("RasaModelService")
|
|
99
|
+
app.after_server_start(_register_update_task)
|
|
100
|
+
app.blueprint(model_api.external_blueprint(), url_prefix=url_prefix)
|
|
101
|
+
app.blueprint(model_api.internal_blueprint())
|
|
102
|
+
|
|
103
|
+
# list all routes
|
|
104
|
+
list_routes(app)
|
|
105
|
+
|
|
106
|
+
register_custom_sanic_error_handler(app)
|
|
107
|
+
|
|
108
|
+
app.run(host="0.0.0.0", port=SERVER_PORT, legacy=True, motd=False)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
if __name__ == "__main__":
|
|
112
|
+
main()
|
rasa/model_testing.py
ADDED
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
import copy
|
|
2
|
+
import logging
|
|
3
|
+
import os
|
|
4
|
+
from typing import (
|
|
5
|
+
Text,
|
|
6
|
+
Dict,
|
|
7
|
+
Optional,
|
|
8
|
+
List,
|
|
9
|
+
Any,
|
|
10
|
+
Iterable,
|
|
11
|
+
Tuple,
|
|
12
|
+
Union,
|
|
13
|
+
)
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
from rasa.core.agent import Agent
|
|
17
|
+
from rasa.engine.storage.local_model_storage import LocalModelStorage
|
|
18
|
+
import rasa.shared.utils.cli
|
|
19
|
+
import rasa.shared.utils.common
|
|
20
|
+
import rasa.shared.utils.io
|
|
21
|
+
import rasa.utils.common
|
|
22
|
+
from rasa.constants import RESULTS_FILE, NUMBER_OF_TRAINING_STORIES_FILE
|
|
23
|
+
from rasa.exceptions import ModelNotFound
|
|
24
|
+
from rasa.shared.constants import DEFAULT_RESULTS_PATH
|
|
25
|
+
import rasa.shared.nlu.training_data.loading
|
|
26
|
+
from rasa.shared.data import TrainingType
|
|
27
|
+
from rasa.shared.nlu.training_data.training_data import TrainingData
|
|
28
|
+
import rasa.model
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
logger = logging.getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class ClassificationReportException(Exception):
|
|
35
|
+
"""Raised when clf_report doesn't correctly set accuracy and/or micro avg.
|
|
36
|
+
|
|
37
|
+
sklearn.metrics.classification_report should provide either accuracy or micro avg.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
async def test_core_models_in_directory(
|
|
42
|
+
model_directory: Text,
|
|
43
|
+
stories: Text,
|
|
44
|
+
output: Text,
|
|
45
|
+
use_conversation_test_files: bool = False,
|
|
46
|
+
) -> None:
|
|
47
|
+
"""Evaluates a directory with multiple Core models using test data.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
model_directory: Directory containing multiple model files.
|
|
51
|
+
stories: Path to a conversation test file.
|
|
52
|
+
output: Output directory to store results to.
|
|
53
|
+
use_conversation_test_files: `True` if conversation test files should be used
|
|
54
|
+
for testing instead of regular Core story files.
|
|
55
|
+
"""
|
|
56
|
+
from rasa.core.test import compare_models_in_dir
|
|
57
|
+
|
|
58
|
+
model_directory = _get_sanitized_model_directory(model_directory)
|
|
59
|
+
|
|
60
|
+
await compare_models_in_dir(
|
|
61
|
+
model_directory,
|
|
62
|
+
stories,
|
|
63
|
+
output,
|
|
64
|
+
use_conversation_test_files=use_conversation_test_files,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
story_n_path = os.path.join(model_directory, NUMBER_OF_TRAINING_STORIES_FILE)
|
|
68
|
+
number_of_stories = rasa.shared.utils.io.read_json_file(story_n_path)
|
|
69
|
+
plot_core_results(output, number_of_stories)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def plot_core_results(output_directory: Text, number_of_examples: List[int]) -> None:
|
|
73
|
+
"""Plot core model comparison graph.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
output_directory: path to the output directory
|
|
77
|
+
number_of_examples: number of examples per run
|
|
78
|
+
"""
|
|
79
|
+
import rasa.utils.plotting as plotting_utils
|
|
80
|
+
|
|
81
|
+
graph_path = os.path.join(output_directory, "core_model_comparison_graph.pdf")
|
|
82
|
+
|
|
83
|
+
plotting_utils.plot_curve(
|
|
84
|
+
output_directory,
|
|
85
|
+
number_of_examples,
|
|
86
|
+
x_label_text="Number of stories present during training",
|
|
87
|
+
y_label_text="Number of correct test stories",
|
|
88
|
+
graph_path=graph_path,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _get_sanitized_model_directory(model_directory: Text) -> Text:
|
|
93
|
+
"""Adjusts the `--model` argument of `rasa test core` when called with
|
|
94
|
+
`--evaluate-model-directory`.
|
|
95
|
+
|
|
96
|
+
By default rasa uses the latest model for the `--model` parameter. However, for
|
|
97
|
+
`--evaluate-model-directory` we need a directory. This function checks if the
|
|
98
|
+
passed parameter is a model or an individual model file.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
model_directory: The model_directory argument that was given to
|
|
102
|
+
`test_core_models_in_directory`.
|
|
103
|
+
|
|
104
|
+
Returns: The adjusted model_directory that should be used in
|
|
105
|
+
`test_core_models_in_directory`.
|
|
106
|
+
"""
|
|
107
|
+
p = Path(model_directory)
|
|
108
|
+
if p.is_file():
|
|
109
|
+
if model_directory != rasa.model.get_latest_model():
|
|
110
|
+
rasa.shared.utils.cli.print_warning(
|
|
111
|
+
"You passed a file as '--model'. Will use the directory containing "
|
|
112
|
+
"this file instead."
|
|
113
|
+
)
|
|
114
|
+
model_directory = str(p.parent)
|
|
115
|
+
|
|
116
|
+
return model_directory
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
async def test_core_models(
|
|
120
|
+
models: List[Text],
|
|
121
|
+
stories: Text,
|
|
122
|
+
output: Text,
|
|
123
|
+
use_conversation_test_files: bool = False,
|
|
124
|
+
) -> None:
|
|
125
|
+
"""Compares multiple Core models based on test data.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
models: A list of models files.
|
|
129
|
+
stories: Path to test data.
|
|
130
|
+
output: Path to output directory for test results.
|
|
131
|
+
use_conversation_test_files: `True` if conversation test files should be used
|
|
132
|
+
for testing instead of regular Core story files.
|
|
133
|
+
"""
|
|
134
|
+
from rasa.core.test import compare_models
|
|
135
|
+
|
|
136
|
+
await compare_models(
|
|
137
|
+
models, stories, output, use_conversation_test_files=use_conversation_test_files
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
async def test_core(
|
|
142
|
+
model: Optional[Text] = None,
|
|
143
|
+
stories: Optional[Text] = None,
|
|
144
|
+
output: Text = DEFAULT_RESULTS_PATH,
|
|
145
|
+
additional_arguments: Optional[Dict] = None,
|
|
146
|
+
use_conversation_test_files: bool = False,
|
|
147
|
+
) -> None:
|
|
148
|
+
"""Tests a trained Core model against a set of test stories."""
|
|
149
|
+
try:
|
|
150
|
+
model = rasa.model.get_local_model(model)
|
|
151
|
+
except ModelNotFound:
|
|
152
|
+
rasa.shared.utils.cli.print_error(
|
|
153
|
+
"Unable to test: could not find a model. Use 'rasa train' to train a "
|
|
154
|
+
"Rasa model and provide it via the '--model' argument."
|
|
155
|
+
)
|
|
156
|
+
return
|
|
157
|
+
|
|
158
|
+
metadata = LocalModelStorage.metadata_from_archive(model)
|
|
159
|
+
if metadata.training_type == TrainingType.NLU:
|
|
160
|
+
rasa.shared.utils.cli.print_error(
|
|
161
|
+
"Unable to test: no core model found. Use 'rasa train' to train a "
|
|
162
|
+
"Rasa model and provide it via the '--model' argument."
|
|
163
|
+
)
|
|
164
|
+
elif metadata.training_type == TrainingType.CORE and use_conversation_test_files:
|
|
165
|
+
rasa.shared.utils.cli.print_warning(
|
|
166
|
+
"No NLU model found. Using default 'RegexMessageHandler' for end-to-end "
|
|
167
|
+
"evaluation. If you added actual user messages to your test stories "
|
|
168
|
+
"this will likely lead to the tests failing. In that case, you need "
|
|
169
|
+
"to train a NLU model first, e.g. using `rasa train`."
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
if additional_arguments is None:
|
|
173
|
+
additional_arguments = {}
|
|
174
|
+
|
|
175
|
+
if output:
|
|
176
|
+
rasa.shared.utils.io.create_directory(output)
|
|
177
|
+
|
|
178
|
+
_agent = Agent.load(model_path=model)
|
|
179
|
+
|
|
180
|
+
if not _agent.is_ready():
|
|
181
|
+
rasa.shared.utils.cli.print_error(
|
|
182
|
+
"Unable to test: processor not loaded. Use 'rasa train' to train a "
|
|
183
|
+
"Rasa model and provide it via the '--model' argument."
|
|
184
|
+
)
|
|
185
|
+
return
|
|
186
|
+
|
|
187
|
+
from rasa.core.test import test as core_test
|
|
188
|
+
|
|
189
|
+
kwargs = rasa.shared.utils.common.minimal_kwargs(
|
|
190
|
+
additional_arguments, core_test, ["stories", "agent", "e2e"]
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
await core_test(
|
|
194
|
+
stories, _agent, e2e=use_conversation_test_files, out_directory=output, **kwargs
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
async def test_nlu(
|
|
199
|
+
model: Optional[Text],
|
|
200
|
+
nlu_data: Optional[Text],
|
|
201
|
+
output_directory: Text = DEFAULT_RESULTS_PATH,
|
|
202
|
+
additional_arguments: Optional[Dict] = None,
|
|
203
|
+
domain_path: Optional[Text] = None,
|
|
204
|
+
) -> None:
|
|
205
|
+
"""Tests the NLU Model."""
|
|
206
|
+
from rasa.nlu.test import run_evaluation
|
|
207
|
+
|
|
208
|
+
rasa.shared.utils.io.create_directory(output_directory)
|
|
209
|
+
|
|
210
|
+
try:
|
|
211
|
+
model = rasa.model.get_local_model(model)
|
|
212
|
+
except ModelNotFound:
|
|
213
|
+
rasa.shared.utils.cli.print_error(
|
|
214
|
+
"Could not find any model. Use 'rasa train nlu' to train a "
|
|
215
|
+
"Rasa model and provide it via the '--model' argument."
|
|
216
|
+
)
|
|
217
|
+
return
|
|
218
|
+
|
|
219
|
+
metadata = LocalModelStorage.metadata_from_archive(model)
|
|
220
|
+
|
|
221
|
+
if os.path.exists(model) and metadata.training_type != TrainingType.CORE:
|
|
222
|
+
kwargs = rasa.shared.utils.common.minimal_kwargs(
|
|
223
|
+
additional_arguments, run_evaluation, ["data_path", "model"]
|
|
224
|
+
)
|
|
225
|
+
_agent = Agent.load(model_path=model)
|
|
226
|
+
await run_evaluation(
|
|
227
|
+
nlu_data,
|
|
228
|
+
_agent.processor,
|
|
229
|
+
output_directory=output_directory,
|
|
230
|
+
domain_path=domain_path,
|
|
231
|
+
**kwargs,
|
|
232
|
+
)
|
|
233
|
+
else:
|
|
234
|
+
rasa.shared.utils.cli.print_error(
|
|
235
|
+
"Could not find any model. Use 'rasa train nlu' to train a "
|
|
236
|
+
"Rasa model and provide it via the '--model' argument."
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
async def compare_nlu_models(
|
|
241
|
+
configs: List[Text],
|
|
242
|
+
test_data: TrainingData,
|
|
243
|
+
output: Text,
|
|
244
|
+
runs: int,
|
|
245
|
+
exclusion_percentages: List[int],
|
|
246
|
+
) -> None:
|
|
247
|
+
"""Trains multiple models, compares them and saves the results."""
|
|
248
|
+
from rasa.nlu.test import drop_intents_below_freq
|
|
249
|
+
from rasa.nlu.utils import write_json_to_file
|
|
250
|
+
from rasa.utils.io import create_path
|
|
251
|
+
from rasa.nlu.test import compare_nlu
|
|
252
|
+
|
|
253
|
+
test_data = drop_intents_below_freq(test_data, cutoff=5)
|
|
254
|
+
|
|
255
|
+
create_path(output)
|
|
256
|
+
|
|
257
|
+
bases = [os.path.basename(nlu_config) for nlu_config in configs]
|
|
258
|
+
model_names = [os.path.splitext(base)[0] for base in bases]
|
|
259
|
+
|
|
260
|
+
f1_score_results: Dict[Text, List[List[float]]] = {
|
|
261
|
+
model_name: [[] for _ in range(runs)] for model_name in model_names
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
training_examples_per_run = await compare_nlu(
|
|
265
|
+
configs,
|
|
266
|
+
test_data,
|
|
267
|
+
exclusion_percentages,
|
|
268
|
+
f1_score_results,
|
|
269
|
+
model_names,
|
|
270
|
+
output,
|
|
271
|
+
runs,
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
f1_path = os.path.join(output, RESULTS_FILE)
|
|
275
|
+
write_json_to_file(f1_path, f1_score_results)
|
|
276
|
+
|
|
277
|
+
plot_nlu_results(output, training_examples_per_run)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def plot_nlu_results(output_directory: Text, number_of_examples: List[int]) -> None:
|
|
281
|
+
"""Plot NLU model comparison graph.
|
|
282
|
+
|
|
283
|
+
Args:
|
|
284
|
+
output_directory: path to the output directory
|
|
285
|
+
number_of_examples: number of examples per run
|
|
286
|
+
"""
|
|
287
|
+
import rasa.utils.plotting as plotting_utils
|
|
288
|
+
|
|
289
|
+
graph_path = os.path.join(output_directory, "nlu_model_comparison_graph.pdf")
|
|
290
|
+
|
|
291
|
+
plotting_utils.plot_curve(
|
|
292
|
+
output_directory,
|
|
293
|
+
number_of_examples,
|
|
294
|
+
x_label_text="Number of intent examples present during training",
|
|
295
|
+
y_label_text="Label-weighted average F1 score on test set",
|
|
296
|
+
graph_path=graph_path,
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
async def perform_nlu_cross_validation(
|
|
301
|
+
config: Dict[Text, Any],
|
|
302
|
+
data: TrainingData,
|
|
303
|
+
output: Text,
|
|
304
|
+
additional_arguments: Optional[Dict[Text, Any]],
|
|
305
|
+
) -> None:
|
|
306
|
+
"""Runs cross-validation on test data.
|
|
307
|
+
|
|
308
|
+
Args:
|
|
309
|
+
config: The model configuration.
|
|
310
|
+
data: The data which is used for the cross-validation.
|
|
311
|
+
output: Output directory for the cross-validation results.
|
|
312
|
+
additional_arguments: Additional arguments which are passed to the
|
|
313
|
+
cross-validation, like number of `disable_plotting`.
|
|
314
|
+
"""
|
|
315
|
+
from rasa.nlu.test import (
|
|
316
|
+
drop_intents_below_freq,
|
|
317
|
+
cross_validate,
|
|
318
|
+
log_results,
|
|
319
|
+
log_entity_results,
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
additional_arguments = additional_arguments or {}
|
|
323
|
+
folds = int(additional_arguments.get("folds", 3))
|
|
324
|
+
|
|
325
|
+
data = drop_intents_below_freq(data, cutoff=folds)
|
|
326
|
+
kwargs = rasa.shared.utils.common.minimal_kwargs(
|
|
327
|
+
additional_arguments, cross_validate
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
results, entity_results, response_selection_results = await cross_validate(
|
|
331
|
+
data, folds, config, output, **kwargs
|
|
332
|
+
)
|
|
333
|
+
logger.info(f"CV evaluation (n={folds})")
|
|
334
|
+
|
|
335
|
+
if any(results):
|
|
336
|
+
logger.info("Intent evaluation results")
|
|
337
|
+
log_results(results.train, "train")
|
|
338
|
+
log_results(results.test, "test")
|
|
339
|
+
if any(entity_results):
|
|
340
|
+
logger.info("Entity evaluation results")
|
|
341
|
+
log_entity_results(entity_results.train, "train")
|
|
342
|
+
log_entity_results(entity_results.test, "test")
|
|
343
|
+
if any(response_selection_results):
|
|
344
|
+
logger.info("Response Selection evaluation results")
|
|
345
|
+
log_results(response_selection_results.train, "train")
|
|
346
|
+
log_results(response_selection_results.test, "test")
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
def get_evaluation_metrics(
|
|
350
|
+
targets: Iterable[Any],
|
|
351
|
+
predictions: Iterable[Any],
|
|
352
|
+
output_dict: bool = False,
|
|
353
|
+
exclude_label: Optional[Text] = None,
|
|
354
|
+
) -> Tuple[Union[Text, Dict[Text, Dict[Text, float]]], float, float, float]:
|
|
355
|
+
"""Compute the f1, precision, accuracy and summary report from sklearn.
|
|
356
|
+
|
|
357
|
+
Args:
|
|
358
|
+
targets: target labels
|
|
359
|
+
predictions: predicted labels
|
|
360
|
+
output_dict: if True sklearn returns a summary report as dict, if False the
|
|
361
|
+
report is in string format
|
|
362
|
+
exclude_label: labels to exclude from evaluation
|
|
363
|
+
|
|
364
|
+
Returns:
|
|
365
|
+
Report from sklearn, precision, f1, and accuracy values.
|
|
366
|
+
"""
|
|
367
|
+
from sklearn import metrics
|
|
368
|
+
|
|
369
|
+
targets = clean_labels(targets)
|
|
370
|
+
predictions = clean_labels(predictions)
|
|
371
|
+
|
|
372
|
+
labels = get_unique_labels(targets, exclude_label)
|
|
373
|
+
if not labels:
|
|
374
|
+
logger.warning("No labels to evaluate. Skip evaluation.")
|
|
375
|
+
return {}, 0.0, 0.0, 0.0
|
|
376
|
+
|
|
377
|
+
report = metrics.classification_report(
|
|
378
|
+
targets, predictions, labels=labels, output_dict=output_dict
|
|
379
|
+
)
|
|
380
|
+
precision = metrics.precision_score(
|
|
381
|
+
targets, predictions, labels=labels, average="weighted"
|
|
382
|
+
)
|
|
383
|
+
f1 = metrics.f1_score(targets, predictions, labels=labels, average="weighted")
|
|
384
|
+
accuracy = metrics.accuracy_score(targets, predictions)
|
|
385
|
+
|
|
386
|
+
if output_dict:
|
|
387
|
+
report = make_classification_report_complete(report, accuracy)
|
|
388
|
+
|
|
389
|
+
return report, precision, f1, accuracy
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
def make_classification_report_complete(report: dict, accuracy: float) -> dict:
|
|
393
|
+
"""Completes the sklearn classification report with accuracy xor micro avg.
|
|
394
|
+
|
|
395
|
+
Args:
|
|
396
|
+
report: Report generated by metrics.classification_report with output_dict=True
|
|
397
|
+
accuracy: Model accuracy
|
|
398
|
+
|
|
399
|
+
Raises:
|
|
400
|
+
Exception: When sklearn.metrics.classification_report
|
|
401
|
+
behaves different to our expectation.
|
|
402
|
+
|
|
403
|
+
Returns:
|
|
404
|
+
report: Report generated by metrics.classification_report
|
|
405
|
+
enhanced with accuracy xor micro avg.
|
|
406
|
+
"""
|
|
407
|
+
report = copy.deepcopy(report)
|
|
408
|
+
if "accuracy" in report and "micro avg" not in report:
|
|
409
|
+
# micro avg corresponds to accuracy in this case
|
|
410
|
+
# and is the same for all metrics
|
|
411
|
+
acc = report["accuracy"]
|
|
412
|
+
support = report["macro avg"]["support"]
|
|
413
|
+
report["micro avg"] = {
|
|
414
|
+
"precision": acc,
|
|
415
|
+
"recall": acc,
|
|
416
|
+
"f1-score": acc,
|
|
417
|
+
"support": support,
|
|
418
|
+
}
|
|
419
|
+
elif "accuracy" not in report and "micro avg" in report:
|
|
420
|
+
# Due to provided labels, micro avg can have recall != precision
|
|
421
|
+
# The accuracy therefore has to be inferred separately
|
|
422
|
+
report["accuracy"] = accuracy
|
|
423
|
+
else:
|
|
424
|
+
raise ClassificationReportException(
|
|
425
|
+
"This cannot happen according to classification_report's docs"
|
|
426
|
+
)
|
|
427
|
+
return report
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
def clean_labels(labels: Iterable[Text]) -> List[Text]:
|
|
431
|
+
"""Remove `None` labels. sklearn metrics do not support them.
|
|
432
|
+
|
|
433
|
+
Args:
|
|
434
|
+
labels: list of labels
|
|
435
|
+
|
|
436
|
+
Returns:
|
|
437
|
+
Cleaned labels.
|
|
438
|
+
"""
|
|
439
|
+
return [label if label is not None else "" for label in labels]
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
def get_unique_labels(
|
|
443
|
+
targets: Iterable[Text], exclude_label: Optional[Text]
|
|
444
|
+
) -> List[Text]:
|
|
445
|
+
"""Get unique labels. Exclude 'exclude_label' if specified.
|
|
446
|
+
|
|
447
|
+
Args:
|
|
448
|
+
targets: labels
|
|
449
|
+
exclude_label: label to exclude
|
|
450
|
+
|
|
451
|
+
Returns:
|
|
452
|
+
Unique labels.
|
|
453
|
+
"""
|
|
454
|
+
labels = set(targets)
|
|
455
|
+
if exclude_label and exclude_label in labels:
|
|
456
|
+
labels.remove(exclude_label)
|
|
457
|
+
return list(labels)
|