rasa-pro 3.13.11__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 (588) 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/direct_custom_actions_executor.py +9 -2
  305. rasa/core/actions/grpc_custom_action_executor.py +1 -1
  306. rasa/core/agent.py +22 -2
  307. rasa/core/available_agents.py +239 -0
  308. rasa/core/brokers/broker.py +1 -1
  309. rasa/core/brokers/kafka.py +56 -8
  310. rasa/core/channels/__init__.py +82 -35
  311. rasa/core/channels/channel.py +4 -3
  312. rasa/core/channels/constants.py +3 -0
  313. rasa/core/channels/development_inspector.py +29 -16
  314. rasa/core/channels/hangouts.py +2 -2
  315. rasa/core/channels/inspector/README.md +25 -13
  316. rasa/core/channels/inspector/dist/assets/{arc-0b11fe30.js → arc-6177260a.js} +1 -1
  317. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-9eef30a7.js → blockDiagram-38ab4fdb-b054f038.js} +1 -1
  318. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-03e94f28.js → c4Diagram-3d4e48cf-f25427d5.js} +1 -1
  319. rasa/core/channels/inspector/dist/assets/channel-bf9cbb34.js +1 -0
  320. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-95c09eba.js → classDiagram-70f12bd4-c7a2af53.js} +1 -1
  321. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-38e8446c.js → classDiagram-v2-f2320105-58db65c0.js} +1 -1
  322. rasa/core/channels/inspector/dist/assets/clone-8f9083bb.js +1 -0
  323. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-57dc3038.js → createText-2e5e7dd3-088372e2.js} +1 -1
  324. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-4bac0545.js → edges-e0da2a9e-58676240.js} +1 -1
  325. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-81795c90.js → erDiagram-9861fffd-0c14d7c6.js} +1 -1
  326. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-89489ae6.js → flowDb-956e92f1-ea63f85c.js} +1 -1
  327. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-cd152627.js → flowDiagram-66a62f08-a2af48cd.js} +1 -1
  328. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-9ecd5b59.js +1 -0
  329. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-3da369bc.js → flowchart-elk-definition-4a651766-6937abe7.js} +1 -1
  330. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-85ec16f8.js → ganttDiagram-c361ad54-7473f357.js} +1 -1
  331. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-495bc140.js → gitGraphDiagram-72cf32ee-d0c9405e.js} +1 -1
  332. rasa/core/channels/inspector/dist/assets/{graph-1ec4d266.js → graph-0a6f8466.js} +1 -1
  333. rasa/core/channels/inspector/dist/assets/{index-3862675e-0a0e97c9.js → index-3862675e-7610671a.js} +1 -1
  334. rasa/core/channels/inspector/dist/assets/index-74e01d94.js +1354 -0
  335. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-4d54bcde.js → infoDiagram-f8f76790-be397dc7.js} +1 -1
  336. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-dc097114.js → journeyDiagram-49397b02-4cefbf62.js} +1 -1
  337. rasa/core/channels/inspector/dist/assets/{layout-1a08981e.js → layout-e7fbc2bf.js} +1 -1
  338. rasa/core/channels/inspector/dist/assets/{line-95f7f1d3.js → line-a8aa457c.js} +1 -1
  339. rasa/core/channels/inspector/dist/assets/{linear-97e69543.js → linear-3351e0d2.js} +1 -1
  340. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-8c71ff03.js → mindmap-definition-fc14e90a-b8cbf605.js} +1 -1
  341. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-f14c71c7.js → pieDiagram-8a3498a8-f327f774.js} +1 -1
  342. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-f1d3c9ff.js → quadrantDiagram-120e2f19-2854c591.js} +1 -1
  343. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-bfa2412f.js → requirementDiagram-deff3bca-964985d5.js} +1 -1
  344. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-53f2c97b.js → sankeyDiagram-04a897e0-edeb4f33.js} +1 -1
  345. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-319d7c0e.js → sequenceDiagram-704730f1-fcf70125.js} +1 -1
  346. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-76a09418.js → stateDiagram-587899a1-0e770395.js} +1 -1
  347. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-a67f15d4.js → stateDiagram-v2-d93cdb3a-af8dcd22.js} +1 -1
  348. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-0654e7c3.js → styles-6aaf32cf-36a9e70d.js} +1 -1
  349. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-1394bb9d.js → styles-9a916d00-884a8b5b.js} +1 -1
  350. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-e4c5bdae.js → styles-c10674c1-dc097813.js} +1 -1
  351. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-50957104.js → svgDrawCommon-08f97a94-5a2c7eed.js} +1 -1
  352. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-b0885a6a.js → timeline-definition-85554ec2-e89c4f6e.js} +1 -1
  353. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-79e6541a.js → xychartDiagram-e933f94c-afb6fe56.js} +1 -1
  354. rasa/core/channels/inspector/dist/index.html +1 -1
  355. rasa/core/channels/inspector/package.json +18 -18
  356. rasa/core/channels/inspector/src/App.tsx +56 -12
  357. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +1 -1
  358. rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
  359. rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +4 -2
  360. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +20 -3
  361. rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +296 -0
  362. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +6 -2
  363. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +26 -4
  364. rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
  365. rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
  366. rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
  367. rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
  368. rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
  369. rasa/core/channels/inspector/src/types.ts +55 -1
  370. rasa/core/channels/inspector/yarn.lock +336 -189
  371. rasa/core/channels/socketio.py +212 -51
  372. rasa/core/channels/studio_chat.py +82 -32
  373. rasa/core/channels/telegram.py +4 -9
  374. rasa/core/channels/voice_ready/twilio_voice.py +1 -1
  375. rasa/core/channels/voice_stream/asr/asr_event.py +1 -1
  376. rasa/core/channels/voice_stream/asr/azure.py +6 -3
  377. rasa/core/channels/voice_stream/asr/deepgram.py +1 -1
  378. rasa/core/channels/voice_stream/audiocodes.py +11 -6
  379. rasa/core/channels/voice_stream/browser_audio.py +91 -4
  380. rasa/core/channels/voice_stream/call_state.py +13 -2
  381. rasa/core/channels/voice_stream/genesys.py +19 -15
  382. rasa/core/channels/voice_stream/jambonz.py +22 -12
  383. rasa/core/channels/voice_stream/tts/deepgram.py +140 -0
  384. rasa/core/channels/voice_stream/twilio_media_streams.py +35 -14
  385. rasa/core/channels/voice_stream/util.py +11 -1
  386. rasa/core/channels/voice_stream/voice_channel.py +170 -32
  387. rasa/core/concurrent_lock_store.py +83 -16
  388. rasa/core/config/__init__.py +0 -0
  389. rasa/core/{available_endpoints.py → config/available_endpoints.py} +56 -18
  390. rasa/core/config/configuration.py +295 -0
  391. rasa/core/config/credentials.py +19 -0
  392. rasa/core/config/message_procesing_config.py +34 -0
  393. rasa/core/constants.py +17 -0
  394. rasa/core/exceptions.py +1 -1
  395. rasa/core/featurizers/tracker_featurizers.py +3 -2
  396. rasa/core/iam_credentials_providers/__init__.py +0 -0
  397. rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +291 -0
  398. rasa/core/iam_credentials_providers/credentials_provider_protocol.py +91 -0
  399. rasa/core/lock_store.py +50 -10
  400. rasa/core/nlg/contextual_response_rephraser.py +5 -0
  401. rasa/core/nlg/generator.py +1 -1
  402. rasa/core/persistor.py +7 -7
  403. rasa/core/policies/enterprise_search_policy.py +9 -10
  404. rasa/core/policies/flow_policy.py +4 -4
  405. rasa/core/policies/flows/agent_executor.py +720 -0
  406. rasa/core/policies/flows/flow_exceptions.py +5 -2
  407. rasa/core/policies/flows/flow_executor.py +146 -77
  408. rasa/core/policies/flows/mcp_tool_executor.py +304 -0
  409. rasa/core/policies/intentless_policy.py +1 -1
  410. rasa/core/policies/rule_policy.py +1 -1
  411. rasa/core/policies/ted_policy.py +20 -12
  412. rasa/core/policies/unexpected_intent_policy.py +6 -0
  413. rasa/core/processor.py +100 -44
  414. rasa/core/redis_connection_factory.py +474 -0
  415. rasa/core/run.py +49 -10
  416. rasa/core/test.py +4 -0
  417. rasa/core/tracker_stores/redis_tracker_store.py +36 -14
  418. rasa/core/tracker_stores/sql_tracker_store.py +59 -1
  419. rasa/core/tracker_stores/tracker_store.py +3 -7
  420. rasa/core/train.py +1 -1
  421. rasa/core/training/interactive.py +20 -18
  422. rasa/core/training/story_conflict.py +5 -5
  423. rasa/core/utils.py +22 -23
  424. rasa/dialogue_understanding/commands/__init__.py +8 -0
  425. rasa/dialogue_understanding/commands/cancel_flow_command.py +20 -6
  426. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +21 -2
  427. rasa/dialogue_understanding/commands/clarify_command.py +20 -2
  428. rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
  429. rasa/dialogue_understanding/commands/knowledge_answer_command.py +21 -2
  430. rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
  431. rasa/dialogue_understanding/commands/start_flow_command.py +75 -7
  432. rasa/dialogue_understanding/commands/utils.py +135 -2
  433. rasa/dialogue_understanding/generator/command_parser.py +4 -0
  434. rasa/dialogue_understanding/generator/flow_retrieval.py +0 -9
  435. rasa/dialogue_understanding/generator/llm_based_command_generator.py +52 -12
  436. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  437. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  438. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +66 -0
  439. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +66 -0
  440. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +89 -0
  441. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +88 -0
  442. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +42 -7
  443. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +40 -3
  444. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +20 -3
  445. rasa/dialogue_understanding/patterns/cancel.py +27 -6
  446. rasa/dialogue_understanding/patterns/clarify.py +3 -14
  447. rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
  448. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +49 -9
  449. rasa/dialogue_understanding/processor/command_processor.py +136 -15
  450. rasa/dialogue_understanding/stack/dialogue_stack.py +98 -2
  451. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
  452. rasa/dialogue_understanding/stack/utils.py +57 -3
  453. rasa/dialogue_understanding/utils.py +24 -4
  454. rasa/dialogue_understanding_test/du_test_runner.py +8 -3
  455. rasa/e2e_test/e2e_test_runner.py +13 -3
  456. rasa/engine/caching.py +2 -2
  457. rasa/engine/constants.py +1 -1
  458. rasa/engine/graph.py +5 -1
  459. rasa/engine/loader.py +12 -0
  460. rasa/engine/recipes/default_components.py +138 -49
  461. rasa/engine/recipes/default_recipe.py +108 -11
  462. rasa/engine/runner/dask.py +8 -5
  463. rasa/engine/validation.py +25 -8
  464. rasa/graph_components/validators/default_recipe_validator.py +86 -28
  465. rasa/hooks.py +5 -5
  466. rasa/llm_fine_tuning/utils.py +2 -2
  467. rasa/model_manager/model_api.py +4 -5
  468. rasa/model_manager/runner_service.py +2 -2
  469. rasa/model_manager/socket_bridge.py +21 -17
  470. rasa/model_manager/trainer_service.py +12 -9
  471. rasa/model_manager/utils.py +1 -29
  472. rasa/model_manager/warm_rasa_process.py +13 -3
  473. rasa/model_training.py +60 -47
  474. rasa/nlu/classifiers/diet_classifier.py +198 -98
  475. rasa/nlu/classifiers/logistic_regression_classifier.py +1 -4
  476. rasa/nlu/classifiers/mitie_intent_classifier.py +3 -0
  477. rasa/nlu/classifiers/sklearn_intent_classifier.py +1 -3
  478. rasa/nlu/extractors/crf_entity_extractor.py +9 -10
  479. rasa/nlu/extractors/mitie_entity_extractor.py +3 -0
  480. rasa/nlu/extractors/spacy_entity_extractor.py +3 -0
  481. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +4 -0
  482. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +5 -0
  483. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +2 -0
  484. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +3 -0
  485. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +4 -2
  486. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -0
  487. rasa/nlu/selectors/response_selector.py +10 -2
  488. rasa/nlu/tokenizers/jieba_tokenizer.py +3 -4
  489. rasa/nlu/tokenizers/mitie_tokenizer.py +3 -2
  490. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -2
  491. rasa/nlu/utils/mitie_utils.py +3 -0
  492. rasa/nlu/utils/spacy_utils.py +3 -2
  493. rasa/plugin.py +8 -8
  494. rasa/privacy/privacy_config.py +1 -1
  495. rasa/privacy/privacy_manager.py +12 -3
  496. rasa/server.py +15 -3
  497. rasa/shared/agents/__init__.py +0 -0
  498. rasa/shared/agents/auth/__init__.py +0 -0
  499. rasa/shared/agents/auth/agent_auth_factory.py +105 -0
  500. rasa/shared/agents/auth/agent_auth_manager.py +92 -0
  501. rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
  502. rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
  503. rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
  504. rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
  505. rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +170 -0
  506. rasa/shared/agents/auth/constants.py +13 -0
  507. rasa/shared/agents/auth/types.py +12 -0
  508. rasa/shared/agents/auth/utils.py +85 -0
  509. rasa/shared/agents/utils.py +35 -0
  510. rasa/shared/constants.py +11 -0
  511. rasa/shared/core/constants.py +17 -1
  512. rasa/shared/core/domain.py +62 -22
  513. rasa/shared/core/events.py +329 -0
  514. rasa/shared/core/flows/constants.py +5 -0
  515. rasa/shared/core/flows/flow.py +1 -1
  516. rasa/shared/core/flows/flow_step.py +7 -1
  517. rasa/shared/core/flows/flows_list.py +21 -5
  518. rasa/shared/core/flows/flows_yaml_schema.json +119 -184
  519. rasa/shared/core/flows/steps/call.py +57 -6
  520. rasa/shared/core/flows/steps/collect.py +98 -13
  521. rasa/shared/core/flows/validation.py +372 -8
  522. rasa/shared/core/flows/yaml_flows_io.py +19 -10
  523. rasa/shared/core/slots.py +6 -2
  524. rasa/shared/core/trackers.py +5 -2
  525. rasa/shared/core/training_data/story_reader/story_reader.py +1 -1
  526. rasa/shared/exceptions.py +39 -2
  527. rasa/shared/importers/importer.py +6 -0
  528. rasa/shared/importers/rasa.py +1 -1
  529. rasa/shared/importers/utils.py +86 -4
  530. rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
  531. rasa/shared/providers/llm/_base_litellm_client.py +41 -9
  532. rasa/shared/providers/llm/litellm_router_llm_client.py +10 -6
  533. rasa/shared/providers/llm/llm_client.py +7 -3
  534. rasa/shared/providers/llm/llm_response.py +66 -0
  535. rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
  536. rasa/shared/utils/common.py +26 -1
  537. rasa/shared/utils/health_check/health_check.py +7 -3
  538. rasa/shared/utils/llm.py +92 -19
  539. rasa/shared/utils/mcp/__init__.py +0 -0
  540. rasa/shared/utils/mcp/server_connection.py +250 -0
  541. rasa/shared/utils/mcp/utils.py +20 -0
  542. rasa/shared/utils/schemas/events.py +42 -0
  543. rasa/shared/utils/yaml.py +3 -1
  544. rasa/studio/download.py +3 -0
  545. rasa/studio/prompts.py +1 -0
  546. rasa/studio/pull/pull.py +3 -2
  547. rasa/studio/train.py +8 -7
  548. rasa/studio/upload.py +19 -52
  549. rasa/telemetry.py +166 -28
  550. rasa/tracing/config.py +45 -12
  551. rasa/tracing/constants.py +14 -0
  552. rasa/tracing/instrumentation/attribute_extractors.py +142 -9
  553. rasa/tracing/instrumentation/instrumentation.py +626 -21
  554. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
  555. rasa/tracing/instrumentation/metrics.py +32 -0
  556. rasa/tracing/metric_instrument_provider.py +68 -0
  557. rasa/utils/common.py +92 -1
  558. rasa/utils/endpoints.py +11 -2
  559. rasa/utils/io.py +27 -9
  560. rasa/utils/json_utils.py +6 -1
  561. rasa/utils/licensing.py +21 -10
  562. rasa/utils/log_utils.py +121 -7
  563. rasa/utils/ml_utils.py +1 -1
  564. rasa/utils/openapi.py +144 -0
  565. rasa/utils/plotting.py +1 -1
  566. rasa/utils/pypred.py +45 -0
  567. rasa/utils/tensorflow/__init__.py +7 -0
  568. rasa/utils/tensorflow/callback.py +136 -101
  569. rasa/utils/tensorflow/crf.py +1 -1
  570. rasa/utils/tensorflow/data_generator.py +21 -8
  571. rasa/utils/tensorflow/layers.py +21 -11
  572. rasa/utils/tensorflow/metrics.py +7 -3
  573. rasa/utils/tensorflow/models.py +56 -8
  574. rasa/utils/tensorflow/rasa_layers.py +8 -6
  575. rasa/utils/tensorflow/transformer.py +2 -3
  576. rasa/utils/train_utils.py +54 -24
  577. rasa/validator.py +149 -16
  578. rasa/version.py +1 -1
  579. rasa_pro-3.14.0.dist-info/METADATA +212 -0
  580. {rasa_pro-3.13.11.dist-info → rasa_pro-3.14.0.dist-info}/RECORD +583 -271
  581. rasa/core/channels/inspector/dist/assets/channel-51d02e9e.js +0 -1
  582. rasa/core/channels/inspector/dist/assets/clone-cc738fa6.js +0 -1
  583. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-0c716443.js +0 -1
  584. rasa/core/channels/inspector/dist/assets/index-c804b295.js +0 -1335
  585. rasa_pro-3.13.11.dist-info/METADATA +0 -192
  586. {rasa_pro-3.13.11.dist-info → rasa_pro-3.14.0.dist-info}/NOTICE +0 -0
  587. {rasa_pro-3.13.11.dist-info → rasa_pro-3.14.0.dist-info}/WHEEL +0 -0
  588. {rasa_pro-3.13.11.dist-info → rasa_pro-3.14.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,690 @@
1
+ from abc import ABC, abstractmethod
2
+ from enum import Enum
3
+ from typing import Any, Dict, List, Literal, Optional, Type, TypeVar, Union
4
+
5
+ import structlog
6
+ from openai.types.chat.chat_completion_chunk import ChatCompletionChunk
7
+ from pydantic import (
8
+ BaseModel,
9
+ Field,
10
+ field_serializer,
11
+ field_validator,
12
+ model_validator,
13
+ )
14
+ from typing_extensions import Annotated
15
+
16
+ from rasa.builder.copilot.constants import (
17
+ ROLE_ASSISTANT,
18
+ ROLE_COPILOT,
19
+ ROLE_COPILOT_INTERNAL,
20
+ ROLE_SYSTEM,
21
+ ROLE_USER,
22
+ )
23
+ from rasa.builder.document_retrieval.models import Document
24
+ from rasa.builder.models import ServerSentEvent
25
+ from rasa.builder.shared.tracker_context import TrackerContext
26
+
27
+ structlogger = structlog.get_logger()
28
+
29
+
30
+ class ResponseCompleteness(Enum):
31
+ """Enum for response completeness levels."""
32
+
33
+ TOKEN = "token" # Streaming token/chunk
34
+ COMPLETE = "complete" # Complete response (e.g., templated responses)
35
+
36
+
37
+ class ResponseCategory(Enum):
38
+ """Enum for different categories of responses."""
39
+
40
+ # Copilot generated content
41
+ COPILOT = "copilot"
42
+ REFERENCE = "reference"
43
+ REFERENCE_ENTRY = "reference_entry"
44
+ # When Copilot detects a roleplay request / intent
45
+ ROLEPLAY_DETECTION = "roleplay_detection"
46
+ # When Copilot detects an out-of-scope request
47
+ OUT_OF_SCOPE_DETECTION = "out_of_scope_detection"
48
+ # When Copilot does not understand what caused the error
49
+ ERROR_FALLBACK = "error_fallback"
50
+ # When a policy violation is detected
51
+ GUARDRAILS_POLICY_VIOLATION = "guardrails_policy_violation"
52
+ # When Copilot access is blocked after repeated violations
53
+ GUARDRAILS_BLOCKED = "guardrails_blocked"
54
+ # When Copilot detects request for KB content
55
+ KNOWLEDGE_BASE_ACCESS_REQUESTED = "knowledge_base_access_requested"
56
+ # When Copilot analyzes error logs and provides suggestions
57
+ TRAINING_ERROR_LOG_ANALYSIS = "training_error_log_analysis"
58
+ E2E_TESTING_ERROR_LOG_ANALYSIS = "e2e_testing_error_log_analysis"
59
+ TRAINING_ERROR_LOG = "training_error_log"
60
+ E2E_TESTING_ERROR_LOG = "e2e_testing_error_log"
61
+ # Conversation history signature
62
+ SIGNATURE = "signature"
63
+
64
+
65
+ class BaseContent(BaseModel):
66
+ type: str
67
+
68
+
69
+ class LinkContent(BaseContent):
70
+ type: Literal["link"]
71
+ url: str
72
+ label: str
73
+
74
+
75
+ class ButtonContent(BaseContent):
76
+ type: Literal["button"]
77
+ payload: str
78
+ label: str
79
+
80
+
81
+ class TextContent(BaseContent):
82
+ type: Literal["text"]
83
+ text: str
84
+
85
+
86
+ class CodeContent(BaseContent):
87
+ type: Literal["code"]
88
+ text: str
89
+
90
+
91
+ class FileContent(BaseContent):
92
+ type: Literal["file"]
93
+ file_path: str
94
+ file_content: str
95
+
96
+
97
+ class LogContent(BaseContent):
98
+ type: Literal["log"]
99
+ content: str = Field(..., description="Logs, error messages, stack traces, etc.")
100
+ context: Optional[str] = Field(
101
+ default=None,
102
+ description=(
103
+ "Additional, optional context description for the logs "
104
+ "(e.g., 'training session', 'e2e testing run', 'deployment process')"
105
+ ),
106
+ )
107
+ metadata: Dict[str, Any] = Field(
108
+ default_factory=dict,
109
+ description="Additional metadata about the log.",
110
+ )
111
+
112
+
113
+ class EventContent(BaseContent):
114
+ type: Literal["event"]
115
+ event: str = Field(..., description="The event's type_name")
116
+
117
+ event_data: Dict[str, Any] = Field(
118
+ default_factory=dict, description="Contains event-specific data fields."
119
+ )
120
+
121
+ @model_validator(mode="before")
122
+ @classmethod
123
+ def _collect_event_data(cls, data: Dict[str, Any]) -> Dict[str, Any]:
124
+ generic = {"type", "event"}
125
+ data["event_data"] = {
126
+ key: data.pop(key) for key in list(data.keys()) if key not in generic
127
+ }
128
+ return data
129
+
130
+ class Config:
131
+ extra = "forbid"
132
+
133
+
134
+ ContentBlock = Annotated[
135
+ Union[
136
+ TextContent,
137
+ CodeContent,
138
+ FileContent,
139
+ LogContent,
140
+ EventContent,
141
+ LinkContent,
142
+ ButtonContent,
143
+ ],
144
+ Field(
145
+ discriminator="type",
146
+ description=(
147
+ "The content of the message. "
148
+ "The content is expected to be a list of content blocks. "
149
+ "The content blocks are expected to be one of the following types: "
150
+ "text, link, code, or file."
151
+ ),
152
+ ),
153
+ ]
154
+
155
+ TContentBlock = TypeVar("TContentBlock", bound=BaseContent)
156
+
157
+
158
+ class BaseCopilotChatMessage(BaseModel, ABC):
159
+ role: str
160
+ response_category: Optional[ResponseCategory] = Field(default=None)
161
+
162
+ @abstractmethod
163
+ def build_openai_message(self, *args, **kwargs) -> Dict[str, Any]: # type: ignore[no-untyped-def]
164
+ pass
165
+
166
+ @field_serializer("response_category", when_used="always")
167
+ def _serialize_response_category(
168
+ self, v: Optional[ResponseCategory]
169
+ ) -> Optional[str]:
170
+ """Serializing CopilotChatMessage, response_category should be a string."""
171
+ return None if v is None else v.value
172
+
173
+
174
+ class BaseContentBlockCopilotChatMessage(BaseCopilotChatMessage, ABC):
175
+ """Base class for messages that contain ContentBlock lists."""
176
+
177
+ content: List[ContentBlock]
178
+
179
+ def get_flattened_text_content(self) -> str:
180
+ """Get the text content from the message."""
181
+ return "\n".join(
182
+ content_block.text
183
+ for content_block in self.content
184
+ if isinstance(content_block, TextContent)
185
+ )
186
+
187
+ def get_flattened_log_content(self) -> str:
188
+ """Get the log content from the message."""
189
+ return "\n".join(
190
+ content_block.content
191
+ for content_block in self.content
192
+ if isinstance(content_block, LogContent)
193
+ )
194
+
195
+ def get_content_blocks_by_type(
196
+ self, content_type: Type[TContentBlock]
197
+ ) -> List[TContentBlock]:
198
+ """Get the content blocks from the message by type."""
199
+ return [
200
+ content_block
201
+ for content_block in self.content
202
+ if isinstance(content_block, content_type)
203
+ ]
204
+
205
+
206
+ class CopilotSystemMessage(BaseCopilotChatMessage):
207
+ role: Literal["system"] = Field(
208
+ default=ROLE_SYSTEM,
209
+ pattern=f"^{ROLE_SYSTEM}",
210
+ description="The system message that sets the system instructions for the LLM.",
211
+ )
212
+
213
+ def build_openai_message(self, prompt: str, *args, **kwargs) -> Dict[str, Any]: # type: ignore[no-untyped-def]
214
+ """Render the system message template and return OpenAI format."""
215
+ return {"role": ROLE_SYSTEM, "content": prompt}
216
+
217
+
218
+ class UserChatMessage(BaseContentBlockCopilotChatMessage):
219
+ role: Literal["user"] = Field(
220
+ default=ROLE_USER,
221
+ pattern=f"^{ROLE_USER}",
222
+ description="The user who sent the message.",
223
+ )
224
+
225
+ @classmethod
226
+ @field_validator("content")
227
+ def must_have_at_least_one_text(cls, v: List[ContentBlock]) -> List[ContentBlock]:
228
+ if not any(isinstance(content_block, TextContent) for content_block in v):
229
+ message = "User role messages must have at least one `TextContent` block."
230
+ structlogger.error(
231
+ "user_chat_message.missing_text_content",
232
+ event_info=message,
233
+ content=v,
234
+ )
235
+ raise ValueError(
236
+ "UserChatMessage must contain at least one TextContent block."
237
+ )
238
+ return v
239
+
240
+ @model_validator(mode="after")
241
+ def validate_response_category(self) -> "UserChatMessage":
242
+ """Validate value of response_category for user message.
243
+
244
+ For 'user' role messages, only None or GUARDRAILS_POLICY_VIOLATION are allowed.
245
+ """
246
+ allowed_response_categories = [ResponseCategory.GUARDRAILS_POLICY_VIOLATION]
247
+ if (
248
+ self.response_category is not None
249
+ and self.response_category not in allowed_response_categories
250
+ ):
251
+ message = (
252
+ f"User role messages can only have response_category of `None` or "
253
+ f"{', '.join(category.value for category in allowed_response_categories)}." # noqa: E501
254
+ f"Got `{self.response_category}`."
255
+ )
256
+ structlogger.error(
257
+ "user_chat_message.validate_response_category"
258
+ ".invalid_response_category",
259
+ event_info=message,
260
+ response_category=self.response_category,
261
+ allowed_response_categories=allowed_response_categories,
262
+ role=self.role,
263
+ )
264
+ raise ValueError(message)
265
+
266
+ return self
267
+
268
+ def build_openai_message( # type: ignore[no-untyped-def]
269
+ self, prompt: Optional[str] = None, *args, **kwargs
270
+ ) -> Dict[str, Any]:
271
+ # If a prompt is provided, add it to the message content as additional
272
+ # instructions
273
+ if prompt:
274
+ return {
275
+ "role": ROLE_USER,
276
+ "content": [
277
+ {"type": "text", "text": prompt},
278
+ {"type": "text", "text": self.get_flattened_text_content()},
279
+ ],
280
+ }
281
+ # Return simple text content (useful for showing the history)
282
+ else:
283
+ return {"role": ROLE_USER, "content": self.get_flattened_text_content()}
284
+
285
+
286
+ class CopilotChatMessage(BaseContentBlockCopilotChatMessage):
287
+ role: Literal["copilot"]
288
+
289
+ def build_openai_message(self, *args, **kwargs) -> Dict[str, Any]: # type: ignore[no-untyped-def]
290
+ # For now the Copilot responds only with the text content and all the content
291
+ # is formatted as a markdown.
292
+ return {"role": ROLE_ASSISTANT, "content": self.get_flattened_text_content()}
293
+
294
+
295
+ class InternalCopilotRequestChatMessage(BaseContentBlockCopilotChatMessage):
296
+ role: Literal["internal_copilot_request"]
297
+
298
+ @model_validator(mode="after")
299
+ def validate_response_category(self) -> "InternalCopilotRequestChatMessage":
300
+ """Validate value of response_category for internal copilot request message.
301
+
302
+ For 'internal_copilot_request' role messages, only `TRAINING_ERROR_LOG_ANALYSIS`
303
+ and `E2E_TESTING_ERROR_LOG_ANALYSIS` response categories are allowed.
304
+ """
305
+ allowed_response_categories = [
306
+ ResponseCategory.TRAINING_ERROR_LOG_ANALYSIS,
307
+ ResponseCategory.E2E_TESTING_ERROR_LOG_ANALYSIS,
308
+ ]
309
+ if self.response_category not in allowed_response_categories:
310
+ message = (
311
+ f"Copilot Internal Roles request messages can only have of "
312
+ f"{', '.join(category.value for category in allowed_response_categories)}. " # noqa: E501
313
+ f"Got `{self.response_category}`."
314
+ )
315
+ structlogger.error(
316
+ "internal_copilot_request_chat_message.validate_response_category"
317
+ ".invalid_response_category",
318
+ event_info=message,
319
+ response_category=self.response_category,
320
+ allowed_response_categories=allowed_response_categories,
321
+ role=self.role,
322
+ )
323
+ raise ValueError(message)
324
+
325
+ return self
326
+
327
+ def build_openai_message(self, prompt: str, *args, **kwargs) -> Dict[str, Any]: # type: ignore[no-untyped-def]
328
+ """Build OpenAI message with pre-rendered prompt.
329
+
330
+ The prompt should be rendered externally using the content from this message
331
+ (logs, files, any additional context outside of this message, etc.) before
332
+ being passed to this method.
333
+ """
334
+ return {"role": ROLE_USER, "content": prompt}
335
+
336
+
337
+ # Union type for all possible chat message types
338
+ ChatMessage = Union[
339
+ CopilotSystemMessage,
340
+ UserChatMessage,
341
+ CopilotChatMessage,
342
+ InternalCopilotRequestChatMessage,
343
+ ]
344
+
345
+
346
+ class CopilotContext(BaseModel):
347
+ """Model containing the context used by the copilot to generate a response."""
348
+
349
+ assistant_logs: str = Field(default="")
350
+ assistant_files: Dict[str, str] = Field(
351
+ default_factory=dict,
352
+ description=(
353
+ "The assistant files. Key is the file path, value is the file content."
354
+ ),
355
+ )
356
+ copilot_chat_history: List[ChatMessage] = Field(default_factory=list)
357
+ tracker_context: Optional[TrackerContext] = Field(default=None)
358
+
359
+ class Config:
360
+ """Config for LLMBuilderContext."""
361
+
362
+ arbitrary_types_allowed = True
363
+
364
+
365
+ class CopilotRequest(BaseModel):
366
+ """Request model for the copilot endpoint."""
367
+
368
+ copilot_chat_history: List[ChatMessage] = Field(
369
+ ...,
370
+ description=(
371
+ "The chat history between the user and the copilot. "
372
+ "Used to generate a new response based on the previous conversation."
373
+ ),
374
+ )
375
+ session_id: str = Field(
376
+ ...,
377
+ description=(
378
+ "The session ID of chat session with the assistant. "
379
+ "Used to fetch the conversation from the tracker."
380
+ ),
381
+ )
382
+ history_signature: Optional[str] = Field(
383
+ default=None,
384
+ description="HMAC signature (base64url) for the provided chat history.",
385
+ )
386
+ signature_version: Optional[str] = Field(
387
+ default=None,
388
+ description='Signature scheme version (e.g. "v1").',
389
+ )
390
+
391
+ @field_validator("copilot_chat_history", mode="before")
392
+ @classmethod
393
+ def parse_chat_history(cls, v: List[Dict[str, Any]]) -> List[ChatMessage]:
394
+ """Manually parse chat history messages based on role field."""
395
+ parsed_messages: List[ChatMessage] = []
396
+ available_roles = [ROLE_USER, ROLE_COPILOT, ROLE_COPILOT_INTERNAL]
397
+ for message_data in v:
398
+ role = message_data.get("role")
399
+
400
+ if role == ROLE_USER:
401
+ parsed_messages.append(UserChatMessage(**message_data))
402
+
403
+ elif role == ROLE_COPILOT:
404
+ parsed_messages.append(CopilotChatMessage(**message_data))
405
+
406
+ elif role == ROLE_COPILOT_INTERNAL:
407
+ parsed_messages.append(
408
+ InternalCopilotRequestChatMessage(**message_data)
409
+ )
410
+
411
+ else:
412
+ message = (
413
+ f"Unknown role '{role}' in chat message. "
414
+ f"Available roles are: {', '.join(available_roles)}."
415
+ )
416
+ structlogger.error(
417
+ "copilot_request.parse_chat_history.unknown_role",
418
+ event_info=message,
419
+ role=role,
420
+ available_roles=available_roles,
421
+ )
422
+ raise ValueError(message)
423
+
424
+ return parsed_messages
425
+
426
+ @property
427
+ def last_message(self) -> Optional[ChatMessage]:
428
+ """Get the last message from the copilot chat history."""
429
+ if not self.copilot_chat_history:
430
+ return None
431
+ return self.copilot_chat_history[-1]
432
+
433
+
434
+ class CopilotOutput(BaseModel, ABC):
435
+ """Base class for response events."""
436
+
437
+ response_completeness: ResponseCompleteness = Field(
438
+ description=(
439
+ "Indicates whether this is a streaming token (TOKEN) or a complete "
440
+ "response (COMPLETE)"
441
+ ),
442
+ )
443
+ response_category: ResponseCategory = Field(
444
+ description=(
445
+ "The category/source of this response. Each response type has a fixed "
446
+ "category that cannot be changed. "
447
+ ),
448
+ frozen=True,
449
+ )
450
+
451
+ @abstractmethod
452
+ def to_sse_event(self) -> ServerSentEvent:
453
+ """Convert to SSE event format."""
454
+ pass
455
+
456
+ @property
457
+ @abstractmethod
458
+ def sse_data(self) -> Dict[str, Any]:
459
+ """Extract the SSE data payload."""
460
+ pass
461
+
462
+
463
+ class GeneratedContent(CopilotOutput):
464
+ """Represents generated content from the LLM to be streamed."""
465
+
466
+ content: str
467
+ response_category: ResponseCategory = Field(frozen=True)
468
+ response_completeness: ResponseCompleteness = ResponseCompleteness.TOKEN
469
+
470
+ def to_sse_event(self) -> ServerSentEvent:
471
+ """Convert to SSE event format."""
472
+ return ServerSentEvent(
473
+ event="copilot_response",
474
+ data=self.sse_data,
475
+ )
476
+
477
+ @property
478
+ def sse_data(self) -> Dict[str, Any]:
479
+ """Extract the SSE data payload."""
480
+ return {
481
+ "content": self.content,
482
+ "response_category": self.response_category.value,
483
+ "completeness": self.response_completeness.value,
484
+ }
485
+
486
+
487
+ class ReferenceEntry(CopilotOutput):
488
+ """Represents a reference entry with title and url."""
489
+
490
+ index: int
491
+ title: str
492
+ url: str
493
+ response_category: ResponseCategory = Field(
494
+ default=ResponseCategory.REFERENCE_ENTRY,
495
+ frozen=True,
496
+ )
497
+ response_completeness: ResponseCompleteness = ResponseCompleteness.COMPLETE
498
+
499
+ @model_validator(mode="after")
500
+ def validate_response_category(self) -> "ReferenceEntry":
501
+ """Validate that response_category has the correct default value."""
502
+ if self.response_category != ResponseCategory.REFERENCE_ENTRY:
503
+ raise ValueError(
504
+ f"ReferenceEntry response_category must be "
505
+ f"{ResponseCategory.REFERENCE_ENTRY}, got `{self.response_category}`."
506
+ )
507
+ return self
508
+
509
+ def to_sse_event(self) -> ServerSentEvent:
510
+ """Convert to SSE event format."""
511
+ return ServerSentEvent(
512
+ event="copilot_response",
513
+ data=self.sse_data,
514
+ )
515
+
516
+ @property
517
+ def sse_data(self) -> Dict[str, Any]:
518
+ """Extract the SSE data payload."""
519
+ return {
520
+ "index": self.index,
521
+ "title": self.title,
522
+ "url": self.url,
523
+ "response_category": self.response_category.value,
524
+ "completeness": self.response_completeness.value,
525
+ }
526
+
527
+
528
+ class ReferenceSection(CopilotOutput):
529
+ """Represents a reference section with documentation links."""
530
+
531
+ references: list[ReferenceEntry]
532
+ response_category: ResponseCategory = Field(
533
+ default=ResponseCategory.REFERENCE,
534
+ frozen=True,
535
+ )
536
+ response_completeness: ResponseCompleteness = ResponseCompleteness.COMPLETE
537
+
538
+ @model_validator(mode="after")
539
+ def validate_response_category(self) -> "ReferenceSection":
540
+ """Validate that response_category has the correct default value."""
541
+ if self.response_category != ResponseCategory.REFERENCE:
542
+ raise ValueError(
543
+ f"ReferenceSection response_category must be "
544
+ f"{ResponseCategory.REFERENCE}, got `{self.response_category}`."
545
+ )
546
+ return self
547
+
548
+ def to_sse_event(self) -> ServerSentEvent:
549
+ """Convert to SSE event format."""
550
+ return ServerSentEvent(
551
+ event="copilot_response",
552
+ data=self.sse_data,
553
+ )
554
+
555
+ @property
556
+ def sse_data(self) -> Dict[str, Any]:
557
+ """Extract the SSE data payload."""
558
+ return {
559
+ "references": [
560
+ reference.model_dump(include={"index", "title", "url"})
561
+ for reference in self.references
562
+ ],
563
+ "response_category": self.response_category.value,
564
+ "completeness": self.response_completeness.value,
565
+ }
566
+
567
+ def sort_references(self) -> None:
568
+ """Sort references by index value."""
569
+ sorted_references = sorted(
570
+ self.references, key=lambda reference: (0, int(reference.index))
571
+ )
572
+
573
+ self.references = sorted_references
574
+
575
+
576
+ class TrainingErrorLog(CopilotOutput):
577
+ """Represents an error log."""
578
+
579
+ logs: List[LogContent]
580
+ response_category: ResponseCategory = Field(
581
+ default=ResponseCategory.TRAINING_ERROR_LOG,
582
+ frozen=True,
583
+ )
584
+ response_completeness: ResponseCompleteness = ResponseCompleteness.COMPLETE
585
+
586
+ @model_validator(mode="after")
587
+ def validate_response_category(self) -> "TrainingErrorLog":
588
+ """Validate that response_category has the correct default value."""
589
+ if self.response_category != ResponseCategory.TRAINING_ERROR_LOG:
590
+ raise ValueError(
591
+ f"TrainingErrorLog response_category must be "
592
+ f"{ResponseCategory.TRAINING_ERROR_LOG}, "
593
+ f"got `{self.response_category}`."
594
+ )
595
+ return self
596
+
597
+ def to_sse_event(self) -> ServerSentEvent:
598
+ """Convert to SSE event format."""
599
+ return ServerSentEvent(
600
+ event="copilot_response",
601
+ data=self.sse_data,
602
+ )
603
+
604
+ @property
605
+ def sse_data(self) -> Dict[str, Any]:
606
+ """Extract the SSE data payload."""
607
+ return {
608
+ "logs": [log.model_dump() for log in self.logs],
609
+ "response_category": self.response_category.value,
610
+ "completeness": self.response_completeness.value,
611
+ }
612
+
613
+
614
+ class UsageStatistics(BaseModel):
615
+ prompt_tokens: Optional[int] = None
616
+ completion_tokens: Optional[int] = None
617
+ total_tokens: Optional[int] = None
618
+ model: Optional[str] = None
619
+
620
+ def reset(self) -> None:
621
+ """Reset usage statistics to their default values."""
622
+ self.prompt_tokens = None
623
+ self.completion_tokens = None
624
+ self.total_tokens = None
625
+ self.model = None
626
+
627
+ def update_from_stream_chunk(self, chunk: ChatCompletionChunk) -> None:
628
+ """Update usage statistics from an OpenAI stream chunk.
629
+
630
+ Args:
631
+ chunk: The OpenAI stream chunk containing usage statistics.
632
+ """
633
+ if not (usage := getattr(chunk, "usage", None)):
634
+ return
635
+
636
+ self.prompt_tokens = usage.prompt_tokens
637
+ self.completion_tokens = usage.completion_tokens
638
+ self.total_tokens = usage.total_tokens
639
+ self.model = getattr(chunk, "model", None)
640
+
641
+
642
+ class SigningContext(BaseModel):
643
+ secret: Optional[str] = Field(None)
644
+ default_version: str = Field("v1", description="Default signature version")
645
+
646
+ @property
647
+ def available(self) -> bool:
648
+ """Signing is enabled if a non-empty secret is present."""
649
+ secret = (self.secret or "").strip()
650
+ return bool(secret)
651
+
652
+
653
+ class CopilotGenerationContext(BaseModel):
654
+ """Container for copilot generation context and supporting evidence.
655
+
656
+ This class organizes the context and supporting evidence information used by the
657
+ copilot's generate_response method, providing a cleaner interface than returning
658
+ a tuple for the non-streaming data.
659
+ """
660
+
661
+ relevant_documents: List["Document"] = Field(
662
+ ...,
663
+ description=(
664
+ "The relevant documents used as supporting evidence for the respons."
665
+ ),
666
+ )
667
+ system_message: Dict[str, Any] = Field(
668
+ ..., description="The system message with instructions."
669
+ )
670
+ chat_history: List[Dict[str, Any]] = Field(
671
+ ...,
672
+ description=(
673
+ "The chat history messages (excluding the last message) used as a context."
674
+ ),
675
+ )
676
+ last_user_message: Optional[Dict[str, Any]] = Field(
677
+ None, description="The last user message with context that was processed."
678
+ )
679
+ tracker_event_attachments: List[EventContent] = Field(
680
+ ...,
681
+ description=(
682
+ "The tracker event attachments passed with the user message used as "
683
+ "an additional context."
684
+ ),
685
+ )
686
+
687
+ class Config:
688
+ """Config for CopilotGenerationContext."""
689
+
690
+ arbitrary_types_allowed = True
File without changes