rasa-pro 3.12.0.dev1__py3-none-any.whl → 3.12.0.dev3__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 (499) 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 +116 -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 +281 -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 -8
  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 -497
  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 -28
  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 -81
  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 +2 -0
  463. rasa/tracing/instrumentation/instrumentation.py +4 -4
  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.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/METADATA +8 -9
  493. rasa_pro-3.12.0.dev3.dist-info/RECORD +800 -0
  494. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +0 -1
  495. rasa/shared/providers/constants.py +0 -7
  496. rasa_pro-3.12.0.dev1.dist-info/RECORD +0 -790
  497. {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/NOTICE +0 -0
  498. {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/WHEEL +0 -0
  499. {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,161 @@
1
+ mapping:
2
+ fixtures:
3
+ allowempty: True
4
+ type: "seq"
5
+ sequence:
6
+ - type: map
7
+ mapping:
8
+ regex;(^[a-zA-Z_]+[a-zA-Z0-9_]*$):
9
+ type: "seq"
10
+ sequence:
11
+ - type: map
12
+ mapping:
13
+ regex;(^[a-zA-Z_]+[a-zA-Z0-9_]*$):
14
+ type: any
15
+
16
+ metadata:
17
+ allowempty: True
18
+ type: "seq"
19
+ sequence:
20
+ - type: map
21
+ mapping:
22
+ regex;(^[a-zA-Z_]+[a-zA-Z0-9_]*$):
23
+ type: map
24
+ mapping:
25
+ regex;(^[a-zA-Z_]+[a-zA-Z0-9_]*$):
26
+ type: any
27
+
28
+ stub_custom_actions:
29
+ type: map
30
+ mapping:
31
+ regex;(^[a-zA-Z_]+([a-zA-Z0-9_]*::?)*[a-zA-Z0-9_]*$):
32
+ type: map
33
+ mapping:
34
+ events:
35
+ type: seq
36
+ sequence:
37
+ - type: map
38
+ matching: any
39
+ mapping:
40
+ event:
41
+ type: "str"
42
+ enum: ["user", "bot", "slot", "session_started", "action", "reset_slots", "restart", "reminder", "cancel_reminder", "pause", "resume", "followup", "export", "undo", "rewind", "entities", "active_loop", "agent", "loop_interrupted", "action_execution_rejected"]
43
+ timestamp:
44
+ type: float
45
+ metadata:
46
+ type: map
47
+ mapping:
48
+ regex;(^[a-zA-Z_]+[a-zA-Z0-9_]*$):
49
+ type: any
50
+ text:
51
+ type: "str"
52
+ parse_data:
53
+ type: map
54
+ mapping:
55
+ regex;(^[a-zA-Z_]+[a-zA-Z0-9_]*$):
56
+ type: any
57
+ input_channel:
58
+ type: "str"
59
+ data:
60
+ type: map
61
+ mapping:
62
+ regex;(^[a-zA-Z_]+[a-zA-Z0-9_]*$):
63
+ type: any
64
+ name:
65
+ type: "str"
66
+ value:
67
+ type: any
68
+ entities:
69
+ type: any
70
+ intent:
71
+ type: "str"
72
+ kill_on_user_message:
73
+ type: bool
74
+ date_time:
75
+ type: "str"
76
+ policy:
77
+ type: "str"
78
+ confidence:
79
+ type: float
80
+ is_interrupted:
81
+ type: bool
82
+
83
+ responses:
84
+ type: seq
85
+ sequence:
86
+ - type: map
87
+ matching: any
88
+ mapping:
89
+ text:
90
+ type: "str"
91
+ buttons:
92
+ type: "seq"
93
+ sequence:
94
+ - type: map
95
+ mapping:
96
+ payload:
97
+ type: "str"
98
+ title:
99
+ type: "str"
100
+ response:
101
+ type: "str"
102
+ image:
103
+ type: "str"
104
+ attachment:
105
+ type: "str"
106
+ elements:
107
+ type: "seq"
108
+ sequence:
109
+ - type: map
110
+ mapping:
111
+ regex;(^[a-zA-Z_]+[a-zA-Z0-9_]*$):
112
+ type: any
113
+ custom:
114
+ type: map
115
+ mapping:
116
+ regex;(^[a-zA-Z_]+[a-zA-Z0-9_]*$):
117
+ type: any
118
+
119
+ test_cases:
120
+ type: "seq"
121
+ sequence:
122
+ - type: map
123
+ mapping:
124
+ test_case:
125
+ type: "str"
126
+ required: True
127
+ fixtures:
128
+ allowempty: True
129
+ type: "seq"
130
+ sequence:
131
+ - type: "str"
132
+ pattern: ^[a-zA-Z_]+[a-zA-Z0-9_]*$
133
+ metadata:
134
+ type: "str"
135
+ pattern: ^[a-zA-Z_]+[a-zA-Z0-9_]*$
136
+ steps:
137
+ type: "seq"
138
+ matching: "any"
139
+ required: True
140
+ sequence:
141
+ - type: map
142
+ mapping:
143
+ user:
144
+ type: str
145
+ required: True
146
+ commands:
147
+ type: "seq"
148
+ required: True
149
+ sequence:
150
+ - type: "str"
151
+ metadata:
152
+ type: "str"
153
+ pattern: ^[a-zA-Z_]+[a-zA-Z0-9_]*$
154
+ - type: map
155
+ mapping:
156
+ utter:
157
+ type: "str"
158
+ - type: map
159
+ mapping:
160
+ bot:
161
+ type: "str"
@@ -1,54 +1,372 @@
1
- from typing import List, Dict
1
+ from collections import defaultdict
2
+ from pathlib import Path
3
+ from typing import TYPE_CHECKING, Any, Dict, List, Union
2
4
 
5
+ import rich
6
+
7
+ import rasa.shared.data
8
+ from rasa.dialogue_understanding_test.command_metric_calculation import CommandMetrics
9
+ from rasa.dialogue_understanding_test.constants import SCHEMA_FILE_PATH
3
10
  from rasa.dialogue_understanding_test.du_test_result import (
4
- DialogueUnderstandingTestResult,
11
+ DialogueUnderstandingTestSuiteResult,
12
+ FailedTestStep,
13
+ )
14
+ from rasa.e2e_test.constants import KEY_TEST_CASE, KEY_TEST_CASES
15
+ from rasa.e2e_test.e2e_test_case import (
16
+ DialogueUnderstandingTestCase,
17
+ Fixture,
18
+ Metadata,
19
+ TestSuite,
20
+ )
21
+ from rasa.e2e_test.stub_custom_action import StubCustomAction
22
+ from rasa.e2e_test.utils.io import (
23
+ check_beta_feature_flag_for_custom_actions_stubs,
24
+ extract_fixtures,
25
+ extract_metadata,
26
+ extract_stub_custom_actions,
27
+ extract_test_case_from_path,
28
+ is_test_case_file,
29
+ parse_raw_yaml,
30
+ validate_path_to_test_cases,
31
+ validate_test_case,
32
+ )
33
+ from rasa.shared.core.flows import FlowsList
34
+ from rasa.shared.utils.yaml import (
35
+ read_schema_file,
36
+ validate_yaml_content_using_schema,
37
+ write_yaml,
5
38
  )
6
- from rasa.e2e_test.e2e_test_case import TestSuite
7
39
 
40
+ if TYPE_CHECKING:
41
+ from rasa.dialogue_understanding.commands import Command
8
42
 
9
- def read_test_suite(test_case_path: str) -> TestSuite:
43
+
44
+ def read_du_test_schema() -> Union[List[Any], Dict[str, Any]]:
45
+ """Read the schema for the dialogue understanding test cases.
46
+
47
+ Returns:
48
+ Dict[str, Any]: Schema for the dialogue understanding test cases.
49
+ """
50
+ return read_schema_file(SCHEMA_FILE_PATH)
51
+
52
+
53
+ def read_test_suite(
54
+ test_case_path: str,
55
+ flows: FlowsList,
56
+ custom_command_classes: List["Command"] = [],
57
+ remove_default_commands: List[str] = [],
58
+ ) -> TestSuite:
10
59
  """Read the test cases from the given test case path.
11
60
 
12
61
  Args:
13
62
  test_case_path: Path to the test cases.
63
+ flows: List of flows.
64
+ custom_command_classes: Custom command classes to use in the test cases.
65
+ remove_default_commands: Default commands to remove from the test cases.
14
66
 
15
67
  Returns:
16
68
  TestSuite: Test suite containing the dialogue understanding test cases.
17
69
  """
18
- return TestSuite([], [], [], {})
70
+
71
+ def _extract_test_cases(
72
+ test_file_content: dict,
73
+ test_case_name: str,
74
+ test_file: str,
75
+ flows: FlowsList,
76
+ custom_command_classes: List["Command"] = [],
77
+ remove_default_commands: List[str] = [],
78
+ ) -> List[DialogueUnderstandingTestCase]:
79
+ """Extract test cases from the test file content.
80
+
81
+ Args:
82
+ test_file_content: Content of the test file.
83
+ test_case_name: Name of the test case to extract.
84
+ test_file: Path to the test file.
85
+ flows: List of flows.
86
+
87
+ Returns:
88
+ List of test cases.
89
+ """
90
+ test_cases_content = test_file_content.get(KEY_TEST_CASES) or []
91
+ if test_case_name:
92
+ return [
93
+ DialogueUnderstandingTestCase.from_dict(
94
+ test_case_dict,
95
+ flows,
96
+ file=test_file,
97
+ custom_command_classes=custom_command_classes,
98
+ remove_default_commands=remove_default_commands,
99
+ )
100
+ for test_case_dict in test_cases_content
101
+ if test_case_name == test_case_dict.get(KEY_TEST_CASE)
102
+ ]
103
+ return [
104
+ DialogueUnderstandingTestCase.from_dict(
105
+ test_case_dict,
106
+ flows,
107
+ file=test_file,
108
+ custom_command_classes=custom_command_classes,
109
+ remove_default_commands=remove_default_commands,
110
+ )
111
+ for test_case_dict in test_cases_content
112
+ ]
113
+
114
+ # Extract test case path and name
115
+ test_case_path, test_case_name = extract_test_case_from_path(test_case_path)
116
+ validate_path_to_test_cases(test_case_path)
117
+
118
+ # Load test files and schema
119
+ test_files = rasa.shared.data.get_data_files([test_case_path], is_test_case_file)
120
+ test_schema = read_du_test_schema()
121
+
122
+ # Initialize containers
123
+ input_test_cases = []
124
+ fixtures: Dict[str, Fixture] = {}
125
+ metadata: Dict[str, Metadata] = {}
126
+ stub_custom_actions: Dict[str, StubCustomAction] = {}
127
+
128
+ # Process each test file
129
+ for test_file in test_files:
130
+ test_file_content = parse_raw_yaml(Path(test_file).read_text(encoding="utf-8"))
131
+
132
+ # Validate YAML content using the provided function
133
+ validate_yaml_content_using_schema(test_file_content, test_schema)
134
+
135
+ # Parse test cases, fixtures, metadata, and stub custom actions
136
+ test_cases = _extract_test_cases(
137
+ test_file_content,
138
+ test_case_name,
139
+ test_file,
140
+ flows,
141
+ custom_command_classes,
142
+ remove_default_commands,
143
+ )
144
+ fixtures.update(extract_fixtures(test_file_content, fixtures))
145
+ metadata.update(extract_metadata(test_file_content, metadata))
146
+ stub_custom_actions.update(
147
+ extract_stub_custom_actions(test_file_content, test_file)
148
+ )
149
+ input_test_cases.extend(test_cases)
150
+
151
+ validate_test_case(test_case_name, input_test_cases, fixtures, metadata)
152
+ if stub_custom_actions:
153
+ check_beta_feature_flag_for_custom_actions_stubs()
154
+
155
+ return TestSuite(
156
+ input_test_cases,
157
+ list(fixtures.values()),
158
+ list(metadata.values()),
159
+ stub_custom_actions,
160
+ )
19
161
 
20
162
 
21
163
  def write_test_results_to_file(
22
- failed_tests: List[DialogueUnderstandingTestResult],
23
- passed_tests: List[DialogueUnderstandingTestResult],
24
- command_metrics: Dict[str, Dict[str, float]],
164
+ test_suite_result: DialogueUnderstandingTestSuiteResult,
25
165
  output_file: str,
26
166
  output_prompt: bool,
27
167
  ) -> None:
28
168
  """Write the test results to the given output file.
29
169
 
30
170
  Args:
31
- failed_tests: Failed test cases.
32
- passed_tests: Passed test cases.
33
- command_metrics: Metrics for the commands.
171
+ test_suite_result: Test results suite containing the test results.
34
172
  output_file: Path to the output file.
35
173
  output_prompt: Whether to log the prompt or not.
36
174
  """
37
- pass
175
+ write_yaml(
176
+ test_suite_result.to_dict(output_prompt),
177
+ target=output_file,
178
+ should_preserve_key_order=True,
179
+ )
180
+
181
+ print(f"Results written to '{output_file}'.")
38
182
 
39
183
 
40
184
  def print_test_results(
41
- failed_tests: List[DialogueUnderstandingTestResult],
42
- passed_tests: List[DialogueUnderstandingTestResult],
43
- command_metrics: Dict[str, Dict[str, float]],
185
+ test_suite_result: DialogueUnderstandingTestSuiteResult,
44
186
  output_prompt: bool,
45
187
  ) -> None:
46
- """Print the test results to console.
188
+ """Print the result of the test run.
189
+
190
+ Example output (truncated for brevity):
191
+ =================================================================== FAILURES
192
+ ===================================================================
193
+
194
+ ---------------- test_case:
195
+ /Users/milos/Projects/rasa-calm-demo/dialogue_understanding_tests/
196
+ immediate_cancellation_and_start_of_new_flow.yml::
197
+ user immediately cancels and starts new flow -----------------
198
+
199
+ == failure starting at user message 'I want to send money'.
200
+
201
+ -- COMMAND GENERATOR(s) --
202
+ SingleStepLLMCommandGenerator
203
+
204
+ -- CONVERSATION --
205
+ user: I want to send money
206
+ ---EXPECTED--- | ---PREDICTED---
207
+ StartFlow(transfer_money) | StartFlow(transfer_money)
208
+ SetSlot(transfer_money_amount_of_money, 878) |
209
+
210
+ ...
211
+
212
+ set slot (2 commands in total):
213
+ tp: 0 fp: 1 fn: 2
214
+ precision: 0.0000
215
+ recall : 0.0000
216
+ f1 : 0.0000
217
+
218
+ cancel flow (1 commands in total):
219
+ tp: 1 fp: 0 fn: 0
220
+ precision: 1.0000
221
+ recall : 1.0000
222
+ f1 : 1.0000
223
+
224
+ =================================== 1 failed test cases, 0 passed test cases
225
+ ===================================
226
+ ======== 2 failed user steps, 1 passed user steps (accuracy: 0.3333) ========
47
227
 
48
228
  Args:
49
- failed_tests: Failed test cases.
50
- passed_tests: Passed test cases.
51
- command_metrics: Metrics for the commands.
229
+ test_suite_result: Test results suite containing the test results.
52
230
  output_prompt: Whether to log the prompt or not.
53
231
  """
54
- pass
232
+ if (
233
+ test_suite_result.number_of_passed_tests
234
+ + test_suite_result.number_of_failed_tests
235
+ == 0
236
+ ):
237
+ # no tests were run, print error
238
+ rasa.shared.utils.cli.print_error(
239
+ rasa.shared.utils.cli.pad("No test cases found.", char="!")
240
+ )
241
+ return
242
+
243
+ if test_suite_result.number_of_failed_tests > 0:
244
+ # print failure headline
245
+ print()
246
+ rich.print(
247
+ f"[bold][red3]"
248
+ f"{rasa.shared.utils.cli.pad('FAILURES', char='=')}"
249
+ f"[/red3][/bold]"
250
+ )
251
+
252
+ # print failed test steps
253
+ print_failed_cases(test_suite_result, output_prompt=output_prompt)
254
+
255
+ print_command_summary(test_suite_result.command_metrics)
256
+ print_final_line(test_suite_result)
257
+
258
+
259
+ def print_failed_cases(
260
+ test_suite_result: DialogueUnderstandingTestSuiteResult,
261
+ output_prompt: bool,
262
+ ) -> None:
263
+ """Print the details of a failed test case."""
264
+ # Group the failed test steps by test case
265
+ step_groups = defaultdict(list)
266
+ for step in test_suite_result.failed_test_steps:
267
+ key = f"{step.file}::{step.test_case_name}"
268
+ step_groups[key].append(step)
269
+
270
+ for failed_test_case, failed_test_steps in step_groups.items():
271
+ fail_headline = f"test_case: {failed_test_case}"
272
+ print()
273
+ rasa.shared.utils.cli.print_error(
274
+ f"{rasa.shared.utils.cli.pad(fail_headline, char='-')}\n"
275
+ )
276
+ print(f"Number of failed steps: {len(failed_test_steps)}")
277
+ for step in failed_test_steps:
278
+ print()
279
+ rasa.shared.utils.cli.print_info(
280
+ f"== failure starting at user message "
281
+ f"'{step.failed_user_utterance}'. "
282
+ )
283
+
284
+ rich.print("\n[red3]-- COMMAND GENERATOR(s) --[/red3]")
285
+ rich.print("\n".join(step.command_generators))
286
+ if output_prompt:
287
+ print_prompt(step)
288
+ rich.print("\n[red3]-- CONVERSATION --[/red3]")
289
+ rich.print("\n".join(step.conversation_with_diff))
290
+
291
+
292
+ def print_prompt(step: FailedTestStep) -> None:
293
+ if step.prompt is None:
294
+ return
295
+ prompt_data = step.prompt
296
+
297
+ rich.print("\n[red3]-- PROMPT(s) --[/red3]")
298
+ for component, prompts in prompt_data.items():
299
+ rich.print(f"[bold]{component}[/bold]")
300
+ for subcomponent, prompt in prompts:
301
+ rich.print(f" [bold]{subcomponent}[/bold]")
302
+ rich.print(f" {prompt}")
303
+
304
+
305
+ def print_command_summary(metrics: Dict[str, CommandMetrics]) -> None:
306
+ """Print the command summary.
307
+
308
+ Args:
309
+ metrics: Dict of command to precision, recall, f1, etc. scores
310
+ """
311
+ print()
312
+ rasa.shared.utils.cli.print_info(rasa.shared.utils.cli.pad("COMMAND METRICS"))
313
+
314
+ for command_name, command_metric in metrics.items():
315
+ rasa.shared.utils.cli.print_info(
316
+ f"{command_name} " f"({command_metric.total_count} commands in total):"
317
+ )
318
+ rasa.shared.utils.cli.print_info(
319
+ f" tp: {command_metric.tp} "
320
+ f"fp: {command_metric.fp} "
321
+ f"fn: {command_metric.fn}"
322
+ )
323
+ rasa.shared.utils.cli.print_info(
324
+ f" precision: {command_metric.get_precision():.4f}"
325
+ )
326
+ rasa.shared.utils.cli.print_info(
327
+ f" recall : {command_metric.get_recall():.4f}"
328
+ )
329
+ rasa.shared.utils.cli.print_info(
330
+ f" f1 : {command_metric.get_f1_score():.4f}"
331
+ )
332
+
333
+
334
+ def print_final_line(test_suite_result: DialogueUnderstandingTestSuiteResult) -> None:
335
+ """Print the final line of the test output.
336
+
337
+ Args:
338
+ test_suite_result: Test suite result.
339
+ """
340
+ has_failed = test_suite_result.number_of_failed_tests > 0
341
+
342
+ final_line_color = "green3" if not has_failed else "red3"
343
+
344
+ def _print_accuracy_line(number_passed: int, number_failed: int, type: str) -> None:
345
+ if number_passed > 0:
346
+ line = rasa.shared.utils.cli.pad(
347
+ f"[bold red3]{number_failed} failed {type}[/bold red3]"
348
+ f"[bright_white], [/bright_white]"
349
+ f"[bold green3]{number_passed} passed {type}[/bold green3]"
350
+ f"[bright_white] "
351
+ f"(accuracy: {number_passed / (number_passed + number_failed):.4f})"
352
+ f"[/bright_white]"
353
+ )
354
+ else:
355
+ line = rasa.shared.utils.cli.pad(
356
+ f"[bold red3]{number_failed} failed {type}[/bold red3]"
357
+ f"[bright_white], [/bright_white]"
358
+ f"[bold green3]{number_passed} passed {type}[/bold green3]"
359
+ )
360
+ rich.print(f"[{final_line_color}]{line}[/{final_line_color}]")
361
+
362
+ _print_accuracy_line(
363
+ test_suite_result.number_of_passed_tests,
364
+ test_suite_result.number_of_failed_tests,
365
+ "test cases",
366
+ )
367
+
368
+ _print_accuracy_line(
369
+ test_suite_result.number_of_passed_user_utterances,
370
+ test_suite_result.number_of_failed_user_utterances,
371
+ "user steps",
372
+ )
@@ -0,0 +1,28 @@
1
+ from typing import Any, Dict, Optional
2
+
3
+ from rasa.shared.exceptions import RasaException
4
+
5
+
6
+ class TestCaseTrackerSimulatorException(RasaException):
7
+ def __init__(
8
+ self,
9
+ test_case_name: str,
10
+ user_message: Optional[str] = None,
11
+ failure_reason: Optional[str] = None,
12
+ original_exception: Optional[Dict[str, Any]] = None,
13
+ ):
14
+ super().__init__("An error occurred while simulating a conversation.")
15
+ self.test_case_name = test_case_name
16
+ self.user_message = user_message
17
+ self.original_exception = original_exception
18
+ self.failure_reason = failure_reason
19
+
20
+ def __str__(self) -> str:
21
+ s = f"{self.__class__.__name__}:"
22
+ s += f"\nTest case: {self.test_case_name}"
23
+ if self.user_message is not None:
24
+ s += f"\nUser message: {self.user_message}"
25
+ if self.failure_reason is not None:
26
+ s += f"\nFailure reason: {self.failure_reason}"
27
+ s += f"\nOriginal error: {self.original_exception}\n"
28
+ return s