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,9 +1,9 @@
1
1
  from __future__ import annotations
2
+
2
3
  from enum import Enum
3
4
 
4
5
  import rasa.shared.constants as constants
5
6
 
6
-
7
7
  DEFAULT_CATEGORICAL_SLOT_VALUE = "__other__"
8
8
 
9
9
  USER_INTENT_RESTART = "restart"
@@ -13,6 +13,7 @@ USER_INTENT_SESSION_START = "session_start"
13
13
  USER_INTENT_SESSION_END = "session_end"
14
14
  USER_INTENT_SILENCE_TIMEOUT = "silence_timeout"
15
15
  SESSION_START_METADATA_SLOT = "session_started_metadata"
16
+ LANGUAGE_SLOT = "language"
16
17
 
17
18
  DEFAULT_INTENTS = [
18
19
  USER_INTENT_RESTART,
@@ -51,6 +52,11 @@ ACTION_TRIGGER_CHITCHAT = "action_trigger_chitchat"
51
52
  ACTION_RESET_ROUTING = "action_reset_routing"
52
53
  ACTION_HANGUP = "action_hangup"
53
54
  ACTION_REPEAT_BOT_MESSAGES = "action_repeat_bot_messages"
55
+ ACTION_BLOCK_DIGRESSION = "action_block_digression"
56
+ ACTION_CONTINUE_DIGRESSION = "action_continue_digression"
57
+
58
+ ACTION_METADATA_EXECUTION_SUCCESS = "execution_success"
59
+ ACTION_METADATA_EXECUTION_ERROR_MESSAGE = "execution_error_message"
54
60
 
55
61
 
56
62
  DEFAULT_ACTION_NAMES = [
@@ -78,6 +84,8 @@ DEFAULT_ACTION_NAMES = [
78
84
  ACTION_RESET_ROUTING,
79
85
  ACTION_HANGUP,
80
86
  ACTION_REPEAT_BOT_MESSAGES,
87
+ ACTION_BLOCK_DIGRESSION,
88
+ ACTION_CONTINUE_DIGRESSION,
81
89
  ]
82
90
 
83
91
  ACTION_SHOULD_SEND_DOMAIN = "send_domain"
@@ -134,7 +142,11 @@ DEFAULT_SLOT_NAMES = {
134
142
 
135
143
  SLOT_MAPPINGS = "mappings"
136
144
  MAPPING_CONDITIONS = "conditions"
137
- MAPPING_TYPE = "type"
145
+ KEY_MAPPING_TYPE = "type"
146
+ KEY_ALLOW_NLU_CORRECTION = "allow_nlu_correction"
147
+ KEY_ACTION = "action"
148
+ KEY_RUN_ACTION_EVERY_TURN = "run_action_every_turn"
149
+ KEY_COEXISTENCE_SYSTEM = "coexistence_system"
138
150
 
139
151
 
140
152
  class SlotMappingType(Enum):
@@ -145,7 +157,7 @@ class SlotMappingType(Enum):
145
157
  FROM_TRIGGER_INTENT = "from_trigger_intent"
146
158
  FROM_TEXT = "from_text"
147
159
  FROM_LLM = "from_llm"
148
- CUSTOM = "custom"
160
+ CONTROLLED = "controlled"
149
161
 
150
162
  def __str__(self) -> str:
151
163
  """Returns the string representation that should be used in config files."""
@@ -153,7 +165,21 @@ class SlotMappingType(Enum):
153
165
 
154
166
  def is_predefined_type(self) -> bool:
155
167
  """Returns True if the mapping type is NLU-predefined."""
156
- return not (self == SlotMappingType.CUSTOM or self == SlotMappingType.FROM_LLM)
168
+ return not (
169
+ self == SlotMappingType.CONTROLLED or self == SlotMappingType.FROM_LLM
170
+ )
171
+
172
+
173
+ class SetSlotExtractor(Enum):
174
+ """The extractors that can set a slot."""
175
+
176
+ LLM = "LLM"
177
+ COMMAND_PAYLOAD_READER = "CommandPayloadReader"
178
+ NLU = "NLU"
179
+ CUSTOM = "CUSTOM"
180
+
181
+ def __str__(self) -> str:
182
+ return self.value
157
183
 
158
184
 
159
185
  # the keys for `State` (USER, PREVIOUS_ACTION, SLOTS, ACTIVE_LOOP)
@@ -178,3 +204,7 @@ POLICY_NAME_RULE = "RulePolicy"
178
204
  CLASSIFIER_NAME_FALLBACK = "FallbackClassifier"
179
205
 
180
206
  POLICIES_THAT_EXTRACT_ENTITIES = {"TEDPolicy"}
207
+
208
+ # digression constants
209
+ KEY_ASK_CONFIRM_DIGRESSIONS = "ask_confirm_digressions"
210
+ KEY_BLOCK_DIGRESSIONS = "block_digressions"
@@ -1,8 +1,7 @@
1
- from typing import Dict, List, Text, Any, TYPE_CHECKING
1
+ from typing import TYPE_CHECKING, Any, Dict, List, Text
2
2
 
3
3
  import rasa.shared.core.events
4
4
 
5
-
6
5
  if TYPE_CHECKING:
7
6
  from rasa.shared.core.events import Event
8
7
 
@@ -46,14 +46,13 @@ from rasa.shared.constants import (
46
46
  )
47
47
  from rasa.shared.core.constants import (
48
48
  ACTION_SHOULD_SEND_DOMAIN,
49
- ACTIVE_LOOP,
49
+ KEY_MAPPING_TYPE,
50
50
  KNOWLEDGE_BASE_SLOT_NAMES,
51
- MAPPING_CONDITIONS,
52
- MAPPING_TYPE,
53
51
  SLOT_MAPPINGS,
54
52
  SlotMappingType,
55
53
  )
56
54
  from rasa.shared.core.events import SlotSet, UserUttered
55
+ from rasa.shared.core.flows.constants import KEY_TRANSLATION
57
56
  from rasa.shared.core.slots import (
58
57
  AnySlot,
59
58
  CategoricalSlot,
@@ -119,6 +118,7 @@ RESPONSE_KEYS_TO_INTERPOLATE = [
119
118
  KEY_RESPONSES_BUTTONS,
120
119
  KEY_RESPONSES_ATTACHMENT,
121
120
  KEY_RESPONSES_QUICK_REPLIES,
121
+ KEY_TRANSLATION,
122
122
  ]
123
123
 
124
124
  ALL_DOMAIN_KEYS = [
@@ -290,8 +290,6 @@ class Domain:
290
290
  responses = data.get(KEY_RESPONSES, {})
291
291
 
292
292
  domain_slots = data.get(KEY_SLOTS, {})
293
- if domain_slots:
294
- rasa.shared.core.slot_mappings.validate_slot_mappings(domain_slots)
295
293
  slots = cls.collect_slots(domain_slots)
296
294
  domain_actions = data.get(KEY_ACTIONS, [])
297
295
  actions = cls._collect_action_names(domain_actions)
@@ -596,7 +594,7 @@ class Domain:
596
594
  ),
597
595
  )
598
596
  slot_dict[slot_name][SLOT_MAPPINGS] = [
599
- {MAPPING_TYPE: SlotMappingType.FROM_LLM.value}
597
+ {KEY_MAPPING_TYPE: SlotMappingType.FROM_LLM.value}
600
598
  ]
601
599
 
602
600
  slot = slot_class(slot_name, **slot_dict[slot_name])
@@ -1569,21 +1567,18 @@ class Domain:
1569
1567
  matching_entities = []
1570
1568
 
1571
1569
  for mapping in slot.mappings:
1572
- mapping_conditions = mapping.get(MAPPING_CONDITIONS)
1573
- if mapping[MAPPING_TYPE] != str(SlotMappingType.FROM_ENTITY) or (
1570
+ mapping_conditions = mapping.conditions
1571
+ if mapping.type != SlotMappingType.FROM_ENTITY or (
1574
1572
  mapping_conditions
1575
- and mapping_conditions[0].get(ACTIVE_LOOP) is not None
1573
+ and mapping_conditions[0].active_loop is not None
1576
1574
  ):
1577
1575
  continue
1578
1576
 
1579
1577
  for entity in entities:
1580
1578
  if (
1581
- entity.get(ENTITY_ATTRIBUTE_TYPE)
1582
- == mapping.get(ENTITY_ATTRIBUTE_TYPE)
1583
- and entity.get(ENTITY_ATTRIBUTE_ROLE)
1584
- == mapping.get(ENTITY_ATTRIBUTE_ROLE)
1585
- and entity.get(ENTITY_ATTRIBUTE_GROUP)
1586
- == mapping.get(ENTITY_ATTRIBUTE_GROUP)
1579
+ entity.get(ENTITY_ATTRIBUTE_TYPE) == mapping.entity
1580
+ and entity.get(ENTITY_ATTRIBUTE_ROLE) == mapping.role
1581
+ and entity.get(ENTITY_ATTRIBUTE_GROUP) == mapping.group
1587
1582
  ):
1588
1583
  matching_entities.append(entity.get("value"))
1589
1584
 
@@ -2015,19 +2010,19 @@ class Domain:
2015
2010
  is the total number of mappings which have conditions attached.
2016
2011
  """
2017
2012
  total_mappings = 0
2018
- custom_mappings = 0
2013
+ controlled_mappings = 0
2019
2014
  conditional_mappings = 0
2020
2015
 
2021
2016
  for slot in self.slots:
2022
2017
  total_mappings += len(slot.mappings)
2023
2018
  for mapping in slot.mappings:
2024
- if mapping[MAPPING_TYPE] == str(SlotMappingType.CUSTOM):
2025
- custom_mappings += 1
2019
+ if mapping.type == SlotMappingType.CONTROLLED:
2020
+ controlled_mappings += 1
2026
2021
 
2027
- if MAPPING_CONDITIONS in mapping:
2022
+ if mapping.conditions:
2028
2023
  conditional_mappings += 1
2029
2024
 
2030
- return (total_mappings, custom_mappings, conditional_mappings)
2025
+ return total_mappings, controlled_mappings, conditional_mappings
2031
2026
 
2032
2027
  def does_custom_action_explicitly_need_domain(self, action_name: Text) -> bool:
2033
2028
  """Assert if action has explicitly stated that it needs domain.
@@ -2112,6 +2107,10 @@ class Domain:
2112
2107
 
2113
2108
  return read_yaml(raw_yaml_content, expand_env_vars=cls.expand_env_vars)
2114
2109
 
2110
+ def remove_builtin_slots(self) -> None:
2111
+ """Remove all builtin slots from the domain."""
2112
+ self.slots = [slot for slot in self.slots if not slot.is_builtin]
2113
+
2115
2114
 
2116
2115
  def warn_about_duplicates_found_during_domain_merging(
2117
2116
  duplicates: Dict[Text, List[Text]],
@@ -2,68 +2,69 @@ import abc
2
2
  import copy
3
3
  import json
4
4
  import logging
5
- import structlog
6
5
  import re
7
- from abc import ABC
8
-
9
- import jsonpickle
10
6
  import time
11
7
  import uuid
12
- from dateutil import parser
8
+ from abc import ABC
13
9
  from datetime import datetime
14
10
  from typing import (
15
- List,
16
- Dict,
17
- Text,
18
- Any,
19
- Type,
20
- Optional,
21
11
  TYPE_CHECKING,
12
+ Any,
13
+ Dict,
22
14
  Iterable,
23
- cast,
15
+ List,
16
+ Optional,
17
+ Text,
24
18
  Tuple,
19
+ Type,
25
20
  TypeVar,
21
+ Union,
22
+ cast,
26
23
  )
27
24
 
25
+ import jsonpickle
26
+ import structlog
27
+ from dateutil import parser
28
+
28
29
  import rasa.shared.utils.common
29
30
  import rasa.shared.utils.io
30
- from typing import Union
31
-
32
31
  from rasa.shared.constants import DOCS_URL_TRAINING_DATA
33
32
  from rasa.shared.core.constants import (
34
- LOOP_NAME,
35
- EXTERNAL_MESSAGE_PREFIX,
33
+ ACTION_LISTEN_NAME,
34
+ ACTION_METADATA_EXECUTION_ERROR_MESSAGE,
35
+ ACTION_METADATA_EXECUTION_SUCCESS,
36
36
  ACTION_NAME_SENDER_ID_CONNECTOR_STR,
37
+ ACTION_SESSION_START_NAME,
38
+ ENTITY_LABEL_SEPARATOR,
39
+ EXTERNAL_MESSAGE_PREFIX,
37
40
  IS_EXTERNAL,
38
- USE_TEXT_FOR_FEATURIZATION,
39
41
  LOOP_INTERRUPTED,
40
- ENTITY_LABEL_SEPARATOR,
41
- ACTION_SESSION_START_NAME,
42
- ACTION_LISTEN_NAME,
42
+ LOOP_NAME,
43
+ USE_TEXT_FOR_FEATURIZATION,
43
44
  )
44
45
  from rasa.shared.exceptions import UnsupportedFeatureException
45
46
  from rasa.shared.nlu.constants import (
46
- ENTITY_ATTRIBUTE_TYPE,
47
- INTENT,
48
- TEXT,
49
- ENTITIES,
50
- COMMANDS,
51
- ENTITY_ATTRIBUTE_VALUE,
52
- ACTION_TEXT,
53
47
  ACTION_NAME,
54
- INTENT_NAME_KEY,
55
- ENTITY_ATTRIBUTE_ROLE,
56
- ENTITY_ATTRIBUTE_GROUP,
57
- PREDICTED_CONFIDENCE_KEY,
58
- INTENT_RANKING_KEY,
59
- ENTITY_ATTRIBUTE_TEXT,
60
- ENTITY_ATTRIBUTE_START,
48
+ ACTION_TEXT,
49
+ COMMANDS,
50
+ ENTITIES,
61
51
  ENTITY_ATTRIBUTE_CONFIDENCE,
62
52
  ENTITY_ATTRIBUTE_END,
53
+ ENTITY_ATTRIBUTE_GROUP,
54
+ ENTITY_ATTRIBUTE_ROLE,
55
+ ENTITY_ATTRIBUTE_START,
56
+ ENTITY_ATTRIBUTE_TEXT,
57
+ ENTITY_ATTRIBUTE_TYPE,
58
+ ENTITY_ATTRIBUTE_VALUE,
63
59
  FULL_RETRIEVAL_INTENT_NAME_KEY,
60
+ INTENT,
61
+ INTENT_NAME_KEY,
62
+ INTENT_RANKING_KEY,
63
+ PREDICTED_CONFIDENCE_KEY,
64
+ PROMPTS,
65
+ TEXT,
64
66
  )
65
67
 
66
-
67
68
  if TYPE_CHECKING:
68
69
  from typing_extensions import TypedDict
69
70
 
@@ -98,6 +99,7 @@ if TYPE_CHECKING:
98
99
  ENTITIES: List[EntityPrediction],
99
100
  "message_id": Optional[Text],
100
101
  "metadata": Dict,
102
+ PROMPTS: Dict,
101
103
  },
102
104
  total=False,
103
105
  )
@@ -147,8 +149,8 @@ def format_message(
147
149
  Message with entities annotated inline, e.g.
148
150
  `I am from [Berlin]{`"`entity`"`: `"`city`"`}`.
149
151
  """
150
- from rasa.shared.nlu.training_data.formats.readerwriter import TrainingDataWriter
151
152
  from rasa.shared.nlu.training_data import entities_parser
153
+ from rasa.shared.nlu.training_data.formats.readerwriter import TrainingDataWriter
152
154
 
153
155
  message_from_md = entities_parser.parse_training_example(text, intent)
154
156
  deserialised_entities = deserialise_entities(entities)
@@ -1030,6 +1032,7 @@ class SlotSet(Event):
1030
1032
  value: Optional[Any] = None,
1031
1033
  timestamp: Optional[float] = None,
1032
1034
  metadata: Optional[Dict[Text, Any]] = None,
1035
+ filled_by: Optional[str] = None,
1033
1036
  ) -> None:
1034
1037
  """Creates event to set slot.
1035
1038
 
@@ -1041,6 +1044,7 @@ class SlotSet(Event):
1041
1044
  """
1042
1045
  self.key = key
1043
1046
  self.value = value
1047
+ self._filled_by = filled_by
1044
1048
  super().__init__(timestamp, metadata)
1045
1049
 
1046
1050
  def __repr__(self) -> Text:
@@ -1058,6 +1062,14 @@ class SlotSet(Event):
1058
1062
 
1059
1063
  return (self.key, self.value) == (other.key, other.value)
1060
1064
 
1065
+ @property
1066
+ def filled_by(self) -> Optional[str]:
1067
+ return self._filled_by
1068
+
1069
+ @filled_by.setter
1070
+ def filled_by(self, value: str) -> None:
1071
+ self._filled_by = value
1072
+
1061
1073
  def as_story_string(self) -> Text:
1062
1074
  """Returns text representation of event."""
1063
1075
  props = json.dumps({self.key: self.value}, ensure_ascii=False)
@@ -1079,7 +1091,7 @@ class SlotSet(Event):
1079
1091
  def as_dict(self) -> Dict[Text, Any]:
1080
1092
  """Returns serialized event."""
1081
1093
  d = super().as_dict()
1082
- d.update({"name": self.key, "value": self.value})
1094
+ d.update({"name": self.key, "value": self.value, "filled_by": self.filled_by})
1083
1095
  return d
1084
1096
 
1085
1097
  @classmethod
@@ -1090,13 +1102,14 @@ class SlotSet(Event):
1090
1102
  parameters.get("value"),
1091
1103
  parameters.get("timestamp"),
1092
1104
  parameters.get("metadata"),
1105
+ filled_by=parameters.get("filled_by"),
1093
1106
  )
1094
1107
  except KeyError as e:
1095
1108
  raise ValueError(f"Failed to parse set slot event. {e}")
1096
1109
 
1097
1110
  def apply_to(self, tracker: "DialogueStateTracker") -> None:
1098
1111
  """Applies event to current conversation state."""
1099
- tracker._set_slot(self.key, self.value)
1112
+ tracker._set_slot(self.key, self.value, self.filled_by)
1100
1113
 
1101
1114
 
1102
1115
  class Restarted(AlwaysEqualEventMixin):
@@ -1704,7 +1717,15 @@ class ActionExecuted(Event):
1704
1717
  super().__init__(timestamp, metadata)
1705
1718
 
1706
1719
  def __members__(self) -> Tuple[Optional[Text], Optional[Text], Text]:
1707
- meta_no_nones = {k: v for k, v in self.metadata.items() if v is not None}
1720
+ items_to_ignore = [
1721
+ ACTION_METADATA_EXECUTION_SUCCESS,
1722
+ ACTION_METADATA_EXECUTION_ERROR_MESSAGE,
1723
+ ]
1724
+ meta_no_nones = {
1725
+ k: v
1726
+ for k, v in self.metadata.items()
1727
+ if v is not None and k not in items_to_ignore
1728
+ }
1708
1729
  return (self.action_name, self.action_text, jsonpickle.encode(meta_no_nones))
1709
1730
 
1710
1731
  def __repr__(self) -> Text:
@@ -2,6 +2,5 @@ from .flow import Flow
2
2
  from .flow_step import FlowStep
3
3
  from .flows_list import FlowsList
4
4
 
5
-
6
5
  # to make ruff happy and use the imported names
7
6
  all_classes = [FlowStep, Flow, FlowsList]
@@ -0,0 +1,11 @@
1
+ KEY_ID = "id"
2
+ KEY_STEPS = "steps"
3
+ KEY_NAME = "name"
4
+ KEY_DESCRIPTION = "description"
5
+ KEY_IF = "if"
6
+ KEY_ALWAYS_INCLUDE_IN_PROMPT = "always_include_in_prompt"
7
+ KEY_NLU_TRIGGER = "nlu_trigger"
8
+ KEY_FILE_PATH = "file_path"
9
+ KEY_PERSISTED_SLOTS = "persisted_slots"
10
+ KEY_RUN_PATTERN_COMPLETED = "run_pattern_completed"
11
+ KEY_TRANSLATION = "translation"
@@ -4,40 +4,70 @@ import copy
4
4
  from dataclasses import dataclass, field
5
5
  from functools import cached_property
6
6
  from pathlib import Path
7
- from typing import Text, Optional, Dict, Any, List, Set, Union
7
+ from typing import Any, Dict, List, Optional, Set, Text, Union
8
8
 
9
9
  import structlog
10
+ from pydantic import BaseModel
10
11
  from pypred import Predicate
11
12
 
12
13
  import rasa.shared.utils.io
14
+ from rasa.engine.language import Language
13
15
  from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
14
- from rasa.shared.core.flows.flow_path import PathNode, FlowPath, FlowPathsList
16
+ from rasa.shared.core.constants import (
17
+ KEY_ASK_CONFIRM_DIGRESSIONS,
18
+ KEY_BLOCK_DIGRESSIONS,
19
+ )
20
+ from rasa.shared.core.flows.constants import (
21
+ KEY_ALWAYS_INCLUDE_IN_PROMPT,
22
+ KEY_DESCRIPTION,
23
+ KEY_FILE_PATH,
24
+ KEY_ID,
25
+ KEY_IF,
26
+ KEY_NAME,
27
+ KEY_NLU_TRIGGER,
28
+ KEY_PERSISTED_SLOTS,
29
+ KEY_RUN_PATTERN_COMPLETED,
30
+ KEY_STEPS,
31
+ KEY_TRANSLATION,
32
+ )
33
+ from rasa.shared.core.flows.flow_path import FlowPath, FlowPathsList, PathNode
15
34
  from rasa.shared.core.flows.flow_step import FlowStep
16
35
  from rasa.shared.core.flows.flow_step_links import (
36
+ ElseFlowStepLink,
17
37
  FlowStepLink,
18
- StaticFlowStepLink,
19
38
  IfFlowStepLink,
20
- ElseFlowStepLink,
39
+ StaticFlowStepLink,
21
40
  )
22
41
  from rasa.shared.core.flows.flow_step_sequence import FlowStepSequence
23
42
  from rasa.shared.core.flows.nlu_trigger import NLUTriggers
24
43
  from rasa.shared.core.flows.steps import (
44
+ ActionFlowStep,
25
45
  CollectInformationFlowStep,
26
46
  EndFlowStep,
27
47
  StartFlowStep,
28
- ActionFlowStep,
29
48
  )
30
49
  from rasa.shared.core.flows.steps.constants import (
31
50
  CONTINUE_STEP_PREFIX,
32
- START_STEP,
33
51
  END_STEP,
52
+ START_STEP,
34
53
  )
35
54
  from rasa.shared.core.flows.steps.continuation import ContinueFlowStep
55
+ from rasa.shared.core.flows.utils import extract_digression_prop
36
56
  from rasa.shared.core.slots import Slot
37
57
 
38
58
  structlogger = structlog.get_logger()
39
59
 
40
60
 
61
+ class FlowLanguageTranslation(BaseModel):
62
+ """Represents the translation of the flow properties in a specific language."""
63
+
64
+ name: str
65
+ """The human-readable name of the flow."""
66
+
67
+ class Config:
68
+ extra = "ignore"
69
+
70
+
41
71
  @dataclass
42
72
  class Flow:
43
73
  """Represents the configuration of a flow."""
@@ -48,6 +78,8 @@ class Flow:
48
78
  """The human-readable name of the flow."""
49
79
  description: Optional[Text] = None
50
80
  """The description of the flow."""
81
+ translation: Dict[Text, FlowLanguageTranslation] = field(default_factory=dict)
82
+ """The translation of the flow properties in different languages."""
51
83
  guard_condition: Optional[Text] = None
52
84
  """The condition that needs to be fulfilled for the flow to be startable."""
53
85
  step_sequence: FlowStepSequence = field(default_factory=FlowStepSequence.empty)
@@ -62,6 +94,12 @@ class Flow:
62
94
  """The path to the file where the flow is stored."""
63
95
  persisted_slots: List[str] = field(default_factory=list)
64
96
  """The list of slots that should be persisted after the flow ends."""
97
+ ask_confirm_digressions: List[str] = field(default_factory=list)
98
+ """The flow ids for which the assistant should ask for confirmation."""
99
+ block_digressions: List[str] = field(default_factory=list)
100
+ """The flow ids that the assistant should block from digressing to."""
101
+ run_pattern_completed: bool = True
102
+ """Whether the pattern_completed flow should be run after the flow ends."""
65
103
 
66
104
  @staticmethod
67
105
  def from_json(
@@ -79,6 +117,8 @@ class Flow:
79
117
  Returns:
80
118
  A Flow object.
81
119
  """
120
+ from rasa.shared.core.flows.utils import extract_translations
121
+
82
122
  step_sequence = FlowStepSequence.from_json(flow_id, data.get("steps"))
83
123
  nlu_triggers = NLUTriggers.from_json(data.get("nlu_trigger"))
84
124
 
@@ -87,17 +127,25 @@ class Flow:
87
127
 
88
128
  return Flow(
89
129
  id=flow_id,
90
- custom_name=data.get("name"),
91
- description=data.get("description"),
92
- always_include_in_prompt=data.get("always_include_in_prompt"),
93
- # str or bool are permitted in the flow schema but internally we want a str
94
- guard_condition=str(data["if"]) if "if" in data else None,
130
+ custom_name=data.get(KEY_NAME),
131
+ description=data.get(KEY_DESCRIPTION),
132
+ always_include_in_prompt=data.get(KEY_ALWAYS_INCLUDE_IN_PROMPT),
133
+ # str or bool are permitted in the flow schema, but internally we want a str
134
+ guard_condition=str(data[KEY_IF]) if KEY_IF in data else None,
95
135
  step_sequence=Flow.resolve_default_ids(step_sequence),
96
136
  nlu_triggers=nlu_triggers,
97
137
  # If we are reading the flows in after training the file_path is part of
98
138
  # data. When the model is trained, take the provided file_path.
99
- file_path=data.get("file_path") if "file_path" in data else file_path,
100
- persisted_slots=data.get("persisted_slots", []),
139
+ file_path=data.get(KEY_FILE_PATH) if KEY_FILE_PATH in data else file_path,
140
+ persisted_slots=data.get(KEY_PERSISTED_SLOTS, []),
141
+ ask_confirm_digressions=extract_digression_prop(
142
+ KEY_ASK_CONFIRM_DIGRESSIONS, data
143
+ ),
144
+ block_digressions=extract_digression_prop(KEY_BLOCK_DIGRESSIONS, data),
145
+ run_pattern_completed=data.get(KEY_RUN_PATTERN_COMPLETED, True),
146
+ translation=extract_translations(
147
+ translation_data=data.get(KEY_TRANSLATION, {})
148
+ ),
101
149
  )
102
150
 
103
151
  def get_full_name(self) -> str:
@@ -155,29 +203,62 @@ class Flow:
155
203
  The Flow object as serialized data.
156
204
  """
157
205
  data: Dict[Text, Any] = {
158
- "id": self.id,
159
- "steps": self.step_sequence.as_json(),
206
+ KEY_ID: self.id,
207
+ KEY_STEPS: self.step_sequence.as_json(),
160
208
  }
161
209
  if self.custom_name is not None:
162
- data["name"] = self.custom_name
210
+ data[KEY_NAME] = self.custom_name
163
211
  if self.description is not None:
164
- data["description"] = self.description
212
+ data[KEY_DESCRIPTION] = self.description
165
213
  if self.guard_condition is not None:
166
- data["if"] = self.guard_condition
214
+ data[KEY_IF] = self.guard_condition
167
215
  if self.always_include_in_prompt is not None:
168
- data["always_include_in_prompt"] = self.always_include_in_prompt
216
+ data[KEY_ALWAYS_INCLUDE_IN_PROMPT] = self.always_include_in_prompt
169
217
  if self.nlu_triggers:
170
- data["nlu_trigger"] = self.nlu_triggers.as_json()
218
+ data[KEY_NLU_TRIGGER] = self.nlu_triggers.as_json()
171
219
  if self.file_path:
172
- data["file_path"] = self.file_path
220
+ data[KEY_FILE_PATH] = self.file_path
173
221
  if self.persisted_slots:
174
- data["persisted_slots"] = self.persisted_slots
222
+ data[KEY_PERSISTED_SLOTS] = self.persisted_slots
223
+ if self.ask_confirm_digressions:
224
+ data[KEY_ASK_CONFIRM_DIGRESSIONS] = self.ask_confirm_digressions
225
+ if self.block_digressions:
226
+ data[KEY_BLOCK_DIGRESSIONS] = self.block_digressions
227
+ if self.run_pattern_completed is not None:
228
+ data["run_pattern_completed"] = self.run_pattern_completed
229
+ if self.translation:
230
+ data[KEY_TRANSLATION] = {
231
+ language_code: translation.dict()
232
+ for language_code, translation in self.translation.items()
233
+ }
175
234
 
176
235
  return data
177
236
 
178
- def readable_name(self) -> str:
179
- """Returns the name of the flow or its id if no name is set."""
180
- return self.name or self.id
237
+ def localized_name(self, language: Optional[Language] = None) -> Optional[Text]:
238
+ """Returns the language specific flow name or None.
239
+
240
+ Args:
241
+ language: Preferred language code.
242
+
243
+ Returns:
244
+ Flow name in the specified language or None.
245
+ """
246
+ language_code = language.code if language else None
247
+ translation = self.translation.get(language_code)
248
+ return translation.name if translation else None
249
+
250
+ def readable_name(self, language: Optional[Language] = None) -> str:
251
+ """
252
+ Returns the flow's name in the specified language if available; otherwise
253
+ falls back to the flow's name, and finally the flow's ID.
254
+
255
+ Args:
256
+ language: Preferred language code.
257
+
258
+ Returns:
259
+ string: the localized name, the default name, or the flow's ID.
260
+ """
261
+ return self.localized_name(language) or self.name or self.id
181
262
 
182
263
  def step_by_id(self, step_id: Optional[Text]) -> Optional[FlowStep]:
183
264
  """Returns the step with the given id."""
@@ -371,7 +452,7 @@ class Flow:
371
452
  True if dynamic literals are present, False otherwise.
372
453
  """
373
454
  from pypred import ast
374
- from pypred.tiler import tile, SimplePattern
455
+ from pypred.tiler import SimplePattern, tile
375
456
 
376
457
  if not self.guard_condition:
377
458
  return False
@@ -1,8 +1,8 @@
1
1
  from __future__ import annotations
2
- from typing import TYPE_CHECKING
3
2
 
4
3
  from dataclasses import dataclass
5
4
  from typing import (
5
+ TYPE_CHECKING,
6
6
  Any,
7
7
  Dict,
8
8
  Generator,
@@ -10,6 +10,7 @@ from typing import (
10
10
  Set,
11
11
  Text,
12
12
  )
13
+
13
14
  import structlog
14
15
 
15
16
  from rasa.shared.exceptions import RasaException
@@ -32,11 +33,11 @@ def step_from_json(flow_id: Text, data: Dict[Text, Any]) -> FlowStep:
32
33
  """
33
34
  from rasa.shared.core.flows.steps import (
34
35
  ActionFlowStep,
36
+ CallFlowStep,
35
37
  CollectInformationFlowStep,
36
38
  LinkFlowStep,
37
- SetSlotsFlowStep,
38
39
  NoOperationFlowStep,
39
- CallFlowStep,
40
+ SetSlotsFlowStep,
40
41
  )
41
42
 
42
43
  if "action" in data:
@@ -1,8 +1,7 @@
1
1
  from __future__ import annotations
2
- from typing import TYPE_CHECKING
3
2
 
4
3
  from dataclasses import dataclass
5
- from typing import List, Union, Dict, Text, Any, Optional, Generator
4
+ from typing import TYPE_CHECKING, Any, Dict, Generator, List, Optional, Text, Union
6
5
 
7
6
  from rasa.shared.core.flows.flow_step import FlowStep
8
7