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,4 +1,6 @@
1
- from typing import Protocol, Dict, List, runtime_checkable, Union
1
+ from __future__ import annotations
2
+
3
+ from typing import Dict, List, Protocol, Union, runtime_checkable
2
4
 
3
5
  from rasa.shared.providers.llm.llm_response import LLMResponse
4
6
 
@@ -11,7 +13,7 @@ class LLMClient(Protocol):
11
13
  """
12
14
 
13
15
  @classmethod
14
- def from_config(cls, config: dict) -> "LLMClient":
16
+ def from_config(cls, config: dict) -> LLMClient:
15
17
  """
16
18
  Initializes the llm client with the given configuration.
17
19
 
@@ -30,7 +32,7 @@ class LLMClient(Protocol):
30
32
  """
31
33
  ...
32
34
 
33
- def completion(self, messages: Union[List[str], str]) -> LLMResponse:
35
+ def completion(self, messages: Union[List[dict], List[str], str]) -> LLMResponse:
34
36
  """
35
37
  Synchronously generate completions for given list of messages.
36
38
 
@@ -38,14 +40,22 @@ class LLMClient(Protocol):
38
40
  strings) and return a list of completions (as strings).
39
41
 
40
42
  Args:
41
- messages: List of messages or a single message to generate the
42
- completion for.
43
+ messages: The message can be,
44
+ - a list of preformatted messages. Each message should be a dictionary
45
+ with the following keys:
46
+ - content: The message content.
47
+ - role: The role of the message (e.g. user or system).
48
+ - a list of messages. Each message is a string and will be formatted
49
+ as a user message.
50
+ - a single message as a string which will be formatted as user message.
43
51
  Returns:
44
52
  LLMResponse
45
53
  """
46
54
  ...
47
55
 
48
- async def acompletion(self, messages: Union[List[str], str]) -> LLMResponse:
56
+ async def acompletion(
57
+ self, messages: Union[List[dict], List[str], str]
58
+ ) -> LLMResponse:
49
59
  """
50
60
  Asynchronously generate completions for given list of messages.
51
61
 
@@ -53,8 +63,14 @@ class LLMClient(Protocol):
53
63
  strings) and return a list of completions (as strings).
54
64
 
55
65
  Args:
56
- messages: List of messages or a single message to generate the
57
- completion for.
66
+ messages: The message can be,
67
+ - a list of preformatted messages. Each message should be a dictionary
68
+ with the following keys:
69
+ - content: The message content.
70
+ - role: The role of the message (e.g. user or system).
71
+ - a list of messages. Each message is a string and will be formatted
72
+ as a user message.
73
+ - a single message as a string which will be formatted as user message.
58
74
  Returns:
59
75
  LLMResponse
60
76
  """
@@ -1,5 +1,11 @@
1
- from dataclasses import dataclass, field, asdict
2
- from typing import Dict, List, Optional
1
+ import functools
2
+ import time
3
+ from dataclasses import asdict, dataclass, field
4
+ from typing import Any, Awaitable, Callable, Dict, List, Optional, Text, Union
5
+
6
+ import structlog
7
+
8
+ structlogger = structlog.get_logger()
3
9
 
4
10
 
5
11
  @dataclass
@@ -16,6 +22,17 @@ class LLMUsage:
16
22
  def __post_init__(self) -> None:
17
23
  self.total_tokens = self.prompt_tokens + self.completion_tokens
18
24
 
25
+ @classmethod
26
+ def from_dict(cls, data: Dict[Text, Any]) -> "LLMUsage":
27
+ """Creates an LLMUsage object from a dictionary.
28
+ If any keys are missing, they will default to zero
29
+ or whatever default you prefer.
30
+ """
31
+ return cls(
32
+ prompt_tokens=data.get("prompt_tokens"),
33
+ completion_tokens=data.get("completion_tokens"),
34
+ )
35
+
19
36
  def to_dict(self) -> dict:
20
37
  """Converts the LLMUsage dataclass instance into a dictionary."""
21
38
  return asdict(self)
@@ -42,9 +59,51 @@ class LLMResponse:
42
59
  """Optional dictionary for storing additional information related to the
