rasa-pro 3.14.0.dev5__py3-none-any.whl → 3.14.0.dev7__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 (477) hide show
  1. rasa/agents/agent_factory.py +122 -0
  2. rasa/agents/agent_manager.py +163 -0
  3. rasa/agents/constants.py +40 -0
  4. rasa/agents/core/agent_protocol.py +107 -0
  5. rasa/agents/core/types.py +70 -0
  6. rasa/agents/exceptions.py +38 -0
  7. rasa/agents/protocol/__init__.py +5 -0
  8. rasa/agents/protocol/a2a/a2a_agent.py +662 -0
  9. rasa/agents/protocol/mcp/mcp_base_agent.py +685 -0
  10. rasa/agents/protocol/mcp/mcp_open_agent.py +290 -0
  11. rasa/agents/protocol/mcp/mcp_task_agent.py +484 -0
  12. rasa/agents/schemas/__init__.py +12 -0
  13. rasa/agents/schemas/agent_input.py +38 -0
  14. rasa/agents/schemas/agent_output.py +26 -0
  15. rasa/agents/schemas/agent_tool_result.py +67 -0
  16. rasa/agents/schemas/agent_tool_schema.py +134 -0
  17. rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +15 -0
  18. rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +17 -0
  19. rasa/agents/utils.py +77 -0
  20. rasa/agents/validation.py +484 -0
  21. rasa/api.py +14 -6
  22. rasa/cli/arguments/default_arguments.py +12 -0
  23. rasa/cli/arguments/run.py +2 -0
  24. rasa/cli/arguments/train.py +2 -0
  25. rasa/cli/dialogue_understanding_test.py +4 -0
  26. rasa/cli/e2e_test.py +4 -0
  27. rasa/cli/inspect.py +3 -0
  28. rasa/cli/interactive.py +2 -0
  29. rasa/cli/llm_fine_tuning.py +5 -0
  30. rasa/cli/project_templates/tutorial/config.yml +1 -2
  31. rasa/cli/run.py +4 -0
  32. rasa/cli/scaffold.py +2 -46
  33. rasa/cli/shell.py +3 -0
  34. rasa/cli/train.py +2 -0
  35. rasa/cli/utils.py +85 -1
  36. rasa/constants.py +6 -0
  37. rasa/core/actions/action.py +52 -10
  38. rasa/core/agent.py +19 -1
  39. rasa/core/available_agents.py +220 -0
  40. rasa/core/available_endpoints.py +30 -0
  41. rasa/core/channels/channel.py +3 -4
  42. rasa/core/channels/development_inspector.py +4 -4
  43. rasa/core/channels/hangouts.py +2 -2
  44. rasa/core/channels/inspector/dist/assets/{arc-18042c22.js → arc-cce7e0a8.js} +1 -1
  45. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-fdd6bcfa.js → blockDiagram-38ab4fdb-e2a49be7.js} +1 -1
  46. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-f5ae6786.js → c4Diagram-3d4e48cf-3def7895.js} +1 -1
  47. rasa/core/channels/inspector/dist/assets/channel-858c2c20.js +1 -0
  48. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-81efba3e.js → classDiagram-70f12bd4-e66fe4df.js} +1 -1
  49. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-3b6b6a92.js → classDiagram-v2-f2320105-eb874aaa.js} +1 -1
  50. rasa/core/channels/inspector/dist/assets/clone-4b80996c.js +1 -0
  51. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-31422447.js → createText-2e5e7dd3-cf934643.js} +1 -1
  52. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-518a90db.js → edges-e0da2a9e-8fdf9155.js} +1 -1
  53. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-a6d3c25a.js → erDiagram-9861fffd-6106fb96.js} +1 -1
  54. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-e048c2be.js → flowDb-956e92f1-4c2bb040.js} +1 -1
  55. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-c7474c91.js → flowDiagram-66a62f08-f0ff96af.js} +1 -1
  56. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-16f09b7a.js +1 -0
  57. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-cb4d8723.js → flowchart-elk-definition-4a651766-a21707ec.js} +1 -1
  58. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-346636a2.js → ganttDiagram-c361ad54-c165acb1.js} +1 -1
  59. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-7c508874.js → gitGraphDiagram-72cf32ee-b0564cf1.js} +1 -1
  60. rasa/core/channels/inspector/dist/assets/{graph-14702d8a.js → graph-e557e67a.js} +1 -1
  61. rasa/core/channels/inspector/dist/assets/{index-3862675e-f18b534b.js → index-3862675e-1ce60e9e.js} +1 -1
  62. rasa/core/channels/inspector/dist/assets/index-996fe816.js +1353 -0
  63. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-64154b83.js → infoDiagram-f8f76790-893569e2.js} +1 -1
  64. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-833a5f95.js → journeyDiagram-49397b02-c29c864f.js} +1 -1
  65. rasa/core/channels/inspector/dist/assets/{layout-5a3b2123.js → layout-649a5eae.js} +1 -1
  66. rasa/core/channels/inspector/dist/assets/{line-2272a8c7.js → line-0e5685ed.js} +1 -1
  67. rasa/core/channels/inspector/dist/assets/{linear-35bcf273.js → linear-eaa320bd.js} +1 -1
  68. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-92dcb0e9.js → mindmap-definition-fc14e90a-f35df9e6.js} +1 -1
  69. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-94dbc900.js → pieDiagram-8a3498a8-78339e96.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-8b7a9c33.js → quadrantDiagram-120e2f19-9b5f2f14.js} +1 -1
  71. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6f7eab81.js → requirementDiagram-deff3bca-d05ddb3a.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-f43e581d.js → sankeyDiagram-04a897e0-d9be5dfd.js} +1 -1
  73. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-0bcbefc3.js → sequenceDiagram-704730f1-0f1c4348.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-b8a74083.js → stateDiagram-587899a1-9ddf63b3.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-2070218f.js → stateDiagram-v2-d93cdb3a-bc2b81ed.js} +1 -1
  76. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-f1d54e34.js → styles-6aaf32cf-0a287936.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-980de489.js → styles-9a916d00-e3941990.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-3c03abde.js → styles-c10674c1-ce4eca24.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-46ba068f.js → svgDrawCommon-08f97a94-d822b1a8.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-901f5e3d.js → timeline-definition-85554ec2-e144c7a7.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-acbc628a.js → xychartDiagram-e933f94c-ab7f4e14.js} +1 -1
  82. rasa/core/channels/inspector/dist/index.html +2 -2
  83. rasa/core/channels/inspector/index.html +1 -1
  84. rasa/core/channels/inspector/src/App.tsx +37 -12
  85. rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
  86. rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +3 -2
  87. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +3 -12
  88. rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
  89. rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
  90. rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
  91. rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
  92. rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
  93. rasa/core/channels/inspector/src/types.ts +21 -0
  94. rasa/core/channels/socketio.py +51 -212
  95. rasa/core/channels/studio_chat.py +29 -49
  96. rasa/core/channels/voice_stream/genesys.py +1 -1
  97. rasa/core/channels/voice_stream/voice_channel.py +3 -5
  98. rasa/core/constants.py +4 -0
  99. rasa/core/policies/enterprise_search_policy.py +11 -6
  100. rasa/core/policies/flow_policy.py +4 -4
  101. rasa/core/policies/flows/flow_executor.py +519 -73
  102. rasa/core/policies/flows/mcp_tool_executor.py +277 -0
  103. rasa/core/policies/intentless_policy.py +1 -1
  104. rasa/core/policies/unexpected_intent_policy.py +1 -0
  105. rasa/core/processor.py +18 -15
  106. rasa/core/run.py +11 -14
  107. rasa/core/tracker_stores/tracker_store.py +3 -7
  108. rasa/core/train.py +1 -1
  109. rasa/core/training/interactive.py +16 -16
  110. rasa/core/training/story_conflict.py +5 -5
  111. rasa/core/utils.py +21 -1
  112. rasa/dialogue_understanding/commands/__init__.py +8 -0
  113. rasa/dialogue_understanding/commands/cancel_flow_command.py +19 -5
  114. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +11 -0
  115. rasa/dialogue_understanding/commands/clarify_command.py +10 -0
  116. rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
  117. rasa/dialogue_understanding/commands/knowledge_answer_command.py +11 -0
  118. rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
  119. rasa/dialogue_understanding/commands/start_flow_command.py +68 -7
  120. rasa/dialogue_understanding/commands/utils.py +124 -2
  121. rasa/dialogue_understanding/generator/command_parser.py +4 -0
  122. rasa/dialogue_understanding/generator/flow_retrieval.py +9 -10
  123. rasa/dialogue_understanding/generator/llm_based_command_generator.py +50 -12
  124. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  125. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  126. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +61 -0
  127. rasa/{cli/project_templates/telco/prompts/command-generator.jinja2 → dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2} +7 -3
  128. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +81 -0
  129. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +81 -0
  130. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +7 -6
  131. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +7 -6
  132. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +41 -2
  133. rasa/dialogue_understanding/patterns/clarify.py +3 -14
  134. rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
  135. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +46 -8
  136. rasa/dialogue_understanding/processor/command_processor.py +31 -15
  137. rasa/dialogue_understanding/stack/dialogue_stack.py +123 -2
  138. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
  139. rasa/dialogue_understanding/stack/utils.py +57 -3
  140. rasa/dialogue_understanding/utils.py +24 -4
  141. rasa/dialogue_understanding_test/du_test_runner.py +7 -2
  142. rasa/e2e_test/e2e_test_runner.py +12 -2
  143. rasa/engine/caching.py +2 -2
  144. rasa/engine/recipes/default_components.py +10 -18
  145. rasa/engine/storage/local_model_storage.py +2 -45
  146. rasa/graph_components/validators/default_recipe_validator.py +134 -134
  147. rasa/hooks.py +5 -5
  148. rasa/llm_fine_tuning/utils.py +2 -2
  149. rasa/model_manager/model_api.py +5 -4
  150. rasa/model_manager/runner_service.py +1 -1
  151. rasa/model_manager/socket_bridge.py +14 -20
  152. rasa/model_manager/trainer_service.py +9 -12
  153. rasa/model_manager/utils.py +29 -1
  154. rasa/model_manager/warm_rasa_process.py +1 -1
  155. rasa/model_training.py +8 -6
  156. rasa/nlu/extractors/extractor.py +2 -1
  157. rasa/plugin.py +8 -8
  158. rasa/privacy/privacy_manager.py +11 -2
  159. rasa/server.py +14 -2
  160. rasa/shared/agents/utils.py +35 -0
  161. rasa/shared/constants.py +8 -0
  162. rasa/shared/core/constants.py +11 -1
  163. rasa/shared/core/domain.py +11 -58
  164. rasa/shared/core/events.py +327 -0
  165. rasa/shared/core/flows/flow_step.py +1 -7
  166. rasa/shared/core/flows/flows_list.py +15 -5
  167. rasa/shared/core/flows/flows_yaml_schema.json +112 -186
  168. rasa/shared/core/flows/steps/call.py +53 -5
  169. rasa/shared/core/flows/validation.py +177 -7
  170. rasa/shared/core/flows/yaml_flows_io.py +9 -17
  171. rasa/shared/core/slots.py +2 -6
  172. rasa/shared/core/trackers.py +5 -2
  173. rasa/shared/exceptions.py +4 -0
  174. rasa/shared/importers/importer.py +0 -6
  175. rasa/shared/importers/rasa.py +1 -1
  176. rasa/shared/importers/utils.py +10 -80
  177. rasa/shared/providers/_utils.py +44 -60
  178. rasa/shared/providers/embedding/default_litellm_embedding_client.py +0 -2
  179. rasa/shared/providers/llm/_base_litellm_client.py +39 -7
  180. rasa/shared/providers/llm/default_litellm_llm_client.py +0 -2
  181. rasa/shared/providers/llm/litellm_router_llm_client.py +8 -4
  182. rasa/shared/providers/llm/llm_client.py +7 -3
  183. rasa/shared/providers/llm/llm_response.py +66 -0
  184. rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
  185. rasa/shared/utils/health_check/health_check.py +7 -3
  186. rasa/shared/utils/llm.py +28 -5
  187. rasa/shared/utils/mcp/server_connection.py +186 -0
  188. rasa/shared/utils/schemas/events.py +42 -0
  189. rasa/shared/utils/yaml.py +3 -1
  190. rasa/studio/upload.py +47 -16
  191. rasa/telemetry.py +23 -97
  192. rasa/tracing/instrumentation/instrumentation.py +14 -10
  193. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
  194. rasa/utils/common.py +79 -0
  195. rasa/utils/io.py +9 -27
  196. rasa/utils/json_utils.py +1 -6
  197. rasa/utils/log_utils.py +2 -6
  198. rasa/utils/ml_utils.py +1 -1
  199. rasa/utils/tensorflow/rasa_layers.py +1 -1
  200. rasa/utils/train_utils.py +15 -15
  201. rasa/validator.py +19 -21
  202. rasa/version.py +1 -1
  203. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/METADATA +14 -17
  204. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/RECORD +214 -442
  205. rasa/builder/README.md +0 -120
  206. rasa/builder/auth.py +0 -176
  207. rasa/builder/config.py +0 -115
  208. rasa/builder/copilot/constants.py +0 -25
  209. rasa/builder/copilot/copilot.py +0 -372
  210. rasa/builder/copilot/copilot_response_handler.py +0 -487
  211. rasa/builder/copilot/copilot_templated_message_provider.py +0 -58
  212. rasa/builder/copilot/exceptions.py +0 -20
  213. rasa/builder/copilot/models.py +0 -431
  214. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +0 -726
  215. rasa/builder/copilot/telemetry.py +0 -195
  216. rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +0 -16
  217. rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +0 -26
  218. rasa/builder/document_retrieval/constants.py +0 -15
  219. rasa/builder/document_retrieval/inkeep-rag-response-schema.json +0 -64
  220. rasa/builder/document_retrieval/inkeep_document_retrieval.py +0 -238
  221. rasa/builder/document_retrieval/models.py +0 -62
  222. rasa/builder/download.py +0 -140
  223. rasa/builder/exceptions.py +0 -55
  224. rasa/builder/guardrails/__init__.py +0 -1
  225. rasa/builder/guardrails/constants.py +0 -3
  226. rasa/builder/guardrails/exceptions.py +0 -4
  227. rasa/builder/guardrails/lakera.py +0 -206
  228. rasa/builder/guardrails/models.py +0 -199
  229. rasa/builder/guardrails/utils.py +0 -305
  230. rasa/builder/job_manager.py +0 -87
  231. rasa/builder/jobs.py +0 -234
  232. rasa/builder/llm_service.py +0 -246
  233. rasa/builder/logging_utils.py +0 -209
  234. rasa/builder/main.py +0 -174
  235. rasa/builder/models.py +0 -197
  236. rasa/builder/project_generator.py +0 -450
  237. rasa/builder/project_info.py +0 -72
  238. rasa/builder/scrape_rasa_docs.py +0 -97
  239. rasa/builder/service.py +0 -1142
  240. rasa/builder/shared/tracker_context.py +0 -212
  241. rasa/builder/skill_to_bot_prompt.jinja2 +0 -164
  242. rasa/builder/training_service.py +0 -132
  243. rasa/builder/validation_service.py +0 -93
  244. rasa/cli/project_templates/basic/actions/action_api.py +0 -15
  245. rasa/cli/project_templates/basic/actions/action_human_handoff.py +0 -44
  246. rasa/cli/project_templates/basic/config.yml +0 -23
  247. rasa/cli/project_templates/basic/credentials.yml +0 -34
  248. rasa/cli/project_templates/basic/data/general/feedback.yml +0 -20
  249. rasa/cli/project_templates/basic/data/general/goodbye.yml +0 -6
  250. rasa/cli/project_templates/basic/data/general/hello.yml +0 -7
  251. rasa/cli/project_templates/basic/data/general/help.yml +0 -6
  252. rasa/cli/project_templates/basic/data/general/human_handoff.yml +0 -16
  253. rasa/cli/project_templates/basic/data/general/welcome.yml +0 -9
  254. rasa/cli/project_templates/basic/data/system/pattern_completed.yml +0 -7
  255. rasa/cli/project_templates/basic/data/system/pattern_correction.yml +0 -7
  256. rasa/cli/project_templates/basic/data/system/pattern_search.yml +0 -8
  257. rasa/cli/project_templates/basic/data/system/pattern_session_start.yml +0 -8
  258. rasa/cli/project_templates/basic/docs/rasa_assistant_qa.txt +0 -65
  259. rasa/cli/project_templates/basic/docs/template.txt +0 -7
  260. rasa/cli/project_templates/basic/domain/general/assistant_details.yml +0 -12
  261. rasa/cli/project_templates/basic/domain/general/bot_identity.yml +0 -5
  262. rasa/cli/project_templates/basic/domain/general/cannot_handle.yml +0 -5
  263. rasa/cli/project_templates/basic/domain/general/feedback.yml +0 -28
  264. rasa/cli/project_templates/basic/domain/general/goodbye.yml +0 -7
  265. rasa/cli/project_templates/basic/domain/general/help.yml +0 -5
  266. rasa/cli/project_templates/basic/domain/general/human_handoff_domain.yml +0 -35
  267. rasa/cli/project_templates/basic/domain/general/utils.yml +0 -13
  268. rasa/cli/project_templates/basic/domain/general/welcome.yml +0 -7
  269. rasa/cli/project_templates/basic/endpoints.yml +0 -73
  270. rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +0 -19
  271. rasa/cli/project_templates/finance/actions/__init__.py +0 -46
  272. rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +0 -47
  273. rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +0 -40
  274. rasa/cli/project_templates/finance/actions/action_session_start.py +0 -74
  275. rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +0 -48
  276. rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +0 -36
  277. rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +0 -54
  278. rasa/cli/project_templates/finance/actions/database.py +0 -277
  279. rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
  280. rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +0 -52
  281. rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +0 -51
  282. rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +0 -40
  283. rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +0 -40
  284. rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +0 -46
  285. rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +0 -18
  286. rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +0 -49
  287. rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +0 -19
  288. rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +0 -36
  289. rasa/cli/project_templates/finance/config.yml +0 -21
  290. rasa/cli/project_templates/finance/credentials.yml +0 -32
  291. rasa/cli/project_templates/finance/csvs/accounts.csv +0 -8
  292. rasa/cli/project_templates/finance/csvs/advisors.csv +0 -7
  293. rasa/cli/project_templates/finance/csvs/appointments.csv +0 -211
  294. rasa/cli/project_templates/finance/csvs/branches.csv +0 -10
  295. rasa/cli/project_templates/finance/csvs/cards.csv +0 -11
  296. rasa/cli/project_templates/finance/csvs/payees.csv +0 -11
  297. rasa/cli/project_templates/finance/csvs/transactions.csv +0 -71
  298. rasa/cli/project_templates/finance/csvs/users.csv +0 -4
  299. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +0 -10
  300. rasa/cli/project_templates/finance/data/cards/block_card.yml +0 -66
  301. rasa/cli/project_templates/finance/data/cards/select_card.yml +0 -12
  302. rasa/cli/project_templates/finance/data/general/bot_identity.yml +0 -6
  303. rasa/cli/project_templates/finance/data/general/feedback.yml +0 -20
  304. rasa/cli/project_templates/finance/data/general/goodbye.yml +0 -6
  305. rasa/cli/project_templates/finance/data/general/hello.yml +0 -7
  306. rasa/cli/project_templates/finance/data/general/help.yml +0 -9
  307. rasa/cli/project_templates/finance/data/general/human_handoff.yml +0 -16
  308. rasa/cli/project_templates/finance/data/general/welcome.yml +0 -9
  309. rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +0 -5
  310. rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +0 -7
  311. rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +0 -7
  312. rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +0 -8
  313. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +0 -8
  314. rasa/cli/project_templates/finance/data/system/source/accounts.json +0 -51
  315. rasa/cli/project_templates/finance/data/system/source/advisors.json +0 -44
  316. rasa/cli/project_templates/finance/data/system/source/appointments.json +0 -1474
  317. rasa/cli/project_templates/finance/data/system/source/branches.json +0 -47
  318. rasa/cli/project_templates/finance/data/system/source/cards.json +0 -72
  319. rasa/cli/project_templates/finance/data/system/source/payees.json +0 -74
  320. rasa/cli/project_templates/finance/data/system/source/transactions.json +0 -492
  321. rasa/cli/project_templates/finance/data/system/source/users.json +0 -29
  322. rasa/cli/project_templates/finance/data/transfers/add_payee.yml +0 -29
  323. rasa/cli/project_templates/finance/data/transfers/list_payees.yml +0 -5
  324. rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +0 -21
  325. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +0 -67
  326. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +0 -8
  327. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +0 -8
  328. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +0 -8
  329. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +0 -8
  330. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +0 -8
  331. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +0 -7
  332. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +0 -8
  333. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +0 -8
  334. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +0 -8
  335. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +0 -8
  336. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +0 -8
  337. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +0 -8
  338. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +0 -8
  339. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +0 -8
  340. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +0 -8
  341. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +0 -8
  342. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +0 -8
  343. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +0 -8
  344. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +0 -8
  345. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +0 -8
  346. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +0 -50
  347. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +0 -50
  348. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +0 -48
  349. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +0 -50
  350. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +0 -50
  351. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +0 -47
  352. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +0 -50
  353. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +0 -50
  354. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +0 -47
  355. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +0 -50
  356. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +0 -50
  357. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +0 -50
  358. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +0 -47
  359. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +0 -50
  360. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +0 -50
  361. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +0 -47
  362. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +0 -50
  363. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +0 -50
  364. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +0 -47
  365. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +0 -50
  366. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +0 -50
  367. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +0 -47
  368. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +0 -47
  369. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +0 -50
  370. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +0 -50
  371. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +0 -47
  372. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +0 -50
  373. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +0 -50
  374. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +0 -47
  375. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +0 -50
  376. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +0 -50
  377. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +0 -47
  378. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +0 -50
  379. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +0 -50
  380. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +0 -50
  381. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +0 -47
  382. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +0 -50
  383. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +0 -50
  384. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +0 -47
  385. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +0 -50
  386. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +0 -50
  387. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +0 -47
  388. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +0 -50
  389. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +0 -50
  390. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +0 -50
  391. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +0 -47
  392. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +0 -50
  393. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +0 -50
  394. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +0 -47
  395. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +0 -50
  396. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +0 -50
  397. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +0 -47
  398. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +0 -50
  399. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +0 -50
  400. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +0 -47
  401. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +0 -47
  402. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +0 -50
  403. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +0 -50
  404. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +0 -50
  405. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +0 -50
  406. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +0 -47
  407. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +0 -11
  408. rasa/cli/project_templates/finance/domain/cards/block_card.yml +0 -101
  409. rasa/cli/project_templates/finance/domain/cards/select_card.yml +0 -12
  410. rasa/cli/project_templates/finance/domain/general/assistant_details.yml +0 -12
  411. rasa/cli/project_templates/finance/domain/general/bot_identity.yml +0 -5
  412. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +0 -5
  413. rasa/cli/project_templates/finance/domain/general/defaults.yml +0 -24
  414. rasa/cli/project_templates/finance/domain/general/feedback.yml +0 -28
  415. rasa/cli/project_templates/finance/domain/general/goodbye.yml +0 -7
  416. rasa/cli/project_templates/finance/domain/general/help.yml +0 -5
  417. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +0 -30
  418. rasa/cli/project_templates/finance/domain/general/utils.yml +0 -13
  419. rasa/cli/project_templates/finance/domain/general/welcome.yml +0 -8
  420. rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +0 -47
  421. rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +0 -4
  422. rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +0 -16
  423. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +0 -79
  424. rasa/cli/project_templates/finance/endpoints.yml +0 -63
  425. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +0 -19
  426. rasa/cli/project_templates/telco/actions/__init__.py +0 -0
  427. rasa/cli/project_templates/telco/actions/actions_billing.py +0 -204
  428. rasa/cli/project_templates/telco/actions/actions_get_data_from_db.py +0 -48
  429. rasa/cli/project_templates/telco/actions/actions_run_diagnostics.py +0 -28
  430. rasa/cli/project_templates/telco/actions/actions_session_start.py +0 -18
  431. rasa/cli/project_templates/telco/config.yml +0 -25
  432. rasa/cli/project_templates/telco/credentials.yml +0 -33
  433. rasa/cli/project_templates/telco/csvs/billing.csv +0 -10
  434. rasa/cli/project_templates/telco/csvs/customers.csv +0 -5
  435. rasa/cli/project_templates/telco/data/flows/flow_global.yml +0 -5
  436. rasa/cli/project_templates/telco/data/flows/flow_reboot_router.yml +0 -8
  437. rasa/cli/project_templates/telco/data/flows/flow_reset_router.yml +0 -7
  438. rasa/cli/project_templates/telco/data/flows/flow_solve_internet_issue.yml +0 -73
  439. rasa/cli/project_templates/telco/data/flows/flow_undertand_bill.yml +0 -45
  440. rasa/cli/project_templates/telco/data/patterns/pattern_completed.yml +0 -7
  441. rasa/cli/project_templates/telco/data/patterns/pattern_human_handoff.yml +0 -6
  442. rasa/cli/project_templates/telco/data/patterns/pattern_search.yml +0 -7
  443. rasa/cli/project_templates/telco/data/patterns/pattern_session_start.yml +0 -9
  444. rasa/cli/project_templates/telco/docs/reset_vs_rboot_router.txt +0 -1
  445. rasa/cli/project_templates/telco/docs/restart_router.txt +0 -6
  446. rasa/cli/project_templates/telco/docs/run_speed_test.txt +0 -6
  447. rasa/cli/project_templates/telco/domain/domain_global.yml +0 -29
  448. rasa/cli/project_templates/telco/domain/domain_patterns.yml +0 -17
  449. rasa/cli/project_templates/telco/domain/domain_reboot_router.yml +0 -20
  450. rasa/cli/project_templates/telco/domain/domain_reset_router.yml +0 -11
  451. rasa/cli/project_templates/telco/domain/domain_run_speed_test.yml +0 -24
  452. rasa/cli/project_templates/telco/domain/domain_solve_internet_issue.yml +0 -74
  453. rasa/cli/project_templates/telco/domain/domain_undertand_bill.yml +0 -102
  454. rasa/cli/project_templates/telco/endpoints.yml +0 -60
  455. rasa/cli/project_templates/telco/tests/e2e_results_failed.yml +0 -62
  456. rasa/cli/project_templates/telco/tests/e2e_results_passed.yml +0 -130
  457. rasa/cli/project_templates/telco/tests/e2e_test_cases/billing_test_cases.yml +0 -68
  458. rasa/cli/project_templates/telco/tests/e2e_test_cases/global_test_cases.yml +0 -13
  459. rasa/cli/project_templates/telco/tests/e2e_test_cases/internet_slow_test_case.yml +0 -47
  460. rasa/cli/project_templates/telco/tests/e2e_test_cases/out_of_scope_test_case.yml +0 -21
  461. rasa/cli/project_templates/telco/tests/e2e_test_cases/patterns_test_cases.yml +0 -15
  462. rasa/core/channels/constants.py +0 -3
  463. rasa/core/channels/inspector/dist/assets/channel-b9b536fc.js +0 -1
  464. rasa/core/channels/inspector/dist/assets/clone-78d2ddcf.js +0 -1
  465. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-8b09c060.js +0 -1
  466. rasa/core/channels/inspector/dist/assets/index-4d4bdf3a.js +0 -1335
  467. rasa/utils/openapi.py +0 -144
  468. /rasa/{builder → agents}/__init__.py +0 -0
  469. /rasa/{builder/copilot → agents/core}/__init__.py +0 -0
  470. /rasa/{builder/copilot/prompts → agents/protocol/a2a}/__init__.py +0 -0
  471. /rasa/{builder/copilot/templated_messages → agents/protocol/mcp}/__init__.py +0 -0
  472. /rasa/{builder/document_retrieval → agents/templates}/__init__.py +0 -0
  473. /rasa/{cli/project_templates/finance/actions/accounts → shared/agents}/__init__.py +0 -0
  474. /rasa/{cli/project_templates/finance/actions/cards → shared/utils/mcp}/__init__.py +0 -0
  475. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/NOTICE +0 -0
  476. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/WHEEL +0 -0
  477. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/entry_points.txt +0 -0
