rasa-pro 3.12.0.dev2__py3-none-any.whl → 3.12.0.dev4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rasa-pro might be problematic. Click here for more details.

Files changed (502) hide show
  1. rasa/__main__.py +7 -7
  2. rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
  3. rasa/anonymization/anonymization_pipeline.py +3 -3
  4. rasa/anonymization/anonymization_rule_executor.py +1 -1
  5. rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
  6. rasa/cli/arguments/data.py +2 -2
  7. rasa/cli/arguments/evaluate.py +2 -1
  8. rasa/cli/arguments/interactive.py +1 -1
  9. rasa/cli/arguments/run.py +1 -1
  10. rasa/cli/arguments/test.py +7 -5
  11. rasa/cli/arguments/train.py +3 -3
  12. rasa/cli/arguments/visualize.py +2 -2
  13. rasa/cli/arguments/x.py +1 -0
  14. rasa/cli/data.py +4 -3
  15. rasa/cli/dialogue_understanding_test.py +121 -18
  16. rasa/cli/evaluate.py +1 -1
  17. rasa/cli/export.py +6 -6
  18. rasa/cli/interactive.py +4 -5
  19. rasa/cli/llm_fine_tuning.py +5 -5
  20. rasa/cli/markers.py +1 -2
  21. rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
  22. rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
  23. rasa/cli/shell.py +2 -3
  24. rasa/cli/studio/download.py +1 -2
  25. rasa/cli/studio/studio.py +2 -3
  26. rasa/cli/studio/train.py +0 -1
  27. rasa/cli/telemetry.py +2 -2
  28. rasa/cli/test.py +11 -11
  29. rasa/cli/utils.py +7 -5
  30. rasa/core/__init__.py +0 -1
  31. rasa/core/actions/action.py +42 -21
  32. rasa/core/actions/action_hangup.py +1 -1
  33. rasa/core/actions/action_repeat_bot_messages.py +2 -2
  34. rasa/core/actions/action_run_slot_rejections.py +2 -2
  35. rasa/core/actions/action_trigger_chitchat.py +1 -1
  36. rasa/core/actions/action_trigger_flow.py +5 -5
  37. rasa/core/actions/action_trigger_search.py +1 -1
  38. rasa/core/actions/forms.py +14 -12
  39. rasa/core/actions/http_custom_action_executor.py +8 -1
  40. rasa/core/actions/loops.py +3 -3
  41. rasa/core/actions/two_stage_fallback.py +13 -13
  42. rasa/core/auth_retry_tracker_store.py +1 -2
  43. rasa/core/brokers/broker.py +2 -1
  44. rasa/core/brokers/file.py +1 -1
  45. rasa/core/brokers/kafka.py +8 -8
  46. rasa/core/brokers/pika.py +8 -9
  47. rasa/core/brokers/sql.py +4 -3
  48. rasa/core/channels/__init__.py +3 -0
  49. rasa/core/channels/botframework.py +2 -2
  50. rasa/core/channels/callback.py +4 -4
  51. rasa/core/channels/channel.py +11 -11
  52. rasa/core/channels/console.py +0 -1
  53. rasa/core/channels/development_inspector.py +6 -6
  54. rasa/core/channels/facebook.py +5 -5
  55. rasa/core/channels/hangouts.py +7 -8
  56. rasa/core/channels/inspector/dist/assets/{arc-861ddd57.js → arc-632a63ec.js} +1 -1
  57. rasa/core/channels/inspector/dist/assets/{c4Diagram-d0fbc5ce-921f02db.js → c4Diagram-d0fbc5ce-081e0df4.js} +1 -1
  58. rasa/core/channels/inspector/dist/assets/{classDiagram-936ed81e-b436c4f8.js → classDiagram-936ed81e-3df0afc2.js} +1 -1
  59. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-c3cb15f1-511a23cb.js → classDiagram-v2-c3cb15f1-8c5ed31e.js} +1 -1
  60. rasa/core/channels/inspector/dist/assets/{createText-62fc7601-ef476ecd.js → createText-62fc7601-89c73b31.js} +1 -1
  61. rasa/core/channels/inspector/dist/assets/{edges-f2ad444c-f1878e0a.js → edges-f2ad444c-4fc48c3e.js} +1 -1
  62. rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-fac75185.js → erDiagram-9d236eb7-907e0440.js} +1 -1
  63. rasa/core/channels/inspector/dist/assets/{flowDb-1972c806-201c5bbc.js → flowDb-1972c806-9ec53a3c.js} +1 -1
  64. rasa/core/channels/inspector/dist/assets/{flowDiagram-7ea5b25a-f904ae41.js → flowDiagram-7ea5b25a-41da787a.js} +1 -1
  65. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +1 -0
  66. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-abe16c3d-1813da66.js → flowchart-elk-definition-abe16c3d-ce370633.js} +1 -1
  67. rasa/core/channels/inspector/dist/assets/{ganttDiagram-9b5ea136-872af172.js → ganttDiagram-9b5ea136-90a36523.js} +1 -1
  68. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-99d0ae7c-34a0af5a.js → gitGraphDiagram-99d0ae7c-41e1aa3f.js} +1 -1
  69. rasa/core/channels/inspector/dist/assets/{index-2c4b9a3b-42ba3e3d.js → index-2c4b9a3b-e6f2af62.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{index-37817b51.js → index-e793d777.js} +3 -3
  71. rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-6b731386.js → infoDiagram-736b4530-8ceba4db.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-e8579ac6.js → journeyDiagram-df861f2b-960d3809.js} +1 -1
  73. rasa/core/channels/inspector/dist/assets/{layout-89e6403a.js → layout-498807d8.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{line-dc73d3fc.js → line-eeccc4e2.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/{linear-f5b1d2bc.js → linear-8a078617.js} +1 -1
  76. rasa/core/channels/inspector/dist/assets/{mindmap-definition-beec6740-82cb74fa.js → mindmap-definition-beec6740-396d17dd.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-bdf5f29b.js → pieDiagram-dbbf0591-dc9b5e1b.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-c7a0cbe4.js → quadrantDiagram-4d7f4fd6-a08cba6d.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-7ec5410f.js → requirementDiagram-6fc4c22a-87242b9e.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-8f13d901-caee5554.js → sankeyDiagram-8f13d901-53f6f391.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-b655622a-2935f8db.js → sequenceDiagram-b655622a-715c9c20.js} +1 -1
  82. rasa/core/channels/inspector/dist/assets/{stateDiagram-59f0c015-8f5d9693.js → stateDiagram-59f0c015-2e8fb31f.js} +1 -1
  83. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-2b26beab-d565d1de.js → stateDiagram-v2-2b26beab-7e2d2aa0.js} +1 -1
  84. rasa/core/channels/inspector/dist/assets/{styles-080da4f6-75ad421d.js → styles-080da4f6-4420cea6.js} +1 -1
  85. rasa/core/channels/inspector/dist/assets/{styles-3dcbcfbf-7e764226.js → styles-3dcbcfbf-28676cf4.js} +1 -1
  86. rasa/core/channels/inspector/dist/assets/{styles-9c745c82-7a4e0e61.js → styles-9c745c82-cef936a6.js} +1 -1
  87. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-4835440b-4019d1bf.js → svgDrawCommon-4835440b-151251e9.js} +1 -1
  88. rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-01ea12df.js → timeline-definition-5b62e21b-0d39bdb2.js} +1 -1
  89. rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-89407137.js → xychartDiagram-2b33534f-a03fa445.js} +1 -1
  90. rasa/core/channels/inspector/dist/index.html +3 -1
  91. rasa/core/channels/inspector/index.html +2 -0
  92. rasa/core/channels/inspector/src/App.tsx +1 -4
  93. rasa/core/channels/mattermost.py +4 -4
  94. rasa/core/channels/rasa_chat.py +4 -4
  95. rasa/core/channels/rest.py +11 -12
  96. rasa/core/channels/rocketchat.py +4 -3
  97. rasa/core/channels/slack.py +6 -5
  98. rasa/core/channels/socketio.py +7 -28
  99. rasa/core/channels/studio_chat.py +193 -0
  100. rasa/core/channels/telegram.py +73 -41
  101. rasa/core/channels/twilio.py +3 -3
  102. rasa/core/channels/vier_cvg.py +2 -2
  103. rasa/core/channels/voice_ready/audiocodes.py +8 -8
  104. rasa/core/channels/voice_ready/jambonz.py +5 -5
  105. rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
  106. rasa/core/channels/voice_ready/twilio_voice.py +9 -8
  107. rasa/core/channels/voice_ready/utils.py +1 -1
  108. rasa/core/channels/voice_stream/asr/asr_engine.py +2 -2
  109. rasa/core/channels/voice_stream/asr/azure.py +2 -2
  110. rasa/core/channels/voice_stream/asr/deepgram.py +57 -16
  111. rasa/core/channels/voice_stream/browser_audio.py +9 -6
  112. rasa/core/channels/voice_stream/call_state.py +2 -1
  113. rasa/core/channels/voice_stream/tts/azure.py +1 -2
  114. rasa/core/channels/voice_stream/tts/cartesia.py +5 -4
  115. rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
  116. rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
  117. rasa/core/channels/voice_stream/twilio_media_streams.py +10 -7
  118. rasa/core/channels/voice_stream/util.py +1 -1
  119. rasa/core/channels/voice_stream/voice_channel.py +15 -15
  120. rasa/core/channels/webexteams.py +3 -4
  121. rasa/core/evaluation/marker.py +7 -6
  122. rasa/core/evaluation/marker_base.py +15 -16
  123. rasa/core/evaluation/marker_stats.py +3 -4
  124. rasa/core/evaluation/marker_tracker_loader.py +5 -4
  125. rasa/core/exporter.py +4 -4
  126. rasa/core/featurizers/precomputation.py +8 -8
  127. rasa/core/featurizers/single_state_featurizer.py +7 -7
  128. rasa/core/featurizers/tracker_featurizers.py +13 -13
  129. rasa/core/http_interpreter.py +3 -4
  130. rasa/core/information_retrieval/__init__.py +1 -1
  131. rasa/core/information_retrieval/faiss.py +4 -4
  132. rasa/core/information_retrieval/information_retrieval.py +2 -2
  133. rasa/core/information_retrieval/milvus.py +3 -3
  134. rasa/core/information_retrieval/qdrant.py +3 -3
  135. rasa/core/jobs.py +1 -0
  136. rasa/core/lock.py +2 -3
  137. rasa/core/lock_store.py +3 -3
  138. rasa/core/migrate.py +11 -8
  139. rasa/core/nlg/__init__.py +1 -1
  140. rasa/core/nlg/callback.py +2 -3
  141. rasa/core/nlg/contextual_response_rephraser.py +63 -13
  142. rasa/core/nlg/generator.py +2 -2
  143. rasa/core/nlg/interpolator.py +4 -3
  144. rasa/core/nlg/response.py +3 -4
  145. rasa/core/nlg/summarize.py +1 -0
  146. rasa/core/persistor.py +3 -3
  147. rasa/core/policies/ensemble.py +10 -9
  148. rasa/core/policies/enterprise_search_policy.py +86 -21
  149. rasa/core/policies/flow_policy.py +13 -14
  150. rasa/core/policies/flows/flow_executor.py +35 -11
  151. rasa/core/policies/intentless_policy.py +6 -7
  152. rasa/core/policies/memoization.py +22 -20
  153. rasa/core/policies/policy.py +24 -22
  154. rasa/core/policies/rule_policy.py +37 -36
  155. rasa/core/policies/ted_policy.py +87 -85
  156. rasa/core/policies/unexpected_intent_policy.py +77 -75
  157. rasa/core/processor.py +96 -65
  158. rasa/core/run.py +1 -1
  159. rasa/core/secrets_manager/endpoints.py +2 -3
  160. rasa/core/secrets_manager/factory.py +2 -3
  161. rasa/core/secrets_manager/secret_manager.py +2 -3
  162. rasa/core/secrets_manager/vault.py +2 -2
  163. rasa/core/test.py +30 -30
  164. rasa/core/tracker_store.py +15 -15
  165. rasa/core/train.py +1 -1
  166. rasa/core/training/__init__.py +2 -2
  167. rasa/core/training/converters/responses_prefix_converter.py +1 -2
  168. rasa/core/training/interactive.py +13 -13
  169. rasa/core/training/story_conflict.py +4 -5
  170. rasa/core/training/training.py +3 -5
  171. rasa/core/utils.py +5 -5
  172. rasa/core/visualize.py +1 -1
  173. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
  174. rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
  175. rasa/dialogue_understanding/commands/__init__.py +22 -22
  176. rasa/dialogue_understanding/commands/can_not_handle_command.py +20 -1
  177. rasa/dialogue_understanding/commands/cancel_flow_command.py +18 -7
  178. rasa/dialogue_understanding/commands/change_flow_command.py +18 -2
  179. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +18 -4
  180. rasa/dialogue_understanding/commands/clarify_command.py +19 -3
  181. rasa/dialogue_understanding/commands/command.py +19 -3
  182. rasa/dialogue_understanding/commands/correct_slots_command.py +3 -3
  183. rasa/dialogue_understanding/commands/error_command.py +1 -1
  184. rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
  185. rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
  186. rasa/dialogue_understanding/commands/human_handoff_command.py +16 -4
  187. rasa/dialogue_understanding/commands/knowledge_answer_command.py +18 -4
  188. rasa/dialogue_understanding/commands/noop_command.py +2 -1
  189. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +16 -4
  190. rasa/dialogue_understanding/commands/restart_command.py +2 -5
  191. rasa/dialogue_understanding/commands/session_end_command.py +3 -5
  192. rasa/dialogue_understanding/commands/session_start_command.py +3 -5
  193. rasa/dialogue_understanding/commands/set_slot_command.py +27 -3
  194. rasa/dialogue_understanding/commands/skip_question_command.py +16 -4
  195. rasa/dialogue_understanding/commands/start_flow_command.py +17 -2
  196. rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
  197. rasa/dialogue_understanding/commands/utils.py +64 -45
  198. rasa/dialogue_understanding/constants.py +1 -0
  199. rasa/dialogue_understanding/generator/command_generator.py +2 -119
  200. rasa/dialogue_understanding/generator/command_parser.py +201 -0
  201. rasa/dialogue_understanding/generator/constants.py +2 -2
  202. rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
  203. rasa/dialogue_understanding/generator/llm_based_command_generator.py +11 -57
  204. rasa/dialogue_understanding/generator/llm_command_generator.py +2 -1
  205. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +67 -120
  206. rasa/dialogue_understanding/generator/nlu_command_adapter.py +8 -10
  207. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +32 -93
  208. rasa/dialogue_understanding/generator/utils.py +45 -0
  209. rasa/dialogue_understanding/patterns/cancel.py +2 -1
  210. rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
  211. rasa/dialogue_understanding/patterns/chitchat.py +1 -1
  212. rasa/dialogue_understanding/patterns/clarify.py +2 -1
  213. rasa/dialogue_understanding/patterns/code_change.py +2 -0
  214. rasa/dialogue_understanding/patterns/collect_information.py +6 -3
  215. rasa/dialogue_understanding/patterns/completed.py +1 -1
  216. rasa/dialogue_understanding/patterns/continue_interrupted.py +10 -1
  217. rasa/dialogue_understanding/patterns/correction.py +4 -2
  218. rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
  219. rasa/dialogue_understanding/patterns/internal_error.py +1 -0
  220. rasa/dialogue_understanding/patterns/search.py +1 -1
  221. rasa/dialogue_understanding/patterns/session_start.py +1 -1
  222. rasa/dialogue_understanding/patterns/skip_question.py +1 -0
  223. rasa/dialogue_understanding/patterns/user_silence.py +1 -1
  224. rasa/dialogue_understanding/processor/command_processor.py +13 -9
  225. rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
  226. rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
  227. rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
  228. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
  229. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
  230. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
  231. rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
  232. rasa/dialogue_understanding/stack/utils.py +8 -4
  233. rasa/dialogue_understanding/utils.py +121 -2
  234. rasa/dialogue_understanding_test/README.md +379 -0
  235. rasa/dialogue_understanding_test/command_comparison.py +60 -0
  236. rasa/dialogue_understanding_test/command_metric_calculation.py +110 -4
  237. rasa/dialogue_understanding_test/constants.py +6 -1
  238. rasa/dialogue_understanding_test/du_test_case.py +252 -38
  239. rasa/dialogue_understanding_test/du_test_result.py +291 -2
  240. rasa/dialogue_understanding_test/du_test_runner.py +239 -10
  241. rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
  242. rasa/dialogue_understanding_test/io.py +338 -20
  243. rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
  244. rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
  245. rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
  246. rasa/dialogue_understanding_test/utils.py +70 -0
  247. rasa/dialogue_understanding_test/validation.py +59 -4
  248. rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
  249. rasa/e2e_test/assertions.py +1 -1
  250. rasa/e2e_test/e2e_config.py +1 -1
  251. rasa/e2e_test/e2e_test_case.py +3 -4
  252. rasa/e2e_test/e2e_test_converter.py +2 -3
  253. rasa/e2e_test/e2e_test_coverage_report.py +6 -6
  254. rasa/e2e_test/e2e_test_result.py +1 -1
  255. rasa/e2e_test/e2e_test_runner.py +134 -31
  256. rasa/e2e_test/stub_custom_action.py +1 -1
  257. rasa/e2e_test/utils/e2e_yaml_utils.py +1 -1
  258. rasa/e2e_test/utils/io.py +132 -65
  259. rasa/e2e_test/utils/validation.py +1 -1
  260. rasa/engine/caching.py +5 -7
  261. rasa/engine/constants.py +1 -1
  262. rasa/engine/graph.py +2 -2
  263. rasa/engine/recipes/default_components.py +13 -15
  264. rasa/engine/recipes/recipe.py +2 -2
  265. rasa/engine/runner/dask.py +2 -2
  266. rasa/engine/runner/interface.py +1 -0
  267. rasa/engine/storage/local_model_storage.py +5 -4
  268. rasa/engine/storage/resource.py +2 -1
  269. rasa/engine/storage/storage.py +5 -3
  270. rasa/engine/training/components.py +2 -1
  271. rasa/engine/training/fingerprinting.py +4 -2
  272. rasa/engine/training/graph_trainer.py +4 -4
  273. rasa/engine/training/hooks.py +2 -2
  274. rasa/engine/validation.py +34 -33
  275. rasa/exceptions.py +3 -2
  276. rasa/graph_components/converters/nlu_message_converter.py +3 -3
  277. rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
  278. rasa/graph_components/providers/domain_provider.py +3 -2
  279. rasa/graph_components/providers/flows_provider.py +2 -3
  280. rasa/graph_components/providers/forms_provider.py +4 -4
  281. rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
  282. rasa/graph_components/providers/responses_provider.py +4 -4
  283. rasa/graph_components/providers/rule_only_provider.py +3 -2
  284. rasa/graph_components/providers/story_graph_provider.py +8 -8
  285. rasa/graph_components/providers/training_tracker_provider.py +3 -2
  286. rasa/graph_components/validators/default_recipe_validator.py +16 -16
  287. rasa/graph_components/validators/finetuning_validator.py +10 -8
  288. rasa/hooks.py +18 -12
  289. rasa/jupyter.py +2 -2
  290. rasa/llm_fine_tuning/annotation_module.py +4 -4
  291. rasa/llm_fine_tuning/conversations.py +6 -6
  292. rasa/llm_fine_tuning/llm_data_preparation_module.py +1 -1
  293. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
  294. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +1 -1
  295. rasa/llm_fine_tuning/paraphrasing_module.py +1 -1
  296. rasa/llm_fine_tuning/storage.py +3 -3
  297. rasa/markers/marker.py +2 -3
  298. rasa/markers/marker_base.py +1 -2
  299. rasa/markers/upload.py +2 -2
  300. rasa/markers/validate.py +2 -3
  301. rasa/model.py +3 -5
  302. rasa/model_manager/config.py +1 -1
  303. rasa/model_manager/model_api.py +5 -4
  304. rasa/model_manager/runner_service.py +6 -6
  305. rasa/model_manager/socket_bridge.py +8 -3
  306. rasa/model_manager/studio_jwt_auth.py +1 -0
  307. rasa/model_manager/trainer_service.py +9 -7
  308. rasa/model_manager/utils.py +1 -1
  309. rasa/model_manager/warm_rasa_process.py +14 -8
  310. rasa/model_service.py +5 -6
  311. rasa/model_testing.py +13 -15
  312. rasa/nlu/classifiers/diet_classifier.py +72 -73
  313. rasa/nlu/classifiers/fallback_classifier.py +9 -11
  314. rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
  315. rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
  316. rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
  317. rasa/nlu/classifiers/regex_message_handler.py +3 -2
  318. rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
  319. rasa/nlu/convert.py +2 -2
  320. rasa/nlu/emulators/dialogflow.py +3 -3
  321. rasa/nlu/emulators/luis.py +5 -5
  322. rasa/nlu/emulators/no_emulator.py +1 -0
  323. rasa/nlu/emulators/wit.py +4 -4
  324. rasa/nlu/extractors/crf_entity_extractor.py +11 -11
  325. rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
  326. rasa/nlu/extractors/entity_synonyms.py +10 -9
  327. rasa/nlu/extractors/extractor.py +16 -16
  328. rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
  329. rasa/nlu/extractors/regex_entity_extractor.py +11 -10
  330. rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
  331. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
  332. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
  333. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
  334. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
  335. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
  336. rasa/nlu/featurizers/featurizer.py +5 -4
  337. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
  338. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
  339. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
  340. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
  341. rasa/nlu/model.py +0 -1
  342. rasa/nlu/selectors/response_selector.py +67 -68
  343. rasa/nlu/test.py +38 -38
  344. rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
  345. rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
  346. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
  347. rasa/nlu/tokenizers/tokenizer.py +6 -7
  348. rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
  349. rasa/nlu/utils/bilou_utils.py +7 -7
  350. rasa/nlu/utils/hugging_face/registry.py +22 -22
  351. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
  352. rasa/nlu/utils/mitie_utils.py +2 -1
  353. rasa/nlu/utils/pattern_utils.py +1 -1
  354. rasa/nlu/utils/spacy_utils.py +3 -3
  355. rasa/plugin.py +12 -1
  356. rasa/server.py +37 -1
  357. rasa/shared/constants.py +22 -2
  358. rasa/shared/core/command_payload_reader.py +15 -7
  359. rasa/shared/core/constants.py +4 -1
  360. rasa/shared/core/conversation.py +1 -2
  361. rasa/shared/core/events.py +47 -37
  362. rasa/shared/core/flows/__init__.py +0 -1
  363. rasa/shared/core/flows/flow.py +11 -11
  364. rasa/shared/core/flows/flow_step.py +19 -13
  365. rasa/shared/core/flows/flow_step_links.py +21 -14
  366. rasa/shared/core/flows/flow_step_sequence.py +6 -4
  367. rasa/shared/core/flows/flows_list.py +3 -3
  368. rasa/shared/core/flows/nlu_trigger.py +1 -1
  369. rasa/shared/core/flows/steps/__init__.py +2 -2
  370. rasa/shared/core/flows/steps/action.py +4 -3
  371. rasa/shared/core/flows/steps/call.py +4 -4
  372. rasa/shared/core/flows/steps/collect.py +7 -4
  373. rasa/shared/core/flows/steps/continuation.py +3 -1
  374. rasa/shared/core/flows/steps/end.py +3 -1
  375. rasa/shared/core/flows/steps/internal.py +3 -2
  376. rasa/shared/core/flows/steps/link.py +6 -4
  377. rasa/shared/core/flows/steps/no_operation.py +7 -5
  378. rasa/shared/core/flows/steps/set_slots.py +4 -3
  379. rasa/shared/core/flows/steps/start.py +3 -1
  380. rasa/shared/core/flows/utils.py +1 -0
  381. rasa/shared/core/flows/validation.py +3 -5
  382. rasa/shared/core/generator.py +20 -21
  383. rasa/shared/core/slot_mappings.py +15 -15
  384. rasa/shared/core/slots.py +3 -3
  385. rasa/shared/core/trackers.py +31 -31
  386. rasa/shared/core/training_data/loading.py +1 -1
  387. rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
  388. rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
  389. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
  390. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
  391. rasa/shared/core/training_data/structures.py +11 -12
  392. rasa/shared/core/training_data/visualization.py +10 -10
  393. rasa/shared/data.py +6 -6
  394. rasa/shared/engine/caching.py +0 -1
  395. rasa/shared/exceptions.py +2 -2
  396. rasa/shared/importers/rasa.py +5 -6
  397. rasa/shared/importers/utils.py +1 -1
  398. rasa/shared/nlu/constants.py +3 -0
  399. rasa/shared/nlu/training_data/entities_parser.py +6 -6
  400. rasa/shared/nlu/training_data/features.py +3 -3
  401. rasa/shared/nlu/training_data/formats/__init__.py +1 -1
  402. rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
  403. rasa/shared/nlu/training_data/formats/luis.py +7 -8
  404. rasa/shared/nlu/training_data/formats/rasa.py +4 -5
  405. rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
  406. rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
  407. rasa/shared/nlu/training_data/formats/wit.py +3 -4
  408. rasa/shared/nlu/training_data/loading.py +4 -4
  409. rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
  410. rasa/shared/nlu/training_data/message.py +13 -14
  411. rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
  412. rasa/shared/nlu/training_data/schemas/responses.yml +1 -0
  413. rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
  414. rasa/shared/nlu/training_data/training_data.py +12 -13
  415. rasa/shared/nlu/training_data/util.py +11 -10
  416. rasa/shared/providers/_configs/azure_openai_client_config.py +3 -119
  417. rasa/shared/providers/_configs/client_config.py +1 -3
  418. rasa/shared/providers/_configs/default_litellm_client_config.py +1 -3
  419. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +1 -3
  420. rasa/shared/providers/_configs/litellm_router_client_config.py +1 -3
  421. rasa/shared/providers/_configs/model_group_config.py +2 -7
  422. rasa/shared/providers/_configs/openai_client_config.py +1 -3
  423. rasa/shared/providers/_configs/rasa_llm_client_config.py +1 -3
  424. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +1 -3
  425. rasa/shared/providers/_configs/utils.py +1 -0
  426. rasa/shared/providers/_ssl_verification_utils.py +5 -6
  427. rasa/shared/providers/_utils.py +5 -5
  428. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
  429. rasa/shared/providers/embedding/azure_openai_embedding_client.py +3 -26
  430. rasa/shared/providers/embedding/embedding_client.py +1 -1
  431. rasa/shared/providers/embedding/litellm_router_embedding_client.py +1 -3
  432. rasa/shared/providers/llm/_base_litellm_client.py +1 -3
  433. rasa/shared/providers/llm/azure_openai_llm_client.py +25 -79
  434. rasa/shared/providers/llm/default_litellm_llm_client.py +1 -3
  435. rasa/shared/providers/llm/litellm_router_llm_client.py +2 -21
  436. rasa/shared/providers/llm/llm_client.py +1 -3
  437. rasa/shared/providers/llm/llm_response.py +41 -2
  438. rasa/shared/providers/llm/openai_llm_client.py +3 -9
  439. rasa/shared/providers/llm/rasa_llm_client.py +6 -20
  440. rasa/shared/providers/llm/self_hosted_llm_client.py +3 -9
  441. rasa/shared/providers/mappings.py +18 -19
  442. rasa/shared/providers/router/_base_litellm_router_client.py +1 -3
  443. rasa/shared/providers/router/router_client.py +1 -3
  444. rasa/shared/utils/cli.py +1 -1
  445. rasa/shared/utils/common.py +1 -1
  446. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
  447. rasa/shared/utils/health_check/health_check.py +3 -3
  448. rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
  449. rasa/shared/utils/io.py +1 -1
  450. rasa/shared/utils/llm.py +5 -9
  451. rasa/shared/utils/pykwalify_extensions.py +1 -1
  452. rasa/shared/utils/schemas/events.py +1 -1
  453. rasa/shared/utils/yaml.py +29 -26
  454. rasa/studio/auth.py +3 -3
  455. rasa/studio/config.py +1 -2
  456. rasa/studio/data_handler.py +3 -3
  457. rasa/studio/download.py +1 -1
  458. rasa/studio/results_logger.py +3 -3
  459. rasa/studio/upload.py +2 -0
  460. rasa/telemetry.py +31 -0
  461. rasa/tracing/config.py +3 -3
  462. rasa/tracing/instrumentation/attribute_extractors.py +54 -0
  463. rasa/tracing/instrumentation/instrumentation.py +25 -5
  464. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
  465. rasa/tracing/instrumentation/metrics.py +11 -11
  466. rasa/tracing/metric_instrument_provider.py +14 -14
  467. rasa/utils/common.py +12 -9
  468. rasa/utils/endpoints.py +1 -1
  469. rasa/utils/io.py +7 -7
  470. rasa/utils/licensing.py +3 -4
  471. rasa/utils/log_utils.py +7 -6
  472. rasa/utils/ml_utils.py +1 -0
  473. rasa/utils/plotting.py +3 -3
  474. rasa/utils/sanic_error_handler.py +1 -1
  475. rasa/utils/tensorflow/callback.py +2 -2
  476. rasa/utils/tensorflow/crf.py +2 -2
  477. rasa/utils/tensorflow/data_generator.py +5 -5
  478. rasa/utils/tensorflow/environment.py +3 -3
  479. rasa/utils/tensorflow/feature_array.py +2 -3
  480. rasa/utils/tensorflow/layers.py +18 -12
  481. rasa/utils/tensorflow/layers_utils.py +2 -1
  482. rasa/utils/tensorflow/metrics.py +2 -2
  483. rasa/utils/tensorflow/model_data.py +7 -7
  484. rasa/utils/tensorflow/model_data_utils.py +10 -9
  485. rasa/utils/tensorflow/models.py +31 -32
  486. rasa/utils/tensorflow/rasa_layers.py +20 -19
  487. rasa/utils/tensorflow/types.py +2 -1
  488. rasa/utils/train_utils.py +23 -21
  489. rasa/utils/url_tools.py +1 -1
  490. rasa/validator.py +17 -1
  491. rasa/version.py +1 -1
  492. {rasa_pro-3.12.0.dev2.dist-info → rasa_pro-3.12.0.dev4.dist-info}/METADATA +9 -10
  493. rasa_pro-3.12.0.dev4.dist-info/RECORD +800 -0
  494. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +0 -1
  495. rasa/shared/providers/_configs/azure_entra_id_client_creds.py +0 -40
  496. rasa/shared/providers/_configs/azure_entra_id_config.py +0 -533
  497. rasa/shared/providers/_configs/oauth_config.py +0 -33
  498. rasa/shared/providers/constants.py +0 -6
  499. rasa_pro-3.12.0.dev2.dist-info/RECORD +0 -793
  500. {rasa_pro-3.12.0.dev2.dist-info → rasa_pro-3.12.0.dev4.dist-info}/NOTICE +0 -0
  501. {rasa_pro-3.12.0.dev2.dist-info → rasa_pro-3.12.0.dev4.dist-info}/WHEEL +0 -0
  502. {rasa_pro-3.12.0.dev2.dist-info → rasa_pro-3.12.0.dev4.dist-info}/entry_points.txt +0 -0
@@ -5,7 +5,7 @@ import difflib
5
5
  from asyncio import CancelledError
6
6
  from collections import defaultdict
7
7
  from pathlib import Path
8
- from typing import Any, DefaultDict, Dict, List, Optional, Text, Tuple, Union
8
+ from typing import Any, Callable, DefaultDict, Dict, List, Optional, Text, Tuple, Union
9
9
  from urllib.parse import urlparse
10
10
 
11
11
  import requests
@@ -18,6 +18,7 @@ from rasa.core.constants import ACTIVE_FLOW_METADATA_KEY, STEP_ID_METADATA_KEY
18
18
  from rasa.core.exceptions import AgentNotReady
19
19
  from rasa.core.persistor import StorageType
20
20
  from rasa.core.utils import AvailableEndpoints
21
+ from rasa.dialogue_understanding_test.du_test_case import DialogueUnderstandingTestCase
21
22
  from rasa.e2e_test.constants import TEST_CASE_NAME, TEST_FILE_NAME
22
23
  from rasa.e2e_test.e2e_config import create_llm_judge_config
23
24
  from rasa.e2e_test.e2e_test_case import (
@@ -123,11 +124,11 @@ class E2ETestRunner:
123
124
  collector: Output channel.
124
125
  steps: List of steps to run.
125
126
  sender_id: The test case name with added timestamp suffix.
126
- test_case_metadata: Metadata of test case.
127
+ test_case_metadata: Metadata of the test case.
127
128
  input_metadata: List of metadata.
128
129
 
129
130
  Returns:
130
- Test turns: {turn_sequence (int) : TestStep or ActualStepOutput}.
131
+ Test turns: {turn_sequence (int): TestStep or ActualStepOutput}.
131
132
  """
132
133
  turns: TEST_TURNS_TYPE = {}
133
134
  event_cursor = 0
@@ -151,9 +152,23 @@ class E2ETestRunner:
151
152
  event_cursor,
152
153
  )
153
154
 
155
+ # This variable tracks the position of the last user step.
156
+ # We use it to determine from which turn onward we should check
157
+ # for failures in case of the fail-fast logic.
158
+ last_user_step_position = 0
154
159
  for position, step in enumerate(steps):
155
160
  if step.actor != "user":
156
161
  turns[position] = step
162
+
163
+ # Check for failures after each bot step
164
+ try:
165
+ self.fail_fast_check(
166
+ test_turns=turns,
167
+ last_user_step_position=last_user_step_position,
168
+ )
169
+ except RasaException:
170
+ break
171
+
157
172
  continue
158
173
  elif not step.text:
159
174
  rasa.shared.utils.io.raise_warning(
@@ -163,6 +178,8 @@ class E2ETestRunner:
163
178
  UserWarning,
164
179
  )
165
180
  continue
181
+ # Update to the current position because we have a valid user step
182
+ last_user_step_position = position
166
183
 
167
184
  metadata = test_case_metadata.metadata if test_case_metadata else {}
168
185
 
@@ -202,6 +219,26 @@ class E2ETestRunner:
202
219
  )
203
220
  return turns
204
221
 
222
+ def fail_fast_check(
223
+ self, test_turns: TEST_TURNS_TYPE, last_user_step_position: int
224
+ ) -> None:
225
+ """Checks whether there are any test failures in 'test_turns'.
226
+
227
+ Args:
228
+ test_turns (TEST_TURNS_TYPE): The transcript of test cases and events.
229
+ last_user_step_position (int): The start position in the test turns.
230
+
231
+ Raises:
232
+ RasaException if a failure is found.
233
+ """
234
+ failures_found = self.find_test_failures(
235
+ test_turns=test_turns,
236
+ test_case=None,
237
+ last_user_step_position=last_user_step_position,
238
+ )
239
+ if failures_found:
240
+ raise RasaException("Test failure found. Aborting early.")
241
+
205
242
  @staticmethod
206
243
  def merge_metadata(
207
244
  sender_id: Text,
@@ -754,13 +791,15 @@ class E2ETestRunner:
754
791
  def find_test_failures(
755
792
  cls,
756
793
  test_turns: TEST_TURNS_TYPE,
757
- test_case: TestCase,
794
+ test_case: Optional[TestCase],
795
+ last_user_step_position: int = 0,
758
796
  ) -> List[Tuple[TestFailure, int]]:
759
797
  """Finds the test failures in the transcript.
760
798
 
761
799
  Args:
762
- test_turns: The transcript of test cases and events.
763
- test_case: The test case.
800
+ test_turns (TEST_TURNS_TYPE): The transcript of test cases and events.
801
+ test_case (Optional[TestCase]): The test case.
802
+ last_user_step_position (int): The start position in the test turns.
764
803
 
765
804
  Returns:
766
805
  The test failures or an empty list if there is no test failure.
@@ -769,9 +808,10 @@ class E2ETestRunner:
769
808
  # with a user step
770
809
  latest_response: ActualStepOutput = test_turns[-1] # type: ignore[assignment]
771
810
  failures = []
772
- position = 0
773
811
  match = None
774
- for position in range(len(test_turns) - 1):
812
+ for position in range(last_user_step_position, len(test_turns) - 1):
813
+ if position not in test_turns:
814
+ continue
775
815
  turn_value = test_turns[position]
776
816
  if isinstance(turn_value, ActualStepOutput):
777
817
  latest_response = turn_value
@@ -924,19 +964,11 @@ class E2ETestRunner:
924
964
  ).name
