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,239 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ from enum import Enum
5
+ from typing import Any, Dict, List, Optional
6
+
7
+ import structlog
8
+ from pydantic import BaseModel, Field, model_validator
9
+ from ruamel import yaml as yaml
10
+
11
+ from rasa.exceptions import ValidationError
12
+ from rasa.shared.utils.yaml import read_config_file
13
+
14
+ DEFAULT_AGENTS_CONFIG_FOLDER = "sub_agents"
15
+
16
+ structlogger = structlog.get_logger()
17
+
18
+
19
+ class ProtocolConfig(str, Enum):
20
+ """Supported protocols for agents."""
21
+
22
+ RASA = "RASA"
23
+ A2A = "A2A"
24
+
25
+
26
+ class AgentInfo(BaseModel):
27
+ """Configuration for an agent."""
28
+
29
+ name: str = Field(..., description="Agent name")
30
+ protocol: ProtocolConfig = Field(
31
+ default=ProtocolConfig.RASA,
32
+ description="Protocol used to communicate with the agent.",
33
+ )
34
+ description: str = Field(..., description="Agent description")
35
+
36
+ @model_validator(mode="before")
37
+ @classmethod
38
+ def validate_protocol(cls, values: Any) -> Any:
39
+ """Validate and normalize protocol values to support lowercase input."""
40
+ if isinstance(values, dict) and "protocol" in values:
41
+ protocol_value = values["protocol"]
42
+ if isinstance(protocol_value, str):
43
+ # Map lowercase protocol names to uppercase enum values
44
+ protocol_mapping = {
45
+ "rasa": ProtocolConfig.RASA,
46
+ "a2a": ProtocolConfig.A2A,
47
+ "RASA": ProtocolConfig.RASA,
48
+ "A2A": ProtocolConfig.A2A,
49
+ }
50
+
51
+ if protocol_value.lower() in protocol_mapping:
52
+ values["protocol"] = protocol_mapping[protocol_value.lower()]
53
+ else:
54
+ # If it's not a recognized protocol, let Pydantic handle the
55
+ # validation
56
+ # This will raise a proper validation error
57
+ pass
58
+
59
+ return values
60
+
61
+
62
+ class AgentConfiguration(BaseModel):
63
+ llm: Optional[Dict[str, Any]] = None
64
+ prompt_template: Optional[str] = None
65
+ module: Optional[str] = None
66
+ timeout: Optional[int] = None # timeout in seconds
67
+ max_retries: Optional[int] = None
68
+ agent_card: Optional[str] = None
69
+ auth: Optional[Dict[str, Any]] = None
70
+
71
+
72
+ class AgentConnections(BaseModel):
73
+ mcp_servers: Optional[List[AgentMCPServerConfig]] = None
74
+
75
+
76
+ class AgentMCPServerConfig(BaseModel):
77
+ name: str # Reference to MCPServerConfig
78
+ url: Optional[str] = None
79
+ type: Optional[str] = None
80
+ include_tools: Optional[List[str]] = None
81
+ exclude_tools: Optional[List[str]] = None
82
+ # Additional parameters for the MCP server
83
+ additional_params: Optional[Dict[str, Any]] = None
84
+
85
+
86
+ class AgentConfig(BaseModel):
87
+ agent: AgentInfo
88
+ configuration: Optional[AgentConfiguration] = None
89
+ connections: Optional[AgentConnections] = None
90
+
91
+
92
+ class AvailableAgents:
93
+ """Collection of configured agents."""
94
+
95
+ def __init__(self, agents: Optional[Dict[str, AgentConfig]] = None) -> None:
96
+ """Create an `AvailableAgents` object."""
97
+ self.agents: Dict[str, AgentConfig] = agents or {}
98
+
99
+ @classmethod
100
+ def read_from_folder(cls, sub_agents_folder: str) -> AvailableAgents:
101
+ """Read the different agents from the given folder."""
102
+ agents: Dict[str, AgentConfig] = {}
103
+
104
+ if not os.path.isdir(sub_agents_folder):
105
+ if sub_agents_folder != DEFAULT_AGENTS_CONFIG_FOLDER:
106
+ # User explicitly specified a folder, it should exist
107
+ raise ValidationError(
108
+ code="agent.sub_agents_folder_not_found",
109
+ event_info=f"The specified agents config folder "
110
+ f"'{sub_agents_folder}' does not exist or is not a "
111
+ f"directory.",
112
+ details={"folder": sub_agents_folder},
113
+ )
114
+ else:
115
+ # We are using the default folder, it may not be created yet
116
+ # Init with an empty agents in this case
117
+ structlogger.debug(
118
+ f"Default agents config folder '{sub_agents_folder}' does not "
119
+ f"exist. Agent configurations won't be loaded."
120
+ )
121
+ return cls(agents)
122
+
123
+ # First, load all agent configs into a temporary list for validation
124
+ agent_configs: List[AgentConfig] = []
125
+ for agent_name in os.listdir(sub_agents_folder):
126
+ agent_folder = os.path.join(sub_agents_folder, agent_name)
127
+ if not os.path.isdir(agent_folder):
128
+ raise ValidationError(
129
+ code="agent.invalid_directory_structure",
130
+ event_info=f"Invalid structure: '{agent_folder}' is not a folder. "
131
+ f"Each agent must be stored in its own folder inside "
132
+ f"'{sub_agents_folder}'. Expected structure: "
133
+ f"{sub_agents_folder}/<agent_name>/config.yml",
134
+ details={
135
+ "agent_name": agent_name,
136
+ "sub_agents_folder": sub_agents_folder,
137
+ },
138
+ )
139
+ config_path = os.path.join(agent_folder, "config.yml")
140
+ if not os.path.isfile(config_path):
141
+ raise ValidationError(
142
+ code="agent.missing_config_file",
143
+ event_info=f"Missing config file for agent '{agent_name}'. "
144
+ f"Expected file: '{config_path}'. "
145
+ f"Each agent folder must contain a 'config.yml' file.",
146
+ details={
147
+ "agent_name": agent_name,
148
+ "expected_config_file": config_path,
149
+ "sub_agents_folder": sub_agents_folder,
150
+ },
151
+ )
152
+ try:
153
+ agent_config = cls._read_agent_config_file(config_path)
154
+ if not isinstance(agent_config, AgentConfig):
155
+ raise ValueError(f"Invalid agent config type for {agent_name}")
156
+ agent_configs.append(agent_config)
157
+ except Exception as e:
158
+ raise ValidationError(
159
+ code="agent.load_failed",
160
+ event_info=f"Failed to load agent '{agent_name}': {e}",
161
+ details={
162
+ "agent_name": agent_name,
163
+ "sub_agents_folder": sub_agents_folder,
164
+ "error": str(e),
165
+ },
166
+ )
167
+
168
+ # Validate agent names are unique before adding to dictionary
169
+ from rasa.agents.validation import validate_agent_names_unique
170
+
171
+ validate_agent_names_unique(agent_configs)
172
+
173
+ for agent_config in agent_configs:
174
+ agents[agent_config.agent.name] = agent_config
175
+
176
+ structlogger.info(f"Loaded agent configs: {[k for k in agents.keys()]}")
177
+ return cls(agents)
178
+
179
+ @staticmethod
180
+ def from_dict(data: Dict[str, Any]) -> AgentConfig:
181
+ """Parse the agent config from raw data into Pydantic models.
182
+
183
+ Args:
184
+ data: Raw data from the config file as a dictionary.
185
+
186
+ Returns:
187
+ The parsed AgentConfig as a Pydantic model.
188
+
189
+ Raises:
190
+ ValueError: If the data structure is invalid for Pydantic models.
191
+ """
192
+ return AgentConfig(
193
+ agent=AgentInfo(**data.get("agent", {})),
194
+ configuration=AgentConfiguration(**data.get("configuration", {}))
195
+ if data.get("configuration")
196
+ else None,
197
+ connections=AgentConnections(**data.get("connections", {}))
198
+ if data.get("connections")
199
+ else None,
200
+ )
201
+
202
+ @classmethod
203
+ def _read_agent_config_file(cls, config_path: str) -> AgentConfig:
204
+ """Read the agent config from a yaml file into Pydantic models.
205
+
206
+ Args:
207
+ config_path: Path to the config file.
208
+
209
+ Returns:
210
+ The parsed AgentConfig.
211
+
212
+ Raises:
213
+ yaml.YAMLError: If the YAML file is invalid.
214
+ ValidationError: If the data structure is invalid for Pydantic models.
215
+ """
216
+ data = read_config_file(config_path)
217
+ return cls.from_dict(data)
218
+
219
+ def as_json_list(self) -> List[Dict[str, Any]]:
220
+ """Convert the available agents to a JSON-serializable list."""
221
+ return [
222
+ {
223
+ "name": agent_name,
224
+ "agent": agent_config.agent.model_dump(),
225
+ "configuration": agent_config.configuration.model_dump()
226
+ if agent_config.configuration
227
+ else None,
228
+ "connections": agent_config.connections.model_dump()
229
+ if agent_config.connections
230
+ else None,
231
+ }
232
+ for agent_name, agent_config in self.agents.items()
233
+ ]
234
+
235
+ def get_agent_config(self, agent_id: str) -> Optional[AgentConfig]:
236
+ return self.agents.get(agent_id)
237
+
238
+ def has_agents(self) -> bool:
239
+ return len(self.agents) > 0
@@ -66,7 +66,7 @@ class EventBroker:
66
66
  raise NotImplementedError("Event broker must implement the `publish` method.")
