rasa-pro 3.14.0.dev6__py3-none-any.whl → 3.14.0.dev8__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 (491) hide show
  1. rasa/agents/agent_manager.py +1 -1
  2. rasa/agents/constants.py +2 -2
  3. rasa/agents/exceptions.py +31 -1
  4. rasa/agents/protocol/a2a/a2a_agent.py +385 -227
  5. rasa/agents/protocol/mcp/mcp_base_agent.py +37 -19
  6. rasa/agents/protocol/mcp/mcp_open_agent.py +31 -8
  7. rasa/agents/protocol/mcp/mcp_task_agent.py +33 -10
  8. rasa/agents/schemas/agent_output.py +1 -1
  9. rasa/agents/utils.py +95 -1
  10. rasa/agents/validation.py +484 -0
  11. rasa/api.py +9 -6
  12. rasa/builder/README.md +120 -0
  13. rasa/builder/__init__.py +0 -0
  14. rasa/builder/auth.py +176 -0
  15. rasa/builder/config.py +92 -0
  16. rasa/builder/copilot/__init__.py +0 -0
  17. rasa/builder/copilot/constants.py +31 -0
  18. rasa/builder/copilot/copilot.py +450 -0
  19. rasa/builder/copilot/copilot_response_handler.py +522 -0
  20. rasa/builder/copilot/copilot_templated_message_provider.py +58 -0
  21. rasa/builder/copilot/exceptions.py +32 -0
  22. rasa/builder/copilot/models.py +500 -0
  23. rasa/builder/copilot/prompts/__init__.py +0 -0
  24. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +766 -0
  25. rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +61 -0
  26. rasa/builder/copilot/signing.py +305 -0
  27. rasa/builder/copilot/telemetry.py +210 -0
  28. rasa/builder/copilot/templated_messages/__init__.py +0 -0
  29. rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +16 -0
  30. rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +38 -0
  31. rasa/builder/document_retrieval/__init__.py +0 -0
  32. rasa/builder/document_retrieval/constants.py +15 -0
  33. rasa/builder/document_retrieval/inkeep-rag-response-schema.json +64 -0
  34. rasa/builder/document_retrieval/inkeep_document_retrieval.py +238 -0
  35. rasa/builder/document_retrieval/models.py +62 -0
  36. rasa/builder/download.py +140 -0
  37. rasa/builder/exceptions.py +91 -0
  38. rasa/builder/guardrails/__init__.py +1 -0
  39. rasa/builder/guardrails/constants.py +9 -0
  40. rasa/builder/guardrails/exceptions.py +4 -0
  41. rasa/builder/guardrails/lakera.py +206 -0
  42. rasa/builder/guardrails/models.py +231 -0
  43. rasa/builder/guardrails/store.py +238 -0
  44. rasa/builder/guardrails/utils.py +328 -0
  45. rasa/builder/job_manager.py +87 -0
  46. rasa/builder/jobs.py +282 -0
  47. rasa/builder/llm_service.py +246 -0
  48. rasa/builder/logging_utils.py +265 -0
  49. rasa/builder/main.py +243 -0
  50. rasa/builder/models.py +216 -0
  51. rasa/builder/project_generator.py +458 -0
  52. rasa/builder/project_info.py +72 -0
  53. rasa/builder/scrape_rasa_docs.py +97 -0
  54. rasa/builder/service.py +1345 -0
  55. rasa/builder/shared/tracker_context.py +212 -0
  56. rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
  57. rasa/builder/template_cache.py +244 -0
  58. rasa/builder/training_service.py +194 -0
  59. rasa/builder/validation_service.py +97 -0
  60. rasa/cli/arguments/train.py +2 -0
  61. rasa/cli/interactive.py +2 -0
  62. rasa/cli/project_templates/basic/README.md +23 -0
  63. rasa/cli/project_templates/basic/actions/__init__ +0 -0
  64. rasa/cli/project_templates/basic/actions/action_human_handoff.py +40 -0
  65. rasa/cli/project_templates/basic/actions/actions.md +10 -0
  66. rasa/cli/project_templates/basic/config.yml +29 -0
  67. rasa/cli/project_templates/basic/credentials.yml +33 -0
  68. rasa/cli/project_templates/basic/data/data.md +9 -0
  69. rasa/cli/project_templates/basic/data/general/feedback.yml +21 -0
  70. rasa/cli/project_templates/basic/data/general/goodbye.yml +6 -0
  71. rasa/cli/project_templates/basic/data/general/hello.yml +6 -0
  72. rasa/cli/project_templates/basic/data/general/help.yml +6 -0
  73. rasa/cli/project_templates/basic/data/general/human_handoff.yml +16 -0
  74. rasa/cli/project_templates/basic/data/general/show_faqs.yml +6 -0
  75. rasa/cli/project_templates/basic/data/system/patterns/pattern_cannot_handle.yml +7 -0
  76. rasa/cli/project_templates/basic/data/system/patterns/pattern_completed.yml +7 -0
  77. rasa/cli/project_templates/basic/data/system/patterns/pattern_correction.yml +7 -0
  78. rasa/cli/project_templates/basic/data/system/patterns/pattern_search.yml +8 -0
  79. rasa/cli/project_templates/basic/data/system/patterns/pattern_session_start.yml +8 -0
  80. rasa/cli/project_templates/basic/docs/docs.md +5 -0
  81. rasa/cli/project_templates/basic/docs/template.txt +28 -0
  82. rasa/cli/project_templates/basic/domain/domain.md +8 -0
  83. rasa/cli/project_templates/basic/domain/general/feedback.yml +25 -0
  84. rasa/cli/project_templates/basic/domain/general/goodbye.yml +9 -0
  85. rasa/cli/project_templates/basic/domain/general/hello.yml +7 -0
  86. rasa/cli/project_templates/basic/domain/general/help.yml +21 -0
  87. rasa/cli/project_templates/basic/domain/general/human_handoff.yml +32 -0
  88. rasa/cli/project_templates/basic/domain/general/show_faqs.yml +14 -0
  89. rasa/cli/project_templates/basic/domain/system/patterns/pattern_cannot_handle.yml +5 -0
  90. rasa/cli/project_templates/basic/domain/system/patterns/pattern_session_start.yml +19 -0
  91. rasa/cli/project_templates/basic/endpoints.yml +67 -0
  92. rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
  93. rasa/cli/project_templates/default/config.yml +4 -0
  94. rasa/cli/project_templates/default/endpoints.yml +4 -0
  95. rasa/cli/project_templates/finance/README.md +25 -0
  96. rasa/cli/project_templates/finance/actions/__init__.py +46 -0
  97. rasa/cli/project_templates/finance/actions/accounts/__init__.py +0 -0
  98. rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +47 -0
  99. rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +40 -0
  100. rasa/cli/project_templates/finance/actions/action_session_start.py +74 -0
  101. rasa/cli/project_templates/finance/actions/actions.md +15 -0
  102. rasa/cli/project_templates/finance/actions/cards/__init__.py +0 -0
  103. rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +48 -0
  104. rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +36 -0
  105. rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +54 -0
  106. rasa/cli/project_templates/finance/actions/database.py +277 -0
  107. rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
  108. rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +52 -0
  109. rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +51 -0
  110. rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +40 -0
  111. rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +40 -0
  112. rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +46 -0
  113. rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +18 -0
  114. rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +49 -0
  115. rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +19 -0
  116. rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +36 -0
  117. rasa/cli/project_templates/finance/config.yml +23 -0
  118. rasa/cli/project_templates/finance/credentials.yml +32 -0
  119. rasa/cli/project_templates/finance/csvs/accounts.csv +8 -0
  120. rasa/cli/project_templates/finance/csvs/advisors.csv +7 -0
  121. rasa/cli/project_templates/finance/csvs/appointments.csv +211 -0
  122. rasa/cli/project_templates/finance/csvs/branches.csv +10 -0
  123. rasa/cli/project_templates/finance/csvs/cards.csv +11 -0
  124. rasa/cli/project_templates/finance/csvs/payees.csv +11 -0
  125. rasa/cli/project_templates/finance/csvs/transactions.csv +71 -0
  126. rasa/cli/project_templates/finance/csvs/users.csv +4 -0
  127. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +10 -0
  128. rasa/cli/project_templates/finance/data/cards/block_card.yml +66 -0
  129. rasa/cli/project_templates/finance/data/cards/select_card.yml +12 -0
  130. rasa/cli/project_templates/finance/data/data.md +11 -0
  131. rasa/cli/project_templates/finance/data/general/bot_identity.yml +6 -0
  132. rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
  133. rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
  134. rasa/cli/project_templates/finance/data/general/hello.yml +7 -0
  135. rasa/cli/project_templates/finance/data/general/help.yml +9 -0
  136. rasa/cli/project_templates/finance/data/general/human_handoff.yml +16 -0
  137. rasa/cli/project_templates/finance/data/general/welcome.yml +9 -0
  138. rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +5 -0
  139. rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +7 -0
  140. rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +7 -0
  141. rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +8 -0
  142. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +8 -0
  143. rasa/cli/project_templates/finance/data/system/source/accounts.json +51 -0
  144. rasa/cli/project_templates/finance/data/system/source/advisors.json +44 -0
  145. rasa/cli/project_templates/finance/data/system/source/appointments.json +1474 -0
  146. rasa/cli/project_templates/finance/data/system/source/branches.json +47 -0
  147. rasa/cli/project_templates/finance/data/system/source/cards.json +72 -0
  148. rasa/cli/project_templates/finance/data/system/source/payees.json +74 -0
  149. rasa/cli/project_templates/finance/data/system/source/transactions.json +492 -0
  150. rasa/cli/project_templates/finance/data/system/source/users.json +29 -0
  151. rasa/cli/project_templates/finance/data/transfers/add_payee.yml +29 -0
  152. rasa/cli/project_templates/finance/data/transfers/list_payees.yml +5 -0
  153. rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +21 -0
  154. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +67 -0
  155. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +8 -0
  156. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +8 -0
  157. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +8 -0
  158. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +8 -0
  159. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +8 -0
  160. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +7 -0
  161. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +8 -0
  162. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +8 -0
  163. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +8 -0
  164. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +8 -0
  165. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +8 -0
  166. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +8 -0
  167. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +8 -0
  168. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +8 -0
  169. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +8 -0
  170. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +8 -0
  171. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +8 -0
  172. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +8 -0
  173. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +8 -0
  174. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +8 -0
  175. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +50 -0
  176. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +50 -0
  177. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +48 -0
  178. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +50 -0
  179. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +50 -0
  180. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +47 -0
  181. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +50 -0
  182. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +50 -0
  183. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +47 -0
  184. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +50 -0
  185. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +50 -0
  186. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +50 -0
  187. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +47 -0
  188. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +50 -0
  189. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +50 -0
  190. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +47 -0
  191. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +50 -0
  192. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +50 -0
  193. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +47 -0
  194. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +50 -0
  195. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +50 -0
  196. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +47 -0
  197. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +47 -0
  198. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +50 -0
  199. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +50 -0
  200. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +47 -0
  201. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +50 -0
  202. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +50 -0
  203. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +47 -0
  204. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +50 -0
  205. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +50 -0
  206. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +47 -0
  207. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +50 -0
  208. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +50 -0
  209. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +50 -0
  210. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +47 -0
  211. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +50 -0
  212. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +50 -0
  213. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +47 -0
  214. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +50 -0
  215. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +50 -0
  216. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +47 -0
  217. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +50 -0
  218. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +50 -0
  219. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +50 -0
  220. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +47 -0
  221. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +50 -0
  222. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +50 -0
  223. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +47 -0
  224. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +50 -0
  225. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +50 -0
  226. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +47 -0
  227. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +50 -0
  228. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +50 -0
  229. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +47 -0
  230. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +47 -0
  231. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +50 -0
  232. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +50 -0
  233. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +50 -0
  234. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +50 -0
  235. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +47 -0
  236. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +11 -0
  237. rasa/cli/project_templates/finance/domain/cards/block_card.yml +101 -0
  238. rasa/cli/project_templates/finance/domain/cards/select_card.yml +12 -0
  239. rasa/cli/project_templates/finance/domain/domain.md +10 -0
  240. rasa/cli/project_templates/finance/domain/general/agent_details.yml +12 -0
  241. rasa/cli/project_templates/finance/domain/general/bot_identity.yml +5 -0
  242. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +5 -0
  243. rasa/cli/project_templates/finance/domain/general/defaults.yml +24 -0
  244. rasa/cli/project_templates/finance/domain/general/feedback.yml +28 -0
  245. rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
  246. rasa/cli/project_templates/finance/domain/general/help.yml +5 -0
  247. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +30 -0
  248. rasa/cli/project_templates/finance/domain/general/utils.yml +13 -0
  249. rasa/cli/project_templates/finance/domain/general/welcome.yml +8 -0
  250. rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +47 -0
  251. rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +4 -0
  252. rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +16 -0
  253. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +79 -0
  254. rasa/cli/project_templates/finance/endpoints.yml +66 -0
  255. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +19 -0
  256. rasa/cli/project_templates/telco/README.md +25 -0
  257. rasa/cli/project_templates/telco/actions/__init__.py +0 -0
  258. rasa/cli/project_templates/telco/actions/actions.md +12 -0
  259. rasa/cli/project_templates/telco/actions/billing/__init__.py +0 -0
  260. rasa/cli/project_templates/telco/actions/billing/actions_billing.py +204 -0
  261. rasa/cli/project_templates/telco/actions/general/__init__.py +0 -0
  262. rasa/cli/project_templates/telco/actions/general/action_human_handoff.py +49 -0
  263. rasa/cli/project_templates/telco/actions/network/__init__.py +0 -0
  264. rasa/cli/project_templates/telco/actions/network/actions_get_data_from_db.py +48 -0
  265. rasa/cli/project_templates/telco/actions/network/actions_run_diagnostics.py +28 -0
  266. rasa/cli/project_templates/telco/actions/network/actions_session_start.py +18 -0
  267. rasa/cli/project_templates/telco/config.yml +29 -0
  268. rasa/cli/project_templates/telco/credentials.yml +33 -0
  269. rasa/cli/project_templates/telco/csvs/billing.csv +19 -0
  270. rasa/cli/project_templates/telco/csvs/customers.csv +5 -0
  271. rasa/cli/project_templates/telco/data/billing/flow_understand_bill.yml +45 -0
  272. rasa/cli/project_templates/telco/data/data.md +11 -0
  273. rasa/cli/project_templates/telco/data/general/bot_challenge.yml +6 -0
  274. rasa/cli/project_templates/telco/data/general/feedback.yml +20 -0
  275. rasa/cli/project_templates/telco/data/general/goodbye.yml +6 -0
  276. rasa/cli/project_templates/telco/data/general/hello.yml +6 -0
  277. rasa/cli/project_templates/telco/data/general/human_handoff.yml +16 -0
  278. rasa/cli/project_templates/telco/data/general/patterns.yml +30 -0
  279. rasa/cli/project_templates/telco/data/network/flow_reboot_router.yml +8 -0
  280. rasa/cli/project_templates/telco/data/network/flow_reset_router.yml +7 -0
  281. rasa/cli/project_templates/telco/data/network/flow_solve_internet_issue.yml +73 -0
  282. rasa/cli/project_templates/telco/docs/docs.md +5 -0
  283. rasa/cli/project_templates/telco/docs/network/reset_vs_rboot_router.txt +1 -0
  284. rasa/cli/project_templates/telco/docs/network/restart_router.txt +6 -0
  285. rasa/cli/project_templates/telco/docs/network/run_speed_test.txt +6 -0
  286. rasa/cli/project_templates/telco/domain/billing/understand_bill.yml +102 -0
  287. rasa/cli/project_templates/telco/domain/domain.md +14 -0
  288. rasa/cli/project_templates/telco/domain/general/bot_challenge.yml +4 -0
  289. rasa/cli/project_templates/telco/domain/general/feedback.yml +25 -0
  290. rasa/cli/project_templates/telco/domain/general/goodbye.yml +7 -0
  291. rasa/cli/project_templates/telco/domain/general/hello.yml +5 -0
  292. rasa/cli/project_templates/telco/domain/general/human_handoff.yml +26 -0
  293. rasa/cli/project_templates/telco/domain/general/patterns.yml +33 -0
  294. rasa/cli/project_templates/telco/domain/network/reboot_router.yml +21 -0
  295. rasa/cli/project_templates/telco/domain/network/reset_router.yml +12 -0
  296. rasa/cli/project_templates/telco/domain/network/run_speed_test.yml +25 -0
  297. rasa/cli/project_templates/telco/domain/network/solve_internet_issue.yml +75 -0
  298. rasa/cli/project_templates/telco/domain/shared.yml +129 -0
  299. rasa/cli/project_templates/telco/endpoints.yml +67 -0
  300. rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +40 -0
  301. rasa/cli/project_templates/telco/tests/e2e_test_cases/billing/understand_bill.yml +67 -0
  302. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
  303. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/feedback.yml +46 -0
  304. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/goodbye.yml +9 -0
  305. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/hello.yml +8 -0
  306. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/human_handoff.yml +35 -0
  307. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/patterns.yml +23 -0
  308. rasa/cli/project_templates/telco/tests/e2e_test_cases/network/solve_internet_issue.yml +57 -0
  309. rasa/cli/project_templates/tutorial/config.yml +2 -1
  310. rasa/cli/scaffold.py +46 -2
  311. rasa/cli/train.py +2 -0
  312. rasa/cli/utils.py +85 -1
  313. rasa/core/actions/action.py +2 -7
  314. rasa/core/available_agents.py +49 -26
  315. rasa/core/available_endpoints.py +17 -2
  316. rasa/core/channels/channel.py +4 -3
  317. rasa/core/channels/constants.py +3 -0
  318. rasa/core/channels/development_inspector.py +2 -22
  319. rasa/core/channels/inspector/README.md +26 -14
  320. rasa/core/channels/inspector/dist/assets/{arc-63212852.js → arc-edef10dd.js} +1 -1
  321. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-eecf6b13.js → blockDiagram-38ab4fdb-49f6762b.js} +1 -1
  322. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-8f798a9a.js → c4Diagram-3d4e48cf-313c08e6.js} +1 -1
  323. rasa/core/channels/inspector/dist/assets/channel-63aa27d1.js +1 -0
  324. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-df71a04c.js → classDiagram-70f12bd4-35e41ce9.js} +1 -1
  325. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-9b275968.js → classDiagram-v2-f2320105-f346068d.js} +1 -1
  326. rasa/core/channels/inspector/dist/assets/clone-5566bae8.js +1 -0
  327. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-1c669cad.js → createText-2e5e7dd3-7a44bce8.js} +1 -1
  328. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-b1553799.js → edges-e0da2a9e-d7cf78c7.js} +1 -1
  329. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-112388d6.js → erDiagram-9861fffd-9813e81c.js} +1 -1
  330. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-fdebec47.js → flowDb-956e92f1-d8ba0870.js} +1 -1
  331. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-6280ede1.js → flowDiagram-66a62f08-51f0db4d.js} +1 -1
  332. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-32936074.js +1 -0
  333. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-e1dc03e5.js → flowchart-elk-definition-4a651766-ff9ea384.js} +1 -1
  334. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-83f68c51.js → ganttDiagram-c361ad54-a8e13b6b.js} +1 -1
  335. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-22f8666f.js → gitGraphDiagram-72cf32ee-3b171c6d.js} +1 -1
  336. rasa/core/channels/inspector/dist/assets/{graph-ca9e6217.js → graph-790ef78b.js} +1 -1
  337. rasa/core/channels/inspector/dist/assets/{index-3862675e-c5ceb692.js → index-3862675e-ecdce073.js} +1 -1
  338. rasa/core/channels/inspector/dist/assets/index-d705da80.js +1352 -0
  339. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-faa9999b.js → infoDiagram-f8f76790-f5a422fe.js} +1 -1
  340. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-c4dda8d9.js → journeyDiagram-49397b02-3185b7ac.js} +1 -1
  341. rasa/core/channels/inspector/dist/assets/{layout-d4307784.js → layout-837fd3aa.js} +1 -1
  342. rasa/core/channels/inspector/dist/assets/{line-0567aaa7.js → line-7e05afcb.js} +1 -1
  343. rasa/core/channels/inspector/dist/assets/{linear-c11b95cf.js → linear-162eb295.js} +1 -1
  344. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-0c7d3ca9.js → mindmap-definition-fc14e90a-f4978aee.js} +1 -1
  345. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-34b433fa.js → pieDiagram-8a3498a8-b25d0a52.js} +1 -1
  346. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-4cab816e.js → quadrantDiagram-120e2f19-63db1afa.js} +1 -1
  347. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-8c22fa9e.js → requirementDiagram-deff3bca-1b486cc9.js} +1 -1
  348. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-70ce9e8e.js → sankeyDiagram-04a897e0-7e795291.js} +1 -1
  349. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-fbcd7fc9.js → sequenceDiagram-704730f1-b8aba159.js} +1 -1
  350. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-45f05ea6.js → stateDiagram-587899a1-41529fd5.js} +1 -1
  351. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-beab1ea6.js → stateDiagram-v2-d93cdb3a-b241043c.js} +1 -1
  352. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-2f29dbd5.js → styles-6aaf32cf-b5b53234.js} +1 -1
  353. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-951eac83.js → styles-9a916d00-13d138e5.js} +1 -1
  354. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-897fbfdd.js → styles-c10674c1-94cbde3f.js} +1 -1
  355. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-d667fac1.js → svgDrawCommon-08f97a94-453ae764.js} +1 -1
  356. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-e3205144.js → timeline-definition-85554ec2-8dcb88a4.js} +1 -1
  357. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-4abeb0e2.js → xychartDiagram-e933f94c-376af5f0.js} +1 -1
  358. rasa/core/channels/inspector/dist/index.html +2 -2
  359. rasa/core/channels/inspector/index.html +1 -1
  360. rasa/core/channels/inspector/src/App.tsx +42 -44
  361. rasa/core/channels/inspector/src/components/Chat.tsx +2 -3
  362. rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
  363. rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +8 -8
  364. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +20 -3
  365. rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +63 -35
  366. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +14 -0
  367. rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
  368. rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
  369. rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
  370. rasa/core/channels/inspector/src/types.ts +49 -7
  371. rasa/core/channels/socketio.py +212 -51
  372. rasa/core/channels/studio_chat.py +59 -57
  373. rasa/core/channels/voice_stream/asr/asr_event.py +1 -1
  374. rasa/core/channels/voice_stream/asr/azure.py +6 -3
  375. rasa/core/channels/voice_stream/asr/deepgram.py +1 -1
  376. rasa/core/channels/voice_stream/audiocodes.py +3 -0
  377. rasa/core/channels/voice_stream/browser_audio.py +53 -3
  378. rasa/core/channels/voice_stream/genesys.py +2 -1
  379. rasa/core/channels/voice_stream/jambonz.py +9 -1
  380. rasa/core/channels/voice_stream/twilio_media_streams.py +16 -0
  381. rasa/core/channels/voice_stream/voice_channel.py +66 -3
  382. rasa/core/constants.py +6 -0
  383. rasa/core/iam_credentials_providers/__init__.py +0 -0
  384. rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +66 -0
  385. rasa/core/iam_credentials_providers/credentials_provider_protocol.py +89 -0
  386. rasa/core/policies/enterprise_search_policy.py +4 -7
  387. rasa/core/policies/flows/flow_executor.py +66 -36
  388. rasa/core/policies/ted_policy.py +7 -5
  389. rasa/core/processor.py +32 -0
  390. rasa/core/redis_connection_factory.py +411 -0
  391. rasa/core/run.py +13 -3
  392. rasa/core/tracker_stores/redis_tracker_store.py +32 -14
  393. rasa/core/tracker_stores/sql_tracker_store.py +57 -1
  394. rasa/dialogue_understanding/commands/cancel_flow_command.py +2 -81
  395. rasa/dialogue_understanding/commands/start_flow_command.py +18 -113
  396. rasa/dialogue_understanding/commands/utils.py +118 -0
  397. rasa/dialogue_understanding/generator/flow_retrieval.py +10 -9
  398. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +10 -5
  399. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +10 -5
  400. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +20 -12
  401. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +19 -12
  402. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +6 -35
  403. rasa/dialogue_understanding/patterns/cancel.py +27 -6
  404. rasa/dialogue_understanding/patterns/clarify.py +3 -14
  405. rasa/dialogue_understanding/patterns/continue_interrupted.py +185 -114
  406. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +18 -24
  407. rasa/dialogue_understanding/processor/command_processor.py +35 -0
  408. rasa/dialogue_understanding/stack/utils.py +43 -4
  409. rasa/dialogue_understanding/utils.py +24 -4
  410. rasa/engine/graph.py +5 -1
  411. rasa/engine/recipes/default_components.py +78 -10
  412. rasa/engine/recipes/default_recipe.py +41 -1
  413. rasa/engine/storage/local_model_storage.py +83 -3
  414. rasa/graph_components/validators/default_recipe_validator.py +153 -135
  415. rasa/model_manager/model_api.py +4 -5
  416. rasa/model_manager/runner_service.py +1 -1
  417. rasa/model_manager/socket_bridge.py +20 -15
  418. rasa/model_manager/trainer_service.py +12 -9
  419. rasa/model_manager/utils.py +1 -29
  420. rasa/model_manager/warm_rasa_process.py +1 -1
  421. rasa/model_training.py +22 -6
  422. rasa/nlu/classifiers/diet_classifier.py +22 -6
  423. rasa/nlu/classifiers/logistic_regression_classifier.py +18 -0
  424. rasa/nlu/extractors/extractor.py +1 -2
  425. rasa/shared/agents/auth/__init__.py +0 -0
  426. rasa/shared/agents/auth/agent_auth_factory.py +74 -0
  427. rasa/shared/agents/auth/agent_auth_manager.py +86 -0
  428. rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
  429. rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
  430. rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
  431. rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
  432. rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +159 -0
  433. rasa/shared/agents/auth/constants.py +11 -0
  434. rasa/shared/agents/auth/types.py +11 -0
  435. rasa/shared/constants.py +3 -0
  436. rasa/shared/core/constants.py +6 -6
  437. rasa/shared/core/domain.py +58 -11
  438. rasa/shared/core/events.py +2 -0
  439. rasa/shared/core/flows/constants.py +5 -0
  440. rasa/shared/core/flows/flow_step.py +7 -1
  441. rasa/shared/core/flows/flows_list.py +6 -0
  442. rasa/shared/core/flows/steps/call.py +15 -12
  443. rasa/shared/core/flows/validation.py +238 -44
  444. rasa/shared/core/flows/yaml_flows_io.py +15 -6
  445. rasa/shared/core/slots.py +4 -0
  446. rasa/shared/exceptions.py +12 -0
  447. rasa/shared/importers/importer.py +6 -0
  448. rasa/shared/importers/utils.py +77 -1
  449. rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
  450. rasa/shared/providers/_utils.py +60 -44
  451. rasa/shared/providers/embedding/default_litellm_embedding_client.py +2 -0
  452. rasa/shared/providers/llm/_base_litellm_client.py +2 -2
  453. rasa/shared/providers/llm/default_litellm_llm_client.py +2 -0
  454. rasa/shared/providers/llm/llm_response.py +4 -4
  455. rasa/shared/utils/common.py +24 -0
  456. rasa/shared/utils/health_check/health_check.py +7 -3
  457. rasa/shared/utils/llm.py +2 -1
  458. rasa/shared/utils/mcp/server_connection.py +108 -27
  459. rasa/shared/utils/mcp/utils.py +20 -0
  460. rasa/studio/upload.py +16 -47
  461. rasa/telemetry.py +97 -23
  462. rasa/tracing/config.py +38 -12
  463. rasa/tracing/instrumentation/attribute_extractors.py +5 -1
  464. rasa/tracing/instrumentation/instrumentation.py +85 -8
  465. rasa/utils/common.py +1 -1
  466. rasa/utils/io.py +27 -9
  467. rasa/utils/json_utils.py +6 -1
  468. rasa/utils/log_utils.py +5 -1
  469. rasa/utils/openapi.py +144 -0
  470. rasa/utils/tensorflow/__init__.py +29 -0
  471. rasa/utils/tensorflow/callback.py +1 -1
  472. rasa/utils/tensorflow/crf.py +1 -1
  473. rasa/utils/tensorflow/data_generator.py +21 -8
  474. rasa/utils/tensorflow/layers.py +11 -4
  475. rasa/utils/tensorflow/metrics.py +7 -3
  476. rasa/utils/tensorflow/models.py +41 -6
  477. rasa/utils/tensorflow/rasa_layers.py +6 -4
  478. rasa/utils/tensorflow/transformer.py +2 -3
  479. rasa/utils/train_utils.py +68 -38
  480. rasa/validator.py +18 -16
  481. rasa/version.py +1 -1
  482. rasa_pro-3.14.0.dev8.dist-info/METADATA +199 -0
  483. {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/RECORD +486 -173
  484. rasa/core/channels/inspector/dist/assets/channel-0cd70adf.js +0 -1
  485. rasa/core/channels/inspector/dist/assets/clone-a0f9c4ed.js +0 -1
  486. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-de9cc4aa.js +0 -1
  487. rasa/core/channels/inspector/dist/assets/index-3e293924.js +0 -1353
  488. rasa_pro-3.14.0.dev6.dist-info/METADATA +0 -190
  489. {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/NOTICE +0 -0
  490. {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/WHEEL +0 -0
  491. {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,484 @@
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
+ from pydantic import ValidationError as PydanticValidationError
9
+ from ruamel import yaml
10
+
11
+ from rasa.agents.exceptions import (
12
+ AgentNameFlowConflictException,
13
+ DuplicatedAgentNameException,
14
+ )
15
+ from rasa.core.available_agents import (
16
+ DEFAULT_AGENTS_CONFIG_FOLDER,
17
+ AgentConfig,
18
+ AgentConfiguration,
19
+ AgentConnections,
20
+ AgentInfo,
21
+ ProtocolConfig,
22
+ )
23
+ from rasa.core.available_endpoints import AvailableEndpoints
24
+ from rasa.exceptions import ValidationError
25
+
26
+ # Centralized allowed keys configuration to eliminate duplication
27
+ ALLOWED_KEYS = {
28
+ "agent": {"name", "protocol", "description"},
29
+ "configuration": {
30
+ "llm",
31
+ "prompt_template",
32
+ "module",
33
+ "timeout",
34
+ "max_retries",
35
+ "agent_card",
36
+ },
37
+ "connections": {"mcp_servers"},
38
+ }
39
+
40
+
41
+ def validate_agent_names_unique(agents: List[AgentConfig]) -> None:
42
+ """Validate that agent names are unique across all loaded agents.
43
+
44
+ Args:
45
+ agents: List of agent configurations.
46
+
47
+ Raises:
48
+ DuplicatedAgentNameException: If agent names are not unique.
49
+ """
50
+ agent_names = [agent_config.agent.name for agent_config in agents]
51
+ name_counts = Counter(agent_names)
52
+
53
+ duplicated_names = [name for name, count in name_counts.items() if count > 1]
54
+
55
+ if duplicated_names:
56
+ raise DuplicatedAgentNameException(duplicated_names)
57
+
58
+
59
+ def validate_agent_names_not_conflicting_with_flows(
60
+ agents: Dict[str, AgentConfig], flow_names: Set[str]
61
+ ) -> None:
62
+ """Validate that agent names do not conflict with flow names.
63
+
64
+ Args:
65
+ agents: Dictionary of agent configurations.
66
+ flow_names: Set of flow names to check against.
67
+
68
+ Raises:
69
+ AgentNameFlowConflictException: If agent names conflict with flow names.
70
+ """
71
+ conflicting_names = [
72
+ agent_name for agent_name in agents.keys() if agent_name in flow_names
73
+ ]
74
+
75
+ if conflicting_names:
76
+ raise AgentNameFlowConflictException(conflicting_names)
77
+
78
+
79
+ def _validate_mcp_config(agent_config: AgentConfig) -> None:
80
+ """Validate MCP-specific configuration requirements."""
81
+ agent_name = agent_config.agent.name
82
+
83
+ # Check connections.mcp_servers exists
84
+ if agent_config.connections is None or agent_config.connections.mcp_servers is None:
85
+ raise ValidationError(
86
+ code="agent.validation.mcp.missing_connections",
87
+ event_info=f"For protocol 'MCP', agent '{agent_name}' must have "
88
+ "'connections.mcp_servers' configured.",
89
+ )
90
+
91
+ # Check mcp_servers list is not empty
92
+ if not agent_config.connections.mcp_servers:
93
+ raise ValidationError(
94
+ code="agent.validation.mcp.empty_servers_list",
95
+ event_info=f"For protocol 'MCP', agent '{agent_name}' must have "
96
+ "at least one MCP server configured in 'connections.mcp_servers'.",
97
+ )
98
+
99
+ # Validate each MCP server configuration
100
+ for i, server in enumerate(agent_config.connections.mcp_servers):
101
+ if not server.name:
102
+ raise ValidationError(
103
+ code="agent.validation.mcp.server_missing_name",
104
+ event_info=f"For protocol 'MCP', agent '{agent_name}' MCP server "
105
+ f"at index {i} must have a 'name' field.",
106
+ )
107
+
108
+
109
+ def _validate_a2a_config(agent_config: AgentConfig) -> None:
110
+ """Validate A2A-specific configuration requirements."""
111
+ agent_name = agent_config.agent.name
112
+
113
+ # Check configuration.agent_card exists
114
+ if (
115
+ agent_config.configuration is None
116
+ or agent_config.configuration.agent_card is None
117
+ ):
118
+ raise ValidationError(
119
+ code="agent.validation.a2a.missing_agent_card",
120
+ event_info=f"For protocol 'A2A', agent '{agent_name}' must have "
121
+ "'configuration.agent_card' specified.",
122
+ )
123
+
124
+ # Validate agent_card path or URL
125
+ agent_card = agent_config.configuration.agent_card
126
+ if not agent_card:
127
+ raise ValidationError(
128
+ code="agent.validation.a2a.empty_agent_card",
129
+ event_info=f"Agent '{agent_name}' has empty 'agent_card' value",
130
+ )
131
+
132
+ # Check if it's a URL
133
+ parsed_url = urllib.parse.urlparse(agent_card)
134
+ if parsed_url.scheme and parsed_url.netloc:
135
+ # It's a URL, validate format
136
+ if parsed_url.scheme not in ["http", "https"]:
137
+ raise ValidationError(
138
+ code="agent.validation.a2a.invalid_agent_card_url",
139
+ event_info=f"Agent '{agent_name}' has invalid URL scheme "
140
+ f"'{parsed_url.scheme}' for 'agent_card'",
141
+ )
142
+ else:
143
+ # It's a file path, check if it exists
144
+ if not os.path.exists(agent_card):
145
+ raise ValidationError(
146
+ code="agent.validation.a2a.agent_card_file_not_found",
147
+ event_info=f"Agent '{agent_name}' has 'agent_card' file that doesn't "
148
+ f"exist: {agent_card}",
149
+ )
150
+
151
+
152
+ def _validate_optional_keys(agent_config: AgentConfig) -> None:
153
+ """Validate optional keys in agent configuration."""
154
+ agent_name = agent_config.agent.name
155
+
156
+ # Validate prompt_template if present
157
+ if agent_config.configuration and agent_config.configuration.prompt_template:
158
+ prompt_path = agent_config.configuration.prompt_template
159
+ if not os.path.exists(prompt_path):
160
+ raise ValidationError(
161
+ code="agent.validation.optional.prompt_template_not_found",
162
+ event_info=f"Agent '{agent_name}' has prompt template that "
163
+ f"does not exist: {prompt_path}",
164
+ )
165
+
166
+ # Validate module if present
167
+ if agent_config.configuration and agent_config.configuration.module:
168
+ import importlib
169
+
170
+ module_name = agent_config.configuration.module
171
+ try:
172
+ module_path, class_name = module_name.rsplit(".", 1)
173
+ getattr(importlib.import_module(module_path), class_name)
174
+ except (ImportError, AttributeError) as e:
175
+ raise ValidationError(
176
+ code="agent.validation.optional.module_not_found",
177
+ event_info=f"Agent '{agent_name}' has module '{module_name}' "
178
+ f"that could not be imported: {e}",
179
+ )
180
+
181
+
182
+ def _validate_llm_references(
183
+ llm_config: Dict[str, Any],
184
+ endpoints: "AvailableEndpoints",
185
+ agent_name: str,
186
+ ) -> None:
187
+ """Validate LLM configuration references against endpoints."""
188
+ if "model_group" in llm_config:
189
+ from rasa.engine.validation import (
190
+ _validate_component_model_client_config_has_references_to_endpoints,
191
+ )
192
+
193
+ component_config = {"llm": llm_config}
194
+ _validate_component_model_client_config_has_references_to_endpoints(
195
+ component_config, "llm", component_name=agent_name
196
+ )
197
+
198
+
199
+ def _validate_mcp_server_references(
200
+ mcp_servers: list, endpoints: "AvailableEndpoints", agent_name: str
201
+ ) -> None:
202
+ """Validate MCP server references against endpoints."""
203
+ if not endpoints.mcp_servers:
204
+ raise ValidationError(
205
+ code="agent.validation.endpoints.no_mcp_servers",
206
+ event_info=(
207
+ f"Agent '{agent_name}' references MCP servers but no MCP "
208
+ "servers are defined in endpoints.yml."
209
+ ),
210
+ )
211
+
212
+ available_mcp_server_names = [server.name for server in endpoints.mcp_servers]
213
+
214
+ for i, mcp_server in enumerate(mcp_servers):
215
+ server_name = mcp_server.name
216
+ if server_name not in available_mcp_server_names:
217
+ raise ValidationError(
218
+ code="agent.validation.endpoints.invalid_mcp_server",
219
+ event_info=(
220
+ f"MCP server '{server_name}' at index {i} for Agent "
221
+ f"'{agent_name}' does not exist in endpoints.yml. Available MCP "
222
+ f"servers: {', '.join(available_mcp_server_names)}"
223
+ ),
224
+ )
225
+
226
+
227
+ def _handle_pydantic_validation_error(
228
+ error: PydanticValidationError, agent_name: str
229
+ ) -> NoReturn:
230
+ """Handle specific Pydantic validation errors that are actually possible.
231
+
232
+ Args:
233
+ error: The Pydantic validation error to handle
234
+ agent_name: Name of the agent for error messages
235
+ """
236
+ missing_fields = []
237
+ invalid_protocol = False
238
+ type_error = None
239
+
240
+ for pydantic_error in error.errors():
241
+ error_type = pydantic_error["type"]
242
+ field_path = ".".join(str(loc) for loc in pydantic_error["loc"])
243
+
244
+ if error_type == "missing":
245
+ for field in ["name", "protocol", "description"]:
246
+ if field in field_path:
247
+ missing_fields.append(field)
248
+ elif error_type == "enum" and "protocol" in field_path:
249
+ invalid_protocol = True
250
+ elif error_type in ["string_type", "int_parsing"]:
251
+ type_error = (field_path, pydantic_error["msg"])
252
+
253
+ # Handle missing required fields
254
+ if missing_fields:
255
+ raise ValidationError(
256
+ code="agent.validation.mandatory.fields_missing",
257
+ event_info=(
258
+ f"Agent '{agent_name}' is missing required fields "
259
+ f"in agent section: {', '.join(missing_fields)}"
260
+ ),
261
+ )
262
+
263
+ # Handle invalid protocol
264
+ elif invalid_protocol:
265
+ raise ValidationError(
266
+ code="agent.validation.pydantic.invalid_protocol",
267
+ event_info=(
268
+ f"Agent '{agent_name}' has invalid protocol value. "
269
+ "Supported protocols: MCP, A2A"
270
+ ),
271
+ )
272
+
273
+ # Handle type errors
274
+ elif type_error:
275
+ field, msg = type_error
276
+ raise ValidationError(
277
+ code="agent.validation.pydantic.type_error",
278
+ event_info=(
279
+ f"Agent '{agent_name}' has invalid type for field " f"'{field}': {msg}"
280
+ ),
281
+ )
282
+
283
+ # Handle other Pydantic validation errors
284
+ else:
285
+ raise ValidationError(
286
+ code="agent.validation.pydantic.failed",
287
+ event_info=f"Agent '{agent_name}' validation failed: {error}",
288
+ )
289
+
290
+
291
+ def _validate_endpoint_references(agent_config: AgentConfig) -> None:
292
+ """Validate that LLM and MCP server references in agent config are valid."""
293
+ agent_name = agent_config.agent.name
294
+
295
+ # Get available endpoints
296
+ endpoints = AvailableEndpoints.get_instance()
297
+
298
+ # Validate LLM configuration references
299
+ if agent_config.configuration and agent_config.configuration.llm:
300
+ _validate_llm_references(agent_config.configuration.llm, endpoints, agent_name)
301
+
302
+ # Validate MCP server references
303
+ if agent_config.connections and agent_config.connections.mcp_servers:
304
+ _validate_mcp_server_references(
305
+ agent_config.connections.mcp_servers, endpoints, agent_name
306
+ )
307
+
308
+
309
+ def _validate_section_keys(
310
+ data: Dict[str, Any], section: str, allowed_keys: set
311
+ ) -> None:
312
+ """Generic function to validate keys in a specific section."""
313
+ if section not in data:
314
+ return
315
+
316
+ section_data = data[section]
317
+ if not isinstance(section_data, dict):
318
+ return
319
+
320
+ additional_keys = set(section_data.keys()) - allowed_keys
321
+ if additional_keys:
322
+ agent_name = data.get("agent", {}).get("name", "unknown")
323
+ raise ValidationError(
324
+ code=f"agent.validation.structure.additional_{section}_keys",
325
+ event_info=(
326
+ f"Agent '{agent_name}' contains additional keys in "
327
+ f"'{section}' section: {', '.join(sorted(additional_keys))}"
328
+ ),
329
+ )
330
+
331
+
332
+ def _validate_mandatory_fields(data: Dict[str, Any], agent_name: str) -> None:
333
+ """Validate that all mandatory fields are present in the agent section."""
334
+ if "agent" not in data:
335
+ raise ValidationError(
336
+ code="agent.validation.mandatory.agent_section_missing",
337
+ event_info=f"Agent '{agent_name}' is missing 'agent' section",
338
+ )
339
+
340
+ agent_data = data["agent"]
341
+ if not isinstance(agent_data, dict):
342
+ raise ValidationError(
343
+ code="agent.validation.mandatory.agent_section_invalid",
344
+ event_info=(
345
+ f"Agent '{agent_name}' has invalid 'agent' section - "
346
+ "must be a dictionary"
347
+ ),
348
+ )
349
+
350
+ # Check for required fields
351
+ missing_fields = []
352
+ for field in ["name", "protocol", "description"]:
353
+ if field not in agent_data or not agent_data[field]:
354
+ missing_fields.append(field)
355
+
356
+ if missing_fields:
357
+ raise ValidationError(
358
+ code="agent.validation.mandatory.fields_missing",
359
+ event_info=(
360
+ f"Agent '{agent_name}' is missing required fields in agent section: "
361
+ f"{', '.join(missing_fields)}"
362
+ ),
363
+ )
364
+
365
+
366
+ def _validate_no_additional_keys_raw_data(data: Dict[str, Any]) -> None:
367
+ """Validate that no additional, unexpected keys are present in the raw data."""
368
+ # Use the generic validation function for each section
369
+ _validate_section_keys(data, "agent", ALLOWED_KEYS["agent"])
370
+ _validate_section_keys(data, "configuration", ALLOWED_KEYS["configuration"])
371
+ _validate_section_keys(data, "connections", ALLOWED_KEYS["connections"])
372
+
373
+
374
+ def _validate_folder_structure(agent_folder: str) -> None:
375
+ """Validate agent folder structure."""
376
+ if not os.path.exists(agent_folder):
377
+ raise ValidationError(
378
+ code="agent.validation.folder.not_found",
379
+ event_info=f"Agent folder does not exist: {agent_folder}",
380
+ )
381
+
382
+ if not os.path.isdir(agent_folder):
383
+ raise ValidationError(
384
+ code="agent.validation.folder.not_directory",
385
+ event_info=f"Agent folder is not a directory: {agent_folder}",
386
+ )
387
+
388
+
389
+ def _validate_config_file_exists(config_path: str, agent_name: str) -> None:
390
+ """Validate config.yml file exists."""
391
+ if not os.path.isfile(config_path):
392
+ raise ValidationError(
393
+ code="agent.validation.folder.missing_config",
394
+ event_info=f"Agent '{agent_name}' is missing 'config.yml' file",
395
+ )
396
+
397
+
398
+ def validate_agent_config(agent_config: AgentConfig) -> None:
399
+ """Validate an agent configuration using all applicable validators."""
400
+ protocol = agent_config.agent.protocol
401
+
402
+ # Run protocol-specific validation
403
+ if protocol == ProtocolConfig.MCP:
404
+ _validate_mcp_config(agent_config)
405
+ elif protocol == ProtocolConfig.A2A:
406
+ _validate_a2a_config(agent_config)
407
+
408
+ # Run optional keys validation
409
+ _validate_optional_keys(agent_config)
410
+
411
+ # Run endpoint references validation
412
+ _validate_endpoint_references(agent_config)
413
+
414
+
415
+ def validate_agent_folder(agent_folder: str = DEFAULT_AGENTS_CONFIG_FOLDER) -> None:
416
+ """Validate all agent configurations in a folder."""
417
+ # Validate folder structure
418
+ _validate_folder_structure(agent_folder)
419
+
420
+ # Scan for agent folders
421
+ for agent_folder_name in os.listdir(agent_folder):
422
+ agent_path = os.path.join(agent_folder, agent_folder_name)
423
+
424
+ if not os.path.isdir(agent_path):
425
+ continue
426
+
427
+ config_path = os.path.join(agent_path, "config.yml")
428
+
429
+ # Validate config file exists
430
+ _validate_config_file_exists(config_path, agent_folder_name)
431
+
432
+ # Read and validate the config content
433
+ try:
434
+ # First read the raw YAML data to validate structure
435
+ with open(config_path, "r") as f:
436
+ data = yaml.safe_load(f)
437
+
438
+ # Validate no additional keys
439
+ _validate_no_additional_keys_raw_data(data)
440
+
441
+ # Validate mandatory fields before creating Pydantic models
442
+ _validate_mandatory_fields(data, agent_folder_name)
443
+
444
+ # Create the agent config using AvailableAgents
445
+ from rasa.core.available_agents import AvailableAgents
446
+
447
+ agent_config = AvailableAgents._read_agent_config(config_path)
448
+
449
+ # Validate the agent config (protocol-specific and endpoint references)
450
+ validate_agent_config(agent_config)
451
+ except PydanticValidationError as e:
452
+ _handle_pydantic_validation_error(e, agent_folder_name)
453
+ except Exception as e:
454
+ # Handle non-Pydantic exceptions
455
+ raise ValidationError(
456
+ code="agent.validation.folder.config_validation_failed",
457
+ event_info=f"Agent '{agent_folder_name}' validation failed: {e}",
458
+ )
459
+
460
+
461
+ def validate_agent_config_data(data: Dict[str, Any]) -> "AgentConfig":
462
+ """Validate agent configuration data."""
463
+ try:
464
+ # Validate no additional keys before creating Pydantic models
465
+ _validate_no_additional_keys_raw_data(data)
466
+
467
+ # Create the agent config (this will trigger Pydantic validation)
468
+ agent_config = AgentConfig(
469
+ agent=AgentInfo(**data.get("agent", {})),
470
+ configuration=AgentConfiguration(**data.get("configuration", {}))
471
+ if data.get("configuration")
472
+ else None,
473
+ connections=AgentConnections(**data.get("connections", {}))
474
+ if data.get("connections")
475
+ else None,
476
+ )
477
+
478
+ return agent_config
479
+
480
+ except PydanticValidationError as e:
481
+ _handle_pydantic_validation_error(e, "Agent configuration")
482
+ except Exception:
483
+ # Re-raise other exceptions
484
+ raise
rasa/api.py CHANGED
@@ -71,22 +71,23 @@ def run(
71
71
 
72
72
 
73
73
  def train(
74
- domain: Text,
75
- config: Text,
76
- training_files: "Union[Text, List[Text]]",
77
- output: Text = rasa.shared.constants.DEFAULT_MODELS_PATH,
74
+ domain: str,
75
+ config: str,
76
+ training_files: "Union[str, List[str]]",
77
+ output: str = rasa.shared.constants.DEFAULT_MODELS_PATH,
78
78
  dry_run: bool = False,
79
79
  force_training: bool = False,
80
- fixed_model_name: Optional[Text] = None,
80
+ fixed_model_name: Optional[str] = None,
81
81
  persist_nlu_training_data: bool = False,
82
82
  core_additional_arguments: Optional[Dict] = None,
83
83
  nlu_additional_arguments: Optional[Dict] = None,
84
- model_to_finetune: Optional[Text] = None,
84
+ model_to_finetune: Optional[str] = None,
85
85
  finetuning_epoch_fraction: float = 1.0,
86
86
  remote_storage: Optional[StorageType] = None,
87
87
  file_importer: Optional["TrainingDataImporter"] = None,
88
88
  keep_local_model_copy: bool = False,
89
89
  remote_root_only: bool = False,
90
+ sub_agents: Optional[str] = None,
90
91
  ) -> "TrainingResult":
91
92
  """Runs Rasa Core and NLU training in `async` loop.
92
93
 
@@ -116,6 +117,7 @@ def train(
116
117
  remote storage is configured.
117
118
  remote_root_only: If `True`, the model will be stored in the root of the
118
119
  remote model storage.
120
+ sub_agents: Path to sub-agents directory.
119
121
 
120
122
  Returns:
121
123
  An instance of `TrainingResult`.
@@ -140,6 +142,7 @@ def train(
140
142
  file_importer=file_importer,
141
143
  keep_local_model_copy=keep_local_model_copy,
142
144
  remote_root_only=remote_root_only,
145
+ sub_agents=sub_agents,
143
146
  )
144
147
  )
145
148
 
rasa/builder/README.md ADDED
@@ -0,0 +1,120 @@
1
+ # Rasa Prompt-to-Bot Service
2
+
3
+ A production-ready service that generates Rasa chatbots from natural language descriptions using LLMs.
4
+
5
+ ## Architecture
6
+
7
+ The service follows functional programming principles with minimal use of classes:
8
+
9
+ ### Core Modules
10
+
11
+ - **`config.py`** - Configuration management using module-level constants
12
+ - **`exceptions.py`** - Custom exception hierarchy for error handling
13
+ - **`models.py`** - Pydantic models for request/response validation
14
+ - **`llm_service.py`** - LLM interactions (minimal class for state management)
15
+ - **`validation_service.py`** - Project validation functions
16
+ - **`training_service.py`** - Model training functions
17
+ - **`project_generator.py`** - Project generation (class for bot files state)
18
+ - **`service.py`** - Main orchestrating service (class for app state)
19
+ - **`logging_utils.py`** - Thread-safe logging utilities
20
+ - **`llm_context.py`** - Conversation context formatting
21
+ - **`main.py`** - Application entry point
22
+
23
+ ### Utility Scripts
24
+
25
+ - **`scrape_rasa_docs.py`** - Documentation scraping
26
+ - **`create_openai_vector_store.py`** - Documentation indexing
27
+
28
+ ## Key Design Principles
29
+
30
+ 1. **Functional First**: Use functions for stateless operations
31
+ 2. **Minimal Classes**: Classes only when state management is needed
32
+ 3. **Configuration**: Environment variables with sensible defaults
33
+ 4. **Error Handling**: Structured exception hierarchy
34
+ 5. **Type Safety**: Full type annotations and Pydantic validation
35
+ 6. **Thread Safety**: Safe concurrent operations
36
+ 7. **Resource Management**: Proper cleanup and lifecycle handling
37
+
38
+ ## Usage
39
+
40
+ ### Running the Service
41
+
42
+ ```bash
43
+ python rasa/builder/main.py
44
+ ```
45
+
46
+ ### Environment Configuration
47
+
48
+ ```bash
49
+ # OpenAI Settings
50
+ export OPENAI_MODEL="gpt-4.1-2025-04-14"
51
+ export OPENAI_TEMPERATURE="0.7"
52
+ export OPENAI_VECTOR_STORE_ID="vs_xxxxx"
53
+ export OPENAI_TIMEOUT="30"
54
+
55
+ # Server Settings
56
+ export SERVER_HOST="0.0.0.0"
57
+ export SERVER_PORT="5005"
58
+ export MAX_RETRIES="5"
59
+ export CORS_ORIGINS="http://localhost:3000,https://example.com"
60
+
61
+ # Validation Settings
62
+ export VALIDATION_FAIL_ON_WARNINGS="false"
63
+ ```
64
+
65
+ ### API Endpoints
66
+
67
+ - `POST /api/prompt-to-bot` - Generate bot from description
68
+ - `GET /api/bot-data` - Get current bot configuration
69
+ - `PUT /api/bot-data` - Update bot configuration (SSE)
70
+ - `POST /api/llm-builder` - LLM helper for bot development
71
+ - `GET /` - Health check
72
+
73
+ ### Documentation Setup
74
+
75
+ ```bash
76
+ # 1. Scrape Rasa documentation
77
+ python rasa/builder/scrape_rasa_docs.py
78
+
79
+ # 2. Create OpenAI vector store
80
+ python rasa/builder/create_openai_vector_store.py
81
+ ```
82
+
83
+ ## Benefits of Functional Approach
84
+
85
+ - **Simpler**: Easy to understand and reason about
86
+ - **Testable**: Functions are easier to unit test
87
+ - **Reusable**: Pure functions can be composed
88
+ - **Maintainable**: Clear separation of concerns
89
+ - **Performant**: No unnecessary object overhead
90
+ - **Debuggable**: Clear call stacks and data flow
91
+
92
+ ## Error Handling
93
+
94
+ The service uses a structured exception hierarchy:
95
+
96
+ - `PromptToBotError` - Base exception
97
+ - `ValidationError` - Project validation failures
98
+ - `TrainingError` - Model training issues
99
+ - `LLMGenerationError` - LLM API problems
100
+ - `ProjectGenerationError` - Generation retry exhaustion
101
+ - `AgentLoadError` - Agent loading failures
102
+
103
+ ## Logging
104
+
105
+ Structured logging with context using `structlog`:
106
+
107
+ ```python
108
+ structlogger.info("operation.success", key="value")
109
+ structlogger.error("operation.failed", error=str(e))
110
+ ```
111
+
112
+ ## State Management
113
+
114
+ Only classes that truly need state:
115
+
116
+ 1. **`LLMService`** - Caches schemas and manages OpenAI client
117
+ 2. **`ProjectGenerator`** - Maintains current bot files
118
+ 3. **`BotBuilderService`** - Manages Sanic app and agent state
119
+
120
+ Everything else uses pure functions for maximum simplicity and testability.
File without changes