@@ -1,14 +1,47 @@
1
1
  from __future__ import annotations
2
2
 
3
- from dataclasses import dataclass
4
- from typing import Any, Dict
3
+ from dataclasses import dataclass, field
4
+ from typing import Any, Dict, List, Optional, Text, Tuple
5
5
 
6
+ import structlog
7
+
8
+ from rasa.core.actions.action import Action
9
+ from rasa.core.channels import OutputChannel
10
+ from rasa.core.nlg import NaturalLanguageGenerator
11
+ from rasa.dialogue_understanding.commands.utils import (
12
+ resume_flow,
13
+ )
14
+ from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
15
+ from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
6
16
  from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
17
+ from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
18
+ DialogueStackFrame,
19
+ )
20
+ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
21
+ AgentStackFrame,
22
+ FlowStackFrameType,
23
+ UserFlowStackFrame,
24
+ )
25
+ from rasa.dialogue_understanding.stack.utils import (
26
+ get_active_continue_interrupted_pattern_frame,
27
+ )
7
28
  from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
29
+ from rasa.shared.core.constants import (
30
+ ACTION_CANCEL_INTERRUPTED_FLOWS,
31
+ ACTION_CONTINUE_INTERRUPTED_FLOW,
32
+ )
33
+ from rasa.shared.core.domain import Domain
34
+ from rasa.shared.core.events import AgentCancelled, Event, FlowCancelled, SlotSet
35
+ from rasa.shared.core.trackers import DialogueStateTracker
8
36
 