67
67
 
68
68
  def is_ready(self) -> bool:
69
- """Determine whether or not the event broker is ready.
69
+ """Determine whether the event broker is ready.
70
70
 
71
71
  Returns:
72
72
  `True` by default, but this may be overridden by subclasses.
@@ -6,13 +6,19 @@ import threading
6
6
  import time
7
7
  from asyncio import AbstractEventLoop
8
8
  from functools import cached_property
9
- from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Union
9
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text, Tuple, Union
10
10
 
11
11
  import structlog
12
12
 
13
13
  import rasa.shared.utils.common
14
14
  from rasa.core.brokers.broker import EventBroker
15
+ from rasa.core.constants import KAFKA_SERVICE_NAME
15
16
  from rasa.core.exceptions import KafkaProducerInitializationError
17
+ from rasa.core.iam_credentials_providers.credentials_provider_protocol import (
18
+ IAMCredentialsProviderInput,
19
+ SupportedServiceType,
20
+ create_iam_credentials_provider,
21
+ )
16
22
  from rasa.shared.core.events import ErrorHandled
17
23
  from rasa.shared.utils.io import DEFAULT_ENCODING
18
24
  from rasa.utils.endpoints import EndpointConfig
@@ -93,6 +99,12 @@ class KafkaEventBroker(EventBroker):
93
99
  self.ssl_keyfile = ssl_keyfile
