rasa-pro 3.13.11__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 (588) 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/direct_custom_actions_executor.py +9 -2
  305. rasa/core/actions/grpc_custom_action_executor.py +1 -1
  306. rasa/core/agent.py +22 -2
  307. rasa/core/available_agents.py +239 -0
  308. rasa/core/brokers/broker.py +1 -1
  309. rasa/core/brokers/kafka.py +56 -8
  310. rasa/core/channels/__init__.py +82 -35
  311. rasa/core/channels/channel.py +4 -3
  312. rasa/core/channels/constants.py +3 -0
  313. rasa/core/channels/development_inspector.py +29 -16
  314. rasa/core/channels/hangouts.py +2 -2
  315. rasa/core/channels/inspector/README.md +25 -13
  316. rasa/core/channels/inspector/dist/assets/{arc-0b11fe30.js → arc-6177260a.js} +1 -1
  317. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-9eef30a7.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
  318. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-03e94f28.js → c4Diagram-3d4e48cf-f25427d5.js} +1 -1
  319. rasa/core/channels/inspector/dist/assets/channel-bf9cbb34.js +1 -0
  320. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-95c09eba.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
  321. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-38e8446c.js → classDiagram-v2-f2320105-58db65c0.js} +1 -1
  322. rasa/core/channels/inspector/dist/assets/clone-8f9083bb.js +1 -0
  323. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-57dc3038.js → createText-2e5e7dd3-088372e2.js} +1 -1
  324. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-4bac0545.js → edges-e0da2a9e-58676240.js} +1 -1
  325. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-81795c90.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
  326. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-89489ae6.js → flowDb-956e92f1-ea63f85c.js} +1 -1
  327. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-cd152627.js → flowDiagram-66a62f08-a2af48cd.js} +1 -1
  328. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-9ecd5b59.js +1 -0
  329. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-3da369bc.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
  330. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-85ec16f8.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
  331. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-495bc140.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
  332. rasa/core/channels/inspector/dist/assets/{graph-1ec4d266.js → graph-0a6f8466.js} +1 -1
  333. rasa/core/channels/inspector/dist/assets/{index-3862675e-0a0e97c9.js → index-3862675e-7610671a.js} +1 -1
  334. rasa/core/channels/inspector/dist/assets/index-74e01d94.js +1354 -0
  335. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-4d54bcde.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
  336. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-dc097114.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
  337. rasa/core/channels/inspector/dist/assets/{layout-1a08981e.js → layout-e7fbc2bf.js} +1 -1
  338. rasa/core/channels/inspector/dist/assets/{line-95f7f1d3.js → line-a8aa457c.js} +1 -1
  339. rasa/core/channels/inspector/dist/assets/{linear-97e69543.js → linear-3351e0d2.js} +1 -1
  340. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-8c71ff03.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
  341. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-f14c71c7.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
  342. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-f1d3c9ff.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
  343. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-bfa2412f.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
  344. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-53f2c97b.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
  345. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-319d7c0e.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
  346. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-76a09418.js → stateDiagram-587899a1-0e770395.js} +1 -1
  347. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-a67f15d4.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
  348. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-0654e7c3.js → styles-6aaf32cf-36a9e70d.js} +1 -1
  349. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-1394bb9d.js → styles-9a916d00-884a8b5b.js} +1 -1
  350. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-e4c5bdae.js → styles-c10674c1-dc097813.js} +1 -1
  351. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-50957104.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
  352. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-b0885a6a.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
  353. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-79e6541a.js → xychartDiagram-e933f94c-afb6fe56.js} +1 -1
  354. rasa/core/channels/inspector/dist/index.html +1 -1
  355. rasa/core/channels/inspector/package.json +18 -18
  356. rasa/core/channels/inspector/src/App.tsx +56 -12
  357. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +1 -1
  358. rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
  359. rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +4 -2
  360. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +20 -3
  361. rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +296 -0
  362. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +6 -2
  363. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +26 -4
  364. rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
  365. rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
  366. rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
  367. rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
  368. rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
  369. rasa/core/channels/inspector/src/types.ts +55 -1
  370. rasa/core/channels/inspector/yarn.lock +336 -189
  371. rasa/core/channels/socketio.py +212 -51
  372. rasa/core/channels/studio_chat.py +82 -32
  373. rasa/core/channels/telegram.py +4 -9
  374. rasa/core/channels/voice_ready/twilio_voice.py +1 -1
  375. rasa/core/channels/voice_stream/asr/asr_event.py +1 -1
  376. rasa/core/channels/voice_stream/asr/azure.py +6 -3
  377. rasa/core/channels/voice_stream/asr/deepgram.py +1 -1
  378. rasa/core/channels/voice_stream/audiocodes.py +11 -6
  379. rasa/core/channels/voice_stream/browser_audio.py +91 -4
  380. rasa/core/channels/voice_stream/call_state.py +13 -2
  381. rasa/core/channels/voice_stream/genesys.py +19 -15
  382. rasa/core/channels/voice_stream/jambonz.py +22 -12
  383. rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
  384. rasa/core/channels/voice_stream/twilio_media_streams.py +35 -14
  385. rasa/core/channels/voice_stream/util.py +11 -1
  386. rasa/core/channels/voice_stream/voice_channel.py +170 -32
  387. rasa/core/concurrent_lock_store.py +83 -16
  388. rasa/core/config/__init__.py +0 -0
  389. rasa/core/{available_endpoints.py → config/available_endpoints.py} +56 -18
  390. rasa/core/config/configuration.py +295 -0
  391. rasa/core/config/credentials.py +19 -0
  392. rasa/core/config/message_procesing_config.py +34 -0
  393. rasa/core/constants.py +17 -0
  394. rasa/core/exceptions.py +1 -1
  395. rasa/core/featurizers/tracker_featurizers.py +3 -2
  396. rasa/core/iam_credentials_providers/__init__.py +0 -0
  397. rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +291 -0
  398. rasa/core/iam_credentials_providers/credentials_provider_protocol.py +91 -0
  399. rasa/core/lock_store.py +50 -10
  400. rasa/core/nlg/contextual_response_rephraser.py +5 -0
  401. rasa/core/nlg/generator.py +1 -1
  402. rasa/core/persistor.py +7 -7
  403. rasa/core/policies/enterprise_search_policy.py +9 -10
  404. rasa/core/policies/flow_policy.py +4 -4
  405. rasa/core/policies/flows/agent_executor.py +720 -0
  406. rasa/core/policies/flows/flow_exceptions.py +5 -2
  407. rasa/core/policies/flows/flow_executor.py +146 -77
  408. rasa/core/policies/flows/mcp_tool_executor.py +304 -0
  409. rasa/core/policies/intentless_policy.py +1 -1
  410. rasa/core/policies/rule_policy.py +1 -1
  411. rasa/core/policies/ted_policy.py +20 -12
  412. rasa/core/policies/unexpected_intent_policy.py +6 -0
  413. rasa/core/processor.py +100 -44
  414. rasa/core/redis_connection_factory.py +474 -0
  415. rasa/core/run.py +49 -10
  416. rasa/core/test.py +4 -0
  417. rasa/core/tracker_stores/redis_tracker_store.py +36 -14
  418. rasa/core/tracker_stores/sql_tracker_store.py +59 -1
  419. rasa/core/tracker_stores/tracker_store.py +3 -7
  420. rasa/core/train.py +1 -1
  421. rasa/core/training/interactive.py +20 -18
  422. rasa/core/training/story_conflict.py +5 -5
  423. rasa/core/utils.py +22 -23
  424. rasa/dialogue_understanding/commands/__init__.py +8 -0
  425. rasa/dialogue_understanding/commands/cancel_flow_command.py +20 -6
  426. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +21 -2
  427. rasa/dialogue_understanding/commands/clarify_command.py +20 -2
  428. rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
  429. rasa/dialogue_understanding/commands/knowledge_answer_command.py +21 -2
  430. rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
  431. rasa/dialogue_understanding/commands/start_flow_command.py +75 -7
  432. rasa/dialogue_understanding/commands/utils.py +135 -2
  433. rasa/dialogue_understanding/generator/command_parser.py +4 -0
  434. rasa/dialogue_understanding/generator/flow_retrieval.py +0 -9
  435. rasa/dialogue_understanding/generator/llm_based_command_generator.py +52 -12
  436. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  437. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  438. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +66 -0
  439. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +66 -0
  440. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +89 -0
  441. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +88 -0
  442. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +42 -7
  443. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +40 -3
  444. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +20 -3
  445. rasa/dialogue_understanding/patterns/cancel.py +27 -6
  446. rasa/dialogue_understanding/patterns/clarify.py +3 -14
  447. rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
  448. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +49 -9
  449. rasa/dialogue_understanding/processor/command_processor.py +136 -15
  450. rasa/dialogue_understanding/stack/dialogue_stack.py +98 -2
  451. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
  452. rasa/dialogue_understanding/stack/utils.py +57 -3
  453. rasa/dialogue_understanding/utils.py +24 -4
  454. rasa/dialogue_understanding_test/du_test_runner.py +8 -3
  455. rasa/e2e_test/e2e_test_runner.py +13 -3
  456. rasa/engine/caching.py +2 -2
  457. rasa/engine/constants.py +1 -1
  458. rasa/engine/graph.py +5 -1
  459. rasa/engine/loader.py +12 -0
  460. rasa/engine/recipes/default_components.py +138 -49
  461. rasa/engine/recipes/default_recipe.py +108 -11
  462. rasa/engine/runner/dask.py +8 -5
  463. rasa/engine/validation.py +25 -8
  464. rasa/graph_components/validators/default_recipe_validator.py +86 -28
  465. rasa/hooks.py +5 -5
  466. rasa/llm_fine_tuning/utils.py +2 -2
  467. rasa/model_manager/model_api.py +4 -5
  468. rasa/model_manager/runner_service.py +2 -2
  469. rasa/model_manager/socket_bridge.py +21 -17
  470. rasa/model_manager/trainer_service.py +12 -9
  471. rasa/model_manager/utils.py +1 -29
  472. rasa/model_manager/warm_rasa_process.py +13 -3
  473. rasa/model_training.py +60 -47
  474. rasa/nlu/classifiers/diet_classifier.py +198 -98
  475. rasa/nlu/classifiers/logistic_regression_classifier.py +1 -4
  476. rasa/nlu/classifiers/mitie_intent_classifier.py +3 -0
  477. rasa/nlu/classifiers/sklearn_intent_classifier.py +1 -3
  478. rasa/nlu/extractors/crf_entity_extractor.py +9 -10
  479. rasa/nlu/extractors/mitie_entity_extractor.py +3 -0
  480. rasa/nlu/extractors/spacy_entity_extractor.py +3 -0
  481. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +4 -0
  482. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +5 -0
  483. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +2 -0
  484. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +3 -0
  485. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +4 -2
  486. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -0
  487. rasa/nlu/selectors/response_selector.py +10 -2
  488. rasa/nlu/tokenizers/jieba_tokenizer.py +3 -4
  489. rasa/nlu/tokenizers/mitie_tokenizer.py +3 -2
  490. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -2
  491. rasa/nlu/utils/mitie_utils.py +3 -0
  492. rasa/nlu/utils/spacy_utils.py +3 -2
  493. rasa/plugin.py +8 -8
  494. rasa/privacy/privacy_config.py +1 -1
  495. rasa/privacy/privacy_manager.py +12 -3
  496. rasa/server.py +15 -3
  497. rasa/shared/agents/__init__.py +0 -0
  498. rasa/shared/agents/auth/__init__.py +0 -0
  499. rasa/shared/agents/auth/agent_auth_factory.py +105 -0
  500. rasa/shared/agents/auth/agent_auth_manager.py +92 -0
  501. rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
  502. rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
  503. rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
  504. rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
  505. rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +170 -0
  506. rasa/shared/agents/auth/constants.py +13 -0
  507. rasa/shared/agents/auth/types.py +12 -0
  508. rasa/shared/agents/auth/utils.py +85 -0
  509. rasa/shared/agents/utils.py +35 -0
  510. rasa/shared/constants.py +11 -0
  511. rasa/shared/core/constants.py +17 -1
  512. rasa/shared/core/domain.py +62 -22
  513. rasa/shared/core/events.py +329 -0
  514. rasa/shared/core/flows/constants.py +5 -0
  515. rasa/shared/core/flows/flow.py +1 -1
  516. rasa/shared/core/flows/flow_step.py +7 -1
  517. rasa/shared/core/flows/flows_list.py +21 -5
  518. rasa/shared/core/flows/flows_yaml_schema.json +119 -184
  519. rasa/shared/core/flows/steps/call.py +57 -6
  520. rasa/shared/core/flows/steps/collect.py +98 -13
  521. rasa/shared/core/flows/validation.py +372 -8
  522. rasa/shared/core/flows/yaml_flows_io.py +19 -10
  523. rasa/shared/core/slots.py +6 -2
  524. rasa/shared/core/trackers.py +5 -2
  525. rasa/shared/core/training_data/story_reader/story_reader.py +1 -1
  526. rasa/shared/exceptions.py +39 -2
  527. rasa/shared/importers/importer.py +6 -0
  528. rasa/shared/importers/rasa.py +1 -1
  529. rasa/shared/importers/utils.py +86 -4
  530. rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
  531. rasa/shared/providers/llm/_base_litellm_client.py +41 -9
  532. rasa/shared/providers/llm/litellm_router_llm_client.py +10 -6
  533. rasa/shared/providers/llm/llm_client.py +7 -3
  534. rasa/shared/providers/llm/llm_response.py +66 -0
  535. rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
  536. rasa/shared/utils/common.py +26 -1
  537. rasa/shared/utils/health_check/health_check.py +7 -3
  538. rasa/shared/utils/llm.py +92 -19
  539. rasa/shared/utils/mcp/__init__.py +0 -0
  540. rasa/shared/utils/mcp/server_connection.py +250 -0
  541. rasa/shared/utils/mcp/utils.py +20 -0
  542. rasa/shared/utils/schemas/events.py +42 -0
  543. rasa/shared/utils/yaml.py +3 -1
  544. rasa/studio/download.py +3 -0
  545. rasa/studio/prompts.py +1 -0
  546. rasa/studio/pull/pull.py +3 -2
  547. rasa/studio/train.py +8 -7
  548. rasa/studio/upload.py +19 -52
  549. rasa/telemetry.py +166 -28
  550. rasa/tracing/config.py +45 -12
  551. rasa/tracing/constants.py +14 -0
  552. rasa/tracing/instrumentation/attribute_extractors.py +142 -9
  553. rasa/tracing/instrumentation/instrumentation.py +626 -21
  554. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
  555. rasa/tracing/instrumentation/metrics.py +32 -0
  556. rasa/tracing/metric_instrument_provider.py +68 -0
  557. rasa/utils/common.py +92 -1
  558. rasa/utils/endpoints.py +11 -2
  559. rasa/utils/io.py +27 -9
  560. rasa/utils/json_utils.py +6 -1
  561. rasa/utils/licensing.py +21 -10
  562. rasa/utils/log_utils.py +121 -7
  563. rasa/utils/ml_utils.py +1 -1
  564. rasa/utils/openapi.py +144 -0
  565. rasa/utils/plotting.py +1 -1
  566. rasa/utils/pypred.py +45 -0
  567. rasa/utils/tensorflow/__init__.py +7 -0
  568. rasa/utils/tensorflow/callback.py +136 -101
  569. rasa/utils/tensorflow/crf.py +1 -1
  570. rasa/utils/tensorflow/data_generator.py +21 -8
  571. rasa/utils/tensorflow/layers.py +21 -11
  572. rasa/utils/tensorflow/metrics.py +7 -3
  573. rasa/utils/tensorflow/models.py +56 -8
  574. rasa/utils/tensorflow/rasa_layers.py +8 -6
  575. rasa/utils/tensorflow/transformer.py +2 -3
  576. rasa/utils/train_utils.py +54 -24
  577. rasa/validator.py +149 -16
  578. rasa/version.py +1 -1
  579. rasa_pro-3.14.0.dist-info/METADATA +212 -0
  580. {rasa_pro-3.13.11.dist-info → rasa_pro-3.14.0.dist-info}/RECORD +583 -271
  581. rasa/core/channels/inspector/dist/assets/channel-51d02e9e.js +0 -1
  582. rasa/core/channels/inspector/dist/assets/clone-cc738fa6.js +0 -1
  583. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-0c716443.js +0 -1
  584. rasa/core/channels/inspector/dist/assets/index-c804b295.js +0 -1335
  585. rasa_pro-3.13.11.dist-info/METADATA +0 -192
  586. {rasa_pro-3.13.11.dist-info → rasa_pro-3.14.0.dist-info}/NOTICE +0 -0
  587. {rasa_pro-3.13.11.dist-info → rasa_pro-3.14.0.dist-info}/WHEEL +0 -0
  588. {rasa_pro-3.13.11.dist-info → rasa_pro-3.14.0.dist-info}/entry_points.txt +0 -0
