rasa-pro 3.11.4__py3-none-any.whl → 3.12.0__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 (580) hide show
  1. README.md +10 -13
  2. rasa/__main__.py +7 -7
  3. rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
  4. rasa/anonymization/anonymization_pipeline.py +3 -3
  5. rasa/anonymization/anonymization_rule_executor.py +17 -11
  6. rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
  7. rasa/cli/arguments/data.py +2 -2
  8. rasa/cli/arguments/default_arguments.py +1 -1
  9. rasa/cli/arguments/evaluate.py +2 -1
  10. rasa/cli/arguments/interactive.py +1 -1
  11. rasa/cli/arguments/run.py +1 -1
  12. rasa/cli/arguments/test.py +7 -5
  13. rasa/cli/arguments/train.py +3 -3
  14. rasa/cli/arguments/visualize.py +2 -2
  15. rasa/cli/arguments/x.py +1 -0
  16. rasa/cli/data.py +20 -3
  17. rasa/cli/dialogue_understanding_test.py +386 -0
  18. rasa/cli/evaluate.py +1 -1
  19. rasa/cli/export.py +6 -6
  20. rasa/cli/inspect.py +20 -1
  21. rasa/cli/interactive.py +4 -5
  22. rasa/cli/llm_fine_tuning.py +51 -16
  23. rasa/cli/markers.py +1 -2
  24. rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
  25. rasa/cli/project_templates/calm/config.yml +2 -2
  26. rasa/cli/project_templates/calm/domain/list_contacts.yml +1 -2
  27. rasa/cli/project_templates/calm/domain/remove_contact.yml +1 -2
  28. rasa/cli/project_templates/calm/domain/shared.yml +1 -4
  29. rasa/cli/project_templates/calm/endpoints.yml +2 -2
  30. rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
  31. rasa/cli/shell.py +5 -6
  32. rasa/cli/studio/download.py +1 -2
  33. rasa/cli/studio/studio.py +2 -3
  34. rasa/cli/studio/train.py +0 -1
  35. rasa/cli/telemetry.py +2 -2
  36. rasa/cli/test.py +11 -11
  37. rasa/cli/train.py +3 -0
  38. rasa/cli/utils.py +25 -5
  39. rasa/constants.py +0 -1
  40. rasa/core/__init__.py +0 -1
  41. rasa/core/actions/action.py +137 -208
  42. rasa/core/actions/action_handle_digressions.py +164 -0
  43. rasa/core/actions/action_hangup.py +1 -1
  44. rasa/core/actions/action_repeat_bot_messages.py +2 -2
  45. rasa/core/actions/action_run_slot_rejections.py +18 -6
  46. rasa/core/actions/action_trigger_chitchat.py +1 -1
  47. rasa/core/actions/action_trigger_flow.py +5 -5
  48. rasa/core/actions/action_trigger_search.py +1 -1
  49. rasa/core/actions/custom_action_executor.py +1 -1
  50. rasa/core/actions/direct_custom_actions_executor.py +1 -0
  51. rasa/core/actions/forms.py +22 -15
  52. rasa/core/actions/http_custom_action_executor.py +8 -1
  53. rasa/core/actions/loops.py +3 -3
  54. rasa/core/actions/two_stage_fallback.py +13 -13
  55. rasa/core/auth_retry_tracker_store.py +1 -2
  56. rasa/core/brokers/broker.py +2 -1
  57. rasa/core/brokers/file.py +1 -1
  58. rasa/core/brokers/kafka.py +8 -8
  59. rasa/core/brokers/pika.py +8 -9
  60. rasa/core/brokers/sql.py +4 -3
  61. rasa/core/channels/__init__.py +7 -0
  62. rasa/core/channels/botframework.py +2 -2
  63. rasa/core/channels/callback.py +4 -4
  64. rasa/core/channels/channel.py +11 -11
  65. rasa/core/channels/console.py +0 -1
  66. rasa/core/channels/development_inspector.py +80 -24
  67. rasa/core/channels/facebook.py +5 -5
  68. rasa/core/channels/hangouts.py +7 -8
  69. rasa/core/channels/inspector/dist/assets/Tableau10-1b767f5e.js +1 -0
  70. rasa/core/channels/inspector/dist/assets/arc-9f1365dc.js +1 -0
  71. rasa/core/channels/inspector/dist/assets/blockDiagram-38ab4fdb-e0f81b12.js +118 -0
  72. rasa/core/channels/inspector/dist/assets/c4Diagram-3d4e48cf-9deaee1c.js +10 -0
  73. rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
  74. rasa/core/channels/inspector/dist/assets/classDiagram-70f12bd4-20450a96.js +2 -0
  75. rasa/core/channels/inspector/dist/assets/classDiagram-v2-f2320105-749d2abf.js +2 -0
  76. rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
  77. rasa/core/channels/inspector/dist/assets/{createText-62fc7601-89c73b31.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/edges-e0da2a9e-943801a7.js +4 -0
  79. rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-907e0440.js → erDiagram-9861fffd-d523a948.js} +4 -4
  80. rasa/core/channels/inspector/dist/assets/flowDb-956e92f1-54e4cf19.js +10 -0
  81. rasa/core/channels/inspector/dist/assets/flowDiagram-66a62f08-48bfbbe8.js +4 -0
  82. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
  83. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-4a651766-17c30827.js +139 -0
  84. rasa/core/channels/inspector/dist/assets/ganttDiagram-c361ad54-43086f2d.js +257 -0
  85. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-72cf32ee-5c8b693e.js +70 -0
  86. rasa/core/channels/inspector/dist/assets/graph-41a90d26.js +1 -0
  87. rasa/core/channels/inspector/dist/assets/index-3862675e-b43eeae9.js +1 -0
  88. rasa/core/channels/inspector/dist/assets/{index-e793d777.js → index-e8affe45.js} +201 -196
  89. rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-8ceba4db.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-960d3809.js → journeyDiagram-49397b02-39bce7b5.js} +4 -4
  91. rasa/core/channels/inspector/dist/assets/katex-498eb57e.js +261 -0
  92. rasa/core/channels/inspector/dist/assets/layout-dc8eeea4.js +1 -0
  93. rasa/core/channels/inspector/dist/assets/{line-eeccc4e2.js → line-c4d2e756.js} +1 -1
  94. rasa/core/channels/inspector/dist/assets/linear-86f6f2d9.js +1 -0
  95. rasa/core/channels/inspector/dist/assets/mindmap-definition-fc14e90a-4216f771.js +312 -0
  96. rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-dc9b5e1b.js → pieDiagram-8a3498a8-1a0cfa96.js} +7 -7
  97. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-a08cba6d.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
  98. rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-87242b9e.js → requirementDiagram-deff3bca-d4046bed.js} +2 -2
  99. rasa/core/channels/inspector/dist/assets/sankeyDiagram-04a897e0-2cf6d1d7.js +8 -0
  100. rasa/core/channels/inspector/dist/assets/sequenceDiagram-704730f1-751ac4f5.js +122 -0
  101. rasa/core/channels/inspector/dist/assets/stateDiagram-587899a1-f734f4d4.js +1 -0
  102. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-d93cdb3a-91c65710.js +1 -0
  103. rasa/core/channels/inspector/dist/assets/{styles-9c745c82-cef936a6.js → styles-6aaf32cf-e0cff7be.js} +1 -1
  104. rasa/core/channels/inspector/dist/assets/styles-9a916d00-c8029e5d.js +160 -0
  105. rasa/core/channels/inspector/dist/assets/styles-c10674c1-114f312a.js +116 -0
  106. rasa/core/channels/inspector/dist/assets/svgDrawCommon-08f97a94-b7b9dc00.js +1 -0
  107. rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-0d39bdb2.js → timeline-definition-85554ec2-9536d189.js} +3 -3
  108. rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-a03fa445.js → xychartDiagram-e933f94c-bf3b0f36.js} +3 -3
  109. rasa/core/channels/inspector/dist/index.html +1 -1
  110. rasa/core/channels/inspector/package.json +11 -3
  111. rasa/core/channels/inspector/src/App.tsx +15 -2
  112. rasa/core/channels/inspector/src/components/RasaLogo.tsx +31 -0
  113. rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +68 -0
  114. rasa/core/channels/inspector/src/components/Welcome.tsx +19 -13
  115. rasa/core/channels/inspector/yarn.lock +94 -99
  116. rasa/core/channels/mattermost.py +4 -4
  117. rasa/core/channels/rasa_chat.py +4 -4
  118. rasa/core/channels/rest.py +11 -12
  119. rasa/core/channels/rocketchat.py +4 -3
  120. rasa/core/channels/slack.py +6 -5
  121. rasa/core/channels/socketio.py +8 -28
  122. rasa/core/channels/studio_chat.py +212 -0
  123. rasa/core/channels/telegram.py +105 -55
  124. rasa/core/channels/twilio.py +3 -3
  125. rasa/core/channels/vier_cvg.py +2 -2
  126. rasa/core/channels/voice_ready/audiocodes.py +51 -32
  127. rasa/core/channels/voice_ready/jambonz.py +5 -5
  128. rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
  129. rasa/core/channels/voice_ready/twilio_voice.py +9 -8
  130. rasa/core/channels/voice_ready/utils.py +2 -2
  131. rasa/core/channels/voice_stream/asr/asr_engine.py +12 -6
  132. rasa/core/channels/voice_stream/asr/asr_event.py +5 -0
  133. rasa/core/channels/voice_stream/asr/azure.py +16 -3
  134. rasa/core/channels/voice_stream/asr/deepgram.py +76 -19
  135. rasa/core/channels/voice_stream/audiocodes.py +292 -0
  136. rasa/core/channels/voice_stream/browser_audio.py +14 -7
  137. rasa/core/channels/voice_stream/call_state.py +6 -2
  138. rasa/core/channels/voice_stream/genesys.py +320 -0
  139. rasa/core/channels/voice_stream/tts/azure.py +13 -5
  140. rasa/core/channels/voice_stream/tts/cartesia.py +34 -14
  141. rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
  142. rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
  143. rasa/core/channels/voice_stream/twilio_media_streams.py +12 -8
  144. rasa/core/channels/voice_stream/util.py +1 -1
  145. rasa/core/channels/voice_stream/voice_channel.py +100 -56
  146. rasa/core/channels/webexteams.py +3 -4
  147. rasa/core/constants.py +2 -0
  148. rasa/core/evaluation/marker.py +7 -6
  149. rasa/core/evaluation/marker_base.py +15 -16
  150. rasa/core/evaluation/marker_stats.py +3 -4
  151. rasa/core/evaluation/marker_tracker_loader.py +5 -4
  152. rasa/core/exporter.py +4 -4
  153. rasa/core/featurizers/precomputation.py +8 -8
  154. rasa/core/featurizers/single_state_featurizer.py +7 -7
  155. rasa/core/featurizers/tracker_featurizers.py +13 -13
  156. rasa/core/http_interpreter.py +3 -4
  157. rasa/core/information_retrieval/__init__.py +1 -1
  158. rasa/core/information_retrieval/faiss.py +4 -4
  159. rasa/core/information_retrieval/information_retrieval.py +2 -2
  160. rasa/core/information_retrieval/milvus.py +3 -3
  161. rasa/core/information_retrieval/qdrant.py +3 -3
  162. rasa/core/jobs.py +1 -0
  163. rasa/core/lock.py +2 -3
  164. rasa/core/lock_store.py +3 -3
  165. rasa/core/migrate.py +12 -9
  166. rasa/core/nlg/__init__.py +1 -1
  167. rasa/core/nlg/callback.py +2 -3
  168. rasa/core/nlg/contextual_response_rephraser.py +82 -14
  169. rasa/core/nlg/generator.py +85 -17
  170. rasa/core/nlg/interpolator.py +4 -3
  171. rasa/core/nlg/response.py +9 -7
  172. rasa/core/nlg/summarize.py +1 -0
  173. rasa/core/nlg/translate.py +55 -0
  174. rasa/core/persistor.py +3 -3
  175. rasa/core/policies/ensemble.py +10 -9
  176. rasa/core/policies/enterprise_search_policy.py +87 -21
  177. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +1 -1
  178. rasa/core/policies/flow_policy.py +13 -14
  179. rasa/core/policies/flows/flow_executor.py +85 -55
  180. rasa/core/policies/intentless_policy.py +6 -7
  181. rasa/core/policies/memoization.py +22 -20
  182. rasa/core/policies/policy.py +24 -22
  183. rasa/core/policies/rule_policy.py +37 -36
  184. rasa/core/policies/ted_policy.py +87 -85
  185. rasa/core/policies/unexpected_intent_policy.py +77 -75
  186. rasa/core/processor.py +167 -74
  187. rasa/core/run.py +5 -4
  188. rasa/core/secrets_manager/endpoints.py +2 -3
  189. rasa/core/secrets_manager/factory.py +2 -3
  190. rasa/core/secrets_manager/secret_manager.py +2 -3
  191. rasa/core/secrets_manager/vault.py +2 -2
  192. rasa/core/test.py +30 -30
  193. rasa/core/tracker_store.py +138 -49
  194. rasa/core/train.py +1 -1
  195. rasa/core/training/__init__.py +2 -2
  196. rasa/core/training/converters/responses_prefix_converter.py +1 -2
  197. rasa/core/training/interactive.py +13 -13
  198. rasa/core/training/story_conflict.py +4 -5
  199. rasa/core/training/training.py +3 -5
  200. rasa/core/utils.py +5 -5
  201. rasa/core/visualize.py +1 -1
  202. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
  203. rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
  204. rasa/dialogue_understanding/commands/__init__.py +22 -22
  205. rasa/dialogue_understanding/commands/can_not_handle_command.py +38 -1
  206. rasa/dialogue_understanding/commands/cancel_flow_command.py +96 -9
  207. rasa/dialogue_understanding/commands/change_flow_command.py +36 -2
  208. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +36 -4
  209. rasa/dialogue_understanding/commands/clarify_command.py +46 -4
  210. rasa/dialogue_understanding/commands/command.py +3 -2
  211. rasa/dialogue_understanding/commands/command_syntax_manager.py +55 -0
  212. rasa/dialogue_understanding/commands/correct_slots_command.py +14 -5
  213. rasa/dialogue_understanding/commands/error_command.py +1 -1
  214. rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
  215. rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
  216. rasa/dialogue_understanding/commands/handle_digressions_command.py +144 -0
  217. rasa/dialogue_understanding/commands/human_handoff_command.py +34 -4
  218. rasa/dialogue_understanding/commands/knowledge_answer_command.py +36 -4
  219. rasa/dialogue_understanding/commands/noop_command.py +2 -1
  220. rasa/dialogue_understanding/commands/prompt_command.py +94 -0
  221. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +34 -4
  222. rasa/dialogue_understanding/commands/restart_command.py +2 -5
  223. rasa/dialogue_understanding/commands/session_end_command.py +3 -5
  224. rasa/dialogue_understanding/commands/session_start_command.py +3 -5
  225. rasa/dialogue_understanding/commands/set_slot_command.py +55 -16
  226. rasa/dialogue_understanding/commands/skip_question_command.py +34 -4
  227. rasa/dialogue_understanding/commands/start_flow_command.py +78 -2
  228. rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
  229. rasa/dialogue_understanding/commands/utils.py +126 -43
  230. rasa/dialogue_understanding/constants.py +2 -0
  231. rasa/dialogue_understanding/generator/__init__.py +2 -0
  232. rasa/dialogue_understanding/generator/command_generator.py +120 -79
  233. rasa/dialogue_understanding/generator/command_parser.py +245 -0
  234. rasa/dialogue_understanding/generator/constants.py +12 -4
  235. rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
  236. rasa/dialogue_understanding/generator/llm_based_command_generator.py +187 -59
  237. rasa/dialogue_understanding/generator/llm_command_generator.py +6 -3
  238. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +106 -110
  239. rasa/dialogue_understanding/generator/nlu_command_adapter.py +53 -11
  240. rasa/dialogue_understanding/generator/prompt_templates/__init__.py +0 -0
  241. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +58 -0
  242. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +57 -0
  243. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +574 -0
  244. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +41 -386
  245. rasa/dialogue_understanding/generator/utils.py +76 -0
  246. rasa/dialogue_understanding/patterns/cancel.py +2 -1
  247. rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
  248. rasa/dialogue_understanding/patterns/chitchat.py +1 -1
  249. rasa/dialogue_understanding/patterns/clarify.py +2 -1
  250. rasa/dialogue_understanding/patterns/code_change.py +2 -0
  251. rasa/dialogue_understanding/patterns/collect_information.py +7 -4
  252. rasa/dialogue_understanding/patterns/completed.py +1 -1
  253. rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -1
  254. rasa/dialogue_understanding/patterns/correction.py +17 -3
  255. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +78 -2
  256. rasa/dialogue_understanding/patterns/handle_digressions.py +81 -0
  257. rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
  258. rasa/dialogue_understanding/patterns/internal_error.py +1 -0
  259. rasa/dialogue_understanding/patterns/search.py +1 -1
  260. rasa/dialogue_understanding/patterns/session_start.py +1 -1
  261. rasa/dialogue_understanding/patterns/skip_question.py +1 -0
  262. rasa/dialogue_understanding/patterns/user_silence.py +1 -1
  263. rasa/dialogue_understanding/patterns/validate_slot.py +65 -0
  264. rasa/dialogue_understanding/processor/command_processor.py +193 -43
  265. rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
  266. rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
  267. rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
  268. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
  269. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
  270. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
  271. rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
  272. rasa/dialogue_understanding/stack/utils.py +56 -10
  273. rasa/dialogue_understanding/utils.py +164 -0
  274. rasa/dialogue_understanding_test/README.md +429 -0
  275. rasa/dialogue_understanding_test/__init__.py +0 -0
  276. rasa/dialogue_understanding_test/command_comparison.py +60 -0
  277. rasa/dialogue_understanding_test/command_metric_calculation.py +122 -0
  278. rasa/dialogue_understanding_test/constants.py +22 -0
  279. rasa/dialogue_understanding_test/du_test_case.py +448 -0
  280. rasa/dialogue_understanding_test/du_test_result.py +390 -0
  281. rasa/dialogue_understanding_test/du_test_runner.py +322 -0
  282. rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
  283. rasa/dialogue_understanding_test/io.py +443 -0
  284. rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
  285. rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
  286. rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
  287. rasa/dialogue_understanding_test/utils.py +70 -0
  288. rasa/dialogue_understanding_test/validation.py +77 -0
  289. rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
  290. rasa/e2e_test/assertions.py +202 -175
  291. rasa/e2e_test/assertions_schema.yml +6 -0
  292. rasa/e2e_test/constants.py +16 -1
  293. rasa/e2e_test/e2e_config.py +102 -41
  294. rasa/e2e_test/e2e_config_schema.yml +28 -10
  295. rasa/e2e_test/e2e_test_case.py +5 -5
  296. rasa/e2e_test/e2e_test_converter.py +2 -3
  297. rasa/e2e_test/e2e_test_coverage_report.py +6 -6
  298. rasa/e2e_test/e2e_test_result.py +1 -1
  299. rasa/e2e_test/e2e_test_runner.py +143 -38
  300. rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2 +93 -0
  301. rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2 +169 -0
  302. rasa/e2e_test/stub_custom_action.py +1 -1
  303. rasa/e2e_test/utils/generative_assertions.py +243 -0
  304. rasa/e2e_test/utils/io.py +123 -93
  305. rasa/e2e_test/utils/validation.py +101 -3
  306. rasa/engine/caching.py +5 -7
  307. rasa/engine/constants.py +1 -1
  308. rasa/engine/graph.py +3 -2
  309. rasa/engine/language.py +182 -0
  310. rasa/engine/recipes/config_files/default_config.yml +4 -0
  311. rasa/engine/recipes/default_components.py +13 -15
  312. rasa/engine/recipes/default_recipe.py +65 -49
  313. rasa/engine/recipes/graph_recipe.py +10 -7
  314. rasa/engine/recipes/recipe.py +2 -2
  315. rasa/engine/runner/dask.py +2 -2
  316. rasa/engine/runner/interface.py +1 -0
  317. rasa/engine/storage/local_model_storage.py +6 -4
  318. rasa/engine/storage/resource.py +2 -1
  319. rasa/engine/storage/storage.py +8 -3
  320. rasa/engine/training/components.py +2 -1
  321. rasa/engine/training/fingerprinting.py +4 -2
  322. rasa/engine/training/graph_trainer.py +4 -4
  323. rasa/engine/training/hooks.py +2 -2
  324. rasa/engine/validation.py +36 -33
  325. rasa/exceptions.py +3 -2
  326. rasa/graph_components/converters/nlu_message_converter.py +3 -3
  327. rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
  328. rasa/graph_components/providers/domain_provider.py +3 -2
  329. rasa/graph_components/providers/flows_provider.py +2 -3
  330. rasa/graph_components/providers/forms_provider.py +4 -4
  331. rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
  332. rasa/graph_components/providers/responses_provider.py +4 -4
  333. rasa/graph_components/providers/rule_only_provider.py +3 -2
  334. rasa/graph_components/providers/story_graph_provider.py +8 -8
  335. rasa/graph_components/providers/training_tracker_provider.py +3 -2
  336. rasa/graph_components/validators/default_recipe_validator.py +16 -16
  337. rasa/graph_components/validators/finetuning_validator.py +10 -8
  338. rasa/hooks.py +19 -14
  339. rasa/jupyter.py +2 -2
  340. rasa/llm_fine_tuning/annotation_module.py +4 -4
  341. rasa/llm_fine_tuning/conversations.py +5 -33
  342. rasa/llm_fine_tuning/llm_data_preparation_module.py +6 -4
  343. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
  344. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +18 -13
  345. rasa/llm_fine_tuning/paraphrasing_module.py +6 -2
  346. rasa/llm_fine_tuning/storage.py +3 -3
  347. rasa/llm_fine_tuning/train_test_split_module.py +27 -27
  348. rasa/llm_fine_tuning/utils.py +7 -0
  349. rasa/markers/marker.py +2 -3
  350. rasa/markers/marker_base.py +1 -2
  351. rasa/markers/upload.py +2 -2
  352. rasa/markers/validate.py +2 -3
  353. rasa/model.py +3 -5
  354. rasa/model_manager/config.py +1 -1
  355. rasa/model_manager/model_api.py +5 -4
  356. rasa/model_manager/runner_service.py +13 -10
  357. rasa/model_manager/socket_bridge.py +15 -9
  358. rasa/model_manager/studio_jwt_auth.py +1 -0
  359. rasa/model_manager/trainer_service.py +9 -7
  360. rasa/model_manager/utils.py +1 -1
  361. rasa/model_manager/warm_rasa_process.py +14 -9
  362. rasa/model_service.py +5 -6
  363. rasa/model_testing.py +13 -15
  364. rasa/model_training.py +29 -29
  365. rasa/nlu/classifiers/diet_classifier.py +72 -73
  366. rasa/nlu/classifiers/fallback_classifier.py +9 -8
  367. rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
  368. rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
  369. rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
  370. rasa/nlu/classifiers/regex_message_handler.py +3 -2
  371. rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
  372. rasa/nlu/convert.py +2 -2
  373. rasa/nlu/emulators/dialogflow.py +3 -3
  374. rasa/nlu/emulators/luis.py +5 -5
  375. rasa/nlu/emulators/no_emulator.py +1 -0
  376. rasa/nlu/emulators/wit.py +4 -4
  377. rasa/nlu/extractors/crf_entity_extractor.py +11 -11
  378. rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
  379. rasa/nlu/extractors/entity_synonyms.py +10 -9
  380. rasa/nlu/extractors/extractor.py +16 -16
  381. rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
  382. rasa/nlu/extractors/regex_entity_extractor.py +11 -10
  383. rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
  384. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
  385. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
  386. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
  387. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
  388. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
  389. rasa/nlu/featurizers/featurizer.py +5 -4
  390. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
  391. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
  392. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
  393. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
  394. rasa/nlu/model.py +0 -1
  395. rasa/nlu/selectors/response_selector.py +67 -68
  396. rasa/nlu/test.py +38 -38
  397. rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
  398. rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
  399. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
  400. rasa/nlu/tokenizers/tokenizer.py +6 -7
  401. rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
  402. rasa/nlu/utils/bilou_utils.py +7 -7
  403. rasa/nlu/utils/hugging_face/registry.py +22 -22
  404. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
  405. rasa/nlu/utils/mitie_utils.py +2 -1
  406. rasa/nlu/utils/pattern_utils.py +1 -1
  407. rasa/nlu/utils/spacy_utils.py +3 -3
  408. rasa/plugin.py +12 -1
  409. rasa/server.py +6 -3
  410. rasa/shared/constants.py +45 -18
  411. rasa/shared/core/command_payload_reader.py +15 -7
  412. rasa/shared/core/constants.py +34 -4
  413. rasa/shared/core/conversation.py +1 -2
  414. rasa/shared/core/domain.py +19 -20
  415. rasa/shared/core/events.py +60 -39
  416. rasa/shared/core/flows/__init__.py +0 -1
  417. rasa/shared/core/flows/constants.py +11 -0
  418. rasa/shared/core/flows/flow.py +107 -26
  419. rasa/shared/core/flows/flow_step.py +4 -3
  420. rasa/shared/core/flows/flow_step_links.py +1 -2
  421. rasa/shared/core/flows/flow_step_sequence.py +1 -1
  422. rasa/shared/core/flows/flows_list.py +3 -3
  423. rasa/shared/core/flows/flows_yaml_schema.json +69 -3
  424. rasa/shared/core/flows/nlu_trigger.py +1 -1
  425. rasa/shared/core/flows/steps/__init__.py +2 -2
  426. rasa/shared/core/flows/steps/action.py +1 -1
  427. rasa/shared/core/flows/steps/call.py +1 -1
  428. rasa/shared/core/flows/steps/collect.py +22 -40
  429. rasa/shared/core/flows/steps/internal.py +1 -1
  430. rasa/shared/core/flows/steps/link.py +1 -1
  431. rasa/shared/core/flows/steps/no_operation.py +2 -2
  432. rasa/shared/core/flows/steps/set_slots.py +1 -1
  433. rasa/shared/core/flows/utils.py +44 -4
  434. rasa/shared/core/flows/validation.py +4 -6
  435. rasa/shared/core/generator.py +20 -21
  436. rasa/shared/core/slot_mappings.py +360 -121
  437. rasa/shared/core/slots.py +163 -6
  438. rasa/shared/core/trackers.py +108 -33
  439. rasa/shared/core/training_data/loading.py +1 -1
  440. rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
  441. rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
  442. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
  443. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
  444. rasa/shared/core/training_data/structures.py +11 -12
  445. rasa/shared/core/training_data/visualization.py +10 -10
  446. rasa/shared/data.py +6 -6
  447. rasa/shared/engine/caching.py +0 -1
  448. rasa/shared/exceptions.py +2 -2
  449. rasa/shared/importers/importer.py +58 -2
  450. rasa/shared/importers/rasa.py +5 -6
  451. rasa/shared/importers/utils.py +1 -1
  452. rasa/shared/nlu/constants.py +9 -0
  453. rasa/shared/nlu/training_data/entities_parser.py +6 -6
  454. rasa/shared/nlu/training_data/features.py +3 -3
  455. rasa/shared/nlu/training_data/formats/__init__.py +1 -1
  456. rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
  457. rasa/shared/nlu/training_data/formats/luis.py +7 -8
  458. rasa/shared/nlu/training_data/formats/rasa.py +4 -5
  459. rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
  460. rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
  461. rasa/shared/nlu/training_data/formats/wit.py +3 -4
  462. rasa/shared/nlu/training_data/loading.py +4 -4
  463. rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
  464. rasa/shared/nlu/training_data/message.py +13 -14
  465. rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
  466. rasa/shared/nlu/training_data/schemas/responses.yml +19 -11
  467. rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
  468. rasa/shared/nlu/training_data/training_data.py +12 -13
  469. rasa/shared/nlu/training_data/util.py +11 -10
  470. rasa/shared/providers/_configs/azure_entra_id_config.py +541 -0
  471. rasa/shared/providers/_configs/azure_openai_client_config.py +150 -15
  472. rasa/shared/providers/_configs/client_config.py +3 -1
  473. rasa/shared/providers/_configs/default_litellm_client_config.py +9 -7
  474. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +13 -11
  475. rasa/shared/providers/_configs/litellm_router_client_config.py +12 -10
  476. rasa/shared/providers/_configs/model_group_config.py +8 -5
  477. rasa/shared/providers/_configs/oauth_config.py +33 -0
  478. rasa/shared/providers/_configs/openai_client_config.py +14 -12
  479. rasa/shared/providers/_configs/rasa_llm_client_config.py +5 -3
  480. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +12 -11
  481. rasa/shared/providers/_configs/utils.py +1 -0
  482. rasa/shared/providers/_ssl_verification_utils.py +5 -6
  483. rasa/shared/providers/_utils.py +5 -5
  484. rasa/shared/providers/constants.py +6 -0
  485. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
  486. rasa/shared/providers/embedding/azure_openai_embedding_client.py +32 -7
  487. rasa/shared/providers/embedding/embedding_client.py +1 -1
  488. rasa/shared/providers/embedding/litellm_router_embedding_client.py +5 -2
  489. rasa/shared/providers/llm/_base_litellm_client.py +43 -18
  490. rasa/shared/providers/llm/azure_openai_llm_client.py +90 -34
  491. rasa/shared/providers/llm/default_litellm_llm_client.py +4 -2
  492. rasa/shared/providers/llm/litellm_router_llm_client.py +32 -9
  493. rasa/shared/providers/llm/llm_client.py +24 -8
  494. rasa/shared/providers/llm/llm_response.py +61 -2
  495. rasa/shared/providers/llm/openai_llm_client.py +11 -5
  496. rasa/shared/providers/llm/rasa_llm_client.py +17 -14
  497. rasa/shared/providers/llm/self_hosted_llm_client.py +35 -15
  498. rasa/shared/providers/mappings.py +18 -19
  499. rasa/shared/providers/router/_base_litellm_router_client.py +48 -15
  500. rasa/shared/providers/router/router_client.py +3 -1
  501. rasa/shared/utils/cli.py +1 -1
  502. rasa/shared/utils/common.py +15 -1
  503. rasa/shared/utils/constants.py +3 -0
  504. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
  505. rasa/shared/utils/health_check/health_check.py +3 -3
  506. rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
  507. rasa/shared/utils/io.py +1 -1
  508. rasa/shared/utils/llm.py +100 -18
  509. rasa/shared/utils/pykwalify_extensions.py +25 -1
  510. rasa/shared/utils/schemas/domain.yml +26 -1
  511. rasa/shared/utils/schemas/events.py +1 -1
  512. rasa/shared/utils/yaml.py +24 -20
  513. rasa/studio/auth.py +3 -3
  514. rasa/studio/config.py +1 -2
  515. rasa/studio/data_handler.py +3 -3
  516. rasa/studio/download.py +1 -1
  517. rasa/studio/results_logger.py +3 -3
  518. rasa/studio/upload.py +21 -5
  519. rasa/telemetry.py +127 -48
  520. rasa/tracing/config.py +5 -3
  521. rasa/tracing/constants.py +12 -0
  522. rasa/tracing/instrumentation/attribute_extractors.py +92 -14
  523. rasa/tracing/instrumentation/instrumentation.py +61 -5
  524. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
  525. rasa/tracing/instrumentation/metrics.py +52 -11
  526. rasa/tracing/metric_instrument_provider.py +54 -14
  527. rasa/utils/common.py +12 -24
  528. rasa/utils/endpoints.py +1 -1
  529. rasa/utils/io.py +7 -7
  530. rasa/utils/licensing.py +3 -4
  531. rasa/utils/log_utils.py +7 -6
  532. rasa/utils/ml_utils.py +1 -0
  533. rasa/utils/plotting.py +3 -3
  534. rasa/utils/sanic_error_handler.py +1 -1
  535. rasa/utils/tensorflow/callback.py +2 -2
  536. rasa/utils/tensorflow/crf.py +2 -2
  537. rasa/utils/tensorflow/data_generator.py +5 -5
  538. rasa/utils/tensorflow/environment.py +3 -3
  539. rasa/utils/tensorflow/feature_array.py +2 -3
  540. rasa/utils/tensorflow/layers.py +18 -12
  541. rasa/utils/tensorflow/layers_utils.py +2 -1
  542. rasa/utils/tensorflow/metrics.py +2 -2
  543. rasa/utils/tensorflow/model_data.py +7 -7
  544. rasa/utils/tensorflow/model_data_utils.py +10 -9
  545. rasa/utils/tensorflow/models.py +31 -32
  546. rasa/utils/tensorflow/rasa_layers.py +20 -19
  547. rasa/utils/tensorflow/types.py +2 -1
  548. rasa/utils/train_utils.py +23 -21
  549. rasa/utils/url_tools.py +1 -1
  550. rasa/validator.py +594 -115
  551. rasa/version.py +1 -1
  552. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/METADATA +23 -26
  553. rasa_pro-3.12.0.dist-info/RECORD +829 -0
  554. rasa/core/channels/inspector/dist/assets/arc-632a63ec.js +0 -1
  555. rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-081e0df4.js +0 -10
  556. rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-3df0afc2.js +0 -2
  557. rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-8c5ed31e.js +0 -2
  558. rasa/core/channels/inspector/dist/assets/edges-f2ad444c-4fc48c3e.js +0 -4
  559. rasa/core/channels/inspector/dist/assets/flowDb-1972c806-9ec53a3c.js +0 -6
  560. rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-41da787a.js +0 -4
  561. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +0 -1
  562. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-ce370633.js +0 -139
  563. rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-90a36523.js +0 -266
  564. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-41e1aa3f.js +0 -70
  565. rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-e6f2af62.js +0 -1
  566. rasa/core/channels/inspector/dist/assets/layout-498807d8.js +0 -1
  567. rasa/core/channels/inspector/dist/assets/linear-8a078617.js +0 -1
  568. rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-396d17dd.js +0 -109
  569. rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-53f6f391.js +0 -8
  570. rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-715c9c20.js +0 -122
  571. rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-2e8fb31f.js +0 -1
  572. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-7e2d2aa0.js +0 -1
  573. rasa/core/channels/inspector/dist/assets/styles-080da4f6-4420cea6.js +0 -110
  574. rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-28676cf4.js +0 -159
  575. rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-151251e9.js +0 -1
  576. rasa_pro-3.11.4.dist-info/RECORD +0 -779
  577. /rasa/dialogue_understanding/generator/{single_step → prompt_templates}/command_prompt_template.jinja2 +0 -0
  578. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/NOTICE +0 -0
  579. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/WHEEL +0 -0
  580. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/entry_points.txt +0 -0
