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
@@ -8,6 +8,9 @@ from rasa.dialogue_understanding.commands.chit_chat_answer_command import (
8
8
  )
9
9
  from rasa.dialogue_understanding.commands.clarify_command import ClarifyCommand
10
10
  from rasa.dialogue_understanding.commands.command import Command
11
+ from rasa.dialogue_understanding.commands.continue_agent_command import (
12
+ ContinueAgentCommand,
13
+ )
11
14
  from rasa.dialogue_understanding.commands.correct_slots_command import (
12
15
  CorrectedSlot,
13
16
  CorrectSlotsCommand,
@@ -29,6 +32,9 @@ from rasa.dialogue_understanding.commands.noop_command import NoopCommand
29
32
  from rasa.dialogue_understanding.commands.repeat_bot_messages_command import (
30
33
  RepeatBotMessagesCommand,
31
34
  )
35
+ from rasa.dialogue_understanding.commands.restart_agent_command import (
36
+ RestartAgentCommand,
37
+ )
32
38
  from rasa.dialogue_understanding.commands.restart_command import RestartCommand
33
39
  from rasa.dialogue_understanding.commands.session_end_command import SessionEndCommand
34
40
  from rasa.dialogue_understanding.commands.session_start_command import (
@@ -62,4 +68,6 @@ __all__ = [
62
68
  "SessionEndCommand",
63
69
  "RepeatBotMessagesCommand",
64
70
  "RestartCommand",
71
+ "ContinueAgentCommand",
72
+ "RestartAgentCommand",
65
73
  ]
@@ -6,6 +6,9 @@ from typing import Any, Dict, List
6
6
 
7
7
  import structlog
8
8
 
9
+ from rasa.core.policies.flows.flow_executor import (
10
+ remove_agent_stack_frame,
11
+ )
9
12
  from rasa.dialogue_understanding.commands.command import Command
10
13
  from rasa.dialogue_understanding.commands.command_syntax_manager import (
11
14
  CommandSyntaxManager,
@@ -18,7 +21,7 @@ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
18
21
  UserFlowStackFrame,
19
22
  )
20
23
  from rasa.dialogue_understanding.stack.utils import top_user_flow_frame
21
- from rasa.shared.core.events import Event, FlowCancelled
24
+ from rasa.shared.core.events import AgentCancelled, Event, FlowCancelled
22
25
  from rasa.shared.core.flows import FlowsList
23
26
  from rasa.shared.core.trackers import DialogueStateTracker
24
27
 
@@ -48,8 +51,7 @@ class CancelFlowCommand(Command):
48
51
  """Selects the frames that were canceled.
49
52
 
50
53
  Args:
51
- dialogue_stack: The dialogue stack.
52
- current_flow: The current flow.
54
+ stack: The dialogue stack.
53
55
 
54
56
  Returns:
55
57
  The frames that were canceled.
@@ -71,8 +73,7 @@ class CancelFlowCommand(Command):
71
73
  # we should never get here as we should always find the user flow
72
74
  # that was canceled.
73
75
  raise ValueError(
74
- f"Could not find a user flow frame to cancel. "
75
- f"Current stack: {stack}."
76
+ f"Could not find a user flow frame to cancel. Current stack: {stack}."
76
77
  )
77
78
 
78
79
  def run_command_on_tracker(
@@ -106,6 +107,19 @@ class CancelFlowCommand(Command):
106
107
  )
107
108
  return []
108
109
 
110
+ if agent_frame := original_tracker.stack.find_active_agent_stack_frame_for_flow(
111
+ current_flow.id
112
+ ):
113
+ structlogger.debug(
114
+ "cancel_command.remove_agent_stack_frame",
115
+ command=self,
116
+ frame=agent_frame,
117
+ )
118
+ remove_agent_stack_frame(stack, agent_frame.agent_id)
119
+ applied_events.append(
120
+ AgentCancelled(agent_id=agent_frame.agent_id, flow_id=current_flow.id)
121
+ )
122
+
109
123
  # we pass in the original dialogue stack (before any of the currently
110
124
  # predicted commands were applied) to make sure we don't cancel any
111
125
  # frames that were added by the currently predicted commands.
@@ -12,6 +12,10 @@ from rasa.dialogue_understanding.commands.free_form_answer_command import (
12
12
  FreeFormAnswerCommand,
13
13
  )
14
14
  from rasa.dialogue_understanding.patterns.chitchat import ChitchatPatternFlowStackFrame
15
+ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
16
+ AgentStackFrame,
17
+ AgentState,
18
+ )
15
19
  from rasa.shared.core.events import Event
16
20
  from rasa.shared.core.flows import FlowsList
17
21
  from rasa.shared.core.trackers import DialogueStateTracker
@@ -52,6 +56,13 @@ class ChitChatAnswerCommand(FreeFormAnswerCommand):
52
56
  The events to apply to the tracker.
53
57
  """
54
58
  stack = tracker.stack
59
+
60
+ # if the top stack frame is an agent stack frame, we need to
61
+ # update the state to INTERRUPTED
62
+ if top_stack_frame := stack.top():
63
+ if isinstance(top_stack_frame, AgentStackFrame):
64
+ top_stack_frame.state = AgentState.INTERRUPTED
65
+
55
66
  stack.push(ChitchatPatternFlowStackFrame())
56
67
  return tracker.create_stack_updated_events(stack)
57
68
 
@@ -13,6 +13,10 @@ from rasa.dialogue_understanding.commands.command_syntax_manager import (
13
13
  )
14
14
  from rasa.dialogue_understanding.commands.utils import extract_cleaned_options
15
15
  from rasa.dialogue_understanding.patterns.clarify import ClarifyPatternFlowStackFrame
16
+ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
17
+ AgentStackFrame,
18
+ AgentState,
19
+ )
16
20
  from rasa.shared.core.events import Event
17
21
  from rasa.shared.core.flows import FlowsList
18
22
  from rasa.shared.core.trackers import DialogueStateTracker
@@ -85,6 +89,12 @@ class ClarifyCommand(Command):
85
89
  if flow is not None
86
90
  ]
