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
@@ -4,23 +4,29 @@ from typing import Any, Dict, List, Optional
4
4
  import structlog
5
5
 
6
6
  from rasa.shared.constants import (
7
+ API_BASE_CONFIG_KEY,
8
+ API_KEY,
9
+ API_VERSION_CONFIG_KEY,
7
10
  AZURE_API_BASE_ENV_VAR,
8
11
  AZURE_API_KEY_ENV_VAR,
9
12
  AZURE_API_TYPE_ENV_VAR,
10
13
  AZURE_API_VERSION_ENV_VAR,
14
+ AZURE_OPENAI_PROVIDER,
11
15
  OPENAI_API_BASE_ENV_VAR,
12
16
  OPENAI_API_KEY_ENV_VAR,
13
17
  OPENAI_API_TYPE_ENV_VAR,
14
18
  OPENAI_API_VERSION_ENV_VAR,
15
- API_BASE_CONFIG_KEY,
16
- API_KEY,
17
- API_VERSION_CONFIG_KEY,
18
- AZURE_OPENAI_PROVIDER,
19
19
  )
20
20
  from rasa.shared.exceptions import ProviderClientValidationError
21
21
  from rasa.shared.providers._configs.azure_openai_client_config import (
22
+ AzureEntraIDOAuthConfig,
22
23
  AzureOpenAIClientConfig,
23
24
  )
25
+ from rasa.shared.providers.constants import (
26
+ DEFAULT_AZURE_API_KEY_NAME,
27
+ LITE_LLM_API_KEY_FIELD,
28
+ LITE_LLM_AZURE_AD_TOKEN,
29
+ )
24
30
  from rasa.shared.providers.embedding._base_litellm_embedding_client import (
25
31
  _BaseLiteLLMEmbeddingClient,
26
32
  )
@@ -41,6 +47,8 @@ class AzureOpenAIEmbeddingClient(_BaseLiteLLMEmbeddingClient):
41
47
  If not provided, it will be set via environment variable.
42
48
  api_version (Optional[str]): The version of the API to use.
43
49
  If not provided, it will be set via environment variable.
50
+ oauth (Optional[AzureEntraIDOAuthConfig]): Optional OAuth configuration.
51
+ If provided, the client will use OAuth for authentication.
44
52
  kwargs (Optional[Dict[str, Any]]): Optional configuration parameters specific
45
53
  to the embedding model deployment.
46
54
 
@@ -57,6 +65,7 @@ class AzureOpenAIEmbeddingClient(_BaseLiteLLMEmbeddingClient):
57
65
  api_base: Optional[str] = None,
58
66
  api_type: Optional[str] = None,
59
67
  api_version: Optional[str] = None,
68
+ oauth: Optional[AzureEntraIDOAuthConfig] = None,
60
69
  **kwargs: Any,
61
70
  ):
62
71
  super().__init__() # type: ignore
@@ -84,7 +93,11 @@ class AzureOpenAIEmbeddingClient(_BaseLiteLLMEmbeddingClient):
84
93
  # Litellm does not support use of OPENAI_API_KEY, so we need to map it
85
94
  # because of backward compatibility. However, we're first looking at
86
95
  # AZURE_API_KEY.
87
- self._api_key_env_var = self._resolve_api_key_env_var()
96
+
97
+ self._oauth = oauth
98
+ self._api_key_env_var = (
99
+ self._resolve_api_key_env_var() if not self._oauth else None
100
+ )
88
101
 
89
102
  self.validate_client_setup()
90
103
 
@@ -100,7 +113,7 @@ class AzureOpenAIEmbeddingClient(_BaseLiteLLMEmbeddingClient):
100
113
  return self._extra_parameters[API_KEY]
101
114
 
102
115
  if os.getenv(AZURE_API_KEY_ENV_VAR) is not None:
103
- return "${AZURE_API_KEY}"
116
+ return f"${{{DEFAULT_AZURE_API_KEY_NAME}}}"
104
117
 
105
118
  if os.getenv(OPENAI_API_KEY_ENV_VAR) is not None:
106
119
  # API key can be set through OPENAI_API_KEY too,
@@ -163,6 +176,7 @@ class AzureOpenAIEmbeddingClient(_BaseLiteLLMEmbeddingClient):
163
176
  api_base=azure_openai_config.api_base,
