rasa-pro 3.14.0.dev20250901__py3-none-any.whl → 3.14.0rc1__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 (584) hide show
  1. rasa/__main__.py +15 -3
  2. rasa/agents/__init__.py +0 -0
  3. rasa/agents/agent_factory.py +122 -0
  4. rasa/agents/agent_manager.py +211 -0
  5. rasa/agents/constants.py +43 -0
  6. rasa/agents/core/__init__.py +0 -0
  7. rasa/agents/core/agent_protocol.py +107 -0
  8. rasa/agents/core/types.py +81 -0
  9. rasa/agents/exceptions.py +38 -0
  10. rasa/agents/protocol/__init__.py +5 -0
  11. rasa/agents/protocol/a2a/__init__.py +0 -0
  12. rasa/agents/protocol/a2a/a2a_agent.py +879 -0
  13. rasa/agents/protocol/mcp/__init__.py +0 -0
  14. rasa/agents/protocol/mcp/mcp_base_agent.py +726 -0
  15. rasa/agents/protocol/mcp/mcp_open_agent.py +327 -0
  16. rasa/agents/protocol/mcp/mcp_task_agent.py +522 -0
  17. rasa/agents/schemas/__init__.py +13 -0
  18. rasa/agents/schemas/agent_input.py +38 -0
  19. rasa/agents/schemas/agent_output.py +26 -0
  20. rasa/agents/schemas/agent_tool_result.py +65 -0
  21. rasa/agents/schemas/agent_tool_schema.py +186 -0
  22. rasa/agents/templates/__init__.py +0 -0
  23. rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +20 -0
  24. rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +22 -0
  25. rasa/agents/utils.py +206 -0
  26. rasa/agents/validation.py +485 -0
  27. rasa/api.py +24 -9
  28. rasa/builder/config.py +7 -2
  29. rasa/builder/copilot/constants.py +3 -0
  30. rasa/builder/copilot/copilot.py +128 -54
  31. rasa/builder/copilot/models.py +39 -3
  32. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +183 -188
  33. rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +61 -0
  34. rasa/builder/copilot/telemetry.py +46 -20
  35. rasa/builder/document_retrieval/models.py +3 -3
  36. rasa/builder/download.py +1 -8
  37. rasa/builder/guardrails/{lakera.py → clients.py} +55 -5
  38. rasa/builder/guardrails/constants.py +3 -0
  39. rasa/builder/guardrails/models.py +45 -10
  40. rasa/builder/guardrails/policy_checker.py +324 -0
  41. rasa/builder/guardrails/utils.py +42 -276
  42. rasa/builder/jobs.py +33 -21
  43. rasa/builder/llm_service.py +32 -5
  44. rasa/builder/main.py +38 -62
  45. rasa/builder/models.py +8 -7
  46. rasa/builder/project_generator.py +149 -148
  47. rasa/builder/service.py +58 -40
  48. rasa/builder/template_cache.py +69 -0
  49. rasa/builder/training_service.py +84 -20
  50. rasa/builder/validation_service.py +1 -1
  51. rasa/cli/arguments/default_arguments.py +12 -0
  52. rasa/cli/arguments/run.py +2 -0
  53. rasa/cli/arguments/train.py +2 -0
  54. rasa/cli/data.py +10 -8
  55. rasa/cli/dialogue_understanding_test.py +10 -7
  56. rasa/cli/e2e_test.py +9 -6
  57. rasa/cli/evaluate.py +4 -2
  58. rasa/cli/export.py +5 -2
  59. rasa/cli/inspect.py +8 -4
  60. rasa/cli/interactive.py +5 -4
  61. rasa/cli/llm_fine_tuning.py +11 -6
  62. rasa/cli/project_templates/basic/README.md +23 -0
  63. rasa/cli/project_templates/basic/actions/actions.md +10 -0
  64. rasa/cli/project_templates/basic/config.yml +6 -4
  65. rasa/cli/project_templates/basic/data/data.md +5 -6
  66. rasa/cli/project_templates/basic/domain/domain.md +7 -5
  67. rasa/cli/project_templates/basic/domain/general/show_faqs.yml +1 -1
  68. rasa/cli/project_templates/basic/endpoints.yml +5 -1
  69. rasa/cli/project_templates/default/config.yml +4 -0
  70. rasa/cli/project_templates/default/endpoints.yml +4 -0
  71. rasa/cli/project_templates/finance/README.md +26 -0
  72. rasa/cli/project_templates/finance/actions/__init__.py +0 -46
  73. rasa/cli/project_templates/finance/actions/accounts/check_balance.py +18 -0
  74. rasa/cli/project_templates/finance/actions/actions.md +15 -0
  75. rasa/cli/project_templates/finance/actions/{transfers/action_process_immediate_payment.py → cards/check_that_card_exists.py} +6 -3
  76. rasa/cli/project_templates/finance/actions/cards/list_cards.py +22 -0
  77. rasa/cli/project_templates/finance/actions/contacts/__init__.py +0 -0
  78. rasa/cli/project_templates/finance/actions/contacts/add_contact.py +30 -0
  79. rasa/cli/project_templates/finance/actions/contacts/list_contacts.py +22 -0
  80. rasa/cli/project_templates/finance/actions/contacts/remove_contact.py +35 -0
  81. rasa/cli/project_templates/finance/actions/db.py +117 -0
  82. rasa/cli/project_templates/finance/actions/general/__init__.py +0 -0
  83. rasa/cli/project_templates/finance/actions/general/action_human_handoff.py +49 -0
  84. rasa/cli/project_templates/finance/actions/transfers/check_transfer_funds.py +27 -0
  85. rasa/cli/project_templates/finance/actions/transfers/check_transfer_limit.py +36 -0
  86. rasa/cli/project_templates/finance/actions/transfers/execute_recurrent_payment.py +20 -0
  87. rasa/cli/project_templates/finance/actions/transfers/execute_transfer.py +45 -0
  88. rasa/cli/project_templates/finance/actions/transfers/list_transactions.py +32 -0
  89. rasa/cli/project_templates/finance/config.yml +8 -0
  90. rasa/cli/project_templates/finance/credentials.yml +7 -6
  91. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +3 -4
  92. rasa/cli/project_templates/finance/data/accounts/download_statements.yml +26 -0
  93. rasa/cli/project_templates/finance/data/bills/bill_pay_reminder.yml +25 -0
  94. rasa/cli/project_templates/finance/data/cards/activate_card.yml +35 -0
  95. rasa/cli/project_templates/finance/data/cards/block_card.yml +37 -58
  96. rasa/cli/project_templates/finance/data/cards/list_cards.yml +14 -0
  97. rasa/cli/project_templates/finance/data/cards/replace_card.yml +16 -0
  98. rasa/cli/project_templates/finance/data/cards/replace_eligible_card.yml +29 -0
  99. rasa/cli/project_templates/finance/data/contacts/add_contact.yml +33 -0
  100. rasa/cli/project_templates/finance/data/contacts/list_contacts.yml +14 -0
  101. rasa/cli/project_templates/finance/data/contacts/remove_contact.yml +31 -0
  102. rasa/cli/project_templates/finance/data/data.md +14 -0
  103. rasa/cli/project_templates/finance/data/general/bot_challenge.yml +6 -0
  104. rasa/cli/project_templates/finance/data/general/goodbye.yml +1 -1
  105. rasa/cli/project_templates/finance/data/general/hello.yml +1 -2
  106. rasa/cli/project_templates/finance/data/general/help.yml +2 -2
  107. rasa/cli/project_templates/finance/data/general/human_handoff.yml +2 -2
  108. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +1 -1
  109. rasa/cli/project_templates/finance/data/transfers/check_transfer_limit.yml +18 -0
  110. rasa/cli/project_templates/finance/data/transfers/list_transactions.yml +46 -0
  111. rasa/cli/project_templates/finance/data/transfers/move_money_between_accounts.yml +51 -0
  112. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +29 -62
  113. rasa/cli/project_templates/finance/data/transfers/transfer_money_to_a_third_party.yml +175 -0
  114. rasa/cli/project_templates/finance/db/cards.json +18 -0
  115. rasa/cli/project_templates/finance/db/contacts.json +10 -0
  116. rasa/cli/project_templates/finance/db/my_account.json +6 -0
  117. rasa/cli/project_templates/finance/db/transactions.json +22 -0
  118. rasa/cli/project_templates/finance/docs/docs.md +8 -0
  119. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/budgeting_analytics.txt +22 -0
  120. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/multi_currency_accounts.txt +19 -0
  121. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/premium_benefits.txt +19 -0
  122. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/contactless_limits.txt +16 -0
  123. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/freeze_unfreeze_card.txt +16 -0
  124. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/lost_stolen_card.txt +19 -0
  125. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/instant_payments.txt +19 -0
  126. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/international_transfers.txt +19 -0
  127. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/fraud_protection.txt +22 -0
  128. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/secure_payments.txt +22 -0
  129. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +9 -5
  130. rasa/cli/project_templates/finance/domain/accounts/download_statements.yml +40 -0
  131. rasa/cli/project_templates/finance/domain/bills/bill_pay_reminder.yml +49 -0
  132. rasa/cli/project_templates/finance/domain/cards/activate_card.yml +24 -0
  133. rasa/cli/project_templates/finance/domain/cards/block_card.yml +33 -90
  134. rasa/cli/project_templates/finance/domain/cards/list_cards.yml +16 -0
  135. rasa/cli/project_templates/finance/domain/cards/replace_card.yml +43 -0
  136. rasa/cli/project_templates/finance/domain/cards/shared.yml +15 -0
  137. rasa/cli/project_templates/finance/domain/contacts/add_contact.yml +37 -0
  138. rasa/cli/project_templates/finance/domain/contacts/list_contacts.yml +16 -0
  139. rasa/cli/project_templates/finance/domain/contacts/remove_contact.yml +32 -0
  140. rasa/cli/project_templates/finance/domain/domain.md +18 -0
  141. rasa/cli/project_templates/finance/domain/general/_shared.yml +39 -0
  142. rasa/cli/project_templates/finance/domain/general/bot_challenge.yml +4 -0
  143. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +5 -2
  144. rasa/cli/project_templates/finance/domain/general/feedback.yml +0 -3
  145. rasa/cli/project_templates/finance/domain/general/goodbye.yml +6 -6
  146. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +10 -9
  147. rasa/cli/project_templates/finance/domain/general/welcome.yml +33 -2
  148. rasa/cli/project_templates/finance/domain/transfers/check_transfer_limit.yml +32 -0
  149. rasa/cli/project_templates/finance/domain/transfers/list_transactions.yml +44 -0
  150. rasa/cli/project_templates/finance/domain/transfers/shared.yml +17 -0
  151. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +203 -61
  152. rasa/cli/project_templates/finance/endpoints.yml +8 -4
  153. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +31 -12
  154. rasa/cli/project_templates/finance/tests/e2e_test_cases/accounts/check_balance.yml +9 -0
  155. rasa/cli/project_templates/finance/tests/e2e_test_cases/accounts/download_statements.yml +43 -0
  156. rasa/cli/project_templates/finance/tests/e2e_test_cases/cards/block_card.yml +55 -0
  157. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
  158. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/feedback.yml +46 -0
  159. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/goodbye.yml +9 -0
  160. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/hello.yml +8 -0
  161. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/human_handoff.yml +35 -0
  162. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/patterns.yml +22 -0
  163. rasa/cli/project_templates/finance/tests/e2e_test_cases/transfers/transfer_money.yml +56 -0
  164. rasa/cli/project_templates/telco/README.md +25 -0
  165. rasa/cli/project_templates/telco/actions/actions.md +12 -0
  166. rasa/cli/project_templates/telco/config.yml +6 -4
  167. rasa/cli/project_templates/telco/data/data.md +11 -0
  168. rasa/cli/project_templates/telco/data/general/human_handoff.yml +1 -1
  169. rasa/cli/project_templates/telco/docs/docs.md +3 -0
  170. rasa/cli/project_templates/telco/domain/domain.md +13 -0
  171. rasa/cli/project_templates/telco/domain/general/human_handoff.yml +3 -6
  172. rasa/cli/project_templates/telco/endpoints.yml +5 -1
  173. rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +1 -1
  174. rasa/cli/project_templates/telco/tests/e2e_test_cases/billing/understand_bill.yml +67 -0
  175. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
  176. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/feedback.yml +46 -0
  177. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/goodbye.yml +9 -0
  178. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/hello.yml +8 -0
  179. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/human_handoff.yml +35 -0
  180. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/patterns.yml +23 -0
  181. rasa/cli/project_templates/telco/tests/e2e_test_cases/network/solve_internet_issue.yml +57 -0
  182. rasa/cli/project_templates/tutorial/credentials.yml +10 -0
  183. rasa/cli/run.py +12 -10
  184. rasa/cli/scaffold.py +4 -4
  185. rasa/cli/shell.py +9 -5
  186. rasa/cli/studio/studio.py +1 -1
  187. rasa/cli/test.py +34 -14
  188. rasa/cli/train.py +41 -28
  189. rasa/cli/utils.py +1 -393
  190. rasa/cli/validation/__init__.py +0 -0
  191. rasa/cli/validation/bot_config.py +223 -0
  192. rasa/cli/validation/config_path_validation.py +257 -0
  193. rasa/cli/x.py +8 -4
  194. rasa/constants.py +7 -1
  195. rasa/core/actions/action.py +51 -10
  196. rasa/core/actions/action_run_slot_rejections.py +1 -1
  197. rasa/core/actions/direct_custom_actions_executor.py +9 -2
  198. rasa/core/actions/grpc_custom_action_executor.py +1 -1
  199. rasa/core/agent.py +19 -2
  200. rasa/core/available_agents.py +229 -0
  201. rasa/core/brokers/broker.py +1 -1
  202. rasa/core/brokers/kafka.py +52 -8
  203. rasa/core/channels/__init__.py +82 -35
  204. rasa/core/channels/development_inspector.py +4 -24
  205. rasa/core/channels/hangouts.py +2 -2
  206. rasa/core/channels/inspector/README.md +25 -13
  207. rasa/core/channels/inspector/dist/assets/{arc-18042c22.js → arc-6177260a.js} +1 -1
  208. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-fdd6bcfa.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
  209. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-f5ae6786.js → c4Diagram-3d4e48cf-f25427d5.js} +1 -1
  210. rasa/core/channels/inspector/dist/assets/channel-bf9cbb34.js +1 -0
  211. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-81efba3e.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
  212. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-3b6b6a92.js → classDiagram-v2-f2320105-58db65c0.js} +1 -1
  213. rasa/core/channels/inspector/dist/assets/clone-8f9083bb.js +1 -0
  214. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-31422447.js → createText-2e5e7dd3-088372e2.js} +1 -1
  215. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-518a90db.js → edges-e0da2a9e-58676240.js} +1 -1
  216. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-a6d3c25a.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
  217. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-e048c2be.js → flowDb-956e92f1-ea63f85c.js} +1 -1
  218. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-c7474c91.js → flowDiagram-66a62f08-a2af48cd.js} +1 -1
  219. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-9ecd5b59.js +1 -0
  220. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-cb4d8723.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
  221. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-346636a2.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
  222. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-7c508874.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
  223. rasa/core/channels/inspector/dist/assets/{graph-14702d8a.js → graph-0a6f8466.js} +1 -1
  224. rasa/core/channels/inspector/dist/assets/{index-3862675e-f18b534b.js → index-3862675e-7610671a.js} +1 -1
  225. rasa/core/channels/inspector/dist/assets/index-74e01d94.js +1354 -0
  226. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-64154b83.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
  227. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-833a5f95.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
  228. rasa/core/channels/inspector/dist/assets/{layout-5a3b2123.js → layout-e7fbc2bf.js} +1 -1
  229. rasa/core/channels/inspector/dist/assets/{line-2272a8c7.js → line-a8aa457c.js} +1 -1
  230. rasa/core/channels/inspector/dist/assets/{linear-35bcf273.js → linear-3351e0d2.js} +1 -1
  231. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-92dcb0e9.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
  232. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-94dbc900.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
  233. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-8b7a9c33.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
  234. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6f7eab81.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
  235. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-f43e581d.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
  236. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-0bcbefc3.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
  237. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-b8a74083.js → stateDiagram-587899a1-0e770395.js} +1 -1
  238. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-2070218f.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
  239. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-f1d54e34.js → styles-6aaf32cf-36a9e70d.js} +1 -1
  240. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-980de489.js → styles-9a916d00-884a8b5b.js} +1 -1
  241. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-3c03abde.js → styles-c10674c1-dc097813.js} +1 -1
  242. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-46ba068f.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
  243. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-901f5e3d.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
  244. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-acbc628a.js → xychartDiagram-e933f94c-afb6fe56.js} +1 -1
  245. rasa/core/channels/inspector/dist/index.html +1 -1
  246. rasa/core/channels/inspector/package.json +18 -18
  247. rasa/core/channels/inspector/src/App.tsx +34 -35
  248. rasa/core/channels/inspector/src/components/Chat.tsx +2 -3
  249. rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
  250. rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +4 -2
  251. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +9 -1
  252. rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +63 -35
  253. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +20 -3
  254. rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
  255. rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
  256. rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
  257. rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
  258. rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
  259. rasa/core/channels/inspector/src/types.ts +53 -7
  260. rasa/core/channels/inspector/yarn.lock +336 -189
  261. rasa/core/channels/studio_chat.py +29 -47
  262. rasa/core/channels/telegram.py +4 -9
  263. rasa/core/channels/voice_stream/asr/asr_event.py +1 -1
  264. rasa/core/channels/voice_stream/asr/azure.py +6 -3
  265. rasa/core/channels/voice_stream/asr/deepgram.py +1 -1
  266. rasa/core/channels/voice_stream/audiocodes.py +3 -0
  267. rasa/core/channels/voice_stream/browser_audio.py +55 -3
  268. rasa/core/channels/voice_stream/genesys.py +3 -2
  269. rasa/core/channels/voice_stream/jambonz.py +9 -1
  270. rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
  271. rasa/core/channels/voice_stream/twilio_media_streams.py +21 -1
  272. rasa/core/channels/voice_stream/voice_channel.py +64 -0
  273. rasa/core/concurrent_lock_store.py +66 -16
  274. rasa/core/config/__init__.py +0 -0
  275. rasa/core/{available_endpoints.py → config/available_endpoints.py} +51 -16
  276. rasa/core/config/configuration.py +260 -0
  277. rasa/core/config/credentials.py +19 -0
  278. rasa/core/config/message_procesing_config.py +34 -0
  279. rasa/core/constants.py +11 -0
  280. rasa/core/iam_credentials_providers/__init__.py +0 -0
  281. rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +226 -0
  282. rasa/core/iam_credentials_providers/credentials_provider_protocol.py +90 -0
  283. rasa/core/lock_store.py +46 -10
  284. rasa/core/nlg/generator.py +1 -1
  285. rasa/core/policies/enterprise_search_policy.py +5 -3
  286. rasa/core/policies/flow_policy.py +4 -4
  287. rasa/core/policies/flows/agent_executor.py +632 -0
  288. rasa/core/policies/flows/flow_executor.py +137 -76
  289. rasa/core/policies/flows/mcp_tool_executor.py +298 -0
  290. rasa/core/policies/intentless_policy.py +1 -1
  291. rasa/core/policies/ted_policy.py +20 -12
  292. rasa/core/policies/unexpected_intent_policy.py +6 -0
  293. rasa/core/processor.py +100 -44
  294. rasa/core/redis_connection_factory.py +469 -0
  295. rasa/core/run.py +37 -8
  296. rasa/core/test.py +4 -0
  297. rasa/core/tracker_stores/redis_tracker_store.py +32 -14
  298. rasa/core/tracker_stores/sql_tracker_store.py +57 -1
  299. rasa/core/tracker_stores/tracker_store.py +3 -7
  300. rasa/core/train.py +1 -1
  301. rasa/core/training/interactive.py +20 -18
  302. rasa/core/training/story_conflict.py +5 -5
  303. rasa/core/utils.py +22 -23
  304. rasa/dialogue_understanding/commands/__init__.py +8 -0
  305. rasa/dialogue_understanding/commands/cancel_flow_command.py +19 -5
  306. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +21 -2
  307. rasa/dialogue_understanding/commands/clarify_command.py +20 -2
  308. rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
  309. rasa/dialogue_understanding/commands/knowledge_answer_command.py +21 -2
  310. rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
  311. rasa/dialogue_understanding/commands/start_flow_command.py +68 -7
  312. rasa/dialogue_understanding/commands/utils.py +124 -2
  313. rasa/dialogue_understanding/generator/command_parser.py +4 -0
  314. rasa/dialogue_understanding/generator/llm_based_command_generator.py +50 -12
  315. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  316. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  317. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +66 -0
  318. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +66 -0
  319. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +89 -0
  320. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +88 -0
  321. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +42 -7
  322. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +40 -3
  323. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +20 -3
  324. rasa/dialogue_understanding/patterns/cancel.py +27 -6
  325. rasa/dialogue_understanding/patterns/clarify.py +3 -14
  326. rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
  327. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +46 -8
  328. rasa/dialogue_understanding/processor/command_processor.py +136 -15
  329. rasa/dialogue_understanding/stack/dialogue_stack.py +98 -2
  330. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
  331. rasa/dialogue_understanding/stack/utils.py +57 -3
  332. rasa/dialogue_understanding/utils.py +24 -4
  333. rasa/dialogue_understanding_test/du_test_runner.py +8 -3
  334. rasa/e2e_test/e2e_test_runner.py +13 -3
  335. rasa/engine/caching.py +2 -2
  336. rasa/engine/constants.py +1 -1
  337. rasa/engine/graph.py +5 -1
  338. rasa/engine/loader.py +12 -0
  339. rasa/engine/recipes/default_components.py +138 -49
  340. rasa/engine/recipes/default_recipe.py +108 -11
  341. rasa/engine/runner/dask.py +8 -5
  342. rasa/engine/storage/local_model_storage.py +41 -4
  343. rasa/engine/validation.py +19 -6
  344. rasa/graph_components/validators/default_recipe_validator.py +86 -28
  345. rasa/hooks.py +5 -5
  346. rasa/llm_fine_tuning/utils.py +2 -2
  347. rasa/model_manager/socket_bridge.py +1 -2
  348. rasa/model_manager/warm_rasa_process.py +13 -3
  349. rasa/model_training.py +60 -47
  350. rasa/nlu/classifiers/diet_classifier.py +198 -98
  351. rasa/nlu/classifiers/logistic_regression_classifier.py +1 -4
  352. rasa/nlu/classifiers/mitie_intent_classifier.py +3 -0
  353. rasa/nlu/classifiers/sklearn_intent_classifier.py +1 -3
  354. rasa/nlu/extractors/crf_entity_extractor.py +9 -10
  355. rasa/nlu/extractors/mitie_entity_extractor.py +3 -0
  356. rasa/nlu/extractors/spacy_entity_extractor.py +3 -0
  357. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +4 -0
  358. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +5 -0
  359. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +2 -0
  360. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +3 -0
  361. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +4 -2
  362. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -0
  363. rasa/nlu/selectors/response_selector.py +10 -2
  364. rasa/nlu/tokenizers/jieba_tokenizer.py +3 -4
  365. rasa/nlu/tokenizers/mitie_tokenizer.py +3 -2
  366. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -2
  367. rasa/nlu/utils/mitie_utils.py +3 -0
  368. rasa/nlu/utils/spacy_utils.py +3 -2
  369. rasa/plugin.py +8 -8
  370. rasa/privacy/privacy_manager.py +12 -3
  371. rasa/server.py +15 -3
  372. rasa/shared/agents/__init__.py +0 -0
  373. rasa/shared/agents/auth/__init__.py +0 -0
  374. rasa/shared/agents/auth/agent_auth_factory.py +105 -0
  375. rasa/shared/agents/auth/agent_auth_manager.py +92 -0
  376. rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
  377. rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
  378. rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
  379. rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
  380. rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +167 -0
  381. rasa/shared/agents/auth/constants.py +12 -0
  382. rasa/shared/agents/auth/types.py +12 -0
  383. rasa/shared/agents/utils.py +35 -0
  384. rasa/shared/constants.py +8 -0
  385. rasa/shared/core/constants.py +17 -1
  386. rasa/shared/core/domain.py +0 -7
  387. rasa/shared/core/events.py +329 -0
  388. rasa/shared/core/flows/constants.py +5 -0
  389. rasa/shared/core/flows/flow.py +1 -1
  390. rasa/shared/core/flows/flows_list.py +21 -5
  391. rasa/shared/core/flows/flows_yaml_schema.json +119 -184
  392. rasa/shared/core/flows/steps/call.py +49 -5
  393. rasa/shared/core/flows/steps/collect.py +98 -13
  394. rasa/shared/core/flows/validation.py +372 -8
  395. rasa/shared/core/flows/yaml_flows_io.py +3 -2
  396. rasa/shared/core/slots.py +2 -2
  397. rasa/shared/core/trackers.py +5 -2
  398. rasa/shared/exceptions.py +16 -0
  399. rasa/shared/importers/rasa.py +1 -1
  400. rasa/shared/importers/utils.py +9 -3
  401. rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
  402. rasa/shared/providers/llm/_base_litellm_client.py +41 -9
  403. rasa/shared/providers/llm/litellm_router_llm_client.py +8 -4
  404. rasa/shared/providers/llm/llm_client.py +7 -3
  405. rasa/shared/providers/llm/llm_response.py +66 -0
  406. rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
  407. rasa/shared/utils/common.py +24 -0
  408. rasa/shared/utils/health_check/health_check.py +7 -3
  409. rasa/shared/utils/llm.py +39 -16
  410. rasa/shared/utils/mcp/__init__.py +0 -0
  411. rasa/shared/utils/mcp/server_connection.py +247 -0
  412. rasa/shared/utils/mcp/utils.py +20 -0
  413. rasa/shared/utils/schemas/events.py +42 -0
  414. rasa/shared/utils/yaml.py +3 -1
  415. rasa/studio/pull/pull.py +3 -2
  416. rasa/studio/train.py +8 -7
  417. rasa/studio/upload.py +3 -6
  418. rasa/telemetry.py +69 -5
  419. rasa/tracing/config.py +45 -12
  420. rasa/tracing/constants.py +14 -0
  421. rasa/tracing/instrumentation/attribute_extractors.py +142 -9
  422. rasa/tracing/instrumentation/instrumentation.py +626 -21
  423. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
  424. rasa/tracing/instrumentation/metrics.py +32 -0
  425. rasa/tracing/metric_instrument_provider.py +68 -0
  426. rasa/utils/common.py +92 -1
  427. rasa/utils/endpoints.py +11 -2
  428. rasa/utils/log_utils.py +96 -5
  429. rasa/utils/ml_utils.py +1 -1
  430. rasa/utils/pypred.py +38 -0
  431. rasa/utils/tensorflow/__init__.py +7 -0
  432. rasa/utils/tensorflow/callback.py +136 -101
  433. rasa/utils/tensorflow/crf.py +1 -1
  434. rasa/utils/tensorflow/data_generator.py +21 -8
  435. rasa/utils/tensorflow/layers.py +21 -11
  436. rasa/utils/tensorflow/metrics.py +7 -3
  437. rasa/utils/tensorflow/models.py +56 -8
  438. rasa/utils/tensorflow/rasa_layers.py +8 -6
  439. rasa/utils/tensorflow/transformer.py +2 -3
  440. rasa/utils/train_utils.py +54 -24
  441. rasa/validator.py +17 -13
  442. rasa/version.py +1 -1
  443. {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/METADATA +59 -51
  444. {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/RECORD +452 -428
  445. rasa/builder/scrape_rasa_docs.py +0 -97
  446. rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +0 -47
  447. rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +0 -40
  448. rasa/cli/project_templates/finance/actions/action_session_start.py +0 -74
  449. rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +0 -48
  450. rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +0 -36
  451. rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +0 -54
  452. rasa/cli/project_templates/finance/actions/database.py +0 -277
  453. rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +0 -52
  454. rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +0 -51
  455. rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +0 -40
  456. rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +0 -40
  457. rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +0 -46
  458. rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +0 -49
  459. rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +0 -19
  460. rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +0 -36
  461. rasa/cli/project_templates/finance/csvs/accounts.csv +0 -8
  462. rasa/cli/project_templates/finance/csvs/advisors.csv +0 -7
  463. rasa/cli/project_templates/finance/csvs/appointments.csv +0 -211
  464. rasa/cli/project_templates/finance/csvs/branches.csv +0 -10
  465. rasa/cli/project_templates/finance/csvs/cards.csv +0 -11
  466. rasa/cli/project_templates/finance/csvs/payees.csv +0 -11
  467. rasa/cli/project_templates/finance/csvs/transactions.csv +0 -71
  468. rasa/cli/project_templates/finance/csvs/users.csv +0 -4
  469. rasa/cli/project_templates/finance/data/cards/select_card.yml +0 -12
  470. rasa/cli/project_templates/finance/data/general/bot_identity.yml +0 -6
  471. rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +0 -5
  472. rasa/cli/project_templates/finance/data/system/source/accounts.json +0 -51
  473. rasa/cli/project_templates/finance/data/system/source/advisors.json +0 -44
  474. rasa/cli/project_templates/finance/data/system/source/appointments.json +0 -1474
  475. rasa/cli/project_templates/finance/data/system/source/branches.json +0 -47
  476. rasa/cli/project_templates/finance/data/system/source/cards.json +0 -72
  477. rasa/cli/project_templates/finance/data/system/source/payees.json +0 -74
  478. rasa/cli/project_templates/finance/data/system/source/transactions.json +0 -492
  479. rasa/cli/project_templates/finance/data/system/source/users.json +0 -29
  480. rasa/cli/project_templates/finance/data/transfers/add_payee.yml +0 -29
  481. rasa/cli/project_templates/finance/data/transfers/list_payees.yml +0 -5
  482. rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +0 -21
  483. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +0 -8
  484. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +0 -8
  485. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +0 -8
  486. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +0 -8
  487. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +0 -8
  488. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +0 -7
  489. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +0 -8
  490. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +0 -8
  491. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +0 -8
  492. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +0 -8
  493. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +0 -8
  494. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +0 -8
  495. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +0 -8
  496. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +0 -8
  497. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +0 -8
  498. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +0 -8
  499. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +0 -8
  500. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +0 -8
  501. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +0 -8
  502. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +0 -8
  503. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +0 -50
  504. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +0 -50
  505. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +0 -48
  506. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +0 -50
  507. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +0 -50
  508. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +0 -47
  509. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +0 -50
  510. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +0 -50
  511. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +0 -47
  512. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +0 -50
  513. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +0 -50
  514. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +0 -50
  515. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +0 -47
  516. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +0 -50
  517. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +0 -50
  518. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +0 -47
  519. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +0 -50
  520. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +0 -50
  521. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +0 -47
  522. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +0 -50
  523. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +0 -50
  524. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +0 -47
  525. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +0 -47
  526. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +0 -50
  527. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +0 -50
  528. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +0 -47
  529. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +0 -50
  530. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +0 -50
  531. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +0 -47
  532. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +0 -50
  533. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +0 -50
  534. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +0 -47
  535. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +0 -50
  536. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +0 -50
  537. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +0 -50
  538. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +0 -47
  539. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +0 -50
  540. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +0 -50
  541. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +0 -47
  542. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +0 -50
  543. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +0 -50
  544. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +0 -47
  545. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +0 -50
  546. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +0 -50
  547. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +0 -50
  548. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +0 -47
  549. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +0 -50
  550. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +0 -50
  551. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +0 -47
  552. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +0 -50
  553. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +0 -50
  554. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +0 -47
  555. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +0 -50
  556. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +0 -50
  557. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +0 -47
  558. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +0 -47
  559. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +0 -50
  560. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +0 -50
  561. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +0 -50
  562. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +0 -50
  563. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +0 -47
  564. rasa/cli/project_templates/finance/domain/cards/select_card.yml +0 -12
  565. rasa/cli/project_templates/finance/domain/general/assistant_details.yml +0 -12
  566. rasa/cli/project_templates/finance/domain/general/bot_identity.yml +0 -5
  567. rasa/cli/project_templates/finance/domain/general/defaults.yml +0 -24
  568. rasa/cli/project_templates/finance/domain/general/help.yml +0 -5
  569. rasa/cli/project_templates/finance/domain/general/utils.yml +0 -13
  570. rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +0 -47
  571. rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +0 -4
  572. rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +0 -16
  573. rasa/core/channels/inspector/dist/assets/channel-b9b536fc.js +0 -1
  574. rasa/core/channels/inspector/dist/assets/clone-78d2ddcf.js +0 -1
  575. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-8b09c060.js +0 -1
  576. rasa/core/channels/inspector/dist/assets/index-4d4bdf3a.js +0 -1335
  577. /rasa/cli/project_templates/telco/domain/billing/{domain_undertand_bill.yml → understand_bill.yml} +0 -0
  578. /rasa/cli/project_templates/telco/domain/network/{domain_reboot_router.yml → reboot_router.yml} +0 -0
  579. /rasa/cli/project_templates/telco/domain/network/{domain_reset_router.yml → reset_router.yml} +0 -0
  580. /rasa/cli/project_templates/telco/domain/network/{domain_run_speed_test.yml → run_speed_test.yml} +0 -0
  581. /rasa/cli/project_templates/telco/domain/network/{domain_solve_internet_issue.yml → solve_internet_issue.yml} +0 -0
  582. {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/NOTICE +0 -0
  583. {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/WHEEL +0 -0
  584. {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/entry_points.txt +0 -0
@@ -1,14 +1,47 @@
1
1
  from __future__ import annotations
2
2
 
3
- from dataclasses import dataclass
4
- from typing import Any, Dict
3
+ from dataclasses import dataclass, field
4
+ from typing import Any, Dict, List, Optional, Text, Tuple
5
5
 
6
+ import structlog
7
+
8
+ from rasa.core.actions.action import Action
9
+ from rasa.core.channels import OutputChannel
10
+ from rasa.core.nlg import NaturalLanguageGenerator
11
+ from rasa.dialogue_understanding.commands.utils import (
12
+ resume_flow,
13
+ )
14
+ from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
15
+ from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
6
16
  from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
17
+ from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
18
+ DialogueStackFrame,
19
+ )
20
+ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
21
+ AgentStackFrame,
22
+ FlowStackFrameType,
23
+ UserFlowStackFrame,
24
+ )
25
+ from rasa.dialogue_understanding.stack.utils import (
26
+ get_active_continue_interrupted_pattern_frame,
27
+ )
7
28
  from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
29
+ from rasa.shared.core.constants import (
30
+ ACTION_CANCEL_INTERRUPTED_FLOWS,
31
+ ACTION_CONTINUE_INTERRUPTED_FLOW,
32
+ )
33
+ from rasa.shared.core.domain import Domain
34
+ from rasa.shared.core.events import AgentCancelled, Event, FlowCancelled, SlotSet
35
+ from rasa.shared.core.trackers import DialogueStateTracker
8
36
 
9
37
  FLOW_PATTERN_CONTINUE_INTERRUPTED = (
10
38
  RASA_DEFAULT_FLOW_PATTERN_PREFIX + "continue_interrupted"
11
39
  )
40
+ INTERRUPTED_FLOW_TO_CONTINUE_SLOT = "interrupted_flow_to_continue"
41
+ CONTINUE_INTERRUPTED_FLOW_CONFIRMATION_SLOT = "continue_interrupted_flow_confirmation"
42
+
43
+
44
+ structlogger = structlog.get_logger()
12
45
 
13
46
 
14
47
  @dataclass
@@ -17,8 +50,14 @@ class ContinueInterruptedPatternFlowStackFrame(PatternFlowStackFrame):
17
50
 
18
51
  flow_id: str = FLOW_PATTERN_CONTINUE_INTERRUPTED
19
52
  """The ID of the flow."""
20
- previous_flow_name: str = ""
21
- """The name of the flow that was interrupted."""
53
+ interrupted_flow_names: List[str] = field(default_factory=list)
54
+ """The names of the previous flows that were interrupted."""
55
+ interrupted_flow_ids: List[str] = field(default_factory=list)
56
+ """The ids of the previous flows that were interrupted."""
57
+ interrupted_flow_options: str = ""
58
+ """The options that the user can choose from as a string."""
59
+ multiple_flows_interrupted: bool = False
60
+ """Whether the user has interrupted multiple flows."""
22
61
 
23
62
  @classmethod
24
63
  def type(cls) -> str:
@@ -38,7 +77,10 @@ class ContinueInterruptedPatternFlowStackFrame(PatternFlowStackFrame):
38
77
  return ContinueInterruptedPatternFlowStackFrame(
39
78
  frame_id=data["frame_id"],
40
79
  step_id=data["step_id"],
41
- previous_flow_name=data["previous_flow_name"],
80
+ interrupted_flow_names=data["interrupted_flow_names"],
81
+ interrupted_flow_ids=data["interrupted_flow_ids"],
82
+ interrupted_flow_options=data["interrupted_flow_options"],
83
+ multiple_flows_interrupted=len(data["interrupted_flow_names"]) > 1,
42
84
  )
43
85
 
44
86
  def __eq__(self, other: Any) -> bool:
@@ -47,5 +89,196 @@ class ContinueInterruptedPatternFlowStackFrame(PatternFlowStackFrame):
47
89
  return (
48
90
  self.flow_id == other.flow_id
49
91
  and self.step_id == other.step_id
50
- and self.previous_flow_name == other.previous_flow_name
92
+ and self.interrupted_flow_names == other.interrupted_flow_names
93
+ and self.interrupted_flow_ids == other.interrupted_flow_ids
94
+ and self.interrupted_flow_options == other.interrupted_flow_options
51
95
  )
96
+
97
+
98
+ class ActionContinueInterruptedFlow(Action):
99
+ def name(self) -> str:
100
+ return ACTION_CONTINUE_INTERRUPTED_FLOW
101
+
102
+ async def run(
103
+ self,
104
+ output_channel: OutputChannel,
105
+ nlg: NaturalLanguageGenerator,
106
+ tracker: DialogueStateTracker,
107
+ domain: Domain,
108
+ metadata: Optional[Dict[Text, Any]] = None,
109
+ ) -> List[Event]:
110
+ # get the pattern frame from the stack
111
+ pattern_frame = get_active_continue_interrupted_pattern_frame(tracker.stack)
112
+
113
+ if pattern_frame is None:
114
+ structlogger.warning(
115
+ "action.continue_interrupted_flows.no_continue_interrupted_frame"
116
+ )
117
+ return []
118
+
119
+ interrupted_flow_ids = pattern_frame.interrupted_flow_ids
120
+ interrupted_flow_names = pattern_frame.interrupted_flow_names
121
+ multiple_flows_interrupted = pattern_frame.multiple_flows_interrupted
122
+
123
+ flow_to_continue = None
124
+ if not multiple_flows_interrupted:
125
+ # the user confirmed that they want to continue the flow
126
+ # as only one flow was interrupted, we can just continue the first one
127
+ flow_to_continue = interrupted_flow_ids[0]
128
+ else:
129
+ # the user mentioned the flow they want to continue
130
+ # check if the flow is in the list of interrupted flows
131
+ selected_flow = tracker.get_slot(INTERRUPTED_FLOW_TO_CONTINUE_SLOT)
132
+ if selected_flow in interrupted_flow_ids:
133
+ flow_to_continue = selected_flow
134
+ elif selected_flow in interrupted_flow_names:
135
+ # the user mentioned the flow by name
136
+ # find the flow id for the flow name
137
+ # the list of names and ids are in the same order
138
+ flow_to_continue = interrupted_flow_ids[
139
+ interrupted_flow_names.index(selected_flow)
140
+ ]
141
+
142
+ # if the user did not select a valid flow,
143
+ # we need to ask them to select a valid flow
144
+ if flow_to_continue is None:
145
+ await output_channel.send_text_message(
146
+ tracker.sender_id,
147
+ "You haven't selected a valid task to resume. "
148
+ "Please specify the task you would like to continue. "
149
+ "The options are: {{context.interrupted_flow_options}}",
150
+ )
151
+ return []
152
+
153
+ # resume the flow the user selected
154
+ events = resume_flow(flow_to_continue, tracker, tracker.stack)
155
+
156
+ return events + [
157
+ SlotSet(INTERRUPTED_FLOW_TO_CONTINUE_SLOT, None),
158
+ SlotSet(CONTINUE_INTERRUPTED_FLOW_CONFIRMATION_SLOT, None),
159
+ ]
160
+
161
+
162
+ class ActionCancelInterruptedFlows(Action):
163
+ def name(self) -> str:
164
+ return ACTION_CANCEL_INTERRUPTED_FLOWS
165
+
166
+ async def run(
167
+ self,
168
+ output_channel: OutputChannel,
169
+ nlg: NaturalLanguageGenerator,
170
+ tracker: DialogueStateTracker,
171
+ domain: Domain,
172
+ metadata: Optional[Dict[Text, Any]] = None,
173
+ ) -> List[Event]:
174
+ # get the pattern frame from the stack
175
+ pattern_frame = get_active_continue_interrupted_pattern_frame(tracker.stack)
176
+
177
+ if pattern_frame is None:
178
+ structlogger.warning(
179
+ "action.continue_interrupted_flows.no_continue_interrupted_frame"
180
+ )
181
+ return []
182
+
183
+ interrupted_flow_ids = pattern_frame.interrupted_flow_ids
184
+
185
+ event_list: List[Event] = []
186
+
187
+ # cancel all interrupted flows
188
+ for flow_id in interrupted_flow_ids:
189
+ event_list.extend(self.cancel_flow(tracker, tracker.stack, flow_id))
190
+
191
+ return event_list + [
192
+ SlotSet(INTERRUPTED_FLOW_TO_CONTINUE_SLOT, None),
193
+ SlotSet(CONTINUE_INTERRUPTED_FLOW_CONFIRMATION_SLOT, None),
194
+ ]
195
+
196
+ def cancel_flow(
197
+ self,
198
+ tracker: DialogueStateTracker,
199
+ stack: DialogueStack,
200
+ flow_id: str,
201
+ ) -> List[Event]:
202
+ """Cancels a flow by flow id."""
203
+ applied_events: List[Event] = []
204
+
205
+ frames_to_cancel, user_frame_to_cancel = self._collect_frames_to_cancel(
206
+ stack, flow_id
207
+ )
208
+
209
+ # if the flow is not on the stack, do nothing
210
+ if user_frame_to_cancel is None:
211
+ structlogger.error(
212
+ "cancel_flow.no_user_frame_to_cancel",
213
+ flow_id=flow_id,
214
+ )
215
+ return []
216
+
217
+ frames_ids_to_cancel = [frame.frame_id for frame in frames_to_cancel]
218
+
219
+ stack.push(
220
+ CancelPatternFlowStackFrame(
221
+ canceled_name=flow_id,
222
+ canceled_frames=frames_ids_to_cancel,
223
+ )
224
+ )
225
+
226
+ # create flow cancelled event
227
+ applied_events.extend(
228
+ [
229
+ FlowCancelled(
230
+ user_frame_to_cancel.flow_id, user_frame_to_cancel.step_id
231
+ ),
232
+ ]
233
+ )
234
+ # create agent cancelled events for any agent frames that are on the stack
235
+ for frame in frames_to_cancel:
236
+ if isinstance(frame, AgentStackFrame):
237
+ applied_events.append(
238
+ AgentCancelled(
239
+ frame.agent_id, frame.flow_id, reason="Flow was cancelled"
240
+ )
241
+ )
242
+
243
+ update_stack_events = tracker.create_stack_updated_events(stack)
244
+
245
+ return applied_events + update_stack_events
246
+
247
+ def _collect_frames_to_cancel(
248
+ self, stack: DialogueStack, target_flow_id: str
249
+ ) -> Tuple[List[DialogueStackFrame], Optional[UserFlowStackFrame]]:
250
+ """Collect frames that need to be cancelled.
251
+
252
+ Args:
253
+ stack: The stack to collect frames from.
254
+ target_flow_id: The ID of the flow to cancel.
255
+
256
+ Returns:
257
+ A tuple containing (frames_to_cancel, frame_to_cancel).
258
+ """
259
+ frames_to_cancel: List[DialogueStackFrame] = []
260
+ frame_found = False
261
+ frame_to_cancel = None
262
+
263
+ # collect all frames that belong to the target flow
264
+ # i.e. we want to cancel all frames that are on the stack and between
265
+ # the user flow frame that belongs to the target flow and the next user
266
+ # flow frame that belongs to a different flow
267
+ # this includes any pattern frames or agent frames as well
268
+ for frame in stack.frames:
269
+ if isinstance(frame, UserFlowStackFrame) and (
270
+ frame.frame_type == FlowStackFrameType.REGULAR
271
+ or frame.frame_type == FlowStackFrameType.INTERRUPT
272
+ ):
273
+ if frame.flow_id == target_flow_id:
274
+ frames_to_cancel.append(frame)
275
+ frame_to_cancel = frame
276
+ frame_found = True
277
+ continue
278
+ elif frame_found:
279
+ break
280
+
281
+ if frame_found:
282
+ frames_to_cancel.append(frame)
283
+
284
+ return list(frames_to_cancel), frame_to_cancel
@@ -1,6 +1,18 @@
1
1
  version: "3.1"
2
2
  responses:
3
3
 
4
+ utter_ask_continue_interrupted_flow_confirmation:
5
+ - text: "Would you like to continue with {{context.interrupted_flow_options}}?"
6
+ metadata:
7
+ rephrase: True
8
+ template: jinja
9
+
10
+ utter_ask_interrupted_flow_to_continue:
11
+ - text: "Would you like to resume {{context.interrupted_flow_options}}?"
12
+ metadata:
13
+ rephrase: True
14
+ template: jinja
15
+
4
16
  utter_ask_rephrase:
5
17
  - text: I’m sorry I am unable to understand you, could you please rephrase?
6
18
 
@@ -53,12 +65,6 @@ responses:
53
65
  rephrase: True
54
66
  template: jinja
55
67
 
56
- utter_flow_continue_interrupted:
57
- - text: "Let's continue with {{ context.previous_flow_name }}."
58
- metadata:
59
- rephrase: True
60
- template: jinja
61
-
62
68
  utter_free_chitchat_response:
63
69
  - text: "Sorry, I'm not able to answer that right now."
64
70
  metadata:
@@ -118,12 +124,20 @@ slots:
118
124
  - type: from_llm
119
125
  silence_timeout:
120
126
  type: float
121
- initial_value: 6.0
127
+ initial_value: 7.0
122
128
  max_value: 1000000
123
129
  consecutive_silence_timeouts:
124
130
  type: float
125
131
  initial_value: 0.0
126
132
  max_value: 1000000
133
+ interrupted_flow_to_continue:
134
+ type: text
135
+ mappings:
136
+ - type: from_llm
137
+ continue_interrupted_flow_confirmation:
138
+ type: bool
139
+ mappings:
140
+ - type: from_llm
127
141
 
128
142
  flows:
129
143
  pattern_cancel_flow:
@@ -210,7 +224,31 @@ flows:
210
224
  description: Conversation repair flow for managing when users switch between different flows
211
225
  name: pattern continue interrupted
212
226
  steps:
213
- - action: utter_flow_continue_interrupted
227
+ - noop: true
228
+ next:
229
+ - if: context.multiple_flows_interrupted
230
+ then:
231
+ - collect: interrupted_flow_to_continue
232
+ description: "Fill this slot with the name of the flow the user wants to continue. If the user does not want to continue any of the interrupted flows, fill this slot with 'none'."
233
+ next:
234
+ - if: slots.interrupted_flow_to_continue != "none"
235
+ then:
236
+ - action: action_continue_interrupted_flow
237
+ next: END
238
+ - else:
239
+ - action: action_cancel_interrupted_flows
240
+ next: END
241
+ - else:
242
+ - collect: continue_interrupted_flow_confirmation
243
+ description: "If the user wants to continue the interrupted flow, fill this slot with true. If the user does not want to continue the interrupted flow, fill this slot with false."
244
+ next:
245
+ - if: slots.continue_interrupted_flow_confirmation
246
+ then:
247
+ - action: action_continue_interrupted_flow
248
+ next: END
249
+ - else:
250
+ - action: action_cancel_interrupted_flows
251
+ next: END
214
252
 
215
253
  pattern_correction:
216
254
  description: Conversation repair flow for managing user input changes or error corrections
@@ -2,16 +2,22 @@ from typing import Dict, List, Optional, Set, Type
2
2
 
3
3
  import structlog
4
4
 
5
+ from rasa.agents.utils import (
6
+ is_agent_completed,
7
+ is_agent_valid,
8
+ )
5
9
  from rasa.dialogue_understanding.commands import (
6
10
  CancelFlowCommand,
7
11
  CannotHandleCommand,
8
12
  ChitChatAnswerCommand,
9
13
  ClarifyCommand,
10
14
  Command,
15
+ ContinueAgentCommand,
11
16
  CorrectedSlot,
12
17
  CorrectSlotsCommand,
13
18
  FreeFormAnswerCommand,
14
19
  RepeatBotMessagesCommand,
20
+ RestartAgentCommand,
15
21
  SetSlotCommand,
16
22
  StartFlowCommand,
17
23
  )
@@ -37,6 +43,7 @@ from rasa.dialogue_understanding.stack.frames import (
37
43
  BaseFlowStackFrame,
38
44
  )
39
45
  from rasa.dialogue_understanding.stack.utils import (
46
+ is_continue_interrupted_flow_active,
40
47
  top_flow_frame,
41
48
  top_user_flow_frame,
42
49
  )
@@ -428,22 +435,9 @@ def clean_up_commands(
428
435
  )
429
436
 
430
437
  elif isinstance(command, StartFlowCommand):
431
- top_user_frame = top_user_flow_frame(
432
- tracker.stack, ignore_call_and_link_frames=False
438
+ clean_commands = clean_up_start_flow_command(
439
+ clean_commands, tracker, command
433
440
  )
434
- top_flow_id = top_user_frame.flow_id if top_user_frame else ""
435
-
436
- if top_flow_id == command.flow:
437
- # drop a start flow command if the starting flow is equal
438
- # to the currently active flow
439
- structlogger.debug(
440
- "command_processor.clean_up_commands."
441
- "skip_command_flow_already_active",
442
- command=command,
443
- )
444
- continue
445
-
446
- clean_commands.append(command)
447
441
 
448
442
  # handle chitchat command differently from other free-form answer commands
449
443
  elif isinstance(command, ChitChatAnswerCommand):
@@ -473,9 +467,42 @@ def clean_up_commands(
473
467
  "drop_clarify_given_other_commands",
474
468
  command=command,
475
469
  )
470
+
471
+ # Keep the Restart agent commands only if the command is referencing
472
+ # a valid agent that was already completed
473
+ elif isinstance(command, RestartAgentCommand):
474
+ if not is_agent_valid(command.agent_id):
475
+ structlogger.debug(
476
+ "command_processor.clean_up_commands.skip_restart_agent_invalid_agent",
477
+ agent_id=command.agent_id,
478
+ command=command,
479
+ )
480
+ elif not is_agent_completed(tracker, command.agent_id):
481
+ structlogger.debug(
482
+ "command_processor.clean_up_commands.skip_restart_agent_not_completed",
483
+ agent_id=command.agent_id,
484
+ command=command,
485
+ )
486
+ else:
487
+ clean_commands.append(command)
488
+
489
+ # Clean up Continue agent commands if there is currently no active agent
490
+ elif isinstance(command, ContinueAgentCommand):
491
+ if not tracker.stack.agent_is_active():
492
+ structlogger.debug(
493
+ "command_processor.clean_up_commands.skip_continue_agent_no_active_agent",
494
+ command=command,
495
+ )
496
+ else:
497
+ clean_commands.append(command)
498
+
476
499
  else:
477
500
  clean_commands.append(command)
478
501
 
502
+ # Replace CannotHandleCommands with ContinueAgentCommand when an agent is active
503
+ # to keep the agent running, but preserve chitchat
504
+ clean_commands = _replace_cannot_handle_with_continue_agent(clean_commands, tracker)
505
+
479
506
  # when coexistence is enabled, by default there will be a SetSlotCommand
480
507
  # for the ROUTE_TO_CALM_SLOT slot.
481
508
  if tracker.has_coexistence_routing_slot and len(clean_commands) > 2:
@@ -486,9 +513,14 @@ def clean_up_commands(
486
513
  clean_commands = ensure_max_number_of_command_type(
487
514
  clean_commands, RepeatBotMessagesCommand, 1
488
515
  )
516
+ clean_commands = ensure_max_number_of_command_type(
517
+ clean_commands, ContinueAgentCommand, 1
518
+ )
489
519
  structlogger.debug(
490
520
  "command_processor.clean_up_commands.final_commands",
491
521
  command=clean_commands,
522
+ event_info="Final commands",
523
+ highlight=True,
492
524
  )
493
525
 
494
526
  return clean_commands
@@ -529,6 +561,95 @@ def ensure_max_number_of_command_type(
529
561
  return filtered
530
562
 
531
563
 
564
+ def clean_up_start_flow_command(
565
+ clean_commands: List[Command],
566
+ tracker: DialogueStateTracker,
567
+ command: StartFlowCommand,
568
+ ) -> List[Command]:
569
+ """Clean up a start flow command."""
570
+ continue_interrupted_flow_active = is_continue_interrupted_flow_active(
571
+ tracker.stack
572
+ )
573
+
574
+ top_user_frame = top_user_flow_frame(
575
+ tracker.stack, ignore_call_and_link_frames=False
576
+ )
577
+ top_flow_id = top_user_frame.flow_id if top_user_frame else ""
578
+
579
+ if top_flow_id == command.flow and not continue_interrupted_flow_active:
580
+ # drop a start flow command if the starting flow is equal
581
+ # to the currently active flow
582
+ structlogger.debug(
583
+ "command_processor.clean_up_commands." "skip_command_flow_already_active",
584
+ command=command,
585
+ )
586
+ return clean_commands
587
+
588
+ clean_commands.append(command)
589
+ return clean_commands
590
+
591
+
592
+ def _replace_cannot_handle_with_continue_agent(
593
+ clean_commands: List[Command],
594
+ tracker: DialogueStateTracker,
595
+ ) -> List[Command]:
596
+ """Replace CannotHandleCommands with ContinueAgentCommand when agent is active.
597
+
598
+ ContinueAgentCommand is added in the following cases:
599
+
600
+ 1. LLM Command Generation Failures:
601
+ - LLM parsing failures (default reason)
602
+ - Force slot filling failures (default reason)
603
+
604
+ 2. Invalid Commands During Cleanup:
605
+ - Invalid SetSlot commands:
606
+ - Slot not in domain
607
+ - Incompatible extractor
608
+ (Note: ChitChatAnswer command failures are preserved as CannotHandleCommand)
609
+
610
+ 3. Empty Commands List:
611
+ - When all commands are filtered out during cleanup
612
+
613
+ Preserved as CannotHandleCommand (not replaced):
614
+ - Chitchat: CannotHandleCommand(RASA_PATTERN_CANNOT_HANDLE_CHITCHAT)
615
+ """
616
+ if not tracker.stack.agent_is_active():
617
+ return clean_commands
618
+
619
+ # If no commands at all and agent is active, add ContinueAgentCommand
620
+ if not clean_commands:
621
+ clean_commands.append(ContinueAgentCommand())
622
+ return clean_commands
623
+
624
+ has_continue_agent = any(
625
+ isinstance(cmd, ContinueAgentCommand) for cmd in clean_commands
626
+ )
627
+
628
+ # Collect CannotHandleCommands that should be replaced with ContinueAgentCommand
629
+ cannot_handle_commands = [
630
+ cmd
631
+ for cmd in clean_commands
632
+ if isinstance(cmd, CannotHandleCommand)
633
+ and cmd.reason != RASA_PATTERN_CANNOT_HANDLE_CHITCHAT
634
+ ]
635
+
636
+ if cannot_handle_commands:
637
+ structlogger.debug(
638
+ "command_processor.clean_up_commands"
639
+ ".replace_cannot_handle_with_continue_agent",
640
+ original_commands=clean_commands,
641
+ )
642
+ # Remove the CannotHandleCommands we collected
643
+ for cmd in cannot_handle_commands:
644
+ clean_commands.remove(cmd)
645
+
646
+ # Add ContinueAgentCommand if not already present
647
+ if not has_continue_agent:
648
+ clean_commands.append(ContinueAgentCommand())
649
+
650
+ return clean_commands
651
+
652
+
532
653
  def clean_up_clarify_command(
533
654
  commands_so_far: List[Command],
534
655
  all_commands: List[Command],
@@ -8,6 +8,13 @@ from typing import Any, Callable, Dict, List, Optional
8
8
  import jsonpatch
9
9
  import structlog
10
10
 
11
+ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
12
+ AgentStackFrame,
13
+ AgentState,
14
+ FlowStackFrameType,
15
+ UserFlowStackFrame,
16
+ )
17
+
11
18
  if typing.TYPE_CHECKING:
12
19
  from rasa.dialogue_understanding.stack.frames import DialogueStackFrame
13
20
 
@@ -91,6 +98,42 @@ class DialogueStack:
91
98
  """
92
99
  return self.frames.pop()
93
100
 
101
+ def move_frames_to_top(self, frames_to_move: List["DialogueStackFrame"]) -> None:
102
+ """Moves specified frames to top of stack while preserving their relative order.
103
+
104
+ Args:
105
+ frames_to_move: The frames to move to the top of the stack.
106
+ """
107
+ # Get frames that are not being moved
108
+ frames_to_keep = [frame for frame in self.frames if frame not in frames_to_move]
109
+
110
+ # Reorder: keep frames first, then moved frames
111
+ self.frames = frames_to_keep + frames_to_move
112
+
113
+ # set all frames to interrupt except for LINK and CALL
114
+ for frame in self.frames:
115
+ if (
116
+ isinstance(frame, UserFlowStackFrame)
117
+ and frame.frame_type == FlowStackFrameType.LINK
118
+ ):
119
+ continue
120
+ if (
121
+ isinstance(frame, UserFlowStackFrame)
122
+ and frame.frame_type == FlowStackFrameType.CALL
123
+ ):
124
+ continue
125
+ if (
126
+ isinstance(frame, UserFlowStackFrame)
127
+ and frame.frame_type == FlowStackFrameType.REGULAR
128
+ ):
129
+ frame.frame_type = FlowStackFrameType.INTERRUPT
130
+
131
+ # set the first frame to regular
132
+ for frame in self.frames:
133
+ if isinstance(frame, UserFlowStackFrame):
134
+ frame.frame_type = FlowStackFrameType.REGULAR
135
+ return
136
+
94
137
  def current_context(self) -> Dict[str, Any]:
95
138
  """Returns the context of the topmost frame.
96
139
 
@@ -109,7 +152,7 @@ class DialogueStack:
109
152
  """Returns the topmost frame from the stack.
110
153
 
111
154
  Args:
112
- ignore_frame: The ID of the flow to ignore. Picks the top most
155
+ ignore: The ID of the flow to ignore. Picks the top most
113
156
  frame that has a different flow ID.
114
157
 
115
158
  Returns:
@@ -136,7 +179,8 @@ class DialogueStack:
136
179
  patch_dump: The patch to apply to the stack.
137
180
 
138
181
  Returns:
139
- The updated stack."""
182
+ The updated stack.
183
+ """
140
184
  patch = jsonpatch.JsonPatch.from_string(patch_dump)
141
185
  dialogue_stack_dump = patch.apply(self.as_dict())
142
186
  return DialogueStack.from_dict(dialogue_stack_dump)
@@ -177,3 +221,55 @@ class DialogueStack:
177
221
  if patch:
178
222
  return patch.to_string()
179
223
  return None
224
+
225
+ def _find_agent_frame_by_predicate(
226
+ self, predicate: Callable[[AgentStackFrame], bool]
227
+ ) -> List[AgentStackFrame]:
228
+ stack_frames: List[AgentStackFrame] = []
229
+ for stack_frame in reversed(self.frames):
230
+ if isinstance(stack_frame, AgentStackFrame) and predicate(stack_frame):
231
+ stack_frames.append(stack_frame)
232
+ return stack_frames
233
+
234
+ def find_active_agent_frame(self) -> Optional[AgentStackFrame]:
235
+ stack_frames = self._find_agent_frame_by_predicate(
236
+ lambda frame: frame.state == AgentState.WAITING_FOR_INPUT
237
+ )
238
+ if stack_frames:
239
+ return stack_frames[0]
240
+ return None
241
+
242
+ def find_agent_stack_frame_by_agent(
243
+ self, agent_id: str
244
+ ) -> Optional[AgentStackFrame]:
245
+ """Get the agent stack frame for a specific agent ID.
246
+
247
+ May also include the agent stack frame in the INTERRUPTED state.
248
+ """
249
+ stack_frames = self._find_agent_frame_by_predicate(
250
+ lambda frame: frame.agent_id == agent_id
251
+ )
252
+ if stack_frames:
253
+ return stack_frames[0]
254
+ return None
255
+
256
+ def find_active_agent_stack_frame_for_flow(
257
+ self, flow_id: str
258
+ ) -> Optional[AgentStackFrame]:
259
+ """Get the agent stack frame of a specific flow."""
260
+ stack_frames = self._find_agent_frame_by_predicate(
261
+ lambda frame: frame.flow_id == flow_id
262
+ )
263
+ for stack_frame in stack_frames:
264
+ if stack_frame.state == AgentState.WAITING_FOR_INPUT:
265
+ return stack_frame
266
+ return None
267
+
268
+ def get_active_agent_id(self) -> Optional[typing.Text]:
269
+ agent_frame = self.find_active_agent_frame()
270
+ if agent_frame:
271
+ return agent_frame.agent_id
272
+ return None
273
+
274
+ def agent_is_active(self) -> bool:
275
+ return self.find_active_agent_frame() is not None