87
91
 
92
+ # if the top stack frame is an agent stack frame, we need to
93
+ # update the state to INTERRUPTED
94
+ if top_stack_frame := stack.top():
95
+ if isinstance(top_stack_frame, AgentStackFrame):
96
+ top_stack_frame.state = AgentState.INTERRUPTED
97
+
88
98
  stack.push(ClarifyPatternFlowStackFrame(names=names))
89
99
  return tracker.create_stack_updated_events(stack)
90
100
 
@@ -0,0 +1,91 @@
1
+ from __future__ import annotations
2
+
3
+ import re
4
+ from dataclasses import dataclass
5
+ from typing import Any, Dict, List
6
+
7
+ import structlog
8
+
9
+ from rasa.dialogue_understanding.commands.command import Command
10
+ from rasa.dialogue_understanding.commands.command_syntax_manager import (
11
+ CommandSyntaxManager,
12
+ CommandSyntaxVersion,
13
+ )
14
+ from rasa.shared.core.events import Event
15
+ from rasa.shared.core.flows import FlowsList
16
+ from rasa.shared.core.trackers import DialogueStateTracker
17
+
18
+ structlogger = structlog.get_logger()
19
+
20
+
21
+ @dataclass
22
+ class ContinueAgentCommand(Command):
23
+ """A command to continue the currently active agent's execution."""
24
+
25
+ @classmethod
26
+ def command(cls) -> str:
27
+ """Returns the command type."""
28
+ return "continue agent"
29
+
30
+ @classmethod
31
+ def from_dict(cls, data: Dict[str, Any]) -> ContinueAgentCommand:
32
+ """Converts the dictionary to a command.
33
+
34
+ Returns:
35
+ The converted dictionary.
36
+ """
37
+ return ContinueAgentCommand()
38
+
39
+ def run_command_on_tracker(
40
+ self,
41
+ tracker: DialogueStateTracker,
42
+ all_flows: FlowsList,
43
+ original_tracker: DialogueStateTracker,
44
+ ) -> List[Event]:
45
+ """Runs the command on the tracker.
46
+
47
+ Args:
48
+ tracker: The tracker to run the command on.
49
+ all_flows: All flows in the assistant.
50
+ original_tracker: The tracker before any command was executed.
51
+
52
+ Returns:
53
+ The events to apply to the tracker.
54
+ """
55
+ # do nothing
56
+ return []
57
+
58
+ def __hash__(self) -> int:
59
+ return hash(self.command())
60
+
61
+ def __eq__(self, other: object) -> bool:
62
+ return isinstance(other, ContinueAgentCommand)
63
+
64
+ def to_dsl(self) -> str:
65
+ """Converts the command to a DSL string."""
66
+ mapper = {
67
+ CommandSyntaxVersion.v1: "ContinueAgent()",
68
+ CommandSyntaxVersion.v2: "continue agent",
69
+ CommandSyntaxVersion.v3: "continue agent",
70
+ }
71
+ return mapper.get(
72
+ CommandSyntaxManager.get_syntax_version(),
73
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
74
+ )
75
+
76
+ @classmethod
77
+ def from_dsl(cls, match: re.Match, **kwargs: Any) -> ContinueAgentCommand:
78
+ """Converts a DSL string to a command."""
79
+ return ContinueAgentCommand()
80
+
81
+ @staticmethod
82
+ def regex_pattern() -> str:
83
+ mapper = {
84
+ CommandSyntaxVersion.v1: r"ContinueAgent\(\)",
85
+ CommandSyntaxVersion.v2: r"""^[\s\W\d]*continue agent['"`]*$""",
86
+ CommandSyntaxVersion.v3: r"""^[\s\W\d]*continue agent['"`]*$""",
87
+ }
88
+ return mapper.get(
89
+ CommandSyntaxManager.get_syntax_version(),
90
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
91
+ )
@@ -12,6 +12,10 @@ from rasa.dialogue_understanding.commands.free_form_answer_command import (
12
12
  FreeFormAnswerCommand,
13
13
  )