9
37
  FLOW_PATTERN_CONTINUE_INTERRUPTED = (
10
38
  RASA_DEFAULT_FLOW_PATTERN_PREFIX + "continue_interrupted"
11
39
  )
40
+ INTERRUPTED_FLOW_TO_CONTINUE_SLOT = "interrupted_flow_to_continue"
41
+ CONTINUE_INTERRUPTED_FLOW_CONFIRMATION_SLOT = "continue_interrupted_flow_confirmation"
42
+
43
+
44
+ structlogger = structlog.get_logger()
12
45
 
13
46
 
14
47
  @dataclass
@@ -17,8 +50,14 @@ class ContinueInterruptedPatternFlowStackFrame(PatternFlowStackFrame):
17
50
 
18
51
  flow_id: str = FLOW_PATTERN_CONTINUE_INTERRUPTED
19
52
  """The ID of the flow."""
20
- previous_flow_name: str = ""
21
- """The name of the flow that was interrupted."""
53
+ interrupted_flow_names: List[str] = field(default_factory=list)
54
+ """The names of the previous flows that were interrupted."""
55
+ interrupted_flow_ids: List[str] = field(default_factory=list)
56
+ """The ids of the previous flows that were interrupted."""
57
+ interrupted_flow_options: str = ""
58
+ """The options that the user can choose from as a string."""
59
+ multiple_flows_interrupted: bool = False
60
+ """Whether the user has interrupted multiple flows."""
22
61
 