925
965
  self.agent.endpoints.action.kwargs[TEST_CASE_NAME] = test_case_name
926
966
 
927
- # add timestamp suffix to ensure sender_id is unique
928
- sender_id = f"{test_case_name}_{datetime.datetime.now()}"
929
- test_turns = await self._run_test_case(
930
- sender_id, input_fixtures, input_metadata, test_case
967
+ sender_id = self.generate_sender_id(test_case.name)
968
+ _, test_result = await self._process_test_case(
969
+ test_case, sender_id, input_fixtures, input_metadata
931
970
  )
932
971
 
933
- if not test_case.uses_assertions():
934
- test_result = self.generate_test_result(test_turns, test_case)
935
- else:
936
- test_result = await self.run_assertions(
937
- sender_id, test_case, input_metadata
938
- )
939
-
940
972
  results.append(test_result)
941
973
 
942
974
  coverage = kwargs.get("coverage", False)
@@ -983,6 +1015,32 @@ class E2ETestRunner:
983
1015
  input_metadata,
984
1016
  )
985
1017
 
1018
+ @staticmethod
1019
+ def generate_sender_id(test_case_name: str) -> str:
1020
+ # add timestamp suffix to ensure sender_id is unique
1021
+ return f"{test_case_name}_{datetime.datetime.now()}"
1022
+
1023
+ async def _process_test_case(
1024
+ self,
1025
+ test_case: TestCase,
1026
+ sender_id: str,
1027
+ input_fixtures: List[Fixture],
1028
+ input_metadata: Optional[List[Metadata]],
1029
+ ) -> Tuple[TEST_TURNS_TYPE, TestResult]:
1030
+ """Runs a single test case and returns the test turns and result."""
1031
+ test_turns = await self._run_test_case(
1032
+ sender_id, input_fixtures, input_metadata, test_case
1033
+ )
1034
+
1035
+ if not test_case.uses_assertions():
1036
+ test_result = self.generate_test_result(test_turns, test_case)
1037
+ else:
1038
+ test_result = await self.run_assertions(
1039
+ sender_id, test_case, input_metadata
1040
+ )
1041
+
1042
+ return test_turns, test_result
1043
+
986
1044
  async def run_tests_for_fine_tuning(
987
1045
  self,
988
1046
  input_test_cases: List[TestCase],
@@ -1008,20 +1066,12 @@ class E2ETestRunner:
1008
1066
 
1009
1067
  for i in tqdm(range(len(input_test_cases))):
1010
1068
  test_case = input_test_cases[i]
1011
- # add timestamp suffix to ensure sender_id is unique
1012
- sender_id = f"{test_case.name}_{datetime.datetime.now()}"
1013
- test_turns = await self._run_test_case(
1014
- sender_id, input_fixtures, input_metadata, test_case
1069
+ sender_id = self.generate_sender_id(test_case.name)
1070
+
1071
+ test_turns, test_result = await self._process_test_case(
1072
+ test_case, sender_id, input_fixtures, input_metadata
1015
1073
  )
1016
1074
 
1017
- # check if the e2e test is passing, only convert passing e2e tests into
1018
- # conversations
1019
- if not test_case.uses_assertions():
1020
- test_result = self.generate_test_result(test_turns, test_case)
1021
- else:
1022
- test_result = await self.run_assertions(
1023
- sender_id, test_case, input_metadata
1024
- )
1025
1075
  if not test_result.pass_status:
1026
1076
  structlogger.warning(
1027
1077
  "annotation_module.skip_test_case.failing_e2e_test",
@@ -1040,6 +1090,59 @@ class E2ETestRunner:
1040
1090
 
1041
1091
  return conversations
1042
1092
 
1093
+ async def run_tests_to_convert_tests_to_du_tests(
1094
+ self,
1095
+ input_test_cases: List[TestCase],
1096
+ input_fixtures: List[Fixture],
1097
+ input_metadata: Optional[List[Metadata]],
1098
+ converting_method: Callable[
1099
+ [TEST_TURNS_TYPE, TestCase, bool, bool],
1100
+ Optional[DialogueUnderstandingTestCase],
1101
+ ],
1102
+ ) -> Tuple[
1103
+ List[DialogueUnderstandingTestCase], List[DialogueUnderstandingTestCase]
1104
+ ]:
1105
+ """Runs the test cases to convert them into dialogue understanding tests.
1106
+
1107
+ Converts test cases into dialogue understanding test cases.
1108
+
1109
+ Args:
1110
+ input_test_cases: Input test cases.
1111
+ input_fixtures: Input fixtures.
1112
+ input_metadata: Input metadata.
1113
+ converting_method: The method to convert the e2e test case into a
1114
+ dialogue understanding test case.
1115
+
1116
+ Returns:
1117
+ List of ready dialogue understanding test cases and list of
1118
+ dialogue understanding test cases to review.
1119
+ """
1120
+ ready_du_test_cases = []
1121
+ to_review_du_test_cases = []
1122
+
1123
+ for i in tqdm(range(len(input_test_cases))):
1124
+ test_case = input_test_cases[i]
1125
+ sender_id = self.generate_sender_id(test_case.name)
1126
+
1127
+ test_turns, test_result = await self._process_test_case(
1128
+ test_case, sender_id, input_fixtures, input_metadata
1129
+ )
1130
+
1131
+ du_test_case = converting_method(
1132
+ test_turns,
1133
+ test_case,
1134
+ test_case.uses_assertions(),
1135
+ test_result.pass_status,
1136
+ )
1137
+
1138
+ if du_test_case:
1139
+ if test_result.pass_status:
1140
+ ready_du_test_cases.append(du_test_case)
1141
+ else:
1142
+ to_review_du_test_cases.append(du_test_case)
1143
+
1144
+ return ready_du_test_cases, to_review_du_test_cases
1145
+
1043
1146
  @staticmethod
1044
1147
  def _action_server_is_reachable(
1045
1148
  endpoints: AvailableEndpoints, module: str = "e2e_test_runner"
@@ -1,5 +1,5 @@
1
1
  from dataclasses import dataclass
2
- from typing import Any, Dict, List, Text, Optional
2
+ from typing import Any, Dict, List, Optional, Text
3
3
 
4
4
  from rasa.e2e_test.constants import (
5
5
  KEY_STUB_CUSTOM_ACTIONS,
@@ -45,7 +45,7 @@ class E2ETestYAMLWriter:
45
45
 
46
46
  yaml_data = ruamel.yaml.safe_load(tests)
47
47
 
48
- test_cases_yaml = [{KEY_TEST_CASES: yaml_data}]
48
+ test_cases_yaml = {KEY_TEST_CASES: yaml_data}
49
49
  with open(output_file, "w") as outfile:
50
50
  yaml = ruamel.yaml.YAML()
51
51
  yaml.dump(test_cases_yaml, outfile)
rasa/e2e_test/utils/io.py CHANGED
@@ -6,7 +6,7 @@ import sys
6
6
  from functools import lru_cache
7
7
  from pathlib import Path
8
8
  from textwrap import dedent
9
- from typing import Any, Dict, Generator, List, Optional, TYPE_CHECKING, Tuple, Union
9
+ from typing import TYPE_CHECKING, Any, Dict, Generator, List, Optional, Tuple, Union
10
10
 
11
11
  import matplotlib.pyplot as plt
12
12
  import pandas as pd
@@ -27,7 +27,11 @@ from rasa.e2e_test.constants import (
27
27
  STATUS_PASSED,
28
28
  STUB_CUSTOM_ACTION_NAME_SEPARATOR,
29
29
  )
30
- from rasa.e2e_test.e2e_test_case import Fixture, Metadata, TestSuite, TestCase
30
+ from rasa.e2e_test.e2e_test_case import Fixture, Metadata, TestCase, TestSuite
31
+ from rasa.e2e_test.stub_custom_action import (
32
+ StubCustomAction,
33
+ get_stub_custom_action_key,
34
+ )
31
35
  from rasa.e2e_test.utils.validation import (
32
36
  read_e2e_test_schema,
33
37
  validate_path_to_test_cases,
@@ -41,8 +45,8 @@ from rasa.shared.utils.yaml import (
41
45
  from rasa.utils.beta import BetaNotEnabledException, ensure_beta_feature_is_enabled
42
46
 
43
47
  if TYPE_CHECKING:
44
- from rasa.e2e_test.e2e_test_result import TestResult
45
48
  from rasa.e2e_test.aggregate_test_stats_calculator import AccuracyCalculation
49
+ from rasa.e2e_test.e2e_test_result import TestResult
46
50
 
47
51
 
48
52
  RASA_PRO_BETA_E2E_ASSERTIONS_ENV_VAR_NAME = "RASA_PRO_BETA_E2E_ASSERTIONS"
@@ -274,7 +278,7 @@ def split_into_passed_failed(
274
278
  return passed_cases, failed_cases
275
279
 
276
280
 
277
- def has_test_case_with_assertions(test_cases: List["TestCase"]) -> bool:
281
+ def has_test_case_with_assertions(test_cases: List[TestCase]) -> bool:
278
282
  """Check if the test cases contain assertions."""
279
283
  try:
280
284
  next(test_case for test_case in test_cases if test_case.uses_assertions())
@@ -318,6 +322,104 @@ def is_test_case_file(file_path: Union[str, Path]) -> bool:
318
322
  )
319
323
 
320
324
 
325
+ def extract_test_cases(
326
+ test_file_content: dict,
327
+ test_case_name: str,
328
+ test_file: str,
329
+ ) -> List[TestCase]:
330
+ """Extract test cases from the test file content.
331
+
332
+ Args:
333
+ test_file_content: Content of the test file.
334
+ test_case_name: Name of the test case to extract.
335
+ test_file: Path to the test file.
336
+
337
+ Returns:
338
+ List of test cases.
339
+ """
340
+ test_cases_content = test_file_content.get(KEY_TEST_CASES) or []
341
+ if test_case_name:
342
+ return [
343
+ TestCase.from_dict(test_case_dict, file=test_file)
344
+ for test_case_dict in test_cases_content
345
+ if test_case_name == test_case_dict.get(KEY_TEST_CASE)
346
+ ]
347
+ return [
348
+ TestCase.from_dict(test_case_dict, file=test_file)
349
+ for test_case_dict in test_cases_content
350
+ ]
351
+
352
+
353
+ def extract_fixtures(
354
+ test_file_content: dict, existing_fixtures: Dict[str, Fixture]
355
+ ) -> Dict[str, Fixture]:
356
+ """Extract fixtures from the test file content.
357
+
358
+ Args:
359
+ test_file_content: Content of the test file.
360
+ existing_fixtures: Existing fixtures.
361
+
362
+ Returns:
363
+ Dict of fixtures.
364
+ """
365
+ fixtures_content = test_file_content.get(KEY_FIXTURES) or []
366
+ _fixtures = {}
367
+ for fixture in fixtures_content:
368
+ fixture_obj = Fixture.from_dict(fixture_dict=fixture)
369
+ if existing_fixtures.get(fixture_obj.name) is None:
370
+ _fixtures[fixture_obj.name] = fixture_obj
371
+ return _fixtures
372
+
373
+
374
+ def extract_metadata(
375
+ test_file_content: dict, existing_metadata: Dict[str, Metadata]
376
+ ) -> Dict[str, Metadata]:
377
+ """Extract metadata from the test file content.
378
+
379
+ Args:
380
+ test_file_content: Content of the test file.
381
+ existing_metadata: Existing metadata.
382
+
383
+ Returns:
384
+ Dict of metadata.
385
+ """
386
+ metadata_contents = test_file_content.get(KEY_METADATA) or []
387
+ _metadata = {}
388
+ for metadata_content in metadata_contents:
389
+ metadata_obj = Metadata.from_dict(metadata_dict=metadata_content)
390
+ if existing_metadata.get(metadata_obj.name) is None:
391
+ _metadata[metadata_obj.name] = metadata_obj
392
+ return _metadata
393
+
394
+
395
+ def extract_stub_custom_actions(
396
+ test_file_content: dict, test_file: str
397
+ ) -> Dict[str, StubCustomAction]:
398
+ """Extract stub custom actions from the test file content.
399
+
400
+ Args:
401
+ test_file_content: Content of the test file.
402
+ test_file: Path to the test file.
403
+
404
+ Returns:
405
+ Dict of stub custom actions.
406
+ """
407
+ stub_custom_actions_contents = test_file_content.get(KEY_STUB_CUSTOM_ACTIONS) or {}
408
+ _stub_custom_actions = {}
409
+ for action_name, stub_data in stub_custom_actions_contents.items():
410
+ if STUB_CUSTOM_ACTION_NAME_SEPARATOR in action_name:
411
+ stub_custom_action_key = action_name
412
+ else:
413
+ test_file_name = Path(test_file).name
414
+ stub_custom_action_key = get_stub_custom_action_key(
415
+ test_file_name, action_name
416
+ )
417
+ _stub_custom_actions[stub_custom_action_key] = StubCustomAction.from_dict(
418
+ action_name=action_name, stub_data=stub_data
419
+ )
420
+ return _stub_custom_actions
421
+
422
+
321
423
  def read_test_cases(path: str) -> TestSuite:
322
424
  """Read test cases from the given path.
323
425
 
@@ -327,92 +429,46 @@ def read_test_cases(path: str) -> TestSuite:
327
429
  Returns:
328
430
  TestSuite.
329
431
  """
330
- from rasa.e2e_test.stub_custom_action import (
331
- StubCustomAction,
332
- get_stub_custom_action_key,
333
- )
334
-
432
+ # Extract test case path and name
335
433
  path, test_case_name = extract_test_case_from_path(path)
336
434
  validate_path_to_test_cases(path)
337
435
 
436
+ # Load test files and schema
338
437
  test_files = rasa.shared.data.get_data_files([path], is_test_case_file)
339
438
  e2e_test_schema = read_e2e_test_schema()
340
439
 
440
+ # Initialize containers
341
441
  input_test_cases = []
342
442
  fixtures: Dict[str, Fixture] = {}
343
443
  metadata: Dict[str, Metadata] = {}
344
444
  stub_custom_actions: Dict[str, StubCustomAction] = {}
345
-
346
445
  beta_flag_verified = False
347
446
 
447
+ # Process each test file
348
448
  for test_file in test_files:
349
449
  test_file_content = parse_raw_yaml(Path(test_file).read_text(encoding="utf-8"))
350
450
 
451
+ # Validate YAML content using the provided function
351
452
  validate_yaml_data_using_schema_with_assertions(
352
453
  yaml_data=test_file_content, schema_content=e2e_test_schema
353
454
  )
354
455
 
355
- test_cases_content = test_file_content.get(KEY_TEST_CASES) or []
356
-
357
- if test_case_name:
358
- test_cases = [
359
- TestCase.from_dict(test_case_dict, file=test_file)
360
- for test_case_dict in test_cases_content
361
- if test_case_name == test_case_dict.get(KEY_TEST_CASE)
362
- ]
363
- else:
364
- test_cases = [
365
- TestCase.from_dict(test_case_dict, file=test_file)
366
- for test_case_dict in test_cases_content
367
- ]
456
+ # Parse test cases, fixtures, metadata, and stub custom actions
457
+ test_cases = extract_test_cases(test_file_content, test_case_name, test_file)
458
+ fixtures.update(extract_fixtures(test_file_content, fixtures))
459
+ metadata.update(extract_metadata(test_file_content, metadata))
460
+ stub_custom_actions.update(
461
+ extract_stub_custom_actions(test_file_content, test_file)
462
+ )
368
463
 
369
464
  beta_flag_verified = verify_beta_feature_flag_for_assertions(
370
465
  test_cases, beta_flag_verified
371
466
  )
372
-
373
467
  input_test_cases.extend(test_cases)
374
- fixtures_content = test_file_content.get(KEY_FIXTURES) or []
375
- for fixture in fixtures_content:
376
- fixture_obj = Fixture.from_dict(fixture_dict=fixture)
377
-
378
- # avoid adding duplicates from across multiple files
379
- if fixtures.get(fixture_obj.name) is None:
380
- fixtures[fixture_obj.name] = fixture_obj
381
-
382
- metadata_contents = test_file_content.get(KEY_METADATA) or []
383
- for metadata_content in metadata_contents:
384
- metadata_obj = Metadata.from_dict(metadata_dict=metadata_content)
385
-
386
- # avoid adding duplicates from across multiple files
387
- if metadata.get(metadata_obj.name) is None:
388
- metadata[metadata_obj.name] = metadata_obj
389
-
390
- stub_custom_actions_contents = (
391
- test_file_content.get(KEY_STUB_CUSTOM_ACTIONS) or {}
392
- )
393
-
394
- for action_name, stub_data in stub_custom_actions_contents.items():
395
- if STUB_CUSTOM_ACTION_NAME_SEPARATOR in action_name:
396
- stub_custom_action_key = action_name
397
- else:
398
- test_file_name = Path(test_file).name
399
- stub_custom_action_key = get_stub_custom_action_key(
400
- test_file_name, action_name
401
- )
402
- stub_custom_actions[stub_custom_action_key] = StubCustomAction.from_dict(
403
- action_name=action_name,
404
- stub_data=stub_data,
405
- )
406
468
 
407
469
  validate_test_case(test_case_name, input_test_cases, fixtures, metadata)
408
- try:
409
- if stub_custom_actions:
410
- ensure_beta_feature_is_enabled(
411
- "enabling stubs for custom actions",
412
- RASA_PRO_BETA_STUB_CUSTOM_ACTION_ENV_VAR_NAME,
413
- )
414
- except BetaNotEnabledException as exc:
415
- rasa.shared.utils.cli.print_error_and_exit(str(exc))
470
+ if stub_custom_actions:
471
+ check_beta_feature_flag_for_custom_actions_stubs()
416
472
 
417
473
  return TestSuite(
418
474
  input_test_cases,
@@ -422,8 +478,19 @@ def read_test_cases(path: str) -> TestSuite:
422
478
  )
423
479
 
424
480
 
481
+ def check_beta_feature_flag_for_custom_actions_stubs() -> None:
482
+ """Check the beta feature flag for custom actions stub and exit if not enabled."""
483
+ try:
484
+ ensure_beta_feature_is_enabled(
485
+ "enabling stubs for custom actions",
486
+ RASA_PRO_BETA_STUB_CUSTOM_ACTION_ENV_VAR_NAME,
487
+ )
488
+ except BetaNotEnabledException as exc:
489
+ rasa.shared.utils.cli.print_error_and_exit(str(exc))
490
+
491
+
425
492
  def verify_beta_feature_flag_for_assertions(
426
- test_cases: List["TestCase"], beta_flag_verified: bool
493
+ test_cases: List[TestCase], beta_flag_verified: bool
427
494
  ) -> bool:
428
495
  """Verify the beta feature flag for assertions."""
429
496
  if beta_flag_verified:
@@ -1,6 +1,6 @@
1
1
  import sys
2
2
  from pathlib import Path
3
- from typing import Any, Dict, List, Optional, TYPE_CHECKING, Union
3
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
4
4
 
5
5
  import structlog
6
6
 
rasa/engine/caching.py CHANGED
@@ -5,27 +5,25 @@ import logging
5
5
  import shutil
6
6
  from datetime import datetime
7
7
  from pathlib import Path
8
- from typing import Text, Any, Optional, Tuple, List
8
+ from typing import Any, List, Optional, Text, Tuple
9
9
 
10
+ import sqlalchemy as sa
11
+ import sqlalchemy.orm
10
12
  from packaging import version
11
13
  from sqlalchemy.engine import URL
12
-
13
14
  from sqlalchemy.exc import OperationalError
14
15
  from typing_extensions import Protocol, runtime_checkable
15
16
 
16
17
  import rasa
17
18
  import rasa.model
18
- import rasa.utils.common
19
19
  import rasa.shared.utils.common
20
+ import rasa.utils.common
20
21
  from rasa.constants import MINIMUM_COMPATIBLE_VERSION
21
- import sqlalchemy as sa
22
- import sqlalchemy.orm
23
-
24
22
  from rasa.engine.storage.storage import ModelStorage
25
23
  from rasa.shared.engine.caching import (
24
+ get_cache_database_name,
26
25
  get_local_cache_location,
27
26
  get_max_cache_size,
28
- get_cache_database_name,
29
27
  )
30
28
 
31
29
  logger = logging.getLogger(__name__)
rasa/engine/constants.py CHANGED
@@ -1,9 +1,9 @@
1
1
  from typing import List, Optional
2
2
 
3
3
  from rasa.core.channels import UserMessage
4
+ from rasa.core.utils import AvailableEndpoints
4
5
  from rasa.shared.core.trackers import DialogueStateTracker
5
6
  from rasa.shared.importers.importer import TrainingDataImporter
6
- from rasa.core.utils import AvailableEndpoints
7
7
 
8
8
  PLACEHOLDER_IMPORTER = "__importer__"
9
9
  PLACEHOLDER_MESSAGE = "__message__"
rasa/engine/graph.py CHANGED
@@ -1,12 +1,12 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import asyncio
3
4
  import dataclasses
4
5
  from abc import ABC, abstractmethod
5
6
  from dataclasses import dataclass, field
6
- from typing import Any, Callable, Dict, List, Optional, Text, Type, Tuple, Union
7
+ from typing import Any, Callable, Dict, List, Optional, Text, Tuple, Type, Union
7
8
 
8
9
  import structlog
9
- import asyncio
10
10
 
11
11
  import rasa.shared.utils.common
12
12
  import rasa.utils.common
@@ -1,17 +1,21 @@
1
1
  from rasa.core.policies.enterprise_search_policy import EnterpriseSearchPolicy
2
2
  from rasa.core.policies.flow_policy import FlowPolicy
3
+ from rasa.core.policies.intentless_policy import IntentlessPolicy
4
+ from rasa.core.policies.memoization import AugmentedMemoizationPolicy, MemoizationPolicy
5
+ from rasa.core.policies.rule_policy import RulePolicy
6
+ from rasa.core.policies.ted_policy import TEDPolicy
7
+ from rasa.core.policies.unexpected_intent_policy import UnexpecTEDIntentPolicy
3
8
  from rasa.dialogue_understanding.coexistence.intent_based_router import (
4
9
  IntentBasedRouter,
5
10
  )
6
11
  from rasa.dialogue_understanding.coexistence.llm_based_router import LLMBasedRouter
7
- from rasa.core.policies.intentless_policy import IntentlessPolicy
12
+ from rasa.dialogue_understanding.generator import (
13
+ LLMCommandGenerator,
14
+ )
8
15
  from rasa.dialogue_understanding.generator.nlu_command_adapter import NLUCommandAdapter
9
16
  from rasa.nlu.classifiers.diet_classifier import DIETClassifier
10
17
  from rasa.nlu.classifiers.fallback_classifier import FallbackClassifier
11
18
  from rasa.nlu.classifiers.keyword_intent_classifier import KeywordIntentClassifier
12
- from rasa.dialogue_understanding.generator import (
13
- LLMCommandGenerator,
14
- )
15
19
  from rasa.nlu.classifiers.logistic_regression_classifier import (
16
20
  LogisticRegressionClassifier,
17
21
  )
@@ -21,18 +25,18 @@ from rasa.nlu.extractors.crf_entity_extractor import CRFEntityExtractor
21
25
  from rasa.nlu.extractors.duckling_entity_extractor import DucklingEntityExtractor
22
26
  from rasa.nlu.extractors.entity_synonyms import EntitySynonymMapper
23
27
  from rasa.nlu.extractors.mitie_entity_extractor import MitieEntityExtractor
24
- from rasa.nlu.extractors.spacy_entity_extractor import SpacyEntityExtractor
25
28
  from rasa.nlu.extractors.regex_entity_extractor import RegexEntityExtractor
26
- from rasa.nlu.featurizers.sparse_featurizer.lexical_syntactic_featurizer import (
27
- LexicalSyntacticFeaturizer,
28
- )
29
+ from rasa.nlu.extractors.spacy_entity_extractor import SpacyEntityExtractor
29
30
  from rasa.nlu.featurizers.dense_featurizer.convert_featurizer import ConveRTFeaturizer
31
+ from rasa.nlu.featurizers.dense_featurizer.lm_featurizer import LanguageModelFeaturizer
30
32
  from rasa.nlu.featurizers.dense_featurizer.mitie_featurizer import MitieFeaturizer
31
33
  from rasa.nlu.featurizers.dense_featurizer.spacy_featurizer import SpacyFeaturizer
32
34
  from rasa.nlu.featurizers.sparse_featurizer.count_vectors_featurizer import (
33
35
  CountVectorsFeaturizer,
34
36
  )
35
- from rasa.nlu.featurizers.dense_featurizer.lm_featurizer import LanguageModelFeaturizer
37
+ from rasa.nlu.featurizers.sparse_featurizer.lexical_syntactic_featurizer import (
38
+ LexicalSyntacticFeaturizer,
39
+ )
36
40
  from rasa.nlu.featurizers.sparse_featurizer.regex_featurizer import RegexFeaturizer
37
41
  from rasa.nlu.selectors.response_selector import ResponseSelector
38
42
  from rasa.nlu.tokenizers.jieba_tokenizer import JiebaTokenizer
@@ -42,12 +46,6 @@ from rasa.nlu.tokenizers.whitespace_tokenizer import WhitespaceTokenizer
42
46
  from rasa.nlu.utils.mitie_utils import MitieNLP
43
47
  from rasa.nlu.utils.spacy_utils import SpacyNLP
44
48
 
45
-
46
- from rasa.core.policies.ted_policy import TEDPolicy
47
- from rasa.core.policies.memoization import MemoizationPolicy, AugmentedMemoizationPolicy
48
- from rasa.core.policies.rule_policy import RulePolicy
49
- from rasa.core.policies.unexpected_intent_policy import UnexpecTEDIntentPolicy
50
-
51
49
  DEFAULT_COMPONENTS = [
52
50
  # Message Classifiers
53
51
  DIETClassifier,