14
14
  from rasa.dialogue_understanding.patterns.search import SearchPatternFlowStackFrame
15
+ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
16
+ AgentStackFrame,
17
+ AgentState,
18
+ )
15
19
  from rasa.shared.core.events import Event
16
20
  from rasa.shared.core.flows import FlowsList
17
21
  from rasa.shared.core.trackers import DialogueStateTracker
@@ -52,6 +56,13 @@ class KnowledgeAnswerCommand(FreeFormAnswerCommand):
52
56
  The events to apply to the tracker.
53
57
  """
54
58
  stack = tracker.stack
59
+
60
+ # if the top stack frame is an agent stack frame, we need to
61
+ # update the state to INTERRUPTED
62
+ if top_stack_frame := stack.top():
63
+ if isinstance(top_stack_frame, AgentStackFrame):
64
+ top_stack_frame.state = AgentState.INTERRUPTED
65
+
55
66
  stack.push(SearchPatternFlowStackFrame())
56
67
  return tracker.create_stack_updated_events(stack)
57
68
 
@@ -0,0 +1,162 @@
1
+ from __future__ import annotations
2
+
3
+ import re
4
+ from dataclasses import dataclass
5
+ from typing import Any, Dict, List, Optional
6
+
7
+ from rasa.dialogue_understanding.commands.command import Command
8
+ from rasa.dialogue_understanding.commands.command_syntax_manager import (
9
+ CommandSyntaxManager,
10
+ CommandSyntaxVersion,
11
+ )
12
+ from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
13
+ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
14
+ AgentStackFrame,
15
+ AgentState,
16
+ )
17
+ from rasa.shared.core.events import AgentStarted, Event
18
+ from rasa.shared.core.flows import FlowsList
19
+ from rasa.shared.core.flows.steps import CallFlowStep
20
+ from rasa.shared.core.trackers import DialogueStateTracker
21
+
22
+
23
+ @dataclass
24
+ class RestartAgentCommand(Command):
25
+ """A command to restart an agentic loop within a flow."""
26
+
27
+ agent_id: str
28
+
29
+ @classmethod
30
+ def command(cls) -> str:
31
+ """Returns the command type."""
32
+ return "restart agent"
33
+
34
+ @classmethod
35
+ def from_dict(cls, data: Dict[str, Any]) -> RestartAgentCommand:
36
+ """Converts the dictionary to a command.
37
+
38
+ Returns:
39
+ The converted dictionary.
40
+ """
41
+ try:
42
+ return RestartAgentCommand(agent_id=data["agent_id"])
43
+ except KeyError as e:
44
+ raise ValueError(
45
+ f"Missing parameter '{e}' while parsing RestartAgentCommand."
46
+ ) from e
47
+
48
+ def run_command_on_tracker(
49
+ self,
50
+ tracker: DialogueStateTracker,
51
+ all_flows: FlowsList,
52
+ original_tracker: DialogueStateTracker,
53
+ ) -> List[Event]:
54
+ """Runs the command on the tracker.
55
+
56
+ Args:
57
+ tracker: The tracker to run the command on.
58
+ all_flows: All flows in the assistant.
59
+ original_tracker: The tracker before any command was executed.
60
+
61
+ Returns:
62
+ The events to apply to the tracker.
63
+ """
64
+ stack = tracker.stack
65
+
66
+ # get the agent flow
67
+ agent_flow_id = self._get_agent_flow(original_tracker)
68
+
69
+ # create a new agent stack frame to restart the agent
70
+ restart_agent_frame = self.create_restart_agent_stack_frame(
71
+ all_flows, agent_flow_id
72
+ )
73
+
74
+ # if the stack contains an agent stack frame with status
75
+ # "waiting for input" update the status to "interrupted"
76
+ self.update_agent_stack_frames_on_stack(stack)
77
+
78
+ # push the stack frame on the top of the stack
79
+ stack.push(restart_agent_frame)
80
+ return tracker.create_stack_updated_events(stack)
81
+
82
+ def __hash__(self) -> int:
83
+ return hash(self.command())
84
+
85
+ def __eq__(self, other: object) -> bool:
86
+ return isinstance(other, RestartAgentCommand)
87
+
88
+ def to_dsl(self) -> str:
89
+ """Converts the command to a DSL string."""
90
+ mapper = {
91
+ CommandSyntaxVersion.v1: f"RestartAgent({self.agent_id})",
92
+ CommandSyntaxVersion.v2: f"restart agent {self.agent_id}",
93
+ CommandSyntaxVersion.v3: f"restart agent {self.agent_id}",
94
+ }
95
+ return mapper.get(
96
+ CommandSyntaxManager.get_syntax_version(),
97
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
98
+ )
99
+
100
+ @classmethod
101
+ def from_dsl(cls, match: re.Match, **kwargs: Any) -> RestartAgentCommand:
102
+ """Converts a DSL string to a command."""
103
+ return RestartAgentCommand(agent_id=str(match.group(1).strip()))
104
+
105
+ @staticmethod
106
+ def regex_pattern() -> str:
107
+ mapper = {
108
+ CommandSyntaxVersion.v1: r"RestartAgent\(['\"]?([a-zA-Z0-9_-]+)['\"]?\)",
109
+ CommandSyntaxVersion.v2: (
110
+ r"""^[\s\W\d]*restart agent ['"`]?([a-zA-Z0-9_-]+)['"`]*"""
111
+ ),
112
+ CommandSyntaxVersion.v3: (
113
+ r"""^[\s\W\d]*restart agent ['"`]?([a-zA-Z0-9_-]+)['"`]*"""
114
+ ),
115
+ }
116
+ return mapper.get(
117
+ CommandSyntaxManager.get_syntax_version(),
118
+ mapper[CommandSyntaxManager.get_default_syntax_version()],
119
+ )
120
+
121
+ def create_restart_agent_stack_frame(
122
+ self, all_flows: FlowsList, agent_flow_id: str
123
+ ) -> AgentStackFrame:
124
+ # get the agent flow
125
+ agent_flow = all_flows.flow_by_id(agent_flow_id)
126
+ if not agent_flow:
127
+ raise ValueError(f"Agent flow {agent_flow_id} not found")
128
+
129
+ # find the call flow step for the agent
130
+ # set the state to "waiting for input" so that the agent can process
131
+ # the latest user message
132
+ for step in agent_flow.steps:
133
+ if isinstance(step, CallFlowStep) and step.call == self.agent_id:
134
+ return AgentStackFrame(
135
+ frame_id=f"restart_agent_{self.agent_id}",
136
+ flow_id=agent_flow_id,
137
+ step_id=step.id,
138
+ agent_id=self.agent_id,
139
+ state=AgentState.WAITING_FOR_INPUT,
140
+ )
141
+
142
+ raise ValueError(f"Call step in agent flow {agent_flow_id} not found")
143
+
144
+ def update_agent_stack_frames_on_stack(self, stack: DialogueStack) -> None:
145
+ for frame in stack.frames:
146
+ if (
147
+ isinstance(frame, AgentStackFrame)
148
+ and frame.state == AgentState.WAITING_FOR_INPUT
149
+ ):
150
+ frame.state = AgentState.INTERRUPTED
151
+
152
+ def _get_agent_flow(self, tracker: DialogueStateTracker) -> Optional[str]:
153
+ # find events associated with the agent
154
+ agent_started_events = [
155
+ event
156
+ for event in tracker.events
157
+ if type(event) == AgentStarted and event.agent_id == self.agent_id
158
+ ]
159
+ # take the last one if the agent was started multiple times
160
+ if agent_started_events:
161
+ return agent_started_events[-1].flow_id
162
+ return None
@@ -11,15 +11,25 @@ from rasa.dialogue_understanding.commands.command_syntax_manager import (
11
11
  CommandSyntaxManager,
12
12
  CommandSyntaxVersion,
13
13
  )