23
62
  @classmethod
24
63
  def type(cls) -> str:
@@ -38,7 +77,10 @@ class ContinueInterruptedPatternFlowStackFrame(PatternFlowStackFrame):
38
77
  return ContinueInterruptedPatternFlowStackFrame(
39
78
  frame_id=data["frame_id"],
40
79
  step_id=data["step_id"],
41
- previous_flow_name=data["previous_flow_name"],
80
+ interrupted_flow_names=data["interrupted_flow_names"],
81
+ interrupted_flow_ids=data["interrupted_flow_ids"],
82
+ interrupted_flow_options=data["interrupted_flow_options"],
83
+ multiple_flows_interrupted=len(data["interrupted_flow_names"]) > 1,
42
84
  )
43
85
 
44
86
  def __eq__(self, other: Any) -> bool:
@@ -47,5 +89,196 @@ class ContinueInterruptedPatternFlowStackFrame(PatternFlowStackFrame):
47
89
  return (
48
90
  self.flow_id == other.flow_id
49
91
  and self.step_id == other.step_id
50
- and self.previous_flow_name == other.previous_flow_name
92
+ and self.interrupted_flow_names == other.interrupted_flow_names
93
+ and self.interrupted_flow_ids == other.interrupted_flow_ids
94
+ and self.interrupted_flow_options == other.interrupted_flow_options
51
95
  )
