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
@@ -17,6 +17,7 @@ from typing import (
17
17
  Optional,
18
18
  Sequence,
19
19
  Text,
20
+ Tuple,
20
21
  Type,
21
22
  )
22
23
 
@@ -102,9 +103,12 @@ def sort_list_of_dicts_by_first_key(dicts: List[Dict]) -> List[Dict]:
102
103
 
103
104
  def cached_method(f: Callable[..., Any]) -> Callable[..., Any]:
104
105
  """Caches method calls based on the call's `args` and `kwargs`.
106
+
105
107
  Works for `async` and `sync` methods. Don't apply this to functions.
108
+
106
109
  Args:
107
110
  f: The decorated method whose return value should be cached.
111
+
108
112
  Returns:
109
113
  The return value which the method gives for the first call with the given
110
114
  arguments.
@@ -358,6 +362,7 @@ def validate_environment(
358
362
  component_name: str,
359
363
  ) -> None:
360
364
  """Make sure all needed requirements for a component are met.
365
+
361
366
  Args:
362
367
  required_env_vars: List of environment variables that should be set
363
368
  required_packages: List of packages that should be installed
@@ -373,7 +378,8 @@ def validate_environment(
373
378
  importlib.import_module(p)
374
379
  except ImportError:
375
380
  raise MissingDependencyException(
376
- f"Missing package for {component_name}: {p}"
381
+ f"Missing dependency for {component_name}: {p}. "
382
+ f"Please ensure the correct package is installed."
377
383
  )
378
384
 
379
385
 
@@ -388,3 +394,22 @@ Sign up at: https://feedback.rasa.com
388
394
  {separator}
389
395
  """
390
396
  print_success(message)
397
+
398
+
399
+ def conditional_import(module_name: str, class_name: str) -> Tuple[Any, bool]:
400
+ """Conditionally import a class, returning (class, is_available) tuple.
401
+
402
+ Args:
403
+ module_name: The module path to import from
404
+ class_name: The class name to import
405
+
406
+ Returns:
407
+ A tuple of (class, is_available) where class is the imported class
408
+ or None if import failed, and is_available is a boolean indicating
409
+ whether the import was successful.
410
+ """
411
+ try:
412
+ module = __import__(module_name, fromlist=[class_name])
413
+ return getattr(module, class_name), True
414
+ except ImportError:
415
+ return None, False
@@ -1,7 +1,10 @@
1
1
  import os
2
- from typing import Any, Dict, Optional
2
+ from typing import TYPE_CHECKING, Any, Dict, Optional
3
3
 
4
4
  from rasa.exceptions import HealthCheckError
5
+
6
+ if TYPE_CHECKING:
7
+ pass
5
8
  from rasa.shared.constants import (
6
9
  LLM_API_HEALTH_CHECK_DEFAULT_VALUE,
7
10
  LLM_API_HEALTH_CHECK_ENV_VAR,
@@ -63,6 +66,7 @@ def perform_llm_health_check(
63
66
  log_source_component: str,
64
67
  ) -> None:
65
68
  """Try to instantiate the LLM Client to validate the provided config.
69
+
66
70
  If the LLM_API_HEALTH_CHECK environment variable is true, perform a test call
67
71
  to the LLM API. If config contains multiple models, perform a test call for each
68
72
  model in the model group.
@@ -125,6 +129,7 @@ def perform_embeddings_health_check(
125
129
  log_source_component: str,
126
130
  ) -> None:
127
131
  """Try to instantiate the Embedder to validate the provided config.
132
+
128
133
  If the LLM_API_HEALTH_CHECK environment variable is true, perform a test call
129
134
  to the Embeddings API. If config contains multiple models, perform a test call for
130
135
  each model in the model group.
@@ -240,8 +245,7 @@ def send_test_embeddings_api_request(
240
245
 
241
246
 
242
247
  def is_api_health_check_enabled() -> bool:
243
- """Determines whether the API health check is enabled based on an environment
244
- variable.
248
+ """Determines whether the API health check is enabled.
245
249
 
246
250
  Returns:
247
251
  bool: True if the API health check is enabled, False otherwise.
rasa/shared/utils/llm.py CHANGED
@@ -23,13 +23,15 @@ from typing import (
23
23
  )
24
24
 
25
25
  import structlog
26
+ from jinja2 import Environment, select_autoescape
26
27
  from pydantic import BaseModel, Field
27
28
 
28
29
  import rasa.cli.telemetry
29
30
  import rasa.cli.utils
30
31
  import rasa.shared.utils.cli
31
32
  import rasa.shared.utils.io
32
- from rasa.core.available_endpoints import AvailableEndpoints
33
+ from rasa.core.config.available_endpoints import AvailableEndpoints
34
+ from rasa.core.config.configuration import Configuration
33
35
  from rasa.shared.constants import (
34
36
  CONFIG_NAME_KEY,
35
37
  CONFIG_PIPELINE_KEY,
@@ -49,7 +51,15 @@ from rasa.shared.constants import (
49
51
  RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_TOO_LONG,
50
52
  ROUTER_CONFIG_KEY,
51
53
  )
52
- from rasa.shared.core.events import BotUttered, UserUttered
54
+ from rasa.shared.core.events import (
55
+ AgentCancelled,
56
+ AgentCompleted,
57
+ AgentInterrupted,
58
+ AgentResumed,
59
+ AgentStarted,
60
+ BotUttered,
61
+ UserUttered,
62
+ )
53
63
  from rasa.shared.core.slots import BooleanSlot, CategoricalSlot, Slot
54
64
  from rasa.shared.engine.caching import get_local_cache_location
55
65
  from rasa.shared.exceptions import (
@@ -112,7 +122,7 @@ DEPLOYMENT_CENTRIC_PROVIDERS = [AZURE_OPENAI_PROVIDER]
112
122
 
113
123
  # Placeholder messages used in the transcript for
114
124
  # instances where user input results in an error
115
- ERROR_PLACEHOLDER = {
125
+ ERROR_PLACEHOLDER: Dict[str, str] = {
116
126
  RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_TOO_LONG: "[User sent really long message]",
117
127
  RASA_PATTERN_INTERNAL_ERROR_USER_INPUT_EMPTY: "",
118
128
  "default": "[User input triggered an error]",
@@ -225,6 +235,7 @@ def tracker_as_readable_transcript(
225
235
  ai_prefix: str = AI,
226
236
  max_turns: Optional[int] = 20,
227
237
  turns_wrapper: Optional[Callable[[List[str]], List[str]]] = None,
238
+ highlight_agent_turns: bool = False,
228
239
  ) -> str:
229
240
  """Creates a readable dialogue from a tracker.
230
241
 
@@ -234,6 +245,7 @@ def tracker_as_readable_transcript(
234
245
  ai_prefix: the prefix to use for ai utterances
235
246
  max_turns: the maximum number of turns to include in the transcript
236
247
  turns_wrapper: optional function to wrap the turns in a custom way
248
+ highlight_agent_turns: whether to highlight agent turns in the transcript
237
249
 
238
250
  Example:
239
251
  >>> tracker = Tracker(
@@ -251,7 +263,9 @@ def tracker_as_readable_transcript(
251
263
  Returns:
252
264
  A string representing the transcript of the tracker
253
265
  """
254
- transcript = []
266
+ transcript: List[str] = []
267
+
268
+ current_ai_prefix = ai_prefix
255
269
 
256
270
  # using `applied_events` rather than `events` means that only events after the
257
271
  # most recent `Restart` or `SessionStarted` are included in the transcript
@@ -266,9 +280,20 @@ def tracker_as_readable_transcript(
266
280
  else:
267
281
  message = sanitize_message_for_prompt(event.text)
268
282
  transcript.append(f"{human_prefix}: {message}")
269
-
270
283
  elif isinstance(event, BotUttered):
271
- transcript.append(f"{ai_prefix}: {sanitize_message_for_prompt(event.text)}")
284
+ transcript.append(
285
+ f"{current_ai_prefix}: {sanitize_message_for_prompt(event.text)}"
286
+ )
287
+
288
+ if highlight_agent_turns:
289
+ if isinstance(event, AgentStarted) or isinstance(event, AgentResumed):
290
+ current_ai_prefix = event.agent_id
291
+ elif (
292
+ isinstance(event, AgentCompleted)
293
+ or isinstance(event, AgentCancelled)
294
+ or isinstance(event, AgentInterrupted)
295
+ ):
296
+ current_ai_prefix = ai_prefix
272
297
 
273
298
  # turns_wrapper to count multiple utterances by bot/user as single turn
274
299
  if turns_wrapper:
@@ -694,6 +719,38 @@ def embedder_client_factory(
694
719
  return client
695
720
 
696
721
 
722
+ def validate_jinja2_template(template_content: Text) -> None:
723
+ """Validate that a template string has valid Jinja2 syntax.
724
+
725
+ Args:
726
+ template_content: The template content to validate
727
+
728
+ Raises:
729
+ jinja2.exceptions.TemplateSyntaxError: If the template has invalid syntax
730
+ Exception: If there's an error during validation
731
+ """
732
+ # Create environment with custom filters
733
+ env = Environment(
734
+ autoescape=select_autoescape(
735
+ disabled_extensions=["jinja2"],
736
+ default_for_string=False,
737
+ default=True,
738
+ )
739
+ )
740
+ # Register filters - lazy import to avoid circular dependencies
741
+ from rasa.dialogue_understanding.generator._jinja_filters import (
742
+ to_json_escaped_string,
743
+ )
744
+ from rasa.dialogue_understanding.generator.constants import (
745
+ TO_JSON_ESCAPED_STRING_JINJA_FILTER,
746
+ )
747
+
748
+ env.filters[TO_JSON_ESCAPED_STRING_JINJA_FILTER] = to_json_escaped_string
749
+
750
+ # Validate Jinja2 syntax
751
+ env.from_string(template_content)
752
+
753
+
697
754
  def get_prompt_template(
698
755
  jinja_file_path: Optional[Text],
699
756
  default_prompt_template: Text,
@@ -739,7 +796,7 @@ def get_prompt_template(
739
796
  log_source_method=log_source_method,
740
797
  )
741
798
  return prompt_template
742
- except (FileIOException, FileNotFoundException):
799
+ except (FileIOException, FileNotFoundException) as e:
743
800
  structlogger.warning(
744
801
  "utils.llm.get_prompt_template" ".failed_to_read_custom_prompt_template",
745
802
  event_info=(
@@ -747,6 +804,7 @@ def get_prompt_template(
747
804
  ),
748
805
  log_source_component=log_source_component,
749
806
  log_source_method=log_source_method,
807
+ error=str(e),
750
808
  )
751
809
  return default_prompt_template
752
810
 
@@ -899,7 +957,7 @@ def resolve_model_client_config(
899
957
  if model_groups:
900
958
  endpoints = AvailableEndpoints(model_groups=model_groups)
901
959
  else:
902
- endpoints = AvailableEndpoints.get_instance()
960
+ endpoints = Configuration.get_instance().endpoints
903
961
  if endpoints.model_groups is None:
904
962
  _raise_invalid_config_exception(
905
963
  reason=(
@@ -1015,26 +1073,24 @@ def _get_llm_command_generator_config(
1015
1073
  return None
1016
1074
 
1017
1075
 
1018
- def _get_command_generator_prompt(
1019
- config: Dict[Text, Any], endpoints: Dict[Text, Any]
1076
+ def _get_compact_llm_command_generator_prompt(
1077
+ config: Dict[Text, Any], model_groups: Dict[Text, Any]
1020
1078
  ) -> Text:
1021
1079
  """Get the command generator prompt based on the config."""
1022
1080
  from rasa.dialogue_understanding.generator.single_step.compact_llm_command_generator import ( # noqa: E501
1023
- DEFAULT_COMMAND_PROMPT_TEMPLATE_FILE_NAME,
1024
- FALLBACK_COMMAND_PROMPT_TEMPLATE_FILE_NAME,
1025
- MODEL_PROMPT_MAPPER,
1081
+ CompactLLMCommandGenerator,
1026
1082
  )
1027
1083
 
1028
1084
  model_config = _get_llm_command_generator_config(config)
1029
1085
  llm_config = resolve_model_client_config(
1030
1086
  model_config=model_config,
1031
- model_groups=endpoints.get(MODEL_GROUPS_CONFIG_KEY),
1087
+ model_groups=model_groups,
1032
1088
  )
1033
1089
  return get_default_prompt_template_based_on_model(
1034
1090
  llm_config=llm_config or {},
1035
- model_prompt_mapping=MODEL_PROMPT_MAPPER,
1036
- default_prompt_path=DEFAULT_COMMAND_PROMPT_TEMPLATE_FILE_NAME,
1037
- fallback_prompt_path=FALLBACK_COMMAND_PROMPT_TEMPLATE_FILE_NAME,
1091
+ model_prompt_mapping=CompactLLMCommandGenerator.get_model_prompt_mapper(),
1092
+ default_prompt_path=CompactLLMCommandGenerator.get_default_prompt_template_file_name(),
1093
+ fallback_prompt_path=CompactLLMCommandGenerator.get_fallback_prompt_template_file_name(),
1038
1094
  )
1039
1095
 
1040
1096
 
@@ -1063,7 +1119,7 @@ def get_system_default_prompts(
1063
1119
 
1064
1120
  Args:
1065
1121
  config: The config.yml file data.
1066
- endpoints: The endpoints.yml file data.
1122
+ endpoints: The endpoints configuration dictionary.
1067
1123
 
1068
1124
  Returns:
1069
1125
  SystemPrompts: A Pydantic model containing all default prompts.
@@ -1072,8 +1128,25 @@ def get_system_default_prompts(
1072
1128
  DEFAULT_RESPONSE_VARIATION_PROMPT_TEMPLATE,
1073
1129
  )
1074
1130
 
1131
+ # The Model Manager / Model API service receives the endpoints configuration
1132
+ # as raw YAML text rather than as a file path. However, both
1133
+ # Configuration.initialise_endpoints() and AvailableEndpoints.read_endpoints()
1134
+ # currently only accept a Path input and do not support loading from in-memory
1135
+ # YAML content.
1136
+
1137
+ # Since these classes only support file-based initialization today, we need
1138
+ # to bootstrap the Configuration with an empty AvailableEndpoints instance for now.
1139
+
1140
+ # IMPORTANT: This configuration must be properly initialized with valid endpoints
1141
+ # and available agents once Studio introduces full support for Agent configurations
1142
+ # (A2A and MCP).
1143
+ Configuration.initialise_empty()
1144
+
1145
+ model_groups = endpoints.get(MODEL_GROUPS_CONFIG_KEY)
1075
1146
  return SystemPrompts(
1076
- command_generator=_get_command_generator_prompt(config, endpoints),
1147
+ command_generator=_get_compact_llm_command_generator_prompt(
1148
+ config, model_groups
1149
+ ),
1077
1150
  enterprise_search=_get_enterprise_search_prompt(config),
1078
1151
  contextual_response_rephraser=DEFAULT_RESPONSE_VARIATION_PROMPT_TEMPLATE,
1079
1152
  )
File without changes
@@ -0,0 +1,250 @@
1
+ """MCP server connection utilities."""
2
+
3
+ import asyncio
4
+ import warnings
5
+ from contextlib import AsyncExitStack, asynccontextmanager
6
+ from typing import Any, AsyncIterator, ClassVar, Dict, List, Optional
7
+
8
+ import structlog
9
+ from httpx import HTTPStatusError
10
+ from mcp import ClientSession
11
+ from mcp.client.streamable_http import streamablehttp_client
12
+
13
+ from rasa.shared.agents.auth.agent_auth_manager import AgentAuthManager
14
+ from rasa.shared.agents.auth.auth_strategy import AgentAuthStrategy
15
+ from rasa.shared.exceptions import AuthenticationError
16
+
17
+ structlogger = structlog.get_logger()
18
+
19
+
20
+ # Suppress RuntimeWarning about unawaited coroutines when MCP server is not reachable.
21
+ warnings.filterwarnings(
22
+ "ignore",
23
+ message=".*BaseEventLoop.create_server.*was never awaited.*",
24
+ category=RuntimeWarning,
25
+ )
26
+
27
+
28
+ class MCPServerConnection:
29
+ """
30
+ Manages connection to an MCP server, with optional authentication.
31
+
32
+ This class handles:
33
+ - Connection establishment and cleanup
34
+ - Session lifecycle management
35
+ - Authentication via AgentAuthManager (API Key, OAuth2, mTLS, etc.)
36
+ """
37
+
38
+ # Timeout for ping operations in seconds
39
+ PING_TIMEOUT_SECONDS = 3.0
40
+
41
+ _SUPPORTED_SERVER_TYPES: ClassVar[List[str]] = ["http", "https"]
42
+
43
+ def __init__(
44
+ self,
45
+ server_name: str,
46
+ server_url: str,
47
+ server_type: str,
48
+ auth_manager: Optional[AgentAuthManager] = None,
49
+ ):
50
+ """
51
+ Initialize the MCP server connection.
52
+
53
+ Args:
54
+ server_name: Server name to identify the server
55
+ server_url: Server URL
56
+ server_type: Server type (currently only 'http' is supported)
57
+ auth_manager: Optional AgentAuthManager instance for this connection
58
+ """
59
+ self.server_name = server_name
60
+ self.server_url = server_url
61
+ self.server_type = server_type
62
+ self._auth_manager = auth_manager
63
+ self.session: Optional[ClientSession] = None
64
+ self.exit_stack: Optional[AsyncExitStack] = None
65
+
66
+ @classmethod
67
+ def from_config(cls, server_config: Dict[str, Any]) -> "MCPServerConnection":
68
+ """Initialize the MCP server connection from a configuration dictionary."""
69
+ auth_config = server_config.get("additional_params")
70
+ _auth_manager = AgentAuthManager.load_auth(auth_config)
71
+ return cls(
72
+ server_config["name"],
73
+ server_config["url"],
74
+ server_config.get("type", "http"),
75
+ _auth_manager,
76
+ )
77
+
78
+ @staticmethod
79
+ @asynccontextmanager
80
+ async def open_mcp_session(
81
+ url: str, auth_strategy: Optional[AgentAuthStrategy] = None
82
+ ) -> AsyncIterator[ClientSession]:
83
+ """
84
+ Open a streamable MCP session, ensuring that initialization
85
+ completes before yielding.
86
+ """
87
+ async with streamablehttp_client(url, auth=auth_strategy) as (
88
+ read_stream,
89
+ write_stream,
90
+ _,
91
+ ):
92
+ async with ClientSession(read_stream, write_stream) as session:
93
+ await session.initialize() # handshake done here
94
+ yield session
95
+
96
+ async def connect(self) -> None:
97
+ """Establish connection to the MCP server.
98
+
99
+ Raises:
100
+ ValueError: If the server type is not supported.
101
+ ConnectionError: If connection fails.
102
+ AuthenticationError: If authentication fails.
103
+ """
104
+ if self.server_type not in self._SUPPORTED_SERVER_TYPES:
105
+ raise ValueError(f"Unsupported server type: {self.server_type}")
106
+
107
+ # Create a new exit stack for this connection to avoid task boundary issues
108
+ self.exit_stack = AsyncExitStack()
109
+
110
+ try:
111
+ # Get authentication strategy that adheres to httpx.Auth.
112
+ auth_strategy = (
113
+ self._auth_manager.get_auth() if self._auth_manager else None
114
+ )
115
+
116
+ # Register the wrapped context manager in the stack
117
+ self.session = await self.exit_stack.enter_async_context(
118
+ self.open_mcp_session(self.server_url, auth_strategy)
119
+ )
120
+
121
+ except Exception as eg:
122
+ for exc in getattr(eg, "exceptions", [eg]):
123
+ event_info = (
124
+ f"Failed to connect to MCP server `{self.server_name}`. \nOriginal "
125
+ f"error: {exc!s}"
126
+ )
127
+ if isinstance(exc, HTTPStatusError):
128
+ status_code = exc.response.status_code
129
+ structlogger.error(
130
+ "mcp_server_connection.connect.http_status_error",
131
+ event_info=event_info,
132
+ server_name=self.server_name,
133
+ server_url=self.server_url,
134
+ status_code=status_code,
135
+ response_text=exc.response.reason_phrase,
136
+ )
137
+ await self._cleanup()
138
+ if status_code in [400, 401, 403]:
139
+ raise AuthenticationError(str(exc)) from eg
140
+ elif status_code == 404:
141
+ raise Exception(str(exc)) from eg
142
+ else:
143
+ raise ConnectionError(str(exc)) from eg
144
+ else:
145
+ structlogger.error(
146
+ "mcp_server_connection.connect.other_exception",
147
+ event_info=event_info,
148
+ server_name=self.server_name,
149
+ server_url=self.server_url,
150
+ error=str(exc),
151
+ )
152
+ await self._cleanup()
153
+ raise ConnectionError(str(exc)) from eg
154
+
155
+ except asyncio.CancelledError as e:
156
+ event_info = f"Connection to MCP server `{self.server_name}` was cancelled."
157
+ structlogger.error(
158
+ "mcp_server_connection.connect.connection_cancelled",
159
+ event_info=event_info,
160
+ server_name=self.server_name,
161
+ server_url=self.server_url,
162
+ )
163
+ # Clean up on cancellation
164
+ await self._cleanup()
165
+ raise ConnectionError(e) from e
166
+
167
+ async def ensure_active_session(self) -> ClientSession:
168
+ """
169
+ Ensure an active session is available.
170
+
171
+ If no session exists or the current session is inactive,
172
+ a new connection will be established.
173
+
174
+ Returns:
175
+ Active ClientSession instance.
176
+ """
177
+ if self.session is None:
178
+ await self.connect()
179
+ structlogger.info(
180
+ "mcp_server_connection.ensure_active_session.no_session",
181
+ server_name=self.server_name,
182
+ server_url=self.server_url,
183
+ event_info=(
184
+ "No session found, connecting to the server "
185
+ f"`{self.server_name}` @ `{self.server_url}`"
186
+ ),
187
+ )
188
+ if self.session:
189
+ try:
190
+ # Add timeout to prevent hanging when MCP server is down
191
+ await asyncio.wait_for(
192
+ self.session.send_ping(), timeout=self.PING_TIMEOUT_SECONDS
193
+ )
194
+ except asyncio.TimeoutError as e:
195
+ structlogger.error(
196
+ "mcp_server_connection.ensure_active_session.ping_timeout",
197
+ server_name=self.server_name,
198
+ server_url=self.server_url,
199
+ event_info=(
200
+ "Ping timed out, Server not reachable - "
201
+ f"`{self.server_name}` @ `{self.server_url}`"
202
+ ),
203
+ )
204
+ raise e
205
+ except Exception as e:
206
+ structlogger.warning(
207
+ "mcp_server_connection.ensure_active_session.ping_failed",
208
+ error=str(e),
209
+ server_name=self.server_name,
210
+ server_url=self.server_url,
211
+ event_info=(
212
+ "Ping failed, trying to reconnect to the server "
213
+ f"`{self.server_name}` @ `{self.server_url}`"
214
+ ),
215
+ )
216
+ # Cleanup existing session
217
+ await self.close()
218
+ # Attempt to reconnect now
219
+ await self.connect()
220
+ structlogger.info(
221
+ "mcp_server_connection.ensure_active_session.reconnected",
222
+ server_name=self.server_name,
223
+ server_url=self.server_url,
224
+ event_info=(
225
+ "Reconnected to the server "
226
+ f"`{self.server_name}` @ `{self.server_url}`"
227
+ ),
228
+ )
229
+ assert self.session is not None # Ensures type for mypy
230
+ return self.session
231
+
232
+ async def close(self) -> None:
233
+ """Close the connection and clean up resources."""
234
+ await self._cleanup()
235
+
236
+ async def _cleanup(self) -> None:
237
+ """Internal cleanup method to safely close resources."""
238
+ if self.exit_stack:
239
+ try:
240
+ await self.exit_stack.aclose()
241
+ except Exception as e:
242
+ # Log cleanup errors but don't raise them
243
+ structlogger.warning(
244
+ "mcp_server_connection.cleanup.failed",
245
+ server_name=self.server_name,
246
+ error=str(e),
247
+ )
248
+ finally:
249
+ self.exit_stack = None
250
+ self.session = None
@@ -0,0 +1,20 @@
1
+ """MCP utilities."""
2
+
3
+
4
+ def mcp_server_exists(mcp_server: str) -> bool:
5
+ """Check if an MCP server exists in the configured endpoints.
6
+
7
+ Args:
8
+ mcp_server: The name of the MCP server to check.
9
+
10
+ Returns:
11
+ True if the MCP server exists, False otherwise.
12
+ """
13
+ from rasa.core.config.configuration import Configuration
14
+
15
+ endpoints = Configuration.get_instance().endpoints
16
+ if (mcp_server_list := endpoints.mcp_servers) is None:
17
+ return False
18
+
19
+ mcp_server_names = [server.name for server in mcp_server_list]
20
+ return mcp_server in mcp_server_names
@@ -160,6 +160,43 @@ FLOW_CANCELLED = {
160
160
  "step_id": {"type": "string"},
161
161
  }
162
162
  }
163
+ AGENT_STARTED = {
164
+ "properties": {
165
+ "event": {"const": "agent_started"},
166
+ "agent_id": {"type": "string"},
167
+ "flow_id": {"type": "string"},
168
+ }
169
+ }
170
+ AGENT_COMPLETED = {
171
+ "properties": {
172
+ "event": {"const": "agent_completed"},
173
+ "agent_id": {"type": "string"},
174
+ "flow_id": {"type": "string"},
175
+ "status": {"type": "string"},
176
+ }
177
+ }
178
+ AGENT_INTERRUPTED = {
179
+ "properties": {
180
+ "event": {"const": "agent_interrupted"},
181
+ "agent_id": {"type": "string"},
182
+ "flow_id": {"type": "string"},
183
+ }
184
+ }
185
+ AGENT_RESUMED = {
186
+ "properties": {
187
+ "event": {"const": "agent_resumed"},
188
+ "agent_id": {"type": "string"},
189
+ "flow_id": {"type": "string"},
190
+ }
191
+ }
192
+ AGENT_CANCELLED = {
193
+ "properties": {
194
+ "event": {"const": "agent_cancelled"},
195
+ "agent_id": {"type": "string"},
196
+ "flow_id": {"type": "string"},
197
+ "reason": {"type": "string"},
198
+ }
199
+ }
163
200
  DIALOGUE_STACK_UPDATED = {
164
201
  "properties": {"event": {"const": "stack"}, "update": {"type": "string"}}
165
202
  }
@@ -204,6 +241,11 @@ EVENT_SCHEMA = {
204
241
  FLOW_RESUMED,
205
242
  FLOW_COMPLETED,
206
243
  FLOW_CANCELLED,
244
+ AGENT_STARTED,
245
+ AGENT_COMPLETED,
246
+ AGENT_INTERRUPTED,
247
+ AGENT_RESUMED,
248
+ AGENT_CANCELLED,
207
249
  DIALOGUE_STACK_UPDATED,
208
250
  ROUTING_SESSION_ENDED,
209
251
  SESSION_ENDED,
rasa/shared/utils/yaml.py CHANGED
@@ -335,7 +335,9 @@ class YamlValidationException(YamlException, ValueError):
335
335
  )
336
336
  if found_lc:
337
337
  return line_offset
338
- return this_line + line_offset
338
+ if this_line is not None:
339
+ return this_line + line_offset
340
+ return line_offset
339
341
  return line
340
342
  elif isinstance(current, list) and head.isdigit():
341
343
  return (
rasa/studio/download.py CHANGED
@@ -10,6 +10,7 @@ from ruamel.yaml.scalarstring import LiteralScalarString
10
10
 
11
11
  import rasa.cli.utils
12
12
  import rasa.shared.utils.cli
13
+ from rasa.core.config.configuration import Configuration
13
14
  from rasa.shared.constants import (
14
15
  DEFAULT_CONFIG_PATH,
15
16
  DEFAULT_DATA_PATH,
@@ -116,6 +117,8 @@ def _handle_endpoints(handler: StudioDataHandler, root: Path) -> None:
116
117
  endpoints_path = root / DEFAULT_ENDPOINTS_PATH
117
118
  endpoints_path.write_text(endpoints_data, encoding="utf-8")
118
119
 
120
+ Configuration.initialise_endpoints(endpoints_path=endpoints_path)
121
+
119
122
 
120
123
  def _handle_domain(handler: StudioDataHandler, root: Path) -> None:
121
124
  """Persist the assistant’s domain file.
rasa/studio/prompts.py CHANGED
@@ -43,6 +43,7 @@ def handle_prompts(prompts: Dict[Text, Text], root: Path) -> None:
43
43
  config: Dict = read_yaml(config_path)
44
44
  endpoints: Dict = read_yaml(endpoints_path)
45
45
 
46
+ # System default prompts are dependent on the endpoints
46
47
  system_prompts = get_system_default_prompts(config, endpoints)
47
48
 
48
49
  _handle_contextual_response_rephraser(