14
+ from rasa.dialogue_understanding.commands.utils import (
15
+ remove_pattern_continue_interrupted_frames,
16
+ resume_flow,
17
+ )
14
18
  from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
19
+ AgentState,
15
20
  FlowStackFrameType,
16
21
  UserFlowStackFrame,
17
22
  )
18
23
  from rasa.dialogue_understanding.stack.utils import (
24
+ is_continue_interrupted_flow_active,
19
25
  top_user_flow_frame,
20
26
  user_flows_on_the_stack,
21
27
  )
22
- from rasa.shared.core.events import Event, FlowInterrupted
28
+ from rasa.shared.core.events import (
29
+ AgentInterrupted,
30
+ Event,
31
+ FlowInterrupted,
32
+ )
23
33
  from rasa.shared.core.flows import FlowsList
24
34
  from rasa.shared.core.trackers import DialogueStateTracker
25
35
 
@@ -71,12 +81,7 @@ class StartFlowCommand(Command):
71
81
  original_stack = original_tracker.stack
72
82
  applied_events: List[Event] = []
73
83
 
74
- if self.flow in user_flows_on_the_stack(stack):
75
- structlogger.debug(
76
- "start_flow_command.skip_command.already_started_flow", command=self
77
- )
78
- return []
79
- elif self.flow not in all_flows.flow_ids:
84
+ if self.flow not in all_flows.flow_ids:
80
85
  structlogger.debug(
81
86
  "start_flow_command.skip_command.start_invalid_flow_id", command=self
82
87
  )
