rasa-pro 3.13.12__py3-none-any.whl → 3.14.0__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 (586) hide show
  1. rasa/__main__.py +15 -3
  2. rasa/agents/__init__.py +0 -0
  3. rasa/agents/agent_factory.py +122 -0
  4. rasa/agents/agent_manager.py +213 -0
  5. rasa/agents/constants.py +43 -0
  6. rasa/agents/core/__init__.py +0 -0
  7. rasa/agents/core/agent_protocol.py +107 -0
  8. rasa/agents/core/types.py +81 -0
  9. rasa/agents/exceptions.py +38 -0
  10. rasa/agents/protocol/__init__.py +5 -0
  11. rasa/agents/protocol/a2a/__init__.py +0 -0
  12. rasa/agents/protocol/a2a/a2a_agent.py +889 -0
  13. rasa/agents/protocol/mcp/__init__.py +0 -0
  14. rasa/agents/protocol/mcp/mcp_base_agent.py +778 -0
  15. rasa/agents/protocol/mcp/mcp_open_agent.py +327 -0
  16. rasa/agents/protocol/mcp/mcp_task_agent.py +522 -0
  17. rasa/agents/schemas/__init__.py +13 -0
  18. rasa/agents/schemas/agent_input.py +38 -0
  19. rasa/agents/schemas/agent_output.py +26 -0
  20. rasa/agents/schemas/agent_tool_result.py +65 -0
  21. rasa/agents/schemas/agent_tool_schema.py +186 -0
  22. rasa/agents/templates/__init__.py +0 -0
  23. rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +20 -0
  24. rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +22 -0
  25. rasa/agents/utils.py +228 -0
  26. rasa/agents/validation.py +538 -0
  27. rasa/api.py +23 -9
  28. rasa/builder/README.md +120 -0
  29. rasa/builder/__init__.py +0 -0
  30. rasa/builder/auth.py +176 -0
  31. rasa/builder/config.py +96 -0
  32. rasa/builder/copilot/__init__.py +0 -0
  33. rasa/builder/copilot/constants.py +38 -0
  34. rasa/builder/copilot/copilot.py +562 -0
  35. rasa/builder/copilot/copilot_response_handler.py +522 -0
  36. rasa/builder/copilot/copilot_templated_message_provider.py +81 -0
  37. rasa/builder/copilot/exceptions.py +32 -0
  38. rasa/builder/copilot/models.py +690 -0
  39. rasa/builder/copilot/prompts/__init__.py +0 -0
  40. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +787 -0
  41. rasa/builder/copilot/prompts/copilot_training_error_handler_prompt.jinja2 +53 -0
  42. rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +91 -0
  43. rasa/builder/copilot/signing.py +305 -0
  44. rasa/builder/copilot/telemetry.py +234 -0
  45. rasa/builder/copilot/templated_messages/__init__.py +0 -0
  46. rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +16 -0
  47. rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +41 -0
  48. rasa/builder/copilot/templated_messages/copilot_welcome_messages.yml +56 -0
  49. rasa/builder/document_retrieval/__init__.py +0 -0
  50. rasa/builder/document_retrieval/constants.py +15 -0
  51. rasa/builder/document_retrieval/inkeep-rag-response-schema.json +64 -0
  52. rasa/builder/document_retrieval/inkeep_document_retrieval.py +238 -0
  53. rasa/builder/document_retrieval/models.py +62 -0
  54. rasa/builder/download.py +140 -0
  55. rasa/builder/exceptions.py +91 -0
  56. rasa/builder/guardrails/__init__.py +1 -0
  57. rasa/builder/guardrails/clients.py +256 -0
  58. rasa/builder/guardrails/constants.py +12 -0
  59. rasa/builder/guardrails/exceptions.py +4 -0
  60. rasa/builder/guardrails/models.py +266 -0
  61. rasa/builder/guardrails/policy_checker.py +324 -0
  62. rasa/builder/guardrails/store.py +238 -0
  63. rasa/builder/guardrails/utils.py +94 -0
  64. rasa/builder/job_manager.py +87 -0
  65. rasa/builder/jobs.py +609 -0
  66. rasa/builder/llm_service.py +273 -0
  67. rasa/builder/logging_utils.py +265 -0
  68. rasa/builder/main.py +234 -0
  69. rasa/builder/models.py +229 -0
  70. rasa/builder/project_generator.py +463 -0
  71. rasa/builder/project_info.py +72 -0
  72. rasa/builder/service.py +1367 -0
  73. rasa/builder/shared/tracker_context.py +212 -0
  74. rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
  75. rasa/builder/template_cache.py +69 -0
  76. rasa/builder/training_service.py +188 -0
  77. rasa/builder/validation_service.py +101 -0
  78. rasa/cli/arguments/data.py +9 -0
  79. rasa/cli/arguments/default_arguments.py +12 -0
  80. rasa/cli/arguments/run.py +2 -0
  81. rasa/cli/arguments/train.py +2 -0
  82. rasa/cli/data.py +78 -10
  83. rasa/cli/dialogue_understanding_test.py +11 -7
  84. rasa/cli/e2e_test.py +10 -6
  85. rasa/cli/evaluate.py +4 -2
  86. rasa/cli/export.py +5 -2
  87. rasa/cli/inspect.py +9 -4
  88. rasa/cli/interactive.py +8 -4
  89. rasa/cli/llm_fine_tuning.py +12 -6
  90. rasa/cli/project_templates/basic/README.md +23 -0
  91. rasa/cli/project_templates/basic/actions/__init__ +0 -0
  92. rasa/cli/project_templates/basic/actions/action_human_handoff.py +40 -0
  93. rasa/cli/project_templates/basic/actions/actions.md +10 -0
  94. rasa/cli/project_templates/basic/config.yml +29 -0
  95. rasa/cli/project_templates/basic/credentials.yml +33 -0
  96. rasa/cli/project_templates/basic/data/data.md +8 -0
  97. rasa/cli/project_templates/basic/data/general/feedback.yml +21 -0
  98. rasa/cli/project_templates/basic/data/general/goodbye.yml +6 -0
  99. rasa/cli/project_templates/basic/data/general/hello.yml +6 -0
  100. rasa/cli/project_templates/basic/data/general/help.yml +6 -0
  101. rasa/cli/project_templates/basic/data/general/human_handoff.yml +16 -0
  102. rasa/cli/project_templates/basic/data/general/show_faqs.yml +6 -0
  103. rasa/cli/project_templates/basic/data/system/patterns/pattern_cannot_handle.yml +7 -0
  104. rasa/cli/project_templates/basic/data/system/patterns/pattern_completed.yml +7 -0
  105. rasa/cli/project_templates/basic/data/system/patterns/pattern_correction.yml +7 -0
  106. rasa/cli/project_templates/basic/data/system/patterns/pattern_search.yml +8 -0
  107. rasa/cli/project_templates/basic/data/system/patterns/pattern_session_start.yml +8 -0
  108. rasa/cli/project_templates/basic/docs/docs.md +5 -0
  109. rasa/cli/project_templates/basic/docs/template.txt +28 -0
  110. rasa/cli/project_templates/basic/domain/domain.md +11 -0
  111. rasa/cli/project_templates/basic/domain/general/feedback.yml +25 -0
  112. rasa/cli/project_templates/basic/domain/general/goodbye.yml +9 -0
  113. rasa/cli/project_templates/basic/domain/general/hello.yml +7 -0
  114. rasa/cli/project_templates/basic/domain/general/help.yml +21 -0
  115. rasa/cli/project_templates/basic/domain/general/human_handoff.yml +32 -0
  116. rasa/cli/project_templates/basic/domain/general/show_faqs.yml +14 -0
  117. rasa/cli/project_templates/basic/domain/system/patterns/pattern_cannot_handle.yml +5 -0
  118. rasa/cli/project_templates/basic/domain/system/patterns/pattern_session_start.yml +19 -0
  119. rasa/cli/project_templates/basic/endpoints.yml +67 -0
  120. rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
  121. rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
  122. rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
  123. rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
  124. rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/help.yml +8 -0
  125. rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/human_handoff.yml +41 -0
  126. rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/patterns.yml +32 -0
  127. rasa/cli/project_templates/basic/tests/e2e_test_cases/without_stub/general/show_faqs.yml +8 -0
  128. rasa/cli/project_templates/default/config.yml +4 -0
  129. rasa/cli/project_templates/default/endpoints.yml +4 -0
  130. rasa/cli/project_templates/defaults.py +1 -0
  131. rasa/cli/project_templates/finance/README.md +26 -0
  132. rasa/cli/project_templates/finance/actions/__init__.py +0 -0
  133. rasa/cli/project_templates/finance/actions/accounts/__init__.py +0 -0
  134. rasa/cli/project_templates/finance/actions/accounts/check_balance.py +18 -0
  135. rasa/cli/project_templates/finance/actions/actions.md +15 -0
  136. rasa/cli/project_templates/finance/actions/cards/__init__.py +0 -0
  137. rasa/cli/project_templates/finance/actions/cards/check_that_card_exists.py +21 -0
  138. rasa/cli/project_templates/finance/actions/cards/list_cards.py +22 -0
  139. rasa/cli/project_templates/finance/actions/contacts/__init__.py +0 -0
  140. rasa/cli/project_templates/finance/actions/contacts/add_contact.py +30 -0
  141. rasa/cli/project_templates/finance/actions/contacts/list_contacts.py +22 -0
  142. rasa/cli/project_templates/finance/actions/contacts/remove_contact.py +35 -0
  143. rasa/cli/project_templates/finance/actions/db.py +117 -0
  144. rasa/cli/project_templates/finance/actions/general/__init__.py +0 -0
  145. rasa/cli/project_templates/finance/actions/general/action_human_handoff.py +49 -0
  146. rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
  147. rasa/cli/project_templates/finance/actions/transfers/check_transfer_funds.py +27 -0
  148. rasa/cli/project_templates/finance/actions/transfers/check_transfer_limit.py +36 -0
  149. rasa/cli/project_templates/finance/actions/transfers/execute_recurrent_payment.py +20 -0
  150. rasa/cli/project_templates/finance/actions/transfers/execute_transfer.py +45 -0
  151. rasa/cli/project_templates/finance/actions/transfers/list_transactions.py +32 -0
  152. rasa/cli/project_templates/finance/config.yml +29 -0
  153. rasa/cli/project_templates/finance/credentials.yml +33 -0
  154. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +9 -0
  155. rasa/cli/project_templates/finance/data/accounts/download_statements.yml +26 -0
  156. rasa/cli/project_templates/finance/data/bills/bill_pay_reminder.yml +25 -0
  157. rasa/cli/project_templates/finance/data/cards/activate_card.yml +35 -0
  158. rasa/cli/project_templates/finance/data/cards/block_card.yml +45 -0
  159. rasa/cli/project_templates/finance/data/cards/list_cards.yml +14 -0
  160. rasa/cli/project_templates/finance/data/cards/replace_card.yml +16 -0
  161. rasa/cli/project_templates/finance/data/cards/replace_eligible_card.yml +29 -0
  162. rasa/cli/project_templates/finance/data/contacts/add_contact.yml +33 -0
  163. rasa/cli/project_templates/finance/data/contacts/list_contacts.yml +14 -0
  164. rasa/cli/project_templates/finance/data/contacts/remove_contact.yml +31 -0
  165. rasa/cli/project_templates/finance/data/data.md +14 -0
  166. rasa/cli/project_templates/finance/data/general/bot_challenge.yml +6 -0
  167. rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
  168. rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
  169. rasa/cli/project_templates/finance/data/general/hello.yml +6 -0
  170. rasa/cli/project_templates/finance/data/general/help.yml +9 -0
  171. rasa/cli/project_templates/finance/data/general/human_handoff.yml +16 -0
  172. rasa/cli/project_templates/finance/data/general/welcome.yml +9 -0
  173. rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +7 -0
  174. rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +7 -0
  175. rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +8 -0
  176. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +8 -0
  177. rasa/cli/project_templates/finance/data/transfers/check_transfer_limit.yml +18 -0
  178. rasa/cli/project_templates/finance/data/transfers/list_transactions.yml +46 -0
  179. rasa/cli/project_templates/finance/data/transfers/move_money_between_accounts.yml +51 -0
  180. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +34 -0
  181. rasa/cli/project_templates/finance/data/transfers/transfer_money_to_a_third_party.yml +175 -0
  182. rasa/cli/project_templates/finance/db/cards.json +18 -0
  183. rasa/cli/project_templates/finance/db/contacts.json +10 -0
  184. rasa/cli/project_templates/finance/db/my_account.json +6 -0
  185. rasa/cli/project_templates/finance/db/transactions.json +22 -0
  186. rasa/cli/project_templates/finance/docs/docs.md +8 -0
  187. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/budgeting_analytics.txt +22 -0
  188. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/multi_currency_accounts.txt +19 -0
  189. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/account_features/premium_benefits.txt +19 -0
  190. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/contactless_limits.txt +16 -0
  191. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/freeze_unfreeze_card.txt +16 -0
  192. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/card_management/lost_stolen_card.txt +19 -0
  193. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/instant_payments.txt +19 -0
  194. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/money_transfers/international_transfers.txt +19 -0
  195. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/fraud_protection.txt +22 -0
  196. rasa/cli/project_templates/finance/docs/fenlo_banking_faq/security_fraud/secure_payments.txt +22 -0
  197. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +15 -0
  198. rasa/cli/project_templates/finance/domain/accounts/download_statements.yml +40 -0
  199. rasa/cli/project_templates/finance/domain/bills/bill_pay_reminder.yml +49 -0
  200. rasa/cli/project_templates/finance/domain/cards/activate_card.yml +24 -0
  201. rasa/cli/project_templates/finance/domain/cards/block_card.yml +44 -0
  202. rasa/cli/project_templates/finance/domain/cards/list_cards.yml +16 -0
  203. rasa/cli/project_templates/finance/domain/cards/replace_card.yml +43 -0
  204. rasa/cli/project_templates/finance/domain/cards/shared.yml +15 -0
  205. rasa/cli/project_templates/finance/domain/contacts/add_contact.yml +37 -0
  206. rasa/cli/project_templates/finance/domain/contacts/list_contacts.yml +16 -0
  207. rasa/cli/project_templates/finance/domain/contacts/remove_contact.yml +32 -0
  208. rasa/cli/project_templates/finance/domain/domain.md +18 -0
  209. rasa/cli/project_templates/finance/domain/general/_shared.yml +39 -0
  210. rasa/cli/project_templates/finance/domain/general/bot_challenge.yml +4 -0
  211. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +8 -0
  212. rasa/cli/project_templates/finance/domain/general/feedback.yml +25 -0
  213. rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
  214. rasa/cli/project_templates/finance/domain/general/help.yml +0 -0
  215. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +31 -0
  216. rasa/cli/project_templates/finance/domain/general/welcome.yml +39 -0
  217. rasa/cli/project_templates/finance/domain/transfers/check_transfer_limit.yml +32 -0
  218. rasa/cli/project_templates/finance/domain/transfers/list_transactions.yml +44 -0
  219. rasa/cli/project_templates/finance/domain/transfers/shared.yml +17 -0
  220. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +221 -0
  221. rasa/cli/project_templates/finance/endpoints.yml +67 -0
  222. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
  223. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/accounts/check_balance.yml +9 -0
  224. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/accounts/download_statements.yml +43 -0
  225. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/cards/block_card.yml +55 -0
  226. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/bot_challenge.yml +8 -0
  227. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
  228. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
  229. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
  230. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/human_handoff.yml +35 -0
  231. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/general/patterns.yml +22 -0
  232. rasa/cli/project_templates/finance/tests/e2e_test_cases/without_stub/transfers/transfer_money.yml +56 -0
  233. rasa/cli/project_templates/telco/README.md +25 -0
  234. rasa/cli/project_templates/telco/actions/__init__.py +0 -0
  235. rasa/cli/project_templates/telco/actions/actions.md +12 -0
  236. rasa/cli/project_templates/telco/actions/billing/__init__.py +0 -0
  237. rasa/cli/project_templates/telco/actions/billing/actions_billing.py +204 -0
  238. rasa/cli/project_templates/telco/actions/general/__init__.py +0 -0
  239. rasa/cli/project_templates/telco/actions/general/action_human_handoff.py +49 -0
  240. rasa/cli/project_templates/telco/actions/network/__init__.py +0 -0
  241. rasa/cli/project_templates/telco/actions/network/actions_get_data_from_db.py +48 -0
  242. rasa/cli/project_templates/telco/actions/network/actions_run_diagnostics.py +28 -0
  243. rasa/cli/project_templates/telco/actions/network/actions_session_start.py +18 -0
  244. rasa/cli/project_templates/telco/config.yml +29 -0
  245. rasa/cli/project_templates/telco/credentials.yml +33 -0
  246. rasa/cli/project_templates/telco/csvs/billing.csv +19 -0
  247. rasa/cli/project_templates/telco/csvs/customers.csv +5 -0
  248. rasa/cli/project_templates/telco/data/billing/flow_understand_bill.yml +45 -0
  249. rasa/cli/project_templates/telco/data/data.md +11 -0
  250. rasa/cli/project_templates/telco/data/general/bot_challenge.yml +6 -0
  251. rasa/cli/project_templates/telco/data/general/feedback.yml +20 -0
  252. rasa/cli/project_templates/telco/data/general/goodbye.yml +6 -0
  253. rasa/cli/project_templates/telco/data/general/hello.yml +6 -0
  254. rasa/cli/project_templates/telco/data/general/human_handoff.yml +16 -0
  255. rasa/cli/project_templates/telco/data/general/patterns.yml +30 -0
  256. rasa/cli/project_templates/telco/data/network/flow_reboot_router.yml +8 -0
  257. rasa/cli/project_templates/telco/data/network/flow_reset_router.yml +7 -0
  258. rasa/cli/project_templates/telco/data/network/flow_solve_internet_issue.yml +73 -0
  259. rasa/cli/project_templates/telco/docs/docs.md +8 -0
  260. rasa/cli/project_templates/telco/docs/network/reset_vs_rboot_router.txt +1 -0
  261. rasa/cli/project_templates/telco/docs/network/restart_router.txt +6 -0
  262. rasa/cli/project_templates/telco/docs/network/run_speed_test.txt +6 -0
  263. rasa/cli/project_templates/telco/domain/billing/understand_bill.yml +102 -0
  264. rasa/cli/project_templates/telco/domain/domain.md +13 -0
  265. rasa/cli/project_templates/telco/domain/general/bot_challenge.yml +4 -0
  266. rasa/cli/project_templates/telco/domain/general/feedback.yml +25 -0
  267. rasa/cli/project_templates/telco/domain/general/goodbye.yml +7 -0
  268. rasa/cli/project_templates/telco/domain/general/hello.yml +5 -0
  269. rasa/cli/project_templates/telco/domain/general/human_handoff.yml +26 -0
  270. rasa/cli/project_templates/telco/domain/general/patterns.yml +33 -0
  271. rasa/cli/project_templates/telco/domain/network/reboot_router.yml +21 -0
  272. rasa/cli/project_templates/telco/domain/network/reset_router.yml +12 -0
  273. rasa/cli/project_templates/telco/domain/network/run_speed_test.yml +25 -0
  274. rasa/cli/project_templates/telco/domain/network/solve_internet_issue.yml +74 -0
  275. rasa/cli/project_templates/telco/domain/shared.yml +129 -0
  276. rasa/cli/project_templates/telco/endpoints.yml +67 -0
  277. rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +40 -0
  278. rasa/cli/project_templates/telco/tests/e2e_test_cases/with_stub/network/solve_internet_not_slow.yml +33 -0
  279. rasa/cli/project_templates/telco/tests/e2e_test_cases/with_stub/network/solve_internet_slow.yml +47 -0
  280. rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/billing/understand_bill.yml +67 -0
  281. rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/bot_challenge.yml +8 -0
  282. rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/feedback.yml +46 -0
  283. rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/goodbye.yml +9 -0
  284. rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/hello.yml +8 -0
  285. rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/human_handoff.yml +35 -0
  286. rasa/cli/project_templates/telco/tests/e2e_test_cases/without_stub/general/patterns.yml +23 -0
  287. rasa/cli/project_templates/tutorial/config.yml +2 -1
  288. rasa/cli/project_templates/tutorial/credentials.yml +10 -0
  289. rasa/cli/run.py +8 -10
  290. rasa/cli/scaffold.py +50 -6
  291. rasa/cli/shell.py +10 -5
  292. rasa/cli/studio/studio.py +1 -1
  293. rasa/cli/test.py +34 -14
  294. rasa/cli/train.py +44 -30
  295. rasa/cli/utils.py +1 -393
  296. rasa/cli/validation/__init__.py +0 -0
  297. rasa/cli/validation/bot_config.py +232 -0
  298. rasa/cli/validation/config_path_validation.py +257 -0
  299. rasa/cli/x.py +8 -4
  300. rasa/constants.py +7 -1
  301. rasa/core/actions/action.py +53 -13
  302. rasa/core/actions/action_exceptions.py +1 -1
  303. rasa/core/actions/action_run_slot_rejections.py +1 -1
  304. rasa/core/actions/grpc_custom_action_executor.py +1 -1
  305. rasa/core/agent.py +22 -2
  306. rasa/core/available_agents.py +239 -0
  307. rasa/core/brokers/broker.py +1 -1
  308. rasa/core/brokers/kafka.py +56 -8
  309. rasa/core/channels/__init__.py +82 -35
  310. rasa/core/channels/channel.py +4 -3
  311. rasa/core/channels/constants.py +3 -0
  312. rasa/core/channels/development_inspector.py +29 -16
  313. rasa/core/channels/hangouts.py +2 -2
  314. rasa/core/channels/inspector/README.md +25 -13
  315. rasa/core/channels/inspector/dist/assets/{arc-0b11fe30.js → arc-6177260a.js} +1 -1
  316. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-9eef30a7.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
  317. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-03e94f28.js → c4Diagram-3d4e48cf-f25427d5.js} +1 -1
  318. rasa/core/channels/inspector/dist/assets/channel-bf9cbb34.js +1 -0
  319. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-95c09eba.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
  320. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-38e8446c.js → classDiagram-v2-f2320105-58db65c0.js} +1 -1
  321. rasa/core/channels/inspector/dist/assets/clone-8f9083bb.js +1 -0
  322. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-57dc3038.js → createText-2e5e7dd3-088372e2.js} +1 -1
  323. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-4bac0545.js → edges-e0da2a9e-58676240.js} +1 -1
  324. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-81795c90.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
  325. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-89489ae6.js → flowDb-956e92f1-ea63f85c.js} +1 -1
  326. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-cd152627.js → flowDiagram-66a62f08-a2af48cd.js} +1 -1
  327. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-9ecd5b59.js +1 -0
  328. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-3da369bc.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
  329. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-85ec16f8.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
  330. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-495bc140.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
  331. rasa/core/channels/inspector/dist/assets/{graph-1ec4d266.js → graph-0a6f8466.js} +1 -1
  332. rasa/core/channels/inspector/dist/assets/{index-3862675e-0a0e97c9.js → index-3862675e-7610671a.js} +1 -1
  333. rasa/core/channels/inspector/dist/assets/index-74e01d94.js +1354 -0
  334. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-4d54bcde.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
  335. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-dc097114.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
  336. rasa/core/channels/inspector/dist/assets/{layout-1a08981e.js → layout-e7fbc2bf.js} +1 -1
  337. rasa/core/channels/inspector/dist/assets/{line-95f7f1d3.js → line-a8aa457c.js} +1 -1
  338. rasa/core/channels/inspector/dist/assets/{linear-97e69543.js → linear-3351e0d2.js} +1 -1
  339. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-8c71ff03.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
  340. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-f14c71c7.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
  341. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-f1d3c9ff.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
  342. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-bfa2412f.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
  343. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-53f2c97b.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
  344. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-319d7c0e.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
  345. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-76a09418.js → stateDiagram-587899a1-0e770395.js} +1 -1
  346. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-a67f15d4.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
  347. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-0654e7c3.js → styles-6aaf32cf-36a9e70d.js} +1 -1
  348. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-1394bb9d.js → styles-9a916d00-884a8b5b.js} +1 -1
  349. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-e4c5bdae.js → styles-c10674c1-dc097813.js} +1 -1
  350. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-50957104.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
  351. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-b0885a6a.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
  352. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-79e6541a.js → xychartDiagram-e933f94c-afb6fe56.js} +1 -1
  353. rasa/core/channels/inspector/dist/index.html +1 -1
  354. rasa/core/channels/inspector/package.json +18 -18
  355. rasa/core/channels/inspector/src/App.tsx +56 -12
  356. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +1 -1
  357. rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
  358. rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +4 -2
  359. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +20 -3
  360. rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +296 -0
  361. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +6 -2
  362. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +26 -4
  363. rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
  364. rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
  365. rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
  366. rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
  367. rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
  368. rasa/core/channels/inspector/src/types.ts +55 -1
  369. rasa/core/channels/inspector/yarn.lock +336 -189
  370. rasa/core/channels/socketio.py +212 -51
  371. rasa/core/channels/studio_chat.py +82 -32
  372. rasa/core/channels/telegram.py +4 -9
  373. rasa/core/channels/voice_ready/twilio_voice.py +1 -1
  374. rasa/core/channels/voice_stream/asr/asr_event.py +1 -1
  375. rasa/core/channels/voice_stream/asr/azure.py +6 -3
  376. rasa/core/channels/voice_stream/asr/deepgram.py +1 -1
  377. rasa/core/channels/voice_stream/audiocodes.py +11 -6
  378. rasa/core/channels/voice_stream/browser_audio.py +91 -4
  379. rasa/core/channels/voice_stream/call_state.py +13 -2
  380. rasa/core/channels/voice_stream/genesys.py +19 -15
  381. rasa/core/channels/voice_stream/jambonz.py +22 -12
  382. rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
  383. rasa/core/channels/voice_stream/twilio_media_streams.py +35 -14
  384. rasa/core/channels/voice_stream/util.py +11 -1
  385. rasa/core/channels/voice_stream/voice_channel.py +170 -32
  386. rasa/core/concurrent_lock_store.py +83 -16
  387. rasa/core/config/__init__.py +0 -0
  388. rasa/core/{available_endpoints.py → config/available_endpoints.py} +56 -18
  389. rasa/core/config/configuration.py +295 -0
  390. rasa/core/config/credentials.py +19 -0
  391. rasa/core/config/message_procesing_config.py +34 -0
  392. rasa/core/constants.py +17 -0
  393. rasa/core/exceptions.py +1 -1
  394. rasa/core/featurizers/tracker_featurizers.py +3 -2
  395. rasa/core/iam_credentials_providers/__init__.py +0 -0
  396. rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +291 -0
  397. rasa/core/iam_credentials_providers/credentials_provider_protocol.py +91 -0
  398. rasa/core/lock_store.py +50 -10
  399. rasa/core/nlg/contextual_response_rephraser.py +5 -0
  400. rasa/core/nlg/generator.py +1 -1
  401. rasa/core/persistor.py +7 -7
  402. rasa/core/policies/enterprise_search_policy.py +9 -10
  403. rasa/core/policies/flow_policy.py +4 -4
  404. rasa/core/policies/flows/agent_executor.py +720 -0
  405. rasa/core/policies/flows/flow_exceptions.py +5 -2
  406. rasa/core/policies/flows/flow_executor.py +146 -77
  407. rasa/core/policies/flows/mcp_tool_executor.py +304 -0
  408. rasa/core/policies/intentless_policy.py +1 -1
  409. rasa/core/policies/rule_policy.py +1 -1
  410. rasa/core/policies/ted_policy.py +20 -12
  411. rasa/core/policies/unexpected_intent_policy.py +6 -0
  412. rasa/core/processor.py +100 -44
  413. rasa/core/redis_connection_factory.py +474 -0
  414. rasa/core/run.py +49 -10
  415. rasa/core/test.py +4 -0
  416. rasa/core/tracker_stores/redis_tracker_store.py +36 -14
  417. rasa/core/tracker_stores/sql_tracker_store.py +59 -1
  418. rasa/core/tracker_stores/tracker_store.py +3 -7
  419. rasa/core/train.py +1 -1
  420. rasa/core/training/interactive.py +20 -18
  421. rasa/core/training/story_conflict.py +5 -5
  422. rasa/core/utils.py +22 -23
  423. rasa/dialogue_understanding/commands/__init__.py +8 -0
  424. rasa/dialogue_understanding/commands/cancel_flow_command.py +20 -6
  425. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +21 -2
  426. rasa/dialogue_understanding/commands/clarify_command.py +20 -2
  427. rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
  428. rasa/dialogue_understanding/commands/knowledge_answer_command.py +21 -2
  429. rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
  430. rasa/dialogue_understanding/commands/start_flow_command.py +75 -7
  431. rasa/dialogue_understanding/commands/utils.py +135 -2
  432. rasa/dialogue_understanding/generator/command_parser.py +4 -0
  433. rasa/dialogue_understanding/generator/flow_retrieval.py +0 -9
  434. rasa/dialogue_understanding/generator/llm_based_command_generator.py +52 -12
  435. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  436. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  437. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +66 -0
  438. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +66 -0
  439. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +89 -0
  440. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +88 -0
  441. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +42 -7
  442. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +40 -3
  443. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +20 -3
  444. rasa/dialogue_understanding/patterns/cancel.py +27 -6
  445. rasa/dialogue_understanding/patterns/clarify.py +3 -14
  446. rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
  447. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +49 -9
  448. rasa/dialogue_understanding/processor/command_processor.py +136 -15
  449. rasa/dialogue_understanding/stack/dialogue_stack.py +98 -2
  450. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
  451. rasa/dialogue_understanding/stack/utils.py +57 -3
  452. rasa/dialogue_understanding/utils.py +24 -4
  453. rasa/dialogue_understanding_test/du_test_runner.py +8 -3
  454. rasa/e2e_test/e2e_test_runner.py +13 -3
  455. rasa/engine/caching.py +2 -2
  456. rasa/engine/constants.py +1 -1
  457. rasa/engine/graph.py +5 -1
  458. rasa/engine/loader.py +12 -0
  459. rasa/engine/recipes/default_components.py +138 -49
  460. rasa/engine/recipes/default_recipe.py +108 -11
  461. rasa/engine/runner/dask.py +8 -5
  462. rasa/engine/validation.py +25 -8
  463. rasa/graph_components/validators/default_recipe_validator.py +86 -28
  464. rasa/hooks.py +5 -5
  465. rasa/llm_fine_tuning/utils.py +2 -2
  466. rasa/model_manager/model_api.py +4 -5
  467. rasa/model_manager/runner_service.py +2 -2
  468. rasa/model_manager/socket_bridge.py +21 -17
  469. rasa/model_manager/trainer_service.py +12 -9
  470. rasa/model_manager/utils.py +1 -29
  471. rasa/model_manager/warm_rasa_process.py +13 -3
  472. rasa/model_training.py +60 -47
  473. rasa/nlu/classifiers/diet_classifier.py +198 -98
  474. rasa/nlu/classifiers/logistic_regression_classifier.py +1 -4
  475. rasa/nlu/classifiers/mitie_intent_classifier.py +3 -0
  476. rasa/nlu/classifiers/sklearn_intent_classifier.py +1 -3
  477. rasa/nlu/extractors/crf_entity_extractor.py +9 -10
  478. rasa/nlu/extractors/mitie_entity_extractor.py +3 -0
  479. rasa/nlu/extractors/spacy_entity_extractor.py +3 -0
  480. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +4 -0
  481. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +5 -0
  482. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +2 -0
  483. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +3 -0
  484. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +4 -2
  485. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -0
  486. rasa/nlu/selectors/response_selector.py +10 -2
  487. rasa/nlu/tokenizers/jieba_tokenizer.py +3 -4
  488. rasa/nlu/tokenizers/mitie_tokenizer.py +3 -2
  489. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -2
  490. rasa/nlu/utils/mitie_utils.py +3 -0
  491. rasa/nlu/utils/spacy_utils.py +3 -2
  492. rasa/plugin.py +8 -8
  493. rasa/privacy/privacy_config.py +1 -1
  494. rasa/privacy/privacy_manager.py +12 -3
  495. rasa/server.py +15 -3
  496. rasa/shared/agents/__init__.py +0 -0
  497. rasa/shared/agents/auth/__init__.py +0 -0
  498. rasa/shared/agents/auth/agent_auth_factory.py +105 -0
  499. rasa/shared/agents/auth/agent_auth_manager.py +92 -0
  500. rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
  501. rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
  502. rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
  503. rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
  504. rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +170 -0
  505. rasa/shared/agents/auth/constants.py +13 -0
  506. rasa/shared/agents/auth/types.py +12 -0
  507. rasa/shared/agents/auth/utils.py +85 -0
  508. rasa/shared/agents/utils.py +35 -0
  509. rasa/shared/constants.py +11 -0
  510. rasa/shared/core/constants.py +17 -1
  511. rasa/shared/core/domain.py +62 -22
  512. rasa/shared/core/events.py +329 -0
  513. rasa/shared/core/flows/constants.py +5 -0
  514. rasa/shared/core/flows/flow.py +1 -1
  515. rasa/shared/core/flows/flow_step.py +7 -1
  516. rasa/shared/core/flows/flows_list.py +21 -5
  517. rasa/shared/core/flows/flows_yaml_schema.json +119 -184
  518. rasa/shared/core/flows/steps/call.py +57 -6
  519. rasa/shared/core/flows/steps/collect.py +98 -13
  520. rasa/shared/core/flows/validation.py +372 -8
  521. rasa/shared/core/flows/yaml_flows_io.py +19 -10
  522. rasa/shared/core/slots.py +6 -2
  523. rasa/shared/core/trackers.py +5 -2
  524. rasa/shared/core/training_data/story_reader/story_reader.py +1 -1
  525. rasa/shared/exceptions.py +39 -2
  526. rasa/shared/importers/importer.py +6 -0
  527. rasa/shared/importers/rasa.py +1 -1
  528. rasa/shared/importers/utils.py +86 -4
  529. rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
  530. rasa/shared/providers/llm/_base_litellm_client.py +41 -9
  531. rasa/shared/providers/llm/litellm_router_llm_client.py +10 -6
  532. rasa/shared/providers/llm/llm_client.py +7 -3
  533. rasa/shared/providers/llm/llm_response.py +66 -0
  534. rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
  535. rasa/shared/utils/common.py +26 -1
  536. rasa/shared/utils/health_check/health_check.py +7 -3
  537. rasa/shared/utils/llm.py +92 -19
  538. rasa/shared/utils/mcp/__init__.py +0 -0
  539. rasa/shared/utils/mcp/server_connection.py +250 -0
  540. rasa/shared/utils/mcp/utils.py +20 -0
  541. rasa/shared/utils/schemas/events.py +42 -0
  542. rasa/shared/utils/yaml.py +3 -1
  543. rasa/studio/download.py +3 -0
  544. rasa/studio/prompts.py +1 -0
  545. rasa/studio/pull/pull.py +3 -2
  546. rasa/studio/train.py +8 -7
  547. rasa/studio/upload.py +19 -52
  548. rasa/telemetry.py +166 -28
  549. rasa/tracing/config.py +45 -12
  550. rasa/tracing/constants.py +14 -0
  551. rasa/tracing/instrumentation/attribute_extractors.py +142 -9
  552. rasa/tracing/instrumentation/instrumentation.py +626 -21
  553. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
  554. rasa/tracing/instrumentation/metrics.py +32 -0
  555. rasa/tracing/metric_instrument_provider.py +68 -0
  556. rasa/utils/common.py +92 -1
  557. rasa/utils/endpoints.py +11 -2
  558. rasa/utils/io.py +27 -9
  559. rasa/utils/json_utils.py +6 -1
  560. rasa/utils/log_utils.py +121 -7
  561. rasa/utils/ml_utils.py +1 -1
  562. rasa/utils/openapi.py +144 -0
  563. rasa/utils/plotting.py +1 -1
  564. rasa/utils/pypred.py +45 -0
  565. rasa/utils/tensorflow/__init__.py +7 -0
  566. rasa/utils/tensorflow/callback.py +136 -101
  567. rasa/utils/tensorflow/crf.py +1 -1
  568. rasa/utils/tensorflow/data_generator.py +21 -8
  569. rasa/utils/tensorflow/layers.py +21 -11
  570. rasa/utils/tensorflow/metrics.py +7 -3
  571. rasa/utils/tensorflow/models.py +56 -8
  572. rasa/utils/tensorflow/rasa_layers.py +8 -6
  573. rasa/utils/tensorflow/transformer.py +2 -3
  574. rasa/utils/train_utils.py +54 -24
  575. rasa/validator.py +149 -16
  576. rasa/version.py +1 -1
  577. rasa_pro-3.14.0.dist-info/METADATA +212 -0
  578. {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/RECORD +581 -269
  579. rasa/core/channels/inspector/dist/assets/channel-51d02e9e.js +0 -1
  580. rasa/core/channels/inspector/dist/assets/clone-cc738fa6.js +0 -1
  581. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-0c716443.js +0 -1
  582. rasa/core/channels/inspector/dist/assets/index-c804b295.js +0 -1335
  583. rasa_pro-3.13.12.dist-info/METADATA +0 -192
  584. {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/NOTICE +0 -0
  585. {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/WHEEL +0 -0
  586. {rasa_pro-3.13.12.dist-info → rasa_pro-3.14.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,91 @@
1
+ """Custom exceptions for the prompt-to-bot service."""
2
+
3
+ from typing import Any, Dict, List, Optional
4
+
5
+
6
+ class PromptToBotError(Exception):
7
+ """Base exception for prompt-to-bot service."""
8
+
9
+ pass
10
+
11
+
12
+ class ValidationError(PromptToBotError):
13
+ """Raised when Rasa project validation fails."""
14
+
15
+ def __init__(
16
+ self, message: str, validation_logs: Optional[List[Dict[str, Any]]] = None
17
+ ):
18
+ super().__init__(message)
19
+ self.validation_logs = validation_logs or []
20
+
21
+ def get_logs(self, log_levels: Optional[List[str]]) -> List[Dict[str, Any]]:
22
+ """Get logs filtered by given log levels."""
23
+ if len(self.validation_logs) == 0:
24
+ return []
25
+
26
+ error_log_entries: List[Dict[str, Any]] = []
27
+ for log_entry in self.validation_logs:
28
+ if log_levels is not None and log_entry.get("log_level") in log_levels:
29
+ error_log_entries.append(log_entry)
30
+
31
+ return error_log_entries
32
+
33
+ def get_error_message_with_logs(
34
+ self, log_levels: Optional[List[str]] = None
35
+ ) -> str:
36
+ """Get the error message with validation logs for specified log levels.
37
+
38
+ Args:
39
+ log_levels: List of log levels to include. If None, includes all logs.
40
+
41
+ Returns:
42
+ Error message with validation logs appended.
43
+ """
44
+ error_message = str(self)
45
+
46
+ # Include all logs when no specific levels are specified
47
+ logs = self.validation_logs if log_levels is None else self.get_logs(log_levels)
48
+
49
+ if logs:
50
+ logs_text = "\n".join([str(log) for log in logs])
51
+ error_message += f"\n\nValidation Logs:\n{logs_text}\n"
52
+
53
+ return error_message
54
+
55
+
56
+ class TrainingError(PromptToBotError):
57
+ """Raised when model training fails."""
58
+
59
+ pass
60
+
61
+
62
+ class LLMGenerationError(PromptToBotError):
63
+ """Raised when LLM generation fails."""
64
+
65
+ pass
66
+
67
+
68
+ class DocumentRetrievalError(PromptToBotError):
69
+ """Raised when document retrieval fails."""
70
+
71
+ pass
72
+
73
+
74
+ class SchemaValidationError(PromptToBotError):
75
+ """Raised when schema validation fails."""
76
+
77
+ pass
78
+
79
+
80
+ class AgentLoadError(PromptToBotError):
81
+ """Raised when agent loading fails."""
82
+
83
+ pass
84
+
85
+
86
+ class ProjectGenerationError(PromptToBotError):
87
+ """Raised when project generation fails after retries."""
88
+
89
+ def __init__(self, message: str, attempts: int):
90
+ super().__init__(f"{message} (failed after {attempts} attempts)")
91
+ self.attempts = attempts
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,256 @@
1
+ """Guardrails client implementations."""
2
+
3
+ import asyncio
4
+ import os
5
+ import time
6
+ from abc import ABC, abstractmethod
7
+ from contextlib import asynccontextmanager
8
+ from functools import lru_cache
9
+ from typing import Any, AsyncGenerator, Dict, Optional
10
+
11
+ import aiohttp
12
+ import structlog
13
+
14
+ from rasa.builder import config
15
+ from rasa.builder.guardrails.constants import (
16
+ LAKERA_API_KEY_ENV_VAR,
17
+ LAKERA_GUARD_ENDPOINT,
18
+ LAKERA_GUARD_RESULTS_ENDPOINT,
19
+ )
20
+ from rasa.builder.guardrails.exceptions import GuardrailsError
21
+ from rasa.builder.guardrails.models import (
22
+ GuardrailRequest,
23
+ GuardrailResponse,
24
+ LakeraGuardrailRequest,
25
+ LakeraGuardrailResponse,
26
+ )
27
+
28
+ structlogger = structlog.get_logger()
29
+
30
+
31
+ class GuardrailsClient(ABC):
32
+ """Abstract base class for guardrails clients."""
33
+
34
+ @property
35
+ @abstractmethod
36
+ def guard_endpoint(self) -> str:
37
+ """Get the guard endpoint for the guardrails API."""
38
+ pass
39
+
40
+ @abstractmethod
41
+ async def send_request(self, request: GuardrailRequest) -> GuardrailResponse:
42
+ """Send a request to the guardrails provider.
43
+
44
+ Args:
45
+ request: The guardrail request to send to the provider.
46
+
47
+ Returns:
48
+ GuardrailResponse with the results of the check.
49
+
50
+ Raises:
51
+ GuardrailsError: If the request fails for any reason.
52
+ """
53
+ pass
54
+
55
+ @lru_cache(maxsize=512)
56
+ def schedule_check(
57
+ self,
58
+ request: GuardrailRequest,
59
+ ) -> "asyncio.Task[GuardrailResponse]":
60
+ """Return a cached asyncio.Task that resolves to guardrail response.
61
+
62
+ Args:
63
+ request: The guardrail request to send to the provider.
64
+
65
+ Returns:
66
+ An asyncio Task that resolves to a GuardrailResponse.
67
+ """
68
+ structlogger.debug(
69
+ "guardrails.schedule_check.cache_miss",
70
+ request=request.model_dump(),
71
+ )
72
+ loop = asyncio.get_running_loop()
73
+ return loop.create_task(self.send_request(request))
74
+
75
+
76
+ class LakeraAIGuardrails(GuardrailsClient):
77
+ """Guardrails provider using Lakera AI."""
78
+
79
+ def __init__(
80
+ self,
81
+ api_key: Optional[str] = None,
82
+ base_url: Optional[str] = None,
83
+ ):
84
+ """Initialize Lakera guardrails provider.
85
+
86
+ Args:
87
+ api_key: Lakera AI API key.
88
+ base_url: Optional base URL for the API. If not provided, the default
89
+ Lakera API URL (https://api.lakera.ai/v2) will be used.
90
+ """
91
+ self.base_url: str = base_url or config.LAKERA_BASE_URL
92
+ self._api_key: Optional[str] = api_key or os.getenv(LAKERA_API_KEY_ENV_VAR)
93
+ self._session: Optional[aiohttp.ClientSession] = None
94
+
95
+ @property
96
+ def guard_endpoint(self) -> str:
97
+ """Get the guard endpoint for the Lakera API."""
98
+ return f"{self.base_url}/{LAKERA_GUARD_ENDPOINT}"
99
+
100
+ @property
101
+ def guard_results_endpoint(self) -> str:
102
+ """Get the guard results endpoint for the Lakera API."""
103
+ return f"{self.base_url}/{LAKERA_GUARD_RESULTS_ENDPOINT}"
104
+
105
+ @asynccontextmanager
106
+ async def _get_session(self) -> AsyncGenerator[aiohttp.ClientSession, None]:
107
+ """Create a fresh ClientSession, yield it, and always close it."""
108
+ session = aiohttp.ClientSession(headers=self._get_headers())
109
+ structlogger.debug("lakera_guardrails._get_session", base_url=self.base_url)
110
+
111
+ try:
112
+ yield session
113
+ except Exception as e:
114
+ structlogger.error("lakera_guardrails.session_error", error=str(e))
115
+ raise
116
+ finally:
117
+ try:
118
+ await session.close()
119
+ except Exception as exc:
120
+ structlogger.warning(
121
+ "lakera_guardrails.session_close_error",
122
+ event_info="Failed to close aiohttp client session cleanly.",
123
+ error=str(exc),
124
+ )
125
+
126
+ def _get_headers(self) -> Dict[str, str]:
127
+ """Get the headers for the Lakera API request.
128
+
129
+ Returns:
130
+ A dictionary containing the Authorization header with the API key.
131
+ """
132
+ using_proxy = bool(config.HELLO_LLM_PROXY_BASE_URL)
133
+
134
+ if using_proxy:
135
+ if not config.RASA_PRO_LICENSE:
136
+ raise GuardrailsError(
137
+ "HELLO_LLM_PROXY_BASE_URL is set but RASA_PRO_LICENSE is missing. "
138
+ "Proxy requires a Rasa Pro license token for authentication."
139
+ )
140
+ return {"Authorization": f"Bearer {config.RASA_PRO_LICENSE}"}
141
+
142
+ if not self._api_key:
143
+ raise GuardrailsError(
144
+ "LAKERA_API_KEY is missing. Provide it via env LAKERA_API_KEY or "
145
+ "pass api_key= to LakeraAIGuardrails."
146
+ )
147
+ return {"Authorization": f"Bearer {self._api_key}"}
148
+
149
+ async def send_request(self, request: GuardrailRequest) -> GuardrailResponse:
150
+ """Send a request to the Lakera API.
151
+
152
+ Args:
153
+ request: The guardrail request to send to the Lakera API.
154
+
155
+ Returns:
156
+ GuardrailResponse with the results of the check.
157
+
158
+ Raises:
159
+ GuardrailsError: If the request times out or returns a non-200 status code.
160
+ Exception: If the request fails for any other reason.
161
+ """
162
+ if not isinstance(request, LakeraGuardrailRequest):
163
+ raise GuardrailsError(
164
+ "LakeraAIGuardrails only supports LakeraGuardrailRequest"
165
+ )
166
+ start_time = time.time()
167
+ try:
168
+ async with self._get_session() as session:
169
+ raw_response = await self._send_http_request(session, request)
170
+ response = LakeraGuardrailResponse.from_raw_response(
171
+ raw_response,
172
+ hello_rasa_user_id=request.hello_rasa_user_id,
173
+ hello_rasa_project_id=request.hello_rasa_project_id,
174
+ )
175
+ processing_time_ms = (time.time() - start_time) * 1000
176
+ response.processing_time_ms = processing_time_ms
177
+ return response
178
+
179
+ # Propagate the GuardrailsError if it occurs.
180
+ except GuardrailsError as e:
181
+ raise e
182
+
183
+ except asyncio.TimeoutError:
184
+ message = "Lakera API request timed out."
185
+ structlogger.error(
186
+ "lakera_guardrails.send_request.timeout_error",
187
+ event_info=message,
188
+ processing_time_ms=(time.time() - start_time) * 1000,
189
+ )
190
+ raise GuardrailsError(message)
191
+
192
+ # Propagate the unexpected exceptions.
193
+ except Exception as e:
194
+ message = "Lakera API request failed."
195
+ structlogger.error(
196
+ "lakera_guardrails.send_request.unexpected_error",
197
+ event_info="Lakera API request failed.",
198
+ request=request,
199
+ error=e,
200
+ processing_time_ms=(time.time() - start_time) * 1000,
201
+ )
202
+ raise e
203
+
204
+ async def _send_http_request(
205
+ self, session: aiohttp.ClientSession, request: LakeraGuardrailRequest
206
+ ) -> Dict[str, Any]:
207
+ """Make an HTTP request to the Lakera API.
208
+
209
+ Args:
210
+ session: The aiohttp session to use for the request.
211
+ request: The guardrail request to send.
212
+
213
+ Returns:
214
+ The raw JSON response from the API.
215
+
216
+ Raises:
217
+ GuardrailsError: If the request fails or response parsing fails.
218
+ """
219
+ # Log the request details for debugging
220
+ json_payload = request.to_json_payload()
221
+ structlogger.debug(
222
+ "lakera_guardrails.send_request.request",
223
+ url=self.guard_endpoint,
224
+ method="POST",
225
+ request_body=json_payload,
226
+ )
227
+
228
+ async with session.post(
229
+ self.guard_endpoint,
230
+ json=json_payload,
231
+ ) as client_response:
232
+ # Check if the response is successful. If not, raise an error.
233
+ if client_response.status >= 400:
234
+ error_text = await client_response.text()
235
+ message = (
236
+ f"Lakera API request failed with status "
237
+ f"`{client_response.status}`. Error: "
238
+ f"`{error_text}`."
239
+ )
240
+ structlogger.error(
241
+ "lakera_guardrails.send_request.http_error",
242
+ event_info=message,
243
+ url=self.guard_endpoint,
244
+ status=client_response.status,
245
+ error=error_text,
246
+ request_body=json_payload,
247
+ )
248
+ raise GuardrailsError(message)
249
+
250
+ # Parse the response as a dictionary.
251
+ raw_response = await client_response.json()
252
+ structlogger.debug(
253
+ "lakera_guardrails.send_request.response",
254
+ response_body=raw_response,
255
+ )
256
+ return raw_response
@@ -0,0 +1,12 @@
1
+ from typing import Literal
2
+
3
+ LAKERA_API_KEY_ENV_VAR = "LAKERA_API_KEY"
4
+ LAKERA_GUARD_ENDPOINT = "guard"
5
+ LAKERA_GUARD_RESULTS_ENDPOINT = "guard/results"
6
+
7
+ # Metadata keys for GuardrailRequestKey
8
+ LAKERA_PROJECT_ID_KEY = "lakera_project_id"
9
+
10
+ BLOCK_SCOPE_USER: Literal["user"] = "user"
11
+ BLOCK_SCOPE_PROJECT: Literal["project"] = "project"
12
+ BlockScope = Literal["user", "project"]
@@ -0,0 +1,4 @@
1
+ class GuardrailsError(Exception):
2
+ """Raised when a guardrails error occurs."""
3
+
4
+ pass
@@ -0,0 +1,266 @@
1
+ """Models for guardrails system."""
2
+
3
+ import copy
4
+ from abc import ABC, abstractmethod
5
+ from enum import Enum
6
+ from typing import Any, Dict, List, Optional
7
+
8
+ from pydantic import BaseModel, ConfigDict, Field
9
+
10
+
11
+ class GuardrailType(Enum):
12
+ """Types of guardrails that can be applied with Lakera AI."""
13
+
14
+ PROMPT_ATTACK = "prompt_attack"
15
+ CONTENT_VIOLATION = "content_violation"
16
+ DATA_LEAKAGE = "data_leakage"
17
+ MALICIOUS_LINKS = "malicious_content"
18
+ CUSTOM = "custom"
19
+ OTHER = "other"
20
+
21
+
22
+ class GuardrailRequestKey(BaseModel):
23
+ user_text: str
24
+ hello_rasa_user_id: str = ""
25
+ hello_rasa_project_id: str = ""
26
+ # Generic metadata field for provider-specific configurations
27
+ metadata: Dict[str, str] = Field(default_factory=dict)
28
+
29
+ # hashable by value
30
+ model_config = ConfigDict(frozen=True)
31
+
32
+ def __hash__(self) -> int:
33
+ """Custom hash implementation that handles the metadata dictionary."""
34
+ # Convert metadata dict to a sorted tuple of items for consistent hashing
35
+ metadata_tuple = tuple(sorted(self.metadata.items())) if self.metadata else ()
36
+ hash_tuple = (
37
+ self.user_text,
38
+ self.hello_rasa_user_id,
39
+ self.hello_rasa_project_id,
40
+ tuple(sorted(metadata_tuple)),
41
+ )
42
+ return hash(hash_tuple)
43
+
44
+
45
+ class GuardrailRequest(BaseModel, ABC):
46
+ """Request for guardrails check."""
47
+
48
+ hello_rasa_user_id: Optional[str] = Field(
49
+ default=None,
50
+ description="Required. User identifier for the Hello Rasa project. ",
51
+ )
52
+ hello_rasa_project_id: Optional[str] = Field(
53
+ default=None,
54
+ description="Required. Project identifier for the Hello Rasa project. ",
55
+ )
56
+ metadata: Optional[Dict[str, Any]] = Field(
57
+ default=None, description="Additional metadata for the guardrails endpoint."
58
+ )
59
+
60
+ @abstractmethod
61
+ def to_json_payload(self) -> Dict[str, Any]:
62
+ """Convert the request to a JSON payload."""
63
+ ...
64
+
65
+
66
+ class LakeraGuardrailRequest(GuardrailRequest):
67
+ """Request for Lakera guardrails check."""
68
+
69
+ lakera_project_id: str = Field(
70
+ description="Required. Project identifier for the Lakera AI project."
71
+ )
72
+ payload: bool = Field(
73
+ default=True,
74
+ description=(
75
+ "From Lakera AI: When true the response will return a payload object "
76
+ "containing any PII, profanity or custom detector regex matches detected, "
77
+ "along with their location within the contents."
78
+ ),
79
+ )
80
+ breakdown: bool = Field(
81
+ default=True,
82
+ description=(
83
+ "From Lakera AI: When true the response will return a breakdown list of "
84
+ "the detectors that were run, as defined in the policy, and whether each "
85
+ "of them detected something or not."
86
+ ),
87
+ )
88
+
89
+ messages: List[Dict[str, Any]] = Field(
90
+ description=(
91
+ "Required. From Lakera AI: List of messages comprising the interaction "
92
+ "history with the LLM in OpenAI API Chat Completions format. Can be "
93
+ "multiple messages of any role: user, assistant, system, tool, or "
94
+ "developer."
95
+ ),
96
+ )
97
+
98
+ # Make the model hashable by value for use as cache keys in @lru_cache decorator.
99
+ model_config = ConfigDict(frozen=True)
100
+
101
+ def to_json_payload(self) -> Dict[str, Any]:
102
+ """Convert the request to a JSON payload to be sent to the Lakera endpoint."""
103
+ metadata = self.metadata or {}
104
+ metadata["hello_rasa_project_id"] = self.hello_rasa_project_id
105
+ metadata["hello_rasa_user_id"] = self.hello_rasa_user_id
106
+
107
+ json_payload: Dict[str, Any] = {
108
+ "messages": self.messages,
109
+ "project_id": self.lakera_project_id,
110
+ "metadata": metadata,
111
+ }
112
+
113
+ if self.payload:
114
+ json_payload["payload"] = self.payload
115
+ if self.breakdown:
116
+ json_payload["breakdown"] = self.breakdown
117
+
118
+ return json_payload
119
+
120
+ def __hash__(self) -> int:
121
+ """Custom hash implementation that handles the messages list."""
122
+ # Convert messages list to a tuple for consistent hashing
123
+ if self.messages:
124
+ messages_tuple = tuple(tuple(msg.items()) for msg in self.messages)
125
+ else:
126
+ messages_tuple = ()
127
+
128
+ hash_tuple = (
129
+ self.hello_rasa_user_id,
130
+ self.hello_rasa_project_id,
131
+ self.lakera_project_id,
132
+ self.payload,
133
+ self.breakdown,
134
+ messages_tuple,
135
+ tuple(sorted(self.metadata.items())) if self.metadata else (),
136
+ )
137
+ return hash(hash_tuple)
138
+
139
+
140
+ class GuardrailDetection(BaseModel):
141
+ """Represents a single guardrail detection."""
142
+
143
+ type: GuardrailType = Field(description="Type of guardrail detection.")
144
+ original_type: str = Field(description="Original detection from the provider.")
145
+ metadata: Optional[Dict[str, Any]] = Field(
146
+ default=None, description="Additional metadata about the detection itself."
147
+ )
148
+
149
+
150
+ class GuardrailResponse(BaseModel):
151
+ """Response from guardrails system."""
152
+
153
+ hello_rasa_user_id: Optional[str] = Field(
154
+ default=None,
155
+ description="Required. User identifier for the Hello Rasa project. ",
156
+ )
157
+ hello_rasa_project_id: Optional[str] = Field(
158
+ default=None,
159
+ description="Required. Project identifier for the Hello Rasa project. ",
160
+ )
161
+ flagged: bool = Field(description="Whether any policy violations were detected.")
162
+ detections: List[GuardrailDetection] = Field(
163
+ default_factory=list, description="List of detected policy violations."
164
+ )
165
+ processing_time_ms: Optional[float] = Field(
166
+ default=None, description="Processing time in milliseconds."
167
+ )
168
+ metadata: Optional[Dict[str, Any]] = Field(
169
+ default=None, description="Additional metadata from the provider."
170
+ )
171
+
172
+
173
+ class LakeraGuardrailResponse(GuardrailResponse):
174
+ """Response from Lakera AI `/guard` endpoint."""
175
+
176
+ @classmethod
177
+ def from_raw_response(
178
+ cls,
179
+ raw_response: Dict[str, Any],
180
+ hello_rasa_user_id: str,
181
+ hello_rasa_project_id: str,
182
+ ) -> "LakeraGuardrailResponse":
183
+ """Create a LakeraGuardrailResponse from a response."""
184
+ from rasa.builder.guardrails.utils import (
185
+ map_lakera_detector_type_to_guardrail_type,
186
+ )
187
+
188
+ # Get the basic information from the response and create the response object.
189
+ flagged = raw_response.get("flagged", False)
190
+ metadata = raw_response.get("metadata")
191
+ response = cls(
192
+ flagged=flagged,
193
+ metadata=metadata,
194
+ hello_rasa_user_id=hello_rasa_user_id,
195
+ hello_rasa_project_id=hello_rasa_project_id,
196
+ )
197
+
198
+ # If the response is not flagged, return the response object.
199
+ if not flagged:
200
+ return response
201
+
202
+ # If the response is flagged, parse the breakdown section.
203
+ breakdown = raw_response.get("breakdown", [])
204
+
205
+ # Parse the breakdown.
206
+ detections: List[GuardrailDetection] = []
207
+ for detector in breakdown:
208
+ if detector.get("detected", True):
209
+ detector_type = detector.get("detector_type")
210
+ rasa_detection_type = map_lakera_detector_type_to_guardrail_type(
211
+ detector_type,
212
+ )
213
+ if not rasa_detection_type:
214
+ continue
215
+ # Remove the detector type and the detected flag from the detector.
216
+ # And keep the rest as part of the metadata. In case of a Lakera this
217
+ # will include the message_id, project_id, policy_id, detector_id, etc.
218
+ metadata = copy.deepcopy(detector)
219
+ metadata.pop("detected")
220
+ metadata.pop("detector_type")
221
+
222
+ detections.append(
223
+ GuardrailDetection(
224
+ type=rasa_detection_type,
225
+ original_type=detector_type,
226
+ metadata=metadata,
227
+ )
228
+ )
229
+
230
+ # If there are detections, add them to the response.
231
+ if detections:
232
+ response.detections = detections
233
+
234
+ return response
235
+
236
+
237
+ class ScopeState(BaseModel):
238
+ blocked_until: Optional[float] = Field(
239
+ default=None,
240
+ description="UNIX timestamp in seconds until this scope is blocked.",
241
+ )
242
+ violations: List[float] = Field(
243
+ default_factory=list,
244
+ description="UNIX timestamps in seconds when violations occurred.",
245
+ )
246
+
247
+ def is_blocked(self, now: float) -> bool:
248
+ """Return whether the scope is currently blocked.
249
+
250
+ Args:
251
+ now: Current time as a UNIX timestamp.
252
+
253
+ Returns:
254
+ True if blocked_until is set and in the future, else False.
255
+ """
256
+ return self.blocked_until is not None and now < self.blocked_until
257
+
258
+
259
+ class ProjectState(BaseModel):
260
+ project: ScopeState = Field(default_factory=ScopeState)
261
+ users: Dict[str, ScopeState] = Field(default_factory=dict)
262
+
263
+
264
+ class BlockResult(BaseModel):
265
+ user_blocked_now: bool = False
266
+ project_blocked_now: bool = False