96
+
97
+
98
+ class ActionContinueInterruptedFlow(Action):
99
+ def name(self) -> str:
100
+ return ACTION_CONTINUE_INTERRUPTED_FLOW
101
+
102
+ async def run(
103
+ self,
104
+ output_channel: OutputChannel,
105
+ nlg: NaturalLanguageGenerator,
106
+ tracker: DialogueStateTracker,
107
+ domain: Domain,
108
+ metadata: Optional[Dict[Text, Any]] = None,
109
+ ) -> List[Event]:
110
+ # get the pattern frame from the stack
111
+ pattern_frame = get_active_continue_interrupted_pattern_frame(tracker.stack)
112
+
113
+ if pattern_frame is None:
114
+ structlogger.warning(
115
+ "action.continue_interrupted_flows.no_continue_interrupted_frame"
116
+ )
117
+ return []
118
+
119
+ interrupted_flow_ids = pattern_frame.interrupted_flow_ids
120
+ interrupted_flow_names = pattern_frame.interrupted_flow_names
121
+ multiple_flows_interrupted = pattern_frame.multiple_flows_interrupted
122
+
123
+ flow_to_continue = None
124
+ if not multiple_flows_interrupted:
125
+ # the user confirmed that they want to continue the flow
126
+ # as only one flow was interrupted, we can just continue the first one
127
+ flow_to_continue = interrupted_flow_ids[0]
128
+ else:
129
+ # the user mentioned the flow they want to continue
130
+ # check if the flow is in the list of interrupted flows
131
+ selected_flow = tracker.get_slot(INTERRUPTED_FLOW_TO_CONTINUE_SLOT)
132
+ if selected_flow in interrupted_flow_ids:
133
+ flow_to_continue = selected_flow
134
+ elif selected_flow in interrupted_flow_names:
135
+ # the user mentioned the flow by name
136
+ # find the flow id for the flow name
137
+ # the list of names and ids are in the same order
138
+ flow_to_continue = interrupted_flow_ids[
139
+ interrupted_flow_names.index(selected_flow)
140
+ ]
141
+
142
+ # if the user did not select a valid flow,
143
+ # we need to ask them to select a valid flow
144
+ if flow_to_continue is None:
145
+ await output_channel.send_text_message(
146
+ tracker.sender_id,
147
+ "You haven't selected a valid task to resume. "
148
+ "Please specify the task you would like to continue. "
149
+ "The options are: {{context.interrupted_flow_options}}",
150
+ )
151
+ return []
152
+
153
+ # resume the flow the user selected
154
+ events = resume_flow(flow_to_continue, tracker, tracker.stack)
155
+
156
+ return events + [
157
+ SlotSet(INTERRUPTED_FLOW_TO_CONTINUE_SLOT, None),
158
+ SlotSet(CONTINUE_INTERRUPTED_FLOW_CONFIRMATION_SLOT, None),
159
+ ]
160
+
161
+
162
+ class ActionCancelInterruptedFlows(Action):
163
+ def name(self) -> str:
164
+ return ACTION_CANCEL_INTERRUPTED_FLOWS
165
+
166
+ async def run(
167
+ self,
168
+ output_channel: OutputChannel,
169
+ nlg: NaturalLanguageGenerator,
170
+ tracker: DialogueStateTracker,
171
+ domain: Domain,
172
+ metadata: Optional[Dict[Text, Any]] = None,
173
+ ) -> List[Event]:
174
+ # get the pattern frame from the stack
175
+ pattern_frame = get_active_continue_interrupted_pattern_frame(tracker.stack)
176
+
177
+ if pattern_frame is None:
178
+ structlogger.warning(
179
+ "action.continue_interrupted_flows.no_continue_interrupted_frame"
180
+ )
181
+ return []
182
+
183
+ interrupted_flow_ids = pattern_frame.interrupted_flow_ids
184
+
185
+ event_list: List[Event] = []
186
+
187
+ # cancel all interrupted flows
188
+ for flow_id in interrupted_flow_ids:
189
+ event_list.extend(self.cancel_flow(tracker, tracker.stack, flow_id))
190
+
191
+ return event_list + [
192
+ SlotSet(INTERRUPTED_FLOW_TO_CONTINUE_SLOT, None),
193
+ SlotSet(CONTINUE_INTERRUPTED_FLOW_CONFIRMATION_SLOT, None),
194
+ ]
195
+
196
+ def cancel_flow(
197
+ self,
198
+ tracker: DialogueStateTracker,
199
+ stack: DialogueStack,
200
+ flow_id: str,
201
+ ) -> List[Event]:
202
+ """Cancels a flow by flow id."""
203
+ applied_events: List[Event] = []
204
+
205
+ frames_to_cancel, user_frame_to_cancel = self._collect_frames_to_cancel(
206
+ stack, flow_id
207
+ )
208
+
209
+ # if the flow is not on the stack, do nothing
210
+ if user_frame_to_cancel is None:
211
+ structlogger.error(
212
+ "cancel_flow.no_user_frame_to_cancel",
213
+ flow_id=flow_id,
214
+ )
215
+ return []
216
+
217
+ frames_ids_to_cancel = [frame.frame_id for frame in frames_to_cancel]
218
+
219
+ stack.push(
220
+ CancelPatternFlowStackFrame(
221
+ canceled_name=flow_id,
222
+ canceled_frames=frames_ids_to_cancel,
223
+ )
224
+ )
225
+
226
+ # create flow cancelled event
227
+ applied_events.extend(
228
+ [
229
+ FlowCancelled(
230
+ user_frame_to_cancel.flow_id, user_frame_to_cancel.step_id
231
+ ),
232
+ ]
233
+ )
234
+ # create agent cancelled events for any agent frames that are on the stack
235
+ for frame in frames_to_cancel:
236
+ if isinstance(frame, AgentStackFrame):
237
+ applied_events.append(
238
+ AgentCancelled(
239
+ frame.agent_id, frame.flow_id, reason="Flow was cancelled"
240
+ )
241
+ )
242
+
243
+ update_stack_events = tracker.create_stack_updated_events(stack)
244
+
245
+ return applied_events + update_stack_events
246
+
247
+ def _collect_frames_to_cancel(
248
+ self, stack: DialogueStack, target_flow_id: str
249
+ ) -> Tuple[List[DialogueStackFrame], Optional[UserFlowStackFrame]]:
250
+ """Collect frames that need to be cancelled.
251
+
252
+ Args:
253
+ stack: The stack to collect frames from.
254
+ target_flow_id: The ID of the flow to cancel.
255
+
256
+ Returns:
257
+ A tuple containing (frames_to_cancel, frame_to_cancel).
258
+ """
259
+ frames_to_cancel: List[DialogueStackFrame] = []
260
+ frame_found = False
261
+ frame_to_cancel = None
262
+
263
+ # collect all frames that belong to the target flow
264
+ # i.e. we want to cancel all frames that are on the stack and between
265
+ # the user flow frame that belongs to the target flow and the next user
266
+ # flow frame that belongs to a different flow
267
+ # this includes any pattern frames or agent frames as well
268
+ for frame in stack.frames:
269
+ if isinstance(frame, UserFlowStackFrame) and (
270
+ frame.frame_type == FlowStackFrameType.REGULAR
271
+ or frame.frame_type == FlowStackFrameType.INTERRUPT
272
+ ):
273
+ if frame.flow_id == target_flow_id:
274
+ frames_to_cancel.append(frame)
275
+ frame_to_cancel = frame
276
+ frame_found = True
277
+ continue
278
+ elif frame_found:
279
+ break
280
+
281
+ if frame_found:
282
+ frames_to_cancel.append(frame)
283
+
284
+ return list(frames_to_cancel), frame_to_cancel
@@ -1,6 +1,18 @@
1
1
  version: "3.1"
2
2
  responses:
3
3
 
4
+ utter_ask_continue_interrupted_flow_confirmation:
5
+ - text: "Would you like to continue with {{context.interrupted_flow_options}}?"
6
+ metadata:
7
+ rephrase: True
8
+ template: jinja
9
+
10
+ utter_ask_interrupted_flow_to_continue:
11
+ - text: "Would you like to resume {{context.interrupted_flow_options}}?"
12
+ metadata:
13
+ rephrase: True
14
+ template: jinja
15
+
4
16
  utter_ask_rephrase:
5
17
  - text: I’m sorry I am unable to understand you, could you please rephrase?
6
18
 
@@ -53,12 +65,6 @@ responses:
53
65
  rephrase: True
54
66
  template: jinja
55
67
 
56
- utter_flow_continue_interrupted:
57
- - text: "Let's continue with {{ context.previous_flow_name }}."
58
- metadata:
59
- rephrase: True
60
- template: jinja
61
-
62
68
  utter_free_chitchat_response:
63
69
  - text: "Sorry, I'm not able to answer that right now."
64
70
  metadata:
@@ -81,7 +87,7 @@ responses:
81
87
  rephrase: True
82
88
 
83
89
  utter_inform_hangup:
84
- - text: I haven’t heard from you, so I’ll end our conversation shortly.
90
+ - text: It seems you are not there anymore. I will hang up shortly.
85
91
  metadata:
