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,24 +1,30 @@
1
- from typing import List, Optional, Type, Set, Dict
1
+ from typing import Dict, List, Optional, Set, Type
2
2
 
3
3
  import structlog
4
- from rasa.shared.core.training_data.structures import StoryGraph
4
+
5
5
  from rasa.dialogue_understanding.commands import (
6
6
  CancelFlowCommand,
7
+ CannotHandleCommand,
8
+ ChitChatAnswerCommand,
7
9
  ClarifyCommand,
8
10
  Command,
9
- CorrectSlotsCommand,
10
11
  CorrectedSlot,
12
+ CorrectSlotsCommand,
13
+ FreeFormAnswerCommand,
11
14
  RepeatBotMessagesCommand,
12
15
  SetSlotCommand,
13
16
  StartFlowCommand,
14
- FreeFormAnswerCommand,
15
- ChitChatAnswerCommand,
16
- CannotHandleCommand,
17
17
  )
18
18
  from rasa.dialogue_understanding.commands.handle_code_change_command import (
19
19
  HandleCodeChangeCommand,
20
20
  )
21
+ from rasa.dialogue_understanding.commands.handle_digressions_command import (
22
+ HandleDigressionsCommand,
23
+ )
21
24
  from rasa.dialogue_understanding.commands.set_slot_command import SetSlotExtractor
25
+ from rasa.dialogue_understanding.commands.utils import (
26
+ create_validate_frames_from_slot_set_events,
27
+ )
22
28
  from rasa.dialogue_understanding.patterns.chitchat import FLOW_PATTERN_CHITCHAT
