rasa-pro 3.14.0.dev20250825__py3-none-any.whl → 3.14.0.dev20250922__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 (351) hide show
  1. rasa/builder/README.md +120 -0
  2. rasa/builder/__init__.py +0 -0
  3. rasa/builder/auth.py +176 -0
  4. rasa/builder/config.py +92 -0
  5. rasa/builder/copilot/__init__.py +0 -0
  6. rasa/builder/copilot/constants.py +31 -0
  7. rasa/builder/copilot/copilot.py +450 -0
  8. rasa/builder/copilot/copilot_response_handler.py +522 -0
  9. rasa/builder/copilot/copilot_templated_message_provider.py +58 -0
  10. rasa/builder/copilot/exceptions.py +32 -0
  11. rasa/builder/copilot/models.py +500 -0
  12. rasa/builder/copilot/prompts/__init__.py +0 -0
  13. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +766 -0
  14. rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +61 -0
  15. rasa/builder/copilot/signing.py +305 -0
  16. rasa/builder/copilot/telemetry.py +226 -0
  17. rasa/builder/copilot/templated_messages/__init__.py +0 -0
  18. rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +16 -0
  19. rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +38 -0
  20. rasa/builder/document_retrieval/__init__.py +0 -0
  21. rasa/builder/document_retrieval/constants.py +15 -0
  22. rasa/builder/document_retrieval/inkeep-rag-response-schema.json +64 -0
  23. rasa/builder/document_retrieval/inkeep_document_retrieval.py +238 -0
  24. rasa/builder/document_retrieval/models.py +62 -0
  25. rasa/builder/download.py +140 -0
  26. rasa/builder/exceptions.py +91 -0
  27. rasa/builder/guardrails/__init__.py +1 -0
  28. rasa/builder/guardrails/constants.py +9 -0
  29. rasa/builder/guardrails/exceptions.py +4 -0
  30. rasa/builder/guardrails/lakera.py +206 -0
  31. rasa/builder/guardrails/models.py +231 -0
  32. rasa/builder/guardrails/store.py +238 -0
  33. rasa/builder/guardrails/utils.py +328 -0
  34. rasa/builder/job_manager.py +87 -0
  35. rasa/builder/jobs.py +282 -0
  36. rasa/builder/llm_service.py +246 -0
  37. rasa/builder/logging_utils.py +265 -0
  38. rasa/builder/main.py +234 -0
  39. rasa/builder/models.py +216 -0
  40. rasa/builder/project_generator.py +458 -0
  41. rasa/builder/project_info.py +72 -0
  42. rasa/builder/scrape_rasa_docs.py +97 -0
  43. rasa/builder/service.py +1350 -0
  44. rasa/builder/shared/tracker_context.py +212 -0
  45. rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
  46. rasa/builder/template_cache.py +69 -0
  47. rasa/builder/training_service.py +194 -0
  48. rasa/builder/validation_service.py +97 -0
  49. rasa/cli/project_templates/basic/README.md +23 -0
  50. rasa/cli/project_templates/basic/actions/__init__ +0 -0
  51. rasa/cli/project_templates/basic/actions/action_human_handoff.py +40 -0
  52. rasa/cli/project_templates/basic/actions/actions.md +10 -0
  53. rasa/cli/project_templates/basic/config.yml +29 -0
  54. rasa/cli/project_templates/basic/credentials.yml +33 -0
  55. rasa/cli/project_templates/basic/data/data.md +8 -0
  56. rasa/cli/project_templates/basic/data/general/feedback.yml +21 -0
  57. rasa/cli/project_templates/basic/data/general/goodbye.yml +6 -0
  58. rasa/cli/project_templates/basic/data/general/hello.yml +6 -0
  59. rasa/cli/project_templates/basic/data/general/help.yml +6 -0
  60. rasa/cli/project_templates/basic/data/general/human_handoff.yml +16 -0
  61. rasa/cli/project_templates/basic/data/general/show_faqs.yml +6 -0
  62. rasa/cli/project_templates/basic/data/system/patterns/pattern_cannot_handle.yml +7 -0
  63. rasa/cli/project_templates/basic/data/system/patterns/pattern_completed.yml +7 -0
  64. rasa/cli/project_templates/basic/data/system/patterns/pattern_correction.yml +7 -0
  65. rasa/cli/project_templates/basic/data/system/patterns/pattern_search.yml +8 -0
  66. rasa/cli/project_templates/basic/data/system/patterns/pattern_session_start.yml +8 -0
  67. rasa/cli/project_templates/basic/docs/docs.md +5 -0
  68. rasa/cli/project_templates/basic/docs/template.txt +28 -0
  69. rasa/cli/project_templates/basic/domain/domain.md +11 -0
  70. rasa/cli/project_templates/basic/domain/general/feedback.yml +25 -0
  71. rasa/cli/project_templates/basic/domain/general/goodbye.yml +9 -0
  72. rasa/cli/project_templates/basic/domain/general/hello.yml +7 -0
  73. rasa/cli/project_templates/basic/domain/general/help.yml +21 -0
  74. rasa/cli/project_templates/basic/domain/general/human_handoff.yml +32 -0
  75. rasa/cli/project_templates/basic/domain/general/show_faqs.yml +14 -0
  76. rasa/cli/project_templates/basic/domain/system/patterns/pattern_cannot_handle.yml +5 -0
  77. rasa/cli/project_templates/basic/domain/system/patterns/pattern_session_start.yml +19 -0
  78. rasa/cli/project_templates/basic/endpoints.yml +67 -0
  79. rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
  80. rasa/cli/project_templates/default/config.yml +4 -0
  81. rasa/cli/project_templates/default/endpoints.yml +4 -0
  82. rasa/cli/project_templates/finance/README.md +26 -0
  83. rasa/cli/project_templates/finance/actions/__init__.py +0 -0
  84. rasa/cli/project_templates/finance/actions/accounts/__init__.py +0 -0
  85. rasa/cli/project_templates/finance/actions/accounts/check_balance.py +18 -0
  86. rasa/cli/project_templates/finance/actions/actions.md +15 -0
  87. rasa/cli/project_templates/finance/actions/cards/__init__.py +0 -0
  88. rasa/cli/project_templates/finance/actions/cards/check_that_card_exists.py +21 -0
  89. rasa/cli/project_templates/finance/actions/cards/list_cards.py +22 -0
  90. rasa/cli/project_templates/finance/actions/contacts/__init__.py +0 -0
  91. rasa/cli/project_templates/finance/actions/contacts/add_contact.py +30 -0
  92. rasa/cli/project_templates/finance/actions/contacts/list_contacts.py +22 -0
  93. rasa/cli/project_templates/finance/actions/contacts/remove_contact.py +35 -0
  94. rasa/cli/project_templates/finance/actions/db.py +117 -0
  95. rasa/cli/project_templates/finance/actions/general/__init__.py +0 -0
  96. rasa/cli/project_templates/finance/actions/general/action_human_handoff.py +49 -0
  97. rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
  98. rasa/cli/project_templates/finance/actions/transfers/check_transfer_funds.py +27 -0
  99. rasa/cli/project_templates/finance/actions/transfers/check_transfer_limit.py +36 -0
  100. rasa/cli/project_templates/finance/actions/transfers/execute_recurrent_payment.py +20 -0
  101. rasa/cli/project_templates/finance/actions/transfers/execute_transfer.py +45 -0
  102. rasa/cli/project_templates/finance/actions/transfers/list_transactions.py +32 -0
  103. rasa/cli/project_templates/finance/config.yml +29 -0
  104. rasa/cli/project_templates/finance/credentials.yml +33 -0
  105. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +9 -0
  106. rasa/cli/project_templates/finance/data/accounts/download_statements.yml +26 -0
  107. rasa/cli/project_templates/finance/data/bills/bill_pay_reminder.yml +25 -0
  108. rasa/cli/project_templates/finance/data/cards/activate_card.yml +35 -0
  109. rasa/cli/project_templates/finance/data/cards/block_card.yml +45 -0
  110. rasa/cli/project_templates/finance/data/cards/list_cards.yml +14 -0
  111. rasa/cli/project_templates/finance/data/cards/replace_card.yml +16 -0
  112. rasa/cli/project_templates/finance/data/cards/replace_eligible_card.yml +29 -0
  113. rasa/cli/project_templates/finance/data/contacts/add_contact.yml +33 -0
  114. rasa/cli/project_templates/finance/data/contacts/list_contacts.yml +14 -0
  115. rasa/cli/project_templates/finance/data/contacts/remove_contact.yml +31 -0
  116. rasa/cli/project_templates/finance/data/data.md +14 -0
  117. rasa/cli/project_templates/finance/data/general/bot_challenge.yml +6 -0
  118. rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
  119. rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
  120. rasa/cli/project_templates/finance/data/general/hello.yml +6 -0
  121. rasa/cli/project_templates/finance/data/general/help.yml +9 -0
  122. rasa/cli/project_templates/finance/data/general/human_handoff.yml +16 -0
  123. rasa/cli/project_templates/finance/data/general/welcome.yml +9 -0
  124. rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +7 -0
  125. rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +7 -0
  126. rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +8 -0
  127. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +8 -0
  128. rasa/cli/project_templates/finance/data/transfers/check_transfer_limit.yml +18 -0
  129. rasa/cli/project_templates/finance/data/transfers/list_transactions.yml +46 -0
  130. rasa/cli/project_templates/finance/data/transfers/move_money_between_accounts.yml +51 -0
  131. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +34 -0
  132. rasa/cli/project_templates/finance/data/transfers/transfer_money_to_a_third_party.yml +175 -0
  133. rasa/cli/project_templates/finance/db/cards.json +18 -0
  134. rasa/cli/project_templates/finance/db/contacts.json +10 -0
  135. rasa/cli/project_templates/finance/db/my_account.json +6 -0
  136. rasa/cli/project_templates/finance/db/transactions.json +22 -0
  137. rasa/cli/project_templates/finance/docs/docs.md +8 -0
  138. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/budgeting_analytics.txt +22 -0
  139. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/multi_currency_accounts.txt +19 -0
  140. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/premium_benefits.txt +19 -0
  141. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/contactless_limits.txt +16 -0
  142. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/freeze_unfreeze_card.txt +16 -0
  143. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/lost_stolen_card.txt +19 -0
  144. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/instant_payments.txt +19 -0
  145. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/international_transfers.txt +19 -0
  146. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/fraud_protection.txt +22 -0
  147. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/secure_payments.txt +22 -0
  148. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +15 -0
  149. rasa/cli/project_templates/finance/domain/accounts/download_statements.yml +40 -0
  150. rasa/cli/project_templates/finance/domain/bills/bill_pay_reminder.yml +49 -0
  151. rasa/cli/project_templates/finance/domain/cards/activate_card.yml +24 -0
  152. rasa/cli/project_templates/finance/domain/cards/block_card.yml +44 -0
  153. rasa/cli/project_templates/finance/domain/cards/list_cards.yml +16 -0
  154. rasa/cli/project_templates/finance/domain/cards/replace_card.yml +43 -0
  155. rasa/cli/project_templates/finance/domain/cards/shared.yml +15 -0
  156. rasa/cli/project_templates/finance/domain/contacts/add_contact.yml +37 -0
  157. rasa/cli/project_templates/finance/domain/contacts/list_contacts.yml +16 -0
  158. rasa/cli/project_templates/finance/domain/contacts/remove_contact.yml +32 -0
  159. rasa/cli/project_templates/finance/domain/domain.md +18 -0
  160. rasa/cli/project_templates/finance/domain/general/_shared.yml +39 -0
  161. rasa/cli/project_templates/finance/domain/general/bot_challenge.yml +4 -0
  162. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +8 -0
  163. rasa/cli/project_templates/finance/domain/general/feedback.yml +25 -0
  164. rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
  165. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +31 -0
  166. rasa/cli/project_templates/finance/domain/general/welcome.yml +39 -0
  167. rasa/cli/project_templates/finance/domain/transfers/check_transfer_limit.yml +32 -0
  168. rasa/cli/project_templates/finance/domain/transfers/list_transactions.yml +44 -0
  169. rasa/cli/project_templates/finance/domain/transfers/shared.yml +17 -0
  170. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +221 -0
  171. rasa/cli/project_templates/finance/endpoints.yml +67 -0
  172. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
  173. rasa/cli/project_templates/finance/tests/e2e_test_cases/accounts/check_balance.yml +9 -0
  174. rasa/cli/project_templates/finance/tests/e2e_test_cases/accounts/download_statements.yml +43 -0
  175. rasa/cli/project_templates/finance/tests/e2e_test_cases/cards/block_card.yml +55 -0
  176. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
  177. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/feedback.yml +46 -0
  178. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/goodbye.yml +9 -0
  179. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/hello.yml +8 -0
  180. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/human_handoff.yml +35 -0
  181. rasa/cli/project_templates/finance/tests/e2e_test_cases/general/patterns.yml +22 -0
  182. rasa/cli/project_templates/finance/tests/e2e_test_cases/transfers/transfer_money.yml +56 -0
  183. rasa/cli/project_templates/telco/README.md +25 -0
  184. rasa/cli/project_templates/telco/actions/__init__.py +0 -0
  185. rasa/cli/project_templates/telco/actions/actions.md +12 -0
  186. rasa/cli/project_templates/telco/actions/billing/__init__.py +0 -0
  187. rasa/cli/project_templates/telco/actions/billing/actions_billing.py +204 -0
  188. rasa/cli/project_templates/telco/actions/general/__init__.py +0 -0
  189. rasa/cli/project_templates/telco/actions/general/action_human_handoff.py +49 -0
  190. rasa/cli/project_templates/telco/actions/network/__init__.py +0 -0
  191. rasa/cli/project_templates/telco/actions/network/actions_get_data_from_db.py +48 -0
  192. rasa/cli/project_templates/telco/actions/network/actions_run_diagnostics.py +28 -0
  193. rasa/cli/project_templates/telco/actions/network/actions_session_start.py +18 -0
  194. rasa/cli/project_templates/telco/config.yml +29 -0
  195. rasa/cli/project_templates/telco/credentials.yml +33 -0
  196. rasa/cli/project_templates/telco/csvs/billing.csv +19 -0
  197. rasa/cli/project_templates/telco/csvs/customers.csv +5 -0
  198. rasa/cli/project_templates/telco/data/billing/flow_understand_bill.yml +45 -0
  199. rasa/cli/project_templates/telco/data/data.md +11 -0
  200. rasa/cli/project_templates/telco/data/general/bot_challenge.yml +6 -0
  201. rasa/cli/project_templates/telco/data/general/feedback.yml +20 -0
  202. rasa/cli/project_templates/telco/data/general/goodbye.yml +6 -0
  203. rasa/cli/project_templates/telco/data/general/hello.yml +6 -0
  204. rasa/cli/project_templates/telco/data/general/human_handoff.yml +16 -0
  205. rasa/cli/project_templates/telco/data/general/patterns.yml +30 -0
  206. rasa/cli/project_templates/telco/data/network/flow_reboot_router.yml +8 -0
  207. rasa/cli/project_templates/telco/data/network/flow_reset_router.yml +7 -0
  208. rasa/cli/project_templates/telco/data/network/flow_solve_internet_issue.yml +73 -0
  209. rasa/cli/project_templates/telco/docs/docs.md +8 -0
  210. rasa/cli/project_templates/telco/docs/network/reset_vs_rboot_router.txt +1 -0
  211. rasa/cli/project_templates/telco/docs/network/restart_router.txt +6 -0
  212. rasa/cli/project_templates/telco/docs/network/run_speed_test.txt +6 -0
  213. rasa/cli/project_templates/telco/domain/billing/understand_bill.yml +102 -0
  214. rasa/cli/project_templates/telco/domain/domain.md +13 -0
  215. rasa/cli/project_templates/telco/domain/general/bot_challenge.yml +4 -0
  216. rasa/cli/project_templates/telco/domain/general/feedback.yml +25 -0
  217. rasa/cli/project_templates/telco/domain/general/goodbye.yml +7 -0
  218. rasa/cli/project_templates/telco/domain/general/hello.yml +5 -0
  219. rasa/cli/project_templates/telco/domain/general/human_handoff.yml +26 -0
  220. rasa/cli/project_templates/telco/domain/general/patterns.yml +33 -0
  221. rasa/cli/project_templates/telco/domain/network/reboot_router.yml +21 -0
  222. rasa/cli/project_templates/telco/domain/network/reset_router.yml +12 -0
  223. rasa/cli/project_templates/telco/domain/network/run_speed_test.yml +25 -0
  224. rasa/cli/project_templates/telco/domain/network/solve_internet_issue.yml +75 -0
  225. rasa/cli/project_templates/telco/domain/shared.yml +129 -0
  226. rasa/cli/project_templates/telco/endpoints.yml +67 -0
  227. rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +40 -0
  228. rasa/cli/project_templates/telco/tests/e2e_test_cases/billing/understand_bill.yml +67 -0
  229. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
  230. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/feedback.yml +46 -0
  231. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/goodbye.yml +9 -0
  232. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/hello.yml +8 -0
  233. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/human_handoff.yml +35 -0
  234. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/patterns.yml +23 -0
  235. rasa/cli/project_templates/telco/tests/e2e_test_cases/network/solve_internet_issue.yml +57 -0
  236. rasa/cli/project_templates/tutorial/config.yml +2 -1
  237. rasa/cli/scaffold.py +46 -2
  238. rasa/core/actions/action.py +0 -1
  239. rasa/core/actions/action_run_slot_rejections.py +1 -1
  240. rasa/core/actions/direct_custom_actions_executor.py +9 -2
  241. rasa/core/brokers/broker.py +1 -1
  242. rasa/core/brokers/kafka.py +52 -8
  243. rasa/core/channels/development_inspector.py +1 -21
  244. rasa/core/channels/hangouts.py +2 -2
  245. rasa/core/channels/inspector/dist/assets/{arc-1ddec37b.js → arc-35222594.js} +1 -1
  246. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-18af387c.js → blockDiagram-38ab4fdb-a0efbfd3.js} +1 -1
  247. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-250127a3.js → c4Diagram-3d4e48cf-0584c0f2.js} +1 -1
  248. rasa/core/channels/inspector/dist/assets/channel-8e08bed9.js +1 -0
  249. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-c3388b34.js → classDiagram-70f12bd4-39f40dbe.js} +1 -1
  250. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-9c893a82.js → classDiagram-v2-f2320105-1ad755f3.js} +1 -1
  251. rasa/core/channels/inspector/dist/assets/clone-78c82dea.js +1 -0
  252. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-c111213b.js → createText-2e5e7dd3-b0f4f0fe.js} +1 -1
  253. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-812a729d.js → edges-e0da2a9e-9039bff9.js} +1 -1
  254. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-fd5051bc.js → erDiagram-9861fffd-65c9b127.js} +1 -1
  255. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-3287ac02.js → flowDb-956e92f1-4f08b38e.js} +1 -1
  256. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-692fb0b2.js → flowDiagram-66a62f08-e95c362a.js} +1 -1
  257. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-2b08f601.js +1 -0
  258. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-008376f1.js → flowchart-elk-definition-4a651766-703c3015.js} +1 -1
  259. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-df330a69.js → ganttDiagram-c361ad54-699328ea.js} +1 -1
  260. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-e03676fb.js → gitGraphDiagram-72cf32ee-04cf4b05.js} +1 -1
  261. rasa/core/channels/inspector/dist/assets/{graph-46fad2ba.js → graph-ee94449e.js} +1 -1
  262. rasa/core/channels/inspector/dist/assets/{index-3862675e-a484ac55.js → index-3862675e-940162b4.js} +1 -1
  263. rasa/core/channels/inspector/dist/assets/{index-a003633f.js → index-c941dcb3.js} +239 -238
  264. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-3f9e6ec2.js → infoDiagram-f8f76790-c79c2866.js} +1 -1
  265. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-79f72383.js → journeyDiagram-49397b02-84489d30.js} +1 -1
  266. rasa/core/channels/inspector/dist/assets/{layout-aad098e5.js → layout-a9aa9858.js} +1 -1
  267. rasa/core/channels/inspector/dist/assets/{line-219ab7ae.js → line-eb73cf26.js} +1 -1
  268. rasa/core/channels/inspector/dist/assets/{linear-2cddbe62.js → linear-b3399f9a.js} +1 -1
  269. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-1d41ed99.js → mindmap-definition-fc14e90a-b095bf1a.js} +1 -1
  270. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-cc496ee8.js → pieDiagram-8a3498a8-07644b66.js} +1 -1
  271. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-84d32884.js → quadrantDiagram-120e2f19-573a3f9c.js} +1 -1
  272. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-c0deb984.js → requirementDiagram-deff3bca-d457e1e1.js} +1 -1
  273. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-b9d7fd62.js → sankeyDiagram-04a897e0-9d26e1a2.js} +1 -1
  274. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-7d517565.js → sequenceDiagram-704730f1-3a9cde10.js} +1 -1
  275. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-98ef9b27.js → stateDiagram-587899a1-4f3e8cec.js} +1 -1
  276. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-cee70748.js → stateDiagram-v2-d93cdb3a-e617e5bf.js} +1 -1
  277. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-3f9d1c96.js → styles-6aaf32cf-eab30d2f.js} +1 -1
  278. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-67471923.js → styles-9a916d00-09994be2.js} +1 -1
  279. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-bd093fb7.js → styles-c10674c1-b7110364.js} +1 -1
  280. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-675794e8.js → svgDrawCommon-08f97a94-3ebc92ad.js} +1 -1
  281. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-0ac67617.js → timeline-definition-85554ec2-7d13d2f2.js} +1 -1
  282. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-c018dc37.js → xychartDiagram-e933f94c-488385e1.js} +1 -1
  283. rasa/core/channels/inspector/dist/index.html +2 -2
  284. rasa/core/channels/inspector/index.html +1 -1
  285. rasa/core/channels/inspector/src/App.tsx +15 -42
  286. rasa/core/channels/inspector/src/components/Chat.tsx +2 -3
  287. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +20 -3
  288. rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +63 -35
  289. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +14 -0
  290. rasa/core/channels/inspector/src/types.ts +32 -7
  291. rasa/core/channels/studio_chat.py +43 -43
  292. rasa/core/channels/voice_stream/asr/asr_event.py +1 -1
  293. rasa/core/channels/voice_stream/asr/azure.py +6 -3
  294. rasa/core/channels/voice_stream/asr/deepgram.py +1 -1
  295. rasa/core/channels/voice_stream/audiocodes.py +3 -0
  296. rasa/core/channels/voice_stream/browser_audio.py +55 -3
  297. rasa/core/channels/voice_stream/genesys.py +2 -1
  298. rasa/core/channels/voice_stream/jambonz.py +9 -1
  299. rasa/core/channels/voice_stream/twilio_media_streams.py +16 -0
  300. rasa/core/channels/voice_stream/voice_channel.py +61 -0
  301. rasa/core/concurrent_lock_store.py +66 -16
  302. rasa/core/constants.py +7 -0
  303. rasa/core/iam_credentials_providers/__init__.py +0 -0
  304. rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +226 -0
  305. rasa/core/iam_credentials_providers/credentials_provider_protocol.py +90 -0
  306. rasa/core/lock_store.py +46 -10
  307. rasa/core/nlg/generator.py +1 -1
  308. rasa/core/policies/enterprise_search_policy.py +4 -7
  309. rasa/core/policies/flows/flow_executor.py +9 -2
  310. rasa/core/processor.py +32 -0
  311. rasa/core/redis_connection_factory.py +469 -0
  312. rasa/core/tracker_stores/redis_tracker_store.py +32 -14
  313. rasa/core/tracker_stores/sql_tracker_store.py +57 -1
  314. rasa/dialogue_understanding/generator/flow_retrieval.py +10 -9
  315. rasa/engine/graph.py +5 -1
  316. rasa/engine/loader.py +12 -0
  317. rasa/engine/storage/local_model_storage.py +83 -3
  318. rasa/model_manager/model_api.py +1 -2
  319. rasa/model_manager/runner_service.py +1 -1
  320. rasa/model_manager/socket_bridge.py +1 -2
  321. rasa/model_manager/trainer_service.py +12 -9
  322. rasa/model_manager/utils.py +1 -29
  323. rasa/model_manager/warm_rasa_process.py +13 -3
  324. rasa/shared/core/constants.py +1 -0
  325. rasa/shared/core/domain.py +62 -15
  326. rasa/shared/core/events.py +2 -0
  327. rasa/shared/core/flows/flow.py +1 -1
  328. rasa/shared/core/flows/flow_step.py +7 -1
  329. rasa/shared/core/flows/steps/call.py +8 -1
  330. rasa/shared/core/flows/yaml_flows_io.py +16 -8
  331. rasa/shared/core/slots.py +4 -0
  332. rasa/shared/importers/importer.py +6 -0
  333. rasa/shared/importers/utils.py +77 -1
  334. rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
  335. rasa/studio/upload.py +12 -46
  336. rasa/telemetry.py +97 -23
  337. rasa/utils/io.py +27 -9
  338. rasa/utils/json_utils.py +6 -1
  339. rasa/utils/log_utils.py +5 -1
  340. rasa/utils/openapi.py +144 -0
  341. rasa/utils/pypred.py +38 -0
  342. rasa/validator.py +19 -11
  343. rasa/version.py +1 -1
  344. {rasa_pro-3.14.0.dev20250825.dist-info → rasa_pro-3.14.0.dev20250922.dist-info}/METADATA +27 -25
  345. {rasa_pro-3.14.0.dev20250825.dist-info → rasa_pro-3.14.0.dev20250922.dist-info}/RECORD +348 -109
  346. rasa/core/channels/inspector/dist/assets/channel-59f6d54b.js +0 -1
  347. rasa/core/channels/inspector/dist/assets/clone-26177ddb.js +0 -1
  348. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-29c03f5a.js +0 -1
  349. {rasa_pro-3.14.0.dev20250825.dist-info → rasa_pro-3.14.0.dev20250922.dist-info}/NOTICE +0 -0
  350. {rasa_pro-3.14.0.dev20250825.dist-info → rasa_pro-3.14.0.dev20250922.dist-info}/WHEEL +0 -0
  351. {rasa_pro-3.14.0.dev20250825.dist-info → rasa_pro-3.14.0.dev20250922.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,469 @@
1
+ import os
2
+ from enum import Enum
3
+ from typing import Any, Dict, List, Optional, Text, Tuple, Union
4
+
5
+ import redis
6
+ import structlog
7
+ from pydantic import BaseModel, ConfigDict
8
+
9
+ from rasa.core.constants import AWS_ELASTICACHE_CLUSTER_NAME_ENV_VAR_NAME
10
+ from rasa.core.iam_credentials_providers.credentials_provider_protocol import (
11
+ IAMCredentialsProvider,
12
+ IAMCredentialsProviderInput,
13
+ SupportedServiceType,
14
+ create_iam_credentials_provider,
15
+ )
16
+ from rasa.shared.exceptions import ConnectionException, RasaException
17
+
18
+ structlogger = structlog.getLogger(__name__)
19
+
20
+ DEFAULT_SOCKET_TIMEOUT_IN_SECONDS = 10
21
+
22
+
23
+ class DeploymentMode(Enum):
24
+ """Supported Redis deployment modes."""
25
+
26
+ STANDARD = "standard"
27
+ CLUSTER = "cluster"
28
+ SENTINEL = "sentinel"
29
+
30
+
31
+ class StandardRedisConfig(BaseModel):
32
+ """Base configuration for Redis connections."""
33
+
34
+ model_config = ConfigDict(arbitrary_types_allowed=True)
35
+
36
+ host: Text = "localhost"
37
+ port: int = 6379
38
+ username: Optional[Text] = None
39
+ password: Optional[Text] = None
40
+ use_ssl: bool = False
41
+ ssl_keyfile: Optional[Text] = None
42
+ ssl_certfile: Optional[Text] = None
43
+ ssl_ca_certs: Optional[Text] = None
44
+ db: int = 0
45
+ socket_timeout: float = DEFAULT_SOCKET_TIMEOUT_IN_SECONDS
46
+ decode_responses: bool = False
47
+ iam_credentials_provider: Optional[IAMCredentialsProvider] = None
48
+
49
+
50
+ class ClusterRedisConfig(StandardRedisConfig):
51
+ """Configuration for Redis Cluster connections."""
52
+
53
+ endpoints: List[Tuple[Text, int]]
54
+
55
+
56
+ class SentinelRedisConfig(StandardRedisConfig):
57
+ """Configuration for Redis Sentinel connections."""
58
+
59
+ endpoints: List[Tuple[Text, int]]
60
+ sentinel_service: Optional[Text] = "mymaster"
61
+
62
+
63
+ class RedisConfig(BaseModel):
64
+ """Base configuration for Redis connections."""
65
+
66
+ host: Text = "localhost"
67
+ port: int = 6379
68
+ username: Optional[Text] = None
69
+ password: Optional[Text] = None
70
+ use_ssl: bool = False
71
+ ssl_keyfile: Optional[Text] = None
72
+ ssl_certfile: Optional[Text] = None
73
+ ssl_ca_certs: Optional[Text] = None
74
+ db: int = 0
75
+ socket_timeout: float = DEFAULT_SOCKET_TIMEOUT_IN_SECONDS
76
+ decode_responses: bool = False
77
+ deployment_mode: Text = DeploymentMode.STANDARD.value
78
+ endpoints: Optional[List[Text]] = None
79
+ sentinel_service: Optional[Text] = None
80
+
81
+
82
+ class RedisConnectionFactory:
83
+ """Factory class for creating Redis connections with different modes."""
84
+
85
+ @classmethod
86
+ def create_connection(
87
+ cls,
88
+ config: RedisConfig,
89
+ ) -> Union[redis.Redis, redis.RedisCluster]:
90
+ """Create a Redis connection based on the configuration.
91
+
92
+ Args:
93
+ config: Redis configuration object containing all connection parameters.
94
+
95
+ Returns:
96
+ A Redis connection - either a standard Redis connection, a RedisCluster
97
+ connection, or a Redis master connection managed by Sentinel.
98
+
99
+ Raises:
100
+ RasaException: If configuration is invalid.
101
+ """
102
+ if config.endpoints is None:
103
+ config.endpoints = []
104
+
105
+ try:
106
+ deployment_mode_enum = DeploymentMode(config.deployment_mode)
107
+ except ValueError:
108
+ valid_modes = [mode.value for mode in DeploymentMode]
109
+ raise RasaException(
110
+ f"Invalid deployment_mode '{config.deployment_mode}'. "
111
+ f"Must be one of: {', '.join(valid_modes)}"
112
+ )
113
+
114
+ parsed_endpoints = cls._parse_and_validate_endpoints(
115
+ deployment_mode_enum, config.endpoints, config.host, config.port
116
+ )
117
+
118
+ iam_credentials_provider = create_iam_credentials_provider(
119
+ IAMCredentialsProviderInput(
120
+ service_name=SupportedServiceType.LOCK_STORE,
121
+ username=config.username,
122
+ cluster_name=os.getenv(AWS_ELASTICACHE_CLUSTER_NAME_ENV_VAR_NAME),
123
+ )
124
+ )
125
+
126
+ if deployment_mode_enum == DeploymentMode.CLUSTER:
127
+ cls._log_cluster_db_warning(deployment_mode_enum, config.db)
128
+ cluster_config = ClusterRedisConfig(
129
+ username=config.username,
130
+ password=config.password,
131
+ use_ssl=config.use_ssl,
132
+ ssl_certfile=config.ssl_certfile,
133
+ ssl_keyfile=config.ssl_keyfile,
134
+ ssl_ca_certs=config.ssl_ca_certs,
135
+ db=config.db,
136
+ socket_timeout=config.socket_timeout,
137
+ decode_responses=config.decode_responses,
138
+ endpoints=parsed_endpoints,
139
+ iam_credentials_provider=iam_credentials_provider,
140
+ )
141
+ return cls._create_cluster_connection(cluster_config)
142
+ elif deployment_mode_enum == DeploymentMode.SENTINEL:
143
+ sentinel_kwargs = {
144
+ "username": config.username,
145
+ "password": config.password,
146
+ "use_ssl": config.use_ssl,
147
+ "ssl_certfile": config.ssl_certfile,
148
+ "ssl_keyfile": config.ssl_keyfile,
149
+ "ssl_ca_certs": config.ssl_ca_certs,
150
+ "db": config.db,
151
+ "socket_timeout": config.socket_timeout,
152
+ "decode_responses": config.decode_responses,
153
+ "endpoints": parsed_endpoints,
154
+ "iam_credentials_provider": iam_credentials_provider,
155
+ }
156
+
157
+ if config.sentinel_service is not None:
158
+ sentinel_kwargs["sentinel_service"] = config.sentinel_service
159
+
160
+ sentinel_config = SentinelRedisConfig(**sentinel_kwargs)
161
+ return cls._create_sentinel_connection(sentinel_config)
162
+ else:
163
+ standard_config = StandardRedisConfig(
164
+ host=config.host,
165
+ port=config.port,
166
+ username=config.username,
167
+ password=config.password,
168
+ use_ssl=config.use_ssl,
169
+ ssl_certfile=config.ssl_certfile,
170
+ ssl_keyfile=config.ssl_keyfile,
171
+ ssl_ca_certs=config.ssl_ca_certs,
172
+ db=config.db,
173
+ socket_timeout=config.socket_timeout,
174
+ decode_responses=config.decode_responses,
175
+ iam_credentials_provider=iam_credentials_provider,
176
+ )
177
+ return cls._create_standard_connection(standard_config)
178
+
179
+ @classmethod
180
+ def _parse_and_validate_endpoints(
181
+ cls,
182
+ deployment_mode: DeploymentMode,
183
+ endpoints: List[str],
184
+ host: Text,
185
+ port: int,
186
+ ) -> List[Union[Dict[str, Any], Tuple[str, int]]]:
187
+ """Parse and validate endpoints based on deployment mode."""
188
+ if deployment_mode == DeploymentMode.STANDARD:
189
+ if endpoints:
190
+ structlogger.warning(
191
+ "redis_connection_factory.standard_endpoints_ignored",
192
+ event_info="Parameter `endpoints` ignored in standard mode. "
193
+ "Only 'host' and 'port' are used for standard Redis connections.",
194
+ )
195
+ return []
196
+
197
+ if not endpoints:
198
+ endpoints = cls._get_default_endpoints(deployment_mode, host, port)
199
+
200
+ # Parse endpoints into appropriate format
201
+ parsed_endpoints = cls._parse_all_endpoints(endpoints, deployment_mode)
202
+
203
+ if not parsed_endpoints:
204
+ raise RasaException(
205
+ f"No valid '{deployment_mode.value}' endpoints provided"
206
+ )
207
+
208
+ return parsed_endpoints
209
+
210
+ @classmethod
211
+ def _get_default_endpoints(
212
+ cls,
213
+ deployment_mode: DeploymentMode,
214
+ host: Text,
215
+ port: int,
216
+ ) -> List[str]:
217
+ """Get default endpoints when none provided."""
218
+ if deployment_mode == DeploymentMode.CLUSTER:
219
+ structlogger.warning(
220
+ "redis_connection_factory.cluster_endpoints_not_provided",
221
+ event_info="No endpoints provided for cluster mode. "
222
+ "Using default 'host:port' configuration.",
223
+ )
224
+ return [f"{host}:{port}"]
225
+ elif deployment_mode == DeploymentMode.SENTINEL:
226
+ raise RasaException("Sentinel mode requires endpoints configuration")
227
+
228
+ return []
229
+
230
+ @classmethod
231
+ def _parse_single_endpoint(
232
+ cls, endpoint: str, deployment_mode: DeploymentMode
233
+ ) -> Optional[Union[Dict[str, Any], Tuple[str, int]]]:
234
+ """Parse a single endpoint string into the appropriate format."""
235
+ if not isinstance(endpoint, str):
236
+ structlogger.warning(
237
+ f"redis_connection_factory.invalid_{deployment_mode.value}_endpoint_type",
238
+ event_info=f"Invalid endpoint type for endpoint '{endpoint}'. "
239
+ "Expected string in 'host:port' format.",
240
+ )
241
+ return None
242
+
243
+ if ":" not in endpoint:
244
+ structlogger.warning(
245
+ f"redis_connection_factory.invalid_{deployment_mode.value}_endpoint_format",
246
+ event_info=f"Invalid format for endpoint '{endpoint}'. "
247
+ "Expected 'host:port'.",
248
+ )
249
+ return None
250
+
251
+ host, port_str = endpoint.rsplit(":", 1)
252
+ try:
253
+ port = int(port_str)
254
+ except ValueError:
255
+ structlogger.warning(
256
+ f"redis_connection_factory.invalid_{deployment_mode.value}_endpoint",
257
+ event_info=f"Invalid port in endpoint '{endpoint}'. "
258
+ "Expected format 'host:port'.",
259
+ )
260
+ return None
261
+
262
+ return (host, port)
263
+
264
+ @classmethod
265
+ def _parse_all_endpoints(
266
+ cls,
267
+ endpoints: List[str],
268
+ deployment_mode: DeploymentMode,
269
+ ) -> List[Union[Dict[str, Any], Tuple[str, int]]]:
270
+ """Parse a list of endpoint strings into appropriate format."""
271
+ parsed_endpoints = []
272
+ for endpoint in endpoints:
273
+ parsed = cls._parse_single_endpoint(endpoint, deployment_mode)
274
+ if parsed:
275
+ parsed_endpoints.append(parsed)
276
+ return parsed_endpoints
277
+
278
+ @classmethod
279
+ def _create_cluster_connection(
280
+ cls,
281
+ config: ClusterRedisConfig,
282
+ ) -> redis.RedisCluster:
283
+ """Create a Redis Cluster connection.
284
+
285
+ Note: Database parameter is ignored in cluster mode (always uses db=0).
286
+
287
+ Args:
288
+ config: Cluster configuration containing all connection parameters.
289
+
290
+ Returns:
291
+ redis.RedisCluster: Configured cluster connection.
292
+
293
+ Raises:
294
+ ConnectionException: If cluster initialization fails.
295
+ """
296
+ from redis.cluster import ClusterNode
297
+
298
+ structlogger.info(
299
+ "redis_connection_factory.cluster_mode",
300
+ event_info=f"Initializing Redis Cluster with {len(config.endpoints)} nodes",
301
+ )
302
+
303
+ cluster_nodes = [ClusterNode(host, port) for host, port in config.endpoints]
304
+
305
+ common_config_kwargs = {
306
+ "startup_nodes": cluster_nodes,
307
+ "ssl": config.use_ssl,
308
+ "ssl_certfile": config.ssl_certfile,
309
+ "ssl_keyfile": config.ssl_keyfile,
310
+ "ssl_ca_certs": config.ssl_ca_certs,
311
+ "socket_timeout": config.socket_timeout,
312
+ "decode_responses": config.decode_responses,
313
+ }
314
+
315
+ try:
316
+ if config.iam_credentials_provider is not None:
317
+ structlogger.debug("redis_connection_factory.cluster_iam_auth_enabled")
318
+
319
+ redis_cluster: redis.RedisCluster = redis.RedisCluster(
320
+ credential_provider=config.iam_credentials_provider,
321
+ **common_config_kwargs,
322
+ )
323
+ else:
324
+ redis_cluster = redis.RedisCluster(
325
+ username=config.username,
326
+ password=config.password,
327
+ **common_config_kwargs,
328
+ )
329
+ except Exception as e:
330
+ raise ConnectionException(f"Error initializing Redis Cluster: {e}")
331
+
332
+ return redis_cluster
333
+
334
+ @classmethod
335
+ def _create_sentinel_connection(
336
+ cls,
337
+ config: SentinelRedisConfig,
338
+ ) -> redis.Redis:
339
+ """Create a Sentinel-managed Redis connection.
340
+
341
+ Connects to Redis master through Sentinel service discovery.
342
+ Tests connection with ping() before returning.
343
+
344
+ Args:
345
+ config: Sentinel configuration containing all connection parameters.
346
+
347
+ Returns:
348
+ redis.Redis: Connection to the Redis master via sentinel.
349
+
350
+ Raises:
351
+ ConnectionException: If sentinel initialization or connection test fails.
352
+ """
353
+ from redis.sentinel import Sentinel
354
+
355
+ structlogger.info(
356
+ "redis_connection_factory.sentinel_mode",
357
+ event_info=f"Initializing Redis Sentinel with {len(config.endpoints)} "
358
+ f"sentinel endpoints and service: {config.sentinel_service}",
359
+ )
360
+
361
+ # Configuration for Sentinel connection
362
+ connection_kwargs: Dict[str, Any] = {
363
+ "socket_timeout": config.socket_timeout,
364
+ }
365
+
366
+ sentinel_kwargs: Optional[Dict] = None
367
+ if config.iam_credentials_provider is not None:
368
+ structlogger.debug("redis_connection_factory.sentinel_iam_auth_enabled")
369
+ sentinel_kwargs = {"credential_provider": config.iam_credentials_provider}
370
+ else:
371
+ connection_kwargs.update(
372
+ {
373
+ "username": config.username,
374
+ "password": config.password,
375
+ }
376
+ )
377
+
378
+ # SSL configuration
379
+ if config.use_ssl:
380
+ connection_kwargs.update(
381
+ {
382
+ "ssl": config.use_ssl,
383
+ "ssl_certfile": config.ssl_certfile,
384
+ "ssl_keyfile": config.ssl_keyfile,
385
+ "ssl_ca_certs": config.ssl_ca_certs,
386
+ }
387
+ )
388
+
389
+ # Configuration for Redis client (master/replica)
390
+ client_kwargs = {
391
+ "db": config.db,
392
+ "decode_responses": config.decode_responses,
393
+ "socket_timeout": config.socket_timeout,
394
+ }
395
+
396
+ # Create Sentinel instance
397
+ try:
398
+ sentinel = Sentinel(
399
+ config.endpoints, sentinel_kwargs=sentinel_kwargs, **connection_kwargs
400
+ )
401
+ master = sentinel.master_for(config.sentinel_service, **client_kwargs)
402
+
403
+ # Test the connection
404
+ master.ping()
405
+
406
+ except Exception as e:
407
+ raise ConnectionException(f"Error initializing Redis Sentinel: {e}")
408
+
409
+ return master
410
+
411
+ @classmethod
412
+ def _create_standard_connection(
413
+ cls,
414
+ config: StandardRedisConfig,
415
+ ) -> redis.Redis:
416
+ """Create a standard Redis connection.
417
+
418
+ Args:
419
+ config: Standard configuration containing all connection parameters.
420
+
421
+ Returns:
422
+ redis.Redis: Configured Redis connection.
423
+ """
424
+ structlogger.info(
425
+ "redis_connection_factory.standard_mode",
426
+ event_info="Initializing Redis connection",
427
+ )
428
+ # Build connection arguments
429
+ connection_args: Dict[str, Any] = {
430
+ "host": config.host,
431
+ "port": int(config.port),
432
+ "db": config.db,
433
+ "socket_timeout": float(config.socket_timeout),
434
+ "ssl": config.use_ssl,
435
+ "ssl_certfile": config.ssl_certfile,
436
+ "ssl_keyfile": config.ssl_keyfile,
437
+ "ssl_ca_certs": config.ssl_ca_certs,
438
+ "decode_responses": config.decode_responses,
439
+ }
440
+
441
+ if config.iam_credentials_provider is not None:
442
+ structlogger.debug("redis_connection_factory.standard_iam_auth_enabled")
443
+ connection_args.update(
444
+ {"credential_provider": config.iam_credentials_provider}
445
+ )
446
+ else:
447
+ connection_args.update(
448
+ {
449
+ "password": config.password,
450
+ "username": config.username,
451
+ }
452
+ )
453
+
454
+ try:
455
+ standard_redis = redis.StrictRedis(**connection_args)
456
+ except Exception as e:
457
+ raise ConnectionException(f"Error initializing Redis connection: {e}")
458
+
459
+ return standard_redis
460
+
461
+ @classmethod
462
+ def _log_cluster_db_warning(cls, deployment_mode: DeploymentMode, db: int) -> None:
463
+ """Log warning if db parameter is set in cluster mode."""
464
+ if deployment_mode == DeploymentMode.CLUSTER and db != 0:
465
+ structlogger.warning(
466
+ "redis_connection_factory.cluster_db_ignored",
467
+ event_info=f"Database parameter 'db={db}' ignored in cluster mode. "
468
+ "Redis Cluster only supports database 0.",
469
+ )
@@ -4,12 +4,19 @@ from datetime import datetime
4
4
  from typing import Any, Dict, Iterable, Optional, Text
5
5
 
6
6
  import structlog
7
+ from pydantic import ValidationError
7
8
 
8
9
  import rasa.shared
9
10
  from rasa.core.brokers.broker import EventBroker
11
+ from rasa.core.redis_connection_factory import (
12
+ DeploymentMode,
13
+ RedisConfig,
14
+ RedisConnectionFactory,
15
+ )
10
16
  from rasa.core.tracker_stores.tracker_store import SerializedTrackerAsText, TrackerStore
11
17
  from rasa.shared.core.domain import Domain
12
18
  from rasa.shared.core.trackers import DialogueStateTracker
19
+ from rasa.shared.exceptions import RasaException
13
20
 
14
21
  structlogger = structlog.get_logger(__name__)
15
22
 
@@ -35,23 +42,34 @@ class RedisTrackerStore(TrackerStore, SerializedTrackerAsText):
35
42
  ssl_keyfile: Optional[Text] = None,
36
43
  ssl_certfile: Optional[Text] = None,
37
44
  ssl_ca_certs: Optional[Text] = None,
45
+ deployment_mode: Text = DeploymentMode.STANDARD.value,
46
+ endpoints: Optional[list] = None,
47
+ sentinel_service: Optional[Text] = None,
38
48
  **kwargs: Dict[Text, Any],
39
49
  ) -> None:
40
50
  """Initializes the tracker store."""
41
- import redis
42
-
43
- self.red = redis.StrictRedis(
44
- host=host,
45
- port=port,
46
- db=db,
47
- username=username,
48
- password=password,
49
- ssl=use_ssl,
50
- ssl_keyfile=ssl_keyfile,
51
- ssl_certfile=ssl_certfile,
52
- ssl_ca_certs=ssl_ca_certs,
53
- decode_responses=True,
54
- )
51
+
52
+ # Create Redis connection using the factory directly
53
+ try:
54
+ config = RedisConfig(
55
+ host=host,
56
+ port=port,
57
+ db=db,
58
+ username=username,
59
+ password=password,
60
+ use_ssl=use_ssl,
61
+ ssl_keyfile=ssl_keyfile,
62
+ ssl_certfile=ssl_certfile,
63
+ ssl_ca_certs=ssl_ca_certs,
64
+ deployment_mode=deployment_mode,
65
+ endpoints=endpoints,
66
+ sentinel_service=sentinel_service,
67
+ decode_responses=True,
68
+ )
69
+ self.red = RedisConnectionFactory.create_connection(config)
70
+ except ValidationError as e:
71
+ raise RasaException(f"Invalid Redis configuration: {e}")
72
+
55
73
  self.record_exp = record_exp
56
74
 
57
75
  self.key_prefix = DEFAULT_REDIS_TRACKER_STORE_KEY_PREFIX
@@ -27,6 +27,13 @@ from rasa.core.constants import (
27
27
  POSTGRESQL_MAX_OVERFLOW,
28
28
  POSTGRESQL_POOL_SIZE,
29
29
  POSTGRESQL_SCHEMA,
30
+ SQL_TRACKER_STORE_SSL_MODE_ENV_VAR_NAME,
31
+ SQL_TRACKER_STORE_SSL_ROOT_CERTIFICATE_ENV_VAR_NAME,
32
+ )
33
+ from rasa.core.iam_credentials_providers.credentials_provider_protocol import (
34
+ IAMCredentialsProviderInput,
35
+ SupportedServiceType,
36
+ create_iam_credentials_provider,
30
37
  )
31
38
  from rasa.core.tracker_stores.tracker_store import (
32
39
  SerializedTrackerAsText,
@@ -85,6 +92,21 @@ def is_postgresql_url(url: Union[Text, "URL"]) -> bool:
85
92
  return url.drivername == "postgresql"
86
93
 
87
94
 
95
+ def get_ssl_args() -> Dict[str, Any]:
96
+ """Get SSL arguments for PostgreSQL connection from environment variables."""
97
+ ssl_mode = os.getenv(SQL_TRACKER_STORE_SSL_MODE_ENV_VAR_NAME)
98
+ ssl_root_cert = os.getenv(SQL_TRACKER_STORE_SSL_ROOT_CERTIFICATE_ENV_VAR_NAME)
99
+ ssl_args = {}
100
+
101
+ if ssl_mode:
102
+ ssl_args["sslmode"] = ssl_mode
103
+
104
+ if ssl_root_cert:
105
+ ssl_args["sslrootcert"] = ssl_root_cert
106
+
107
+ return ssl_args
108
+
109
+
88
110
  def create_engine_kwargs(url: Union[Text, "URL"]) -> Dict[Text, Any]:
89
111
  """Get `sqlalchemy.create_engine()` kwargs.
90
112
 
@@ -119,6 +141,14 @@ def create_engine_kwargs(url: Union[Text, "URL"]) -> Dict[Text, Any]:
119
141
  os.environ.get(POSTGRESQL_MAX_OVERFLOW, POSTGRESQL_DEFAULT_MAX_OVERFLOW)
120
142
  )
121
143
 
144
+ ssl_args = get_ssl_args()
145
+
146
+ if ssl_args:
147
+ if "connect_args" in kwargs:
148
+ kwargs["connect_args"].update(ssl_args)
149
+ else:
150
+ kwargs["connect_args"] = ssl_args
151
+
122
152
  return kwargs
123
153
 
124
154
 
@@ -197,6 +227,32 @@ class SQLTrackerStore(TrackerStore, SerializedTrackerAsText):
197
227
 
198
228
  port = validate_port(port)
199
229
 
230
+ iam_credentials_provider = create_iam_credentials_provider(
231
+ IAMCredentialsProviderInput(
232
+ service_name=SupportedServiceType.TRACKER_STORE,
233
+ username=username,
234
+ host=host,
235
+ port=port,
236
+ )
237
+ )
238
+ if iam_credentials_provider is not None:
239
+ credentials = iam_credentials_provider.get_temporary_credentials()
240
+ if credentials.auth_token:
241
+ password = credentials.auth_token
242
+ structlogger.debug(
243
+ "sql_tracker_store.iam_credentials_provider",
244
+ event_info="Using temporary auth token from "
245
+ "IAM credentials provider.",
246
+ )
247
+ else:
248
+ structlogger.warning(
249
+ "sql_tracker_store.iam_credentials_provider.no_auth_token",
250
+ event_info=(
251
+ "IAM credentials provider did not return an auth token. "
252
+ "Falling back to provided password or no password."
253
+ ),
254
+ )
255
+
200
256
  engine_url = self.get_db_url(
201
257
  dialect, host, port, db, username, password, login_db, query
202
258
  )
@@ -272,7 +328,7 @@ class SQLTrackerStore(TrackerStore, SerializedTrackerAsText):
272
328
  host: Database network host.
273
329
  port: Database network port.
274
330
  db: Database name.
275
- username: User name to use when connecting to the database.
331
+ username: Username to use when connecting to the database.
276
332
  password: Password for database user.
277
333
  login_db: Alternative database name to which initially connect, and create
278
334
  the database specified by `db` (PostgreSQL only).
@@ -219,11 +219,6 @@ class FlowRetrieval(EmbeddingsHealthCheckMixin):
219
219
  if self.vector_store is not None:
220
220
  with self._model_storage.write_to(self._resource) as model_path:
221
221
  self.vector_store.save_local(model_path)
222
- else:
223
- structlogger.warning(
224
- "flow_retrieval.persist_vector_store.not_initialized",
225
- event_info="Vector store is None, not persisted.",
226
- )
227
222
 
228
223
  def _persist_config(self) -> None:
229
224
  with self._model_storage.write_to(self._resource) as path:
@@ -249,6 +244,16 @@ class FlowRetrieval(EmbeddingsHealthCheckMixin):
249
244
  )
250
245
 
251
246
  flows_to_embedd = flows.exclude_link_only_flows()
247
+
248
+ if not flows_to_embedd:
249
+ structlogger.debug(
250
+ "flow_retrieval.populate_vector_store.no_flows_to_embed",
251
+ event_info=(
252
+ "No flows to embed in the vector store, skipping population."
253
+ ),
254
+ )
255
+ return
256
+
252
257
  embeddings = self._create_embedder(self.config)
253
258
  documents = self._generate_flow_documents(flows_to_embedd, domain)
254
259
  try:
@@ -420,10 +425,6 @@ class FlowRetrieval(EmbeddingsHealthCheckMixin):
420
425
  The top k documents with similarity scores.
421
426
  """
422
427
  if self.vector_store is None:
423
- structlogger.error(
424
- "flow_retrieval.query_vector_store.vector_store_not_configured",
425
- event_info="Vector store is not configured",
426
- )
427
428
  return []
428
429
  try:
429
430
  documents_with_scores = (