rasa-pro 3.11.4__py3-none-any.whl → 3.12.0__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (580) hide show
  1. README.md +10 -13
  2. rasa/__main__.py +7 -7
  3. rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
  4. rasa/anonymization/anonymization_pipeline.py +3 -3
  5. rasa/anonymization/anonymization_rule_executor.py +17 -11
  6. rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
  7. rasa/cli/arguments/data.py +2 -2
  8. rasa/cli/arguments/default_arguments.py +1 -1
  9. rasa/cli/arguments/evaluate.py +2 -1
  10. rasa/cli/arguments/interactive.py +1 -1
  11. rasa/cli/arguments/run.py +1 -1
  12. rasa/cli/arguments/test.py +7 -5
  13. rasa/cli/arguments/train.py +3 -3
  14. rasa/cli/arguments/visualize.py +2 -2
  15. rasa/cli/arguments/x.py +1 -0
  16. rasa/cli/data.py +20 -3
  17. rasa/cli/dialogue_understanding_test.py +386 -0
  18. rasa/cli/evaluate.py +1 -1
  19. rasa/cli/export.py +6 -6
  20. rasa/cli/inspect.py +20 -1
  21. rasa/cli/interactive.py +4 -5
  22. rasa/cli/llm_fine_tuning.py +51 -16
  23. rasa/cli/markers.py +1 -2
  24. rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
  25. rasa/cli/project_templates/calm/config.yml +2 -2
  26. rasa/cli/project_templates/calm/domain/list_contacts.yml +1 -2
  27. rasa/cli/project_templates/calm/domain/remove_contact.yml +1 -2
  28. rasa/cli/project_templates/calm/domain/shared.yml +1 -4
  29. rasa/cli/project_templates/calm/endpoints.yml +2 -2
  30. rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
  31. rasa/cli/shell.py +5 -6
  32. rasa/cli/studio/download.py +1 -2
  33. rasa/cli/studio/studio.py +2 -3
  34. rasa/cli/studio/train.py +0 -1
  35. rasa/cli/telemetry.py +2 -2
  36. rasa/cli/test.py +11 -11
  37. rasa/cli/train.py +3 -0
  38. rasa/cli/utils.py +25 -5
  39. rasa/constants.py +0 -1
  40. rasa/core/__init__.py +0 -1
  41. rasa/core/actions/action.py +137 -208
  42. rasa/core/actions/action_handle_digressions.py +164 -0
  43. rasa/core/actions/action_hangup.py +1 -1
  44. rasa/core/actions/action_repeat_bot_messages.py +2 -2
  45. rasa/core/actions/action_run_slot_rejections.py +18 -6
  46. rasa/core/actions/action_trigger_chitchat.py +1 -1
  47. rasa/core/actions/action_trigger_flow.py +5 -5
  48. rasa/core/actions/action_trigger_search.py +1 -1
  49. rasa/core/actions/custom_action_executor.py +1 -1
  50. rasa/core/actions/direct_custom_actions_executor.py +1 -0
  51. rasa/core/actions/forms.py +22 -15
  52. rasa/core/actions/http_custom_action_executor.py +8 -1
  53. rasa/core/actions/loops.py +3 -3
  54. rasa/core/actions/two_stage_fallback.py +13 -13
  55. rasa/core/auth_retry_tracker_store.py +1 -2
  56. rasa/core/brokers/broker.py +2 -1
  57. rasa/core/brokers/file.py +1 -1
  58. rasa/core/brokers/kafka.py +8 -8
  59. rasa/core/brokers/pika.py +8 -9
  60. rasa/core/brokers/sql.py +4 -3
  61. rasa/core/channels/__init__.py +7 -0
  62. rasa/core/channels/botframework.py +2 -2
  63. rasa/core/channels/callback.py +4 -4
  64. rasa/core/channels/channel.py +11 -11
  65. rasa/core/channels/console.py +0 -1
  66. rasa/core/channels/development_inspector.py +80 -24
  67. rasa/core/channels/facebook.py +5 -5
  68. rasa/core/channels/hangouts.py +7 -8
  69. rasa/core/channels/inspector/dist/assets/Tableau10-1b767f5e.js +1 -0
  70. rasa/core/channels/inspector/dist/assets/arc-9f1365dc.js +1 -0
  71. rasa/core/channels/inspector/dist/assets/blockDiagram-38ab4fdb-e0f81b12.js +118 -0
  72. rasa/core/channels/inspector/dist/assets/c4Diagram-3d4e48cf-9deaee1c.js +10 -0
  73. rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
  74. rasa/core/channels/inspector/dist/assets/classDiagram-70f12bd4-20450a96.js +2 -0
  75. rasa/core/channels/inspector/dist/assets/classDiagram-v2-f2320105-749d2abf.js +2 -0
  76. rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
  77. rasa/core/channels/inspector/dist/assets/{createText-62fc7601-89c73b31.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/edges-e0da2a9e-943801a7.js +4 -0
  79. rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-907e0440.js → erDiagram-9861fffd-d523a948.js} +4 -4
  80. rasa/core/channels/inspector/dist/assets/flowDb-956e92f1-54e4cf19.js +10 -0
  81. rasa/core/channels/inspector/dist/assets/flowDiagram-66a62f08-48bfbbe8.js +4 -0
  82. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
  83. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-4a651766-17c30827.js +139 -0
  84. rasa/core/channels/inspector/dist/assets/ganttDiagram-c361ad54-43086f2d.js +257 -0
  85. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-72cf32ee-5c8b693e.js +70 -0
  86. rasa/core/channels/inspector/dist/assets/graph-41a90d26.js +1 -0
  87. rasa/core/channels/inspector/dist/assets/index-3862675e-b43eeae9.js +1 -0
  88. rasa/core/channels/inspector/dist/assets/{index-e793d777.js → index-e8affe45.js} +201 -196
  89. rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-8ceba4db.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-960d3809.js → journeyDiagram-49397b02-39bce7b5.js} +4 -4
  91. rasa/core/channels/inspector/dist/assets/katex-498eb57e.js +261 -0
  92. rasa/core/channels/inspector/dist/assets/layout-dc8eeea4.js +1 -0
  93. rasa/core/channels/inspector/dist/assets/{line-eeccc4e2.js → line-c4d2e756.js} +1 -1
  94. rasa/core/channels/inspector/dist/assets/linear-86f6f2d9.js +1 -0
  95. rasa/core/channels/inspector/dist/assets/mindmap-definition-fc14e90a-4216f771.js +312 -0
  96. rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-dc9b5e1b.js → pieDiagram-8a3498a8-1a0cfa96.js} +7 -7
  97. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-a08cba6d.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
  98. rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-87242b9e.js → requirementDiagram-deff3bca-d4046bed.js} +2 -2
  99. rasa/core/channels/inspector/dist/assets/sankeyDiagram-04a897e0-2cf6d1d7.js +8 -0
  100. rasa/core/channels/inspector/dist/assets/sequenceDiagram-704730f1-751ac4f5.js +122 -0
  101. rasa/core/channels/inspector/dist/assets/stateDiagram-587899a1-f734f4d4.js +1 -0
  102. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-d93cdb3a-91c65710.js +1 -0
  103. rasa/core/channels/inspector/dist/assets/{styles-9c745c82-cef936a6.js → styles-6aaf32cf-e0cff7be.js} +1 -1
  104. rasa/core/channels/inspector/dist/assets/styles-9a916d00-c8029e5d.js +160 -0
  105. rasa/core/channels/inspector/dist/assets/styles-c10674c1-114f312a.js +116 -0
  106. rasa/core/channels/inspector/dist/assets/svgDrawCommon-08f97a94-b7b9dc00.js +1 -0
  107. rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-0d39bdb2.js → timeline-definition-85554ec2-9536d189.js} +3 -3
  108. rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-a03fa445.js → xychartDiagram-e933f94c-bf3b0f36.js} +3 -3
  109. rasa/core/channels/inspector/dist/index.html +1 -1
  110. rasa/core/channels/inspector/package.json +11 -3
  111. rasa/core/channels/inspector/src/App.tsx +15 -2
  112. rasa/core/channels/inspector/src/components/RasaLogo.tsx +31 -0
  113. rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +68 -0
  114. rasa/core/channels/inspector/src/components/Welcome.tsx +19 -13
  115. rasa/core/channels/inspector/yarn.lock +94 -99
  116. rasa/core/channels/mattermost.py +4 -4
  117. rasa/core/channels/rasa_chat.py +4 -4
  118. rasa/core/channels/rest.py +11 -12
  119. rasa/core/channels/rocketchat.py +4 -3
  120. rasa/core/channels/slack.py +6 -5
  121. rasa/core/channels/socketio.py +8 -28
  122. rasa/core/channels/studio_chat.py +212 -0
  123. rasa/core/channels/telegram.py +105 -55
  124. rasa/core/channels/twilio.py +3 -3
  125. rasa/core/channels/vier_cvg.py +2 -2
  126. rasa/core/channels/voice_ready/audiocodes.py +51 -32
  127. rasa/core/channels/voice_ready/jambonz.py +5 -5
  128. rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
  129. rasa/core/channels/voice_ready/twilio_voice.py +9 -8
  130. rasa/core/channels/voice_ready/utils.py +2 -2
  131. rasa/core/channels/voice_stream/asr/asr_engine.py +12 -6
  132. rasa/core/channels/voice_stream/asr/asr_event.py +5 -0
  133. rasa/core/channels/voice_stream/asr/azure.py +16 -3
  134. rasa/core/channels/voice_stream/asr/deepgram.py +76 -19
  135. rasa/core/channels/voice_stream/audiocodes.py +292 -0
  136. rasa/core/channels/voice_stream/browser_audio.py +14 -7
  137. rasa/core/channels/voice_stream/call_state.py +6 -2
  138. rasa/core/channels/voice_stream/genesys.py +320 -0
  139. rasa/core/channels/voice_stream/tts/azure.py +13 -5
  140. rasa/core/channels/voice_stream/tts/cartesia.py +34 -14
  141. rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
  142. rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
  143. rasa/core/channels/voice_stream/twilio_media_streams.py +12 -8
  144. rasa/core/channels/voice_stream/util.py +1 -1
  145. rasa/core/channels/voice_stream/voice_channel.py +100 -56
  146. rasa/core/channels/webexteams.py +3 -4
  147. rasa/core/constants.py +2 -0
  148. rasa/core/evaluation/marker.py +7 -6
  149. rasa/core/evaluation/marker_base.py +15 -16
  150. rasa/core/evaluation/marker_stats.py +3 -4
  151. rasa/core/evaluation/marker_tracker_loader.py +5 -4
  152. rasa/core/exporter.py +4 -4
  153. rasa/core/featurizers/precomputation.py +8 -8
  154. rasa/core/featurizers/single_state_featurizer.py +7 -7
  155. rasa/core/featurizers/tracker_featurizers.py +13 -13
  156. rasa/core/http_interpreter.py +3 -4
  157. rasa/core/information_retrieval/__init__.py +1 -1
  158. rasa/core/information_retrieval/faiss.py +4 -4
  159. rasa/core/information_retrieval/information_retrieval.py +2 -2
  160. rasa/core/information_retrieval/milvus.py +3 -3
  161. rasa/core/information_retrieval/qdrant.py +3 -3
  162. rasa/core/jobs.py +1 -0
  163. rasa/core/lock.py +2 -3
  164. rasa/core/lock_store.py +3 -3
  165. rasa/core/migrate.py +12 -9
  166. rasa/core/nlg/__init__.py +1 -1
  167. rasa/core/nlg/callback.py +2 -3
  168. rasa/core/nlg/contextual_response_rephraser.py +82 -14
  169. rasa/core/nlg/generator.py +85 -17
  170. rasa/core/nlg/interpolator.py +4 -3
  171. rasa/core/nlg/response.py +9 -7
  172. rasa/core/nlg/summarize.py +1 -0
  173. rasa/core/nlg/translate.py +55 -0
  174. rasa/core/persistor.py +3 -3
  175. rasa/core/policies/ensemble.py +10 -9
  176. rasa/core/policies/enterprise_search_policy.py +87 -21
  177. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +1 -1
  178. rasa/core/policies/flow_policy.py +13 -14
  179. rasa/core/policies/flows/flow_executor.py +85 -55
  180. rasa/core/policies/intentless_policy.py +6 -7
  181. rasa/core/policies/memoization.py +22 -20
  182. rasa/core/policies/policy.py +24 -22
  183. rasa/core/policies/rule_policy.py +37 -36
  184. rasa/core/policies/ted_policy.py +87 -85
  185. rasa/core/policies/unexpected_intent_policy.py +77 -75
  186. rasa/core/processor.py +167 -74
  187. rasa/core/run.py +5 -4
  188. rasa/core/secrets_manager/endpoints.py +2 -3
  189. rasa/core/secrets_manager/factory.py +2 -3
  190. rasa/core/secrets_manager/secret_manager.py +2 -3
  191. rasa/core/secrets_manager/vault.py +2 -2
  192. rasa/core/test.py +30 -30
  193. rasa/core/tracker_store.py +138 -49
  194. rasa/core/train.py +1 -1
  195. rasa/core/training/__init__.py +2 -2
  196. rasa/core/training/converters/responses_prefix_converter.py +1 -2
  197. rasa/core/training/interactive.py +13 -13
  198. rasa/core/training/story_conflict.py +4 -5
  199. rasa/core/training/training.py +3 -5
  200. rasa/core/utils.py +5 -5
  201. rasa/core/visualize.py +1 -1
  202. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
  203. rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
  204. rasa/dialogue_understanding/commands/__init__.py +22 -22
  205. rasa/dialogue_understanding/commands/can_not_handle_command.py +38 -1
  206. rasa/dialogue_understanding/commands/cancel_flow_command.py +96 -9
  207. rasa/dialogue_understanding/commands/change_flow_command.py +36 -2
  208. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +36 -4
  209. rasa/dialogue_understanding/commands/clarify_command.py +46 -4
  210. rasa/dialogue_understanding/commands/command.py +3 -2
  211. rasa/dialogue_understanding/commands/command_syntax_manager.py +55 -0
  212. rasa/dialogue_understanding/commands/correct_slots_command.py +14 -5
  213. rasa/dialogue_understanding/commands/error_command.py +1 -1
  214. rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
  215. rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
  216. rasa/dialogue_understanding/commands/handle_digressions_command.py +144 -0
  217. rasa/dialogue_understanding/commands/human_handoff_command.py +34 -4
  218. rasa/dialogue_understanding/commands/knowledge_answer_command.py +36 -4
  219. rasa/dialogue_understanding/commands/noop_command.py +2 -1
  220. rasa/dialogue_understanding/commands/prompt_command.py +94 -0
  221. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +34 -4
  222. rasa/dialogue_understanding/commands/restart_command.py +2 -5
  223. rasa/dialogue_understanding/commands/session_end_command.py +3 -5
  224. rasa/dialogue_understanding/commands/session_start_command.py +3 -5
  225. rasa/dialogue_understanding/commands/set_slot_command.py +55 -16
  226. rasa/dialogue_understanding/commands/skip_question_command.py +34 -4
  227. rasa/dialogue_understanding/commands/start_flow_command.py +78 -2
  228. rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
  229. rasa/dialogue_understanding/commands/utils.py +126 -43
  230. rasa/dialogue_understanding/constants.py +2 -0
  231. rasa/dialogue_understanding/generator/__init__.py +2 -0
  232. rasa/dialogue_understanding/generator/command_generator.py +120 -79
  233. rasa/dialogue_understanding/generator/command_parser.py +245 -0
  234. rasa/dialogue_understanding/generator/constants.py +12 -4
  235. rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
  236. rasa/dialogue_understanding/generator/llm_based_command_generator.py +187 -59
  237. rasa/dialogue_understanding/generator/llm_command_generator.py +6 -3
  238. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +106 -110
  239. rasa/dialogue_understanding/generator/nlu_command_adapter.py +53 -11
  240. rasa/dialogue_understanding/generator/prompt_templates/__init__.py +0 -0
  241. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +58 -0
  242. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +57 -0
  243. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +574 -0
  244. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +41 -386
  245. rasa/dialogue_understanding/generator/utils.py +76 -0
  246. rasa/dialogue_understanding/patterns/cancel.py +2 -1
  247. rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
  248. rasa/dialogue_understanding/patterns/chitchat.py +1 -1
  249. rasa/dialogue_understanding/patterns/clarify.py +2 -1
  250. rasa/dialogue_understanding/patterns/code_change.py +2 -0
  251. rasa/dialogue_understanding/patterns/collect_information.py +7 -4
  252. rasa/dialogue_understanding/patterns/completed.py +1 -1
  253. rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -1
  254. rasa/dialogue_understanding/patterns/correction.py +17 -3
  255. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +78 -2
  256. rasa/dialogue_understanding/patterns/handle_digressions.py +81 -0
  257. rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
  258. rasa/dialogue_understanding/patterns/internal_error.py +1 -0
  259. rasa/dialogue_understanding/patterns/search.py +1 -1
  260. rasa/dialogue_understanding/patterns/session_start.py +1 -1
  261. rasa/dialogue_understanding/patterns/skip_question.py +1 -0
  262. rasa/dialogue_understanding/patterns/user_silence.py +1 -1
  263. rasa/dialogue_understanding/patterns/validate_slot.py +65 -0
  264. rasa/dialogue_understanding/processor/command_processor.py +193 -43
  265. rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
  266. rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
  267. rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
  268. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
  269. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
  270. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
  271. rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
  272. rasa/dialogue_understanding/stack/utils.py +56 -10
  273. rasa/dialogue_understanding/utils.py +164 -0
  274. rasa/dialogue_understanding_test/README.md +429 -0
  275. rasa/dialogue_understanding_test/__init__.py +0 -0
  276. rasa/dialogue_understanding_test/command_comparison.py +60 -0
  277. rasa/dialogue_understanding_test/command_metric_calculation.py +122 -0
  278. rasa/dialogue_understanding_test/constants.py +22 -0
  279. rasa/dialogue_understanding_test/du_test_case.py +448 -0
  280. rasa/dialogue_understanding_test/du_test_result.py +390 -0
  281. rasa/dialogue_understanding_test/du_test_runner.py +322 -0
  282. rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
  283. rasa/dialogue_understanding_test/io.py +443 -0
  284. rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
  285. rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
  286. rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
  287. rasa/dialogue_understanding_test/utils.py +70 -0
  288. rasa/dialogue_understanding_test/validation.py +77 -0
  289. rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
  290. rasa/e2e_test/assertions.py +202 -175
  291. rasa/e2e_test/assertions_schema.yml +6 -0
  292. rasa/e2e_test/constants.py +16 -1
  293. rasa/e2e_test/e2e_config.py +102 -41
  294. rasa/e2e_test/e2e_config_schema.yml +28 -10
  295. rasa/e2e_test/e2e_test_case.py +5 -5
  296. rasa/e2e_test/e2e_test_converter.py +2 -3
  297. rasa/e2e_test/e2e_test_coverage_report.py +6 -6
  298. rasa/e2e_test/e2e_test_result.py +1 -1
  299. rasa/e2e_test/e2e_test_runner.py +143 -38
  300. rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2 +93 -0
  301. rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2 +169 -0
  302. rasa/e2e_test/stub_custom_action.py +1 -1
  303. rasa/e2e_test/utils/generative_assertions.py +243 -0
  304. rasa/e2e_test/utils/io.py +123 -93
  305. rasa/e2e_test/utils/validation.py +101 -3
  306. rasa/engine/caching.py +5 -7
  307. rasa/engine/constants.py +1 -1
  308. rasa/engine/graph.py +3 -2
  309. rasa/engine/language.py +182 -0
  310. rasa/engine/recipes/config_files/default_config.yml +4 -0
  311. rasa/engine/recipes/default_components.py +13 -15
  312. rasa/engine/recipes/default_recipe.py +65 -49
  313. rasa/engine/recipes/graph_recipe.py +10 -7
  314. rasa/engine/recipes/recipe.py +2 -2
  315. rasa/engine/runner/dask.py +2 -2
  316. rasa/engine/runner/interface.py +1 -0
  317. rasa/engine/storage/local_model_storage.py +6 -4
  318. rasa/engine/storage/resource.py +2 -1
  319. rasa/engine/storage/storage.py +8 -3
  320. rasa/engine/training/components.py +2 -1
  321. rasa/engine/training/fingerprinting.py +4 -2
  322. rasa/engine/training/graph_trainer.py +4 -4
  323. rasa/engine/training/hooks.py +2 -2
  324. rasa/engine/validation.py +36 -33
  325. rasa/exceptions.py +3 -2
  326. rasa/graph_components/converters/nlu_message_converter.py +3 -3
  327. rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
  328. rasa/graph_components/providers/domain_provider.py +3 -2
  329. rasa/graph_components/providers/flows_provider.py +2 -3
  330. rasa/graph_components/providers/forms_provider.py +4 -4
  331. rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
  332. rasa/graph_components/providers/responses_provider.py +4 -4
  333. rasa/graph_components/providers/rule_only_provider.py +3 -2
  334. rasa/graph_components/providers/story_graph_provider.py +8 -8
  335. rasa/graph_components/providers/training_tracker_provider.py +3 -2
  336. rasa/graph_components/validators/default_recipe_validator.py +16 -16
  337. rasa/graph_components/validators/finetuning_validator.py +10 -8
  338. rasa/hooks.py +19 -14
  339. rasa/jupyter.py +2 -2
  340. rasa/llm_fine_tuning/annotation_module.py +4 -4
  341. rasa/llm_fine_tuning/conversations.py +5 -33
  342. rasa/llm_fine_tuning/llm_data_preparation_module.py +6 -4
  343. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
  344. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +18 -13
  345. rasa/llm_fine_tuning/paraphrasing_module.py +6 -2
  346. rasa/llm_fine_tuning/storage.py +3 -3
  347. rasa/llm_fine_tuning/train_test_split_module.py +27 -27
  348. rasa/llm_fine_tuning/utils.py +7 -0
  349. rasa/markers/marker.py +2 -3
  350. rasa/markers/marker_base.py +1 -2
  351. rasa/markers/upload.py +2 -2
  352. rasa/markers/validate.py +2 -3
  353. rasa/model.py +3 -5
  354. rasa/model_manager/config.py +1 -1
  355. rasa/model_manager/model_api.py +5 -4
  356. rasa/model_manager/runner_service.py +13 -10
  357. rasa/model_manager/socket_bridge.py +15 -9
  358. rasa/model_manager/studio_jwt_auth.py +1 -0
  359. rasa/model_manager/trainer_service.py +9 -7
  360. rasa/model_manager/utils.py +1 -1
  361. rasa/model_manager/warm_rasa_process.py +14 -9
  362. rasa/model_service.py +5 -6
  363. rasa/model_testing.py +13 -15
  364. rasa/model_training.py +29 -29
  365. rasa/nlu/classifiers/diet_classifier.py +72 -73
  366. rasa/nlu/classifiers/fallback_classifier.py +9 -8
  367. rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
  368. rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
  369. rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
  370. rasa/nlu/classifiers/regex_message_handler.py +3 -2
  371. rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
  372. rasa/nlu/convert.py +2 -2
  373. rasa/nlu/emulators/dialogflow.py +3 -3
  374. rasa/nlu/emulators/luis.py +5 -5
  375. rasa/nlu/emulators/no_emulator.py +1 -0
  376. rasa/nlu/emulators/wit.py +4 -4
  377. rasa/nlu/extractors/crf_entity_extractor.py +11 -11
  378. rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
  379. rasa/nlu/extractors/entity_synonyms.py +10 -9
  380. rasa/nlu/extractors/extractor.py +16 -16
  381. rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
  382. rasa/nlu/extractors/regex_entity_extractor.py +11 -10
  383. rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
  384. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
  385. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
  386. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
  387. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
  388. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
  389. rasa/nlu/featurizers/featurizer.py +5 -4
  390. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
  391. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
  392. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
  393. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
  394. rasa/nlu/model.py +0 -1
  395. rasa/nlu/selectors/response_selector.py +67 -68
  396. rasa/nlu/test.py +38 -38
  397. rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
  398. rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
  399. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
  400. rasa/nlu/tokenizers/tokenizer.py +6 -7
  401. rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
  402. rasa/nlu/utils/bilou_utils.py +7 -7
  403. rasa/nlu/utils/hugging_face/registry.py +22 -22
  404. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
  405. rasa/nlu/utils/mitie_utils.py +2 -1
  406. rasa/nlu/utils/pattern_utils.py +1 -1
  407. rasa/nlu/utils/spacy_utils.py +3 -3
  408. rasa/plugin.py +12 -1
  409. rasa/server.py +6 -3
  410. rasa/shared/constants.py +45 -18
  411. rasa/shared/core/command_payload_reader.py +15 -7
  412. rasa/shared/core/constants.py +34 -4
  413. rasa/shared/core/conversation.py +1 -2
  414. rasa/shared/core/domain.py +19 -20
  415. rasa/shared/core/events.py +60 -39
  416. rasa/shared/core/flows/__init__.py +0 -1
  417. rasa/shared/core/flows/constants.py +11 -0
  418. rasa/shared/core/flows/flow.py +107 -26
  419. rasa/shared/core/flows/flow_step.py +4 -3
  420. rasa/shared/core/flows/flow_step_links.py +1 -2
  421. rasa/shared/core/flows/flow_step_sequence.py +1 -1
  422. rasa/shared/core/flows/flows_list.py +3 -3
  423. rasa/shared/core/flows/flows_yaml_schema.json +69 -3
  424. rasa/shared/core/flows/nlu_trigger.py +1 -1
  425. rasa/shared/core/flows/steps/__init__.py +2 -2
  426. rasa/shared/core/flows/steps/action.py +1 -1
  427. rasa/shared/core/flows/steps/call.py +1 -1
  428. rasa/shared/core/flows/steps/collect.py +22 -40
  429. rasa/shared/core/flows/steps/internal.py +1 -1
  430. rasa/shared/core/flows/steps/link.py +1 -1
  431. rasa/shared/core/flows/steps/no_operation.py +2 -2
  432. rasa/shared/core/flows/steps/set_slots.py +1 -1
  433. rasa/shared/core/flows/utils.py +44 -4
  434. rasa/shared/core/flows/validation.py +4 -6
  435. rasa/shared/core/generator.py +20 -21
  436. rasa/shared/core/slot_mappings.py +360 -121
  437. rasa/shared/core/slots.py +163 -6
  438. rasa/shared/core/trackers.py +108 -33
  439. rasa/shared/core/training_data/loading.py +1 -1
  440. rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
  441. rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
  442. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
  443. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
  444. rasa/shared/core/training_data/structures.py +11 -12
  445. rasa/shared/core/training_data/visualization.py +10 -10
  446. rasa/shared/data.py +6 -6
  447. rasa/shared/engine/caching.py +0 -1
  448. rasa/shared/exceptions.py +2 -2
  449. rasa/shared/importers/importer.py +58 -2
  450. rasa/shared/importers/rasa.py +5 -6
  451. rasa/shared/importers/utils.py +1 -1
  452. rasa/shared/nlu/constants.py +9 -0
  453. rasa/shared/nlu/training_data/entities_parser.py +6 -6
  454. rasa/shared/nlu/training_data/features.py +3 -3
  455. rasa/shared/nlu/training_data/formats/__init__.py +1 -1
  456. rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
  457. rasa/shared/nlu/training_data/formats/luis.py +7 -8
  458. rasa/shared/nlu/training_data/formats/rasa.py +4 -5
  459. rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
  460. rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
  461. rasa/shared/nlu/training_data/formats/wit.py +3 -4
  462. rasa/shared/nlu/training_data/loading.py +4 -4
  463. rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
  464. rasa/shared/nlu/training_data/message.py +13 -14
  465. rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
  466. rasa/shared/nlu/training_data/schemas/responses.yml +19 -11
  467. rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
  468. rasa/shared/nlu/training_data/training_data.py +12 -13
  469. rasa/shared/nlu/training_data/util.py +11 -10
  470. rasa/shared/providers/_configs/azure_entra_id_config.py +541 -0
  471. rasa/shared/providers/_configs/azure_openai_client_config.py +150 -15
  472. rasa/shared/providers/_configs/client_config.py +3 -1
  473. rasa/shared/providers/_configs/default_litellm_client_config.py +9 -7
  474. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +13 -11
  475. rasa/shared/providers/_configs/litellm_router_client_config.py +12 -10
  476. rasa/shared/providers/_configs/model_group_config.py +8 -5
  477. rasa/shared/providers/_configs/oauth_config.py +33 -0
  478. rasa/shared/providers/_configs/openai_client_config.py +14 -12
  479. rasa/shared/providers/_configs/rasa_llm_client_config.py +5 -3
  480. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +12 -11
  481. rasa/shared/providers/_configs/utils.py +1 -0
  482. rasa/shared/providers/_ssl_verification_utils.py +5 -6
  483. rasa/shared/providers/_utils.py +5 -5
  484. rasa/shared/providers/constants.py +6 -0
  485. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
  486. rasa/shared/providers/embedding/azure_openai_embedding_client.py +32 -7
  487. rasa/shared/providers/embedding/embedding_client.py +1 -1
  488. rasa/shared/providers/embedding/litellm_router_embedding_client.py +5 -2
  489. rasa/shared/providers/llm/_base_litellm_client.py +43 -18
  490. rasa/shared/providers/llm/azure_openai_llm_client.py +90 -34
  491. rasa/shared/providers/llm/default_litellm_llm_client.py +4 -2
  492. rasa/shared/providers/llm/litellm_router_llm_client.py +32 -9
  493. rasa/shared/providers/llm/llm_client.py +24 -8
  494. rasa/shared/providers/llm/llm_response.py +61 -2
  495. rasa/shared/providers/llm/openai_llm_client.py +11 -5
  496. rasa/shared/providers/llm/rasa_llm_client.py +17 -14
  497. rasa/shared/providers/llm/self_hosted_llm_client.py +35 -15
  498. rasa/shared/providers/mappings.py +18 -19
  499. rasa/shared/providers/router/_base_litellm_router_client.py +48 -15
  500. rasa/shared/providers/router/router_client.py +3 -1
  501. rasa/shared/utils/cli.py +1 -1
  502. rasa/shared/utils/common.py +15 -1
  503. rasa/shared/utils/constants.py +3 -0
  504. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
  505. rasa/shared/utils/health_check/health_check.py +3 -3
  506. rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
  507. rasa/shared/utils/io.py +1 -1
  508. rasa/shared/utils/llm.py +100 -18
  509. rasa/shared/utils/pykwalify_extensions.py +25 -1
  510. rasa/shared/utils/schemas/domain.yml +26 -1
  511. rasa/shared/utils/schemas/events.py +1 -1
  512. rasa/shared/utils/yaml.py +24 -20
  513. rasa/studio/auth.py +3 -3
  514. rasa/studio/config.py +1 -2
  515. rasa/studio/data_handler.py +3 -3
  516. rasa/studio/download.py +1 -1
  517. rasa/studio/results_logger.py +3 -3
  518. rasa/studio/upload.py +21 -5
  519. rasa/telemetry.py +127 -48
  520. rasa/tracing/config.py +5 -3
  521. rasa/tracing/constants.py +12 -0
  522. rasa/tracing/instrumentation/attribute_extractors.py +92 -14
  523. rasa/tracing/instrumentation/instrumentation.py +61 -5
  524. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
  525. rasa/tracing/instrumentation/metrics.py +52 -11
  526. rasa/tracing/metric_instrument_provider.py +54 -14
  527. rasa/utils/common.py +12 -24
  528. rasa/utils/endpoints.py +1 -1
  529. rasa/utils/io.py +7 -7
  530. rasa/utils/licensing.py +3 -4
  531. rasa/utils/log_utils.py +7 -6
  532. rasa/utils/ml_utils.py +1 -0
  533. rasa/utils/plotting.py +3 -3
  534. rasa/utils/sanic_error_handler.py +1 -1
  535. rasa/utils/tensorflow/callback.py +2 -2
  536. rasa/utils/tensorflow/crf.py +2 -2
  537. rasa/utils/tensorflow/data_generator.py +5 -5
  538. rasa/utils/tensorflow/environment.py +3 -3
  539. rasa/utils/tensorflow/feature_array.py +2 -3
  540. rasa/utils/tensorflow/layers.py +18 -12
  541. rasa/utils/tensorflow/layers_utils.py +2 -1
  542. rasa/utils/tensorflow/metrics.py +2 -2
  543. rasa/utils/tensorflow/model_data.py +7 -7
  544. rasa/utils/tensorflow/model_data_utils.py +10 -9
  545. rasa/utils/tensorflow/models.py +31 -32
  546. rasa/utils/tensorflow/rasa_layers.py +20 -19
  547. rasa/utils/tensorflow/types.py +2 -1
  548. rasa/utils/train_utils.py +23 -21
  549. rasa/utils/url_tools.py +1 -1
  550. rasa/validator.py +594 -115
  551. rasa/version.py +1 -1
  552. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/METADATA +23 -26
  553. rasa_pro-3.12.0.dist-info/RECORD +829 -0
  554. rasa/core/channels/inspector/dist/assets/arc-632a63ec.js +0 -1
  555. rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-081e0df4.js +0 -10
  556. rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-3df0afc2.js +0 -2
  557. rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-8c5ed31e.js +0 -2
  558. rasa/core/channels/inspector/dist/assets/edges-f2ad444c-4fc48c3e.js +0 -4
  559. rasa/core/channels/inspector/dist/assets/flowDb-1972c806-9ec53a3c.js +0 -6
  560. rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-41da787a.js +0 -4
  561. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +0 -1
  562. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-ce370633.js +0 -139
  563. rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-90a36523.js +0 -266
  564. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-41e1aa3f.js +0 -70
  565. rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-e6f2af62.js +0 -1
  566. rasa/core/channels/inspector/dist/assets/layout-498807d8.js +0 -1
  567. rasa/core/channels/inspector/dist/assets/linear-8a078617.js +0 -1
  568. rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-396d17dd.js +0 -109
  569. rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-53f6f391.js +0 -8
  570. rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-715c9c20.js +0 -122
  571. rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-2e8fb31f.js +0 -1
  572. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-7e2d2aa0.js +0 -1
  573. rasa/core/channels/inspector/dist/assets/styles-080da4f6-4420cea6.js +0 -110
  574. rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-28676cf4.js +0 -159
  575. rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-151251e9.js +0 -1
  576. rasa_pro-3.11.4.dist-info/RECORD +0 -779
  577. /rasa/dialogue_understanding/generator/{single_step → prompt_templates}/command_prompt_template.jinja2 +0 -0
  578. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/NOTICE +0 -0
  579. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/WHEEL +0 -0
  580. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,386 @@