86
92
  rephrase: True
87
93
 
@@ -124,6 +130,14 @@ slots:
124
130
  type: float
125
131
  initial_value: 0.0
126
132
  max_value: 1000000
133
+ interrupted_flow_to_continue:
134
+ type: text
135
+ mappings:
136
+ - type: from_llm
137
+ continue_interrupted_flow_confirmation:
138
+ type: bool
139
+ mappings:
140
+ - type: from_llm
127
141
 
128
142
  flows:
129
143
  pattern_cancel_flow:
@@ -210,7 +224,31 @@ flows:
210
224
  description: Conversation repair flow for managing when users switch between different flows
211
225
  name: pattern continue interrupted
212
226
  steps:
213
- - action: utter_flow_continue_interrupted
227
+ - noop: true
228
+ next:
229
+ - if: context.multiple_flows_interrupted
230
+ then:
231
+ - collect: interrupted_flow_to_continue
232
+ description: "Fill this slot with the name of the flow the user wants to continue. If the user does not want to continue any of the interrupted flows, fill this slot with 'none'."
233
+ next:
234
+ - if: slots.interrupted_flow_to_continue != "none"
235
+ then:
236
+ - action: action_continue_interrupted_flow
237
+ next: END
238
+ - else:
239
+ - action: action_cancel_interrupted_flows
240
+ next: END
241
+ - else:
242
+ - collect: continue_interrupted_flow_confirmation
243
+ description: "If the user wants to continue the interrupted flow, fill this slot with true. If the user does not want to continue the interrupted flow, fill this slot with false."
244
+ next:
245
+ - if: slots.continue_interrupted_flow_confirmation
246
+ then:
247
+ - action: action_continue_interrupted_flow
248
+ next: END
249
+ - else:
250
+ - action: action_cancel_interrupted_flows
251
+ next: END
214
252
 
215
253
  pattern_correction:
216
254
  description: Conversation repair flow for managing user input changes or error corrections
@@ -37,6 +37,7 @@ from rasa.dialogue_understanding.stack.frames import (
37
37
  BaseFlowStackFrame,
38
38
  )
39
39
  from rasa.dialogue_understanding.stack.utils import (
40
+ is_continue_interrupted_flow_active,
40
41
  top_flow_frame,
41
42
  top_user_flow_frame,
42
43
  )
@@ -428,22 +429,9 @@ def clean_up_commands(
428
429
  )
429
430
 
430
431
  elif isinstance(command, StartFlowCommand):
