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
rasa/shared/utils/llm.py CHANGED
@@ -1,7 +1,9 @@
1
+ import importlib.resources
1
2
  import json
2
3
  from copy import deepcopy
3
4
  from functools import wraps
4
5
  from typing import (
6
+ TYPE_CHECKING,
5
7
  Any,
6
8
  Callable,
7
9
  Dict,
@@ -9,7 +11,6 @@ from typing import (
9
11
  Text,
10
12
  Type,
11
13
  TypeVar,
12
- TYPE_CHECKING,
13
14
  Union,
14
15
  cast,
15
16
  )
@@ -19,19 +20,19 @@ import structlog
19
20
  import rasa.shared.utils.io
20
21
  from rasa.core.utils import AvailableEndpoints
21
22
  from rasa.shared.constants import (
22
- RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_TOO_LONG,
23
- RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_EMPTY,
24
- PROVIDER_CONFIG_KEY,
23
+ DEFAULT_PROMPT_PACKAGE_NAME,
24
+ MODEL_CONFIG_KEY,
25
25
  MODEL_GROUP_CONFIG_KEY,
26
26
  MODEL_GROUP_ID_CONFIG_KEY,
27
27
  MODELS_CONFIG_KEY,
28
+ PROVIDER_CONFIG_KEY,
29
+ RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_EMPTY,
30
+ RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_TOO_LONG,
28
31
  ROUTER_CONFIG_KEY,
29
32
  )
30
33
  from rasa.shared.core.events import BotUttered, UserUttered
31
- from rasa.shared.core.slots import Slot, BooleanSlot, CategoricalSlot
32
- from rasa.shared.engine.caching import (
33
- get_local_cache_location,
34
- )
34
+ from rasa.shared.core.slots import BooleanSlot, CategoricalSlot, Slot
35
+ from rasa.shared.engine.caching import get_local_cache_location
35
36
  from rasa.shared.exceptions import (
36
37
  FileIOException,
37
38
  FileNotFoundException,
@@ -50,13 +51,13 @@ from rasa.shared.providers._configs.self_hosted_llm_client_config import (
50
51
  from rasa.shared.providers.embedding.embedding_client import EmbeddingClient
51
52
  from rasa.shared.providers.llm.llm_client import LLMClient
52
53
  from rasa.shared.providers.mappings import (
53
- get_llm_client_from_provider,
54
54
  AZURE_OPENAI_PROVIDER,
55
+ HUGGINGFACE_LOCAL_EMBEDDING_PROVIDER,
55
56
  OPENAI_PROVIDER,
56
57
  SELF_HOSTED_PROVIDER,
57
- get_embedding_client_from_provider,
58
- HUGGINGFACE_LOCAL_EMBEDDING_PROVIDER,
59
58
  get_client_config_class_from_provider,
59
+ get_embedding_client_from_provider,
60
+ get_llm_client_from_provider,
60
61
  )
61
62
 
62
63
  if TYPE_CHECKING:
@@ -355,13 +356,13 @@ def _combine_single_model_configs(
355
356
  )
356
357
  # Checks for deprecated keys, resolves aliases and returns a valid config.
357
358
  # This is done to ensure that the custom config is valid.
358
- return client_config_clazz.from_dict(custom_config).to_dict()
359
+ return client_config_clazz.from_dict(deepcopy(custom_config)).to_dict()
359
360
 
360
361
  # If the provider is the same in both configs
361
362
  # OR provider is not specified in the custom config
362
363
  # perform MERGE by overriding the default config keys and values
363
364
  # with custom config keys and values.
364
- merged_config = {**default_config.copy(), **custom_config.copy()}
365
+ merged_config = {**deepcopy(default_config), **deepcopy(custom_config)}
365
366
  # Check for deprecated keys, resolve aliases and return a valid config.
366
367
  # This is done to ensure that the merged config is valid.
367
368
  default_config_clazz = get_client_config_class_from_provider(
@@ -512,7 +513,7 @@ def llm_client_factory(
512
513
  Returns:
513
514
  Instantiated LLM based on the configuration.
514
515
  """
515
- config = combine_custom_and_default_config(custom_config, default_config)
516
+ config = combine_custom_and_default_config(deepcopy(custom_config), default_config)
516
517
 
517
518
  ensure_cache()
518
519
 
@@ -641,7 +642,7 @@ def embedder_client_factory(
641
642
  Returns:
642
643
  Instantiated Embedder based on the configuration.
643
644
  """
644
- config = combine_custom_and_default_config(custom_config, default_config)
645
+ config = combine_custom_and_default_config(deepcopy(custom_config), default_config)
645
646
 
646
647
  ensure_cache()
647
648
 
@@ -666,15 +667,96 @@ def get_prompt_template(
666
667
  """
667
668
  try:
668
669
  if jinja_file_path is not None:
669
- return rasa.shared.utils.io.read_file(jinja_file_path)
670
+ prompt_template = rasa.shared.utils.io.read_file(jinja_file_path)
671
+ structlogger.info(
672
+ "utils.llm.get_prompt_template.custom_prompt_template_read_successfull",
673
+ event_info=(
674
+ f"Custom prompt template read successfully from "
675
+ f"`{jinja_file_path}`."
676
+ ),
677
+ prompt_file_path=jinja_file_path,
678
+ )
679
+ return prompt_template
670
680
  except (FileIOException, FileNotFoundException):
671
681
  structlogger.warning(
672
- "Failed to read custom prompt template. Using default template instead.",
673
- jinja_file_path=jinja_file_path,
682
+ "utils.llm.get_prompt_template.failed_to_read_custom_prompt_template",
683
+ event_info=(
684
+ "Failed to read custom prompt template. Using default template instead."
685
+ ),
674
686
  )
675
687
  return default_prompt_template
676
688
 
677
689
 
690
+ def get_default_prompt_template_based_on_model(
691
+ llm_config: Dict[str, Any],
692
+ model_prompt_mapping: Dict[str, Any],
693
+ default_prompt_path: str,
694
+ fallback_prompt_path: str,
695
+ ) -> Text:
696
+ """Returns the default prompt template based on the model name.
697
+
698
+ Args:
699
+ llm_config: The model config.
700
+ model_prompt_mapping: The mapping of model name to prompt template.
701
+ default_prompt_path: The default prompt path of the component.
702
+ fallback_prompt_path: The fallback prompt path for all other models
703
+ that do not have a mapping in the model_prompt_mapping.
704
+
705
+ Returns:
706
+ The default prompt template.
707
+ """
708
+ _llm_config = deepcopy(llm_config)
709
+ if MODELS_CONFIG_KEY in _llm_config:
710
+ _llm_config = _llm_config[MODELS_CONFIG_KEY][0]
711
+ provider = _llm_config.get(PROVIDER_CONFIG_KEY)
712
+ model = _llm_config.get(MODEL_CONFIG_KEY)
713
+ if not model:
714
+ # If the model is not defined, we default to the default prompt template.
715
+ structlogger.info(
716
+ "utils.llm.get_default_prompt_template_based_on_model.using_default_prompt_template",
717
+ event_info=(
718
+ f"Model not defined in the config. Default prompt template read from"
719
+ f" - `{default_prompt_path}`."
720
+ ),
721
+ default_prompt_path=default_prompt_path,
722
+ )
723
+ return importlib.resources.read_text(
724
+ DEFAULT_PROMPT_PACKAGE_NAME, default_prompt_path
725
+ )
726
+
727
+ model_name = model if provider and provider in model else f"{provider}/{model}"
728
+ if prompt_file_path := model_prompt_mapping.get(model_name):
729
+ # If the model is found in the mapping, we use the model-specific prompt
730
+ # template.
731
+ structlogger.info(
732
+ "utils.llm.get_default_prompt_template_based_on_model.using_model_specific_prompt_template",
733
+ event_info=(
734
+ f"Using model-specific default prompt template. Default prompt "
735
+ f"template read from - `{prompt_file_path}`."
736
+ ),
737
+ default_prompt_path=prompt_file_path,
738
+ model_name=model_name,
739
+ )
740
+ return importlib.resources.read_text(
741
+ DEFAULT_PROMPT_PACKAGE_NAME, prompt_file_path
742
+ )
743
+
744
+ # If the model is not found in the mapping, we default to the fallback prompt
745
+ # template.
746
+ structlogger.info(
747
+ "utils.llm.get_default_prompt_template_based_on_model.using_fallback_prompt_template",
748
+ event_info=(
749
+ f"Model not found in the model prompt mapping. Fallback prompt template "
750
+ f"read from - `{fallback_prompt_path}`."
751
+ ),
752
+ fallback_prompt_path=fallback_prompt_path,
753
+ model_name=model_name,
754
+ )
755
+ return importlib.resources.read_text(
756
+ DEFAULT_PROMPT_PACKAGE_NAME, fallback_prompt_path
757
+ )
758
+
759
+
678
760
  def allowed_values_for_slot(slot: Slot) -> Union[str, None]:
679
761
  """Get the allowed values for a slot."""
680
762
  if isinstance(slot, BooleanSlot):
@@ -4,10 +4,15 @@ loaded as an extension of the pykwalify library:
4
4
  https://pykwalify.readthedocs.io/en/latest/extensions.html#extensions
5
5
  """
6
6
 
7
- from typing import Any, List, Dict, Text, Union
7
+ from typing import Any, Dict, List, Text, Union
8
8
 
9
9
  from pykwalify.errors import SchemaError
10
10
 
11
+ from rasa.shared.utils.constants import (
12
+ RASA_PRO_BETA_PREDICATES_IN_RESPONSE_CONDITIONS_ENV_VAR_NAME,
13
+ )
14
+ from rasa.utils.beta import ensure_beta_feature_is_enabled
15
+
11
16
 
12
17
  def require_response_keys(
13
18
  responses: List[Dict[Text, Any]], _: Dict, __: Text
@@ -24,4 +29,23 @@ def require_response_keys(
24
29
  "null 'text' value in response."
25
30
  )
26
31
 
32
+ conditions = response.get("condition", [])
33
+ if isinstance(conditions, str):
34
+ ensure_beta_feature_is_enabled(
35
+ "predicates in response conditions",
36
+ RASA_PRO_BETA_PREDICATES_IN_RESPONSE_CONDITIONS_ENV_VAR_NAME,
37
+ )
38
+ continue
39
+
40
+ for condition in conditions:
41
+ if not isinstance(condition, dict):
42
+ return SchemaError("Condition must be a dictionary.")
43
+ if not all(key in condition for key in ("type", "name", "value")):
44
+ return SchemaError(
45
+ "Condition must have 'type', 'name', and 'value' keys."
46
+ )
47
+
48
+ if condition.get("type") != "slot":
49
+ return SchemaError("Condition type must be of type `slot`.")
50
+
27
51
  return True
@@ -78,7 +78,6 @@ mapping:
78
78
  mappings:
79
79
  type: "seq"
80
80
  required: False
81
- allowempty: False
82
81
  sequence:
83
82
  - type: "map"
84
83
  allowempty: True
@@ -99,6 +98,11 @@ mapping:
99
98
  type: "any"
100
99
  action:
101
100
  type: "str"
101
+ run_action_every_turn:
102
+ type: "str"
103
+ coexistence_system:
104
+ type: "str"
105
+ enum: ["NLU", "CALM", "SHARED"]
102
106
  conditions:
103
107
  type: "seq"
104
108
  sequence:
@@ -112,6 +116,27 @@ mapping:
112
116
  active_flow:
113
117
  type: "str"
114
118
  nullable: True
119
+ validation:
120
+ type: map
121
+ required: false
122
+ mapping:
123
+ rejections:
124
+ type: seq
125
+ required: true
126
+ sequence:
127
+ - type: map
128
+ mapping:
129
+ if:
130
+ type: str
131
+ required: true
132
+ utter:
133
+ type: str
134
+ required: true
135
+ refill_utter:
136
+ type: str
137
+ required: false
138
+ nullable: false
139
+
115
140
  forms:
116
141
  type: "map"
117
142
  required: False
@@ -161,7 +161,7 @@ FLOW_CANCELLED = {
161
161
  }
162
162
  }
163
163
  DIALOGUE_STACK_UPDATED = {
164
- "properties": {"event": {"const": "stack"}, "update": {"type": "array"}}
164
+ "properties": {"event": {"const": "stack"}, "update": {"type": "string"}}
165
165
  }
166
166
  ROUTING_SESSION_ENDED = {"properties": {"event": {"const": "routing_session_ended"}}}
167
167
 
rasa/shared/utils/yaml.py CHANGED
@@ -1,57 +1,57 @@
1
- from contextlib import contextmanager
2
1
  import datetime
3
2
  import io
4
3
  import logging
5
4
  import os
6
5
  import re
7
6
  from collections import OrderedDict
8
- from dataclasses import dataclass
9
- from dataclasses import field
7
+ from contextlib import contextmanager
8
+ from dataclasses import dataclass, field
10
9
  from functools import lru_cache
11
10
  from io import StringIO
12
11
  from pathlib import Path
13
- from typing import Any, Generator, List, Optional, Tuple, Dict, Callable, Union
12
+ from typing import Any, Callable, Dict, Generator, List, Optional, Tuple, Union
14
13
 
15
14
  import jsonschema
16
15
  from importlib_resources import files
17
16
  from packaging import version
18
17
  from pykwalify.core import Core
19
18
  from pykwalify.errors import SchemaError
19
+ from ruamel import yaml as yaml
20
+ from ruamel.yaml import YAML, RoundTripRepresenter, YAMLError
21
+ from ruamel.yaml.comments import CommentedMap, CommentedSeq
22
+ from ruamel.yaml.constructor import BaseConstructor, DuplicateKeyError, ScalarNode
23
+ from ruamel.yaml.loader import SafeLoader
24
+
20
25
  from rasa.shared.constants import (
21
26
  ASSERTIONS_SCHEMA_EXTENSIONS_FILE,
22
27
  ASSERTIONS_SCHEMA_FILE,
23
- MODEL_CONFIG_SCHEMA_FILE,
24
28
  CONFIG_SCHEMA_FILE,
25
29
  DOCS_URL_TRAINING_DATA,
26
- PACKAGE_NAME,
27
30
  LATEST_TRAINING_DATA_FORMAT_VERSION,
28
- SCHEMA_EXTENSIONS_FILE,
31
+ MODEL_CONFIG_SCHEMA_FILE,
32
+ PACKAGE_NAME,
29
33
  RESPONSES_SCHEMA_FILE,
34
+ SCHEMA_EXTENSIONS_FILE,
30
35
  SENSITIVE_DATA,
31
36
  )
32
37
  from rasa.shared.exceptions import (
38
+ FileNotFoundException,
39
+ RasaException,
40
+ SchemaValidationError,
33
41
  YamlException,
34
42
  YamlSyntaxException,
35
- SchemaValidationError,
36
- RasaException,
37
- FileNotFoundException,
38
43
  )
39
44
  from rasa.shared.utils.constants import (
40
45
  DEFAULT_ENCODING,
41
- READ_YAML_FILE_CACHE_MAXSIZE_ENV_VAR,
42
46
  DEFAULT_READ_YAML_FILE_CACHE_MAXSIZE,
47
+ READ_YAML_FILE_CACHE_MAXSIZE_ENV_VAR,
43
48
  )
44
49
  from rasa.shared.utils.io import (
45
- read_file,
46
50
  convert_to_ordered_dict,
47
51
  raise_warning,
52
+ read_file,
48
53
  read_json_file,
49
54
  )
50
- from ruamel import yaml as yaml
51
- from ruamel.yaml import YAML, RoundTripRepresenter, YAMLError
52
- from ruamel.yaml.comments import CommentedSeq, CommentedMap
53
- from ruamel.yaml.constructor import DuplicateKeyError, BaseConstructor, ScalarNode
54
- from ruamel.yaml.loader import SafeLoader
55
55
 
56
56
  logger = logging.getLogger(__name__)
57
57
 
@@ -699,7 +699,9 @@ def read_yaml_file(
699
699
 
700
700
 
701
701
  def read_config_file(
702
- filename: Union[Path, str], reader_type: Union[str, List[str]] = "safe"
702
+ filename: Union[Path, str],
703
+ reader_type: Union[str, List[str]] = "safe",
704
+ expand_env_vars: bool = True,
703
705
  ) -> Dict[str, Any]:
704
706
  """Parses a yaml configuration file. Content needs to be a dictionary.
705
707
 
@@ -713,7 +715,9 @@ def read_config_file(
713
715
  Returns:
714
716
  Parsed config file.
715
717
  """
716
- return read_validated_yaml(filename, CONFIG_SCHEMA_FILE, reader_type)
718
+ return read_validated_yaml(
719
+ filename, CONFIG_SCHEMA_FILE, reader_type, expand_env_vars=expand_env_vars
720
+ )
717
721
 
718
722
 
719
723
  def read_model_configuration(
@@ -1001,8 +1005,8 @@ def validate_yaml_with_jsonschema(
1001
1005
  YamlSyntaxException: if the yaml file is not valid.
1002
1006
  SchemaValidationError: if validation fails.
1003
1007
  """
1004
- from ruamel.yaml import YAMLError
1005
1008
  import importlib_resources
1009
+ from ruamel.yaml import YAMLError
1006
1010
 
1007
1011
  schema_file = str(importlib_resources.files(package_name).joinpath(schema_path))
1008
1012
  schema_content = read_json_file(schema_file)
rasa/studio/auth.py CHANGED
@@ -6,10 +6,10 @@ from pathlib import Path
6
6
  from typing import Any, Dict, List, Optional, Text, Union
7
7
 
8
8
  import jwt
9
- from keycloak import KeycloakOpenID, KeycloakError
9
+ from keycloak import KeycloakError, KeycloakOpenID
10
+
10
11
  from rasa.shared.exceptions import RasaException
11
12
  from rasa.shared.utils.yaml import read_yaml_file, write_yaml
12
-
13
13
  from rasa.studio.config import StudioConfig
14
14
  from rasa.studio.constants import (
15
15
  KEYCLOAK_ACCESS_TOKEN_KEY,
@@ -17,7 +17,7 @@ from rasa.studio.constants import (
17
17
  KEYCLOAK_REFRESH_EXPIRES_IN_KEY,
18
18
  KEYCLOAK_REFRESH_TOKEN,
19
19
  )
20
- from rasa.studio.results_logger import with_studio_error_handler, StudioResult
20
+ from rasa.studio.results_logger import StudioResult, with_studio_error_handler
21
21
 
22
22
 
23
23
  class StudioAuth:
rasa/studio/config.py CHANGED
@@ -4,8 +4,6 @@ import os
4
4
  from dataclasses import dataclass
5
5
  from typing import Any, Dict, Optional, Text
6
6
 
7
- from rasa.utils.common import read_global_config_value, write_global_config_value
8
-
9
7
  from rasa.studio.constants import (
10
8
  RASA_STUDIO_AUTH_SERVER_URL_ENV,
11
9
  RASA_STUDIO_CLI_CLIENT_ID_KEY_ENV,
@@ -14,6 +12,7 @@ from rasa.studio.constants import (
14
12
  RASA_STUDIO_CLI_STUDIO_URL_ENV,
15
13
  STUDIO_CONFIG_KEY,
16
14
  )
15
+ from rasa.utils.common import read_global_config_value, write_global_config_value
17
16
 
18
17
  AUTH_SERVER_URL_KEY = "authentication_server_url"
19
18
  STUDIO_URL_KEY = "studio_url"
@@ -3,17 +3,17 @@ import logging
3
3
  from pathlib import Path
4
4
  from typing import Any, Dict, List, Optional, Tuple
5
5
 
6
- import rasa.shared.utils.cli
7
6
  import requests
7
+
8
+ import rasa.shared.utils.cli
8
9
  from rasa.shared.core.domain import KEY_RESPONSES, KEY_SLOTS, Domain
9
10
  from rasa.shared.core.flows.flow import Flow
10
11
  from rasa.shared.exceptions import RasaException
11
12
  from rasa.shared.importers.importer import TrainingDataImporter
12
13
  from rasa.shared.utils.yaml import read_yaml, write_yaml
13
- from rasa.utils.common import get_temp_dir_name
14
-
15
14
  from rasa.studio.auth import KeycloakToken, KeycloakTokenReader, StudioAuth
16
15
  from rasa.studio.config import StudioConfig
16
+ from rasa.utils.common import get_temp_dir_name
17
17
 
18
18
  logger = logging.getLogger(__name__)
19
19
 
rasa/studio/download.py CHANGED
@@ -9,9 +9,9 @@ import structlog
9
9
  import rasa.cli.utils
10
10
  import rasa.shared.utils.cli
11
11
  from rasa.shared.constants import (
12
+ DEFAULT_CONFIG_PATH,
12
13
  DEFAULT_DATA_PATH,
13
14
  DEFAULT_DOMAIN_PATH,
14
- DEFAULT_CONFIG_PATH,
15
15
  DEFAULT_ENDPOINTS_PATH,
16
16
  )
17
17
  from rasa.shared.core.domain import Domain
@@ -1,13 +1,13 @@
1
1
  from dataclasses import dataclass
2
2
  from functools import wraps
3
- from typing import Callable, Any, Dict
3
+ from typing import Any, Callable, Dict
4
4
 
5
5
  import structlog
6
6
  from keycloak.exceptions import KeycloakError
7
- from requests.exceptions import RequestException, Timeout, ConnectionError
7
+ from requests.exceptions import ConnectionError, RequestException, Timeout
8
8
 
9
9
  from rasa.shared.exceptions import RasaException
10
- from rasa.shared.utils.cli import print_success, print_error
10
+ from rasa.shared.utils.cli import print_error, print_success
11
11
  from rasa.studio.config import StudioConfig
12
12
 
13
13
  structlogger = structlog.get_logger()
rasa/studio/upload.py CHANGED
@@ -2,7 +2,7 @@ import argparse
2
2
  import base64
3
3
  import re
4
4
  import sys
5
- from typing import Dict, Iterable, List, Set, Text, Tuple, Union, Any
5
+ from typing import Any, Dict, Iterable, List, Set, Text, Tuple, Union
6
6
 
7
7
  import questionary
8
8
  import requests
@@ -13,13 +13,19 @@ import rasa.cli.utils
13
13
  import rasa.shared.utils.cli
14
14
  import rasa.shared.utils.io
15
15
  from rasa.shared.constants import (
16
- DEFAULT_DOMAIN_PATHS,
16
+ CONFIG_LANGUAGE_KEY,
17
+ CONFIG_LLM_KEY,
18
+ CONFIG_MODEL_NAME_KEY,
19
+ CONFIG_PIPELINE_KEY,
20
+ CONFIG_POLICIES_KEY,
21
+ CONFIG_RECIPE_KEY,
17
22
  DEFAULT_CONFIG_PATH,
23
+ DEFAULT_DOMAIN_PATHS,
18
24
  )
19
25
  from rasa.shared.core.domain import Domain
20
26
  from rasa.shared.core.flows.yaml_flows_io import YAMLFlowsReader, YamlFlowsWriter
21
27
  from rasa.shared.exceptions import RasaException
22
- from rasa.shared.importers.importer import TrainingDataImporter, FlowSyncImporter
28
+ from rasa.shared.importers.importer import FlowSyncImporter, TrainingDataImporter
23
29
  from rasa.shared.nlu.training_data.formats.rasa_yaml import (
24
30
  RasaYAMLReader,
25
31
  RasaYAMLWriter,
@@ -32,6 +38,7 @@ from rasa.studio import results_logger
32
38
  from rasa.studio.auth import KeycloakTokenReader
33
39
  from rasa.studio.config import StudioConfig
34
40
  from rasa.studio.results_logger import StudioResult, with_studio_error_handler
41
+ from rasa.telemetry import track_upload_to_studio_failed
35
42
 
36
43
  structlogger = structlog.get_logger()
37
44
 
@@ -131,13 +138,11 @@ def handle_upload(args: argparse.Namespace) -> None:
131
138
  rasa.shared.utils.cli.print_error_and_exit(
132
139
  "No GraphQL endpoint found in config. Please run `rasa studio config`."
133
140
  )
134
- return
135
141
 
136
142
  if not is_auth_working(endpoint, verify):
137
143
  rasa.shared.utils.cli.print_error_and_exit(
138
144
  "Authentication is invalid or expired. Please run `rasa studio login`."
139
145
  )
140
- return
141
146
 
142
147
  structlogger.info("rasa.studio.upload.loading_data", event_info="Loading data...")
143
148
 
@@ -160,6 +165,16 @@ def handle_upload(args: argparse.Namespace) -> None:
160
165
  upload_nlu_assistant(args, endpoint, verify=verify)
161
166
 
162
167
 
168
+ config_keys = [
169
+ CONFIG_RECIPE_KEY,
170
+ CONFIG_POLICIES_KEY,
171
+ CONFIG_PIPELINE_KEY,
172
+ CONFIG_LANGUAGE_KEY,
173
+ CONFIG_LLM_KEY,
174
+ CONFIG_MODEL_NAME_KEY,
175
+ ]
176
+
177
+
163
178
  def extract_values(data: Dict, keys: List[Text]) -> Dict:
164
179
  """Extracts values for given keys from a dictionary."""
165
180
  return {key: data.get(key) for key in keys if data.get(key)}
@@ -382,6 +397,7 @@ def make_request(endpoint: str, graphql_req: Dict, verify: bool = True) -> Studi
382
397
  )
383
398
 
384
399
  if results_logger.response_has_errors(res.json()):
400
+ track_upload_to_studio_failed(res.json())
385
401
  return StudioResult.error(res.json())
386
402
  return StudioResult.success("Upload successful")
387
403