1
+ import argparse
2
+ import asyncio
3
+ import datetime
4
+ import importlib
5
+ import sys
6
+ from typing import Any, Dict, List, Optional, Type, cast
7
+
8
+ import structlog
9
+
10
+ import rasa.cli.utils
11
+ import rasa.shared.utils.cli
12
+ from rasa.cli import SubParsersAction
13
+ from rasa.cli.arguments.default_arguments import (
14
+ add_endpoint_param,
15
+ add_model_param,
16
+ add_remote_storage_param,
17
+ )
18
+ from rasa.core.agent import Agent
19
+ from rasa.core.exceptions import AgentNotReady
20
+ from rasa.core.processor import MessageProcessor
21
+ from rasa.core.utils import AvailableEndpoints
22
+ from rasa.dialogue_understanding.commands import Command
23
+ from rasa.dialogue_understanding.generator import LLMBasedCommandGenerator
24
+ from rasa.dialogue_understanding.generator.command_parser import DEFAULT_COMMANDS
25
+ from rasa.dialogue_understanding_test.command_metric_calculation import (
26
+ calculate_command_metrics,
27
+ )
28
+ from rasa.dialogue_understanding_test.constants import (
29
+ DEFAULT_INPUT_TESTS_PATH,
30
+ KEY_STUB_CUSTOM_ACTIONS,
31
+ )
32
+ from rasa.dialogue_understanding_test.du_test_result import (
33
+ DialogueUnderstandingTestResult,
34
+ DialogueUnderstandingTestSuiteResult,
35
+ )
36
+ from rasa.dialogue_understanding_test.du_test_runner import (
37
+ DialogueUnderstandingTestRunner,
38
+ )
39
+ from rasa.dialogue_understanding_test.io import (
40
+ read_test_suite,
41
+ write_test_results_to_file,
42
+ )
43
+ from rasa.dialogue_understanding_test.validation import (
44
+ validate_cli_arguments,
45
+ validate_test_cases,
46
+ )
47
+ from rasa.e2e_test.e2e_test_case import TestSuite
48
+ from rasa.exceptions import RasaException
49
+ from rasa.shared.constants import (
50
+ DEFAULT_ENDPOINTS_PATH,
51
+ LLM_CONFIG_KEY,
52
+ ROUTE_TO_CALM_SLOT,
53
+ )
54
+ from rasa.shared.core.domain import Domain
55
+ from rasa.shared.core.flows import FlowsList
56
+ from rasa.shared.utils.llm import (
57
+ combine_custom_and_default_config,
58
+ resolve_model_client_config,
59
+ )
60
+ from rasa.utils.beta import ensure_beta_feature_is_enabled
61
+ from rasa.utils.endpoints import EndpointConfig
62
+
63
+ RASA_PRO_BETA_DIALOGUE_UNDERSTANDING_TEST_ENV_VAR_NAME = (
64
+ "RASA_PRO_BETA_DIALOGUE_UNDERSTANDING_TEST"
65
+ )
66
+
67
+ structlogger = structlog.get_logger()
68
+
69
+
70
+ def add_subparser(
71
+ subparsers: SubParsersAction, parents: List[argparse.ArgumentParser]
72
+ ) -> None:
73
+ """Add the dialogue understanding test subparser to `rasa test`.
74
+
75
+ Args:
76
+ subparsers: subparser we are going to attach to
77
+ parents: Parent parsers, needed to ensure tree structure in argparse
78
+ """
79
+ for subparser in subparsers.choices.values():
80
+ if subparser.prog == "rasa test":
81
+ du_test_subparser = create_du_test_subparser(parents)
82
+
83
+ for action in subparser._subparsers._actions:
84
+ if action.choices is not None:
85
+ action.choices["du"] = du_test_subparser
86
+ return
87
+
88
+ # If we get here, we couldn't hook the subparser to `rasa test`
89
+ raise RasaException(
90
+ "Hooking the dialogue understanding (du) test subparser to "
91
+ "`rasa test` command could not be completed. "
92
+ "Cannot run dialogue understanding testing."
93
+ )
94
+
95
+
96
+ def create_du_test_subparser(
97
+ parents: List[argparse.ArgumentParser],
98
+ ) -> argparse.ArgumentParser:
99
+ """Create dialogue understanding test subparser."""
100
+ du_test_subparser = argparse.ArgumentParser(
101
+ prog="rasa test du",
102
+ parents=parents,
103
+ conflict_handler="resolve",
104
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter,
105
+ description="Runs dialogue understanding testing.",
106
+ )
107
+
108
+ du_test_subparser.set_defaults(func=execute_dialogue_understanding_tests)
109
+
110
+ add_du_test_arguments(du_test_subparser)
111
+ add_bot_arguments(du_test_subparser)
112
+
113
+ return du_test_subparser
114
+
115
+
116
+ def add_bot_arguments(parser: argparse.ArgumentParser) -> None:
117
+ bot_arguments = parser.add_argument_group("Bot Settings")
118
+ add_model_param(bot_arguments, add_positional_arg=False)
119
+ add_endpoint_param(
120
+ bot_arguments,
121
+ help_text="Configuration file for the model server and the connectors as a "
122
+ "yml file.",
123
+ )
124
+ add_remote_storage_param(bot_arguments)
125
+
126
+
127
+ def add_du_test_arguments(parser: argparse.ArgumentParser) -> None:
128
+ """Arguments for running dialogue understanding tests."""
129
+ du_arguments = parser.add_argument_group("Testing Settings")
130
+ du_arguments.add_argument(
131
+ "path-to-test-cases",
132
+ nargs="?",
133
+ type=str,
134
+ default=DEFAULT_INPUT_TESTS_PATH,
135
+ help="Input file or folder containing dialogue understanding test cases.",
136
+ )
137
+ du_arguments.add_argument(
138
+ "--output-file",
139
+ type=str,
140
+ default="dialogue_understanding_test_{date:%Y%m%d-%H%M%S}.yml".format(
141
+ date=datetime.datetime.now()
142
+ ),
143
+ help="Path to the output file to write the results to.",
144
+ )
145
+ du_arguments.add_argument(
146
+ "--no-output",
147
+ action="store_true",
148
+ help="If set, no output file will be written to disk.",
149
+ )
150
+ du_arguments.add_argument(
151
+ "--output-prompt",
152
+ action="store_true",
153
+ help="If set, the dialogue understanding test output will contain "
154
+ "prompts for each failure.",
155
+ )
156
+ du_arguments.add_argument(
157
+ "--additional-commands",
158
+ type=str,
159
+ nargs="*",
160
+ help=(
161
+ "List of additional custom command classes to add, separated by spaces. "
162
+ "For example: --additional-commands my_module.MyCustomCommand"
163
+ ),
164
+ )
165
+ du_arguments.add_argument(
166
+ "--remove-default-commands",
167
+ type=str,
168
+ nargs="*",
169
+ help=(
170
+ f"List of default commands to remove, separated by spaces. "
171
+ f"Default commands include: "
172
+ f"{', '.join([command.__name__ for command in DEFAULT_COMMANDS])}. "
173
+ f"For example: --remove-default-commands ClarifyCommand HumanHandoffCommand"
174
+ ),
175
+ )
176
+
177
+
178
+ def ensure_calm_only_bot(agent: Agent) -> None:
179
+ if agent.domain is None or agent.processor is None:
180
+ return
181
+
182
+ if ROUTE_TO_CALM_SLOT in [slot.name for slot in agent.domain.slots]:
183
+ rasa.shared.utils.cli.print_error(
184
+ "You are using coexistence. Dialogue Understanding Tests do only work for "
185
+ "CALM only assistants."
186
+ )
187
+ sys.exit(0)
188
+
189
+ if not agent.processor.is_calm_assistant:
190
+ rasa.shared.utils.cli.print_error(
191
+ "Dialogue Understanding Tests do only work for CALM assistants. "
192
+ "Your assistant does not use CALM."
193
+ )
194
+ sys.exit(0)
195
+
196
+
197
+ def execute_dialogue_understanding_tests(args: argparse.Namespace) -> None:
198
+ """Run the dialogue understanding tests.
199
+
200
+ Args:
201
+ args: Commandline arguments.
202
+ """
203
+ ensure_beta_feature_is_enabled(
204
+ "Dialogue Understanding (DU) Testing",
205
+ env_flag=RASA_PRO_BETA_DIALOGUE_UNDERSTANDING_TEST_ENV_VAR_NAME,
206
+ )
207
+
208
+ # basic validation of the passed CLI arguments
209
+ validate_cli_arguments(args)
210
+
211
+ # initialization of endpoints
212
+ endpoints = set_up_available_endpoints(args)
213
+
214
+ # set up the test runner, e.g. start the agent
215
+ try:
216
+ test_runner = DialogueUnderstandingTestRunner(
217
+ endpoints=endpoints,
218
+ model_path=args.model,
219
+ model_server=endpoints.model,
220
+ remote_storage=args.remote_storage,
221
+ )
222
+ except AgentNotReady as error:
223
+ structlogger.error(
224
+ "rasa.dialogue_understanding_test.agent_not_ready", message=error.message
225
+ )
226
+ sys.exit(1)
227
+
228
+ # Exit if the bot is not calm only
229
+ ensure_calm_only_bot(test_runner.agent)
230
+
231
+ # Ensure processor is not None so that we can extract the flows and the llm config
232
+ if test_runner.agent.processor is None:
233
+ rasa.shared.utils.cli.print_error(
234
+ "No processor: Not able to retrieve flows and config from trained model."
235
+ )
236
+ sys.exit(0)
237
+
238
+ # flows are needed in order to parse the commands when reading the test cases
239
+ flows = asyncio.run(test_runner.agent.processor.get_flows())
240
+ # llm config is needed for instrumentation
241
+ llm_config = _get_llm_command_generator_config(test_runner.agent.processor)
242
+
243
+ # read test cases from the given path
244
+ test_suite: TestSuite = get_valid_test_suite(args, flows, test_runner.agent.domain)
245
+
246
+ # setup stub custom actions if they are used
247
+ set_up_stub_custom_actions(test_suite, endpoints)
248
+
249
+ # run the actual test cases
250
+ test_results = asyncio.run(
251
+ test_runner.run_test_cases(
252
+ test_suite.test_cases, test_suite.fixtures, test_suite.metadata
253
+ )
254
+ )
255
+
256
+ # evaluate test results
257
+ passing_test_results, failing_test_results = split_test_results(test_results)
258
+ command_metrics = calculate_command_metrics(test_results)
259
+
260
+ test_suite_result = DialogueUnderstandingTestSuiteResult.from_results(
261
+ failing_test_results, passing_test_results, command_metrics, llm_config
262
+ )
263
+
264
+ # Do not move this import to the top of the file as it will break the
265
+ # instrumentation of this function: the CLI module is initialized before the
266
+ # instrumentation is set up, and we won't be able to "replace" the function
267
+ # with the instrumented wrapper
268
+ from rasa.dialogue_understanding_test.io import print_test_results
269
+
270
+ # write results to console and file
271
+ print_test_results(test_suite_result, output_prompt=args.output_prompt)
272
+ if not args.no_output:
273
+ write_test_results_to_file(
274
+ test_suite_result,
275
+ args.output_file,
276
+ args.output_prompt,
277
+ )
278
+
279
+
280
+ def _import_custom_command_class(class_path: str) -> Command:
281
+ """Dynamically import a command class from a string path."""
282
+ try:
283
+ module_name, class_name = class_path.rsplit(".", 1)
284
+ module = importlib.import_module(module_name)
285
+ clz = getattr(module, class_name)
286
+ except (ImportError, AttributeError, ValueError) as e:
287
+ raise ValueError(f"Failed to import class '{class_path}': {e}")
288
+ if not issubclass(clz, Command):
289
+ structlogger.error(
290
+ "rasa.dialogue_understanding_test.invalid_additional_command",
291
+ event_info="The custom command class must be a subclass of Command.",
292
+ class_path=class_path,
293
+ )
294
+ sys.exit(1)
295
+ return clz
296
+
297
+
298
+ def _extract_additional_command_classes_from_cli_args(
299
+ args: argparse.Namespace,
300
+ ) -> List[Command]:
301
+ """Extract additional command classes from the CLI arguments."""
302
+ additional_commands = getattr(args, "additional_commands", [])
303
+ if not additional_commands:
304
+ return []
305
+ return [
306
+ _import_custom_command_class(command_module)
307
+ for command_module in additional_commands
308
+ ]
309
+
310
+
311
+ def get_valid_test_suite(
312
+ args: argparse.Namespace, flows: FlowsList, domain: Optional[Domain]
313
+ ) -> TestSuite:
314
+ """Read the test cases from the given test case path and validate them."""
315
+ path_to_test_cases = getattr(args, "path-to-test-cases", DEFAULT_INPUT_TESTS_PATH)
316
+ remove_default_commands = getattr(args, "remove_default_commands", [])
317
+ custom_command_classes = _extract_additional_command_classes_from_cli_args(args)
318
+ test_suite = read_test_suite(
319
+ path_to_test_cases, flows, custom_command_classes, remove_default_commands
320
+ )
321
+ validate_test_cases(test_suite.test_cases, domain)
322
+ return test_suite
323
+
324
+
325
+ def set_up_available_endpoints(args: argparse.Namespace) -> AvailableEndpoints:
326
+ """Set up the available endpoints for the test runner."""
327
+ args.endpoints = rasa.cli.utils.get_validated_path(
328
+ args.endpoints, "endpoints", DEFAULT_ENDPOINTS_PATH, True
329
+ )
330
+ endpoints = AvailableEndpoints.get_instance(args.endpoints)
331
+
332
+ # Ignore all endpoints apart from action server, model, and nlu
333
+ # to ensure InMemoryTrackerStore is being used instead of production
334
+ # tracker store
335
+ endpoints.tracker_store = None
336
+ endpoints.lock_store = None
337
+ endpoints.event_broker = None
338
+
339
+ # disable nlg endpoint as we don't need it for dialogue understanding tests
340
+ endpoints.nlg = None
341
+
342
+ return endpoints
343
+
344
+
345
+ def set_up_stub_custom_actions(
346
+ test_suite: TestSuite, endpoints: AvailableEndpoints
347
+ ) -> None:
348
+ """Set up the stub custom actions if they are used."""
349
+ if test_suite.stub_custom_actions:
350
+ if not endpoints.action:
351
+ endpoints.action = EndpointConfig()
352
+
353
+ endpoints.action.kwargs[KEY_STUB_CUSTOM_ACTIONS] = (
354
+ test_suite.stub_custom_actions
355
+ )
356
+
357
+
358
+ def split_test_results(
359
+ results: List[DialogueUnderstandingTestResult],
360
+ ) -> tuple[
361
+ List[DialogueUnderstandingTestResult], List[DialogueUnderstandingTestResult]
362
+ ]:
363
+ """Split the test results into passed and failed test cases."""
364
+ passed_cases = [r for r in results if r.passed]
365
+ failed_cases = [r for r in results if not r.passed]
366
+
367
+ return passed_cases, failed_cases
368
+
369
+
370
+ def _get_llm_command_generator_config(
371
+ processor: MessageProcessor,
372
+ ) -> Optional[Dict[str, Any]]:
373
+ train_schema = processor.model_metadata.train_schema
374
+
375
+ for node_name, node in train_schema.nodes.items():
376
+ if node.matches_type(LLMBasedCommandGenerator, include_subtypes=True):
377
+ # Configurations can reference model groups defined in the endpoints.yml
378
+ resolved_llm_config = resolve_model_client_config(
379
+ node.config.get(LLM_CONFIG_KEY, {}), node_name
380
+ )
381
+ llm_command_generator = cast(Type[LLMBasedCommandGenerator], node.uses)
382
+ return combine_custom_and_default_config(
383
+ resolved_llm_config, llm_command_generator.get_default_llm_config()
384
+ )
385
+
386
+ return None
rasa/cli/evaluate.py CHANGED
@@ -1,6 +1,6 @@
1
1
  import argparse
