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,474 @@
1
+ import os
2
+ from enum import Enum
3
+ from typing import Any, Dict, List, Optional, Text, Tuple, Union
4
+
5
+ import redis
6
+ import structlog
7
+ from pydantic import BaseModel, ConfigDict
8
+
9
+ from rasa.core.constants import (
10
+ AWS_ELASTICACHE_CLUSTER_NAME_ENV_VAR_NAME,
11
+ REDIS_SERVICE_NAME,
12
+ )
13
+ from rasa.core.iam_credentials_providers.credentials_provider_protocol import (
14
+ IAMCredentialsProvider,
15
+ IAMCredentialsProviderInput,
16
+ SupportedServiceType,
17
+ create_iam_credentials_provider,
18
+ )
19
+ from rasa.shared.exceptions import ConnectionException, RasaException
20
+
21
+ structlogger = structlog.getLogger(__name__)
22
+
23
+ DEFAULT_SOCKET_TIMEOUT_IN_SECONDS = 10
24
+
25
+
26
+ class DeploymentMode(Enum):
27
+ """Supported Redis deployment modes."""
28
+
29
+ STANDARD = "standard"
30
+ CLUSTER = "cluster"
31
+ SENTINEL = "sentinel"
32
+
33
+
34
+ class StandardRedisConfig(BaseModel):
35
+ """Base configuration for Redis connections."""
36
+
37
+ model_config = ConfigDict(arbitrary_types_allowed=True)
38
+
39
+ host: Text = "localhost"
40
+ port: int = 6379
41
+ username: Optional[Text] = None
42
+ password: Optional[Text] = None
43
+ use_ssl: bool = False
44
+ ssl_keyfile: Optional[Text] = None
45
+ ssl_certfile: Optional[Text] = None
46
+ ssl_ca_certs: Optional[Text] = None
47
+ db: int = 0
48
+ socket_timeout: float = DEFAULT_SOCKET_TIMEOUT_IN_SECONDS
49
+ decode_responses: bool = False
50
+ iam_credentials_provider: Optional[IAMCredentialsProvider] = None
51
+
52
+
53
+ class ClusterRedisConfig(StandardRedisConfig):
54
+ """Configuration for Redis Cluster connections."""
55
+
56
+ endpoints: List[Tuple[Text, int]]
57
+
58
+
59
+ class SentinelRedisConfig(StandardRedisConfig):
60
+ """Configuration for Redis Sentinel connections."""
61
+
62
+ endpoints: List[Tuple[Text, int]]
63
+ sentinel_service: Optional[Text] = "mymaster"
64
+
65
+
66
+ class RedisConfig(BaseModel):
67
+ """Base configuration for Redis connections."""
68
+
69
+ host: Text = "localhost"
70
+ port: int = 6379
71
+ service_type: SupportedServiceType
72
+ username: Optional[Text] = None
73
+ password: Optional[Text] = None
74
+ use_ssl: bool = False
75
+ ssl_keyfile: Optional[Text] = None
76
+ ssl_certfile: Optional[Text] = None
77
+ ssl_ca_certs: Optional[Text] = None
78
+ db: int = 0
79
+ socket_timeout: float = DEFAULT_SOCKET_TIMEOUT_IN_SECONDS
80
+ decode_responses: bool = False
81
+ deployment_mode: Text = DeploymentMode.STANDARD.value
82
+ endpoints: Optional[List[Text]] = None
83
+ sentinel_service: Optional[Text] = None
84
+
85
+
86
+ class RedisConnectionFactory:
87
+ """Factory class for creating Redis connections with different modes."""
88
+
89
+ @classmethod
90
+ def create_connection(
91
+ cls,
92
+ config: RedisConfig,
93
+ ) -> Union[redis.Redis, redis.RedisCluster]:
94
+ """Create a Redis connection based on the configuration.
95
+
96
+ Args:
97
+ config: Redis configuration object containing all connection parameters.
98
+
99
+ Returns:
100
+ A Redis connection - either a standard Redis connection, a RedisCluster
101
+ connection, or a Redis master connection managed by Sentinel.
102
+
103
+ Raises:
104
+ RasaException: If configuration is invalid.
105
+ """
106
+ if config.endpoints is None:
107
+ config.endpoints = []
108
+
109
+ try:
110
+ deployment_mode_enum = DeploymentMode(config.deployment_mode)
111
+ except ValueError:
112
+ valid_modes = [mode.value for mode in DeploymentMode]
113
+ raise RasaException(
114
+ f"Invalid deployment_mode '{config.deployment_mode}'. "
115
+ f"Must be one of: {', '.join(valid_modes)}"
116
+ )
117
+
118
+ parsed_endpoints = cls._parse_and_validate_endpoints(
119
+ deployment_mode_enum, config.endpoints, config.host, config.port
120
+ )
121
+
122
+ iam_credentials_provider = create_iam_credentials_provider(
123
+ IAMCredentialsProviderInput(
124
+ service_type=config.service_type,
125
+ service_name=REDIS_SERVICE_NAME,
126
+ username=config.username,
127
+ cluster_name=os.getenv(AWS_ELASTICACHE_CLUSTER_NAME_ENV_VAR_NAME),
128
+ )
129
+ )
130
+
131
+ if deployment_mode_enum == DeploymentMode.CLUSTER:
132
+ cls._log_cluster_db_warning(deployment_mode_enum, config.db)
133
+ cluster_config = ClusterRedisConfig(
134
+ username=config.username,
135
+ password=config.password,
136
+ use_ssl=config.use_ssl,
137
+ ssl_certfile=config.ssl_certfile,
138
+ ssl_keyfile=config.ssl_keyfile,
139
+ ssl_ca_certs=config.ssl_ca_certs,
140
+ db=config.db,
141
+ socket_timeout=config.socket_timeout,
142
+ decode_responses=config.decode_responses,
143
+ endpoints=parsed_endpoints,
144
+ iam_credentials_provider=iam_credentials_provider,
145
+ )
146
+ return cls._create_cluster_connection(cluster_config)
147
+ elif deployment_mode_enum == DeploymentMode.SENTINEL:
148
+ sentinel_kwargs = {
149
+ "username": config.username,
150
+ "password": config.password,
151
+ "use_ssl": config.use_ssl,
152
+ "ssl_certfile": config.ssl_certfile,
153
+ "ssl_keyfile": config.ssl_keyfile,
154
+ "ssl_ca_certs": config.ssl_ca_certs,
155
+ "db": config.db,
156
+ "socket_timeout": config.socket_timeout,
157
+ "decode_responses": config.decode_responses,
158
+ "endpoints": parsed_endpoints,
159
+ "iam_credentials_provider": iam_credentials_provider,
160
+ }
161
+
162
+ if config.sentinel_service is not None:
163
+ sentinel_kwargs["sentinel_service"] = config.sentinel_service
164
+
165
+ sentinel_config = SentinelRedisConfig(**sentinel_kwargs)
166
+ return cls._create_sentinel_connection(sentinel_config)
167
+ else:
168
+ standard_config = StandardRedisConfig(
169
+ host=config.host,
170
+ port=config.port,
171
+ username=config.username,
172
+ password=config.password,
173
+ use_ssl=config.use_ssl,
174
+ ssl_certfile=config.ssl_certfile,
175
+ ssl_keyfile=config.ssl_keyfile,
176
+ ssl_ca_certs=config.ssl_ca_certs,
177
+ db=config.db,
178
+ socket_timeout=config.socket_timeout,
179
+ decode_responses=config.decode_responses,
180
+ iam_credentials_provider=iam_credentials_provider,
181
+ )
182
+ return cls._create_standard_connection(standard_config)
183
+
184
+ @classmethod
185
+ def _parse_and_validate_endpoints(
186
+ cls,
187
+ deployment_mode: DeploymentMode,
188
+ endpoints: List[str],
189
+ host: Text,
190
+ port: int,
191
+ ) -> List[Union[Dict[str, Any], Tuple[str, int]]]:
192
+ """Parse and validate endpoints based on deployment mode."""
193
+ if deployment_mode == DeploymentMode.STANDARD:
194
+ if endpoints:
195
+ structlogger.warning(
196
+ "redis_connection_factory.standard_endpoints_ignored",
197
+ event_info="Parameter `endpoints` ignored in standard mode. "
198
+ "Only 'host' and 'port' are used for standard Redis connections.",
199
+ )
200
+ return []
201
+
202
+ if not endpoints:
203
+ endpoints = cls._get_default_endpoints(deployment_mode, host, port)
204
+
205
+ # Parse endpoints into appropriate format
206
+ parsed_endpoints = cls._parse_all_endpoints(endpoints, deployment_mode)
207
+
208
+ if not parsed_endpoints:
209
+ raise RasaException(
210
+ f"No valid '{deployment_mode.value}' endpoints provided"
211
+ )
212
+
213
+ return parsed_endpoints
214
+
215
+ @classmethod
216
+ def _get_default_endpoints(
217
+ cls,
218
+ deployment_mode: DeploymentMode,
219
+ host: Text,
220
+ port: int,
221
+ ) -> List[str]:
222
+ """Get default endpoints when none provided."""
223
+ if deployment_mode == DeploymentMode.CLUSTER:
224
+ structlogger.warning(
225
+ "redis_connection_factory.cluster_endpoints_not_provided",
226
+ event_info="No endpoints provided for cluster mode. "
227
+ "Using default 'host:port' configuration.",
228
+ )
229
+ return [f"{host}:{port}"]
230
+ elif deployment_mode == DeploymentMode.SENTINEL:
231
+ raise RasaException("Sentinel mode requires endpoints configuration")
232
+
233
+ return []
234
+
235
+ @classmethod
236
+ def _parse_single_endpoint(
237
+ cls, endpoint: str, deployment_mode: DeploymentMode
238
+ ) -> Optional[Union[Dict[str, Any], Tuple[str, int]]]:
239
+ """Parse a single endpoint string into the appropriate format."""
240
+ if not isinstance(endpoint, str):
241
+ structlogger.warning(
242
+ f"redis_connection_factory.invalid_{deployment_mode.value}_endpoint_type",
243
+ event_info=f"Invalid endpoint type for endpoint '{endpoint}'. "
244
+ "Expected string in 'host:port' format.",
245
+ )
246
+ return None
247
+
248
+ if ":" not in endpoint:
249
+ structlogger.warning(
250
+ f"redis_connection_factory.invalid_{deployment_mode.value}_endpoint_format",
251
+ event_info=f"Invalid format for endpoint '{endpoint}'. "
252
+ "Expected 'host:port'.",
253
+ )
254
+ return None
255
+
256
+ host, port_str = endpoint.rsplit(":", 1)
257
+ try:
258
+ port = int(port_str)
259
+ except ValueError:
260
+ structlogger.warning(
261
+ f"redis_connection_factory.invalid_{deployment_mode.value}_endpoint",
262
+ event_info=f"Invalid port in endpoint '{endpoint}'. "
263
+ "Expected format 'host:port'.",
264
+ )
265
+ return None
266
+
267
+ return (host, port)
268
+
269
+ @classmethod
270
+ def _parse_all_endpoints(
271
+ cls,
272
+ endpoints: List[str],
273
+ deployment_mode: DeploymentMode,
274
+ ) -> List[Union[Dict[str, Any], Tuple[str, int]]]:
275
+ """Parse a list of endpoint strings into appropriate format."""
276
+ parsed_endpoints = []
277
+ for endpoint in endpoints:
278
+ parsed = cls._parse_single_endpoint(endpoint, deployment_mode)
279
+ if parsed:
280
+ parsed_endpoints.append(parsed)
281
+ return parsed_endpoints
282
+
283
+ @classmethod
284
+ def _create_cluster_connection(
285
+ cls,
286
+ config: ClusterRedisConfig,
287
+ ) -> redis.RedisCluster:
288
+ """Create a Redis Cluster connection.
289
+
290
+ Note: Database parameter is ignored in cluster mode (always uses db=0).
291
+
292
+ Args:
293
+ config: Cluster configuration containing all connection parameters.
294
+
295
+ Returns:
296
+ redis.RedisCluster: Configured cluster connection.
297
+
298
+ Raises:
299
+ ConnectionException: If cluster initialization fails.
300
+ """
301
+ from redis.cluster import ClusterNode
302
+
303
+ structlogger.info(
304
+ "redis_connection_factory.cluster_mode",
305
+ event_info=f"Initializing Redis Cluster with {len(config.endpoints)} nodes",
306
+ )
307
+
308
+ cluster_nodes = [ClusterNode(host, port) for host, port in config.endpoints]
309
+
310
+ common_config_kwargs = {
311
+ "startup_nodes": cluster_nodes,
312
+ "ssl": config.use_ssl,
313
+ "ssl_certfile": config.ssl_certfile,
314
+ "ssl_keyfile": config.ssl_keyfile,
315
+ "ssl_ca_certs": config.ssl_ca_certs,
316
+ "socket_timeout": config.socket_timeout,
317
+ "decode_responses": config.decode_responses,
318
+ }
319
+
320
+ try:
321
+ if config.iam_credentials_provider is not None:
322
+ structlogger.debug("redis_connection_factory.cluster_iam_auth_enabled")
323
+
324
+ redis_cluster: redis.RedisCluster = redis.RedisCluster(
325
+ credential_provider=config.iam_credentials_provider,
326
+ **common_config_kwargs,
327
+ )
328
+ else:
329
+ redis_cluster = redis.RedisCluster(
330
+ username=config.username,
331
+ password=config.password,
332
+ **common_config_kwargs,
333
+ )
334
+ except Exception as e:
335
+ raise ConnectionException(f"Error initializing Redis Cluster: {e}")
336
+
337
+ return redis_cluster
338
+
339
+ @classmethod
340
+ def _create_sentinel_connection(
341
+ cls,
342
+ config: SentinelRedisConfig,
343
+ ) -> redis.Redis:
344
+ """Create a Sentinel-managed Redis connection.
345
+
346
+ Connects to Redis master through Sentinel service discovery.
347
+ Tests connection with ping() before returning.
348
+
349
+ Args:
350
+ config: Sentinel configuration containing all connection parameters.
351
+
352
+ Returns:
353
+ redis.Redis: Connection to the Redis master via sentinel.
354
+
355
+ Raises:
356
+ ConnectionException: If sentinel initialization or connection test fails.
357
+ """
358
+ from redis.sentinel import Sentinel
359
+
360
+ structlogger.info(
361
+ "redis_connection_factory.sentinel_mode",
362
+ event_info=f"Initializing Redis Sentinel with {len(config.endpoints)} "
363
+ f"sentinel endpoints and service: {config.sentinel_service}",
364
+ )
365
+
366
+ # Configuration for Sentinel connection
367
+ connection_kwargs: Dict[str, Any] = {
368
+ "socket_timeout": config.socket_timeout,
369
+ }
370
+
371
+ sentinel_kwargs: Optional[Dict] = None
372
+ if config.iam_credentials_provider is not None:
373
+ structlogger.debug("redis_connection_factory.sentinel_iam_auth_enabled")
374
+ sentinel_kwargs = {"credential_provider": config.iam_credentials_provider}
375
+ else:
376
+ connection_kwargs.update(
377
+ {
378
+ "username": config.username,
379
+ "password": config.password,
380
+ }
381
+ )
382
+
383
+ # SSL configuration
384
+ if config.use_ssl:
385
+ connection_kwargs.update(
386
+ {
387
+ "ssl": config.use_ssl,
388
+ "ssl_certfile": config.ssl_certfile,
389
+ "ssl_keyfile": config.ssl_keyfile,
390
+ "ssl_ca_certs": config.ssl_ca_certs,
391
+ }
392
+ )
393
+
394
+ # Configuration for Redis client (master/replica)
395
+ client_kwargs = {
396
+ "db": config.db,
397
+ "decode_responses": config.decode_responses,
398
+ "socket_timeout": config.socket_timeout,
399
+ }
400
+
401
+ # Create Sentinel instance
402
+ try:
403
+ sentinel = Sentinel(
404
+ config.endpoints, sentinel_kwargs=sentinel_kwargs, **connection_kwargs
405
+ )
406
+ master = sentinel.master_for(config.sentinel_service, **client_kwargs)
407
+
408
+ # Test the connection
409
+ master.ping()
410
+
411
+ except Exception as e:
412
+ raise ConnectionException(f"Error initializing Redis Sentinel: {e}")
413
+
414
+ return master
415
+
416
+ @classmethod
417
+ def _create_standard_connection(
418
+ cls,
419
+ config: StandardRedisConfig,
420
+ ) -> redis.Redis:
421
+ """Create a standard Redis connection.
422
+
423
+ Args:
424
+ config: Standard configuration containing all connection parameters.
425
+
426
+ Returns:
427
+ redis.Redis: Configured Redis connection.
428
+ """
429
+ structlogger.info(
430
+ "redis_connection_factory.standard_mode",
431
+ event_info="Initializing Redis connection",
432
+ )
433
+ # Build connection arguments
434
+ connection_args: Dict[str, Any] = {
435
+ "host": config.host,
436
+ "port": int(config.port),
437
+ "db": config.db,
438
+ "socket_timeout": float(config.socket_timeout),
439
+ "ssl": config.use_ssl,
440
+ "ssl_certfile": config.ssl_certfile,
441
+ "ssl_keyfile": config.ssl_keyfile,
442
+ "ssl_ca_certs": config.ssl_ca_certs,
443
+ "decode_responses": config.decode_responses,
444
+ }
445
+
446
+ if config.iam_credentials_provider is not None:
447
+ structlogger.debug("redis_connection_factory.standard_iam_auth_enabled")
448
+ connection_args.update(
449
+ {"credential_provider": config.iam_credentials_provider}
450
+ )
451
+ else:
452
+ connection_args.update(
453
+ {
454
+ "password": config.password,
455
+ "username": config.username,
456
+ }
457
+ )
458
+
459
+ try:
460
+ standard_redis = redis.StrictRedis(**connection_args)
461
+ except Exception as e:
462
+ raise ConnectionException(f"Error initializing Redis connection: {e}")
463
+
464
+ return standard_redis
465
+
466
+ @classmethod
467
+ def _log_cluster_db_warning(cls, deployment_mode: DeploymentMode, db: int) -> None:
468
+ """Log warning if db parameter is set in cluster mode."""
469
+ if deployment_mode == DeploymentMode.CLUSTER and db != 0:
470
+ structlogger.warning(
471
+ "redis_connection_factory.cluster_db_ignored",
472
+ event_info=f"Database parameter 'db={db}' ignored in cluster mode. "
473
+ "Redis Cluster only supports database 0.",
474
+ )
rasa/core/run.py CHANGED
@@ -30,24 +30,35 @@ from rasa import server, telemetry
30
30
  from rasa.constants import ENV_SANIC_BACKLOG