@@ -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
@@ -94,6 +94,18 @@ class InvalidFlowStepIdException(Exception):
94
94
  super().__init__(f"Invalid flow step ID '{step_id}' for flow '{flow_id}'.")
95
95
 
96
96
 
97
+ class InvalidAgentState(RasaException):
98
+ """Raised if the agent state is invalid."""
99
+
100
+ def __init__(self, invalid_state: str) -> None:
101
+ """Creates a `InvalidAgentState`.
102
+
103
+ Args:
104
+ invalid_state: The invalid agent state.
105
+ """
106
+ super().__init__(f"Invalid agent state '{invalid_state}'.")
107
+
108
+
97
109
  @dataclass
98
110
  class BaseFlowStackFrame(DialogueStackFrame):
99
111
  flow_id: str = "" # needed to avoid "default arg before non-default" error
@@ -171,3 +183,48 @@ class UserFlowStackFrame(BaseFlowStackFrame):
171
183
  step_id=data["step_id"],
172
184
  frame_type=FlowStackFrameType.from_str(data.get("frame_type")),
173
185
  )
186
+
187
+
188
+ class AgentState(str, Enum):
189
+ INTERRUPTED = "interrupted"
190
+ WAITING_FOR_INPUT = "waiting_for_input"
191
+
192
+ @staticmethod
193
+ def from_str(state: Optional[str]) -> AgentState:
194
+ if state == AgentState.WAITING_FOR_INPUT.value:
195
+ return AgentState.WAITING_FOR_INPUT
196
+ elif state == AgentState.INTERRUPTED.value:
197
+ return AgentState.INTERRUPTED
198
+ else:
199
+ raise InvalidAgentState(state)
200
+
201
+
202
+ @dataclass
203
+ class AgentStackFrame(BaseFlowStackFrame):
204
+ agent_id: str = ""
205
+ state: AgentState = AgentState.WAITING_FOR_INPUT
206
+ metadata: Optional[Dict[str, Any]] = None
207
+
208
+ @classmethod
209
+ def type(cls) -> str:
210
+ """Returns the type of the frame."""
211
+ return "agent"
212
+
213
+ @staticmethod
214
+ def from_dict(data: Dict[str, Any]) -> AgentStackFrame:
215
+ """Creates a `AgentStackFrame` from a dictionary.
216
+
217
+ Args:
218
+ data: The dictionary to create the `AgentStackFrame` from.
219
+
220
+ Returns:
221
+ The created `AgentStackFrame`.
222
+ """
223
+ return AgentStackFrame(
224
+ frame_id=data["frame_id"],
225
+ flow_id=data["flow_id"],
226
+ step_id=data["step_id"],
227
+ agent_id=data["agent_id"],
228
+ state=AgentState.from_str(data["state"]),
229
+ metadata=data.get("metadata"),
230
+ )
@@ -17,6 +17,9 @@ from rasa.shared.core.flows.steps.constants import END_STEP
17
17
  from rasa.shared.core.flows.steps.continuation import ContinueFlowStep