@@ -1,36 +1,56 @@
1
+ from __future__ import annotations
2
+
3
+ from copy import deepcopy
1
4
  from dataclasses import asdict, dataclass, field
2
- from typing import Any, Dict, Optional
5
+ from typing import (
6
+ Any,
7
+ Dict,
8
+ Optional,
9
+ Set,
10
+ )
3
11
 
4
12
  import structlog
13
+ from pydantic import BaseModel
5
14
 
6
15
  from rasa.shared.constants import (
7
- MODEL_CONFIG_KEY,
8
- MODEL_NAME_CONFIG_KEY,
9
- OPENAI_API_BASE_CONFIG_KEY,
10
16
  API_BASE_CONFIG_KEY,
11
- OPENAI_API_TYPE_CONFIG_KEY,
17
+ API_KEY,
12
18
  API_TYPE_CONFIG_KEY,
13
- OPENAI_API_VERSION_CONFIG_KEY,
14
19
  API_VERSION_CONFIG_KEY,
20
+ AZURE_API_TYPE,
21
+ AZURE_OPENAI_PROVIDER,
15
22
  DEPLOYMENT_CONFIG_KEY,
16
23
  DEPLOYMENT_NAME_CONFIG_KEY,
17
24
  ENGINE_CONFIG_KEY,
18
- RASA_TYPE_CONFIG_KEY,
19
25
  LANGCHAIN_TYPE_CONFIG_KEY,
20
- STREAM_CONFIG_KEY,
26
+ MODEL_CONFIG_KEY,
27
+ MODEL_NAME_CONFIG_KEY,
21
28
  N_REPHRASES_CONFIG_KEY,
29
+ OPENAI_API_BASE_CONFIG_KEY,
30
+ OPENAI_API_TYPE_CONFIG_KEY,
31
+ OPENAI_API_VERSION_CONFIG_KEY,
32
+ PROVIDER_CONFIG_KEY,
33
+ RASA_TYPE_CONFIG_KEY,
22
34
  REQUEST_TIMEOUT_CONFIG_KEY,
35
+ STREAM_CONFIG_KEY,
23
36
  TIMEOUT_CONFIG_KEY,
24
- PROVIDER_CONFIG_KEY,
25
- AZURE_OPENAI_PROVIDER,
26
- AZURE_API_TYPE,
37
+ )
38
+ from rasa.shared.providers._configs.azure_entra_id_config import (
39
+ AzureEntraIDOAuthConfig,
40
+ AzureEntraIDOAuthType,
41
+ )
42
+ from rasa.shared.providers._configs.oauth_config import (
43
+ OAUTH_KEY,
44
+ OAUTH_TYPE_FIELD,
45
+ OAuth,
27
46
  )