2
2
  from pathlib import Path
3
- from typing import List, Text, Optional
3
+ from typing import List, Optional, Text
4
4
 
5
5
  import rasa.cli.arguments.evaluate as arguments
6
6
  import rasa.shared.utils.cli
rasa/cli/export.py CHANGED
@@ -2,23 +2,23 @@ import argparse
2
2
  import asyncio
3
3
  import logging
4
4
  import typing
5
- from typing import List, Text, Optional
5
+ from typing import List, Optional, Text
6
6
 
7
- from rasa import telemetry
8
- from rasa.cli import SubParsersAction
9
7
  import rasa.core.utils
10
8
  import rasa.shared.utils.cli
11
9
  import rasa.utils.common
10
+ from rasa import telemetry
11
+ from rasa.cli import SubParsersAction
12
12
  from rasa.cli.arguments import export as arguments
13
- from rasa.shared.constants import DOCS_URL_EVENT_BROKERS, DOCS_URL_TRACKER_STORES
13
+ from rasa.core.brokers.pika import PikaEventBroker
14
14
  from rasa.exceptions import PublishingError
15
+ from rasa.shared.constants import DOCS_URL_EVENT_BROKERS, DOCS_URL_TRACKER_STORES
15
16
  from rasa.shared.exceptions import RasaException