18
18
 
19
19
  if typing.TYPE_CHECKING:
20
+ from rasa.dialogue_understanding.patterns.continue_interrupted import (
21
+ ContinueInterruptedPatternFlowStackFrame,
22
+ )
20
23
  from rasa.shared.core.trackers import DialogueStateTracker
21
24
 
22
25
 
@@ -171,10 +174,40 @@ def user_flows_on_the_stack(dialogue_stack: DialogueStack) -> Set[str]:
171
174
  All user flows that are currently on the stack.
172
175
  """
173
176
  return {
174
- f.flow_id for f in dialogue_stack.frames if isinstance(f, UserFlowStackFrame)
177
+ frame.flow_id
178
+ for frame in user_frames_on_the_stack(
179
+ dialogue_stack, ignore_call_and_link_frames=False
180
+ )
175
181
  }
176
182
 
177
183
 
184
+ def user_frames_on_the_stack(
185
+ dialogue_stack: DialogueStack, ignore_call_and_link_frames: bool = True
186
+ ) -> List[UserFlowStackFrame]:
187
+ """Get all user frames that are currently on the stack.
188
+
189
+ Args:
190
+ dialogue_stack: The dialogue stack.
191
+ ignore_call_and_link_frames: Whether to ignore user frames of type `call`
192
+ and `link`. By default, these frames are ignored.
193
+
194
+ Returns:
195
+ All user frames that are currently on the stack.
196
+ """
197
+ return [
198
+ frame
199
+ for frame in dialogue_stack.frames
200
+ if isinstance(frame, UserFlowStackFrame)
201
+ and (
202
+ not ignore_call_and_link_frames
203
+ or (
204
+ frame.frame_type != FlowStackFrameType.CALL
205
+ and frame.frame_type != FlowStackFrameType.LINK
206
+ )
207
+ )
208
+ ]
209
+
210
+
178
211
  def end_top_user_flow(stack: DialogueStack) -> DialogueStack:
179
212
  """Ends all frames on top of the stack including the topmost user frame.