43
60
  completion that may not be covered by other fields."""
44
61
 
62
+ latency: Optional[float] = None
63
+ """Optional field to store the latency of the LLM API call."""
64
+
65
+ @classmethod
66
+ def from_dict(cls, data: Dict[Text, Any]) -> "LLMResponse":
67
+ """Creates an LLMResponse from a dictionary."""
68
+ usage_data = data.get("usage", {})
69
+ usage_obj = LLMUsage.from_dict(usage_data) if usage_data else None
70
+
71
+ return cls(
72
+ id=data["id"],
73
+ choices=data["choices"],
74
+ created=data["created"],
75
+ model=data.get("model"),
76
+ usage=usage_obj,
77
+ additional_info=data.get("additional_info"),
78
+ latency=data.get("latency"),
79
+ )
80
+
81
+ @classmethod
82
+ def ensure_llm_response(cls, response: Union[str, "LLMResponse"]) -> "LLMResponse":
83
+ if isinstance(response, LLMResponse):
84
+ return response
85
+
86
+ structlogger.warn("llm_response.deprecated_response_type", response=response)
87
+ data = {"id": None, "choices": [response], "created": None}
88
+ return LLMResponse.from_dict(data)
89
+
45
90
  def to_dict(self) -> dict:
46
91
  """Converts the LLMResponse dataclass instance into a dictionary."""
47
92
  result = asdict(self)
48
93
  if self.usage:
49
94
  result["usage"] = self.usage.to_dict()
50
95
  return result
96
+
97
+
98
+ def measure_llm_latency(
99
+ func: Callable[..., Awaitable[Optional[LLMResponse]]],
100
+ ) -> Callable[..., Awaitable[Optional[LLMResponse]]]:
101
+ @functools.wraps(func)
102
+ async def wrapper(*args: Any, **kwargs: Any) -> Optional[LLMResponse]:
103
+ start = time.perf_counter()
104
+ result: Optional[LLMResponse] = await func(*args, **kwargs)
105
+ if result:
106
+ result.latency = time.perf_counter() - start
107
+ return result
108
+
109
+ return wrapper
@@ -1,16 +1,22 @@
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
10
  OPENAI_API_BASE_ENV_VAR,
9
- OPENAI_API_VERSION_ENV_VAR,
10
11
  OPENAI_API_TYPE_ENV_VAR,
12
+ OPENAI_API_VERSION_ENV_VAR,
11
13
  OPENAI_PROVIDER,
12
14
  )
13
15
  from rasa.shared.providers._configs.openai_client_config import OpenAIClientConfig
16
+ from rasa.shared.providers.constants import (
17
+ LITE_LLM_API_BASE_FIELD,
18
+ LITE_LLM_API_VERSION_FIELD,
19
+ )
14
20
  from rasa.shared.providers.llm._base_litellm_client import _BaseLiteLLMClient
15
21
 
16
22
  structlogger = structlog.get_logger()
@@ -57,7 +63,7 @@ class OpenAILLMClient(_BaseLiteLLMClient):
57
63
  self.validate_client_setup()
58
64
 
59
65
  @classmethod
60
- def from_config(cls, config: Dict[str, Any]) -> "OpenAILLMClient":
66
+ def from_config(cls, config: Dict[str, Any]) -> OpenAILLMClient:
61
67
  """
62
68
  Initializes the client from given configuration.
63
69
 
@@ -148,8 +154,8 @@ class OpenAILLMClient(_BaseLiteLLMClient):
148
154
  fn_args = super()._completion_fn_args
149
155
  fn_args.update(
150
156
  {
151
- "api_base": self.api_base,
152
- "api_version": self.api_version,
157
+ LITE_LLM_API_BASE_FIELD: self.api_base,
158
+ LITE_LLM_API_VERSION_FIELD: self.api_version,
153
159
  }
154
160
  )
155
161
  return fn_args
@@ -1,23 +1,28 @@
1
+ from __future__ import annotations
2
+
1
3
  from typing import Any, Dict, Optional
2
4
 
3
5
  import structlog
4
6
 
5
7
  from rasa.shared.constants import (
6
- RASA_PROVIDER,
7
8
  OPENAI_PROVIDER,
9
+ RASA_PROVIDER,
8
10
  )
9
11
  from rasa.shared.providers._configs.rasa_llm_client_config import (
10
12
  RasaLLMClientConfig,
11
13
  )
