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

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

Potentially problematic release.


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

Files changed (580) hide show
  1. README.md +10 -13
  2. rasa/__main__.py +7 -7
  3. rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
  4. rasa/anonymization/anonymization_pipeline.py +3 -3
  5. rasa/anonymization/anonymization_rule_executor.py +17 -11
  6. rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
  7. rasa/cli/arguments/data.py +2 -2
  8. rasa/cli/arguments/default_arguments.py +1 -1
  9. rasa/cli/arguments/evaluate.py +2 -1
  10. rasa/cli/arguments/interactive.py +1 -1
  11. rasa/cli/arguments/run.py +1 -1
  12. rasa/cli/arguments/test.py +7 -5
  13. rasa/cli/arguments/train.py +3 -3
  14. rasa/cli/arguments/visualize.py +2 -2
  15. rasa/cli/arguments/x.py +1 -0
  16. rasa/cli/data.py +20 -3
  17. rasa/cli/dialogue_understanding_test.py +386 -0
  18. rasa/cli/evaluate.py +1 -1
  19. rasa/cli/export.py +6 -6
  20. rasa/cli/inspect.py +20 -1
  21. rasa/cli/interactive.py +4 -5
  22. rasa/cli/llm_fine_tuning.py +51 -16
  23. rasa/cli/markers.py +1 -2
  24. rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
  25. rasa/cli/project_templates/calm/config.yml +2 -2
  26. rasa/cli/project_templates/calm/domain/list_contacts.yml +1 -2
  27. rasa/cli/project_templates/calm/domain/remove_contact.yml +1 -2
  28. rasa/cli/project_templates/calm/domain/shared.yml +1 -4
  29. rasa/cli/project_templates/calm/endpoints.yml +2 -2
  30. rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
  31. rasa/cli/shell.py +5 -6
  32. rasa/cli/studio/download.py +1 -2
  33. rasa/cli/studio/studio.py +2 -3
  34. rasa/cli/studio/train.py +0 -1
  35. rasa/cli/telemetry.py +2 -2
  36. rasa/cli/test.py +11 -11
  37. rasa/cli/train.py +3 -0
  38. rasa/cli/utils.py +25 -5
  39. rasa/constants.py +0 -1
  40. rasa/core/__init__.py +0 -1
  41. rasa/core/actions/action.py +137 -208
  42. rasa/core/actions/action_handle_digressions.py +164 -0
  43. rasa/core/actions/action_hangup.py +1 -1
  44. rasa/core/actions/action_repeat_bot_messages.py +2 -2
  45. rasa/core/actions/action_run_slot_rejections.py +18 -6
  46. rasa/core/actions/action_trigger_chitchat.py +1 -1
  47. rasa/core/actions/action_trigger_flow.py +5 -5
  48. rasa/core/actions/action_trigger_search.py +1 -1
  49. rasa/core/actions/custom_action_executor.py +1 -1
  50. rasa/core/actions/direct_custom_actions_executor.py +1 -0
  51. rasa/core/actions/forms.py +22 -15
  52. rasa/core/actions/http_custom_action_executor.py +8 -1
  53. rasa/core/actions/loops.py +3 -3
  54. rasa/core/actions/two_stage_fallback.py +13 -13
  55. rasa/core/auth_retry_tracker_store.py +1 -2
  56. rasa/core/brokers/broker.py +2 -1
  57. rasa/core/brokers/file.py +1 -1
  58. rasa/core/brokers/kafka.py +8 -8
  59. rasa/core/brokers/pika.py +8 -9
  60. rasa/core/brokers/sql.py +4 -3
  61. rasa/core/channels/__init__.py +7 -0
  62. rasa/core/channels/botframework.py +2 -2
  63. rasa/core/channels/callback.py +4 -4
  64. rasa/core/channels/channel.py +11 -11
  65. rasa/core/channels/console.py +0 -1
  66. rasa/core/channels/development_inspector.py +80 -24
  67. rasa/core/channels/facebook.py +5 -5
  68. rasa/core/channels/hangouts.py +7 -8
  69. rasa/core/channels/inspector/dist/assets/Tableau10-1b767f5e.js +1 -0
  70. rasa/core/channels/inspector/dist/assets/arc-9f1365dc.js +1 -0
  71. rasa/core/channels/inspector/dist/assets/blockDiagram-38ab4fdb-e0f81b12.js +118 -0
  72. rasa/core/channels/inspector/dist/assets/c4Diagram-3d4e48cf-9deaee1c.js +10 -0
  73. rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
  74. rasa/core/channels/inspector/dist/assets/classDiagram-70f12bd4-20450a96.js +2 -0
  75. rasa/core/channels/inspector/dist/assets/classDiagram-v2-f2320105-749d2abf.js +2 -0
  76. rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
  77. rasa/core/channels/inspector/dist/assets/{createText-62fc7601-89c73b31.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/edges-e0da2a9e-943801a7.js +4 -0
  79. rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-907e0440.js → erDiagram-9861fffd-d523a948.js} +4 -4
  80. rasa/core/channels/inspector/dist/assets/flowDb-956e92f1-54e4cf19.js +10 -0
  81. rasa/core/channels/inspector/dist/assets/flowDiagram-66a62f08-48bfbbe8.js +4 -0
  82. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
  83. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-4a651766-17c30827.js +139 -0
  84. rasa/core/channels/inspector/dist/assets/ganttDiagram-c361ad54-43086f2d.js +257 -0
  85. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-72cf32ee-5c8b693e.js +70 -0
  86. rasa/core/channels/inspector/dist/assets/graph-41a90d26.js +1 -0
  87. rasa/core/channels/inspector/dist/assets/index-3862675e-b43eeae9.js +1 -0
  88. rasa/core/channels/inspector/dist/assets/{index-e793d777.js → index-e8affe45.js} +201 -196
  89. rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-8ceba4db.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-960d3809.js → journeyDiagram-49397b02-39bce7b5.js} +4 -4
  91. rasa/core/channels/inspector/dist/assets/katex-498eb57e.js +261 -0
  92. rasa/core/channels/inspector/dist/assets/layout-dc8eeea4.js +1 -0
  93. rasa/core/channels/inspector/dist/assets/{line-eeccc4e2.js → line-c4d2e756.js} +1 -1
  94. rasa/core/channels/inspector/dist/assets/linear-86f6f2d9.js +1 -0
  95. rasa/core/channels/inspector/dist/assets/mindmap-definition-fc14e90a-4216f771.js +312 -0
  96. rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-dc9b5e1b.js → pieDiagram-8a3498a8-1a0cfa96.js} +7 -7
  97. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-a08cba6d.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
  98. rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-87242b9e.js → requirementDiagram-deff3bca-d4046bed.js} +2 -2
  99. rasa/core/channels/inspector/dist/assets/sankeyDiagram-04a897e0-2cf6d1d7.js +8 -0
  100. rasa/core/channels/inspector/dist/assets/sequenceDiagram-704730f1-751ac4f5.js +122 -0
  101. rasa/core/channels/inspector/dist/assets/stateDiagram-587899a1-f734f4d4.js +1 -0
  102. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-d93cdb3a-91c65710.js +1 -0
  103. rasa/core/channels/inspector/dist/assets/{styles-9c745c82-cef936a6.js → styles-6aaf32cf-e0cff7be.js} +1 -1
  104. rasa/core/channels/inspector/dist/assets/styles-9a916d00-c8029e5d.js +160 -0
  105. rasa/core/channels/inspector/dist/assets/styles-c10674c1-114f312a.js +116 -0
  106. rasa/core/channels/inspector/dist/assets/svgDrawCommon-08f97a94-b7b9dc00.js +1 -0
  107. rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-0d39bdb2.js → timeline-definition-85554ec2-9536d189.js} +3 -3
  108. rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-a03fa445.js → xychartDiagram-e933f94c-bf3b0f36.js} +3 -3
  109. rasa/core/channels/inspector/dist/index.html +1 -1
  110. rasa/core/channels/inspector/package.json +11 -3
  111. rasa/core/channels/inspector/src/App.tsx +15 -2
  112. rasa/core/channels/inspector/src/components/RasaLogo.tsx +31 -0
  113. rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +68 -0
  114. rasa/core/channels/inspector/src/components/Welcome.tsx +19 -13
  115. rasa/core/channels/inspector/yarn.lock +94 -99
  116. rasa/core/channels/mattermost.py +4 -4
  117. rasa/core/channels/rasa_chat.py +4 -4
  118. rasa/core/channels/rest.py +11 -12
  119. rasa/core/channels/rocketchat.py +4 -3
  120. rasa/core/channels/slack.py +6 -5
  121. rasa/core/channels/socketio.py +8 -28
  122. rasa/core/channels/studio_chat.py +212 -0
  123. rasa/core/channels/telegram.py +105 -55
  124. rasa/core/channels/twilio.py +3 -3
  125. rasa/core/channels/vier_cvg.py +2 -2
  126. rasa/core/channels/voice_ready/audiocodes.py +51 -32
  127. rasa/core/channels/voice_ready/jambonz.py +5 -5
  128. rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
  129. rasa/core/channels/voice_ready/twilio_voice.py +9 -8
  130. rasa/core/channels/voice_ready/utils.py +2 -2
  131. rasa/core/channels/voice_stream/asr/asr_engine.py +12 -6
  132. rasa/core/channels/voice_stream/asr/asr_event.py +5 -0
  133. rasa/core/channels/voice_stream/asr/azure.py +16 -3
  134. rasa/core/channels/voice_stream/asr/deepgram.py +76 -19
  135. rasa/core/channels/voice_stream/audiocodes.py +292 -0
  136. rasa/core/channels/voice_stream/browser_audio.py +14 -7
  137. rasa/core/channels/voice_stream/call_state.py +6 -2
  138. rasa/core/channels/voice_stream/genesys.py +320 -0
  139. rasa/core/channels/voice_stream/tts/azure.py +13 -5
  140. rasa/core/channels/voice_stream/tts/cartesia.py +34 -14
  141. rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
  142. rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
  143. rasa/core/channels/voice_stream/twilio_media_streams.py +12 -8
  144. rasa/core/channels/voice_stream/util.py +1 -1
  145. rasa/core/channels/voice_stream/voice_channel.py +100 -56
  146. rasa/core/channels/webexteams.py +3 -4
  147. rasa/core/constants.py +2 -0
  148. rasa/core/evaluation/marker.py +7 -6
  149. rasa/core/evaluation/marker_base.py +15 -16
  150. rasa/core/evaluation/marker_stats.py +3 -4
  151. rasa/core/evaluation/marker_tracker_loader.py +5 -4
  152. rasa/core/exporter.py +4 -4
  153. rasa/core/featurizers/precomputation.py +8 -8
  154. rasa/core/featurizers/single_state_featurizer.py +7 -7
  155. rasa/core/featurizers/tracker_featurizers.py +13 -13
  156. rasa/core/http_interpreter.py +3 -4
  157. rasa/core/information_retrieval/__init__.py +1 -1
  158. rasa/core/information_retrieval/faiss.py +4 -4
  159. rasa/core/information_retrieval/information_retrieval.py +2 -2
  160. rasa/core/information_retrieval/milvus.py +3 -3
  161. rasa/core/information_retrieval/qdrant.py +3 -3
  162. rasa/core/jobs.py +1 -0
  163. rasa/core/lock.py +2 -3
  164. rasa/core/lock_store.py +3 -3
  165. rasa/core/migrate.py +12 -9
  166. rasa/core/nlg/__init__.py +1 -1
  167. rasa/core/nlg/callback.py +2 -3
  168. rasa/core/nlg/contextual_response_rephraser.py +82 -14
  169. rasa/core/nlg/generator.py +85 -17
  170. rasa/core/nlg/interpolator.py +4 -3
  171. rasa/core/nlg/response.py +9 -7
  172. rasa/core/nlg/summarize.py +1 -0
  173. rasa/core/nlg/translate.py +55 -0
  174. rasa/core/persistor.py +3 -3
  175. rasa/core/policies/ensemble.py +10 -9
  176. rasa/core/policies/enterprise_search_policy.py +87 -21
  177. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +1 -1
  178. rasa/core/policies/flow_policy.py +13 -14
  179. rasa/core/policies/flows/flow_executor.py +85 -55
  180. rasa/core/policies/intentless_policy.py +6 -7
  181. rasa/core/policies/memoization.py +22 -20
  182. rasa/core/policies/policy.py +24 -22
  183. rasa/core/policies/rule_policy.py +37 -36
  184. rasa/core/policies/ted_policy.py +87 -85
  185. rasa/core/policies/unexpected_intent_policy.py +77 -75
  186. rasa/core/processor.py +167 -74
  187. rasa/core/run.py +5 -4
  188. rasa/core/secrets_manager/endpoints.py +2 -3
  189. rasa/core/secrets_manager/factory.py +2 -3
  190. rasa/core/secrets_manager/secret_manager.py +2 -3
  191. rasa/core/secrets_manager/vault.py +2 -2
  192. rasa/core/test.py +30 -30
  193. rasa/core/tracker_store.py +138 -49
  194. rasa/core/train.py +1 -1
  195. rasa/core/training/__init__.py +2 -2
  196. rasa/core/training/converters/responses_prefix_converter.py +1 -2
  197. rasa/core/training/interactive.py +13 -13
  198. rasa/core/training/story_conflict.py +4 -5
  199. rasa/core/training/training.py +3 -5
  200. rasa/core/utils.py +5 -5
  201. rasa/core/visualize.py +1 -1
  202. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
  203. rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
  204. rasa/dialogue_understanding/commands/__init__.py +22 -22
  205. rasa/dialogue_understanding/commands/can_not_handle_command.py +38 -1
  206. rasa/dialogue_understanding/commands/cancel_flow_command.py +96 -9
  207. rasa/dialogue_understanding/commands/change_flow_command.py +36 -2
  208. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +36 -4
  209. rasa/dialogue_understanding/commands/clarify_command.py +46 -4
  210. rasa/dialogue_understanding/commands/command.py +3 -2
  211. rasa/dialogue_understanding/commands/command_syntax_manager.py +55 -0
  212. rasa/dialogue_understanding/commands/correct_slots_command.py +14 -5
  213. rasa/dialogue_understanding/commands/error_command.py +1 -1
  214. rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
  215. rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
  216. rasa/dialogue_understanding/commands/handle_digressions_command.py +144 -0
  217. rasa/dialogue_understanding/commands/human_handoff_command.py +34 -4
  218. rasa/dialogue_understanding/commands/knowledge_answer_command.py +36 -4
  219. rasa/dialogue_understanding/commands/noop_command.py +2 -1
  220. rasa/dialogue_understanding/commands/prompt_command.py +94 -0
  221. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +34 -4
  222. rasa/dialogue_understanding/commands/restart_command.py +2 -5
  223. rasa/dialogue_understanding/commands/session_end_command.py +3 -5
  224. rasa/dialogue_understanding/commands/session_start_command.py +3 -5
  225. rasa/dialogue_understanding/commands/set_slot_command.py +55 -16
  226. rasa/dialogue_understanding/commands/skip_question_command.py +34 -4
  227. rasa/dialogue_understanding/commands/start_flow_command.py +78 -2
  228. rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
  229. rasa/dialogue_understanding/commands/utils.py +126 -43
  230. rasa/dialogue_understanding/constants.py +2 -0
  231. rasa/dialogue_understanding/generator/__init__.py +2 -0
  232. rasa/dialogue_understanding/generator/command_generator.py +120 -79
  233. rasa/dialogue_understanding/generator/command_parser.py +245 -0
  234. rasa/dialogue_understanding/generator/constants.py +12 -4
  235. rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
  236. rasa/dialogue_understanding/generator/llm_based_command_generator.py +187 -59
  237. rasa/dialogue_understanding/generator/llm_command_generator.py +6 -3
  238. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +106 -110
  239. rasa/dialogue_understanding/generator/nlu_command_adapter.py +53 -11
  240. rasa/dialogue_understanding/generator/prompt_templates/__init__.py +0 -0
  241. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +58 -0
  242. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +57 -0
  243. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +574 -0
  244. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +41 -386
  245. rasa/dialogue_understanding/generator/utils.py +76 -0
  246. rasa/dialogue_understanding/patterns/cancel.py +2 -1
  247. rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
  248. rasa/dialogue_understanding/patterns/chitchat.py +1 -1
  249. rasa/dialogue_understanding/patterns/clarify.py +2 -1
  250. rasa/dialogue_understanding/patterns/code_change.py +2 -0
  251. rasa/dialogue_understanding/patterns/collect_information.py +7 -4
  252. rasa/dialogue_understanding/patterns/completed.py +1 -1
  253. rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -1
  254. rasa/dialogue_understanding/patterns/correction.py +17 -3
  255. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +78 -2
  256. rasa/dialogue_understanding/patterns/handle_digressions.py +81 -0
  257. rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
  258. rasa/dialogue_understanding/patterns/internal_error.py +1 -0
  259. rasa/dialogue_understanding/patterns/search.py +1 -1
  260. rasa/dialogue_understanding/patterns/session_start.py +1 -1
  261. rasa/dialogue_understanding/patterns/skip_question.py +1 -0
  262. rasa/dialogue_understanding/patterns/user_silence.py +1 -1
  263. rasa/dialogue_understanding/patterns/validate_slot.py +65 -0
  264. rasa/dialogue_understanding/processor/command_processor.py +193 -43
  265. rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
  266. rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
  267. rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
  268. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
  269. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
  270. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
  271. rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
  272. rasa/dialogue_understanding/stack/utils.py +56 -10
  273. rasa/dialogue_understanding/utils.py +164 -0
  274. rasa/dialogue_understanding_test/README.md +429 -0
  275. rasa/dialogue_understanding_test/__init__.py +0 -0
  276. rasa/dialogue_understanding_test/command_comparison.py +60 -0
  277. rasa/dialogue_understanding_test/command_metric_calculation.py +122 -0
  278. rasa/dialogue_understanding_test/constants.py +22 -0
  279. rasa/dialogue_understanding_test/du_test_case.py +448 -0
  280. rasa/dialogue_understanding_test/du_test_result.py +390 -0
  281. rasa/dialogue_understanding_test/du_test_runner.py +322 -0
  282. rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
  283. rasa/dialogue_understanding_test/io.py +443 -0
  284. rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
  285. rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
  286. rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
  287. rasa/dialogue_understanding_test/utils.py +70 -0
  288. rasa/dialogue_understanding_test/validation.py +77 -0
  289. rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
  290. rasa/e2e_test/assertions.py +202 -175
  291. rasa/e2e_test/assertions_schema.yml +6 -0
  292. rasa/e2e_test/constants.py +16 -1
  293. rasa/e2e_test/e2e_config.py +102 -41
  294. rasa/e2e_test/e2e_config_schema.yml +28 -10
  295. rasa/e2e_test/e2e_test_case.py +5 -5
  296. rasa/e2e_test/e2e_test_converter.py +2 -3
  297. rasa/e2e_test/e2e_test_coverage_report.py +6 -6
  298. rasa/e2e_test/e2e_test_result.py +1 -1
  299. rasa/e2e_test/e2e_test_runner.py +143 -38
  300. rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2 +93 -0
  301. rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2 +169 -0
  302. rasa/e2e_test/stub_custom_action.py +1 -1
  303. rasa/e2e_test/utils/generative_assertions.py +243 -0
  304. rasa/e2e_test/utils/io.py +123 -93
  305. rasa/e2e_test/utils/validation.py +101 -3
  306. rasa/engine/caching.py +5 -7
  307. rasa/engine/constants.py +1 -1
  308. rasa/engine/graph.py +3 -2
  309. rasa/engine/language.py +182 -0
  310. rasa/engine/recipes/config_files/default_config.yml +4 -0
  311. rasa/engine/recipes/default_components.py +13 -15
  312. rasa/engine/recipes/default_recipe.py +65 -49
  313. rasa/engine/recipes/graph_recipe.py +10 -7
  314. rasa/engine/recipes/recipe.py +2 -2
  315. rasa/engine/runner/dask.py +2 -2
  316. rasa/engine/runner/interface.py +1 -0
  317. rasa/engine/storage/local_model_storage.py +6 -4
  318. rasa/engine/storage/resource.py +2 -1
  319. rasa/engine/storage/storage.py +8 -3
  320. rasa/engine/training/components.py +2 -1
  321. rasa/engine/training/fingerprinting.py +4 -2
  322. rasa/engine/training/graph_trainer.py +4 -4
  323. rasa/engine/training/hooks.py +2 -2
  324. rasa/engine/validation.py +36 -33
  325. rasa/exceptions.py +3 -2
  326. rasa/graph_components/converters/nlu_message_converter.py +3 -3
  327. rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
  328. rasa/graph_components/providers/domain_provider.py +3 -2
  329. rasa/graph_components/providers/flows_provider.py +2 -3
  330. rasa/graph_components/providers/forms_provider.py +4 -4
  331. rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
  332. rasa/graph_components/providers/responses_provider.py +4 -4
  333. rasa/graph_components/providers/rule_only_provider.py +3 -2
  334. rasa/graph_components/providers/story_graph_provider.py +8 -8
  335. rasa/graph_components/providers/training_tracker_provider.py +3 -2
  336. rasa/graph_components/validators/default_recipe_validator.py +16 -16
  337. rasa/graph_components/validators/finetuning_validator.py +10 -8
  338. rasa/hooks.py +19 -14
  339. rasa/jupyter.py +2 -2
  340. rasa/llm_fine_tuning/annotation_module.py +4 -4
  341. rasa/llm_fine_tuning/conversations.py +5 -33
  342. rasa/llm_fine_tuning/llm_data_preparation_module.py +6 -4
  343. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
  344. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +18 -13
  345. rasa/llm_fine_tuning/paraphrasing_module.py +6 -2
  346. rasa/llm_fine_tuning/storage.py +3 -3
  347. rasa/llm_fine_tuning/train_test_split_module.py +27 -27
  348. rasa/llm_fine_tuning/utils.py +7 -0
  349. rasa/markers/marker.py +2 -3
  350. rasa/markers/marker_base.py +1 -2
  351. rasa/markers/upload.py +2 -2
  352. rasa/markers/validate.py +2 -3
  353. rasa/model.py +3 -5
  354. rasa/model_manager/config.py +1 -1
  355. rasa/model_manager/model_api.py +5 -4
  356. rasa/model_manager/runner_service.py +13 -10
  357. rasa/model_manager/socket_bridge.py +15 -9
  358. rasa/model_manager/studio_jwt_auth.py +1 -0
  359. rasa/model_manager/trainer_service.py +9 -7
  360. rasa/model_manager/utils.py +1 -1
  361. rasa/model_manager/warm_rasa_process.py +14 -9
  362. rasa/model_service.py +5 -6
  363. rasa/model_testing.py +13 -15
  364. rasa/model_training.py +29 -29
  365. rasa/nlu/classifiers/diet_classifier.py +72 -73
  366. rasa/nlu/classifiers/fallback_classifier.py +9 -8
  367. rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
  368. rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
  369. rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
  370. rasa/nlu/classifiers/regex_message_handler.py +3 -2
  371. rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
  372. rasa/nlu/convert.py +2 -2
  373. rasa/nlu/emulators/dialogflow.py +3 -3
  374. rasa/nlu/emulators/luis.py +5 -5
  375. rasa/nlu/emulators/no_emulator.py +1 -0
  376. rasa/nlu/emulators/wit.py +4 -4
  377. rasa/nlu/extractors/crf_entity_extractor.py +11 -11
  378. rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
  379. rasa/nlu/extractors/entity_synonyms.py +10 -9
  380. rasa/nlu/extractors/extractor.py +16 -16
  381. rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
  382. rasa/nlu/extractors/regex_entity_extractor.py +11 -10
  383. rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
  384. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
  385. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
  386. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
  387. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
  388. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
  389. rasa/nlu/featurizers/featurizer.py +5 -4
  390. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
  391. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
  392. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
  393. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
  394. rasa/nlu/model.py +0 -1
  395. rasa/nlu/selectors/response_selector.py +67 -68
  396. rasa/nlu/test.py +38 -38
  397. rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
  398. rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
  399. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
  400. rasa/nlu/tokenizers/tokenizer.py +6 -7
  401. rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
  402. rasa/nlu/utils/bilou_utils.py +7 -7
  403. rasa/nlu/utils/hugging_face/registry.py +22 -22
  404. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
  405. rasa/nlu/utils/mitie_utils.py +2 -1
  406. rasa/nlu/utils/pattern_utils.py +1 -1
  407. rasa/nlu/utils/spacy_utils.py +3 -3
  408. rasa/plugin.py +12 -1
  409. rasa/server.py +6 -3
  410. rasa/shared/constants.py +45 -18
  411. rasa/shared/core/command_payload_reader.py +15 -7
  412. rasa/shared/core/constants.py +34 -4
  413. rasa/shared/core/conversation.py +1 -2
  414. rasa/shared/core/domain.py +19 -20
  415. rasa/shared/core/events.py +60 -39
  416. rasa/shared/core/flows/__init__.py +0 -1
  417. rasa/shared/core/flows/constants.py +11 -0
  418. rasa/shared/core/flows/flow.py +107 -26
  419. rasa/shared/core/flows/flow_step.py +4 -3
  420. rasa/shared/core/flows/flow_step_links.py +1 -2
  421. rasa/shared/core/flows/flow_step_sequence.py +1 -1
  422. rasa/shared/core/flows/flows_list.py +3 -3
  423. rasa/shared/core/flows/flows_yaml_schema.json +69 -3
  424. rasa/shared/core/flows/nlu_trigger.py +1 -1
  425. rasa/shared/core/flows/steps/__init__.py +2 -2
  426. rasa/shared/core/flows/steps/action.py +1 -1
  427. rasa/shared/core/flows/steps/call.py +1 -1
  428. rasa/shared/core/flows/steps/collect.py +22 -40
  429. rasa/shared/core/flows/steps/internal.py +1 -1
  430. rasa/shared/core/flows/steps/link.py +1 -1
  431. rasa/shared/core/flows/steps/no_operation.py +2 -2
  432. rasa/shared/core/flows/steps/set_slots.py +1 -1
  433. rasa/shared/core/flows/utils.py +44 -4
  434. rasa/shared/core/flows/validation.py +4 -6
  435. rasa/shared/core/generator.py +20 -21
  436. rasa/shared/core/slot_mappings.py +360 -121
  437. rasa/shared/core/slots.py +163 -6
  438. rasa/shared/core/trackers.py +108 -33
  439. rasa/shared/core/training_data/loading.py +1 -1
  440. rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
  441. rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
  442. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
  443. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
  444. rasa/shared/core/training_data/structures.py +11 -12
  445. rasa/shared/core/training_data/visualization.py +10 -10
  446. rasa/shared/data.py +6 -6
  447. rasa/shared/engine/caching.py +0 -1
  448. rasa/shared/exceptions.py +2 -2
  449. rasa/shared/importers/importer.py +58 -2
  450. rasa/shared/importers/rasa.py +5 -6
  451. rasa/shared/importers/utils.py +1 -1
  452. rasa/shared/nlu/constants.py +9 -0
  453. rasa/shared/nlu/training_data/entities_parser.py +6 -6
  454. rasa/shared/nlu/training_data/features.py +3 -3
  455. rasa/shared/nlu/training_data/formats/__init__.py +1 -1
  456. rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
  457. rasa/shared/nlu/training_data/formats/luis.py +7 -8
  458. rasa/shared/nlu/training_data/formats/rasa.py +4 -5
  459. rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
  460. rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
  461. rasa/shared/nlu/training_data/formats/wit.py +3 -4
  462. rasa/shared/nlu/training_data/loading.py +4 -4
  463. rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
  464. rasa/shared/nlu/training_data/message.py +13 -14
  465. rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
  466. rasa/shared/nlu/training_data/schemas/responses.yml +19 -11
  467. rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
  468. rasa/shared/nlu/training_data/training_data.py +12 -13
  469. rasa/shared/nlu/training_data/util.py +11 -10
  470. rasa/shared/providers/_configs/azure_entra_id_config.py +541 -0
  471. rasa/shared/providers/_configs/azure_openai_client_config.py +150 -15
  472. rasa/shared/providers/_configs/client_config.py +3 -1
  473. rasa/shared/providers/_configs/default_litellm_client_config.py +9 -7
  474. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +13 -11
  475. rasa/shared/providers/_configs/litellm_router_client_config.py +12 -10
  476. rasa/shared/providers/_configs/model_group_config.py +8 -5
  477. rasa/shared/providers/_configs/oauth_config.py +33 -0
  478. rasa/shared/providers/_configs/openai_client_config.py +14 -12
  479. rasa/shared/providers/_configs/rasa_llm_client_config.py +5 -3
  480. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +12 -11
  481. rasa/shared/providers/_configs/utils.py +1 -0
  482. rasa/shared/providers/_ssl_verification_utils.py +5 -6
  483. rasa/shared/providers/_utils.py +5 -5
  484. rasa/shared/providers/constants.py +6 -0
  485. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
  486. rasa/shared/providers/embedding/azure_openai_embedding_client.py +32 -7
  487. rasa/shared/providers/embedding/embedding_client.py +1 -1
  488. rasa/shared/providers/embedding/litellm_router_embedding_client.py +5 -2
  489. rasa/shared/providers/llm/_base_litellm_client.py +43 -18
  490. rasa/shared/providers/llm/azure_openai_llm_client.py +90 -34
  491. rasa/shared/providers/llm/default_litellm_llm_client.py +4 -2
  492. rasa/shared/providers/llm/litellm_router_llm_client.py +32 -9
  493. rasa/shared/providers/llm/llm_client.py +24 -8
  494. rasa/shared/providers/llm/llm_response.py +61 -2
  495. rasa/shared/providers/llm/openai_llm_client.py +11 -5
  496. rasa/shared/providers/llm/rasa_llm_client.py +17 -14
  497. rasa/shared/providers/llm/self_hosted_llm_client.py +35 -15
  498. rasa/shared/providers/mappings.py +18 -19
  499. rasa/shared/providers/router/_base_litellm_router_client.py +48 -15
  500. rasa/shared/providers/router/router_client.py +3 -1
  501. rasa/shared/utils/cli.py +1 -1
  502. rasa/shared/utils/common.py +15 -1
  503. rasa/shared/utils/constants.py +3 -0
  504. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
  505. rasa/shared/utils/health_check/health_check.py +3 -3
  506. rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
  507. rasa/shared/utils/io.py +1 -1
  508. rasa/shared/utils/llm.py +100 -18
  509. rasa/shared/utils/pykwalify_extensions.py +25 -1
  510. rasa/shared/utils/schemas/domain.yml +26 -1
  511. rasa/shared/utils/schemas/events.py +1 -1
  512. rasa/shared/utils/yaml.py +24 -20
  513. rasa/studio/auth.py +3 -3
  514. rasa/studio/config.py +1 -2
  515. rasa/studio/data_handler.py +3 -3
  516. rasa/studio/download.py +1 -1
  517. rasa/studio/results_logger.py +3 -3
  518. rasa/studio/upload.py +21 -5
  519. rasa/telemetry.py +127 -48
  520. rasa/tracing/config.py +5 -3
  521. rasa/tracing/constants.py +12 -0
  522. rasa/tracing/instrumentation/attribute_extractors.py +92 -14
  523. rasa/tracing/instrumentation/instrumentation.py +61 -5
  524. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
  525. rasa/tracing/instrumentation/metrics.py +52 -11
  526. rasa/tracing/metric_instrument_provider.py +54 -14
  527. rasa/utils/common.py +12 -24
  528. rasa/utils/endpoints.py +1 -1
  529. rasa/utils/io.py +7 -7
  530. rasa/utils/licensing.py +3 -4
  531. rasa/utils/log_utils.py +7 -6
  532. rasa/utils/ml_utils.py +1 -0
  533. rasa/utils/plotting.py +3 -3
  534. rasa/utils/sanic_error_handler.py +1 -1
  535. rasa/utils/tensorflow/callback.py +2 -2
  536. rasa/utils/tensorflow/crf.py +2 -2
  537. rasa/utils/tensorflow/data_generator.py +5 -5
  538. rasa/utils/tensorflow/environment.py +3 -3
  539. rasa/utils/tensorflow/feature_array.py +2 -3
  540. rasa/utils/tensorflow/layers.py +18 -12
  541. rasa/utils/tensorflow/layers_utils.py +2 -1
  542. rasa/utils/tensorflow/metrics.py +2 -2
  543. rasa/utils/tensorflow/model_data.py +7 -7
  544. rasa/utils/tensorflow/model_data_utils.py +10 -9
  545. rasa/utils/tensorflow/models.py +31 -32
  546. rasa/utils/tensorflow/rasa_layers.py +20 -19
  547. rasa/utils/tensorflow/types.py +2 -1
  548. rasa/utils/train_utils.py +23 -21
  549. rasa/utils/url_tools.py +1 -1
  550. rasa/validator.py +594 -115
  551. rasa/version.py +1 -1
  552. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/METADATA +23 -26
  553. rasa_pro-3.12.0.dist-info/RECORD +829 -0
  554. rasa/core/channels/inspector/dist/assets/arc-632a63ec.js +0 -1
  555. rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-081e0df4.js +0 -10
  556. rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-3df0afc2.js +0 -2
  557. rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-8c5ed31e.js +0 -2
  558. rasa/core/channels/inspector/dist/assets/edges-f2ad444c-4fc48c3e.js +0 -4
  559. rasa/core/channels/inspector/dist/assets/flowDb-1972c806-9ec53a3c.js +0 -6
  560. rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-41da787a.js +0 -4
  561. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +0 -1
  562. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-ce370633.js +0 -139
  563. rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-90a36523.js +0 -266
  564. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-41e1aa3f.js +0 -70
  565. rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-e6f2af62.js +0 -1
  566. rasa/core/channels/inspector/dist/assets/layout-498807d8.js +0 -1
  567. rasa/core/channels/inspector/dist/assets/linear-8a078617.js +0 -1
  568. rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-396d17dd.js +0 -109
  569. rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-53f6f391.js +0 -8
  570. rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-715c9c20.js +0 -122
  571. rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-2e8fb31f.js +0 -1
  572. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-7e2d2aa0.js +0 -1
  573. rasa/core/channels/inspector/dist/assets/styles-080da4f6-4420cea6.js +0 -110
  574. rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-28676cf4.js +0 -159
  575. rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-151251e9.js +0 -1
  576. rasa_pro-3.11.4.dist-info/RECORD +0 -779
  577. /rasa/dialogue_understanding/generator/{single_step → prompt_templates}/command_prompt_template.jinja2 +0 -0
  578. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/NOTICE +0 -0
  579. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/WHEEL +0 -0
  580. {rasa_pro-3.11.4.dist-info → rasa_pro-3.12.0.dist-info}/entry_points.txt +0 -0