@@ -87,9 +92,47 @@ class StartFlowCommand(Command):
87
92
  original_user_frame.flow(all_flows) if original_user_frame else None
88
93
  )
89
94
 
95
+ # if the original top flow is the same as the flow to start, the flow is
96
+ # already active, do nothing
97
+ if original_top_flow is not None and original_top_flow.id == self.flow:
98
+ # in case continue_interrupted is not active, skip the already active start
99
+ # flow command
100
+ if not is_continue_interrupted_flow_active(stack):
101
+ return []
102
+
103
+ # if the continue interrupted flow is active, and the command generator
104
+ # predicted a start flow command for the flow which is on top of the stack,
105
+ # we just need to remove the pattern_continue_interrupted frame(s) from the
106
+ # stack
107
+ stack = remove_pattern_continue_interrupted_frames(stack)
108
+ return applied_events + tracker.create_stack_updated_events(stack)
109
+
110
+ # if the flow is already on the stack, resume it
111
+ if (
112
+ self.flow in user_flows_on_the_stack(stack)
113
+ and original_user_frame is not None
114
+ ):
115
+ # if pattern_continue_interrupted is active, we need to remove it
116
+ # from the stack before resuming the flow
117
+ stack = remove_pattern_continue_interrupted_frames(stack)
118
+ applied_events.extend(resume_flow(self.flow, tracker, stack))
119
+ # the current active flow is interrupted
120
+ applied_events.append(
121
+ FlowInterrupted(
122
+ original_user_frame.flow_id, original_user_frame.step_id
123
+ )
124
+ )
125
+ return applied_events
126
+
90
127
  frame_type = FlowStackFrameType.REGULAR