28
47
  from rasa.shared.providers._configs.utils import (
29
- resolve_aliases,
30
48
  raise_deprecation_warnings,
31
- validate_required_keys,
49
+ resolve_aliases,
32
50
  validate_forbidden_keys,
51
+ validate_required_keys,
33
52
  )
53
+ from rasa.shared.utils.common import class_from_module_path
34
54
 
35
55
  structlogger = structlog.get_logger()
36
56
 
@@ -61,6 +81,86 @@ FORBIDDEN_KEYS = [
61
81
  ]
62
82
 
63
83
 
84
+ class OAuthConfigWrapper(OAuth, BaseModel):
85
+ """Wrapper for OAuth configuration.
86
+
87
+ It's main purpose is to provide to_dict method which is used to serialize
88
+ the oauth configuration to the original format.
89
+
90
+ """
91
+
92
+ # Pydantic configuration to allow arbitrary user defined types
93
+ class Config:
94
+ arbitrary_types_allowed = True
95
+
96
+ oauth: OAuth
97
+ original_config: Dict[str, Any]
98
+
99
+ def get_bearer_token(self) -> str:
100
+ """Returns a bearer token."""
101
+ return self.oauth.get_bearer_token()
102
+
103
+ def to_dict(self) -> Dict[str, Any]:
104
+ """Converts the OAuth configuration to the original format."""
105
+ return self.original_config
106
+
107
+ @staticmethod
108
+ def _valid_type_values() -> Set[str]:
109
+ """Returns the valid built-in values for the `type` field in the `oauth`."""
110
+ return AzureEntraIDOAuthType.valid_string_values()
111
+
112
+ @classmethod
113
+ def from_dict(cls, oauth_config: Dict[str, Any]) -> OAuthConfigWrapper:
114
+ """Initializes a dataclass from the passed config.
115
+
116
+ Args:
117
+ oauth_config: (dict) The config from which to initialize.
118
+
119
+ Returns:
120
+ AzureOAuthConfig
121
+ """
122
+ original_config = deepcopy(oauth_config)
123
+
124
+ oauth_type: Optional[str] = oauth_config.get(OAUTH_TYPE_FIELD, None)
125
+
126
+ if oauth_type is None:
127
+ message = (
128
+ "Oauth configuration must contain "
129
+ f"'{OAUTH_TYPE_FIELD}' field and it must be set to one of the "
130
+ f"following values: {OAuthConfigWrapper._valid_type_values()}, "
131
+ f"or to the path of module which is "
132
+ f"implementing {OAuth.__name__} protocol."
133
+ )
134
+ structlogger.error(
135
+ "azure_oauth_config.missing_oauth_type",
136
+ message=message,
137
+ )
138
+ raise ValueError(message)
139
+
140
+ if oauth_type in AzureEntraIDOAuthType.valid_string_values():
141
+ return cls(
142
+ oauth=AzureEntraIDOAuthConfig.from_dict(oauth_config),
143
+ original_config=original_config,
144
+ )
145
+
146
+ module = class_from_module_path(oauth_type)
147
+
148
+ if not issubclass(module, OAuth):
149
+ message = (
150
+ f"Module {oauth_type} does not implement "
151
+ f"{OAuth.__name__} interface."
152
+ )
153
+ structlogger.error(
154
+ "azure_oauth_config.invalid_oauth_module",
155
+ message=message,
156
+ )
157
+ raise ValueError(message)
158
+
159
+ return cls(
160
+ oauth=module.from_dict(oauth_config), original_config=original_config
161
+ )
162
+
163
+
64
164
  @dataclass