164
177
  api_type=azure_openai_config.api_type,
165
178
  api_version=azure_openai_config.api_version,
179
+ oauth=azure_openai_config.oauth,
166
180
  **azure_openai_config.extra_parameters,
167
181
  )
168
182
 
@@ -177,6 +191,7 @@ class AzureOpenAIEmbeddingClient(_BaseLiteLLMEmbeddingClient):
177
191
  api_base=self.api_base,
178
192
  api_type=self.api_type,
179
193
  api_version=self.api_version,
194
+ oauth=self._oauth,
180
195
  extra_parameters=self._extra_parameters,
181
196
  )
182
197
  return config.to_dict()
@@ -219,13 +234,23 @@ class AzureOpenAIEmbeddingClient(_BaseLiteLLMEmbeddingClient):
219
234
 
220
235
  @property
221
236
  def _embedding_fn_args(self) -> dict:
237
+ auth_parameter: Dict[str, str] = {}
238
+
239
+ if self._oauth:
240
+ auth_parameter = {
241
+ **auth_parameter,
242
+ LITE_LLM_AZURE_AD_TOKEN: self._oauth.get_bearer_token(),
243
+ }
244
+ elif self._api_key_env_var:
245
+ auth_parameter = {LITE_LLM_API_KEY_FIELD: self._api_key_env_var}
246
+
222
247
  return {
223
248
  **self._litellm_extra_parameters,
224
249
  "model": self._litellm_model_name,
225
250
  "api_base": self.api_base,
226
251
  "api_type": self.api_type,
227
252
  "api_version": self.api_version,
228
- "api_key": self._api_key_env_var,
253
+ **auth_parameter,
229
254
  }
230
255
 
231
256
  @property
@@ -1,4 +1,4 @@
1
- from typing import Protocol, Dict, List, TYPE_CHECKING, runtime_checkable
1
+ from typing import TYPE_CHECKING, Dict, List, Protocol, runtime_checkable
2
2
 
3
3
  if TYPE_CHECKING:
4
4
  from rasa.shared.providers.embedding.embedding_response import EmbeddingResponse
@@ -1,5 +1,8 @@
1
- from typing import Any, Dict, List
1
+ from __future__ import annotations
2
+
2
3
  import logging
4
+ from typing import Any, Dict, List
5
+
3
6
  import structlog
4
7
 
5
8
  from rasa.shared.exceptions import ProviderClientAPIException
@@ -45,7 +48,7 @@ class LiteLLMRouterEmbeddingClient(
45
48
  )
46
49
 
47
50
  @classmethod
48
- def from_config(cls, config: Dict[str, Any]) -> "LiteLLMRouterEmbeddingClient":
51
+ def from_config(cls, config: Dict[str, Any]) -> LiteLLMRouterEmbeddingClient:
49
52
  """Instantiates a LiteLLM Router Embedding client from a configuration dict.
50
53
 
51
54
  Args:
@@ -1,15 +1,13 @@
1
+ from __future__ import annotations
2
+
1
3
  import logging
2
4
  from abc import abstractmethod
3
- from typing import Dict, List, Any, Union
5
+ from typing import Any, Dict, List, Union, cast
4
6
 
5
7
  import structlog
6
- from litellm import (
7
- completion,
8
- acompletion,
9
- validate_environment,
10
- )
8
+ from litellm import acompletion, completion, validate_environment
11
9
 
12
- from rasa.shared.constants import API_BASE_CONFIG_KEY, API_KEY
10
+ from rasa.shared.constants import API_BASE_CONFIG_KEY, API_KEY, ROLE_USER
13
11
  from rasa.shared.exceptions import (
14
12
  ProviderClientAPIException,
15
13
  ProviderClientValidationError,
@@ -19,7 +17,7 @@ from rasa.shared.providers._ssl_verification_utils import (
19
17
  ensure_ssl_certificates_for_litellm_openai_based_clients,
20
18
  )
21
19
  from rasa.shared.providers.llm.llm_response import LLMResponse, LLMUsage
22
- from rasa.shared.utils.io import suppress_logs, resolve_environment_variables
20
+ from rasa.shared.utils.io import resolve_environment_variables, suppress_logs
23
21
 
24
22
  structlogger = structlog.get_logger()
25
23
 
@@ -50,7 +48,7 @@ class _BaseLiteLLMClient:
50
48
 
51
49
  @classmethod
52
50
  @abstractmethod
53
- def from_config(cls, config: Dict[str, Any]) -> "_BaseLiteLLMClient":
51
+ def from_config(cls, config: Dict[str, Any]) -> _BaseLiteLLMClient:
54
52
  pass
55
53
 
56
54
  @property
@@ -122,12 +120,18 @@ class _BaseLiteLLMClient:
122
120
  raise ProviderClientValidationError(event_info)
123
121
 
124
122
  @suppress_logs(log_level=logging.WARNING)
125
- def completion(self, messages: Union[List[str], str]) -> LLMResponse:
123
+ def completion(self, messages: Union[List[dict], List[str], str]) -> LLMResponse:
126
124
  """Synchronously generate completions for given list of messages.
