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,281 @@
|
|
|
1
|
+
import importlib.resources
|
|
2
|
+
import re
|
|
3
|
+
from typing import Dict, Any, List, Tuple, Optional
|
|
4
|
+
|
|
5
|
+
import structlog
|
|
6
|
+
from jinja2 import Template
|
|
7
|
+
|
|
8
|
+
from rasa.llm_fine_tuning.conversations import Conversation
|
|
9
|
+
from rasa.llm_fine_tuning.paraphrasing.rephrased_user_message import (
|
|
10
|
+
RephrasedUserMessage,
|
|
11
|
+
)
|
|
12
|
+
from rasa.shared.constants import (
|
|
13
|
+
MODEL_NAME_CONFIG_KEY,
|
|
14
|
+
MODEL_CONFIG_KEY,
|
|
15
|
+
LLM_CONFIG_KEY,
|
|
16
|
+
PROMPT_TEMPLATE_CONFIG_KEY,
|
|
17
|
+
PROVIDER_CONFIG_KEY,
|
|
18
|
+
TIMEOUT_CONFIG_KEY,
|
|
19
|
+
)
|
|
20
|
+
from rasa.shared.exceptions import ProviderClientAPIException
|
|
21
|
+
from rasa.shared.providers.mappings import OPENAI_PROVIDER
|
|
22
|
+
from rasa.shared.utils.llm import (
|
|
23
|
+
get_prompt_template,
|
|
24
|
+
llm_factory,
|
|
25
|
+
USER,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
SEPARATOR = "\n\n"
|
|
29
|
+
BACKUP_SEPARATOR = "\nUSER:"
|
|
30
|
+
|
|
31
|
+
REPHRASING_PROMPT_FILE_NAME = "default_rephrase_prompt_template.jina2"
|
|
32
|
+
DEFAULT_REPHRASING_PROMPT_TEMPLATE = importlib.resources.read_text(
|
|
33
|
+
"rasa.llm_fine_tuning.paraphrasing",
|
|
34
|
+
REPHRASING_PROMPT_FILE_NAME,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
DEFAULT_LLM_CONFIG = {
|
|
38
|
+
PROVIDER_CONFIG_KEY: OPENAI_PROVIDER,
|
|
39
|
+
MODEL_CONFIG_KEY: "gpt-4o-mini",
|
|
40
|
+
TIMEOUT_CONFIG_KEY: 7,
|
|
41
|
+
"temperature": 0.0,
|
|
42
|
+
"max_tokens": 4096,
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
structlogger = structlog.get_logger()
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class ConversationRephraser:
|
|
49
|
+
def __init__(
|
|
50
|
+
self,
|
|
51
|
+
config: Dict[str, Any],
|
|
52
|
+
) -> None:
|
|
53
|
+
self.config = {**self.get_default_config(), **config}
|
|
54
|
+
self.prompt_template = get_prompt_template(
|
|
55
|
+
self.config.get(PROMPT_TEMPLATE_CONFIG_KEY),
|
|
56
|
+
DEFAULT_REPHRASING_PROMPT_TEMPLATE,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
@staticmethod
|
|
60
|
+
def validate_config(config: Dict[str, Any]) -> None:
|
|
61
|
+
"""Validate the rephrase_config."""
|
|
62
|
+
if LLM_CONFIG_KEY in config:
|
|
63
|
+
llm_config = config.get(LLM_CONFIG_KEY)
|
|
64
|
+
|
|
65
|
+
# Check if LLM configuration is set to None, {}.
|
|
66
|
+
if llm_config is None:
|
|
67
|
+
error = "LLM config is empty. Please provide a valid LLM config."
|
|
68
|
+
structlogger.error("rephrase_config.empty_llm_config", error=error)
|
|
69
|
+
raise ValueError(error)
|
|
70
|
+
|
|
71
|
+
# Validate LLM model name or model in config.
|
|
72
|
+
if not llm_config.get(MODEL_CONFIG_KEY) and not llm_config.get(
|
|
73
|
+
MODEL_NAME_CONFIG_KEY
|
|
74
|
+
):
|
|
75
|
+
error = (
|
|
76
|
+
"LLM model name is empty. Please provide a valid LLM model name."
|
|
77
|
+
)
|
|
78
|
+
structlogger.error("rephrase_config.llm_model_is_not_set", error=error)
|
|
79
|
+
raise ValueError(error)
|
|
80
|
+
|
|
81
|
+
# Check if the config contains only the allowed keys.
|
|
82
|
+
allowed_keys = {PROMPT_TEMPLATE_CONFIG_KEY, LLM_CONFIG_KEY}
|
|
83
|
+
if len(set(config.keys()) - allowed_keys) > 0:
|
|
84
|
+
error = (
|
|
85
|
+
f"Invalid rephrase config. Only the following keys are allowed: "
|
|
86
|
+
f"{', '.join(allowed_keys)}."
|
|
87
|
+
)
|
|
88
|
+
structlogger.error("rephrase_config.invalid_keys", error=error)
|
|
89
|
+
raise ValueError(error)
|
|
90
|
+
|
|
91
|
+
@staticmethod
|
|
92
|
+
def get_default_config() -> Dict[str, Any]:
|
|
93
|
+
"""The component's default config (see parent class for full docstring)."""
|
|
94
|
+
return {
|
|
95
|
+
PROMPT_TEMPLATE_CONFIG_KEY: None,
|
|
96
|
+
LLM_CONFIG_KEY: DEFAULT_LLM_CONFIG,
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async def rephrase_conversation(
|
|
100
|
+
self, conversation: Conversation, number_of_rephrasings: int = 10
|
|
101
|
+
) -> List[RephrasedUserMessage]:
|
|
102
|
+
"""Create rephrasings for each user message in the conversation.
|
|
103
|
+
|
|
104
|
+
For each user message create <number_of_rephrasings> number of rephrasings.
|
|
105
|
+
The rephrasings are created with an LLM.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
conversation: The conversation.
|
|
109
|
+
number_of_rephrasings: The number of rephrasings to produce per user
|
|
110
|
+
message.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
A list of rephrased user messages.
|
|
114
|
+
"""
|
|
115
|
+
prompt = self._render_template(conversation, number_of_rephrasings)
|
|
116
|
+
|
|
117
|
+
result = await self._invoke_llm(prompt)
|
|
118
|
+
|
|
119
|
+
rephrased_user_messages = self._parse_output(
|
|
120
|
+
result, conversation.get_user_messages()
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
# Check if user message was successfully rephrased
|
|
124
|
+
self._check_rephrasings(
|
|
125
|
+
rephrased_user_messages, number_of_rephrasings, result, conversation.name
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
return rephrased_user_messages
|
|
129
|
+
|
|
130
|
+
async def _invoke_llm(self, prompt: str) -> str:
|
|
131
|
+
llm = llm_factory(self.config.get(LLM_CONFIG_KEY), DEFAULT_LLM_CONFIG)
|
|
132
|
+
try:
|
|
133
|
+
llm_response = await llm.acompletion(prompt)
|
|
134
|
+
return llm_response.choices[0]
|
|
135
|
+
except Exception as e:
|
|
136
|
+
# unfortunately, langchain does not wrap LLM exceptions which means
|
|
137
|
+
# we have to catch all exceptions here
|
|
138
|
+
structlogger.error(
|
|
139
|
+
"conversation_rephraser.rephrase_conversation.llm.error", error=e
|
|
140
|
+
)
|
|
141
|
+
raise ProviderClientAPIException(e, message="LLM call exception")
|
|
142
|
+
|
|
143
|
+
def _render_template(
|
|
144
|
+
self,
|
|
145
|
+
conversation: Conversation,
|
|
146
|
+
number_of_rephrasings: int,
|
|
147
|
+
) -> str:
|
|
148
|
+
user_messages = conversation.get_user_messages()
|
|
149
|
+
number_of_user_messages = len(user_messages)
|
|
150
|
+
|
|
151
|
+
return Template(self.prompt_template).render(
|
|
152
|
+
test_case_name=conversation.name,
|
|
153
|
+
transcript=conversation.transcript,
|
|
154
|
+
number_of_user_messages=number_of_user_messages,
|
|
155
|
+
number_of_rephrasings=number_of_rephrasings,
|
|
156
|
+
user_prefix=USER,
|
|
157
|
+
user_messages=user_messages,
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
@staticmethod
|
|
161
|
+
def _extract_rephrasings(block: str) -> Tuple[Optional[str], Optional[List[str]]]:
|
|
162
|
+
"""Extract the rephrasings for a specific user message.
|
|
163
|
+
|
|
164
|
+
Expected format looks like this:
|
|
165
|
+
USER: <user message>
|
|
166
|
+
1. <rephrased message 1>
|
|
167
|
+
2. <rephrased message 2>
|
|
168
|
+
3. <rephrased message 3>
|
|
169
|
+
...
|
|
170
|
+
|
|
171
|
+
Args:
|
|
172
|
+
block: String that contains the user message and its rephrasings.
|
|
173
|
+
|
|
174
|
+
Returns:
|
|
175
|
+
The original user message and the list of rephrasings.
|
|
176
|
+
"""
|
|
177
|
+
if not block.strip():
|
|
178
|
+
return None, None
|
|
179
|
+
|
|
180
|
+
# Split the block by new line character
|
|
181
|
+
lines = block.strip().split("\n")
|
|
182
|
+
# Filter out empty lines and lines that are equal to """
|
|
183
|
+
lines = [line.strip() for line in lines]
|
|
184
|
+
lines = [line for line in lines if line and line != '"""']
|
|
185
|
+
|
|
186
|
+
# We need at least the original user message and one rephrasing
|
|
187
|
+
if len(lines) < 2:
|
|
188
|
+
return None, None
|
|
189
|
+
|
|
190
|
+
# Extract the user message from the first line
|
|
191
|
+
# (ideally prefixed with 'USER: ')
|
|
192
|
+
if lines[0].startswith("USER:"):
|
|
193
|
+
original_user_message = lines[0][len(f"{USER}:") :].strip()
|
|
194
|
+
else:
|
|
195
|
+
original_user_message = lines[0]
|
|
196
|
+
|
|
197
|
+
# Extract rephrasings
|
|
198
|
+
rephrasings = []
|
|
199
|
+
for line in lines[1:]:
|
|
200
|
+
# Remove bullets or numbering and any extra whitespace
|
|
201
|
+
line = re.sub(r"^\s*[-\d\.]+", "", line).strip()
|
|
202
|
+
if line.startswith("USER:"):
|
|
203
|
+
line = line[len(f"{USER}:") :].strip()
|
|
204
|
+
if line:
|
|
205
|
+
rephrasings.append(line)
|
|
206
|
+
|
|
207
|
+
return original_user_message, rephrasings
|
|
208
|
+
|
|
209
|
+
def _parse_output(
|
|
210
|
+
self, output: str, user_messages: List[str]
|
|
211
|
+
) -> List[RephrasedUserMessage]:
|
|
212
|
+
rephrased_messages = [
|
|
213
|
+
RephrasedUserMessage(message, []) for message in user_messages
|
|
214
|
+
]
|
|
215
|
+
|
|
216
|
+
message_blocks = self._get_message_blocks(output, len(rephrased_messages))
|
|
217
|
+
for block in message_blocks:
|
|
218
|
+
original_user_message, rephrasings = self._extract_rephrasings(block)
|
|
219
|
+
|
|
220
|
+
if not original_user_message or not rephrasings:
|
|
221
|
+
continue
|
|
222
|
+
|
|
223
|
+
# Add the rephrasings to the correct user message
|
|
224
|
+
for rephrased_message in rephrased_messages:
|
|
225
|
+
if (
|
|
226
|
+
rephrased_message.original_user_message.lower()
|
|
227
|
+
== original_user_message.lower()
|
|
228
|
+
):
|
|
229
|
+
rephrased_message.rephrasings = rephrasings
|
|
230
|
+
|
|
231
|
+
return rephrased_messages
|
|
232
|
+
|
|
233
|
+
@staticmethod
|
|
234
|
+
def _get_message_blocks(output: str, expected_number_of_blocks: int) -> List[str]:
|
|
235
|
+
# Each user message block is (ideally) separated by new line ("\n\n")
|
|
236
|
+
# USER: <user message>
|
|
237
|
+
# 1. <rephrasing>
|
|
238
|
+
#
|
|
239
|
+
# USER: <user message>
|
|
240
|
+
# 1. <rephrasing>
|
|
241
|
+
message_blocks = output.split(SEPARATOR)
|
|
242
|
+
if len(message_blocks) == expected_number_of_blocks:
|
|
243
|
+
return message_blocks
|
|
244
|
+
|
|
245
|
+
# In case the message blocks are not separated by new line, try to split it
|
|
246
|
+
# by "\nUSER:", e.g.
|
|
247
|
+
# USER: <user message>
|
|
248
|
+
# 1. <rephrasing>
|
|
249
|
+
# USER: <user message>
|
|
250
|
+
# 1. <rephrasing>
|
|
251
|
+
message_blocks = output.split(BACKUP_SEPARATOR)
|
|
252
|
+
if len(message_blocks) == expected_number_of_blocks:
|
|
253
|
+
return message_blocks
|
|
254
|
+
|
|
255
|
+
return []
|
|
256
|
+
|
|
257
|
+
@staticmethod
|
|
258
|
+
def _check_rephrasings(
|
|
259
|
+
rephrased_messages: List[RephrasedUserMessage],
|
|
260
|
+
number_of_rephrasings: int,
|
|
261
|
+
llm_output: str,
|
|
262
|
+
conversation_name: str,
|
|
263
|
+
) -> None:
|
|
264
|
+
incorrect_rephrasings_for_messages = []
|
|
265
|
+
|
|
266
|
+
for message in rephrased_messages:
|
|
267
|
+
if (
|
|
268
|
+
not message.rephrasings
|
|
269
|
+
or len(message.rephrasings) != number_of_rephrasings
|
|
270
|
+
):
|
|
271
|
+
incorrect_rephrasings_for_messages.append(message.original_user_message)
|
|
272
|
+
|
|
273
|
+
if incorrect_rephrasings_for_messages:
|
|
274
|
+
structlogger.warning(
|
|
275
|
+
"conversation_rephraser.rephrase_conversation.parse_llm_output",
|
|
276
|
+
warning="Failed to parse llm output correctly. Not all user messages"
|
|
277
|
+
"were successfully rephrased.",
|
|
278
|
+
llm_output=llm_output,
|
|
279
|
+
conversation_name=conversation_name,
|
|
280
|
+
incorrect_rephrasings_for_messages=incorrect_rephrasings_for_messages,
|
|
281
|
+
)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
Objective:
|
|
2
|
+
Create multiple rephrasings of user messages tailored to the "{{ test_case_name }}" conversation scenario.
|
|
3
|
+
|
|
4
|
+
===
|
|
5
|
+
Conversation overview:
|
|
6
|
+
{{ transcript or "Not provided." }}
|
|
7
|
+
|
|
8
|
+
===
|
|
9
|
+
Task:
|
|
10
|
+
Produce {{ number_of_rephrasings }} rephrasings for each user message that are diverse yet contextually appropriate.
|
|
11
|
+
Preserve the intent and content, but vary the structure, formality, and detail.
|
|
12
|
+
Only rephrase messages prefixed with "{{ user_prefix }}:".
|
|
13
|
+
|
|
14
|
+
Guidelines:
|
|
15
|
+
- Use a variety of expressions from brief and casual to elaborate and formal.
|
|
16
|
+
- Vary sentence structures, vocabularies, and expressions creatively.
|
|
17
|
+
- Keep the core message intact with concise and simple modifications.
|
|
18
|
+
|
|
19
|
+
Format:
|
|
20
|
+
- Each original user message should be prefixed with "USER: ".
|
|
21
|
+
- Enumerate the rephrasing.
|
|
22
|
+
- Separate each user message set with a line break.
|
|
23
|
+
|
|
24
|
+
===
|
|
25
|
+
Example output for 3 rephrasings of 2 user messages:
|
|
26
|
+
"""
|
|
27
|
+
USER: Show invoices
|
|
28
|
+
1. I want to see my bills.
|
|
29
|
+
2. I mean bills
|
|
30
|
+
3. Yes, I want to see the invoices.
|
|
31
|
+
|
|
32
|
+
USER: I'd like to book a car
|
|
33
|
+
1. I need to reserve a car.
|
|
34
|
+
2. Could I arrange for a car rental?
|
|
35
|
+
3. I'm interested in hiring a car.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
===
|
|
39
|
+
Expected output:
|
|
40
|
+
{{ number_of_rephrasings }} rephrasings for the following {{ number_of_user_messages }} user messages in the expected
|
|
41
|
+
format:
|
|
42
|
+
{% for message in user_messages -%}
|
|
43
|
+
- {{ message }}
|
|
44
|
+
{% endfor %}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
from typing import Dict, Any, List
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
|
|
5
|
+
from rasa.dialogue_understanding.commands import Command, SetSlotCommand
|
|
6
|
+
from rasa.dialogue_understanding.generator import SingleStepLLMCommandGenerator
|
|
7
|
+
from rasa.llm_fine_tuning.conversations import Conversation, ConversationStep
|
|
8
|
+
from rasa.llm_fine_tuning.paraphrasing.rephrased_user_message import (
|
|
9
|
+
RephrasedUserMessage,
|
|
10
|
+
)
|
|
11
|
+
from rasa.shared.core.flows import FlowsList
|
|
12
|
+
from rasa.shared.exceptions import ProviderClientAPIException
|
|
13
|
+
from rasa.shared.utils.llm import (
|
|
14
|
+
llm_factory,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
structlogger = structlog.get_logger()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class RephraseValidator:
|
|
21
|
+
def __init__(self, llm_config: Dict[str, Any], flows: FlowsList) -> None:
|
|
22
|
+
self.llm_config = llm_config
|
|
23
|
+
self.flows = flows
|
|
24
|
+
|
|
25
|
+
async def validate_rephrasings(
|
|
26
|
+
self,
|
|
27
|
+
rephrasings: List[RephrasedUserMessage],
|
|
28
|
+
conversation: Conversation,
|
|
29
|
+
) -> List[RephrasedUserMessage]:
|
|
30
|
+
"""Split rephrased user messages into passing and failing.
|
|
31
|
+
|
|
32
|
+
Call an LLM using the same config of the former trained model with an updated
|
|
33
|
+
prompt from the original user message (replace all occurrences of the original
|
|
34
|
+
user message with the rephrased user message). Check if the
|
|
35
|
+
rephrased user message is producing the same commands as the original user
|
|
36
|
+
message. The rephase is passing if the commands match and failing otherwise.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
rephrasings: The rephrased user messages.
|
|
40
|
+
conversation: The conversation.
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
A list of rephrased user messages including the passing and failing
|
|
44
|
+
rephrases.
|
|
45
|
+
"""
|
|
46
|
+
for i, step in enumerate(
|
|
47
|
+
conversation.iterate_over_annotated_user_steps(rephrase=True)
|
|
48
|
+
):
|
|
49
|
+
current_rephrasings = rephrasings[i]
|
|
50
|
+
|
|
51
|
+
for rephrase in current_rephrasings.rephrasings:
|
|
52
|
+
if await self._validate_rephrase_is_passing(rephrase, step):
|
|
53
|
+
current_rephrasings.passed_rephrasings.append(rephrase)
|
|
54
|
+
else:
|
|
55
|
+
current_rephrasings.failed_rephrasings.append(rephrase)
|
|
56
|
+
|
|
57
|
+
return rephrasings
|
|
58
|
+
|
|
59
|
+
async def _validate_rephrase_is_passing(
|
|
60
|
+
self,
|
|
61
|
+
rephrase: str,
|
|
62
|
+
step: ConversationStep,
|
|
63
|
+
) -> bool:
|
|
64
|
+
prompt = self._update_prompt(
|
|
65
|
+
rephrase, step.original_test_step.text, step.llm_prompt
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
action_list = await self._invoke_llm(prompt)
|
|
69
|
+
|
|
70
|
+
commands_from_original_utterance = step.llm_commands
|
|
71
|
+
commands_from_rephrased_utterance = (
|
|
72
|
+
SingleStepLLMCommandGenerator.parse_commands(action_list, None, self.flows)
|
|
73
|
+
)
|
|
74
|
+
return self._check_commands_match(
|
|
75
|
+
commands_from_original_utterance, commands_from_rephrased_utterance
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
async def _invoke_llm(self, prompt: str) -> str:
|
|
79
|
+
from rasa.dialogue_understanding.generator.constants import DEFAULT_LLM_CONFIG
|
|
80
|
+
|
|
81
|
+
llm = llm_factory(self.llm_config, DEFAULT_LLM_CONFIG)
|
|
82
|
+
|
|
83
|
+
try:
|
|
84
|
+
llm_response = await llm.acompletion(prompt)
|
|
85
|
+
return llm_response.choices[0]
|
|
86
|
+
except Exception as e:
|
|
87
|
+
# unfortunately, langchain does not wrap LLM exceptions which means
|
|
88
|
+
# we have to catch all exceptions here
|
|
89
|
+
structlogger.error(
|
|
90
|
+
"rephrase_validator.validate_conversation.llm.error", error=e
|
|
91
|
+
)
|
|
92
|
+
raise ProviderClientAPIException(e, message="LLM call exception")
|
|
93
|
+
|
|
94
|
+
@staticmethod
|
|
95
|
+
def _check_commands_match(
|
|
96
|
+
expected_commands: List[Command], actual_commands: List[Command]
|
|
97
|
+
) -> bool:
|
|
98
|
+
if len(expected_commands) != len(actual_commands):
|
|
99
|
+
return False
|
|
100
|
+
|
|
101
|
+
for expected_command in expected_commands:
|
|
102
|
+
if isinstance(expected_command, SetSlotCommand):
|
|
103
|
+
slot_name = expected_command.name
|
|
104
|
+
match_found = False
|
|
105
|
+
for c in actual_commands:
|
|
106
|
+
if isinstance(c, SetSlotCommand) and c.name == slot_name:
|
|
107
|
+
match_found = True
|
|
108
|
+
break
|
|
109
|
+
if not match_found:
|
|
110
|
+
return False
|
|
111
|
+
|
|
112
|
+
elif expected_command not in actual_commands:
|
|
113
|
+
return False
|
|
114
|
+
|
|
115
|
+
return True
|
|
116
|
+
|
|
117
|
+
@staticmethod
|
|
118
|
+
def _update_prompt(
|
|
119
|
+
rephrased_user_message: str, original_user_message: str, prompt: str
|
|
120
|
+
) -> str:
|
|
121
|
+
return prompt.replace(original_user_message, rephrased_user_message)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
|
+
from typing import List
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
@dataclass
|
|
6
|
+
class RephrasedUserMessage:
|
|
7
|
+
original_user_message: str
|
|
8
|
+
rephrasings: List[str]
|
|
9
|
+
failed_rephrasings: List[str] = field(default_factory=list)
|
|
10
|
+
passed_rephrasings: List[str] = field(default_factory=list)
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
from typing import List, Dict, Any, Tuple
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
from tqdm import tqdm
|
|
5
|
+
|
|
6
|
+
from rasa.llm_fine_tuning.conversations import Conversation
|
|
7
|
+
from rasa.llm_fine_tuning.paraphrasing.conversation_rephraser import (
|
|
8
|
+
ConversationRephraser,
|
|
9
|
+
)
|
|
10
|
+
from rasa.llm_fine_tuning.paraphrasing.rephrase_validator import RephraseValidator
|
|
11
|
+
from rasa.llm_fine_tuning.paraphrasing.rephrased_user_message import (
|
|
12
|
+
RephrasedUserMessage,
|
|
13
|
+
)
|
|
14
|
+
from rasa.llm_fine_tuning.storage import StorageContext
|
|
15
|
+
from rasa.shared.core.flows import FlowsList
|
|
16
|
+
from rasa.shared.exceptions import ProviderClientAPIException
|
|
17
|
+
|
|
18
|
+
PARAPHRASING_MODULE_STORAGE_LOCATION = "2_rephrasings"
|
|
19
|
+
|
|
20
|
+
structlogger = structlog.get_logger()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
async def create_paraphrased_conversations(
|
|
24
|
+
conversations: List[Conversation],
|
|
25
|
+
rephrase_config: Dict[str, Any],
|
|
26
|
+
num_rephrases: int,
|
|
27
|
+
flows: FlowsList,
|
|
28
|
+
llm_command_generator_config: Dict[str, Any],
|
|
29
|
+
storage_context: StorageContext,
|
|
30
|
+
) -> Tuple[List[Conversation], Dict[str, Any]]:
|
|
31
|
+
"""Create paraphrased conversations.
|
|
32
|
+
|
|
33
|
+
Rephrase all user messages of a conversation and divide them into passing
|
|
34
|
+
and failing rephrasings.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
conversations: The conversations.
|
|
38
|
+
rephrase_config: The path to the rephrase configuration file.
|
|
39
|
+
num_rephrases: The number of rephrases to produce per user message.
|
|
40
|
+
flows: All flows.
|
|
41
|
+
llm_command_generator_config: The configuration of the trained model.
|
|
42
|
+
storage_context: The storage context.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
The conversations including rephrasings and the configuration used for
|
|
46
|
+
rephrasing.
|
|
47
|
+
"""
|
|
48
|
+
rephraser = ConversationRephraser(rephrase_config)
|
|
49
|
+
validator = RephraseValidator(llm_command_generator_config, flows)
|
|
50
|
+
|
|
51
|
+
if num_rephrases <= 0:
|
|
52
|
+
structlogger.info(
|
|
53
|
+
"paraphrasing_module.skip",
|
|
54
|
+
num_rephrases=num_rephrases,
|
|
55
|
+
message="Skipping paraphrasing module as user messages should not be "
|
|
56
|
+
"rephrased.",
|
|
57
|
+
)
|
|
58
|
+
return conversations, rephraser.config
|
|
59
|
+
|
|
60
|
+
rephrased_conversations: List[Conversation] = []
|
|
61
|
+
for i in tqdm(range(len(conversations))):
|
|
62
|
+
current_conversation = conversations[i]
|
|
63
|
+
|
|
64
|
+
try:
|
|
65
|
+
# rephrase all user messages even if rephrase=False is set
|
|
66
|
+
# to not confuse the LLM and get valid output
|
|
67
|
+
rephrasings = await rephraser.rephrase_conversation(
|
|
68
|
+
conversations[i], num_rephrases
|
|
69
|
+
)
|
|
70
|
+
# filter out the rephrasings for user messages that have rephrase=False set
|
|
71
|
+
rephrasings = _filter_rephrasings(rephrasings, conversations[i])
|
|
72
|
+
# check if the rephrasings are still producing the same commands
|
|
73
|
+
rephrasings = await validator.validate_rephrasings(
|
|
74
|
+
rephrasings, current_conversation
|
|
75
|
+
)
|
|
76
|
+
except ProviderClientAPIException as e:
|
|
77
|
+
structlogger.error(
|
|
78
|
+
"paraphrasing_module.skip_conversation",
|
|
79
|
+
conversation=current_conversation.name,
|
|
80
|
+
exception=str(e),
|
|
81
|
+
)
|
|
82
|
+
continue
|
|
83
|
+
|
|
84
|
+
for j, step in enumerate(
|
|
85
|
+
current_conversation.iterate_over_annotated_user_steps(rephrase=True)
|
|
86
|
+
):
|
|
87
|
+
step.passed_rephrasings = rephrasings[j].passed_rephrasings
|
|
88
|
+
step.failed_rephrasings = rephrasings[j].failed_rephrasings
|
|
89
|
+
|
|
90
|
+
rephrased_conversations.append(current_conversation)
|
|
91
|
+
|
|
92
|
+
storage_context.write_conversations(
|
|
93
|
+
conversations, PARAPHRASING_MODULE_STORAGE_LOCATION
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
return rephrased_conversations, rephraser.config
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _filter_rephrasings(
|
|
100
|
+
rephrasings: List[RephrasedUserMessage], conversation: Conversation
|
|
101
|
+
) -> List[RephrasedUserMessage]:
|
|
102
|
+
"""Filter rephrasings.
|
|
103
|
+
|
|
104
|
+
Return only those rephrasings for user messages that have rephrase=True.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
rephrasings: All rephrased user messages of the conversation.
|
|
108
|
+
conversation: The conversation.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
Rephrasings for those user messages that have rephrase=True.
|
|
112
|
+
"""
|
|
113
|
+
filtered_rephrasings = []
|
|
114
|
+
index = 0
|
|
115
|
+
user_messages = conversation.get_user_messages_to_rephrase()
|
|
116
|
+
|
|
117
|
+
for rephrasing in rephrasings:
|
|
118
|
+
if index >= len(user_messages):
|
|
119
|
+
break
|
|
120
|
+
|
|
121
|
+
# the user messages and the rephrasings are in the same order
|
|
122
|
+
# rephrasings might contain more user messages as the user messages that
|
|
123
|
+
# should be rephrased
|
|
124
|
+
if rephrasing.original_user_message == user_messages[index]:
|
|
125
|
+
filtered_rephrasings.append(rephrasing)
|
|
126
|
+
index += 1
|
|
127
|
+
|
|
128
|
+
return filtered_rephrasings
|