12
- from rasa.utils.licensing import retrieve_license_from_env
14
+ from rasa.shared.providers.constants import (
15
+ LITE_LLM_API_BASE_FIELD,
16
+ LITE_LLM_API_KEY_FIELD,
17
+ )
13
18
  from rasa.shared.providers.llm._base_litellm_client import _BaseLiteLLMClient
14
-
19
+ from rasa.utils.licensing import retrieve_license_from_env
15
20
 
16
21
  structlogger = structlog.get_logger()
17
22
 
18
23
 
19
24
  class RasaLLMClient(_BaseLiteLLMClient):
20
- """A client for interfacing with a Rasa-Hosted LLM endpoint that uses
25
+ """A client for interfacing with a Rasa-Hosted LLM endpoint that uses.
21
26
 
22
27
  Parameters:
23
28
  model (str): The model or deployment name.
@@ -50,15 +55,12 @@ class RasaLLMClient(_BaseLiteLLMClient):
50
55
 
51
56
  @property
52
57
  def api_base(self) -> Optional[str]:
53
- """
54
- Returns the base API URL for the openai llm client.
55
- """
58
+ """Returns the base API URL for the openai llm client."""
56
59
  return self._api_base
57
60
 
58
61
  @property
59
62
  def provider(self) -> str:
60
- """
61
- Returns the provider name for the self hosted llm client.
63
+ """Returns the provider name for the self hosted llm client.
62
64
 
63
65
  Returns:
64
66
  String representing the provider name.
@@ -83,17 +85,18 @@ class RasaLLMClient(_BaseLiteLLMClient):
83
85
 
84
86
  @property
85
87
  def _completion_fn_args(self) -> Dict[str, Any]:
86
- """Returns the completion arguments for invoking a call through
87
- LiteLLM's completion functions.
88
- """
88
+ """Returns the completion arguments for invoking a call using completions."""
89
89
  fn_args = super()._completion_fn_args
90
90
  fn_args.update(
91
- {"api_base": self.api_base, "api_key": retrieve_license_from_env()}
91
+ {
92
+ LITE_LLM_API_BASE_FIELD: self.api_base,
93
+ LITE_LLM_API_KEY_FIELD: retrieve_license_from_env(),
94
+ }
92
95
  )
93
96
  return fn_args
94
97
 
95
98
  @classmethod
96
- def from_config(cls, config: Dict[str, Any]) -> "RasaLLMClient":
99
+ def from_config(cls, config: Dict[str, Any]) -> RasaLLMClient:
97
100
  try:
98
101
  client_config = RasaLLMClientConfig.from_dict(config)
99
102
  except ValueError as e:
@@ -1,21 +1,25 @@
1
- from typing import Any, Dict, List, Optional, Union
2
- from litellm import (
3
- text_completion,
4
- atext_completion,
5
- )
1
+ from __future__ import annotations
2
+
6
3
  import logging
7
4
  import os
5
+ from typing import Any, Dict, List, Optional, Union
6
+
8
7
  import structlog
8
+ from litellm import atext_completion, text_completion
9
9
 
10
10
  from rasa.shared.constants import (
11
- SELF_HOSTED_VLLM_PREFIX,
12
- SELF_HOSTED_VLLM_API_KEY_ENV_VAR,
13
11
  API_KEY,
12
+ SELF_HOSTED_VLLM_API_KEY_ENV_VAR,
13
+ SELF_HOSTED_VLLM_PREFIX,
14
14
  )
15
+ from rasa.shared.exceptions import ProviderClientAPIException
15
16
  from rasa.shared.providers._configs.self_hosted_llm_client_config import (
16
17
  SelfHostedLLMClientConfig,
17
18
  )
18
- from rasa.shared.exceptions import ProviderClientAPIException
19
+ from rasa.shared.providers.constants import (
20
+ LITE_LLM_API_BASE_FIELD,
21
+ LITE_LLM_API_VERSION_FIELD,
22
+ )
19
23
  from rasa.shared.providers.llm._base_litellm_client import _BaseLiteLLMClient
20
24
  from rasa.shared.providers.llm.llm_response import LLMResponse
21
25
  from rasa.shared.utils.io import suppress_logs