127
125
 
128
126
  Args:
129
- messages: List of messages or a single message to generate the
130
- completion for.
127
+ messages: The message can be,
128
+ - a list of preformatted messages. Each message should be a dictionary
129
+ with the following keys:
130
+ - content: The message content.
131
+ - role: The role of the message (e.g. user or system).
132
+ - a list of messages. Each message is a string and will be formatted
133
+ as a user message.
134
+ - a single message as a string which will be formatted as user message.
131
135
 
132
136
  Returns:
133
137
  List of message completions.
@@ -136,7 +140,7 @@ class _BaseLiteLLMClient:
136
140
  ProviderClientAPIException: If the API request fails.
137
141
  """
138
142
  try:
139
- formatted_messages = self._format_messages(messages)
143
+ formatted_messages = self._get_formatted_messages(messages)
140
144
  arguments = resolve_environment_variables(self._completion_fn_args)
141
145
  response = completion(messages=formatted_messages, **arguments)
142
146
  return self._format_response(response)
@@ -144,12 +148,20 @@ class _BaseLiteLLMClient:
144
148
  raise ProviderClientAPIException(e)
145
149
 
146
150
  @suppress_logs(log_level=logging.WARNING)
147
- async def acompletion(self, messages: Union[List[str], str]) -> LLMResponse:
151
+ async def acompletion(
152
+ self, messages: Union[List[dict], List[str], str]
153
+ ) -> LLMResponse:
148
154
  """Asynchronously generate completions for given list of messages.
149
155
 
150
156
  Args:
151
- messages: List of messages or a single message to generate the
152
- completion for.
157
+ messages: The message can be,
158
+ - a list of preformatted messages. Each message should be a dictionary
159
+ with the following keys:
160
+ - content: The message content.
161
+ - role: The role of the message (e.g. user or system).
162
+ - a list of messages. Each message is a string and will be formatted
163
+ as a user message.
164
+ - a single message as a string which will be formatted as user message.
153
165
 
154
166
  Returns:
155
167
  List of message completions.
@@ -158,7 +170,7 @@ class _BaseLiteLLMClient:
158
170
  ProviderClientAPIException: If the API request fails.
159
171
  """
160
172
  try:
161
- formatted_messages = self._format_messages(messages)
173
+ formatted_messages = self._get_formatted_messages(messages)
162
174
  arguments = resolve_environment_variables(self._completion_fn_args)
163
175
  response = await acompletion(messages=formatted_messages, **arguments)
164
176
  return self._format_response(response)
@@ -181,11 +193,24 @@ class _BaseLiteLLMClient:
181
193
  )
182
194
  raise ProviderClientAPIException(e, message)
183
195
 
196
+ def _get_formatted_messages(
197
+ self, messages: Union[List[dict], List[str], str]
198
+ ) -> List[Dict[str, str]]:
199
+ """Returns a list of formatted messages."""
200
+ if (
201
+ isinstance(messages, list)
202
+ and len(messages) > 0
203
+ and isinstance(messages[0], dict)
204
+ ):
205
+ # Check if the messages are already formatted. If so, return them as is.
206
+ return cast(List[Dict[str, str]], messages)
207
+ return self._format_messages(messages)
208
+
184
209
  def _format_messages(self, messages: Union[List[str], str]) -> List[Dict[str, str]]:
185
210
  """Formats messages (or a single message) to OpenAI format."""
186
211
  if isinstance(messages, str):
187
212
  messages = [messages]
188
- return [{"content": message, "role": "user"} for message in messages]
213
+ return [{"content": message, "role": ROLE_USER} for message in messages]
189
214
 
190
215
  def _format_response(self, response: Any) -> LLMResponse:
191
216
  """Parses the LiteLLM response to Rasa format."""
@@ -1,33 +1,60 @@
1
+ from __future__ import annotations
2
+
1
3
  import os
2
4
  import re
3
- from typing import Dict, Any, Optional
5
+ from typing import Any, Dict, Optional
4
6
 
5
7
  import structlog
6
8
 
7
9
  from rasa.shared.constants import (
8
- OPENAI_API_BASE_ENV_VAR,
9
- OPENAI_API_VERSION_ENV_VAR,
10
- AZURE_API_BASE_ENV_VAR,
11
- AZURE_API_VERSION_ENV_VAR,
12
10
  API_BASE_CONFIG_KEY,
11
+ API_KEY,
13
12
  API_VERSION_CONFIG_KEY,
14
- DEPLOYMENT_CONFIG_KEY,
13
+ AZURE_API_BASE_ENV_VAR,
15
14
  AZURE_API_KEY_ENV_VAR,
16
- OPENAI_API_TYPE_ENV_VAR,
17
- OPENAI_API_KEY_ENV_VAR,
18
15
  AZURE_API_TYPE_ENV_VAR,
16
+ AZURE_API_VERSION_ENV_VAR,
19
17
  AZURE_OPENAI_PROVIDER,
20
- API_KEY,
18
+ DEPLOYMENT_CONFIG_KEY,
19
+ OPENAI_API_BASE_ENV_VAR,
20
+ OPENAI_API_KEY_ENV_VAR,
21
+ OPENAI_API_TYPE_ENV_VAR,
22
+ OPENAI_API_VERSION_ENV_VAR,
21
23
  )
22
24
  from rasa.shared.exceptions import ProviderClientValidationError
23
25
  from rasa.shared.providers._configs.azure_openai_client_config import (
26
+ AzureEntraIDOAuthConfig,
24
27
  AzureOpenAIClientConfig,
25
28
  )
29
+ from rasa.shared.providers.constants import (
30
+ DEFAULT_AZURE_API_KEY_NAME,
31
+ LITE_LLM_API_BASE_FIELD,
32
+ LITE_LLM_API_KEY_FIELD,
33
+ LITE_LLM_API_VERSION_FIELD,
34
+ LITE_LLM_AZURE_AD_TOKEN,
35
+ )
26
36
  from rasa.shared.providers.llm._base_litellm_client import _BaseLiteLLMClient
27
37
  from rasa.shared.utils.io import raise_deprecation_warning
28
38
 
29
39
  structlogger = structlog.get_logger()
30
40
 
41
+ AZURE_CLIENT_ID = "AZURE_CLIENT_ID"
42
+ AZURE_CLIENT_SECRET = "AZURE_CLIENT_SECRET"
43
+ AZURE_TENANT_ID = "AZURE_TENANT_ID"
44
+ CLIENT_SECRET_VARS = (AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID)
45
+
46
+ AZURE_CLIENT_CERTIFICATE_PATH = "AZURE_CLIENT_CERTIFICATE_PATH"
47
+ AZURE_CLIENT_CERTIFICATE_PASSWORD = "AZURE_CLIENT_CERTIFICATE_PASSWORD"
48
+ AZURE_CLIENT_SEND_CERTIFICATE_CHAIN = "AZURE_CLIENT_SEND_CERTIFICATE_CHAIN"
49
+ CERT_VARS = (AZURE_CLIENT_ID, AZURE_CLIENT_CERTIFICATE_PATH, AZURE_TENANT_ID)
50
+
51
+
52
+ class AzureADConfig:
53
+ def __init__(
54
+ self, client_id: str, client_secret: str, tenant_id: str, scopes: str
55
+ ) -> None:
56
+ self.scopes = scopes
57
+
31
58
 
32
59
  class AzureOpenAILLMClient(_BaseLiteLLMClient):
33
60
  """A client for interfacing with Azure's OpenAI LLM deployments.
@@ -41,6 +68,7 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
41
68
  it will be set via environment variables.
42
69
  api_version (Optional[str]): The version of the API to use. If not provided,
43
70
  it will be set via environment variable.
71
+
44
72
  kwargs (Optional[Dict[str, Any]]): Optional configuration parameters specific
45
73
  to the model deployment.
46
74
 
@@ -57,6 +85,7 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
57
85
  api_type: Optional[str] = None,
58
86
  api_base: Optional[str] = None,
59
87
  api_version: Optional[str] = None,
88
+ oauth: Optional[AzureEntraIDOAuthConfig] = None,
60
89
  **kwargs: Any,
61
90
  ):
62
91
  super().__init__() # type: ignore
@@ -80,8 +109,6 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
80
109
  or os.getenv(OPENAI_API_VERSION_ENV_VAR)
81
110
  )
82
111
 
83
- self._api_key_env_var = self._resolve_api_key_env_var()
84
-
85
112
  # Not used by LiteLLM, here for backward compatibility
86
113
  self._api_type = (
87
114
  api_type
@@ -89,6 +116,19 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
89
116
  or os.getenv(OPENAI_API_TYPE_ENV_VAR)
90
117
  )
91
118
 
119
+ os.unsetenv("OPENAI_API_KEY")
120
+ os.unsetenv("AZURE_API_KEY")
121
+
122
+ self._oauth = oauth
123
+
124
+ if self._oauth:
125
+ os.unsetenv(DEFAULT_AZURE_API_KEY_NAME)
126
+ os.unsetenv(AZURE_API_KEY_ENV_VAR)
127
+ os.unsetenv(OPENAI_API_KEY_ENV_VAR)
128
+ self._api_key_env_var = (
129
+ self._resolve_api_key_env_var() if not self._oauth else None
130
+ )
131
+
92
132
  # Run helper function to check and raise deprecation warning if
93
133
  # deprecated environment variables were used for initialization of the
94
134
  # client settings
@@ -157,7 +197,7 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
157
197
  return self._extra_parameters[API_KEY]
158
198
 
159
199
  if os.getenv(AZURE_API_KEY_ENV_VAR) is not None:
160
- return "${AZURE_API_KEY}"
200
+ return f"${{{DEFAULT_AZURE_API_KEY_NAME}}}"
161
201
 
162
202
  if os.getenv(OPENAI_API_KEY_ENV_VAR) is not None:
163
203
  # API key can be set through OPENAI_API_KEY too,
@@ -188,7 +228,7 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
188
228
  )
189
229
 
190
230
  @classmethod
191
- def from_config(cls, config: Dict[str, Any]) -> "AzureOpenAILLMClient":
231
+ def from_config(cls, config: Dict[str, Any]) -> AzureOpenAILLMClient:
192
232
  """Initializes the client from given configuration.
193
233
 
194
234
  Args:
@@ -215,11 +255,12 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
215
255
  raise
216
256
 
217
257
  return cls(
218
- azure_openai_config.deployment,
219
- azure_openai_config.model,
220
- azure_openai_config.api_type,
221
- azure_openai_config.api_base,
222
- azure_openai_config.api_version,
258
+ deployment=azure_openai_config.deployment,
259
+ model=azure_openai_config.model,
260
+ api_type=azure_openai_config.api_type,
261
+ api_base=azure_openai_config.api_base,
262
+ api_version=azure_openai_config.api_version,
263
+ oauth=azure_openai_config.oauth,
223
264
  **azure_openai_config.extra_parameters,
224
265
  )
225
266
 
@@ -234,6 +275,7 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
234
275
  api_base=self._api_base,
235
276
  api_version=self._api_version,
236
277
  api_type=self._api_type,
278
+ oauth=self._oauth,
237
279
  extra_parameters=self._extra_parameters,
238
280
  )
239
281
  return config.to_dict()
@@ -282,12 +324,23 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
282
324
  """Returns the completion arguments for invoking a call through
283
325
  LiteLLM's completion functions.