31
31
  from rasa.core import agent, channels, constants
32
32
  from rasa.core.agent import Agent
33
- from rasa.core.available_endpoints import AvailableEndpoints
33
+ from rasa.core.available_agents import AvailableAgents
34
34
  from rasa.core.channels import console
35
35
  from rasa.core.channels.channel import InputChannel
36
36
  from rasa.core.channels.development_inspector import DevelopmentInspectProxy
37
+ from rasa.core.config.available_endpoints import AvailableEndpoints
38
+ from rasa.core.config.credentials import CredentialsConfig
37
39
  from rasa.core.persistor import StorageType
38
40
  from rasa.shared.exceptions import RasaException
39
- from rasa.shared.utils.yaml import read_config_file
40
41
  from rasa.utils import licensing
41
42
 
42
43
  logger = logging.getLogger() # get the root logger
43
44
 
44
45
 
45
- def create_http_input_channels(
46
- channel: Optional[Text], credentials_file: Optional[Text]
46
+ def create_input_channels(
47
+ channel: Optional[Text], credentials_config: Optional[CredentialsConfig]
47
48
  ) -> List[InputChannel]:
48
- """Instantiate the chosen input channel."""
49
- if credentials_file:
50
- all_credentials = read_config_file(credentials_file)
49
+ """Instantiate the chosen input channel.
50
+
51
+ Args:
52
+ channel (optional): The name of the specific input channel to create.
53
+ credentials_config: CredentialsConfig object containing channel credentials.
54
+
55
+ Returns:
56
+ A list of instantiated input channels. If a specific channel is provided,
57
+ it returns a list with that single channel. If no channel is specified,
58
+ it returns a list of all channels defined in the credentials file.
59
+ """
60
+ if credentials_config:
61
+ all_credentials = credentials_config.channels
51
62
  else:
52
63
  all_credentials = {}
53
64
  if channel:
@@ -86,10 +97,32 @@ def _create_single_channel(
86
97
  """
87
98
  from rasa.core.channels import BUILTIN_CHANNELS
88
99
 
100
+ # Channels that have optional dependencies
101
+ channels_with_optional_deps = {
102
+ "facebook": "fbmessenger",
103
+ "slack": "slack-sdk",
104
+ "telegram": "aiogram",
105
+ "twilio": "twilio",
106
+ "twilio_voice": "twilio",
107
+ "twilio_media_streams": "twilio",
108
+ "webexteams": "webexteamssdk",
109
+ "vier_cvg": "cvg_sdk",
110
+ }
111
+
89
112
  if channel in BUILTIN_CHANNELS:
90
113
  channel_class = BUILTIN_CHANNELS[channel]
91
114
 
92
115
  return channel_class.from_credentials(credentials)
116
+ elif channel in channels_with_optional_deps:
117
+ # Channel is known but not available due to missing dependency
118
+ dependency = channels_with_optional_deps[channel]
119
+ raise RasaException(
120
+ f"Channel '{channel}' is not available "
121
+ f"due to missing '{dependency}' dependency. "
122
+ f"Please install the required extra by running: "
123
+ f"pip install 'rasa-pro[channels]' OR "
124
+ f"poetry add 'rasa-pro[channels]'"
125
+ )
93
126
  else:
94
127
  # try to load channel based on class name
95
128
  try:
@@ -141,6 +174,7 @@ def configure_app(
141
174
  route: Optional[Text] = "/webhooks/",
142
175
  port: int = constants.DEFAULT_SERVER_PORT,
143
176
  endpoints: Optional[AvailableEndpoints] = None,
177
+ sub_agents: Optional[AvailableAgents] = None,
144
178
  log_file: Optional[Text] = None,
145
179
  conversation_id: Optional[Text] = uuid.uuid4().hex,
146
180
  use_syslog: bool = False,
@@ -169,6 +203,7 @@ def configure_app(
169
203
  jwt_private_key=jwt_private_key,
170
204
  jwt_method=jwt_method,
171
205
  endpoints=endpoints,
206
+ sub_agents=sub_agents,
172
207
  is_inspector_enabled=is_inspector_enabled,
173
208
  )
174
209
  )
@@ -224,7 +259,7 @@ def serve_application(
224
259
  channel: Optional[Text] = None,
225
260
  interface: Optional[Text] = constants.DEFAULT_SERVER_INTERFACE,
226
261
  port: int = constants.DEFAULT_SERVER_PORT,
227
- credentials: Optional[Text] = None,
262
+ credentials: Optional[CredentialsConfig] = None,
228
263
  cors: Optional[Union[Text, List[Text]]] = None,
229
264
  auth_token: Optional[Text] = None,
230
265
  enable_api: bool = True,
@@ -233,6 +268,7 @@ def serve_application(
233
268
  jwt_private_key: Optional[Text] = None,
234
269
  jwt_method: Optional[Text] = None,
235
270
  endpoints: Optional[AvailableEndpoints] = None,
271
+ sub_agents: Optional[AvailableAgents] = None,
236
272
  remote_storage: Optional[StorageType] = None,
237
273
  log_file: Optional[Text] = None,
238
274
  ssl_certificate: Optional[Text] = None,
@@ -253,7 +289,7 @@ def serve_application(
253
289
  if not channel and not credentials:
254
290
  channel = "cmdline"
255
291
 
256
- input_channels = create_http_input_channels(channel, credentials)
292
+ input_channels = create_input_channels(channel, credentials)
257
293
 
258
294
  if inspect:
259
295
  logger.info("Starting development inspector.")
@@ -273,6 +309,7 @@ def serve_application(
273
309
  jwt_method,
274
310
  port=port,
275
311
  endpoints=endpoints,
312
+ sub_agents=sub_agents,
276
313
  log_file=log_file,
277
314
  conversation_id=conversation_id,
278
315
  use_syslog=use_syslog,
@@ -292,7 +329,7 @@ def serve_application(
292
329
  logger.info(f"Starting Rasa server on {protocol}://{interface}:{port}")
293
330
 
294
331
  app.register_listener(
295
- partial(load_agent_on_start, model_path, endpoints, remote_storage),
332
+ partial(load_agent_on_start, model_path, endpoints, remote_storage, sub_agents),
296
333
  "before_server_start",
297
334
  )
298
335
 
@@ -330,6 +367,7 @@ async def load_agent_on_start(
330
367
  model_path: Text,
331
368
  endpoints: AvailableEndpoints,
332
369
  remote_storage: Optional[StorageType],
370
+ sub_agents: Optional[AvailableAgents],
333
371
  app: Sanic,
334
372
  loop: AbstractEventLoop,
335
373
  ) -> Agent:
@@ -342,6 +380,7 @@ async def load_agent_on_start(
342
380
  model_path=model_path,
343
381
  remote_storage=remote_storage,
344
382
  endpoints=endpoints,
383
+ sub_agents=sub_agents,
345
384
  loop=loop,
346
385
  )
347
386
 
rasa/core/test.py CHANGED
@@ -1281,6 +1281,10 @@ async def compare_models_in_dir(
1281
1281
  for k, v in number_correct_in_run.items():
1282
1282
  number_correct[k].append(v)
1283
1283
 
1284
+ logger.info("current working directory: " + os.getcwd())
1285
+ logger.info(
1286
+ f"Writing model comparison results to '{os.path.join(output, RESULTS_FILE)}'"
1287
+ )
1284
1288
  rasa.shared.utils.io.dump_obj_as_json_to_file(
1285
1289
  os.path.join(output, RESULTS_FILE), number_correct
1286
1290
  )