@@ -66,7 +70,7 @@ class SelfHostedLLMClient(_BaseLiteLLMClient):
66
70
  self._apply_dummy_api_key_if_missing()
67
71
 
68
72
  @classmethod
69
- def from_config(cls, config: Dict[str, Any]) -> "SelfHostedLLMClient":
73
+ def from_config(cls, config: Dict[str, Any]) -> SelfHostedLLMClient:
70
74
  try:
71
75
  client_config = SelfHostedLLMClientConfig.from_dict(config)
72
76
  except ValueError as e:
@@ -183,8 +187,8 @@ class SelfHostedLLMClient(_BaseLiteLLMClient):
183
187
  fn_args = super()._completion_fn_args
184
188
  fn_args.update(
185
189
  {
186
- "api_base": self.api_base,
187
- "api_version": self.api_version,
190
+ LITE_LLM_API_BASE_FIELD: self.api_base,
191
+ LITE_LLM_API_VERSION_FIELD: self.api_version,
188
192
  }
189
193
  )
190
194
  return fn_args
@@ -213,7 +217,14 @@ class SelfHostedLLMClient(_BaseLiteLLMClient):
213
217
  Asynchronously generate completions for given prompt.
214
218
 
215
219
  Args:
216
- prompt: Prompt to generate the completion for.
220
+ messages: The message can be,
221
+ - a list of preformatted messages. Each message should be a dictionary
222
+ with the following keys:
223
+ - content: The message content.
224
+ - role: The role of the message (e.g. user or system).
225
+ - a list of messages. Each message is a string and will be formatted
226
+ as a user message.
227
+ - a single message as a string which will be formatted as user message.
217
228
  Returns:
218
229
  List of message completions.
219
230
  Raises:
@@ -225,7 +236,9 @@ class SelfHostedLLMClient(_BaseLiteLLMClient):
225
236
  except Exception as e:
226
237
  raise ProviderClientAPIException(e)
227
238
 
228
- async def acompletion(self, messages: Union[List[str], str]) -> LLMResponse:
239
+ async def acompletion(
240
+ self, messages: Union[List[dict], List[str], str]
241
+ ) -> LLMResponse:
229
242
  """Asynchronous completion of the model with the given messages.
230
243
 
231
244
  Method overrides the base class method to call the appropriate
@@ -234,7 +247,14 @@ class SelfHostedLLMClient(_BaseLiteLLMClient):
234
247
  atext_completion method is called.
235
248
 
236
249
  Args:
237
- messages: The messages to be used for completion.
250
+ messages: The message can be,
251
+ - a list of preformatted messages. Each message should be a dictionary
252
+ with the following keys:
253
+ - content: The message content.
254
+ - role: The role of the message (e.g. user or system).
255
+ - a list of messages. Each message is a string and will be formatted
256
+ as a user message.
257
+ - a single message as a string which will be formatted as user message.
238
258
 
239
259
  Returns:
240
260
  The completion response.
@@ -243,7 +263,7 @@ class SelfHostedLLMClient(_BaseLiteLLMClient):
243
263
  return await super().acompletion(messages)
244
264
  return await self._atext_completion(messages)
245
265
 
246
- def completion(self, messages: Union[List[str], str]) -> LLMResponse:
266
+ def completion(self, messages: Union[List[dict], List[str], str]) -> LLMResponse:
247
267
  """Completion of the model with the given messages.
248
268
 
249
269
  Method overrides the base class method to call the appropriate
@@ -1,13 +1,28 @@
1
- from typing import Dict, Type, Optional
1
+ from typing import Dict, Optional, Type
2
2
 
3
3
  from rasa.shared.constants import (
4
4
  AZURE_OPENAI_PROVIDER,
5
5
  HUGGINGFACE_LOCAL_EMBEDDING_PROVIDER,
6
6
  OPENAI_PROVIDER,
7
- SELF_HOSTED_PROVIDER,
8
7
  RASA_PROVIDER,
8
+ SELF_HOSTED_PROVIDER,
9
9
  SELF_HOSTED_VLLM_PREFIX,
10
10
  )