284
326
  """
327
+ # Set the API key env var to None if OAuth is used
328
+ auth_parameter: Dict[str, str] = {}
329
+
330
+ if self._oauth:
331
+ auth_parameter = {
332
+ **auth_parameter,
333
+ LITE_LLM_AZURE_AD_TOKEN: self._oauth.get_bearer_token(),
334
+ }
335
+ elif self._api_key_env_var:
336
+ auth_parameter = {LITE_LLM_API_KEY_FIELD: self._api_key_env_var}
337
+
285
338
  fn_args = super()._completion_fn_args
286
339
  fn_args.update(
287
340
  {
288
- "api_base": self.api_base,
289
- "api_version": self.api_version,
290
- "api_key": self._api_key_env_var,
341
+ LITE_LLM_API_BASE_FIELD: self.api_base,
342
+ LITE_LLM_API_VERSION_FIELD: self.api_version,
343
+ **auth_parameter,
291
344
  }
292
345
  )
293
346
  return fn_args
@@ -314,41 +367,44 @@ class AzureOpenAILLMClient(_BaseLiteLLMClient):
314
367
 
315
368
  return info.format(setting=setting, options=options)
316
369
 
370
+ env_var_field = "env_var"
371
+ config_key_field = "config_key"
372
+ current_value_field = "current_value"
317
373
  # All required settings for Azure OpenAI client
318
374
  settings: Dict[str, Dict[str, Any]] = {
319
375
  "API Base": {
320
- "current_value": self.api_base,
321
- "env_var": AZURE_API_BASE_ENV_VAR,
322
- "config_key": API_BASE_CONFIG_KEY,
376
+ current_value_field: self.api_base,
377
+ env_var_field: AZURE_API_BASE_ENV_VAR,
378
+ config_key_field: API_BASE_CONFIG_KEY,
323
379
  },
324
380
  "API Version": {
325
- "current_value": self.api_version,
326
- "env_var": AZURE_API_VERSION_ENV_VAR,
327
- "config_key": API_VERSION_CONFIG_KEY,
381
+ current_value_field: self.api_version,
382
+ env_var_field: AZURE_API_VERSION_ENV_VAR,
383
+ config_key_field: API_VERSION_CONFIG_KEY,
328
384
  },
329
385
  "Deployment Name": {
330
- "current_value": self.deployment,
331
- "env_var": None,
332
- "config_key": DEPLOYMENT_CONFIG_KEY,
386
+ current_value_field: self.deployment,
387
+ env_var_field: None,
388
+ config_key_field: DEPLOYMENT_CONFIG_KEY,
333
389
  },
334
390
  }
335
391
 
336
392
  missing_settings = [
337
393
  setting_name
338
394
  for setting_name, setting_info in settings.items()
339
- if setting_info["current_value"] is None
395
+ if setting_info[current_value_field] is None
340
396
  ]
341
397
 
342
398
  if missing_settings:
343
399
  event_info = f"Client settings not set: " f"{', '.join(missing_settings)}. "
344
400
 
345
401
  for missing_setting in missing_settings:
346
- if settings[missing_setting]["current_value"] is not None:
402
+ if settings[missing_setting][current_value_field] is not None:
347
403
  continue
348
404
  event_info += generate_event_info_for_missing_setting(
349
405
  missing_setting,
350
- settings[missing_setting]["env_var"],
351
- settings[missing_setting]["config_key"],
406
+ settings[missing_setting][env_var_field],
407
+ settings[missing_setting][config_key_field],
352
408
  )
353
409
 
354
410
  structlogger.error(
@@ -1,4 +1,6 @@
1
- from typing import Dict, Any
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, Dict
2
4
 
3
5
  from rasa.shared.constants import (
4
6
  AWS_BEDROCK_PROVIDER,
@@ -35,7 +37,7 @@ class DefaultLiteLLMClient(_BaseLiteLLMClient):
35
37
  self.validate_client_setup()
36
38
 
37
39
  @classmethod
38
- def from_config(cls, config: Dict[str, Any]) -> "DefaultLiteLLMClient":
40
+ def from_config(cls, config: Dict[str, Any]) -> DefaultLiteLLMClient:
39
41
  default_config = DefaultLiteLLMClientConfig.from_dict(config)
40
42
  return cls(
41
43
  model=default_config.model,
@@ -1,11 +1,15 @@
1
- from typing import Any, Dict, List, Union
1
+ from __future__ import annotations
2
+
2
3
  import logging
4
+ from typing import Any, Dict, List, Union
5
+
3
6
  import structlog
4
7
 
5
8
  from rasa.shared.exceptions import ProviderClientAPIException
6
9
  from rasa.shared.providers._configs.litellm_router_client_config import (
7
10
  LiteLLMRouterClientConfig,
8
11
  )
12
+ from rasa.shared.providers.constants import LITE_LLM_MODEL_FIELD
9
13
  from rasa.shared.providers.llm._base_litellm_client import _BaseLiteLLMClient
10
14
  from rasa.shared.providers.llm.llm_response import LLMResponse
11
15
  from rasa.shared.providers.router._base_litellm_router_client import (
@@ -41,7 +45,7 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
41
45
  )
42
46
 
43
47
  @classmethod
44
- def from_config(cls, config: Dict[str, Any]) -> "LiteLLMRouterLLMClient":
48
+ def from_config(cls, config: Dict[str, Any]) -> LiteLLMRouterLLMClient:
45
49
  """Instantiates a LiteLLM Router LLM client from a configuration dict.