94
100
  self.queue_size = kwargs.get("queue_size")
95
101
  self.ssl_check_hostname = "https" if ssl_check_hostname else None
102
+ self.iam_credentials_provider = create_iam_credentials_provider(
103
+ IAMCredentialsProviderInput(
104
+ service_type=SupportedServiceType.EVENT_BROKER,
105
+ service_name=KAFKA_SERVICE_NAME,
106
+ )
107
+ )
96
108
 
97
109
  # PII management attributes
98
110
  self.stream_pii = kwargs.get("stream_pii", True)
@@ -134,8 +146,8 @@ class KafkaEventBroker(EventBroker):
134
146
  try:
135
147
  self._check_kafka_connection()
136
148
  logger.debug("Connection to kafka successful.")
137
- except KafkaException:
138
- logger.debug("Failed to connect kafka.")
149
+ except KafkaException as exc:
150
+ logger.debug(f"Failed to connect to kafka: {exc}")
139
151
  return
140
152
  while retries:
141
153
  try:
@@ -215,7 +227,31 @@ class KafkaEventBroker(EventBroker):
215
227
  KafkaException: if Kafka is disconnected.
216
228
  """
217
229
  if self.producer is not None:
218
- self.producer.list_topics(timeout=5)
230
+ structlogger.debug(
231
+ "rasa.core.brokers.kafka.KafkaEventBroker.check_kafka_connection",
232
+ )
233
+ # we have to poll to trigger the oauth_cb if using IAM authentication
234
+ self.producer.poll(0)
235
+ self.producer.list_topics(self.topic, timeout=5)
236
+
237
+ def get_aws_iam_token(
238
+ self, oauth_config: Any
239
+ ) -> Tuple[Optional[str], Optional[float]]:
240
+ """Callback function to fetch AWS IAM token for MSK authentication.
241
+
242
+ The callback function requires this specific signature to work correctly.
243
+
244
+ Args:
245
+ oauth_config: OAuth configuration.
246
+
247
+ Returns:
248
+ A tuple of auth token and expiry time in seconds.
249
+ """
250
+ if self.iam_credentials_provider is None:
251
+ return None, None
252
+
253
+ temp_credentials = self.iam_credentials_provider.get_temporary_credentials()
254
+ return temp_credentials.auth_token, temp_credentials.expiration
219
255
 
220
256
  def _get_kafka_config(self) -> Dict[Text, Any]:
221
257
  config = {
@@ -246,15 +282,27 @@ class KafkaEventBroker(EventBroker):
246
282
  }
247
283
  elif self.security_protocol == "SASL_SSL":
248
284
  authentication_params = {
249
- "sasl.username": self.sasl_username,
250
- "sasl.password": self.sasl_password,
251
285
  "ssl.ca.location": self.ssl_cafile,
252
- "ssl.certificate.location": self.ssl_certfile,
253
- "ssl.key.location": self.ssl_keyfile,
254
286
  "ssl.endpoint.identification.algorithm": self.ssl_check_hostname,
255
287
  "security.protocol": self.security_protocol,
256
288
  "sasl.mechanism": self.sasl_mechanism,
257
289
  }
290
+
291
+ if self.iam_credentials_provider is not None:
292
+ authentication_params.update(
293
+ {
294
+ "oauth_cb": self.get_aws_iam_token,
295
+ }
296
+ )
297
+ else:
298
+ authentication_params.update(
299
+ {
300
+ "sasl.username": self.sasl_username,
301
+ "sasl.password": self.sasl_password,
302
+ "ssl.certificate.location": self.ssl_certfile,
303
+ "ssl.key.location": self.ssl_keyfile,
304
+ }
305
+ )
258
306
  else:
259
307
  raise ValueError(
260
308
  f"Cannot initialise `KafkaEventBroker`: "
@@ -1,5 +1,5 @@
1
1
  # ruff: noqa: I001
2
- from typing import Text, Dict, List, Type
2
+ from typing import Text, Dict, List, Type, Optional
3
3
 
4
4
  from rasa.core.channels.channel import ( # noqa: F401
5
5
  InputChannel,
@@ -15,54 +15,101 @@ from rasa.core.channels.socketio import SocketIOInput
15
15
  from rasa.core.channels.botframework import BotFrameworkInput
16
16
  from rasa.core.channels.callback import CallbackInput
17
17
  from rasa.core.channels.console import CmdlineInput
18
- from rasa.core.channels.facebook import FacebookInput
19
18
  from rasa.core.channels.mattermost import MattermostInput
20
19
  from rasa.core.channels.rasa_chat import RasaChatInput
21
20
  from rasa.core.channels.rest import RestInput
22
21
  from rasa.core.channels.rocketchat import RocketChatInput
23
- from rasa.core.channels.slack import SlackInput
24
- from rasa.core.channels.telegram import TelegramInput
25
- from rasa.core.channels.twilio import TwilioInput
26
- from rasa.core.channels.voice_ready.twilio_voice import TwilioVoiceInput
27
22
  from rasa.core.channels.voice_ready.jambonz import JambonzVoiceReadyInput
28
23
  from rasa.core.channels.voice_ready.audiocodes import AudiocodesInput
29
24
  from rasa.core.channels.voice_stream.browser_audio import BrowserAudioInputChannel
30
- from rasa.core.channels.webexteams import WebexTeamsInput
31
25
  from rasa.core.channels.hangouts import HangoutsInput
32
- from rasa.core.channels.vier_cvg import CVGInput
33
- from rasa.core.channels.voice_stream.twilio_media_streams import (
34
- TwilioMediaStreamsInputChannel,
35
- )
36
26
  from rasa.core.channels.voice_stream.genesys import GenesysInputChannel
37
27
  from rasa.core.channels.studio_chat import StudioChatInput
38
28
  from rasa.core.channels.voice_stream.audiocodes import AudiocodesVoiceInputChannel
39
29
  from rasa.core.channels.voice_stream.jambonz import JambonzStreamInputChannel
40
30
 
31
+ # Type annotations for channels with optional dependencies
32
+ FacebookInput: Optional[Type[InputChannel]]
33
+ SlackInput: Optional[Type[InputChannel]]
34
+ TelegramInput: Optional[Type[InputChannel]]
35
+ TwilioInput: Optional[Type[InputChannel]]
36
+ TwilioVoiceInput: Optional[Type[InputChannel]]
37
+ TwilioMediaStreamsInputChannel: Optional[Type[InputChannel]]
38
+ WebexTeamsInput: Optional[Type[InputChannel]]
39
+ CVGInput: Optional[Type[InputChannel]]
40
+
41
+ # Channels with optional dependencies - import with try-except
42
+ try:
43
+ from rasa.core.channels.facebook import FacebookInput
44
+ except ImportError:
45
+ FacebookInput = None
46
+
47
+ try:
48
+ from rasa.core.channels.slack import SlackInput
49
+ except ImportError:
50
+ SlackInput = None
51
+
52
+ try:
53
+ from rasa.core.channels.telegram import TelegramInput
54
+ except ImportError:
55
+ TelegramInput = None
56
+
57
+ try:
58
+ from rasa.core.channels.twilio import TwilioInput
59
+ except ImportError:
60
+ TwilioInput = None
61
+
62
+ try:
63
+ from rasa.core.channels.voice_ready.twilio_voice import TwilioVoiceInput
64
+ except ImportError:
65
+ TwilioVoiceInput = None
66
+
67
+ try:
68
+ from rasa.core.channels.voice_stream.twilio_media_streams import (
69
+ TwilioMediaStreamsInputChannel,
70
+ )
71
+ except ImportError:
72
+ TwilioMediaStreamsInputChannel = None
73
+
74
+ try:
75
+ from rasa.core.channels.webexteams import WebexTeamsInput
76
+ except ImportError:
77
+ WebexTeamsInput = None
78
+
79
+ try:
80
+ from rasa.core.channels.vier_cvg import CVGInput
81
+ except ImportError:
82
+ CVGInput = None
83
+
41
84
  input_channel_classes: List[Type[InputChannel]] = [
42
- CmdlineInput,
43
- FacebookInput,
44
- SlackInput,
45
- TelegramInput,
46
- MattermostInput,
47
- TwilioInput,
48
- TwilioVoiceInput,
49
- RasaChatInput,
50
- BotFrameworkInput,
51
- RocketChatInput,
52
- CallbackInput,
53
- RestInput,
54
- SocketIOInput,
55
- WebexTeamsInput,
56
- HangoutsInput,
57
- AudiocodesInput,
58
- CVGInput,
59
- JambonzVoiceReadyInput,
60
- TwilioMediaStreamsInputChannel,
61
- BrowserAudioInputChannel,
62
- GenesysInputChannel,
63
- StudioChatInput,
64
- AudiocodesVoiceInputChannel,
65
- JambonzStreamInputChannel,
85
+ c
86
+ for c in [
87
+ CmdlineInput,
88
+ FacebookInput,
89
+ SlackInput,
90
+ TelegramInput,
91
+ MattermostInput,
92
+ TwilioInput,
93
+ TwilioVoiceInput,
94
+ RasaChatInput,
95
+ BotFrameworkInput,
96
+ RocketChatInput,
97
+ CallbackInput,
98
+ RestInput,
99
+ SocketIOInput,
100
+ WebexTeamsInput,
101
+ HangoutsInput,
102
+ AudiocodesInput,
103
+ CVGInput,
104
+ JambonzVoiceReadyInput,
105
+ TwilioMediaStreamsInputChannel,
106
+ BrowserAudioInputChannel,
107
+ GenesysInputChannel,
108
+ StudioChatInput,
109
+ AudiocodesVoiceInputChannel,
110
+ JambonzStreamInputChannel,
111
+ ]
112
+ if c is not None
66
113
  ]
67
114
 
68
115
  # Mapping from an input channel name to its class to allow name based lookup.
@@ -102,6 +102,9 @@ class UserMessage:
102
102
  return f"{self.__class__.__name__}({self.text})"
103
103
 
104
104
 
105
+ OnNewMessageType = Callable[[UserMessage], Awaitable[Any]]
106
+
107
+
105
108
  def register(
106
109
  input_channels: List[InputChannel], app: Sanic, route: Optional[Text]
107
110
  ) -> None:
@@ -135,9 +138,7 @@ class InputChannel:
135
138
  def url_prefix(self) -> Text:
136
139
  return self.name()
137
140
 
138
- def blueprint(
139
- self, on_new_message: Callable[[UserMessage], Awaitable[Any]]
140
- ) -> Blueprint:
141
+ def blueprint(self, on_new_message: OnNewMessageType) -> Blueprint:
141
142
  """Defines a Sanic blueprint.
