rasa-pro 3.12.0.dev1__py3-none-any.whl → 3.12.0.dev3__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.
- rasa/__main__.py +7 -7
- rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
- rasa/anonymization/anonymization_pipeline.py +3 -3
- rasa/anonymization/anonymization_rule_executor.py +1 -1
- rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
- rasa/cli/arguments/data.py +2 -2
- rasa/cli/arguments/evaluate.py +2 -1
- rasa/cli/arguments/interactive.py +1 -1
- rasa/cli/arguments/run.py +1 -1
- rasa/cli/arguments/test.py +7 -5
- rasa/cli/arguments/train.py +3 -3
- rasa/cli/arguments/visualize.py +2 -2
- rasa/cli/arguments/x.py +1 -0
- rasa/cli/data.py +4 -3
- rasa/cli/dialogue_understanding_test.py +116 -18
- rasa/cli/evaluate.py +1 -1
- rasa/cli/export.py +6 -6
- rasa/cli/interactive.py +4 -5
- rasa/cli/llm_fine_tuning.py +5 -5
- rasa/cli/markers.py +1 -2
- rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
- rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
- rasa/cli/shell.py +2 -3
- rasa/cli/studio/download.py +1 -2
- rasa/cli/studio/studio.py +2 -3
- rasa/cli/studio/train.py +0 -1
- rasa/cli/telemetry.py +2 -2
- rasa/cli/test.py +11 -11
- rasa/cli/utils.py +7 -5
- rasa/core/__init__.py +0 -1
- rasa/core/actions/action.py +42 -21
- rasa/core/actions/action_hangup.py +1 -1
- rasa/core/actions/action_repeat_bot_messages.py +2 -2
- rasa/core/actions/action_run_slot_rejections.py +2 -2
- rasa/core/actions/action_trigger_chitchat.py +1 -1
- rasa/core/actions/action_trigger_flow.py +5 -5
- rasa/core/actions/action_trigger_search.py +1 -1
- rasa/core/actions/forms.py +14 -12
- rasa/core/actions/http_custom_action_executor.py +8 -1
- rasa/core/actions/loops.py +3 -3
- rasa/core/actions/two_stage_fallback.py +13 -13
- rasa/core/auth_retry_tracker_store.py +1 -2
- rasa/core/brokers/broker.py +2 -1
- rasa/core/brokers/file.py +1 -1
- rasa/core/brokers/kafka.py +8 -8
- rasa/core/brokers/pika.py +8 -9
- rasa/core/brokers/sql.py +4 -3
- rasa/core/channels/__init__.py +3 -0
- rasa/core/channels/botframework.py +2 -2
- rasa/core/channels/callback.py +4 -4
- rasa/core/channels/channel.py +11 -11
- rasa/core/channels/console.py +0 -1
- rasa/core/channels/development_inspector.py +6 -6
- rasa/core/channels/facebook.py +5 -5
- rasa/core/channels/hangouts.py +7 -8
- rasa/core/channels/inspector/dist/assets/{arc-861ddd57.js → arc-632a63ec.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-d0fbc5ce-921f02db.js → c4Diagram-d0fbc5ce-081e0df4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-936ed81e-b436c4f8.js → classDiagram-936ed81e-3df0afc2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-c3cb15f1-511a23cb.js → classDiagram-v2-c3cb15f1-8c5ed31e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{createText-62fc7601-ef476ecd.js → createText-62fc7601-89c73b31.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-f2ad444c-f1878e0a.js → edges-f2ad444c-4fc48c3e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-fac75185.js → erDiagram-9d236eb7-907e0440.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-1972c806-201c5bbc.js → flowDb-1972c806-9ec53a3c.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-7ea5b25a-f904ae41.js → flowDiagram-7ea5b25a-41da787a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-abe16c3d-1813da66.js → flowchart-elk-definition-abe16c3d-ce370633.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-9b5ea136-872af172.js → ganttDiagram-9b5ea136-90a36523.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-99d0ae7c-34a0af5a.js → gitGraphDiagram-99d0ae7c-41e1aa3f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-2c4b9a3b-42ba3e3d.js → index-2c4b9a3b-e6f2af62.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-37817b51.js → index-e793d777.js} +3 -3
- rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-6b731386.js → infoDiagram-736b4530-8ceba4db.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-e8579ac6.js → journeyDiagram-df861f2b-960d3809.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-89e6403a.js → layout-498807d8.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-dc73d3fc.js → line-eeccc4e2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-f5b1d2bc.js → linear-8a078617.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-beec6740-82cb74fa.js → mindmap-definition-beec6740-396d17dd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-bdf5f29b.js → pieDiagram-dbbf0591-dc9b5e1b.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-c7a0cbe4.js → quadrantDiagram-4d7f4fd6-a08cba6d.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-7ec5410f.js → requirementDiagram-6fc4c22a-87242b9e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-8f13d901-caee5554.js → sankeyDiagram-8f13d901-53f6f391.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-b655622a-2935f8db.js → sequenceDiagram-b655622a-715c9c20.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-59f0c015-8f5d9693.js → stateDiagram-59f0c015-2e8fb31f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-2b26beab-d565d1de.js → stateDiagram-v2-2b26beab-7e2d2aa0.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-080da4f6-75ad421d.js → styles-080da4f6-4420cea6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-3dcbcfbf-7e764226.js → styles-3dcbcfbf-28676cf4.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9c745c82-7a4e0e61.js → styles-9c745c82-cef936a6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-4835440b-4019d1bf.js → svgDrawCommon-4835440b-151251e9.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-01ea12df.js → timeline-definition-5b62e21b-0d39bdb2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-89407137.js → xychartDiagram-2b33534f-a03fa445.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +3 -1
- rasa/core/channels/inspector/index.html +2 -0
- rasa/core/channels/inspector/src/App.tsx +1 -4
- rasa/core/channels/mattermost.py +4 -4
- rasa/core/channels/rasa_chat.py +4 -4
- rasa/core/channels/rest.py +11 -12
- rasa/core/channels/rocketchat.py +4 -3
- rasa/core/channels/slack.py +6 -5
- rasa/core/channels/socketio.py +7 -28
- rasa/core/channels/studio_chat.py +193 -0
- rasa/core/channels/telegram.py +73 -41
- rasa/core/channels/twilio.py +3 -3
- rasa/core/channels/vier_cvg.py +2 -2
- rasa/core/channels/voice_ready/audiocodes.py +8 -8
- rasa/core/channels/voice_ready/jambonz.py +5 -5
- rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
- rasa/core/channels/voice_ready/twilio_voice.py +9 -8
- rasa/core/channels/voice_ready/utils.py +1 -1
- rasa/core/channels/voice_stream/asr/asr_engine.py +2 -2
- rasa/core/channels/voice_stream/asr/azure.py +2 -2
- rasa/core/channels/voice_stream/asr/deepgram.py +57 -16
- rasa/core/channels/voice_stream/browser_audio.py +9 -6
- rasa/core/channels/voice_stream/call_state.py +2 -1
- rasa/core/channels/voice_stream/tts/azure.py +1 -2
- rasa/core/channels/voice_stream/tts/cartesia.py +5 -4
- rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
- rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
- rasa/core/channels/voice_stream/twilio_media_streams.py +10 -7
- rasa/core/channels/voice_stream/util.py +1 -1
- rasa/core/channels/voice_stream/voice_channel.py +15 -15
- rasa/core/channels/webexteams.py +3 -4
- rasa/core/evaluation/marker.py +7 -6
- rasa/core/evaluation/marker_base.py +15 -16
- rasa/core/evaluation/marker_stats.py +3 -4
- rasa/core/evaluation/marker_tracker_loader.py +5 -4
- rasa/core/exporter.py +4 -4
- rasa/core/featurizers/precomputation.py +8 -8
- rasa/core/featurizers/single_state_featurizer.py +7 -7
- rasa/core/featurizers/tracker_featurizers.py +13 -13
- rasa/core/http_interpreter.py +3 -4
- rasa/core/information_retrieval/__init__.py +1 -1
- rasa/core/information_retrieval/faiss.py +4 -4
- rasa/core/information_retrieval/information_retrieval.py +2 -2
- rasa/core/information_retrieval/milvus.py +3 -3
- rasa/core/information_retrieval/qdrant.py +3 -3
- rasa/core/jobs.py +1 -0
- rasa/core/lock.py +2 -3
- rasa/core/lock_store.py +3 -3
- rasa/core/migrate.py +11 -8
- rasa/core/nlg/__init__.py +1 -1
- rasa/core/nlg/callback.py +2 -3
- rasa/core/nlg/contextual_response_rephraser.py +63 -13
- rasa/core/nlg/generator.py +2 -2
- rasa/core/nlg/interpolator.py +4 -3
- rasa/core/nlg/response.py +3 -4
- rasa/core/nlg/summarize.py +1 -0
- rasa/core/persistor.py +3 -3
- rasa/core/policies/ensemble.py +10 -9
- rasa/core/policies/enterprise_search_policy.py +86 -21
- rasa/core/policies/flow_policy.py +13 -14
- rasa/core/policies/flows/flow_executor.py +35 -11
- rasa/core/policies/intentless_policy.py +6 -7
- rasa/core/policies/memoization.py +22 -20
- rasa/core/policies/policy.py +24 -22
- rasa/core/policies/rule_policy.py +37 -36
- rasa/core/policies/ted_policy.py +87 -85
- rasa/core/policies/unexpected_intent_policy.py +77 -75
- rasa/core/processor.py +96 -65
- rasa/core/run.py +1 -1
- rasa/core/secrets_manager/endpoints.py +2 -3
- rasa/core/secrets_manager/factory.py +2 -3
- rasa/core/secrets_manager/secret_manager.py +2 -3
- rasa/core/secrets_manager/vault.py +2 -2
- rasa/core/test.py +30 -30
- rasa/core/tracker_store.py +15 -15
- rasa/core/train.py +1 -1
- rasa/core/training/__init__.py +2 -2
- rasa/core/training/converters/responses_prefix_converter.py +1 -2
- rasa/core/training/interactive.py +13 -13
- rasa/core/training/story_conflict.py +4 -5
- rasa/core/training/training.py +3 -5
- rasa/core/utils.py +5 -5
- rasa/core/visualize.py +1 -1
- rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
- rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
- rasa/dialogue_understanding/commands/__init__.py +22 -22
- rasa/dialogue_understanding/commands/can_not_handle_command.py +20 -1
- rasa/dialogue_understanding/commands/cancel_flow_command.py +18 -7
- rasa/dialogue_understanding/commands/change_flow_command.py +18 -2
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +18 -4
- rasa/dialogue_understanding/commands/clarify_command.py +19 -3
- rasa/dialogue_understanding/commands/command.py +19 -3
- rasa/dialogue_understanding/commands/correct_slots_command.py +3 -3
- rasa/dialogue_understanding/commands/error_command.py +1 -1
- rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
- rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
- rasa/dialogue_understanding/commands/human_handoff_command.py +16 -4
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +18 -4
- rasa/dialogue_understanding/commands/noop_command.py +2 -1
- rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +16 -4
- rasa/dialogue_understanding/commands/restart_command.py +2 -5
- rasa/dialogue_understanding/commands/session_end_command.py +3 -5
- rasa/dialogue_understanding/commands/session_start_command.py +3 -5
- rasa/dialogue_understanding/commands/set_slot_command.py +27 -3
- rasa/dialogue_understanding/commands/skip_question_command.py +16 -4
- rasa/dialogue_understanding/commands/start_flow_command.py +17 -2
- rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
- rasa/dialogue_understanding/commands/utils.py +64 -45
- rasa/dialogue_understanding/constants.py +1 -0
- rasa/dialogue_understanding/generator/command_generator.py +2 -119
- rasa/dialogue_understanding/generator/command_parser.py +201 -0
- rasa/dialogue_understanding/generator/constants.py +2 -2
- rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +11 -57
- rasa/dialogue_understanding/generator/llm_command_generator.py +2 -1
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +67 -120
- rasa/dialogue_understanding/generator/nlu_command_adapter.py +8 -10
- rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +32 -93
- rasa/dialogue_understanding/generator/utils.py +45 -0
- rasa/dialogue_understanding/patterns/cancel.py +2 -1
- rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
- rasa/dialogue_understanding/patterns/chitchat.py +1 -1
- rasa/dialogue_understanding/patterns/clarify.py +2 -1
- rasa/dialogue_understanding/patterns/code_change.py +2 -0
- rasa/dialogue_understanding/patterns/collect_information.py +6 -3
- rasa/dialogue_understanding/patterns/completed.py +1 -1
- rasa/dialogue_understanding/patterns/continue_interrupted.py +10 -1
- rasa/dialogue_understanding/patterns/correction.py +4 -2
- rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
- rasa/dialogue_understanding/patterns/internal_error.py +1 -0
- rasa/dialogue_understanding/patterns/search.py +1 -1
- rasa/dialogue_understanding/patterns/session_start.py +1 -1
- rasa/dialogue_understanding/patterns/skip_question.py +1 -0
- rasa/dialogue_understanding/patterns/user_silence.py +1 -1
- rasa/dialogue_understanding/processor/command_processor.py +13 -9
- rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
- rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
- rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
- rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
- rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
- rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
- rasa/dialogue_understanding/stack/utils.py +8 -4
- rasa/dialogue_understanding/utils.py +121 -2
- rasa/dialogue_understanding_test/README.md +379 -0
- rasa/dialogue_understanding_test/command_comparison.py +60 -0
- rasa/dialogue_understanding_test/command_metric_calculation.py +110 -4
- rasa/dialogue_understanding_test/constants.py +6 -1
- rasa/dialogue_understanding_test/du_test_case.py +252 -38
- rasa/dialogue_understanding_test/du_test_result.py +281 -2
- rasa/dialogue_understanding_test/du_test_runner.py +239 -10
- rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
- rasa/dialogue_understanding_test/io.py +338 -20
- rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
- rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
- rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
- rasa/dialogue_understanding_test/utils.py +70 -0
- rasa/dialogue_understanding_test/validation.py +59 -4
- rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
- rasa/e2e_test/assertions.py +1 -1
- rasa/e2e_test/e2e_config.py +1 -1
- rasa/e2e_test/e2e_test_case.py +3 -4
- rasa/e2e_test/e2e_test_converter.py +2 -3
- rasa/e2e_test/e2e_test_coverage_report.py +6 -6
- rasa/e2e_test/e2e_test_result.py +1 -1
- rasa/e2e_test/e2e_test_runner.py +134 -31
- rasa/e2e_test/stub_custom_action.py +1 -1
- rasa/e2e_test/utils/e2e_yaml_utils.py +1 -1
- rasa/e2e_test/utils/io.py +132 -65
- rasa/e2e_test/utils/validation.py +1 -1
- rasa/engine/caching.py +5 -7
- rasa/engine/constants.py +1 -1
- rasa/engine/graph.py +2 -2
- rasa/engine/recipes/default_components.py +13 -15
- rasa/engine/recipes/recipe.py +2 -2
- rasa/engine/runner/dask.py +2 -2
- rasa/engine/runner/interface.py +1 -0
- rasa/engine/storage/local_model_storage.py +5 -4
- rasa/engine/storage/resource.py +2 -1
- rasa/engine/storage/storage.py +5 -3
- rasa/engine/training/components.py +2 -1
- rasa/engine/training/fingerprinting.py +4 -2
- rasa/engine/training/graph_trainer.py +4 -4
- rasa/engine/training/hooks.py +2 -2
- rasa/engine/validation.py +34 -33
- rasa/exceptions.py +3 -2
- rasa/graph_components/converters/nlu_message_converter.py +3 -3
- rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
- rasa/graph_components/providers/domain_provider.py +3 -2
- rasa/graph_components/providers/flows_provider.py +2 -3
- rasa/graph_components/providers/forms_provider.py +4 -4
- rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
- rasa/graph_components/providers/responses_provider.py +4 -4
- rasa/graph_components/providers/rule_only_provider.py +3 -2
- rasa/graph_components/providers/story_graph_provider.py +8 -8
- rasa/graph_components/providers/training_tracker_provider.py +3 -2
- rasa/graph_components/validators/default_recipe_validator.py +16 -16
- rasa/graph_components/validators/finetuning_validator.py +10 -8
- rasa/hooks.py +18 -12
- rasa/jupyter.py +2 -2
- rasa/llm_fine_tuning/annotation_module.py +4 -4
- rasa/llm_fine_tuning/conversations.py +6 -6
- rasa/llm_fine_tuning/llm_data_preparation_module.py +1 -1
- rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
- rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +1 -1
- rasa/llm_fine_tuning/paraphrasing_module.py +1 -1
- rasa/llm_fine_tuning/storage.py +3 -3
- rasa/markers/marker.py +2 -3
- rasa/markers/marker_base.py +1 -2
- rasa/markers/upload.py +2 -2
- rasa/markers/validate.py +2 -3
- rasa/model.py +3 -5
- rasa/model_manager/config.py +1 -1
- rasa/model_manager/model_api.py +5 -4
- rasa/model_manager/runner_service.py +6 -6
- rasa/model_manager/socket_bridge.py +8 -3
- rasa/model_manager/studio_jwt_auth.py +1 -0
- rasa/model_manager/trainer_service.py +9 -7
- rasa/model_manager/utils.py +1 -1
- rasa/model_manager/warm_rasa_process.py +14 -8
- rasa/model_service.py +5 -6
- rasa/model_testing.py +13 -15
- rasa/nlu/classifiers/diet_classifier.py +72 -73
- rasa/nlu/classifiers/fallback_classifier.py +9 -8
- rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
- rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
- rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
- rasa/nlu/classifiers/regex_message_handler.py +3 -2
- rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
- rasa/nlu/convert.py +2 -2
- rasa/nlu/emulators/dialogflow.py +3 -3
- rasa/nlu/emulators/luis.py +5 -5
- rasa/nlu/emulators/no_emulator.py +1 -0
- rasa/nlu/emulators/wit.py +4 -4
- rasa/nlu/extractors/crf_entity_extractor.py +11 -11
- rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
- rasa/nlu/extractors/entity_synonyms.py +10 -9
- rasa/nlu/extractors/extractor.py +16 -16
- rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
- rasa/nlu/extractors/regex_entity_extractor.py +11 -10
- rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
- rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
- rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
- rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
- rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
- rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
- rasa/nlu/featurizers/featurizer.py +5 -4
- rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
- rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
- rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
- rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
- rasa/nlu/model.py +0 -1
- rasa/nlu/selectors/response_selector.py +67 -68
- rasa/nlu/test.py +38 -38
- rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
- rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
- rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
- rasa/nlu/tokenizers/tokenizer.py +6 -7
- rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
- rasa/nlu/utils/bilou_utils.py +7 -7
- rasa/nlu/utils/hugging_face/registry.py +22 -22
- rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
- rasa/nlu/utils/mitie_utils.py +2 -1
- rasa/nlu/utils/pattern_utils.py +1 -1
- rasa/nlu/utils/spacy_utils.py +3 -3
- rasa/plugin.py +12 -1
- rasa/server.py +37 -1
- rasa/shared/constants.py +22 -2
- rasa/shared/core/command_payload_reader.py +15 -7
- rasa/shared/core/constants.py +4 -1
- rasa/shared/core/conversation.py +1 -2
- rasa/shared/core/events.py +47 -37
- rasa/shared/core/flows/__init__.py +0 -1
- rasa/shared/core/flows/flow.py +11 -11
- rasa/shared/core/flows/flow_step.py +19 -13
- rasa/shared/core/flows/flow_step_links.py +21 -14
- rasa/shared/core/flows/flow_step_sequence.py +6 -4
- rasa/shared/core/flows/flows_list.py +3 -3
- rasa/shared/core/flows/nlu_trigger.py +1 -1
- rasa/shared/core/flows/steps/__init__.py +2 -2
- rasa/shared/core/flows/steps/action.py +4 -3
- rasa/shared/core/flows/steps/call.py +4 -4
- rasa/shared/core/flows/steps/collect.py +7 -4
- rasa/shared/core/flows/steps/continuation.py +3 -1
- rasa/shared/core/flows/steps/end.py +3 -1
- rasa/shared/core/flows/steps/internal.py +3 -2
- rasa/shared/core/flows/steps/link.py +6 -4
- rasa/shared/core/flows/steps/no_operation.py +7 -5
- rasa/shared/core/flows/steps/set_slots.py +4 -3
- rasa/shared/core/flows/steps/start.py +3 -1
- rasa/shared/core/flows/utils.py +1 -0
- rasa/shared/core/flows/validation.py +3 -5
- rasa/shared/core/generator.py +20 -21
- rasa/shared/core/slot_mappings.py +15 -15
- rasa/shared/core/slots.py +3 -3
- rasa/shared/core/trackers.py +31 -31
- rasa/shared/core/training_data/loading.py +1 -1
- rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
- rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
- rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
- rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
- rasa/shared/core/training_data/structures.py +11 -12
- rasa/shared/core/training_data/visualization.py +10 -10
- rasa/shared/data.py +6 -6
- rasa/shared/engine/caching.py +0 -1
- rasa/shared/exceptions.py +2 -2
- rasa/shared/importers/rasa.py +5 -6
- rasa/shared/importers/utils.py +1 -1
- rasa/shared/nlu/constants.py +3 -0
- rasa/shared/nlu/training_data/entities_parser.py +6 -6
- rasa/shared/nlu/training_data/features.py +3 -3
- rasa/shared/nlu/training_data/formats/__init__.py +1 -1
- rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
- rasa/shared/nlu/training_data/formats/luis.py +7 -8
- rasa/shared/nlu/training_data/formats/rasa.py +4 -5
- rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
- rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
- rasa/shared/nlu/training_data/formats/wit.py +3 -4
- rasa/shared/nlu/training_data/loading.py +4 -4
- rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
- rasa/shared/nlu/training_data/message.py +13 -14
- rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
- rasa/shared/nlu/training_data/schemas/responses.yml +1 -0
- rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
- rasa/shared/nlu/training_data/training_data.py +12 -13
- rasa/shared/nlu/training_data/util.py +11 -10
- rasa/shared/providers/_configs/azure_openai_client_config.py +3 -497
- rasa/shared/providers/_configs/client_config.py +1 -3
- rasa/shared/providers/_configs/default_litellm_client_config.py +1 -3
- rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +1 -3
- rasa/shared/providers/_configs/litellm_router_client_config.py +1 -3
- rasa/shared/providers/_configs/model_group_config.py +2 -7
- rasa/shared/providers/_configs/openai_client_config.py +1 -3
- rasa/shared/providers/_configs/rasa_llm_client_config.py +1 -3
- rasa/shared/providers/_configs/self_hosted_llm_client_config.py +1 -3
- rasa/shared/providers/_configs/utils.py +1 -0
- rasa/shared/providers/_ssl_verification_utils.py +5 -6
- rasa/shared/providers/_utils.py +5 -5
- rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
- rasa/shared/providers/embedding/azure_openai_embedding_client.py +3 -28
- rasa/shared/providers/embedding/embedding_client.py +1 -1
- rasa/shared/providers/embedding/litellm_router_embedding_client.py +1 -3
- rasa/shared/providers/llm/_base_litellm_client.py +1 -3
- rasa/shared/providers/llm/azure_openai_llm_client.py +25 -81
- rasa/shared/providers/llm/default_litellm_llm_client.py +1 -3
- rasa/shared/providers/llm/litellm_router_llm_client.py +2 -21
- rasa/shared/providers/llm/llm_client.py +1 -3
- rasa/shared/providers/llm/llm_response.py +41 -2
- rasa/shared/providers/llm/openai_llm_client.py +3 -9
- rasa/shared/providers/llm/rasa_llm_client.py +6 -20
- rasa/shared/providers/llm/self_hosted_llm_client.py +3 -9
- rasa/shared/providers/mappings.py +18 -19
- rasa/shared/providers/router/_base_litellm_router_client.py +1 -3
- rasa/shared/providers/router/router_client.py +1 -3
- rasa/shared/utils/cli.py +1 -1
- rasa/shared/utils/common.py +1 -1
- rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
- rasa/shared/utils/health_check/health_check.py +3 -3
- rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
- rasa/shared/utils/io.py +1 -1
- rasa/shared/utils/llm.py +5 -9
- rasa/shared/utils/pykwalify_extensions.py +1 -1
- rasa/shared/utils/schemas/events.py +1 -1
- rasa/shared/utils/yaml.py +29 -26
- rasa/studio/auth.py +3 -3
- rasa/studio/config.py +1 -2
- rasa/studio/data_handler.py +3 -3
- rasa/studio/download.py +1 -1
- rasa/studio/results_logger.py +3 -3
- rasa/studio/upload.py +2 -0
- rasa/telemetry.py +31 -0
- rasa/tracing/config.py +3 -3
- rasa/tracing/instrumentation/attribute_extractors.py +2 -0
- rasa/tracing/instrumentation/instrumentation.py +4 -4
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
- rasa/tracing/instrumentation/metrics.py +11 -11
- rasa/tracing/metric_instrument_provider.py +14 -14
- rasa/utils/common.py +12 -9
- rasa/utils/endpoints.py +1 -1
- rasa/utils/io.py +7 -7
- rasa/utils/licensing.py +3 -4
- rasa/utils/log_utils.py +7 -6
- rasa/utils/ml_utils.py +1 -0
- rasa/utils/plotting.py +3 -3
- rasa/utils/sanic_error_handler.py +1 -1
- rasa/utils/tensorflow/callback.py +2 -2
- rasa/utils/tensorflow/crf.py +2 -2
- rasa/utils/tensorflow/data_generator.py +5 -5
- rasa/utils/tensorflow/environment.py +3 -3
- rasa/utils/tensorflow/feature_array.py +2 -3
- rasa/utils/tensorflow/layers.py +18 -12
- rasa/utils/tensorflow/layers_utils.py +2 -1
- rasa/utils/tensorflow/metrics.py +2 -2
- rasa/utils/tensorflow/model_data.py +7 -7
- rasa/utils/tensorflow/model_data_utils.py +10 -9
- rasa/utils/tensorflow/models.py +31 -32
- rasa/utils/tensorflow/rasa_layers.py +20 -19
- rasa/utils/tensorflow/types.py +2 -1
- rasa/utils/train_utils.py +23 -21
- rasa/utils/url_tools.py +1 -1
- rasa/validator.py +17 -1
- rasa/version.py +1 -1
- {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/METADATA +8 -9
- rasa_pro-3.12.0.dev3.dist-info/RECORD +800 -0
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +0 -1
- rasa/shared/providers/constants.py +0 -7
- rasa_pro-3.12.0.dev1.dist-info/RECORD +0 -790
- {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/NOTICE +0 -0
- {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/WHEEL +0 -0
- {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/entry_points.txt +0 -0
|
@@ -1,24 +1,10 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import logging
|
|
4
|
-
from abc import abstractmethod
|
|
5
1
|
from dataclasses import asdict, dataclass, field
|
|
6
|
-
from
|
|
7
|
-
from functools import lru_cache
|
|
8
|
-
from typing import Any, Callable, Coroutine, Dict, List, Optional, Protocol, Set
|
|
2
|
+
from typing import Any, Dict, Optional
|
|
9
3
|
|
|
10
4
|
import structlog
|
|
11
|
-
from azure.core.credentials import TokenProvider
|
|
12
|
-
from azure.identity import (
|
|
13
|
-
CertificateCredential,
|
|
14
|
-
ClientSecretCredential,
|
|
15
|
-
DefaultAzureCredential,
|
|
16
|
-
get_bearer_token_provider,
|
|
17
|
-
)
|
|
18
5
|
|
|
19
6
|
from rasa.shared.constants import (
|
|
20
7
|
API_BASE_CONFIG_KEY,
|
|
21
|
-
API_KEY,
|
|
22
8
|
API_TYPE_CONFIG_KEY,
|
|
23
9
|
API_VERSION_CONFIG_KEY,
|
|
24
10
|
AZURE_API_TYPE,
|
|
@@ -75,459 +61,6 @@ FORBIDDEN_KEYS = [
|
|
|
75
61
|
]
|
|
76
62
|
|
|
77
63
|
|
|
78
|
-
AZURE_CLIENT_ID_FIELD = "client_id"
|
|
79
|
-
AZURE_CLIENT_SECRET_FIELD = "client_secret"
|
|
80
|
-
AZURE_TENANT_ID_FIELD = "tenant_id"
|
|
81
|
-
AZURE_CERTIFICATE_PATH_FIELD = "certificate_path"
|
|
82
|
-
AZURE_CERTIFICATE_PASSWORD_FIELD = "certificate_password"
|
|
83
|
-
AZURE_SEND_CERTIFICATE_CHAIN_FIELD = "send_certificate_chain"
|
|
84
|
-
AZURE_SCOPES_FIELD = "scopes"
|
|
85
|
-
AZURE_AUTHORITY_FIELD = "authority_host"
|
|
86
|
-
AZURE_DISABLE_INSTANCE_DISCOVERY_FIELD = "disable_instance_discovery"
|
|
87
|
-
OAUTH_TYPE_FIELD = "type"
|
|
88
|
-
AZURE_OAUTH_KEY = "oauth"
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
azure_logger = logging.getLogger("azure")
|
|
92
|
-
azure_logger.setLevel(logging.DEBUG)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
class AzureOAuthType(str, Enum):
|
|
96
|
-
AZURE_DEFAULT = "default"
|
|
97
|
-
AZURE_CLIENT_SECRET = "client_secret"
|
|
98
|
-
AZURE_CLIENT_CERTIFICATE = "client_certificate"
|
|
99
|
-
# Invalid type is used to indicate that the type
|
|
100
|
-
# configuration is invalid or not set.
|
|
101
|
-
INVALID = "invalid"
|
|
102
|
-
|
|
103
|
-
@staticmethod
|
|
104
|
-
def from_string(value: Optional[str]) -> AzureOAuthType:
|
|
105
|
-
if value is None or value not in AzureOAuthType.valid_string_values():
|
|
106
|
-
return AzureOAuthType.INVALID
|
|
107
|
-
|
|
108
|
-
return AzureOAuthType(value)
|
|
109
|
-
|
|
110
|
-
@staticmethod
|
|
111
|
-
def valid_string_values() -> Set[str]:
|
|
112
|
-
return {e.value for e in AzureOAuthType.valid_values()}
|
|
113
|
-
|
|
114
|
-
@staticmethod
|
|
115
|
-
def valid_values() -> Set[AzureOAuthType]:
|
|
116
|
-
return {
|
|
117
|
-
AzureOAuthType.AZURE_DEFAULT,
|
|
118
|
-
AzureOAuthType.AZURE_CLIENT_SECRET,
|
|
119
|
-
AzureOAuthType.AZURE_CLIENT_CERTIFICATE,
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
class AzureAuthType(str, Enum):
|
|
124
|
-
API_KEY = "api_key"
|
|
125
|
-
OAUTH = "oauth"
|
|
126
|
-
|
|
127
|
-
@staticmethod
|
|
128
|
-
def from_string(value: str) -> AzureAuthType:
|
|
129
|
-
try:
|
|
130
|
-
return AzureAuthType(value)
|
|
131
|
-
except ValueError:
|
|
132
|
-
raise ValueError(f"Invalid AzureAuthType value: {value}")
|
|
133
|
-
|
|
134
|
-
def __str__(self) -> str:
|
|
135
|
-
return self.value
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
DEFAULT_AUTH_TYPE = AzureAuthType.API_KEY
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
BearerTokenProvider = Callable[[], Coroutine[Any, Any, str]]
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
class AzureEntraIDCredential(Protocol):
|
|
145
|
-
@abstractmethod
|
|
146
|
-
def create_azure_credential(self) -> TokenProvider: ...
|
|
147
|
-
@abstractmethod
|
|
148
|
-
def to_dict(self) -> dict: ...
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
@dataclass
|
|
152
|
-
class AzureClientCredentialsConfig:
|
|
153
|
-
"""Azure OAuth client credentials configuration.
|
|
154
|
-
|
|
155
|
-
Attributes:
|
|
156
|
-
client_id: The client ID.
|
|
157
|
-
client_secret: The client secret.
|
|
158
|
-
tenant_id: The tenant ID.
|
|
159
|
-
authority_host: The authority host.
|
|
160
|
-
disable_instance_discovery: Whether to disable instance discovery. This is used
|
|
161
|
-
to disable fetching metadata from the Azure Instance Metadata Service.
|
|
162
|
-
"""
|
|
163
|
-
|
|
164
|
-
client_id: str
|
|
165
|
-
client_secret: str
|
|
166
|
-
tenant_id: str
|
|
167
|
-
authority_host: Optional[str] = None
|
|
168
|
-
disable_instance_discovery: bool = False
|
|
169
|
-
|
|
170
|
-
@staticmethod
|
|
171
|
-
def required_fields() -> Set[str]:
|
|
172
|
-
"""Returns the required fields for the configuration."""
|
|
173
|
-
return {AZURE_CLIENT_ID_FIELD, AZURE_TENANT_ID_FIELD, AZURE_CLIENT_SECRET_FIELD}
|
|
174
|
-
|
|
175
|
-
@staticmethod
|
|
176
|
-
def config_has_required_fields(config: Dict[str, Any]) -> bool:
|
|
177
|
-
"""Check if the configuration has all the required fields."""
|
|
178
|
-
return AzureClientCredentialsConfig.required_fields().issubset(
|
|
179
|
-
set(config.keys())
|
|
180
|
-
)
|
|
181
|
-
|
|
182
|
-
@classmethod
|
|
183
|
-
def from_config(cls, config: Dict[str, Any]) -> AzureClientCredentialsConfig:
|
|
184
|
-
"""Initializes a dataclass from the passed config.
|
|
185
|
-
|
|
186
|
-
Args:
|
|
187
|
-
config: (dict) The config from which to initialize.
|
|
188
|
-
|
|
189
|
-
Returns:
|
|
190
|
-
AzureClientCredentialsConfig
|
|
191
|
-
"""
|
|
192
|
-
if not cls.config_has_required_fields(config):
|
|
193
|
-
message = (
|
|
194
|
-
f"A configuration for Azure client credentials "
|
|
195
|
-
f"must contain the following keys: {cls.required_fields()}"
|
|
196
|
-
)
|
|
197
|
-
structlogger.error(
|
|
198
|
-
"azure_client_credentials_config.missing_required_keys",
|
|
199
|
-
message=message,
|
|
200
|
-
config=config,
|
|
201
|
-
)
|
|
202
|
-
raise ValueError(message)
|
|
203
|
-
|
|
204
|
-
return cls(
|
|
205
|
-
client_id=config.pop(AZURE_CLIENT_ID_FIELD),
|
|
206
|
-
client_secret=config.pop(AZURE_CLIENT_SECRET_FIELD),
|
|
207
|
-
tenant_id=config.pop(AZURE_TENANT_ID_FIELD),
|
|
208
|
-
authority_host=config.pop(AZURE_AUTHORITY_FIELD, None),
|
|
209
|
-
disable_instance_discovery=config.pop(
|
|
210
|
-
AZURE_DISABLE_INSTANCE_DISCOVERY_FIELD, False
|
|
211
|
-
),
|
|
212
|
-
)
|
|
213
|
-
|
|
214
|
-
def to_dict(self) -> dict:
|
|
215
|
-
"""Converts the config instance into a dictionary."""
|
|
216
|
-
result = asdict(self)
|
|
217
|
-
result[OAUTH_TYPE_FIELD] = AzureOAuthType.AZURE_CLIENT_SECRET.value
|
|
218
|
-
return result
|
|
219
|
-
|
|
220
|
-
def create_azure_credential(self) -> TokenProvider:
|
|
221
|
-
return create_client_credentials(
|
|
222
|
-
client_id=self.client_id,
|
|
223
|
-
client_secret=self.client_secret,
|
|
224
|
-
tenant_id=self.tenant_id,
|
|
225
|
-
authority_host=self.authority_host,
|
|
226
|
-
disable_instance_discovery=self.disable_instance_discovery,
|
|
227
|
-
)
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
@lru_cache
|
|
231
|
-
def create_client_credentials(
|
|
232
|
-
client_id: str,
|
|
233
|
-
client_secret: str,
|
|
234
|
-
tenant_id: str,
|
|
235
|
-
authority_host: Optional[str] = None,
|
|
236
|
-
disable_instance_discovery: bool = False,
|
|
237
|
-
) -> ClientSecretCredential:
|
|
238
|
-
"""Create a ClientSecretCredential.
|
|
239
|
-
|
|
240
|
-
We cache the result of this function to avoid creating multiple instances
|
|
241
|
-
of the same credential. This makes it possible to utilise the token caching
|
|
242
|
-
functionality of the azure-identity library.
|
|
243
|
-
|
|
244
|
-
Args:
|
|
245
|
-
client_id: The client ID.
|
|
246
|
-
client_secret: The client secret.
|
|
247
|
-
tenant_id: The tenant ID.
|
|
248
|
-
authority_host: The authority host.
|
|
249
|
-
disable_instance_discovery: Whether to disable instance discovery. This is used
|
|
250
|
-
to disable fetching metadata from the Azure Instance Metadata Service.
|
|
251
|
-
|
|
252
|
-
Returns:
|
|
253
|
-
ClientSecretCredential
|
|
254
|
-
"""
|
|
255
|
-
return ClientSecretCredential(
|
|
256
|
-
client_id=client_id,
|
|
257
|
-
client_secret=client_secret,
|
|
258
|
-
tenant_id=tenant_id,
|
|
259
|
-
authority=authority_host,
|
|
260
|
-
disable_instance_discovery=disable_instance_discovery,
|
|
261
|
-
)
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
@dataclass
|
|
265
|
-
class AzureClientCertificateConfig:
|
|
266
|
-
"""Azure OAuth client certificate configuration.
|
|
267
|
-
|
|
268
|
-
Attributes:
|
|
269
|
-
client_id: The client ID.
|
|
270
|
-
tenant_id: The tenant ID.
|
|
271
|
-
certificate_path: The path to the certificate file.
|
|
272
|
-
certificate_password: The certificate password.
|
|
273
|
-
send_certificate_chain: Whether to send the certificate chain.
|
|
274
|
-
authority_host: The authority host.
|
|
275
|
-
disable_instance_discovery: Whether to disable instance discovery. This is used
|
|
276
|
-
to disable fetching metadata from the Azure Instance Metadata Service.
|
|
277
|
-
"""
|
|
278
|
-
|
|
279
|
-
client_id: str
|
|
280
|
-
tenant_id: str
|
|
281
|
-
certificate_path: str
|
|
282
|
-
certificate_password: Optional[str] = None
|
|
283
|
-
send_certificate_chain: bool = False
|
|
284
|
-
authority_host: Optional[str] = None
|
|
285
|
-
disable_instance_discovery: bool = False
|
|
286
|
-
|
|
287
|
-
@staticmethod
|
|
288
|
-
def required_fields() -> Set[str]:
|
|
289
|
-
"""Returns the required fields for the configuration."""
|
|
290
|
-
return {
|
|
291
|
-
AZURE_CLIENT_ID_FIELD,
|
|
292
|
-
AZURE_TENANT_ID_FIELD,
|
|
293
|
-
AZURE_CERTIFICATE_PATH_FIELD,
|
|
294
|
-
AZURE_CERTIFICATE_PASSWORD_FIELD,
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
@staticmethod
|
|
298
|
-
def config_has_required_fields(config: Dict[str, Any]) -> bool:
|
|
299
|
-
"""Check if the configuration has all the required fields."""
|
|
300
|
-
return AzureClientCertificateConfig.required_fields().issubset(
|
|
301
|
-
set(config.keys())
|
|
302
|
-
)
|
|
303
|
-
|
|
304
|
-
@classmethod
|
|
305
|
-
def from_config(
|
|
306
|
-
cls, config: Dict[str, Any]
|
|
307
|
-
) -> Optional[AzureClientCertificateConfig]:
|
|
308
|
-
"""Initializes a dataclass from the passed config.
|
|
309
|
-
|
|
310
|
-
Args:
|
|
311
|
-
config: (dict) The config from which to initialize.
|
|
312
|
-
|
|
313
|
-
Returns:
|
|
314
|
-
AzureClientCertificateConfig
|
|
315
|
-
"""
|
|
316
|
-
if not cls.config_has_required_fields(config):
|
|
317
|
-
message = (
|
|
318
|
-
f"A configuration for Azure client certificate "
|
|
319
|
-
f"must contain "
|
|
320
|
-
f"the following keys: {cls.required_fields()}"
|
|
321
|
-
)
|
|
322
|
-
structlogger.error(
|
|
323
|
-
"azure_client_certificate_config.validation_error",
|
|
324
|
-
message=message,
|
|
325
|
-
config=config,
|
|
326
|
-
)
|
|
327
|
-
raise ValueError(message)
|
|
328
|
-
|
|
329
|
-
return cls(
|
|
330
|
-
client_id=config[AZURE_CLIENT_ID_FIELD],
|
|
331
|
-
tenant_id=config[AZURE_TENANT_ID_FIELD],
|
|
332
|
-
certificate_path=config[AZURE_CERTIFICATE_PATH_FIELD],
|
|
333
|
-
certificate_password=config.get(AZURE_CERTIFICATE_PASSWORD_FIELD, None),
|
|
334
|
-
authority_host=config.get(AZURE_AUTHORITY_FIELD, None),
|
|
335
|
-
send_certificate_chain=config.get(
|
|
336
|
-
AZURE_SEND_CERTIFICATE_CHAIN_FIELD, False
|
|
337
|
-
),
|
|
338
|
-
disable_instance_discovery=config.get(
|
|
339
|
-
AZURE_DISABLE_INSTANCE_DISCOVERY_FIELD, False
|
|
340
|
-
),
|
|
341
|
-
)
|
|
342
|
-
|
|
343
|
-
def to_dict(self) -> dict:
|
|
344
|
-
"""Converts the config instance into a dictionary."""
|
|
345
|
-
result = asdict(self)
|
|
346
|
-
result[OAUTH_TYPE_FIELD] = AzureOAuthType.AZURE_CLIENT_CERTIFICATE.value
|
|
347
|
-
return result
|
|
348
|
-
|
|
349
|
-
def create_azure_credential(self) -> TokenProvider:
|
|
350
|
-
return create_certificate_credentials(
|
|
351
|
-
client_id=self.client_id,
|
|
352
|
-
tenant_id=self.tenant_id,
|
|
353
|
-
certificate_path=self.certificate_path,
|
|
354
|
-
password=self.certificate_password,
|
|
355
|
-
send_certificate_chain=self.send_certificate_chain,
|
|
356
|
-
authority_host=self.authority_host,
|
|
357
|
-
disable_instance_discovery=self.disable_instance_discovery,
|
|
358
|
-
)
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
@lru_cache
|
|
362
|
-
def create_certificate_credentials(
|
|
363
|
-
tenant_id: str,
|
|
364
|
-
client_id: str,
|
|
365
|
-
certificate_path: Optional[str] = None,
|
|
366
|
-
password: Optional[str] = None,
|
|
367
|
-
send_certificate_chain: bool = False,
|
|
368
|
-
authority_host: Optional[str] = None,
|
|
369
|
-
disable_instance_discovery: bool = False,
|
|
370
|
-
) -> CertificateCredential:
|
|
371
|
-
"""Create a CertificateCredential.
|
|
372
|
-
|
|
373
|
-
We cache the result of this function to avoid creating multiple instances
|
|
374
|
-
of the same credential. This makes it possible to utilise the token caching
|
|
375
|
-
functionality of the azure-identity library.
|
|
376
|
-
|
|
377
|
-
Args:
|
|
378
|
-
tenant_id: The tenant ID.
|
|
379
|
-
client_id: The client ID.
|
|
380
|
-
certificate_path: The path to the certificate file.
|
|
381
|
-
password: The certificate password.
|
|
382
|
-
send_certificate_chain: Whether to send the certificate chain.
|
|
383
|
-
authority_host: The authority host.
|
|
384
|
-
disable_instance_discovery: Whether to disable instance discovery. This is used
|
|
385
|
-
|
|
386
|
-
Returns:
|
|
387
|
-
CertificateCredential
|
|
388
|
-
"""
|
|
389
|
-
|
|
390
|
-
return CertificateCredential(
|
|
391
|
-
client_id=client_id,
|
|
392
|
-
tenant_id=tenant_id,
|
|
393
|
-
certificate_path=certificate_path,
|
|
394
|
-
password=password.encode("utf-8") if password else None,
|
|
395
|
-
send_certificate_chain=send_certificate_chain,
|
|
396
|
-
authority=authority_host,
|
|
397
|
-
disable_instance_discovery=disable_instance_discovery,
|
|
398
|
-
)
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
@dataclass
|
|
402
|
-
class AzureOAuthDefaultCredentialsConfig:
|
|
403
|
-
"""Azure OAuth default credentials configuration.
|
|
404
|
-
|
|
405
|
-
Attributes:
|
|
406
|
-
authority_host: The authority host.
|
|
407
|
-
"""
|
|
408
|
-
|
|
409
|
-
authority_host: Optional[str] = None
|
|
410
|
-
|
|
411
|
-
@classmethod
|
|
412
|
-
def from_config(cls, config: Dict[str, Any]) -> AzureOAuthDefaultCredentialsConfig:
|
|
413
|
-
"""Initializes a dataclass from the passed config.
|
|
414
|
-
|
|
415
|
-
Args:
|
|
416
|
-
config: (dict) The config from which to initialize.
|
|
417
|
-
|
|
418
|
-
Returns:
|
|
419
|
-
AzureOAuthDefaultCredentialsConfig
|
|
420
|
-
"""
|
|
421
|
-
return cls(authority_host=config.pop(AZURE_AUTHORITY_FIELD, None))
|
|
422
|
-
|
|
423
|
-
def to_dict(self) -> dict:
|
|
424
|
-
"""Converts the config instance into a dictionary."""
|
|
425
|
-
result = asdict(self)
|
|
426
|
-
result[OAUTH_TYPE_FIELD] = AzureOAuthType.AZURE_DEFAULT.value
|
|
427
|
-
return result
|
|
428
|
-
|
|
429
|
-
def create_azure_credential(self) -> TokenProvider:
|
|
430
|
-
return create_default_credentials(authority_host=self.authority_host)
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
@lru_cache
|
|
434
|
-
def create_default_credentials(
|
|
435
|
-
authority_host: Optional[str] = None,
|
|
436
|
-
) -> DefaultAzureCredential:
|
|
437
|
-
"""Create a DefaultAzureCredential.
|
|
438
|
-
|
|
439
|
-
We cache the result of this function to avoid creating multiple instances
|
|
440
|
-
of the same credential. This makes it possible to utilise the token caching
|
|
441
|
-
functionality of the azure-identity library.
|
|
442
|
-
|
|
443
|
-
Args:
|
|
444
|
-
authority_host: The authority host.
|
|
445
|
-
|
|
446
|
-
Returns:
|
|
447
|
-
DefaultAzureCredential
|
|
448
|
-
"""
|
|
449
|
-
return DefaultAzureCredential(authority=authority_host)
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
@dataclass
|
|
453
|
-
class AzureOAuthConfig:
|
|
454
|
-
scopes: List[str]
|
|
455
|
-
azure_credentials: Optional[AzureEntraIDCredential] = None
|
|
456
|
-
|
|
457
|
-
@classmethod
|
|
458
|
-
def from_config(cls, oauth_config: Dict[str, Any]) -> AzureOAuthConfig:
|
|
459
|
-
"""Initializes a dataclass from the passed config.
|
|
460
|
-
|
|
461
|
-
Args:
|
|
462
|
-
oauth_config: (dict) The config from which to initialize.
|
|
463
|
-
|
|
464
|
-
Returns:
|
|
465
|
-
AzureOAuthConfig
|
|
466
|
-
"""
|
|
467
|
-
oauth_type = AzureOAuthType.from_string(
|
|
468
|
-
oauth_config.pop(OAUTH_TYPE_FIELD, None)
|
|
469
|
-
)
|
|
470
|
-
|
|
471
|
-
if oauth_type == AzureOAuthType.INVALID:
|
|
472
|
-
message = (
|
|
473
|
-
"Azure Entra ID oauth configuration must contain "
|
|
474
|
-
f"'{OAUTH_TYPE_FIELD}' field and it must be set to one of the "
|
|
475
|
-
f"following values: {AzureOAuthType.valid_string_values()}, "
|
|
476
|
-
)
|
|
477
|
-
structlogger.error(
|
|
478
|
-
"azure_oauth_config.missing_oauth_type",
|
|
479
|
-
message=message,
|
|
480
|
-
)
|
|
481
|
-
raise ValueError(message)
|
|
482
|
-
|
|
483
|
-
azure_credentials = None
|
|
484
|
-
if oauth_type == AzureOAuthType.AZURE_CLIENT_SECRET:
|
|
485
|
-
azure_credentials = AzureClientCredentialsConfig.from_config(oauth_config)
|
|
486
|
-
elif oauth_type == AzureOAuthType.AZURE_CLIENT_CERTIFICATE:
|
|
487
|
-
azure_credentials = AzureClientCertificateConfig.from_config(oauth_config)
|
|
488
|
-
elif oauth_type == AzureOAuthType.AZURE_DEFAULT:
|
|
489
|
-
azure_credentials = AzureOAuthDefaultCredentialsConfig.from_config(
|
|
490
|
-
oauth_config
|
|
491
|
-
)
|
|
492
|
-
|
|
493
|
-
scopes = oauth_config.pop(AZURE_SCOPES_FIELD, "")
|
|
494
|
-
|
|
495
|
-
if not scopes:
|
|
496
|
-
message = "Azure Entra ID scopes cannot be empty."
|
|
497
|
-
structlogger.error(
|
|
498
|
-
"azure_oauth_config.scopes_empty",
|
|
499
|
-
message=message,
|
|
500
|
-
)
|
|
501
|
-
raise ValueError(message)
|
|
502
|
-
|
|
503
|
-
if isinstance(scopes, str):
|
|
504
|
-
scopes = [scopes]
|
|
505
|
-
|
|
506
|
-
return cls(azure_credentials=azure_credentials, scopes=scopes)
|
|
507
|
-
|
|
508
|
-
def create_azure_credential(
|
|
509
|
-
self,
|
|
510
|
-
) -> TokenProvider:
|
|
511
|
-
return self.azure_credentials.create_azure_credential()
|
|
512
|
-
|
|
513
|
-
def to_dict(self) -> dict:
|
|
514
|
-
"""Converts the config instance into a dictionary."""
|
|
515
|
-
credentials_dict = (
|
|
516
|
-
self.azure_credentials.to_dict() if self.azure_credentials else {}
|
|
517
|
-
)
|
|
518
|
-
result = asdict(self)
|
|
519
|
-
result.update(credentials_dict)
|
|
520
|
-
result.pop("azure_credentials", None)
|
|
521
|
-
return result
|
|
522
|
-
|
|
523
|
-
def get_bearer_token_provider(self) -> BearerTokenProvider:
|
|
524
|
-
return get_bearer_token_provider(self.create_azure_credential(), *self.scopes)
|
|
525
|
-
|
|
526
|
-
def get_bearer_token(self) -> str:
|
|
527
|
-
token = self.create_azure_credential().get_token(*self.scopes).token
|
|
528
|
-
return token
|
|
529
|
-
|
|
530
|
-
|
|
531
64
|
@dataclass
|
|
532
65
|
class AzureOpenAIClientConfig:
|
|
533
66
|
"""Parses configuration for Azure OpenAI client, resolves aliases and
|
|
@@ -547,13 +80,11 @@ class AzureOpenAIClientConfig:
|
|
|
547
80
|
# API Type is not used by LiteLLM backend, but we define
|
|
548
81
|
# it here for backward compatibility.
|
|
549
82
|
api_type: Optional[str] = AZURE_API_TYPE
|
|
83
|
+
|
|
550
84
|
# Provider is not used by LiteLLM backend, but we define it here since it's
|
|
551
85
|
# used as switch between different clients.
|
|
552
86
|
provider: str = AZURE_OPENAI_PROVIDER
|
|
553
87
|
|
|
554
|
-
# OAuth related parameters
|
|
555
|
-
oauth: Optional[AzureOAuthConfig] = None
|
|
556
|
-
|
|
557
88
|
extra_parameters: dict = field(default_factory=dict)
|
|
558
89
|
|
|
559
90
|
def __post_init__(self) -> None:
|
|
@@ -575,7 +106,7 @@ class AzureOpenAIClientConfig:
|
|
|
575
106
|
raise ValueError(message)
|
|
576
107
|
|
|
577
108
|
@classmethod
|
|
578
|
-
def from_dict(cls, config: dict) -> AzureOpenAIClientConfig:
|
|
109
|
+
def from_dict(cls, config: dict) -> "AzureOpenAIClientConfig":
|
|
579
110
|
"""Initializes a dataclass from the passed config.
|
|
580
111
|
|
|
581
112
|
Args:
|
|
@@ -598,26 +129,6 @@ class AzureOpenAIClientConfig:
|
|
|
598
129
|
# Validate that the forbidden keys are not present
|
|
599
130
|
validate_forbidden_keys(config, FORBIDDEN_KEYS)
|
|
600
131
|
# Init client config
|
|
601
|
-
|
|
602
|
-
has_api_key = config.get(API_KEY, None) is not None
|
|
603
|
-
has_oauth_key = config.get(AZURE_OAUTH_KEY, None) is not None
|
|
604
|
-
|
|
605
|
-
if has_api_key and has_oauth_key:
|
|
606
|
-
message = (
|
|
607
|
-
"Azure OpenAI client configuration cannot contain "
|
|
608
|
-
"both 'api_key' and 'oauth' fields. Please provide either "
|
|
609
|
-
"'api_key' or 'oauth' fields."
|
|
610
|
-
)
|
|
611
|
-
structlogger.error(
|
|
612
|
-
"azure_openai_client_config.multiple_auth_types_specified",
|
|
613
|
-
message=message,
|
|
614
|
-
)
|
|
615
|
-
raise ValueError(message)
|
|
616
|
-
|
|
617
|
-
oauth = None
|
|
618
|
-
if has_oauth_key:
|
|
619
|
-
oauth = AzureOAuthConfig.from_config(config.pop(AZURE_OAUTH_KEY))
|
|
620
|
-
|
|
621
132
|
this = AzureOpenAIClientConfig(
|
|
622
133
|
# Required parameters
|
|
623
134
|
deployment=config.pop(DEPLOYMENT_CONFIG_KEY),
|
|
@@ -631,8 +142,6 @@ class AzureOpenAIClientConfig:
|
|
|
631
142
|
# in clients.
|
|
632
143
|
api_base=config.pop(API_BASE_CONFIG_KEY, None),
|
|
633
144
|
api_version=config.pop(API_VERSION_CONFIG_KEY, None),
|
|
634
|
-
# OAuth related parameters, set only if auth_type is set to 'entra_id'
|
|
635
|
-
oauth=oauth,
|
|
636
145
|
# The rest of parameters (e.g. model parameters) are considered
|
|
637
146
|
# as extra parameters (this also includes timeout).
|
|
638
147
|
extra_parameters=config,
|
|
@@ -645,9 +154,6 @@ class AzureOpenAIClientConfig:
|
|
|
645
154
|
# Extra parameters should also be on the top level
|
|
646
155
|
d.pop("extra_parameters", None)
|
|
647
156
|
d.update(self.extra_parameters)
|
|
648
|
-
|
|
649
|
-
d.pop("oauth", None)
|
|
650
|
-
d.update({"oauth": self.oauth.to_dict()} if self.oauth else {})
|
|
651
157
|
return d
|
|
652
158
|
|
|
653
159
|
@staticmethod
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
from typing import Protocol, runtime_checkable
|
|
4
2
|
|
|
5
3
|
|
|
@@ -11,7 +9,7 @@ class ClientConfig(Protocol):
|
|
|
11
9
|
"""
|
|
12
10
|
|
|
13
11
|
@classmethod
|
|
14
|
-
def from_dict(cls, config: dict) -> ClientConfig:
|
|
12
|
+
def from_dict(cls, config: dict) -> "ClientConfig":
|
|
15
13
|
"""
|
|
16
14
|
Initializes the client config with the given configuration.
|
|
17
15
|
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
from dataclasses import asdict, dataclass, field
|
|
4
2
|
from typing import Any, Dict
|
|
5
3
|
|
|
@@ -71,7 +69,7 @@ class DefaultLiteLLMClientConfig:
|
|
|
71
69
|
raise ValueError(message)
|
|
72
70
|
|
|
73
71
|
@classmethod
|
|
74
|
-
def from_dict(cls, config: dict) -> DefaultLiteLLMClientConfig:
|
|
72
|
+
def from_dict(cls, config: dict) -> "DefaultLiteLLMClientConfig":
|
|
75
73
|
"""
|
|
76
74
|
Initializes a dataclass from the passed config.
|
|
77
75
|
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
from dataclasses import asdict, dataclass, field
|
|
4
2
|
from typing import Any, Dict, Optional
|
|
5
3
|
|
|
@@ -92,7 +90,7 @@ class HuggingFaceLocalEmbeddingClientConfig:
|
|
|
92
90
|
raise ValueError(message)
|
|
93
91
|
|
|
94
92
|
@classmethod
|
|
95
|
-
def from_dict(cls, config: dict) -> HuggingFaceLocalEmbeddingClientConfig:
|
|
93
|
+
def from_dict(cls, config: dict) -> "HuggingFaceLocalEmbeddingClientConfig":
|
|
96
94
|
"""
|
|
97
95
|
Initializes a dataclass from the passed config.
|
|
98
96
|
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
import copy
|
|
4
2
|
from dataclasses import dataclass, field
|
|
5
3
|
from typing import Any, Dict, List
|
|
@@ -122,7 +120,7 @@ class LiteLLMRouterClientConfig:
|
|
|
122
120
|
raise ValueError(message)
|
|
123
121
|
|
|
124
122
|
@classmethod
|
|
125
|
-
def from_dict(cls, config: dict) -> LiteLLMRouterClientConfig:
|
|
123
|
+
def from_dict(cls, config: dict) -> "LiteLLMRouterClientConfig":
|
|
126
124
|
"""Initializes a dataclass from the passed config.
|
|
127
125
|
|
|
128
126
|
Args:
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
from dataclasses import asdict, dataclass, field
|
|
4
2
|
from typing import List, Optional
|
|
5
3
|
|
|
@@ -18,9 +16,6 @@ from rasa.shared.constants import (
|
|
|
18
16
|
MODELS_CONFIG_KEY,
|
|
19
17
|
PROVIDER_CONFIG_KEY,
|
|
20
18
|
)
|
|
21
|
-
from rasa.shared.providers._configs._lite_llm_config.lite_llm_config_adapter import (
|
|
22
|
-
to_lite_llm_config,
|
|
23
|
-
)
|
|
24
19
|
from rasa.shared.providers.mappings import get_client_config_class_from_provider
|
|
25
20
|
|
|
26
21
|
structlogger = structlog.get_logger()
|
|
@@ -46,7 +41,7 @@ class ModelConfig:
|
|
|
46
41
|
api_type: Optional[str] = None
|
|
47
42
|
|
|
48
43
|
@classmethod
|
|
49
|
-
def from_dict(cls, config: dict) -> ModelConfig:
|
|
44
|
+
def from_dict(cls, config: dict) -> "ModelConfig":
|
|
50
45
|
"""Initializes a dataclass from the passed config. The provider config param is
|
|
51
46
|
used to determine the client config class to use. The client config class takes
|
|
52
47
|
care of resolving config aliases and throwing deprecation warnings.
|
|
@@ -136,7 +131,7 @@ class ModelGroupConfig:
|
|
|
136
131
|
raise ValueError(message)
|
|
137
132
|
|
|
138
133
|
@classmethod
|
|
139
|
-
def from_dict(cls, config: dict) -> ModelGroupConfig:
|
|
134
|
+
def from_dict(cls, config: dict) -> "ModelGroupConfig":
|
|
140
135
|
"""Initializes a dataclass from the passed config.
|
|
141
136
|
|
|
142
137
|
Args:
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
from dataclasses import asdict, dataclass, field
|
|
4
2
|
from typing import Any, Dict, Optional
|
|
5
3
|
|
|
@@ -113,7 +111,7 @@ class OpenAIClientConfig:
|
|
|
113
111
|
raise ValueError(message)
|
|
114
112
|
|
|
115
113
|
@classmethod
|
|
116
|
-
def from_dict(cls, config: dict) -> OpenAIClientConfig:
|
|
114
|
+
def from_dict(cls, config: dict) -> "OpenAIClientConfig":
|
|
117
115
|
"""
|
|
118
116
|
Initializes a dataclass from the passed config.
|
|
119
117
|
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
from dataclasses import asdict, dataclass, field
|
|
4
2
|
from typing import Optional
|
|
5
3
|
|
|
@@ -39,7 +37,7 @@ class RasaLLMClientConfig:
|
|
|
39
37
|
extra_parameters: dict = field(default_factory=dict)
|
|
40
38
|
|
|
41
39
|
@classmethod
|
|
42
|
-
def from_dict(cls, config: dict) -> RasaLLMClientConfig:
|
|
40
|
+
def from_dict(cls, config: dict) -> "RasaLLMClientConfig":
|
|
43
41
|
"""
|
|
44
42
|
Initializes a dataclass from the passed config.
|
|
45
43
|
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
from dataclasses import asdict, dataclass, field
|
|
4
2
|
from typing import Any, Dict, Optional
|
|
5
3
|
|
|
@@ -115,7 +113,7 @@ class SelfHostedLLMClientConfig:
|
|
|
115
113
|
raise ValueError(message)
|
|
116
114
|
|
|
117
115
|
@classmethod
|
|
118
|
-
def from_dict(cls, config: dict) -> SelfHostedLLMClientConfig:
|
|
116
|
+
def from_dict(cls, config: dict) -> "SelfHostedLLMClientConfig":
|
|
119
117
|
"""
|
|
120
118
|
Initializes a dataclass from the passed config.
|
|
121
119
|
|