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.

Files changed (499) hide show
  1. rasa/__main__.py +7 -7
  2. rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
  3. rasa/anonymization/anonymization_pipeline.py +3 -3
  4. rasa/anonymization/anonymization_rule_executor.py +1 -1
  5. rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
  6. rasa/cli/arguments/data.py +2 -2
  7. rasa/cli/arguments/evaluate.py +2 -1
  8. rasa/cli/arguments/interactive.py +1 -1
  9. rasa/cli/arguments/run.py +1 -1
  10. rasa/cli/arguments/test.py +7 -5
  11. rasa/cli/arguments/train.py +3 -3
  12. rasa/cli/arguments/visualize.py +2 -2
  13. rasa/cli/arguments/x.py +1 -0
  14. rasa/cli/data.py +4 -3
  15. rasa/cli/dialogue_understanding_test.py +116 -18
  16. rasa/cli/evaluate.py +1 -1
  17. rasa/cli/export.py +6 -6
  18. rasa/cli/interactive.py +4 -5
  19. rasa/cli/llm_fine_tuning.py +5 -5
  20. rasa/cli/markers.py +1 -2
  21. rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
  22. rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
  23. rasa/cli/shell.py +2 -3
  24. rasa/cli/studio/download.py +1 -2
  25. rasa/cli/studio/studio.py +2 -3
  26. rasa/cli/studio/train.py +0 -1
  27. rasa/cli/telemetry.py +2 -2
  28. rasa/cli/test.py +11 -11
  29. rasa/cli/utils.py +7 -5
  30. rasa/core/__init__.py +0 -1
  31. rasa/core/actions/action.py +42 -21
  32. rasa/core/actions/action_hangup.py +1 -1
  33. rasa/core/actions/action_repeat_bot_messages.py +2 -2
  34. rasa/core/actions/action_run_slot_rejections.py +2 -2
  35. rasa/core/actions/action_trigger_chitchat.py +1 -1
  36. rasa/core/actions/action_trigger_flow.py +5 -5
  37. rasa/core/actions/action_trigger_search.py +1 -1
  38. rasa/core/actions/forms.py +14 -12
  39. rasa/core/actions/http_custom_action_executor.py +8 -1
  40. rasa/core/actions/loops.py +3 -3
  41. rasa/core/actions/two_stage_fallback.py +13 -13
  42. rasa/core/auth_retry_tracker_store.py +1 -2
  43. rasa/core/brokers/broker.py +2 -1
  44. rasa/core/brokers/file.py +1 -1
  45. rasa/core/brokers/kafka.py +8 -8
  46. rasa/core/brokers/pika.py +8 -9
  47. rasa/core/brokers/sql.py +4 -3
  48. rasa/core/channels/__init__.py +3 -0
  49. rasa/core/channels/botframework.py +2 -2
  50. rasa/core/channels/callback.py +4 -4
  51. rasa/core/channels/channel.py +11 -11
  52. rasa/core/channels/console.py +0 -1
  53. rasa/core/channels/development_inspector.py +6 -6
  54. rasa/core/channels/facebook.py +5 -5
  55. rasa/core/channels/hangouts.py +7 -8
  56. rasa/core/channels/inspector/dist/assets/{arc-861ddd57.js → arc-632a63ec.js} +1 -1
  57. rasa/core/channels/inspector/dist/assets/{c4Diagram-d0fbc5ce-921f02db.js → c4Diagram-d0fbc5ce-081e0df4.js} +1 -1
  58. rasa/core/channels/inspector/dist/assets/{classDiagram-936ed81e-b436c4f8.js → classDiagram-936ed81e-3df0afc2.js} +1 -1
  59. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-c3cb15f1-511a23cb.js → classDiagram-v2-c3cb15f1-8c5ed31e.js} +1 -1
  60. rasa/core/channels/inspector/dist/assets/{createText-62fc7601-ef476ecd.js → createText-62fc7601-89c73b31.js} +1 -1
  61. rasa/core/channels/inspector/dist/assets/{edges-f2ad444c-f1878e0a.js → edges-f2ad444c-4fc48c3e.js} +1 -1
  62. rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-fac75185.js → erDiagram-9d236eb7-907e0440.js} +1 -1
  63. rasa/core/channels/inspector/dist/assets/{flowDb-1972c806-201c5bbc.js → flowDb-1972c806-9ec53a3c.js} +1 -1
  64. rasa/core/channels/inspector/dist/assets/{flowDiagram-7ea5b25a-f904ae41.js → flowDiagram-7ea5b25a-41da787a.js} +1 -1
  65. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +1 -0
  66. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-abe16c3d-1813da66.js → flowchart-elk-definition-abe16c3d-ce370633.js} +1 -1
  67. rasa/core/channels/inspector/dist/assets/{ganttDiagram-9b5ea136-872af172.js → ganttDiagram-9b5ea136-90a36523.js} +1 -1
  68. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-99d0ae7c-34a0af5a.js → gitGraphDiagram-99d0ae7c-41e1aa3f.js} +1 -1
  69. rasa/core/channels/inspector/dist/assets/{index-2c4b9a3b-42ba3e3d.js → index-2c4b9a3b-e6f2af62.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{index-37817b51.js → index-e793d777.js} +3 -3
  71. rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-6b731386.js → infoDiagram-736b4530-8ceba4db.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-e8579ac6.js → journeyDiagram-df861f2b-960d3809.js} +1 -1
  73. rasa/core/channels/inspector/dist/assets/{layout-89e6403a.js → layout-498807d8.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{line-dc73d3fc.js → line-eeccc4e2.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/{linear-f5b1d2bc.js → linear-8a078617.js} +1 -1
  76. rasa/core/channels/inspector/dist/assets/{mindmap-definition-beec6740-82cb74fa.js → mindmap-definition-beec6740-396d17dd.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-bdf5f29b.js → pieDiagram-dbbf0591-dc9b5e1b.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-c7a0cbe4.js → quadrantDiagram-4d7f4fd6-a08cba6d.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-7ec5410f.js → requirementDiagram-6fc4c22a-87242b9e.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-8f13d901-caee5554.js → sankeyDiagram-8f13d901-53f6f391.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-b655622a-2935f8db.js → sequenceDiagram-b655622a-715c9c20.js} +1 -1
  82. rasa/core/channels/inspector/dist/assets/{stateDiagram-59f0c015-8f5d9693.js → stateDiagram-59f0c015-2e8fb31f.js} +1 -1
  83. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-2b26beab-d565d1de.js → stateDiagram-v2-2b26beab-7e2d2aa0.js} +1 -1
  84. rasa/core/channels/inspector/dist/assets/{styles-080da4f6-75ad421d.js → styles-080da4f6-4420cea6.js} +1 -1
  85. rasa/core/channels/inspector/dist/assets/{styles-3dcbcfbf-7e764226.js → styles-3dcbcfbf-28676cf4.js} +1 -1
  86. rasa/core/channels/inspector/dist/assets/{styles-9c745c82-7a4e0e61.js → styles-9c745c82-cef936a6.js} +1 -1
  87. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-4835440b-4019d1bf.js → svgDrawCommon-4835440b-151251e9.js} +1 -1
  88. rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-01ea12df.js → timeline-definition-5b62e21b-0d39bdb2.js} +1 -1
  89. rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-89407137.js → xychartDiagram-2b33534f-a03fa445.js} +1 -1
  90. rasa/core/channels/inspector/dist/index.html +3 -1
  91. rasa/core/channels/inspector/index.html +2 -0
  92. rasa/core/channels/inspector/src/App.tsx +1 -4
  93. rasa/core/channels/mattermost.py +4 -4
  94. rasa/core/channels/rasa_chat.py +4 -4
  95. rasa/core/channels/rest.py +11 -12
  96. rasa/core/channels/rocketchat.py +4 -3
  97. rasa/core/channels/slack.py +6 -5
  98. rasa/core/channels/socketio.py +7 -28
  99. rasa/core/channels/studio_chat.py +193 -0
  100. rasa/core/channels/telegram.py +73 -41
  101. rasa/core/channels/twilio.py +3 -3
  102. rasa/core/channels/vier_cvg.py +2 -2
  103. rasa/core/channels/voice_ready/audiocodes.py +8 -8
  104. rasa/core/channels/voice_ready/jambonz.py +5 -5
  105. rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
  106. rasa/core/channels/voice_ready/twilio_voice.py +9 -8
  107. rasa/core/channels/voice_ready/utils.py +1 -1
  108. rasa/core/channels/voice_stream/asr/asr_engine.py +2 -2
  109. rasa/core/channels/voice_stream/asr/azure.py +2 -2
  110. rasa/core/channels/voice_stream/asr/deepgram.py +57 -16
  111. rasa/core/channels/voice_stream/browser_audio.py +9 -6
  112. rasa/core/channels/voice_stream/call_state.py +2 -1
  113. rasa/core/channels/voice_stream/tts/azure.py +1 -2
  114. rasa/core/channels/voice_stream/tts/cartesia.py +5 -4
  115. rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
  116. rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
  117. rasa/core/channels/voice_stream/twilio_media_streams.py +10 -7
  118. rasa/core/channels/voice_stream/util.py +1 -1
  119. rasa/core/channels/voice_stream/voice_channel.py +15 -15
  120. rasa/core/channels/webexteams.py +3 -4
  121. rasa/core/evaluation/marker.py +7 -6
  122. rasa/core/evaluation/marker_base.py +15 -16
  123. rasa/core/evaluation/marker_stats.py +3 -4
  124. rasa/core/evaluation/marker_tracker_loader.py +5 -4
  125. rasa/core/exporter.py +4 -4
  126. rasa/core/featurizers/precomputation.py +8 -8
  127. rasa/core/featurizers/single_state_featurizer.py +7 -7
  128. rasa/core/featurizers/tracker_featurizers.py +13 -13
  129. rasa/core/http_interpreter.py +3 -4
  130. rasa/core/information_retrieval/__init__.py +1 -1
  131. rasa/core/information_retrieval/faiss.py +4 -4
  132. rasa/core/information_retrieval/information_retrieval.py +2 -2
  133. rasa/core/information_retrieval/milvus.py +3 -3
  134. rasa/core/information_retrieval/qdrant.py +3 -3
  135. rasa/core/jobs.py +1 -0
  136. rasa/core/lock.py +2 -3
  137. rasa/core/lock_store.py +3 -3
  138. rasa/core/migrate.py +11 -8
  139. rasa/core/nlg/__init__.py +1 -1
  140. rasa/core/nlg/callback.py +2 -3
  141. rasa/core/nlg/contextual_response_rephraser.py +63 -13
  142. rasa/core/nlg/generator.py +2 -2
  143. rasa/core/nlg/interpolator.py +4 -3
  144. rasa/core/nlg/response.py +3 -4
  145. rasa/core/nlg/summarize.py +1 -0
  146. rasa/core/persistor.py +3 -3
  147. rasa/core/policies/ensemble.py +10 -9
  148. rasa/core/policies/enterprise_search_policy.py +86 -21
  149. rasa/core/policies/flow_policy.py +13 -14
  150. rasa/core/policies/flows/flow_executor.py +35 -11
  151. rasa/core/policies/intentless_policy.py +6 -7
  152. rasa/core/policies/memoization.py +22 -20
  153. rasa/core/policies/policy.py +24 -22
  154. rasa/core/policies/rule_policy.py +37 -36
  155. rasa/core/policies/ted_policy.py +87 -85
  156. rasa/core/policies/unexpected_intent_policy.py +77 -75
  157. rasa/core/processor.py +96 -65
  158. rasa/core/run.py +1 -1
  159. rasa/core/secrets_manager/endpoints.py +2 -3
  160. rasa/core/secrets_manager/factory.py +2 -3
  161. rasa/core/secrets_manager/secret_manager.py +2 -3
  162. rasa/core/secrets_manager/vault.py +2 -2
  163. rasa/core/test.py +30 -30
  164. rasa/core/tracker_store.py +15 -15
  165. rasa/core/train.py +1 -1
  166. rasa/core/training/__init__.py +2 -2
  167. rasa/core/training/converters/responses_prefix_converter.py +1 -2
  168. rasa/core/training/interactive.py +13 -13
  169. rasa/core/training/story_conflict.py +4 -5
  170. rasa/core/training/training.py +3 -5
  171. rasa/core/utils.py +5 -5
  172. rasa/core/visualize.py +1 -1
  173. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
  174. rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
  175. rasa/dialogue_understanding/commands/__init__.py +22 -22
  176. rasa/dialogue_understanding/commands/can_not_handle_command.py +20 -1
  177. rasa/dialogue_understanding/commands/cancel_flow_command.py +18 -7
  178. rasa/dialogue_understanding/commands/change_flow_command.py +18 -2
  179. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +18 -4
  180. rasa/dialogue_understanding/commands/clarify_command.py +19 -3
  181. rasa/dialogue_understanding/commands/command.py +19 -3
  182. rasa/dialogue_understanding/commands/correct_slots_command.py +3 -3
  183. rasa/dialogue_understanding/commands/error_command.py +1 -1
  184. rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
  185. rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
  186. rasa/dialogue_understanding/commands/human_handoff_command.py +16 -4
  187. rasa/dialogue_understanding/commands/knowledge_answer_command.py +18 -4
  188. rasa/dialogue_understanding/commands/noop_command.py +2 -1
  189. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +16 -4
  190. rasa/dialogue_understanding/commands/restart_command.py +2 -5
  191. rasa/dialogue_understanding/commands/session_end_command.py +3 -5
  192. rasa/dialogue_understanding/commands/session_start_command.py +3 -5
  193. rasa/dialogue_understanding/commands/set_slot_command.py +27 -3
  194. rasa/dialogue_understanding/commands/skip_question_command.py +16 -4
  195. rasa/dialogue_understanding/commands/start_flow_command.py +17 -2
  196. rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
  197. rasa/dialogue_understanding/commands/utils.py +64 -45
  198. rasa/dialogue_understanding/constants.py +1 -0
  199. rasa/dialogue_understanding/generator/command_generator.py +2 -119
  200. rasa/dialogue_understanding/generator/command_parser.py +201 -0
  201. rasa/dialogue_understanding/generator/constants.py +2 -2
  202. rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
  203. rasa/dialogue_understanding/generator/llm_based_command_generator.py +11 -57
  204. rasa/dialogue_understanding/generator/llm_command_generator.py +2 -1
  205. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +67 -120
  206. rasa/dialogue_understanding/generator/nlu_command_adapter.py +8 -10
  207. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +32 -93
  208. rasa/dialogue_understanding/generator/utils.py +45 -0
  209. rasa/dialogue_understanding/patterns/cancel.py +2 -1
  210. rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
  211. rasa/dialogue_understanding/patterns/chitchat.py +1 -1
  212. rasa/dialogue_understanding/patterns/clarify.py +2 -1
  213. rasa/dialogue_understanding/patterns/code_change.py +2 -0
  214. rasa/dialogue_understanding/patterns/collect_information.py +6 -3
  215. rasa/dialogue_understanding/patterns/completed.py +1 -1
  216. rasa/dialogue_understanding/patterns/continue_interrupted.py +10 -1
  217. rasa/dialogue_understanding/patterns/correction.py +4 -2
  218. rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
  219. rasa/dialogue_understanding/patterns/internal_error.py +1 -0
  220. rasa/dialogue_understanding/patterns/search.py +1 -1
  221. rasa/dialogue_understanding/patterns/session_start.py +1 -1
  222. rasa/dialogue_understanding/patterns/skip_question.py +1 -0
  223. rasa/dialogue_understanding/patterns/user_silence.py +1 -1
  224. rasa/dialogue_understanding/processor/command_processor.py +13 -9
  225. rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
  226. rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
  227. rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
  228. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
  229. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
  230. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
  231. rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
  232. rasa/dialogue_understanding/stack/utils.py +8 -4
  233. rasa/dialogue_understanding/utils.py +121 -2
  234. rasa/dialogue_understanding_test/README.md +379 -0
  235. rasa/dialogue_understanding_test/command_comparison.py +60 -0
  236. rasa/dialogue_understanding_test/command_metric_calculation.py +110 -4
  237. rasa/dialogue_understanding_test/constants.py +6 -1
  238. rasa/dialogue_understanding_test/du_test_case.py +252 -38
  239. rasa/dialogue_understanding_test/du_test_result.py +281 -2
  240. rasa/dialogue_understanding_test/du_test_runner.py +239 -10
  241. rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
  242. rasa/dialogue_understanding_test/io.py +338 -20
  243. rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
  244. rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
  245. rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
  246. rasa/dialogue_understanding_test/utils.py +70 -0
  247. rasa/dialogue_understanding_test/validation.py +59 -4
  248. rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
  249. rasa/e2e_test/assertions.py +1 -1
  250. rasa/e2e_test/e2e_config.py +1 -1
  251. rasa/e2e_test/e2e_test_case.py +3 -4
  252. rasa/e2e_test/e2e_test_converter.py +2 -3
  253. rasa/e2e_test/e2e_test_coverage_report.py +6 -6
  254. rasa/e2e_test/e2e_test_result.py +1 -1
  255. rasa/e2e_test/e2e_test_runner.py +134 -31
  256. rasa/e2e_test/stub_custom_action.py +1 -1
  257. rasa/e2e_test/utils/e2e_yaml_utils.py +1 -1
  258. rasa/e2e_test/utils/io.py +132 -65
  259. rasa/e2e_test/utils/validation.py +1 -1
  260. rasa/engine/caching.py +5 -7
  261. rasa/engine/constants.py +1 -1
  262. rasa/engine/graph.py +2 -2
  263. rasa/engine/recipes/default_components.py +13 -15
  264. rasa/engine/recipes/recipe.py +2 -2
  265. rasa/engine/runner/dask.py +2 -2
  266. rasa/engine/runner/interface.py +1 -0
  267. rasa/engine/storage/local_model_storage.py +5 -4
  268. rasa/engine/storage/resource.py +2 -1
  269. rasa/engine/storage/storage.py +5 -3
  270. rasa/engine/training/components.py +2 -1
  271. rasa/engine/training/fingerprinting.py +4 -2
  272. rasa/engine/training/graph_trainer.py +4 -4
  273. rasa/engine/training/hooks.py +2 -2
  274. rasa/engine/validation.py +34 -33
  275. rasa/exceptions.py +3 -2
  276. rasa/graph_components/converters/nlu_message_converter.py +3 -3
  277. rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
  278. rasa/graph_components/providers/domain_provider.py +3 -2
  279. rasa/graph_components/providers/flows_provider.py +2 -3
  280. rasa/graph_components/providers/forms_provider.py +4 -4
  281. rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
  282. rasa/graph_components/providers/responses_provider.py +4 -4
  283. rasa/graph_components/providers/rule_only_provider.py +3 -2
  284. rasa/graph_components/providers/story_graph_provider.py +8 -8
  285. rasa/graph_components/providers/training_tracker_provider.py +3 -2
  286. rasa/graph_components/validators/default_recipe_validator.py +16 -16
  287. rasa/graph_components/validators/finetuning_validator.py +10 -8
  288. rasa/hooks.py +18 -12
  289. rasa/jupyter.py +2 -2
  290. rasa/llm_fine_tuning/annotation_module.py +4 -4
  291. rasa/llm_fine_tuning/conversations.py +6 -6
  292. rasa/llm_fine_tuning/llm_data_preparation_module.py +1 -1
  293. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
  294. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +1 -1
  295. rasa/llm_fine_tuning/paraphrasing_module.py +1 -1
  296. rasa/llm_fine_tuning/storage.py +3 -3
  297. rasa/markers/marker.py +2 -3
  298. rasa/markers/marker_base.py +1 -2
  299. rasa/markers/upload.py +2 -2
  300. rasa/markers/validate.py +2 -3
  301. rasa/model.py +3 -5
  302. rasa/model_manager/config.py +1 -1
  303. rasa/model_manager/model_api.py +5 -4
  304. rasa/model_manager/runner_service.py +6 -6
  305. rasa/model_manager/socket_bridge.py +8 -3
  306. rasa/model_manager/studio_jwt_auth.py +1 -0
  307. rasa/model_manager/trainer_service.py +9 -7
  308. rasa/model_manager/utils.py +1 -1
  309. rasa/model_manager/warm_rasa_process.py +14 -8
  310. rasa/model_service.py +5 -6
  311. rasa/model_testing.py +13 -15
  312. rasa/nlu/classifiers/diet_classifier.py +72 -73
  313. rasa/nlu/classifiers/fallback_classifier.py +9 -8
  314. rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
  315. rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
  316. rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
  317. rasa/nlu/classifiers/regex_message_handler.py +3 -2
  318. rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
  319. rasa/nlu/convert.py +2 -2
  320. rasa/nlu/emulators/dialogflow.py +3 -3
  321. rasa/nlu/emulators/luis.py +5 -5
  322. rasa/nlu/emulators/no_emulator.py +1 -0
  323. rasa/nlu/emulators/wit.py +4 -4
  324. rasa/nlu/extractors/crf_entity_extractor.py +11 -11
  325. rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
  326. rasa/nlu/extractors/entity_synonyms.py +10 -9
  327. rasa/nlu/extractors/extractor.py +16 -16
  328. rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
  329. rasa/nlu/extractors/regex_entity_extractor.py +11 -10
  330. rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
  331. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
  332. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
  333. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
  334. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
  335. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
  336. rasa/nlu/featurizers/featurizer.py +5 -4
  337. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
  338. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
  339. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
  340. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
  341. rasa/nlu/model.py +0 -1
  342. rasa/nlu/selectors/response_selector.py +67 -68
  343. rasa/nlu/test.py +38 -38
  344. rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
  345. rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
  346. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
  347. rasa/nlu/tokenizers/tokenizer.py +6 -7
  348. rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
  349. rasa/nlu/utils/bilou_utils.py +7 -7
  350. rasa/nlu/utils/hugging_face/registry.py +22 -22
  351. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
  352. rasa/nlu/utils/mitie_utils.py +2 -1
  353. rasa/nlu/utils/pattern_utils.py +1 -1
  354. rasa/nlu/utils/spacy_utils.py +3 -3
  355. rasa/plugin.py +12 -1
  356. rasa/server.py +37 -1
  357. rasa/shared/constants.py +22 -2
  358. rasa/shared/core/command_payload_reader.py +15 -7
  359. rasa/shared/core/constants.py +4 -1
  360. rasa/shared/core/conversation.py +1 -2
  361. rasa/shared/core/events.py +47 -37
  362. rasa/shared/core/flows/__init__.py +0 -1
  363. rasa/shared/core/flows/flow.py +11 -11
  364. rasa/shared/core/flows/flow_step.py +19 -13
  365. rasa/shared/core/flows/flow_step_links.py +21 -14
  366. rasa/shared/core/flows/flow_step_sequence.py +6 -4
  367. rasa/shared/core/flows/flows_list.py +3 -3
  368. rasa/shared/core/flows/nlu_trigger.py +1 -1
  369. rasa/shared/core/flows/steps/__init__.py +2 -2
  370. rasa/shared/core/flows/steps/action.py +4 -3
  371. rasa/shared/core/flows/steps/call.py +4 -4
  372. rasa/shared/core/flows/steps/collect.py +7 -4
  373. rasa/shared/core/flows/steps/continuation.py +3 -1
  374. rasa/shared/core/flows/steps/end.py +3 -1
  375. rasa/shared/core/flows/steps/internal.py +3 -2
  376. rasa/shared/core/flows/steps/link.py +6 -4
  377. rasa/shared/core/flows/steps/no_operation.py +7 -5
  378. rasa/shared/core/flows/steps/set_slots.py +4 -3
  379. rasa/shared/core/flows/steps/start.py +3 -1
  380. rasa/shared/core/flows/utils.py +1 -0
  381. rasa/shared/core/flows/validation.py +3 -5
  382. rasa/shared/core/generator.py +20 -21
  383. rasa/shared/core/slot_mappings.py +15 -15
  384. rasa/shared/core/slots.py +3 -3
  385. rasa/shared/core/trackers.py +31 -31
  386. rasa/shared/core/training_data/loading.py +1 -1
  387. rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
  388. rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
  389. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
  390. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
  391. rasa/shared/core/training_data/structures.py +11 -12
  392. rasa/shared/core/training_data/visualization.py +10 -10
  393. rasa/shared/data.py +6 -6
  394. rasa/shared/engine/caching.py +0 -1
  395. rasa/shared/exceptions.py +2 -2
  396. rasa/shared/importers/rasa.py +5 -6
  397. rasa/shared/importers/utils.py +1 -1
  398. rasa/shared/nlu/constants.py +3 -0
  399. rasa/shared/nlu/training_data/entities_parser.py +6 -6
  400. rasa/shared/nlu/training_data/features.py +3 -3
  401. rasa/shared/nlu/training_data/formats/__init__.py +1 -1
  402. rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
  403. rasa/shared/nlu/training_data/formats/luis.py +7 -8
  404. rasa/shared/nlu/training_data/formats/rasa.py +4 -5
  405. rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
  406. rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
  407. rasa/shared/nlu/training_data/formats/wit.py +3 -4
  408. rasa/shared/nlu/training_data/loading.py +4 -4
  409. rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
  410. rasa/shared/nlu/training_data/message.py +13 -14
  411. rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
  412. rasa/shared/nlu/training_data/schemas/responses.yml +1 -0
  413. rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
  414. rasa/shared/nlu/training_data/training_data.py +12 -13
  415. rasa/shared/nlu/training_data/util.py +11 -10
  416. rasa/shared/providers/_configs/azure_openai_client_config.py +3 -497
  417. rasa/shared/providers/_configs/client_config.py +1 -3
  418. rasa/shared/providers/_configs/default_litellm_client_config.py +1 -3
  419. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +1 -3
  420. rasa/shared/providers/_configs/litellm_router_client_config.py +1 -3
  421. rasa/shared/providers/_configs/model_group_config.py +2 -7
  422. rasa/shared/providers/_configs/openai_client_config.py +1 -3
  423. rasa/shared/providers/_configs/rasa_llm_client_config.py +1 -3
  424. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +1 -3
  425. rasa/shared/providers/_configs/utils.py +1 -0
  426. rasa/shared/providers/_ssl_verification_utils.py +5 -6
  427. rasa/shared/providers/_utils.py +5 -5
  428. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
  429. rasa/shared/providers/embedding/azure_openai_embedding_client.py +3 -28
  430. rasa/shared/providers/embedding/embedding_client.py +1 -1
  431. rasa/shared/providers/embedding/litellm_router_embedding_client.py +1 -3
  432. rasa/shared/providers/llm/_base_litellm_client.py +1 -3
  433. rasa/shared/providers/llm/azure_openai_llm_client.py +25 -81
  434. rasa/shared/providers/llm/default_litellm_llm_client.py +1 -3
  435. rasa/shared/providers/llm/litellm_router_llm_client.py +2 -21
  436. rasa/shared/providers/llm/llm_client.py +1 -3
  437. rasa/shared/providers/llm/llm_response.py +41 -2
  438. rasa/shared/providers/llm/openai_llm_client.py +3 -9
  439. rasa/shared/providers/llm/rasa_llm_client.py +6 -20
  440. rasa/shared/providers/llm/self_hosted_llm_client.py +3 -9
  441. rasa/shared/providers/mappings.py +18 -19
  442. rasa/shared/providers/router/_base_litellm_router_client.py +1 -3
  443. rasa/shared/providers/router/router_client.py +1 -3
  444. rasa/shared/utils/cli.py +1 -1
  445. rasa/shared/utils/common.py +1 -1
  446. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
  447. rasa/shared/utils/health_check/health_check.py +3 -3
  448. rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
  449. rasa/shared/utils/io.py +1 -1
  450. rasa/shared/utils/llm.py +5 -9
  451. rasa/shared/utils/pykwalify_extensions.py +1 -1
  452. rasa/shared/utils/schemas/events.py +1 -1
  453. rasa/shared/utils/yaml.py +29 -26
  454. rasa/studio/auth.py +3 -3
  455. rasa/studio/config.py +1 -2
  456. rasa/studio/data_handler.py +3 -3
  457. rasa/studio/download.py +1 -1
  458. rasa/studio/results_logger.py +3 -3
  459. rasa/studio/upload.py +2 -0
  460. rasa/telemetry.py +31 -0
  461. rasa/tracing/config.py +3 -3
  462. rasa/tracing/instrumentation/attribute_extractors.py +2 -0
  463. rasa/tracing/instrumentation/instrumentation.py +4 -4
  464. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
  465. rasa/tracing/instrumentation/metrics.py +11 -11
  466. rasa/tracing/metric_instrument_provider.py +14 -14
  467. rasa/utils/common.py +12 -9
  468. rasa/utils/endpoints.py +1 -1
  469. rasa/utils/io.py +7 -7
  470. rasa/utils/licensing.py +3 -4
  471. rasa/utils/log_utils.py +7 -6
  472. rasa/utils/ml_utils.py +1 -0
  473. rasa/utils/plotting.py +3 -3
  474. rasa/utils/sanic_error_handler.py +1 -1
  475. rasa/utils/tensorflow/callback.py +2 -2
  476. rasa/utils/tensorflow/crf.py +2 -2
  477. rasa/utils/tensorflow/data_generator.py +5 -5
  478. rasa/utils/tensorflow/environment.py +3 -3
  479. rasa/utils/tensorflow/feature_array.py +2 -3
  480. rasa/utils/tensorflow/layers.py +18 -12
  481. rasa/utils/tensorflow/layers_utils.py +2 -1
  482. rasa/utils/tensorflow/metrics.py +2 -2
  483. rasa/utils/tensorflow/model_data.py +7 -7
  484. rasa/utils/tensorflow/model_data_utils.py +10 -9
  485. rasa/utils/tensorflow/models.py +31 -32
  486. rasa/utils/tensorflow/rasa_layers.py +20 -19
  487. rasa/utils/tensorflow/types.py +2 -1
  488. rasa/utils/train_utils.py +23 -21
  489. rasa/utils/url_tools.py +1 -1
  490. rasa/validator.py +17 -1
  491. rasa/version.py +1 -1
  492. {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/METADATA +8 -9
  493. rasa_pro-3.12.0.dev3.dist-info/RECORD +800 -0
  494. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +0 -1
  495. rasa/shared/providers/constants.py +0 -7
  496. rasa_pro-3.12.0.dev1.dist-info/RECORD +0 -790
  497. {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/NOTICE +0 -0
  498. {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/WHEEL +0 -0
  499. {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 enum import Enum
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
 
@@ -1,4 +1,5 @@
1
1
  import structlog
2
+
2
3
  from rasa.shared.utils.io import raise_deprecation_warning
3
4
 
4
5
  structlogger = structlog.get_logger()