16
- from rasa.core.brokers.pika import PikaEventBroker
17
17
 
18
18
  if typing.TYPE_CHECKING:
19
19
  from rasa.core.brokers.broker import EventBroker
20
- from rasa.core.tracker_store import TrackerStore
21
20
  from rasa.core.exporter import Exporter
21
+ from rasa.core.tracker_store import TrackerStore
22
22
  from rasa.core.utils import AvailableEndpoints
23
23
 
24
24
  logger = logging.getLogger(__name__)
rasa/cli/inspect.py CHANGED
@@ -9,6 +9,10 @@ from rasa import telemetry
9
9
  from rasa.cli import SubParsersAction
10
10
  from rasa.cli.arguments import shell as arguments
11
11
  from rasa.core import constants
12
+ from rasa.engine.storage.local_model_storage import LocalModelStorage
13
+ from rasa.exceptions import ModelNotFound
14
+ from rasa.model import get_local_model
15
+ from rasa.shared.utils.cli import print_error
12
16
  from rasa.utils.cli import remove_argument_from_parser
13
17
 
14
18
 
@@ -55,6 +59,8 @@ async def open_inspector_in_browser(server_url: Text, voice: bool = False) -> No
55
59
  def inspect(args: argparse.Namespace) -> None:
56
60
  """Inspect the bot using the most recent model."""
