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,265 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from abc import abstractmethod
|
|
5
|
+
from typing import Any, Dict, List, Union
|
|
6
|
+
|
|
7
|
+
import structlog
|
|
8
|
+
from litellm import (
|
|
9
|
+
acompletion,
|
|
10
|
+
completion,
|
|
11
|
+
validate_environment,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
from rasa.shared.constants import API_BASE_CONFIG_KEY, API_KEY
|
|
15
|
+
from rasa.shared.exceptions import (
|
|
16
|
+
ProviderClientAPIException,
|
|
17
|
+
ProviderClientValidationError,
|
|
18
|
+
)
|
|
19
|
+
from rasa.shared.providers._ssl_verification_utils import (
|
|
20
|
+
ensure_ssl_certificates_for_litellm_non_openai_based_clients,
|
|
21
|
+
ensure_ssl_certificates_for_litellm_openai_based_clients,
|
|
22
|
+
)
|
|
23
|
+
from rasa.shared.providers.llm.llm_response import LLMResponse, LLMUsage
|
|
24
|
+
from rasa.shared.utils.io import resolve_environment_variables, suppress_logs
|
|
25
|
+
|
|
26
|
+
structlogger = structlog.get_logger()
|
|
27
|
+
|
|
28
|
+
_VALIDATE_ENVIRONMENT_MISSING_KEYS_KEY = "missing_keys"
|
|
29
|
+
|
|
30
|
+
# Suppress LiteLLM info and debug logs - Global level.
|
|
31
|
+
logging.getLogger("LiteLLM").setLevel(logging.WARNING)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class _BaseLiteLLMClient:
|
|
35
|
+
"""An abstract base class for LiteLLM clients.
|
|
36
|
+
|
|
37
|
+
This class defines the interface and common functionality for all clients
|
|
38
|
+
based on LiteLLM.
|
|
39
|
+
|
|
40
|
+
The class is made private to prevent it from being part of the
|
|
41
|
+
public-facing interface, as it serves as an internal base class
|
|
42
|
+
for specific implementations of clients that are currently based on
|
|
43
|
+
LiteLLM.
|
|
44
|
+
|
|
45
|
+
By keeping it private, we ensure that only the derived, concrete
|
|
46
|
+
implementations are exposed to users, maintaining a cleaner and
|
|
47
|
+
more controlled API surface.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
def __init__(self): # type: ignore
|
|
51
|
+
self._ensure_certificates()
|
|
52
|
+
|
|
53
|
+
@classmethod
|
|
54
|
+
@abstractmethod
|
|
55
|
+
def from_config(cls, config: Dict[str, Any]) -> _BaseLiteLLMClient:
|
|
56
|
+
pass
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
@abstractmethod
|
|
60
|
+
def config(self) -> dict:
|
|
61
|
+
"""Returns the configuration for that the llm client
|
|
62
|
+
in dictionary form.
|
|
63
|
+
"""
|
|
64
|
+
pass
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
@abstractmethod
|
|
68
|
+
def _litellm_model_name(self) -> str:
|
|
69
|
+
"""Returns the value of LiteLLM's model parameter to be used in
|
|
70
|
+
completion/acompletion in LiteLLM format:
|
|
71
|
+
|
|
72
|
+
<provider>/<model or deployment name>
|
|
73
|
+
"""
|
|
74
|
+
pass
|
|
75
|
+
|
|
76
|
+
@property
|
|
77
|
+
def _litellm_extra_parameters(self) -> Dict[str, Any]:
|
|
78
|
+
"""Returns a dictionary of extra parameters which include model
|
|
79
|
+
parameters as well as LiteLLM specific input parameters.
|
|
80
|
+
|
|
81
|
+
By default, this returns an empty dictionary (no extra parameters).
|
|
82
|
+
"""
|
|
83
|
+
return {}
|
|
84
|
+
|
|
85
|
+
@property
|
|
86
|
+
def _completion_fn_args(self) -> dict:
|
|
87
|
+
return {
|
|
88
|
+
**self._litellm_extra_parameters,
|
|
89
|
+
"model": self._litellm_model_name,
|
|
90
|
+
# Since all providers covered by LiteLLM use the OpenAI format, but
|
|
91
|
+
# not all support every OpenAI parameter, raise an exception if
|
|
92
|
+
# provider/model uses unsupported parameter
|
|
93
|
+
"drop_params": False,
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
def validate_client_setup(self) -> None:
|
|
97
|
+
"""Perform client validation. By default only environment variables
|
|
98
|
+
are validated.
|
|
99
|
+
|
|
100
|
+
Raises:
|
|
101
|
+
ProviderClientValidationError if validation fails.
|
|
102
|
+
"""
|
|
103
|
+
self._validate_environment_variables()
|
|
104
|
+
|
|
105
|
+
def _validate_environment_variables(self) -> None:
|
|
106
|
+
"""Validate that the required environment variables are set."""
|
|
107
|
+
validation_info = validate_environment(
|
|
108
|
+
self._litellm_model_name,
|
|
109
|
+
api_key=self._litellm_extra_parameters.get(API_KEY),
|
|
110
|
+
api_base=self._litellm_extra_parameters.get(API_BASE_CONFIG_KEY),
|
|
111
|
+
)
|
|
112
|
+
if missing_environment_variables := validation_info.get(
|
|
113
|
+
_VALIDATE_ENVIRONMENT_MISSING_KEYS_KEY
|
|
114
|
+
):
|
|
115
|
+
event_info = (
|
|
116
|
+
f"Environment variables: {missing_environment_variables} "
|
|
117
|
+
f"not set. Required for API calls."
|
|
118
|
+
)
|
|
119
|
+
structlogger.error(
|
|
120
|
+
"base_litellm_client.validate_environment_variables",
|
|
121
|
+
event_info=event_info,
|
|
122
|
+
missing_environment_variables=missing_environment_variables,
|
|
123
|
+
)
|
|
124
|
+
raise ProviderClientValidationError(event_info)
|
|
125
|
+
|
|
126
|
+
@suppress_logs(log_level=logging.WARNING)
|
|
127
|
+
def completion(self, messages: Union[List[str], str]) -> LLMResponse:
|
|
128
|
+
"""Synchronously generate completions for given list of messages.
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
messages: List of messages or a single message to generate the
|
|
132
|
+
completion for.
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
List of message completions.
|
|
136
|
+
|
|
137
|
+
Raises:
|
|
138
|
+
ProviderClientAPIException: If the API request fails.
|
|
139
|
+
"""
|
|
140
|
+
try:
|
|
141
|
+
formatted_messages = self._format_messages(messages)
|
|
142
|
+
arguments = resolve_environment_variables(self._completion_fn_args)
|
|
143
|
+
response = completion(messages=formatted_messages, **arguments)
|
|
144
|
+
return self._format_response(response)
|
|
145
|
+
except Exception as e:
|
|
146
|
+
raise ProviderClientAPIException(e)
|
|
147
|
+
|
|
148
|
+
@suppress_logs(log_level=logging.WARNING)
|
|
149
|
+
async def acompletion(self, messages: Union[List[str], str]) -> LLMResponse:
|
|
150
|
+
"""Asynchronously generate completions for given list of messages.
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
messages: List of messages or a single message to generate the
|
|
154
|
+
completion for.
|
|
155
|
+
|
|
156
|
+
Returns:
|
|
157
|
+
List of message completions.
|
|
158
|
+
|
|
159
|
+
Raises:
|
|
160
|
+
ProviderClientAPIException: If the API request fails.
|
|
161
|
+
"""
|
|
162
|
+
try:
|
|
163
|
+
formatted_messages = self._format_messages(messages)
|
|
164
|
+
arguments = resolve_environment_variables(self._completion_fn_args)
|
|
165
|
+
response = await acompletion(messages=formatted_messages, **arguments)
|
|
166
|
+
return self._format_response(response)
|
|
167
|
+
except Exception as e:
|
|
168
|
+
message = ""
|
|
169
|
+
from rasa.shared.providers.llm.self_hosted_llm_client import (
|
|
170
|
+
SelfHostedLLMClient,
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
if isinstance(self, SelfHostedLLMClient):
|
|
174
|
+
message = (
|
|
175
|
+
"If you are using 'provider=self-hosted' to call a hosted vllm "
|
|
176
|
+
"server make sure your config is correctly setup. You should have "
|
|
177
|
+
"the following mandatory keys in your config: "
|
|
178
|
+
"provider=self-hosted; "
|
|
179
|
+
"model='<your-vllm-model-name>'; "
|
|
180
|
+
"api_base='your-hosted-vllm-serv'."
|
|
181
|
+
"In case you are getting OpenAI connection errors, such as missing "
|
|
182
|
+
"API key, your configuration is incorrect."
|
|
183
|
+
)
|
|
184
|
+
raise ProviderClientAPIException(e, message)
|
|
185
|
+
|
|
186
|
+
def _format_messages(self, messages: Union[List[str], str]) -> List[Dict[str, str]]:
|
|
187
|
+
"""Formats messages (or a single message) to OpenAI format."""
|
|
188
|
+
if isinstance(messages, str):
|
|
189
|
+
messages = [messages]
|
|
190
|
+
return [{"content": message, "role": "user"} for message in messages]
|
|
191
|
+
|
|
192
|
+
def _format_response(self, response: Any) -> LLMResponse:
|
|
193
|
+
"""Parses the LiteLLM response to Rasa format."""
|
|
194
|
+
formatted_response = LLMResponse(
|
|
195
|
+
id=response.id,
|
|
196
|
+
created=response.created,
|
|
197
|
+
choices=[choice.message.content for choice in response.choices],
|
|
198
|
+
model=response.model,
|
|
199
|
+
)
|
|
200
|
+
if (
|
|
201
|
+
response.model_extra
|
|
202
|
+
and (usage := response.model_extra.get("usage")) is not None
|
|
203
|
+
):
|
|
204
|
+
# We use `.get()` for accessing litellm.utils.Usage attributes.
|
|
205
|
+
# litellm.utils.Usage does not set the attributes if
|
|
206
|
+
# `prompt_tokens` or `completion_tokens` are absent (None).
|
|
207
|
+
prompt_tokens = (
|
|
208
|
+
num_tokens
|
|
209
|
+
if isinstance(num_tokens := usage.get("prompt_tokens", 0), (int, float))
|
|
210
|
+
else 0
|
|
211
|
+
)
|
|
212
|
+
completion_tokens = (
|
|
213
|
+
num_tokens
|
|
214
|
+
if isinstance(
|
|
215
|
+
num_tokens := usage.get("completion_tokens", 0), (int, float)
|
|
216
|
+
)
|
|
217
|
+
else 0
|
|
218
|
+
)
|
|
219
|
+
formatted_response.usage = LLMUsage(prompt_tokens, completion_tokens)
|
|
220
|
+
structlogger.debug(
|
|
221
|
+
"base_litellm_client.formatted_response",
|
|
222
|
+
formatted_response=formatted_response.to_dict(),
|
|
223
|
+
)
|
|
224
|
+
return formatted_response
|
|
225
|
+
|
|
226
|
+
def _format_text_completion_response(self, response: Any) -> LLMResponse:
|
|
227
|
+
"""Parses the LiteLLM text completion response to Rasa format."""
|
|
228
|
+
formatted_response = LLMResponse(
|
|
229
|
+
id=response.id,
|
|
230
|
+
created=response.created,
|
|
231
|
+
choices=[choice.text for choice in response.choices],
|
|
232
|
+
model=response.model,
|
|
233
|
+
)
|
|
234
|
+
if (usage := response.usage) is not None:
|
|
235
|
+
prompt_tokens = (
|
|
236
|
+
num_tokens
|
|
237
|
+
if isinstance(num_tokens := usage.prompt_tokens, (int, float))
|
|
238
|
+
else 0
|
|
239
|
+
)
|
|
240
|
+
completion_tokens = (
|
|
241
|
+
num_tokens
|
|
242
|
+
if isinstance(num_tokens := usage.completion_tokens, (int, float))
|
|
243
|
+
else 0
|
|
244
|
+
)
|
|
245
|
+
formatted_response.usage = LLMUsage(prompt_tokens, completion_tokens)
|
|
246
|
+
structlogger.debug(
|
|
247
|
+
"base_litellm_client.formatted_response",
|
|
248
|
+
formatted_response=formatted_response.to_dict(),
|
|
249
|
+
)
|
|
250
|
+
return formatted_response
|
|
251
|
+
|
|
252
|
+
@staticmethod
|
|
253
|
+
def _ensure_certificates() -> None:
|
|
254
|
+
"""Configures SSL certificates for LiteLLM. This method is invoked during
|
|
255
|
+
client initialization.
|
|
256
|
+
|
|
257
|
+
LiteLLM may utilize `openai` clients or other providers that require
|
|
258
|
+
SSL verification settings through the `SSL_VERIFY` / `SSL_CERTIFICATE`
|
|
259
|
+
environment variables or the `litellm.ssl_verify` /
|
|
260
|
+
`litellm.ssl_certificate` global settings.
|
|
261
|
+
|
|
262
|
+
This method ensures proper SSL configuration for both cases.
|
|
263
|
+
"""
|
|
264
|
+
ensure_ssl_certificates_for_litellm_non_openai_based_clients()
|
|
265
|
+
ensure_ssl_certificates_for_litellm_openai_based_clients()
|
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import re
|
|
5
|
+
from typing import Any, Dict, Optional
|
|
6
|
+
|
|
7
|
+
import structlog
|
|
8
|
+
|
|
9
|
+
from rasa.shared.constants import (
|
|
10
|
+
API_BASE_CONFIG_KEY,
|
|
11
|
+
API_KEY,
|
|
12
|
+
API_VERSION_CONFIG_KEY,
|
|
13
|
+
AZURE_API_BASE_ENV_VAR,
|
|
14
|
+
AZURE_API_KEY_ENV_VAR,
|
|
15
|
+
AZURE_API_TYPE_ENV_VAR,
|
|
16
|
+
AZURE_API_VERSION_ENV_VAR,
|
|
17
|
+
AZURE_OPENAI_PROVIDER,
|
|
18
|
+
DEPLOYMENT_CONFIG_KEY,
|
|
19
|
+
OPENAI_API_BASE_ENV_VAR,
|
|
20
|
+
OPENAI_API_KEY_ENV_VAR,
|
|
21
|
+
OPENAI_API_TYPE_ENV_VAR,
|
|
22
|
+
OPENAI_API_VERSION_ENV_VAR,
|
|
23
|
+
)
|
|
24
|
+
from rasa.shared.exceptions import ProviderClientValidationError
|
|
25
|
+
from rasa.shared.providers._configs.azure_openai_client_config import (
|
|
26
|
+
AzureOAuthConfig,
|
|
27
|
+
AzureOpenAIClientConfig,
|
|
28
|
+
)
|
|
29
|
+
from rasa.shared.providers.constants import (
|
|
30
|
+
DEFAULT_AZURE_API_KEY_NAME,
|
|
31
|
+
LITE_LLM_API_BASE_FIELD,
|
|
32
|
+
LITE_LLM_API_KEY_FIELD,
|
|
33
|
+
LITE_LLM_API_VERSION_FIELD,
|
|
34
|
+
LITE_LLM_AZURE_AD_TOKEN,
|
|
35
|
+
LITE_LLM_AZURE_AD_TOKEN_PROVIDER,
|
|
36
|
+
)
|
|
37
|
+
from rasa.shared.providers.llm._base_litellm_client import _BaseLiteLLMClient
|
|
38
|
+
from rasa.shared.utils.io import raise_deprecation_warning
|
|
39
|
+
|
|
40
|
+
structlogger = structlog.get_logger()
|
|
41
|
+
|
|
42
|
+
AZURE_CLIENT_ID = "AZURE_CLIENT_ID"
|
|
43
|
+
AZURE_CLIENT_SECRET = "AZURE_CLIENT_SECRET"
|
|
44
|
+
AZURE_TENANT_ID = "AZURE_TENANT_ID"
|
|
45
|
+
CLIENT_SECRET_VARS = (AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID)
|
|
46
|
+
|
|
47
|
+
AZURE_CLIENT_CERTIFICATE_PATH = "AZURE_CLIENT_CERTIFICATE_PATH"
|
|
48
|
+
AZURE_CLIENT_CERTIFICATE_PASSWORD = "AZURE_CLIENT_CERTIFICATE_PASSWORD"
|
|
49
|
+
AZURE_CLIENT_SEND_CERTIFICATE_CHAIN = "AZURE_CLIENT_SEND_CERTIFICATE_CHAIN"
|
|
50
|
+
CERT_VARS = (AZURE_CLIENT_ID, AZURE_CLIENT_CERTIFICATE_PATH, AZURE_TENANT_ID)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class AzureADConfig:
|
|
54
|
+
def __init__(
|
|
55
|
+
self, client_id: str, client_secret: str, tenant_id: str, scopes: str
|
|
56
|
+
) -> None:
|
|
57
|
+
self.scopes = scopes
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class AzureOpenAILLMClient(_BaseLiteLLMClient):
|
|
61
|
+
"""A client for interfacing with Azure's OpenAI LLM deployments.
|
|
62
|
+
|
|
63
|
+
Parameters:
|
|
64
|
+
deployment (str): The deployment name.
|
|
65
|
+
model (Optional[str]): The name of the deployed model.
|
|
66
|
+
api_type: (Optional[str]): The api type. If not provided, it will be set via
|
|
67
|
+
environment variable.
|
|
68
|
+
api_base (Optional[str]): The base URL for the API endpoints. If not provided,
|
|
69
|
+
it will be set via environment variables.
|
|
70
|
+
api_version (Optional[str]): The version of the API to use. If not provided,
|
|
71
|
+
it will be set via environment variable.
|
|
72
|
+
|
|
73
|
+
kwargs (Optional[Dict[str, Any]]): Optional configuration parameters specific
|
|
74
|
+
to the model deployment.
|
|
75
|
+
|
|
76
|
+
Raises:
|
|
77
|
+
ProviderClientValidationError: If validation of the client setup fails.
|
|
78
|
+
DeprecationWarning: If deprecated environment variables are used for
|
|
79
|
+
configuration.
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
def __init__(
|
|
83
|
+
self,
|
|
84
|
+
deployment: str,
|
|
85
|
+
model: Optional[str] = None,
|
|
86
|
+
api_type: Optional[str] = None,
|
|
87
|
+
api_base: Optional[str] = None,
|
|
88
|
+
api_version: Optional[str] = None,
|
|
89
|
+
oauth: Optional[AzureOAuthConfig] = None,
|
|
90
|
+
**kwargs: Any,
|
|
91
|
+
):
|
|
92
|
+
super().__init__() # type: ignore
|
|
93
|
+
self._deployment = deployment
|
|
94
|
+
self._model = model
|
|
95
|
+
self._extra_parameters = kwargs or {}
|
|
96
|
+
|
|
97
|
+
# Set api_base with the following priority:
|
|
98
|
+
# parameter -> Azure Env Var -> (deprecated) OpenAI Env Var
|
|
99
|
+
self._api_base = (
|
|
100
|
+
api_base
|
|
101
|
+
or os.getenv(AZURE_API_BASE_ENV_VAR)
|
|
102
|
+
or os.getenv(OPENAI_API_BASE_ENV_VAR)
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
# Set api_version with the following priority:
|
|
106
|
+
# parameter -> Azure Env Var -> (deprecated) OpenAI Env Var
|
|
107
|
+
self._api_version = (
|
|
108
|
+
api_version
|
|
109
|
+
or os.getenv(AZURE_API_VERSION_ENV_VAR)
|
|
110
|
+
or os.getenv(OPENAI_API_VERSION_ENV_VAR)
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
# Not used by LiteLLM, here for backward compatibility
|
|
114
|
+
self._api_type = (
|
|
115
|
+
api_type
|
|
116
|
+
or os.getenv(AZURE_API_TYPE_ENV_VAR)
|
|
117
|
+
or os.getenv(OPENAI_API_TYPE_ENV_VAR)
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
os.unsetenv("OPENAI_API_KEY")
|
|
121
|
+
os.unsetenv("AZURE_API_KEY")
|
|
122
|
+
|
|
123
|
+
self._oauth = oauth
|
|
124
|
+
|
|
125
|
+
if self._oauth:
|
|
126
|
+
os.unsetenv(DEFAULT_AZURE_API_KEY_NAME)
|
|
127
|
+
os.unsetenv(AZURE_API_KEY_ENV_VAR)
|
|
128
|
+
os.unsetenv(OPENAI_API_KEY_ENV_VAR)
|
|
129
|
+
self._api_key_env_var = (
|
|
130
|
+
self._resolve_api_key_env_var() if not self._oauth else None
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
# Run helper function to check and raise deprecation warning if
|
|
134
|
+
# deprecated environment variables were used for initialization of the
|
|
135
|
+
# client settings
|
|
136
|
+
self._raise_evn_var_deprecation_warnings()
|
|
137
|
+
|
|
138
|
+
# validate the client settings
|
|
139
|
+
self.validate_client_setup()
|
|
140
|
+
|
|
141
|
+
def _raise_evn_var_deprecation_warnings(self) -> None:
|
|
142
|
+
"""Helper function to check and raise deprecation warning if
|
|
143
|
+
deprecated environment variables were used for initialization of
|
|
144
|
+
some client settings.
|
|
145
|
+
"""
|
|
146
|
+
deprecation_mapping = {
|
|
147
|
+
"API Base": {
|
|
148
|
+
"current_value": self.api_base,
|
|
149
|
+
"env_var": AZURE_API_BASE_ENV_VAR,
|
|
150
|
+
"deprecated_var": OPENAI_API_BASE_ENV_VAR,
|
|
151
|
+
},
|
|
152
|
+
"API Version": {
|
|
153
|
+
"current_value": self.api_version,
|
|
154
|
+
"env_var": AZURE_API_VERSION_ENV_VAR,
|
|
155
|
+
"deprecated_var": OPENAI_API_VERSION_ENV_VAR,
|
|
156
|
+
},
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
deprecation_warning_message = (
|
|
160
|
+
"Usage of {deprecated_env_var} environment "
|
|
161
|
+
"variable for setting the {setting} for Azure "
|
|
162
|
+
"OpenAI client is deprecated and will be removed "
|
|
163
|
+
"in 4.0.0. "
|
|
164
|
+
)
|
|
165
|
+
deprecation_warning_replacement_message = (
|
|
166
|
+
"Please use {env_var} environment variable."
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
for setting in deprecation_mapping.keys():
|
|
170
|
+
current_value = deprecation_mapping[setting]["current_value"]
|
|
171
|
+
env_var = deprecation_mapping[setting]["env_var"]
|
|
172
|
+
deprecated_var = deprecation_mapping[setting]["deprecated_var"]
|
|
173
|
+
|
|
174
|
+
# Value is set through the non-deprecated env var
|
|
175
|
+
if current_value == os.getenv(env_var):
|
|
176
|
+
continue
|
|
177
|
+
|
|
178
|
+
# Value is set through the deprecated env var
|
|
179
|
+
if current_value == os.getenv(deprecated_var):
|
|
180
|
+
message = deprecation_warning_message.format(
|
|
181
|
+
setting=setting, deprecated_env_var=deprecated_var
|
|
182
|
+
)
|
|
183
|
+
if env_var is not None:
|
|
184
|
+
message += deprecation_warning_replacement_message.format(
|
|
185
|
+
env_var=env_var
|
|
186
|
+
)
|
|
187
|
+
raise_deprecation_warning(message=message)
|
|
188
|
+
|
|
189
|
+
def _resolve_api_key_env_var(self) -> str:
|
|
190
|
+
"""Resolves the environment variable to use for the API key.
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
str: The env variable in dollar syntax format to use for the API key.
|
|
194
|
+
"""
|
|
195
|
+
if API_KEY in self._extra_parameters:
|
|
196
|
+
# API key is set to an env var in the config itself
|
|
197
|
+
# in case the model is defined in the endpoints.yml
|
|
198
|
+
return self._extra_parameters[API_KEY]
|
|
199
|
+
|
|
200
|
+
if os.getenv(AZURE_API_KEY_ENV_VAR) is not None:
|
|
201
|
+
return f"${DEFAULT_AZURE_API_KEY_NAME}"
|
|
202
|
+
|
|
203
|
+
if os.getenv(OPENAI_API_KEY_ENV_VAR) is not None:
|
|
204
|
+
# API key can be set through OPENAI_API_KEY too,
|
|
205
|
+
# because of the backward compatibility
|
|
206
|
+
raise_deprecation_warning(
|
|
207
|
+
message=(
|
|
208
|
+
f"Usage of '{OPENAI_API_KEY_ENV_VAR}' environment variable "
|
|
209
|
+
"for setting the API key for Azure OpenAI "
|
|
210
|
+
"client is deprecated and will be removed "
|
|
211
|
+
f"in 4.0.0. Please use '{AZURE_API_KEY_ENV_VAR}' "
|
|
212
|
+
"environment variable."
|
|
213
|
+
)
|
|
214
|
+
)
|
|
215
|
+
return "${OPENAI_API_KEY}"
|
|
216
|
+
|
|
217
|
+
structlogger.error(
|
|
218
|
+
"azure_openai_llm_client.api_key_not_set",
|
|
219
|
+
event_info=(
|
|
220
|
+
"API key not set, it is required for API calls. "
|
|
221
|
+
f"Set it either via the environment variable"
|
|
222
|
+
f"'{AZURE_API_KEY_ENV_VAR}' or directly"
|
|
223
|
+
f"via the config key '{API_KEY}'."
|
|
224
|
+
),
|
|
225
|
+
)
|
|
226
|
+
raise ProviderClientValidationError(
|
|
227
|
+
f"Missing required environment variable/config key '{API_KEY}' for "
|
|
228
|
+
f"API calls."
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
@classmethod
|
|
232
|
+
def from_config(cls, config: Dict[str, Any]) -> AzureOpenAILLMClient:
|
|
233
|
+
"""Initializes the client from given configuration.
|
|
234
|
+
|
|
235
|
+
Args:
|
|
236
|
+
config (Dict[str, Any]): Configuration.
|
|
237
|
+
|
|
238
|
+
Raises:
|
|
239
|
+
ValueError:
|
|
240
|
+
If any of the required configuration keys are missing.
|
|
241
|
+
If `api_type` has a value different from `azure`.
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
AzureOpenAILLMClient: Initialized client.
|
|
245
|
+
"""
|
|
246
|
+
try:
|
|
247
|
+
azure_openai_config = AzureOpenAIClientConfig.from_dict(config)
|
|
248
|
+
except ValueError as e:
|
|
249
|
+
message = "Cannot instantiate a client from the passed configuration."
|
|
250
|
+
structlogger.error(
|
|
251
|
+
"azure_openai_llm_client.from_config.error",
|
|
252
|
+
message=message,
|
|
253
|
+
config=config,
|
|
254
|
+
original_error=e,
|
|
255
|
+
)
|
|
256
|
+
raise
|
|
257
|
+
|
|
258
|
+
return cls(
|
|
259
|
+
deployment=azure_openai_config.deployment,
|
|
260
|
+
model=azure_openai_config.model,
|
|
261
|
+
api_type=azure_openai_config.api_type,
|
|
262
|
+
api_base=azure_openai_config.api_base,
|
|
263
|
+
api_version=azure_openai_config.api_version,
|
|
264
|
+
oauth=azure_openai_config.oauth,
|
|
265
|
+
**azure_openai_config.extra_parameters,
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
@property
|
|
269
|
+
def config(self) -> dict:
|
|
270
|
+
"""Returns the configuration for that the llm client
|
|
271
|
+
in dictionary form.
|
|
272
|
+
"""
|
|
273
|
+
config = AzureOpenAIClientConfig(
|
|
274
|
+
deployment=self._deployment,
|
|
275
|
+
model=self._model,
|
|
276
|
+
api_base=self._api_base,
|
|
277
|
+
api_version=self._api_version,
|
|
278
|
+
api_type=self._api_type,
|
|
279
|
+
oauth=self._oauth,
|
|
280
|
+
extra_parameters=self._extra_parameters,
|
|
281
|
+
)
|
|
282
|
+
return config.to_dict()
|
|
283
|
+
|
|
284
|
+
@property
|
|
285
|
+
def deployment(self) -> str:
|
|
286
|
+
return self._deployment
|
|
287
|
+
|
|
288
|
+
@property
|
|
289
|
+
def model(self) -> Optional[str]:
|
|
290
|
+
"""Returns the name of the model deployed on Azure."""
|
|
291
|
+
return self._model
|
|
292
|
+
|
|
293
|
+
@property
|
|
294
|
+
def api_base(self) -> Optional[str]:
|
|
295
|
+
"""Returns the API base URL for the Azure OpenAI llm client."""
|
|
296
|
+
return self._api_base
|
|
297
|
+
|
|
298
|
+
@property
|
|
299
|
+
def api_version(self) -> Optional[str]:
|
|
300
|
+
"""Returns the API version for the Azure OpenAI llm client."""
|
|
301
|
+
return self._api_version
|
|
302
|
+
|
|
303
|
+
@property
|
|
304
|
+
def api_type(self) -> Optional[str]:
|
|
305
|
+
return self._api_type
|
|
306
|
+
|
|
307
|
+
@property
|
|
308
|
+
def _litellm_model_name(self) -> str:
|
|
309
|
+
"""Returns the value of LiteLLM's model parameter to be used in
|
|
310
|
+
completion/acompletion in LiteLLM format:
|
|
311
|
+
|
|
312
|
+
<provider>/<model or deployment name>
|
|
313
|
+
"""
|
|
314
|
+
regex_pattern = rf"^{AZURE_OPENAI_PROVIDER}/"
|
|
315
|
+
if not re.match(regex_pattern, self._deployment):
|
|
316
|
+
return f"{AZURE_OPENAI_PROVIDER}/{self._deployment}"
|
|
317
|
+
return self._deployment
|
|
318
|
+
|
|
319
|
+
@property
|
|
320
|
+
def _litellm_extra_parameters(self) -> Dict[str, Any]:
|
|
321
|
+
return self._extra_parameters
|
|
322
|
+
|
|
323
|
+
@property
|
|
324
|
+
def _completion_fn_args(self) -> Dict[str, Any]:
|
|
325
|
+
"""Returns the completion arguments for invoking a call through
|
|
326
|
+
LiteLLM's completion functions.
|
|
327
|
+
"""
|
|
328
|
+
# Set the API key env var to None if OAuth is used
|
|
329
|
+
auth_parameter = (
|
|
330
|
+
{
|
|
331
|
+
LITE_LLM_AZURE_AD_TOKEN: self._oauth.get_bearer_token(),
|
|
332
|
+
LITE_LLM_AZURE_AD_TOKEN_PROVIDER: self._oauth.get_bearer_token_provider(), # noqa: E501
|
|
333
|
+
}
|
|
334
|
+
if self._oauth
|
|
335
|
+
else {LITE_LLM_API_KEY_FIELD: self._api_key_env_var}
|
|
336
|
+
)
|
|
337
|
+
|
|
338
|
+
fn_args = super()._completion_fn_args
|
|
339
|
+
fn_args.update(
|
|
340
|
+
{
|
|
341
|
+
LITE_LLM_API_BASE_FIELD: self.api_base,
|
|
342
|
+
LITE_LLM_API_VERSION_FIELD: self.api_version,
|
|
343
|
+
**auth_parameter,
|
|
344
|
+
}
|
|
345
|
+
)
|
|
346
|
+
return fn_args
|
|
347
|
+
|
|
348
|
+
def validate_client_setup(self) -> None:
|
|
349
|
+
"""Validates that all required configuration parameters are set."""
|
|
350
|
+
|
|
351
|
+
def generate_event_info_for_missing_setting(
|
|
352
|
+
setting: str,
|
|
353
|
+
setting_env_var: Optional[str] = None,
|
|
354
|
+
setting_config_key: Optional[str] = None,
|
|
355
|
+
) -> str:
|
|
356
|
+
"""Generate a part of the message with instructions on what to set
|
|
357
|
+
for the missing client setting.
|
|
358
|
+
"""
|
|
359
|
+
info = "Set {setting} with {options}. "
|
|
360
|
+
options = ""
|
|
361
|
+
if setting_env_var is not None:
|
|
362
|
+
options += f"environment variable '{setting_env_var}'"
|
|
363
|
+
if setting_config_key is not None and setting_env_var is not None:
|
|
364
|
+
options += " or "
|
|
365
|
+
if setting_config_key is not None:
|
|
366
|
+
options += f"config key '{setting_config_key}'"
|
|
367
|
+
|
|
368
|
+
return info.format(setting=setting, options=options)
|
|
369
|
+
|
|
370
|
+
env_var_field = "env_var"
|
|
371
|
+
config_key_field = "config_key"
|
|
372
|
+
current_value_field = "current_value"
|
|
373
|
+
# All required settings for Azure OpenAI client
|
|
374
|
+
settings: Dict[str, Dict[str, Any]] = {
|
|
375
|
+
"API Base": {
|
|
376
|
+
current_value_field: self.api_base,
|
|
377
|
+
env_var_field: AZURE_API_BASE_ENV_VAR,
|
|
378
|
+
config_key_field: API_BASE_CONFIG_KEY,
|
|
379
|
+
},
|
|
380
|
+
"API Version": {
|
|
381
|
+
current_value_field: self.api_version,
|
|
382
|
+
env_var_field: AZURE_API_VERSION_ENV_VAR,
|
|
383
|
+
config_key_field: API_VERSION_CONFIG_KEY,
|
|
384
|
+
},
|
|
385
|
+
"Deployment Name": {
|
|
386
|
+
current_value_field: self.deployment,
|
|
387
|
+
env_var_field: None,
|
|
388
|
+
config_key_field: DEPLOYMENT_CONFIG_KEY,
|
|
389
|
+
},
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
missing_settings = [
|
|
393
|
+
setting_name
|
|
394
|
+
for setting_name, setting_info in settings.items()
|
|
395
|
+
if setting_info[current_value_field] is None
|
|
396
|
+
]
|
|
397
|
+
|
|
398
|
+
if missing_settings:
|
|
399
|
+
event_info = f"Client settings not set: " f"{', '.join(missing_settings)}. "
|
|
400
|
+
|
|
401
|
+
for missing_setting in missing_settings:
|
|
402
|
+
if settings[missing_setting][current_value_field] is not None:
|
|
403
|
+
continue
|
|
404
|
+
event_info += generate_event_info_for_missing_setting(
|
|
405
|
+
missing_setting,
|
|
406
|
+
settings[missing_setting][env_var_field],
|
|
407
|
+
settings[missing_setting][config_key_field],
|
|
408
|
+
)
|
|
409
|
+
|
|
410
|
+
structlogger.error(
|
|
411
|
+
"azure_openai_llm_client.not_configured",
|
|
412
|
+
event_info=event_info,
|
|
413
|
+
missing_settings=missing_settings,
|
|
414
|
+
)
|
|
415
|
+
raise ProviderClientValidationError(event_info)
|