142
143
 
143
144
  The blueprint will be attached to a running sanic server and handle
@@ -0,0 +1,3 @@
1
+ USER_CONVERSATION_SESSION_END = "/session_end"
2
+ USER_CONVERSATION_SESSION_START = "/session_start"
3
+ USER_CONVERSATION_SILENCE_TIMEOUT = "/silence_timeout"
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
+ import time
4
5
  from functools import partial
5
6
  from typing import (
6
7
  TYPE_CHECKING,
@@ -35,6 +36,7 @@ if TYPE_CHECKING:
35
36
  from sanic.response import HTTPResponse
36
37
 
37
38
  from rasa.core.channels.channel import UserMessage
39
+ from rasa.core.processor import MessageProcessor
38
40
  from rasa.shared.core.trackers import DialogueStateTracker
39
41
 
40
42
  from rasa.hooks import hookimpl
@@ -49,6 +51,7 @@ class DevelopmentInspectorPlugin:
49
51
  """Plugin for broadcasting tracker updates to development inspector clients."""
50
52
 
51
53
  def __init__(self, inspector: DevelopmentInspectProxy) -> None:
54
+ """Initializes the plugin."""
52
55
  self.inspector = inspector
53
56
  self.tasks: List[asyncio.Task] = []
54
57
 
@@ -61,21 +64,23 @@ class DevelopmentInspectorPlugin:
61
64
  """Remove tasks that have already completed."""
62
65
  self.tasks = [task for task in self.tasks if not task.done()]
63
66
 
64
- @hookimpl # type: ignore[misc]
65
- def after_new_user_message(self, tracker: DialogueStateTracker) -> None:
66
- """Broadcasts tracker updates after a new user message."""
67
+ def _create_broadcast_task(self, tracker: DialogueStateTracker) -> None:
68
+ """Creates a task to broadcast tracker updates."""
67
69
  task = asyncio.create_task(self.inspector.on_tracker_updated(tracker))
68
70
  self.tasks.append(task)
69
71
  self._cleanup_completed_tasks()
70
72
 
71
- @hookimpl # type: ignore[misc]
73
+ @hookimpl
74
+ def after_new_user_message(self, tracker: DialogueStateTracker) -> None:
75
+ """Broadcasts tracker updates after a new user message."""
76
+ self._create_broadcast_task(tracker)
77
+
78
+ @hookimpl
72
79
  def after_action_executed(self, tracker: DialogueStateTracker) -> None:
73
80
  """Broadcasts tracker updates after an action is executed."""
74
- task = asyncio.create_task(self.inspector.on_tracker_updated(tracker))
75
- self.tasks.append(task)
76
- self._cleanup_completed_tasks()
81
+ self._create_broadcast_task(tracker)
77
82
 
78
- @hookimpl # type: ignore[misc]
83
+ @hookimpl
79
84
  def after_server_stop(self) -> None:
80
85
  """Cancels all remaining tasks when the server stops."""
81
86
  self._cancel_tasks()
@@ -93,8 +98,9 @@ class DevelopmentInspectProxy(InputChannel):
93
98
  super().__init__()
94
99
  self.underlying = underlying
95
100
  self.is_voice = is_voice
96
- self.processor = None
101
+ self.processor: Optional[MessageProcessor] = None
97
102
  self.tracker_stream = TrackerStream(get_tracker=self.get_tracker_state)
103
+ self._turn_start_times: Dict[Text, float] = {}
98
104
  # Register the plugin to get tracker updates
99
105
  plugin_manager().register(DevelopmentInspectorPlugin(self))
100
106
 
@@ -124,15 +130,18 @@ class DevelopmentInspectProxy(InputChannel):
124
130
 
125
131
  return pkg_resources.resource_filename(__name__, INSPECT_TEMPLATE_PATH)
126
132
 
127
- async def get_tracker_state(self, sender_id: str) -> str:
128
- """Returns the state of the tracker as a json string."""
133
+ async def _get_tracker(self, sender_id: Text) -> DialogueStateTracker:
134
+ """Returns the tracker for the given sender ID."""
129
135
  if not self.processor:
130
136
  structlogger.error(
131
- "development_inspector.get_tracker_state.agent_not_initialized"
137
+ "development_inspector._get_tracker.agent_not_initialized"
132
138
  )
133
- return ""
139
+ raise ValueError("Agent processor is not initialized.")
140
+ return await self.processor.get_tracker(sender_id)
134
141
 
135
- tracker = await self.processor.get_tracker(sender_id)
142
+ async def get_tracker_state(self, sender_id: str) -> str:
143
+ """Returns the state of the tracker as a json string."""
144
+ tracker = await self._get_tracker(sender_id)
136
145
  state = tracker.current_state(EventVerbosity.AFTER_RESTART)
137
146
  return orjson.dumps(state, option=orjson.OPT_SERIALIZE_NUMPY).decode("utf-8")
138
147
 
@@ -145,6 +154,10 @@ class DevelopmentInspectProxy(InputChannel):
145
154
  ).decode("utf-8")