11
+ from rasa.shared.providers._configs.azure_openai_client_config import (
12
+ AzureOpenAIClientConfig,
13
+ )
14
+ from rasa.shared.providers._configs.client_config import ClientConfig
15
+ from rasa.shared.providers._configs.default_litellm_client_config import (
16
+ DefaultLiteLLMClientConfig,
17
+ )
18
+ from rasa.shared.providers._configs.huggingface_local_embedding_client_config import (
19
+ HuggingFaceLocalEmbeddingClientConfig,
20
+ )
21
+ from rasa.shared.providers._configs.openai_client_config import OpenAIClientConfig
22
+ from rasa.shared.providers._configs.rasa_llm_client_config import RasaLLMClientConfig
23
+ from rasa.shared.providers._configs.self_hosted_llm_client_config import (
24
+ SelfHostedLLMClientConfig,
25
+ )
11
26
  from rasa.shared.providers.embedding.azure_openai_embedding_client import (
12
27
  AzureOpenAIEmbeddingClient,
13
28
  )
@@ -25,24 +40,8 @@ from rasa.shared.providers.llm.azure_openai_llm_client import AzureOpenAILLMClie
25
40
  from rasa.shared.providers.llm.default_litellm_llm_client import DefaultLiteLLMClient
26
41
  from rasa.shared.providers.llm.llm_client import LLMClient
27
42
  from rasa.shared.providers.llm.openai_llm_client import OpenAILLMClient
28
- from rasa.shared.providers.llm.self_hosted_llm_client import SelfHostedLLMClient
29
43
  from rasa.shared.providers.llm.rasa_llm_client import RasaLLMClient
30
- from rasa.shared.providers._configs.azure_openai_client_config import (
31
- AzureOpenAIClientConfig,
32
- )
33
- from rasa.shared.providers._configs.default_litellm_client_config import (
34
- DefaultLiteLLMClientConfig,
35
- )
36
- from rasa.shared.providers._configs.huggingface_local_embedding_client_config import (
37
- HuggingFaceLocalEmbeddingClientConfig,
38
- )
39
- from rasa.shared.providers._configs.openai_client_config import OpenAIClientConfig
40
- from rasa.shared.providers._configs.self_hosted_llm_client_config import (
41
- SelfHostedLLMClientConfig,
42
- )
43
- from rasa.shared.providers._configs.rasa_llm_client_config import RasaLLMClientConfig
44
-
45
- from rasa.shared.providers._configs.client_config import ClientConfig
44
+ from rasa.shared.providers.llm.self_hosted_llm_client import SelfHostedLLMClient
46
45
 