23
29
  from rasa.dialogue_understanding.patterns.collect_information import (
24
30
  CollectInformationPatternFlowStackFrame,
@@ -26,6 +32,9 @@ from rasa.dialogue_understanding.patterns.collect_information import (
26
32
  from rasa.dialogue_understanding.patterns.correction import (
27
33
  CorrectionPatternFlowStackFrame,
28
34
  )
35
+ from rasa.dialogue_understanding.patterns.validate_slot import (
36
+ ValidateSlotPatternFlowStackFrame,
37
+ )
29
38
  from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
30
39
  from rasa.dialogue_understanding.stack.frames import (
31
40
  BaseFlowStackFrame,
@@ -33,19 +42,25 @@ from rasa.dialogue_understanding.stack.frames import (
33
42
  from rasa.dialogue_understanding.stack.utils import (
34
43
  filled_slots_for_active_flow,
35
44
  top_flow_frame,
45
+ top_user_flow_frame,
36
46
  )
37
47
  from rasa.engine.graph import ExecutionContext
38
48
  from rasa.shared.constants import (
39
- ROUTE_TO_CALM_SLOT,
40
49
  RASA_PATTERN_CANNOT_HANDLE_CHITCHAT,
50
+ ROUTE_TO_CALM_SLOT,
51
+ )
52
+ from rasa.shared.core.constants import (
53
+ ACTION_TRIGGER_CHITCHAT,
54
+ FLOW_HASHES_SLOT,
55
+ SlotMappingType,
41
56
  )
42
- from rasa.shared.core.constants import ACTION_TRIGGER_CHITCHAT, SlotMappingType
43
- from rasa.shared.core.constants import FLOW_HASHES_SLOT
44
57
  from rasa.shared.core.events import Event, SlotSet
45
58
  from rasa.shared.core.flows import FlowsList
46
59
  from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
60
+ from rasa.shared.core.slot_mappings import SlotMapping
47
61
  from rasa.shared.core.slots import Slot
48
62
  from rasa.shared.core.trackers import DialogueStateTracker
63
+ from rasa.shared.core.training_data.structures import StoryGraph
49
64
  from rasa.shared.nlu.constants import COMMANDS
50
65
 
51
66
  structlogger = structlog.get_logger()
@@ -226,18 +241,51 @@ def execute_commands(
226
241
  # and then pushing the commands onto the stack in the reversed order.
227
242
  reversed_commands = list(reversed(commands))
228
243
 
244
+ # we need to keep track of the ValidateSlotPatternFlowStackFrame that
245
+ # should be pushed onto the stack before executing the StartFlowCommands.
246
+ # This is necessary to make sure that slots filled before the start of a
247
+ # flow can be immediately validated without waiting till the flow is started
248
+ # and completed.
249
+ stack_frames_to_follow_commands: List[ValidateSlotPatternFlowStackFrame] = []
250
+
229
251
  validate_state_of_commands(commands)
230
252
 
231
253
  for command in reversed_commands:
232
254
  new_events = command.run_command_on_tracker(
233
255
  tracker, all_flows, original_tracker
234
256
  )
257
+
258
+ _, stack_frames_to_follow_commands = (
259
+ create_validate_frames_from_slot_set_events(
260
+ tracker, new_events, stack_frames_to_follow_commands
261
+ )
262
+ )
263
+
235
264
  events.extend(new_events)
236
265
  tracker.update_with_events(new_events)
237
266
 
267
+ new_events = push_stack_frames_to_follow_commands(
268
+ tracker, stack_frames_to_follow_commands
269
+ )
270
+ events.extend(new_events)
271
+
238
272
  return remove_duplicated_set_slots(events)
239
273
 
240
274
 
275
+ def push_stack_frames_to_follow_commands(
276
+ tracker: DialogueStateTracker, stack_frames: List
277
+ ) -> List[Event]:
278
+ """Push stack frames to follow commands."""
279
+ new_events = []
280
+
281
+ for frame in stack_frames:
282
+ stack = tracker.stack
283
+ stack.push(frame)
284
+ new_events.extend(tracker.create_stack_updated_events(stack))
285
+ tracker.update_with_events(new_events)
286
+ return new_events
287
+
288
+
241
289
  def remove_duplicated_set_slots(events: List[Event]) -> List[Event]:
242
290
  """Removes duplicated set slot events.
243
291
 
@@ -383,13 +431,29 @@ def clean_up_commands(
383
431
  command=command,
384
432
  )
385
433
 
386
- elif isinstance(command, StartFlowCommand) and command.flow == active_flow:
387
- # drop a start flow command if the starting flow is equal to the currently
388
- # active flow
389
- structlogger.debug(
390
- "command_processor.clean_up_commands.skip_command_flow_already_active",
391
- command=command,
434
+ elif isinstance(command, StartFlowCommand):
435
+ top_user_frame = top_user_flow_frame(
436
+ tracker.stack, ignore_call_and_link_frames=False
392
437
  )
438
+ top_flow_id = top_user_frame.flow_id if top_user_frame else ""
439
+
440
+ if top_flow_id == command.flow:
441
+ # drop a start flow command if the starting flow is equal
442
+ # to the currently active flow
443
+ structlogger.debug(
444
+ "command_processor.clean_up_commands.skip_command_flow_already_active",
445
+ command=command,
446
+ )
447
+ continue
448
+
449
+ if should_add_handle_digressions_command(tracker, all_flows, top_flow_id):
450
+ clean_commands.append(HandleDigressionsCommand(flow=command.flow))
451
+ structlogger.debug(
452
+ "command_processor.clean_up_commands.push_handle_digressions",
453
+ command=command,
454
+ )
455
+ else:
456
+ clean_commands.append(command)
393
457
 
394
458
  # handle chitchat command differently from other free-form answer commands
395
459
  elif isinstance(command, ChitChatAnswerCommand):
@@ -523,13 +587,48 @@ def clean_up_slot_command(
523
587
  )
524
588
  return resulting_commands
525
589
 
526
- if not should_slot_be_set(slot, command):
590
+ if not should_slot_be_set(slot, command, resulting_commands):
591
+ structlogger.debug(
592
+ "command_processor.clean_up_slot_command.skip_command.extractor_"
593
+ "does_not_match_slot_mapping",
594
+ extractor=command.extractor,
595
+ slot_name=slot.name,
596
+ )
597
+
598
+ # prevent adding a cannot handle command in case commands_so_far already
599
+ # contains a valid prior set slot command for the same slot whose current
600
+ # slot command was rejected by should_slot_be_set
601
+ slot_command_exists_already = any(
602
+ isinstance(command, SetSlotCommand) and command.name == slot.name
603
+ for command in resulting_commands
604
+ )
605
+
527
606
  cannot_handle = CannotHandleCommand(reason=CANNOT_HANDLE_REASON)
528
- if cannot_handle not in resulting_commands:
607
+ if not slot_command_exists_already and cannot_handle not in resulting_commands:
529
608
  resulting_commands.append(cannot_handle)
530
609
 
531
610
  return resulting_commands
532
611
 
612
+ if (
613
+ slot.filled_by == SetSlotExtractor.NLU.value
614
+ and command.extractor == SetSlotExtractor.LLM.value
615
+ ):
616
+ allow_nlu_correction = any(
617
+ [
618
+ mapping.allow_nlu_correction is True
619
+ for mapping in slot.mappings
620
+ if mapping.type == SlotMappingType.FROM_LLM
621
+ ]
622
+ )
623
+
624
+ if not allow_nlu_correction:
625
+ structlogger.debug(
626
+ "command_processor.clean_up_slot_command"
627
+ ".skip_command.disallow_llm_correction_of_nlu_set_value",
628
+ command=command,
629
+ )
630
+ return resulting_commands
631
+
533
632
  if command.name in slots_so_far and command.name != ROUTE_TO_CALM_SLOT:
534
633
  current_collect_info = get_current_collect_step(stack, all_flows)
535
634
 
@@ -570,7 +669,7 @@ def clean_up_slot_command(
570
669
  )
571
670
 
572
671
  # Group all corrections into one command
573
- corrected_slot = CorrectedSlot(command.name, command.value)
672
+ corrected_slot = CorrectedSlot(command.name, command.value, command.extractor)
574
673
  for c in resulting_commands:
575
674
  if isinstance(c, CorrectSlotsCommand):
576
675
  c.corrected_slots.append(corrected_slot)
@@ -654,7 +753,9 @@ def clean_up_chitchat_command(
654
753
  return resulting_commands
655
754
 
656
755
 
657
- def should_slot_be_set(slot: Slot, command: SetSlotCommand) -> bool:
756
+ def should_slot_be_set(
757
+ slot: Slot, command: SetSlotCommand, commands_so_far: Optional[List[Command]] = None
758
+ ) -> bool:
658
759
  """Check if a slot should be set by a command."""
659
760
  if command.extractor == SetSlotExtractor.COMMAND_PAYLOAD_READER.value:
660
761
  # if the command is issued by the command payload reader, it means the slot
@@ -662,37 +763,61 @@ def should_slot_be_set(slot: Slot, command: SetSlotCommand) -> bool:
662
763
  # we can always set it
663
764
  return True
664
765
 
766
+ if commands_so_far is None:
767
+ commands_so_far = []
768
+
769
+ set_slot_commands_so_far = [
770
+ command
771
+ for command in commands_so_far
772
+ if isinstance(command, SetSlotCommand) and command.name == slot.name
773
+ ]
774
+
665
775
  slot_mappings = slot.mappings
666
776
 
667
- if not slot_mappings:
668
- slot_mappings = [{"type": SlotMappingType.FROM_LLM.value}]
777
+ if not slot.mappings:
778
+ slot_mappings = [SlotMapping(type=SlotMappingType.FROM_LLM)]
669
779
 
670
- for mapping in slot_mappings:
671
- mapping_type = SlotMappingType(
672
- mapping.get("type", SlotMappingType.FROM_LLM.value)
673
- )
780
+ mapping_types = [mapping.type for mapping in slot_mappings]
674
781
 
675
- should_be_set_by_llm = (
676
- command.extractor == SetSlotExtractor.LLM.value
677
- and mapping_type == SlotMappingType.FROM_LLM
678
- )
679
- should_be_set_by_nlu = (
680
- command.extractor == SetSlotExtractor.NLU.value
681
- and mapping_type.is_predefined_type()
782
+ slot_has_nlu_mapping = any(
783
+ [mapping_type.is_predefined_type() for mapping_type in mapping_types]
784
+ )
785
+ slot_has_llm_mapping = any(
786
+ [mapping_type == SlotMappingType.FROM_LLM for mapping_type in mapping_types]
787
+ )
788
+ slot_has_controlled_mapping = any(
789
+ [mapping_type == SlotMappingType.CONTROLLED for mapping_type in mapping_types]
790
+ )
791
+
792
+ if set_slot_commands_so_far and command.extractor == SetSlotExtractor.LLM.value:
793
+ # covers the following scenarios:
794
+ # scenario 1: NLU mapping extracts a value for slot_a → If LLM extracts a value for slot_a, it is discarded. # noqa: E501
795
+ # scenario 2: NLU mapping is unable to extract a value for slot_a → If LLM extracts a value for slot_a, it is accepted. # noqa: E501
796
+ command_has_nlu_extractor = any(
797
+ [
798
+ command.extractor == SetSlotExtractor.NLU.value
799
+ for command in set_slot_commands_so_far
800
+ ]
682
801
  )
802
+ return not command_has_nlu_extractor and slot_has_llm_mapping
683
803
 
684
- if should_be_set_by_llm or should_be_set_by_nlu:
685
- # if the extractor matches the mapping type, we can continue
686
- # setting the slot
687
- break
804
+ if (
805
+ slot_has_nlu_mapping
806
+ and command.extractor == SetSlotExtractor.LLM.value
807
+ and not slot_has_llm_mapping
808
+ ):
809
+ return False
688
810
 
689
- structlogger.debug(
690
- "command_processor.clean_up_slot_command.skip_command.extractor_"
691
- "does_not_match_slot_mapping",
692
- extractor=command.extractor,
693
- slot_name=slot.name,
694
- mapping_type=mapping_type.value,
695
- )
811
+ if (
812
+ slot_has_llm_mapping
813
+ and command.extractor == SetSlotExtractor.NLU.value
814
+ and not slot_has_nlu_mapping
815
+ ):
816
+ return False
817
+
818
+ if slot_has_controlled_mapping and not (
819
+ slot_has_nlu_mapping or slot_has_llm_mapping
820
+ ):
696
821
  return False
697
822
 
698
823
  return True
@@ -718,3 +843,28 @@ def filter_cannot_handle_command_for_skipped_slots(
718
843
  and CANNOT_HANDLE_REASON == command.reason
719
844
  )
720
845
  ]
846
+
847
+
848
+ def should_add_handle_digressions_command(
849
+ tracker: DialogueStateTracker, all_flows: FlowsList, top_flow_id: str
850
+ ) -> bool:
851
+ """Check if a handle digressions command should be added to the commands.
852
+
853
+ The command should replace a StartFlow command only if we are at a collect step of
854
+ a flow and a new flow is predicted by the command generator to start.
855
+ """
856
+ current_flow = all_flows.flow_by_id(top_flow_id)
857
+ current_flow_condition = current_flow and (
858
+ current_flow.ask_confirm_digressions or current_flow.block_digressions
859
+ )
860
+
861
+ collect_info = get_current_collect_step(tracker.stack, all_flows)
862
+
863
+ if collect_info and (
864
+ collect_info.ask_confirm_digressions
865
+ or collect_info.block_digressions
866
+ or current_flow_condition
867
+ ):
868
+ return True
869
+
870
+ return False
@@ -1,8 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from typing import Any, Dict, List, Text
4
- import rasa.dialogue_understanding.processor.command_processor
5
4
 
5
+ import rasa.dialogue_understanding.processor.command_processor
6
6
  from rasa.engine.graph import ExecutionContext, GraphComponent
7
7
  from rasa.engine.storage.resource import Resource
8
8
  from rasa.engine.storage.storage import ModelStorage
@@ -1,11 +1,12 @@
1
1
  from __future__ import annotations
2
- import copy
3
2
 
3
+ import copy
4
+ import typing
4
5
  from dataclasses import dataclass
5
6
  from typing import Any, Callable, Dict, List, Optional
6
- import structlog
7
- import typing
7
+
8
8
  import jsonpatch
9
+ import structlog
9
10
 
10
11
  if typing.TYPE_CHECKING:
11
12
  from rasa.dialogue_understanding.stack.frames import DialogueStackFrame
@@ -1,13 +1,13 @@
1
+ from rasa.dialogue_understanding.stack.frames.chit_chat_frame import ChitChatStackFrame
1
2
  from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
2
3
  DialogueStackFrame,
3
4
  )
4
5
  from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
5
- UserFlowStackFrame,
6
6
  BaseFlowStackFrame,
7
+ UserFlowStackFrame,
7
8
  )
8
9
  from rasa.dialogue_understanding.stack.frames.pattern_frame import PatternFlowStackFrame
9
10
  from rasa.dialogue_understanding.stack.frames.search_frame import SearchStackFrame
10
- from rasa.dialogue_understanding.stack.frames.chit_chat_frame import ChitChatStackFrame
11
11
 
12
12
  __all__ = [
13
13
  "DialogueStackFrame",
@@ -2,7 +2,10 @@ from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
4
  from typing import Any, Dict
5
- from rasa.dialogue_understanding.stack.frames import DialogueStackFrame
5
+
6
+ from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
7
+ DialogueStackFrame,
8
+ )
6
9
 
7
10
 
8
11
  @dataclass
@@ -1,19 +1,18 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import dataclasses
3
4
  import inspect
4
5
  from dataclasses import dataclass, field
5
- import dataclasses
6
6
  from enum import Enum
7
7
  from functools import lru_cache
8
8
  from typing import Any, Dict, List, Tuple, Type
9
9
 
10
10
  import structlog
11
- from rasa.shared.exceptions import RasaException
12
11
 
13
12
  import rasa.shared.utils.common
13
+ from rasa.shared.exceptions import RasaException
14
14
  from rasa.shared.utils.io import random_string
15
15
 
16
-
17
16
  structlogger = structlog.get_logger()
18
17
 
19
18
 
@@ -1,11 +1,14 @@
1
1
  from __future__ import annotations
2
+
2
3
  from dataclasses import dataclass
3
4
  from enum import Enum
4
5
  from typing import Any, Dict, Optional
5
6
 
6
- from rasa.dialogue_understanding.stack.frames import DialogueStackFrame
7
- from rasa.shared.core.flows.steps.constants import START_STEP
7
+ from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
8
+ DialogueStackFrame,
9
+ )
8
10
  from rasa.shared.core.flows import Flow, FlowsList, FlowStep
11
+ from rasa.shared.core.flows.steps.constants import START_STEP
9
12
  from rasa.shared.exceptions import RasaException
10
13
 
11
14
 
@@ -1,8 +1,11 @@
1
1
  from __future__ import annotations
2
+
2
3
  from dataclasses import dataclass
3
4
  from typing import Any, Dict
4
5
 
5
- from rasa.dialogue_understanding.stack.frames import DialogueStackFrame
6
+ from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
7
+ DialogueStackFrame,
8
+ )
6
9
 
7
10
 
8
11
  @dataclass
@@ -1,17 +1,23 @@
1
- from typing import List, Optional, Set, Tuple
2
1
  import typing
2
+ from typing import List, Optional, Set, Tuple
3
+
3
4
  from rasa.dialogue_understanding.patterns.collect_information import (
4
5
  CollectInformationPatternFlowStackFrame,
5
6
  )
6
- from rasa.dialogue_understanding.stack.frames import BaseFlowStackFrame
7
+ from rasa.dialogue_understanding.patterns.continue_interrupted import (
8
+ ContinueInterruptedPatternFlowStackFrame,
9
+ )
7
10
  from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
8
- from rasa.dialogue_understanding.stack.frames import UserFlowStackFrame
11
+ from rasa.dialogue_understanding.stack.frames import (
12
+ BaseFlowStackFrame,
13
+ UserFlowStackFrame,
14
+ )
9
15
  from rasa.dialogue_understanding.stack.frames.flow_stack_frame import FlowStackFrameType
10
16
  from rasa.dialogue_understanding.stack.frames.pattern_frame import PatternFlowStackFrame
17
+ from rasa.shared.core.flows import FlowsList
11
18
  from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
12
19
  from rasa.shared.core.flows.steps.constants import END_STEP
13
20
  from rasa.shared.core.flows.steps.continuation import ContinueFlowStep
14
- from rasa.shared.core.flows import FlowsList
15
21
 
16
22
  if typing.TYPE_CHECKING:
17
23
  from rasa.shared.core.trackers import DialogueStateTracker
@@ -57,7 +63,9 @@ def top_flow_frame(
57
63
  return None
58
64
 
59
65
 
60
- def top_user_flow_frame(dialogue_stack: DialogueStack) -> Optional[UserFlowStackFrame]:
66
+ def top_user_flow_frame(
67
+ dialogue_stack: DialogueStack, ignore_call_and_link_frames: bool = True
68
+ ) -> Optional[UserFlowStackFrame]:
61
69
  """Returns the topmost user flow frame from the tracker.
62
70
 
63
71
  User flows are flows that are created by developers of an assistant and
@@ -69,16 +77,19 @@ def top_user_flow_frame(dialogue_stack: DialogueStack) -> Optional[UserFlowStack
69
77
 
70
78
  Args:
71
79
  dialogue_stack: The dialogue stack to use.
80
+ ignore_call_and_link_frames: Whether to ignore user frames of type `call`
81
+ and `link`. By default, these frames are ignored.
72
82
 
73
83
  Returns:
74
84
  The topmost user flow frame from the tracker.
75
85
  """
76
86
  for frame in reversed(dialogue_stack.frames):
77
- if (
78
- isinstance(frame, UserFlowStackFrame)
79
- and frame.frame_type != FlowStackFrameType.CALL
80
- and frame.frame_type != FlowStackFrameType.LINK
81
- ):
87
+ if isinstance(frame, UserFlowStackFrame):
88
+ if ignore_call_and_link_frames and (
89
+ frame.frame_type == FlowStackFrameType.CALL
90
+ or frame.frame_type == FlowStackFrameType.LINK
91
+ ):
92
+ continue
82
93
  return frame
83
94
  return None
84
95
 
@@ -210,3 +221,38 @@ def get_collect_steps_excluding_ask_before_filling_for_active_flow(
210
221
  for step in active_flow.get_collect_steps()
211
222
  if not step.ask_before_filling
212
223
  )
224
+
225
+
226
+ def remove_digression_from_stack(stack: DialogueStack, flow_id: str) -> DialogueStack:
227
+ """Remove a specific flow frame from the stack and other frames that reference it.
228
+
229
+ The main use-case is to prevent duplicate digressions from being added to the stack.
230
+
231
+ Args:
232
+ stack: The dialogue stack.
233
+ flow_id: The flow to remove.
234
+
235
+ Returns:
236
+ The updated dialogue stack.
237
+ """
238
+ updated_stack = stack.copy()
239
+ original_frames = updated_stack.frames[:]
240
+ found_digression_index = -1
241
+ for index, frame in enumerate(original_frames):
242
+ if isinstance(frame, BaseFlowStackFrame) and frame.flow_id == flow_id:
243
+ updated_stack.frames.pop(index)
244
+ found_digression_index = index
245
+
246
+ # we also need to remove the `ContinueInterruptedPatternFlowStackFrame`
247
+ elif (
248
+ isinstance(frame, ContinueInterruptedPatternFlowStackFrame)
249
+ and frame.previous_flow_name == flow_id
250
+ and found_digression_index + 1 == index
251
+ ):
252
+ # we know that this frame is always added after the digressing flow frame
253
+ # that was blocked previously by action_block_digressions,
254
+ # so this check would occur after the digressing flow was popped.
255
+ # Therefore, we need to update the index dynamically before popping.
256
+ updated_stack.frames.pop(index - 1)
257
+
258
+ return updated_stack