180
213
 
@@ -198,8 +231,9 @@ def end_top_user_flow(stack: DialogueStack) -> DialogueStack:
198
231
  def get_collect_steps_excluding_ask_before_filling_for_active_flow(
199
232
  dialogue_stack: DialogueStack, all_flows: FlowsList
200
233
  ) -> Set[str]:
201
- """Get all collect steps that are part of the current flow, without
202
- considering the collect steps that has to be asked before filling.
234
+ """Get all collect steps that are part of the current flow.
235
+
236
+ Collect steps that have to be asked before filling are not considered.
203
237
 
204
238
  Args:
205
239
  dialogue_stack: The dialogue stack.
@@ -230,3 +264,23 @@ def get_collect_steps_excluding_ask_before_filling_for_active_flow(
230
264
  for step in active_flow.get_collect_steps()
231
265
  if not step.ask_before_filling
232
266
  )
267
+
268
+
269
+ def is_continue_interrupted_flow_active(stack: DialogueStack) -> bool:
270
+ """Check if the continue interrupted flow is active."""
271
+ return get_active_continue_interrupted_pattern_frame(stack) is not None
272
+
273
+
274
+ def get_active_continue_interrupted_pattern_frame(
275
+ stack: DialogueStack,
276
+ ) -> Optional["ContinueInterruptedPatternFlowStackFrame"]:
277
+ from rasa.dialogue_understanding.patterns.continue_interrupted import (
278
+ ContinueInterruptedPatternFlowStackFrame,
279
+ )
280
+
281
+ for frame in reversed(stack.frames):
282
+ if isinstance(frame, ContinueInterruptedPatternFlowStackFrame):
283
+ return frame
284
+ if isinstance(frame, UserFlowStackFrame):
285
+ return None
286
+ return None
@@ -1,9 +1,9 @@
1
+ import typing
1
2
  from contextlib import contextmanager
