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,538 @@
1
+ """Validation functions for agent configurations with reduced redundancies."""
2
+
3
+ import os
4
+ import urllib.parse
5
+ from collections import Counter
6
+ from typing import Any, Dict, List, NoReturn, Set
7
+
8
+ import jinja2.exceptions
9
+ import structlog
10
+ from pydantic import ValidationError as PydanticValidationError
11
+
12
+ from rasa.agents.exceptions import (
13
+ AgentNameFlowConflictException,
14
+ DuplicatedAgentNameException,
15
+ )
16
+ from rasa.core.available_agents import (
17
+ DEFAULT_AGENTS_CONFIG_FOLDER,
18
+ AgentConfig,
19
+ AgentConfiguration,
20
+ AgentConnections,
21
+ AgentInfo,
22
+ AvailableAgents,
23
+ ProtocolConfig,
24
+ )
25
+ from rasa.core.config.available_endpoints import AvailableEndpoints
26
+ from rasa.core.config.configuration import Configuration
27
+ from rasa.exceptions import ValidationError
28
+ from rasa.shared.agents.auth.utils import validate_secrets_in_params
29
+ from rasa.shared.utils.llm import get_prompt_template, validate_jinja2_template
30
+ from rasa.shared.utils.yaml import read_config_file
31
+
32
+ # Initialize logger
33
+ structlogger = structlog.get_logger()
34
+
35
+ # Centralized allowed keys configuration to eliminate duplication
36
+ ALLOWED_KEYS = {
37
+ "agent": {"name", "protocol", "description"},
38
+ "configuration": {
39
+ "llm",
40
+ "prompt_template",
41
+ "module",
42
+ "timeout",
43
+ "max_retries",
44
+ "agent_card",
45
+ "auth",
46
+ },
47
+ "connections": {"mcp_servers"},
48
+ }
49
+
50
+
51
+ def validate_agent_names_unique(agents: List[AgentConfig]) -> None:
52
+ """Validate that agent names are unique across all loaded agents.
53
+
54
+ Args:
55
+ agents: List of agent configurations.
56
+
57
+ Raises:
58
+ DuplicatedAgentNameException: If agent names are not unique.
59
+ """
60
+ agent_names = [agent_config.agent.name for agent_config in agents]
61
+ name_counts = Counter(agent_names)
62
+
63
+ duplicated_names = [name for name, count in name_counts.items() if count > 1]
64
+
65
+ if duplicated_names:
66
+ raise DuplicatedAgentNameException(duplicated_names)
67
+
68
+
69
+ def validate_agent_names_not_conflicting_with_flows(
70
+ agents: Dict[str, AgentConfig], flow_names: Set[str]
71
+ ) -> None:
72
+ """Validate that agent names do not conflict with flow names.
73
+
74
+ Args:
75
+ agents: Dictionary of agent configurations.
76
+ flow_names: Set of flow names to check against.
77
+
78
+ Raises:
79
+ AgentNameFlowConflictException: If agent names conflict with flow names.
80
+ """
81
+ conflicting_names = [
82
+ agent_name for agent_name in agents.keys() if agent_name in flow_names
83
+ ]
84
+
85
+ if conflicting_names:
86
+ raise AgentNameFlowConflictException(conflicting_names)
87
+
88
+
89
+ def _validate_mcp_config(agent_config: AgentConfig) -> None:
90
+ """Validate MCP-specific configuration requirements."""
91
+ agent_name = agent_config.agent.name
92
+
93
+ # Check connections.mcp_servers exists
94
+ if agent_config.connections is None or agent_config.connections.mcp_servers is None:
95
+ raise ValidationError(
96
+ code="agent.validation.mcp.missing_connections",
97
+ event_info=f"For protocol 'RASA', agent '{agent_name}' must have "
98
+ "'connections.mcp_servers' configured.",
99
+ )
100
+
101
+ # Check mcp_servers list is not empty
102
+ if not agent_config.connections.mcp_servers:
103
+ raise ValidationError(
104
+ code="agent.validation.mcp.empty_servers_list",
105
+ event_info=f"For protocol 'RASA', agent '{agent_name}' must have "
106
+ "at least one MCP server configured in 'connections.mcp_servers'.",
107
+ )
108
+
109
+ # Validate each MCP server configuration
110
+ for i, server in enumerate(agent_config.connections.mcp_servers):
111
+ if not server.name:
112
+ raise ValidationError(
113
+ code="agent.validation.mcp.server_missing_name",
114
+ event_info=f"For protocol 'RASA', agent '{agent_name}' MCP server "
115
+ f"at index {i} must have a 'name' field.",
116
+ )
117
+
118
+
119
+ def _validate_a2a_config(agent_config: AgentConfig) -> None:
120
+ """Validate A2A-specific configuration requirements."""
121
+ agent_name = agent_config.agent.name
122
+
123
+ # Check configuration.agent_card exists
124
+ if (
125
+ agent_config.configuration is None
126
+ or agent_config.configuration.agent_card is None
127
+ ):
128
+ raise ValidationError(
129
+ code="agent.validation.a2a.missing_agent_card",
130
+ event_info=f"For protocol 'A2A', agent '{agent_name}' must have "
131
+ "'configuration.agent_card' specified.",
132
+ )
133
+
134
+ # Validate agent_card path or URL
135
+ agent_card = agent_config.configuration.agent_card
136
+ if not agent_card:
137
+ raise ValidationError(
138
+ code="agent.validation.a2a.empty_agent_card",
139
+ event_info=f"Agent '{agent_name}' has empty 'agent_card' value",
140
+ )
141
+
142
+ # Check if it's a URL
143
+ parsed_url = urllib.parse.urlparse(agent_card)
144
+ if parsed_url.scheme and parsed_url.netloc:
145
+ # It's a URL, validate format
146
+ if parsed_url.scheme not in ["http", "https"]:
147
+ raise ValidationError(
148
+ code="agent.validation.a2a.invalid_agent_card_url",
149
+ event_info=f"Agent '{agent_name}' has invalid URL scheme "
150
+ f"'{parsed_url.scheme}' for 'agent_card'",
151
+ )
152
+ else:
153
+ # It's a file path, check if it exists
154
+ if not os.path.exists(agent_card):
155
+ raise ValidationError(
156
+ code="agent.validation.a2a.agent_card_file_not_found",
157
+ event_info=f"Agent '{agent_name}' has 'agent_card' file that doesn't "
158
+ f"exist: {agent_card}",
159
+ )
160
+
161
+ # Validate right use of secrets in auth configuration
162
+ if agent_config.configuration.auth:
163
+ validate_secrets_in_params(
164
+ agent_config.configuration.auth, f"agent '{agent_name}'"
165
+ )
166
+
167
+
168
+ def _validate_prompt_template_syntax(prompt_path: str, agent_name: str) -> None:
169
+ """Validate Jinja2 syntax of a prompt template file."""
170
+ try:
171
+ # Use a simple default template, as we're assuming
172
+ # that the default templates are valid
173
+ default_template = "{{ content }}"
174
+ template_content = get_prompt_template(
175
+ prompt_path,
176
+ default_template,
177
+ log_source_component=f"agent.validation.{agent_name}",
178
+ log_source_method="init",
179
+ )
180
+ validate_jinja2_template(template_content)
181
+
182
+ except jinja2.exceptions.TemplateSyntaxError as e:
183
+ raise ValidationError(
184
+ code="agent.validation.prompt_template_syntax_error",
185
+ event_info=(
186
+ f"Agent '{agent_name}' has invalid Jinja2 template syntax at line "
187
+ f"{e.lineno}: {e.message}"
188
+ ),
189
+ ) from e
190
+ except Exception as e:
191
+ raise ValidationError(
192
+ code="agent.validation.optional.prompt_template_error",
193
+ event_info=(f"Agent '{agent_name}' has error reading prompt template: {e}"),
194
+ ) from e
195
+
196
+
197
+ def _validate_optional_keys(agent_config: AgentConfig) -> None:
198
+ """Validate optional keys in agent configuration."""
199
+ agent_name = agent_config.agent.name
200
+
201
+ # Validate prompt_template if present
202
+ if agent_config.configuration and agent_config.configuration.prompt_template:
203
+ prompt_path = agent_config.configuration.prompt_template
204
+ if not os.path.exists(prompt_path):
205
+ # If reading the custom prompt fails,
206
+ # allow fallback to default prompt template
207
+ structlogger.warning(
208
+ "agent.validation.optional.prompt_template_file_not_found",
209
+ agent_name=agent_name,
210
+ prompt_path=prompt_path,
211
+ event_info=(
212
+ f"Prompt template file not found: {prompt_path}. "
213
+ f"Agent will use default template."
214
+ ),
215
+ )
216
+ # Don't raise ValidationError, allow fallback to default template
217
+ return
218
+
219
+ # Validate Jinja2 syntax
220
+ _validate_prompt_template_syntax(prompt_path, agent_name)
221
+
222
+ # Validate module if present
223
+ if agent_config.configuration and agent_config.configuration.module:
224
+ import importlib
225
+
226
+ module_name = agent_config.configuration.module
227
+ try:
228
+ module_path, class_name = module_name.rsplit(".", 1)
229
+ getattr(importlib.import_module(module_path), class_name)
230
+ except (ImportError, AttributeError) as e:
231
+ raise ValidationError(
232
+ code="agent.validation.optional.module_not_found",
233
+ event_info=f"Agent '{agent_name}' has module '{module_name}' "
234
+ f"that could not be imported: {e}",
235
+ )
236
+
237
+
238
+ def _validate_llm_references(
239
+ llm_config: Dict[str, Any],
240
+ endpoints: "AvailableEndpoints",
241
+ agent_name: str,
242
+ ) -> None:
243
+ """Validate LLM configuration references against endpoints."""
244
+ if "model_group" in llm_config:
245
+ from rasa.engine.validation import (
246
+ _validate_component_model_client_config_has_references_to_endpoints,
247
+ )
248
+
249
+ component_config = {"llm": llm_config}
250
+ _validate_component_model_client_config_has_references_to_endpoints(
251
+ component_config, "llm", component_name=agent_name
252
+ )
253
+
254
+
255
+ def _validate_mcp_server_references(
256
+ mcp_servers: list, endpoints: "AvailableEndpoints", agent_name: str
257
+ ) -> None:
258
+ """Validate MCP server references against endpoints."""
259
+ if not endpoints.mcp_servers:
260
+ raise ValidationError(
261
+ code="agent.validation.endpoints.no_mcp_servers",
262
+ event_info=(
263
+ f"Agent '{agent_name}' references MCP servers but no MCP "
264
+ "servers are defined in endpoints.yml."
265
+ ),
266
+ )
267
+
268
+ available_mcp_server_names = [server.name for server in endpoints.mcp_servers]
269
+
270
+ for i, mcp_server in enumerate(mcp_servers):
271
+ server_name = mcp_server.name
272
+ if server_name not in available_mcp_server_names:
273
+ raise ValidationError(
274
+ code="agent.validation.endpoints.invalid_mcp_server",
275
+ event_info=(
276
+ f"MCP server '{server_name}' at index {i} for Agent "
277
+ f"'{agent_name}' does not exist in endpoints.yml. Available MCP "
278
+ f"servers: {', '.join(available_mcp_server_names)}"
279
+ ),
280
+ )
281
+
282
+
283
+ def _handle_pydantic_validation_error(
284
+ error: PydanticValidationError, agent_name: str
285
+ ) -> NoReturn:
286
+ """Handle specific Pydantic validation errors that are actually possible.
287
+
288
+ Args:
289
+ error: The Pydantic validation error to handle
290
+ agent_name: Name of the agent for error messages
291
+ """
292
+ missing_fields = []
293
+ invalid_protocol = False
294
+ type_error = None
295
+
296
+ for pydantic_error in error.errors():
297
+ error_type = pydantic_error["type"]
298
+ field_path = ".".join(str(loc) for loc in pydantic_error["loc"])
299
+
300
+ if error_type == "missing":
301
+ for field in ["name", "protocol", "description"]:
302
+ if field in field_path:
303
+ missing_fields.append(field)
304
+ elif error_type == "enum" and "protocol" in field_path:
305
+ invalid_protocol = True
306
+ elif error_type in ["string_type", "int_parsing"]:
307
+ type_error = (field_path, pydantic_error["msg"])
308
+
309
+ # Handle missing required fields
310
+ if missing_fields:
311
+ raise ValidationError(
312
+ code="agent.validation.mandatory.fields_missing",
313
+ event_info=(
314
+ f"Agent '{agent_name}' is missing required fields "
315
+ f"in agent section: {', '.join(missing_fields)}"
316
+ ),
317
+ )
318
+
319
+ # Handle invalid protocol
320
+ elif invalid_protocol:
321
+ raise ValidationError(
322
+ code="agent.validation.pydantic.invalid_protocol",
323
+ event_info=(
324
+ f"Agent '{agent_name}' has invalid protocol value. "
325
+ "Supported protocols: MCP, A2A"
326
+ ),
327
+ )
328
+
329
+ # Handle type errors
330
+ elif type_error:
331
+ field, msg = type_error
332
+ raise ValidationError(
333
+ code="agent.validation.pydantic.type_error",
334
+ event_info=(
335
+ f"Agent '{agent_name}' has invalid type for field " f"'{field}': {msg}"
336
+ ),
337
+ )
338
+
339
+ # Handle other Pydantic validation errors
340
+ else:
341
+ raise ValidationError(
342
+ code="agent.validation.pydantic.failed",
343
+ event_info=f"Agent '{agent_name}' validation failed: {error}",
344
+ )
345
+
346
+
347
+ def _validate_endpoint_references(agent_config: AgentConfig) -> None:
348
+ """Validate that LLM and MCP server references in agent config are valid."""
349
+ agent_name = agent_config.agent.name
350
+ endpoints = Configuration.get_instance().endpoints
351
+ if not endpoints.config_file_path:
352
+ # If no endpoints were loaded (e.g., `data validate` without --endpoints), skip
353
+ # endpoint reference checks
354
+ return
355
+
356
+ # Validate LLM configuration references
357
+ if agent_config.configuration and agent_config.configuration.llm:
358
+ _validate_llm_references(agent_config.configuration.llm, endpoints, agent_name)
359
+
360
+ # Validate MCP server references
361
+ if agent_config.connections and agent_config.connections.mcp_servers:
362
+ _validate_mcp_server_references(
363
+ agent_config.connections.mcp_servers, endpoints, agent_name
364
+ )
365
+
366
+
367
+ def _validate_section_keys(
368
+ data: Dict[str, Any], section: str, allowed_keys: set
369
+ ) -> None:
370
+ """Generic function to validate keys in a specific section."""
371
+ if section not in data:
372
+ return
373
+
374
+ section_data = data[section]
375
+ if not isinstance(section_data, dict):
376
+ return
377
+
378
+ additional_keys = set(section_data.keys()) - allowed_keys
379
+ if additional_keys:
380
+ agent_name = data.get("agent", {}).get("name", "unknown")
381
+ raise ValidationError(
382
+ code=f"agent.validation.structure.additional_{section}_keys",
383
+ event_info=(
384
+ f"Agent '{agent_name}' contains additional keys in "
385
+ f"'{section}' section: {', '.join(sorted(additional_keys))}"
386
+ ),
387
+ )
388
+
389
+
390
+ def _validate_mandatory_fields(data: Dict[str, Any], agent_name: str) -> None:
391
+ """Validate that all mandatory fields are present in the agent section."""
392
+ if "agent" not in data:
393
+ raise ValidationError(
394
+ code="agent.validation.mandatory.agent_section_missing",
395
+ event_info=f"Agent '{agent_name}' is missing 'agent' section",
396
+ )
397
+
398
+ agent_data = data["agent"]
399
+ if not isinstance(agent_data, dict):
400
+ raise ValidationError(
401
+ code="agent.validation.mandatory.agent_section_invalid",
402
+ event_info=(
403
+ f"Agent '{agent_name}' has invalid 'agent' section - "
404
+ "must be a dictionary"
405
+ ),
406
+ )
407
+
408
+ # Check for required fields (protocol is optional due to default in model)
409
+ missing_fields = []
410
+ for field in ["name", "description"]:
411
+ if field not in agent_data or not agent_data[field]:
412
+ missing_fields.append(field)
413
+
414
+ if missing_fields:
415
+ raise ValidationError(
416
+ code="agent.validation.mandatory.fields_missing",
417
+ event_info=(
418
+ f"Agent '{agent_name}' is missing required fields in agent section: "
419
+ f"{', '.join(missing_fields)}"
420
+ ),
421
+ )
422
+
423
+
424
+ def _validate_no_additional_keys_raw_data(data: Dict[str, Any]) -> None:
425
+ """Validate that no additional, unexpected keys are present in the raw data."""
426
+ # Use the generic validation function for each section
427
+ _validate_section_keys(data, "agent", ALLOWED_KEYS["agent"])
428
+ _validate_section_keys(data, "configuration", ALLOWED_KEYS["configuration"])
429
+ _validate_section_keys(data, "connections", ALLOWED_KEYS["connections"])
430
+
431
+
432
+ def _validate_folder_structure(agent_folder: str) -> None:
433
+ """Validate agent folder structure."""
434
+ if not os.path.exists(agent_folder):
435
+ raise ValidationError(
436
+ code="agent.validation.folder.not_found",
437
+ event_info=f"Agent folder does not exist: {agent_folder}",
438
+ )
439
+
440
+ if not os.path.isdir(agent_folder):
441
+ raise ValidationError(
442
+ code="agent.validation.folder.not_directory",
443
+ event_info=f"Agent folder is not a directory: {agent_folder}",
444
+ )
445
+
446
+
447
+ def _validate_config_file_exists(config_path: str, agent_name: str) -> None:
448
+ """Validate config.yml file exists."""
449
+ if not os.path.isfile(config_path):
450
+ raise ValidationError(
451
+ code="agent.validation.folder.missing_config",
452
+ event_info=f"Agent '{agent_name}' is missing 'config.yml' file",
453
+ )
454
+
455
+
456
+ def validate_agent_config(agent_config: AgentConfig) -> None:
457
+ """Validate an agent configuration using all applicable validators."""
458
+ protocol = agent_config.agent.protocol
459
+
460
+ # Run protocol-specific validation
461
+ if protocol == ProtocolConfig.RASA:
462
+ _validate_mcp_config(agent_config)
463
+ elif protocol == ProtocolConfig.A2A:
464
+ _validate_a2a_config(agent_config)
465
+
466
+ # Run optional keys validation
467
+ _validate_optional_keys(agent_config)
468
+
469
+ # Run endpoint references validation
470
+ _validate_endpoint_references(agent_config)
471
+
472
+
473
+ def validate_agent_folder(agent_folder: str = DEFAULT_AGENTS_CONFIG_FOLDER) -> None:
474
+ """Validate all agent configurations in a folder."""
475
+ # Validate folder structure
476
+ _validate_folder_structure(agent_folder)
477
+
478
+ # Scan for agent folders
479
+ for agent_folder_name in os.listdir(agent_folder):
480
+ agent_path = os.path.join(agent_folder, agent_folder_name)
481
+
482
+ if not os.path.isdir(agent_path):
483
+ continue
484
+
485
+ config_path = os.path.join(agent_path, "config.yml")
486
+
487
+ # Validate config file exists
488
+ _validate_config_file_exists(config_path, agent_folder_name)
489
+
490
+ # Read and validate the config content
491
+ try:
492
+ # First read the raw YAML data to validate structure
493
+ data = read_config_file(config_path)
494
+
495
+ # Validate no additional keys
496
+ _validate_no_additional_keys_raw_data(data)
497
+
498
+ # Validate mandatory fields before creating Pydantic models
499
+ _validate_mandatory_fields(data, agent_folder_name)
500
+
501
+ agent_config = AvailableAgents.from_dict(data)
502
+
503
+ # Validate the agent config (protocol-specific and endpoint references)
504
+ validate_agent_config(agent_config)
505
+ except PydanticValidationError as e:
506
+ _handle_pydantic_validation_error(e, agent_folder_name)
507
+ except Exception as e:
508
+ # Handle non-Pydantic exceptions
509
+ raise ValidationError(
510
+ code="agent.validation.folder.config_validation_failed",
511
+ event_info=f"Agent '{agent_folder_name}' validation failed: {e}",
512
+ )
513
+
514
+
515
+ def validate_agent_config_data(data: Dict[str, Any]) -> "AgentConfig":
516
+ """Validate agent configuration data."""
517
+ try:
518
+ # Validate no additional keys before creating Pydantic models
519
+ _validate_no_additional_keys_raw_data(data)
520
+
521
+ # Create the agent config (this will trigger Pydantic validation)
522
+ agent_config = AgentConfig(
523
+ agent=AgentInfo(**data.get("agent", {})),
524
+ configuration=AgentConfiguration(**data.get("configuration", {}))
525
+ if data.get("configuration")
526
+ else None,
527
+ connections=AgentConnections(**data.get("connections", {}))
528
+ if data.get("connections")
529
+ else None,
530
+ )
531
+
532
+ return agent_config
533
+
534
+ except PydanticValidationError as e:
535
+ _handle_pydantic_validation_error(e, "Agent configuration")
536
+ except Exception:
537
+ # Re-raise other exceptions
538
+ raise
rasa/api.py CHANGED
@@ -2,6 +2,7 @@ import asyncio
2
2
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Union
3
3
 
