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
rasa/builder/models.py CHANGED
@@ -6,7 +6,7 @@ from pathlib import Path
6
6
  from typing import Any, Dict, List, Literal, Optional
7
7
 
8
8
  import structlog
9
- from pydantic import BaseModel, Field, validator
9
+ from pydantic import BaseModel, ConfigDict, Field, field_validator
10
10
 
11
11
  from rasa.cli.scaffold import ProjectTemplateName
12
12
  from rasa.shared.importers.importer import TrainingDataImporter
@@ -21,7 +21,8 @@ class PromptRequest(BaseModel):
21
21
  ..., min_length=1, max_length=10000, description="The skill description prompt"
22
22
  )
23
23
 
24
- @validator("prompt")
24
+ @field_validator("prompt")
25
+ @classmethod
25
26
  def validate_prompt(cls, v: str) -> str:
26
27
  if not v.strip():
27
28
  raise ValueError("Prompt cannot be empty or whitespace only")
@@ -38,7 +39,8 @@ class TemplateRequest(BaseModel):
38
39
  ),
39
40
  )
40
41
 
41
- @validator("template_name")
42
+ @field_validator("template_name")
43
+ @classmethod
42
44
  def validate_template_name(cls, v: Any) -> Any:
43
45
  if v not in ProjectTemplateName:
44
46
  raise ValueError(
@@ -54,10 +56,8 @@ class BotDataUpdateRequest(BaseModel):
54
56
  flows_yml: Optional[str] = Field(None, alias="flows.yml")
55
57
  config_yml: Optional[str] = Field(None, alias="config.yml")
56
58
 
57
- class Config:
58
- """Config for BotDataUpdateRequest."""
59
-
60
- allow_population_by_field_name = True
59
+ # Allow using either field names or aliases when creating the model
60
+ model_config = ConfigDict(populate_by_name=True)
61
61
 
62
62
 
63
63
  class BotData(BaseModel):
@@ -206,6 +206,7 @@ class TrainingInput(BaseModel):
206
206
 
207
207
  importer: TrainingDataImporter = Field(..., description="Training data importer")
208
208
  endpoints_file: Path = Field(..., description="Path to the endpoints file")
209
+ config_file: Path = Field(..., description="Path to the config file")
209
210
 
210
211
 
211
212
  class AgentStatus(str, Enum):
@@ -3,30 +3,27 @@
3
3
  import json
4
4
  import os
5
5
  import shutil
6
- import tarfile
7
- import tempfile
8
6
  from pathlib import Path
9
7
  from textwrap import dedent
10
8
  from typing import Any, Dict, Generator, List, Optional
11
9
 
12
- import aiofiles
13
- import aiohttp
14
10
  import structlog
15
11
 
16
- import rasa.version
17
12
  from rasa.builder import config
18
13
  from rasa.builder.exceptions import ProjectGenerationError, ValidationError
19
14
  from rasa.builder.llm_service import get_skill_generation_messages, llm_service
20
15
  from rasa.builder.logging_utils import capture_exception_with_context
21
16
  from rasa.builder.models import BotFiles
22
17
  from rasa.builder.project_info import ProjectInfo, ensure_first_used, load_project_info
18
+ from rasa.builder.template_cache import copy_cache_for_template_if_available
23
19
  from rasa.builder.training_service import TrainingInput
24
20
  from rasa.builder.validation_service import validate_project
25
21
  from rasa.cli.scaffold import ProjectTemplateName, create_initial_project
22
+ from rasa.shared.constants import DEFAULT_MODELS_PATH
26
23
  from rasa.shared.core.flows import yaml_flows_io
27
24
  from rasa.shared.importers.importer import TrainingDataImporter
28
25
  from rasa.shared.utils.yaml import dump_obj_as_yaml_to_string
29
- from rasa.utils.io import subpath
26
+ from rasa.utils.io import InvalidPathException, subpath
30
27
 
31
28
  structlogger = structlog.get_logger()
32
29
 
@@ -48,12 +45,25 @@ class ProjectGenerator:
48
45
  """Get the project info."""
49
46
  return load_project_info(self.project_folder)
50
47
 
48
+ def is_empty(self) -> bool:
49
+ """Check if the project folder is empty.
50
+
51
+ Excluding hidden paths.
52
+ """
53
+ return not any(
54
+ file.is_file()
55
+ for file in self.project_folder.iterdir()
56
+ if not file.name.startswith(".")
57
+ )
58
+
51
59
  async def init_from_template(self, template: ProjectTemplateName) -> None:
52
60
  """Create the initial project files."""
53
61
  self.cleanup()
54
62
  create_initial_project(self.project_folder.as_posix(), template)
55
- await download_cache_for_template(template, self.project_folder.as_posix())
56
- # needs to happen after caching, as we download .rasa and that would
63
+ # If a local cache for this template exists, copy it into the project.
64
+ # We no longer download here to avoid blocking project creation.
65
+ await copy_cache_for_template_if_available(template, self.project_folder)
66
+ # needs to happen after caching, as we download/copy .rasa and that would
57
67
  # overwrite the project info file in .rasa
58
68
  ensure_first_used(self.project_folder)
59
69
 
@@ -182,11 +192,16 @@ class ProjectGenerator:
182
192
  """Get the endpoints file."""
183
193
  return self.project_folder / "endpoints.yml"
184
194
 
195
+ def _get_config_file(self) -> Path:
196
+ """Get the config file."""
197
+ return self.project_folder / "config.yml"
198
+
185
199
  def get_training_input(self) -> TrainingInput:
186
200
  """Get the training input."""
187
201
  return TrainingInput(
188
202
  importer=self._create_importer(),
189
203
  endpoints_file=self._get_endpoints_file(),
204
+ config_file=self._get_config_file(),
190
205
  )
191
206
 
192
207
  def _create_importer(self) -> TrainingDataImporter:
@@ -198,7 +213,7 @@ class ProjectGenerator:
198
213
  domain_path = self.project_folder / "domain"
199
214
 
200
215
  return TrainingDataImporter.load_from_config(
201
- config_path=str(self.project_folder / "config.yml"),
216
+ config_path=str(self._get_config_file()),
202
217
  domain_path=str(domain_path),
203
218
  training_data_paths=[str(self.project_folder / "data")],
204
219
  args={},
@@ -225,25 +240,9 @@ class ProjectGenerator:
225
240
  """
226
241
  bot_files: BotFiles = {}
227
242
 
228
- for file in self.project_folder.glob("**/*"):
229
- # Skip directories
230
- if not file.is_file():
231
- continue
232
-
243
+ for file in self.bot_file_paths():
233
244
  relative_path = file.relative_to(self.project_folder)
234
245
 
235
- # Skip hidden files and directories (any path component starting with '.')
236
- # as well as `__pycache__` folders
237
- if any(part.startswith(".") for part in relative_path.parts):
238
- continue
239
-
240
- if "__pycache__" in relative_path.parts:
241
- continue
242
-
243
- # exclude the project_folder / models folder
244
- if relative_path.parts[0] == "models":
245
- continue
246
-
247
246
  # Exclude the docs directory if specified
248
247
  if exclude_docs_directory and relative_path.parts[0] == "docs":
249
248
  continue
@@ -255,7 +254,6 @@ class ProjectGenerator:
255
254
  ]
256
255
  if file.suffix.lstrip(".").lower() not in allowed_file_extensions:
257
256
  continue
258
-
259
257
  # Read file content and store with relative path as key
260
258
  try:
261
259
  bot_files[relative_path.as_posix()] = file.read_text(encoding="utf-8")
@@ -266,9 +264,40 @@ class ProjectGenerator:
266
264
  file_path=file.as_posix(),
267
265
  )
268
266
  bot_files[relative_path.as_posix()] = None
269
-
270
267
  return bot_files
271
268
 
269
+ def is_restricted_path(self, path: Path) -> bool:
270
+ """Check if the path is restricted.
271
+
272
+ These paths are excluded from deletion and editing by the user.
273
+ """
274
+ relative_path = path.relative_to(self.project_folder)
275
+
276
+ # Skip hidden files and directories (any path component starting with '.')
277
+ # as well as `__pycache__` folders
278
+ if any(part.startswith(".") for part in relative_path.parts):
279
+ return True
280
+
281
+ if "__pycache__" in relative_path.parts:
282
+ return True
283
+
284
+ # exclude the project_folder / models folder
285
+ if relative_path.parts[0] == DEFAULT_MODELS_PATH:
286
+ return True
287
+
288
+ return False
289
+
290
+ def bot_file_paths(
291
+ self,
292
+ ) -> Generator[Path, None, None]:
293
+ """Get the paths of all bot files."""
294
+ for file in self.project_folder.glob("**/*"):
295
+ # Skip directories
296
+ if not file.is_file() or self.is_restricted_path(file):
297
+ continue
298
+
299
+ yield file
300
+
272
301
  def _get_bot_data_for_llm(self) -> Dict[str, Any]:
273
302
  """Get the current bot data for the LLM."""
274
303
  file_importer = self._create_importer()
@@ -313,7 +342,7 @@ class ProjectGenerator:
313
342
  def update_bot_files(self, files: Dict[str, Optional[str]]) -> None:
314
343
  """Update bot files with new content by writing to disk."""
315
344
  for filename, content in files.items():
316
- file_path = Path(subpath(self.project_folder, filename))
345
+ file_path = Path(subpath(str(self.project_folder), filename))
317
346
  # Disallow updates inside .rasa project metadata directory
318
347
  if any(
319
348
  part.startswith(".")
@@ -324,6 +353,95 @@ class ProjectGenerator:
324
353
  file_path.parent.mkdir(parents=True, exist_ok=True)
325
354
  file_path.write_text(content, encoding="utf-8")
326
355
 
356
+ def ensure_all_files_are_writable(self, files: Dict[str, Optional[str]]) -> None:
357
+ """Ensure all files are writable."""
358
+ for filename, content in files.items():
359
+ file_path = Path(subpath(str(self.project_folder), filename))
360
+ if self.is_restricted_path(file_path):
361
+ raise InvalidPathException(
362
+ f"This file or folder is restricted from editing: {file_path}"
363
+ )
364
+
365
+ def replace_all_bot_files(self, files: Dict[str, Optional[str]]) -> None:
366
+ """Replace all bot files with new content, deleting files not in the request.
367
+
368
+ Files/folders starting with .rasa/ or models/ are excluded from deletion.
369
+
370
+ Args:
371
+ files: Dictionary mapping file names to their content
372
+ """
373
+ self.ensure_all_files_are_writable(files)
374
+ # Collect all existing files - any files not in the new `files` dict will be
375
+ # deleted from this set
376
+ existing_files = set(path.as_posix() for path in self.bot_file_paths())
377
+
378
+ # Write all new files
379
+ for filename, content in files.items():
380
+ if content is None:
381
+ continue
382
+
383
+ file_path = Path(subpath(str(self.project_folder), filename))
384
+ file_path.parent.mkdir(parents=True, exist_ok=True)
385
+
386
+ try:
387
+ file_path.write_text(content, encoding="utf-8")
388
+ except Exception as e:
389
+ # Log write failure and avoid deleting an existing file by mistake
390
+ capture_exception_with_context(
391
+ e,
392
+ "project_generator.replace_all_bot_files.write_error",
393
+ extra={"file_path": file_path},
394
+ )
395
+ if file_path.as_posix() in existing_files:
396
+ # Keep the original file if it already existed
397
+ existing_files.discard(file_path.as_posix())
398
+ continue
399
+
400
+ # Remove from deletion set since this file is in the new set of files
401
+ existing_files.discard(file_path.as_posix())
402
+
403
+ # Delete files that weren't in the request
404
+ for file_to_delete in existing_files:
405
+ file_path = Path(file_to_delete)
406
+ try:
407
+ file_path.unlink()
408
+ except Exception as e:
409
+ capture_exception_with_context(
410
+ e,
411
+ "project_generator.replace_all_bot_files.delete_error",
412
+ extra={"file_path": file_path},
413
+ )
414
+
415
+ # Clean up empty directories (except excluded ones)
416
+ self._cleanup_empty_directories()
417
+
418
+ def _cleanup_empty_directories(self) -> None:
419
+ """Remove empty directories from the project folder.
420
+
421
+ Excludes hidden files and directories, and models/ from cleanup.
422
+ """
423
+ # Walk directories in reverse order (deepest first)
424
+ for dirpath, dirnames, filenames in os.walk(self.project_folder, topdown=False):
425
+ # Skip if this is the project root
426
+ if dirpath == str(self.project_folder):
427
+ continue
428
+
429
+ if self.is_restricted_path(Path(dirpath)):
430
+ continue
431
+
432
+ relative_path = Path(dirpath).relative_to(self.project_folder)
433
+
434
+ try:
435
+ # Only remove if directory is empty
436
+ if not os.listdir(dirpath):
437
+ os.rmdir(dirpath)
438
+ except Exception as e:
439
+ capture_exception_with_context(
440
+ e,
441
+ "project_generator.cleanup_empty_directories.error",
442
+ extra={"directory": relative_path.as_posix()},
443
+ )
444
+
327
445
  def cleanup(self) -> None:
328
446
  """Cleanup the project folder."""
329
447
  # remove all the files and folders in the project folder resulting
@@ -331,6 +449,8 @@ class ProjectGenerator:
331
449
  for filename in os.listdir(self.project_folder):
332
450
  file_path = os.path.join(self.project_folder, filename)
333
451
  try:
452
+ if filename == "lost+found":
453
+ continue
334
454
  if os.path.isfile(file_path) or os.path.islink(file_path):
335
455
  os.unlink(file_path)
336
456
  elif os.path.isdir(file_path):
@@ -341,122 +461,3 @@ class ProjectGenerator:
341
461
  error=str(e),
342
462
  file_path=file_path,
343
463
  )
344
-
345
-
346
- CACHE_BUCKET_URL = "https://trained-templates.s3.us-east-1.amazonaws.com"
347
-
348
-
349
- def _safe_tar_members(
350
- tar: tarfile.TarFile, destination_directory: Path
351
- ) -> Generator[tarfile.TarInfo, None, None]:
352
- """Yield safe members for extraction to prevent path traversal and links.
353
-
354
- Args:
355
- tar: Open tar file handle
356
- destination_directory: Directory to which files will be extracted
357
-
358
- Yields:
359
- Members that are safe to extract within destination_directory
360
- """
361
- base_path = destination_directory.resolve()
362
-
363
- for member in tar.getmembers():
364
- name = member.name
365
- # Skip empty names and absolute paths
366
- if not name or name.startswith("/") or name.startswith("\\"):
367
- continue
368
-
369
- # Disallow symlinks and hardlinks
370
- if member.issym() or member.islnk():
371
- continue
372
-
373
- # Compute the final path and ensure it's within base_path
374
- target_path = (base_path / name).resolve()
375
- try:
376
- target_path.relative_to(base_path)
377
- except ValueError:
378
- # Member would escape the destination directory
379
- continue
380
-
381
- yield member
382
-
383
-
384
- async def download_cache_for_template(
385
- template: ProjectTemplateName, project_folder: str
386
- ) -> None:
387
- # get a temp path for the cache file download
388
- temporary_cache_file = tempfile.NamedTemporaryFile(suffix=".tar.gz", delete=False)
389
-
390
- try:
391
- url = f"{CACHE_BUCKET_URL}/{rasa.version.__version__}-{template.value}.tar.gz"
392
- async with aiohttp.ClientSession() as session:
393
- async with session.get(url) as response:
394
- response.raise_for_status()
395
- async with aiofiles.open(temporary_cache_file.name, "wb") as f:
396
- async for chunk in response.content.iter_chunked(1024 * 1024):
397
- await f.write(chunk)
398
-
399
- # extract the cache to the project folder using safe member filtering
400
- with tarfile.open(temporary_cache_file.name, "r:gz") as tar:
401
- destination = Path(project_folder)
402
- destination.mkdir(parents=True, exist_ok=True)
403
- tar.extractall(
404
- path=destination,
405
- members=_safe_tar_members(tar, destination),
406
- )
407
-
408
- structlogger.info(
409
- "project_generator.download_cache_for_template.success",
410
- template=template,
411
- event_info=(
412
- f"Downloaded cache for template, extracted to {project_folder}."
413
- ),
414
- )
415
- except aiohttp.ClientResponseError as e:
416
- if e.status == 403:
417
- structlogger.debug(
418
- "project_generator.download_cache_for_template.no_cache_found",
419
- template=template,
420
- event_info=("No cache found for template, continuing without it."),
421
- )
422
- else:
423
- structlogger.debug(
424
- "project_generator.download_cache_for_template.response_error",
425
- error=str(e),
426
- status=e.status,
427
- template=template,
428
- event_info=(
429
- "Failed to download cache for template, continuing without it."
430
- ),
431
- )
432
- capture_exception_with_context(
433
- e,
434
- "project_generator.download_cache_for_template.response_error",
435
- tags={"template": template.value, "status": str(e.status)},
436
- )
437
- except Exception as exc:
438
- structlogger.debug(
439
- "project_generator.download_cache_for_template.unexpected_error",
440
- error=str(exc),
441
- template=template,
442
- event_info=(
443
- "Unexpected error when downloading cache for template, "
444
- "continuing without it."
445
- ),
446
- )
447
- capture_exception_with_context(
448
- exc,
449
- "project_generator.download_cache_for_template.unexpected_error",
450
- tags={"template": template.value},
451
- )
452
- finally:
453
- # Clean up the temporary file
454
- try:
455
- Path(temporary_cache_file.name).unlink(missing_ok=True)
456
- except Exception as exc:
457
- structlogger.debug(
458
- "project_generator.download_cache_for_template.cleanup_error",
459
- error=str(exc),
460
- template=template,
461
- event_info=("Failed to cleanup cache for template, ignoring."),
462
- )
rasa/builder/service.py CHANGED
@@ -17,6 +17,8 @@ from rasa.builder.config import (
17
17
  COPILOT_HANDLER_ROLLING_BUFFER_SIZE,
18
18
  GUARDRAILS_ENABLE_BLOCKING,
19
19
  HELLO_RASA_PROJECT_ID,
20
+ LAKERA_ASSISTANT_HISTORY_GUARDRAIL_PROJECT_ID,
21
+ LAKERA_COPILOT_HISTORY_GUARDRAIL_PROJECT_ID,
20
22
  )
21
23
  from rasa.builder.copilot.constants import ROLE_USER, SIGNATURE_VERSION_V1
22
24
  from rasa.builder.copilot.copilot_response_handler import CopilotResponseHandler
@@ -47,15 +49,11 @@ from rasa.builder.guardrails.constants import (
47
49
  BlockScope,
48
50
  )
49
51
  from rasa.builder.guardrails.store import guardrails_store
50
- from rasa.builder.guardrails.utils import (
51
- check_assistant_chat_for_policy_violations,
52
- check_copilot_chat_for_policy_violations,
53
- )
54
52
  from rasa.builder.job_manager import job_manager
55
53
  from rasa.builder.jobs import (
56
54
  run_prompt_to_bot_job,
55
+ run_replace_all_files_job,
57
56
  run_template_to_bot_job,
58
- run_update_files_job,
59
57
  )
60
58
  from rasa.builder.llm_service import llm_service
61
59
  from rasa.builder.logging_utils import (
@@ -512,26 +510,31 @@ async def get_bot_files(request: Request) -> HTTPResponse:
512
510
  )
513
511
 
514
512
 
515
- @bp.route("/files", methods=["PUT"])
516
- @openapi.summary("Update bot files")
513
+ @bp.route("/files", methods=["POST"])
514
+ @openapi.summary("Replace all bot files")
517
515
  @openapi.description(
518
- "Updates the bot configuration files and retrains the model. "
519
- "Returns immediately with a job ID. Connect to `/job-events/<job_id>` "
520
- "for real-time SSE progress tracking."
516
+ "Replaces all bot configuration files with the provided files, deletes any "
517
+ "files not included in the request (excluding .rasa/ and models/ directories), "
518
+ "and retrains the model. Returns immediately with a job ID. Connect to "
519
+ "`/job-events/<job_id>` for real-time SSE progress tracking."
521
520
  "\n\n"
521
+ "**File Management:**\n"
522
+ "- All files in the request are written to the project folder\n"
523
+ "- Files not included in the request are deleted from the project\n"
524
+ "- Files/folders starting with `.rasa/` or `models/` are excluded from deletion\n\n"
522
525
  "**SSE Event Flow:** (available via /job-events/<job_id>)\n"
523
526
  "1. `received` - Request received by server\n"
524
527
  "2. `validating` - Validating bot configuration files\n"
525
528
  "3. `validation_success` - File validation completed successfully\n"
526
529
  "4. `training` - Training the bot model with updated files\n"
527
530
  "5. `train_success` - Model training completed\n"
528
- "6. `done` - Bot files update completed\n\n"
531
+ "6. `done` - Bot files replacement completed\n\n"
529
532
  "**Error Events (can occur at any time):**\n"
530
533
  "- `validation_error` - Bot configuration files are invalid\n"
531
534
  "- `train_error` - Files updated but training failed\n"
532
535
  "- `error` - Unexpected error occurred\n\n"
533
536
  "**Usage:**\n"
534
- "1. Send PUT request with Content-Type: application/json\n"
537
+ "1. Send POST request with Content-Type: application/json\n"
535
538
  "2. The response will be a JSON object `{job_id: ...}`\n"
536
539
  "3. Connect to `/job-events/<job_id>` for a server-sent event stream of progress."
537
540
  )
@@ -539,9 +542,11 @@ async def get_bot_files(request: Request) -> HTTPResponse:
539
542
  @openapi.body(
540
543
  {"application/json": {str: Optional[str]}},
541
544
  description=(
542
- "A dictionary mapping file names to their updated content. "
543
- "The file name should be the name of the file in the project folder. "
544
- "Files that are not in the request will not be updated."
545
+ "A dictionary mapping file names to their complete content. "
546
+ "All files in the project will be replaced with these files. "
547
+ "Files not included in the request will be deleted from the project "
548
+ "(except for .rasa/ and models/ directories). "
549
+ "The file name should be the relative path from the project root."
545
550
  ),
546
551
  required=True,
547
552
  example={
@@ -558,6 +563,10 @@ async def get_bot_files(request: Request) -> HTTPResponse:
558
563
  " - name: CountVectorsFeaturizer\n"
559
564
  "policies:\n - name: MemoizationPolicy\n - name: RulePolicy"
560
565
  ),
566
+ "data/nlu.yml": (
567
+ "version: '3.1'\n"
568
+ "nlu:\n- intent: greet\n examples: |\n - hello\n - hi"
569
+ ),
561
570
  },
562
571
  )
563
572
  @openapi.response(
@@ -565,7 +574,7 @@ async def get_bot_files(request: Request) -> HTTPResponse:
565
574
  {"application/json": model_to_schema(JobCreateResponse)},
566
575
  description=(
567
576
  "Job created. Poll or subscribe to /job-events/<job_id> "
568
- "for progress and SSE updates."
577
+ "for progress and SSE updates on file replacement and training."
569
578
  ),
570
579
  )
571
580
  @openapi.response(
@@ -607,8 +616,8 @@ async def get_bot_files(request: Request) -> HTTPResponse:
607
616
  schema=str,
608
617
  )
609
618
  @protected()
610
- async def update_bot_files(request: Request) -> HTTPResponse:
611
- """Update bot files with server-sent events for progress tracking."""
619
+ async def replace_all_bot_files(request: Request) -> HTTPResponse:
620
+ """Replace all bot files with server-sent events for progress tracking."""
612
621
  try:
613
622
  bot_files = request.json
614
623
  except Exception as exc:
@@ -621,17 +630,17 @@ async def update_bot_files(request: Request) -> HTTPResponse:
621
630
 
622
631
  try:
623
632
  job = job_manager.create_job()
624
- request.app.add_task(run_update_files_job(request.app, job, bot_files))
633
+ request.app.add_task(run_replace_all_files_job(request.app, job, bot_files))
625
634
  return response.json(JobCreateResponse(job_id=job.id).model_dump(), status=200)
626
635
  except Exception as exc:
627
636
  capture_exception_with_context(
628
637
  exc,
629
- "bot_builder_service.update_bot_files.unexpected_error",
630
- tags={"endpoint": "/api/files", "method": "PUT"},
638
+ "bot_builder_service.replace_all_bot_files.unexpected_error",
639
+ tags={"endpoint": "/api/files", "method": "POST"},
631
640
  )
632
641
  return response.json(
633
642
  ApiErrorResponse(
634
- error="Failed to update bot files", details={"error": str(exc)}
643
+ error="Failed to replace bot files", details={"error": str(exc)}
635
644
  ).model_dump(),
636
645
  status=HTTPStatus.INTERNAL_SERVER_ERROR,
637
646
  )
@@ -1070,11 +1079,15 @@ async def copilot(request: Request) -> None:
1070
1079
  tracker_context = TrackerContext.from_tracker(
1071
1080
  tracker, max_turns=COPILOT_ASSISTANT_TRACKER_MAX_TURNS
1072
1081
  )
1073
- if tracker_context is not None:
1074
- tracker_context = await check_assistant_chat_for_policy_violations(
1082
+ if (
1083
+ tracker_context is not None
1084
+ and llm_service.guardrails_policy_checker is not None
1085
+ ):
1086
+ tracker_context = await llm_service.guardrails_policy_checker.check_assistant_chat_for_policy_violations( # noqa: E501
1075
1087
  tracker_context=tracker_context,
1076
1088
  hello_rasa_user_id=user_id,
1077
1089
  hello_rasa_project_id=HELLO_RASA_PROJECT_ID,
1090
+ lakera_project_id=LAKERA_ASSISTANT_HISTORY_GUARDRAIL_PROJECT_ID,
1078
1091
  )
1079
1092
 
1080
1093
  # Copilot doesn't need to know about the docs and any file that is not a core
@@ -1092,13 +1105,14 @@ async def copilot(request: Request) -> None:
1092
1105
 
1093
1106
  # 5. Run guardrail policy checks. If any policy violations are detected,
1094
1107
  # send a response and end the stream.
1095
- guardrail_response: Optional[
1096
- GeneratedContent
1097
- ] = await check_copilot_chat_for_policy_violations(
1098
- context=context,
1099
- hello_rasa_user_id=user_id,
1100
- hello_rasa_project_id=HELLO_RASA_PROJECT_ID,
1101
- )
1108
+ guardrail_response: Optional[GeneratedContent] = None
1109
+ if llm_service.guardrails_policy_checker is not None:
1110
+ guardrail_response = await llm_service.guardrails_policy_checker.check_copilot_chat_for_policy_violations( # noqa: E501
1111
+ context=context,
1112
+ hello_rasa_user_id=user_id,
1113
+ hello_rasa_project_id=HELLO_RASA_PROJECT_ID,
1114
+ lakera_project_id=LAKERA_COPILOT_HISTORY_GUARDRAIL_PROJECT_ID,
1115
+ )
1102
1116
  if guardrail_response is not None:
1103
1117
  blocked_or_violation_message = (
1104
1118
  await _handle_guardrail_violation_and_maybe_block(
@@ -1122,11 +1136,9 @@ async def copilot(request: Request) -> None:
1122
1136
  # copilot response handler
1123
1137
  start_timestamp = time.perf_counter()
1124
1138
  copilot_client = llm_service.instantiate_copilot()
1125
- (
1126
- original_stream,
1127
- used_documents,
1128
- system_prompt,
1129
- ) = await copilot_client.generate_response(context)
1139
+ (original_stream, generation_context) = await copilot_client.generate_response(
1140
+ context
1141
+ )
1130
1142
 
1131
1143
  copilot_response_handler = llm_service.instantiate_handler(
1132
1144
  COPILOT_HANDLER_ROLLING_BUFFER_SIZE
@@ -1142,18 +1154,24 @@ async def copilot(request: Request) -> None:
1142
1154
  asyncio.to_thread(
1143
1155
  telemetry.log_copilot_from_handler,
1144
1156
  handler=copilot_response_handler,
1145
- used_documents=used_documents,
1157
+ used_documents=generation_context.relevant_documents,
1146
1158
  latency_ms=int((time.perf_counter() - start_timestamp) * 1000),
1147
- system_prompt=system_prompt,
1159
+ system_message=generation_context.system_message,
1160
+ chat_history=generation_context.chat_history,
1161
+ last_user_message=(
1162
+ req.last_message.get_text_content()
1163
+ if (req.last_message and req.last_message.role == ROLE_USER)
1164
+ else None
1165
+ ),
1148
1166
  **copilot_client.usage_statistics.model_dump(),
1149
1167
  )
1150
1168
  )
1151
1169
 
1152
1170
  # 9. Once the stream is over, extract and send references
1153
1171
  # if any documents were used
1154
- if used_documents:
1172
+ if generation_context.relevant_documents:
1155
1173
  reference_section = copilot_response_handler.extract_references(
1156
- used_documents
1174
+ generation_context.relevant_documents
1157
1175
  )
1158
1176
  await sse.send(reference_section.to_sse_event().format())
1159
1177