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,117 @@
|
|
|
1
|
+
import structlog
|
|
2
|
+
from rasa.shared.utils.io import raise_deprecation_warning
|
|
3
|
+
|
|
4
|
+
structlogger = structlog.get_logger()
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def resolve_aliases(config: dict, deprecated_alias_mapping: dict) -> dict:
|
|
8
|
+
"""
|
|
9
|
+
Resolve aliases in the configuration to standard keys.
|
|
10
|
+
|
|
11
|
+
Args:
|
|
12
|
+
config: Dictionary containing the configuration.
|
|
13
|
+
deprecated_alias_mapping: Dictionary mapping aliases to
|
|
14
|
+
their standard keys.
|
|
15
|
+
|
|
16
|
+
Returns:
|
|
17
|
+
New dictionary containing the processed configuration.
|
|
18
|
+
"""
|
|
19
|
+
config = config.copy()
|
|
20
|
+
|
|
21
|
+
for alias, standard_key in deprecated_alias_mapping.items():
|
|
22
|
+
# We check for the alias instead of the standard key because our goal is to
|
|
23
|
+
# update the standard key when the alias is found. Since the standard key is
|
|
24
|
+
# always included in the default component configurations, we overwrite it
|
|
25
|
+
# with the alias value if the alias exists.
|
|
26
|
+
if alias in config:
|
|
27
|
+
config[standard_key] = config.pop(alias)
|
|
28
|
+
|
|
29
|
+
return config
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def raise_deprecation_warnings(config: dict, deprecated_alias_mapping: dict) -> None:
|
|
33
|
+
"""
|
|
34
|
+
Raises warnings for deprecated keys in the configuration.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
config: Dictionary containing the configuration.
|
|
38
|
+
deprecated_alias_mapping: Dictionary mapping deprecated keys to
|
|
39
|
+
their standard keys.
|
|
40
|
+
|
|
41
|
+
Raises:
|
|
42
|
+
DeprecationWarning: If any deprecated key is found in the config.
|
|
43
|
+
"""
|
|
44
|
+
for alias, standard_key in deprecated_alias_mapping.items():
|
|
45
|
+
if alias in config:
|
|
46
|
+
raise_deprecation_warning(
|
|
47
|
+
message=(
|
|
48
|
+
f"'{alias}' is deprecated and will be removed in "
|
|
49
|
+
f"4.0.0. Use '{standard_key}' instead."
|
|
50
|
+
)
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def validate_required_keys(config: dict, required_keys: list) -> None:
|
|
55
|
+
"""
|
|
56
|
+
Validates that the passed config contains all the required keys.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
config: Dictionary containing the configuration.
|
|
60
|
+
required_keys: List of keys that must be present in the config.
|
|
61
|
+
|
|
62
|
+
Raises:
|
|
63
|
+
ValueError: If any required key is missing.
|
|
64
|
+
"""
|
|
65
|
+
missing_keys = [key for key in required_keys if key not in config]
|
|
66
|
+
if missing_keys:
|
|
67
|
+
message = f"Missing required keys '{missing_keys}' for configuration."
|
|
68
|
+
structlogger.error(
|
|
69
|
+
"validate_required_keys",
|
|
70
|
+
message=message,
|
|
71
|
+
missing_keys=missing_keys,
|
|
72
|
+
config=config,
|
|
73
|
+
)
|
|
74
|
+
raise ValueError(message)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def validate_forbidden_keys(config: dict, forbidden_keys: list) -> None:
|
|
78
|
+
"""
|
|
79
|
+
Validates that the passed config doesn't contain any forbidden keys.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
config: Dictionary containing the configuration.
|
|
83
|
+
forbidden_keys: List of keys that are forbidden in the config.
|
|
84
|
+
|
|
85
|
+
Raises:
|
|
86
|
+
ValueError: If any forbidden key is present.
|
|
87
|
+
"""
|
|
88
|
+
forbidden_keys_in_config = set(config.keys()).intersection(set(forbidden_keys))
|
|
89
|
+
|
|
90
|
+
if forbidden_keys_in_config:
|
|
91
|
+
message = (
|
|
92
|
+
f"Forbidden keys '{forbidden_keys_in_config}' present "
|
|
93
|
+
f"in the configuration."
|
|
94
|
+
)
|
|
95
|
+
structlogger.error(
|
|
96
|
+
"validate_forbidden_keys",
|
|
97
|
+
message=message,
|
|
98
|
+
forbidden_keys=forbidden_keys_in_config,
|
|
99
|
+
config=config,
|
|
100
|
+
)
|
|
101
|
+
raise ValueError(message)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def get_provider_prefixed_model_name(provider: str, model: str) -> str:
|
|
105
|
+
"""
|
|
106
|
+
Returns the model name with the provider prefixed.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
provider: The provider of the model.
|
|
110
|
+
model: The model name.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
The model name with the provider prefixed.
|
|
114
|
+
"""
|
|
115
|
+
if model and f"{provider}/" not in model:
|
|
116
|
+
return f"{provider}/{model}"
|
|
117
|
+
return model
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from typing import Optional, Union
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
import litellm
|
|
6
|
+
from rasa.shared.constants import (
|
|
7
|
+
RASA_CA_BUNDLE_ENV_VAR,
|
|
8
|
+
REQUESTS_CA_BUNDLE_ENV_VAR,
|
|
9
|
+
RASA_SSL_CERTIFICATE_ENV_VAR,
|
|
10
|
+
LITELLM_SSL_VERIFY_ENV_VAR,
|
|
11
|
+
LITELLM_SSL_CERTIFICATE_ENV_VAR,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
import structlog
|
|
15
|
+
|
|
16
|
+
from rasa.shared.utils.io import raise_deprecation_warning
|
|
17
|
+
|
|
18
|
+
structlogger = structlog.get_logger()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def ensure_ssl_certificates_for_litellm_non_openai_based_clients() -> None:
|
|
22
|
+
"""
|
|
23
|
+
Ensure SSL certificates configuration for LiteLLM based on environment
|
|
24
|
+
variables for clients that are not utilizing OpenAI's clients from
|
|
25
|
+
`openai` library.
|
|
26
|
+
"""
|
|
27
|
+
ssl_verify = _get_ssl_verify()
|
|
28
|
+
ssl_certificate = _get_ssl_cert()
|
|
29
|
+
|
|
30
|
+
structlogger.debug(
|
|
31
|
+
"ensure_ssl_certificates_for_litellm_non_openai_based_clients",
|
|
32
|
+
ssl_verify=ssl_verify,
|
|
33
|
+
ssl_certificate=ssl_certificate,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
if ssl_verify is not None:
|
|
37
|
+
litellm.ssl_verify = ssl_verify
|
|
38
|
+
if ssl_certificate is not None:
|
|
39
|
+
litellm.ssl_certificate = ssl_certificate
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def ensure_ssl_certificates_for_litellm_openai_based_clients() -> None:
|
|
43
|
+
"""
|
|
44
|
+
Ensure SSL certificates configuration for LiteLLM based on environment
|
|
45
|
+
variables for clients that are utilizing OpenAI's clients from
|
|
46
|
+
`openai` library.
|
|
47
|
+
|
|
48
|
+
The ssl configuration is ensured by setting `litellm.client_session` and
|
|
49
|
+
`litellm.aclient_session` if not previously set.
|
|
50
|
+
"""
|
|
51
|
+
client_args = {}
|
|
52
|
+
|
|
53
|
+
ssl_verify = _get_ssl_verify()
|
|
54
|
+
ssl_certificate = _get_ssl_cert()
|
|
55
|
+
|
|
56
|
+
structlogger.debug(
|
|
57
|
+
"ensure_ssl_certificates_for_litellm_openai_based_clients",
|
|
58
|
+
ssl_verify=ssl_verify,
|
|
59
|
+
ssl_certificate=ssl_certificate,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
if ssl_verify is not None:
|
|
63
|
+
client_args["verify"] = ssl_verify
|
|
64
|
+
if ssl_certificate is not None:
|
|
65
|
+
client_args["cert"] = ssl_certificate
|
|
66
|
+
|
|
67
|
+
if client_args and not isinstance(litellm.aclient_session, httpx.AsyncClient):
|
|
68
|
+
litellm.aclient_session = httpx.AsyncClient(**client_args)
|
|
69
|
+
if client_args and not isinstance(litellm.client_session, httpx.Client):
|
|
70
|
+
litellm.client_session = httpx.Client(**client_args)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _get_ssl_verify() -> Optional[Union[bool, str]]:
|
|
74
|
+
"""
|
|
75
|
+
Environment variable priority (ssl verify):
|
|
76
|
+
1. `RASA_CA_BUNDLE`: Preferred for SSL verification.
|
|
77
|
+
2. `REQUESTS_CA_BUNDLE`: Deprecated; use `RASA_CA_BUNDLE_ENV_VAR` instead.
|
|
78
|
+
3. `SSL_VERIFY`: Fallback for SSL verification.
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
Path to a self-signed SSL certificate or None if no SSL certificate is found.
|
|
82
|
+
"""
|
|
83
|
+
if os.environ.get(REQUESTS_CA_BUNDLE_ENV_VAR) and os.environ.get(
|
|
84
|
+
RASA_CA_BUNDLE_ENV_VAR
|
|
85
|
+
):
|
|
86
|
+
raise_deprecation_warning(
|
|
87
|
+
"Both REQUESTS_CA_BUNDLE and RASA_CA_BUNDLE environment variables are set. "
|
|
88
|
+
"RASA_CA_BUNDLE will be used as the SSL verification path.\n"
|
|
89
|
+
"Support of the REQUESTS_CA_BUNDLE environment variable is deprecated and "
|
|
90
|
+
"will be removed in Rasa Pro 4.0.0. Please set the RASA_CA_BUNDLE "
|
|
91
|
+
"environment variable instead."
|
|
92
|
+
)
|
|
93
|
+
elif os.environ.get(REQUESTS_CA_BUNDLE_ENV_VAR):
|
|
94
|
+
raise_deprecation_warning(
|
|
95
|
+
"Support of the REQUESTS_CA_BUNDLE environment variable is deprecated and "
|
|
96
|
+
"will be removed in Rasa Pro 4.0.0. Please set the RASA_CA_BUNDLE "
|
|
97
|
+
"environment variable instead."
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
return (
|
|
101
|
+
os.environ.get(RASA_CA_BUNDLE_ENV_VAR)
|
|
102
|
+
# Deprecated
|
|
103
|
+
or os.environ.get(REQUESTS_CA_BUNDLE_ENV_VAR)
|
|
104
|
+
# From LiteLLM, use as a fallback
|
|
105
|
+
or os.environ.get(LITELLM_SSL_VERIFY_ENV_VAR)
|
|
106
|
+
or None
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _get_ssl_cert() -> Optional[str]:
|
|
111
|
+
"""
|
|
112
|
+
Environment variable priority (ssl certificate):
|
|
113
|
+
1. `RASA_SSL_CERTIFICATE`: Preferred for client certificate.
|
|
114
|
+
2. `SSL_CERTIFICATE`: Fallback for client certificate.
|
|
115
|
+
|
|
116
|
+
Returns:
|
|
117
|
+
Path to a SSL certificate or None if no SSL certificate is found.
|
|
118
|
+
"""
|
|
119
|
+
return (
|
|
120
|
+
os.environ.get(RASA_SSL_CERTIFICATE_ENV_VAR)
|
|
121
|
+
# From LiteLLM, use as a fallback
|
|
122
|
+
or os.environ.get(LITELLM_SSL_CERTIFICATE_ENV_VAR)
|
|
123
|
+
or None
|
|
124
|
+
)
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import structlog
|
|
2
|
+
|
|
3
|
+
from rasa.shared.constants import (
|
|
4
|
+
AWS_ACCESS_KEY_ID_ENV_VAR,
|
|
5
|
+
AWS_ACCESS_KEY_ID_CONFIG_KEY,
|
|
6
|
+
AWS_SECRET_ACCESS_KEY_ENV_VAR,
|
|
7
|
+
AWS_SECRET_ACCESS_KEY_CONFIG_KEY,
|
|
8
|
+
AWS_REGION_NAME_ENV_VAR,
|
|
9
|
+
AWS_REGION_NAME_CONFIG_KEY,
|
|
10
|
+
AWS_SESSION_TOKEN_CONFIG_KEY,
|
|
11
|
+
AWS_SESSION_TOKEN_ENV_VAR,
|
|
12
|
+
)
|
|
13
|
+
from rasa.shared.exceptions import ProviderClientValidationError
|
|
14
|
+
from litellm import validate_environment
|
|
15
|
+
from rasa.shared.providers.embedding._base_litellm_embedding_client import (
|
|
16
|
+
_VALIDATE_ENVIRONMENT_MISSING_KEYS_KEY,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
structlogger = structlog.get_logger()
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def validate_aws_setup_for_litellm_clients(
|
|
23
|
+
litellm_model_name: str, litellm_call_kwargs: dict, source_log: str
|
|
24
|
+
) -> None:
|
|
25
|
+
"""Validates the AWS setup for LiteLLM clients to ensure all required
|
|
26
|
+
environment variables or corresponding call kwargs are set.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
litellm_model_name (str): The name of the LiteLLM model being validated.
|
|
30
|
+
litellm_call_kwargs (dict): Additional keyword arguments passed to the client,
|
|
31
|
+
which may include configuration values for AWS credentials.
|
|
32
|
+
source_log (str): The source log identifier for structured logging.
|
|
33
|
+
|
|
34
|
+
Raises:
|
|
35
|
+
ProviderClientValidationError: If any required AWS environment variable
|
|
36
|
+
or corresponding configuration key is missing.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
# Mapping of environment variable names to their corresponding config keys
|
|
40
|
+
envs_to_args = {
|
|
41
|
+
AWS_ACCESS_KEY_ID_ENV_VAR: AWS_ACCESS_KEY_ID_CONFIG_KEY,
|
|
42
|
+
AWS_SECRET_ACCESS_KEY_ENV_VAR: AWS_SECRET_ACCESS_KEY_CONFIG_KEY,
|
|
43
|
+
AWS_REGION_NAME_ENV_VAR: AWS_REGION_NAME_CONFIG_KEY,
|
|
44
|
+
AWS_SESSION_TOKEN_ENV_VAR: AWS_SESSION_TOKEN_CONFIG_KEY,
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
# Validate the environment setup for the model
|
|
48
|
+
validation_info = validate_environment(litellm_model_name)
|
|
49
|
+
missing_environment_variables = validation_info.get(
|
|
50
|
+
_VALIDATE_ENVIRONMENT_MISSING_KEYS_KEY, []
|
|
51
|
+
)
|
|
52
|
+
# Filter out missing environment variables that have been set trough arguments
|
|
53
|
+
# in extra parameters
|
|
54
|
+
missing_environment_variables = [
|
|
55
|
+
missing_env_var
|
|
56
|
+
for missing_env_var in missing_environment_variables
|
|
57
|
+
if litellm_call_kwargs.get(envs_to_args.get(missing_env_var)) is None
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
if missing_environment_variables:
|
|
61
|
+
missing_environment_details = [
|
|
62
|
+
(
|
|
63
|
+
f"'{missing_env_var}' environment variable or "
|
|
64
|
+
f"'{envs_to_args.get(missing_env_var)}' config key"
|
|
65
|
+
)
|
|
66
|
+
for missing_env_var in missing_environment_variables
|
|
67
|
+
]
|
|
68
|
+
event_info = (
|
|
69
|
+
f"The following environment variables or configuration keys are "
|
|
70
|
+
f"missing: "
|
|
71
|
+
f"{', '.join(missing_environment_details)}. "
|
|
72
|
+
f"These settings are required for API calls."
|
|
73
|
+
)
|
|
74
|
+
structlogger.error(
|
|
75
|
+
f"{source_log}.validate_aws_environment_variables",
|
|
76
|
+
event_info=event_info,
|
|
77
|
+
missing_environment_variables=missing_environment_variables,
|
|
78
|
+
)
|
|
79
|
+
raise ProviderClientValidationError(event_info)
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
DEFAULT_AZURE_API_KEY_NAME = "AZURE_API_KEY"
|
|
2
|
+
LITE_LLM_API_BASE_FIELD = "api_base"
|
|
3
|
+
LITE_LLM_API_KEY_FIELD = "api_key"
|
|
4
|
+
LITE_LLM_API_VERSION_FIELD = "api_version"
|
|
5
|
+
LITE_LLM_MODEL_FIELD = "model"
|
|
6
|
+
LITE_LLM_AZURE_AD_TOKEN_PROVIDER = "azure_ad_token_provider"
|
|
7
|
+
LITE_LLM_AZURE_AD_TOKEN = "azure_ad_token"
|
|
File without changes
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from abc import abstractmethod
|
|
3
|
+
from typing import Any, Dict, List
|
|
4
|
+
|
|
5
|
+
import litellm
|
|
6
|
+
import structlog
|
|
7
|
+
from litellm import aembedding, embedding, validate_environment
|
|
8
|
+
|
|
9
|
+
from rasa.shared.constants import API_BASE_CONFIG_KEY, API_KEY
|
|
10
|
+
from rasa.shared.exceptions import (
|
|
11
|
+
ProviderClientAPIException,
|
|
12
|
+
ProviderClientValidationError,
|
|
13
|
+
)
|
|
14
|
+
from rasa.shared.providers._ssl_verification_utils import (
|
|
15
|
+
ensure_ssl_certificates_for_litellm_non_openai_based_clients,
|
|
16
|
+
ensure_ssl_certificates_for_litellm_openai_based_clients,
|
|
17
|
+
)
|
|
18
|
+
from rasa.shared.providers.embedding.embedding_response import (
|
|
19
|
+
EmbeddingResponse,
|
|
20
|
+
EmbeddingUsage,
|
|
21
|
+
)
|
|
22
|
+
from rasa.shared.utils.io import suppress_logs, resolve_environment_variables
|
|
23
|
+
|
|
24
|
+
structlogger = structlog.get_logger()
|
|
25
|
+
|
|
26
|
+
_VALIDATE_ENVIRONMENT_MISSING_KEYS_KEY = "missing_keys"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class _BaseLiteLLMEmbeddingClient:
|
|
30
|
+
"""An abstract base class for LiteLLM embedding clients.
|
|
31
|
+
|
|
32
|
+
This class defines the interface and common functionality for all clients
|
|
33
|
+
based on LiteLLM.
|
|
34
|
+
|
|
35
|
+
The class is made private to prevent it from being part of the
|
|
36
|
+
public-facing interface, as it serves as an internal base class
|
|
37
|
+
for specific implementations of clients that are currently based on
|
|
38
|
+
LiteLLM.
|
|
39
|
+
|
|
40
|
+
By keeping it private, we ensure that only the derived, concrete
|
|
41
|
+
implementations are exposed to users, maintaining a cleaner and
|
|
42
|
+
more controlled API surface.
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
def __init__(self): # type: ignore
|
|
46
|
+
self._ensure_certificates()
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
@abstractmethod
|
|
50
|
+
def config(self) -> dict:
|
|
51
|
+
"""Returns the configuration for that the embedding client in dict form."""
|
|
52
|
+
pass
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
@abstractmethod
|
|
56
|
+
def _litellm_model_name(self) -> str:
|
|
57
|
+
"""Returns the model name in LiteLLM format based on the Provider/API type."""
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
@abstractmethod
|
|
62
|
+
def _litellm_extra_parameters(self) -> Dict[str, Any]:
|
|
63
|
+
"""Returns a dictionary of extra parameters which include model
|
|
64
|
+
parameters as well as LiteLLM specific input parameters.
|
|
65
|
+
By default, this returns an empty dictionary (no extra parameters).
|
|
66
|
+
"""
|
|
67
|
+
return {}
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def _embedding_fn_args(self) -> Dict[str, Any]:
|
|
71
|
+
"""Returns the arguments to be passed to the embedding function."""
|
|
72
|
+
return {
|
|
73
|
+
**self._litellm_extra_parameters,
|
|
74
|
+
"model": self._litellm_model_name,
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
def validate_client_setup(self) -> None:
|
|
78
|
+
"""Perform client validation. By default only environment variables
|
|
79
|
+
are validated. Override this method to add more validation steps.
|
|
80
|
+
|
|
81
|
+
Raises:
|
|
82
|
+
ProviderClientValidationError if validation fails.
|
|
83
|
+
"""
|
|
84
|
+
self._validate_environment_variables()
|
|
85
|
+
|
|
86
|
+
def _validate_environment_variables(self) -> None:
|
|
87
|
+
"""Validate that the required environment variables are set."""
|
|
88
|
+
validation_info = validate_environment(
|
|
89
|
+
self._litellm_model_name,
|
|
90
|
+
api_key=self._litellm_extra_parameters.get(API_KEY),
|
|
91
|
+
api_base=self._litellm_extra_parameters.get(API_BASE_CONFIG_KEY),
|
|
92
|
+
)
|
|
93
|
+
if missing_environment_variables := validation_info.get(
|
|
94
|
+
_VALIDATE_ENVIRONMENT_MISSING_KEYS_KEY
|
|
95
|
+
):
|
|
96
|
+
event_info = (
|
|
97
|
+
f"Environment variables: {missing_environment_variables} "
|
|
98
|
+
f"not set. Required for API calls."
|
|
99
|
+
)
|
|
100
|
+
structlogger.error(
|
|
101
|
+
"base_litellm_embedding_client.validate_environment_variables",
|
|
102
|
+
event_info=event_info,
|
|
103
|
+
missing_environment_variables=missing_environment_variables,
|
|
104
|
+
)
|
|
105
|
+
raise ProviderClientValidationError(event_info)
|
|
106
|
+
|
|
107
|
+
def validate_documents(self, documents: List[str]) -> None:
|
|
108
|
+
"""Validates a list of documents to ensure they are suitable for embedding.
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
documents: List of documents to be validated.
|
|
112
|
+
|
|
113
|
+
Raises:
|
|
114
|
+
ValueError: If any document is invalid.
|
|
115
|
+
"""
|
|
116
|
+
for doc in documents:
|
|
117
|
+
if not isinstance(doc, str):
|
|
118
|
+
raise ValueError("All documents must be strings.")
|
|
119
|
+
if not doc.strip():
|
|
120
|
+
raise ValueError("Documents cannot be empty or whitespace.")
|
|
121
|
+
|
|
122
|
+
@suppress_logs(log_level=logging.WARNING)
|
|
123
|
+
def embed(self, documents: List[str]) -> EmbeddingResponse:
|
|
124
|
+
"""Embeds a list of documents synchronously.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
documents: List of documents to be embedded.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
List of embedding vectors.
|
|
131
|
+
|
|
132
|
+
Raises:
|
|
133
|
+
ProviderClientAPIException: If API calls raised an error.
|
|
134
|
+
"""
|
|
135
|
+
self.validate_documents(documents)
|
|
136
|
+
try:
|
|
137
|
+
arguments = resolve_environment_variables(self._embedding_fn_args)
|
|
138
|
+
response = embedding(input=documents, **arguments)
|
|
139
|
+
return self._format_response(response)
|
|
140
|
+
except Exception as e:
|
|
141
|
+
raise ProviderClientAPIException(
|
|
142
|
+
message="Failed to embed documents", original_exception=e
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
@suppress_logs(log_level=logging.WARNING)
|
|
146
|
+
async def aembed(self, documents: List[str]) -> EmbeddingResponse:
|
|
147
|
+
"""Embeds a list of documents asynchronously.
|
|
148
|
+
|
|
149
|
+
Args:
|
|
150
|
+
documents: List of documents to be embedded.
|
|
151
|
+
|
|
152
|
+
Returns:
|
|
153
|
+
List of embedding vectors.
|
|
154
|
+
|
|
155
|
+
Raises:
|
|
156
|
+
ProviderClientAPIException: If API calls raised an error.
|
|
157
|
+
"""
|
|
158
|
+
self.validate_documents(documents)
|
|
159
|
+
try:
|
|
160
|
+
arguments = resolve_environment_variables(self._embedding_fn_args)
|
|
161
|
+
response = await aembedding(input=documents, **arguments)
|
|
162
|
+
return self._format_response(response)
|
|
163
|
+
except Exception as e:
|
|
164
|
+
raise ProviderClientAPIException(
|
|
165
|
+
message="Failed to embed documents", original_exception=e
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
def _format_response(
|
|
169
|
+
self, response: litellm.EmbeddingResponse
|
|
170
|
+
) -> EmbeddingResponse:
|
|
171
|
+
"""Parses the LiteLLM EmbeddingResponse to Rasa format.
|
|
172
|
+
|
|
173
|
+
Raises:
|
|
174
|
+
ValueError: If any response data is None.
|
|
175
|
+
"""
|
|
176
|
+
# If data is not available (None), raise a ValueError
|
|
177
|
+
if response.data is None:
|
|
178
|
+
message = (
|
|
179
|
+
"Failed to embed documents. Received 'None' " "instead of embeddings."
|
|
180
|
+
)
|
|
181
|
+
structlogger.error(
|
|
182
|
+
"base_litellm_client.format_response.data_is_none",
|
|
183
|
+
message=message,
|
|
184
|
+
response=response.to_dict(),
|
|
185
|
+
)
|
|
186
|
+
raise ValueError(message)
|
|
187
|
+
|
|
188
|
+
# Sort the embeddings by the "index" key
|
|
189
|
+
response.data.sort(key=lambda x: x["index"])
|
|
190
|
+
# Extract the embedding vectors
|
|
191
|
+
embeddings = [data["embedding"] for data in response.data]
|
|
192
|
+
formatted_response = EmbeddingResponse(
|
|
193
|
+
data=embeddings,
|
|
194
|
+
model=response.model,
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
# Process additional usage information if available
|
|
198
|
+
if response.usage:
|
|
199
|
+
completion_tokens = (
|
|
200
|
+
response.usage.completion_tokens
|
|
201
|
+
if hasattr(response.usage, "completion_tokens")
|
|
202
|
+
else 0
|
|
203
|
+
)
|
|
204
|
+
prompt_tokens = (
|
|
205
|
+
response.usage.prompt_tokens
|
|
206
|
+
if hasattr(response.usage, "prompt_tokens")
|
|
207
|
+
else 0
|
|
208
|
+
)
|
|
209
|
+
total_tokens = (
|
|
210
|
+
response.usage.total_tokens
|
|
211
|
+
if hasattr(response.usage, "total_tokens")
|
|
212
|
+
else 0
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
formatted_response.usage = EmbeddingUsage(
|
|
216
|
+
completion_tokens=completion_tokens,
|
|
217
|
+
prompt_tokens=prompt_tokens,
|
|
218
|
+
total_tokens=total_tokens,
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
# Log the response with masked data for brevity
|
|
222
|
+
log_response = formatted_response.to_dict()
|
|
223
|
+
log_response["data"] = "Embedding response data not shown here for brevity."
|
|
224
|
+
structlogger.debug(
|
|
225
|
+
"base_litellm_client.formatted_response",
|
|
226
|
+
formatted_response=log_response,
|
|
227
|
+
)
|
|
228
|
+
return formatted_response
|
|
229
|
+
|
|
230
|
+
@staticmethod
|
|
231
|
+
def _ensure_certificates() -> None:
|
|
232
|
+
"""Configures SSL certificates for LiteLLM. This method is invoked during
|
|
233
|
+
client initialization.
|
|
234
|
+
|
|
235
|
+
LiteLLM may utilize `openai` clients or other providers that require
|
|
236
|
+
SSL verification settings through the `SSL_VERIFY` / `SSL_CERTIFICATE`
|
|
237
|
+
environment variables or the `litellm.ssl_verify` /
|
|
238
|
+
`litellm.ssl_certificate` global settings.
|
|
239
|
+
|
|
240
|
+
This method ensures proper SSL configuration for both cases.
|
|
241
|
+
"""
|
|
242
|
+
ensure_ssl_certificates_for_litellm_non_openai_based_clients()
|
|
243
|
+
ensure_ssl_certificates_for_litellm_openai_based_clients()
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
from langchain_core.embeddings.embeddings import Embeddings
|
|
4
|
+
|
|
5
|
+
from rasa.shared.providers.embedding.embedding_client import EmbeddingClient
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class _LangchainEmbeddingClientAdapter(Embeddings):
|
|
9
|
+
"""
|
|
10
|
+
Temporary adapter to bridge differences between LiteLLM and LangChain.
|
|
11
|
+
|
|
12
|
+
Clients instantiated with `embedder_factory` follow our new EmbeddingClient
|
|
13
|
+
protocol, but `langchain`'s vector stores require an `Embeddings` type
|
|
14
|
+
client. This adapter extracts and returns the necessary part of the output
|
|
15
|
+
from our LiteLLM-based clients.
|
|
16
|
+
|
|
17
|
+
This adapter will be removed in ticket:
|
|
18
|
+
https://rasahq.atlassian.net/browse/ENG-1220
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(self, client: EmbeddingClient):
|
|
22
|
+
self._client = client
|
|
23
|
+
|
|
24
|
+
def embed_documents(self, texts: List[str]) -> List[List[float]]:
|
|
25
|
+
"""Embed search docs.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
texts: List of text to embed.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
List of embeddings.
|
|
32
|
+
"""
|
|
33
|
+
response = self._client.embed(documents=texts)
|
|
34
|
+
embedding_vector = response.data
|
|
35
|
+
return embedding_vector
|
|
36
|
+
|
|
37
|
+
def embed_query(self, text: str) -> List[float]:
|
|
38
|
+
"""Embed query text.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
text: Text to embed.
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
Embedding.
|
|
45
|
+
"""
|
|
46
|
+
response = self._client.embed(documents=[text])
|
|
47
|
+
embedding_vector = response.data[0]
|
|
48
|
+
return embedding_vector
|
|
49
|
+
|
|
50
|
+
async def aembed_documents(self, texts: List[str]) -> List[List[float]]:
|
|
51
|
+
"""Asynchronous Embed search docs.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
texts: List of text to embed.
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
List of embeddings.
|
|
58
|
+
"""
|
|
59
|
+
response = await self._client.aembed(documents=texts)
|
|
60
|
+
embedding_vector = response.data
|
|
61
|
+
return embedding_vector
|
|
62
|
+
|
|
63
|
+
async def aembed_query(self, text: str) -> List[float]:
|
|
64
|
+
"""Asynchronous Embed query text.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
text: Text to embed.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
Embedding.
|
|
71
|
+
"""
|
|
72
|
+
response = await self._client.aembed(documents=[text])
|
|
73
|
+
embedding_vector = response.data[0]
|
|
74
|
+
return embedding_vector
|