2
3
  from typing import Any, Dict, Generator, List, Optional, Text
3
4
 
4
5
  import structlog
5
6
 
6
- from rasa.dialogue_understanding.commands import Command, NoopCommand, SetSlotCommand
7
7
  from rasa.dialogue_understanding.constants import (
8
8
  RASA_RECORD_COMMANDS_AND_PROMPTS_ENV_VAR_NAME,
9
9
  )
@@ -23,6 +23,9 @@ from rasa.shared.nlu.training_data.message import Message
23
23
  from rasa.shared.providers.llm.llm_response import LLMResponse
24
24
  from rasa.utils.common import get_bool_env_variable
25
25
 
26
+ if typing.TYPE_CHECKING:
27
+ from rasa.dialogue_understanding.commands import Command
28
+
26
29
  record_commands_and_prompts = get_bool_env_variable(
27
30
  RASA_RECORD_COMMANDS_AND_PROMPTS_ENV_VAR_NAME, False
28
31
  )
@@ -41,7 +44,7 @@ def set_record_commands_and_prompts() -> Generator:
41
44
 
42
45
 
43
46
  def add_commands_to_message_parse_data(
44
- message: Message, component_name: str, commands: List[Command]
47
+ message: Message, component_name: str, commands: List["Command"]
45
48
  ) -> None:
46
49
  """Add commands to the message parse data.
47
50
 
@@ -144,6 +147,11 @@ def _handle_via_nlu_in_coexistence(
144
147
  tracker: Optional[DialogueStateTracker], message: Message
145
148
  ) -> bool:
146
149
  """Check if the message should be handled by the NLU subsystem in coexistence mode.""" # noqa: E501
150
+ from rasa.dialogue_understanding.commands import (
151
+ NoopCommand,
152
+ SetSlotCommand,
153
+ )
154
+
147
155
  if not tracker:
148
156
  return False
149
157
 
@@ -156,8 +164,7 @@ def _handle_via_nlu_in_coexistence(
156
164
  "utils.handle_via_nlu_in_coexistence"
157
165
  ".tracker_missing_route_session_to_calm_slot",
158
166
  event_info=(
159
- f"Tracker doesn't have the '{ROUTE_TO_CALM_SLOT}' slot."
160
- f"Routing to CALM."
167
+ f"Tracker doesn't have the '{ROUTE_TO_CALM_SLOT}' slot.Routing to CALM."
161
168
  ),
162
169
  route_session_to_calm=commands,
163
170
  )
@@ -218,3 +225,16 @@ def _handle_via_nlu_in_coexistence(
218
225
  commands=commands,
219
226
  )
220
227
  return False
228
+
229
+
230
+ def assemble_options_string(names: List[str], conjunction: str = "and") -> str:
231
+ """Concatenate options to a human-readable string."""
232
+ option_message = ""
233
+ for i, name in enumerate(names):
234
+ if i == 0:
235
+ option_message += name
236
+ elif i == len(names) - 1:
237
+ option_message += f" {conjunction} {name}"
238
+ else:
239
+ option_message += f", {name}"
240
+ return option_message
@@ -1,12 +1,14 @@
1
1
  import asyncio
2
2
  import time
3
- from typing import Any, Dict, List, Optional, Text
3
+ from pathlib import Path
4
+ from typing import Any, Dict, List, Optional, Union
4
5
 
5
6
  import structlog
6
7
  from tqdm import tqdm
7
8
 
8
- from rasa.core.available_endpoints import AvailableEndpoints
9
9
  from rasa.core.channels import CollectingOutputChannel, UserMessage
10
+ from rasa.core.config.available_endpoints import AvailableEndpoints
11
+ from rasa.core.config.configuration import Configuration
10
12
  from rasa.core.exceptions import AgentNotReady
11
13
  from rasa.core.persistor import StorageType
12
14
  from rasa.dialogue_understanding.commands import Command
@@ -52,10 +54,11 @@ class DialogueUnderstandingTestRunner:
52
54
 
53
55
  def __init__(
54
56
  self,
55
- model_path: Optional[Text] = None,
57
+ model_path: Optional[str] = None,
56
58
  model_server: Optional[EndpointConfig] = None,
57
59
  remote_storage: Optional[StorageType] = None,
58
60
  endpoints: Optional[AvailableEndpoints] = None,
61
+ sub_agents_path: Optional[Union[Path, str]] = None,
59
62
  ) -> None:
60
63
  """Initializes the Dialogue Understanding test suite runner.
61
64
 
@@ -68,6 +71,7 @@ class DialogueUnderstandingTestRunner:
68
71
  import rasa.core.agent
69
72
 
70
73
  self._check_action_server(endpoints)
74
+ sub_agents = Configuration.get_instance().available_agents
71
75
 
72
76
  self.agent = asyncio.run(
73
77
  rasa.core.agent.load_agent(
@@ -75,6 +79,7 @@ class DialogueUnderstandingTestRunner:
75
79
  model_server=model_server,
76
80
  remote_storage=remote_storage,
77
81
  endpoints=endpoints,
82
+ sub_agents=sub_agents,
78
83
  )
79
84
  )
80
85
  if not self.agent.is_ready():
@@ -13,8 +13,9 @@ import structlog
13
13
  from tqdm import tqdm
14
14
 
15
15
  import rasa.shared.utils.io
16
- from rasa.core.available_endpoints import AvailableEndpoints
17
16
  from rasa.core.channels import CollectingOutputChannel, UserMessage
17
+ from rasa.core.config.available_endpoints import AvailableEndpoints
18
+ from rasa.core.config.configuration import Configuration
18
19
  from rasa.core.constants import ACTIVE_FLOW_METADATA_KEY, STEP_ID_METADATA_KEY
19
20
  from rasa.core.exceptions import AgentNotReady
20
21
  from rasa.core.persistor import StorageType
@@ -65,6 +66,7 @@ class E2ETestRunner:
65
66
  model_server: Optional[EndpointConfig] = None,
66
67
  remote_storage: Optional[StorageType] = None,
67
68
  endpoints: Optional[AvailableEndpoints] = None,
69
+ sub_agents_path: Optional[Text] = None,
68
70
  **kwargs: Any,
69
71
  ) -> None:
70
72
  """Initializes the E2E test suite runner.
@@ -94,12 +96,15 @@ class E2ETestRunner:
94
96
  if endpoints and not are_custom_actions_stubbed:
95
97
  self._action_server_is_reachable(endpoints)
96
98
 
99
+ sub_agents = Configuration.get_instance().available_agents
100
+
97
101
  self.agent = asyncio.run(
98
102
  rasa.core.agent.load_agent(
99
103
  model_path=model_path,
100
104
  model_server=model_server,
101
105
  remote_storage=remote_storage,
102
106
  endpoints=endpoints,
107
+ sub_agents=sub_agents,
103
108
  )
104
109
  )
105
110
 
@@ -742,7 +747,7 @@ class E2ETestRunner:
742
747
  test_result = test_turns[index]
743
748
  if index in failure_points:
744
749
  diff_test_text, diff_actual_text = cls._handle_fail_diff(
745
- test_result, # type: ignore[arg-type]
750
+ test_result,
746
751
  latest_response,
747
752
  cls._select_bot_utter_turns(test_turns, index),
748
753
  ) # test_result can only be TestStep in failure_points
@@ -806,7 +811,12 @@ class E2ETestRunner:
806
811
  """
807
812
  # This will only be used when the TestCase is not started
808
813
  # with a user step
809
- latest_response: ActualStepOutput = test_turns[-1] # type: ignore[assignment]
814
+ latest_response_event = test_turns[-1]
815
+ if not isinstance(latest_response_event, ActualStepOutput):
816
+ raise ValueError(
817
+ f"Expected ActualStepOutput, got {type(latest_response_event)}"
818
+ )
819
+ latest_response: ActualStepOutput = latest_response_event
810
820
  failures = []
811
821
  match = None
812
822
  for position in range(last_user_step_position, len(test_turns) - 1):
rasa/engine/caching.py CHANGED
@@ -5,7 +5,7 @@ import logging
5
5
  import shutil
6
6
  from datetime import datetime
7
7
  from pathlib import Path
8
- from typing import Any, List, Optional, Text, Tuple
8
+ from typing import Any, List, Optional, Text, Tuple, Union
9
9
 
10
10
  import sqlalchemy as sa
11
11
  import sqlalchemy.orm