47
46
  _provider_to_llm_client_mapping: Dict[str, Type[LLMClient]] = {
48
47
  OPENAI_PROVIDER: OpenAILLMClient,
@@ -1,21 +1,25 @@
1
- from typing import Any, Dict, List
1
+ from __future__ import annotations
2
+
2
3
  import os
3
- import structlog
4
+ from copy import deepcopy
5
+ from typing import Any, Dict, List
4
6
 
7
+ import structlog
5
8
  from litellm import Router
6
9
 
7
10
  from rasa.shared.constants import (
8
- MODEL_LIST_KEY,
11
+ API_KEY,
12
+ LITELLM_PARAMS_KEY,
13
+ MODEL_CONFIG_KEY,
9
14
  MODEL_GROUP_ID_CONFIG_KEY,
15
+ MODEL_LIST_KEY,
10
16
  ROUTER_CONFIG_KEY,
11
- SELF_HOSTED_VLLM_PREFIX,
12
17
  SELF_HOSTED_VLLM_API_KEY_ENV_VAR,
13
- LITELLM_PARAMS_KEY,
14
- API_KEY,
15
- MODEL_CONFIG_KEY,
18
+ SELF_HOSTED_VLLM_PREFIX,
16
19
  USE_CHAT_COMPLETIONS_ENDPOINT_CONFIG_KEY,
17
20
  )
18
21
  from rasa.shared.exceptions import ProviderClientValidationError
22
+ from rasa.shared.providers._configs.azure_entra_id_config import AzureEntraIDOAuthConfig
19
23
  from rasa.shared.providers._configs.litellm_router_client_config import (
20
24
  LiteLLMRouterClientConfig,
21
25
  )
@@ -59,12 +63,8 @@ class _BaseLiteLLMRouterClient:
59
63
  self._extra_parameters = kwargs or {}
60
64
  self.additional_client_setup()
61
65
  try:
62
- resolved_model_configurations = (
63
- self._resolve_env_vars_in_model_configurations()
64
- )
65
- self._router_client = Router(
66
- model_list=resolved_model_configurations, **router_settings
67
- )
66
+ # We instantiate a router client here to validate the configuration.
67
+ self._router_client = self._create_router_client()
68
68
  except Exception as e:
69
69
  event_info = "Cannot instantiate a router client."
70
70
  structlogger.error(
@@ -93,7 +93,7 @@ class _BaseLiteLLMRouterClient:
93
93
  return
94
94
 
95
95
  @classmethod
96
- def from_config(cls, config: Dict[str, Any]) -> "_BaseLiteLLMRouterClient":
96
+ def from_config(cls, config: Dict[str, Any]) -> _BaseLiteLLMRouterClient:
97
97
  """Instantiates a LiteLLM Router Embedding client from a configuration dict.
98
98
 
99
99
  Args:
@@ -143,6 +143,14 @@ class _BaseLiteLLMRouterClient:
143
143
  @property
144
144
  def router_client(self) -> Router:
145
145
  """Returns the instantiated LiteLLM Router client."""
146
+ # In ca se oauth is used, due to a bug in LiteLLM,
147
+ # azure_ad_token_provider is not working as expected.
148
+ # To work around this, we create a new client every
149
+ # time we need to make a call which will
150
+ # ensure that the token is always fresh.
151
+ # GitHub issue for LiteLLm: https://github.com/BerriAI/litellm/issues/4417
152
+ if self._has_oauth():
153
+ return self._create_router_client()
146
154
  return self._router_client
147
155
 
148
156
  @property
@@ -173,11 +181,36 @@ class _BaseLiteLLMRouterClient:
173
181
  **self._litellm_extra_parameters,
174
182
  }
175
183
 
184
+ def _create_router_client(self) -> Router:
185
+ resolved_model_configurations = self._resolve_env_vars_in_model_configurations()
186
+ return Router(model_list=resolved_model_configurations, **self.router_settings)
187
+
188
+ def _has_oauth(self) -> bool:
189
+ for model_configuration in self.model_configurations:
190
+ if model_configuration.get("litellm_params", {}).get("oauth", None):
191
+ return True
192
+ return False
193
+
176
194
  def _resolve_env_vars_in_model_configurations(self) -> List:
177
195
  model_configuration_with_resolved_keys = []
178
196
  for model_configuration in self.model_configurations:
179
197
  resolved_model_configuration = resolve_environment_variables(
180
- model_configuration
198
+ deepcopy(model_configuration)
181
199
  )
200
+
201
+ if not isinstance(resolved_model_configuration, dict):
202
+ continue
203
+
204
+ lite_llm_params = resolved_model_configuration.get("litellm_params", {})
205
+ if lite_llm_params.get("oauth", None):
206
+ oauth_config_dict = lite_llm_params.pop("oauth")
207
+ oauth_config = AzureEntraIDOAuthConfig.from_dict(oauth_config_dict)
208
+ credential = oauth_config.create_azure_credential()
209
+ # token_provider = get_bearer_token_provider(
210
+ # credential, *oauth_config.scopes
211
+ # )
212
+ resolved_model_configuration["litellm_params"]["azure_ad_token"] = (
213
+ credential.get_token(*oauth_config.scopes).token
214
+ )
182
215
  model_configuration_with_resolved_keys.append(resolved_model_configuration)
183
216
  return model_configuration_with_resolved_keys
@@ -1,3 +1,5 @@
1
+ from __future__ import annotations
2
+
1
3
  from typing import Any, Dict, List, Protocol, runtime_checkable
2
4
 
3
5
 
@@ -9,7 +11,7 @@ class RouterClient(Protocol):
9
11
  """
10
12
 
11
13
  @classmethod
12
- def from_config(cls, config: dict) -> "RouterClient":
14
+ def from_config(cls, config: dict) -> RouterClient:
13
15
  """
14
16
  Initializes the router client with the given configuration.
15
17
 
rasa/shared/utils/cli.py CHANGED
@@ -1,7 +1,7 @@
1
1
  import math
2
2
  import shutil
3
3
  import sys
4
- from typing import Any, Text, NoReturn
4
+ from typing import Any, NoReturn, Text
5
5
 
6
6
  import rasa.shared.utils.io
7
7
 
@@ -7,12 +7,13 @@ import os
7
7
  import pkgutil
8
8
  import sys
9
9
  from types import ModuleType
10
- from typing import Sequence, Text, Dict, Optional, Any, List, Callable, Collection, Type
10
+ from typing import Any, Callable, Collection, Dict, List, Optional, Sequence, Text, Type
11
11
 
12
12
  import rasa.shared.utils.io
13
13
  from rasa.exceptions import MissingDependencyException
14
14
  from rasa.shared.constants import DOCS_URL_MIGRATION_GUIDE
15
15
  from rasa.shared.exceptions import ProviderClientValidationError, RasaException
16
+ from rasa.shared.utils.cli import print_success
16
17
 
17
18
  logger = logging.getLogger(__name__)
18
19
 
@@ -322,3 +323,16 @@ def validate_environment(
322
323
  raise MissingDependencyException(
323
324
  f"Missing package for {component_name}: {p}"
324
325
  )
326
+
327
+
328
+ def display_research_study_prompt() -> None:
329
+ """Logs a prompt to get users to participate in a UX Improvement research study."""
330
+ separator = "-" * 54
331
+ message = f"""
332
+ {separator}
333
+ Want to help shape the future of Rasa Pro?
334
+ Share your feedback in a short conversation with our team.
335
+ Sign up at: https://calendly.com/alvaro-rasa/rasa-pro-installation
336
+ {separator}
337
+ """
338
+ print_success(message)
@@ -2,3 +2,6 @@ DEFAULT_ENCODING = "utf-8"
2
2
 
3
3
  READ_YAML_FILE_CACHE_MAXSIZE_ENV_VAR = "READ_YAML_FILE_CACHE_MAXSIZE"
4
4
  DEFAULT_READ_YAML_FILE_CACHE_MAXSIZE = 256
5
+ RASA_PRO_BETA_PREDICATES_IN_RESPONSE_CONDITIONS_ENV_VAR_NAME = (
6
+ "RASA_PRO_BETA_PREDICATES_IN_RESPONSE_CONDITIONS"
7
+ )
@@ -1,4 +1,4 @@
1
- from typing import Optional, Dict, Any
1
+ from typing import Any, Dict, Optional
2
2
 
3
3
 
4
4
  class EmbeddingsHealthCheckMixin:
@@ -1,16 +1,16 @@
1
1
  import os
2
2
  import sys
3
- from typing import Optional, Dict, Any
3
+ from typing import Any, Dict, Optional
4
4
 
5
5
  from rasa.shared.constants import (
6
+ LLM_API_HEALTH_CHECK_DEFAULT_VALUE,
6
7
  LLM_API_HEALTH_CHECK_ENV_VAR,
7
8
  MODELS_CONFIG_KEY,
8
- LLM_API_HEALTH_CHECK_DEFAULT_VALUE,
9
9
  )
10
10
  from rasa.shared.exceptions import ProviderClientValidationError
11
11
  from rasa.shared.providers.embedding.embedding_client import EmbeddingClient
12
12
  from rasa.shared.providers.llm.llm_client import LLMClient
13
- from rasa.shared.utils.llm import llm_factory, structlogger, embedder_factory
13
+ from rasa.shared.utils.llm import embedder_factory, llm_factory, structlogger
14
14
 
15
15
 
16
16
  def try_instantiate_llm_client(
@@ -1,4 +1,4 @@
1
- from typing import Optional, Dict, Any
1
+ from typing import Any, Dict, Optional
2
2
 
3
3
 
4
4
  class LLMHealthCheckMixin:
rasa/shared/utils/io.py CHANGED
@@ -12,7 +12,7 @@ from collections import OrderedDict
12
12
  from functools import wraps
13
13
  from hashlib import md5
14
14
  from pathlib import Path
15
- from typing import Any, cast, Callable, Dict, List, Optional, Text, Type, TypeVar, Union
15
+ from typing import Any, Callable, Dict, List, Optional, Text, Type, TypeVar, Union, cast
16
16
 
17
17
  import portalocker
18
18