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
@@ -2,13 +2,18 @@
2
2
 
3
3
  import asyncio
4
4
  import warnings
5
- from contextlib import AsyncExitStack
6
- from typing import Any, Dict, Optional
5
+ from contextlib import AsyncExitStack, asynccontextmanager
6
+ from typing import Any, AsyncIterator, ClassVar, Dict, List, Optional
7
7
 
8
8
  import structlog
9
+ from httpx import HTTPStatusError
9
10
  from mcp import ClientSession
10
11
  from mcp.client.streamable_http import streamablehttp_client
11
12
 
13
+ from rasa.shared.agents.auth.agent_auth_manager import AgentAuthManager
14
+ from rasa.shared.agents.auth.auth_strategy import AgentAuthStrategy
15
+ from rasa.shared.exceptions import AuthenticationError
16
+
12
17
  structlogger = structlog.get_logger()
13
18
 
14
19
 
@@ -22,13 +27,26 @@ warnings.filterwarnings(
22
27
 
23
28
  class MCPServerConnection:
24
29
  """
25
- Manages connection to an MCP server.
30
+ Manages connection to an MCP server, with optional authentication.
26
31
 
27
- This class handles the lifecycle of connections to MCP servers,
28
- including connection establishment, session management, and cleanup.
32
+ This class handles:
33
+ - Connection establishment and cleanup
34
+ - Session lifecycle management
35
+ - Authentication via AgentAuthManager (API Key, OAuth2, mTLS, etc.)
29
36
  """
30
37
 
31
- def __init__(self, server_name: str, server_url: str, server_type: str):
38
+ # Timeout for ping operations in seconds
39
+ PING_TIMEOUT_SECONDS = 3.0
40
+
41
+ _SUPPORTED_SERVER_TYPES: ClassVar[List[str]] = ["http", "https"]
42
+
43
+ def __init__(
44
+ self,
45
+ server_name: str,
46
+ server_url: str,
47
+ server_type: str,
48
+ auth_manager: Optional[AgentAuthManager] = None,
49
+ ):
32
50
  """
33
51
  Initialize the MCP server connection.
34
52
 
@@ -36,45 +54,103 @@ class MCPServerConnection:
36
54
  server_name: Server name to identify the server
37
55
  server_url: Server URL
38
56
  server_type: Server type (currently only 'http' is supported)
57
+ auth_manager: Optional AgentAuthManager instance for this connection
39
58
  """
40
59
  self.server_name = server_name
41
60
  self.server_url = server_url
42
61
  self.server_type = server_type
62
+ self._auth_manager = auth_manager
43
63
  self.session: Optional[ClientSession] = None
44
64
  self.exit_stack: Optional[AsyncExitStack] = None
45
65
 
46
66
  @classmethod
47
67
  def from_config(cls, server_config: Dict[str, Any]) -> "MCPServerConnection":
48
68
  """Initialize the MCP server connection from a configuration dictionary."""
69
+ auth_config = server_config.get("additional_params")
70
+ _auth_manager = AgentAuthManager.load_auth(auth_config) if auth_config else None
49
71
  return cls(
50
72
  server_config["name"],
51
73
  server_config["url"],
52
74
  server_config.get("type", "http"),
75
+ _auth_manager,
53
76
  )
54
77
 
78
+ @staticmethod
79
+ @asynccontextmanager
80
+ async def open_mcp_session(
81
+ url: str, auth_strategy: Optional[AgentAuthStrategy] = None
82
+ ) -> AsyncIterator[ClientSession]:
83
+ """
84
+ Open a streamable MCP session, ensuring that initialization
85
+ completes before yielding.
86
+ """
87
+ async with streamablehttp_client(url, auth=auth_strategy) as (
88
+ read_stream,
89
+ write_stream,
90
+ _,
91
+ ):
92
+ async with ClientSession(read_stream, write_stream) as session:
93
+ await session.initialize() # handshake done here
94
+ yield session
95
+
55
96
  async def connect(self) -> None:
56
97
  """Establish connection to the MCP server.
57
98
 
58
99
  Raises:
59
100
  ValueError: If the server type is not supported.
60
101
  ConnectionError: If connection fails.
102
+ AuthenticationError: If authentication fails.
61
103
  """
62
- if self.server_type != "http":
104
+ if self.server_type not in self._SUPPORTED_SERVER_TYPES:
63
105
  raise ValueError(f"Unsupported server type: {self.server_type}")
64
106
 
65
107
  # Create a new exit stack for this connection to avoid task boundary issues
66
108
  self.exit_stack = AsyncExitStack()
67
109
 
68
110
  try:
69
- read_stream, write_stream, _ = await self.exit_stack.enter_async_context(
70
- streamablehttp_client(self.server_url)
111
+ # Get authentication strategy that adheres to httpx.Auth.
112
+ auth_strategy = (
113
+ self._auth_manager.get_auth() if self._auth_manager else None
71
114
  )
115
+
116
+ # Register the wrapped context manager in the stack
72
117
  self.session = await self.exit_stack.enter_async_context(
73
- ClientSession(read_stream, write_stream)
118
+ self.open_mcp_session(self.server_url, auth_strategy)
74
119
  )
75
- await self.session.initialize()
120
+
121
+ except Exception as eg:
122
+ for exc in getattr(eg, "exceptions", [eg]):
123
+ event_info = (
124
+ f"Failed to connect to MCP server `{self.server_name}`: {exc!s}"
125
+ )
126
+ if isinstance(exc, HTTPStatusError):
127
+ status_code = exc.response.status_code
128
+ structlogger.error(
129
+ "mcp_server_connection.connect.http_status_error",
130
+ event_info=event_info,
131
+ server_name=self.server_name,
132
+ server_url=self.server_url,
133
+ status_code=status_code,
134
+ response_text=exc.response.reason_phrase,
135
+ )
136
+ await self._cleanup()
137
+ if status_code in [400, 401, 403]:
138
+ raise AuthenticationError(eg) from eg
139
+ else:
140
+ raise ConnectionError(eg) from eg
141
+ else:
142
+ structlogger.error(
143
+ "mcp_server_connection.connect.other_exception",
144
+ event_info=event_info,
145
+ server_name=self.server_name,
146
+ server_url=self.server_url,
147
+ error=str(exc),
148
+ )
149
+ await self._cleanup()
150
+ raise ConnectionError(eg) from eg
151
+
76
152
  except asyncio.CancelledError as e:
77
- event_info = f"Connection to MCP server {self.server_name} was cancelled."
153
+ event_info = f"Connection to MCP server `{self.server_name}` was cancelled."
78
154
  structlogger.error(
79
155
  "mcp_server_connection.connect.connection_cancelled",
80
156
  event_info=event_info,
@@ -83,19 +159,7 @@ class MCPServerConnection:
83
159
  )
84
160
  # Clean up on cancellation
85
161
  await self._cleanup()
86
- raise ConnectionError(e)
87
-
88
- except Exception as e:
89
- event_info = f"Failed to connect to MCP server {self.server_name}: {e}"
90
- structlogger.error(
91
- "mcp_server_connection.connect.connection_failed",
92
- event_info=event_info,
93
- server_name=self.server_name,
94
- server_url=self.server_url,
95
- )
96
- # Clean up on error
97
- await self._cleanup()
98
- raise ConnectionError(e)
162
+ raise ConnectionError(e) from e
99
163
 
100
164
  async def ensure_active_session(self) -> ClientSession:
101
165
  """
@@ -120,9 +184,23 @@ class MCPServerConnection:
120
184
  )
121
185
  if self.session:
122
186
  try:
123
- await self.session.send_ping()
124
- except Exception as e:
187
+ # Add timeout to prevent hanging when MCP server is down
188
+ await asyncio.wait_for(
189
+ self.session.send_ping(), timeout=self.PING_TIMEOUT_SECONDS
190
+ )
191
+ except asyncio.TimeoutError as e:
125
192
  structlogger.error(
193
+ "mcp_server_connection.ensure_active_session.ping_timeout",
194
+ server_name=self.server_name,
195
+ server_url=self.server_url,
196
+ event_info=(
197
+ "Ping timed out, Server not reachable - "
198
+ f"`{self.server_name}` @ `{self.server_url}`"
199
+ ),
200
+ )
201
+ raise e
202
+ except Exception as e:
203
+ structlogger.warning(
126
204
  "mcp_server_connection.ensure_active_session.ping_failed",
127
205
  error=str(e),
128
206
  server_name=self.server_name,
@@ -132,6 +210,9 @@ class MCPServerConnection:
132
210
  f"`{self.server_name}` @ `{self.server_url}`"
133
211
  ),
134
212
  )
213
+ # Cleanup existing session
214
+ await self.close()
215
+ # Attempt to reconnect now
135
216
  await self.connect()
136
217
  structlogger.info(
137
218
  "mcp_server_connection.ensure_active_session.reconnected",
@@ -0,0 +1,20 @@
1
+ """MCP utilities."""
2
+
3
+
4
+ def mcp_server_exists(mcp_server: str) -> bool:
5
+ """Check if an MCP server exists in the configured endpoints.
6
+
7
+ Args:
8
+ mcp_server: The name of the MCP server to check.
9
+
10
+ Returns:
11
+ True if the MCP server exists, False otherwise.
12
+ """
13
+ from rasa.core.available_endpoints import AvailableEndpoints
14
+
15
+ mcp_server_list = AvailableEndpoints.get_instance().mcp_servers
16
+ if mcp_server_list is None:
17
+ return False
18
+
19
+ mcp_server_names = [server.name for server in mcp_server_list]
20
+ return mcp_server in mcp_server_names
rasa/studio/upload.py CHANGED
@@ -7,7 +7,6 @@ from typing import Any, Dict, Iterable, List, Optional, Set, Text, Tuple, Union
7
7
  import questionary
8
8
  import requests
9
9
  import structlog
10
- from pydantic import BaseModel, Field
11
10
 
12
11
  import rasa.cli.telemetry
13
12
  import rasa.cli.utils
@@ -24,9 +23,13 @@ from rasa.shared.constants import (
24
23
  DEFAULT_DOMAIN_PATHS,
25
24
  )
26
25
  from rasa.shared.core.domain import Domain
27
- from rasa.shared.core.flows.yaml_flows_io import YAMLFlowsReader, YamlFlowsWriter
26
+ from rasa.shared.core.flows.yaml_flows_io import YAMLFlowsReader
28
27
  from rasa.shared.exceptions import RasaException
29
- from rasa.shared.importers.importer import FlowSyncImporter, TrainingDataImporter
28
+ from rasa.shared.importers.importer import TrainingDataImporter
29
+ from rasa.shared.importers.utils import (
30
+ CALMUserData,
31
+ extract_calm_import_parts_from_importer,
32
+ )
30
33
  from rasa.shared.nlu.training_data.formats.rasa_yaml import (
31
34
  RasaYAMLReader,
32
35
  RasaYAMLWriter,
@@ -34,7 +37,6 @@ from rasa.shared.nlu.training_data.formats.rasa_yaml import (
34
37
  from rasa.shared.utils.llm import collect_custom_prompts
35
38
  from rasa.shared.utils.yaml import (
36
39
  dump_obj_as_yaml_to_string,
37
- read_yaml,
38
40
  read_yaml_file,
39
41
  )
40
42
  from rasa.studio import results_logger
@@ -43,6 +45,7 @@ from rasa.studio.config import StudioConfig
43
45
  from rasa.studio.results_logger import StudioResult, with_studio_error_handler
44
46
  from rasa.studio.utils import validate_argument_paths
45
47
  from rasa.telemetry import track_upload_to_studio_failed
48
+ from rasa.utils.json_utils import extract_values
46
49
 
47
50
  structlogger = structlog.get_logger()
48
51
 
@@ -68,16 +71,6 @@ DOMAIN_KEYS = [
68
71
  ]
69
72
 
70
73
 
71
- class CALMImportParts(BaseModel):
72
- """All pieces that will be uploaded to Rasa Studio."""
73
-
74
- flows: Dict[str, Any]
75
- domain: Dict[str, Any]
76
- config: Dict[str, Any]
77
- endpoints: Dict[str, Any]
78
- nlu: Dict[str, Any] = Field(default_factory=dict)
79
-
80
-
81
74
  def _get_selected_entities_and_intents(
82
75
  args: argparse.Namespace,
83
76
  intents_from_files: Set[Text],
@@ -115,9 +108,10 @@ def run_validation(args: argparse.Namespace) -> None:
115
108
  """
116
109
  from rasa.validator import Validator
117
110
 
111
+ training_data_paths = args.data if isinstance(args.data, list) else [args.data]
118
112
  training_data_importer = TrainingDataImporter.load_from_dict(
119
113
  domain_path=args.domain,
120
- training_data_paths=[args.data],
114
+ training_data_paths=training_data_paths,
121
115
  config_path=args.config,
122
116
  expand_env_vars=False,
123
117
  )
@@ -194,11 +188,6 @@ config_keys = [
194
188
  ]
195
189
 
196
190
 
197
- def extract_values(data: Dict, keys: List[Text]) -> Dict:
198
- """Extracts values for given keys from a dictionary."""
199
- return {key: data.get(key) for key in keys if data.get(key)}
200
-
201
-
202
191
  def _get_assistant_name(config: Dict[Text, Any]) -> str:
203
192
  config_assistant_id = config.get("assistant_id", "")
204
193
  assistant_name = questionary.text(
@@ -237,7 +226,7 @@ def build_calm_import_parts(
237
226
  config_path: Text,
238
227
  endpoints_path: Optional[Text] = None,
239
228
  assistant_name: Optional[Text] = None,
240
- ) -> Tuple[str, CALMImportParts]:
229
+ ) -> Tuple[str, CALMUserData]:
241
230
  """Builds the parts of the assistant to be uploaded to Studio.
242
231
 
243
232
  Args:
@@ -250,9 +239,11 @@ def build_calm_import_parts(
250
239
  Returns:
251
240
  The assistant name and the parts to be uploaded
252
241
  """
242
+ training_data_paths = data_path if isinstance(data_path, list) else [str(data_path)]
253
243
  importer = TrainingDataImporter.load_from_dict(
254
244
  domain_path=domain_path,
255
245
  config_path=config_path,
246
+ training_data_paths=training_data_paths,
256
247
  expand_env_vars=False,
257
248
  )
258
249
 
@@ -260,33 +251,10 @@ def build_calm_import_parts(
260
251
  endpoints = read_yaml_file(endpoints_path, expand_env_vars=False)
261
252
  assistant_name = assistant_name or _get_assistant_name(config)
262
253
 
263
- domain_from_files = importer.get_user_domain().as_dict()
264
- domain = extract_values(domain_from_files, DOMAIN_KEYS)
265
-
266
- flow_importer = FlowSyncImporter.load_from_dict(
267
- training_data_paths=[str(data_path)], expand_env_vars=False
268
- )
269
-
270
- flows = list(flow_importer.get_user_flows())
271
- flows_yaml = YamlFlowsWriter().dumps(flows)
272
- flows = read_yaml(flows_yaml, expand_env_vars=False)
273
-
274
- nlu_importer = TrainingDataImporter.load_from_dict(
275
- training_data_paths=[str(data_path)], expand_env_vars=False
276
- )
277
- nlu_data = nlu_importer.get_nlu_data()
278
- nlu_examples = nlu_data.filter_training_examples(
279
- lambda ex: ex.get("intent") in nlu_data.intents
280
- )
281
- nlu_examples_yaml = RasaYAMLWriter().dumps(nlu_examples)
282
- nlu = read_yaml(nlu_examples_yaml, expand_env_vars=False)
283
-
284
- parts = CALMImportParts(
285
- flows=flows,
286
- domain=domain,
254
+ parts = extract_calm_import_parts_from_importer(
255
+ importer=importer,
287
256
  config=config,
288
257
  endpoints=endpoints,
289
- nlu=nlu,
290
258
  )
291
259
 
292
260
  return assistant_name, parts
@@ -349,9 +317,10 @@ def upload_nlu_assistant(
349
317
  "rasa.studio.upload.nlu_data_read",
350
318
  event_info="Found DM1 assistant data, parsing...",
351
319
  )
320
+ training_data_paths = args.data if isinstance(args.data, list) else [args.data]
352
321
  importer = TrainingDataImporter.load_from_dict(
353
322
  domain_path=args.domain,
354
- training_data_paths=[args.data],
323
+ training_data_paths=training_data_paths,
355
324
  config_path=args.config,
356
325
  expand_env_vars=False,
357
326
  )
rasa/telemetry.py CHANGED
@@ -3,7 +3,6 @@ import contextlib
3
3
  import hashlib
4
4
  import inspect
5
5
  import json
6
- import logging
7
6
  import multiprocessing
8
7
  import os
9
8
  import platform
@@ -70,7 +69,7 @@ if typing.TYPE_CHECKING:
70
69
  from rasa.shared.importers.importer import TrainingDataImporter
71
70
  from rasa.shared.nlu.training_data.training_data import TrainingData
72
71
 
73
- logger = logging.getLogger(__name__)
72
+ structlogger = structlog.get_logger()
74
73
 
75
74
  SEGMENT_TRACK_ENDPOINT = "https://api.segment.io/v1/track"
76
75
  SEGMENT_IDENTIFY_ENDPOINT = "https://api.segment.io/v1/identify"
@@ -197,6 +196,10 @@ TELEMETRY_E2E_TEST_CONVERSION_EVENT = "E2E Test Conversion Completed"
197
196
  E2E_TEST_CONVERSION_FILE_TYPE = "file_type"
198
197
  E2E_TEST_CONVERSION_TEST_CASE_COUNT = "test_case_count"
199
198
 
199
+ # Copilot telemetry
200
+ TELEMETRY_COPILOT_USER_MESSAGE_EVENT = "copilot_user_message"
201
+ TELEMETRY_COPILOT_BOT_MESSAGE_EVENT = "copilot_bot_message"
202
+
200
203
 
201
204
  def print_telemetry_reporting_info() -> None:
202
205
  """Print telemetry information to std out."""
@@ -255,7 +258,11 @@ def _is_telemetry_enabled_in_configuration() -> bool:
255
258
 
256
259
  return stored_config[CONFIG_TELEMETRY_ENABLED]
257
260
  except ValueError as e:
258
- logger.debug(f"Could not read telemetry settings from configuration file: {e}")
261
+ structlogger.debug(
262
+ "telemetry.is_telemetry_enabled_in_configuration.error",
263
+ error=str(e),
264
+ event_info="Could not read telemetry settings from configuration file",
265
+ )
259
266
 
260
267
  # seems like there is no config, we'll create one and enable telemetry
261
268
  success = _write_default_telemetry_configuration()
@@ -272,7 +279,10 @@ def is_telemetry_enabled() -> bool:
272
279
  from rasa.utils import licensing
273
280
 
274
281
  if licensing.is_champion_server_license():
275
- logger.debug("Telemetry is enabled for developer licenses.")
282
+ structlogger.debug(
283
+ "telemetry.enabled.developer_license",
284
+ event_info="Telemetry is enabled for developer licenses.",
285
+ )
276
286
  return True
277
287
 
278
288
  telemetry_environ = os.environ.get(TELEMETRY_ENABLED_ENVIRONMENT_VARIABLE)
@@ -308,9 +318,13 @@ def initialize_telemetry() -> bool:
308
318
 
309
319
  return telemetry_environ.lower() == "true"
310
320
  except Exception as e: # skipcq:PYL-W0703
311
- logger.exception(
312
- f"Failed to initialize telemetry reporting: {e}."
313
- f"Telemetry reporting will be disabled."
321
+ structlogger.exception(
322
+ "telemetry.initialize_telemetry.error",
323
+ error=str(e),
324
+ event_info=(
325
+ "Failed to initialize telemetry reporting. "
326
+ "Telemetry reporting will be disabled."
327
+ ),
314
328
  )
315
329
  return False
316
330
 
@@ -481,7 +495,10 @@ def print_telemetry_payload(payload: Dict[Text, Any]) -> None:
481
495
  payload: payload to be delivered to segment.
482
496
  """
483
497
  payload_json = json.dumps(payload, indent=2)
484
- logger.debug(f"Telemetry payload: {payload_json}")
498
+ structlogger.debug(
499
+ "telemetry.print_telemetry_payload.debug",
500
+ event_info=f"Telemetry payload: {payload_json}",
501
+ )
485
502
 
486
503
 
487
504
  def _get_telemetry_write_key() -> Optional[Text]:
@@ -535,10 +552,24 @@ def _send_request(url: Text, payload: Dict[Text, Any]) -> None:
535
552
  if not write_key:
536
553
  # If RASA_TELEMETRY_WRITE_KEY is empty or `None`, telemetry has not
537
554
  # been enabled for this build (e.g. because it is running from source)
538
- logger.debug("Skipping request to external service: telemetry key not set.")
555
+ structlogger.debug(
556
+ "telemetry.send_request.no_telemetry_key",
557
+ event_info="Skipping request to external service: telemetry key not set.",
558
+ )
539
559
  return
540
560
 
541
- headers = rasa.telemetry.segment_request_header(write_key)
561
+ send_segment_request(url, payload, write_key)
562
+
563
+
564
+ def send_segment_request(url: Text, payload: Dict[Text, Any], write_key: Text) -> None:
565
+ """Send a request to the Segment API.
566
+
567
+ Args:
568
+ url: URL of the Segment API endpoint
569
+ payload: payload to send to the Segment API
570
+ write_key: write key for the Segment API
571
+ """
572
+ headers = segment_request_header(write_key)
542
573
 
543
574
  resp = requests.post(
544
575
  url=url,
@@ -548,15 +579,22 @@ def _send_request(url: Text, payload: Dict[Text, Any]) -> None:
548
579
  )
549
580
  # handle different failure cases
550
581
  if resp.status_code != 200:
551
- logger.debug(
552
- f"Segment telemetry request returned a {resp.status_code} response. "
553
- f"Body: {resp.text}"
582
+ structlogger.debug(
583
+ "telemetry.send_segment_request.error_response",
584
+ event_info=(
585
+ f"Segment telemetry request returned a {resp.status_code} "
586
+ f"response. Body: {resp.text}"
587
+ ),
554
588
  )
555
589
  else:
556
590
  data = resp.json()
557
591
  if not data.get("success"):
558
- logger.debug(
559
- f"Segment telemetry request returned a failure. Response: {data}"
592
+ structlogger.debug(
593
+ "telemetry.send_segment_request.failure",
594
+ event_info=(
595
+ f"Segment telemetry request returned a failure. "
596
+ f"Response: {data}"
597
+ ),
560
598
  )
561
599
 
562
600
 
@@ -609,6 +647,15 @@ def with_default_context_fields(
609
647
  return {**_default_context_fields(), **context}
610
648
 
611
649
 
650
+ def get_deployment_stack() -> Text:
651
+ """Return the deployment stack.
652
+
653
+ Returns:
654
+ The deployment stack.
655
+ """
656
+ return os.environ.get("DEPLOYMENT_STACK", "")
657
+
658
+
612
659
  def _default_context_fields() -> Dict[Text, Any]:
613
660
  """Return a dictionary that contains the default context values.
614
661
 
@@ -632,6 +679,7 @@ def _default_context_fields() -> Dict[Text, Any]:
632
679
  "cpu": multiprocessing.cpu_count(),
633
680
  "docker": _is_docker(),
634
681
  "license_hash": get_license_hash(),
682
+ "deployment_stack": get_deployment_stack(),
635
683
  "company": property_of_active_license(
636
684
  lambda active_license: active_license.company
637
685
  ),
@@ -663,7 +711,10 @@ def _track(
663
711
  telemetry_id = get_telemetry_id()
664
712
 
665
713
  if not telemetry_id:
666
- logger.debug("Will not report telemetry events as no ID was found.")
714
+ structlogger.debug(
715
+ "telemetry.track.no_id_found",
716
+ event_info="Will not report telemetry events as no ID was found.",
717
+ )
667
718
  return
668
719
 
669
720
  if not properties:
@@ -681,7 +732,11 @@ def _track(
681
732
  with_default_context_fields(context),
682
733
  )
683
734
  except Exception as e: # skipcq:PYL-W0703
684
- logger.debug(f"Skipping telemetry reporting: {e}")
735
+ structlogger.debug(
736
+ "telemetry.track.error",
737
+ error=str(e),
738
+ event_info="Skipping telemetry reporting",
739
+ )
685
740
 
686
741
 
687
742
  def _identify(
@@ -702,7 +757,10 @@ def _identify(
702
757
  telemetry_id = get_telemetry_id()
703
758
 
704
759
  if not telemetry_id:
705
- logger.debug("Will not report telemetry events as no ID was found.")
760
+ structlogger.debug(
761
+ "telemetry.identify.no_id_found",
762
+ event_info="Will not report telemetry events as no ID was found.",
763
+ )
706
764
  return
707
765
 
708
766
  if not traits:
@@ -710,7 +768,11 @@ def _identify(
710
768
 
711
769
  _send_traits(telemetry_id, traits, with_default_context_fields(context))
712
770
  except Exception as e:
713
- logger.debug(f"Skipping telemetry reporting: {e}")
771
+ structlogger.debug(
772
+ "telemetry.identify.error",
773
+ error=str(e),
774
+ event_info="Skipping telemetry reporting",
775
+ )
714
776
 
715
777
 
716
778
  def _send_traits(
@@ -868,13 +930,16 @@ def strip_sensitive_data_from_sentry_event(
868
930
 
869
931
 
870
932
  @ensure_telemetry_enabled
871
- def initialize_error_reporting() -> None:
933
+ def initialize_error_reporting(private_mode: bool = True) -> None:
872
934
  """Sets up automated error reporting.
873
935
 
874
936
  Exceptions are reported to sentry. We avoid sending any metadata (local
875
937
  variables, paths, ...) to make sure we don't compromise any data. Only the
876
938
  exception and its stacktrace is logged and only if the exception origins
877
939
  from the `rasa` package.
940
+
941
+ Args:
942
+ private_mode: If True, try to send as little data as possible.
878
943
  """
879
944
  import sentry_sdk
880
945
  from sentry_sdk import configure_scope
@@ -892,11 +957,18 @@ def initialize_error_reporting() -> None:
892
957
 
893
958
  telemetry_id = get_telemetry_id()
894
959
 
960
+ # in hello rasa we use a different project, so we need to be able
961
+ # to set the whole url. since we can't change the behavior of sentry in pro
962
+ # we have two kinds of keys, full urls and jsut the key within the fixed rasa
963
+ # pro project.
964
+ if not key.startswith("https://"):
965
+ key = f"https://{key}.ingest.sentry.io/2801673"
966
+
895
967
  # this is a very defensive configuration, avoiding as many integrations as
896
968
  # possible. it also submits very little data (exception with error message
897
969
  # and line numbers).
898
970
  sentry_sdk.init(
899
- f"https://{key}.ingest.sentry.io/2801673",
971
+ key,
900
972
  before_send=before_send,
901
973
  integrations=[
902
974
  ExcepthookIntegration(),
@@ -916,7 +988,7 @@ def initialize_error_reporting() -> None:
916
988
  OSError,
917
989
  ],
918
990
  in_app_include=["rasa"], # only submit errors in this package
919
- include_local_variables=False, # don't submit local variables
991
+ include_local_variables=not private_mode,
920
992
  release=f"rasa-{rasa.__version__}",
921
993
  default_integrations=False,
922
994
  environment="development" if in_continuous_integration() else "production",
@@ -937,6 +1009,7 @@ def initialize_error_reporting() -> None:
937
1009
  # os is a nested dict, hence we report it separately
938
1010
  scope.set_context("Operating System", default_context.pop("os"))
939
1011
  scope.set_context("Environment", default_context)
1012
+ structlogger.debug("telemetry.sentry.initialized")
940
1013
 
941
1014
 
942
1015
  @contextlib.contextmanager
@@ -1426,6 +1499,7 @@ def track_shell_started(model_type: Text, assistant_id: Text) -> None:
1426
1499
 
1427
1500
  Args:
1428
1501
  model_type: Type of the model, core / nlu or rasa.
1502
+ assistant_id: ID of the assistant being inspected.
1429
1503
  """
1430
1504
  _track(
1431
1505
  TELEMETRY_SHELL_STARTED_EVENT,
@@ -1997,7 +2071,7 @@ def _extract_stream_pii(event_broker: Optional["EventBroker"]) -> bool:
1997
2071
  def track_privacy_enabled(
1998
2072
  privacy_config: "PrivacyConfig", event_broker: Optional["EventBroker"]
1999
2073
  ) -> None:
2000
- """Track when PII management capability is enabled"""
2074
+ """Track when PII management capability is enabled."""
2001
2075
  stream_pii = _extract_stream_pii(event_broker)
2002
2076
  privacy_properties = _extract_privacy_enabled_event_properties(
2003
2077
  privacy_config, stream_pii