rasa-pro 3.13.12__py3-none-any.whl → 3.14.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rasa-pro might be problematic. Click here for more details.

Files changed (586) 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 +213 -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 +889 -0
  13. rasa/agents/protocol/mcp/__init__.py +0 -0
  14. rasa/agents/protocol/mcp/mcp_base_agent.py +778 -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 +228 -0
  26. rasa/agents/validation.py +538 -0
  27. rasa/api.py +23 -9
  28. rasa/builder/README.md +120 -0
  29. rasa/builder/__init__.py +0 -0
  30. rasa/builder/auth.py +176 -0
  31. rasa/builder/config.py +96 -0
  32. rasa/builder/copilot/__init__.py +0 -0
  33. rasa/builder/copilot/constants.py +38 -0
  34. rasa/builder/copilot/copilot.py +562 -0
  35. rasa/builder/copilot/copilot_response_handler.py +522 -0
  36. rasa/builder/copilot/copilot_templated_message_provider.py +81 -0
  37. rasa/builder/copilot/exceptions.py +32 -0
  38. rasa/builder/copilot/models.py +690 -0
  39. rasa/builder/copilot/prompts/__init__.py +0 -0
  40. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +787 -0
  41. rasa/builder/copilot/prompts/copilot_training_error_handler_prompt.jinja2 +53 -0
  42. rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +91 -0
  43. rasa/builder/copilot/signing.py +305 -0
  44. rasa/builder/copilot/telemetry.py +234 -0
  45. rasa/builder/copilot/templated_messages/__init__.py +0 -0
  46. rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +16 -0
  47. rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +41 -0
  48. rasa/builder/copilot/templated_messages/copilot_welcome_messages.yml +56 -0
  49. rasa/builder/document_retrieval/__init__.py +0 -0
  50. rasa/builder/document_retrieval/constants.py +15 -0
  51. rasa/builder/document_retrieval/inkeep-rag-response-schema.json +64 -0
  52. rasa/builder/document_retrieval/inkeep_document_retrieval.py +238 -0
  53. rasa/builder/document_retrieval/models.py +62 -0
  54. rasa/builder/download.py +140 -0
  55. rasa/builder/exceptions.py +91 -0
  56. rasa/builder/guardrails/__init__.py +1 -0
  57. rasa/builder/guardrails/clients.py +256 -0
  58. rasa/builder/guardrails/constants.py +12 -0
  59. rasa/builder/guardrails/exceptions.py +4 -0
  60. rasa/builder/guardrails/models.py +266 -0
  61. rasa/builder/guardrails/policy_checker.py +324 -0
  62. rasa/builder/guardrails/store.py +238 -0
  63. rasa/builder/guardrails/utils.py +94 -0
  64. rasa/builder/job_manager.py +87 -0
  65. rasa/builder/jobs.py +609 -0
  66. rasa/builder/llm_service.py +273 -0
  67. rasa/builder/logging_utils.py +265 -0
  68. rasa/builder/main.py +234 -0
  69. rasa/builder/models.py +229 -0
  70. rasa/builder/project_generator.py +463 -0
  71. rasa/builder/project_info.py +72 -0
  72. rasa/builder/service.py +1367 -0
  73. rasa/builder/shared/tracker_context.py +212 -0
  74. rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
  75. rasa/builder/template_cache.py +69 -0
  76. rasa/builder/training_service.py +188 -0
  77. rasa/builder/validation_service.py +101 -0
  78. rasa/cli/arguments/data.py +9 -0
  79. rasa/cli/arguments/default_arguments.py +12 -0
  80. rasa/cli/arguments/run.py +2 -0
  81. rasa/cli/arguments/train.py +2 -0
  82. rasa/cli/data.py +78 -10
  83. rasa/cli/dialogue_understanding_test.py +11 -7
  84. rasa/cli/e2e_test.py +10 -6
  85. rasa/cli/evaluate.py +4 -2
  86. rasa/cli/export.py +5 -2
  87. rasa/cli/inspect.py +9 -4
  88. rasa/cli/interactive.py +8 -4
  89. rasa/cli/llm_fine_tuning.py +12 -6
  90. rasa/cli/project_templates/basic/README.md +23 -0
  91. rasa/cli/project_templates/basic/actions/__init__ +0 -0
  92. rasa/cli/project_templates/basic/actions/action_human_handoff.py +40 -0
  93. rasa/cli/project_templates/basic/actions/actions.md +10 -0
  94. rasa/cli/project_templates/basic/config.yml +29 -0
  95. rasa/cli/project_templates/basic/credentials.yml +33 -0
  96. rasa/cli/project_templates/basic/data/data.md +8 -0
  97. rasa/cli/project_templates/basic/data/general/feedback.yml +21 -0
  98. rasa/cli/project_templates/basic/data/general/goodbye.yml +6 -0
  99. rasa/cli/project_templates/basic/data/general/hello.yml +6 -0
  100. rasa/cli/project_templates/basic/data/general/help.yml +6 -0
  101. rasa/cli/project_templates/basic/data/general/human_handoff.yml +16 -0
  102. rasa/cli/project_templates/basic/data/general/show_faqs.yml +6 -0
  103. rasa/cli/project_templates/basic/data/system/patterns/pattern_cannot_handle.yml +7 -0
  104. rasa/cli/project_templates/basic/data/system/patterns/pattern_completed.yml +7 -0
  105. rasa/cli/project_templates/basic/data/system/patterns/pattern_correction.yml +7 -0
  106. rasa/cli/project_templates/basic/data/system/patterns/pattern_search.yml +8 -0
  107. rasa/cli/project_templates/basic/data/system/patterns/pattern_session_start.yml +8 -0
  108. rasa/cli/project_templates/basic/docs/docs.md +5 -0
  109. rasa/cli/project_templates/basic/docs/template.txt +28 -0
  110. rasa/cli/project_templates/basic/domain/domain.md +11 -0
  111. rasa/cli/project_templates/basic/domain/general/feedback.yml +25 -0
  112. rasa/cli/project_templates/basic/domain/general/goodbye.yml +9 -0
  113. rasa/cli/project_templates/basic/domain/general/hello.yml +7 -0
  114. rasa/cli/project_templates/basic/domain/general/help.yml +21 -0
  115. rasa/cli/project_templates/basic/domain/general/human_handoff.yml +32 -0
  116. rasa/cli/project_templates/basic/domain/general/show_faqs.yml +14 -0
  117. rasa/cli/project_templates/basic/domain/system/patterns/pattern_cannot_handle.yml +5 -0
  118. rasa/cli/project_templates/basic/domain/system/patterns/pattern_session_start.yml +19 -0
  119. rasa/cli/project_templates/basic/endpoints.yml +67 -0
  120. rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
  121. rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
  122. rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
  123. rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
  124. rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/help.yml +8 -0
  125. rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/human_handoff.yml +41 -0
  126. rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/patterns.yml +32 -0
  127. rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/show_faqs.yml +8 -0
  128. rasa/cli/project_templates/default/config.yml +4 -0
  129. rasa/cli/project_templates/default/endpoints.yml +4 -0
  130. rasa/cli/project_templates/defaults.py +1 -0
  131. rasa/cli/project_templates/finance/README.md +26 -0
  132. rasa/cli/project_templates/finance/actions/__init__.py +0 -0
  133. rasa/cli/project_templates/finance/actions/accounts/__init__.py +0 -0
  134. rasa/cli/project_templates/finance/actions/accounts/check_balance.py +18 -0
  135. rasa/cli/project_templates/finance/actions/actions.md +15 -0
  136. rasa/cli/project_templates/finance/actions/cards/__init__.py +0 -0
  137. rasa/cli/project_templates/finance/actions/cards/check_that_card_exists.py +21 -0
  138. rasa/cli/project_templates/finance/actions/cards/list_cards.py +22 -0
  139. rasa/cli/project_templates/finance/actions/contacts/__init__.py +0 -0
  140. rasa/cli/project_templates/finance/actions/contacts/add_contact.py +30 -0
  141. rasa/cli/project_templates/finance/actions/contacts/list_contacts.py +22 -0
  142. rasa/cli/project_templates/finance/actions/contacts/remove_contact.py +35 -0
  143. rasa/cli/project_templates/finance/actions/db.py +117 -0
  144. rasa/cli/project_templates/finance/actions/general/__init__.py +0 -0
  145. rasa/cli/project_templates/finance/actions/general/action_human_handoff.py +49 -0
  146. rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
  147. rasa/cli/project_templates/finance/actions/transfers/check_transfer_funds.py +27 -0
  148. rasa/cli/project_templates/finance/actions/transfers/check_transfer_limit.py +36 -0
  149. rasa/cli/project_templates/finance/actions/transfers/execute_recurrent_payment.py +20 -0
  150. rasa/cli/project_templates/finance/actions/transfers/execute_transfer.py +45 -0
  151. rasa/cli/project_templates/finance/actions/transfers/list_transactions.py +32 -0
  152. rasa/cli/project_templates/finance/config.yml +29 -0
  153. rasa/cli/project_templates/finance/credentials.yml +33 -0
  154. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +9 -0
  155. rasa/cli/project_templates/finance/data/accounts/download_statements.yml +26 -0
  156. rasa/cli/project_templates/finance/data/bills/bill_pay_reminder.yml +25 -0
  157. rasa/cli/project_templates/finance/data/cards/activate_card.yml +35 -0
  158. rasa/cli/project_templates/finance/data/cards/block_card.yml +45 -0
  159. rasa/cli/project_templates/finance/data/cards/list_cards.yml +14 -0
  160. rasa/cli/project_templates/finance/data/cards/replace_card.yml +16 -0
  161. rasa/cli/project_templates/finance/data/cards/replace_eligible_card.yml +29 -0
  162. rasa/cli/project_templates/finance/data/contacts/add_contact.yml +33 -0
  163. rasa/cli/project_templates/finance/data/contacts/list_contacts.yml +14 -0
  164. rasa/cli/project_templates/finance/data/contacts/remove_contact.yml +31 -0
  165. rasa/cli/project_templates/finance/data/data.md +14 -0
  166. rasa/cli/project_templates/finance/data/general/bot_challenge.yml +6 -0
  167. rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
  168. rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
  169. rasa/cli/project_templates/finance/data/general/hello.yml +6 -0
  170. rasa/cli/project_templates/finance/data/general/help.yml +9 -0
  171. rasa/cli/project_templates/finance/data/general/human_handoff.yml +16 -0
  172. rasa/cli/project_templates/finance/data/general/welcome.yml +9 -0
  173. rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +7 -0
  174. rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +7 -0
  175. rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +8 -0
  176. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +8 -0
  177. rasa/cli/project_templates/finance/data/transfers/check_transfer_limit.yml +18 -0
  178. rasa/cli/project_templates/finance/data/transfers/list_transactions.yml +46 -0
  179. rasa/cli/project_templates/finance/data/transfers/move_money_between_accounts.yml +51 -0
  180. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +34 -0
  181. rasa/cli/project_templates/finance/data/transfers/transfer_money_to_a_third_party.yml +175 -0
  182. rasa/cli/project_templates/finance/db/cards.json +18 -0
  183. rasa/cli/project_templates/finance/db/contacts.json +10 -0
  184. rasa/cli/project_templates/finance/db/my_account.json +6 -0
  185. rasa/cli/project_templates/finance/db/transactions.json +22 -0
  186. rasa/cli/project_templates/finance/docs/docs.md +8 -0
  187. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/budgeting_analytics.txt +22 -0
  188. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/multi_currency_accounts.txt +19 -0
  189. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/premium_benefits.txt +19 -0
  190. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/contactless_limits.txt +16 -0
  191. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/freeze_unfreeze_card.txt +16 -0
  192. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/lost_stolen_card.txt +19 -0
  193. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/instant_payments.txt +19 -0
  194. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/international_transfers.txt +19 -0
  195. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/fraud_protection.txt +22 -0
  196. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/secure_payments.txt +22 -0
  197. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +15 -0
  198. rasa/cli/project_templates/finance/domain/accounts/download_statements.yml +40 -0
  199. rasa/cli/project_templates/finance/domain/bills/bill_pay_reminder.yml +49 -0
  200. rasa/cli/project_templates/finance/domain/cards/activate_card.yml +24 -0
  201. rasa/cli/project_templates/finance/domain/cards/block_card.yml +44 -0
  202. rasa/cli/project_templates/finance/domain/cards/list_cards.yml +16 -0
  203. rasa/cli/project_templates/finance/domain/cards/replace_card.yml +43 -0
  204. rasa/cli/project_templates/finance/domain/cards/shared.yml +15 -0
  205. rasa/cli/project_templates/finance/domain/contacts/add_contact.yml +37 -0
  206. rasa/cli/project_templates/finance/domain/contacts/list_contacts.yml +16 -0
  207. rasa/cli/project_templates/finance/domain/contacts/remove_contact.yml +32 -0
  208. rasa/cli/project_templates/finance/domain/domain.md +18 -0
  209. rasa/cli/project_templates/finance/domain/general/_shared.yml +39 -0
  210. rasa/cli/project_templates/finance/domain/general/bot_challenge.yml +4 -0
  211. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +8 -0
  212. rasa/cli/project_templates/finance/domain/general/feedback.yml +25 -0
  213. rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
  214. rasa/cli/project_templates/finance/domain/general/help.yml +0 -0
  215. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +31 -0
  216. rasa/cli/project_templates/finance/domain/general/welcome.yml +39 -0
  217. rasa/cli/project_templates/finance/domain/transfers/check_transfer_limit.yml +32 -0
  218. rasa/cli/project_templates/finance/domain/transfers/list_transactions.yml +44 -0
  219. rasa/cli/project_templates/finance/domain/transfers/shared.yml +17 -0
  220. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +221 -0
  221. rasa/cli/project_templates/finance/endpoints.yml +67 -0
  222. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
  223. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/accounts/check_balance.yml +9 -0
  224. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/accounts/download_statements.yml +43 -0
  225. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/cards/block_card.yml +55 -0
  226. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/bot_challenge.yml +8 -0
  227. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
  228. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
  229. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
  230. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/human_handoff.yml +35 -0
  231. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/patterns.yml +22 -0
  232. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/transfers/transfer_money.yml +56 -0
  233. rasa/cli/project_templates/telco/README.md +25 -0
  234. rasa/cli/project_templates/telco/actions/__init__.py +0 -0
  235. rasa/cli/project_templates/telco/actions/actions.md +12 -0
  236. rasa/cli/project_templates/telco/actions/billing/__init__.py +0 -0
  237. rasa/cli/project_templates/telco/actions/billing/actions_billing.py +204 -0
  238. rasa/cli/project_templates/telco/actions/general/__init__.py +0 -0
  239. rasa/cli/project_templates/telco/actions/general/action_human_handoff.py +49 -0
  240. rasa/cli/project_templates/telco/actions/network/__init__.py +0 -0
  241. rasa/cli/project_templates/telco/actions/network/actions_get_data_from_db.py +48 -0
  242. rasa/cli/project_templates/telco/actions/network/actions_run_diagnostics.py +28 -0
  243. rasa/cli/project_templates/telco/actions/network/actions_session_start.py +18 -0
  244. rasa/cli/project_templates/telco/config.yml +29 -0
  245. rasa/cli/project_templates/telco/credentials.yml +33 -0
  246. rasa/cli/project_templates/telco/csvs/billing.csv +19 -0
  247. rasa/cli/project_templates/telco/csvs/customers.csv +5 -0
  248. rasa/cli/project_templates/telco/data/billing/flow_understand_bill.yml +45 -0
  249. rasa/cli/project_templates/telco/data/data.md +11 -0
  250. rasa/cli/project_templates/telco/data/general/bot_challenge.yml +6 -0
  251. rasa/cli/project_templates/telco/data/general/feedback.yml +20 -0
  252. rasa/cli/project_templates/telco/data/general/goodbye.yml +6 -0
  253. rasa/cli/project_templates/telco/data/general/hello.yml +6 -0
  254. rasa/cli/project_templates/telco/data/general/human_handoff.yml +16 -0
  255. rasa/cli/project_templates/telco/data/general/patterns.yml +30 -0
  256. rasa/cli/project_templates/telco/data/network/flow_reboot_router.yml +8 -0
  257. rasa/cli/project_templates/telco/data/network/flow_reset_router.yml +7 -0
  258. rasa/cli/project_templates/telco/data/network/flow_solve_internet_issue.yml +73 -0
  259. rasa/cli/project_templates/telco/docs/docs.md +8 -0
  260. rasa/cli/project_templates/telco/docs/network/reset_vs_rboot_router.txt +1 -0
  261. rasa/cli/project_templates/telco/docs/network/restart_router.txt +6 -0
  262. rasa/cli/project_templates/telco/docs/network/run_speed_test.txt +6 -0
  263. rasa/cli/project_templates/telco/domain/billing/understand_bill.yml +102 -0
  264. rasa/cli/project_templates/telco/domain/domain.md +13 -0
  265. rasa/cli/project_templates/telco/domain/general/bot_challenge.yml +4 -0
  266. rasa/cli/project_templates/telco/domain/general/feedback.yml +25 -0
  267. rasa/cli/project_templates/telco/domain/general/goodbye.yml +7 -0
  268. rasa/cli/project_templates/telco/domain/general/hello.yml +5 -0
  269. rasa/cli/project_templates/telco/domain/general/human_handoff.yml +26 -0
  270. rasa/cli/project_templates/telco/domain/general/patterns.yml +33 -0
  271. rasa/cli/project_templates/telco/domain/network/reboot_router.yml +21 -0
  272. rasa/cli/project_templates/telco/domain/network/reset_router.yml +12 -0
  273. rasa/cli/project_templates/telco/domain/network/run_speed_test.yml +25 -0
  274. rasa/cli/project_templates/telco/domain/network/solve_internet_issue.yml +74 -0
  275. rasa/cli/project_templates/telco/domain/shared.yml +129 -0
  276. rasa/cli/project_templates/telco/endpoints.yml +67 -0
  277. rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +40 -0
  278. rasa/cli/project_templates/telco/tests/e2e_test_cases/with_stub/network/solve_internet_not_slow.yml +33 -0
  279. rasa/cli/project_templates/telco/tests/e2e_test_cases/with_stub/network/solve_internet_slow.yml +47 -0
  280. rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/billing/understand_bill.yml +67 -0
  281. rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/bot_challenge.yml +8 -0
  282. rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
  283. rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
  284. rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
  285. rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/human_handoff.yml +35 -0
  286. rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/patterns.yml +23 -0
  287. rasa/cli/project_templates/tutorial/config.yml +2 -1
  288. rasa/cli/project_templates/tutorial/credentials.yml +10 -0
  289. rasa/cli/run.py +8 -10
  290. rasa/cli/scaffold.py +50 -6
  291. rasa/cli/shell.py +10 -5
  292. rasa/cli/studio/studio.py +1 -1
  293. rasa/cli/test.py +34 -14
  294. rasa/cli/train.py +44 -30
  295. rasa/cli/utils.py +1 -393
  296. rasa/cli/validation/__init__.py +0 -0
  297. rasa/cli/validation/bot_config.py +232 -0
  298. rasa/cli/validation/config_path_validation.py +257 -0
  299. rasa/cli/x.py +8 -4
  300. rasa/constants.py +7 -1
  301. rasa/core/actions/action.py +53 -13
  302. rasa/core/actions/action_exceptions.py +1 -1
  303. rasa/core/actions/action_run_slot_rejections.py +1 -1
  304. rasa/core/actions/grpc_custom_action_executor.py +1 -1
  305. rasa/core/agent.py +22 -2
  306. rasa/core/available_agents.py +239 -0
  307. rasa/core/brokers/broker.py +1 -1
  308. rasa/core/brokers/kafka.py +56 -8
  309. rasa/core/channels/__init__.py +82 -35
  310. rasa/core/channels/channel.py +4 -3
  311. rasa/core/channels/constants.py +3 -0
  312. rasa/core/channels/development_inspector.py +29 -16
  313. rasa/core/channels/hangouts.py +2 -2
  314. rasa/core/channels/inspector/README.md +25 -13
  315. rasa/core/channels/inspector/dist/assets/{arc-0b11fe30.js → arc-6177260a.js} +1 -1
  316. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-9eef30a7.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
  317. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-03e94f28.js → c4Diagram-3d4e48cf-f25427d5.js} +1 -1
  318. rasa/core/channels/inspector/dist/assets/channel-bf9cbb34.js +1 -0
  319. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-95c09eba.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
  320. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-38e8446c.js → classDiagram-v2-f2320105-58db65c0.js} +1 -1
  321. rasa/core/channels/inspector/dist/assets/clone-8f9083bb.js +1 -0
  322. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-57dc3038.js → createText-2e5e7dd3-088372e2.js} +1 -1
  323. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-4bac0545.js → edges-e0da2a9e-58676240.js} +1 -1
  324. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-81795c90.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
  325. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-89489ae6.js → flowDb-956e92f1-ea63f85c.js} +1 -1
  326. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-cd152627.js → flowDiagram-66a62f08-a2af48cd.js} +1 -1
  327. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-9ecd5b59.js +1 -0
  328. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-3da369bc.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
  329. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-85ec16f8.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
  330. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-495bc140.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
  331. rasa/core/channels/inspector/dist/assets/{graph-1ec4d266.js → graph-0a6f8466.js} +1 -1
  332. rasa/core/channels/inspector/dist/assets/{index-3862675e-0a0e97c9.js → index-3862675e-7610671a.js} +1 -1
  333. rasa/core/channels/inspector/dist/assets/index-74e01d94.js +1354 -0
  334. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-4d54bcde.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
  335. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-dc097114.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
  336. rasa/core/channels/inspector/dist/assets/{layout-1a08981e.js → layout-e7fbc2bf.js} +1 -1
  337. rasa/core/channels/inspector/dist/assets/{line-95f7f1d3.js → line-a8aa457c.js} +1 -1
  338. rasa/core/channels/inspector/dist/assets/{linear-97e69543.js → linear-3351e0d2.js} +1 -1
  339. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-8c71ff03.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
  340. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-f14c71c7.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
  341. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-f1d3c9ff.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
  342. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-bfa2412f.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
  343. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-53f2c97b.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
  344. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-319d7c0e.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
  345. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-76a09418.js → stateDiagram-587899a1-0e770395.js} +1 -1
  346. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-a67f15d4.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
  347. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-0654e7c3.js → styles-6aaf32cf-36a9e70d.js} +1 -1
  348. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-1394bb9d.js → styles-9a916d00-884a8b5b.js} +1 -1
  349. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-e4c5bdae.js → styles-c10674c1-dc097813.js} +1 -1
  350. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-50957104.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
  351. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-b0885a6a.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
  352. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-79e6541a.js → xychartDiagram-e933f94c-afb6fe56.js} +1 -1
  353. rasa/core/channels/inspector/dist/index.html +1 -1
  354. rasa/core/channels/inspector/package.json +18 -18
  355. rasa/core/channels/inspector/src/App.tsx +56 -12
  356. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +1 -1
  357. rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
  358. rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +4 -2
  359. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +20 -3
  360. rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +296 -0
  361. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +6 -2
  362. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +26 -4
  363. rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
  364. rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
  365. rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
  366. rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
  367. rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
  368. rasa/core/channels/inspector/src/types.ts +55 -1
  369. rasa/core/channels/inspector/yarn.lock +336 -189
  370. rasa/core/channels/socketio.py +212 -51
  371. rasa/core/channels/studio_chat.py +82 -32
  372. rasa/core/channels/telegram.py +4 -9
  373. rasa/core/channels/voice_ready/twilio_voice.py +1 -1
  374. rasa/core/channels/voice_stream/asr/asr_event.py +1 -1
  375. rasa/core/channels/voice_stream/asr/azure.py +6 -3
  376. rasa/core/channels/voice_stream/asr/deepgram.py +1 -1
  377. rasa/core/channels/voice_stream/audiocodes.py +11 -6
  378. rasa/core/channels/voice_stream/browser_audio.py +91 -4
  379. rasa/core/channels/voice_stream/call_state.py +13 -2
  380. rasa/core/channels/voice_stream/genesys.py +19 -15
  381. rasa/core/channels/voice_stream/jambonz.py +22 -12
  382. rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
  383. rasa/core/channels/voice_stream/twilio_media_streams.py +35 -14
  384. rasa/core/channels/voice_stream/util.py +11 -1
  385. rasa/core/channels/voice_stream/voice_channel.py +170 -32
  386. rasa/core/concurrent_lock_store.py +83 -16
  387. rasa/core/config/__init__.py +0 -0
  388. rasa/core/{available_endpoints.py → config/available_endpoints.py} +56 -18
  389. rasa/core/config/configuration.py +295 -0
  390. rasa/core/config/credentials.py +19 -0
  391. rasa/core/config/message_procesing_config.py +34 -0
  392. rasa/core/constants.py +17 -0
  393. rasa/core/exceptions.py +1 -1
  394. rasa/core/featurizers/tracker_featurizers.py +3 -2
  395. rasa/core/iam_credentials_providers/__init__.py +0 -0
  396. rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +291 -0
  397. rasa/core/iam_credentials_providers/credentials_provider_protocol.py +91 -0
  398. rasa/core/lock_store.py +50 -10
  399. rasa/core/nlg/contextual_response_rephraser.py +5 -0
  400. rasa/core/nlg/generator.py +1 -1
  401. rasa/core/persistor.py +7 -7
  402. rasa/core/policies/enterprise_search_policy.py +9 -10
  403. rasa/core/policies/flow_policy.py +4 -4
  404. rasa/core/policies/flows/agent_executor.py +720 -0
  405. rasa/core/policies/flows/flow_exceptions.py +5 -2
  406. rasa/core/policies/flows/flow_executor.py +146 -77
  407. rasa/core/policies/flows/mcp_tool_executor.py +304 -0
  408. rasa/core/policies/intentless_policy.py +1 -1
  409. rasa/core/policies/rule_policy.py +1 -1
  410. rasa/core/policies/ted_policy.py +20 -12
  411. rasa/core/policies/unexpected_intent_policy.py +6 -0
  412. rasa/core/processor.py +100 -44
  413. rasa/core/redis_connection_factory.py +474 -0
  414. rasa/core/run.py +49 -10
  415. rasa/core/test.py +4 -0
  416. rasa/core/tracker_stores/redis_tracker_store.py +36 -14
  417. rasa/core/tracker_stores/sql_tracker_store.py +59 -1
  418. rasa/core/tracker_stores/tracker_store.py +3 -7
  419. rasa/core/train.py +1 -1
  420. rasa/core/training/interactive.py +20 -18
  421. rasa/core/training/story_conflict.py +5 -5
  422. rasa/core/utils.py +22 -23
  423. rasa/dialogue_understanding/commands/__init__.py +8 -0
  424. rasa/dialogue_understanding/commands/cancel_flow_command.py +20 -6
  425. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +21 -2
  426. rasa/dialogue_understanding/commands/clarify_command.py +20 -2
  427. rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
  428. rasa/dialogue_understanding/commands/knowledge_answer_command.py +21 -2
  429. rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
  430. rasa/dialogue_understanding/commands/start_flow_command.py +75 -7
  431. rasa/dialogue_understanding/commands/utils.py +135 -2
  432. rasa/dialogue_understanding/generator/command_parser.py +4 -0
  433. rasa/dialogue_understanding/generator/flow_retrieval.py +0 -9
  434. rasa/dialogue_understanding/generator/llm_based_command_generator.py +52 -12
  435. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  436. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  437. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +66 -0
  438. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +66 -0
  439. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +89 -0
  440. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +88 -0
  441. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +42 -7
  442. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +40 -3
  443. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +20 -3
  444. rasa/dialogue_understanding/patterns/cancel.py +27 -6
  445. rasa/dialogue_understanding/patterns/clarify.py +3 -14
  446. rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
  447. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +49 -9
  448. rasa/dialogue_understanding/processor/command_processor.py +136 -15
  449. rasa/dialogue_understanding/stack/dialogue_stack.py +98 -2
  450. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
  451. rasa/dialogue_understanding/stack/utils.py +57 -3
  452. rasa/dialogue_understanding/utils.py +24 -4
  453. rasa/dialogue_understanding_test/du_test_runner.py +8 -3
  454. rasa/e2e_test/e2e_test_runner.py +13 -3
  455. rasa/engine/caching.py +2 -2
  456. rasa/engine/constants.py +1 -1
  457. rasa/engine/graph.py +5 -1
  458. rasa/engine/loader.py +12 -0
  459. rasa/engine/recipes/default_components.py +138 -49
  460. rasa/engine/recipes/default_recipe.py +108 -11
  461. rasa/engine/runner/dask.py +8 -5
  462. rasa/engine/validation.py +25 -8
  463. rasa/graph_components/validators/default_recipe_validator.py +86 -28
  464. rasa/hooks.py +5 -5
  465. rasa/llm_fine_tuning/utils.py +2 -2
  466. rasa/model_manager/model_api.py +4 -5
  467. rasa/model_manager/runner_service.py +2 -2
  468. rasa/model_manager/socket_bridge.py +21 -17
  469. rasa/model_manager/trainer_service.py +12 -9
  470. rasa/model_manager/utils.py +1 -29
  471. rasa/model_manager/warm_rasa_process.py +13 -3
  472. rasa/model_training.py +60 -47
  473. rasa/nlu/classifiers/diet_classifier.py +198 -98
  474. rasa/nlu/classifiers/logistic_regression_classifier.py +1 -4
  475. rasa/nlu/classifiers/mitie_intent_classifier.py +3 -0
  476. rasa/nlu/classifiers/sklearn_intent_classifier.py +1 -3
  477. rasa/nlu/extractors/crf_entity_extractor.py +9 -10
  478. rasa/nlu/extractors/mitie_entity_extractor.py +3 -0
  479. rasa/nlu/extractors/spacy_entity_extractor.py +3 -0
  480. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +4 -0
  481. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +5 -0
  482. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +2 -0
  483. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +3 -0
  484. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +4 -2
  485. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -0
  486. rasa/nlu/selectors/response_selector.py +10 -2
  487. rasa/nlu/tokenizers/jieba_tokenizer.py +3 -4
  488. rasa/nlu/tokenizers/mitie_tokenizer.py +3 -2
  489. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -2
  490. rasa/nlu/utils/mitie_utils.py +3 -0
  491. rasa/nlu/utils/spacy_utils.py +3 -2
  492. rasa/plugin.py +8 -8
  493. rasa/privacy/privacy_config.py +1 -1
  494. rasa/privacy/privacy_manager.py +12 -3
  495. rasa/server.py +15 -3
  496. rasa/shared/agents/__init__.py +0 -0
  497. rasa/shared/agents/auth/__init__.py +0 -0
  498. rasa/shared/agents/auth/agent_auth_factory.py +105 -0
  499. rasa/shared/agents/auth/agent_auth_manager.py +92 -0
  500. rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
  501. rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
  502. rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
  503. rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
  504. rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +170 -0
  505. rasa/shared/agents/auth/constants.py +13 -0
  506. rasa/shared/agents/auth/types.py +12 -0
  507. rasa/shared/agents/auth/utils.py +85 -0
  508. rasa/shared/agents/utils.py +35 -0
  509. rasa/shared/constants.py +11 -0
  510. rasa/shared/core/constants.py +17 -1
  511. rasa/shared/core/domain.py +62 -22
  512. rasa/shared/core/events.py +329 -0
  513. rasa/shared/core/flows/constants.py +5 -0
  514. rasa/shared/core/flows/flow.py +1 -1
  515. rasa/shared/core/flows/flow_step.py +7 -1
  516. rasa/shared/core/flows/flows_list.py +21 -5
  517. rasa/shared/core/flows/flows_yaml_schema.json +119 -184
  518. rasa/shared/core/flows/steps/call.py +57 -6
  519. rasa/shared/core/flows/steps/collect.py +98 -13
  520. rasa/shared/core/flows/validation.py +372 -8
  521. rasa/shared/core/flows/yaml_flows_io.py +19 -10
  522. rasa/shared/core/slots.py +6 -2
  523. rasa/shared/core/trackers.py +5 -2
  524. rasa/shared/core/training_data/story_reader/story_reader.py +1 -1
  525. rasa/shared/exceptions.py +39 -2
  526. rasa/shared/importers/importer.py +6 -0
  527. rasa/shared/importers/rasa.py +1 -1
  528. rasa/shared/importers/utils.py +86 -4
  529. rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
  530. rasa/shared/providers/llm/_base_litellm_client.py +41 -9
  531. rasa/shared/providers/llm/litellm_router_llm_client.py +10 -6
  532. rasa/shared/providers/llm/llm_client.py +7 -3
  533. rasa/shared/providers/llm/llm_response.py +66 -0
  534. rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
  535. rasa/shared/utils/common.py +26 -1
  536. rasa/shared/utils/health_check/health_check.py +7 -3
  537. rasa/shared/utils/llm.py +92 -19
  538. rasa/shared/utils/mcp/__init__.py +0 -0
  539. rasa/shared/utils/mcp/server_connection.py +250 -0
  540. rasa/shared/utils/mcp/utils.py +20 -0
  541. rasa/shared/utils/schemas/events.py +42 -0
  542. rasa/shared/utils/yaml.py +3 -1
  543. rasa/studio/download.py +3 -0
  544. rasa/studio/prompts.py +1 -0
  545. rasa/studio/pull/pull.py +3 -2
  546. rasa/studio/train.py +8 -7
  547. rasa/studio/upload.py +19 -52
  548. rasa/telemetry.py +166 -28
  549. rasa/tracing/config.py +45 -12
  550. rasa/tracing/constants.py +14 -0
  551. rasa/tracing/instrumentation/attribute_extractors.py +142 -9
  552. rasa/tracing/instrumentation/instrumentation.py +626 -21
  553. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
  554. rasa/tracing/instrumentation/metrics.py +32 -0
  555. rasa/tracing/metric_instrument_provider.py +68 -0
  556. rasa/utils/common.py +92 -1
  557. rasa/utils/endpoints.py +11 -2
  558. rasa/utils/io.py +27 -9
  559. rasa/utils/json_utils.py +6 -1
  560. rasa/utils/log_utils.py +121 -7
  561. rasa/utils/ml_utils.py +1 -1
  562. rasa/utils/openapi.py +144 -0
  563. rasa/utils/plotting.py +1 -1
  564. rasa/utils/pypred.py +45 -0
  565. rasa/utils/tensorflow/__init__.py +7 -0
  566. rasa/utils/tensorflow/callback.py +136 -101
  567. rasa/utils/tensorflow/crf.py +1 -1
  568. rasa/utils/tensorflow/data_generator.py +21 -8
  569. rasa/utils/tensorflow/layers.py +21 -11
  570. rasa/utils/tensorflow/metrics.py +7 -3
  571. rasa/utils/tensorflow/models.py +56 -8
  572. rasa/utils/tensorflow/rasa_layers.py +8 -6
  573. rasa/utils/tensorflow/transformer.py +2 -3
  574. rasa/utils/train_utils.py +54 -24
  575. rasa/validator.py +149 -16
  576. rasa/version.py +1 -1
  577. rasa_pro-3.14.0.dist-info/METADATA +212 -0
  578. {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/RECORD +581 -269
  579. rasa/core/channels/inspector/dist/assets/channel-51d02e9e.js +0 -1
  580. rasa/core/channels/inspector/dist/assets/clone-cc738fa6.js +0 -1
  581. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-0c716443.js +0 -1
  582. rasa/core/channels/inspector/dist/assets/index-c804b295.js +0 -1335
  583. rasa_pro-3.13.12.dist-info/METADATA +0 -192
  584. {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/NOTICE +0 -0
  585. {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/WHEEL +0 -0
  586. {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/entry_points.txt +0 -0
@@ -61,19 +61,6 @@ class ActionClarifyFlows(action.Action):
61
61
  """Return the flow name."""
62
62
  return ACTION_CLARIFY_FLOWS
63
63
 
64
- @staticmethod
65
- def assemble_options_string(names: List[str]) -> str:
66
- """Concatenate options to a human-readable string."""
67
- clarification_message = ""
68
- for i, name in enumerate(names):
69
- if i == 0:
70
- clarification_message += name
71
- elif i == len(names) - 1:
72
- clarification_message += f" or {name}"
73
- else:
74
- clarification_message += f", {name}"
75
- return clarification_message
76
-
77
64
  async def run(
78
65
  self,
79
66
  output_channel: "OutputChannel",
@@ -83,6 +70,8 @@ class ActionClarifyFlows(action.Action):
83
70
  metadata: Optional[Dict[str, Any]] = None,
84
71
  ) -> List[Event]:
85
72
  """Correct the slots."""
73
+ from rasa.dialogue_understanding.utils import assemble_options_string
74
+
86
75
  stack = tracker.stack
87
76
  if not (top := stack.top()):
88
77
  structlogger.warning("action.clarify_flows.no_active_flow")
@@ -92,7 +81,7 @@ class ActionClarifyFlows(action.Action):
92
81
  structlogger.warning("action.clarify_flows.no_clarification_frame")
93
82
  return []
94
83
 
95
- options_string = self.assemble_options_string(top.names)
84
+ options_string = assemble_options_string(top.names, conjunction="or")
96
85
  top.clarification_options = options_string
97
86
  # since we modified the stack frame, we need to update the stack
98
87
  return tracker.create_stack_updated_events(stack)
@@ -1,14 +1,47 @@
1
1
  from __future__ import annotations
2
2
 
3
- from dataclasses import dataclass
4
- from typing import Any, Dict
3
+ from dataclasses import dataclass, field
4
+ from typing import Any, Dict, List, Optional, Text, Tuple
5
5
 
6
+ import structlog
7
+
8
+ from rasa.core.actions.action import Action
9
+ from rasa.core.channels import OutputChannel
10
+ from rasa.core.nlg import NaturalLanguageGenerator
11
+ from rasa.dialogue_understanding.commands.utils import (
12
+ resume_flow,
13
+ )
14
+ from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
15
+ from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
6
16
  from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
17
+ from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
18
+ DialogueStackFrame,
19
+ )
20
+ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
21
+ AgentStackFrame,
22
+ FlowStackFrameType,
23
+ UserFlowStackFrame,
24
+ )
25
+ from rasa.dialogue_understanding.stack.utils import (
26
+ get_active_continue_interrupted_pattern_frame,
27
+ )
7
28
  from rasa.shared.constants import RASA_DEFAULT_FLOW_PATTERN_PREFIX
29
+ from rasa.shared.core.constants import (
30
+ ACTION_CANCEL_INTERRUPTED_FLOWS,
31
+ ACTION_CONTINUE_INTERRUPTED_FLOW,
32
+ )
33
+ from rasa.shared.core.domain import Domain
34
+ from rasa.shared.core.events import AgentCancelled, Event, FlowCancelled, SlotSet
35
+ from rasa.shared.core.trackers import DialogueStateTracker
8
36
 
9
37
  FLOW_PATTERN_CONTINUE_INTERRUPTED = (
10
38
  RASA_DEFAULT_FLOW_PATTERN_PREFIX + "continue_interrupted"
11
39
  )
40
+ INTERRUPTED_FLOW_TO_CONTINUE_SLOT = "interrupted_flow_to_continue"
41
+ CONTINUE_INTERRUPTED_FLOW_CONFIRMATION_SLOT = "continue_interrupted_flow_confirmation"
42
+
43
+
44
+ structlogger = structlog.get_logger()
12
45
 
13
46
 
14
47
  @dataclass
@@ -17,8 +50,14 @@ class ContinueInterruptedPatternFlowStackFrame(PatternFlowStackFrame):
17
50
 
18
51
  flow_id: str = FLOW_PATTERN_CONTINUE_INTERRUPTED
19
52
  """The ID of the flow."""
20
- previous_flow_name: str = ""
21
- """The name of the flow that was interrupted."""
53
+ interrupted_flow_names: List[str] = field(default_factory=list)
54
+ """The names of the previous flows that were interrupted."""
55
+ interrupted_flow_ids: List[str] = field(default_factory=list)
56
+ """The ids of the previous flows that were interrupted."""
57
+ interrupted_flow_options: str = ""
58
+ """The options that the user can choose from as a string."""
59
+ multiple_flows_interrupted: bool = False
60
+ """Whether the user has interrupted multiple flows."""
22
61
 
23
62
  @classmethod
24
63
  def type(cls) -> str:
@@ -38,7 +77,10 @@ class ContinueInterruptedPatternFlowStackFrame(PatternFlowStackFrame):
38
77
  return ContinueInterruptedPatternFlowStackFrame(
39
78
  frame_id=data["frame_id"],
40
79
  step_id=data["step_id"],
41
- previous_flow_name=data["previous_flow_name"],
80
+ interrupted_flow_names=data["interrupted_flow_names"],
81
+ interrupted_flow_ids=data["interrupted_flow_ids"],
82
+ interrupted_flow_options=data["interrupted_flow_options"],
83
+ multiple_flows_interrupted=len(data["interrupted_flow_names"]) > 1,
42
84
  )
43
85
 
44
86
  def __eq__(self, other: Any) -> bool:
@@ -47,5 +89,196 @@ class ContinueInterruptedPatternFlowStackFrame(PatternFlowStackFrame):
47
89
  return (
48
90
  self.flow_id == other.flow_id
49
91
  and self.step_id == other.step_id
50
- and self.previous_flow_name == other.previous_flow_name
92
+ and self.interrupted_flow_names == other.interrupted_flow_names
93
+ and self.interrupted_flow_ids == other.interrupted_flow_ids
94
+ and self.interrupted_flow_options == other.interrupted_flow_options
51
95
  )
96
+
97
+
98
+ class ActionContinueInterruptedFlow(Action):
99
+ def name(self) -> str:
100
+ return ACTION_CONTINUE_INTERRUPTED_FLOW
101
+
102
+ async def run(
103
+ self,
104
+ output_channel: OutputChannel,
105
+ nlg: NaturalLanguageGenerator,
106
+ tracker: DialogueStateTracker,
107
+ domain: Domain,
108
+ metadata: Optional[Dict[Text, Any]] = None,
109
+ ) -> List[Event]:
110
+ # get the pattern frame from the stack
111
+ pattern_frame = get_active_continue_interrupted_pattern_frame(tracker.stack)
112
+
113
+ if pattern_frame is None:
114
+ structlogger.warning(
115
+ "action.continue_interrupted_flows.no_continue_interrupted_frame"
116
+ )
117
+ return []
118
+
119
+ interrupted_flow_ids = pattern_frame.interrupted_flow_ids
120
+ interrupted_flow_names = pattern_frame.interrupted_flow_names
121
+ multiple_flows_interrupted = pattern_frame.multiple_flows_interrupted
122
+
123
+ flow_to_continue = None
124
+ if not multiple_flows_interrupted:
125
+ # the user confirmed that they want to continue the flow
126
+ # as only one flow was interrupted, we can just continue the first one
127
+ flow_to_continue = interrupted_flow_ids[0]
128
+ else:
129
+ # the user mentioned the flow they want to continue
130
+ # check if the flow is in the list of interrupted flows
131
+ selected_flow = tracker.get_slot(INTERRUPTED_FLOW_TO_CONTINUE_SLOT)
132
+ if selected_flow in interrupted_flow_ids:
133
+ flow_to_continue = selected_flow
134
+ elif selected_flow in interrupted_flow_names:
135
+ # the user mentioned the flow by name
136
+ # find the flow id for the flow name
137
+ # the list of names and ids are in the same order
138
+ flow_to_continue = interrupted_flow_ids[
139
+ interrupted_flow_names.index(selected_flow)
140
+ ]
141
+
142
+ # if the user did not select a valid flow,
143
+ # we need to ask them to select a valid flow
144
+ if flow_to_continue is None:
145
+ await output_channel.send_text_message(
146
+ tracker.sender_id,
147
+ "You haven't selected a valid task to resume. "
148
+ "Please specify the task you would like to continue. "
149
+ "The options are: {{context.interrupted_flow_options}}",
150
+ )
151
+ return []
152
+
153
+ # resume the flow the user selected
154
+ events = resume_flow(flow_to_continue, tracker, tracker.stack)
155
+
156
+ return events + [
157
+ SlotSet(INTERRUPTED_FLOW_TO_CONTINUE_SLOT, None),
158
+ SlotSet(CONTINUE_INTERRUPTED_FLOW_CONFIRMATION_SLOT, None),
159
+ ]
160
+
161
+
162
+ class ActionCancelInterruptedFlows(Action):
163
+ def name(self) -> str:
164
+ return ACTION_CANCEL_INTERRUPTED_FLOWS
165
+
166
+ async def run(
167
+ self,
168
+ output_channel: OutputChannel,
169
+ nlg: NaturalLanguageGenerator,
170
+ tracker: DialogueStateTracker,
171
+ domain: Domain,
172
+ metadata: Optional[Dict[Text, Any]] = None,
173
+ ) -> List[Event]:
174
+ # get the pattern frame from the stack
175
+ pattern_frame = get_active_continue_interrupted_pattern_frame(tracker.stack)
176
+
177
+ if pattern_frame is None:
178
+ structlogger.warning(
179
+ "action.continue_interrupted_flows.no_continue_interrupted_frame"
180
+ )
181
+ return []
182
+
183
+ interrupted_flow_ids = pattern_frame.interrupted_flow_ids
184
+
185
+ event_list: List[Event] = []
186
+
187
+ # cancel all interrupted flows
188
+ for flow_id in interrupted_flow_ids:
189
+ event_list.extend(self.cancel_flow(tracker, tracker.stack, flow_id))
190
+
191
+ return event_list + [
192
+ SlotSet(INTERRUPTED_FLOW_TO_CONTINUE_SLOT, None),
193
+ SlotSet(CONTINUE_INTERRUPTED_FLOW_CONFIRMATION_SLOT, None),
194
+ ]
195
+
196
+ def cancel_flow(
197
+ self,
198
+ tracker: DialogueStateTracker,
199
+ stack: DialogueStack,
200
+ flow_id: str,
201
+ ) -> List[Event]:
202
+ """Cancels a flow by flow id."""
203
+ applied_events: List[Event] = []
204
+
205
+ frames_to_cancel, user_frame_to_cancel = self._collect_frames_to_cancel(
206
+ stack, flow_id
207
+ )
208
+
209
+ # if the flow is not on the stack, do nothing
210
+ if user_frame_to_cancel is None:
211
+ structlogger.error(
212
+ "cancel_flow.no_user_frame_to_cancel",
213
+ flow_id=flow_id,
214
+ )
215
+ return []
216
+
217
+ frames_ids_to_cancel = [frame.frame_id for frame in frames_to_cancel]
218
+
219
+ stack.push(
220
+ CancelPatternFlowStackFrame(
221
+ canceled_name=flow_id,
222
+ canceled_frames=frames_ids_to_cancel,
223
+ )
224
+ )
225
+
226
+ # create flow cancelled event
227
+ applied_events.extend(
228
+ [
229
+ FlowCancelled(
230
+ user_frame_to_cancel.flow_id, user_frame_to_cancel.step_id
231
+ ),
232
+ ]
233
+ )
234
+ # create agent cancelled events for any agent frames that are on the stack
235
+ for frame in frames_to_cancel:
236
+ if isinstance(frame, AgentStackFrame):
237
+ applied_events.append(
238
+ AgentCancelled(
239
+ frame.agent_id, frame.flow_id, reason="Flow was cancelled"
240
+ )
241
+ )
242
+
243
+ update_stack_events = tracker.create_stack_updated_events(stack)
244
+
245
+ return applied_events + update_stack_events
246
+
247
+ def _collect_frames_to_cancel(
248
+ self, stack: DialogueStack, target_flow_id: str
249
+ ) -> Tuple[List[DialogueStackFrame], Optional[UserFlowStackFrame]]:
250
+ """Collect frames that need to be cancelled.
251
+
252
+ Args:
253
+ stack: The stack to collect frames from.
254
+ target_flow_id: The ID of the flow to cancel.
255
+
256
+ Returns:
257
+ A tuple containing (frames_to_cancel, frame_to_cancel).
258
+ """
259
+ frames_to_cancel: List[DialogueStackFrame] = []
260
+ frame_found = False
261
+ frame_to_cancel = None
262
+
263
+ # collect all frames that belong to the target flow
264
+ # i.e. we want to cancel all frames that are on the stack and between
265
+ # the user flow frame that belongs to the target flow and the next user
266
+ # flow frame that belongs to a different flow
267
+ # this includes any pattern frames or agent frames as well
268
+ for frame in stack.frames:
269
+ if isinstance(frame, UserFlowStackFrame) and (
270
+ frame.frame_type == FlowStackFrameType.REGULAR
271
+ or frame.frame_type == FlowStackFrameType.INTERRUPT
272
+ ):
273
+ if frame.flow_id == target_flow_id:
274
+ frames_to_cancel.append(frame)
275
+ frame_to_cancel = frame
276
+ frame_found = True
277
+ continue
278
+ elif frame_found:
279
+ break
280
+
281
+ if frame_found:
282
+ frames_to_cancel.append(frame)
283
+
284
+ return list(frames_to_cancel), frame_to_cancel
@@ -1,6 +1,18 @@
1
1
  version: "3.1"
2
2
  responses:
3
3
 
4
+ utter_ask_continue_interrupted_flow_confirmation:
5
+ - text: "Would you like to continue with {{context.interrupted_flow_options}}?"
6
+ metadata:
7
+ rephrase: True
8
+ template: jinja
9
+
10
+ utter_ask_interrupted_flow_to_continue:
11
+ - text: "Would you like to resume {{context.interrupted_flow_options}}?"
12
+ metadata:
13
+ rephrase: True
14
+ template: jinja
15
+
4
16
  utter_ask_rephrase:
5
17
  - text: I’m sorry I am unable to understand you, could you please rephrase?
6
18
 
@@ -53,12 +65,6 @@ responses:
53
65
  rephrase: True
54
66
  template: jinja
55
67
 
56
- utter_flow_continue_interrupted:
57
- - text: "Let's continue with {{ context.previous_flow_name }}."
58
- metadata:
59
- rephrase: True
60
- template: jinja
61
-
62
68
  utter_free_chitchat_response:
63
69
  - text: "Sorry, I'm not able to answer that right now."
64
70
  metadata:
@@ -81,7 +87,7 @@ responses:
81
87
  rephrase: True
82
88
 
83
89
  utter_inform_hangup:
84
- - text: It seems you are not there anymore. I will hang up shortly.
90
+ - text: I haven’t heard from you, so I’ll end our conversation shortly.
85
91
  metadata:
86
92
  rephrase: True
87
93
 
@@ -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,33 @@ 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: collect_interrupted_flow_to_continue
231
+ - else: collect_continue_interrupted_flow_confirmation
232
+ - id: collect_interrupted_flow_to_continue
233
+ collect: interrupted_flow_to_continue
234
+ 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'."
235
+ next:
236
+ - if: slots.interrupted_flow_to_continue != "none"
237
+ then:
238
+ - action: action_continue_interrupted_flow
239
+ next: END
240
+ - else:
241
+ - action: action_cancel_interrupted_flows
242
+ next: END
243
+ - id: collect_continue_interrupted_flow_confirmation
244
+ collect: continue_interrupted_flow_confirmation
245
+ 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."
246
+ next:
247
+ - if: slots.continue_interrupted_flow_confirmation
248
+ then:
249
+ - action: action_continue_interrupted_flow
250
+ next: END
251
+ - else:
252
+ - action: action_cancel_interrupted_flows
253
+ next: END
214
254
 
215
255
  pattern_correction:
216
256
  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],