57
61
  import rasa.cli.run
62
+ from rasa.cli.utils import get_validated_path
63
+ from rasa.shared.constants import DEFAULT_MODELS_PATH
58
64
 
59
65
  async def after_start_hook_open_inspector(_: Sanic, __: AbstractEventLoop) -> None:
60
66
  """Hook to open the browser on server start."""
@@ -71,5 +77,18 @@ def inspect(args: argparse.Namespace) -> None:
71
77
  args.credentials = None
72
78
  args.server_listeners = [(after_start_hook_open_inspector, "after_server_start")]
73
79
 
74
- telemetry.track_inspect_started(args.connector)
80
+ model = get_validated_path(args.model, "model", DEFAULT_MODELS_PATH)
81
+
82
+ try:
83
+ model = get_local_model(model)
84
+ except ModelNotFound:
85
+ print_error(
86
+ "No model found. Train a model before running the "
87
+ "server using `rasa train`."
88
+ )
89
+ return
90
+
91
+ metadata = LocalModelStorage.metadata_from_archive(model)
92
+
93
+ telemetry.track_inspect_started(args.connector, metadata.assistant_id)
75
94
  rasa.cli.run.run(args)
rasa/cli/interactive.py CHANGED
@@ -4,11 +4,13 @@ import os
4
4
  from pathlib import Path
