rasa-pro 3.14.0.dev20250901__py3-none-any.whl → 3.14.0rc1__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 (584) hide show
  1. rasa/__main__.py +15 -3
  2. rasa/agents/__init__.py +0 -0
  3. rasa/agents/agent_factory.py +122 -0
  4. rasa/agents/agent_manager.py +211 -0
  5. rasa/agents/constants.py +43 -0
  6. rasa/agents/core/__init__.py +0 -0
  7. rasa/agents/core/agent_protocol.py +107 -0
  8. rasa/agents/core/types.py +81 -0
  9. rasa/agents/exceptions.py +38 -0
  10. rasa/agents/protocol/__init__.py +5 -0
  11. rasa/agents/protocol/a2a/__init__.py +0 -0
  12. rasa/agents/protocol/a2a/a2a_agent.py +879 -0
  13. rasa/agents/protocol/mcp/__init__.py +0 -0
  14. rasa/agents/protocol/mcp/mcp_base_agent.py +726 -0
  15. rasa/agents/protocol/mcp/mcp_open_agent.py +327 -0
  16. rasa/agents/protocol/mcp/mcp_task_agent.py +522 -0
  17. rasa/agents/schemas/__init__.py +13 -0
  18. rasa/agents/schemas/agent_input.py +38 -0
  19. rasa/agents/schemas/agent_output.py +26 -0
  20. rasa/agents/schemas/agent_tool_result.py +65 -0
  21. rasa/agents/schemas/agent_tool_schema.py +186 -0
  22. rasa/agents/templates/__init__.py +0 -0
  23. rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +20 -0
  24. rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +22 -0
  25. rasa/agents/utils.py +206 -0
  26. rasa/agents/validation.py +485 -0
  27. rasa/api.py +24 -9
  28. rasa/builder/config.py +7 -2
  29. rasa/builder/copilot/constants.py +3 -0
  30. rasa/builder/copilot/copilot.py +128 -54
  31. rasa/builder/copilot/models.py +39 -3
  32. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +183 -188
  33. rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +61 -0
  34. rasa/builder/copilot/telemetry.py +46 -20
  35. rasa/builder/document_retrieval/models.py +3 -3
  36. rasa/builder/download.py +1 -8
  37. rasa/builder/guardrails/{lakera.py → clients.py} +55 -5
  38. rasa/builder/guardrails/constants.py +3 -0
  39. rasa/builder/guardrails/models.py +45 -10
  40. rasa/builder/guardrails/policy_checker.py +324 -0
  41. rasa/builder/guardrails/utils.py +42 -276
  42. rasa/builder/jobs.py +33 -21
  43. rasa/builder/llm_service.py +32 -5
  44. rasa/builder/main.py +38 -62
  45. rasa/builder/models.py +8 -7
  46. rasa/builder/project_generator.py +149 -148
  47. rasa/builder/service.py +58 -40
  48. rasa/builder/template_cache.py +69 -0
  49. rasa/builder/training_service.py +84 -20
  50. rasa/builder/validation_service.py +1 -1
  51. rasa/cli/arguments/default_arguments.py +12 -0
  52. rasa/cli/arguments/run.py +2 -0
  53. rasa/cli/arguments/train.py +2 -0
  54. rasa/cli/data.py +10 -8
  55. rasa/cli/dialogue_understanding_test.py +10 -7
  56. rasa/cli/e2e_test.py +9 -6
  57. rasa/cli/evaluate.py +4 -2
  58. rasa/cli/export.py +5 -2
  59. rasa/cli/inspect.py +8 -4
  60. rasa/cli/interactive.py +5 -4
  61. rasa/cli/llm_fine_tuning.py +11 -6
  62. rasa/cli/project_templates/basic/README.md +23 -0
  63. rasa/cli/project_templates/basic/actions/actions.md +10 -0
  64. rasa/cli/project_templates/basic/config.yml +6 -4
  65. rasa/cli/project_templates/basic/data/data.md +5 -6
  66. rasa/cli/project_templates/basic/domain/domain.md +7 -5
  67. rasa/cli/project_templates/basic/domain/general/show_faqs.yml +1 -1
  68. rasa/cli/project_templates/basic/endpoints.yml +5 -1
  69. rasa/cli/project_templates/default/config.yml +4 -0
  70. rasa/cli/project_templates/default/endpoints.yml +4 -0
  71. rasa/cli/project_templates/finance/README.md +26 -0
  72. rasa/cli/project_templates/finance/actions/__init__.py +0 -46
  73. rasa/cli/project_templates/finance/actions/accounts/check_balance.py +18 -0
  74. rasa/cli/project_templates/finance/actions/actions.md +15 -0
  75. rasa/cli/project_templates/finance/actions/{transfers/action_process_immediate_payment.py → cards/check_that_card_exists.py} +6 -3
  76. rasa/cli/project_templates/finance/actions/cards/list_cards.py +22 -0
  77. rasa/cli/project_templates/finance/actions/contacts/__init__.py +0 -0
  78. rasa/cli/project_templates/finance/actions/contacts/add_contact.py +30 -0
  79. rasa/cli/project_templates/finance/actions/contacts/list_contacts.py +22 -0
  80. rasa/cli/project_templates/finance/actions/contacts/remove_contact.py +35 -0
  81. rasa/cli/project_templates/finance/actions/db.py +117 -0
  82. rasa/cli/project_templates/finance/actions/general/__init__.py +0 -0
  83. rasa/cli/project_templates/finance/actions/general/action_human_handoff.py +49 -0
  84. rasa/cli/project_templates/finance/actions/transfers/check_transfer_funds.py +27 -0
  85. rasa/cli/project_templates/finance/actions/transfers/check_transfer_limit.py +36 -0
  86. rasa/cli/project_templates/finance/actions/transfers/execute_recurrent_payment.py +20 -0
  87. rasa/cli/project_templates/finance/actions/transfers/execute_transfer.py +45 -0
  88. rasa/cli/project_templates/finance/actions/transfers/list_transactions.py +32 -0
  89. rasa/cli/project_templates/finance/config.yml +8 -0
  90. rasa/cli/project_templates/finance/credentials.yml +7 -6
  91. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +3 -4
  92. rasa/cli/project_templates/finance/data/accounts/download_statements.yml +26 -0
  93. rasa/cli/project_templates/finance/data/bills/bill_pay_reminder.yml +25 -0
  94. rasa/cli/project_templates/finance/data/cards/activate_card.yml +35 -0
  95. rasa/cli/project_templates/finance/data/cards/block_card.yml +37 -58
  96. rasa/cli/project_templates/finance/data/cards/list_cards.yml +14 -0
  97. rasa/cli/project_templates/finance/data/cards/replace_card.yml +16 -0
  98. rasa/cli/project_templates/finance/data/cards/replace_eligible_card.yml +29 -0
  99. rasa/cli/project_templates/finance/data/contacts/add_contact.yml +33 -0
  100. rasa/cli/project_templates/finance/data/contacts/list_contacts.yml +14 -0
  101. rasa/cli/project_templates/finance/data/contacts/remove_contact.yml +31 -0
  102. rasa/cli/project_templates/finance/data/data.md +14 -0
  103. rasa/cli/project_templates/finance/data/general/bot_challenge.yml +6 -0
  104. rasa/cli/project_templates/finance/data/general/goodbye.yml +1 -1
  105. rasa/cli/project_templates/finance/data/general/hello.yml +1 -2
  106. rasa/cli/project_templates/finance/data/general/help.yml +2 -2
  107. rasa/cli/project_templates/finance/data/general/human_handoff.yml +2 -2
  108. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +1 -1
  109. rasa/cli/project_templates/finance/data/transfers/check_transfer_limit.yml +18 -0
  110. rasa/cli/project_templates/finance/data/transfers/list_transactions.yml +46 -0
  111. rasa/cli/project_templates/finance/data/transfers/move_money_between_accounts.yml +51 -0
  112. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +29 -62
  113. rasa/cli/project_templates/finance/data/transfers/transfer_money_to_a_third_party.yml +175 -0
  114. rasa/cli/project_templates/finance/db/cards.json +18 -0
  115. rasa/cli/project_templates/finance/db/contacts.json +10 -0
  116. rasa/cli/project_templates/finance/db/my_account.json +6 -0
  117. rasa/cli/project_templates/finance/db/transactions.json +22 -0
  118. rasa/cli/project_templates/finance/docs/docs.md +8 -0
  119. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/budgeting_analytics.txt +22 -0
  120. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/multi_currency_accounts.txt +19 -0
  121. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/premium_benefits.txt +19 -0
  122. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/contactless_limits.txt +16 -0
  123. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/freeze_unfreeze_card.txt +16 -0
  124. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/lost_stolen_card.txt +19 -0
  125. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/instant_payments.txt +19 -0
  126. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/international_transfers.txt +19 -0
  127. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/fraud_protection.txt +22 -0
  128. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/secure_payments.txt +22 -0
  129. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +9 -5
  130. rasa/cli/project_templates/finance/domain/accounts/download_statements.yml +40 -0
  131. rasa/cli/project_templates/finance/domain/bills/bill_pay_reminder.yml +49 -0
  132. rasa/cli/project_templates/finance/domain/cards/activate_card.yml +24 -0
  133. rasa/cli/project_templates/finance/domain/cards/block_card.yml +33 -90
  134. rasa/cli/project_templates/finance/domain/cards/list_cards.yml +16 -0
  135. rasa/cli/project_templates/finance/domain/cards/replace_card.yml +43 -0
  136. rasa/cli/project_templates/finance/domain/cards/shared.yml +15 -0
  137. rasa/cli/project_templates/finance/domain/contacts/add_contact.yml +37 -0
  138. rasa/cli/project_templates/finance/domain/contacts/list_contacts.yml +16 -0
  139. rasa/cli/project_templates/finance/domain/contacts/remove_contact.yml +32 -0
  140. rasa/cli/project_templates/finance/domain/domain.md +18 -0
  141. rasa/cli/project_templates/finance/domain/general/_shared.yml +39 -0
  142. rasa/cli/project_templates/finance/domain/general/bot_challenge.yml +4 -0
  143. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +5 -2
  144. rasa/cli/project_templates/finance/domain/general/feedback.yml +0 -3
  145. rasa/cli/project_templates/finance/domain/general/goodbye.yml +6 -6
  146. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +10 -9
  147. rasa/cli/project_templates/finance/domain/general/welcome.yml +33 -2
  148. rasa/cli/project_templates/finance/domain/transfers/check_transfer_limit.yml +32 -0
  149. rasa/cli/project_templates/finance/domain/transfers/list_transactions.yml +44 -0
  150. rasa/cli/project_templates/finance/domain/transfers/shared.yml +17 -0
  151. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +203 -61
  152. rasa/cli/project_templates/finance/endpoints.yml +8 -4
  153. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +31 -12
  154. rasa/cli/project_templates/finance/tests/e2e_test_cases/accounts/check_balance.yml +9 -0
  155. rasa/cli/project_templates/finance/tests/e2e_test_cases/accounts/download_statements.yml +43 -0
  156. rasa/cli/project_templates/finance/tests/e2e_test_cases/cards/block_card.yml +55 -0
  157. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
  158. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/feedback.yml +46 -0
  159. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/goodbye.yml +9 -0
  160. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/hello.yml +8 -0
  161. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/human_handoff.yml +35 -0
  162. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/patterns.yml +22 -0
  163. rasa/cli/project_templates/finance/tests/e2e_test_cases/transfers/transfer_money.yml +56 -0
  164. rasa/cli/project_templates/telco/README.md +25 -0
  165. rasa/cli/project_templates/telco/actions/actions.md +12 -0
  166. rasa/cli/project_templates/telco/config.yml +6 -4
  167. rasa/cli/project_templates/telco/data/data.md +11 -0
  168. rasa/cli/project_templates/telco/data/general/human_handoff.yml +1 -1
  169. rasa/cli/project_templates/telco/docs/docs.md +3 -0
  170. rasa/cli/project_templates/telco/domain/domain.md +13 -0
  171. rasa/cli/project_templates/telco/domain/general/human_handoff.yml +3 -6
  172. rasa/cli/project_templates/telco/endpoints.yml +5 -1
  173. rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +1 -1
  174. rasa/cli/project_templates/telco/tests/e2e_test_cases/billing/understand_bill.yml +67 -0
  175. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
  176. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/feedback.yml +46 -0
  177. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/goodbye.yml +9 -0
  178. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/hello.yml +8 -0
  179. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/human_handoff.yml +35 -0
  180. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/patterns.yml +23 -0
  181. rasa/cli/project_templates/telco/tests/e2e_test_cases/network/solve_internet_issue.yml +57 -0
  182. rasa/cli/project_templates/tutorial/credentials.yml +10 -0
  183. rasa/cli/run.py +12 -10
  184. rasa/cli/scaffold.py +4 -4
  185. rasa/cli/shell.py +9 -5
  186. rasa/cli/studio/studio.py +1 -1
  187. rasa/cli/test.py +34 -14
  188. rasa/cli/train.py +41 -28
  189. rasa/cli/utils.py +1 -393
  190. rasa/cli/validation/__init__.py +0 -0
  191. rasa/cli/validation/bot_config.py +223 -0
  192. rasa/cli/validation/config_path_validation.py +257 -0
  193. rasa/cli/x.py +8 -4
  194. rasa/constants.py +7 -1
  195. rasa/core/actions/action.py +51 -10
  196. rasa/core/actions/action_run_slot_rejections.py +1 -1
  197. rasa/core/actions/direct_custom_actions_executor.py +9 -2
  198. rasa/core/actions/grpc_custom_action_executor.py +1 -1
  199. rasa/core/agent.py +19 -2
  200. rasa/core/available_agents.py +229 -0
  201. rasa/core/brokers/broker.py +1 -1
  202. rasa/core/brokers/kafka.py +52 -8
  203. rasa/core/channels/__init__.py +82 -35
  204. rasa/core/channels/development_inspector.py +4 -24
  205. rasa/core/channels/hangouts.py +2 -2
  206. rasa/core/channels/inspector/README.md +25 -13
  207. rasa/core/channels/inspector/dist/assets/{arc-18042c22.js → arc-6177260a.js} +1 -1
  208. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-fdd6bcfa.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
  209. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-f5ae6786.js → c4Diagram-3d4e48cf-f25427d5.js} +1 -1
  210. rasa/core/channels/inspector/dist/assets/channel-bf9cbb34.js +1 -0
  211. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-81efba3e.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
  212. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-3b6b6a92.js → classDiagram-v2-f2320105-58db65c0.js} +1 -1
  213. rasa/core/channels/inspector/dist/assets/clone-8f9083bb.js +1 -0
  214. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-31422447.js → createText-2e5e7dd3-088372e2.js} +1 -1
  215. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-518a90db.js → edges-e0da2a9e-58676240.js} +1 -1
  216. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-a6d3c25a.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
  217. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-e048c2be.js → flowDb-956e92f1-ea63f85c.js} +1 -1
  218. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-c7474c91.js → flowDiagram-66a62f08-a2af48cd.js} +1 -1
  219. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-9ecd5b59.js +1 -0
  220. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-cb4d8723.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
  221. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-346636a2.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
  222. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-7c508874.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
  223. rasa/core/channels/inspector/dist/assets/{graph-14702d8a.js → graph-0a6f8466.js} +1 -1
  224. rasa/core/channels/inspector/dist/assets/{index-3862675e-f18b534b.js → index-3862675e-7610671a.js} +1 -1
  225. rasa/core/channels/inspector/dist/assets/index-74e01d94.js +1354 -0
  226. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-64154b83.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
  227. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-833a5f95.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
  228. rasa/core/channels/inspector/dist/assets/{layout-5a3b2123.js → layout-e7fbc2bf.js} +1 -1
  229. rasa/core/channels/inspector/dist/assets/{line-2272a8c7.js → line-a8aa457c.js} +1 -1
  230. rasa/core/channels/inspector/dist/assets/{linear-35bcf273.js → linear-3351e0d2.js} +1 -1
  231. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-92dcb0e9.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
  232. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-94dbc900.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
  233. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-8b7a9c33.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
  234. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6f7eab81.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
  235. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-f43e581d.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
  236. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-0bcbefc3.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
  237. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-b8a74083.js → stateDiagram-587899a1-0e770395.js} +1 -1
  238. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-2070218f.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
  239. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-f1d54e34.js → styles-6aaf32cf-36a9e70d.js} +1 -1
  240. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-980de489.js → styles-9a916d00-884a8b5b.js} +1 -1
  241. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-3c03abde.js → styles-c10674c1-dc097813.js} +1 -1
  242. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-46ba068f.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
  243. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-901f5e3d.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
  244. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-acbc628a.js → xychartDiagram-e933f94c-afb6fe56.js} +1 -1
  245. rasa/core/channels/inspector/dist/index.html +1 -1
  246. rasa/core/channels/inspector/package.json +18 -18
  247. rasa/core/channels/inspector/src/App.tsx +34 -35
  248. rasa/core/channels/inspector/src/components/Chat.tsx +2 -3
  249. rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
  250. rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +4 -2
  251. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +9 -1
  252. rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +63 -35
  253. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +20 -3
  254. rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
  255. rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
  256. rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
  257. rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
  258. rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
  259. rasa/core/channels/inspector/src/types.ts +53 -7
  260. rasa/core/channels/inspector/yarn.lock +336 -189
  261. rasa/core/channels/studio_chat.py +29 -47
  262. rasa/core/channels/telegram.py +4 -9
  263. rasa/core/channels/voice_stream/asr/asr_event.py +1 -1
  264. rasa/core/channels/voice_stream/asr/azure.py +6 -3
  265. rasa/core/channels/voice_stream/asr/deepgram.py +1 -1
  266. rasa/core/channels/voice_stream/audiocodes.py +3 -0
  267. rasa/core/channels/voice_stream/browser_audio.py +55 -3
  268. rasa/core/channels/voice_stream/genesys.py +3 -2
  269. rasa/core/channels/voice_stream/jambonz.py +9 -1
  270. rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
  271. rasa/core/channels/voice_stream/twilio_media_streams.py +21 -1
  272. rasa/core/channels/voice_stream/voice_channel.py +64 -0
  273. rasa/core/concurrent_lock_store.py +66 -16
  274. rasa/core/config/__init__.py +0 -0
  275. rasa/core/{available_endpoints.py → config/available_endpoints.py} +51 -16
  276. rasa/core/config/configuration.py +260 -0
  277. rasa/core/config/credentials.py +19 -0
  278. rasa/core/config/message_procesing_config.py +34 -0
  279. rasa/core/constants.py +11 -0
  280. rasa/core/iam_credentials_providers/__init__.py +0 -0
  281. rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +226 -0
  282. rasa/core/iam_credentials_providers/credentials_provider_protocol.py +90 -0
  283. rasa/core/lock_store.py +46 -10
  284. rasa/core/nlg/generator.py +1 -1
  285. rasa/core/policies/enterprise_search_policy.py +5 -3
  286. rasa/core/policies/flow_policy.py +4 -4
  287. rasa/core/policies/flows/agent_executor.py +632 -0
  288. rasa/core/policies/flows/flow_executor.py +137 -76
  289. rasa/core/policies/flows/mcp_tool_executor.py +298 -0
  290. rasa/core/policies/intentless_policy.py +1 -1
  291. rasa/core/policies/ted_policy.py +20 -12
  292. rasa/core/policies/unexpected_intent_policy.py +6 -0
  293. rasa/core/processor.py +100 -44
  294. rasa/core/redis_connection_factory.py +469 -0
  295. rasa/core/run.py +37 -8
  296. rasa/core/test.py +4 -0
  297. rasa/core/tracker_stores/redis_tracker_store.py +32 -14
  298. rasa/core/tracker_stores/sql_tracker_store.py +57 -1
  299. rasa/core/tracker_stores/tracker_store.py +3 -7
  300. rasa/core/train.py +1 -1
  301. rasa/core/training/interactive.py +20 -18
  302. rasa/core/training/story_conflict.py +5 -5
  303. rasa/core/utils.py +22 -23
  304. rasa/dialogue_understanding/commands/__init__.py +8 -0
  305. rasa/dialogue_understanding/commands/cancel_flow_command.py +19 -5
  306. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +21 -2
  307. rasa/dialogue_understanding/commands/clarify_command.py +20 -2
  308. rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
  309. rasa/dialogue_understanding/commands/knowledge_answer_command.py +21 -2
  310. rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
  311. rasa/dialogue_understanding/commands/start_flow_command.py +68 -7
  312. rasa/dialogue_understanding/commands/utils.py +124 -2
  313. rasa/dialogue_understanding/generator/command_parser.py +4 -0
  314. rasa/dialogue_understanding/generator/llm_based_command_generator.py +50 -12
  315. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  316. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  317. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +66 -0
  318. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +66 -0
  319. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +89 -0
  320. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +88 -0
  321. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +42 -7
  322. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +40 -3
  323. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +20 -3
  324. rasa/dialogue_understanding/patterns/cancel.py +27 -6
  325. rasa/dialogue_understanding/patterns/clarify.py +3 -14
  326. rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
  327. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +46 -8
  328. rasa/dialogue_understanding/processor/command_processor.py +136 -15
  329. rasa/dialogue_understanding/stack/dialogue_stack.py +98 -2
  330. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
  331. rasa/dialogue_understanding/stack/utils.py +57 -3
  332. rasa/dialogue_understanding/utils.py +24 -4
  333. rasa/dialogue_understanding_test/du_test_runner.py +8 -3
  334. rasa/e2e_test/e2e_test_runner.py +13 -3
  335. rasa/engine/caching.py +2 -2
  336. rasa/engine/constants.py +1 -1
  337. rasa/engine/graph.py +5 -1
  338. rasa/engine/loader.py +12 -0
  339. rasa/engine/recipes/default_components.py +138 -49
  340. rasa/engine/recipes/default_recipe.py +108 -11
  341. rasa/engine/runner/dask.py +8 -5
  342. rasa/engine/storage/local_model_storage.py +41 -4
  343. rasa/engine/validation.py +19 -6
  344. rasa/graph_components/validators/default_recipe_validator.py +86 -28
  345. rasa/hooks.py +5 -5
  346. rasa/llm_fine_tuning/utils.py +2 -2
  347. rasa/model_manager/socket_bridge.py +1 -2
  348. rasa/model_manager/warm_rasa_process.py +13 -3
  349. rasa/model_training.py +60 -47
  350. rasa/nlu/classifiers/diet_classifier.py +198 -98
  351. rasa/nlu/classifiers/logistic_regression_classifier.py +1 -4
  352. rasa/nlu/classifiers/mitie_intent_classifier.py +3 -0
  353. rasa/nlu/classifiers/sklearn_intent_classifier.py +1 -3
  354. rasa/nlu/extractors/crf_entity_extractor.py +9 -10
  355. rasa/nlu/extractors/mitie_entity_extractor.py +3 -0
  356. rasa/nlu/extractors/spacy_entity_extractor.py +3 -0
  357. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +4 -0
  358. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +5 -0
  359. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +2 -0
  360. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +3 -0
  361. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +4 -2
  362. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -0
  363. rasa/nlu/selectors/response_selector.py +10 -2
  364. rasa/nlu/tokenizers/jieba_tokenizer.py +3 -4
  365. rasa/nlu/tokenizers/mitie_tokenizer.py +3 -2
  366. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -2
  367. rasa/nlu/utils/mitie_utils.py +3 -0
  368. rasa/nlu/utils/spacy_utils.py +3 -2
  369. rasa/plugin.py +8 -8
  370. rasa/privacy/privacy_manager.py +12 -3
  371. rasa/server.py +15 -3
  372. rasa/shared/agents/__init__.py +0 -0
  373. rasa/shared/agents/auth/__init__.py +0 -0
  374. rasa/shared/agents/auth/agent_auth_factory.py +105 -0
  375. rasa/shared/agents/auth/agent_auth_manager.py +92 -0
  376. rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
  377. rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
  378. rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
  379. rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
  380. rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +167 -0
  381. rasa/shared/agents/auth/constants.py +12 -0
  382. rasa/shared/agents/auth/types.py +12 -0
  383. rasa/shared/agents/utils.py +35 -0
  384. rasa/shared/constants.py +8 -0
  385. rasa/shared/core/constants.py +17 -1
  386. rasa/shared/core/domain.py +0 -7
  387. rasa/shared/core/events.py +329 -0
  388. rasa/shared/core/flows/constants.py +5 -0
  389. rasa/shared/core/flows/flow.py +1 -1
  390. rasa/shared/core/flows/flows_list.py +21 -5
  391. rasa/shared/core/flows/flows_yaml_schema.json +119 -184
  392. rasa/shared/core/flows/steps/call.py +49 -5
  393. rasa/shared/core/flows/steps/collect.py +98 -13
  394. rasa/shared/core/flows/validation.py +372 -8
  395. rasa/shared/core/flows/yaml_flows_io.py +3 -2
  396. rasa/shared/core/slots.py +2 -2
  397. rasa/shared/core/trackers.py +5 -2
  398. rasa/shared/exceptions.py +16 -0
  399. rasa/shared/importers/rasa.py +1 -1
  400. rasa/shared/importers/utils.py +9 -3
  401. rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
  402. rasa/shared/providers/llm/_base_litellm_client.py +41 -9
  403. rasa/shared/providers/llm/litellm_router_llm_client.py +8 -4
  404. rasa/shared/providers/llm/llm_client.py +7 -3
  405. rasa/shared/providers/llm/llm_response.py +66 -0
  406. rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
  407. rasa/shared/utils/common.py +24 -0
  408. rasa/shared/utils/health_check/health_check.py +7 -3
  409. rasa/shared/utils/llm.py +39 -16
  410. rasa/shared/utils/mcp/__init__.py +0 -0
  411. rasa/shared/utils/mcp/server_connection.py +247 -0
  412. rasa/shared/utils/mcp/utils.py +20 -0
  413. rasa/shared/utils/schemas/events.py +42 -0
  414. rasa/shared/utils/yaml.py +3 -1
  415. rasa/studio/pull/pull.py +3 -2
  416. rasa/studio/train.py +8 -7
  417. rasa/studio/upload.py +3 -6
  418. rasa/telemetry.py +69 -5
  419. rasa/tracing/config.py +45 -12
  420. rasa/tracing/constants.py +14 -0
  421. rasa/tracing/instrumentation/attribute_extractors.py +142 -9
  422. rasa/tracing/instrumentation/instrumentation.py +626 -21
  423. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
  424. rasa/tracing/instrumentation/metrics.py +32 -0
  425. rasa/tracing/metric_instrument_provider.py +68 -0
  426. rasa/utils/common.py +92 -1
  427. rasa/utils/endpoints.py +11 -2
  428. rasa/utils/log_utils.py +96 -5
  429. rasa/utils/ml_utils.py +1 -1
  430. rasa/utils/pypred.py +38 -0
  431. rasa/utils/tensorflow/__init__.py +7 -0
  432. rasa/utils/tensorflow/callback.py +136 -101
  433. rasa/utils/tensorflow/crf.py +1 -1
  434. rasa/utils/tensorflow/data_generator.py +21 -8
  435. rasa/utils/tensorflow/layers.py +21 -11
  436. rasa/utils/tensorflow/metrics.py +7 -3
  437. rasa/utils/tensorflow/models.py +56 -8
  438. rasa/utils/tensorflow/rasa_layers.py +8 -6
  439. rasa/utils/tensorflow/transformer.py +2 -3
  440. rasa/utils/train_utils.py +54 -24
  441. rasa/validator.py +17 -13
  442. rasa/version.py +1 -1
  443. {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/METADATA +59 -51
  444. {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/RECORD +452 -428
  445. rasa/builder/scrape_rasa_docs.py +0 -97
  446. rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +0 -47
  447. rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +0 -40
  448. rasa/cli/project_templates/finance/actions/action_session_start.py +0 -74
  449. rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +0 -48
  450. rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +0 -36
  451. rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +0 -54
  452. rasa/cli/project_templates/finance/actions/database.py +0 -277
  453. rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +0 -52
  454. rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +0 -51
  455. rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +0 -40
  456. rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +0 -40
  457. rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +0 -46
  458. rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +0 -49
  459. rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +0 -19
  460. rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +0 -36
  461. rasa/cli/project_templates/finance/csvs/accounts.csv +0 -8
  462. rasa/cli/project_templates/finance/csvs/advisors.csv +0 -7
  463. rasa/cli/project_templates/finance/csvs/appointments.csv +0 -211
  464. rasa/cli/project_templates/finance/csvs/branches.csv +0 -10
  465. rasa/cli/project_templates/finance/csvs/cards.csv +0 -11
  466. rasa/cli/project_templates/finance/csvs/payees.csv +0 -11
  467. rasa/cli/project_templates/finance/csvs/transactions.csv +0 -71
  468. rasa/cli/project_templates/finance/csvs/users.csv +0 -4
  469. rasa/cli/project_templates/finance/data/cards/select_card.yml +0 -12
  470. rasa/cli/project_templates/finance/data/general/bot_identity.yml +0 -6
  471. rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +0 -5
  472. rasa/cli/project_templates/finance/data/system/source/accounts.json +0 -51
  473. rasa/cli/project_templates/finance/data/system/source/advisors.json +0 -44
  474. rasa/cli/project_templates/finance/data/system/source/appointments.json +0 -1474
  475. rasa/cli/project_templates/finance/data/system/source/branches.json +0 -47
  476. rasa/cli/project_templates/finance/data/system/source/cards.json +0 -72
  477. rasa/cli/project_templates/finance/data/system/source/payees.json +0 -74
  478. rasa/cli/project_templates/finance/data/system/source/transactions.json +0 -492
  479. rasa/cli/project_templates/finance/data/system/source/users.json +0 -29
  480. rasa/cli/project_templates/finance/data/transfers/add_payee.yml +0 -29
  481. rasa/cli/project_templates/finance/data/transfers/list_payees.yml +0 -5
  482. rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +0 -21
  483. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +0 -8
  484. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +0 -8
  485. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +0 -8
  486. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +0 -8
  487. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +0 -8
  488. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +0 -7
  489. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +0 -8
  490. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +0 -8
  491. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +0 -8
  492. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +0 -8
  493. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +0 -8
  494. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +0 -8
  495. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +0 -8
  496. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +0 -8
  497. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +0 -8
  498. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +0 -8
  499. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +0 -8
  500. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +0 -8
  501. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +0 -8
  502. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +0 -8
  503. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +0 -50
  504. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +0 -50
  505. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +0 -48
  506. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +0 -50
  507. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +0 -50
  508. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +0 -47
  509. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +0 -50
  510. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +0 -50
  511. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +0 -47
  512. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +0 -50
  513. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +0 -50
  514. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +0 -50
  515. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +0 -47
  516. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +0 -50
  517. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +0 -50
  518. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +0 -47
  519. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +0 -50
  520. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +0 -50
  521. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +0 -47
  522. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +0 -50
  523. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +0 -50
  524. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +0 -47
  525. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +0 -47
  526. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +0 -50
  527. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +0 -50
  528. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +0 -47
  529. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +0 -50
  530. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +0 -50
  531. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +0 -47
  532. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +0 -50
  533. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +0 -50
  534. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +0 -47
  535. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +0 -50
  536. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +0 -50
  537. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +0 -50
  538. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +0 -47
  539. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +0 -50
  540. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +0 -50
  541. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +0 -47
  542. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +0 -50
  543. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +0 -50
  544. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +0 -47
  545. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +0 -50
  546. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +0 -50
  547. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +0 -50
  548. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +0 -47
  549. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +0 -50
  550. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +0 -50
  551. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +0 -47
  552. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +0 -50
  553. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +0 -50
  554. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +0 -47
  555. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +0 -50
  556. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +0 -50
  557. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +0 -47
  558. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +0 -47
  559. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +0 -50
  560. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +0 -50
  561. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +0 -50
  562. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +0 -50
  563. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +0 -47
  564. rasa/cli/project_templates/finance/domain/cards/select_card.yml +0 -12
  565. rasa/cli/project_templates/finance/domain/general/assistant_details.yml +0 -12
  566. rasa/cli/project_templates/finance/domain/general/bot_identity.yml +0 -5
  567. rasa/cli/project_templates/finance/domain/general/defaults.yml +0 -24
  568. rasa/cli/project_templates/finance/domain/general/help.yml +0 -5
  569. rasa/cli/project_templates/finance/domain/general/utils.yml +0 -13
  570. rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +0 -47
  571. rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +0 -4
  572. rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +0 -16
  573. rasa/core/channels/inspector/dist/assets/channel-b9b536fc.js +0 -1
  574. rasa/core/channels/inspector/dist/assets/clone-78d2ddcf.js +0 -1
  575. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-8b09c060.js +0 -1
  576. rasa/core/channels/inspector/dist/assets/index-4d4bdf3a.js +0 -1335
  577. /rasa/cli/project_templates/telco/domain/billing/{domain_undertand_bill.yml → understand_bill.yml} +0 -0
  578. /rasa/cli/project_templates/telco/domain/network/{domain_reboot_router.yml → reboot_router.yml} +0 -0
  579. /rasa/cli/project_templates/telco/domain/network/{domain_reset_router.yml → reset_router.yml} +0 -0
  580. /rasa/cli/project_templates/telco/domain/network/{domain_run_speed_test.yml → run_speed_test.yml} +0 -0
  581. /rasa/cli/project_templates/telco/domain/network/{domain_solve_internet_issue.yml → solve_internet_issue.yml} +0 -0
  582. {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/NOTICE +0 -0
  583. {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/WHEEL +0 -0
  584. {rasa_pro-3.14.0.dev20250901.dist-info → rasa_pro-3.14.0rc1.dist-info}/entry_points.txt +0 -0
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  import copy
5
+ import string
5
6
  import time
6
7
  from dataclasses import asdict, dataclass
7
8
  from typing import Any, AsyncIterator, Awaitable, Callable, Dict, List, Optional, Tuple
@@ -37,6 +38,7 @@ from rasa.core.channels.voice_stream.call_state import (
37
38
  )
38
39
  from rasa.core.channels.voice_stream.tts.azure import AzureTTS
39
40
  from rasa.core.channels.voice_stream.tts.cartesia import CartesiaTTS
41
+ from rasa.core.channels.voice_stream.tts.deepgram import DeepgramTTS
40
42
  from rasa.core.channels.voice_stream.tts.tts_cache import TTSCache
41
43
  from rasa.core.channels.voice_stream.tts.tts_engine import TTSEngine, TTSError
42
44
  from rasa.core.channels.voice_stream.util import (
@@ -53,6 +55,13 @@ from rasa.utils.io import remove_emojis
53
55
  logger = structlog.get_logger(__name__)
54
56
 
55
57
  # define constants for the voice channel
58
+ DEFAULT_INTERRUPTION_MIN_WORDS = 3
59
+
60
+
61
+ @dataclass
62
+ class InterruptionConfig:
63
+ enabled: bool = False
64
+ min_words: int = DEFAULT_INTERRUPTION_MIN_WORDS
56
65
 
57
66
 
58
67
  @dataclass
@@ -125,6 +134,8 @@ def tts_engine_from_config(tts_config: Dict) -> TTSEngine:
125
134
  return AzureTTS.from_config_dict(tts_config)
126
135
  elif name.lower() == "cartesia":
127
136
  return CartesiaTTS.from_config_dict(tts_config)
137
+ elif name.lower() == "deepgram":
138
+ return DeepgramTTS.from_config_dict(tts_config)
128
139
  else:
129
140
  mark_as_beta_feature("Custom TTS Engine")
130
141
  try:
@@ -270,6 +281,10 @@ class VoiceOutputChannel(OutputChannel):
270
281
  except (WebsocketClosed, ServerError):
271
282
  call_state.connection_failed = True
272
283
 
284
+ # Is the response interruptible?
285
+ allow_interruptions = kwargs.get("allow_interruptions", True)
286
+ call_state.channel_data["allow_interruptions"] = allow_interruptions
287
+
273
288
  if cached_audio_bytes:
274
289
  audio_stream = self.chunk_audio(cached_audio_bytes)
275
290
  else:
@@ -368,6 +383,7 @@ class VoiceInputChannel(InputChannel):
368
383
  server_url: str,
369
384
  asr_config: Dict,
370
385
  tts_config: Dict,
386
+ interruptions: Optional[Dict[str, Any]] = None,
371
387
  ):
372
388
  if self.requires_voice_license:
373
389
  validate_voice_license_scope()
@@ -376,12 +392,21 @@ class VoiceInputChannel(InputChannel):
376
392
  self.asr_config = asr_config
377
393
  self.tts_config = tts_config
378
394
  self.tts_cache = TTSCache(tts_config.get("cache_size", 1000))
395
+ if interruptions:
396
+ self.interruption_config = InterruptionConfig(**interruptions)
397
+ else:
398
+ self.interruption_config = InterruptionConfig()
399
+
400
+ if self.interruption_config.enabled:
401
+ mark_as_beta_feature(f"Interruption Handling in {self.name()}")
379
402
 
380
403
  logger.info(
381
404
  "voice_channel.initialized",
405
+ name=self.name(),
382
406
  server_url=self.server_url,
383
407
  asr_config=self.asr_config,
384
408
  tts_config=self.tts_config,
409
+ interruption_config=self.interruption_config,
385
410
  )
386
411
 
387
412
  def get_sender_id(self, call_parameters: CallParameters) -> str:
@@ -463,6 +488,43 @@ class VoiceInputChannel(InputChannel):
463
488
  """Map a channel input message to a voice channel action."""
464
489
  raise NotImplementedError
465
490
 
491
+ def should_interrupt(self, e: ASREvent) -> bool:
492
+ """Determine if the current ASR event should interrupt playback.
493
+ Returns True if the bot response is interruptible
494
+ And if the user spoke more than 3 words.
495
+
496
+ Arguments:
497
+ e: The ASR event to evaluate.
498
+
499
+ Returns:
500
+ True if the event should interrupt playback, False otherwise.
501
+ """
502
+ # Are interruptions are enabled for the channel?
503
+ if not self.interruption_config.enabled:
504
+ return False
505
+
506
+ # Is the bot response interruptible?
507
+ if not call_state.channel_data.get("allow_interruptions", True):
508
+ return False
509
+
510
+ # Did the user speak more than 3 words?
511
+ min_words = self.interruption_config.min_words
512
+ if isinstance(e, UserIsSpeaking):
513
+ translator = str.maketrans("", "", string.punctuation)
514
+ words = e.text.translate(translator).split()
515
+ return len(words) >= min_words
516
+ return False
517
+
518
+ async def interrupt_playback(
519
+ self, ws: Websocket, call_parameters: CallParameters
520
+ ) -> None:
521
+ """Interrupt the current playback of audio.
522
+
523
+ This function is used for interruption handling.
524
+ As not all channels support flushing bot audio buffer,
525
+ if a channel does not implement it. It has no effect."""
526
+ pass
527
+
466
528
  async def run_audio_streaming(
467
529
  self,
468
530
  on_new_message: Callable[[UserMessage], Awaitable[Any]],
@@ -598,6 +660,8 @@ class VoiceInputChannel(InputChannel):
598
660
  call_state.user_speech_start_time = time.time()
599
661
  self._cancel_silence_timeout_watcher()
600
662
  call_state.is_user_speaking = True
663
+ if self.should_interrupt(e):
664
+ await self.interrupt_playback(voice_websocket, call_parameters)
601
665
  elif isinstance(e, UserSilence):
602
666
  output_channel = self.create_output_channel(voice_websocket, tts_engine)
603
667
  message = UserMessage(
@@ -4,6 +4,7 @@ from collections import deque
4
4
  from typing import Deque, Optional, Text
5
5
 
6
6
  import structlog
7
+ from pydantic import ValidationError
7
8
 
8
9
  from rasa.core.lock import Ticket, TicketLock
9
10
  from rasa.core.lock_store import (
@@ -12,6 +13,12 @@ from rasa.core.lock_store import (
12
13
  LockError,
13
14
  LockStore,
14
15
  )
16
+ from rasa.core.redis_connection_factory import (
17
+ DeploymentMode,
18
+ RedisConfig,
19
+ RedisConnectionFactory,
20
+ )
21
+ from rasa.shared.exceptions import RasaException
15
22
  from rasa.utils.endpoints import EndpointConfig
16
23
 
17
24
  DEFAULT_REDIS_DB = 1
@@ -74,9 +81,10 @@ class ConcurrentRedisLockStore(LockStore):
74
81
  alphanumeric.
75
82
  socket_timeout - Timeout in seconds after which an exception will be raised
76
83
  in case Redis doesn't respond within `socket_timeout` seconds.
84
+ deployment_mode - Redis deployment mode: standard, cluster, or sentinel.
85
+ endpoints - List of endpoints for cluster/sentinel mode in host:port format.
86
+ sentinel_service - Sentinel service name.
77
87
  """
78
- import redis
79
-
80
88
  host = endpoint_config.kwargs.get("host", DEFAULT_HOSTNAME)
81
89
  port = endpoint_config.kwargs.get("port", DEFAULT_PORT)
82
90
  db = endpoint_config.kwargs.get("db", DEFAULT_REDIS_DB)
@@ -90,20 +98,33 @@ class ConcurrentRedisLockStore(LockStore):
90
98
  socket_timeout = endpoint_config.kwargs.get(
91
99
  "socket_timeout", DEFAULT_SOCKET_TIMEOUT_IN_SECONDS
92
100
  )
93
-
94
- self.red = redis.StrictRedis(
95
- host=host,
96
- port=int(port),
97
- db=int(db),
98
- username=username,
99
- password=password,
100
- ssl=use_ssl,
101
- ssl_certfile=ssl_certfile,
102
- ssl_keyfile=ssl_keyfile,
103
- ssl_ca_certs=ssl_ca_certs,
104
- socket_timeout=socket_timeout,
101
+ deployment_mode = endpoint_config.kwargs.get(
102
+ "deployment_mode", DeploymentMode.STANDARD.value
105
103
  )
104
+ endpoints = endpoint_config.kwargs.get("endpoints", [])
105
+ sentinel_service = endpoint_config.kwargs.get("sentinel_service")
106
106
 
107
+ try:
108
+ redis_config = RedisConfig(
109
+ host=host,
110
+ port=port,
111
+ db=db,
112
+ username=username,
113
+ password=password,
114
+ use_ssl=use_ssl,
115
+ ssl_certfile=ssl_certfile,
116
+ ssl_keyfile=ssl_keyfile,
117
+ ssl_ca_certs=ssl_ca_certs,
118
+ socket_timeout=socket_timeout,
119
+ deployment_mode=deployment_mode,
120
+ endpoints=endpoints,
121
+ sentinel_service=sentinel_service,
122
+ )
123
+ self.red = RedisConnectionFactory.create_connection(redis_config)
124
+ except ValidationError as e:
125
+ raise RasaException(f"Invalid Redis configuration: {e}")
126
+
127
+ self.deployment_mode = deployment_mode
107
128
  self.key_prefix = DEFAULT_CONCURRENT_REDIS_LOCK_STORE_KEY_PREFIX
108
129
  if key_prefix:
109
130
  structlogger.debug(
@@ -129,6 +150,32 @@ class ConcurrentRedisLockStore(LockStore):
129
150
  ),
130
151
  )
131
152
 
153
+ def _get_keys_by_pattern(self, pattern: Text) -> list:
154
+ """Get keys by pattern, using SCAN for cluster mode and KEYS for others."""
155
+ if self.deployment_mode == DeploymentMode.CLUSTER.value:
156
+ # In cluster mode, use SCAN to get keys more reliably
157
+ keys = []
158
+ cursor = 0
159
+
160
+ while True:
161
+ try:
162
+ cursor, batch_keys = self.red.scan(cursor, match=pattern, count=100)
163
+ keys.extend(batch_keys)
164
+ if cursor == 0:
165
+ break
166
+ except Exception as e:
167
+ structlogger.warning(
168
+ "concurrent_redis_lock_store._get_keys_by_pattern.scan_interrupted",
169
+ event_info=f"SCAN interrupted in cluster mode: {e}. "
170
+ f"Returning {len(keys)} keys found so far.",
171
+ )
172
+ break
173
+ else:
174
+ # Standard and sentinel modes use KEYS
175
+ keys = self.red.keys(pattern)
176
+
177
+ return keys
178
+
132
179
  def issue_ticket(
133
180
  self, conversation_id: Text, lock_lifetime: float = LOCK_LIFETIME
134
181
  ) -> int:
@@ -157,11 +204,14 @@ class ConcurrentRedisLockStore(LockStore):
157
204
  tickets: Deque[Ticket] = deque()
158
205
 
159
206
  pattern = self.key_prefix + conversation_id + ":" + "[0-9]*"
160
- redis_keys = self.red.keys(pattern)
207
+ redis_keys = self._get_keys_by_pattern(pattern)
161
208
 
162
209
  for key in redis_keys:
163
210
  serialised_ticket = self.red.get(key)
164
211
  if serialised_ticket:
212
+ # Handle bytes to string conversion for JSON parsing
213
+ if isinstance(serialised_ticket, bytes):
214
+ serialised_ticket = serialised_ticket.decode("utf-8")
165
215
  ticket = Ticket.from_dict(json.loads(serialised_ticket))
166
216
  tickets.appendleft(ticket)
167
217
 
@@ -172,7 +222,7 @@ class ConcurrentRedisLockStore(LockStore):
172
222
  def delete_lock(self, conversation_id: Text) -> None:
173
223
  """Deletes lock for conversation ID."""
174
224
  pattern = self.key_prefix + conversation_id + ":*"
175
- redis_keys = self.red.keys(pattern)
225
+ redis_keys = self._get_keys_by_pattern(pattern)
176
226
 
177
227
  if not redis_keys:
178
228
  structlogger.debug(
File without changes
@@ -1,9 +1,12 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import dataclasses
4
+ from pathlib import Path
4
5
  from typing import Any, Dict, List, Optional, Union
5
6
 
6
- from rasa.shared.constants import DEFAULT_ENDPOINTS_PATH
7
+ from pydantic import BaseModel, ConfigDict, Field, model_validator
8
+
9
+ from rasa.core.constants import MCP_SERVERS_KEY
7
10
  from rasa.shared.core.constants import (
8
11
  GLOBAL_SILENCE_TIMEOUT_DEFAULT_VALUE,
9
12
  GLOBAL_SILENCE_TIMEOUT_KEY,
@@ -57,14 +60,46 @@ class InteractionHandlingConfig:
57
60
  )
58
61
 
59
62
 
63
+ class MCPServerConfig(BaseModel):
64
+ model_config = ConfigDict(extra="allow")
65
+ name: str = Field(..., description="The name of the MCP server.")
66
+ url: str = Field(..., description="The URL of the MCP server.")
67
+ type: str = Field(..., description="The type of the MCP server.")
68
+ additional_params: Optional[Dict[str, Any]] = Field(
69
+ default_factory=dict, description="Additional parameters for the MCP server."
70
+ )
71
+
72
+ @model_validator(mode="after")
73
+ def validate_type(self) -> MCPServerConfig:
74
+ # validate that type is "http"
75
+ if self.type not in ["http", "https"]:
76
+ raise ValueError(f"Invalid MCP server type: {self.type}")
77
+ # validate that name and url are not empty
78
+ if not self.name or not self.url:
79
+ raise ValueError("Name and URL cannot be empty")
80
+ return self
81
+
82
+ @model_validator(mode="before")
83
+ def collect_additional_params(cls, values: Dict[str, Any]) -> Dict[str, Any]:
84
+ base_fields = {"name", "url", "type"}
85
+ extras = {k: v for k, v in values.items() if k not in base_fields}
86
+ if extras:
87
+ values["additional_params"] = extras
88
+ # remove them from top level so Pydantic doesn’t complain
89
+ for k in extras:
90
+ values.pop(k)
91
+ return values
92
+
93
+
60
94
  class AvailableEndpoints:
61
95
  """Collection of configured endpoints."""
62
96
 
63
97
  _instance = None
64
98
 
65
99
  @classmethod
66
- def read_endpoints(cls, endpoint_file: str) -> AvailableEndpoints:
100
+ def read_endpoints(cls, endpoint_file: Path) -> AvailableEndpoints:
67
101
  """Read the different endpoints from a yaml file."""
102
+
68
103
  nlg = read_endpoint_config(endpoint_file, endpoint_type="nlg")
69
104
  nlu = read_endpoint_config(endpoint_file, endpoint_type="nlu")
70
105
  action = read_endpoint_config(endpoint_file, endpoint_type="action_endpoint")
@@ -75,6 +110,14 @@ class AvailableEndpoints:
75
110
  lock_store = read_endpoint_config(endpoint_file, endpoint_type="lock_store")
76
111
  event_broker = read_endpoint_config(endpoint_file, endpoint_type="event_broker")
77
112
  vector_store = read_endpoint_config(endpoint_file, endpoint_type="vector_store")
113
+ raw_mcp_servers = read_property_config_from_endpoints_file(
114
+ endpoint_file, property_name=MCP_SERVERS_KEY
115
+ )
116
+ mcp_servers = (
117
+ [MCPServerConfig(**server) for server in raw_mcp_servers]
118
+ if raw_mcp_servers
119
+ else None
120
+ )
78
121
  model_groups = read_property_config_from_endpoints_file(
79
122
  endpoint_file, property_name="model_groups"
80
123
  )
@@ -89,6 +132,7 @@ class AvailableEndpoints:
89
132
  )
90
133
 
91
134
  return cls(
135
+ endpoint_file,
92
136
  nlg,
93
137
  nlu,
94
138
  action,
@@ -97,6 +141,7 @@ class AvailableEndpoints:
97
141
  lock_store,
98
142
  event_broker,
99
143
  vector_store,
144
+ mcp_servers,
100
145
  model_groups,
101
146
  privacy,
102
147
  interaction_handling,
@@ -104,6 +149,7 @@ class AvailableEndpoints:
104
149
 
105
150
  def __init__(
106
151
  self,
152
+ config_file_path: Optional[Path] = None,
107
153
  nlg: Optional[EndpointConfig] = None,
108
154
  nlu: Optional[EndpointConfig] = None,
109
155
  action: Optional[EndpointConfig] = None,
@@ -112,6 +158,7 @@ class AvailableEndpoints:
112
158
  lock_store: Optional[EndpointConfig] = None,
113
159
  event_broker: Optional[EndpointConfig] = None,
114
160
  vector_store: Optional[EndpointConfig] = None,
161
+ mcp_servers: Optional[List[MCPServerConfig]] = None,
115
162
  model_groups: Optional[List[Dict[str, Any]]] = None,
116
163
  privacy: Optional[Dict[str, Any]] = None,
117
164
  interaction_handling: InteractionHandlingConfig = InteractionHandlingConfig(
@@ -119,6 +166,7 @@ class AvailableEndpoints:
119
166
  ),
120
167
  ) -> None:
121
168
  """Create an `AvailableEndpoints` object."""
169
+ self.config_file_path = config_file_path
122
170
  self.model = model
123
171
  self.action = action
124
172
  self.nlu = nlu
@@ -127,20 +175,7 @@ class AvailableEndpoints:
127
175
  self.lock_store = lock_store
128
176
  self.event_broker = event_broker
129
177
  self.vector_store = vector_store
178
+ self.mcp_servers = mcp_servers
130
179
  self.model_groups = model_groups
131
180
  self.privacy = privacy
132
181
  self.interaction_handling = interaction_handling
133
-
134
- @classmethod
135
- def get_instance(
136
- cls, endpoint_file: Optional[str] = DEFAULT_ENDPOINTS_PATH
137
- ) -> AvailableEndpoints:
138
- """Get the singleton instance of AvailableEndpoints."""
139
- # Ensure that the instance is initialized only once.
140
- if cls._instance is None:
141
- cls._instance = cls.read_endpoints(endpoint_file)
142
- return cls._instance
143
-
144
- @classmethod
145
- def reset_instance(cls) -> None:
146
- cls._instance = None
@@ -0,0 +1,260 @@
1
+ from __future__ import annotations
2
+
3
+ import dataclasses
4
+ from pathlib import Path
5
+ from typing import Literal, Optional
6
+
7
+ import structlog
8
+
9
+ from rasa.cli.validation.config_path_validation import get_validated_path
10
+ from rasa.core.config.available_endpoints import AvailableEndpoints
11
+ from rasa.core.config.credentials import CredentialsConfig
12
+ from rasa.core.config.message_procesing_config import MessageProcessingConfig
13
+ from rasa.shared.constants import (
14
+ DEFAULT_CONFIG_PATH,
15
+ DEFAULT_CREDENTIALS_PATH,
16
+ DEFAULT_ENDPOINTS_PATH,
17
+ )
18
+
19
+ logger = structlog.get_logger(__name__)
20
+
21
+
22
+ @dataclasses.dataclass
23
+ class ValidatedConfigPaths:
24
+ credentials_path: Optional[Path] = None
25
+ endpoints_path: Optional[Path] = None
26
+ message_processing_config_path: Optional[Path] = None
27
+
28
+
29
+ @dataclasses.dataclass
30
+ class ConfigPath:
31
+ target: Optional[Path] = None
32
+ type: Literal["credentials", "endpoints", "config"] = "endpoints"
33
+ alternative_targets: list[Path] = dataclasses.field(default_factory=list)
34
+ default_path: str = ""
35
+
36
+ @staticmethod
37
+ def _validate(
38
+ config_path: ConfigPath, can_be_missing: bool = True
39
+ ) -> Optional[Path]:
40
+ validated_path = get_validated_path(
41
+ config_path.target,
42
+ config_path.type,
43
+ config_path.alternative_targets,
44
+ can_be_missing,
45
+ )
46
+
47
+ if validated_path is None and can_be_missing:
48
+ logger.debug(
49
+ f"No {config_path.type} configuration file found. "
50
+ f"Proceeding without {config_path.type} configuration."
51
+ )
52
+
53
+ if isinstance(validated_path, str):
54
+ validated_path = Path(validated_path)
55
+
56
+ return validated_path
57
+
58
+
59
+ @dataclasses.dataclass
60
+ class CredentialsConfigPath(ConfigPath):
61
+ def __init__(self, target: Optional[Path] = None):
62
+ super().__init__(
63
+ target=target,
64
+ type="credentials",
65
+ alternative_targets=[Path(DEFAULT_CREDENTIALS_PATH)],
66
+ default_path=DEFAULT_CREDENTIALS_PATH,
67
+ )
68
+
69
+ @staticmethod
70
+ def validate(
71
+ target_config_path: Optional[Path] = None, can_be_missing: bool = True
72
+ ) -> Optional[Path]:
73
+ config_path = CredentialsConfigPath(target=target_config_path)
74
+ return ConfigPath._validate(config_path, can_be_missing)
75
+
76
+ @staticmethod
77
+ def default_file_path() -> Path:
78
+ return Path(DEFAULT_CREDENTIALS_PATH)
79
+
80
+ @staticmethod
81
+ def at_path(
82
+ root_path: Path,
83
+ ) -> Path:
84
+ return root_path / CredentialsConfigPath.default_file_path()
85
+
86
+
87
+ @dataclasses.dataclass
88
+ class EndpointsConfigPath(ConfigPath):
89
+ def __init__(self, target: Optional[Path] = None):
90
+ super().__init__(
91
+ target=target,
92
+ type="endpoints",
93
+ alternative_targets=[Path(DEFAULT_ENDPOINTS_PATH)],
94
+ default_path=DEFAULT_ENDPOINTS_PATH,
95
+ )
96
+
97
+ @staticmethod
98
+ def validate(
99
+ target_config_path: Optional[Path] = None, can_be_missing: bool = True
100
+ ) -> Optional[Path]:
101
+ config_path = EndpointsConfigPath(target=target_config_path)
102
+ return ConfigPath._validate(config_path, can_be_missing)
103
+
104
+ @staticmethod
105
+ def default_file_path() -> Path:
106
+ return Path(DEFAULT_ENDPOINTS_PATH)
107
+
108
+ @staticmethod
109
+ def at_path(
110
+ root_path: Path,
111
+ ) -> Path:
112
+ return root_path / EndpointsConfigPath.default_file_path()
113
+
114
+
115
+ @dataclasses.dataclass
116
+ class MessageProcessingConfigPath(ConfigPath):
117
+ def __init__(self, target: Optional[Path] = None):
118
+ super().__init__(
119
+ target=target,
120
+ type="config",
121
+ alternative_targets=[Path(DEFAULT_CONFIG_PATH)],
122
+ default_path=DEFAULT_CONFIG_PATH,
123
+ )
124
+
125
+ @staticmethod
126
+ def validate(
127
+ target_config_path: Optional[Path] = None, can_be_missing: bool = True
128
+ ) -> Optional[Path]:
129
+ config_path = MessageProcessingConfigPath(target=target_config_path)
130
+ return ConfigPath._validate(config_path, can_be_missing)
131
+
132
+ @staticmethod
133
+ def default_file_path() -> Path:
134
+ return Path(DEFAULT_CONFIG_PATH)
135
+
136
+ @staticmethod
137
+ def at_path(
138
+ root_path: Path,
139
+ ) -> Path:
140
+ return root_path / MessageProcessingConfigPath.default_file_path()
141
+
142
+
143
+ class Configuration:
144
+ _instance: Optional[Configuration] = None
145
+
146
+ def __init__(
147
+ self,
148
+ endpoints: AvailableEndpoints,
149
+ credentials: Optional[CredentialsConfig] = None,
150
+ message_processing_config: Optional[MessageProcessingConfig] = None,
151
+ ):
152
+ self.credentials = credentials
153
+ self.endpoints = endpoints
154
+ self.message_processing_config = message_processing_config
155
+
156
+ @classmethod
157
+ def initialise_empty(cls) -> Configuration:
158
+ if cls._instance is None:
159
+ cls._instance = Configuration(
160
+ credentials=None,
161
+ endpoints=AvailableEndpoints(),
162
+ message_processing_config=None,
163
+ )
164
+ return cls._instance
165
+
166
+ @classmethod
167
+ def initialise_endpoints(cls, endpoints_path: Path) -> Configuration:
168
+ logger.debug(
169
+ "configuration.initialise_endpoints.start", endpoints_path=endpoints_path
170
+ )
171
+
172
+ validated_endpoints_path = EndpointsConfigPath.validate(endpoints_path)
173
+ endpoints = (
174
+ AvailableEndpoints.read_endpoints(validated_endpoints_path)
175
+ if validated_endpoints_path
176
+ else AvailableEndpoints()
177
+ )
178
+ if cls._instance is None:
179
+ cls._instance = Configuration(
180
+ endpoints=endpoints, credentials=None, message_processing_config=None
181
+ )
182
+ else:
183
+ cls._instance.endpoints = endpoints
184
+ return cls._instance
185
+
186
+ @classmethod
187
+ def initialise_empty_endpoints(cls) -> Configuration:
188
+ logger.debug("configuration.initialise_empty_endpoints.start")
189
+ if cls._instance is None:
190
+ cls._instance = Configuration(
191
+ endpoints=AvailableEndpoints(),
192
+ credentials=None,
193
+ message_processing_config=None,
194
+ )
195
+ else:
196
+ cls._instance.endpoints = AvailableEndpoints()
197
+ return cls._instance
198
+
199
+ @classmethod
200
+ def initialise_message_processing(
201
+ cls, message_processing_config_path: Path
202
+ ) -> Configuration:
203
+ logger.debug(
204
+ "configuration.initialise_message_processing.start",
205
+ message_processing_config_path=message_processing_config_path,
206
+ )
207
+ validated_message_processing_path = MessageProcessingConfigPath.validate(
208
+ message_processing_config_path
209
+ )
210
+ message_processing_config = (
211
+ MessageProcessingConfig.load_from_file(validated_message_processing_path)
212
+ if validated_message_processing_path
213
+ else None
214
+ )
215
+ if cls._instance is None:
216
+ cls._instance = Configuration(
217
+ message_processing_config=message_processing_config,
218
+ credentials=None,
219
+ endpoints=AvailableEndpoints(),
220
+ )
221
+ else:
222
+ cls._instance.message_processing_config = message_processing_config
223
+ return cls._instance
224
+
225
+ @classmethod
226
+ def initialise_credentials(cls, credentials_path: Path) -> Configuration:
227
+ logger.debug(
228
+ "configuration.initialise_credentials.start",
229
+ credentials_path=credentials_path,
230
+ )
231
+
232
+ validated_credentials_path = CredentialsConfigPath.validate(credentials_path)
233
+
234
+ credentials = (
235
+ CredentialsConfig.load_from_file(validated_credentials_path)
236
+ if validated_credentials_path
237
+ else None
238
+ )
239
+ if cls._instance is None:
240
+ cls._instance = Configuration(
241
+ credentials=credentials,
242
+ endpoints=AvailableEndpoints(),
243
+ message_processing_config=None,
244
+ )
245
+ else:
246
+ cls._instance.credentials = credentials
247
+ return cls._instance
248
+
249
+ @classmethod
250
+ def get_instance(cls) -> Configuration:
251
+ if cls._instance is None:
252
+ raise Exception(
253
+ "Configuration not initialized. "
254
+ "Call appropriate 'initialise' methods to "
255
+ "load the config when Rasa Pro starts: "
256
+ "initialise_endpoints(), "
257
+ "initialise_credentials(), "
258
+ "initialise_message_processing()"
259
+ )
260
+ return cls._instance
@@ -0,0 +1,19 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+ from typing import Any, Dict
5
+
6
+ from rasa.shared.utils.yaml import read_config_file
7
+
8
+
9
+ class CredentialsConfig:
10
+ def __init__(
11
+ self, channels: Dict[str, Dict[str, Any]], config_file_path: Path
12
+ ) -> None:
13
+ self.channels = channels
14
+ self.config_file_path = config_file_path
15
+
16
+ @classmethod
17
+ def load_from_file(cls, file_path: Path) -> CredentialsConfig:
18
+ credentials_dict = read_config_file(file_path)
19
+ return cls(credentials_dict, file_path)