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
@@ -0,0 +1,720 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ from typing import Any, Dict, List, Optional, Tuple, cast
5
+
6
+ import structlog
7
+
8
+ from rasa.agents.agent_manager import AgentManager
9
+ from rasa.agents.constants import (
10
+ A2A_AGENT_CONTEXT_ID_KEY,
11
+ AGENT_METADATA_AGENT_RESPONSE_KEY,
12
+ AGENT_METADATA_EXIT_IF_KEY,
13
+ AGENT_METADATA_STRUCTURED_RESULTS_KEY,
14
+ MAX_AGENT_RETRY_DELAY_SECONDS,
15
+ )
16
+ from rasa.agents.core.types import AgentStatus, ProtocolType
17
+ from rasa.agents.schemas import AgentInput, AgentOutput
18
+ from rasa.agents.schemas.agent_input import AgentInputSlot
19
+ from rasa.core.config.configuration import Configuration
20
+ from rasa.core.policies.flows.flow_step_result import (
21
+ ContinueFlowWithNextStep,
22
+ FlowActionPrediction,
23
+ FlowStepResult,
24
+ PauseFlowReturnPrediction,
25
+ )
26
+ from rasa.core.utils import get_slot_names_from_exit_conditions
27
+ from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
28
+ from rasa.dialogue_understanding.patterns.internal_error import (
29
+ InternalErrorPatternFlowStackFrame,
30
+ )
31
+ from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
32
+ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
33
+ AgentStackFrame,
34
+ AgentState,
35
+ BaseFlowStackFrame,
36
+ )
37
+ from rasa.shared.agents.utils import get_protocol_type
38
+ from rasa.shared.core.constants import (
39
+ ACTION_AGENT_REQUEST_USER_INPUT_NAME,
40
+ ACTION_METADATA_MESSAGE_KEY,
41
+ ACTION_METADATA_TEXT_KEY,
42
+ ACTION_SEND_TEXT_NAME,
43
+ SLOTS_EXCLUDED_FOR_AGENT,
44
+ )
45
+ from rasa.shared.core.events import (
46
+ AgentCancelled,
47
+ AgentCompleted,
48
+ AgentResumed,
49
+ AgentStarted,
50
+ Event,
51
+ FlowCancelled,
52
+ SlotSet,
53
+ deserialise_events,
54
+ )
55
+ from rasa.shared.core.flows.flows_list import FlowsList
56
+ from rasa.shared.core.flows.steps import (
57
+ CallFlowStep,
58
+ )
59
+ from rasa.shared.core.slots import CategoricalSlot, Slot
60
+ from rasa.shared.core.trackers import DialogueStateTracker, EventVerbosity
61
+ from rasa.shared.utils.llm import tracker_as_readable_transcript
62
+
63
+ structlogger = structlog.get_logger()
64
+
65
+ MAX_AGENT_RETRIES = 3
66
+
67
+
68
+ def remove_agent_stack_frame(stack: DialogueStack, agent_id: str) -> None:
69
+ """Finishes the agentic loop by popping the agent stack frame from provided `stack`.
70
+
71
+ The `tracker.stack` is NOT modified.
72
+ """
73
+ agent_stack_frame = stack.find_agent_stack_frame_by_agent(agent_id)
74
+ if not agent_stack_frame:
75
+ return
76
+
77
+ while removed_frame := stack.pop():
78
+ structlogger.debug(
79
+ "flow_executor.remove_agent_stack_frame",
80
+ removed_frame=removed_frame,
81
+ )
82
+ if removed_frame == agent_stack_frame:
83
+ break
84
+
85
+
86
+ async def run_agent(
87
+ initial_events: List[Event],
88
+ stack: DialogueStack,
89
+ step: CallFlowStep,
90
+ tracker: DialogueStateTracker,
91
+ slots: List[Slot],
92
+ flows: FlowsList,
93
+ ) -> FlowStepResult:
94
+ """Run an agent call step."""
95
+ structlogger.debug(
96
+ "flow.step.run_agent",
97
+ agent_id=step.call,
98
+ step_id=step.id,
99
+ flow_id=step.flow_id,
100
+ event_info=f"Agent {step.call} started",
101
+ highlight=True,
102
+ )
103
+
104
+ final_events = initial_events
105
+ agent_stack_frame = tracker.stack.find_agent_stack_frame_by_agent(
106
+ agent_id=step.call
107
+ )
108
+
109
+ if (
110
+ agent_stack_frame
111
+ and agent_stack_frame == stack.top()
112
+ and agent_stack_frame.state == AgentState.INTERRUPTED
113
+ ):
114
+ # if an agent is interrupted, repeat the last message from the
115
+ # agent and wait for user input
116
+ return _handle_resume_interrupted_agent(
117
+ agent_stack_frame, final_events, stack, step, tracker
118
+ )
119
+
120
+ # Reset the slots covered by the exit_if
121
+ # Code smell: this is a temporary fix and will be addressed in ENG-2148
122
+ if (
123
+ step.exit_if
124
+ and agent_stack_frame
125
+ and agent_stack_frame.frame_id == f"restart_agent_{step.call}"
126
+ ):
127
+ # when restarting an agent, we need to reset the slots covered by the
128
+ # exit_if condition so that the agent can run again.
129
+ _reset_slots_covered_by_exit_if(step.exit_if, tracker)
130
+
131
+ # generate the agent input
132
+ agent_input = _prepare_agent_input(agent_stack_frame, step, tracker, slots)
133
+ structlogger.debug(
134
+ "flow.step.run_agent.agent_input",
135
+ agent_name=step.call,
136
+ step_id=step.id,
137
+ flow_id=step.flow_id,
138
+ agent_input=agent_input.model_dump(),
139
+ json_formatting=["agent_input"],
140
+ )
141
+
142
+ # add the AgentStarted event to the list of final events
143
+ final_events.append(AgentStarted(step.call, step.flow_id))
144
+
145
+ # send the input to the agent and wait for a response
146
+ protocol_type = get_protocol_type(
147
+ step, Configuration.get_instance().available_agents.get_agent_config(step.call)
148
+ )
149
+ output: AgentOutput = await _call_agent_with_retry(
150
+ agent_name=step.call,
151
+ protocol_type=protocol_type,
152
+ agent_input=agent_input,
153
+ max_retries=MAX_AGENT_RETRIES,
154
+ )
155
+
156
+ structlogger.debug(
157
+ "flow.step.run_agent.agent_response",
158
+ agent_name=step.call,
159
+ step_id=step.id,
160
+ flow_id=step.flow_id,
161
+ agent_response=output.model_dump(),
162
+ json_formatting=["agent_response"],
163
+ event_info="Agent Output",
164
+ )
165
+ structlogger.debug(
166
+ "flow.step.run_agent.agent_finished",
167
+ agent_name=step.call,
168
+ flow_id=step.flow_id,
169
+ agent_state=str(output.status),
170
+ agent_response_message=output.response_message,
171
+ highlight=True,
172
+ event_info=f"Agent {step.call} finished",
173
+ )
174
+
175
+ # add the set slot events returned by the agent to the list of final events
176
+ if output.events:
177
+ final_events.extend(output.events)
178
+
179
+ # handle the agent output based on the agent status
180
+ if output.status == AgentStatus.INPUT_REQUIRED:
181
+ return _handle_agent_input_required(output, final_events, stack, step)
182
+ elif output.status == AgentStatus.COMPLETED:
183
+ return _handle_agent_completed(output, final_events, stack, step)
184
+ elif output.status == AgentStatus.FATAL_ERROR:
185
+ return _handle_agent_fatal_error(
186
+ output, final_events, stack, step, flows, tracker
187
+ )
188
+ else:
189
+ return _handle_agent_unknown_status(
190
+ output, final_events, stack, step, flows, tracker
191
+ )
192
+
193
+
194
+ async def _call_agent_with_retry(
195
+ agent_name: str,
196
+ protocol_type: ProtocolType,
197
+ agent_input: AgentInput,
198
+ max_retries: int,
199
+ ) -> AgentOutput:
200
+ """Call an agent with retries in case of recoverable errors."""
201
+ for attempt in range(max_retries):
202
+ if attempt > 0:
203
+ structlogger.debug(
204
+ "flow_executor.call_agent_with_retry.retrying",
205
+ agent_name=agent_name,
206
+ attempt=attempt + 1,
207
+ num_retries=max_retries,
208
+ )
209
+ try:
210
+ agent_response: AgentOutput = await AgentManager().run_agent(
211
+ agent_name=agent_name, protocol_type=protocol_type, context=agent_input
212
+ )
213
+ except Exception as e:
214
+ # We don't have a vaild agent response at this time to act based
215
+ # on the agent status, so we return a fatal error.
216
+ structlogger.error(
217
+ "flow_executor.call_agent_with_retry.exception",
218
+ agent_name=agent_name,
219
+ error_message=str(e),
220
+ )
221
+ return AgentOutput(
222
+ id=agent_name,
223
+ status=AgentStatus.FATAL_ERROR,
224
+ error_message=str(e),
225
+ )
226
+
227
+ if agent_response.status != AgentStatus.RECOVERABLE_ERROR:
228
+ return agent_response
229
+
230
+ structlogger.warning(
231
+ "flow_executor.call_agent_with_retry.recoverable_error",
232
+ agent_name=agent_name,
233
+ attempt=attempt + 1,
234
+ num_retries=max_retries,
235
+ error_message=agent_response.error_message,
236
+ )
237
+ if attempt < max_retries - 1:
238
+ # exponential backoff - wait longer with each retry
239
+ # 1 second, 2 seconds, 4 seconds, etc.
240
+ await asyncio.sleep(min(2**attempt, MAX_AGENT_RETRY_DELAY_SECONDS))
241
+
242
+ # we exhausted all retries, return fatal error
243
+ structlogger.warning(
244
+ "flow_executor.call_agent_with_retry.exhausted_retries",
245
+ agent_name=agent_name,
246
+ num_retries=max_retries,
247
+ )
248
+ return AgentOutput(
249
+ id=agent_name,
250
+ status=AgentStatus.FATAL_ERROR,
251
+ error_message="Exhausted all retries for agent call.",
252
+ )
253
+
254
+
255
+ ################################################################################
256
+ # Handle resume interrupted agent
257
+ ################################################################################
258
+
259
+
260
+ def _handle_resume_interrupted_agent(
261
+ agent_stack_frame: AgentStackFrame,
262
+ final_events: List[Event],
263
+ stack: DialogueStack,
264
+ step: CallFlowStep,
265
+ tracker: DialogueStateTracker,
266
+ ) -> FlowStepResult:
267
+ """Handle resuming an interrupted agent.
268
+
269
+ Args:
270
+ agent_stack_frame: The interrupted agent stack frame
271
+ final_events: List of events to be added to the final result
272
+ stack: The dialogue stack
273
+ step: The flow step that called the agent
274
+ tracker: The dialogue state tracker
275
+
276
+ Returns:
277
+ FlowStepResult indicating to pause for user input
278
+ """
279
+ structlogger.debug(
280
+ "flow.step.run_agent.resume_interrupted_agent",
281
+ agent_id=step.call,
282
+ step_id=step.id,
283
+ flow_id=step.flow_id,
284
+ )
285
+ # The agent was previously interrupted when waiting for user input.
286
+ # Now we're back to the agent execution step and need to output the last message
287
+ # from the agent (user input request) again and wait for user input
288
+ cast(AgentStackFrame, stack.top()).state = AgentState.WAITING_FOR_INPUT
289
+ tracker.update_stack(stack)
290
+ utterance = (
291
+ agent_stack_frame.metadata.get(AGENT_METADATA_AGENT_RESPONSE_KEY, "")
292
+ if agent_stack_frame.metadata
293
+ else ""
294
+ )
295
+ final_events.append(AgentResumed(agent_id=step.call, flow_id=step.flow_id))
296
+ return PauseFlowReturnPrediction(
297
+ _create_agent_request_user_input_prediction(utterance, final_events)
298
+ )
299
+
300
+
301
+ ################################################################################
302
+ # Handle agent output
303
+ ################################################################################
304
+
305
+
306
+ def _handle_agent_unknown_status(
307
+ output: AgentOutput,
308
+ final_events: List[Event],
309
+ stack: DialogueStack,
310
+ step: CallFlowStep,
311
+ flows: FlowsList,
312
+ tracker: DialogueStateTracker,
313
+ ) -> FlowStepResult:
314
+ """Handle unknown agent status.
315
+
316
+ Args:
317
+ output: The agent output with unknown status
318
+ final_events: List of events to be added to the final result
319
+ stack: The dialogue stack
320
+ step: The flow step that called the agent
321
+ flows: All flows
322
+ tracker: The dialogue state tracker
323
+
324
+ Returns:
325
+ FlowStepResult indicating to continue with internal error pattern
326
+ """
327
+ output.metadata = output.metadata or {}
328
+ _update_agent_events(final_events, output.metadata)
329
+ structlogger.error(
330
+ "flow.step.run_agent.unknown_status",
331
+ agent_name=step.call,
332
+ step_id=step.id,
333
+ flow_id=step.flow_id,
334
+ status=output.status,
335
+ )
336
+ # remove the agent stack frame
337
+ remove_agent_stack_frame(stack, step.call)
338
+ final_events.append(AgentCancelled(agent_id=step.call, flow_id=step.flow_id))
339
+
340
+ # cancel the current active flow:
341
+ # push the cancel pattern stack frame and add the flow cancelled event
342
+ cancel_pattern_stack_frame, flow_cancelled_event = _cancel_flow(
343
+ stack, flows, tracker, step
344
+ )
345
+ if cancel_pattern_stack_frame:
346
+ stack.push(cancel_pattern_stack_frame)
347
+ if flow_cancelled_event:
348
+ final_events.append(flow_cancelled_event)
349
+
350
+ # trigger the internal error pattern
351
+ stack.push(InternalErrorPatternFlowStackFrame())
352
+ return ContinueFlowWithNextStep(events=final_events)
353
+
354
+
355
+ def _handle_agent_input_required(
356
+ output: AgentOutput,
357
+ final_events: List[Event],
358
+ stack: DialogueStack,
359
+ step: CallFlowStep,
360
+ ) -> FlowStepResult:
361
+ """Handle agent that requires user input.
362
+
363
+ Args:
364
+ output: The agent output containing input request information
365
+ final_events: List of events to be added to the final result
366
+ stack: The dialogue stack
367
+ step: The flow step that called the agent
368
+
369
+ Returns:
370
+ FlowStepResult indicating to pause for user input
371
+ """
372
+ output.metadata = output.metadata or {}
373
+ output.metadata[AGENT_METADATA_AGENT_RESPONSE_KEY] = output.response_message or ""
374
+ output.metadata[AGENT_METADATA_STRUCTURED_RESULTS_KEY] = (
375
+ output.structured_results or []
376
+ )
377
+ _update_agent_events(final_events, output.metadata)
378
+
379
+ top_stack_frame = stack.top()
380
+ # update the agent stack frame if it is already on the stack
381
+ # otherwise push a new one
382
+ if isinstance(top_stack_frame, AgentStackFrame):
383
+ top_stack_frame.state = AgentState.WAITING_FOR_INPUT
384
+ top_stack_frame.metadata = output.metadata
385
+ top_stack_frame.step_id = step.id
386
+ top_stack_frame.agent_id = step.call
387
+ top_stack_frame.flow_id = step.flow_id
388
+ else:
389
+ stack.push(
390
+ AgentStackFrame(
391
+ flow_id=step.flow_id,
392
+ agent_id=step.call,
393
+ state=AgentState.WAITING_FOR_INPUT,
394
+ step_id=step.id,
395
+ metadata=output.metadata,
396
+ )
397
+ )
398
+
399
+ action_prediction = _create_agent_request_user_input_prediction(
400
+ output.response_message, final_events
401
+ )
402
+ return PauseFlowReturnPrediction(action_prediction)
403
+
404
+
405
+ def _handle_agent_completed(
406
+ output: AgentOutput,
407
+ final_events: List[Event],
408
+ stack: DialogueStack,
409
+ step: CallFlowStep,
410
+ ) -> FlowStepResult:
411
+ """Handle completed agent execution.
412
+
413
+ Args:
414
+ output: The agent output containing completion information
415
+ final_events: List of events to be added to the final result
416
+ stack: The dialogue stack
417
+ step: The flow step that called the agent
418
+
419
+ Returns:
420
+ FlowStepResult indicating to continue with next step or pause for response
421
+ """
422
+ output.metadata = output.metadata or {}
423
+ _update_agent_events(final_events, output.metadata)
424
+ structlogger.debug(
425
+ "flow.step.run_agent.completed",
426
+ agent_name=step.call,
427
+ step_id=step.id,
428
+ flow_id=step.flow_id,
429
+ )
430
+ remove_agent_stack_frame(stack, step.call)
431
+ agent_completed_event = AgentCompleted(agent_id=step.call, flow_id=step.flow_id)
432
+ final_events.append(agent_completed_event)
433
+ if output.response_message:
434
+ # for open-ended agents we want to utter the last agent message
435
+ return PauseFlowReturnPrediction(
436
+ _create_send_text_prediction(output.response_message, final_events)
437
+ )
438
+ else:
439
+ return ContinueFlowWithNextStep(events=final_events)
440
+
441
+
442
+ def _handle_agent_fatal_error(
443
+ output: AgentOutput,
444
+ final_events: List[Event],
445
+ stack: DialogueStack,
446
+ step: CallFlowStep,
447
+ flows: FlowsList,
448
+ tracker: DialogueStateTracker,
449
+ ) -> FlowStepResult:
450
+ """Handle fatal error from agent execution.
451
+
452
+ Args:
453
+ output: The agent output containing error information
454
+ final_events: List of events to be added to the final result
455
+ stack: The dialogue stack
456
+ step: The flow step that called the agent
457
+ flows: All flows
458
+ tracker: The dialogue state tracker
459
+
460
+ Returns:
461
+ FlowStepResult indicating to continue with internal error pattern
462
+ """
463
+ output.metadata = output.metadata or {}
464
+ _update_agent_events(final_events, output.metadata)
465
+ # the agent failed, cancel the current flow and trigger pattern_internal_error
466
+ structlogger.error(
467
+ "flow.step.run_agent.fatal_error",
468
+ agent_name=step.call,
469
+ step_id=step.id,
470
+ flow_id=step.flow_id,
471
+ error_message=output.error_message,
472
+ )
473
+ # remove the agent stack frame
474
+ remove_agent_stack_frame(stack, step.call)
475
+ final_events.append(
476
+ AgentCancelled(
477
+ agent_id=step.call, flow_id=step.flow_id, reason=output.error_message
478
+ )
479
+ )
480
+
481
+ # cancel the current active flow:
482
+ # push the cancel pattern stack frame and add the flow cancelled event
483
+ cancel_pattern_stack_frame, flow_cancelled_event = _cancel_flow(
484
+ stack, flows, tracker, step
485
+ )
486
+ if cancel_pattern_stack_frame:
487
+ stack.push(cancel_pattern_stack_frame)
488
+ if flow_cancelled_event:
489
+ final_events.append(flow_cancelled_event)
490
+
491
+ # push the internal error pattern stack frame
492
+ stack.push(InternalErrorPatternFlowStackFrame())
493
+ return ContinueFlowWithNextStep(events=final_events)
494
+
495
+
496
+ def _cancel_flow(
497
+ stack: DialogueStack,
498
+ flows: FlowsList,
499
+ tracker: DialogueStateTracker,
500
+ step: CallFlowStep,
501
+ ) -> Tuple[Optional[CancelPatternFlowStackFrame], Optional[FlowCancelled]]:
502
+ """Cancel the current active flow.
503
+
504
+ Creates a cancel pattern stack frame and a flow cancelled event.
505
+ """
506
+ from rasa.dialogue_understanding.commands import CancelFlowCommand
507
+
508
+ cancel_pattern_stack_frame = None
509
+ flow_cancelled_event = None
510
+
511
+ top_frame = stack.top()
512
+
513
+ if isinstance(top_frame, BaseFlowStackFrame):
514
+ flow = flows.flow_by_id(step.flow_id)
515
+ flow_name = (
516
+ flow.readable_name(language=tracker.current_language)
517
+ if flow
518
+ else step.flow_id
519
+ )
520
+
521
+ canceled_frames = CancelFlowCommand.select_canceled_frames(stack)
522
+
523
+ cancel_pattern_stack_frame = CancelPatternFlowStackFrame(
524
+ canceled_name=flow_name,
525
+ canceled_frames=canceled_frames,
526
+ )
527
+
528
+ flow_cancelled_event = FlowCancelled(step.flow_id, step.id)
529
+
530
+ return cancel_pattern_stack_frame, flow_cancelled_event
531
+
532
+
533
+ ################################################################################
534
+ # Create predictions
535
+ ################################################################################
536
+
537
+
538
+ def _create_action_prediction(
539
+ action_name: str, message: Optional[str], events: Optional[List[Event]]
540
+ ) -> FlowActionPrediction:
541
+ """Create a prediction for an action with a text message."""
542
+ action_metadata = {
543
+ ACTION_METADATA_MESSAGE_KEY: {
544
+ ACTION_METADATA_TEXT_KEY: message,
545
+ }
546
+ }
547
+ return FlowActionPrediction(
548
+ action_name,
549
+ 1.0,
550
+ events=events if events else [],
551
+ metadata=action_metadata,
552
+ )
553
+
554
+
555
+ def _create_agent_request_user_input_prediction(
556
+ message: Optional[str], events: Optional[List[Event]]
557
+ ) -> FlowActionPrediction:
558
+ """Create a prediction for requesting user input from the agent and waiting for it.
559
+
560
+ This function creates a prediction that will pause the flow and wait for user input.
561
+ """
562
+ return _create_action_prediction(
563
+ ACTION_AGENT_REQUEST_USER_INPUT_NAME, message, events
564
+ )
565
+
566
+
567
+ def _create_send_text_prediction(
568
+ message: Optional[str], events: Optional[List[Event]]
569
+ ) -> FlowActionPrediction:
570
+ """Create a prediction for sending a text message to the user."""
571
+ return _create_action_prediction(ACTION_SEND_TEXT_NAME, message, events)
572
+
573
+
574
+ ################################################################################
575
+ # Prepare agent input
576
+ ################################################################################
577
+
578
+
579
+ def _prepare_agent_input(
580
+ agent_stack_frame: Optional[AgentStackFrame],
581
+ step: CallFlowStep,
582
+ tracker: DialogueStateTracker,
583
+ slots: List[Slot],
584
+ ) -> AgentInput:
585
+ """Prepare the agent input data.
586
+
587
+ Args:
588
+ agent_stack_frame: The agent stack frame if it exists
589
+ step: The flow step that called the agent
590
+ tracker: The dialogue state tracker
591
+ slots: List of slot definitions
592
+
593
+ Returns:
594
+ AgentInput object ready for agent execution
595
+ """
596
+ agent_input_metadata = (
597
+ agent_stack_frame.metadata
598
+ if agent_stack_frame and agent_stack_frame.metadata
599
+ else {}
600
+ )
601
+ _update_agent_input_metadata_with_events(
602
+ agent_input_metadata, step.call, step.flow_id, tracker
603
+ )
604
+
605
+ if step.exit_if:
606
+ agent_input_metadata[AGENT_METADATA_EXIT_IF_KEY] = step.exit_if
607
+
608
+ return AgentInput(
609
+ id=step.call,
610
+ user_message=tracker.latest_message.text or ""
611
+ if tracker.latest_message
612
+ else "",
613
+ slots=_prepare_slots_for_agent(
614
+ tracker.current_slot_values(), slots, step.exit_if
615
+ ),
616
+ conversation_history=tracker_as_readable_transcript(tracker),
617
+ events=deserialise_events(
618
+ tracker.current_state(EventVerbosity.ALL).get("events") or []
619
+ ),
620
+ metadata=agent_input_metadata,
621
+ )
622
+
623
+
624
+ def _prepare_slots_for_agent(
625
+ slot_values: Dict[str, Any],
626
+ slot_definitions: List[Slot],
627
+ exit_if: Optional[List[str]],
628
+ ) -> List[AgentInputSlot]:
629
+ """Prepare the slots for the agent.
630
+
631
+ Filter out slots that should not be forwarded to agents.
632
+ Add the slot type and allowed values to the slot dictionary.
633
+
634
+ Filter out slots that are None.
635
+ Keep slots that are part of the exit_if conditions.
636
+
637
+ Args:
638
+ slot_values: The full slot dictionary from the tracker.
639
+ slot_definitions: The slot definitions from the domain.
640
+ exit_if: Optional list of exit conditions that determine which slots to keep.
641
+
642
+ Returns:
643
+ A list of slots containing the name, current value, type, and allowed values.
644
+ """
645
+
646
+ def _get_slot_definition(slot_name: str) -> Optional[Slot]:
647
+ for slot in slot_definitions:
648
+ if slot.name == slot_name:
649
+ return slot
650
+ return None
651
+
652
+ exit_if_slot_names = []
653
+ if exit_if:
654
+ exit_if_slot_names = get_slot_names_from_exit_conditions(exit_if)
655
+
656
+ filtered_slots: List[AgentInputSlot] = []
657
+ for key, value in slot_values.items():
658
+ if key in SLOTS_EXCLUDED_FOR_AGENT:
659
+ continue
660
+ if value is None and key not in exit_if_slot_names:
661
+ continue
662
+ slot_definition = _get_slot_definition(key)
663
+ if slot_definition:
664
+ filtered_slots.append(
665
+ AgentInputSlot(
666
+ name=key,
667
+ value=value,
668
+ type=slot_definition.type_name if slot_definition else "any",
669
+ allowed_values=slot_definition.values
670
+ if isinstance(slot_definition, CategoricalSlot)
671
+ else None,
672
+ )
673
+ )
674
+
675
+ return filtered_slots
676
+
677
+
678
+ def _update_agent_input_metadata_with_events(
679
+ metadata: Dict[str, Any], agent_id: str, flow_id: str, tracker: DialogueStateTracker
680
+ ) -> None:
681
+ """Update the agent input metadata with the events."""
682
+ agent_started_events = [
683
+ event
684
+ for event in tracker.events
685
+ if type(event) == AgentStarted
686
+ and event.agent_id == agent_id
687
+ and event.flow_id == flow_id
688
+ ]
689
+ if agent_started_events:
690
+ # If we have context ID from the previous agent run, we want to
691
+ # include it in the metadata so that the agent can continue the same
692
+ # context.
693
+ agent_started_event = agent_started_events[-1]
694
+ if agent_started_event.context_id:
695
+ metadata[A2A_AGENT_CONTEXT_ID_KEY] = agent_started_event.context_id
696
+
697
+
698
+ ################################################################################
699
+ # Other helper methods
700
+ ################################################################################
701
+
702
+
703
+ def _update_agent_events(events: List[Event], metadata: Dict[str, Any]) -> None:
704
+ """Update the agent events based on the agent output metadata if needed."""
705
+ if A2A_AGENT_CONTEXT_ID_KEY in metadata:
706
+ # If the context ID is present, we need to store it in the AgentStarted
707
+ # event, so that it can be re-used later in case the agent is restarted.
708
+ for event in events:
709
+ if isinstance(event, AgentStarted):
710
+ event.context_id = metadata[A2A_AGENT_CONTEXT_ID_KEY]
711
+
712
+
713
+ def _reset_slots_covered_by_exit_if(
714
+ exit_conditions: List[str], tracker: DialogueStateTracker
715
+ ) -> None:
716
+ """Reset the slots covered by the exit_if condition."""
717
+ reset_slot_names = get_slot_names_from_exit_conditions(exit_conditions)
718
+ for slot_name in reset_slot_names:
719
+ if tracker.slots.get(slot_name) is not None:
720
+ tracker.update(SlotSet(slot_name, None))