91
128
 
129
+ # remove the pattern_continue_interrupted frames from the stack
130
+ # if it is currently active but the user digressed from the pattern
131
+ stack = remove_pattern_continue_interrupted_frames(stack)
132
+
92
133
  if original_top_flow:
134
+ # if the original top flow is not the same as the flow to start,
135
+ # interrupt the current active flow
93
136
  frame_type = FlowStackFrameType.INTERRUPT
94
137
 
95
138
  if original_user_frame is not None:
@@ -99,6 +142,24 @@ class StartFlowCommand(Command):
99
142
  )
100
143
  )
101
144
 
145
+ # If there is an active agent frame, interrupt it
146
+ active_agent_stack_frame = stack.find_active_agent_frame()
147
+ if active_agent_stack_frame:
148
+ structlogger.debug(
149
+ "start_flow_command.interrupt_agent",
150
+ command=self,
151
+ agent_id=active_agent_stack_frame.agent_id,
152
+ frame_id=active_agent_stack_frame.frame_id,
153
+ flow_id=active_agent_stack_frame.flow_id,
154
+ )
155
+ active_agent_stack_frame.state = AgentState.INTERRUPTED
156
+ applied_events.append(
157
+ AgentInterrupted(
158
+ active_agent_stack_frame.agent_id,
159
+ active_agent_stack_frame.flow_id,
160
+ )
161
+ )
162
+
102
163
  structlogger.debug("start_flow_command.start_flow", command=self)
103
164
  stack.push(UserFlowStackFrame(flow_id=self.flow, frame_type=frame_type))
104
165
  return applied_events + tracker.create_stack_updated_events(stack)
@@ -5,8 +5,23 @@ import structlog
5
5
  from rasa.dialogue_understanding.patterns.validate_slot import (
6
6
  ValidateSlotPatternFlowStackFrame,
7
7
  )
8
+ from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
9
+ from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
10
+ DialogueStackFrame,
11
+ )
12
+ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
13
+ AgentStackFrame,
14
+ FlowStackFrameType,
15
+ UserFlowStackFrame,
16
+ )
17
+ from rasa.dialogue_understanding.stack.frames.pattern_frame import PatternFlowStackFrame
8
18
  from rasa.shared.constants import ACTION_ASK_PREFIX, UTTER_ASK_PREFIX
9
- from rasa.shared.core.events import Event, SlotSet
19
+ from rasa.shared.core.events import (
20
+ AgentResumed,
21
+ Event,
22
+ FlowResumed,
23
+ SlotSet,
24
+ )
10
25
  from rasa.shared.core.flows import FlowsList
11
26
  from rasa.shared.core.slots import Slot
12
27
  from rasa.shared.core.trackers import DialogueStateTracker
@@ -103,7 +118,8 @@ def create_validate_frames_from_slot_set_events(
103
118
  Args:
104
119
  tracker: The dialogue state tracker.
105
120
  events: List of events to process.
106
- should_break: whether or not to break after the first non-SlotSet event.
121
+ validate_frames: List to collect validation frames.
122
+ should_break: whether to break after the first non-SlotSet event.
107
123
  if True, break out of the event loop as soon as the first non-SlotSet
108
124
  event is encountered.
109
125
  if False, continue processing the events until the end.
@@ -150,3 +166,109 @@ def find_default_flows_collecting_slot(
150
166
  for step in flow.get_collect_steps()
151
167
  )
152
168
  ]