@@ -294,7 +294,7 @@ class LocalTrainingCache(TrainingCache):
294
294
 
295
295
  def _cache_output_to_disk(
296
296
  self, output: Cacheable, model_storage: ModelStorage
297
- ) -> Tuple[Optional[Text], Optional[Text]]:
297
+ ) -> Tuple[Optional[Union[Path, Text]], Optional[Text]]:
298
298
  tempdir_name = rasa.utils.common.get_temp_dir_name()
299
299
 
300
300
  # Use `TempDirectoryPath` instead of `tempfile.TemporaryDirectory` as this
rasa/engine/constants.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from typing import List, Optional
2
2
 
3
- from rasa.core.available_endpoints import AvailableEndpoints
4
3
  from rasa.core.channels import UserMessage
4
+ from rasa.core.config.available_endpoints import AvailableEndpoints
5
5
  from rasa.shared.core.trackers import DialogueStateTracker
6
6
  from rasa.shared.importers.importer import TrainingDataImporter
7
7
 
rasa/engine/graph.py CHANGED
@@ -69,6 +69,7 @@ class SchemaNode:
69
69
 
70
70
  def matches_type(self, node_type: Type, include_subtypes: bool = True) -> bool:
71
71
  """Checks if schema node's 'uses' is of specified node type.
72
+
72
73
  By default, it also checks for subtypes of the specified node type.
73
74
  """
74
75
  return (self.uses is node_type) or (
@@ -171,6 +172,7 @@ class GraphSchema:
171
172
 
172
173
  def has_node(self, node_type: Type, include_subtypes: bool = True) -> bool:
173
174
  """Checks if the graph schema contains a node of the specified node type.
175
+
174
176
  By default, it also checks for subtypes of the specified node type.
175
177
  """
176
178
  for node in self.nodes.values():
@@ -181,7 +183,7 @@ class GraphSchema:
181
183
  def count_nodes_of_a_given_type(
182
184
  self, node_type: Type, include_subtypes: bool = True
183
185
  ) -> int:
184
- """Counts the number of the nodes of specified class"""
186
+ """Counts the number of the nodes of specified class."""
185
187
  counter = 0
186
188
  for node in self.nodes.values():
187
189
  if (node.uses is node_type) or (
@@ -353,6 +355,7 @@ class ExecutionContext:
353
355
 
354
356
  def has_node(self, node_type: Type, include_subtypes: bool = True) -> bool:
355
357
  """Checks if the graph node of the given type is present in the graph schema.
358
+
356
359
  By default, it also checks for subtypes of the specified node type.
357
360
  """
358
361
  return self.graph_schema.has_node(node_type, include_subtypes)
@@ -555,6 +558,7 @@ class GraphNode:
555
558
  structlogger.error(
556
559
  "graph.node.error_running_component",
557
560
  node_name=self._node_name,
561
+ error=str(e),
558
562
  )
559
563
  raise
560
564
 
rasa/engine/loader.py CHANGED
@@ -1,6 +1,8 @@
1
1
  from pathlib import Path
2
2
  from typing import Tuple, Type
3
3
 
4
+ import structlog
5
+
4
6
  from rasa.engine.graph import ExecutionContext
5
7
  from rasa.engine.runner.interface import GraphRunner
6
8
  from rasa.engine.storage.storage import ModelMetadata, ModelStorage
@@ -9,6 +11,8 @@ from rasa.engine.validation import (
9
11
  validate_model_group_configuration_setup,
10
12
  )
11
13
 
14
+ structlogger = structlog.get_logger()
15
+
12
16
 
13
17
  def load_predict_graph_runner(
14
18
  storage_path: Path,
@@ -30,6 +34,10 @@ def load_predict_graph_runner(
30
34
  model_storage, model_metadata = model_storage_class.from_model_archive(
31
35
  storage_path=storage_path, model_archive_path=model_archive_path
32
36
  )
37
+ structlogger.debug(
38
+ "engine.loader.load_predict_graph_runner.success",
39
+ model_id=model_metadata.model_id,
40
+ )
33
41
 
34
42
  # Components using LLMs or embeddings can reference model groups defined in
35
43
  # the endpoints.yml file for their client configurations. To ensure they will work
@@ -38,6 +46,10 @@ def load_predict_graph_runner(
38
46
  validate_model_group_configuration_setup()
39
47
  validate_model_client_configuration_setup_during_inference_time(model_metadata)
40
48
 
49
+ structlogger.debug(
50
+ "engine.loader.config.validation.success",
51
+ model_id=model_metadata.model_id,
52
+ )
41
53
  runner = graph_runner_class.create(
42
54
  graph_schema=model_metadata.predict_schema,
43
55
  model_storage=model_storage,