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
|
@@ -3,16 +3,15 @@ from typing import Optional, Union
|
|
|
3
3
|
|
|
4
4
|
import httpx
|
|
5
5
|
import litellm
|
|
6
|
+
import structlog
|
|
7
|
+
|
|
6
8
|
from rasa.shared.constants import (
|
|
9
|
+
LITELLM_SSL_CERTIFICATE_ENV_VAR,
|
|
10
|
+
LITELLM_SSL_VERIFY_ENV_VAR,
|
|
7
11
|
RASA_CA_BUNDLE_ENV_VAR,
|
|
8
|
-
REQUESTS_CA_BUNDLE_ENV_VAR,
|
|
9
12
|
RASA_SSL_CERTIFICATE_ENV_VAR,
|
|
10
|
-
|
|
11
|
-
LITELLM_SSL_CERTIFICATE_ENV_VAR,
|
|
13
|
+
REQUESTS_CA_BUNDLE_ENV_VAR,
|
|
12
14
|
)
|
|
13
|
-
|
|
14
|
-
import structlog
|
|
15
|
-
|
|
16
15
|
from rasa.shared.utils.io import raise_deprecation_warning
|
|
17
16
|
|
|
18
17
|
structlogger = structlog.get_logger()
|
rasa/shared/providers/_utils.py
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import structlog
|
|
2
|
+
from litellm import validate_environment
|
|
2
3
|
|
|
3
4
|
from rasa.shared.constants import (
|
|
4
|
-
AWS_ACCESS_KEY_ID_ENV_VAR,
|
|
5
5
|
AWS_ACCESS_KEY_ID_CONFIG_KEY,
|
|
6
|
-
|
|
7
|
-
AWS_SECRET_ACCESS_KEY_CONFIG_KEY,
|
|
8
|
-
AWS_REGION_NAME_ENV_VAR,
|
|
6
|
+
AWS_ACCESS_KEY_ID_ENV_VAR,
|
|
9
7
|
AWS_REGION_NAME_CONFIG_KEY,
|
|
8
|
+
AWS_REGION_NAME_ENV_VAR,
|
|
9
|
+
AWS_SECRET_ACCESS_KEY_CONFIG_KEY,
|
|
10
|
+
AWS_SECRET_ACCESS_KEY_ENV_VAR,
|
|
10
11
|
AWS_SESSION_TOKEN_CONFIG_KEY,
|
|
11
12
|
AWS_SESSION_TOKEN_ENV_VAR,
|
|
12
13
|
)
|
|
13
14
|
from rasa.shared.exceptions import ProviderClientValidationError
|
|
14
|
-
from litellm import validate_environment
|
|
15
15
|
from rasa.shared.providers.embedding._base_litellm_embedding_client import (
|
|
16
16
|
_VALIDATE_ENVIRONMENT_MISSING_KEYS_KEY,
|
|
17
17
|
)
|
|
@@ -19,7 +19,7 @@ from rasa.shared.providers.embedding.embedding_response import (
|
|
|
19
19
|
EmbeddingResponse,
|
|
20
20
|
EmbeddingUsage,
|
|
21
21
|
)
|
|
22
|
-
from rasa.shared.utils.io import
|
|
22
|
+
from rasa.shared.utils.io import resolve_environment_variables, suppress_logs
|
|
23
23
|
|
|
24
24
|
structlogger = structlog.get_logger()
|
|
25
25
|
|
|
@@ -19,15 +19,8 @@ from rasa.shared.constants import (
|
|
|
19
19
|
)
|
|
20
20
|
from rasa.shared.exceptions import ProviderClientValidationError
|
|
21
21
|
from rasa.shared.providers._configs.azure_openai_client_config import (
|
|
22
|
-
AzureOAuthConfig,
|
|
23
22
|
AzureOpenAIClientConfig,
|
|
24
23
|
)
|
|
25
|
-
from rasa.shared.providers.constants import (
|
|
26
|
-
DEFAULT_AZURE_API_KEY_NAME,
|
|
27
|
-
LITE_LLM_API_KEY_FIELD,
|
|
28
|
-
LITE_LLM_AZURE_AD_TOKEN,
|
|
29
|
-
LITE_LLM_AZURE_AD_TOKEN_PROVIDER,
|
|
30
|
-
)
|
|
31
24
|
from rasa.shared.providers.embedding._base_litellm_embedding_client import (
|
|
32
25
|
_BaseLiteLLMEmbeddingClient,
|
|
33
26
|
)
|
|
@@ -48,8 +41,6 @@ class AzureOpenAIEmbeddingClient(_BaseLiteLLMEmbeddingClient):
|
|
|
48
41
|
If not provided, it will be set via environment variable.
|
|
49
42
|
api_version (Optional[str]): The version of the API to use.
|
|
50
43
|
If not provided, it will be set via environment variable.
|
|
51
|
-
oauth (Optional[AzureOAuthConfig]): Optional OAuth configuration. If provided,
|
|
52
|
-
the client will use OAuth for authentication.
|
|
53
44
|
kwargs (Optional[Dict[str, Any]]): Optional configuration parameters specific
|
|
54
45
|
to the embedding model deployment.
|
|
55
46
|
|
|
@@ -66,7 +57,6 @@ class AzureOpenAIEmbeddingClient(_BaseLiteLLMEmbeddingClient):
|
|
|
66
57
|
api_base: Optional[str] = None,
|
|
67
58
|
api_type: Optional[str] = None,
|
|
68
59
|
api_version: Optional[str] = None,
|
|
69
|
-
oauth: Optional[AzureOAuthConfig] = None,
|
|
70
60
|
**kwargs: Any,
|
|
71
61
|
):
|
|
72
62
|
super().__init__() # type: ignore
|
|
@@ -94,11 +84,7 @@ class AzureOpenAIEmbeddingClient(_BaseLiteLLMEmbeddingClient):
|
|
|
94
84
|
# Litellm does not support use of OPENAI_API_KEY, so we need to map it
|
|
95
85
|
# because of backward compatibility. However, we're first looking at
|
|
96
86
|
# AZURE_API_KEY.
|
|
97
|
-
|
|
98
|
-
self._oauth = oauth
|
|
99
|
-
self._api_key_env_var = (
|
|
100
|
-
self._resolve_api_key_env_var() if not self._oauth else None
|
|
101
|
-
)
|
|
87
|
+
self._api_key_env_var = self._resolve_api_key_env_var()
|
|
102
88
|
|
|
103
89
|
self.validate_client_setup()
|
|
104
90
|
|
|
@@ -114,7 +100,7 @@ class AzureOpenAIEmbeddingClient(_BaseLiteLLMEmbeddingClient):
|
|
|
114
100
|
return self._extra_parameters[API_KEY]
|
|
115
101
|
|
|
116
102
|
if os.getenv(AZURE_API_KEY_ENV_VAR) is not None:
|
|
117
|
-
return
|
|
103
|
+
return "${AZURE_API_KEY}"
|
|
118
104
|
|
|
119
105
|
if os.getenv(OPENAI_API_KEY_ENV_VAR) is not None:
|
|
120
106
|
# API key can be set through OPENAI_API_KEY too,
|
|
@@ -177,7 +163,6 @@ class AzureOpenAIEmbeddingClient(_BaseLiteLLMEmbeddingClient):
|
|
|
177
163
|
api_base=azure_openai_config.api_base,
|
|
178
164
|
api_type=azure_openai_config.api_type,
|
|
179
165
|
api_version=azure_openai_config.api_version,
|
|
180
|
-
oauth=azure_openai_config.oauth,
|
|
181
166
|
**azure_openai_config.extra_parameters,
|
|
182
167
|
)
|
|
183
168
|
|
|
@@ -192,7 +177,6 @@ class AzureOpenAIEmbeddingClient(_BaseLiteLLMEmbeddingClient):
|
|
|
192
177
|
api_base=self.api_base,
|
|
193
178
|
api_type=self.api_type,
|
|
194
179
|
api_version=self.api_version,
|
|
195
|
-
oauth=self._oauth,
|
|
196
180
|
extra_parameters=self._extra_parameters,
|
|
197
181
|
)
|
|
198
182
|
return config.to_dict()
|
|
@@ -235,22 +219,13 @@ class AzureOpenAIEmbeddingClient(_BaseLiteLLMEmbeddingClient):
|
|
|
235
219
|
|
|
236
220
|
@property
|
|
237
221
|
def _embedding_fn_args(self) -> dict:
|
|
238
|
-
auth_parameter = (
|
|
239
|
-
{
|
|
240
|
-
LITE_LLM_AZURE_AD_TOKEN: self._oauth.get_bearer_token(),
|
|
241
|
-
LITE_LLM_AZURE_AD_TOKEN_PROVIDER: self._oauth.get_bearer_token_provider(), # noqa: E501
|
|
242
|
-
}
|
|
243
|
-
if self._oauth
|
|
244
|
-
else {LITE_LLM_API_KEY_FIELD: self._api_key_env_var}
|
|
245
|
-
)
|
|
246
|
-
|
|
247
222
|
return {
|
|
248
223
|
**self._litellm_extra_parameters,
|
|
249
224
|
"model": self._litellm_model_name,
|
|
250
225
|
"api_base": self.api_base,
|
|
251
226
|
"api_type": self.api_type,
|
|
252
227
|
"api_version": self.api_version,
|
|
253
|
-
|
|
228
|
+
"api_key": self._api_key_env_var,
|
|
254
229
|
}
|
|
255
230
|
|
|
256
231
|
@property
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
import logging
|
|
4
2
|
from typing import Any, Dict, List
|
|
5
3
|
|
|
@@ -48,7 +46,7 @@ class LiteLLMRouterEmbeddingClient(
|
|
|
48
46
|
)
|
|
49
47
|
|
|
50
48
|
@classmethod
|
|
51
|
-
def from_config(cls, config: Dict[str, Any]) -> LiteLLMRouterEmbeddingClient:
|
|
49
|
+
def from_config(cls, config: Dict[str, Any]) -> "LiteLLMRouterEmbeddingClient":
|
|
52
50
|
"""Instantiates a LiteLLM Router Embedding client from a configuration dict.
|
|
53
51
|
|
|
54
52
|
Args:
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
import logging
|
|
4
2
|
from abc import abstractmethod
|
|
5
3
|
from typing import Any, Dict, List, Union
|
|
@@ -52,7 +50,7 @@ class _BaseLiteLLMClient:
|
|
|
52
50
|
|
|
53
51
|
@classmethod
|
|
54
52
|
@abstractmethod
|
|
55
|
-
def from_config(cls, config: Dict[str, Any]) -> _BaseLiteLLMClient:
|
|
53
|
+
def from_config(cls, config: Dict[str, Any]) -> "_BaseLiteLLMClient":
|
|
56
54
|
pass
|
|
57
55
|
|
|
58
56
|
@property
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
import os
|
|
4
2
|
import re
|
|
5
3
|
from typing import Any, Dict, Optional
|
|
@@ -23,39 +21,13 @@ from rasa.shared.constants import (
|
|
|
23
21
|
)
|
|
24
22
|
from rasa.shared.exceptions import ProviderClientValidationError
|
|
25
23
|
from rasa.shared.providers._configs.azure_openai_client_config import (
|
|
26
|
-
AzureOAuthConfig,
|
|
27
24
|
AzureOpenAIClientConfig,
|
|
28
25
|
)
|
|
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
26
|
from rasa.shared.providers.llm._base_litellm_client import _BaseLiteLLMClient
|
|
38
27
|
from rasa.shared.utils.io import raise_deprecation_warning
|
|
39
28
|
|
|
40
29
|
structlogger = structlog.get_logger()
|
|
41
30
|
|
|
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
31
|
|
|
60
32
|
class AzureOpenAILLMClient(_BaseLiteLLMClient):
|
|
61
33
|
"""A client for interfacing with Azure's OpenAI LLM deployments.
|
|
@@ -69,7 +41,6 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
|
|
|
69
41
|
it will be set via environment variables.
|
|
70
42
|
api_version (Optional[str]): The version of the API to use. If not provided,
|
|
71
43
|
it will be set via environment variable.
|
|
72
|
-
|
|
73
44
|
kwargs (Optional[Dict[str, Any]]): Optional configuration parameters specific
|
|
74
45
|
to the model deployment.
|
|
75
46
|
|
|
@@ -86,7 +57,6 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
|
|
|
86
57
|
api_type: Optional[str] = None,
|
|
87
58
|
api_base: Optional[str] = None,
|
|
88
59
|
api_version: Optional[str] = None,
|
|
89
|
-
oauth: Optional[AzureOAuthConfig] = None,
|
|
90
60
|
**kwargs: Any,
|
|
91
61
|
):
|
|
92
62
|
super().__init__() # type: ignore
|
|
@@ -110,6 +80,8 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
|
|
|
110
80
|
or os.getenv(OPENAI_API_VERSION_ENV_VAR)
|
|
111
81
|
)
|
|
112
82
|
|
|
83
|
+
self._api_key_env_var = self._resolve_api_key_env_var()
|
|
84
|
+
|
|
113
85
|
# Not used by LiteLLM, here for backward compatibility
|
|
114
86
|
self._api_type = (
|
|
115
87
|
api_type
|
|
@@ -117,19 +89,6 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
|
|
|
117
89
|
or os.getenv(OPENAI_API_TYPE_ENV_VAR)
|
|
118
90
|
)
|
|
119
91
|
|
|
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
92
|
# Run helper function to check and raise deprecation warning if
|
|
134
93
|
# deprecated environment variables were used for initialization of the
|
|
135
94
|
# client settings
|
|
@@ -198,7 +157,7 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
|
|
|
198
157
|
return self._extra_parameters[API_KEY]
|
|
199
158
|
|
|
200
159
|
if os.getenv(AZURE_API_KEY_ENV_VAR) is not None:
|
|
201
|
-
return
|
|
160
|
+
return "${AZURE_API_KEY}"
|
|
202
161
|
|
|
203
162
|
if os.getenv(OPENAI_API_KEY_ENV_VAR) is not None:
|
|
204
163
|
# API key can be set through OPENAI_API_KEY too,
|
|
@@ -229,7 +188,7 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
|
|
|
229
188
|
)
|
|
230
189
|
|
|
231
190
|
@classmethod
|
|
232
|
-
def from_config(cls, config: Dict[str, Any]) -> AzureOpenAILLMClient:
|
|
191
|
+
def from_config(cls, config: Dict[str, Any]) -> "AzureOpenAILLMClient":
|
|
233
192
|
"""Initializes the client from given configuration.
|
|
234
193
|
|
|
235
194
|
Args:
|
|
@@ -256,12 +215,11 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
|
|
|
256
215
|
raise
|
|
257
216
|
|
|
258
217
|
return cls(
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
oauth=azure_openai_config.oauth,
|
|
218
|
+
azure_openai_config.deployment,
|
|
219
|
+
azure_openai_config.model,
|
|
220
|
+
azure_openai_config.api_type,
|
|
221
|
+
azure_openai_config.api_base,
|
|
222
|
+
azure_openai_config.api_version,
|
|
265
223
|
**azure_openai_config.extra_parameters,
|
|
266
224
|
)
|
|
267
225
|
|
|
@@ -276,7 +234,6 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
|
|
|
276
234
|
api_base=self._api_base,
|
|
277
235
|
api_version=self._api_version,
|
|
278
236
|
api_type=self._api_type,
|
|
279
|
-
oauth=self._oauth,
|
|
280
237
|
extra_parameters=self._extra_parameters,
|
|
281
238
|
)
|
|
282
239
|
return config.to_dict()
|
|
@@ -325,22 +282,12 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
|
|
|
325
282
|
"""Returns the completion arguments for invoking a call through
|
|
326
283
|
LiteLLM's completion functions.
|
|
327
284
|
"""
|
|
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
285
|
fn_args = super()._completion_fn_args
|
|
339
286
|
fn_args.update(
|
|
340
287
|
{
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
288
|
+
"api_base": self.api_base,
|
|
289
|
+
"api_version": self.api_version,
|
|
290
|
+
"api_key": self._api_key_env_var,
|
|
344
291
|
}
|
|
345
292
|
)
|
|
346
293
|
return fn_args
|
|
@@ -367,44 +314,41 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
|
|
|
367
314
|
|
|
368
315
|
return info.format(setting=setting, options=options)
|
|
369
316
|
|
|
370
|
-
env_var_field = "env_var"
|
|
371
|
-
config_key_field = "config_key"
|
|
372
|
-
current_value_field = "current_value"
|
|
373
317
|
# All required settings for Azure OpenAI client
|
|
374
318
|
settings: Dict[str, Dict[str, Any]] = {
|
|
375
319
|
"API Base": {
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
320
|
+
"current_value": self.api_base,
|
|
321
|
+
"env_var": AZURE_API_BASE_ENV_VAR,
|
|
322
|
+
"config_key": API_BASE_CONFIG_KEY,
|
|
379
323
|
},
|
|
380
324
|
"API Version": {
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
325
|
+
"current_value": self.api_version,
|
|
326
|
+
"env_var": AZURE_API_VERSION_ENV_VAR,
|
|
327
|
+
"config_key": API_VERSION_CONFIG_KEY,
|
|
384
328
|
},
|
|
385
329
|
"Deployment Name": {
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
330
|
+
"current_value": self.deployment,
|
|
331
|
+
"env_var": None,
|
|
332
|
+
"config_key": DEPLOYMENT_CONFIG_KEY,
|
|
389
333
|
},
|
|
390
334
|
}
|
|
391
335
|
|
|
392
336
|
missing_settings = [
|
|
393
337
|
setting_name
|
|
394
338
|
for setting_name, setting_info in settings.items()
|
|
395
|
-
if setting_info[
|
|
339
|
+
if setting_info["current_value"] is None
|
|
396
340
|
]
|
|
397
341
|
|
|
398
342
|
if missing_settings:
|
|
399
343
|
event_info = f"Client settings not set: " f"{', '.join(missing_settings)}. "
|
|
400
344
|
|
|
401
345
|
for missing_setting in missing_settings:
|
|
402
|
-
if settings[missing_setting][
|
|
346
|
+
if settings[missing_setting]["current_value"] is not None:
|
|
403
347
|
continue
|
|
404
348
|
event_info += generate_event_info_for_missing_setting(
|
|
405
349
|
missing_setting,
|
|
406
|
-
settings[missing_setting][
|
|
407
|
-
settings[missing_setting][
|
|
350
|
+
settings[missing_setting]["env_var"],
|
|
351
|
+
settings[missing_setting]["config_key"],
|
|
408
352
|
)
|
|
409
353
|
|
|
410
354
|
structlogger.error(
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
from typing import Any, Dict
|
|
4
2
|
|
|
5
3
|
from rasa.shared.constants import (
|
|
@@ -37,7 +35,7 @@ class DefaultLiteLLMClient(_BaseLiteLLMClient):
|
|
|
37
35
|
self.validate_client_setup()
|
|
38
36
|
|
|
39
37
|
@classmethod
|
|
40
|
-
def from_config(cls, config: Dict[str, Any]) -> DefaultLiteLLMClient:
|
|
38
|
+
def from_config(cls, config: Dict[str, Any]) -> "DefaultLiteLLMClient":
|
|
41
39
|
default_config = DefaultLiteLLMClientConfig.from_dict(config)
|
|
42
40
|
return cls(
|
|
43
41
|
model=default_config.model,
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
import logging
|
|
4
2
|
from typing import Any, Dict, List, Union
|
|
5
3
|
|
|
@@ -9,7 +7,6 @@ from rasa.shared.exceptions import ProviderClientAPIException
|
|
|
9
7
|
from rasa.shared.providers._configs.litellm_router_client_config import (
|
|
10
8
|
LiteLLMRouterClientConfig,
|
|
11
9
|
)
|
|
12
|
-
from rasa.shared.providers.constants import LITE_LLM_MODEL_FIELD
|
|
13
10
|
from rasa.shared.providers.llm._base_litellm_client import _BaseLiteLLMClient
|
|
14
11
|
from rasa.shared.providers.llm.llm_response import LLMResponse
|
|
15
12
|
from rasa.shared.providers.router._base_litellm_router_client import (
|
|
@@ -45,7 +42,7 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
|
|
|
45
42
|
)
|
|
46
43
|
|
|
47
44
|
@classmethod
|
|
48
|
-
def from_config(cls, config: Dict[str, Any]) -> LiteLLMRouterLLMClient:
|
|
45
|
+
def from_config(cls, config: Dict[str, Any]) -> "LiteLLMRouterLLMClient":
|
|
49
46
|
"""Instantiates a LiteLLM Router LLM client from a configuration dict.
|
|
50
47
|
|
|
51
48
|
Args:
|
|
@@ -90,10 +87,6 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
|
|
|
90
87
|
ProviderClientAPIException: If the API request fails.
|
|
91
88
|
"""
|
|
92
89
|
try:
|
|
93
|
-
structlogger.info(
|
|
94
|
-
"litellm_router_llm_client.text_completion",
|
|
95
|
-
_completion_fn_args=self._completion_fn_args,
|
|
96
|
-
)
|
|
97
90
|
response = self.router_client.text_completion(
|
|
98
91
|
prompt=prompt, **self._completion_fn_args
|
|
99
92
|
)
|
|
@@ -114,10 +107,6 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
|
|
|
114
107
|
ProviderClientAPIException: If the API request fails.
|
|
115
108
|
"""
|
|
116
109
|
try:
|
|
117
|
-
structlogger.info(
|
|
118
|
-
"litellm_router_llm_client.atext_completion",
|
|
119
|
-
_completion_fn_args=self._completion_fn_args,
|
|
120
|
-
)
|
|
121
110
|
response = await self.router_client.atext_completion(
|
|
122
111
|
prompt=prompt, **self._completion_fn_args
|
|
123
112
|
)
|
|
@@ -147,10 +136,6 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
|
|
|
147
136
|
return self._text_completion(messages)
|
|
148
137
|
try:
|
|
149
138
|
formatted_messages = self._format_messages(messages)
|
|
150
|
-
structlogger.info(
|
|
151
|
-
"litellm_router_llm_client.completion",
|
|
152
|
-
_completion_fn_args=self._completion_fn_args,
|
|
153
|
-
)
|
|
154
139
|
response = self.router_client.completion(
|
|
155
140
|
messages=formatted_messages, **self._completion_fn_args
|
|
156
141
|
)
|
|
@@ -180,10 +165,6 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
|
|
|
180
165
|
return await self._atext_completion(messages)
|
|
181
166
|
try:
|
|
182
167
|
formatted_messages = self._format_messages(messages)
|
|
183
|
-
structlogger.info(
|
|
184
|
-
"litellm_router_llm_client.acompletion",
|
|
185
|
-
_completion_fn_args=self._completion_fn_args,
|
|
186
|
-
)
|
|
187
168
|
response = await self.router_client.acompletion(
|
|
188
169
|
messages=formatted_messages, **self._completion_fn_args
|
|
189
170
|
)
|
|
@@ -198,5 +179,5 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
|
|
|
198
179
|
"""
|
|
199
180
|
return {
|
|
200
181
|
**self._litellm_extra_parameters,
|
|
201
|
-
|
|
182
|
+
"model": self.model_group_id,
|
|
202
183
|
}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
from typing import Dict, List, Protocol, Union, runtime_checkable
|
|
4
2
|
|
|
5
3
|
from rasa.shared.providers.llm.llm_response import LLMResponse
|
|
@@ -13,7 +11,7 @@ class LLMClient(Protocol):
|
|
|
13
11
|
"""
|
|
14
12
|
|
|
15
13
|
@classmethod
|
|
16
|
-
def from_config(cls, config: dict) -> LLMClient:
|
|
14
|
+
def from_config(cls, config: dict) -> "LLMClient":
|
|
17
15
|
"""
|
|
18
16
|
Initializes the llm client with the given configuration.
|
|
19
17
|
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
from dataclasses import dataclass, field
|
|
2
|
-
from typing import Dict, List, Optional
|
|
1
|
+
from dataclasses import asdict, dataclass, field
|
|
2
|
+
from typing import Any, Dict, List, Optional, Text, Union
|
|
3
|
+
|
|
4
|
+
import structlog
|
|
5
|
+
|
|
6
|
+
structlogger = structlog.get_logger()
|
|
3
7
|
|
|
4
8
|
|
|
5
9
|
@dataclass
|
|
@@ -16,6 +20,17 @@ class LLMUsage:
|
|
|
16
20
|
def __post_init__(self) -> None:
|
|
17
21
|
self.total_tokens = self.prompt_tokens + self.completion_tokens
|
|
18
22
|
|
|
23
|
+
@classmethod
|
|
24
|
+
def from_dict(cls, data: Dict[Text, Any]) -> "LLMUsage":
|
|
25
|
+
"""Creates an LLMUsage object from a dictionary.
|
|
26
|
+
If any keys are missing, they will default to zero
|
|
27
|
+
or whatever default you prefer.
|
|
28
|
+
"""
|
|
29
|
+
return cls(
|
|
30
|
+
prompt_tokens=data.get("prompt_tokens"),
|
|
31
|
+
completion_tokens=data.get("completion_tokens"),
|
|
32
|
+
)
|
|
33
|
+
|
|
19
34
|
def to_dict(self) -> dict:
|
|
20
35
|
"""Converts the LLMUsage dataclass instance into a dictionary."""
|
|
21
36
|
return asdict(self)
|
|
@@ -42,6 +57,30 @@ class LLMResponse:
|
|
|
42
57
|
"""Optional dictionary for storing additional information related to the
|
|
43
58
|
completion that may not be covered by other fields."""
|
|
44
59
|
|
|
60
|
+
@classmethod
|
|
61
|
+
def from_dict(cls, data: Dict[Text, Any]) -> "LLMResponse":
|
|
62
|
+
"""Creates an LLMResponse from a dictionary."""
|
|
63
|
+
usage_data = data.get("usage", {})
|
|
64
|
+
usage_obj = LLMUsage.from_dict(usage_data) if usage_data else None
|
|
65
|
+
|
|
66
|
+
return cls(
|
|
67
|
+
id=data["id"],
|
|
68
|
+
choices=data["choices"],
|
|
69
|
+
created=data["created"],
|
|
70
|
+
model=data.get("model"),
|
|
71
|
+
usage=usage_obj,
|
|
72
|
+
additional_info=data.get("additional_info"),
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
@classmethod
|
|
76
|
+
def ensure_llm_response(cls, response: Union[str, "LLMResponse"]) -> "LLMResponse":
|
|
77
|
+
if isinstance(response, LLMResponse):
|
|
78
|
+
return response
|
|
79
|
+
|
|
80
|
+
structlogger.warn("llm_response.deprecated_response_type", response=response)
|
|
81
|
+
data = {"id": None, "choices": [response], "created": None}
|
|
82
|
+
return LLMResponse.from_dict(data)
|
|
83
|
+
|
|
45
84
|
def to_dict(self) -> dict:
|
|
46
85
|
"""Converts the LLMResponse dataclass instance into a dictionary."""
|
|
47
86
|
result = asdict(self)
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
import os
|
|
4
2
|
import re
|
|
5
3
|
from typing import Any, Dict, Optional
|
|
@@ -13,10 +11,6 @@ from rasa.shared.constants import (
|
|
|
13
11
|
OPENAI_PROVIDER,
|
|
14
12
|
)
|
|
15
13
|
from rasa.shared.providers._configs.openai_client_config import OpenAIClientConfig
|
|
16
|
-
from rasa.shared.providers.constants import (
|
|
17
|
-
LITE_LLM_API_KEY_FIELD,
|
|
18
|
-
LITE_LLM_API_VERSION_FIELD,
|
|
19
|
-
)
|
|
20
14
|
from rasa.shared.providers.llm._base_litellm_client import _BaseLiteLLMClient
|
|
21
15
|
|
|
22
16
|
structlogger = structlog.get_logger()
|
|
@@ -63,7 +57,7 @@ class OpenAILLMClient(_BaseLiteLLMClient):
|
|
|
63
57
|
self.validate_client_setup()
|
|
64
58
|
|
|
65
59
|
@classmethod
|
|
66
|
-
def from_config(cls, config: Dict[str, Any]) -> OpenAILLMClient:
|
|
60
|
+
def from_config(cls, config: Dict[str, Any]) -> "OpenAILLMClient":
|
|
67
61
|
"""
|
|
68
62
|
Initializes the client from given configuration.
|
|
69
63
|
|
|
@@ -154,8 +148,8 @@ class OpenAILLMClient(_BaseLiteLLMClient):
|
|
|
154
148
|
fn_args = super()._completion_fn_args
|
|
155
149
|
fn_args.update(
|
|
156
150
|
{
|
|
157
|
-
|
|
158
|
-
|
|
151
|
+
"api_base": self.api_base,
|
|
152
|
+
"api_version": self.api_version,
|
|
159
153
|
}
|
|
160
154
|
)
|
|
161
155
|
return fn_args
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
from typing import Any, Dict, Optional
|
|
4
2
|
|
|
5
3
|
import structlog
|
|
@@ -11,10 +9,6 @@ from rasa.shared.constants import (
|
|
|
11
9
|
from rasa.shared.providers._configs.rasa_llm_client_config import (
|
|
12
10
|
RasaLLMClientConfig,
|
|
13
11
|
)
|
|
14
|
-
from rasa.shared.providers.constants import (
|
|
15
|
-
LITE_LLM_API_BASE_FIELD,
|
|
16
|
-
LITE_LLM_API_KEY_FIELD,
|
|
17
|
-
)
|
|
18
12
|
from rasa.shared.providers.llm._base_litellm_client import _BaseLiteLLMClient
|
|
19
13
|
from rasa.utils.licensing import retrieve_license_from_env
|
|
20
14
|
|
|
@@ -22,7 +16,7 @@ structlogger = structlog.get_logger()
|
|
|
22
16
|
|
|
23
17
|
|
|
24
18
|
class RasaLLMClient(_BaseLiteLLMClient):
|
|
25
|
-
"""A client for interfacing with a Rasa-Hosted LLM endpoint that uses
|
|
19
|
+
"""A client for interfacing with a Rasa-Hosted LLM endpoint that uses.
|
|
26
20
|
|
|
27
21
|
Parameters:
|
|
28
22
|
model (str): The model or deployment name.
|
|
@@ -55,15 +49,12 @@ class RasaLLMClient(_BaseLiteLLMClient):
|
|
|
55
49
|
|
|
56
50
|
@property
|
|
57
51
|
def api_base(self) -> Optional[str]:
|
|
58
|
-
"""
|
|
59
|
-
Returns the base API URL for the openai llm client.
|
|
60
|
-
"""
|
|
52
|
+
"""Returns the base API URL for the openai llm client."""
|
|
61
53
|
return self._api_base
|
|
62
54
|
|
|
63
55
|
@property
|
|
64
56
|
def provider(self) -> str:
|
|
65
|
-
"""
|
|
66
|
-
Returns the provider name for the self hosted llm client.
|
|
57
|
+
"""Returns the provider name for the self hosted llm client.
|
|
67
58
|
|
|
68
59
|
Returns:
|
|
69
60
|
String representing the provider name.
|
|
@@ -88,20 +79,15 @@ class RasaLLMClient(_BaseLiteLLMClient):
|
|
|
88
79
|
|
|
89
80
|
@property
|
|
90
81
|
def _completion_fn_args(self) -> Dict[str, Any]:
|
|
91
|
-
"""Returns the completion arguments for invoking a call
|
|
92
|
-
LiteLLM's completion functions.
|
|
93
|
-
"""
|
|
82
|
+
"""Returns the completion arguments for invoking a call using completions."""
|
|
94
83
|
fn_args = super()._completion_fn_args
|
|
95
84
|
fn_args.update(
|
|
96
|
-
{
|
|
97
|
-
LITE_LLM_API_BASE_FIELD: self.api_base,
|
|
98
|
-
LITE_LLM_API_KEY_FIELD: retrieve_license_from_env(),
|
|
99
|
-
}
|
|
85
|
+
{"api_base": self.api_base, "api_key": retrieve_license_from_env()}
|
|
100
86
|
)
|
|
101
87
|
return fn_args
|
|
102
88
|
|
|
103
89
|
@classmethod
|
|
104
|
-
def from_config(cls, config: Dict[str, Any]) -> RasaLLMClient:
|
|
90
|
+
def from_config(cls, config: Dict[str, Any]) -> "RasaLLMClient":
|
|
105
91
|
try:
|
|
106
92
|
client_config = RasaLLMClientConfig.from_dict(config)
|
|
107
93
|
except ValueError as e:
|