169
+
170
+
171
+ def resume_flow(
172
+ flow_to_resume: str,
173
+ tracker: DialogueStateTracker,
174
+ stack: DialogueStack,
175
+ ) -> List[Event]:
176
+ """Resumes a flow by reordering frames."""
177
+ applied_events: List[Event] = []
178
+
179
+ # Resume existing flow by reordering frames
180
+ frames_to_resume, user_frame_to_resume = collect_frames_to_resume(
181
+ stack, flow_to_resume
182
+ )
183
+
184
+ # if the flow is not on the stack, do nothing
185
+ # this should not happen, but just in case
186
+ if user_frame_to_resume is None:
187
+ structlogger.error(
188
+ "resume_flow.no_user_frame_to_resume",
189
+ flow_to_resume=flow_to_resume,
190
+ )
191
+ return []
192
+
193
+ # move the frames to the top of the stack, e.g. reorder the frames
194
+ # on the stack
195
+ stack.move_frames_to_top(frames_to_resume)
196
+
197
+ # create agent resumed events if the agent frame is now on top of the stack
198
+ agent_stack_frame = next(
199
+ (frame for frame in frames_to_resume if isinstance(frame, AgentStackFrame)),
200
+ None,
201
+ )
202
+ if agent_stack_frame:
203
+ agent_id = agent_stack_frame.agent_id
204
+ applied_events.append(AgentResumed(agent_id, agent_stack_frame.flow_id))
205
+
206
+ # Create flow interruption and resumption events
207
+ applied_events.extend(
208
+ [
209
+ # the flow, which was on the stack, is resumed
210
+ FlowResumed(user_frame_to_resume.flow_id, user_frame_to_resume.step_id),
211
+ ]
212
+ )
213
+
214
+ return applied_events + tracker.create_stack_updated_events(stack)
215
+
216
+
217
+ def collect_frames_to_resume(
218
+ stack: DialogueStack,
219
+ target_flow_id: str, # pyright: ignore[reportUndefinedVariable]
220
+ ) -> Tuple[List[DialogueStackFrame], Optional[UserFlowStackFrame]]:
221
+ """Collect frames that need to be resumed for the target flow.
222
+
223
+ Args:
224
+ stack: The stack to collect frames from.
225
+ target_flow_id: The ID of the flow to resume.
226
+
227
+ Returns:
228
+ A tuple containing (frames_to_resume, frame_to_resume).
229
+ """
230
+ frames_to_resume: List[DialogueStackFrame] = []
231
+ frame_found = False
232
+ frame_to_resume = None
233
+
234
+ for frame in stack.frames:
235
+ if isinstance(frame, UserFlowStackFrame) and (
236
+ frame.frame_type == FlowStackFrameType.REGULAR
237
+ or frame.frame_type == FlowStackFrameType.INTERRUPT
238
+ ):
239
+ if frame.flow_id == target_flow_id:
240
+ frames_to_resume.append(frame)
241
+ frame_to_resume = frame
242
+ frame_found = True
243
+ continue
244
+ elif frame_found:
245
+ break
246
+
247
+ if frame_found:
248
+ frames_to_resume.append(frame)
249
+
250
+ return list(frames_to_resume), frame_to_resume
251
+
252
+
253
+ def remove_pattern_continue_interrupted_frames(stack: DialogueStack) -> DialogueStack:
254
+ """Remove pattern_continue_interrupted frames from the stack."""
255
+ from rasa.dialogue_understanding.stack.utils import (
256
+ is_continue_interrupted_flow_active,
257
+ )
258
+
259
+ if not is_continue_interrupted_flow_active(stack):
260
+ return stack
261
+
262
+ # remove pattern_continue_interrupted from the stack
263
+ top_frame = stack.top()
264
+ while isinstance(top_frame, PatternFlowStackFrame):
265
+ # If the top frame is a pattern frame, we need to remove it
266
+ # before continuing with the active user flow frame.
267
+ # This prevents the pattern frame
268
+ # from being left on the stack when the flow is started
269
+ # which would prevent pattern_completed to be triggered
270
+ # once the user flow is completed.
271
+ stack.pop()
272
+ top_frame = stack.top()
273
+
274
+ return stack
@@ -9,9 +9,11 @@ from rasa.dialogue_understanding.commands import (
9
9
  ChitChatAnswerCommand,
10
10
  ClarifyCommand,
11
11
  Command,
12
+ ContinueAgentCommand,
12
13
  HumanHandoffCommand,
13
14
  KnowledgeAnswerCommand,
14
15
  RepeatBotMessagesCommand,
16
+ RestartAgentCommand,
15
17
  SetSlotCommand,
16
18
  SkipQuestionCommand,
17
19
  StartFlowCommand,
@@ -34,6 +36,8 @@ DEFAULT_COMMANDS = [
34
36
  HumanHandoffCommand,
35
37
  ClarifyCommand,
36
38
  RepeatBotMessagesCommand,
39
+ ContinueAgentCommand,
40
+ RestartAgentCommand,
37
41
  ]
38
42
 
39
43