146
155
  await self.tracker_stream.broadcast(tracker_dump)
147
156
 
157
+ def _record_turn_start_time(self, sender_id: Text) -> None:
158
+ """Records the start time of a new turn."""
159
+ self._turn_start_times[sender_id] = time.time()
160
+
148
161
  async def on_message_proxy(
149
162
  self,
150
163
  on_new_message: Callable[["UserMessage"], Awaitable[Any]],
@@ -162,7 +175,7 @@ class DevelopmentInspectProxy(InputChannel):
162
175
  self, on_new_message: Callable[[UserMessage], Awaitable[Any]]
163
176
  ) -> "Blueprint":
164
177
  """Defines a Sanic blueprint."""
165
- self.sio = AsyncServer(async_mode="sanic", cors_allowed_origins=[])
178
+ self.sio_server = AsyncServer(async_mode="sanic", cors_allowed_origins=[])
166
179
  underlying_webhook: Blueprint = self.underlying.blueprint(
167
180
  partial(self.on_message_proxy, on_new_message)
168
181
  )
@@ -197,7 +210,7 @@ class DevelopmentInspectProxy(InputChannel):
197
210
  class TrackerStream:
198
211
  """Stream tracker state to connected clients."""
199
212
 
200
- def __init__(self, get_tracker: Callable[[str], Awaitable[Dict[str, Any]]]) -> None:
213
+ def __init__(self, get_tracker: Callable[[str], Awaitable[str]]) -> None:
201
214
  """Initializes the TrackerStream."""
202
215
  self._connected_clients: Set[Websocket] = set()
203
216
  self.get_tracker = get_tracker
@@ -213,7 +213,7 @@ class HangoutsInput(InputChannel):
213
213
  # every message. Actual caching depends on response headers.
214
214
  # see: https://github.com/googleapis/google-auth-library-python/blob/main/google/oauth2/id_token.py#L15 # noqa: E501
215
215
  cached_session = cachecontrol.CacheControl(requests.session())
216
- self.google_request = google.auth.transport.requests.Request(
216
+ self.google_request = google.auth.transport.requests.Request( # type: ignore[no-untyped-call]
217
217
  session=cached_session
218
218
  )
219
219
 
@@ -267,7 +267,7 @@ class HangoutsInput(InputChannel):
267
267
  # see https://developers.google.com/chat/how-tos/bots-develop#verifying_bot_authenticity # noqa: E501
268
268
  # and https://google-auth.readthedocs.io/en/latest/user-guide.html#identity-tokens # noqa: E501
269
269
  try:
270
- decoded_token = id_token.verify_token(
270
+ decoded_token = id_token.verify_token( # type: ignore[no-untyped-call]
271
271
  bot_token,
272
272
  self.google_request,
273
273
  audience=self.project_id,