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
rasa/utils/log_utils.py CHANGED
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import logging
4
4
  import os
5
5
  import sys
6
- from typing import Any, Optional
6
+ from typing import Any, List, Optional
7
7
 
8
8
  import structlog
9
9
  from structlog.dev import ConsoleRenderer
@@ -19,24 +19,135 @@ from rasa.shared.constants import (
19
19
  )
20
20
 
21
21
  FORCE_JSON_LOGGING = os.environ.get("FORCE_JSON_LOGGING")
22
+ ANSI_CYAN_BOLD = "\033[1;36m"
23
+ ANSI_RESET = "\033[0m"
24
+
25
+
26
+ def conditional_set_exc_info(
27
+ logger: WrappedLogger, name: str, event_dict: EventDict
28
+ ) -> EventDict:
29
+ """Set exception info only if exception does not have suppress_stack_trace flag."""
30
+ exc_info = event_dict.get("exc_info")
31
+ if exc_info is not None:
32
+ is_debug_mode = logger.isEnabledFor(logging.DEBUG)
33
+
34
+ if (
35
+ hasattr(exc_info, "suppress_stack_trace")
36
+ and exc_info.suppress_stack_trace
37
+ and not is_debug_mode
38
+ ):
39
+ event_dict.pop("exc_info", None)
40
+ else:
41
+ return structlog.dev.set_exc_info(logger, name, event_dict)
42
+ return event_dict
22
43
 
23
44
 
24
45
  class HumanConsoleRenderer(ConsoleRenderer):
25
46
  """Console renderer that outputs human-readable logs."""
26
47
 
27
48
  def __call__(self, logger: WrappedLogger, name: str, event_dict: EventDict) -> str:
49
+ should_highlight = event_dict.get("highlight", False)
50
+ terminal_width = self._get_terminal_width()
51
+
52
+ # Use event_info as title for the log entry
28
53
  if "event_info" in event_dict:
29
54
  event_key = event_dict["event"]
30
55
  event_dict["event"] = event_dict["event_info"]
31
56
  event_dict["event_key"] = event_key
32
- del event_dict["event_info"]
33
-
34
- return super().__call__(logger, name, event_dict)
57
+ event_dict.pop("event_info", None)
58
+
59
+ # In case the log entry should be highlighted
60
+ # make sure to surround the log entry with ===
61
+ event_dict = self._highlight_log_entry(
62
+ event_dict, terminal_width, should_highlight
63
+ )
64
+
65
+ # Format JSON data for better readability
66
+ event_dict = self._format_json_data(event_dict)
67
+
68
+ # Render the log entry first
69
+ result = super().__call__(logger, name, event_dict)
70
+
71
+ # ensure that newlines are properly rendered
72
+ result = "\n".join(result.split("\\n"))
73
+
74
+ # Add closing === if we highlighted this entry
75
+ if should_highlight:
76
+ result += f"\n{'=' * terminal_width}"
77
+
78
+ return result
79
+
80
+ def _highlight_log_entry(
81
+ self, event_dict: EventDict, terminal_width: int, should_highlight: bool
82
+ ) -> EventDict:
83
+ if should_highlight:
84
+ # Only highlight if log level is DEBUG
85
+ # structlog passes log level as 'level' or 'levelname'
86
+ level = event_dict.get("level", event_dict.get("levelname", "")).upper()
87
+ if level == "DEBUG":
88
+ # Add opening === before the event info
89
+ if "event" in event_dict and isinstance(event_dict["event"], str):
90
+ event_info = event_dict["event"]
91
+ event_dict["event"] = (
92
+ f"\n{'=' * terminal_width}\n"
93
+ f"{ANSI_CYAN_BOLD}{event_info}{ANSI_RESET}\n"
94
+ )
95
+
96
+ event_dict.pop("highlight", None)
97
+
98
+ return event_dict
99
+
100
+ def _format_json_data(self, event_dict: EventDict) -> EventDict:
101
+ """Format JSON data in the event dict for better readability."""
102
+ # Get the list of fields to format from the event dict
103
+ fields_to_format = event_dict.get("json_formatting", [])
104
+
105
+ if not fields_to_format:
106
+ return event_dict
107
+
108
+ import json
109
+
110
+ # Format only the specified fields
111
+ for key in fields_to_format:
112
+ if key in event_dict:
113
+ value = event_dict[key]
114
+
115
+ try:
116
+ # Try to parse as JSON if it's a string
117
+ if isinstance(value, str):
118
+ parsed = json.loads(value)
119
+ # If it's a dict or list, format it nicely
120
+ if isinstance(parsed, (dict, list)):
121
+ formatted = json.dumps(parsed, indent=2, ensure_ascii=False)
122
+ event_dict[key] = formatted
123
+ elif isinstance(value, (dict, list)):
124
+ # Format JSON with indentation for better readability
125
+ formatted = json.dumps(value, indent=2, ensure_ascii=False)
126
+ event_dict[key] = formatted
127
+ except (TypeError, ValueError, json.JSONDecodeError):
128
+ # If it's not JSON serializable or if it's not valid JSON,
129
+ # leave it as is
130
+ pass
131
+
132
+ # Remove the json_formatting key from the output
133
+ event_dict.pop("json_formatting", None)
134
+
135
+ return event_dict
136
+
137
+ def _get_terminal_width(self) -> int:
138
+ """Get the width of the terminal."""
139
+ import shutil
140
+
141
+ try:
142
+ return shutil.get_terminal_size((80, 20)).columns
143
+ except Exception:
144
+ return 80
35
145
 
