rasa-pro 3.12.0.dev2__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 (502) 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 -119
  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 -26
  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 -79
  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.dev2.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/_configs/azure_entra_id_client_creds.py +0 -40
  496. rasa/shared/providers/_configs/azure_entra_id_config.py +0 -533
  497. rasa/shared/providers/_configs/oauth_config.py +0 -33
  498. rasa/shared/providers/constants.py +0 -6
  499. rasa_pro-3.12.0.dev2.dist-info/RECORD +0 -793
  500. {rasa_pro-3.12.0.dev2.dist-info → rasa_pro-3.12.0.dev3.dist-info}/NOTICE +0 -0
  501. {rasa_pro-3.12.0.dev2.dist-info → rasa_pro-3.12.0.dev3.dist-info}/WHEEL +0 -0
  502. {rasa_pro-3.12.0.dev2.dist-info → rasa_pro-3.12.0.dev3.dist-info}/entry_points.txt +0 -0
@@ -1 +0,0 @@
1
- import{p as e,f as o}from"./flowDb-1972c806-201c5bbc.js";import{f as t,g as a}from"./styles-080da4f6-75ad421d.js";import{t as s}from"./index-37817b51.js";import"./layout-89e6403a.js";import"./index-2c4b9a3b-42ba3e3d.js";import"./edges-f2ad444c-f1878e0a.js";import"./createText-62fc7601-ef476ecd.js";import"./line-dc73d3fc.js";import"./array-9f3ba611.js";import"./path-53f90ab3.js";const k={parser:e,db:o,renderer:t,styles:a,init:r=>{r.flowchart||(r.flowchart={}),r.flowchart.arrowMarkerAbsolute=r.arrowMarkerAbsolute,s({flowchart:{arrowMarkerAbsolute:r.arrowMarkerAbsolute}}),t.setConf(r.flowchart),o.clear(),o.setGen("gen-2")}};export{k as diagram};
@@ -1,40 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from dataclasses import dataclass, field
4
- from typing import Any, Dict, List
5
-
6
- from azure.identity import ClientSecretCredential
7
-
8
- from rasa.shared.providers._configs.oauth_config import OAuth
9
-
10
-
11
- @dataclass
12
- class AzureEntraIDClientCreds(OAuth):
13
- client_id: str
14
- client_secret: str
15
- tenant_id: str
16
- scopes: List[str] = field(default_factory=list)
17
-
18
- @classmethod
19
- def from_config(cls, config: Dict[str, Any]) -> AzureEntraIDClientCreds:
20
- scopes = config.get("scopes")
21
- if isinstance(scopes, str):
22
- scopes = [scopes]
23
-
24
- return cls(
25
- client_id=config.get("client_id"),
26
- client_secret=config.get("client_secret"),
27
- tenant_id=config.get("tenant_id"),
28
- scopes=scopes,
29
- )
30
-
31
- def get_bearer_token(self) -> str:
32
- return (
33
- ClientSecretCredential(
34
- client_id=self.client_id,
35
- client_secret=self.client_secret,
36
- tenant_id=self.tenant_id,
37
- )
38
- .get_token(*self.scopes)
39
- .token
40
- )
@@ -1,533 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import abc
4
- import logging
5
- from dataclasses import dataclass
6
- from enum import Enum
7
- from functools import lru_cache
8
- from typing import Any, Callable, Dict, List, Optional, Set, Type, TypeVar
9
-
10
- import structlog
11
- from azure.core.credentials import TokenProvider
12
- from azure.identity import (
13
- CertificateCredential,
14
- ClientSecretCredential,
15
- DefaultAzureCredential,
16
- )
17
-
18
- from rasa.shared.providers._configs.oauth_config import OAUTH_TYPE_FIELD, OAuth
19
-
20
- AZURE_CLIENT_ID_FIELD = "client_id"
21
- AZURE_CLIENT_SECRET_FIELD = "client_secret"
22
- AZURE_TENANT_ID_FIELD = "tenant_id"
23
- AZURE_CERTIFICATE_PATH_FIELD = "certificate_path"
24
- AZURE_CERTIFICATE_PASSWORD_FIELD = "certificate_password"
25
- AZURE_SEND_CERTIFICATE_CHAIN_FIELD = "send_certificate_chain"
26
- AZURE_SCOPES_FIELD = "scopes"
27
- AZURE_AUTHORITY_FIELD = "authority_host"
28
- AZURE_DISABLE_INSTANCE_DISCOVERY_FIELD = "disable_instance_discovery"
29
-
30
-
31
- azure_logger = logging.getLogger("azure")
32
- azure_logger.setLevel(logging.DEBUG)
33
-
34
- structlogger = structlog.get_logger()
35
-
36
-
37
- class AzureEntraIDOAuthType(str, Enum):
38
- """Azure Entra ID OAuth types."""
39
-
40
- AZURE_ENTRA_ID_DEFAULT = "azure_entra_id_default"
41
- AZURE_ENTRA_ID_CLIENT_SECRET = "azure_entra_id_client_secret"
42
- AZURE_ENTRA_ID_CLIENT_CERTIFICATE = "azure_entra_id_client_certificate"
43
-
44
- # Invalid type is used to indicate that the type
45
- # configuration is invalid EntraID or not set.
46
- INVALID = "invalid"
47
-
48
- @staticmethod
49
- def from_string(value: Optional[str]) -> AzureEntraIDOAuthType:
50
- """Converts a string to an AzureOAuthType."""
51
- if value is None or value not in AzureEntraIDOAuthType.valid_string_values():
52
- return AzureEntraIDOAuthType.INVALID
53
-
54
- return AzureEntraIDOAuthType(value)
55
-
56
- @staticmethod
57
- def valid_string_values() -> Set[str]:
58
- """Returns the valid string values for the AzureOAuthType."""
59
- return {e.value for e in AzureEntraIDOAuthType.valid_values()}
60
-
61
- @staticmethod
62
- def valid_values() -> Set[AzureEntraIDOAuthType]:
63
- """Returns the valid values for the AzureOAuthType."""
64
- return {
65
- AzureEntraIDOAuthType.AZURE_ENTRA_ID_DEFAULT,
66
- AzureEntraIDOAuthType.AZURE_ENTRA_ID_CLIENT_SECRET,
67
- AzureEntraIDOAuthType.AZURE_ENTRA_ID_CLIENT_CERTIFICATE,
68
- }
69
-
70
-
71
- # BearerTokenProvider is a callable that returns a bearer token.
72
- BearerTokenProvider = Callable[[], str]
73
-
74
- AzureEntraIDTokenProviderConfigType = TypeVar(
75
- "AzureEntraIDTokenProviderConfigType", bound="AzureEntraIDTokenProviderConfig"
76
- )
77
-
78
-
79
- class AzureEntraIDTokenProviderConfig(abc.ABC):
80
- """Interface for Azure Entra ID OAuth credential configuration."""
81
-
82
- @abc.abstractmethod
83
- def create_azure_token_provider(self) -> TokenProvider:
84
- """Create an Azure Entra ID token provider."""
85
- ...
86
-
87
- @classmethod
88
- def from_config(
89
- cls: AzureEntraIDTokenProviderConfigType, config: Dict[str, Any]
90
- ) -> AzureEntraIDTokenProviderConfigType:
91
- """Initializes a dataclass from the passed config.
92
-
93
- Args:
94
- config: (dict) The config from which to initialize.
95
-
96
- Returns:
97
- AzureEntraIDCredential
98
- """
99
- ...
100
-
101
-
102
- @dataclass
103
- class AzureEntraIDClientCredentialsConfig(AzureEntraIDTokenProviderConfig):
104
- """Azure Entra ID OAuth client credentials configuration.
105
-
106
- Attributes:
107
- client_id: The client ID.
108
- client_secret: The client secret.
109
- tenant_id: The tenant ID.
110
- authority_host: The authority host.
111
- disable_instance_discovery: Whether to disable instance discovery. This is used
112
- to disable fetching metadata from the Azure Instance Metadata Service.
113
- """
114
-
115
- client_id: str
116
- client_secret: str
117
- tenant_id: str
118
- authority_host: Optional[str] = None
119
- disable_instance_discovery: bool = False
120
-
121
- @staticmethod
122
- def required_fields() -> Set[str]:
123
- """Returns the required fields for the configuration."""
124
- return {AZURE_CLIENT_ID_FIELD, AZURE_TENANT_ID_FIELD, AZURE_CLIENT_SECRET_FIELD}
125
-
126
- @staticmethod
127
- def config_has_required_fields(config: Dict[str, Any]) -> bool:
128
- """Check if the configuration has all the required fields."""
129
- return AzureEntraIDClientCredentialsConfig.required_fields().issubset(
130
- set(config.keys())
131
- )
132
-
133
- @classmethod
134
- def from_config(cls, config: Dict[str, Any]) -> AzureEntraIDClientCredentialsConfig:
135
- """Initializes a dataclass from the passed config.
136
-
137
- Args:
138
- config: (dict) The config from which to initialize.
139
-
140
- Returns:
141
- AzureClientCredentialsConfig
142
- """
143
- if not cls.config_has_required_fields(config):
144
- message = (
145
- f"A configuration for Azure client credentials "
146
- f"must contain the following keys: {cls.required_fields()}"
147
- )
148
- structlogger.error(
149
- "azure_client_credentials_config.missing_required_keys",
150
- message=message,
151
- config=config,
152
- )
153
- raise ValueError(message)
154
-
155
- return cls(
156
- client_id=config.pop(AZURE_CLIENT_ID_FIELD),
157
- client_secret=config.pop(AZURE_CLIENT_SECRET_FIELD),
158
- tenant_id=config.pop(AZURE_TENANT_ID_FIELD),
159
- authority_host=config.pop(AZURE_AUTHORITY_FIELD, None),
160
- disable_instance_discovery=config.pop(
161
- AZURE_DISABLE_INSTANCE_DISCOVERY_FIELD, False
162
- ),
163
- )
164
-
165
- def create_azure_token_provider(self) -> TokenProvider:
166
- """Create a ClientSecretCredential for Azure Entra ID."""
167
- return create_azure_entra_id_client_credentials(
168
- client_id=self.client_id,
169
- client_secret=self.client_secret,
170
- tenant_id=self.tenant_id,
171
- authority_host=self.authority_host,
172
- disable_instance_discovery=self.disable_instance_discovery,
173
- )
174
-
175
-
176
- @lru_cache
177
- def create_azure_entra_id_client_credentials(
178
- client_id: str,
179
- client_secret: str,
180
- tenant_id: str,
181
- authority_host: Optional[str] = None,
182
- disable_instance_discovery: bool = False,
183
- ) -> ClientSecretCredential:
184
- """Creates a ClientSecretCredential for Azure Entra ID.
185
-
186
- We cache the result of this function to avoid creating multiple instances
187
- of the same credential. This makes it possible to utilise the token caching
188
- and token refreshing functionality of the azure-identity library.
189
-
190
- Args:
191
- client_id: The client ID.
192
- client_secret: The client secret.
193
- tenant_id: The tenant ID.
194
- authority_host: The authority host.
195
- disable_instance_discovery: Whether to disable instance discovery. This is used
196
- to disable fetching metadata from the Azure Instance Metadata Service.
197
-
198
- Returns:
199
- ClientSecretCredential
200
- """
201
- return ClientSecretCredential(
202
- client_id=client_id,
203
- client_secret=client_secret,
204
- tenant_id=tenant_id,
205
- authority=authority_host,
206
- disable_instance_discovery=disable_instance_discovery,
207
- )
208
-
209
-
210
- @dataclass
211
- class AzureEntraIDClientCertificateConfig(AzureEntraIDTokenProviderConfig):
212
- """Azure Entra ID OAuth client certificate configuration.
213
-
214
- Attributes:
215
- client_id: The client ID.
216
- tenant_id: The tenant ID.
217
- certificate_path: The path to the certificate file.
218
- certificate_password: The certificate password.
219
- send_certificate_chain: Whether to send the certificate chain.
220
- authority_host: The authority host.
221
- disable_instance_discovery: Whether to disable instance discovery. This is used
222
- to disable fetching metadata from the Azure Instance Metadata Service.
223
- """
224
-
225
- client_id: str
226
- tenant_id: str
227
- certificate_path: str
228
- certificate_password: Optional[str] = None
229
- send_certificate_chain: bool = False
230
- authority_host: Optional[str] = None
231
- disable_instance_discovery: bool = False
232
-
233
- @staticmethod
234
- def required_fields() -> Set[str]:
235
- """Returns the required fields for the configuration."""
236
- return {
237
- AZURE_CLIENT_ID_FIELD,
238
- AZURE_TENANT_ID_FIELD,
239
- AZURE_CERTIFICATE_PATH_FIELD,
240
- AZURE_CERTIFICATE_PASSWORD_FIELD,
241
- }
242
-
243
- @staticmethod
244
- def config_has_required_fields(config: Dict[str, Any]) -> bool:
245
- """Check if the configuration has all the required fields."""
246
- return AzureEntraIDClientCertificateConfig.required_fields().issubset(
247
- set(config.keys())
248
- )
249
-
250
- @classmethod
251
- def from_config(
252
- cls, config: Dict[str, Any]
253
- ) -> Optional[AzureEntraIDClientCertificateConfig]:
254
- """Initializes a dataclass from the passed config.
255
-
256
- Args:
257
- config: (dict) The config from which to initialize.
258
-
259
- Returns:
260
- AzureClientCertificateConfig
261
- """
262
- if not cls.config_has_required_fields(config):
263
- message = (
264
- f"A configuration for Azure client certificate "
265
- f"must contain "
266
- f"the following keys: {cls.required_fields()}"
267
- )
268
- structlogger.error(
269
- "azure_client_certificate_config.validation_error",
270
- message=message,
271
- config=config,
272
- )
273
- raise ValueError(message)
274
-
275
- return cls(
276
- client_id=config[AZURE_CLIENT_ID_FIELD],
277
- tenant_id=config[AZURE_TENANT_ID_FIELD],
278
- certificate_path=config[AZURE_CERTIFICATE_PATH_FIELD],
279
- certificate_password=config.get(AZURE_CERTIFICATE_PASSWORD_FIELD, None),
280
- authority_host=config.get(AZURE_AUTHORITY_FIELD, None),
281
- send_certificate_chain=config.get(
282
- AZURE_SEND_CERTIFICATE_CHAIN_FIELD, False
283
- ),
284
- disable_instance_discovery=config.get(
285
- AZURE_DISABLE_INSTANCE_DISCOVERY_FIELD, False
286
- ),
287
- )
288
-
289
- def create_azure_token_provider(self) -> TokenProvider:
290
- """Creates a CertificateCredential for Azure Entra ID."""
291
- return create_azure_entra_id_certificate_credentials(
292
- client_id=self.client_id,
293
- tenant_id=self.tenant_id,
294
- certificate_path=self.certificate_path,
295
- password=self.certificate_password,
296
- send_certificate_chain=self.send_certificate_chain,
297
- authority_host=self.authority_host,
298
- disable_instance_discovery=self.disable_instance_discovery,
299
- )
300
-
301
-
302
- @lru_cache
303
- def create_azure_entra_id_certificate_credentials(
304
- tenant_id: str,
305
- client_id: str,
306
- certificate_path: Optional[str] = None,
307
- password: Optional[str] = None,
308
- send_certificate_chain: bool = False,
309
- authority_host: Optional[str] = None,
310
- disable_instance_discovery: bool = False,
311
- ) -> CertificateCredential:
312
- """Creates a CertificateCredential for Azure Entra ID.
313
-
314
- We cache the result of this function to avoid creating multiple instances
315
- of the same credential. This makes it possible to utilise the token caching
316
- and token refreshing functionality of the azure-identity library.
317
-
318
- Args:
319
- tenant_id: The tenant ID.
320
- client_id: The client ID.
321
- certificate_path: The path to the certificate file.
322
- password: The certificate password.
323
- send_certificate_chain: Whether to send the certificate chain.
324
- authority_host: The authority host.
325
- disable_instance_discovery: Whether to disable instance discovery. This is used
326
-
327
- Returns:
328
- CertificateCredential
329
- """
330
-
331
- return CertificateCredential(
332
- client_id=client_id,
333
- tenant_id=tenant_id,
334
- certificate_path=certificate_path,
335
- password=password.encode("utf-8") if password else None,
336
- send_certificate_chain=send_certificate_chain,
337
- authority=authority_host,
338
- disable_instance_discovery=disable_instance_discovery,
339
- )
340
-
341
-
342
- @dataclass
343
- class AzureEntraIDDefaultCredentialsConfig(AzureEntraIDTokenProviderConfig):
344
- """Azure Entra ID OAuth default credentials configuration.
345
-
346
- Attributes:
347
- authority_host: The authority host.
348
- """
349
-
350
- authority_host: Optional[str] = None
351
-
352
- @classmethod
353
- def from_config(
354
- cls, config: Dict[str, Any]
355
- ) -> AzureEntraIDDefaultCredentialsConfig:
356
- """Initializes a dataclass from the passed config.
357
-
358
- Args:
359
- config: (dict) The config from which to initialize.
360
-
361
- Returns:
362
- AzureOAuthDefaultCredentialsConfig
363
- """
364
- return cls(authority_host=config.pop(AZURE_AUTHORITY_FIELD, None))
365
-
366
- def create_azure_token_provider(self) -> TokenProvider:
367
- """Creates a DefaultAzureCredential."""
368
- return create_azure_entra_id_default_credentials(
369
- authority_host=self.authority_host
370
- )
371
-
372
-
373
- @lru_cache
374
- def create_azure_entra_id_default_credentials(
375
- authority_host: Optional[str] = None,
376
- ) -> DefaultAzureCredential:
377
- """Creates a DefaultAzureCredential.
378
-
379
- We cache the result of this function to avoid creating multiple instances
380
- of the same credential. This makes it possible to utilise the token caching
381
- functionality of the azure-identity library.
382
-
383
- Args:
384
- authority_host: The authority host.
385
-
386
- Returns:
387
- DefaultAzureCredential
388
- """
389
- return DefaultAzureCredential(authority=authority_host)
390
-
391
-
392
- @dataclass
393
- class AzureEntraIDOAuthConfig(OAuth):
394
- """Azure Entra ID OAuth configuration.
395
-
396
- It consists of the scopes and the Azure Entra ID OAuth credentials.
397
- """
398
-
399
- scopes: List[str]
400
- azure_entra_id_token_provider_config: Optional[AzureEntraIDTokenProviderConfig] = (
401
- None
402
- )
403
-
404
- @staticmethod
405
- def _supported_azure_oauth() -> (
406
- Dict[AzureEntraIDOAuthType, Type[AzureEntraIDTokenProviderConfig]]
407
- ):
408
- """Returns a mapping of supported Azure Entra ID OAuth types to their"""
409
- return {
410
- AzureEntraIDOAuthType.AZURE_ENTRA_ID_DEFAULT: AzureEntraIDDefaultCredentialsConfig,
411
- AzureEntraIDOAuthType.AZURE_ENTRA_ID_CLIENT_SECRET: AzureEntraIDClientCredentialsConfig,
412
- AzureEntraIDOAuthType.AZURE_ENTRA_ID_CLIENT_CERTIFICATE: AzureEntraIDClientCertificateConfig,
413
- }
414
-
415
- @staticmethod
416
- def _get_azure_oauth_by_type(
417
- oauth_type: AzureEntraIDOAuthType,
418
- ) -> Type[AzureEntraIDTokenProviderConfig]:
419
- """Returns the Azure Entra ID OAuth class based on the type.
420
-
421
- Args:
422
- oauth_type: (AzureOAuthType) The type of the Azure Entra ID OAuth.
423
-
424
- Returns:
425
- The Azure Entra ID OAuth class
426
-
427
- Raises:
428
- ValueError: If the passed oauth_type is not supported or invalid.
429
- """
430
- azure_oauth_types = AzureEntraIDOAuthConfig._supported_azure_oauth()
431
- azure_oauth_class = azure_oauth_types.get(oauth_type)
432
-
433
- if azure_oauth_class is None:
434
- message = (
435
- f"Unsupported Azure Entra ID oauth type: {oauth_type}. "
436
- f"Supported types are: {AzureEntraIDOAuthType.valid_string_values()}"
437
- )
438
- structlogger.error(
439
- "azure_oauth_config.unsupported_azure_oauth_type",
440
- message=message,
441
- )
442
- raise ValueError(message)
443
-
444
- return azure_oauth_class
445
-
446
- @classmethod
447
- def from_config(cls, oauth_config: Dict[str, Any]) -> AzureEntraIDOAuthConfig:
448
- """Initializes a dataclass from the passed config.
449
-
450
- Args:
451
- oauth_config: (dict) The config from which to initialize.
452
-
453
- Returns:
454
- AzureOAuthConfig
455
- """
456
- scopes = AzureEntraIDOAuthConfig._read_scopes_from_config(oauth_config)
457
- azure_credentials = (
458
- AzureEntraIDOAuthConfig._create_azure_entra_id_client_from_config(
459
- oauth_config
460
- )
461
- )
462
- return cls(
463
- azure_entra_id_token_provider_config=azure_credentials, scopes=scopes
464
- )
465
-
466
- @staticmethod
467
- def _read_scopes_from_config(oauth_config: Dict[str, Any]) -> List[str]:
468
- """Reads scopes from the configuration.
469
-
470
- The original scopes are removed from the configuration.
471
-
472
- Args:
473
- oauth_config: (dict) The configuration from which to read the scopes.
474
-
475
- Returns:
476
- List[str]: The list of scopes.
477
- """
478
- scopes = oauth_config.pop(AZURE_SCOPES_FIELD, "")
479
-
480
- if not scopes:
481
- message = "Azure Entra ID scopes cannot be empty."
482
- structlogger.error(
483
- "azure_oauth_config.scopes_empty",
484
- message=message,
485
- )
486
- raise ValueError(message)
487
-
488
- if isinstance(scopes, str):
489
- scopes = [scopes]
490
-
491
- return scopes
492
-
493
- @staticmethod
494
- def _create_azure_entra_id_client_from_config(
495
- oauth_config: Dict[str, Any],
496
- ) -> AzureEntraIDTokenProviderConfig:
497
- """Creates an Azure Entra ID client from the configuration.
498
-
499
- Args:
500
- oauth_config: (dict) The configuration from which to create the credential.
501
-
502
- Returns:
503
- AzureEntraIDTokenProviderConfig: The Azure OAuth credential.
504
- """
505
-
506
- oauth_type = AzureEntraIDOAuthType.from_string(
507
- oauth_config.pop(OAUTH_TYPE_FIELD, None)
508
- )
509
-
510
- if oauth_type == AzureEntraIDOAuthType.INVALID:
511
- message = (
512
- "Azure Entra ID oauth configuration must contain "
513
- f"'{OAUTH_TYPE_FIELD}' field and it must be set to one of the "
514
- f"following values: {AzureEntraIDOAuthType.valid_string_values()}, "
515
- )
516
- structlogger.error(
517
- "azure_oauth_config.missing_azure_oauth_type",
518
- message=message,
519
- )
520
- raise ValueError(message)
521
-
522
- azure_oauth_class = AzureEntraIDOAuthConfig._get_azure_oauth_by_type(oauth_type)
523
- return azure_oauth_class.from_config(oauth_config)
524
-
525
- def _create_azure_credential(
526
- self,
527
- ) -> TokenProvider:
528
- """Create an Azure Entra ID client which can be used to get a bearer token."""
529
- return self.azure_entra_id_token_provider_config.create_azure_token_provider()
530
-
531
- def get_bearer_token(self) -> str:
532
- """Returns a bearer token."""
533
- return self._create_azure_credential().get_token(*self.scopes).token
@@ -1,33 +0,0 @@
1
- import abc
2
- from typing import Any, Dict, TypeVar
3
-
4
- OAUTH_TYPE_FIELD = "type"
5
- OAUTH_KEY = "oauth"
6
-
7
- OAuthType = TypeVar("OAuthType", bound="OAuth")
8
-
9
-
10
- class OAuth(abc.ABC):
11
- """Interface for OAuth configuration."""
12
-
13
- @classmethod
14
- @abc.abstractmethod
15
- def from_config(cls: OAuthType, config: Dict[str, Any]) -> OAuthType:
16
- """Initializes a dataclass from the passed config.
17
-
18
- Args:
19
- config: (dict) The config from which to initialize.
20
-
21
- Returns:
22
- OAuth
23
- """
24
- ...
25
-
26
- @abc.abstractmethod
27
- def get_bearer_token(self) -> str:
28
- """Returns a bearer token.
29
-
30
- Bear token is used to authenticate requests to the Azure Oopen AI instance's API protected
31
- by the Gateway.
32
- """
33
- ...
@@ -1,6 +0,0 @@
1
- DEFAULT_AZURE_API_KEY_NAME = "AZURE_API_KEY"
2
- LITE_LLM_API_BASE_FIELD = "api_base"
3
- LITE_LLM_API_KEY_FIELD = "api_key"
4
- LITE_LLM_API_VERSION_FIELD = "api_version"
5
- LITE_LLM_MODEL_FIELD = "model"
6
- LITE_LLM_AZURE_AD_TOKEN = "azure_ad_token"