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,25 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Any, Dict, List, Optional, Text
3
+ import asyncio
4
+ from typing import Any, Dict, List, Optional, Text, cast
4
5
 
5
6
  import structlog
6
7
  from jinja2 import Template
7
8
  from pypred import Predicate
8
- from structlog.contextvars import (
9
- bound_contextvars,
9
+ from structlog.contextvars import bound_contextvars
10
+
11
+ from rasa.agents.agent_manager import AgentManager
12
+ from rasa.agents.constants import (
13
+ A2A_AGENT_CONTEXT_ID_KEY,
14
+ AGENT_METADATA_AGENT_RESPONSE_KEY,
15
+ AGENT_METADATA_EXIT_IF_KEY,
16
+ AGENT_METADATA_TOOL_RESULTS_KEY,
17
+ MAX_AGENT_RETRY_DELAY_SECONDS,
10
18
  )
11
-
19
+ from rasa.agents.core.types import AgentStatus, ProtocolType
20
+ from rasa.agents.schemas import AgentInput, AgentOutput
21
+ from rasa.agents.schemas.agent_input import AgentInputSlot
22
+ from rasa.core.available_agents import AvailableAgents
12
23
  from rasa.core.available_endpoints import AvailableEndpoints
13
24
  from rasa.core.constants import ACTIVE_FLOW_METADATA_KEY, STEP_ID_METADATA_KEY
14
25
  from rasa.core.policies.flows.flow_exceptions import (
@@ -22,7 +33,8 @@ from rasa.core.policies.flows.flow_step_result import (
22
33
  FlowStepResult,
23
34
  PauseFlowReturnPrediction,
24
35
  )
25
- from rasa.dialogue_understanding.commands import CancelFlowCommand
36
+ from rasa.core.policies.flows.mcp_tool_executor import call_mcp_tool
37
+ from rasa.core.utils import get_slot_names_from_exit_conditions
26
38
  from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
27
39
  from rasa.dialogue_understanding.patterns.collect_information import (
28
40
  FLOW_PATTERN_COLLECT_INFORMATION,
@@ -49,17 +61,30 @@ from rasa.dialogue_understanding.stack.frames import (
49
61
  UserFlowStackFrame,
50
62
  )
51
63
  from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
64
+ AgentStackFrame,
65
+ AgentState,
52
66
  FlowStackFrameType,
53
67
  )
54
68
  from rasa.dialogue_understanding.stack.utils import (
55
- top_user_flow_frame,
69
+ user_frames_on_the_stack,
56
70
  )
71
+ from rasa.dialogue_understanding.utils import assemble_options_string
72
+ from rasa.shared.agents.utils import get_protocol_type
57
73
  from rasa.shared.constants import RASA_PATTERN_HUMAN_HANDOFF
58
74
  from rasa.shared.core.constants import (
75
+ ACTION_AGENT_REQUEST_USER_INPUT_NAME,
59
76
  ACTION_LISTEN_NAME,
77
+ ACTION_METADATA_MESSAGE_KEY,
78
+ ACTION_METADATA_TEXT_KEY,
79
+ ACTION_SEND_TEXT_NAME,
80
+ FLOW_HASHES_SLOT,
60
81
  SILENCE_TIMEOUT_SLOT,
61
82
  )
62
83
  from rasa.shared.core.events import (
84
+ AgentCancelled,
85
+ AgentCompleted,
86
+ AgentResumed,
87
+ AgentStarted,
63
88
  Event,
64
89
  FlowCompleted,
65
90
  FlowResumed,
@@ -67,11 +92,7 @@ from rasa.shared.core.events import (
67
92
  SlotSet,
68
93
  )
69
94
  from rasa.shared.core.flows import FlowsList
70
- from rasa.shared.core.flows.flow import (
71
- END_STEP,
72
- Flow,
73
- FlowStep,
74
- )
95
+ from rasa.shared.core.flows.flow import END_STEP, Flow, FlowStep
75
96
  from rasa.shared.core.flows.flow_step_links import (
76
97
  ElseFlowStepLink,
77
98
  IfFlowStepLink,
@@ -88,15 +109,19 @@ from rasa.shared.core.flows.steps import (
88
109
  SetSlotsFlowStep,
89
110
  )
90
111
  from rasa.shared.core.flows.steps.constants import START_STEP
91
- from rasa.shared.core.slots import Slot, SlotRejection
92
- from rasa.shared.core.trackers import (
93
- DialogueStateTracker,
94
- )
112
+ from rasa.shared.core.slots import CategoricalSlot, Slot, SlotRejection
113
+ from rasa.shared.core.trackers import DialogueStateTracker
114
+ from rasa.shared.utils.llm import tracker_as_readable_transcript
95
115
 
96
116
  structlogger = structlog.get_logger()
97
117
 
98
118
  MAX_NUMBER_OF_STEPS = 250
99
119
 
120
+ MAX_AGENT_RETRIES = 3
121
+
122
+ # Slots that should not be forwarded to sub-agents via AgentInput
123
+ SLOTS_EXCLUDED_FOR_AGENT = [FLOW_HASHES_SLOT]
124
+
100
125
 
101
126
  def render_template_variables(text: str, context: Dict[Text, Any]) -> str:
102
127
  """Replace context variables in a text."""
@@ -148,6 +173,13 @@ def select_next_step_id(
148
173
  tracker: DialogueStateTracker,
149
174
  ) -> Optional[Text]:
150
175
  """Selects the next step id based on the current step."""
176
+ # if the current step is a call step to an agent, and we already have an
177
+ # AgentStackFrame on top of the stack, we need to return the current
178
+ # step id again in order to loop back to the agent.
179
+ agent_stack_frame = tracker.stack.top()
180
+ if agent_stack_frame and isinstance(agent_stack_frame, AgentStackFrame):
181
+ return current.id
182
+
151
183
  next_step = current.next
152
184
  if len(next_step.links) == 1 and isinstance(next_step.links[0], StaticFlowStepLink):
153
185
  return next_step.links[0].target
@@ -234,38 +266,58 @@ def trigger_pattern_continue_interrupted(
234
266
  stack: DialogueStack,
235
267
  flows: FlowsList,
236
268
  tracker: DialogueStateTracker,
237
- ) -> List[Event]:
269
+ ) -> None:
238
270
  """Trigger the pattern to continue an interrupted flow if needed."""
239
- events: List[Event] = []
240
-
241
- # get previously started user flow that will be continued
242
- interrupted_user_flow_frame = top_user_flow_frame(stack)
243
- interrupted_user_flow_step = (
244
- interrupted_user_flow_frame.step(flows) if interrupted_user_flow_frame else None
245
- )
246
- interrupted_user_flow = (
247
- interrupted_user_flow_frame.flow(flows) if interrupted_user_flow_frame else None
248
- )
249
-
271
+ # only trigger the pattern if the current frame is a user flow frame
272
+ # with a frame type of interrupt
250
273
  if (
251
- isinstance(current_frame, UserFlowStackFrame)
252
- and interrupted_user_flow_step is not None
253
- and interrupted_user_flow is not None
254
- and current_frame.frame_type == FlowStackFrameType.INTERRUPT
255
- and not is_step_end_of_flow(interrupted_user_flow_step)
274
+ not isinstance(current_frame, UserFlowStackFrame)
275
+ or current_frame.frame_type != FlowStackFrameType.INTERRUPT
256
276
  ):
257
- stack.push(
258
- ContinueInterruptedPatternFlowStackFrame(
259
- previous_flow_name=interrupted_user_flow.readable_name(
260
- language=tracker.current_language
261
- ),
262
- )
277
+ return None
278
+
279
+ # get all previously interrupted user flows
280
+ interrupted_user_flow_stack_frames = user_frames_on_the_stack(stack)
281
+
282
+ interrupted_user_flows_to_continue: List[UserFlowStackFrame] = []
283
+ # check if interrupted user flows can be continued
284
+ # i.e. the flow is not at the end of the flow
285
+ for frame in interrupted_user_flow_stack_frames:
286
+ interrupted_user_flow_step = frame.step(flows)
287
+ interrupted_user_flow = frame.flow(flows)
288
+ if (
289
+ interrupted_user_flow_step is not None
290
+ and interrupted_user_flow is not None
291
+ and not is_step_end_of_flow(interrupted_user_flow_step)
292
+ ):
293
+ interrupted_user_flows_to_continue.append(frame)
294
+
295
+ # if there are no interrupted user flows to continue,
296
+ # we don't need to trigger the pattern
297
+ if len(interrupted_user_flows_to_continue) == 0:
298
+ return None
299
+
300
+ # get the flow names and ids of the interrupted flows
301
+ # and assemble the options string
302
+ flow_names: List[str] = []
303
+ flow_ids: List[str] = []
304
+ for frame in interrupted_user_flows_to_continue:
305
+ flow_names.append(
306
+ frame.flow(flows).readable_name(language=tracker.current_language)
263
307
  )
264
- events.append(
265
- FlowResumed(interrupted_user_flow.id, interrupted_user_flow_step.id)
308
+ flow_ids.append(frame.flow_id)
309
+ options_string = assemble_options_string(flow_names)
310
+
311
+ # trigger the pattern to continue the interrupted flows
312
+ stack.push(
313
+ ContinueInterruptedPatternFlowStackFrame(
314
+ interrupted_flow_names=flow_names,
315
+ interrupted_flow_ids=flow_ids,
316
+ interrupted_flow_options=options_string,
266
317
  )
318
+ )
267
319
 
268
- return events
320
+ return None
269
321
 
270
322
 
271
323
  def trigger_pattern_completed(
@@ -359,8 +411,11 @@ def reset_scoped_slots(
359
411
  return events
360
412
 
361
413
 
362
- def advance_flows(
363
- tracker: DialogueStateTracker, available_actions: List[str], flows: FlowsList
414
+ async def advance_flows(
415
+ tracker: DialogueStateTracker,
416
+ available_actions: List[str],
417
+ flows: FlowsList,
418
+ slots: List[Slot],
364
419
  ) -> FlowActionPrediction:
365
420
  """Advance the current flows until the next action.
366
421
 
@@ -368,6 +423,7 @@ def advance_flows(
368
423
  tracker: The tracker to get the next action for.
369
424
  available_actions: The actions that are available in the domain.
370
425
  flows: All flows.
426
+ slots: The slots that are available in the domain.
371
427
 
372
428
  Returns:
373
429
  The predicted action and the events to run.
@@ -377,13 +433,16 @@ def advance_flows(
377
433
  # if there are no flows, there is nothing to do
378
434
  return FlowActionPrediction(None, 0.0)
379
435
 
380
- return advance_flows_until_next_action(tracker, available_actions, flows)
436
+ return await advance_flows_until_next_action(
437
+ tracker, available_actions, flows, slots
438
+ )
381
439
 
382
440
 
383
- def advance_flows_until_next_action(
441
+ async def advance_flows_until_next_action(
384
442
  tracker: DialogueStateTracker,
385
443
  available_actions: List[str],
386
444
  flows: FlowsList,
445
+ slots: List[Slot],
387
446
  ) -> FlowActionPrediction:
388
447
  """Advance the flow and select the next action to execute.
389
448
 
@@ -441,7 +500,7 @@ def advance_flows_until_next_action(
441
500
 
442
501
  with bound_contextvars(step_id=next_step.id):
443
502
  step_stack = tracker.stack
444
- step_result = run_step(
503
+ step_result = await run_step(
445
504
  next_step,
446
505
  current_flow,
447
506
  step_stack,
@@ -449,6 +508,7 @@ def advance_flows_until_next_action(
449
508
  available_actions,
450
509
  flows,
451
510
  previous_step_id,
511
+ slots,
452
512
  )
453
513
  new_events = step_result.events
454
514
  if (
@@ -477,10 +537,9 @@ def advance_flows_until_next_action(
477
537
  # make sure we really return all events that got created during the
478
538
  # step execution of all steps (not only the last one)
479
539
  prediction.events = gathered_events
480
- prediction.metadata = {
481
- ACTIVE_FLOW_METADATA_KEY: tracker.active_flow,
482
- STEP_ID_METADATA_KEY: tracker.current_step_id,
483
- }
540
+ prediction.metadata = prediction.metadata or {}
541
+ prediction.metadata[ACTIVE_FLOW_METADATA_KEY] = tracker.active_flow
542
+ prediction.metadata[STEP_ID_METADATA_KEY] = tracker.current_step_id
484
543
  return prediction
485
544
  else:
486
545
  structlogger.warning("flow.step.execution.no_action")
@@ -522,6 +581,8 @@ def validate_collect_step(
522
581
 
523
582
  def cancel_flow_and_push_internal_error(stack: DialogueStack, flow_name: str) -> None:
524
583
  """Cancel the top user flow and push the internal error pattern."""
584
+ from rasa.dialogue_understanding.commands import CancelFlowCommand
585
+
525
586
  top_frame = stack.top()
526
587
 
527
588
  if isinstance(top_frame, BaseFlowStackFrame):
@@ -550,7 +611,7 @@ def attach_stack_metadata_to_events(
550
611
  event.metadata[ACTIVE_FLOW_METADATA_KEY] = flow_id
551
612
 
552
613
 
553
- def run_step(
614
+ async def run_step(
554
615
  step: FlowStep,
555
616
  flow: Flow,
556
617
  stack: DialogueStack,
@@ -558,6 +619,7 @@ def run_step(
558
619
  available_actions: List[str],
559
620
  flows: FlowsList,
560
621
  previous_step_id: str,
622
+ slots: List[Slot],
561
623
  ) -> FlowStepResult:
562
624
  """Run a single step of a flow.
563
625
 
@@ -576,6 +638,7 @@ def run_step(
576
638
  available_actions: The actions that are available in the domain.
577
639
  flows: All flows.
578
640
  previous_step_id: The ID of the previous step.
641
+ slots: The slots that are available in the domain.
579
642
 
580
643
  Returns:
581
644
  A result of running the step describing where to transition to.
@@ -615,7 +678,7 @@ def run_step(
615
678
  return _run_link_step(initial_events, stack, step)
616
679
 
617
680
  elif isinstance(step, CallFlowStep):
618
- return _run_call_step(initial_events, stack, step)
681
+ return await _run_call_step(initial_events, stack, step, tracker, slots)
619
682
 
620
683
  elif isinstance(step, SetSlotsFlowStep):
621
684
  return _run_set_slot_step(initial_events, step)
@@ -667,12 +730,10 @@ def _run_end_step(
667
730
  structlogger.debug("flow.step.run.flow_end")
668
731
  current_frame = stack.pop()
669
732
  trigger_pattern_completed(current_frame, stack, flows)
670
- resumed_events = trigger_pattern_continue_interrupted(
671
- current_frame, stack, flows, tracker
672
- )
733
+ trigger_pattern_continue_interrupted(current_frame, stack, flows, tracker)
673
734
  reset_events: List[Event] = reset_scoped_slots(current_frame, flow, tracker)
674
735
  return ContinueFlowWithNextStep(
675
- events=initial_events + reset_events + resumed_events, has_flow_ended=True
736
+ events=initial_events + reset_events, has_flow_ended=True
676
737
  )
677
738
 
678
739
 
@@ -684,17 +745,26 @@ def _run_set_slot_step(
684
745
  return ContinueFlowWithNextStep(events=initial_events + slot_events)
685
746
 
686
747
 
687
- def _run_call_step(
688
- initial_events: List[Event], stack: DialogueStack, step: CallFlowStep
748
+ async def _run_call_step(
749
+ initial_events: List[Event],
750
+ stack: DialogueStack,
751
+ step: CallFlowStep,
752
+ tracker: DialogueStateTracker,
753
+ slots: List[Slot],
689
754
  ) -> FlowStepResult:
690
755
  structlogger.debug("flow.step.run.call")
691
- stack.push(
692
- UserFlowStackFrame(
693
- flow_id=step.call,
694
- frame_type=FlowStackFrameType.CALL,
695
- ),
696
- )
697
- return ContinueFlowWithNextStep(events=initial_events)
756
+ if step.is_calling_mcp_tool():
757
+ return await call_mcp_tool(initial_events, stack, step, tracker)
758
+ elif step.is_calling_agent():
759
+ return await run_agent(initial_events, stack, step, tracker, slots)
760
+ else:
761
+ stack.push(
762
+ UserFlowStackFrame(
763
+ flow_id=step.call,
764
+ frame_type=FlowStackFrameType.CALL,
765
+ ),
766
+ )
767
+ return ContinueFlowWithNextStep(events=initial_events)
698
768
 
699
769
 
700
770
  def _run_link_step(
@@ -740,14 +810,7 @@ def _run_action_step(
740
810
  # do not log about non-existing validation actions of collect steps
741
811
  utter_action_name = render_template_variables("{{context.utter}}", context)
742
812
  if utter_action_name not in available_actions:
743
- structlogger.warning(
744
- "flow.step.run.action.unknown",
745
- action=action_name,
746
- event_info=(
747
- f"The action '{action_name}' is not defined in the domain but "
748
- f"getting triggered by the flow '{step.flow_id}'."
749
- ),
750
- )
813
+ structlogger.warning("flow.step.run.action.unknown", action=action_name)
751
814
  return ContinueFlowWithNextStep(events=initial_events)
752
815
 
753
816
 
@@ -839,3 +902,386 @@ def _append_global_silence_timeout_event(
839
902
  AvailableEndpoints.get_instance().interaction_handling.global_silence_timeout,
840
903
  )
841
904
  )
905
+
906
+
907
+ def _reset_slots_covered_by_exit_if(
908
+ exit_conditions: List[str], tracker: DialogueStateTracker
909
+ ) -> None:
910
+ """Reset the slots covered by the exit_if condition."""
911
+ reset_slot_names = get_slot_names_from_exit_conditions(exit_conditions)
912
+ for slot_name in reset_slot_names:
913
+ if tracker.slots.get(slot_name) is not None:
914
+ tracker.update(SlotSet(slot_name, None))
915
+
916
+
917
+ async def run_agent(
918
+ initial_events: List[Event],
919
+ stack: DialogueStack,
920
+ step: CallFlowStep,
921
+ tracker: DialogueStateTracker,
922
+ slots: List[Slot],
923
+ ) -> FlowStepResult:
924
+ """Run an agent call step."""
925
+ structlogger.debug(
926
+ "flow.step.run_agent", agent_id=step.call, step_id=step.id, flow_id=step.flow_id
927
+ )
928
+
929
+ final_events = initial_events
930
+ agent_stack_frame = tracker.stack.find_agent_stack_frame_by_agent(
931
+ agent_id=step.call
932
+ )
933
+
934
+ if (
935
+ agent_stack_frame
936
+ and agent_stack_frame == stack.top()
937
+ and agent_stack_frame.state == AgentState.INTERRUPTED
938
+ ):
939
+ structlogger.debug(
940
+ "flow.step.run_agent.resume_interrupted_agent",
941
+ agent_id=step.call,
942
+ step_id=step.id,
943
+ flow_id=step.flow_id,
944
+ )
945
+ # The agent was previously interrupted when waiting for user input.
946
+ # Now we're back to the agent execution step and need to output the last message
947
+ # from the agent (user input request) again and wait for user input
948
+ cast(AgentStackFrame, stack.top()).state = AgentState.WAITING_FOR_INPUT
949
+ tracker.update_stack(stack)
950
+ utterance = (
951
+ agent_stack_frame.metadata.get(AGENT_METADATA_AGENT_RESPONSE_KEY, "")
952
+ if agent_stack_frame.metadata
953
+ else ""
954
+ )
955
+ final_events.append(AgentResumed(agent_id=step.call, flow_id=step.flow_id))
956
+ return PauseFlowReturnPrediction(
957
+ _create_agent_request_user_input_prediction(utterance, final_events)
958
+ )
959
+
960
+ agent_input_metadata = (
961
+ agent_stack_frame.metadata
962
+ if agent_stack_frame and agent_stack_frame.metadata
963
+ else {}
964
+ )
965
+ _update_agent_input_metadata_with_events(
966
+ agent_input_metadata, step.call, step.flow_id, tracker
967
+ )
968
+ if step.exit_if:
969
+ # TODO: this is a temporary fix to reset the slots covered by the exit_if
970
+ if (
971
+ agent_stack_frame
972
+ and agent_stack_frame.frame_id == f"restart_agent_{step.call}"
973
+ ):
974
+ # when restarting an agent, we need to reset the slots covered by the
975
+ # exit_if condition so that the agent can run again.
976
+ _reset_slots_covered_by_exit_if(step.exit_if, tracker)
977
+ agent_input_metadata[AGENT_METADATA_EXIT_IF_KEY] = step.exit_if
978
+ agent_input = AgentInput(
979
+ id=step.call,
980
+ user_message=tracker.latest_message.text or ""
981
+ if tracker.latest_message
982
+ else "",
983
+ slots=_prepare_slots_for_agent(tracker.current_slot_values(), slots),
984
+ conversation_history=tracker_as_readable_transcript(tracker),
985
+ events=tracker.current_state().get("events") or [],
986
+ metadata=agent_input_metadata,
987
+ )
988
+
989
+ final_events.append(AgentStarted(step.call, step.flow_id))
990
+
991
+ protocol_type = get_protocol_type(step, AvailableAgents.get_agent_config(step.call))
992
+ # send the input to the agent and wait for a response
993
+ structlogger.debug(
994
+ "flow.step.run_agent.agent_input",
995
+ agent_name=step.call,
996
+ step_id=step.id,
997
+ flow_id=step.flow_id,
998
+ agent_input=agent_input,
999
+ )
1000
+ output: AgentOutput = await _call_agent_with_retry(
1001
+ agent_name=step.call,
1002
+ protocol_type=protocol_type,
1003
+ agent_input=agent_input,
1004
+ max_retries=MAX_AGENT_RETRIES,
1005
+ )
1006
+ structlogger.debug(
1007
+ "flow.step.run_agent.agent_response",
1008
+ agent_name=step.call,
1009
+ step_id=step.id,
1010
+ flow_id=step.flow_id,
1011
+ agent_response=output,
1012
+ )
1013
+
1014
+ # add the set slot events returned by the agent to the list of final events
1015
+ if output.events:
1016
+ final_events.extend(output.events)
1017
+
1018
+ if output.status == AgentStatus.INPUT_REQUIRED:
1019
+ output.metadata = output.metadata or {}
1020
+ output.metadata[AGENT_METADATA_AGENT_RESPONSE_KEY] = (
1021
+ output.response_message or ""
1022
+ )
1023
+ output.metadata[AGENT_METADATA_TOOL_RESULTS_KEY] = output.tool_results or []
1024
+ _update_agent_events(final_events, output.metadata)
1025
+
1026
+ top_stack_frame = stack.top()
1027
+ # update the agent stack frame if it is already on the stack
1028
+ # otherwise push a new one
1029
+ if isinstance(top_stack_frame, AgentStackFrame):
1030
+ top_stack_frame.state = AgentState.WAITING_FOR_INPUT
1031
+ top_stack_frame.metadata = output.metadata
1032
+ top_stack_frame.step_id = step.id
1033
+ top_stack_frame.agent_id = step.call
1034
+ top_stack_frame.flow_id = step.flow_id
1035
+ else:
1036
+ stack.push(
1037
+ AgentStackFrame(
1038
+ flow_id=step.flow_id,
1039
+ agent_id=step.call,
1040
+ state=AgentState.WAITING_FOR_INPUT,
1041
+ step_id=step.id,
1042
+ metadata=output.metadata,
1043
+ )
1044
+ )
1045
+
1046
+ action_prediction = _create_agent_request_user_input_prediction(
1047
+ output.response_message, final_events
1048
+ )
1049
+ return PauseFlowReturnPrediction(action_prediction)
1050
+ elif output.status == AgentStatus.COMPLETED:
1051
+ output.metadata = output.metadata or {}
1052
+ _update_agent_events(final_events, output.metadata)
1053
+ structlogger.debug(
1054
+ "flow.step.run_agent.completed",
1055
+ agent_name=step.call,
1056
+ step_id=step.id,
1057
+ flow_id=step.flow_id,
1058
+ )
1059
+ remove_agent_stack_frame(stack, step.call)
1060
+ agent_completed_event = AgentCompleted(agent_id=step.call, flow_id=step.flow_id)
1061
+ final_events.append(agent_completed_event)
1062
+ if output.response_message:
1063
+ # for open-ended agents we want to utter the last agent message
1064
+
1065
+ return PauseFlowReturnPrediction(
1066
+ _create_send_text_prediction(output.response_message, final_events)
1067
+ )
1068
+ else:
1069
+ return ContinueFlowWithNextStep(events=final_events)
1070
+ elif output.status == AgentStatus.FATAL_ERROR:
1071
+ output.metadata = output.metadata or {}
1072
+ _update_agent_events(final_events, output.metadata)
1073
+ # the agent failed, trigger pattern_internal_error
1074
+ structlogger.error(
1075
+ "flow.step.run_agent.fatal_error",
1076
+ agent_name=step.call,
1077
+ step_id=step.id,
1078
+ flow_id=step.flow_id,
1079
+ error_message=output.error_message,
1080
+ )
1081
+ remove_agent_stack_frame(stack, step.call)
1082
+ final_events.append(
1083
+ AgentCancelled(
1084
+ agent_id=step.call, flow_id=step.flow_id, reason=output.error_message
1085
+ )
1086
+ )
1087
+ stack.push(InternalErrorPatternFlowStackFrame())
1088
+ return ContinueFlowWithNextStep(events=final_events)
1089
+ else:
1090
+ output.metadata = output.metadata or {}
1091
+ _update_agent_events(final_events, output.metadata)
1092
+ structlogger.error(
1093
+ "flow.step.run_agent.unknown_status",
1094
+ agent_name=step.call,
1095
+ step_id=step.id,
1096
+ flow_id=step.flow_id,
1097
+ status=output.status,
1098
+ )
1099
+ remove_agent_stack_frame(stack, step.call)
1100
+ final_events.append(AgentCancelled(agent_id=step.call, flow_id=step.flow_id))
1101
+ stack.push(InternalErrorPatternFlowStackFrame())
1102
+ return ContinueFlowWithNextStep(events=final_events)
1103
+
1104
+
1105
+ def remove_agent_stack_frame(stack: DialogueStack, agent_id: str) -> None:
1106
+ """Finishes the agentic loop by popping the agent stack frame from the
1107
+ provided `stack`. The `tracker.stack` is NOT modified.
1108
+ """
1109
+ agent_stack_frame = stack.find_agent_stack_frame_by_agent(agent_id)
1110
+ if not agent_stack_frame:
1111
+ return
1112
+
1113
+ while removed_frame := stack.pop():
1114
+ structlogger.debug(
1115
+ "flow_executor.remove_agent_stack_frame",
1116
+ removed_frame=removed_frame,
1117
+ )
1118
+ if removed_frame == agent_stack_frame:
1119
+ break
1120
+
1121
+
1122
+ def _create_action_prediction(
1123
+ action_name: str, message: Optional[str], events: Optional[List[Event]]
1124
+ ) -> FlowActionPrediction:
1125
+ """Create a prediction for an action with a text message."""
1126
+ action_metadata = {
1127
+ ACTION_METADATA_MESSAGE_KEY: {
1128
+ ACTION_METADATA_TEXT_KEY: message,
1129
+ }
1130
+ }
1131
+ return FlowActionPrediction(
1132
+ action_name,
1133
+ 1.0,
1134
+ events=events if events else [],
1135
+ metadata=action_metadata,
1136
+ )
1137
+
1138
+
1139
+ def _create_agent_request_user_input_prediction(
1140
+ message: Optional[str], events: Optional[List[Event]]
1141
+ ) -> FlowActionPrediction:
1142
+ """Create a prediction for requesting user input from the agent
1143
+ and waiting for it.
1144
+ """
1145
+ return _create_action_prediction(
1146
+ ACTION_AGENT_REQUEST_USER_INPUT_NAME, message, events
1147
+ )
1148
+
1149
+
1150
+ def _create_send_text_prediction(
1151
+ message: Optional[str], events: Optional[List[Event]]
1152
+ ) -> FlowActionPrediction:
1153
+ """Create a prediction for sending a text message to the user."""
1154
+ return _create_action_prediction(ACTION_SEND_TEXT_NAME, message, events)
1155
+
1156
+
1157
+ async def _call_agent_with_retry(
1158
+ agent_name: str,
1159
+ protocol_type: ProtocolType,
1160
+ agent_input: AgentInput,
1161
+ max_retries: int,
1162
+ ) -> AgentOutput:
1163
+ """Call an agent with retries in case of recoverable errors."""
1164
+ for attempt in range(max_retries):
1165
+ if attempt > 0:
1166
+ structlogger.debug(
1167
+ "flow_executor.call_agent_with_retry.retrying",
1168
+ agent_name=agent_name,
1169
+ attempt=attempt + 1,
1170
+ num_retries=max_retries,
1171
+ )
1172
+ try:
1173
+ agent_response: AgentOutput = await AgentManager().run_agent(
1174
+ agent_name=agent_name, protocol_type=protocol_type, context=agent_input
1175
+ )
1176
+ except Exception as e:
1177
+ # We don't have a vaild agent response at this time to act based
1178
+ # on the agent status, so we return a fatal error.
1179
+ structlogger.error(
1180
+ "flow_executor.call_agent_with_retry.exception",
1181
+ agent_name=agent_name,
1182
+ error_message=str(e),
1183
+ )
1184
+ return AgentOutput(
1185
+ id=agent_name,
1186
+ status=AgentStatus.FATAL_ERROR,
1187
+ error_message=str(e),
1188
+ )
1189
+
1190
+ if agent_response.status != AgentStatus.RECOVERABLE_ERROR:
1191
+ return agent_response
1192
+
1193
+ structlogger.warning(
1194
+ "flow_executor.call_agent_with_retry.recoverable_error",
1195
+ agent_name=agent_name,
1196
+ attempt=attempt + 1,
1197
+ num_retries=max_retries,
1198
+ error_message=agent_response.error_message,
1199
+ )
1200
+ if attempt < max_retries - 1:
1201
+ # exponential backoff - wait longer with each retry
1202
+ # 1 second, 2 seconds, 4 seconds, etc.
1203
+ await asyncio.sleep(min(2**attempt, MAX_AGENT_RETRY_DELAY_SECONDS))
1204
+
1205
+ # we exhausted all retries, return fatal error
1206
+ structlogger.warning(
1207
+ "flow_executor.call_agent_with_retry.exhausted_retries",
1208
+ agent_name=agent_name,
1209
+ num_retries=max_retries,
1210
+ )
1211
+ return AgentOutput(
1212
+ id=agent_name,
1213
+ status=AgentStatus.FATAL_ERROR,
1214
+ error_message="Exhausted all retries for agent call.",
1215
+ )
1216
+
1217
+
1218
+ def _prepare_slots_for_agent(
1219
+ slot_values: Dict[str, Any], slot_definitions: List[Slot]
1220
+ ) -> List[AgentInputSlot]:
1221
+ """Prepare the slots for the agent.
1222
+
1223
+ Filter out slots that should not be forwarded to agents.
1224
+ Add the slot type and allowed values to the slot dictionary.
1225
+
1226
+ Args:
1227
+ slot_values: The full slot dictionary from the tracker.
1228
+ slot_definitions: The slot definitions from the domain.
1229
+
1230
+ Returns:
1231
+ A list of slots containing the name, current value, type, and allowed values.
1232
+ """
1233
+
1234
+ def _get_slot_definition(slot_name: str) -> Optional[Slot]:
1235
+ for slot in slot_definitions:
1236
+ if slot.name == slot_name:
1237
+ return slot
1238
+ return None
1239
+
1240
+ filtered_slots: List[AgentInputSlot] = []
1241
+ for key, value in slot_values.items():
1242
+ if key in SLOTS_EXCLUDED_FOR_AGENT:
1243
+ continue
1244
+ slot_definition = _get_slot_definition(key)
1245
+ if slot_definition:
1246
+ filtered_slots.append(
1247
+ AgentInputSlot(
1248
+ name=key,
1249
+ value=value,
1250
+ type=slot_definition.type_name if slot_definition else "any",
1251
+ allowed_values=slot_definition.values
1252
+ if isinstance(slot_definition, CategoricalSlot)
1253
+ else None,
1254
+ )
1255
+ )
1256
+
1257
+ return filtered_slots
1258
+
1259
+
1260
+ def _update_agent_events(events: List[Event], metadata: Dict[str, Any]) -> None:
1261
+ """Update the agent events based on the agent output metadata if needed."""
1262
+ if A2A_AGENT_CONTEXT_ID_KEY in metadata:
1263
+ # If the context ID is present, we need to store it in the AgentStarted
1264
+ # event, so that it can be re-used later in case the agent is restarted.
1265
+ for event in events:
1266
+ if isinstance(event, AgentStarted):
1267
+ event.context_id = metadata[A2A_AGENT_CONTEXT_ID_KEY]
1268
+
1269
+
1270
+ def _update_agent_input_metadata_with_events(
1271
+ metadata: Dict[str, Any], agent_id: str, flow_id: str, tracker: DialogueStateTracker
1272
+ ) -> None:
1273
+ """Update the agent input metadata with the events."""
1274
+ agent_started_events = [
1275
+ event
1276
+ for event in tracker.events
1277
+ if type(event) == AgentStarted
1278
+ and event.agent_id == agent_id
1279
+ and event.flow_id == flow_id
1280
+ ]
1281
+ if agent_started_events:
1282
+ # If we have context ID from the previous agent run, we want to
1283
+ # include it in the metadata so that the agent can continue the same
1284
+ # context.
1285
+ agent_started_event = agent_started_events[-1]
1286
+ if agent_started_event.context_id:
1287
+ metadata[A2A_AGENT_CONTEXT_ID_KEY] = agent_started_event.context_id