46
50
 
47
51
  Args:
@@ -86,6 +90,10 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
86
90
  ProviderClientAPIException: If the API request fails.
87
91
  """
88
92
  try:
93
+ structlogger.info(
94
+ "litellm_router_llm_client.text_completion",
95
+ _completion_fn_args=self._completion_fn_args,
96
+ )
89
97
  response = self.router_client.text_completion(
90
98
  prompt=prompt, **self._completion_fn_args
91
99
  )
@@ -114,7 +122,7 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
114
122
  raise ProviderClientAPIException(e)
115
123
 
116
124
  @suppress_logs(log_level=logging.WARNING)
117
- def completion(self, messages: Union[List[str], str]) -> LLMResponse:
125
+ def completion(self, messages: Union[List[dict], List[str], str]) -> LLMResponse:
118
126
  """
119
127
  Synchronously generate completions for given list of messages.
120
128
 
@@ -124,8 +132,14 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
124
132
  text_completion method is called.
125
133
 
126
134
  Args:
127
- messages: List of messages or a single message to generate the
128
- completion for.
135
+ messages: The message can be,
136
+ - a list of preformatted messages. Each message should be a dictionary
137
+ with the following keys:
138
+ - content: The message content.
139
+ - role: The role of the message (e.g. user or system).
140
+ - a list of messages. Each message is a string and will be formatted
141
+ as a user message.
142
+ - a single message as a string which will be formatted as user message.
129
143
  Returns:
130
144
  List of message completions.
131
145
  Raises:
@@ -143,7 +157,9 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
143
157
  raise ProviderClientAPIException(e)
144
158
 
145
159
  @suppress_logs(log_level=logging.WARNING)
146
- async def acompletion(self, messages: Union[List[str], str]) -> LLMResponse:
160
+ async def acompletion(
161
+ self, messages: Union[List[dict], List[str], str]
162
+ ) -> LLMResponse:
147
163
  """
148
164
  Asynchronously generate completions for given list of messages.
149
165
 
@@ -153,8 +169,14 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
153
169
  text_completion method is called.
154
170
 
155
171
  Args:
156
- messages: List of messages or a single message to generate the
157
- completion for.
172
+ messages: The message can be,
173
+ - a list of preformatted messages. Each message should be a dictionary
174
+ with the following keys:
175
+ - content: The message content.
176
+ - role: The role of the message (e.g. user or system).
177
+ - a list of messages. Each message is a string and will be formatted
178
+ as a user message.
179
+ - a single message as a string which will be formatted as user message.
158
180
  Returns:
159
181
  List of message completions.
160
182
  Raises:
@@ -176,7 +198,8 @@ class LiteLLMRouterLLMClient(_BaseLiteLLMRouterClient, _BaseLiteLLMClient):
176
198
  """Returns the completion arguments for invoking a call through
177
199
  LiteLLM's completion functions.
178
200
  """
201
+
179
202
  return {
180
203
  **self._litellm_extra_parameters,
181
- "model": self.model_group_id,
204
+ LITE_LLM_MODEL_FIELD: self.model_group_id,
182
205
  }