65
165
  class AzureOpenAIClientConfig:
66
166
  """Parses configuration for Azure OpenAI client, resolves aliases and
@@ -80,11 +180,13 @@ class AzureOpenAIClientConfig:
80
180
  # API Type is not used by LiteLLM backend, but we define
81
181
  # it here for backward compatibility.
82
182
  api_type: Optional[str] = AZURE_API_TYPE
83
-
84
183
  # Provider is not used by LiteLLM backend, but we define it here since it's
85
184
  # used as switch between different clients.
86
185
  provider: str = AZURE_OPENAI_PROVIDER
87
186
 
187
+ # OAuth related parameters
188
+ oauth: Optional[OAuthConfigWrapper] = None
189
+
88
190
  extra_parameters: dict = field(default_factory=dict)
89
191
 
90
192
  def __post_init__(self) -> None:
@@ -106,7 +208,7 @@ class AzureOpenAIClientConfig:
106
208
  raise ValueError(message)
107
209
 
108
210
  @classmethod
109
- def from_dict(cls, config: dict) -> "AzureOpenAIClientConfig":
211
+ def from_dict(cls, config: dict) -> AzureOpenAIClientConfig:
110
212
  """Initializes a dataclass from the passed config.
111
213
 
112
214
  Args:
@@ -129,6 +231,16 @@ class AzureOpenAIClientConfig:
129
231
  # Validate that the forbidden keys are not present