5
5
  from typing import List, Optional, Text, Union
6
6
 
7
+ import rasa.cli.train as train
8
+ import rasa.cli.utils
9
+ import rasa.shared.utils.cli
10
+ import rasa.utils.common
7
11
  from rasa import model
8
12
  from rasa.cli import SubParsersAction
9
13
  from rasa.cli.arguments import interactive as arguments
10
- import rasa.cli.train as train
11
- import rasa.cli.utils
12
14
  from rasa.engine.storage.local_model_storage import LocalModelStorage
13
15
  from rasa.shared.constants import (
14
16
  ASSISTANT_ID_DEFAULT_VALUE,
@@ -18,9 +20,6 @@ from rasa.shared.constants import (
18
20
  )
19
21
  from rasa.shared.data import TrainingType
20
22
  from rasa.shared.importers.importer import TrainingDataImporter
21
- import rasa.shared.utils.cli
22
- import rasa.utils.common
23
-
24
23
 
25
24
  logger = logging.getLogger(__name__)
26
25
 
@@ -1,7 +1,7 @@
1
1
  import argparse
2
2
  import asyncio
3
3
  import sys
4
- from typing import List, Any, Dict
4
+ from typing import Any, Dict, List, Type, cast
5
5
 
6
6
  import structlog
7
7
 
@@ -16,13 +16,18 @@ from rasa.cli.arguments.default_arguments import (
16
16
  add_remote_storage_param,
17
17
  )
18
18
  from rasa.cli.e2e_test import (
19
+ RASA_PRO_BETA_FINE_TUNING_RECIPE_ENV_VAR_NAME,
19
20
  read_test_cases,
20
21
  validate_model_path,
21
- RASA_PRO_BETA_FINE_TUNING_RECIPE_ENV_VAR_NAME,
22
22
  )
23
23
  from rasa.core.exceptions import AgentNotReady
24
24
  from rasa.core.utils import AvailableEndpoints
25
- from rasa.dialogue_understanding.generator import SingleStepLLMCommandGenerator
25
+ from rasa.dialogue_understanding.generator.llm_based_command_generator import (
26
+ LLMBasedCommandGenerator,
27
+ )
28
+ from rasa.dialogue_understanding.generator.multi_step.multi_step_llm_command_generator import ( # noqa: E501
29
+ MultiStepLLMCommandGenerator,
30
+ )
26
31
  from rasa.e2e_test.e2e_test_runner import E2ETestRunner
27
32
  from rasa.llm_fine_tuning.annotation_module import annotate_e2e_tests
28
33
  from rasa.llm_fine_tuning.llm_data_preparation_module import convert_to_fine_tuning_data
@@ -31,14 +36,14 @@ from rasa.llm_fine_tuning.paraphrasing.conversation_rephraser import (
31
36
  )
32
37
  from rasa.llm_fine_tuning.paraphrasing_module import create_paraphrased_conversations
33
38
  from rasa.llm_fine_tuning.storage import (
39
+ FileStorageStrategy,
34
40
  StorageContext,
35
41
  StorageType,
36
- FileStorageStrategy,
37
42
  )
38
43
  from rasa.llm_fine_tuning.train_test_split_module import (
39
- split_llm_fine_tuning_data,
40
- INSTRUCTION_DATA_FORMAT,
41
44
  CONVERSATIONAL_DATA_FORMAT,
45
+ INSTRUCTION_DATA_FORMAT,
46
+ split_llm_fine_tuning_data,
42
47
  )
43
48
  from rasa.shared.constants import (
44
49
  DEFAULT_ENDPOINTS_PATH,
@@ -112,7 +117,6 @@ def create_llm_finetune_data_preparation_subparser(
112
117
  help_text="Configuration file for the model server and the connectors as a "
113
118
  "yml file.",
114
119
  )
115
-
116
120
  return data_preparation_subparser
117
121
 
118
122
 
@@ -205,6 +209,9 @@ def prepare_llm_fine_tuning_data(args: argparse.Namespace) -> None:
205
209
 
206
210
  flows = asyncio.run(e2e_test_runner.agent.processor.get_flows())
207
211
  llm_command_generator_config = _get_llm_command_generator_config(e2e_test_runner)
212
+ llm_command_generator: Type[LLMBasedCommandGenerator] = _get_llm_command_generator(
213
+ e2e_test_runner
214
+ )
208
215
 
209
216
  # set up storage context
210
217
  storage_context = create_storage_context(StorageType.FILE, output_dir)
@@ -235,6 +242,7 @@ def prepare_llm_fine_tuning_data(args: argparse.Namespace) -> None:
235
242
  rephrase_config,
236
243
  args.num_rephrases,
237
244
  flows,
245
+ llm_command_generator,
238
246
  llm_command_generator_config,
239
247
  storage_context,
240
248
  )
@@ -271,30 +279,57 @@ def prepare_llm_fine_tuning_data(args: argparse.Namespace) -> None:
271
279
  write_statistics(statistics, output_dir)
272
280
 
273
281
  rasa.shared.utils.cli.print_success(
274
- f"Data and intermediate results are written " f"to '{output_dir}'."
282
+ f"Data and intermediate results are written to '{output_dir}'."
275
283
  )
276
284
 
277
285
 
278
286
  def _get_llm_command_generator_config(e2e_test_runner: E2ETestRunner) -> Dict[str, Any]:
279
- from rasa.dialogue_understanding.generator.constants import DEFAULT_LLM_CONFIG
280
-
281
287
  train_schema = e2e_test_runner.agent.processor.model_metadata.train_schema # type: ignore
282
288
 
283
289
  for node_name, node in train_schema.nodes.items():
284
- if node.matches_type(SingleStepLLMCommandGenerator, include_subtypes=True):
290
+ if node.matches_type(
291
+ LLMBasedCommandGenerator, include_subtypes=True
292
+ ) and not node.matches_type(
293
+ MultiStepLLMCommandGenerator, include_subtypes=True
294
+ ):
285
295
  # Configurations can reference model groups defined in the endpoints.yml
286
- resolved_config = resolve_model_client_config(
296
+ resolved_llm_config = resolve_model_client_config(
287
297
  node.config.get(LLM_CONFIG_KEY, {}), node_name
288
298
  )
299
+ llm_command_generator = cast(Type[LLMBasedCommandGenerator], node.uses)
289
300
  return combine_custom_and_default_config(
290
- resolved_config, DEFAULT_LLM_CONFIG
301
+ resolved_llm_config, llm_command_generator.get_default_llm_config()
291
302
  )
292
303
 
293
304
  rasa.shared.utils.cli.print_error(
294
305
  "The provided model is not trained using 'SingleStepLLMCommandGenerator' or "
295
- "its subclasses. Without it, no data for fine-tuning can be generated. To "
296
- "resolve this, please include 'SingleStepLLMCommandGenerator' or its subclass "
297
- "in your config and train your model."
306
+ "'CompactLLMCommandGenerator' or its subclasses. Without it, no data for "
307
+ "fine-tuning can be generated. To resolve this, please include "
308
+ "'SingleStepLLMCommandGenerator' or 'CompactLLMCommandGenerator' or its "
309
+ "subclasses in your config and train your model."
310
+ )
311
+ sys.exit(1)
312
+
313
+
314
+ def _get_llm_command_generator(
315
+ e2e_test_runner: E2ETestRunner,
316
+ ) -> Type[LLMBasedCommandGenerator]:
317
+ train_schema = e2e_test_runner.agent.processor.model_metadata.train_schema # type: ignore
318
+
319
+ for _, node in train_schema.nodes.items():
320
+ if node.matches_type(
321
+ LLMBasedCommandGenerator, include_subtypes=True
322
+ ) and not node.matches_type(
323
+ MultiStepLLMCommandGenerator, include_subtypes=True
324
+ ):
325
+ return cast(Type[LLMBasedCommandGenerator], node.uses)
326
+
327
+ rasa.shared.utils.cli.print_error(
328
+ "The provided model is not trained using 'SingleStepLLMCommandGenerator' or "
329
+ "'CompactLLMCommandGenerator' or its subclasses. Without it, no data for "
330
+ "fine-tuning can be generated. To resolve this, please include "
331
+ "'SingleStepLLMCommandGenerator' or 'CompactLLMCommandGenerator' or its "
332
+ "subclasses in your config and train your model."
298
333
  )
299
334
  sys.exit(1)
300
335
 
rasa/cli/markers.py CHANGED
@@ -4,11 +4,10 @@ from typing import List, Text
4
4
 
5
5
  from rasa.cli import SubParsersAction
6
6
  from rasa.cli.arguments.default_arguments import add_domain_param
7
+ from rasa.markers.upload import upload
7
8
  from rasa.shared.core.domain import Domain
8
9
  from rasa.shared.utils.cli import print_error_and_exit
9
10
 
10
- from rasa.markers.upload import upload
11
-
12
11
 
13
12
  def add_subparser(
14
13
  subparsers: SubParsersAction, parents: List[argparse.ArgumentParser]
@@ -4,7 +4,7 @@ from rasa_sdk import Action, Tracker
4
4
  from rasa_sdk.events import SlotSet
5
5
  from rasa_sdk.executor import CollectingDispatcher
6
6
 
7
- from actions.db import add_contact, get_contacts, Contact
7
+ from actions.db import Contact, add_contact, get_contacts
8
8
 
9
9
 
10
10
  class AddContact(Action):
@@ -1,9 +1,9 @@
1
1
  recipe: default.v1
2
2
  language: en
3
3
  pipeline:
4
- - name: SingleStepLLMCommandGenerator
4
+ - name: CompactLLMCommandGenerator
5
5
  llm:
6
- model_group: openai-gpt-4
6
+ model_group: openai-gpt-4o
7
7
 
8
8
  policies:
9
9
  - name: FlowPolicy
@@ -7,8 +7,7 @@ slots:
7
7
  contacts_list:
8
8
  type: text
9
9
  mappings:
10
- - type: custom
11
- action: list_contacts
10
+ - type: controlled
12
11
 
13
12
  responses:
14
13
  utter_no_contacts:
@@ -7,8 +7,7 @@ slots:
7
7
  remove_contact_name:
8
8
  type: text
9
9
  mappings:
10
- - type: custom
11
- action: remove_contact
10
+ - type: controlled
12
11
  remove_contact_handle:
13
12
  type: text
14
13
  mappings: