rasa-pro 3.14.0.dev4__py3-none-any.whl → 3.14.0.dev5__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 (463) hide show
  1. rasa/api.py +0 -5
  2. rasa/builder/README.md +120 -0
  3. rasa/builder/auth.py +176 -0
  4. rasa/builder/config.py +115 -0
  5. rasa/builder/copilot/constants.py +25 -0
  6. rasa/builder/copilot/copilot.py +372 -0
  7. rasa/builder/copilot/copilot_response_handler.py +487 -0
  8. rasa/builder/copilot/copilot_templated_message_provider.py +58 -0
  9. rasa/builder/copilot/exceptions.py +20 -0
  10. rasa/builder/copilot/models.py +431 -0
  11. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +726 -0
  12. rasa/builder/copilot/telemetry.py +195 -0
  13. rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +16 -0
  14. rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +26 -0
  15. rasa/builder/document_retrieval/constants.py +15 -0
  16. rasa/builder/document_retrieval/inkeep-rag-response-schema.json +64 -0
  17. rasa/builder/document_retrieval/inkeep_document_retrieval.py +238 -0
  18. rasa/builder/document_retrieval/models.py +62 -0
  19. rasa/builder/download.py +140 -0
  20. rasa/builder/exceptions.py +55 -0
  21. rasa/builder/guardrails/__init__.py +1 -0
  22. rasa/builder/guardrails/constants.py +3 -0
  23. rasa/builder/guardrails/exceptions.py +4 -0
  24. rasa/builder/guardrails/lakera.py +206 -0
  25. rasa/builder/guardrails/models.py +199 -0
  26. rasa/builder/guardrails/utils.py +305 -0
  27. rasa/builder/job_manager.py +87 -0
  28. rasa/builder/jobs.py +234 -0
  29. rasa/builder/llm_service.py +246 -0
  30. rasa/builder/logging_utils.py +209 -0
  31. rasa/builder/main.py +174 -0
  32. rasa/builder/models.py +197 -0
  33. rasa/builder/project_generator.py +450 -0
  34. rasa/builder/project_info.py +72 -0
  35. rasa/builder/scrape_rasa_docs.py +97 -0
  36. rasa/builder/service.py +1142 -0
  37. rasa/builder/shared/tracker_context.py +212 -0
  38. rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
  39. rasa/builder/training_service.py +132 -0
  40. rasa/builder/validation_service.py +93 -0
  41. rasa/cli/arguments/default_arguments.py +0 -12
  42. rasa/cli/arguments/run.py +0 -2
  43. rasa/cli/dialogue_understanding_test.py +0 -4
  44. rasa/cli/e2e_test.py +0 -4
  45. rasa/cli/inspect.py +0 -3
  46. rasa/cli/llm_fine_tuning.py +0 -5
  47. rasa/cli/project_templates/basic/actions/action_api.py +15 -0
  48. rasa/cli/project_templates/basic/actions/action_human_handoff.py +44 -0
  49. rasa/cli/project_templates/basic/config.yml +23 -0
  50. rasa/cli/project_templates/basic/credentials.yml +34 -0
  51. rasa/cli/project_templates/basic/data/general/feedback.yml +20 -0
  52. rasa/cli/project_templates/basic/data/general/goodbye.yml +6 -0
  53. rasa/cli/project_templates/basic/data/general/hello.yml +7 -0
  54. rasa/cli/project_templates/basic/data/general/help.yml +6 -0
  55. rasa/cli/project_templates/basic/data/general/human_handoff.yml +16 -0
  56. rasa/cli/project_templates/basic/data/general/welcome.yml +9 -0
  57. rasa/cli/project_templates/basic/data/system/pattern_completed.yml +7 -0
  58. rasa/cli/project_templates/basic/data/system/pattern_correction.yml +7 -0
  59. rasa/cli/project_templates/basic/data/system/pattern_search.yml +8 -0
  60. rasa/cli/project_templates/basic/data/system/pattern_session_start.yml +8 -0
  61. rasa/cli/project_templates/basic/docs/rasa_assistant_qa.txt +65 -0
  62. rasa/cli/project_templates/basic/docs/template.txt +7 -0
  63. rasa/cli/project_templates/basic/domain/general/assistant_details.yml +12 -0
  64. rasa/cli/project_templates/basic/domain/general/bot_identity.yml +5 -0
  65. rasa/cli/project_templates/basic/domain/general/cannot_handle.yml +5 -0
  66. rasa/cli/project_templates/basic/domain/general/feedback.yml +28 -0
  67. rasa/cli/project_templates/basic/domain/general/goodbye.yml +7 -0
  68. rasa/cli/project_templates/basic/domain/general/help.yml +5 -0
  69. rasa/cli/project_templates/basic/domain/general/human_handoff_domain.yml +35 -0
  70. rasa/cli/project_templates/basic/domain/general/utils.yml +13 -0
  71. rasa/cli/project_templates/basic/domain/general/welcome.yml +7 -0
  72. rasa/cli/project_templates/basic/endpoints.yml +73 -0
  73. rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +19 -0
  74. rasa/cli/project_templates/finance/actions/__init__.py +46 -0
  75. rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +47 -0
  76. rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +40 -0
  77. rasa/cli/project_templates/finance/actions/action_session_start.py +74 -0
  78. rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +48 -0
  79. rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +36 -0
  80. rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +54 -0
  81. rasa/cli/project_templates/finance/actions/database.py +277 -0
  82. rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
  83. rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +52 -0
  84. rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +51 -0
  85. rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +40 -0
  86. rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +40 -0
  87. rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +46 -0
  88. rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +18 -0
  89. rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +49 -0
  90. rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +19 -0
  91. rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +36 -0
  92. rasa/cli/project_templates/finance/config.yml +21 -0
  93. rasa/cli/project_templates/finance/credentials.yml +32 -0
  94. rasa/cli/project_templates/finance/csvs/accounts.csv +8 -0
  95. rasa/cli/project_templates/finance/csvs/advisors.csv +7 -0
  96. rasa/cli/project_templates/finance/csvs/appointments.csv +211 -0
  97. rasa/cli/project_templates/finance/csvs/branches.csv +10 -0
  98. rasa/cli/project_templates/finance/csvs/cards.csv +11 -0
  99. rasa/cli/project_templates/finance/csvs/payees.csv +11 -0
  100. rasa/cli/project_templates/finance/csvs/transactions.csv +71 -0
  101. rasa/cli/project_templates/finance/csvs/users.csv +4 -0
  102. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +10 -0
  103. rasa/cli/project_templates/finance/data/cards/block_card.yml +66 -0
  104. rasa/cli/project_templates/finance/data/cards/select_card.yml +12 -0
  105. rasa/cli/project_templates/finance/data/general/bot_identity.yml +6 -0
  106. rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
  107. rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
  108. rasa/cli/project_templates/finance/data/general/hello.yml +7 -0
  109. rasa/cli/project_templates/finance/data/general/help.yml +9 -0
  110. rasa/cli/project_templates/finance/data/general/human_handoff.yml +16 -0
  111. rasa/cli/project_templates/finance/data/general/welcome.yml +9 -0
  112. rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +5 -0
  113. rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +7 -0
  114. rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +7 -0
  115. rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +8 -0
  116. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +8 -0
  117. rasa/cli/project_templates/finance/data/system/source/accounts.json +51 -0
  118. rasa/cli/project_templates/finance/data/system/source/advisors.json +44 -0
  119. rasa/cli/project_templates/finance/data/system/source/appointments.json +1474 -0
  120. rasa/cli/project_templates/finance/data/system/source/branches.json +47 -0
  121. rasa/cli/project_templates/finance/data/system/source/cards.json +72 -0
  122. rasa/cli/project_templates/finance/data/system/source/payees.json +74 -0
  123. rasa/cli/project_templates/finance/data/system/source/transactions.json +492 -0
  124. rasa/cli/project_templates/finance/data/system/source/users.json +29 -0
  125. rasa/cli/project_templates/finance/data/transfers/add_payee.yml +29 -0
  126. rasa/cli/project_templates/finance/data/transfers/list_payees.yml +5 -0
  127. rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +21 -0
  128. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +67 -0
  129. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +8 -0
  130. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +8 -0
  131. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +8 -0
  132. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +8 -0
  133. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +8 -0
  134. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +7 -0
  135. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +8 -0
  136. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +8 -0
  137. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +8 -0
  138. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +8 -0
  139. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +8 -0
  140. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +8 -0
  141. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +8 -0
  142. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +8 -0
  143. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +8 -0
  144. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +8 -0
  145. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +8 -0
  146. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +8 -0
  147. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +8 -0
  148. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +8 -0
  149. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +50 -0
  150. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +50 -0
  151. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +48 -0
  152. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +50 -0
  153. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +50 -0
  154. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +47 -0
  155. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +50 -0
  156. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +50 -0
  157. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +47 -0
  158. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +50 -0
  159. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +50 -0
  160. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +50 -0
  161. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +47 -0
  162. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +50 -0
  163. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +50 -0
  164. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +47 -0
  165. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +50 -0
  166. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +50 -0
  167. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +47 -0
  168. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +50 -0
  169. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +50 -0
  170. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +47 -0
  171. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +47 -0
  172. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +50 -0
  173. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +50 -0
  174. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +47 -0
  175. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +50 -0
  176. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +50 -0
  177. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +47 -0
  178. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +50 -0
  179. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +50 -0
  180. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +47 -0
  181. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +50 -0
  182. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +50 -0
  183. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +50 -0
  184. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +47 -0
  185. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +50 -0
  186. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +50 -0
  187. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +47 -0
  188. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +50 -0
  189. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +50 -0
  190. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +47 -0
  191. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +50 -0
  192. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +50 -0
  193. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +50 -0
  194. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +47 -0
  195. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +50 -0
  196. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +50 -0
  197. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +47 -0
  198. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +50 -0
  199. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +50 -0
  200. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +47 -0
  201. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +50 -0
  202. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +50 -0
  203. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +47 -0
  204. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +47 -0
  205. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +50 -0
  206. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +50 -0
  207. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +50 -0
  208. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +50 -0
  209. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +47 -0
  210. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +11 -0
  211. rasa/cli/project_templates/finance/domain/cards/block_card.yml +101 -0
  212. rasa/cli/project_templates/finance/domain/cards/select_card.yml +12 -0
  213. rasa/cli/project_templates/finance/domain/general/assistant_details.yml +12 -0
  214. rasa/cli/project_templates/finance/domain/general/bot_identity.yml +5 -0
  215. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +5 -0
  216. rasa/cli/project_templates/finance/domain/general/defaults.yml +24 -0
  217. rasa/cli/project_templates/finance/domain/general/feedback.yml +28 -0
  218. rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
  219. rasa/cli/project_templates/finance/domain/general/help.yml +5 -0
  220. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +30 -0
  221. rasa/cli/project_templates/finance/domain/general/utils.yml +13 -0
  222. rasa/cli/project_templates/finance/domain/general/welcome.yml +8 -0
  223. rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +47 -0
  224. rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +4 -0
  225. rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +16 -0
  226. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +79 -0
  227. rasa/cli/project_templates/finance/endpoints.yml +63 -0
  228. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +19 -0
  229. rasa/cli/project_templates/telco/actions/__init__.py +0 -0
  230. rasa/cli/project_templates/telco/actions/actions_billing.py +204 -0
  231. rasa/cli/project_templates/telco/actions/actions_get_data_from_db.py +48 -0
  232. rasa/cli/project_templates/telco/actions/actions_run_diagnostics.py +28 -0
  233. rasa/cli/project_templates/telco/actions/actions_session_start.py +18 -0
  234. rasa/cli/project_templates/telco/config.yml +25 -0
  235. rasa/cli/project_templates/telco/credentials.yml +33 -0
  236. rasa/cli/project_templates/telco/csvs/billing.csv +10 -0
  237. rasa/cli/project_templates/telco/csvs/customers.csv +5 -0
  238. rasa/cli/project_templates/telco/data/flows/flow_global.yml +5 -0
  239. rasa/cli/project_templates/telco/data/flows/flow_reboot_router.yml +8 -0
  240. rasa/cli/project_templates/telco/data/flows/flow_reset_router.yml +7 -0
  241. rasa/cli/project_templates/telco/data/flows/flow_solve_internet_issue.yml +73 -0
  242. rasa/cli/project_templates/telco/data/flows/flow_undertand_bill.yml +45 -0
  243. rasa/cli/project_templates/telco/data/patterns/pattern_completed.yml +7 -0
  244. rasa/cli/project_templates/telco/data/patterns/pattern_human_handoff.yml +6 -0
  245. rasa/cli/project_templates/telco/data/patterns/pattern_search.yml +7 -0
  246. rasa/cli/project_templates/telco/data/patterns/pattern_session_start.yml +9 -0
  247. rasa/cli/project_templates/telco/docs/reset_vs_rboot_router.txt +1 -0
  248. rasa/cli/project_templates/telco/docs/restart_router.txt +6 -0
  249. rasa/cli/project_templates/telco/docs/run_speed_test.txt +6 -0
  250. rasa/cli/project_templates/telco/domain/domain_global.yml +29 -0
  251. rasa/cli/project_templates/telco/domain/domain_patterns.yml +17 -0
  252. rasa/cli/project_templates/telco/domain/domain_reboot_router.yml +20 -0
  253. rasa/cli/project_templates/telco/domain/domain_reset_router.yml +11 -0
  254. rasa/cli/project_templates/telco/domain/domain_run_speed_test.yml +24 -0
  255. rasa/cli/project_templates/telco/domain/domain_solve_internet_issue.yml +74 -0
  256. rasa/cli/project_templates/telco/domain/domain_undertand_bill.yml +102 -0
  257. rasa/cli/project_templates/telco/endpoints.yml +60 -0
  258. rasa/{dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 → cli/project_templates/telco/prompts/command-generator.jinja2} +3 -7
  259. rasa/cli/project_templates/telco/tests/e2e_results_failed.yml +62 -0
  260. rasa/cli/project_templates/telco/tests/e2e_results_passed.yml +130 -0
  261. rasa/cli/project_templates/telco/tests/e2e_test_cases/billing_test_cases.yml +68 -0
  262. rasa/cli/project_templates/telco/tests/e2e_test_cases/global_test_cases.yml +13 -0
  263. rasa/cli/project_templates/telco/tests/e2e_test_cases/internet_slow_test_case.yml +47 -0
  264. rasa/cli/project_templates/telco/tests/e2e_test_cases/out_of_scope_test_case.yml +21 -0
  265. rasa/cli/project_templates/telco/tests/e2e_test_cases/patterns_test_cases.yml +15 -0
  266. rasa/cli/project_templates/tutorial/config.yml +2 -1
  267. rasa/cli/run.py +0 -4
  268. rasa/cli/scaffold.py +46 -2
  269. rasa/cli/shell.py +0 -3
  270. rasa/constants.py +0 -6
  271. rasa/core/actions/action.py +10 -56
  272. rasa/core/agent.py +0 -16
  273. rasa/core/available_endpoints.py +0 -30
  274. rasa/core/channels/channel.py +4 -3
  275. rasa/core/channels/constants.py +3 -0
  276. rasa/core/channels/development_inspector.py +4 -4
  277. rasa/core/channels/hangouts.py +2 -2
  278. rasa/core/channels/inspector/dist/assets/{arc-63212852.js → arc-18042c22.js} +1 -1
  279. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-eecf6b13.js → blockDiagram-38ab4fdb-fdd6bcfa.js} +1 -1
  280. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-8f798a9a.js → c4Diagram-3d4e48cf-f5ae6786.js} +1 -1
  281. rasa/core/channels/inspector/dist/assets/channel-b9b536fc.js +1 -0
  282. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-df71a04c.js → classDiagram-70f12bd4-81efba3e.js} +1 -1
  283. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-9b275968.js → classDiagram-v2-f2320105-3b6b6a92.js} +1 -1
  284. rasa/core/channels/inspector/dist/assets/clone-78d2ddcf.js +1 -0
  285. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-1c669cad.js → createText-2e5e7dd3-31422447.js} +1 -1
  286. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-b1553799.js → edges-e0da2a9e-518a90db.js} +1 -1
  287. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-112388d6.js → erDiagram-9861fffd-a6d3c25a.js} +1 -1
  288. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-fdebec47.js → flowDb-956e92f1-e048c2be.js} +1 -1
  289. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-6280ede1.js → flowDiagram-66a62f08-c7474c91.js} +1 -1
  290. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-8b09c060.js +1 -0
  291. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-e1dc03e5.js → flowchart-elk-definition-4a651766-cb4d8723.js} +1 -1
  292. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-83f68c51.js → ganttDiagram-c361ad54-346636a2.js} +1 -1
  293. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-22f8666f.js → gitGraphDiagram-72cf32ee-7c508874.js} +1 -1
  294. rasa/core/channels/inspector/dist/assets/{graph-ca9e6217.js → graph-14702d8a.js} +1 -1
  295. rasa/core/channels/inspector/dist/assets/{index-3862675e-c5ceb692.js → index-3862675e-f18b534b.js} +1 -1
  296. rasa/core/channels/inspector/dist/assets/index-4d4bdf3a.js +1335 -0
  297. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-faa9999b.js → infoDiagram-f8f76790-64154b83.js} +1 -1
  298. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-c4dda8d9.js → journeyDiagram-49397b02-833a5f95.js} +1 -1
  299. rasa/core/channels/inspector/dist/assets/{layout-d4307784.js → layout-5a3b2123.js} +1 -1
  300. rasa/core/channels/inspector/dist/assets/{line-0567aaa7.js → line-2272a8c7.js} +1 -1
  301. rasa/core/channels/inspector/dist/assets/{linear-c11b95cf.js → linear-35bcf273.js} +1 -1
  302. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-0c7d3ca9.js → mindmap-definition-fc14e90a-92dcb0e9.js} +1 -1
  303. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-34b433fa.js → pieDiagram-8a3498a8-94dbc900.js} +1 -1
  304. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-4cab816e.js → quadrantDiagram-120e2f19-8b7a9c33.js} +1 -1
  305. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-8c22fa9e.js → requirementDiagram-deff3bca-6f7eab81.js} +1 -1
  306. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-70ce9e8e.js → sankeyDiagram-04a897e0-f43e581d.js} +1 -1
  307. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-fbcd7fc9.js → sequenceDiagram-704730f1-0bcbefc3.js} +1 -1
  308. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-45f05ea6.js → stateDiagram-587899a1-b8a74083.js} +1 -1
  309. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-beab1ea6.js → stateDiagram-v2-d93cdb3a-2070218f.js} +1 -1
  310. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-2f29dbd5.js → styles-6aaf32cf-f1d54e34.js} +1 -1
  311. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-951eac83.js → styles-9a916d00-980de489.js} +1 -1
  312. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-897fbfdd.js → styles-c10674c1-3c03abde.js} +1 -1
  313. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-d667fac1.js → svgDrawCommon-08f97a94-46ba068f.js} +1 -1
  314. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-e3205144.js → timeline-definition-85554ec2-901f5e3d.js} +1 -1
  315. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-4abeb0e2.js → xychartDiagram-e933f94c-acbc628a.js} +1 -1
  316. rasa/core/channels/inspector/dist/index.html +2 -2
  317. rasa/core/channels/inspector/index.html +1 -1
  318. rasa/core/channels/inspector/src/App.tsx +10 -11
  319. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +12 -3
  320. rasa/core/channels/inspector/src/components/DialogueStack.tsx +4 -6
  321. rasa/core/channels/inspector/src/helpers/formatters.ts +3 -24
  322. rasa/core/channels/inspector/src/theme/base/styles.ts +1 -19
  323. rasa/core/channels/inspector/src/types.ts +0 -4
  324. rasa/core/channels/socketio.py +212 -51
  325. rasa/core/channels/studio_chat.py +49 -29
  326. rasa/core/channels/voice_stream/genesys.py +1 -1
  327. rasa/core/channels/voice_stream/voice_channel.py +5 -3
  328. rasa/core/constants.py +0 -4
  329. rasa/core/policies/enterprise_search_policy.py +6 -11
  330. rasa/core/policies/flow_policy.py +4 -4
  331. rasa/core/policies/flows/flow_executor.py +45 -456
  332. rasa/core/policies/intentless_policy.py +1 -1
  333. rasa/core/policies/unexpected_intent_policy.py +0 -1
  334. rasa/core/processor.py +15 -18
  335. rasa/core/run.py +14 -11
  336. rasa/core/tracker_stores/tracker_store.py +7 -3
  337. rasa/core/train.py +1 -1
  338. rasa/core/training/interactive.py +16 -16
  339. rasa/core/training/story_conflict.py +5 -5
  340. rasa/core/utils.py +1 -21
  341. rasa/dialogue_understanding/commands/__init__.py +0 -8
  342. rasa/dialogue_understanding/commands/cancel_flow_command.py +4 -97
  343. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +0 -11
  344. rasa/dialogue_understanding/commands/clarify_command.py +0 -10
  345. rasa/dialogue_understanding/commands/knowledge_answer_command.py +0 -11
  346. rasa/dialogue_understanding/commands/start_flow_command.py +8 -164
  347. rasa/dialogue_understanding/commands/utils.py +2 -6
  348. rasa/dialogue_understanding/generator/command_parser.py +0 -4
  349. rasa/dialogue_understanding/generator/flow_retrieval.py +10 -9
  350. rasa/dialogue_understanding/generator/llm_based_command_generator.py +12 -50
  351. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  352. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  353. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +6 -7
  354. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +6 -7
  355. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +2 -41
  356. rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -163
  357. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +8 -52
  358. rasa/dialogue_understanding/processor/command_processor.py +15 -31
  359. rasa/dialogue_understanding/stack/dialogue_stack.py +2 -123
  360. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +0 -57
  361. rasa/dialogue_understanding/stack/utils.py +2 -17
  362. rasa/dialogue_understanding_test/du_test_runner.py +2 -7
  363. rasa/e2e_test/e2e_test_runner.py +2 -12
  364. rasa/engine/caching.py +2 -2
  365. rasa/engine/recipes/default_components.py +18 -10
  366. rasa/engine/storage/local_model_storage.py +45 -2
  367. rasa/graph_components/validators/default_recipe_validator.py +134 -134
  368. rasa/hooks.py +5 -5
  369. rasa/llm_fine_tuning/utils.py +2 -2
  370. rasa/model_manager/model_api.py +4 -5
  371. rasa/model_manager/runner_service.py +1 -1
  372. rasa/model_manager/socket_bridge.py +20 -14
  373. rasa/model_manager/trainer_service.py +12 -9
  374. rasa/model_manager/utils.py +1 -29
  375. rasa/model_manager/warm_rasa_process.py +1 -1
  376. rasa/nlu/extractors/extractor.py +1 -2
  377. rasa/plugin.py +8 -8
  378. rasa/privacy/privacy_manager.py +2 -11
  379. rasa/server.py +2 -14
  380. rasa/shared/constants.py +0 -5
  381. rasa/shared/core/constants.py +1 -12
  382. rasa/shared/core/domain.py +58 -11
  383. rasa/shared/core/events.py +0 -327
  384. rasa/shared/core/flows/flow_step.py +7 -1
  385. rasa/shared/core/flows/flows_list.py +2 -2
  386. rasa/shared/core/flows/flows_yaml_schema.json +186 -112
  387. rasa/shared/core/flows/steps/call.py +5 -53
  388. rasa/shared/core/flows/validation.py +7 -46
  389. rasa/shared/core/flows/yaml_flows_io.py +17 -9
  390. rasa/shared/core/slots.py +6 -2
  391. rasa/shared/core/trackers.py +2 -5
  392. rasa/shared/exceptions.py +0 -4
  393. rasa/shared/importers/importer.py +6 -0
  394. rasa/shared/importers/utils.py +77 -1
  395. rasa/shared/providers/_utils.py +60 -44
  396. rasa/shared/providers/embedding/default_litellm_embedding_client.py +2 -0
  397. rasa/shared/providers/llm/_base_litellm_client.py +7 -39
  398. rasa/shared/providers/llm/default_litellm_llm_client.py +2 -0
  399. rasa/shared/providers/llm/litellm_router_llm_client.py +4 -8
  400. rasa/shared/providers/llm/llm_client.py +3 -7
  401. rasa/shared/providers/llm/llm_response.py +0 -49
  402. rasa/shared/providers/llm/self_hosted_llm_client.py +4 -8
  403. rasa/shared/utils/llm.py +5 -28
  404. rasa/shared/utils/schemas/events.py +0 -42
  405. rasa/shared/utils/yaml.py +1 -3
  406. rasa/studio/upload.py +16 -47
  407. rasa/telemetry.py +97 -23
  408. rasa/tracing/instrumentation/instrumentation.py +10 -12
  409. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
  410. rasa/utils/common.py +0 -79
  411. rasa/utils/io.py +27 -9
  412. rasa/utils/json_utils.py +6 -1
  413. rasa/utils/log_utils.py +6 -2
  414. rasa/utils/ml_utils.py +1 -1
  415. rasa/utils/openapi.py +144 -0
  416. rasa/utils/tensorflow/rasa_layers.py +1 -1
  417. rasa/utils/train_utils.py +15 -15
  418. rasa/validator.py +21 -19
  419. rasa/version.py +1 -1
  420. {rasa_pro-3.14.0.dev4.dist-info → rasa_pro-3.14.0.dev5.dist-info}/METADATA +17 -14
  421. {rasa_pro-3.14.0.dev4.dist-info → rasa_pro-3.14.0.dev5.dist-info}/RECORD +431 -200
  422. rasa/agents/agent_factory.py +0 -122
  423. rasa/agents/agent_manager.py +0 -162
  424. rasa/agents/constants.py +0 -40
  425. rasa/agents/core/agent_protocol.py +0 -107
  426. rasa/agents/core/types.py +0 -70
  427. rasa/agents/exceptions.py +0 -8
  428. rasa/agents/protocol/__init__.py +0 -5
  429. rasa/agents/protocol/a2a/a2a_agent.py +0 -662
  430. rasa/agents/protocol/mcp/mcp_base_agent.py +0 -676
  431. rasa/agents/protocol/mcp/mcp_open_agent.py +0 -276
  432. rasa/agents/protocol/mcp/mcp_task_agent.py +0 -469
  433. rasa/agents/schemas/__init__.py +0 -12
  434. rasa/agents/schemas/agent_input.py +0 -38
  435. rasa/agents/schemas/agent_output.py +0 -26
  436. rasa/agents/schemas/agent_tool_result.py +0 -51
  437. rasa/agents/schemas/agent_tool_schema.py +0 -134
  438. rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +0 -15
  439. rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +0 -17
  440. rasa/agents/utils.py +0 -72
  441. rasa/core/available_agents.py +0 -199
  442. rasa/core/channels/inspector/dist/assets/channel-0cd70adf.js +0 -1
  443. rasa/core/channels/inspector/dist/assets/clone-a0f9c4ed.js +0 -1
  444. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-de9cc4aa.js +0 -1
  445. rasa/core/channels/inspector/dist/assets/index-3e293924.js +0 -1353
  446. rasa/core/policies/flows/mcp_tool_executor.py +0 -277
  447. rasa/dialogue_understanding/commands/continue_agent_command.py +0 -91
  448. rasa/dialogue_understanding/commands/restart_agent_command.py +0 -162
  449. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +0 -61
  450. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +0 -81
  451. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +0 -81
  452. rasa/shared/agents/utils.py +0 -35
  453. rasa/shared/utils/mcp/server_connection.py +0 -157
  454. /rasa/{agents → builder}/__init__.py +0 -0
  455. /rasa/{agents/core → builder/copilot}/__init__.py +0 -0
  456. /rasa/{agents/protocol/a2a → builder/copilot/prompts}/__init__.py +0 -0
  457. /rasa/{agents/protocol/mcp → builder/copilot/templated_messages}/__init__.py +0 -0
  458. /rasa/{agents/templates → builder/document_retrieval}/__init__.py +0 -0
  459. /rasa/{shared/agents → cli/project_templates/finance/actions/accounts}/__init__.py +0 -0
  460. /rasa/{shared/utils/mcp → cli/project_templates/finance/actions/cards}/__init__.py +0 -0
  461. {rasa_pro-3.14.0.dev4.dist-info → rasa_pro-3.14.0.dev5.dist-info}/NOTICE +0 -0
  462. {rasa_pro-3.14.0.dev4.dist-info → rasa_pro-3.14.0.dev5.dist-info}/WHEEL +0 -0
  463. {rasa_pro-3.14.0.dev4.dist-info → rasa_pro-3.14.0.dev5.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,305 @@
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
+ CopilotContext,
15
+ GeneratedContent,
16
+ ResponseCategory,
17
+ )
18
+ from rasa.builder.guardrails.models import (
19
+ GuardrailRequestKey,
20
+ GuardrailResponse,
21
+ LakeraGuardrailRequest,
22
+ )
23
+ from rasa.builder.llm_service import llm_service
24
+ from rasa.builder.shared.tracker_context import (
25
+ AssistantConversationTurn,
26
+ TrackerContext,
27
+ )
28
+
29
+ if TYPE_CHECKING:
30
+ from rasa.builder.guardrails.models import GuardrailType
31
+
32
+
33
+ structlogger = structlog.get_logger()
34
+
35
+
36
+ def map_lakera_detector_type_to_guardrail_type(
37
+ lakera_detector_type: str,
38
+ ) -> Optional["GuardrailType"]:
39
+ """Map a Lakera detector type to a Rasa guardrail type."""
40
+ from rasa.builder.guardrails.models import GuardrailType
41
+
42
+ # Check for exact matches first
43
+ LAKERA_DETECTOR_TYPES_2_RASA_GUARDRAIL_TYPES_MAPPING = {
44
+ "prompt_attack": GuardrailType.PROMPT_ATTACK,
45
+ "unknown_links": GuardrailType.MALICIOUS_LINKS,
46
+ "custom": GuardrailType.CUSTOM,
47
+ }
48
+
49
+ # Check for exact match first
50
+ if lakera_detector_type in LAKERA_DETECTOR_TYPES_2_RASA_GUARDRAIL_TYPES_MAPPING:
51
+ return LAKERA_DETECTOR_TYPES_2_RASA_GUARDRAIL_TYPES_MAPPING[
52
+ lakera_detector_type
53
+ ]
54
+
55
+ # Check for subtypes that start with specific prefixes
56
+ # https://docs.lakera.ai/docs/policies/self-hosted-policies#detectors-section
57
+ if lakera_detector_type.startswith("moderated_content"):
58
+ return GuardrailType.CONTENT_VIOLATION
59
+ if lakera_detector_type.startswith("pii"):
60
+ return GuardrailType.DATA_LEAKAGE
61
+
62
+ # If no match found, return OTHER
63
+ return GuardrailType.OTHER
64
+
65
+
66
+ @lru_cache(maxsize=512)
67
+ def _schedule_guardrails_check(
68
+ user_text: str,
69
+ hello_rasa_user_id: str,
70
+ hello_rasa_project_id: str,
71
+ lakera_project_id: str,
72
+ ) -> "asyncio.Task[GuardrailResponse]":
73
+ """Return a cached asyncio.Task that resolves to Lakera's response.
74
+
75
+ Args:
76
+ user_text: The user message text to check for policy violations.
77
+ hello_rasa_user_id: The user ID for the conversation.
78
+ hello_rasa_project_id: The project ID for the conversation.
79
+ lakera_project_id: The Lakera project ID to use for this check.
80
+
81
+ Returns:
82
+ An asyncio Task that resolves to a GuardrailResponse.
83
+ """
84
+ structlogger.debug("guardrails.cache_miss", text=user_text)
85
+
86
+ loop = asyncio.get_running_loop()
87
+ request = LakeraGuardrailRequest(
88
+ lakera_project_id=lakera_project_id,
89
+ hello_rasa_user_id=hello_rasa_user_id,
90
+ hello_rasa_project_id=hello_rasa_project_id,
91
+ messages=[{"role": ROLE_USER, "content": user_text}],
92
+ )
93
+
94
+ return loop.create_task(llm_service.guardrails.send_request(request))
95
+
96
+
97
+ async def _detect_flagged_user_indices(
98
+ items: List[Tuple[int, str]],
99
+ *,
100
+ hello_rasa_user_id: Optional[str],
101
+ hello_rasa_project_id: Optional[str],
102
+ lakera_project_id: str,
103
+ log_prefix: str,
104
+ ) -> Set[int]:
105
+ """Run guardrail checks for provided (index, user_text) pairs.
106
+
107
+ Args:
108
+ items: List of tuples containing (index, user_text) to check.
109
+ hello_rasa_user_id: The user ID for the conversation.
110
+ hello_rasa_project_id: The project ID for the conversation.
111
+ lakera_project_id: The Lakera project ID to use for this check.
112
+ log_prefix: Prefix for logging messages.
113
+
114
+ Returns:
115
+ A set of indices that were flagged by the guardrails.
116
+ """
117
+ if not items:
118
+ return set()
119
+
120
+ # 1) Group indices by logical request key (hashable by value)
121
+ indices_by_key: Dict[GuardrailRequestKey, List[int]] = {}
122
+ for idx, text in items:
123
+ key = GuardrailRequestKey(
124
+ user_text=(text or "").strip(),
125
+ hello_rasa_user_id=hello_rasa_user_id or "",
126
+ hello_rasa_project_id=hello_rasa_project_id or "",
127
+ lakera_project_id=lakera_project_id,
128
+ )
129
+ if not key.user_text:
130
+ continue
131
+ indices_by_key.setdefault(key, []).append(idx)
132
+
133
+ if not indices_by_key:
134
+ return set()
135
+
136
+ # 2) Create one task per logical key
137
+ tasks_by_key: Dict[GuardrailRequestKey, asyncio.Task[GuardrailResponse]] = {}
138
+ for key in indices_by_key:
139
+ tasks_by_key[key] = _schedule_guardrails_check(
140
+ user_text=key.user_text,
141
+ hello_rasa_user_id=key.hello_rasa_user_id,
142
+ hello_rasa_project_id=key.hello_rasa_project_id,
143
+ lakera_project_id=key.lakera_project_id,
144
+ )
145
+
146
+ # 3) Await unique tasks once
147
+ keys = list(tasks_by_key.keys())
148
+ tasks = [tasks_by_key[k] for k in keys]
149
+ responses = await asyncio.gather(*tasks, return_exceptions=True)
150
+
151
+ # 4) Map results back to all corresponding indices
152
+ flagged: Set[int] = set()
153
+ for key, response in zip(keys, responses):
154
+ if isinstance(response, Exception):
155
+ structlogger.warning(f"{log_prefix}.request_failed", error=str(response))
156
+ continue
157
+ if response.flagged:
158
+ flagged.update(indices_by_key.get(key, []))
159
+
160
+ return flagged
161
+
162
+
163
+ async def check_assistant_chat_for_policy_violations(
164
+ tracker_context: TrackerContext,
165
+ hello_rasa_user_id: Optional[str],
166
+ hello_rasa_project_id: Optional[str],
167
+ ) -> TrackerContext:
168
+ """Return a sanitised TrackerContext with unsafe turns removed.
169
+
170
+ Only user messages are moderated – assistant messages are assumed safe.
171
+ LRU cache is used, so each unique user text is checked once.
172
+
173
+ Args:
174
+ tracker_context: The TrackerContext containing conversation turns.
175
+ hello_rasa_user_id: The user ID for the conversation.
176
+ hello_rasa_project_id: The project ID for the conversation.
177
+
178
+ Returns:
179
+ TrackerContext with unsafe turns removed.
180
+ """
181
+ # Collect (turn_index, user_text) for all turns with a user message
182
+ items: List[Tuple[int, str]] = []
183
+ for idx, turn in enumerate(tracker_context.conversation_turns):
184
+ user_message = turn.user_message
185
+ if not user_message:
186
+ continue
187
+
188
+ text = (user_message.text or "").strip()
189
+ if not text:
190
+ continue
191
+
192
+ items.append((idx, text))
193
+
194
+ flagged_turns = await _detect_flagged_user_indices(
195
+ items,
196
+ hello_rasa_user_id=hello_rasa_user_id,
197
+ hello_rasa_project_id=hello_rasa_project_id,
198
+ lakera_project_id=ASSISTANT_HISTORY_GUARDRAIL_PROJECT_ID,
199
+ log_prefix="assistant_guardrails",
200
+ )
201
+
202
+ if not flagged_turns:
203
+ return tracker_context
204
+
205
+ structlogger.info(
206
+ "assistant_guardrails.turns_flagged",
207
+ count=len(flagged_turns),
208
+ turn_indices=sorted(flagged_turns),
209
+ )
210
+
211
+ # Build a filtered TrackerContext
212
+ safe_turns: List[AssistantConversationTurn] = [
213
+ turn
214
+ for idx, turn in enumerate(tracker_context.conversation_turns)
215
+ if idx not in flagged_turns
216
+ ]
217
+
218
+ new_tracker_context = tracker_context.copy(deep=True)
219
+ new_tracker_context.conversation_turns = safe_turns
220
+ return new_tracker_context
221
+
222
+
223
+ async def check_copilot_chat_for_policy_violations(
224
+ context: CopilotContext,
225
+ hello_rasa_user_id: Optional[str],
226
+ hello_rasa_project_id: Optional[str],
227
+ ) -> Optional[GeneratedContent]:
228
+ """Check the copilot chat history for guardrail policy violations.
229
+
230
+ Only user messages are moderated – assistant messages are assumed safe.
231
+ LRU cache is used, so each unique user text is checked once.
232
+
233
+ Args:
234
+ context: The CopilotContext containing the copilot chat history.
235
+ hello_rasa_user_id: The user ID for the conversation.
236
+ hello_rasa_project_id: The project ID for the conversation.
237
+
238
+ Returns:
239
+ Returns a default violation response if the system flags any user message,
240
+ otherwise return None.
241
+ """
242
+ history = context.copilot_chat_history
243
+
244
+ # Collect (index, text) for user messages; skip ones already marked as violations
245
+ items: List[Tuple[int, str]] = []
246
+ for idx, message in enumerate(history):
247
+ if message.response_category == ResponseCategory.GUARDRAILS_POLICY_VIOLATION:
248
+ continue
249
+ if message.role != ROLE_USER:
250
+ continue
251
+ formatted_message = message.to_openai_format()
252
+ text = (formatted_message.get("content") or "").strip()
253
+ if not text:
254
+ continue
255
+ items.append((idx, text))
256
+
257
+ flagged_user_indices = await _detect_flagged_user_indices(
258
+ items,
259
+ hello_rasa_user_id=hello_rasa_user_id,
260
+ hello_rasa_project_id=hello_rasa_project_id,
261
+ lakera_project_id=COPILOT_HISTORY_GUARDRAIL_PROJECT_ID,
262
+ log_prefix="copilot_guardrails",
263
+ )
264
+
265
+ if not flagged_user_indices:
266
+ return None
267
+
268
+ # Identify the latest user message index in the current request
269
+ last_user_idx: Optional[int] = None
270
+ for i in range(len(history) - 1, -1, -1):
271
+ if getattr(history[i], "role", None) == ROLE_USER:
272
+ last_user_idx = i
273
+ break
274
+
275
+ # Remove flagged user messages and their next copilot messages
276
+ indices_to_remove: Set[int] = set()
277
+ total = len(history)
278
+ for uidx in flagged_user_indices:
279
+ indices_to_remove.add(uidx)
280
+ next_idx = uidx + 1
281
+ if (
282
+ next_idx < total
283
+ and getattr(history[next_idx], "role", None) == ROLE_COPILOT
284
+ ):
285
+ indices_to_remove.add(next_idx)
286
+
287
+ # Apply sanitization
288
+ filtered_history = [
289
+ msg for i, msg in enumerate(history) if i not in indices_to_remove
290
+ ]
291
+ if len(filtered_history) != len(history):
292
+ structlogger.info(
293
+ "copilot_guardrails.history_sanitized",
294
+ removed_indices=sorted(indices_to_remove),
295
+ removed_messages=len(history) - len(filtered_history),
296
+ kept_messages=len(filtered_history),
297
+ )
298
+ context.copilot_chat_history = filtered_history
299
+
300
+ # Block only if the latest user message in this request was flagged
301
+ if last_user_idx is not None and last_user_idx in flagged_user_indices:
302
+ return CopilotResponseHandler.respond_to_guardrail_policy_violations()
303
+
304
+ # Otherwise proceed (following messages are respected)
305
+ 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,234 @@
1
+ from typing import Any, Optional
2
+
3
+ import structlog
4
+ from sanic import Sanic
5
+
6
+ from rasa.builder.exceptions import (
7
+ LLMGenerationError,
8
+ ProjectGenerationError,
9
+ TrainingError,
10
+ ValidationError,
11
+ )
12
+ from rasa.builder.job_manager import JobInfo, job_manager
13
+ from rasa.builder.models import (
14
+ JobStatus,
15
+ JobStatusEvent,
16
+ )
17
+ from rasa.builder.training_service import train_and_load_agent
18
+ from rasa.builder.validation_service import validate_project
19
+ from rasa.cli.scaffold import ProjectTemplateName
20
+
21
+ structlogger = structlog.get_logger()
22
+
23
+
24
+ async def push_job_status_event(
25
+ job: JobInfo, status: JobStatus, message: Optional[str] = None
26
+ ) -> None:
27
+ event = JobStatusEvent.from_status(status=status.value, message=message)
28
+ job.status = status.value
29
+ await job.put(event)
30
+
31
+
32
+ async def run_prompt_to_bot_job(
33
+ app: Any,
34
+ job: JobInfo,
35
+ prompt: str,
36
+ ) -> None:
37
+ """Run the prompt-to-bot job in the background.
38
+
39
+ Args:
40
+ app: The Sanic application instance.
41
+ job: The job information instance.
42
+ prompt: The natural language prompt for bot generation.
43
+ """
44
+ project_generator = app.ctx.project_generator
45
+ input_channel = app.ctx.input_channel
46
+
47
+ await push_job_status_event(job, JobStatus.received)
48
+
49
+ try:
50
+ # 1. Generating
51
+ await push_job_status_event(job, JobStatus.generating)
52
+ bot_files = await project_generator.generate_project_with_retries(
53
+ prompt,
54
+ template=ProjectTemplateName.BASIC,
55
+ )
56
+ await push_job_status_event(job, JobStatus.generation_success)
57
+
58
+ # 2. Training
59
+ await push_job_status_event(job, JobStatus.training)
60
+ importer = project_generator._create_importer()
61
+ app.ctx.agent = await train_and_load_agent(importer)
62
+ input_channel.agent = app.ctx.agent
63
+ await push_job_status_event(job, JobStatus.train_success)
64
+
65
+ structlogger.info(
66
+ "bot_builder_service.prompt_to_bot.success",
67
+ files_generated=list(bot_files.keys()),
68
+ )
69
+ await push_job_status_event(job, JobStatus.done)
70
+ job_manager.mark_done(job)
71
+
72
+ except TrainingError as exc:
73
+ structlogger.debug(
74
+ "prompt_to_bot_job.training_error", job_id=job.id, error=str(exc)
75
+ )
76
+ await push_job_status_event(job, JobStatus.train_error, message=str(exc))
77
+ job_manager.mark_done(job, error=str(exc))
78
+
79
+ except ValidationError as exc:
80
+ structlogger.debug(
81
+ "prompt_to_bot_job.validation_error", job_id=job.id, error=str(exc)
82
+ )
83
+ await push_job_status_event(job, JobStatus.validation_error, message=str(exc))
84
+ job_manager.mark_done(job, error=str(exc))
85
+
86
+ except (ProjectGenerationError, LLMGenerationError) as exc:
87
+ structlogger.debug(
88
+ "prompt_to_bot_job.generation_error", job_id=job.id, error=str(exc)
89
+ )
90
+ await push_job_status_event(job, JobStatus.generation_error, message=str(exc))
91
+ job_manager.mark_done(job, error=str(exc))
92
+
93
+ except Exception as exc:
94
+ # Capture full traceback
95
+ structlogger.exception(
96
+ "prompt_to_bot_job.unexpected_error", job_id=job.id, error=str(exc)
97
+ )
98
+ await push_job_status_event(job, JobStatus.error, message=str(exc))
99
+ job_manager.mark_done(job, error=str(exc))
100
+
101
+
102
+ async def run_template_to_bot_job(
103
+ app: "Sanic",
104
+ job: JobInfo,
105
+ template_name: ProjectTemplateName,
106
+ ) -> None:
107
+ """Run the template-to-bot job in the background.
108
+
109
+ Args:
110
+ app: The Sanic application instance.
111
+ job: The job information instance.
112
+ template_name: The name of the template to use for bot generation.
113
+ """
114
+ project_generator = app.ctx.project_generator
115
+ input_channel = app.ctx.input_channel
116
+
117
+ await push_job_status_event(job, JobStatus.received)
118
+
119
+ try:
120
+ # 1) Generating
121
+ await push_job_status_event(job, JobStatus.generating)
122
+ await project_generator.init_from_template(template_name)
123
+ bot_files = project_generator.get_bot_files()
124
+ await push_job_status_event(job, JobStatus.generation_success)
125
+
126
+ # 2) Training
127
+ await push_job_status_event(job, JobStatus.training)
128
+ importer = project_generator._create_importer()
129
+ app.ctx.agent = await train_and_load_agent(importer)
130
+ input_channel.agent = app.ctx.agent
131
+ await push_job_status_event(job, JobStatus.train_success)
132
+
133
+ # 3) Done
134
+ structlogger.info(
135
+ "bot_builder_service.template_to_bot.success",
136
+ files_generated=list(bot_files.keys()),
137
+ )
138
+ await push_job_status_event(job, JobStatus.done)
139
+ job_manager.mark_done(job)
140
+
141
+ except TrainingError as exc:
142
+ structlogger.debug(
143
+ "template_to_bot_job.training_error",
144
+ job_id=job.id,
145
+ error=str(exc),
146
+ )
147
+ await push_job_status_event(job, JobStatus.train_error, message=str(exc))
148
+ job_manager.mark_done(job, error=str(exc))
149
+
150
+ except ValidationError as exc:
151
+ structlogger.debug(
152
+ "template_to_bot_job.validation_error",
153
+ job_id=job.id,
154
+ error=str(exc),
155
+ )
156
+ await push_job_status_event(job, JobStatus.validation_error, message=str(exc))
157
+ job_manager.mark_done(job, error=str(exc))
158
+
159
+ except ProjectGenerationError as exc:
160
+ structlogger.debug(
161
+ "template_to_bot_job.generation_error",
162
+ job_id=job.id,
163
+ error=str(exc),
164
+ )
165
+ await push_job_status_event(job, JobStatus.generation_error, message=str(exc))
166
+ job_manager.mark_done(job, error=str(exc))
167
+
168
+ except Exception as exc:
169
+ # Capture full traceback
170
+ structlogger.exception(
171
+ "template_to_bot_job.unexpected_error",
172
+ job_id=job.id,
173
+ error=str(exc),
174
+ )
175
+ await push_job_status_event(job, JobStatus.error, message=str(exc))
176
+ job_manager.mark_done(job, error=str(exc))
177
+
178
+
179
+ async def run_update_files_job(
180
+ app: "Sanic",
181
+ job: JobInfo,
182
+ bot_files: dict,
183
+ ) -> None:
184
+ project_generator = app.ctx.project_generator
185
+ input_channel = app.ctx.input_channel
186
+ await push_job_status_event(job, JobStatus.received)
187
+
188
+ try:
189
+ project_generator.update_bot_files(bot_files)
190
+
191
+ # 1. Validating
192
+ await push_job_status_event(job, JobStatus.validating)
193
+ importer = project_generator._create_importer()
194
+ validation_error = await validate_project(importer)
195
+ if validation_error:
196
+ raise ValidationError(validation_error)
197
+ await push_job_status_event(job, JobStatus.validation_success)
198
+
199
+ # 2. Training
200
+ await push_job_status_event(job, JobStatus.training)
201
+ app.ctx.agent = await train_and_load_agent(importer)
202
+ input_channel.agent = app.ctx.agent
203
+ await push_job_status_event(job, JobStatus.train_success)
204
+
205
+ await push_job_status_event(job, JobStatus.done)
206
+ job_manager.mark_done(job)
207
+
208
+ except ValidationError as exc:
209
+ structlogger.debug(
210
+ "update_files_job.validation_error",
211
+ job_id=job.id,
212
+ error=str(exc),
213
+ )
214
+ await push_job_status_event(job, JobStatus.validation_error, message=str(exc))
215
+ job_manager.mark_done(job, error=str(exc))
216
+
217
+ except TrainingError as exc:
218
+ structlogger.debug(
219
+ "update_files_job.train_error",
220
+ job_id=job.id,
221
+ error=str(exc),
222
+ )
223
+ await push_job_status_event(job, JobStatus.train_error, message=str(exc))
224
+ job_manager.mark_done(job, error=str(exc))
225
+
226
+ except Exception as exc:
227
+ # Capture full traceback for anything truly unexpected
228
+ structlogger.exception(
229
+ "update_files_job.unexpected_error",
230
+ job_id=job.id,
231
+ error=str(exc),
232
+ )
233
+ await push_job_status_event(job, JobStatus.error, message=str(exc))
234
+ job_manager.mark_done(job, error=str(exc))