@@ -1,41 +1,41 @@
1
- from rasa.dialogue_understanding.commands.command import Command
2
- from rasa.dialogue_understanding.commands.free_form_answer_command import (
3
- FreeFormAnswerCommand,
1
+ from rasa.dialogue_understanding.commands.can_not_handle_command import (
2
+ CannotHandleCommand,
4
3
  )
5
4
  from rasa.dialogue_understanding.commands.cancel_flow_command import CancelFlowCommand
6
- from rasa.dialogue_understanding.commands.knowledge_answer_command import (
7
- KnowledgeAnswerCommand,
8
- )
5
+ from rasa.dialogue_understanding.commands.change_flow_command import ChangeFlowCommand
9
6
  from rasa.dialogue_understanding.commands.chit_chat_answer_command import (
10
7
  ChitChatAnswerCommand,
11
8
  )
12
- from rasa.dialogue_understanding.commands.restart_command import RestartCommand
13
- from rasa.dialogue_understanding.commands.skip_question_command import (
14
- SkipQuestionCommand,
15
- )
16
- from rasa.dialogue_understanding.commands.can_not_handle_command import (
17
- CannotHandleCommand,
18
- )
19
9
  from rasa.dialogue_understanding.commands.clarify_command import ClarifyCommand
10
+ from rasa.dialogue_understanding.commands.command import Command
11
+ from rasa.dialogue_understanding.commands.correct_slots_command import (
12
+ CorrectedSlot,
13
+ CorrectSlotsCommand,
14
+ )
20
15
  from rasa.dialogue_understanding.commands.error_command import ErrorCommand
21
- from rasa.dialogue_understanding.commands.set_slot_command import SetSlotCommand
22
- from rasa.dialogue_understanding.commands.start_flow_command import StartFlowCommand
16
+ from rasa.dialogue_understanding.commands.free_form_answer_command import (
17
+ FreeFormAnswerCommand,
18
+ )
23
19
  from rasa.dialogue_understanding.commands.human_handoff_command import (
24
20
  HumanHandoffCommand,
25
21
  )
26
- from rasa.dialogue_understanding.commands.correct_slots_command import (
27
- CorrectSlotsCommand,
28
- CorrectedSlot,
22
+ from rasa.dialogue_understanding.commands.knowledge_answer_command import (
23
+ KnowledgeAnswerCommand,
29
24
  )
30
25
  from rasa.dialogue_understanding.commands.noop_command import NoopCommand
31
- from rasa.dialogue_understanding.commands.change_flow_command import ChangeFlowCommand
26
+ from rasa.dialogue_understanding.commands.repeat_bot_messages_command import (
27
+ RepeatBotMessagesCommand,
28
+ )
29
+ from rasa.dialogue_understanding.commands.restart_command import RestartCommand
30
+ from rasa.dialogue_understanding.commands.session_end_command import SessionEndCommand
32
31
  from rasa.dialogue_understanding.commands.session_start_command import (
33
32
  SessionStartCommand,
34
33
  )
35
- from rasa.dialogue_understanding.commands.session_end_command import SessionEndCommand
36
- from rasa.dialogue_understanding.commands.repeat_bot_messages_command import (
37
- RepeatBotMessagesCommand,
34
+ from rasa.dialogue_understanding.commands.set_slot_command import SetSlotCommand
35
+ from rasa.dialogue_understanding.commands.skip_question_command import (
36
+ SkipQuestionCommand,
38
37
  )
38
+ from rasa.dialogue_understanding.commands.start_flow_command import StartFlowCommand
39
39
 
40
40
  __all__ = [
41
41
  "Command",
@@ -1,9 +1,14 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import re
3
4
  from dataclasses import dataclass
4
5
  from typing import Any, Dict, List, Optional, Text
5
6
 
6
- from rasa.dialogue_understanding.commands import Command
7
+ from rasa.dialogue_understanding.commands.command import Command
8
+ from rasa.dialogue_understanding.commands.command_syntax_manager import (
9
+ CommandSyntaxManager,
10
+ CommandSyntaxVersion,
11
+ )
7
12
  from rasa.dialogue_understanding.patterns.cannot_handle import (
8
13
  CannotHandlePatternFlowStackFrame,
9
14
  )
@@ -12,6 +17,8 @@ from rasa.shared.core.events import Event
12
17
  from rasa.shared.core.flows import FlowsList
13
18
  from rasa.shared.core.trackers import DialogueStateTracker
14
19
 
20
+ DATA_KEY_CANNOT_HANDLE_REASON = "cannot_handle_reason"
21
+
15
22
 
16
23
  @dataclass
17
24
  class CannotHandleCommand(Command):
@@ -68,3 +75,33 @@ class CannotHandleCommand(Command):
68
75
  return False
69
76
 
70
77
  return other.reason == self.reason
78
+
79
+ def to_dsl(self) -> str:
80
+ """Converts the command to a DSL string."""
81
+ mapper = {
82
+ CommandSyntaxVersion.v1: "CannotHandle()",
83
+ CommandSyntaxVersion.v2: "cannot handle",
84
+ }
85
+ return mapper.get(
86
+ CommandSyntaxManager.get_syntax_version(),
87
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
88
+ )
89
+
90
+ @classmethod
91
+ def from_dsl(cls, match: re.Match, **kwargs: Any) -> CannotHandleCommand:
92
+ """Converts a DSL string to a command."""
93
+ reason = kwargs.get("data", {}).get(
94
+ DATA_KEY_CANNOT_HANDLE_REASON, RASA_PATTERN_CANNOT_HANDLE_DEFAULT
95
+ )
96
+ return CannotHandleCommand(reason)
97
+
98
+ @staticmethod
99
+ def regex_pattern() -> str:
100
+ mapper = {
101
+ CommandSyntaxVersion.v1: r"CannotHandle\(\)",
102
+ CommandSyntaxVersion.v2: r"""^[\s\W\d]*cannot handle['"`]*$""",
103
+ }
104
+ return mapper.get(
105
+ CommandSyntaxManager.get_syntax_version(),
106
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
107
+ )
@@ -1,19 +1,26 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import copy
4
+ import re
3
5
  from dataclasses import dataclass
4
6
  from typing import Any, Dict, List
5
7
 
6
8
  import structlog
7
9
 
8
- from rasa.dialogue_understanding.commands import Command
10
+ from rasa.dialogue_understanding.commands.command import Command
11
+ from rasa.dialogue_understanding.commands.command_syntax_manager import (
12
+ CommandSyntaxManager,
13
+ CommandSyntaxVersion,
14
+ )
9
15
  from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
16
+ from rasa.dialogue_understanding.patterns.clarify import ClarifyPatternFlowStackFrame
10
17
  from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
11
18
  from rasa.dialogue_understanding.stack.frames import UserFlowStackFrame
12
19
  from rasa.dialogue_understanding.stack.frames.flow_stack_frame import FlowStackFrameType
20
+ from rasa.dialogue_understanding.stack.utils import top_user_flow_frame
13
21
  from rasa.shared.core.events import Event, FlowCancelled
14
22
  from rasa.shared.core.flows import FlowsList
15
23
  from rasa.shared.core.trackers import DialogueStateTracker
16
- from rasa.dialogue_understanding.stack.utils import top_user_flow_frame
17
24
 
18
25
  structlogger = structlog.get_logger()
19
26
 
@@ -45,7 +52,8 @@ class CancelFlowCommand(Command):
45
52
  current_flow: The current flow.
46
53
 
47
54
  Returns:
48
- The frames that were canceled."""
55
+ The frames that were canceled.
56
+ """
49
57
  canceled_frames = []
50
58
  # we need to go through the original stack dump in reverse order
51
59
  # to find the frames that were canceled. we cancel everything from
@@ -83,12 +91,12 @@ class CancelFlowCommand(Command):
83
91
  Returns:
84
92
  The events to apply to the tracker.
85
93
  """
86
-
87
94
  stack = tracker.stack
88
95
  original_stack = original_tracker.stack
89
96
 
90
97
  applied_events: List[Event] = []
91
-
98
+ # capture the top frame before we push new frames onto the stack
99
+ initial_top_frame = stack.top()
92
100
  user_frame = top_user_flow_frame(original_stack)
93
101
  current_flow = user_frame.flow(all_flows) if user_frame else None
94
102
 
@@ -105,7 +113,9 @@ class CancelFlowCommand(Command):
105
113
 
106
114
  stack.push(
107
115
  CancelPatternFlowStackFrame(
108
- canceled_name=current_flow.readable_name(),
116
+ canceled_name=current_flow.readable_name(
117
+ language=tracker.current_language
118
+ ),
109
119
  canceled_frames=canceled_frames,
110
120
  )
111
121
  )
@@ -113,13 +123,90 @@ class CancelFlowCommand(Command):
113
123
  if user_frame:
114
124
  applied_events.append(FlowCancelled(user_frame.flow_id, user_frame.step_id))
115
125
 
126
+ if initial_top_frame and isinstance(
127
+ initial_top_frame, ClarifyPatternFlowStackFrame
128
+ ):
129
+ structlogger.debug(
130
+ "command_executor.cancel_flow.cancel_clarification_options",
131
+ clarification_options=initial_top_frame.clarification_options,
132
+ )
133
+ applied_events += cancel_all_pending_clarification_options(
134
+ initial_top_frame,
135
+ original_stack,
136
+ canceled_frames,
137
+ all_flows,
138
+ stack,
139
+ )
140
+
116
141
  return applied_events + tracker.create_stack_updated_events(stack)
117
142
 
118
143
  def __hash__(self) -> int:
119
144
  return hash(self.command())
120
145
 
121
146
  def __eq__(self, other: object) -> bool:
122
- if not isinstance(other, CancelFlowCommand):
123
- return False
147
+ return isinstance(other, CancelFlowCommand)
148
+
149
+ def to_dsl(self) -> str:
150
+ """Converts the command to a DSL string."""
151
+ mapper = {
152
+ CommandSyntaxVersion.v1: "CancelFlow()",
153
+ CommandSyntaxVersion.v2: "cancel flow",
154
+ }
155
+ return mapper.get(
156
+ CommandSyntaxManager.get_syntax_version(),
157
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
158
+ )
159
+
160
+ @classmethod
161
+ def from_dsl(cls, match: re.Match, **kwargs: Any) -> CancelFlowCommand:
162
+ """Converts a DSL string to a command."""
163
+ return CancelFlowCommand()
164
+
165
+ @staticmethod
166
+ def regex_pattern() -> str:
167
+ mapper = {
168
+ CommandSyntaxVersion.v1: r"CancelFlow\(\)",
169
+ CommandSyntaxVersion.v2: r"""^[\s\W\d]*cancel flow['"`]*$""",
170
+ }
171
+ return mapper.get(
172
+ CommandSyntaxManager.get_syntax_version(),
173
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
174
+ )
175
+
124
176
 
125
- return True
177
+ def cancel_all_pending_clarification_options(
178
+ initial_top_frame: ClarifyPatternFlowStackFrame,
179
+ original_stack: DialogueStack,
180
+ canceled_frames: List[str],
181
+ all_flows: FlowsList,
182
+ stack: DialogueStack,
183
+ ) -> List[FlowCancelled]:
184
+ """Cancel all pending clarification options.
185
+
186
+ This is a special case when the assistant asks the user to clarify
187
+ which pending digression flow to start after the completion of an active flow.
188
+ If the user chooses to cancel all options, this function takes care of
189
+ updating the stack by removing all pending flow stack frames
190
+ listed as clarification options.
191
+ """
192
+ clarification_names = set(initial_top_frame.names)
193
+ to_be_canceled_frames = []
194
+ applied_events = []
195
+ for frame in reversed(original_stack.frames):
196
+ if frame.frame_id in canceled_frames:
197
+ continue
198
+
199
+ to_be_canceled_frames.append(frame.frame_id)
200
+ if isinstance(frame, UserFlowStackFrame):
201
+ readable_flow_name = frame.flow(all_flows).readable_name()
202
+ if readable_flow_name in clarification_names:
203
+ stack.push(
204
+ CancelPatternFlowStackFrame(
205
+ canceled_name=readable_flow_name,
206
+ canceled_frames=copy.deepcopy(to_be_canceled_frames),
207
+ )
208
+ )
209
+ applied_events.append(FlowCancelled(frame.flow_id, frame.step_id))
210
+ to_be_canceled_frames.clear()
211
+
212
+ return applied_events
@@ -1,8 +1,14 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import re
3
4
  from dataclasses import dataclass
4
5
  from typing import Any, Dict, List
5
- from rasa.dialogue_understanding.commands import Command
6
+
7
+ from rasa.dialogue_understanding.commands.command import Command
8
+ from rasa.dialogue_understanding.commands.command_syntax_manager import (
9
+ CommandSyntaxManager,
10
+ CommandSyntaxVersion,
11
+ )
6
12
  from rasa.shared.core.events import Event
7
13
  from rasa.shared.core.flows import FlowsList
8
14
  from rasa.shared.core.trackers import DialogueStateTracker
@@ -11,7 +17,8 @@ from rasa.shared.core.trackers import DialogueStateTracker
11
17
  @dataclass
12
18
  class ChangeFlowCommand(Command):
13
19
  """A command to indicate a change of flows was requested by the command
14
- generator."""
20
+ generator.
21
+ """
15
22
 
16
23
  @classmethod
17
24
  def command(cls) -> str:
@@ -42,3 +49,30 @@ class ChangeFlowCommand(Command):
42
49
 
43
50
  def __hash__(self) -> int:
44
51
  return hash(self.command())
52
+
53
+ def to_dsl(self) -> str:
54
+ """Converts the command to a DSL string."""
55
+ mapper = {
56
+ CommandSyntaxVersion.v1: "ChangeFlow()",
57
+ CommandSyntaxVersion.v2: "change",
58
+ }
59
+ return mapper.get(
60
+ CommandSyntaxManager.get_syntax_version(),
61
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
62
+ )
63
+
64
+ @staticmethod
65
+ def from_dsl(match: re.Match, **kwargs: Any) -> ChangeFlowCommand:
66
+ """Converts the DSL string to a command."""
67
+ return ChangeFlowCommand()
68
+
69
+ @staticmethod
70
+ def regex_pattern() -> str:
71
+ mapper = {
72
+ CommandSyntaxVersion.v1: r"ChangeFlow\(\)",
73
+ CommandSyntaxVersion.v2: r"""^[\s\W\d]*change['"`]*$""",
74
+ }
75
+ return mapper.get(
76
+ CommandSyntaxManager.get_syntax_version(),
77
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
78
+ )
@@ -1,8 +1,16 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import re
3
4
  from dataclasses import dataclass
4
5
  from typing import Any, Dict, List
5
- from rasa.dialogue_understanding.commands import FreeFormAnswerCommand
6
+
7
+ from rasa.dialogue_understanding.commands.command_syntax_manager import (
8
+ CommandSyntaxManager,
9
+ CommandSyntaxVersion,
10
+ )
11
+ from rasa.dialogue_understanding.commands.free_form_answer_command import (
12
+ FreeFormAnswerCommand,
13
+ )
6
14
  from rasa.dialogue_understanding.patterns.chitchat import ChitchatPatternFlowStackFrame
7
15
  from rasa.shared.core.events import Event
8
16
  from rasa.shared.core.flows import FlowsList
@@ -51,7 +59,31 @@ class ChitChatAnswerCommand(FreeFormAnswerCommand):
51
59
  return hash(self.command())
52
60
 
53
61
  def __eq__(self, other: object) -> bool:
54
- if not isinstance(other, ChitChatAnswerCommand):
55
- return False
62
+ return isinstance(other, ChitChatAnswerCommand)
63
+
64
+ def to_dsl(self) -> str:
65
+ """Converts the command to a DSL string."""
66
+ mapper = {
67
+ CommandSyntaxVersion.v1: "ChitChat()",
68
+ CommandSyntaxVersion.v2: "offtopic reply",
69
+ }
70
+ return mapper.get(
71
+ CommandSyntaxManager.get_syntax_version(),
72
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
73
+ )
74
+
75
+ @classmethod
76
+ def from_dsl(cls, match: re.Match, **kwargs: Any) -> ChitChatAnswerCommand:
77
+ """Converts the DSL string to a command."""
78
+ return ChitChatAnswerCommand()
56
79
 
57
- return True
80
+ @staticmethod
81
+ def regex_pattern() -> str:
82
+ mapper = {
83
+ CommandSyntaxVersion.v1: r"ChitChat\(\)",
84
+ CommandSyntaxVersion.v2: r"""^[\s\W\d]*offtopic reply['"`]*$""",
85
+ }
86
+ return mapper.get(
87
+ CommandSyntaxManager.get_syntax_version(),
88
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
89
+ )
@@ -1,10 +1,17 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import re
3
4
  from dataclasses import dataclass
4
- from typing import Any, Dict, List
5
+ from typing import Any, Dict, List, Optional
5
6
 
6
7
  import structlog
7
- from rasa.dialogue_understanding.commands import Command
8
+
9
+ from rasa.dialogue_understanding.commands.command import Command
10
+ from rasa.dialogue_understanding.commands.command_syntax_manager import (
11
+ CommandSyntaxManager,
12
+ CommandSyntaxVersion,
13
+ )
14
+ from rasa.dialogue_understanding.commands.utils import extract_cleaned_options
8
15
  from rasa.dialogue_understanding.patterns.clarify import ClarifyPatternFlowStackFrame
9
16
  from rasa.shared.core.events import Event
10
17
  from rasa.shared.core.flows import FlowsList
@@ -54,7 +61,6 @@ class ClarifyCommand(Command):
54
61
  Returns:
55
62
  The events to apply to the tracker.
56
63
  """
57
-
58
64
  flows = [all_flows.flow_by_id(opt) for opt in self.options]
59
65
  clean_options = [flow.id for flow in flows if flow is not None]
60
66
  if len(clean_options) != len(self.options):
@@ -72,7 +78,13 @@ class ClarifyCommand(Command):
72
78
 
73
79
  stack = tracker.stack
74
80
  relevant_flows = [all_flows.flow_by_id(opt) for opt in clean_options]
75
- names = [flow.readable_name() for flow in relevant_flows if flow is not None]
81
+
82
+ names = [
83
+ flow.readable_name(language=tracker.current_language)
84
+ for flow in relevant_flows
85
+ if flow is not None
86
+ ]
87
+
76
88
  stack.push(ClarifyPatternFlowStackFrame(names=names))
77
89
  return tracker.create_stack_updated_events(stack)
78
90
 
@@ -84,3 +96,33 @@ class ClarifyCommand(Command):
84
96
  return False
85
97
 
86
98
  return other.options == self.options
99
+
100
+ def to_dsl(self) -> str:
101
+ """Converts the command to a DSL string."""
102
+ mapper = {
103
+ CommandSyntaxVersion.v1: f"Clarify({', '.join(self.options)})",
104
+ CommandSyntaxVersion.v2: f"disambiguate flows {' '.join(self.options)}",
105
+ }
106
+ return mapper.get(
107
+ CommandSyntaxManager.get_syntax_version(),
108
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
109
+ )
110
+
111
+ @classmethod
112
+ def from_dsl(cls, match: re.Match, **kwargs: Any) -> Optional[ClarifyCommand]:
113
+ """Converts the DSL string to a command."""
114
+ cleaned_options = extract_cleaned_options(match.group(1))
115
+ return ClarifyCommand(cleaned_options)
116
+
117
+ @staticmethod
118
+ def regex_pattern() -> str:
119
+ mapper = {
120
+ CommandSyntaxVersion.v1: r"Clarify\(([\"\'a-zA-Z0-9_, ]*)\)",
121
+ CommandSyntaxVersion.v2: (
122
+ r"""^[\s\W\d]*disambiguate flows (["'a-zA-Z0-9_, ]*)['"`]*$"""
123
+ ),
124
+ }
125
+ return mapper.get(
126
+ CommandSyntaxManager.get_syntax_version(),
127
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
128
+ )
@@ -1,12 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
- from dataclasses import dataclass
4
3
  import dataclasses
4
+ from dataclasses import dataclass
5
5
  from typing import Any, Dict, List
6
+
7
+ import rasa.shared.utils.common
6
8
  from rasa.shared.core.events import Event
7
9
  from rasa.shared.core.flows import FlowsList
8
10
  from rasa.shared.core.trackers import DialogueStateTracker
9
- import rasa.shared.utils.common
10
11
 
11
12
 
12
13
  @dataclass
@@ -0,0 +1,55 @@
1
+ from enum import Enum
2
+ from typing import Optional
3
+
4
+ import structlog
5
+
6
+
7
+ class CommandSyntaxVersion(Enum):
8
+ """Defines different syntax versions for commands."""
9
+
10
+ v1 = "v1"
11
+ v2 = "v2"
12
+
13
+
14
+ structlogger = structlog.get_logger()
15
+
16
+
17
+ class CommandSyntaxManager:
18
+ """A class to manage the command syntax version. It is used to set and get the
19
+ command syntax version. This class provides a way to introduce new syntax versions
20
+ for commands in the future. Hence, it is for internal use only.
21
+ """
22
+
23
+ _version = None # Directly store the version as a class attribute
24
+
25
+ @classmethod
26
+ def set_syntax_version(cls, version: CommandSyntaxVersion) -> None:
27
+ """Sets the command syntax version on the class itself.
28
+ This method is called only once at the time of LLMCommandGenerator
29
+ initialization to set the command syntax version, which ensures that the command
30
+ syntax version remains consistent throughout the lifetime of the generator.
31
+ """
32
+ if cls._version:
33
+ structlogger.debug(
34
+ "command_syntax_manager.syntax_version_already_set",
35
+ event_info=(
36
+ f"The command syntax version has already been set. Overwriting "
37
+ f"the existing version with the new version - {version}."
38
+ ),
39
+ )
40
+ cls._version = version
41
+
42
+ @classmethod
43
+ def get_syntax_version(cls) -> Optional[CommandSyntaxVersion]:
44
+ """Fetches the stored command syntax version."""
45
+ return cls._version
46
+
47
+ @staticmethod
48
+ def get_default_syntax_version() -> CommandSyntaxVersion:
49
+ """Returns the default command syntax version."""
50
+ return CommandSyntaxVersion.v1
51
+
52
+ @classmethod
53
+ def reset_syntax_version(cls) -> None:
54
+ """Resets the command syntax version. Implemented for use in testing."""
55
+ cls._version = None
@@ -5,7 +5,8 @@ from typing import Any, Dict, List, Optional
5
5
 
6
6
  import structlog
7
7
 
8
- from rasa.dialogue_understanding.commands import Command
8
+ import rasa.dialogue_understanding.stack.utils as utils
9
+ from rasa.dialogue_understanding.commands.command import Command
9
10
  from rasa.dialogue_understanding.patterns.correction import (
10
11
  FLOW_PATTERN_CORRECTION_ID,
11
12
  CorrectionPatternFlowStackFrame,
@@ -15,12 +16,11 @@ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
15
16
  BaseFlowStackFrame,
16
17
  )
17
18
  from rasa.shared.core.events import Event
19
+ from rasa.shared.core.flows import FlowsList
18
20
  from rasa.shared.core.flows.flow_step import FlowStepWithFlowReference
19
21
  from rasa.shared.core.flows.steps.constants import END_STEP
20
22
  from rasa.shared.core.flows.steps.continuation import ContinueFlowStep
21
- from rasa.shared.core.flows import FlowsList
22
23
  from rasa.shared.core.trackers import DialogueStateTracker
23
- import rasa.dialogue_understanding.stack.utils as utils
24
24
 
25
25
  structlogger = structlog.get_logger()
26
26
 
@@ -31,6 +31,7 @@ class CorrectedSlot:
31
31
 
32
32
  name: str
33
33
  value: Any
34
+ filled_by: Optional[str] = None
34
35
 
35
36
 
36
37
  @dataclass
@@ -54,7 +55,9 @@ class CorrectSlotsCommand(Command):
54
55
  try:
55
56
  return CorrectSlotsCommand(
56
57
  corrected_slots=[
57
- CorrectedSlot(s["name"], value=s["value"])
58
+ CorrectedSlot(
59
+ s["name"], value=s["value"], filled_by=s.get("filled_by", None)
60
+ )
58
61
  for s in data["corrected_slots"]
59
62
  ]
60
63
  )
@@ -135,7 +138,10 @@ class CorrectSlotsCommand(Command):
135
138
  proposed_slots = {}
136
139
  for corrected_slot in self.corrected_slots:
137
140
  if tracker.get_slot(corrected_slot.name) != corrected_slot.value:
138
- proposed_slots[corrected_slot.name] = corrected_slot.value
141
+ proposed_slots[corrected_slot.name] = {
142
+ "value": corrected_slot.value,
143
+ "filled_by": corrected_slot.filled_by,
144
+ }
139
145
  else:
140
146
  structlogger.debug(
141
147
  "command_executor.skip_correction.slot_already_set", command=self
@@ -240,6 +246,9 @@ class CorrectSlotsCommand(Command):
240
246
  corrected_slots=proposed_slots,
241
247
  reset_flow_id=earliest_collect.flow_id if earliest_collect else None,
242
248
  reset_step_id=earliest_collect.step.id if earliest_collect else None,
249
+ new_slot_values=[
250
+ value.get("value") for slot, value in proposed_slots.items()
251
+ ],
243
252
  )
244
253
 
245
254
  def run_command_on_tracker(
@@ -5,7 +5,7 @@ from typing import Any, Dict, List, Text
5
5
 
6
6
  import structlog
7
7
 
8
- from rasa.dialogue_understanding.commands import Command
8
+ from rasa.dialogue_understanding.commands.command import Command
9
9
  from rasa.dialogue_understanding.patterns.internal_error import (
10
10
  InternalErrorPatternFlowStackFrame,
11
11
  )
@@ -1,5 +1,6 @@
1
1
  from dataclasses import dataclass
2
- from rasa.dialogue_understanding.commands import Command
2
+
3
+ from rasa.dialogue_understanding.commands.command import Command
3
4
 
4
5
 
5
6
  @dataclass
@@ -5,12 +5,12 @@ from typing import Any, Dict, List
5
5
 
6
6
  import structlog
7
7
 
8
- from rasa.dialogue_understanding.commands import Command
8
+ from rasa.dialogue_understanding.commands.command import Command
9
9
  from rasa.dialogue_understanding.patterns.code_change import CodeChangeFlowStackFrame
10
+ from rasa.dialogue_understanding.stack.utils import top_user_flow_frame
10
11
  from rasa.shared.core.events import Event
11
12
  from rasa.shared.core.flows import FlowsList
12
13
  from rasa.shared.core.trackers import DialogueStateTracker
13
- from rasa.dialogue_understanding.stack.utils import top_user_flow_frame
14
14
 
15
15
  structlogger = structlog.get_logger()
16
16