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,174 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import os
|
|
3
|
+
from abc import abstractmethod, ABC
|
|
4
|
+
from enum import Enum
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import List, Optional, TYPE_CHECKING
|
|
7
|
+
|
|
8
|
+
import rasa.shared.utils.io
|
|
9
|
+
import rasa.utils.io
|
|
10
|
+
from rasa.llm_fine_tuning.conversations import Conversation
|
|
11
|
+
from rasa.shared.utils.yaml import write_yaml
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from rasa.llm_fine_tuning.llm_data_preparation_module import LLMDataExample
|
|
15
|
+
from rasa.llm_fine_tuning.train_test_split_module import DataExampleFormat
|
|
16
|
+
from rasa.e2e_test.e2e_test_case import TestSuite
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class StorageType(Enum):
|
|
20
|
+
FILE = "file"
|
|
21
|
+
# We might want to add other storage systems in the future
|
|
22
|
+
# CLOUD = "cloud"
|
|
23
|
+
# DATABASE = "database"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class StorageStrategy(ABC):
|
|
27
|
+
@abstractmethod
|
|
28
|
+
def write_conversation(
|
|
29
|
+
self, conversation: Conversation, storage_location: Optional[str] = None
|
|
30
|
+
) -> None:
|
|
31
|
+
pass
|
|
32
|
+
|
|
33
|
+
def write_llm_data(
|
|
34
|
+
self, llm_data: List["LLMDataExample"], storage_location: Optional[str]
|
|
35
|
+
) -> None:
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
def write_formatted_finetuning_data(
|
|
39
|
+
self,
|
|
40
|
+
formatted_data: List["DataExampleFormat"],
|
|
41
|
+
module_storage_location: Optional[str],
|
|
42
|
+
file_name: Optional[str],
|
|
43
|
+
) -> None:
|
|
44
|
+
pass
|
|
45
|
+
|
|
46
|
+
def write_e2e_test_suite_to_yaml_file(
|
|
47
|
+
self,
|
|
48
|
+
e2e_test_suite: "TestSuite",
|
|
49
|
+
module_storage_location: Optional[str],
|
|
50
|
+
file_name: Optional[str],
|
|
51
|
+
) -> None:
|
|
52
|
+
pass
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class FileStorageStrategy(StorageStrategy):
|
|
56
|
+
def __init__(self, output_dir: str) -> None:
|
|
57
|
+
self.output_dir = output_dir
|
|
58
|
+
|
|
59
|
+
def write_conversation(
|
|
60
|
+
self, conversation: Conversation, storage_location: Optional[str] = None
|
|
61
|
+
) -> None:
|
|
62
|
+
file_name = os.path.basename(
|
|
63
|
+
conversation.original_e2e_test_case.file or f"{conversation.name}.yaml"
|
|
64
|
+
)
|
|
65
|
+
file_path = self._get_file_path(storage_location, file_name)
|
|
66
|
+
self._create_output_dir(file_path)
|
|
67
|
+
|
|
68
|
+
rasa.utils.io.write_yaml(conversation.as_dict(), file_path)
|
|
69
|
+
|
|
70
|
+
def _get_file_path(
|
|
71
|
+
self, storage_location: Optional[str], file_name: Optional[str] = None
|
|
72
|
+
) -> Path:
|
|
73
|
+
if storage_location:
|
|
74
|
+
output = f"{self.output_dir}/{storage_location}"
|
|
75
|
+
else:
|
|
76
|
+
output = self.output_dir
|
|
77
|
+
|
|
78
|
+
if file_name:
|
|
79
|
+
return Path(f"{output}/{file_name}")
|
|
80
|
+
return Path(output)
|
|
81
|
+
|
|
82
|
+
@staticmethod
|
|
83
|
+
def _create_output_dir(file_path: Path) -> None:
|
|
84
|
+
if (
|
|
85
|
+
str(file_path).endswith(".jsonl")
|
|
86
|
+
or str(file_path).endswith(".yaml")
|
|
87
|
+
or str(file_path).endswith(".yml")
|
|
88
|
+
):
|
|
89
|
+
file_path.parent.mkdir(exist_ok=True, parents=True)
|
|
90
|
+
else:
|
|
91
|
+
file_path.mkdir(exist_ok=True, parents=True)
|
|
92
|
+
|
|
93
|
+
def write_llm_data(
|
|
94
|
+
self, llm_data: List["LLMDataExample"], storage_location: Optional[str]
|
|
95
|
+
) -> None:
|
|
96
|
+
file_path = self._get_file_path(storage_location)
|
|
97
|
+
self._create_output_dir(file_path)
|
|
98
|
+
|
|
99
|
+
with open(str(file_path), "w") as outfile:
|
|
100
|
+
for example in llm_data:
|
|
101
|
+
json.dump(example.as_dict(), outfile)
|
|
102
|
+
outfile.write("\n")
|
|
103
|
+
|
|
104
|
+
def write_formatted_finetuning_data(
|
|
105
|
+
self,
|
|
106
|
+
formatted_data: List["DataExampleFormat"],
|
|
107
|
+
module_storage_location: Optional[str],
|
|
108
|
+
file_name: Optional[str],
|
|
109
|
+
) -> None:
|
|
110
|
+
file_path = self._get_file_path(module_storage_location, file_name)
|
|
111
|
+
self._create_output_dir(file_path)
|
|
112
|
+
|
|
113
|
+
with open(str(file_path), "w") as file:
|
|
114
|
+
for example in formatted_data:
|
|
115
|
+
json.dump(example.as_dict(), file)
|
|
116
|
+
file.write("\n")
|
|
117
|
+
|
|
118
|
+
def write_e2e_test_suite_to_yaml_file(
|
|
119
|
+
self,
|
|
120
|
+
e2e_test_suite: "TestSuite",
|
|
121
|
+
module_storage_location: Optional[str],
|
|
122
|
+
file_name: Optional[str],
|
|
123
|
+
) -> None:
|
|
124
|
+
"""Write the e2e TestSuite data to a YAML file.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
e2e_test_suite: The TestSuite object to write.
|
|
128
|
+
module_storage_location: The location where the file should be stored.
|
|
129
|
+
file_name: The path to the file where the data should be written.
|
|
130
|
+
"""
|
|
131
|
+
file_path = self._get_file_path(module_storage_location, file_name)
|
|
132
|
+
self._create_output_dir(file_path)
|
|
133
|
+
write_yaml(e2e_test_suite.as_dict(), str(file_path))
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
class StorageContext:
|
|
137
|
+
def __init__(self, strategy: StorageStrategy) -> None:
|
|
138
|
+
self.strategy = strategy
|
|
139
|
+
|
|
140
|
+
def write_conversation(
|
|
141
|
+
self, conversation: Conversation, sub_dir: Optional[str] = None
|
|
142
|
+
) -> None:
|
|
143
|
+
self.strategy.write_conversation(conversation, sub_dir)
|
|
144
|
+
|
|
145
|
+
def write_conversations(
|
|
146
|
+
self, conversations: List[Conversation], sub_dir: Optional[str] = None
|
|
147
|
+
) -> None:
|
|
148
|
+
for conversation in conversations:
|
|
149
|
+
self.write_conversation(conversation, sub_dir)
|
|
150
|
+
|
|
151
|
+
def write_llm_data(
|
|
152
|
+
self, llm_data: List["LLMDataExample"], file_path: Optional[str] = None
|
|
153
|
+
) -> None:
|
|
154
|
+
self.strategy.write_llm_data(llm_data, file_path)
|
|
155
|
+
|
|
156
|
+
def write_formatted_finetuning_data(
|
|
157
|
+
self,
|
|
158
|
+
formatted_data: List["DataExampleFormat"],
|
|
159
|
+
module_storage_location: Optional[str] = None,
|
|
160
|
+
file_name: Optional[str] = None,
|
|
161
|
+
) -> None:
|
|
162
|
+
self.strategy.write_formatted_finetuning_data(
|
|
163
|
+
formatted_data, module_storage_location, file_name
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
def write_e2e_test_suite_to_yaml_file(
|
|
167
|
+
self,
|
|
168
|
+
e2e_test_suite: "TestSuite",
|
|
169
|
+
module_storage_location: Optional[str] = None,
|
|
170
|
+
file_name: Optional[str] = None,
|
|
171
|
+
) -> None:
|
|
172
|
+
self.strategy.write_e2e_test_suite_to_yaml_file(
|
|
173
|
+
e2e_test_suite, module_storage_location, file_name
|
|
174
|
+
)
|
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import random
|
|
2
|
+
from collections import defaultdict
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any, Dict, List, Protocol, Set, Tuple
|
|
5
|
+
|
|
6
|
+
import structlog
|
|
7
|
+
|
|
8
|
+
from rasa.e2e_test.e2e_test_case import TestSuite
|
|
9
|
+
from rasa.llm_fine_tuning.llm_data_preparation_module import LLMDataExample
|
|
10
|
+
from rasa.llm_fine_tuning.storage import StorageContext
|
|
11
|
+
|
|
12
|
+
TRAIN_TEST_MODULE_STORAGE_LOCATION = "4_train_test_split"
|
|
13
|
+
|
|
14
|
+
SUPPORTED_COMMANDS = [
|
|
15
|
+
"SetSlot",
|
|
16
|
+
"StartFlow",
|
|
17
|
+
"CancelFlow",
|
|
18
|
+
"ChitChat",
|
|
19
|
+
"SkipQuestion",
|
|
20
|
+
"SearchAndReply",
|
|
21
|
+
"HumanHandoff",
|
|
22
|
+
"Clarify",
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
INSTRUCTION_DATA_FORMAT = "instruction"
|
|
26
|
+
CONVERSATIONAL_DATA_FORMAT = "conversational"
|
|
27
|
+
|
|
28
|
+
KEY_COMMANDS = "commands"
|
|
29
|
+
KEY_DATA_EXAMPLES = "data_examples"
|
|
30
|
+
KEY_TEST_CASE_NAME = "test_case_name"
|
|
31
|
+
|
|
32
|
+
structlogger = structlog.get_logger()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
# A protocol (similar to an interface) for data example that all fine-tuning data
|
|
36
|
+
# format classes should implement.
|
|
37
|
+
class DataExampleFormat(Protocol):
|
|
38
|
+
def as_dict(self) -> dict: ...
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@dataclass
|
|
42
|
+
class InstructionDataFormat(DataExampleFormat):
|
|
43
|
+
# The prompt and completion fields are used to store the input and output of the
|
|
44
|
+
# LLM model. The instruction data format is taken from the TRL library.
|
|
45
|
+
# Refer: https://huggingface.co/docs/trl/en/sft_trainer#dataset-format-support
|
|
46
|
+
# The data format can also be used to train on Azure. Refer:
|
|
47
|
+
# https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/fine-tuning
|
|
48
|
+
|
|
49
|
+
prompt: str
|
|
50
|
+
completion: str
|
|
51
|
+
|
|
52
|
+
def as_dict(self) -> Dict[str, str]:
|
|
53
|
+
return {"prompt": self.prompt, "completion": self.completion}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass
|
|
57
|
+
class ConversationalMessageDataFormat:
|
|
58
|
+
role: str
|
|
59
|
+
content: str
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@dataclass
|
|
63
|
+
class ConversationalDataFormat(DataExampleFormat):
|
|
64
|
+
# The conversation data format is taken from the TRL library.
|
|
65
|
+
# Refer: https://huggingface.co/docs/trl/en/sft_trainer#dataset-format-support
|
|
66
|
+
# The data format can also be used to train on Azure. Refer:
|
|
67
|
+
# https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/fine-tuning
|
|
68
|
+
|
|
69
|
+
messages: List[ConversationalMessageDataFormat]
|
|
70
|
+
|
|
71
|
+
def as_dict(self) -> Dict[str, List[Dict[str, str]]]:
|
|
72
|
+
return {
|
|
73
|
+
"messages": [
|
|
74
|
+
{"role": message.role, "content": message.content}
|
|
75
|
+
for message in self.messages
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _get_command_types_covered_by_llm_data_point(commands: LLMDataExample) -> Set[str]:
|
|
81
|
+
"""Get the command types covered by the LLM data point.
|
|
82
|
+
|
|
83
|
+
This function returns the set of command types from the output present in a
|
|
84
|
+
LLMDataExample object. Eg: The function returns {'SetSlot', 'StartFlow'} when the
|
|
85
|
+
LLMDataExample.output is 'SetSlot(slot, abc), SetSlot(slot, cde), StartFlow(xyz)'.
|
|
86
|
+
"""
|
|
87
|
+
commands_covered = set()
|
|
88
|
+
for command in SUPPORTED_COMMANDS:
|
|
89
|
+
if command in commands.output:
|
|
90
|
+
commands_covered.add(command)
|
|
91
|
+
return commands_covered
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _get_grouped_fine_tuning_data_by_test_name_with_commands(
|
|
95
|
+
fine_tuning_data: List[LLMDataExample],
|
|
96
|
+
) -> List[Dict[str, Any]]:
|
|
97
|
+
"""Group the fine-tune data by test name and capture commands covered by each group.
|
|
98
|
+
|
|
99
|
+
This function groups the fine-tuning data by original_test_name and captures the
|
|
100
|
+
commands covered by each group. The function returns a dictionary where the keys
|
|
101
|
+
are the original_test_name and the values are dictionaries containing the data
|
|
102
|
+
and commands covered by each group.
|
|
103
|
+
"""
|
|
104
|
+
grouped_data: Dict[str, Dict[str, Any]] = defaultdict(
|
|
105
|
+
lambda: {KEY_DATA_EXAMPLES: [], KEY_COMMANDS: set()}
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
for data_point in fine_tuning_data:
|
|
109
|
+
grouped_data[data_point.original_test_name][KEY_DATA_EXAMPLES].append(
|
|
110
|
+
data_point
|
|
111
|
+
)
|
|
112
|
+
command_types = _get_command_types_covered_by_llm_data_point(data_point)
|
|
113
|
+
for command_type in command_types:
|
|
114
|
+
grouped_data[data_point.original_test_name][KEY_COMMANDS].add(command_type)
|
|
115
|
+
|
|
116
|
+
# Convert the grouped data to the required format.
|
|
117
|
+
result = [
|
|
118
|
+
{
|
|
119
|
+
KEY_TEST_CASE_NAME: test_case_name,
|
|
120
|
+
KEY_DATA_EXAMPLES: group[KEY_DATA_EXAMPLES],
|
|
121
|
+
KEY_COMMANDS: group[KEY_COMMANDS],
|
|
122
|
+
}
|
|
123
|
+
for test_case_name, group in grouped_data.items()
|
|
124
|
+
]
|
|
125
|
+
|
|
126
|
+
return result
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def _get_minimum_test_case_groups_to_cover_all_commands(
|
|
130
|
+
grouped_data: List[Dict[str, Any]],
|
|
131
|
+
) -> List[str]:
|
|
132
|
+
"""Get the minimum test case groups to cover all commands.
|
|
133
|
+
|
|
134
|
+
This function implements a greedy algorithm that returns the minimum test case
|
|
135
|
+
groups to cover all commands. The function takes a list of dictionaries where each
|
|
136
|
+
dictionary represents a test group and contains the test_case_name, data_examples,
|
|
137
|
+
and commands covered by each group.
|
|
138
|
+
|
|
139
|
+
The function iteratively selects the test case group that covers the most number
|
|
140
|
+
of uncovered commands until all commands are covered.
|
|
141
|
+
|
|
142
|
+
The function returns the selected test case groups as a list of strings.
|
|
143
|
+
|
|
144
|
+
Example:
|
|
145
|
+
data = [
|
|
146
|
+
{
|
|
147
|
+
"test_case_name": "t1",
|
|
148
|
+
"data_examples": [],
|
|
149
|
+
"commands": {"SetSlot", "CancelFlow"}
|
|
150
|
+
},
|
|
151
|
+
{"test_case_name": "t2", "data_examples": [], "commands": {"CancelFlow"}},
|
|
152
|
+
{"test_case_name": "t3", "data_examples": [], "commands": {"StartFlow"}},
|
|
153
|
+
{
|
|
154
|
+
"test_case_name": "t4",
|
|
155
|
+
"data_examples": [],
|
|
156
|
+
"commands": {"SetSlot", "StartFlow"}
|
|
157
|
+
},
|
|
158
|
+
]
|
|
159
|
+
|
|
160
|
+
selected_test_cases = _get_minimum_test_case_groups_to_cover_all_commands(data)
|
|
161
|
+
print(selected_test_cases)
|
|
162
|
+
# Output: ['t1', 't3']
|
|
163
|
+
"""
|
|
164
|
+
# Get all the commands covered from the finetuning data.
|
|
165
|
+
all_commands = set(
|
|
166
|
+
command for test_group in grouped_data for command in test_group[KEY_COMMANDS]
|
|
167
|
+
)
|
|
168
|
+
selected_test_cases = []
|
|
169
|
+
covered_commands: Set[str] = set()
|
|
170
|
+
|
|
171
|
+
while covered_commands != all_commands:
|
|
172
|
+
# Find the test case group that covers the most number of uncovered commands
|
|
173
|
+
best_test_case_group = None
|
|
174
|
+
commands_covered_by_best_test_case_group: Set[str] = set()
|
|
175
|
+
|
|
176
|
+
for test_group in grouped_data:
|
|
177
|
+
commands_covered = test_group[KEY_COMMANDS] - covered_commands
|
|
178
|
+
if len(commands_covered) > len(commands_covered_by_best_test_case_group):
|
|
179
|
+
best_test_case_group = test_group[KEY_TEST_CASE_NAME]
|
|
180
|
+
commands_covered_by_best_test_case_group = commands_covered
|
|
181
|
+
|
|
182
|
+
if best_test_case_group is None:
|
|
183
|
+
break
|
|
184
|
+
|
|
185
|
+
selected_test_cases.append(best_test_case_group)
|
|
186
|
+
covered_commands.update(commands_covered_by_best_test_case_group)
|
|
187
|
+
|
|
188
|
+
structlogger.info(
|
|
189
|
+
"llm_fine_tuning.train_test_split_module.command_coverage_in_train_dataset",
|
|
190
|
+
covered_commands=covered_commands,
|
|
191
|
+
)
|
|
192
|
+
return selected_test_cases
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def _get_finetuning_data_in_instruction_data_format(
|
|
196
|
+
train_data: List[Dict[str, Any]], validation_data: List[Dict[str, Any]]
|
|
197
|
+
) -> Tuple[List[DataExampleFormat], List[DataExampleFormat]]:
|
|
198
|
+
"""Convert the fine-tuning data to the required Alpaca format.
|
|
199
|
+
|
|
200
|
+
The function takes the train and validation data as input and returns the formatted
|
|
201
|
+
train and validation data.
|
|
202
|
+
"""
|
|
203
|
+
|
|
204
|
+
def _convert_into_instruction_data_format(
|
|
205
|
+
data: List[Dict[str, Any]],
|
|
206
|
+
) -> List[DataExampleFormat]:
|
|
207
|
+
return [
|
|
208
|
+
InstructionDataFormat(llm_data_example.prompt, llm_data_example.output)
|
|
209
|
+
for test_group in data
|
|
210
|
+
for llm_data_example in test_group[KEY_DATA_EXAMPLES]
|
|
211
|
+
]
|
|
212
|
+
|
|
213
|
+
formatted_train_data = _convert_into_instruction_data_format(train_data)
|
|
214
|
+
formatted_validation_data = _convert_into_instruction_data_format(validation_data)
|
|
215
|
+
return formatted_train_data, formatted_validation_data
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def _get_finetuning_data_in_conversational_data_format(
|
|
219
|
+
train_data: List[Dict[str, Any]], validation_data: List[Dict[str, Any]]
|
|
220
|
+
) -> Tuple[List[DataExampleFormat], List[DataExampleFormat]]:
|
|
221
|
+
"""Convert the fine-tuning data to the required ShareGPT format.
|
|
222
|
+
|
|
223
|
+
The function takes the train and validation data as input and returns the formatted
|
|
224
|
+
train and validation data.
|
|
225
|
+
"""
|
|
226
|
+
|
|
227
|
+
def _convert_into_conversational_data_format(
|
|
228
|
+
data: List[Dict[str, Any]],
|
|
229
|
+
) -> List[DataExampleFormat]:
|
|
230
|
+
return [
|
|
231
|
+
ConversationalDataFormat(
|
|
232
|
+
[
|
|
233
|
+
ConversationalMessageDataFormat("user", llm_data_example.prompt),
|
|
234
|
+
ConversationalMessageDataFormat(
|
|
235
|
+
"assistant", llm_data_example.output
|
|
236
|
+
),
|
|
237
|
+
]
|
|
238
|
+
)
|
|
239
|
+
for test_group in data
|
|
240
|
+
for llm_data_example in test_group[KEY_DATA_EXAMPLES]
|
|
241
|
+
]
|
|
242
|
+
|
|
243
|
+
formatted_train_data = _convert_into_conversational_data_format(train_data)
|
|
244
|
+
formatted_validation_data = _convert_into_conversational_data_format(
|
|
245
|
+
validation_data
|
|
246
|
+
)
|
|
247
|
+
return formatted_train_data, formatted_validation_data
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def _check_and_log_missing_validation_dataset_command_coverage(
|
|
251
|
+
grouped_data: List[Dict[str, Any]],
|
|
252
|
+
validation_data: List[Dict[str, Any]],
|
|
253
|
+
) -> None:
|
|
254
|
+
"""Check and log the missing commands in the validation data.
|
|
255
|
+
|
|
256
|
+
Args:
|
|
257
|
+
grouped_data: The grouped fine-tuning data - complete dataset.
|
|
258
|
+
validation_data: The validation data to check for missing commands.
|
|
259
|
+
"""
|
|
260
|
+
all_commands = set(
|
|
261
|
+
command for test_group in grouped_data for command in test_group[KEY_COMMANDS]
|
|
262
|
+
)
|
|
263
|
+
command_coverage_in_validation_dataset = set(
|
|
264
|
+
command
|
|
265
|
+
for test_group in validation_data
|
|
266
|
+
for command in test_group[KEY_COMMANDS]
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
missing_commands = all_commands - command_coverage_in_validation_dataset
|
|
270
|
+
if missing_commands:
|
|
271
|
+
structlogger.warning(
|
|
272
|
+
"llm_fine_tuning.train_test_split_module.missing_commands_in_validation_dat"
|
|
273
|
+
"aset",
|
|
274
|
+
missing_commands=missing_commands,
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
def _get_train_validation_data_splits(
|
|
279
|
+
fine_tuning_data: List[LLMDataExample], train_frac: float
|
|
280
|
+
) -> Tuple[List[Dict[str, Any]], List[Dict[str, Any]]]:
|
|
281
|
+
# Group by original_test_name and capture commands covered by each group.
|
|
282
|
+
grouped_data = _get_grouped_fine_tuning_data_by_test_name_with_commands(
|
|
283
|
+
fine_tuning_data
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
# Get the minimum test case groups to cover all commands. This is done to ensure
|
|
287
|
+
# that the training data covers all the commands present in the fine-tuning data.
|
|
288
|
+
selected_tests = _get_minimum_test_case_groups_to_cover_all_commands(grouped_data)
|
|
289
|
+
|
|
290
|
+
# Separate the tests into train data and remaining data.
|
|
291
|
+
train_data = [
|
|
292
|
+
data for data in grouped_data if data[KEY_TEST_CASE_NAME] in selected_tests
|
|
293
|
+
]
|
|
294
|
+
remaining_data = [
|
|
295
|
+
data for data in grouped_data if data[KEY_TEST_CASE_NAME] not in selected_tests
|
|
296
|
+
]
|
|
297
|
+
|
|
298
|
+
# Shuffle the remaining data randomly.
|
|
299
|
+
random.shuffle(remaining_data)
|
|
300
|
+
|
|
301
|
+
# Calculate the number of samples required for training
|
|
302
|
+
total_samples = len(grouped_data)
|
|
303
|
+
train_size = int(total_samples * train_frac)
|
|
304
|
+
|
|
305
|
+
# Number of additional samples needed in train set
|
|
306
|
+
current_train_size = len(train_data)
|
|
307
|
+
additional_train_needed = train_size - current_train_size
|
|
308
|
+
|
|
309
|
+
if additional_train_needed > 0:
|
|
310
|
+
# Select additional samples from the remaining data
|
|
311
|
+
additional_train_samples = remaining_data[:additional_train_needed]
|
|
312
|
+
train_data.extend(additional_train_samples)
|
|
313
|
+
|
|
314
|
+
# Update remaining data after adding to train data
|
|
315
|
+
remaining_data = remaining_data[additional_train_needed:]
|
|
316
|
+
|
|
317
|
+
# As the train dataset is selected based on the commands covered, the remaining data
|
|
318
|
+
# might not have all the commands. So, we need check and throw a warning if any
|
|
319
|
+
# command is missing in the remaining data. Ensuring command coverage over the
|
|
320
|
+
# validation data will be handled in https://rasahq.atlassian.net/browse/ENG-1217.
|
|
321
|
+
_check_and_log_missing_validation_dataset_command_coverage(
|
|
322
|
+
grouped_data, remaining_data
|
|
323
|
+
)
|
|
324
|
+
return train_data, remaining_data
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
def split_e2e_test_suite(
|
|
328
|
+
e2e_test_suite: TestSuite,
|
|
329
|
+
train_data: List[Dict[str, Any]],
|
|
330
|
+
validation_data: List[Dict[str, Any]],
|
|
331
|
+
) -> Tuple[TestSuite, TestSuite]:
|
|
332
|
+
"""Split the e2e test suite into train and validation test suites.
|
|
333
|
+
|
|
334
|
+
Args:
|
|
335
|
+
e2e_test_suite: The e2e test suite to split.
|
|
336
|
+
train_data: The train data is used to get the names of the tests that should be
|
|
337
|
+
included in the train test suite from the e2e test suite.
|
|
338
|
+
validation_data: The validation data is used to get the names of the tests that
|
|
339
|
+
should be included in the validation test suite from the e2e test suite.
|
|
340
|
+
|
|
341
|
+
Returns:
|
|
342
|
+
Tuple[TestSuite, TestSuite]: The train and validation test suites.
|
|
343
|
+
"""
|
|
344
|
+
# Get the names of the test cases that should be included in the train and
|
|
345
|
+
# validation test suites.
|
|
346
|
+
train_test_case_names = {test[KEY_TEST_CASE_NAME] for test in train_data}
|
|
347
|
+
validation_test_case_names = {test[KEY_TEST_CASE_NAME] for test in validation_data}
|
|
348
|
+
|
|
349
|
+
train_test_cases = []
|
|
350
|
+
validation_test_cases = []
|
|
351
|
+
|
|
352
|
+
for test_case in e2e_test_suite.test_cases:
|
|
353
|
+
if f"{test_case.file}::{test_case.name}" in train_test_case_names:
|
|
354
|
+
train_test_cases.append(test_case)
|
|
355
|
+
elif f"{test_case.file}::{test_case.name}" in validation_test_case_names:
|
|
356
|
+
validation_test_cases.append(test_case)
|
|
357
|
+
|
|
358
|
+
# Creating new TestSuite instances for train and validation
|
|
359
|
+
train_suite = TestSuite(
|
|
360
|
+
test_cases=train_test_cases,
|
|
361
|
+
fixtures=e2e_test_suite.fixtures,
|
|
362
|
+
metadata=e2e_test_suite.metadata,
|
|
363
|
+
stub_custom_actions=e2e_test_suite.stub_custom_actions,
|
|
364
|
+
)
|
|
365
|
+
validation_suite = TestSuite(
|
|
366
|
+
test_cases=validation_test_cases,
|
|
367
|
+
fixtures=e2e_test_suite.fixtures,
|
|
368
|
+
metadata=e2e_test_suite.metadata,
|
|
369
|
+
stub_custom_actions=e2e_test_suite.stub_custom_actions,
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
return train_suite, validation_suite
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
def split_llm_fine_tuning_data(
|
|
376
|
+
fine_tuning_data: List[LLMDataExample],
|
|
377
|
+
train_frac: float,
|
|
378
|
+
output_format: str,
|
|
379
|
+
storage_context: StorageContext,
|
|
380
|
+
e2e_test_suite: TestSuite,
|
|
381
|
+
) -> Tuple[List[DataExampleFormat], List[DataExampleFormat]]:
|
|
382
|
+
# Split the fine-tuning data into train and validation data.
|
|
383
|
+
train_data, validation_data = _get_train_validation_data_splits(
|
|
384
|
+
fine_tuning_data, train_frac
|
|
385
|
+
)
|
|
386
|
+
if not validation_data:
|
|
387
|
+
structlogger.warning(
|
|
388
|
+
"llm_fine_tuning.train_test_split_module.empty_validation_dataset",
|
|
389
|
+
event_info=(
|
|
390
|
+
"Validation data is empty. Please provide more data to split into"
|
|
391
|
+
" train and validation data. Also, check if the --train-frac value is"
|
|
392
|
+
" appropriate."
|
|
393
|
+
),
|
|
394
|
+
train_frac=train_frac,
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
# Convert the fine-tuning data to the required format.
|
|
398
|
+
if output_format == INSTRUCTION_DATA_FORMAT:
|
|
399
|
+
formatted_train_data, formatted_validation_data = (
|
|
400
|
+
_get_finetuning_data_in_instruction_data_format(train_data, validation_data)
|
|
401
|
+
)
|
|
402
|
+
elif output_format == CONVERSATIONAL_DATA_FORMAT:
|
|
403
|
+
formatted_train_data, formatted_validation_data = (
|
|
404
|
+
_get_finetuning_data_in_conversational_data_format(
|
|
405
|
+
train_data, validation_data
|
|
406
|
+
)
|
|
407
|
+
)
|
|
408
|
+
else:
|
|
409
|
+
raise ValueError(
|
|
410
|
+
f"Output format '{output_format}' is not supported. Supported formats are "
|
|
411
|
+
f"'{INSTRUCTION_DATA_FORMAT}' and '{CONVERSATIONAL_DATA_FORMAT}'."
|
|
412
|
+
)
|
|
413
|
+
|
|
414
|
+
# Write the train and validation data to the storage location.
|
|
415
|
+
storage_context.write_formatted_finetuning_data(
|
|
416
|
+
formatted_train_data,
|
|
417
|
+
TRAIN_TEST_MODULE_STORAGE_LOCATION,
|
|
418
|
+
"ft_splits/train.jsonl",
|
|
419
|
+
)
|
|
420
|
+
storage_context.write_formatted_finetuning_data(
|
|
421
|
+
formatted_validation_data,
|
|
422
|
+
TRAIN_TEST_MODULE_STORAGE_LOCATION,
|
|
423
|
+
"ft_splits/val.jsonl",
|
|
424
|
+
)
|
|
425
|
+
|
|
426
|
+
# Split the e2e test suite data into train and validation data.
|
|
427
|
+
train_suite, validation_suite = split_e2e_test_suite(
|
|
428
|
+
e2e_test_suite, train_data, validation_data
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
# Write the train and validation test suite data to the storage location.
|
|
432
|
+
storage_context.write_e2e_test_suite_to_yaml_file(
|
|
433
|
+
train_suite, TRAIN_TEST_MODULE_STORAGE_LOCATION, "e2e_tests/train.yaml"
|
|
434
|
+
)
|
|
435
|
+
storage_context.write_e2e_test_suite_to_yaml_file(
|
|
436
|
+
validation_suite,
|
|
437
|
+
TRAIN_TEST_MODULE_STORAGE_LOCATION,
|
|
438
|
+
"e2e_tests/validation.yaml",
|
|
439
|
+
)
|
|
440
|
+
|
|
441
|
+
return formatted_train_data, formatted_validation_data
|
rasa/markers/__init__.py
ADDED
|
File without changes
|