rasa-pro 3.14.0.dev7__py3-none-any.whl → 3.14.0.dev8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rasa-pro might be problematic. Click here for more details.

Files changed (471) hide show
  1. rasa/agents/agent_manager.py +1 -1
  2. rasa/agents/constants.py +2 -2
  3. rasa/agents/protocol/a2a/a2a_agent.py +385 -227
  4. rasa/agents/protocol/mcp/mcp_base_agent.py +30 -13
  5. rasa/agents/protocol/mcp/mcp_open_agent.py +31 -8
  6. rasa/agents/protocol/mcp/mcp_task_agent.py +32 -9
  7. rasa/agents/schemas/agent_output.py +1 -1
  8. rasa/agents/utils.py +90 -1
  9. rasa/builder/README.md +120 -0
  10. rasa/builder/__init__.py +0 -0
  11. rasa/builder/auth.py +176 -0
  12. rasa/builder/config.py +92 -0
  13. rasa/builder/copilot/__init__.py +0 -0
  14. rasa/builder/copilot/constants.py +31 -0
  15. rasa/builder/copilot/copilot.py +450 -0
  16. rasa/builder/copilot/copilot_response_handler.py +522 -0
  17. rasa/builder/copilot/copilot_templated_message_provider.py +58 -0
  18. rasa/builder/copilot/exceptions.py +32 -0
  19. rasa/builder/copilot/models.py +500 -0
  20. rasa/builder/copilot/prompts/__init__.py +0 -0
  21. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +766 -0
  22. rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +61 -0
  23. rasa/builder/copilot/signing.py +305 -0
  24. rasa/builder/copilot/telemetry.py +210 -0
  25. rasa/builder/copilot/templated_messages/__init__.py +0 -0
  26. rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +16 -0
  27. rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +38 -0
  28. rasa/builder/document_retrieval/__init__.py +0 -0
  29. rasa/builder/document_retrieval/constants.py +15 -0
  30. rasa/builder/document_retrieval/inkeep-rag-response-schema.json +64 -0
  31. rasa/builder/document_retrieval/inkeep_document_retrieval.py +238 -0
  32. rasa/builder/document_retrieval/models.py +62 -0
  33. rasa/builder/download.py +140 -0
  34. rasa/builder/exceptions.py +91 -0
  35. rasa/builder/guardrails/__init__.py +1 -0
  36. rasa/builder/guardrails/constants.py +9 -0
  37. rasa/builder/guardrails/exceptions.py +4 -0
  38. rasa/builder/guardrails/lakera.py +206 -0
  39. rasa/builder/guardrails/models.py +231 -0
  40. rasa/builder/guardrails/store.py +238 -0
  41. rasa/builder/guardrails/utils.py +328 -0
  42. rasa/builder/job_manager.py +87 -0
  43. rasa/builder/jobs.py +282 -0
  44. rasa/builder/llm_service.py +246 -0
  45. rasa/builder/logging_utils.py +265 -0
  46. rasa/builder/main.py +243 -0
  47. rasa/builder/models.py +216 -0
  48. rasa/builder/project_generator.py +458 -0
  49. rasa/builder/project_info.py +72 -0
  50. rasa/builder/scrape_rasa_docs.py +97 -0
  51. rasa/builder/service.py +1345 -0
  52. rasa/builder/shared/tracker_context.py +212 -0
  53. rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
  54. rasa/builder/template_cache.py +244 -0
  55. rasa/builder/training_service.py +194 -0
  56. rasa/builder/validation_service.py +97 -0
  57. rasa/cli/project_templates/basic/README.md +23 -0
  58. rasa/cli/project_templates/basic/actions/__init__ +0 -0
  59. rasa/cli/project_templates/basic/actions/action_human_handoff.py +40 -0
  60. rasa/cli/project_templates/basic/actions/actions.md +10 -0
  61. rasa/cli/project_templates/basic/config.yml +29 -0
  62. rasa/cli/project_templates/basic/credentials.yml +33 -0
  63. rasa/cli/project_templates/basic/data/data.md +9 -0
  64. rasa/cli/project_templates/basic/data/general/feedback.yml +21 -0
  65. rasa/cli/project_templates/basic/data/general/goodbye.yml +6 -0
  66. rasa/cli/project_templates/basic/data/general/hello.yml +6 -0
  67. rasa/cli/project_templates/basic/data/general/help.yml +6 -0
  68. rasa/cli/project_templates/basic/data/general/human_handoff.yml +16 -0
  69. rasa/cli/project_templates/basic/data/general/show_faqs.yml +6 -0
  70. rasa/cli/project_templates/basic/data/system/patterns/pattern_cannot_handle.yml +7 -0
  71. rasa/cli/project_templates/basic/data/system/patterns/pattern_completed.yml +7 -0
  72. rasa/cli/project_templates/basic/data/system/patterns/pattern_correction.yml +7 -0
  73. rasa/cli/project_templates/basic/data/system/patterns/pattern_search.yml +8 -0
  74. rasa/cli/project_templates/basic/data/system/patterns/pattern_session_start.yml +8 -0
  75. rasa/cli/project_templates/basic/docs/docs.md +5 -0
  76. rasa/cli/project_templates/basic/docs/template.txt +28 -0
  77. rasa/cli/project_templates/basic/domain/domain.md +8 -0
  78. rasa/cli/project_templates/basic/domain/general/feedback.yml +25 -0
  79. rasa/cli/project_templates/basic/domain/general/goodbye.yml +9 -0
  80. rasa/cli/project_templates/basic/domain/general/hello.yml +7 -0
  81. rasa/cli/project_templates/basic/domain/general/help.yml +21 -0
  82. rasa/cli/project_templates/basic/domain/general/human_handoff.yml +32 -0
  83. rasa/cli/project_templates/basic/domain/general/show_faqs.yml +14 -0
  84. rasa/cli/project_templates/basic/domain/system/patterns/pattern_cannot_handle.yml +5 -0
  85. rasa/cli/project_templates/basic/domain/system/patterns/pattern_session_start.yml +19 -0
  86. rasa/cli/project_templates/basic/endpoints.yml +67 -0
  87. rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
  88. rasa/cli/project_templates/default/config.yml +4 -0
  89. rasa/cli/project_templates/default/endpoints.yml +4 -0
  90. rasa/cli/project_templates/finance/README.md +25 -0
  91. rasa/cli/project_templates/finance/actions/__init__.py +46 -0
  92. rasa/cli/project_templates/finance/actions/accounts/__init__.py +0 -0
  93. rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +47 -0
  94. rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +40 -0
  95. rasa/cli/project_templates/finance/actions/action_session_start.py +74 -0
  96. rasa/cli/project_templates/finance/actions/actions.md +15 -0
  97. rasa/cli/project_templates/finance/actions/cards/__init__.py +0 -0
  98. rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +48 -0
  99. rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +36 -0
  100. rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +54 -0
  101. rasa/cli/project_templates/finance/actions/database.py +277 -0
  102. rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
  103. rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +52 -0
  104. rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +51 -0
  105. rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +40 -0
  106. rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +40 -0
  107. rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +46 -0
  108. rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +18 -0
  109. rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +49 -0
  110. rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +19 -0
  111. rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +36 -0
  112. rasa/cli/project_templates/finance/config.yml +23 -0
  113. rasa/cli/project_templates/finance/credentials.yml +32 -0
  114. rasa/cli/project_templates/finance/csvs/accounts.csv +8 -0
  115. rasa/cli/project_templates/finance/csvs/advisors.csv +7 -0
  116. rasa/cli/project_templates/finance/csvs/appointments.csv +211 -0
  117. rasa/cli/project_templates/finance/csvs/branches.csv +10 -0
  118. rasa/cli/project_templates/finance/csvs/cards.csv +11 -0
  119. rasa/cli/project_templates/finance/csvs/payees.csv +11 -0
  120. rasa/cli/project_templates/finance/csvs/transactions.csv +71 -0
  121. rasa/cli/project_templates/finance/csvs/users.csv +4 -0
  122. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +10 -0
  123. rasa/cli/project_templates/finance/data/cards/block_card.yml +66 -0
  124. rasa/cli/project_templates/finance/data/cards/select_card.yml +12 -0
  125. rasa/cli/project_templates/finance/data/data.md +11 -0
  126. rasa/cli/project_templates/finance/data/general/bot_identity.yml +6 -0
  127. rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
  128. rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
  129. rasa/cli/project_templates/finance/data/general/hello.yml +7 -0
  130. rasa/cli/project_templates/finance/data/general/help.yml +9 -0
  131. rasa/cli/project_templates/finance/data/general/human_handoff.yml +16 -0
  132. rasa/cli/project_templates/finance/data/general/welcome.yml +9 -0
  133. rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +5 -0
  134. rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +7 -0
  135. rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +7 -0
  136. rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +8 -0
  137. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +8 -0
  138. rasa/cli/project_templates/finance/data/system/source/accounts.json +51 -0
  139. rasa/cli/project_templates/finance/data/system/source/advisors.json +44 -0
  140. rasa/cli/project_templates/finance/data/system/source/appointments.json +1474 -0
  141. rasa/cli/project_templates/finance/data/system/source/branches.json +47 -0
  142. rasa/cli/project_templates/finance/data/system/source/cards.json +72 -0
  143. rasa/cli/project_templates/finance/data/system/source/payees.json +74 -0
  144. rasa/cli/project_templates/finance/data/system/source/transactions.json +492 -0
  145. rasa/cli/project_templates/finance/data/system/source/users.json +29 -0
  146. rasa/cli/project_templates/finance/data/transfers/add_payee.yml +29 -0
  147. rasa/cli/project_templates/finance/data/transfers/list_payees.yml +5 -0
  148. rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +21 -0
  149. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +67 -0
  150. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +8 -0
  151. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +8 -0
  152. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +8 -0
  153. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +8 -0
  154. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +8 -0
  155. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +7 -0
  156. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +8 -0
  157. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +8 -0
  158. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +8 -0
  159. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +8 -0
  160. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +8 -0
  161. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +8 -0
  162. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +8 -0
  163. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +8 -0
  164. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +8 -0
  165. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +8 -0
  166. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +8 -0
  167. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +8 -0
  168. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +8 -0
  169. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +8 -0
  170. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +50 -0
  171. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +50 -0
  172. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +48 -0
  173. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +50 -0
  174. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +50 -0
  175. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +47 -0
  176. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +50 -0
  177. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +50 -0
  178. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +47 -0
  179. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +50 -0
  180. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +50 -0
  181. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +50 -0
  182. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +47 -0
  183. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +50 -0
  184. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +50 -0
  185. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +47 -0
  186. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +50 -0
  187. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +50 -0
  188. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +47 -0
  189. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +50 -0
  190. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +50 -0
  191. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +47 -0
  192. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +47 -0
  193. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +50 -0
  194. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +50 -0
  195. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +47 -0
  196. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +50 -0
  197. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +50 -0
  198. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +47 -0
  199. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +50 -0
  200. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +50 -0
  201. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +47 -0
  202. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +50 -0
  203. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +50 -0
  204. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +50 -0
  205. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +47 -0
  206. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +50 -0
  207. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +50 -0
  208. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +47 -0
  209. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +50 -0
  210. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +50 -0
  211. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +47 -0
  212. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +50 -0
  213. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +50 -0
  214. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +50 -0
  215. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +47 -0
  216. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +50 -0
  217. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +50 -0
  218. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +47 -0
  219. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +50 -0
  220. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +50 -0
  221. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +47 -0
  222. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +50 -0
  223. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +50 -0
  224. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +47 -0
  225. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +47 -0
  226. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +50 -0
  227. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +50 -0
  228. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +50 -0
  229. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +50 -0
  230. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +47 -0
  231. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +11 -0
  232. rasa/cli/project_templates/finance/domain/cards/block_card.yml +101 -0
  233. rasa/cli/project_templates/finance/domain/cards/select_card.yml +12 -0
  234. rasa/cli/project_templates/finance/domain/domain.md +10 -0
  235. rasa/cli/project_templates/finance/domain/general/agent_details.yml +12 -0
  236. rasa/cli/project_templates/finance/domain/general/bot_identity.yml +5 -0
  237. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +5 -0
  238. rasa/cli/project_templates/finance/domain/general/defaults.yml +24 -0
  239. rasa/cli/project_templates/finance/domain/general/feedback.yml +28 -0
  240. rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
  241. rasa/cli/project_templates/finance/domain/general/help.yml +5 -0
  242. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +30 -0
  243. rasa/cli/project_templates/finance/domain/general/utils.yml +13 -0
  244. rasa/cli/project_templates/finance/domain/general/welcome.yml +8 -0
  245. rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +47 -0
  246. rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +4 -0
  247. rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +16 -0
  248. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +79 -0
  249. rasa/cli/project_templates/finance/endpoints.yml +66 -0
  250. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +19 -0
  251. rasa/cli/project_templates/telco/README.md +25 -0
  252. rasa/cli/project_templates/telco/actions/__init__.py +0 -0
  253. rasa/cli/project_templates/telco/actions/actions.md +12 -0
  254. rasa/cli/project_templates/telco/actions/billing/__init__.py +0 -0
  255. rasa/cli/project_templates/telco/actions/billing/actions_billing.py +204 -0
  256. rasa/cli/project_templates/telco/actions/general/__init__.py +0 -0
  257. rasa/cli/project_templates/telco/actions/general/action_human_handoff.py +49 -0
  258. rasa/cli/project_templates/telco/actions/network/__init__.py +0 -0
  259. rasa/cli/project_templates/telco/actions/network/actions_get_data_from_db.py +48 -0
  260. rasa/cli/project_templates/telco/actions/network/actions_run_diagnostics.py +28 -0
  261. rasa/cli/project_templates/telco/actions/network/actions_session_start.py +18 -0
  262. rasa/cli/project_templates/telco/config.yml +29 -0
  263. rasa/cli/project_templates/telco/credentials.yml +33 -0
  264. rasa/cli/project_templates/telco/csvs/billing.csv +19 -0
  265. rasa/cli/project_templates/telco/csvs/customers.csv +5 -0
  266. rasa/cli/project_templates/telco/data/billing/flow_understand_bill.yml +45 -0
  267. rasa/cli/project_templates/telco/data/data.md +11 -0
  268. rasa/cli/project_templates/telco/data/general/bot_challenge.yml +6 -0
  269. rasa/cli/project_templates/telco/data/general/feedback.yml +20 -0
  270. rasa/cli/project_templates/telco/data/general/goodbye.yml +6 -0
  271. rasa/cli/project_templates/telco/data/general/hello.yml +6 -0
  272. rasa/cli/project_templates/telco/data/general/human_handoff.yml +16 -0
  273. rasa/cli/project_templates/telco/data/general/patterns.yml +30 -0
  274. rasa/cli/project_templates/telco/data/network/flow_reboot_router.yml +8 -0
  275. rasa/cli/project_templates/telco/data/network/flow_reset_router.yml +7 -0
  276. rasa/cli/project_templates/telco/data/network/flow_solve_internet_issue.yml +73 -0
  277. rasa/cli/project_templates/telco/docs/docs.md +5 -0
  278. rasa/cli/project_templates/telco/docs/network/reset_vs_rboot_router.txt +1 -0
  279. rasa/cli/project_templates/telco/docs/network/restart_router.txt +6 -0
  280. rasa/cli/project_templates/telco/docs/network/run_speed_test.txt +6 -0
  281. rasa/cli/project_templates/telco/domain/billing/understand_bill.yml +102 -0
  282. rasa/cli/project_templates/telco/domain/domain.md +14 -0
  283. rasa/cli/project_templates/telco/domain/general/bot_challenge.yml +4 -0
  284. rasa/cli/project_templates/telco/domain/general/feedback.yml +25 -0
  285. rasa/cli/project_templates/telco/domain/general/goodbye.yml +7 -0
  286. rasa/cli/project_templates/telco/domain/general/hello.yml +5 -0
  287. rasa/cli/project_templates/telco/domain/general/human_handoff.yml +26 -0
  288. rasa/cli/project_templates/telco/domain/general/patterns.yml +33 -0
  289. rasa/cli/project_templates/telco/domain/network/reboot_router.yml +21 -0
  290. rasa/cli/project_templates/telco/domain/network/reset_router.yml +12 -0
  291. rasa/cli/project_templates/telco/domain/network/run_speed_test.yml +25 -0
  292. rasa/cli/project_templates/telco/domain/network/solve_internet_issue.yml +75 -0
  293. rasa/cli/project_templates/telco/domain/shared.yml +129 -0
  294. rasa/cli/project_templates/telco/endpoints.yml +67 -0
  295. rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +40 -0
  296. rasa/cli/project_templates/telco/tests/e2e_test_cases/billing/understand_bill.yml +67 -0
  297. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
  298. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/feedback.yml +46 -0
  299. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/goodbye.yml +9 -0
  300. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/hello.yml +8 -0
  301. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/human_handoff.yml +35 -0
  302. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/patterns.yml +23 -0
  303. rasa/cli/project_templates/telco/tests/e2e_test_cases/network/solve_internet_issue.yml +57 -0
  304. rasa/cli/project_templates/tutorial/config.yml +2 -1
  305. rasa/cli/scaffold.py +46 -2
  306. rasa/core/actions/action.py +0 -1
  307. rasa/core/available_agents.py +2 -0
  308. rasa/core/available_endpoints.py +17 -2
  309. rasa/core/channels/channel.py +4 -3
  310. rasa/core/channels/constants.py +3 -0
  311. rasa/core/channels/development_inspector.py +2 -22
  312. rasa/core/channels/inspector/README.md +26 -14
  313. rasa/core/channels/inspector/dist/assets/{arc-cce7e0a8.js → arc-edef10dd.js} +1 -1
  314. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-e2a49be7.js → blockDiagram-38ab4fdb-49f6762b.js} +1 -1
  315. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-3def7895.js → c4Diagram-3d4e48cf-313c08e6.js} +1 -1
  316. rasa/core/channels/inspector/dist/assets/channel-63aa27d1.js +1 -0
  317. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-e66fe4df.js → classDiagram-70f12bd4-35e41ce9.js} +1 -1
  318. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-eb874aaa.js → classDiagram-v2-f2320105-f346068d.js} +1 -1
  319. rasa/core/channels/inspector/dist/assets/clone-5566bae8.js +1 -0
  320. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-cf934643.js → createText-2e5e7dd3-7a44bce8.js} +1 -1
  321. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-8fdf9155.js → edges-e0da2a9e-d7cf78c7.js} +1 -1
  322. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-6106fb96.js → erDiagram-9861fffd-9813e81c.js} +1 -1
  323. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-4c2bb040.js → flowDb-956e92f1-d8ba0870.js} +1 -1
  324. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-f0ff96af.js → flowDiagram-66a62f08-51f0db4d.js} +1 -1
  325. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-32936074.js +1 -0
  326. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-a21707ec.js → flowchart-elk-definition-4a651766-ff9ea384.js} +1 -1
  327. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-c165acb1.js → ganttDiagram-c361ad54-a8e13b6b.js} +1 -1
  328. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-b0564cf1.js → gitGraphDiagram-72cf32ee-3b171c6d.js} +1 -1
  329. rasa/core/channels/inspector/dist/assets/{graph-e557e67a.js → graph-790ef78b.js} +1 -1
  330. rasa/core/channels/inspector/dist/assets/{index-3862675e-1ce60e9e.js → index-3862675e-ecdce073.js} +1 -1
  331. rasa/core/channels/inspector/dist/assets/index-d705da80.js +1352 -0
  332. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-893569e2.js → infoDiagram-f8f76790-f5a422fe.js} +1 -1
  333. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-c29c864f.js → journeyDiagram-49397b02-3185b7ac.js} +1 -1
  334. rasa/core/channels/inspector/dist/assets/{layout-649a5eae.js → layout-837fd3aa.js} +1 -1
  335. rasa/core/channels/inspector/dist/assets/{line-0e5685ed.js → line-7e05afcb.js} +1 -1
  336. rasa/core/channels/inspector/dist/assets/{linear-eaa320bd.js → linear-162eb295.js} +1 -1
  337. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-f35df9e6.js → mindmap-definition-fc14e90a-f4978aee.js} +1 -1
  338. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-78339e96.js → pieDiagram-8a3498a8-b25d0a52.js} +1 -1
  339. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-9b5f2f14.js → quadrantDiagram-120e2f19-63db1afa.js} +1 -1
  340. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-d05ddb3a.js → requirementDiagram-deff3bca-1b486cc9.js} +1 -1
  341. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-d9be5dfd.js → sankeyDiagram-04a897e0-7e795291.js} +1 -1
  342. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-0f1c4348.js → sequenceDiagram-704730f1-b8aba159.js} +1 -1
  343. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-9ddf63b3.js → stateDiagram-587899a1-41529fd5.js} +1 -1
  344. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-bc2b81ed.js → stateDiagram-v2-d93cdb3a-b241043c.js} +1 -1
  345. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-0a287936.js → styles-6aaf32cf-b5b53234.js} +1 -1
  346. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-e3941990.js → styles-9a916d00-13d138e5.js} +1 -1
  347. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-ce4eca24.js → styles-c10674c1-94cbde3f.js} +1 -1
  348. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-d822b1a8.js → svgDrawCommon-08f97a94-453ae764.js} +1 -1
  349. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-e144c7a7.js → timeline-definition-85554ec2-8dcb88a4.js} +1 -1
  350. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-ab7f4e14.js → xychartDiagram-e933f94c-376af5f0.js} +1 -1
  351. rasa/core/channels/inspector/dist/index.html +2 -2
  352. rasa/core/channels/inspector/index.html +1 -1
  353. rasa/core/channels/inspector/src/App.tsx +16 -42
  354. rasa/core/channels/inspector/src/components/Chat.tsx +2 -3
  355. rasa/core/channels/inspector/src/components/DialogueHistoryStack.tsx +1 -0
  356. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +20 -3
  357. rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +63 -35
  358. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +14 -0
  359. rasa/core/channels/inspector/src/types.ts +32 -7
  360. rasa/core/channels/socketio.py +212 -51
  361. rasa/core/channels/studio_chat.py +59 -57
  362. rasa/core/channels/voice_stream/asr/asr_event.py +1 -1
  363. rasa/core/channels/voice_stream/asr/azure.py +6 -3
  364. rasa/core/channels/voice_stream/asr/deepgram.py +1 -1
  365. rasa/core/channels/voice_stream/audiocodes.py +3 -0
  366. rasa/core/channels/voice_stream/browser_audio.py +53 -3
  367. rasa/core/channels/voice_stream/genesys.py +2 -1
  368. rasa/core/channels/voice_stream/jambonz.py +9 -1
  369. rasa/core/channels/voice_stream/twilio_media_streams.py +16 -0
  370. rasa/core/channels/voice_stream/voice_channel.py +66 -3
  371. rasa/core/constants.py +6 -0
  372. rasa/core/iam_credentials_providers/__init__.py +0 -0
  373. rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +66 -0
  374. rasa/core/iam_credentials_providers/credentials_provider_protocol.py +89 -0
  375. rasa/core/policies/enterprise_search_policy.py +4 -7
  376. rasa/core/policies/flows/flow_executor.py +14 -5
  377. rasa/core/policies/ted_policy.py +7 -5
  378. rasa/core/processor.py +32 -0
  379. rasa/core/redis_connection_factory.py +411 -0
  380. rasa/core/run.py +13 -3
  381. rasa/core/tracker_stores/redis_tracker_store.py +32 -14
  382. rasa/core/tracker_stores/sql_tracker_store.py +57 -1
  383. rasa/dialogue_understanding/generator/flow_retrieval.py +10 -9
  384. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +10 -5
  385. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +10 -5
  386. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +20 -12
  387. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +19 -12
  388. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +6 -35
  389. rasa/dialogue_understanding/patterns/cancel.py +27 -6
  390. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +1 -1
  391. rasa/dialogue_understanding/processor/command_processor.py +35 -0
  392. rasa/engine/graph.py +5 -1
  393. rasa/engine/recipes/default_components.py +78 -10
  394. rasa/engine/recipes/default_recipe.py +41 -1
  395. rasa/engine/storage/local_model_storage.py +83 -3
  396. rasa/graph_components/validators/default_recipe_validator.py +153 -135
  397. rasa/model_manager/model_api.py +4 -5
  398. rasa/model_manager/runner_service.py +1 -1
  399. rasa/model_manager/socket_bridge.py +20 -15
  400. rasa/model_manager/trainer_service.py +12 -9
  401. rasa/model_manager/utils.py +1 -29
  402. rasa/model_manager/warm_rasa_process.py +1 -1
  403. rasa/model_training.py +14 -0
  404. rasa/nlu/classifiers/diet_classifier.py +22 -6
  405. rasa/nlu/classifiers/logistic_regression_classifier.py +18 -0
  406. rasa/nlu/extractors/extractor.py +1 -2
  407. rasa/shared/agents/auth/__init__.py +0 -0
  408. rasa/shared/agents/auth/agent_auth_factory.py +74 -0
  409. rasa/shared/agents/auth/agent_auth_manager.py +86 -0
  410. rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
  411. rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
  412. rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
  413. rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
  414. rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +159 -0
  415. rasa/shared/agents/auth/constants.py +11 -0
  416. rasa/shared/agents/auth/types.py +11 -0
  417. rasa/shared/core/constants.py +1 -0
  418. rasa/shared/core/domain.py +58 -11
  419. rasa/shared/core/events.py +2 -0
  420. rasa/shared/core/flows/constants.py +5 -0
  421. rasa/shared/core/flows/flow_step.py +7 -1
  422. rasa/shared/core/flows/flows_list.py +6 -0
  423. rasa/shared/core/flows/steps/call.py +15 -12
  424. rasa/shared/core/flows/validation.py +238 -44
  425. rasa/shared/core/flows/yaml_flows_io.py +15 -6
  426. rasa/shared/core/slots.py +4 -0
  427. rasa/shared/exceptions.py +12 -0
  428. rasa/shared/importers/importer.py +6 -0
  429. rasa/shared/importers/utils.py +77 -1
  430. rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
  431. rasa/shared/providers/_utils.py +60 -44
  432. rasa/shared/providers/embedding/default_litellm_embedding_client.py +2 -0
  433. rasa/shared/providers/llm/_base_litellm_client.py +2 -2
  434. rasa/shared/providers/llm/default_litellm_llm_client.py +2 -0
  435. rasa/shared/providers/llm/llm_response.py +4 -4
  436. rasa/shared/utils/common.py +24 -0
  437. rasa/shared/utils/llm.py +2 -1
  438. rasa/shared/utils/mcp/server_connection.py +84 -23
  439. rasa/shared/utils/mcp/utils.py +20 -0
  440. rasa/studio/upload.py +16 -47
  441. rasa/telemetry.py +97 -23
  442. rasa/tracing/config.py +38 -12
  443. rasa/tracing/instrumentation/attribute_extractors.py +5 -1
  444. rasa/tracing/instrumentation/instrumentation.py +85 -8
  445. rasa/utils/common.py +1 -1
  446. rasa/utils/io.py +27 -9
  447. rasa/utils/json_utils.py +6 -1
  448. rasa/utils/log_utils.py +5 -1
  449. rasa/utils/openapi.py +144 -0
  450. rasa/utils/tensorflow/__init__.py +29 -0
  451. rasa/utils/tensorflow/callback.py +1 -1
  452. rasa/utils/tensorflow/crf.py +1 -1
  453. rasa/utils/tensorflow/data_generator.py +21 -8
  454. rasa/utils/tensorflow/layers.py +11 -4
  455. rasa/utils/tensorflow/metrics.py +7 -3
  456. rasa/utils/tensorflow/models.py +41 -6
  457. rasa/utils/tensorflow/rasa_layers.py +6 -4
  458. rasa/utils/tensorflow/transformer.py +2 -3
  459. rasa/utils/train_utils.py +68 -38
  460. rasa/validator.py +18 -16
  461. rasa/version.py +1 -1
  462. rasa_pro-3.14.0.dev8.dist-info/METADATA +199 -0
  463. {rasa_pro-3.14.0.dev7.dist-info → rasa_pro-3.14.0.dev8.dist-info}/RECORD +466 -156
  464. rasa/core/channels/inspector/dist/assets/channel-858c2c20.js +0 -1
  465. rasa/core/channels/inspector/dist/assets/clone-4b80996c.js +0 -1
  466. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-16f09b7a.js +0 -1
  467. rasa/core/channels/inspector/dist/assets/index-996fe816.js +0 -1353
  468. rasa_pro-3.14.0.dev7.dist-info/METADATA +0 -190
  469. {rasa_pro-3.14.0.dev7.dist-info → rasa_pro-3.14.0.dev8.dist-info}/NOTICE +0 -0
  470. {rasa_pro-3.14.0.dev7.dist-info → rasa_pro-3.14.0.dev8.dist-info}/WHEEL +0 -0
  471. {rasa_pro-3.14.0.dev7.dist-info → rasa_pro-3.14.0.dev8.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,328 @@
1
+ import asyncio
2
+ from functools import lru_cache
3
+ from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple
4
+
5
+ import structlog
6
+
7
+ from rasa.builder.config import (
8
+ ASSISTANT_HISTORY_GUARDRAIL_PROJECT_ID,
9
+ COPILOT_HISTORY_GUARDRAIL_PROJECT_ID,
10
+ )
11
+ from rasa.builder.copilot.constants import ROLE_COPILOT, ROLE_USER
12
+ from rasa.builder.copilot.copilot_response_handler import CopilotResponseHandler
13
+ from rasa.builder.copilot.models import (
14
+ CopilotChatMessage,
15
+ CopilotContext,
16
+ GeneratedContent,
17
+ ResponseCategory,
18
+ )
19
+ from rasa.builder.guardrails.models import (
20
+ GuardrailRequestKey,
21
+ GuardrailResponse,
22
+ LakeraGuardrailRequest,
23
+ )
24
+ from rasa.builder.llm_service import llm_service
25
+ from rasa.builder.shared.tracker_context import (
26
+ AssistantConversationTurn,
27
+ TrackerContext,
28
+ )
29
+
30
+ if TYPE_CHECKING:
31
+ from rasa.builder.guardrails.models import GuardrailType
32
+
33
+
34
+ structlogger = structlog.get_logger()
35
+
36
+
37
+ def map_lakera_detector_type_to_guardrail_type(
38
+ lakera_detector_type: str,
39
+ ) -> Optional["GuardrailType"]:
40
+ """Map a Lakera detector type to a Rasa guardrail type."""
41
+ from rasa.builder.guardrails.models import GuardrailType
42
+
43
+ # Check for exact matches first
44
+ LAKERA_DETECTOR_TYPES_2_RASA_GUARDRAIL_TYPES_MAPPING = {
45
+ "prompt_attack": GuardrailType.PROMPT_ATTACK,
46
+ "unknown_links": GuardrailType.MALICIOUS_LINKS,
47
+ "custom": GuardrailType.CUSTOM,
48
+ }
49
+
50
+ # Check for exact match first
51
+ if lakera_detector_type in LAKERA_DETECTOR_TYPES_2_RASA_GUARDRAIL_TYPES_MAPPING:
52
+ return LAKERA_DETECTOR_TYPES_2_RASA_GUARDRAIL_TYPES_MAPPING[
53
+ lakera_detector_type
54
+ ]
55
+
56
+ # Check for subtypes that start with specific prefixes
57
+ # https://docs.lakera.ai/docs/policies/self-hosted-policies#detectors-section
58
+ if lakera_detector_type.startswith("moderated_content"):
59
+ return GuardrailType.CONTENT_VIOLATION
60
+ if lakera_detector_type.startswith("pii"):
61
+ return GuardrailType.DATA_LEAKAGE
62
+
63
+ # If no match found, return OTHER
64
+ return GuardrailType.OTHER
65
+
66
+
67
+ @lru_cache(maxsize=512)
68
+ def _schedule_guardrails_check(
69
+ user_text: str,
70
+ hello_rasa_user_id: str,
71
+ hello_rasa_project_id: str,
72
+ lakera_project_id: str,
73
+ ) -> "asyncio.Task[GuardrailResponse]":
74
+ """Return a cached asyncio.Task that resolves to Lakera's response.
75
+
76
+ Args:
77
+ user_text: The user message text to check for policy violations.
78
+ hello_rasa_user_id: The user ID for the conversation.
79
+ hello_rasa_project_id: The project ID for the conversation.
80
+ lakera_project_id: The Lakera project ID to use for this check.
81
+
82
+ Returns:
83
+ An asyncio Task that resolves to a GuardrailResponse.
84
+ """
85
+ structlogger.debug("guardrails.cache_miss", text=user_text)
86
+
87
+ loop = asyncio.get_running_loop()
88
+ request = LakeraGuardrailRequest(
89
+ lakera_project_id=lakera_project_id,
90
+ hello_rasa_user_id=hello_rasa_user_id,
91
+ hello_rasa_project_id=hello_rasa_project_id,
92
+ messages=[{"role": ROLE_USER, "content": user_text}],
93
+ )
94
+
95
+ return loop.create_task(llm_service.guardrails.send_request(request))
96
+
97
+
98
+ async def _detect_flagged_user_indices(
99
+ items: List[Tuple[int, str]],
100
+ *,
101
+ hello_rasa_user_id: Optional[str],
102
+ hello_rasa_project_id: Optional[str],
103
+ lakera_project_id: str,
104
+ log_prefix: str,
105
+ ) -> Set[int]:
106
+ """Run guardrail checks for provided (index, user_text) pairs.
107
+
108
+ Args:
109
+ items: List of tuples containing (index, user_text) to check.
110
+ hello_rasa_user_id: The user ID for the conversation.
111
+ hello_rasa_project_id: The project ID for the conversation.
112
+ lakera_project_id: The Lakera project ID to use for this check.
113
+ log_prefix: Prefix for logging messages.
114
+
115
+ Returns:
116
+ A set of indices that were flagged by the guardrails.
117
+ """
118
+ if not items:
119
+ return set()
120
+
121
+ # 1) Group indices by logical request key (hashable by value)
122
+ indices_by_key: Dict[GuardrailRequestKey, List[int]] = {}
123
+ for idx, text in items:
124
+ key = GuardrailRequestKey(
125
+ user_text=(text or "").strip(),
126
+ hello_rasa_user_id=hello_rasa_user_id or "",
127
+ hello_rasa_project_id=hello_rasa_project_id or "",
128
+ lakera_project_id=lakera_project_id,
129
+ )
130
+ if not key.user_text:
131
+ continue
132
+ indices_by_key.setdefault(key, []).append(idx)
133
+
134
+ if not indices_by_key:
135
+ return set()
136
+
137
+ # 2) Create one task per logical key
138
+ tasks_by_key: Dict[GuardrailRequestKey, asyncio.Task[GuardrailResponse]] = {}
139
+ for key in indices_by_key:
140
+ tasks_by_key[key] = _schedule_guardrails_check(
141
+ user_text=key.user_text,
142
+ hello_rasa_user_id=key.hello_rasa_user_id,
143
+ hello_rasa_project_id=key.hello_rasa_project_id,
144
+ lakera_project_id=key.lakera_project_id,
145
+ )
146
+
147
+ # 3) Await unique tasks once
148
+ keys = list(tasks_by_key.keys())
149
+ tasks = [tasks_by_key[k] for k in keys]
150
+ responses = await asyncio.gather(*tasks, return_exceptions=True)
151
+
152
+ # 4) Map results back to all corresponding indices
153
+ flagged: Set[int] = set()
154
+ for key, response in zip(keys, responses):
155
+ if isinstance(response, Exception):
156
+ structlogger.warning(f"{log_prefix}.request_failed", error=str(response))
157
+ continue
158
+ if response.flagged: # type: ignore[union-attr]
159
+ flagged.update(indices_by_key.get(key, []))
160
+
161
+ return flagged
162
+
163
+
164
+ async def check_assistant_chat_for_policy_violations(
165
+ tracker_context: TrackerContext,
166
+ hello_rasa_user_id: Optional[str],
167
+ hello_rasa_project_id: Optional[str],
168
+ ) -> TrackerContext:
169
+ """Return a sanitised TrackerContext with unsafe turns removed.
170
+
171
+ Only user messages are moderated – assistant messages are assumed safe.
172
+ LRU cache is used, so each unique user text is checked once.
173
+
174
+ Args:
175
+ tracker_context: The TrackerContext containing conversation turns.
176
+ hello_rasa_user_id: The user ID for the conversation.
177
+ hello_rasa_project_id: The project ID for the conversation.
178
+
179
+ Returns:
180
+ TrackerContext with unsafe turns removed.
181
+ """
182
+ # Collect (turn_index, user_text) for all turns with a user message
183
+ items: List[Tuple[int, str]] = []
184
+ for idx, turn in enumerate(tracker_context.conversation_turns):
185
+ user_message = turn.user_message
186
+ if not user_message:
187
+ continue
188
+
189
+ text = (user_message.text or "").strip()
190
+ if not text:
191
+ continue
192
+
193
+ items.append((idx, text))
194
+
195
+ flagged_turns = await _detect_flagged_user_indices(
196
+ items,
197
+ hello_rasa_user_id=hello_rasa_user_id,
198
+ hello_rasa_project_id=hello_rasa_project_id,
199
+ lakera_project_id=ASSISTANT_HISTORY_GUARDRAIL_PROJECT_ID,
200
+ log_prefix="assistant_guardrails",
201
+ )
202
+
203
+ if not flagged_turns:
204
+ return tracker_context
205
+
206
+ structlogger.info(
207
+ "assistant_guardrails.turns_flagged",
208
+ count=len(flagged_turns),
209
+ turn_indices=sorted(flagged_turns),
210
+ )
211
+
212
+ # Build a filtered TrackerContext
213
+ safe_turns: List[AssistantConversationTurn] = [
214
+ turn
215
+ for idx, turn in enumerate(tracker_context.conversation_turns)
216
+ if idx not in flagged_turns
217
+ ]
218
+
219
+ new_tracker_context = tracker_context.copy(deep=True)
220
+ new_tracker_context.conversation_turns = safe_turns
221
+ return new_tracker_context
222
+
223
+
224
+ def _annotate_flagged_user_messages(
225
+ history: List[CopilotChatMessage], flagged_user_indices: Set[int]
226
+ ) -> None:
227
+ """Mark flagged user messages in-place on the original history.
228
+
229
+ Args:
230
+ history: The copilot chat history containing messages.
231
+ flagged_user_indices: Set of indices of user messages that were flagged.
232
+ """
233
+ if not flagged_user_indices:
234
+ return
235
+
236
+ total = len(history)
237
+ for uidx in flagged_user_indices:
238
+ if 0 <= uidx < total and history[uidx].role == ROLE_USER:
239
+ history[
240
+ uidx
241
+ ].response_category = ResponseCategory.GUARDRAILS_POLICY_VIOLATION
242
+
243
+
244
+ async def check_copilot_chat_for_policy_violations(
245
+ context: CopilotContext,
246
+ hello_rasa_user_id: Optional[str],
247
+ hello_rasa_project_id: Optional[str],
248
+ ) -> Optional[GeneratedContent]:
249
+ """Check the copilot chat history for guardrail policy violations.
250
+
251
+ Only user messages are moderated – assistant messages are assumed safe.
252
+ LRU cache is used, so each unique user text is checked once.
253
+
254
+ Args:
255
+ context: The CopilotContext containing the copilot chat history.
256
+ hello_rasa_user_id: The user ID for the conversation.
257
+ hello_rasa_project_id: The project ID for the conversation.
258
+
259
+ Returns:
260
+ Returns a default violation response if the system flags any user message,
261
+ otherwise return None.
262
+ """
263
+ history = context.copilot_chat_history
264
+
265
+ # Collect (index, text) for user messages; skip ones already marked as violations
266
+ items: List[Tuple[int, str]] = []
267
+ for idx, message in enumerate(history):
268
+ if message.response_category == ResponseCategory.GUARDRAILS_POLICY_VIOLATION:
269
+ continue
270
+ if message.role != ROLE_USER:
271
+ continue
272
+ formatted_message = message.to_openai_format()
273
+ text = (formatted_message.get("content") or "").strip()
274
+ if not text:
275
+ continue
276
+ items.append((idx, text))
277
+
278
+ flagged_user_indices = await _detect_flagged_user_indices(
279
+ items,
280
+ hello_rasa_user_id=hello_rasa_user_id,
281
+ hello_rasa_project_id=hello_rasa_project_id,
282
+ lakera_project_id=COPILOT_HISTORY_GUARDRAIL_PROJECT_ID,
283
+ log_prefix="copilot_guardrails",
284
+ )
285
+
286
+ _annotate_flagged_user_messages(history, flagged_user_indices)
287
+
288
+ if not flagged_user_indices:
289
+ return None
290
+
291
+ # Identify the latest user message index in the current request
292
+ last_user_idx: Optional[int] = None
293
+ for i in range(len(history) - 1, -1, -1):
294
+ if getattr(history[i], "role", None) == ROLE_USER:
295
+ last_user_idx = i
296
+ break
297
+
298
+ # Remove flagged user messages and their next copilot messages
299
+ indices_to_remove: Set[int] = set()
300
+ total = len(history)
301
+ for uidx in flagged_user_indices:
302
+ indices_to_remove.add(uidx)
303
+ next_idx = uidx + 1
304
+ if (
305
+ next_idx < total
306
+ and getattr(history[next_idx], "role", None) == ROLE_COPILOT
307
+ ):
308
+ indices_to_remove.add(next_idx)
309
+
310
+ # Apply sanitization
311
+ filtered_history = [
312
+ msg for i, msg in enumerate(history) if i not in indices_to_remove
313
+ ]
314
+ if len(filtered_history) != len(history):
315
+ structlogger.info(
316
+ "copilot_guardrails.history_sanitized",
317
+ removed_indices=sorted(indices_to_remove),
318
+ removed_messages=len(history) - len(filtered_history),
319
+ kept_messages=len(filtered_history),
320
+ )
321
+ context.copilot_chat_history = filtered_history
322
+
323
+ # Block only if the latest user message in this request was flagged
324
+ if last_user_idx is not None and last_user_idx in flagged_user_indices:
325
+ return CopilotResponseHandler.respond_to_guardrail_policy_violations()
326
+
327
+ # Otherwise proceed (following messages are respected)
328
+ return None
@@ -0,0 +1,87 @@
1
+ import asyncio
2
+ import time
3
+ import uuid
4
+ from typing import AsyncGenerator, ClassVar, Dict, List, Optional
5
+
6
+ from pydantic import BaseModel, Field, PrivateAttr
7
+
8
+ from rasa.builder.models import JobStatusEvent, ServerSentEventType
9
+
10
+
11
+ class JobInfo(BaseModel):
12
+ """Information about a job being processed by the worker."""
13
+
14
+ id: str
15
+ status: str = ""
16
+ error: Optional[str] = None
17
+ created_at: float = Field(default_factory=time.time)
18
+
19
+ _history: List[JobStatusEvent] = PrivateAttr(default_factory=list)
20
+ _queue: asyncio.Queue = PrivateAttr(default_factory=asyncio.Queue)
21
+
22
+ class Config:
23
+ arbitrary_types_allowed = True
24
+
25
+ async def put(self, event: JobStatusEvent) -> None:
26
+ """Put an event onto the job's queue.
27
+
28
+ Args:
29
+ event: The JobStatusEvent to put onto the queue.
30
+ """
31
+ await self._queue.put(event)
32
+
33
+ async def event_stream(self) -> AsyncGenerator[JobStatusEvent, None]:
34
+ """Yield events as they are put on the queue by the worker task.
35
+
36
+ Returns:
37
+ An async generator that yields JobStatusEvent objects.
38
+ """
39
+ # 1) Replay history and stop if EOF recorded
40
+ for sse in self._history:
41
+ if (
42
+ isinstance(sse, JobStatusEvent)
43
+ and sse.event == ServerSentEventType._EOF.value
44
+ ):
45
+ return
46
+ yield sse
47
+
48
+ # 2) Stream live events and stop on EOF
49
+ while True:
50
+ sse = await self._queue.get()
51
+ self._history.append(sse)
52
+ if (
53
+ isinstance(sse, JobStatusEvent)
54
+ and sse.event == ServerSentEventType._EOF.value
55
+ ):
56
+ return
57
+ yield sse
58
+
59
+
60
+ class JobManager:
61
+ """Very small in-memory job registry (single-process only)."""
62
+
63
+ _jobs: ClassVar[Dict[str, JobInfo]] = {}
64
+
65
+ def create_job(self) -> JobInfo:
66
+ job_id = uuid.uuid4().hex
67
+ job = JobInfo(id=job_id)
68
+ self._jobs[job_id] = job
69
+ return job
70
+
71
+ def get_job(self, job_id: str) -> Optional[JobInfo]:
72
+ return self._jobs.get(job_id)
73
+
74
+ @staticmethod
75
+ def mark_done(job: JobInfo, *, error: Optional[str] = None) -> None:
76
+ """Mark a job as done.
77
+
78
+ Args:
79
+ job: The JobInfo instance to mark as done.
80
+ error: Optional error message if the job failed.
81
+ """
82
+ job.error = error
83
+ eof = JobStatusEvent.eof()
84
+ job._queue.put_nowait(eof)
85
+
86
+
87
+ job_manager = JobManager()
rasa/builder/jobs.py ADDED
@@ -0,0 +1,282 @@
1
+ from typing import Any, Optional
2
+
3
+ import structlog
4
+ from sanic import Sanic
5
+
6
+ from rasa.builder import config
7
+ from rasa.builder.exceptions import (
8
+ LLMGenerationError,
9
+ ProjectGenerationError,
10
+ TrainingError,
11
+ ValidationError,
12
+ )
13
+ from rasa.builder.job_manager import JobInfo, job_manager
14
+ from rasa.builder.models import (
15
+ JobStatus,
16
+ JobStatusEvent,
17
+ )
18
+ from rasa.builder.project_generator import ProjectGenerator
19
+ from rasa.builder.training_service import (
20
+ train_and_load_agent,
21
+ try_load_existing_agent,
22
+ update_agent,
23
+ )
24
+ from rasa.builder.validation_service import validate_project
25
+ from rasa.cli.scaffold import ProjectTemplateName
26
+
27
+ structlogger = structlog.get_logger()
28
+
29
+
30
+ async def push_job_status_event(
31
+ job: JobInfo, status: JobStatus, message: Optional[str] = None
32
+ ) -> None:
33
+ event = JobStatusEvent.from_status(status=status.value, message=message)
34
+ job.status = status.value
35
+ await job.put(event)
36
+
37
+
38
+ async def run_prompt_to_bot_job(
39
+ app: Any,
40
+ job: JobInfo,
41
+ prompt: str,
42
+ ) -> None:
43
+ """Run the prompt-to-bot job in the background.
44
+
45
+ Args:
46
+ app: The Sanic application instance.
47
+ job: The job information instance.
48
+ prompt: The natural language prompt for bot generation.
49
+ """
50
+ project_generator: ProjectGenerator = app.ctx.project_generator
51
+
52
+ await push_job_status_event(job, JobStatus.received)
53
+
54
+ try:
55
+ # 1. Generating
56
+ await push_job_status_event(job, JobStatus.generating)
57
+ bot_files = await project_generator.generate_project_with_retries(
58
+ prompt,
59
+ template=ProjectTemplateName.BASIC,
60
+ )
61
+ await push_job_status_event(job, JobStatus.generation_success)
62
+
63
+ # 2. Training
64
+ await push_job_status_event(job, JobStatus.training)
65
+ agent = await train_and_load_agent(project_generator.get_training_input())
66
+ update_agent(agent, app)
67
+ await push_job_status_event(job, JobStatus.train_success)
68
+
69
+ structlogger.info(
70
+ "bot_builder_service.prompt_to_bot.success",
71
+ files_generated=list(bot_files.keys()),
72
+ )
73
+ await push_job_status_event(job, JobStatus.done)
74
+ job_manager.mark_done(job)
75
+
76
+ except TrainingError as exc:
77
+ structlogger.debug(
78
+ "prompt_to_bot_job.training_error", job_id=job.id, error=str(exc)
79
+ )
80
+ await push_job_status_event(job, JobStatus.train_error, message=str(exc))
81
+ job_manager.mark_done(job, error=str(exc))
82
+
83
+ except ValidationError as exc:
84
+ # Log levels to include in the error message
85
+ log_levels = ["error"]
86
+ if config.VALIDATION_FAIL_ON_WARNINGS:
87
+ log_levels.append("warning")
88
+
89
+ structlogger.debug(
90
+ "prompt_to_bot_job.validation_error",
91
+ job_id=job.id,
92
+ error=str(exc),
93
+ all_validation_logs=exc.validation_logs,
94
+ included_log_levels=log_levels,
95
+ )
96
+
97
+ error_message = exc.get_error_message_with_logs(log_levels=log_levels)
98
+ await push_job_status_event(
99
+ job, JobStatus.validation_error, message=error_message
100
+ )
101
+ job_manager.mark_done(job, error=error_message)
102
+
103
+ except (ProjectGenerationError, LLMGenerationError) as exc:
104
+ structlogger.debug(
105
+ "prompt_to_bot_job.generation_error", job_id=job.id, error=str(exc)
106
+ )
107
+ await push_job_status_event(job, JobStatus.generation_error, message=str(exc))
108
+ job_manager.mark_done(job, error=str(exc))
109
+
110
+ except Exception as exc:
111
+ # Capture full traceback
112
+ structlogger.exception(
113
+ "prompt_to_bot_job.unexpected_error", job_id=job.id, error=str(exc)
114
+ )
115
+ await push_job_status_event(job, JobStatus.error, message=str(exc))
116
+ job_manager.mark_done(job, error=str(exc))
117
+
118
+
119
+ async def run_template_to_bot_job(
120
+ app: "Sanic",
121
+ job: JobInfo,
122
+ template_name: ProjectTemplateName,
123
+ ) -> None:
124
+ """Run the template-to-bot job in the background.
125
+
126
+ Args:
127
+ app: The Sanic application instance.
128
+ job: The job information instance.
129
+ template_name: The name of the template to use for bot generation.
130
+ """
131
+ project_generator: ProjectGenerator = app.ctx.project_generator
132
+
133
+ await push_job_status_event(job, JobStatus.received)
134
+
135
+ try:
136
+ # 1) Generating
137
+ await push_job_status_event(job, JobStatus.generating)
138
+ await project_generator.init_from_template(template_name)
139
+ bot_files = project_generator.get_bot_files()
140
+ await push_job_status_event(job, JobStatus.generation_success)
141
+
142
+ # 2) Training
143
+ await push_job_status_event(job, JobStatus.training)
144
+ agent = await try_load_existing_agent(project_generator.project_folder)
145
+ if agent is None:
146
+ agent = await train_and_load_agent(project_generator.get_training_input())
147
+ else:
148
+ structlogger.info(
149
+ "bot_builder_service.template_to_bot.agent_loaded_from_cache",
150
+ )
151
+ update_agent(agent, app)
152
+ await push_job_status_event(job, JobStatus.train_success)
153
+
154
+ # 3) Done
155
+ structlogger.info(
156
+ "bot_builder_service.template_to_bot.success",
157
+ files_generated=list(bot_files.keys()),
158
+ )
159
+ await push_job_status_event(job, JobStatus.done)
160
+ job_manager.mark_done(job)
161
+
162
+ except TrainingError as exc:
163
+ structlogger.debug(
164
+ "template_to_bot_job.training_error",
165
+ job_id=job.id,
166
+ error=str(exc),
167
+ )
168
+ await push_job_status_event(job, JobStatus.train_error, message=str(exc))
169
+ job_manager.mark_done(job, error=str(exc))
170
+
171
+ except ValidationError as exc:
172
+ # Log levels to include in the error message
173
+ log_levels = ["error"]
174
+ if config.VALIDATION_FAIL_ON_WARNINGS:
175
+ log_levels.append("warning")
176
+
177
+ structlogger.debug(
178
+ "template_to_bot_job.validation_error",
179
+ job_id=job.id,
180
+ error=str(exc),
181
+ all_validation_logs=exc.validation_logs,
182
+ included_log_levels=log_levels,
183
+ )
184
+ error_message = exc.get_error_message_with_logs(log_levels=log_levels)
185
+ await push_job_status_event(
186
+ job, JobStatus.validation_error, message=error_message
187
+ )
188
+ job_manager.mark_done(job, error=error_message)
189
+
190
+ except ProjectGenerationError as exc:
191
+ structlogger.debug(
192
+ "template_to_bot_job.generation_error",
193
+ job_id=job.id,
194
+ error=str(exc),
195
+ )
196
+ await push_job_status_event(job, JobStatus.generation_error, message=str(exc))
197
+ job_manager.mark_done(job, error=str(exc))
198
+
199
+ except Exception as exc:
200
+ # Capture full traceback
201
+ structlogger.exception(
202
+ "template_to_bot_job.unexpected_error",
203
+ job_id=job.id,
204
+ error=str(exc),
205
+ )
206
+ await push_job_status_event(job, JobStatus.error, message=str(exc))
207
+ job_manager.mark_done(job, error=str(exc))
208
+
209
+
210
+ async def run_replace_all_files_job(
211
+ app: "Sanic",
212
+ job: JobInfo,
213
+ bot_files: dict,
214
+ ) -> None:
215
+ """Run the replace-all-files job in the background.
216
+
217
+ This replaces all bot files with the provided files and deletes any files
218
+ not included in the request (excluding .rasa/ and models/ directories).
219
+
220
+ Args:
221
+ app: The Sanic application instance.
222
+ job: The job information instance.
223
+ bot_files: Dictionary of file names to content for replacement.
224
+ """
225
+ project_generator = app.ctx.project_generator
226
+ await push_job_status_event(job, JobStatus.received)
227
+
228
+ try:
229
+ project_generator.replace_all_bot_files(bot_files)
230
+
231
+ # 1. Validating
232
+ await push_job_status_event(job, JobStatus.validating)
233
+ training_input = project_generator.get_training_input()
234
+ validation_error = await validate_project(training_input.importer)
235
+ if validation_error:
236
+ raise ValidationError(validation_error)
237
+ await push_job_status_event(job, JobStatus.validation_success)
238
+
239
+ # 2. Training
240
+ await push_job_status_event(job, JobStatus.training)
241
+ agent = await train_and_load_agent(training_input)
242
+ update_agent(agent, app)
243
+ await push_job_status_event(job, JobStatus.train_success)
244
+
245
+ await push_job_status_event(job, JobStatus.done)
246
+ job_manager.mark_done(job)
247
+
248
+ except ValidationError as exc:
249
+ log_levels = ["error"]
250
+ if config.VALIDATION_FAIL_ON_WARNINGS:
251
+ log_levels.append("warning")
252
+ structlogger.debug(
253
+ "replace_all_files_job.validation_error",
254
+ job_id=job.id,
255
+ error=str(exc),
256
+ validation_logs=exc.validation_logs,
257
+ included_log_levels=log_levels,
258
+ )
259
+ error_message = exc.get_error_message_with_logs(log_levels=log_levels)
260
+ await push_job_status_event(
261
+ job, JobStatus.validation_error, message=error_message
262
+ )
263
+ job_manager.mark_done(job, error=error_message)
264
+
265
+ except TrainingError as exc:
266
+ structlogger.debug(
267
+ "replace_all_files_job.train_error",
268
+ job_id=job.id,
269
+ error=str(exc),
270
+ )
271
+ await push_job_status_event(job, JobStatus.train_error, message=str(exc))
272
+ job_manager.mark_done(job, error=str(exc))
273
+
274
+ except Exception as exc:
275
+ # Capture full traceback for anything truly unexpected
276
+ structlogger.exception(
277
+ "replace_all_files_job.unexpected_error",
278
+ job_id=job.id,
279
+ error=str(exc),
280
+ )
281
+ await push_job_status_event(job, JobStatus.error, message=str(exc))
282
+ job_manager.mark_done(job, error=str(exc))