431
- top_user_frame = top_user_flow_frame(
432
- tracker.stack, ignore_call_and_link_frames=False
432
+ clean_commands = clean_up_start_flow_command(
433
+ clean_commands, tracker, command
433
434
  )
434
- top_flow_id = top_user_frame.flow_id if top_user_frame else ""
435
-
436
- if top_flow_id == command.flow:
437
- # drop a start flow command if the starting flow is equal
438
- # to the currently active flow
439
- structlogger.debug(
440
- "command_processor.clean_up_commands."
441
- "skip_command_flow_already_active",
442
- command=command,
443
- )
444
- continue
445
-
446
- clean_commands.append(command)
447
435
 
448
436
  # handle chitchat command differently from other free-form answer commands
449
437
  elif isinstance(command, ChitChatAnswerCommand):
@@ -529,6 +517,34 @@ def ensure_max_number_of_command_type(
529
517
  return filtered
530
518
 
531
519
 
520
+ def clean_up_start_flow_command(
521
+ clean_commands: List[Command],
522
+ tracker: DialogueStateTracker,
523
+ command: StartFlowCommand,
524
+ ) -> List[Command]:
525
+ """Clean up a start flow command."""
526
+ continue_interrupted_flow_active = is_continue_interrupted_flow_active(
527
+ tracker.stack
528
+ )
529
+
530
+ top_user_frame = top_user_flow_frame(
531
+ tracker.stack, ignore_call_and_link_frames=False
532
+ )
533
+ top_flow_id = top_user_frame.flow_id if top_user_frame else ""
534
+
535
+ if top_flow_id == command.flow and not continue_interrupted_flow_active:
536
+ # drop a start flow command if the starting flow is equal
537
+ # to the currently active flow
538
+ structlogger.debug(
539
+ "command_processor.clean_up_commands." "skip_command_flow_already_active",
540
+ command=command,
541
+ )
542
+ return clean_commands
543
+
544
+ clean_commands.append(command)
545
+ return clean_commands
546
+
547
+
532
548
  def clean_up_clarify_command(
533
549
  commands_so_far: List[Command],
534
550
  all_commands: List[Command],
@@ -8,6 +8,13 @@ from typing import Any, Callable, Dict, List, Optional
8
8
  import jsonpatch
9
9
  import structlog
10
10
 
11
+ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
12
+ AgentStackFrame,
13
+ AgentState,
14
+ FlowStackFrameType,
15
+ UserFlowStackFrame,
16
+ )
17
+
11
18
  if typing.TYPE_CHECKING:
12
19
  from rasa.dialogue_understanding.stack.frames import DialogueStackFrame
13
20
 
@@ -91,6 +98,42 @@ class DialogueStack:
91
98
  """
92
99
  return self.frames.pop()
93
100
 
101
+ def move_frames_to_top(self, frames_to_move: List["DialogueStackFrame"]) -> None:
102
+ """Moves specified frames to top of stack while preserving their relative order.
103
+
104
+ Args:
105
+ frames_to_move: The frames to move to the top of the stack.
106
+ """
107
+ # Get frames that are not being moved
108
+ frames_to_keep = [frame for frame in self.frames if frame not in frames_to_move]
109
+
110
+ # Reorder: keep frames first, then moved frames
111
+ self.frames = frames_to_keep + frames_to_move
112
+
113
+ # set all frames to interrupt except for LINK and CALL
114
+ for frame in self.frames:
115
+ if (
116
+ isinstance(frame, UserFlowStackFrame)
117
+ and frame.frame_type == FlowStackFrameType.LINK
118
+ ):
119
+ continue
120
+ if (
121
+ isinstance(frame, UserFlowStackFrame)
122
+ and frame.frame_type == FlowStackFrameType.CALL
123
+ ):
124
+ continue
125
+ if (
126
+ isinstance(frame, UserFlowStackFrame)
127
+ and frame.frame_type == FlowStackFrameType.REGULAR
128
+ ):
129
+ frame.frame_type = FlowStackFrameType.INTERRUPT
130
+
131
+ # set the first frame to regular
132
+ for frame in self.frames:
133
+ if isinstance(frame, UserFlowStackFrame):
134
+ frame.frame_type = FlowStackFrameType.REGULAR
135
+ return
136
+
94
137
  def current_context(self) -> Dict[str, Any]:
95
138
  """Returns the context of the topmost frame.
96
139
 
@@ -109,7 +152,7 @@ class DialogueStack:
109
152
  """Returns the topmost frame from the stack.
110
153
 
111
154
  Args:
112
- ignore_frame: The ID of the flow to ignore. Picks the top most
155
+ ignore: The ID of the flow to ignore. Picks the top most
113
156
  frame that has a different flow ID.
114
157
 
115
158
  Returns:
@@ -136,7 +179,8 @@ class DialogueStack:
136
179
  patch_dump: The patch to apply to the stack.
137
180
 
138
181
  Returns:
139
- The updated stack."""
182
+ The updated stack.
183
+ """
140
184
  patch = jsonpatch.JsonPatch.from_string(patch_dump)
141
185
  dialogue_stack_dump = patch.apply(self.as_dict())
142
186
  return DialogueStack.from_dict(dialogue_stack_dump)
@@ -177,3 +221,80 @@ class DialogueStack:
177
221
  if patch:
178
222
  return patch.to_string()
179
223
  return None
224
+
225
+ def _find_agent_frame_by_predicate(
226
+ self, predicate: Callable[[AgentStackFrame], bool]
227
+ ) -> List[AgentStackFrame]:
228
+ stack_frames: List[AgentStackFrame] = []
229
+ for stack_frame in reversed(self.frames):
230
+ if isinstance(stack_frame, AgentStackFrame) and predicate(stack_frame):
231
+ stack_frames.append(stack_frame)
232
+ return stack_frames
233
+
234
+ def find_active_agent_frame(self) -> Optional[AgentStackFrame]:
235
+ stack_frames = self._find_agent_frame_by_predicate(
236
+ lambda frame: frame.state == AgentState.WAITING_FOR_INPUT
237
+ )
238
+ if stack_frames:
239
+ return stack_frames[0]
240
+ return None
241
+
242
+ def find_agent_stack_frame_by_agent(
243
+ self, agent_id: str
244
+ ) -> Optional[AgentStackFrame]:
245
+ """Get the agent stack frame for a specific agent ID.
246
+
247
+ May also include the agent stack frame in the INTERRUPTED state.
248
+ """
249
+ stack_frames = self._find_agent_frame_by_predicate(
250
+ lambda frame: frame.agent_id == agent_id
251
+ )
252
+ if stack_frames:
253
+ return stack_frames[0]
254
+ return None
255
+
256
+ def find_active_agent_stack_frame_for_flow(
257
+ self, flow_id: str
258
+ ) -> Optional[AgentStackFrame]:
259
+ """Get the agent stack frame of a specific flow."""
260
+ stack_frames = self._find_agent_frame_by_predicate(
261
+ lambda frame: frame.flow_id == flow_id
262
+ )
263
+ for stack_frame in stack_frames:
264
+ if stack_frame.state == AgentState.WAITING_FOR_INPUT:
265
+ return stack_frame
266
+ return None
267
+
268
+ def get_active_agent_id(self) -> Optional[typing.Text]:
269
+ agent_frame = self.find_active_agent_frame()
270
+ if agent_frame:
271
+ return agent_frame.agent_id
272
+ return None
273
+
274
+ def agent_is_active(self) -> bool:
275
+ return self.find_active_agent_frame() is not None
276
+
277
+ def get_all_user_flow_frames(
278
+ self, ignore_call_and_link_frames: bool = True
279
+ ) -> List[UserFlowStackFrame]:
280
+ """Get all user flow frames from the dialogue stack.
281
+
282
+ Args:
283
+ ignore_call_and_link_frames: Whether to ignore user frames of type `call`
284
+ and `link`. By default, these frames are ignored.
285
+
286
+ Returns:
287
+ A list of all user flow frames in the dialogue stack.
288
+ """
289
+ return [
290
+ frame
291
+ for frame in self.frames
292
+ if isinstance(frame, UserFlowStackFrame)
293
+ and (
294
+ not ignore_call_and_link_frames
295
+ or (
296
+ frame.frame_type != FlowStackFrameType.CALL
297
+ and frame.frame_type != FlowStackFrameType.LINK
298
+ )
299
+ )
300
+ ]
@@ -94,6 +94,18 @@ class InvalidFlowStepIdException(Exception):
94
94
  super().__init__(f"Invalid flow step ID '{step_id}' for flow '{flow_id}'.")
95
95
 
96
96
 
97
+ class InvalidAgentState(RasaException):
98
+ """Raised if the agent state is invalid."""
99
+
100
+ def __init__(self, invalid_state: str) -> None:
101
+ """Creates a `InvalidAgentState`.
102
+
103
+ Args:
104
+ invalid_state: The invalid agent state.
105
+ """
106
+ super().__init__(f"Invalid agent state '{invalid_state}'.")
107
+
108
+
97
109
  @dataclass
98
110
  class BaseFlowStackFrame(DialogueStackFrame):
99
111
  flow_id: str = "" # needed to avoid "default arg before non-default" error
@@ -171,3 +183,48 @@ class UserFlowStackFrame(BaseFlowStackFrame):
171
183
  step_id=data["step_id"],
172
184
  frame_type=FlowStackFrameType.from_str(data.get("frame_type")),
173
185
  )
186
+
187
+
188
+ class AgentState(str, Enum):
189
+ INTERRUPTED = "interrupted"
190
+ WAITING_FOR_INPUT = "waiting_for_input"
191
+
192
+ @staticmethod
193
+ def from_str(state: Optional[str]) -> AgentState:
194
+ if state == AgentState.WAITING_FOR_INPUT.value:
195
+ return AgentState.WAITING_FOR_INPUT
196
+ elif state == AgentState.INTERRUPTED.value:
197
+ return AgentState.INTERRUPTED
198
+ else:
199
+ raise InvalidAgentState(state)
200
+
201
+
202
+ @dataclass
203
+ class AgentStackFrame(BaseFlowStackFrame):
204
+ agent_id: str = ""
205
+ state: AgentState = AgentState.WAITING_FOR_INPUT
206
+ metadata: Optional[Dict[str, Any]] = None
207
+
208
+ @classmethod
209
+ def type(cls) -> str:
210
+ """Returns the type of the frame."""
211
+ return "agent"
212
+
213
+ @staticmethod
214
+ def from_dict(data: Dict[str, Any]) -> AgentStackFrame:
215
+ """Creates a `AgentStackFrame` from a dictionary.
216
+
217
+ Args:
218
+ data: The dictionary to create the `AgentStackFrame` from.
219
+
220
+ Returns:
221
+ The created `AgentStackFrame`.
222
+ """
223
+ return AgentStackFrame(
224
+ frame_id=data["frame_id"],
225
+ flow_id=data["flow_id"],
226
+ step_id=data["step_id"],
227
+ agent_id=data["agent_id"],
228
+ state=AgentState.from_str(data["state"]),
229
+ metadata=data.get("metadata"),
230
+ )