130
232
  validate_forbidden_keys(config, FORBIDDEN_KEYS)
131
233
  # Init client config
234
+
235
+ cls._validate_authentication_configuration(config)
236
+
237
+ has_oauth_key = config.get(OAUTH_KEY, None) is not None
238
+ oauth = (
239
+ OAuthConfigWrapper.from_dict(config.pop(OAUTH_KEY))
240
+ if has_oauth_key
241
+ else None
242
+ )
243
+
132
244
  this = AzureOpenAIClientConfig(
133
245
  # Required parameters
134
246
  deployment=config.pop(DEPLOYMENT_CONFIG_KEY),
@@ -142,6 +254,8 @@ class AzureOpenAIClientConfig:
142
254
  # in clients.
143
255
  api_base=config.pop(API_BASE_CONFIG_KEY, None),
144
256
  api_version=config.pop(API_VERSION_CONFIG_KEY, None),
257
+ # OAuth related parameters, set only if auth_type is set to 'entra_id'
258
+ oauth=oauth,
145
259
  # The rest of parameters (e.g. model parameters) are considered
146
260
  # as extra parameters (this also includes timeout).
147
261
  extra_parameters=config,
@@ -154,12 +268,33 @@ class AzureOpenAIClientConfig:
154
268
  # Extra parameters should also be on the top level
155
269
  d.pop("extra_parameters", None)
156
270
  d.update(self.extra_parameters)
271
+
272
+ d.pop("oauth", None)
273
+ d.update({"oauth": self.oauth.to_dict()} if self.oauth else {})
157
274
  return d
158
275
 
159
276
  @staticmethod
160
277
  def resolve_config_aliases(config: Dict[str, Any]) -> Dict[str, Any]:
161
278
  return resolve_aliases(config, DEPRECATED_ALIASES_TO_STANDARD_KEY_MAPPING)
162
279
 
280
+ @staticmethod
281
+ def _validate_authentication_configuration(config: Dict[str, Any]) -> None:
282
+ """Validates the authentication configuration."""
283
+ has_api_key = config.get(API_KEY, None) is not None
284
+ has_oauth_key = config.get(OAUTH_KEY, None) is not None
285
+
286
+ if has_api_key and has_oauth_key:
287
+ message = (
288
+ "Azure OpenAI client configuration cannot contain "
289
+ f"both '{API_KEY}' and '{OAUTH_KEY}' fields. Please provide either "
290
+ f"'{API_KEY}' or '{OAUTH_KEY}' fields."
291
+ )
292
+ structlogger.error(
293
+ "azure_openai_client_config.multiple_auth_types_specified",
294
+ message=message,
295
+ )
296
+ raise ValueError(message)
297
+
163
298
 
164
299
  def is_azure_openai_config(config: dict) -> bool:
165
300
  """Check whether the configuration is meant to configure
@@ -1,3 +1,5 @@
1
+ from __future__ import annotations
2
+
1
3
  from typing import Protocol, runtime_checkable
2
4
 
3
5
 
@@ -9,7 +11,7 @@ class ClientConfig(Protocol):
9
11
  """
10
12
 
11
13
  @classmethod
12
- def from_dict(cls, config: dict) -> "ClientConfig":
14
+ def from_dict(cls, config: dict) -> ClientConfig:
13
15
  """
14
16
  Initializes the client config with the given configuration.
15
17
 
@@ -1,24 +1,26 @@
1
+ from __future__ import annotations
2
+
1
3
  from dataclasses import asdict, dataclass, field
2
4
  from typing import Any, Dict
3
5
 
4
6
  import structlog
5
7
 
8
+ import rasa.shared.utils.cli
6
9
  from rasa.shared.constants import (
7
10
  MODEL_CONFIG_KEY,
8
11
  MODEL_NAME_CONFIG_KEY,
9
- STREAM_CONFIG_KEY,
10
12
  N_REPHRASES_CONFIG_KEY,
11
13
  PROVIDER_CONFIG_KEY,
12
- TIMEOUT_CONFIG_KEY,
13
14
  REQUEST_TIMEOUT_CONFIG_KEY,
15
+ STREAM_CONFIG_KEY,
16
+ TIMEOUT_CONFIG_KEY,
14
17
  )
15
18
  from rasa.shared.providers._configs.utils import (
16
- validate_required_keys,
17
- validate_forbidden_keys,
18
- resolve_aliases,
19
19
  raise_deprecation_warnings,
20
+ resolve_aliases,
21
+ validate_forbidden_keys,
22
+ validate_required_keys,
20
23
  )
21
- import rasa.shared.utils.cli
22
24
 
23
25
  structlogger = structlog.get_logger()
24
26
 
@@ -69,7 +71,7 @@ class DefaultLiteLLMClientConfig:
69
71
  raise ValueError(message)
70
72
 
71
73
  @classmethod
72
- def from_dict(cls, config: dict) -> "DefaultLiteLLMClientConfig":
74
+ def from_dict(cls, config: dict) -> DefaultLiteLLMClientConfig:
73
75
  """
74
76
  Initializes a dataclass from the passed config.
75
77
 
@@ -1,27 +1,29 @@
1
+ from __future__ import annotations
2
+
1
3
  from dataclasses import asdict, dataclass, field
2
4
  from typing import Any, Dict, Optional
3
5
 
4
6
  import structlog
5
7
 
6
8
  from rasa.shared.constants import (
7
- MODEL_CONFIG_KEY,
8
- MODEL_NAME_CONFIG_KEY,
9
- RASA_TYPE_CONFIG_KEY,
10
- LANGCHAIN_TYPE_CONFIG_KEY,
11
- HUGGINGFACE_MULTIPROCESS_CONFIG_KEY,
12
9
  HUGGINGFACE_CACHE_FOLDER_CONFIG_KEY,
13
- HUGGINGFACE_SHOW_PROGRESS_CONFIG_KEY,
14
- HUGGINGFACE_MODEL_KWARGS_CONFIG_KEY,
15
10
  HUGGINGFACE_ENCODE_KWARGS_CONFIG_KEY,
16
11
  HUGGINGFACE_LOCAL_EMBEDDING_CACHING_FOLDER,
17
- PROVIDER_CONFIG_KEY,
18
12
  HUGGINGFACE_LOCAL_EMBEDDING_PROVIDER,
19
- TIMEOUT_CONFIG_KEY,
13
+ HUGGINGFACE_MODEL_KWARGS_CONFIG_KEY,
14
+ HUGGINGFACE_MULTIPROCESS_CONFIG_KEY,
15
+ HUGGINGFACE_SHOW_PROGRESS_CONFIG_KEY,
16
+ LANGCHAIN_TYPE_CONFIG_KEY,
17
+ MODEL_CONFIG_KEY,
18
+ MODEL_NAME_CONFIG_KEY,
19
+ PROVIDER_CONFIG_KEY,
20
+ RASA_TYPE_CONFIG_KEY,
20
21
  REQUEST_TIMEOUT_CONFIG_KEY,
22
+ TIMEOUT_CONFIG_KEY,
21
23
  )
22
24
  from rasa.shared.providers._configs.utils import (
23
- resolve_aliases,
24
25
  raise_deprecation_warnings,
26
+ resolve_aliases,
25
27
  validate_required_keys,
26
28
  )
27
29
  from rasa.shared.utils.io import raise_deprecation_warning
@@ -90,7 +92,7 @@ class HuggingFaceLocalEmbeddingClientConfig:
90
92
  raise ValueError(message)
91
93
 
92
94
  @classmethod
93
- def from_dict(cls, config: dict) -> "HuggingFaceLocalEmbeddingClientConfig":
95
+ def from_dict(cls, config: dict) -> HuggingFaceLocalEmbeddingClientConfig:
94
96
  """
95
97
  Initializes a dataclass from the passed config.
96
98
 
@@ -1,29 +1,31 @@
1
+ from __future__ import annotations
2
+
1
3
  import copy
2
4
  from dataclasses import dataclass, field
3
5
  from typing import Any, Dict, List
4
6
 
5
7
  import structlog
8
+
6
9
  from rasa.shared.constants import (
7
- ROUTER_CONFIG_KEY,
8
- MODELS_CONFIG_KEY,
9
- MODEL_GROUP_ID_CONFIG_KEY,
10
- MODEL_NAME_CONFIG_KEY,
11
- LITELLM_PARAMS_KEY,
12
- PROVIDER_CONFIG_KEY,
13
- DEPLOYMENT_CONFIG_KEY,
14
10
  API_TYPE_CONFIG_KEY,
11
+ DEPLOYMENT_CONFIG_KEY,
12
+ LITELLM_PARAMS_KEY,
15
13
  MODEL_CONFIG_KEY,
14
+ MODEL_GROUP_ID_CONFIG_KEY,
16
15
  MODEL_LIST_KEY,
16
+ MODEL_NAME_CONFIG_KEY,
17
+ MODELS_CONFIG_KEY,
18
+ PROVIDER_CONFIG_KEY,
19
+ ROUTER_CONFIG_KEY,
17
20
  USE_CHAT_COMPLETIONS_ENDPOINT_CONFIG_KEY,
18
21
  )
19
22
  from rasa.shared.providers._configs.model_group_config import (
20
- ModelGroupConfig,
21
23
  ModelConfig,
24
+ ModelGroupConfig,
22
25
  )
23
26
  from rasa.shared.providers.mappings import get_prefix_from_provider
24
27
  from rasa.shared.utils.llm import DEPLOYMENT_CENTRIC_PROVIDERS
25
28
 
26
-
27
29
  structlogger = structlog.get_logger()
28
30
 
29
31
  _LITELLM_UNSUPPORTED_KEYS = [
@@ -120,7 +122,7 @@ class LiteLLMRouterClientConfig:
120
122
  raise ValueError(message)
121
123
 
122
124
  @classmethod
123
- def from_dict(cls, config: dict) -> "LiteLLMRouterClientConfig":
125
+ def from_dict(cls, config: dict) -> LiteLLMRouterClientConfig:
124
126
  """Initializes a dataclass from the passed config.
125
127
 
126
128
  Args:
@@ -1,19 +1,22 @@
1
+ from __future__ import annotations
2
+
1
3
  from dataclasses import asdict, dataclass, field
2
4
  from typing import List, Optional
3
5
 
4
6
  import structlog
7
+
5
8
  from rasa.shared.constants import (
6
9
  API_BASE_CONFIG_KEY,
7
10
  API_KEY,
8
11
  API_TYPE_CONFIG_KEY,
9
12
  API_VERSION_CONFIG_KEY,
10
13
  DEPLOYMENT_CONFIG_KEY,
11
- PROVIDER_CONFIG_KEY,
14
+ EXTRA_PARAMETERS_KEY,
12
15
  MODEL_CONFIG_KEY,
13
16
  MODEL_GROUP_ID_CONFIG_KEY,
14
- MODELS_CONFIG_KEY,
15
17
  MODEL_GROUPS_CONFIG_KEY,
16
- EXTRA_PARAMETERS_KEY,
18
+ MODELS_CONFIG_KEY,
19
+ PROVIDER_CONFIG_KEY,
17
20
  )
18
21
  from rasa.shared.providers.mappings import get_client_config_class_from_provider
19
22
 
@@ -40,7 +43,7 @@ class ModelConfig:
40
43
  api_type: Optional[str] = None
41
44
 
42
45
  @classmethod
43
- def from_dict(cls, config: dict) -> "ModelConfig":
46
+ def from_dict(cls, config: dict) -> ModelConfig:
44
47
  """Initializes a dataclass from the passed config. The provider config param is
45
48
  used to determine the client config class to use. The client config class takes
46
49
  care of resolving config aliases and throwing deprecation warnings.
@@ -130,7 +133,7 @@ class ModelGroupConfig:
130
133
  raise ValueError(message)
131
134
 
132
135
  @classmethod
133
- def from_dict(cls, config: dict) -> "ModelGroupConfig":
136
+ def from_dict(cls, config: dict) -> ModelGroupConfig:
134
137
  """Initializes a dataclass from the passed config.
135
138
 
136
139
  Args:
@@ -0,0 +1,33 @@
1
+ import abc
2
+ from typing import Any, Dict, Type, 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_dict(
16
+ cls: Type[OAuthType], config: Dict[str, Any]
17
+ ) -> OAuthType: # ignore[type]
18
+ """Initializes a dataclass from the passed config.
19
+
20
+ Args:
21
+ config: (dict) The config from which to initialize.
22
+
23
+ Returns:
24
+ OAuth
25
+ """
26
+
27
+ @abc.abstractmethod
28
+ def get_bearer_token(self) -> str:
29
+ """Returns a bearer token.
30
+
31
+ Bear token is used to authenticate requests to the Azure
32
+ Oopen AI instance's API protected by the Gateway.
33
+ """
@@ -1,32 +1,34 @@
1
+ from __future__ import annotations
2
+
1
3
  from dataclasses import asdict, dataclass, field
2
4
  from typing import Any, Dict, Optional
3
5
 
4
6
  import structlog
5
7
 
6
8
  from rasa.shared.constants import (
9
+ API_BASE_CONFIG_KEY,
10
+ API_TYPE_CONFIG_KEY,
11
+ API_VERSION_CONFIG_KEY,
12
+ LANGCHAIN_TYPE_CONFIG_KEY,
7
13
  MODEL_CONFIG_KEY,
8
14
  MODEL_NAME_CONFIG_KEY,
15
+ N_REPHRASES_CONFIG_KEY,
9
16
  OPENAI_API_BASE_CONFIG_KEY,
10
- API_BASE_CONFIG_KEY,
17
+ OPENAI_API_TYPE,
11
18
  OPENAI_API_TYPE_CONFIG_KEY,
12
- API_TYPE_CONFIG_KEY,
13
19
  OPENAI_API_VERSION_CONFIG_KEY,
14
- API_VERSION_CONFIG_KEY,
20
+ OPENAI_PROVIDER,
21
+ PROVIDER_CONFIG_KEY,
15
22
  RASA_TYPE_CONFIG_KEY,
16
- LANGCHAIN_TYPE_CONFIG_KEY,
17
- STREAM_CONFIG_KEY,
18
- N_REPHRASES_CONFIG_KEY,
19
23
  REQUEST_TIMEOUT_CONFIG_KEY,
24
+ STREAM_CONFIG_KEY,
20
25
  TIMEOUT_CONFIG_KEY,
21
- PROVIDER_CONFIG_KEY,
22
- OPENAI_API_TYPE,
23
- OPENAI_PROVIDER,
24
26
  )
25
27
  from rasa.shared.providers._configs.utils import (
26
- resolve_aliases,
27
- validate_required_keys,
28
28
  raise_deprecation_warnings,
29
+ resolve_aliases,
29
30
  validate_forbidden_keys,
31
+ validate_required_keys,
30
32
  )
31
33
 
32
34
  structlogger = structlog.get_logger()
@@ -111,7 +113,7 @@ class OpenAIClientConfig:
111
113
  raise ValueError(message)
112
114
 
113
115
  @classmethod
114
- def from_dict(cls, config: dict) -> "OpenAIClientConfig":
116
+ def from_dict(cls, config: dict) -> OpenAIClientConfig:
115
117
  """
116
118
  Initializes a dataclass from the passed config.
117
119
 
@@ -1,13 +1,15 @@
1
+ from __future__ import annotations
2
+
1
3
  from dataclasses import asdict, dataclass, field
2
4
  from typing import Optional
3
5
 
4
6
  import structlog
5
7
 
6
8
  from rasa.shared.constants import (
9
+ API_BASE_CONFIG_KEY,
7
10
  MODEL_CONFIG_KEY,
8
- RASA_PROVIDER,
9
11
  PROVIDER_CONFIG_KEY,
10
- API_BASE_CONFIG_KEY,
12
+ RASA_PROVIDER,
11
13
  )
12
14
  from rasa.shared.providers._configs.utils import (
13
15
  validate_required_keys,
@@ -37,7 +39,7 @@ class RasaLLMClientConfig:
37
39
  extra_parameters: dict = field(default_factory=dict)
38
40
 
39
41
  @classmethod
40
- def from_dict(cls, config: dict) -> "RasaLLMClientConfig":
42
+ def from_dict(cls, config: dict) -> RasaLLMClientConfig:
41
43
  """
42
44
  Initializes a dataclass from the passed config.
43
45
 
@@ -1,29 +1,30 @@
1
+ from __future__ import annotations
2
+
1
3
  from dataclasses import asdict, dataclass, field
2
4
  from typing import Any, Dict, Optional
3
5
 
4
6
  import structlog
5
7
 
6
8
  from rasa.shared.constants import (
9
+ API_BASE_CONFIG_KEY,
10
+ API_TYPE_CONFIG_KEY,
11
+ API_VERSION_CONFIG_KEY,
12
+ LANGCHAIN_TYPE_CONFIG_KEY,
7
13
  MODEL_CONFIG_KEY,
8
14
  MODEL_NAME_CONFIG_KEY,
15
+ N_REPHRASES_CONFIG_KEY,
9
16
  OPENAI_API_BASE_CONFIG_KEY,
10
- API_BASE_CONFIG_KEY,
11
17
  OPENAI_API_TYPE_CONFIG_KEY,
12
- API_TYPE_CONFIG_KEY,
13
18
  OPENAI_API_VERSION_CONFIG_KEY,
14
- API_VERSION_CONFIG_KEY,
19
+ OPENAI_PROVIDER,
20
+ PROVIDER_CONFIG_KEY,
15
21
  RASA_TYPE_CONFIG_KEY,
16
- LANGCHAIN_TYPE_CONFIG_KEY,
17
- STREAM_CONFIG_KEY,
18
- N_REPHRASES_CONFIG_KEY,
19
22
  REQUEST_TIMEOUT_CONFIG_KEY,
20
- TIMEOUT_CONFIG_KEY,
21
- PROVIDER_CONFIG_KEY,
22
- OPENAI_PROVIDER,
23
23
  SELF_HOSTED_PROVIDER,
24
+ STREAM_CONFIG_KEY,
25
+ TIMEOUT_CONFIG_KEY,
24
26
  USE_CHAT_COMPLETIONS_ENDPOINT_CONFIG_KEY,
25
27
  )
26
-
27
28
  from rasa.shared.providers._configs.utils import (
28
29
  raise_deprecation_warnings,
29
30
  resolve_aliases,
@@ -114,7 +115,7 @@ class SelfHostedLLMClientConfig:
114
115
  raise ValueError(message)
115
116
 
116
117
  @classmethod
117
- def from_dict(cls, config: dict) -> "SelfHostedLLMClientConfig":
118
+ def from_dict(cls, config: dict) -> SelfHostedLLMClientConfig:
118
119
  """
119
120
  Initializes a dataclass from the passed config.
120
121
 
@@ -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()
@@ -3,16 +3,15 @@ from typing import Optional, Union
3
3
 
4
4
  import httpx
5
5
  import litellm
6
+ import structlog
7
+
6
8
  from rasa.shared.constants import (
9
+ LITELLM_SSL_CERTIFICATE_ENV_VAR,
10
+ LITELLM_SSL_VERIFY_ENV_VAR,
7
11
  RASA_CA_BUNDLE_ENV_VAR,
8
- REQUESTS_CA_BUNDLE_ENV_VAR,
9
12
  RASA_SSL_CERTIFICATE_ENV_VAR,
10
- LITELLM_SSL_VERIFY_ENV_VAR,
11
- LITELLM_SSL_CERTIFICATE_ENV_VAR,
13
+ REQUESTS_CA_BUNDLE_ENV_VAR,
12
14
  )
13
-
14
- import structlog
15
-
16
15
  from rasa.shared.utils.io import raise_deprecation_warning
17
16
 
18
17
  structlogger = structlog.get_logger()
@@ -1,17 +1,17 @@
1
1
  import structlog
2
+ from litellm import validate_environment
2
3
 
3
4
  from rasa.shared.constants import (
4
- AWS_ACCESS_KEY_ID_ENV_VAR,
5
5
  AWS_ACCESS_KEY_ID_CONFIG_KEY,
6
- AWS_SECRET_ACCESS_KEY_ENV_VAR,
7
- AWS_SECRET_ACCESS_KEY_CONFIG_KEY,
8
- AWS_REGION_NAME_ENV_VAR,
6
+ AWS_ACCESS_KEY_ID_ENV_VAR,
9
7
  AWS_REGION_NAME_CONFIG_KEY,
8
+ AWS_REGION_NAME_ENV_VAR,
9
+ AWS_SECRET_ACCESS_KEY_CONFIG_KEY,
10
+ AWS_SECRET_ACCESS_KEY_ENV_VAR,
10
11
  AWS_SESSION_TOKEN_CONFIG_KEY,
11
12
  AWS_SESSION_TOKEN_ENV_VAR,
12
13
  )
13
14
  from rasa.shared.exceptions import ProviderClientValidationError
14
- from litellm import validate_environment
15
15
  from rasa.shared.providers.embedding._base_litellm_embedding_client import (
16
16
  _VALIDATE_ENVIRONMENT_MISSING_KEYS_KEY,
17
17
  )
@@ -0,0 +1,6 @@
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"
@@ -19,7 +19,7 @@ from rasa.shared.providers.embedding.embedding_response import (
19
19
  EmbeddingResponse,
20
20
  EmbeddingUsage,
21
21
  )
22
- from rasa.shared.utils.io import suppress_logs, resolve_environment_variables
22
+ from rasa.shared.utils.io import resolve_environment_variables, suppress_logs
23
23
 
24
24
  structlogger = structlog.get_logger()
25
25