4
4
  import rasa.shared.constants
5
+ from rasa.core.config.configuration import Configuration
5
6
  from rasa.core.persistor import StorageType
6
7
 
7
8
  # WARNING: Be careful about adding any top level imports at this place!
@@ -19,30 +20,29 @@ if TYPE_CHECKING:
19
20
 
20
21
  def run(
21
22
  model: Text,
22
- endpoints: Text,
23
+ sub_agents: Text,
23
24
  connector: Optional[Text] = None,
24
- credentials: Optional[Text] = None,
25
25
  **kwargs: Dict[Text, Any],
26
26
  ) -> None:
27
27
  """Runs a Rasa model.
28
28
 
29
29
  Args:
30
30
  model: Path to model archive.
31
- endpoints: Path to endpoints file.
31
+ sub_agents: Path to sub-agents directory.
32
32
  connector: Connector which should be use (overwrites `credentials`
33
33
  field).
34
- credentials: Path to channel credentials file.
35
34
  **kwargs: Additional arguments which are passed to
36
35
  `rasa.core.run.serve_application`.
37
36
 
38
37
  """
39
38
  import rasa.core.run
40
39
  import rasa.shared.utils.common
41
- from rasa.core.available_endpoints import AvailableEndpoints
42
40
  from rasa.shared.constants import DOCS_BASE_URL
43
41
  from rasa.shared.utils.cli import print_warning
44
42
 
45
- _endpoints = AvailableEndpoints.get_instance(endpoints)
43
+ _sub_agents = Configuration.get_instance().available_agents
44
+
45
+ credentials = Configuration.get_instance().credentials
46
46
 
47
47
  if not connector and not credentials:
48
48
  connector = "rest"
@@ -56,11 +56,19 @@ def run(
56
56
  kwargs = rasa.shared.utils.common.minimal_kwargs(
57
57
  kwargs, rasa.core.run.serve_application
58
58
  )
59
+
60
+ if "endpoints" in kwargs:
61
+ del kwargs["endpoints"]
62
+
63
+ if "credentials" in kwargs:
64
+ del kwargs["credentials"]
65
+
59
66
  rasa.core.run.serve_application(
60
67
  model,
61
68
  channel=connector,
62
69
  credentials=credentials,
63
- endpoints=_endpoints,
70
+ endpoints=Configuration.get_instance().endpoints,
71
+ sub_agents=_sub_agents,
64
72
  **kwargs,
65
73
  )
66
74
 
@@ -69,25 +77,28 @@ def train(
69
77
  domain: Text,
70
78
  config: Text,
71
79
  training_files: "Union[Text, List[Text]]",
80
+ endpoints: Text = rasa.shared.constants.DEFAULT_ENDPOINTS_PATH,
72
81
  output: Text = rasa.shared.constants.DEFAULT_MODELS_PATH,
73
82
  dry_run: bool = False,
74
83
  force_training: bool = False,
75
- fixed_model_name: Optional[Text] = None,
84
+ fixed_model_name: Optional[str] = None,
76
85
  persist_nlu_training_data: bool = False,
77
86
  core_additional_arguments: Optional[Dict] = None,
78
87
  nlu_additional_arguments: Optional[Dict] = None,
79
- model_to_finetune: Optional[Text] = None,
88
+ model_to_finetune: Optional[str] = None,
80
89
  finetuning_epoch_fraction: float = 1.0,
81
90
  remote_storage: Optional[StorageType] = None,
82
91
  file_importer: Optional["TrainingDataImporter"] = None,
83
92
  keep_local_model_copy: bool = False,
84
93
  remote_root_only: bool = False,
94
+ sub_agents: Optional[str] = None,
85
95
  ) -> "TrainingResult":
86
96
  """Runs Rasa Core and NLU training in `async` loop.
87
97
 
88
98
  Args:
89
99
  domain: Path to the domain file.
90
100
  config: Path to the config for Core and NLU.
101
+ endpoints: Path to the endpoints file.
91
102
  training_files: Paths to the training data for Core and NLU.
92
103
  output: Output path.
93
104
  dry_run: If `True` then no training will be done, and the information about
@@ -111,6 +122,7 @@ def train(
111
122
  remote storage is configured.
112
123
  remote_root_only: If `True`, the model will be stored in the root of the
113
124
  remote model storage.
125
+ sub_agents: Path to sub-agents directory.
114
126
 
115
127
  Returns:
116
128
  An instance of `TrainingResult`.
@@ -122,6 +134,7 @@ def train(
122
134
  domain=domain,
123
135
  config=config,
124
136
  training_files=training_files,
137
+ endpoints=endpoints,
125
138
  output=output,
126
139
  dry_run=dry_run,
127
140
  force_training=force_training,
@@ -135,6 +148,7 @@ def train(
135
148
  file_importer=file_importer,
136
149
  keep_local_model_copy=keep_local_model_copy,
137
150
  remote_root_only=remote_root_only,
151
+ sub_agents=sub_agents,
138
152
  )
139
153
  )
140
154