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,87 @@
1
+ import asyncio
2
+ import time
3
+ import uuid
4
+ from typing import AsyncGenerator, ClassVar, Dict, List, Optional
5
+
6
+ from pydantic import BaseModel, Field, PrivateAttr
7
+
8
+ from rasa.builder.models import JobStatusEvent, ServerSentEventType
9
+
10
+
11
+ class JobInfo(BaseModel):
12
+ """Information about a job being processed by the worker."""
13
+
14
+ id: str
15
+ status: str = ""
16
+ error: Optional[str] = None
17
+ created_at: float = Field(default_factory=time.time)
18
+
19
+ _history: List[JobStatusEvent] = PrivateAttr(default_factory=list)
20
+ _queue: asyncio.Queue = PrivateAttr(default_factory=asyncio.Queue)
21
+
22
+ class Config:
23
+ arbitrary_types_allowed = True
24
+
25
+ async def put(self, event: JobStatusEvent) -> None:
26
+ """Put an event onto the job's queue.
27
+
28
+ Args:
29
+ event: The JobStatusEvent to put onto the queue.
30
+ """
31
+ await self._queue.put(event)
32
+
33
+ async def event_stream(self) -> AsyncGenerator[JobStatusEvent, None]:
34
+ """Yield events as they are put on the queue by the worker task.
35
+
36
+ Returns:
37
+ An async generator that yields JobStatusEvent objects.
38
+ """
39
+ # 1) Replay history and stop if EOF recorded
40
+ for sse in self._history:
41
+ if (
42
+ isinstance(sse, JobStatusEvent)
43
+ and sse.event == ServerSentEventType._EOF.value
44
+ ):
45
+ return
46
+ yield sse
47
+
48
+ # 2) Stream live events and stop on EOF
49
+ while True:
50
+ sse = await self._queue.get()
51
+ self._history.append(sse)
52
+ if (
53
+ isinstance(sse, JobStatusEvent)
54
+ and sse.event == ServerSentEventType._EOF.value
55
+ ):
56
+ return
57
+ yield sse
58
+
59
+
60
+ class JobManager:
61
+ """Very small in-memory job registry (single-process only)."""
62
+
63
+ _jobs: ClassVar[Dict[str, JobInfo]] = {}
64
+
65
+ def create_job(self) -> JobInfo:
66
+ job_id = uuid.uuid4().hex
67
+ job = JobInfo(id=job_id)
68
+ self._jobs[job_id] = job
69
+ return job
70
+
71
+ def get_job(self, job_id: str) -> Optional[JobInfo]:
72
+ return self._jobs.get(job_id)
73
+
74
+ @staticmethod
75
+ def mark_done(job: JobInfo, *, error: Optional[str] = None) -> None:
76
+ """Mark a job as done.
77
+
78
+ Args:
79
+ job: The JobInfo instance to mark as done.
80
+ error: Optional error message if the job failed.
81
+ """
82
+ job.error = error
83
+ eof = JobStatusEvent.eof()
84
+ job._queue.put_nowait(eof)
85
+
86
+
87
+ job_manager = JobManager()
rasa/builder/jobs.py ADDED
@@ -0,0 +1,609 @@
1
+ from typing import Any, Dict, Optional
2
+
3
+ import structlog
4
+ from sanic import Sanic
5
+
6
+ from rasa.builder import config
7
+ from rasa.builder.copilot.constants import (
8
+ PROMPT_TO_BOT_KEY,
9
+ )
10
+ from rasa.builder.copilot.copilot_templated_message_provider import (
11
+ load_copilot_handler_default_responses,
12
+ load_copilot_welcome_messages,
13
+ )
14
+ from rasa.builder.copilot.models import (
15
+ CopilotContext,
16
+ FileContent,
17
+ InternalCopilotRequestChatMessage,
18
+ LogContent,
19
+ ResponseCategory,
20
+ TrainingErrorLog,
21
+ )
22
+ from rasa.builder.exceptions import (
23
+ LLMGenerationError,
24
+ ProjectGenerationError,
25
+ TrainingError,
26
+ ValidationError,
27
+ )
28
+ from rasa.builder.job_manager import JobInfo, job_manager
29
+ from rasa.builder.llm_service import llm_service
30
+ from rasa.builder.models import (
31
+ JobStatus,
32
+ JobStatusEvent,
33
+ )
34
+ from rasa.builder.project_generator import ProjectGenerator
35
+ from rasa.builder.training_service import (
36
+ train_and_load_agent,
37
+ try_load_existing_agent,
38
+ update_agent,
39
+ )
40
+ from rasa.builder.validation_service import validate_project
41
+ from rasa.cli.scaffold import ProjectTemplateName
42
+
43
+ structlogger = structlog.get_logger()
44
+
45
+
46
+ async def push_job_status_event(
47
+ job: JobInfo,
48
+ status: JobStatus,
49
+ message: Optional[str] = None,
50
+ payload: Optional[Dict[str, Any]] = None,
51
+ ) -> None:
52
+ event = JobStatusEvent.from_status(
53
+ status=status.value, message=message, payload=payload
54
+ )
55
+ job.status = status.value
56
+ await job.put(event)
57
+
58
+
59
+ async def run_prompt_to_bot_job(
60
+ app: Any,
61
+ job: JobInfo,
62
+ prompt: str,
63
+ ) -> None:
64
+ """Run the prompt-to-bot job in the background.
65
+
66
+ Args:
67
+ app: The Sanic application instance.
68
+ job: The job information instance.
69
+ prompt: The natural language prompt for bot generation.
70
+ """
71
+ project_generator: ProjectGenerator = app.ctx.project_generator
72
+
73
+ await push_job_status_event(job, JobStatus.received)
74
+
75
+ try:
76
+ # 1. Generating
77
+ await push_job_status_event(job, JobStatus.generating)
78
+ bot_files = await project_generator.generate_project_with_retries(
79
+ prompt,
80
+ template=ProjectTemplateName.BASIC,
81
+ )
82
+ await push_job_status_event(job, JobStatus.generation_success)
83
+
84
+ # 2. Training
85
+ await push_job_status_event(job, JobStatus.training)
86
+ agent = await train_and_load_agent(project_generator.get_training_input())
87
+ update_agent(agent, app)
88
+ await push_job_status_event(job, JobStatus.train_success)
89
+
90
+ # 3. Create copilot welcome message job
91
+ copilot_welcome_job = job_manager.create_job()
92
+ app.add_task(run_copilot_welcome_message_job(app, copilot_welcome_job))
93
+
94
+ structlogger.info(
95
+ "bot_builder_service.prompt_to_bot.success",
96
+ files_generated=list(bot_files.keys()),
97
+ copilot_welcome_job_id=copilot_welcome_job.id,
98
+ )
99
+ await push_job_status_event(
100
+ job=job,
101
+ status=JobStatus.done,
102
+ payload={"copilot_welcome_job_id": copilot_welcome_job.id},
103
+ )
104
+ job_manager.mark_done(job)
105
+
106
+ except TrainingError as exc:
107
+ structlogger.debug(
108
+ "prompt_to_bot_job.training_error", job_id=job.id, error=str(exc)
109
+ )
110
+ await push_job_status_event(job, JobStatus.train_error, message=str(exc))
111
+ job_manager.mark_done(job, error=str(exc))
112
+
113
+ except ValidationError as exc:
114
+ # Log levels to include in the error message
115
+ log_levels = ["error"]
116
+ if config.VALIDATION_FAIL_ON_WARNINGS:
117
+ log_levels.append("warning")
118
+
119
+ structlogger.debug(
120
+ "prompt_to_bot_job.validation_error",
121
+ job_id=job.id,
122
+ error=str(exc),
123
+ all_validation_logs=exc.validation_logs,
124
+ included_log_levels=log_levels,
125
+ )
126
+
127
+ error_message = exc.get_error_message_with_logs(log_levels=log_levels)
128
+ await push_job_status_event(
129
+ job, JobStatus.validation_error, message=error_message
130
+ )
131
+ job_manager.mark_done(job, error=error_message)
132
+
133
+ except (ProjectGenerationError, LLMGenerationError) as exc:
134
+ structlogger.debug(
135
+ "prompt_to_bot_job.generation_error", job_id=job.id, error=str(exc)
136
+ )
137
+ await push_job_status_event(job, JobStatus.generation_error, message=str(exc))
138
+ job_manager.mark_done(job, error=str(exc))
139
+
140
+ except Exception as exc:
141
+ # Capture full traceback
142
+ structlogger.exception(
143
+ "prompt_to_bot_job.unexpected_error", job_id=job.id, error=str(exc)
144
+ )
145
+ await push_job_status_event(job, JobStatus.error, message=str(exc))
146
+ job_manager.mark_done(job, error=str(exc))
147
+
148
+
149
+ async def run_template_to_bot_job(
150
+ app: "Sanic",
151
+ job: JobInfo,
152
+ template_name: ProjectTemplateName,
153
+ ) -> None:
154
+ """Run the template-to-bot job in the background.
155
+
156
+ Args:
157
+ app: The Sanic application instance.
158
+ job: The job information instance.
159
+ template_name: The name of the template to use for bot generation.
160
+ """
161
+ project_generator: ProjectGenerator = app.ctx.project_generator
162
+
163
+ await push_job_status_event(job, JobStatus.received)
164
+
165
+ try:
166
+ # 1) Generating
167
+ await push_job_status_event(job, JobStatus.generating)
168
+ await project_generator.init_from_template(template_name)
169
+ bot_files = project_generator.get_bot_files()
170
+ await push_job_status_event(job, JobStatus.generation_success)
171
+
172
+ # 2) Training
173
+ await push_job_status_event(job, JobStatus.training)
174
+ agent = await try_load_existing_agent(project_generator.project_folder)
175
+ if agent is None:
176
+ agent = await train_and_load_agent(project_generator.get_training_input())
177
+ else:
178
+ structlogger.info(
179
+ "bot_builder_service.template_to_bot.agent_loaded_from_cache",
180
+ )
181
+ update_agent(agent, app)
182
+ await push_job_status_event(job, JobStatus.train_success)
183
+
184
+ # 3) Create copilot welcome message job
185
+ copilot_welcome_job = job_manager.create_job()
186
+ app.add_task(
187
+ run_copilot_welcome_message_job(app, copilot_welcome_job, template_name)
188
+ )
189
+
190
+ # 4) Done - include welcome job ID in payload
191
+ structlogger.info(
192
+ "bot_builder_service.template_to_bot.success",
193
+ files_generated=list(bot_files.keys()),
194
+ copilot_welcome_job_id=copilot_welcome_job.id,
195
+ )
196
+ await push_job_status_event(
197
+ job=job,
198
+ status=JobStatus.done,
199
+ payload={"copilot_welcome_job_id": copilot_welcome_job.id},
200
+ )
201
+ job_manager.mark_done(job)
202
+
203
+ except TrainingError as exc:
204
+ structlogger.debug(
205
+ "template_to_bot_job.training_error",
206
+ job_id=job.id,
207
+ error=str(exc),
208
+ )
209
+ await push_job_status_event(job, JobStatus.train_error, message=str(exc))
210
+ job_manager.mark_done(job, error=str(exc))
211
+
212
+ except ValidationError as exc:
213
+ # Log levels to include in the error message
214
+ log_levels = ["error"]
215
+ if config.VALIDATION_FAIL_ON_WARNINGS:
216
+ log_levels.append("warning")
217
+
218
+ structlogger.debug(
219
+ "template_to_bot_job.validation_error",
220
+ job_id=job.id,
221
+ error=str(exc),
222
+ all_validation_logs=exc.validation_logs,
223
+ included_log_levels=log_levels,
224
+ )
225
+ error_message = exc.get_error_message_with_logs(log_levels=log_levels)
226
+ await push_job_status_event(
227
+ job, JobStatus.validation_error, message=error_message
228
+ )
229
+ job_manager.mark_done(job, error=error_message)
230
+
231
+ except ProjectGenerationError as exc:
232
+ structlogger.debug(
233
+ "template_to_bot_job.generation_error",
234
+ job_id=job.id,
235
+ error=str(exc),
236
+ )
237
+ await push_job_status_event(job, JobStatus.generation_error, message=str(exc))
238
+ job_manager.mark_done(job, error=str(exc))
239
+
240
+ except Exception as exc:
241
+ # Capture full traceback
242
+ structlogger.exception(
243
+ "template_to_bot_job.unexpected_error",
244
+ job_id=job.id,
245
+ error=str(exc),
246
+ )
247
+ await push_job_status_event(job, JobStatus.error, message=str(exc))
248
+ job_manager.mark_done(job, error=str(exc))
249
+
250
+
251
+ async def run_replace_all_files_job(
252
+ app: "Sanic",
253
+ job: JobInfo,
254
+ bot_files: Dict[str, Any],
255
+ ) -> None:
256
+ """Run the replace-all-files job in the background.
257
+
258
+ This replaces all bot files with the provided files and deletes any files
259
+ not included in the request (excluding .rasa/ and models/ directories).
260
+
261
+ Args:
262
+ app: The Sanic application instance.
263
+ job: The job information instance.
264
+ bot_files: Dictionary of file names to content for replacement.
265
+ """
266
+ project_generator = app.ctx.project_generator
267
+ await push_job_status_event(job, JobStatus.received)
268
+
269
+ try:
270
+ project_generator.replace_all_bot_files(bot_files)
271
+
272
+ # Validating
273
+ await push_job_status_event(job, JobStatus.validating)
274
+ training_input = project_generator.get_training_input()
275
+ validation_error = await validate_project(training_input.importer)
276
+ if validation_error:
277
+ raise ValidationError(validation_error)
278
+ await push_job_status_event(job, JobStatus.validation_success)
279
+
280
+ # Training
281
+ await push_job_status_event(job, JobStatus.training)
282
+ agent = await train_and_load_agent(training_input)
283
+ update_agent(agent, app)
284
+ await push_job_status_event(job, JobStatus.train_success)
285
+
286
+ # Send final done event with copilot training success response job ID
287
+ copilot_training_success_job = job_manager.create_job()
288
+ app.add_task(
289
+ run_copilot_training_success_job(app, copilot_training_success_job)
290
+ )
291
+
292
+ await push_job_status_event(
293
+ job=job,
294
+ status=JobStatus.done,
295
+ payload={
296
+ "copilot_training_success_job_id": copilot_training_success_job.id
297
+ },
298
+ )
299
+ job_manager.mark_done(job)
300
+
301
+ except ValidationError as exc:
302
+ log_levels = ["error"]
303
+ if config.VALIDATION_FAIL_ON_WARNINGS:
304
+ log_levels.append("warning")
305
+ structlogger.debug(
306
+ "replace_all_files_job.validation_error",
307
+ job_id=job.id,
308
+ error=str(exc),
309
+ validation_logs=exc.validation_logs,
310
+ included_log_levels=log_levels,
311
+ )
312
+ error_message = exc.get_error_message_with_logs(log_levels=log_levels)
313
+ # Push error event and start copilot analysis job
314
+ await push_error_and_start_copilot_analysis(
315
+ app,
316
+ job,
317
+ JobStatus.validation_error,
318
+ error_message,
319
+ bot_files,
320
+ )
321
+
322
+ # After error mark job as done
323
+ job_manager.mark_done(job, error=error_message)
324
+
325
+ except TrainingError as exc:
326
+ error_message = str(exc)
327
+ structlogger.debug(
328
+ "replace_all_files_job.train_error",
329
+ job_id=job.id,
330
+ error=error_message,
331
+ )
332
+ # Push error event and start copilot analysis job
333
+ await push_error_and_start_copilot_analysis(
334
+ app,
335
+ job,
336
+ JobStatus.train_error,
337
+ error_message,
338
+ bot_files,
339
+ )
340
+
341
+ # After error mark job as done
342
+ job_manager.mark_done(job, error=error_message)
343
+
344
+ except Exception as exc:
345
+ # Capture full traceback for anything truly unexpected
346
+ error_message = str(exc)
347
+ structlogger.exception(
348
+ "replace_all_files_job.unexpected_error",
349
+ job_id=job.id,
350
+ error=error_message,
351
+ )
352
+
353
+ # Push error event and start copilot analysis job
354
+ await push_error_and_start_copilot_analysis(
355
+ app,
356
+ job,
357
+ JobStatus.error,
358
+ error_message,
359
+ bot_files,
360
+ )
361
+
362
+ # After error mark job as done
363
+ job_manager.mark_done(job, error=str(exc))
364
+
365
+
366
+ async def push_error_and_start_copilot_analysis(
367
+ app: "Sanic",
368
+ original_job: JobInfo,
369
+ original_job_status: JobStatus,
370
+ error_message: str,
371
+ bot_files: Dict[str, Any],
372
+ ) -> None:
373
+ """Start a copilot analysis job and notify the client.
374
+
375
+ Creates a copilot analysis job and sends the new job ID to the client. The new
376
+ job runs in the background.
377
+
378
+ Args:
379
+ app: The Sanic application instance
380
+ original_job: The original job that failed
381
+ original_job_status: The status of the job that failed
382
+ error_message: The error message to analyze
383
+ bot_files: The bot files to include in analysis
384
+ """
385
+ # Create a copilot analysis job. Send the new job ID to the client and
386
+ # run the Copilot Analysis job in the background.
387
+ message = "Failed to train the assistant. Starting copilot analysis."
388
+
389
+ copilot_job = job_manager.create_job()
390
+ # Push the error status event for the original job
391
+ await push_job_status_event(
392
+ original_job,
393
+ original_job_status,
394
+ message=message,
395
+ payload={"copilot_job_id": copilot_job.id},
396
+ )
397
+ # Run the copilot analysis job in the background
398
+ app.add_task(
399
+ run_copilot_training_error_analysis_job(
400
+ app, copilot_job, error_message, bot_files
401
+ )
402
+ )
403
+ structlogger.debug(
404
+ f"update_files_job.{original_job_status.value}.copilot_analysis_start",
405
+ event_info=message,
406
+ job_id=original_job.id,
407
+ error=error_message,
408
+ copilot_job_id=copilot_job.id,
409
+ )
410
+
411
+
412
+ async def run_copilot_training_error_analysis_job(
413
+ app: "Sanic",
414
+ job: JobInfo,
415
+ training_error_message: str,
416
+ bot_files: Dict[str, Any],
417
+ ) -> None:
418
+ """Run copilot training error analysis job."""
419
+ await push_job_status_event(job, JobStatus.received)
420
+
421
+ try:
422
+ # Create message content blocks with log content and available files
423
+ log_content_block = LogContent(
424
+ type="log", content=training_error_message, context="training_error"
425
+ )
426
+ file_content_blocks = [
427
+ FileContent(type="file", file_path=file_path, file_content=file_content)
428
+ for file_path, file_content in bot_files.items()
429
+ ]
430
+ context = CopilotContext(
431
+ tracker_context=None, # No conversation context needed
432
+ copilot_chat_history=[
433
+ InternalCopilotRequestChatMessage(
434
+ role="internal_copilot_request",
435
+ content=[log_content_block, *file_content_blocks],
436
+ response_category=ResponseCategory.TRAINING_ERROR_LOG_ANALYSIS,
437
+ )
438
+ ],
439
+ )
440
+
441
+ # Generate copilot response
442
+ copilot_client = llm_service.instantiate_copilot()
443
+ (
444
+ original_stream,
445
+ generation_context,
446
+ ) = await copilot_client.generate_response(context)
447
+
448
+ copilot_response_handler = llm_service.instantiate_handler(
449
+ config.COPILOT_HANDLER_ROLLING_BUFFER_SIZE
450
+ )
451
+ intercepted_stream = copilot_response_handler.handle_response(original_stream)
452
+
453
+ # Stream the copilot response as job events
454
+ async for token in intercepted_stream:
455
+ # Send each token as a job event using the same format as /copilot endpoint
456
+ await push_job_status_event(
457
+ job, JobStatus.copilot_analyzing, payload=token.sse_data
458
+ )
459
+
460
+ # Send references (if any) as part of copilot_analyzing stream
461
+ if generation_context.relevant_documents:
462
+ reference_section = copilot_response_handler.extract_references(
463
+ generation_context.relevant_documents
464
+ )
465
+ await push_job_status_event(
466
+ job, JobStatus.copilot_analyzing, payload=reference_section.sse_data
467
+ )
468
+
469
+ # Send original error log as part of copilot_analyzing stream
470
+ training_error_log = TrainingErrorLog(logs=[log_content_block])
471
+ await push_job_status_event(
472
+ job, JobStatus.copilot_analyzing, payload=training_error_log.sse_data
473
+ )
474
+
475
+ # Send success status
476
+ await push_job_status_event(job, JobStatus.copilot_analysis_success)
477
+
478
+ await push_job_status_event(job, JobStatus.done)
479
+ job_manager.mark_done(job)
480
+
481
+ except Exception as exc:
482
+ structlogger.exception(
483
+ "copilot_training_error_analysis_job.error",
484
+ job_id=job.id,
485
+ error=str(exc),
486
+ )
487
+ await push_job_status_event(
488
+ job, JobStatus.copilot_analysis_error, message=str(exc)
489
+ )
490
+ job_manager.mark_done(job, error=str(exc))
491
+
492
+
493
+ async def run_copilot_welcome_message_job(
494
+ app: "Sanic",
495
+ job: JobInfo,
496
+ template_name: Optional[ProjectTemplateName] = None,
497
+ ) -> None:
498
+ """Run the welcome message job in the background.
499
+
500
+ This job sends a welcome message to the user after successful bot creation.
501
+ For template-based bots, it sends a predefined message.
502
+ For prompt-based bots, it can be extended to stream generated messages.
503
+
504
+ Args:
505
+ app: The Sanic application instance.
506
+ job: The job information instance.
507
+ template_name: The template name for template-based bots, None for prompt-based.
508
+ """
509
+ try:
510
+ # Load welcome messages from YAML
511
+ welcome_messages = load_copilot_welcome_messages()
512
+
513
+ # Get the appropriate welcome message
514
+ if template_name:
515
+ welcome_message = welcome_messages.get(
516
+ template_name.value,
517
+ welcome_messages.get(PROMPT_TO_BOT_KEY),
518
+ )
519
+ else:
520
+ welcome_message = welcome_messages.get(PROMPT_TO_BOT_KEY)
521
+
522
+ # Send the welcome message as a single event
523
+ await push_job_status_event(
524
+ job,
525
+ JobStatus.copilot_welcome_message,
526
+ payload={
527
+ "content": welcome_message,
528
+ "response_category": "copilot",
529
+ "completeness": "complete",
530
+ },
531
+ )
532
+
533
+ # Mark job as done
534
+ await push_job_status_event(job, JobStatus.done)
535
+ job_manager.mark_done(job)
536
+
537
+ structlogger.info(
538
+ "copilot_welcome_message_job.success",
539
+ job_id=job.id,
540
+ template=template_name.value if template_name else PROMPT_TO_BOT_KEY,
541
+ )
542
+
543
+ except Exception as exc:
544
+ structlogger.exception(
545
+ "welcome_message_job.error",
546
+ job_id=job.id,
547
+ error=str(exc),
548
+ )
549
+ await push_job_status_event(job, JobStatus.error, message=str(exc))
550
+ job_manager.mark_done(job, error=str(exc))
551
+
552
+
553
+ async def run_copilot_training_success_job(
554
+ app: "Sanic",
555
+ job: JobInfo,
556
+ ) -> None:
557
+ """Run the training success job in the background.
558
+
559
+ This job sends a training success message to the user after successful bot training.
560
+
561
+ Args:
562
+ app: The Sanic application instance.
563
+ job: The job information instance.
564
+ """
565
+ try:
566
+ # Load copilot default messages from YAML
567
+ internal_messages = load_copilot_handler_default_responses()
568
+
569
+ # Get the appropriate training success message
570
+ training_success_message = internal_messages.get("training_success_response")
571
+
572
+ # Send the training success message
573
+ await push_job_status_event(
574
+ job,
575
+ JobStatus.train_success_message,
576
+ payload={
577
+ "content": training_success_message,
578
+ "response_category": "copilot",
579
+ "completeness": "complete",
580
+ },
581
+ )
582
+
583
+ # Send the training success category
584
+ await push_job_status_event(
585
+ job,
586
+ JobStatus.train_success_message,
587
+ payload={
588
+ "response_category": "copilot_training_success",
589
+ "completeness": "complete",
590
+ },
591
+ )
592
+
593
+ # Mark job as done
594
+ await push_job_status_event(job, JobStatus.done)
595
+ job_manager.mark_done(job)
596
+
597
+ structlogger.info(
598
+ "copilot_training_success_job.success",
599
+ job_id=job.id,
600
+ )
601
+
602
+ except Exception as exc:
603
+ structlogger.exception(
604
+ "copilot_training_success_job.error",
605
+ job_id=job.id,
606
+ error=str(exc),
607
+ )
608
+ await push_job_status_event(job, JobStatus.error, message=str(exc))
609
+ job_manager.mark_done(job, error=str(exc))