36
146
 
37
147
  def configure_structlog(
38
148
  log_level: Optional[int] = None,
39
149
  include_time: bool = False,
150
+ additional_processors: Optional[List[structlog.typing.Processor]] = None,
40
151
  ) -> None:
41
152
  """Configure logging of the server."""
42
153
  if log_level is None: # Log level NOTSET is 0 so we use `is None` here
@@ -51,7 +162,7 @@ def configure_structlog(
51
162
  level=log_level,
52
163
  )
53
164
 
54
- shared_processors = [
165
+ shared_processors: List[structlog.typing.Processor] = [
55
166
  # Processors that have nothing to do with output,
56
167
  # e.g., add timestamps or log level names.
57
168
  # If log level is too low, abort pipeline and throw away log entry.
@@ -66,7 +177,7 @@ def configure_structlog(
66
177
  structlog.processors.StackInfoRenderer(),
67
178
  # If some value is in bytes, decode it to a unicode str.
68
179
  structlog.processors.UnicodeDecoder(),
69
- structlog.dev.set_exc_info,
180
+ conditional_set_exc_info,
70
181
  # add structlog sentry integration. only log fatal log entries
71
182
  # as events as we are tracking exceptions anyways
72
183
  SentryProcessor(event_level=logging.FATAL),
@@ -75,6 +186,9 @@ def configure_structlog(
75
186
  if include_time:
76
187
  shared_processors.append(structlog.processors.TimeStamper(fmt="iso"))
77
188
 
189
+ if additional_processors:
190
+ shared_processors.extend(additional_processors)
191
+
78
192
  if not FORCE_JSON_LOGGING and sys.stderr.isatty():
79
193
  # Pretty printing when we run in a terminal session.
80
194
  # Automatically prints pretty tracebacks when "rich" is installed
@@ -90,7 +204,7 @@ def configure_structlog(
90
204
  ]
91
205
 
92
206
  structlog.configure(
93
- processors=processors, # type: ignore
207
+ processors=processors,
94
208
  context_class=dict,
95
209
  # `logger_factory` is used to create wrapped loggers that are used for
96
210
  # OUTPUT. This one returns a `logging.Logger`. The final value (a JSON
rasa/utils/ml_utils.py CHANGED
@@ -119,7 +119,7 @@ def response_for_template(
119
119
  rsps = responses.get(template_name, [])
120
120
  usuable_responses = [r for r in rsps if r.get(KEY_RESPONSES_TEXT)]
121
121
  if usuable_responses:
122
- selected_response = np.random.choice(usuable_responses) # type: ignore
122
+ selected_response = np.random.choice(usuable_responses)
123
123
  return selected_response.get(KEY_RESPONSES_TEXT)
124
124
  else:
125
125
  structlogger.warning(
rasa/utils/openapi.py ADDED
@@ -0,0 +1,144 @@
1
+ from typing import Any, Dict, List, Type
2
+
3
+ from pydantic.main import BaseModel
4
+ from sanic_openapi import openapi
5
+ from sanic_openapi.openapi3.types import Schema
6
+
7
+ _SUPPORTED_ATTRIBUTES = frozenset(["format", "enum", "required", "example"])
8
+
9
+
10
+ def _to_schema(
11
+ definition_stack: List[str], schema_def: Dict[str, Any], definitions: Dict[str, Any]
12
+ ) -> Schema:
13
+ type = schema_def.get("type")
14
+
15
+ if type == "object":
16
+ properties_spec = schema_def.get("properties", {})
17
+ properties = {}
18
+ for key in properties_spec:
19
+ properties[key] = _to_schema(
20
+ definition_stack=definition_stack,
21
+ schema_def=properties_spec[key],
22
+ definitions=definitions,
23
+ )
24
+ schema = openapi.Object(
25
+ title=schema_def.get("title"),
26
+ description=schema_def.get("description"),
27
+ required=schema_def.get("required"),
28
+ properties=properties,
29
+ )
30
+ elif type == "array":
31
+ schema = openapi.Array(
32
+ description=schema_def.get("description"),
33
+ required=schema_def.get("required"),
34
+ items=_to_schema(
35
+ definition_stack=definition_stack,
36
+ schema_def=schema_def.get("items"),
37
+ definitions=definitions,
38
+ ),
39
+ )
40
+ elif type is None:
41
+ if allof_spec := schema_def.get("allOf"): # Model, Enum
42
+ definition = allof_spec[0]["$ref"].split("/")[-1]
43
+ definition_data = definitions.get(definition)
44
+ if definition_data is None:
45
+ schema = openapi.Object(
46
+ title=definition, description=schema_def.get("description")
47
+ )
48
+ else:
49
+ schema = (
50
+ _to_schema(
51
+ definition_stack=definition_stack + [definition],
52
+ schema_def={**definition_data},
53
+ definitions=definitions,
54
+ )
55
+ if definition not in definition_stack
56
+ else openapi.Object(
57
+ title=definition, description=schema_def.get("description")
58
+ )
59
+ )
60
+
61
+ elif anyof_spec := schema_def.get("anyOf"): # Union
62
+ anyof = []
63
+ for any in anyof_spec:
64
+ if any.get("type"):
65
+ schema_type_obj = Schema(
66
+ **{
67
+ "type": any.get("type"),
68
+ "description": any.get("description"),
69
+ }
70
+ )
71
+ anyof.append(schema_type_obj)
72
+ else:
73
+ definition = any["$ref"].split("/")[-1]
74
+ if definition not in definition_stack:
75
+ definition_data = definitions.get(definition)
76
+ if definition_data is not None:
77
+ anyof.append(
78
+ _to_schema(
79
+ definition_stack=definition_stack + [definition],
80
+ schema_def=definition_data,
81
+ definitions=definitions,
82
+ )
83
+ )
84
+ else:
85
+ anyof.append(
86
+ openapi.Object(
87
+ title=definition,
88
+ description=schema_def.get(
89
+ "description", definition
90
+ ),
91
+ properties={},
92
+ )
93
+ )
94
+ else:
95
+ anyof.append(
96
+ openapi.Object(
97
+ title=definition,
98
+ description=schema_def.get("description", definition),
99
+ properties={},
100
+ )
101
+ )
102
+ schema = Schema(anyOf=anyof)
103
+ elif ref := schema_def.get("$ref"): # $ref
104
+ definition = ref.split("/")[-1]
105
+ definition_data = definitions.get(definition)
106
+ if definition_data is not None:
107
+ schema = _to_schema(
108
+ definition_stack=definition_stack,
109
+ schema_def=definition_data,
110
+ definitions=definitions,
111
+ )
112
+ else:
113
+ schema = openapi.Object(
114
+ title=definition, description=schema_def.get("description")
115
+ )
116
+ else: # Any type
117
+ schema = Schema(
118
+ **{"type": "object", "description": schema_def.get("description")}
119
+ )
120
+
121
+ else:
122
+ schema_spec = {
123
+ "type": schema_def.get("type"),
124
+ "description": schema_def.get("description"),
125
+ }
126
+ for spec in _SUPPORTED_ATTRIBUTES:
127
+ if schema_def.get(spec):
128
+ schema_spec[spec] = schema_def.get(spec)
129
+ schema = Schema(**schema_spec)
130
+
131
+ return schema
132
+
133
+
134
+ def model_to_schema(model: Type[BaseModel]) -> Schema:
135
+ schema = model.model_json_schema()
136
+ # Handle both $defs (newer JSON Schema) and definitions (older JSON Schema)
137
+ definitions = schema.get("$defs") or schema.get("definitions") or {}
138
+ return _to_schema(
139
+ definition_stack=[],
140
+ schema_def=dict(
141
+ filter(lambda key: key[0] not in ("definitions", "$defs"), schema.items())
142
+ ),
143
+ definitions=definitions,
144
+ )
rasa/utils/plotting.py CHANGED
@@ -99,7 +99,7 @@ def plot_confusion_matrix(
99
99
  zmax = confusion_matrix.max() if len(confusion_matrix) > 0 else 1
100
100
  plt.clf()
101
101
  if not color_map:
102
- color_map = plt.cm.Blues
102
+ color_map = plt.cm.get_cmap("Blues")
103
103
  plt.imshow(
104
104
  confusion_matrix,
105
105
  interpolation="nearest",
rasa/utils/pypred.py ADDED
@@ -0,0 +1,45 @@
1
+ """Wrapper module for pypred that provides a fixed Predicate class.
2
+
3
+ This module should be used instead of importing directly from pypred.
4
+
5
+ This patch fixes an issue where pypred creates excessive logs of being unable
6
+ to write a file when run in an environment with no write access is given.
7
+
8
+ https://rasahq.atlassian.net/browse/ATO-1925
9
+
10
+ The solution is based on https://github.com/FreeCAD/FreeCAD/issues/6315
11
+ """
12
+
13
+ import logging
14
+ from typing import Any
15
+
16
+ import ply.yacc
17
+ import pypred.parser
18
+ from pypred import Predicate as OriginalPredicate # noqa: TID251
19
+
20
+ # Store the original yacc function
21
+ _original_yacc = ply.yacc.yacc
22
+
23
+ # Create a logger that suppresses warnings to avoid yacc table file version warnings
24
+ _yacc_logger = logging.getLogger("ply.yacc")
25
+ _yacc_logger.setLevel(logging.ERROR)
26
+
27
+
28
+ def patched_yacc(*args: Any, **kwargs: Any) -> Any:
29
+ # Disable generation of debug ('parser.out') and table
30
+ # cache ('parsetab.py'), as it requires a writable location.
31
+ kwargs["write_tables"] = False
32
+ kwargs["module"] = pypred.parser
33
+ # Suppress yacc warnings by using a logger that only shows errors
34
+ kwargs["errorlog"] = _yacc_logger
35
+ return _original_yacc(*args, **kwargs)
36
+
37
+
38
+ # Apply the patch
39
+ ply.yacc.yacc = patched_yacc
40
+
41
+
42
+ class Predicate(OriginalPredicate):
43
+ """Fixed version of pypred.Predicate that uses the patched yacc parser."""
44
+
45
+ pass
@@ -0,0 +1,7 @@
1
+ import importlib.util
2
+ import logging
3
+
4
+ logger = logging.getLogger(__name__)
5
+
6
+ # check if TensorFlow is available
7
+ TENSORFLOW_AVAILABLE = importlib.util.find_spec("tensorflow") is not None
@@ -2,111 +2,146 @@ import logging
2
2
  from pathlib import Path
3
3
  from typing import Any, Dict, Optional, Text
4
4
 
5
- import tensorflow as tf
6
- from tqdm import tqdm
5
+ from rasa.utils.tensorflow import TENSORFLOW_AVAILABLE
6
+
7
+ if TENSORFLOW_AVAILABLE:
8
+ import tensorflow as tf
9
+ from tqdm import tqdm
10
+ else:
11
+ # Placeholder values when TensorFlow is not available
12
+ tf = None
13
+ tqdm = None
7
14
 
8
15
  import rasa.shared.utils.io
9
16
 
10
17
  logger = logging.getLogger(__name__)
11
18
 
12
19
 
13
- class RasaTrainingLogger(tf.keras.callbacks.Callback):
14
- """Callback for logging the status of training."""
15
-
16
- def __init__(self, epochs: int, silent: bool) -> None:
17
- """Initializes the callback.
18
-
19
- Args:
20
- epochs: Total number of epochs.
21
- silent: If 'True' the entire progressbar wrapper is disabled.
22
- """
23
- super().__init__()
24
-
25
- disable = silent or rasa.shared.utils.io.is_logging_disabled()
26
- self.progress_bar = tqdm(range(epochs), desc="Epochs", disable=disable)
27
-
28
- def on_epoch_end(self, epoch: int, logs: Optional[Dict[Text, Any]] = None) -> None:
29
- """Updates the logging output on every epoch end.
30
-
31
- Args:
32
- epoch: The current epoch.
33
- logs: The training metrics.
34
- """
35
- self.progress_bar.update(1)
36
- self.progress_bar.set_postfix(logs)
37
-
38
- def on_train_end(self, logs: Optional[Dict[Text, Any]] = None) -> None:
39
- """Closes the progress bar after training.
40
-
41
- Args:
42
- logs: The training metrics.
43
- """
44
- self.progress_bar.close()
45
-
46
-
47
- class RasaModelCheckpoint(tf.keras.callbacks.Callback):
48
- """Callback for saving intermediate model checkpoints."""
49
-
50
- def __init__(self, checkpoint_dir: Path) -> None:
51
- """Initializes the callback.
52
-
53
- Args:
54
- checkpoint_dir: Directory to store checkpoints to.
55
- """
56
- super().__init__()
57
-
58
- self.checkpoint_file = checkpoint_dir / "checkpoint.tf_model"
59
- self.best_metrics_so_far: Dict[Text, Any] = {}
60
-
61
- def on_epoch_end(self, epoch: int, logs: Optional[Dict[Text, Any]] = None) -> None:
62
- """Save the model on epoch end if the model has improved.
63
-
64
- Args:
65
- epoch: The current epoch.
66
- logs: The training metrics.
67
- """
68
- if self._does_model_improve(logs):
69
- logger.debug(f"Creating model checkpoint at epoch={epoch + 1} ...")
70
- self.model.save_weights(
71
- self.checkpoint_file, overwrite=True, save_format="tf"
72
- )
73
-
74
- def _does_model_improve(self, curr_results: Dict[Text, Any]) -> bool:
75
- """Checks whether the current results are better than the best so far.
76
-
77
- Results are considered better if each metric is equal or better than the best so
78
- far, and at least one is better.
79
-
80
- Args:
81
- curr_results: The training metrics for this epoch.
82
- """
83
- curr_metric_names = [
84
- k
85
- for k in curr_results.keys()
86
- if k.startswith("val") and (k.endswith("_acc") or k.endswith("_f1"))
87
- ]
88
- # the "val" prefix is prepended to metrics in fit if _should_eval returns true
89
- # for this particular epoch
90
- if len(curr_metric_names) == 0:
91
- # the metrics are not validation metrics
92
- return False
93
- # initialize best_metrics_so_far with the first results
94
- if not self.best_metrics_so_far:
95
- for metric_name in curr_metric_names:
96
- self.best_metrics_so_far[metric_name] = float(curr_results[metric_name])
97
- return True
98
-
99
- at_least_one_improved = False
100
- improved_metrics = {}
101
- for metric_name in self.best_metrics_so_far.keys():
102
- if float(curr_results[metric_name]) < self.best_metrics_so_far[metric_name]:
103
- # at least one of the values is worse
20
+ if TENSORFLOW_AVAILABLE:
21
+
22
+ class RasaTrainingLogger(tf.keras.callbacks.Callback):
23
+ """Callback for logging the status of training."""
24
+
25
+ def __init__(self, epochs: int, silent: bool) -> None:
26
+ """Initializes the callback.
27
+
28
+ Args:
29
+ epochs: Total number of epochs.
30
+ silent: If 'True' the entire progressbar wrapper is disabled.
31
+ """
32
+ super().__init__()
33
+
34
+ disable = silent or rasa.shared.utils.io.is_logging_disabled()
35
+ self.progress_bar = tqdm(range(epochs), desc="Epochs", disable=disable)
36
+
37
+ def on_epoch_end(
38
+ self, epoch: int, logs: Optional[Dict[Text, Any]] = None
39
+ ) -> None:
40
+ """Updates the logging output on every epoch end.
41
+
42
+ Args:
43
+ epoch: The current epoch.
44
+ logs: The training metrics.
45
+ """
46
+ self.progress_bar.update(1)
47
+ self.progress_bar.set_postfix(logs)
48
+
49
+ def on_train_end(self, logs: Optional[Dict[Text, Any]] = None) -> None:
50
+ """Closes the progress bar after training.
51
+
52
+ Args:
53
+ logs: The training metrics.
54
+ """
55
+ self.progress_bar.close()
56
+
57
+ class RasaModelCheckpoint(tf.keras.callbacks.Callback):
58
+ """Callback for saving intermediate model checkpoints."""
59
+
60
+ def __init__(self, checkpoint_dir: Path) -> None:
61
+ """Initializes the callback.
62
+
63
+ Args:
64
+ checkpoint_dir: Directory to store checkpoints to.
65
+ """
66
+ super().__init__()
67
+
68
+ self.checkpoint_file = checkpoint_dir / "checkpoint.weights.h5"
69
+ self.best_metrics_so_far: Dict[Text, Any] = {}
70
+
71
+ def on_epoch_end(
72
+ self, epoch: int, logs: Optional[Dict[Text, Any]] = None
73
+ ) -> None:
74
+ """Save the model on epoch end if the model has improved.
75
+
76
+ Args:
77
+ epoch: The current epoch.
78
+ logs: The training metrics.
79
+ """
80
+ if self._does_model_improve(logs):
81
+ logger.debug(f"Creating model checkpoint at epoch={epoch + 1} ...")
82
+ # Ensure model is built before saving weights
83
+ if not self.model.built:
84
+ # Build the model with dummy data to ensure it's built
85
+ import tensorflow as tf
86
+
87
+ dummy_input = tf.zeros((1, 1))
88
+ _ = self.model(dummy_input)
89
+
90
+ # Ensure the directory exists before saving
91
+ import os
92
+
93
+ os.makedirs(os.path.dirname(self.checkpoint_file), exist_ok=True)
94
+ self.model.save_weights(self.checkpoint_file, overwrite=True)
95
+
96
+ def _does_model_improve(self, curr_results: Dict[Text, Any]) -> bool:
97
+ """Checks whether the current results are better than the best so far.
98
+
99
+ Results are considered better if each metric is
100
+ equal or better than the best so far, and at least one is better.
101
+
102
+ Args:
103
+ curr_results: The training metrics for this epoch.
104
+ """
105
+ curr_metric_names = [
106
+ k
107
+ for k in curr_results.keys()
108
+ if k.startswith("val") and (k.endswith("_acc") or k.endswith("_f1"))
109
+ ]
110
+ # the "val" prefix is prepended to metrics in fit
111
+ # if _should_eval returns true
112
+ # for this particular epoch
113
+ if len(curr_metric_names) == 0:
114
+ # the metrics are not validation metrics
104
115
  return False
105
- if float(curr_results[metric_name]) > self.best_metrics_so_far[metric_name]:
106
- at_least_one_improved = True
107
- improved_metrics[metric_name] = float(curr_results[metric_name])
108
-
109
- # all current values >= previous best and at least one is better
110
- if at_least_one_improved:
111
- self.best_metrics_so_far.update(improved_metrics)
112
- return at_least_one_improved
116
+ # initialize best_metrics_so_far with the first results
117
+ if not self.best_metrics_so_far:
118
+ for metric_name in curr_metric_names:
119
+ self.best_metrics_so_far[metric_name] = float(
120
+ curr_results[metric_name]
121
+ )
122
+ return True
123
+
124
+ at_least_one_improved = False
125
+ improved_metrics = {}
126
+ for metric_name in self.best_metrics_so_far.keys():
127
+ if (
128
+ float(curr_results[metric_name])
129
+ < self.best_metrics_so_far[metric_name]
130
+ ):
131
+ # at least one of the values is worse
132
+ return False
133
+ if (
134
+ float(curr_results[metric_name])
135
+ > self.best_metrics_so_far[metric_name]
136
+ ):
137
+ at_least_one_improved = True
138
+ improved_metrics[metric_name] = float(curr_results[metric_name])
139
+
140
+ # all current values >= previous best and at least one is better
141
+ if at_least_one_improved:
142
+ self.best_metrics_so_far.update(improved_metrics)
143
+ return at_least_one_improved
144
+ else:
145
+ # Placeholder classes when TensorFlow is not available
146
+ RasaTrainingLogger = None # type: ignore
147
+ RasaModelCheckpoint = None # type: ignore
@@ -9,7 +9,7 @@ from tensorflow.types.experimental import TensorLike
9
9
  # (modified to our neeeds)
10
10
 
11
11
 
12
- class CrfDecodeForwardRnnCell(tf.keras.layers.AbstractRNNCell):
12
+ class CrfDecodeForwardRnnCell(tf.keras.layers.Layer):
13
13
  """Computes the forward decoding in a linear-chain CRF."""
14
14
 
15
15
  def __init__(self, transition_params: TensorLike, **kwargs: Any) -> None: