rasa-pro 3.14.0.dev7__py3-none-any.whl → 3.14.0.dev8__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 (471) hide show
  1. rasa/agents/agent_manager.py +1 -1
  2. rasa/agents/constants.py +2 -2
  3. rasa/agents/protocol/a2a/a2a_agent.py +385 -227
  4. rasa/agents/protocol/mcp/mcp_base_agent.py +30 -13
  5. rasa/agents/protocol/mcp/mcp_open_agent.py +31 -8
  6. rasa/agents/protocol/mcp/mcp_task_agent.py +32 -9
  7. rasa/agents/schemas/agent_output.py +1 -1
  8. rasa/agents/utils.py +90 -1
  9. rasa/builder/README.md +120 -0
  10. rasa/builder/__init__.py +0 -0
  11. rasa/builder/auth.py +176 -0
  12. rasa/builder/config.py +92 -0
  13. rasa/builder/copilot/__init__.py +0 -0
  14. rasa/builder/copilot/constants.py +31 -0
  15. rasa/builder/copilot/copilot.py +450 -0
  16. rasa/builder/copilot/copilot_response_handler.py +522 -0
  17. rasa/builder/copilot/copilot_templated_message_provider.py +58 -0
  18. rasa/builder/copilot/exceptions.py +32 -0
  19. rasa/builder/copilot/models.py +500 -0
  20. rasa/builder/copilot/prompts/__init__.py +0 -0
  21. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +766 -0
  22. rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +61 -0
  23. rasa/builder/copilot/signing.py +305 -0
  24. rasa/builder/copilot/telemetry.py +210 -0
  25. rasa/builder/copilot/templated_messages/__init__.py +0 -0
  26. rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +16 -0
  27. rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +38 -0
  28. rasa/builder/document_retrieval/__init__.py +0 -0
  29. rasa/builder/document_retrieval/constants.py +15 -0
  30. rasa/builder/document_retrieval/inkeep-rag-response-schema.json +64 -0
  31. rasa/builder/document_retrieval/inkeep_document_retrieval.py +238 -0
  32. rasa/builder/document_retrieval/models.py +62 -0
  33. rasa/builder/download.py +140 -0
  34. rasa/builder/exceptions.py +91 -0
  35. rasa/builder/guardrails/__init__.py +1 -0
  36. rasa/builder/guardrails/constants.py +9 -0
  37. rasa/builder/guardrails/exceptions.py +4 -0
  38. rasa/builder/guardrails/lakera.py +206 -0
  39. rasa/builder/guardrails/models.py +231 -0
  40. rasa/builder/guardrails/store.py +238 -0
  41. rasa/builder/guardrails/utils.py +328 -0
  42. rasa/builder/job_manager.py +87 -0
  43. rasa/builder/jobs.py +282 -0
  44. rasa/builder/llm_service.py +246 -0
  45. rasa/builder/logging_utils.py +265 -0
  46. rasa/builder/main.py +243 -0
  47. rasa/builder/models.py +216 -0
  48. rasa/builder/project_generator.py +458 -0
  49. rasa/builder/project_info.py +72 -0
  50. rasa/builder/scrape_rasa_docs.py +97 -0
  51. rasa/builder/service.py +1345 -0
  52. rasa/builder/shared/tracker_context.py +212 -0
  53. rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
  54. rasa/builder/template_cache.py +244 -0
  55. rasa/builder/training_service.py +194 -0
  56. rasa/builder/validation_service.py +97 -0
  57. rasa/cli/project_templates/basic/README.md +23 -0
  58. rasa/cli/project_templates/basic/actions/__init__ +0 -0
  59. rasa/cli/project_templates/basic/actions/action_human_handoff.py +40 -0
  60. rasa/cli/project_templates/basic/actions/actions.md +10 -0
  61. rasa/cli/project_templates/basic/config.yml +29 -0
  62. rasa/cli/project_templates/basic/credentials.yml +33 -0
  63. rasa/cli/project_templates/basic/data/data.md +9 -0
  64. rasa/cli/project_templates/basic/data/general/feedback.yml +21 -0
  65. rasa/cli/project_templates/basic/data/general/goodbye.yml +6 -0
  66. rasa/cli/project_templates/basic/data/general/hello.yml +6 -0
  67. rasa/cli/project_templates/basic/data/general/help.yml +6 -0
  68. rasa/cli/project_templates/basic/data/general/human_handoff.yml +16 -0
  69. rasa/cli/project_templates/basic/data/general/show_faqs.yml +6 -0
  70. rasa/cli/project_templates/basic/data/system/patterns/pattern_cannot_handle.yml +7 -0
  71. rasa/cli/project_templates/basic/data/system/patterns/pattern_completed.yml +7 -0
  72. rasa/cli/project_templates/basic/data/system/patterns/pattern_correction.yml +7 -0
  73. rasa/cli/project_templates/basic/data/system/patterns/pattern_search.yml +8 -0
  74. rasa/cli/project_templates/basic/data/system/patterns/pattern_session_start.yml +8 -0
  75. rasa/cli/project_templates/basic/docs/docs.md +5 -0
  76. rasa/cli/project_templates/basic/docs/template.txt +28 -0
  77. rasa/cli/project_templates/basic/domain/domain.md +8 -0
  78. rasa/cli/project_templates/basic/domain/general/feedback.yml +25 -0
  79. rasa/cli/project_templates/basic/domain/general/goodbye.yml +9 -0
  80. rasa/cli/project_templates/basic/domain/general/hello.yml +7 -0
  81. rasa/cli/project_templates/basic/domain/general/help.yml +21 -0
  82. rasa/cli/project_templates/basic/domain/general/human_handoff.yml +32 -0
  83. rasa/cli/project_templates/basic/domain/general/show_faqs.yml +14 -0
  84. rasa/cli/project_templates/basic/domain/system/patterns/pattern_cannot_handle.yml +5 -0
  85. rasa/cli/project_templates/basic/domain/system/patterns/pattern_session_start.yml +19 -0
  86. rasa/cli/project_templates/basic/endpoints.yml +67 -0
  87. rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
  88. rasa/cli/project_templates/default/config.yml +4 -0
  89. rasa/cli/project_templates/default/endpoints.yml +4 -0
  90. rasa/cli/project_templates/finance/README.md +25 -0
  91. rasa/cli/project_templates/finance/actions/__init__.py +46 -0
  92. rasa/cli/project_templates/finance/actions/accounts/__init__.py +0 -0
  93. rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +47 -0
  94. rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +40 -0
  95. rasa/cli/project_templates/finance/actions/action_session_start.py +74 -0
  96. rasa/cli/project_templates/finance/actions/actions.md +15 -0
  97. rasa/cli/project_templates/finance/actions/cards/__init__.py +0 -0
  98. rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +48 -0
  99. rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +36 -0
  100. rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +54 -0
  101. rasa/cli/project_templates/finance/actions/database.py +277 -0
  102. rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
  103. rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +52 -0
  104. rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +51 -0
  105. rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +40 -0
  106. rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +40 -0
  107. rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +46 -0
  108. rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +18 -0
  109. rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +49 -0
  110. rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +19 -0
  111. rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +36 -0
  112. rasa/cli/project_templates/finance/config.yml +23 -0
  113. rasa/cli/project_templates/finance/credentials.yml +32 -0
  114. rasa/cli/project_templates/finance/csvs/accounts.csv +8 -0
  115. rasa/cli/project_templates/finance/csvs/advisors.csv +7 -0
  116. rasa/cli/project_templates/finance/csvs/appointments.csv +211 -0
  117. rasa/cli/project_templates/finance/csvs/branches.csv +10 -0
  118. rasa/cli/project_templates/finance/csvs/cards.csv +11 -0
  119. rasa/cli/project_templates/finance/csvs/payees.csv +11 -0
  120. rasa/cli/project_templates/finance/csvs/transactions.csv +71 -0
  121. rasa/cli/project_templates/finance/csvs/users.csv +4 -0
  122. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +10 -0
  123. rasa/cli/project_templates/finance/data/cards/block_card.yml +66 -0
  124. rasa/cli/project_templates/finance/data/cards/select_card.yml +12 -0
  125. rasa/cli/project_templates/finance/data/data.md +11 -0
  126. rasa/cli/project_templates/finance/data/general/bot_identity.yml +6 -0
  127. rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
  128. rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
  129. rasa/cli/project_templates/finance/data/general/hello.yml +7 -0
  130. rasa/cli/project_templates/finance/data/general/help.yml +9 -0
  131. rasa/cli/project_templates/finance/data/general/human_handoff.yml +16 -0
  132. rasa/cli/project_templates/finance/data/general/welcome.yml +9 -0
  133. rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +5 -0
  134. rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +7 -0
  135. rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +7 -0
  136. rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +8 -0
  137. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +8 -0
  138. rasa/cli/project_templates/finance/data/system/source/accounts.json +51 -0
  139. rasa/cli/project_templates/finance/data/system/source/advisors.json +44 -0
  140. rasa/cli/project_templates/finance/data/system/source/appointments.json +1474 -0
  141. rasa/cli/project_templates/finance/data/system/source/branches.json +47 -0
  142. rasa/cli/project_templates/finance/data/system/source/cards.json +72 -0
  143. rasa/cli/project_templates/finance/data/system/source/payees.json +74 -0
  144. rasa/cli/project_templates/finance/data/system/source/transactions.json +492 -0
  145. rasa/cli/project_templates/finance/data/system/source/users.json +29 -0
  146. rasa/cli/project_templates/finance/data/transfers/add_payee.yml +29 -0
  147. rasa/cli/project_templates/finance/data/transfers/list_payees.yml +5 -0
  148. rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +21 -0
  149. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +67 -0
  150. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +8 -0
  151. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +8 -0
  152. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +8 -0
  153. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +8 -0
  154. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +8 -0
  155. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +7 -0
  156. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +8 -0
  157. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +8 -0
  158. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +8 -0
  159. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +8 -0
  160. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +8 -0
  161. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +8 -0
  162. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +8 -0
  163. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +8 -0
  164. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +8 -0
  165. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +8 -0
  166. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +8 -0
  167. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +8 -0
  168. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +8 -0
  169. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +8 -0
  170. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +50 -0
  171. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +50 -0
  172. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +48 -0
  173. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +50 -0
  174. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +50 -0
  175. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +47 -0
  176. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +50 -0
  177. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +50 -0
  178. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +47 -0
  179. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +50 -0
  180. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +50 -0
  181. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +50 -0
  182. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +47 -0
  183. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +50 -0
  184. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +50 -0
  185. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +47 -0
  186. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +50 -0
  187. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +50 -0
  188. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +47 -0
  189. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +50 -0
  190. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +50 -0
  191. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +47 -0
  192. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +47 -0
  193. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +50 -0
  194. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +50 -0
  195. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +47 -0
  196. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +50 -0
  197. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +50 -0
  198. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +47 -0
  199. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +50 -0
  200. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +50 -0
  201. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +47 -0
  202. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +50 -0
  203. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +50 -0
  204. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +50 -0
  205. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +47 -0
  206. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +50 -0
  207. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +50 -0
  208. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +47 -0
  209. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +50 -0
  210. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +50 -0
  211. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +47 -0
  212. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +50 -0
  213. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +50 -0
  214. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +50 -0
  215. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +47 -0
  216. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +50 -0
  217. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +50 -0
  218. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +47 -0
  219. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +50 -0
  220. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +50 -0
  221. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +47 -0
  222. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +50 -0
  223. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +50 -0
  224. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +47 -0
  225. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +47 -0
  226. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +50 -0
  227. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +50 -0
  228. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +50 -0
  229. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +50 -0
  230. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +47 -0
  231. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +11 -0
  232. rasa/cli/project_templates/finance/domain/cards/block_card.yml +101 -0
  233. rasa/cli/project_templates/finance/domain/cards/select_card.yml +12 -0
  234. rasa/cli/project_templates/finance/domain/domain.md +10 -0
  235. rasa/cli/project_templates/finance/domain/general/agent_details.yml +12 -0
  236. rasa/cli/project_templates/finance/domain/general/bot_identity.yml +5 -0
  237. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +5 -0
  238. rasa/cli/project_templates/finance/domain/general/defaults.yml +24 -0
  239. rasa/cli/project_templates/finance/domain/general/feedback.yml +28 -0
  240. rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
  241. rasa/cli/project_templates/finance/domain/general/help.yml +5 -0
  242. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +30 -0
  243. rasa/cli/project_templates/finance/domain/general/utils.yml +13 -0
  244. rasa/cli/project_templates/finance/domain/general/welcome.yml +8 -0
  245. rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +47 -0
  246. rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +4 -0
  247. rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +16 -0
  248. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +79 -0
  249. rasa/cli/project_templates/finance/endpoints.yml +66 -0
  250. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +19 -0
  251. rasa/cli/project_templates/telco/README.md +25 -0
  252. rasa/cli/project_templates/telco/actions/__init__.py +0 -0
  253. rasa/cli/project_templates/telco/actions/actions.md +12 -0
  254. rasa/cli/project_templates/telco/actions/billing/__init__.py +0 -0
  255. rasa/cli/project_templates/telco/actions/billing/actions_billing.py +204 -0
  256. rasa/cli/project_templates/telco/actions/general/__init__.py +0 -0
  257. rasa/cli/project_templates/telco/actions/general/action_human_handoff.py +49 -0
  258. rasa/cli/project_templates/telco/actions/network/__init__.py +0 -0
  259. rasa/cli/project_templates/telco/actions/network/actions_get_data_from_db.py +48 -0
  260. rasa/cli/project_templates/telco/actions/network/actions_run_diagnostics.py +28 -0
  261. rasa/cli/project_templates/telco/actions/network/actions_session_start.py +18 -0
  262. rasa/cli/project_templates/telco/config.yml +29 -0
  263. rasa/cli/project_templates/telco/credentials.yml +33 -0
  264. rasa/cli/project_templates/telco/csvs/billing.csv +19 -0
  265. rasa/cli/project_templates/telco/csvs/customers.csv +5 -0
  266. rasa/cli/project_templates/telco/data/billing/flow_understand_bill.yml +45 -0
  267. rasa/cli/project_templates/telco/data/data.md +11 -0
  268. rasa/cli/project_templates/telco/data/general/bot_challenge.yml +6 -0
  269. rasa/cli/project_templates/telco/data/general/feedback.yml +20 -0
  270. rasa/cli/project_templates/telco/data/general/goodbye.yml +6 -0
  271. rasa/cli/project_templates/telco/data/general/hello.yml +6 -0
  272. rasa/cli/project_templates/telco/data/general/human_handoff.yml +16 -0
  273. rasa/cli/project_templates/telco/data/general/patterns.yml +30 -0
  274. rasa/cli/project_templates/telco/data/network/flow_reboot_router.yml +8 -0
  275. rasa/cli/project_templates/telco/data/network/flow_reset_router.yml +7 -0
  276. rasa/cli/project_templates/telco/data/network/flow_solve_internet_issue.yml +73 -0
  277. rasa/cli/project_templates/telco/docs/docs.md +5 -0
  278. rasa/cli/project_templates/telco/docs/network/reset_vs_rboot_router.txt +1 -0
  279. rasa/cli/project_templates/telco/docs/network/restart_router.txt +6 -0
  280. rasa/cli/project_templates/telco/docs/network/run_speed_test.txt +6 -0
  281. rasa/cli/project_templates/telco/domain/billing/understand_bill.yml +102 -0
  282. rasa/cli/project_templates/telco/domain/domain.md +14 -0
  283. rasa/cli/project_templates/telco/domain/general/bot_challenge.yml +4 -0
  284. rasa/cli/project_templates/telco/domain/general/feedback.yml +25 -0
  285. rasa/cli/project_templates/telco/domain/general/goodbye.yml +7 -0
  286. rasa/cli/project_templates/telco/domain/general/hello.yml +5 -0
  287. rasa/cli/project_templates/telco/domain/general/human_handoff.yml +26 -0
  288. rasa/cli/project_templates/telco/domain/general/patterns.yml +33 -0
  289. rasa/cli/project_templates/telco/domain/network/reboot_router.yml +21 -0
  290. rasa/cli/project_templates/telco/domain/network/reset_router.yml +12 -0
  291. rasa/cli/project_templates/telco/domain/network/run_speed_test.yml +25 -0
  292. rasa/cli/project_templates/telco/domain/network/solve_internet_issue.yml +75 -0
  293. rasa/cli/project_templates/telco/domain/shared.yml +129 -0
  294. rasa/cli/project_templates/telco/endpoints.yml +67 -0
  295. rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +40 -0
  296. rasa/cli/project_templates/telco/tests/e2e_test_cases/billing/understand_bill.yml +67 -0
  297. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
  298. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/feedback.yml +46 -0
  299. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/goodbye.yml +9 -0
  300. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/hello.yml +8 -0
  301. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/human_handoff.yml +35 -0
  302. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/patterns.yml +23 -0
  303. rasa/cli/project_templates/telco/tests/e2e_test_cases/network/solve_internet_issue.yml +57 -0
  304. rasa/cli/project_templates/tutorial/config.yml +2 -1
  305. rasa/cli/scaffold.py +46 -2
  306. rasa/core/actions/action.py +0 -1
  307. rasa/core/available_agents.py +2 -0
  308. rasa/core/available_endpoints.py +17 -2
  309. rasa/core/channels/channel.py +4 -3
  310. rasa/core/channels/constants.py +3 -0
  311. rasa/core/channels/development_inspector.py +2 -22
  312. rasa/core/channels/inspector/README.md +26 -14
  313. rasa/core/channels/inspector/dist/assets/{arc-cce7e0a8.js → arc-edef10dd.js} +1 -1
  314. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-e2a49be7.js → blockDiagram-38ab4fdb-49f6762b.js} +1 -1
  315. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-3def7895.js → c4Diagram-3d4e48cf-313c08e6.js} +1 -1
  316. rasa/core/channels/inspector/dist/assets/channel-63aa27d1.js +1 -0
  317. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-e66fe4df.js → classDiagram-70f12bd4-35e41ce9.js} +1 -1
  318. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-eb874aaa.js → classDiagram-v2-f2320105-f346068d.js} +1 -1
  319. rasa/core/channels/inspector/dist/assets/clone-5566bae8.js +1 -0
  320. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-cf934643.js → createText-2e5e7dd3-7a44bce8.js} +1 -1
  321. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-8fdf9155.js → edges-e0da2a9e-d7cf78c7.js} +1 -1
  322. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-6106fb96.js → erDiagram-9861fffd-9813e81c.js} +1 -1
  323. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-4c2bb040.js → flowDb-956e92f1-d8ba0870.js} +1 -1
  324. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-f0ff96af.js → flowDiagram-66a62f08-51f0db4d.js} +1 -1
  325. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-32936074.js +1 -0
  326. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-a21707ec.js → flowchart-elk-definition-4a651766-ff9ea384.js} +1 -1
  327. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-c165acb1.js → ganttDiagram-c361ad54-a8e13b6b.js} +1 -1
  328. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-b0564cf1.js → gitGraphDiagram-72cf32ee-3b171c6d.js} +1 -1
  329. rasa/core/channels/inspector/dist/assets/{graph-e557e67a.js → graph-790ef78b.js} +1 -1
  330. rasa/core/channels/inspector/dist/assets/{index-3862675e-1ce60e9e.js → index-3862675e-ecdce073.js} +1 -1
  331. rasa/core/channels/inspector/dist/assets/index-d705da80.js +1352 -0
  332. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-893569e2.js → infoDiagram-f8f76790-f5a422fe.js} +1 -1
  333. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-c29c864f.js → journeyDiagram-49397b02-3185b7ac.js} +1 -1
  334. rasa/core/channels/inspector/dist/assets/{layout-649a5eae.js → layout-837fd3aa.js} +1 -1
  335. rasa/core/channels/inspector/dist/assets/{line-0e5685ed.js → line-7e05afcb.js} +1 -1
  336. rasa/core/channels/inspector/dist/assets/{linear-eaa320bd.js → linear-162eb295.js} +1 -1
  337. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-f35df9e6.js → mindmap-definition-fc14e90a-f4978aee.js} +1 -1
  338. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-78339e96.js → pieDiagram-8a3498a8-b25d0a52.js} +1 -1
  339. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-9b5f2f14.js → quadrantDiagram-120e2f19-63db1afa.js} +1 -1
  340. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-d05ddb3a.js → requirementDiagram-deff3bca-1b486cc9.js} +1 -1
  341. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-d9be5dfd.js → sankeyDiagram-04a897e0-7e795291.js} +1 -1
  342. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-0f1c4348.js → sequenceDiagram-704730f1-b8aba159.js} +1 -1
  343. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-9ddf63b3.js → stateDiagram-587899a1-41529fd5.js} +1 -1
  344. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-bc2b81ed.js → stateDiagram-v2-d93cdb3a-b241043c.js} +1 -1
  345. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-0a287936.js → styles-6aaf32cf-b5b53234.js} +1 -1
  346. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-e3941990.js → styles-9a916d00-13d138e5.js} +1 -1
  347. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-ce4eca24.js → styles-c10674c1-94cbde3f.js} +1 -1
  348. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-d822b1a8.js → svgDrawCommon-08f97a94-453ae764.js} +1 -1
  349. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-e144c7a7.js → timeline-definition-85554ec2-8dcb88a4.js} +1 -1
  350. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-ab7f4e14.js → xychartDiagram-e933f94c-376af5f0.js} +1 -1
  351. rasa/core/channels/inspector/dist/index.html +2 -2
  352. rasa/core/channels/inspector/index.html +1 -1
  353. rasa/core/channels/inspector/src/App.tsx +16 -42
  354. rasa/core/channels/inspector/src/components/Chat.tsx +2 -3
  355. rasa/core/channels/inspector/src/components/DialogueHistoryStack.tsx +1 -0
  356. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +20 -3
  357. rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +63 -35
  358. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +14 -0
  359. rasa/core/channels/inspector/src/types.ts +32 -7
  360. rasa/core/channels/socketio.py +212 -51
  361. rasa/core/channels/studio_chat.py +59 -57
  362. rasa/core/channels/voice_stream/asr/asr_event.py +1 -1
  363. rasa/core/channels/voice_stream/asr/azure.py +6 -3
  364. rasa/core/channels/voice_stream/asr/deepgram.py +1 -1
  365. rasa/core/channels/voice_stream/audiocodes.py +3 -0
  366. rasa/core/channels/voice_stream/browser_audio.py +53 -3
  367. rasa/core/channels/voice_stream/genesys.py +2 -1
  368. rasa/core/channels/voice_stream/jambonz.py +9 -1
  369. rasa/core/channels/voice_stream/twilio_media_streams.py +16 -0
  370. rasa/core/channels/voice_stream/voice_channel.py +66 -3
  371. rasa/core/constants.py +6 -0
  372. rasa/core/iam_credentials_providers/__init__.py +0 -0
  373. rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +66 -0
  374. rasa/core/iam_credentials_providers/credentials_provider_protocol.py +89 -0
  375. rasa/core/policies/enterprise_search_policy.py +4 -7
  376. rasa/core/policies/flows/flow_executor.py +14 -5
  377. rasa/core/policies/ted_policy.py +7 -5
  378. rasa/core/processor.py +32 -0
  379. rasa/core/redis_connection_factory.py +411 -0
  380. rasa/core/run.py +13 -3
  381. rasa/core/tracker_stores/redis_tracker_store.py +32 -14
  382. rasa/core/tracker_stores/sql_tracker_store.py +57 -1
  383. rasa/dialogue_understanding/generator/flow_retrieval.py +10 -9
  384. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +10 -5
  385. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +10 -5
  386. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +20 -12
  387. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +19 -12
  388. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +6 -35
  389. rasa/dialogue_understanding/patterns/cancel.py +27 -6
  390. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +1 -1
  391. rasa/dialogue_understanding/processor/command_processor.py +35 -0
  392. rasa/engine/graph.py +5 -1
  393. rasa/engine/recipes/default_components.py +78 -10
  394. rasa/engine/recipes/default_recipe.py +41 -1
  395. rasa/engine/storage/local_model_storage.py +83 -3
  396. rasa/graph_components/validators/default_recipe_validator.py +153 -135
  397. rasa/model_manager/model_api.py +4 -5
  398. rasa/model_manager/runner_service.py +1 -1
  399. rasa/model_manager/socket_bridge.py +20 -15
  400. rasa/model_manager/trainer_service.py +12 -9
  401. rasa/model_manager/utils.py +1 -29
  402. rasa/model_manager/warm_rasa_process.py +1 -1
  403. rasa/model_training.py +14 -0
  404. rasa/nlu/classifiers/diet_classifier.py +22 -6
  405. rasa/nlu/classifiers/logistic_regression_classifier.py +18 -0
  406. rasa/nlu/extractors/extractor.py +1 -2
  407. rasa/shared/agents/auth/__init__.py +0 -0
  408. rasa/shared/agents/auth/agent_auth_factory.py +74 -0
  409. rasa/shared/agents/auth/agent_auth_manager.py +86 -0
  410. rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
  411. rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
  412. rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
  413. rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
  414. rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +159 -0
  415. rasa/shared/agents/auth/constants.py +11 -0
  416. rasa/shared/agents/auth/types.py +11 -0
  417. rasa/shared/core/constants.py +1 -0
  418. rasa/shared/core/domain.py +58 -11
  419. rasa/shared/core/events.py +2 -0
  420. rasa/shared/core/flows/constants.py +5 -0
  421. rasa/shared/core/flows/flow_step.py +7 -1
  422. rasa/shared/core/flows/flows_list.py +6 -0
  423. rasa/shared/core/flows/steps/call.py +15 -12
  424. rasa/shared/core/flows/validation.py +238 -44
  425. rasa/shared/core/flows/yaml_flows_io.py +15 -6
  426. rasa/shared/core/slots.py +4 -0
  427. rasa/shared/exceptions.py +12 -0
  428. rasa/shared/importers/importer.py +6 -0
  429. rasa/shared/importers/utils.py +77 -1
  430. rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
  431. rasa/shared/providers/_utils.py +60 -44
  432. rasa/shared/providers/embedding/default_litellm_embedding_client.py +2 -0
  433. rasa/shared/providers/llm/_base_litellm_client.py +2 -2
  434. rasa/shared/providers/llm/default_litellm_llm_client.py +2 -0
  435. rasa/shared/providers/llm/llm_response.py +4 -4
  436. rasa/shared/utils/common.py +24 -0
  437. rasa/shared/utils/llm.py +2 -1
  438. rasa/shared/utils/mcp/server_connection.py +84 -23
  439. rasa/shared/utils/mcp/utils.py +20 -0
  440. rasa/studio/upload.py +16 -47
  441. rasa/telemetry.py +97 -23
  442. rasa/tracing/config.py +38 -12
  443. rasa/tracing/instrumentation/attribute_extractors.py +5 -1
  444. rasa/tracing/instrumentation/instrumentation.py +85 -8
  445. rasa/utils/common.py +1 -1
  446. rasa/utils/io.py +27 -9
  447. rasa/utils/json_utils.py +6 -1
  448. rasa/utils/log_utils.py +5 -1
  449. rasa/utils/openapi.py +144 -0
  450. rasa/utils/tensorflow/__init__.py +29 -0
  451. rasa/utils/tensorflow/callback.py +1 -1
  452. rasa/utils/tensorflow/crf.py +1 -1
  453. rasa/utils/tensorflow/data_generator.py +21 -8
  454. rasa/utils/tensorflow/layers.py +11 -4
  455. rasa/utils/tensorflow/metrics.py +7 -3
  456. rasa/utils/tensorflow/models.py +41 -6
  457. rasa/utils/tensorflow/rasa_layers.py +6 -4
  458. rasa/utils/tensorflow/transformer.py +2 -3
  459. rasa/utils/train_utils.py +68 -38
  460. rasa/validator.py +18 -16
  461. rasa/version.py +1 -1
  462. rasa_pro-3.14.0.dev8.dist-info/METADATA +199 -0
  463. {rasa_pro-3.14.0.dev7.dist-info → rasa_pro-3.14.0.dev8.dist-info}/RECORD +466 -156
  464. rasa/core/channels/inspector/dist/assets/channel-858c2c20.js +0 -1
  465. rasa/core/channels/inspector/dist/assets/clone-4b80996c.js +0 -1
  466. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-16f09b7a.js +0 -1
  467. rasa/core/channels/inspector/dist/assets/index-996fe816.js +0 -1353
  468. rasa_pro-3.14.0.dev7.dist-info/METADATA +0 -190
  469. {rasa_pro-3.14.0.dev7.dist-info → rasa_pro-3.14.0.dev8.dist-info}/NOTICE +0 -0
  470. {rasa_pro-3.14.0.dev7.dist-info → rasa_pro-3.14.0.dev8.dist-info}/WHEEL +0 -0
  471. {rasa_pro-3.14.0.dev7.dist-info → rasa_pro-3.14.0.dev8.dist-info}/entry_points.txt +0 -0
rasa/model_training.py CHANGED
@@ -201,6 +201,20 @@ async def train(
201
201
  config, domain, training_files, core_additional_arguments
202
202
  )
203
203
 
204
+ # Check TensorFlow availability and warn if not available
205
+ import importlib.util
206
+
207
+ if importlib.util.find_spec("tensorflow") is None:
208
+ structlogger.warning(
209
+ "model_training.train.tensorflow_not_available",
210
+ event_info=(
211
+ "TensorFlow is not installed. Components requiring TensorFlow "
212
+ "(DIETClassifier, TEDPolicy, UnexpecTEDIntentPolicy, ResponseSelector, "
213
+ "ConveRTFeaturizer, LanguageModelFeaturizer) "
214
+ "will not be available."
215
+ ),
216
+ )
217
+
204
218
  stories = file_importer.get_stories()
205
219
  flows = file_importer.get_flows()
206
220
  nlu_data = file_importer.get_nlu_data()
@@ -1070,12 +1070,14 @@ class DIETClassifier(GraphComponent, IntentClassifier, EntityExtractorMixin):
1070
1070
 
1071
1071
  with self._model_storage.write_to(self._resource) as model_path:
1072
1072
  file_name = self.__class__.__name__
1073
- tf_model_file = model_path / f"{file_name}.tf_model"
1073
+ tf_model_file = model_path / f"{file_name}.weights.h5"
1074
1074
 
1075
1075
  rasa.shared.utils.io.create_directory_for_file(tf_model_file)
1076
1076
 
1077
1077
  if self.component_config[CHECKPOINT_MODEL] and self.tmp_checkpoint_dir:
1078
- self.model.load_weights(self.tmp_checkpoint_dir / "checkpoint.tf_model")
1078
+ self.model.load_weights(
1079
+ self.tmp_checkpoint_dir / "checkpoint.weights.h5"
1080
+ )
1079
1081
  # Save an empty file to flag that this model has been
1080
1082
  # produced using checkpointing
1081
1083
  checkpoint_marker = model_path / f"{file_name}.from_checkpoint.pkl"
@@ -1247,7 +1249,7 @@ class DIETClassifier(GraphComponent, IntentClassifier, EntityExtractorMixin):
1247
1249
  finetune_mode: bool = False,
1248
1250
  ) -> "RasaModel":
1249
1251
  file_name = cls.__name__
1250
- tf_model_file = model_path / f"{file_name}.tf_model"
1252
+ tf_model_file = model_path / f"{file_name}.weights.h5"
1251
1253
 
1252
1254
  label_key = LABEL_KEY if config[INTENT_CLASSIFICATION] else None
1253
1255
  label_sub_key = LABEL_SUB_KEY if config[INTENT_CLASSIFICATION] else None
@@ -1527,7 +1529,7 @@ class DIET(TransformerRasaModel):
1527
1529
  # convert to bag-of-words by summing along the sequence dimension
1528
1530
  x = tf.reduce_sum(x, axis=1)
1529
1531
 
1530
- return self._tf_layers[f"ffnn.{name}"](x, self._training)
1532
+ return self._tf_layers[f"ffnn.{name}"](x, training=self._training)
1531
1533
 
1532
1534
  def _create_all_labels(self) -> Tuple[tf.Tensor, tf.Tensor]:
1533
1535
  all_label_ids = self.tf_label_data[LABEL_KEY][LABEL_SUB_KEY][0]
@@ -1536,9 +1538,23 @@ class DIET(TransformerRasaModel):
1536
1538
  self.tf_label_data, LABEL
1537
1539
  )
1538
1540
 
1541
+ # Check if SENTENCE features exist, if not use None
1542
+ # This is needed for compatibility with tensorFlow=2.19.1, which
1543
+ # has a transitive dependency on keras=3.11.3, which introduces
1544
+ # stricter data validation
1545
+ sentence_features = None
1546
+ if SENTENCE in self.tf_label_data[LABEL]:
1547
+ sentence_features = self.tf_label_data[LABEL][SENTENCE]
1548
+
1549
+ # Handle missing SEQUENCE features for Keras 3+ compatibility,
1550
+ # which introduces stricter data validation
1551
+ sequence_features = None
1552
+ if SEQUENCE in self.tf_label_data[LABEL]:
1553
+ sequence_features = self.tf_label_data[LABEL][SEQUENCE]
1554
+
1539
1555
  x = self._create_bow(
1540
- self.tf_label_data[LABEL][SEQUENCE],
1541
- self.tf_label_data[LABEL][SENTENCE],
1556
+ sequence_features,
1557
+ sentence_features,
1542
1558
  sequence_feature_lengths,
1543
1559
  self.label_name,
1544
1560
  )
@@ -21,6 +21,21 @@ from rasa.utils.tensorflow.constants import RANKING_LENGTH
21
21
  structlogger = structlog.get_logger()
22
22
 
23
23
 
24
+ def _check_skops_dependency() -> None:
25
+ """Check if skops is available and raise error if not."""
26
+ import importlib.util
27
+
28
+ if importlib.util.find_spec("skops") is None:
29
+ from rasa.exceptions import MissingDependencyException
30
+
31
+ raise MissingDependencyException(
32
+ "The LogisticRegressionClassifier requires the 'skops' package "
33
+ "to save and load trained models. "
34
+ "To install it, run: `pip install rasa[skops]` or `pip install skops`. "
35
+ "If using poetry, run `poetry install --extras skops`. "
36
+ )
37
+
38
+
24
39
  @DefaultV1Recipe.register(
25
40
  DefaultV1Recipe.ComponentType.INTENT_CLASSIFIER, is_trainable=True
26
41
  )
@@ -151,6 +166,7 @@ class LogisticRegressionClassifier(IntentClassifier, GraphComponent):
151
166
  execution_context: ExecutionContext,
152
167
  ) -> "LogisticRegressionClassifier":
153
168
  """Creates a new untrained component (see parent class for full docstring)."""
169
+ _check_skops_dependency()
154
170
  return cls(config, execution_context.node_name, model_storage, resource)
155
171
 
156
172
  def process(self, messages: List[Message]) -> List[Message]:
@@ -183,6 +199,7 @@ class LogisticRegressionClassifier(IntentClassifier, GraphComponent):
183
199
 
184
200
  def persist(self) -> None:
185
201
  """Persist this model into the passed directory."""
202
+ _check_skops_dependency()
186
203
  import skops.io as sio
187
204
 
188
205
  with self._model_storage.write_to(self._resource) as model_dir:
@@ -203,6 +220,7 @@ class LogisticRegressionClassifier(IntentClassifier, GraphComponent):
203
220
  **kwargs: Any,
204
221
  ) -> "LogisticRegressionClassifier":
205
222
  """Loads trained component (see parent class for full docstring)."""
223
+ _check_skops_dependency()
206
224
  import skops.io as sio
207
225
 
208
226
  try:
@@ -2,8 +2,7 @@ import abc
2
2
  from typing import Any, Dict, List, NamedTuple, Optional, Text, Tuple
3
3
 
4
4
  import rasa.shared.utils.io
5
-
6
- # import rasa.utils.train_utils
5
+ import rasa.utils.train_utils
7
6
  from rasa.nlu.constants import (
8
7
  ENTITY_ATTRIBUTE_CONFIDENCE_GROUP,
9
8
  ENTITY_ATTRIBUTE_CONFIDENCE_ROLE,
File without changes
@@ -0,0 +1,74 @@
1
+ """Factory for creating authentication strategy instances based on the strategy type."""
2
+
3
+ from typing import Any, ClassVar, Dict, Optional, Type
4
+
5
+ import structlog
6
+
7
+ from rasa.shared.agents.auth.auth_strategy import (
8
+ AgentAuthStrategy,
9
+ APIKeyAuthStrategy,
10
+ BearerTokenAuthStrategy,
11
+ OAuth2AuthStrategy,
12
+ )
13
+ from rasa.shared.agents.auth.types import AgentAuthType
14
+
15
+ structlogger = structlog.get_logger()
16
+
17
+
18
+ class AgentAuthFactory:
19
+ """Factory for creating authentication strategy instances based on the
20
+ authentication strategy type.
21
+ """
22
+
23
+ _auth_strategies: ClassVar[Dict[AgentAuthType, Type[AgentAuthStrategy]]] = {
24
+ AgentAuthType.API_KEY: APIKeyAuthStrategy,
25
+ AgentAuthType.OAUTH2: OAuth2AuthStrategy,
26
+ AgentAuthType.BEARER_TOKEN: BearerTokenAuthStrategy,
27
+ }
28
+
29
+ @classmethod
30
+ def create_client(
31
+ cls, auth_type: AgentAuthType, config: Optional[Dict[str, Any]] = None
32
+ ) -> AgentAuthStrategy:
33
+ """Create an authentication strategy instance based on the strategy type.
34
+
35
+ Args:
36
+ auth_type: The type of the authentication strategy.
37
+ config: The configuration dictionary for the authentication.
38
+
39
+ Returns:
40
+ An instance of the authentication strategy.
41
+ """
42
+ config = config or {}
43
+
44
+ # Get the strategy class for the specified type
45
+ auth_strategy_class = cls._get_auth_strategy_class(auth_type)
46
+ if auth_strategy_class is None:
47
+ raise ValueError(
48
+ f"Unsupported strategy type: {auth_type}. "
49
+ f"Supported types: {cls.get_supported_auth_strategy_types()}"
50
+ )
51
+ # Create instance based on strategy type
52
+ return auth_strategy_class.from_config(config)
53
+
54
+ @classmethod
55
+ def get_supported_auth_strategy_types(cls) -> list[AgentAuthType]:
56
+ """Get all supported authentication strategy types."""
57
+ return list(cls._auth_strategies.keys())
58
+
59
+ @classmethod
60
+ def _get_auth_strategy_class(
61
+ cls, auth_type: AgentAuthType
62
+ ) -> Type[AgentAuthStrategy]:
63
+ """Get the class that implements the authentication strategy."""
64
+ if not cls.is_auth_strategy_supported(auth_type):
65
+ raise ValueError(
66
+ f"Unsupported authentication strategy type: {auth_type}. "
67
+ f"Supported types: {cls.get_supported_auth_strategy_types()}"
68
+ )
69
+ return cls._auth_strategies[auth_type]
70
+
71
+ @classmethod
72
+ def is_auth_strategy_supported(cls, auth_type: AgentAuthType) -> bool:
73
+ """Check if the authentication strategy type is supported."""
74
+ return auth_type in cls._auth_strategies
@@ -0,0 +1,86 @@
1
+ """High-level authentication management with strategy abstraction."""
2
+
3
+ from typing import Any, Dict, Optional
4
+
5
+ import structlog
6
+
7
+ from rasa.shared.agents.auth.agent_auth_factory import AgentAuthFactory
8
+ from rasa.shared.agents.auth.auth_strategy import AgentAuthStrategy
9
+ from rasa.shared.agents.auth.constants import (
10
+ CONFIG_API_KEY_KEY,
11
+ CONFIG_OAUTH_KEY,
12
+ CONFIG_TOKEN_KEY,
13
+ )
14
+ from rasa.shared.agents.auth.types import AgentAuthType
15
+ from rasa.shared.exceptions import AgentAuthInitializationException
16
+
17
+ structlogger = structlog.get_logger()
18
+
19
+
20
+ class AgentAuthManager:
21
+ """High-level authentication management with strategy abstraction."""
22
+
23
+ def __init__(self, auth_strategy: Optional[AgentAuthStrategy] = None):
24
+ """Initialize a new authentication manager instance."""
25
+ self._auth_strategy: Optional[AgentAuthStrategy] = auth_strategy
26
+
27
+ def get_auth(self) -> AgentAuthStrategy:
28
+ """Retrieve the authentication instance.
29
+
30
+ Returns:
31
+ The authentication instance.
32
+
33
+ Raises:
34
+ ValueError: If no authentication is connected.
35
+ """
36
+ if self._auth_strategy is None:
37
+ raise ValueError("No authentication instance available")
38
+ return self._auth_strategy
39
+
40
+ @staticmethod
41
+ def detect_auth_type(config: Dict[str, Any]) -> AgentAuthType:
42
+ if CONFIG_API_KEY_KEY in config:
43
+ return AgentAuthType.API_KEY
44
+ if CONFIG_TOKEN_KEY in config:
45
+ return AgentAuthType.BEARER_TOKEN
46
+ if CONFIG_OAUTH_KEY in config:
47
+ return AgentAuthType.OAUTH2
48
+ raise ValueError(
49
+ "Invalid authentication type. Supported types: "
50
+ + ", ".join([auth_type.value for auth_type in AgentAuthType])
51
+ )
52
+
53
+ @classmethod
54
+ def load_auth(cls, config: Dict[str, Any]) -> "AgentAuthManager":
55
+ """Connect to authentication using specified strategy type and persist
56
+ the auth instance to the manager in a ready-to-use state.
57
+
58
+ Args:
59
+ config: The configuration dictionary for the authentication.
60
+
61
+ Raises:
62
+ AgentAuthInitializationException: If the authentication connection fails.
63
+ """
64
+ config = config or {}
65
+ try:
66
+ auth_type = AgentAuthManager.detect_auth_type(config)
67
+
68
+ # Create the auth client
69
+ client = AgentAuthFactory.create_client(auth_type, config)
70
+
71
+ structlogger.debug(
72
+ "agent_auth_manager.load_auth.success",
73
+ auth_type=auth_type.value,
74
+ event_info=(
75
+ f"Loaded authentication client successfully for `{auth_type.value}`"
76
+ ),
77
+ )
78
+ return cls(client)
79
+ except Exception as e:
80
+ event_info = "Failed to load authentication client"
81
+ structlogger.error(
82
+ "agent_auth_manager.load_auth.failed_to_load",
83
+ event_info=event_info,
84
+ config=config,
85
+ )
86
+ raise AgentAuthInitializationException(e)
@@ -0,0 +1,19 @@
1
+ """Authentication strategy implementations."""
2
+
3
+ from rasa.shared.agents.auth.auth_strategy.agent_auth_strategy import AgentAuthStrategy
4
+ from rasa.shared.agents.auth.auth_strategy.api_key_auth_strategy import (
5
+ APIKeyAuthStrategy,
6
+ )
7
+ from rasa.shared.agents.auth.auth_strategy.bearer_token_auth_strategy import (
8
+ BearerTokenAuthStrategy,
9
+ )
10
+ from rasa.shared.agents.auth.auth_strategy.oauth2_auth_strategy import (
11
+ OAuth2AuthStrategy,
12
+ )
13
+
14
+ __all__ = [
15
+ "AgentAuthStrategy",
16
+ "APIKeyAuthStrategy",
17
+ "OAuth2AuthStrategy",
18
+ "BearerTokenAuthStrategy",
19
+ ]
@@ -0,0 +1,52 @@
1
+ from abc import ABC, abstractmethod
2
+ from typing import Any, AsyncGenerator, Dict
3
+
4
+ import httpx
5
+
6
+ from rasa.shared.agents.auth.types import AgentAuthType
7
+ from rasa.shared.utils.io import resolve_environment_variables
8
+
9
+
10
+ class AgentAuthStrategy(ABC, httpx.Auth):
11
+ """Base class for authentication strategies."""
12
+
13
+ @classmethod
14
+ @abstractmethod
15
+ def from_config(cls, config: Dict[str, Any]) -> "AgentAuthStrategy":
16
+ """Create an authentication strategy instance from a config dictionary."""
17
+ ...
18
+
19
+ @property
20
+ @abstractmethod
21
+ def auth_type(self) -> AgentAuthType:
22
+ """Return the type of the authentication strategy."""
23
+ ...
24
+
25
+ @abstractmethod
26
+ async def get_headers(self) -> Dict[str, str]:
27
+ """Get authentication headers for requests.
28
+
29
+ Returns:
30
+ Dictionary containing authentication headers.
31
+ """
32
+ ...
33
+
34
+ async def async_auth_flow(
35
+ self, request: httpx.Request
36
+ ) -> AsyncGenerator[httpx.Request, httpx.Response]:
37
+ """Get authentication headers for requests.
38
+
39
+ Returns:
40
+ Async generator of requests with authentication headers.
41
+ """
42
+ # Get authentication headers.
43
+ auth_headers = await self.get_headers()
44
+
45
+ # Resolve environment variables in authentication headers.
46
+ resolved_auth_headers = resolve_environment_variables(auth_headers)
47
+
48
+ # Update request headers with resolved authentication headers.
49
+ request.headers.update(resolved_auth_headers)
50
+
51
+ # Yield request with resolved authentication headers.
52
+ yield request
@@ -0,0 +1,42 @@
1
+ """API Key authentication strategy implementation."""
2
+
3
+ from typing import Any, Dict
4
+
5
+ from rasa.shared.agents.auth.auth_strategy import AgentAuthStrategy
6
+ from rasa.shared.agents.auth.constants import (
7
+ CONFIG_API_KEY_KEY,
8
+ CONFIG_HEADER_FORMAT_KEY,
9
+ CONFIG_HEADER_NAME_KEY,
10
+ )
11
+ from rasa.shared.agents.auth.types import AgentAuthType
12
+
13
+
14
+ class APIKeyAuthStrategy(AgentAuthStrategy):
15
+ """API Key authentication strategy implementation."""
16
+
17
+ def __init__(
18
+ self,
19
+ api_key: str,
20
+ header_name: str = "Authorization",
21
+ header_format: str = "Bearer {key}",
22
+ ):
23
+ self.api_key = api_key
24
+ self.header_name = header_name
25
+ self.header_format = header_format
26
+
27
+ @classmethod
28
+ def from_config(cls, config: Dict[str, Any]) -> "APIKeyAuthStrategy":
29
+ api_key = config.get(CONFIG_API_KEY_KEY)
30
+ header_name = config.get(CONFIG_HEADER_NAME_KEY, "Authorization")
31
+ header_format = config.get(CONFIG_HEADER_FORMAT_KEY, "Bearer {key}")
32
+ if not api_key:
33
+ raise ValueError("API key is required for API KEY authentication")
34
+ return APIKeyAuthStrategy(api_key, header_name, header_format)
35
+
36
+ @property
37
+ def auth_type(self) -> AgentAuthType:
38
+ return AgentAuthType.API_KEY
39
+
40
+ async def get_headers(self) -> Dict[str, str]:
41
+ """Return API key authentication headers."""
42
+ return {self.header_name: self.header_format.format(key=self.api_key)}
@@ -0,0 +1,28 @@
1
+ """Bearer Token authentication strategy implementation."""
2
+
3
+ from typing import Any, Dict
4
+
5
+ from rasa.shared.agents.auth.auth_strategy import AgentAuthStrategy
6
+ from rasa.shared.agents.auth.constants import CONFIG_TOKEN_KEY
7
+ from rasa.shared.agents.auth.types import AgentAuthType
8
+
9
+
10
+ class BearerTokenAuthStrategy(AgentAuthStrategy):
11
+ """Bearer Token authentication strategy implementation."""
12
+
13
+ def __init__(self, token: str):
14
+ self._token = token
15
+
16
+ @classmethod
17
+ def from_config(cls, config: Dict[str, Any]) -> "BearerTokenAuthStrategy":
18
+ token = config.get(CONFIG_TOKEN_KEY)
19
+ if not token:
20
+ raise ValueError("Access token is required for Bearer Token authentication")
21
+ return BearerTokenAuthStrategy(token)
22
+
23
+ @property
24
+ def auth_type(self) -> AgentAuthType:
25
+ return AgentAuthType.BEARER_TOKEN
26
+
27
+ async def get_headers(self) -> Dict[str, str]:
28
+ return {"Authorization": f"Bearer {self._token}"}
@@ -0,0 +1,159 @@
1
+ """OAuth2 authentication strategy client credentials flow implementation."""
2
+
3
+ import asyncio
4
+ import time
5
+ from typing import Any, AsyncGenerator, Dict, Optional
6
+
7
+ import httpx
8
+
9
+ from rasa.shared.agents.auth.auth_strategy import AgentAuthStrategy
10
+ from rasa.shared.agents.auth.constants import (
11
+ CONFIG_CLIENT_ID_KEY,
12
+ CONFIG_CLIENT_SECRET_KEY,
13
+ CONFIG_SCOPE_KEY,
14
+ CONFIG_TIMEOUT_KEY,
15
+ CONFIG_TOKEN_URL_KEY,
16
+ )
17
+ from rasa.shared.agents.auth.types import AgentAuthType
18
+ from rasa.shared.utils.io import resolve_environment_variables
19
+
20
+ KEY_ACCESS_TOKEN = "access_token"
21
+ KEY_CLIENT_CREDENTIALS = "client_credentials"
22
+ KEY_EXPIRES_IN = "expires_in"
23
+
24
+
25
+ class OAuth2AuthStrategy(AgentAuthStrategy):
26
+ """Client Credentials Flow authentication strategy."""
27
+
28
+ DEFAULT_ACCESS_TOKEN_TIMEOUT = 5
29
+ DEFAULT_ACCESS_TOKEN_EXPIRES_IN_SECONDS = 3600
30
+ DEFAULT_BUFFER_TIME_SECONDS = 10
31
+
32
+ def __init__(
33
+ self,
34
+ token_url: str,
35
+ client_id: str,
36
+ client_secret: str,
37
+ scope: str,
38
+ timeout: Optional[int] = None,
39
+ ):
40
+ self.token_url = token_url
41
+ self.client_id = client_id
42
+ self.client_secret = client_secret
43
+ self.scope = scope
44
+ self.timeout = timeout or self.DEFAULT_ACCESS_TOKEN_TIMEOUT
45
+
46
+ # Only client credentials flow is supported for server to server communication.
47
+ self._grant_type = KEY_CLIENT_CREDENTIALS
48
+
49
+ # Initialize defaults.
50
+ self._access_token: Optional[str] = None
51
+ self._expires_at: Optional[float] = None
52
+
53
+ # Initialize lock for concurrent access to the refresh the access token.
54
+ self._refresh_lock = asyncio.Lock()
55
+
56
+ @classmethod
57
+ def from_config(cls, config: Dict[str, Any]) -> "OAuth2AuthStrategy":
58
+ """Create OAuth2AuthStrategy from configuration dictionary."""
59
+ token_url = config.get(CONFIG_TOKEN_URL_KEY)
60
+ client_id = config.get(CONFIG_CLIENT_ID_KEY)
61
+ client_secret = config.get(CONFIG_CLIENT_SECRET_KEY)
62
+ scope = config.get(CONFIG_SCOPE_KEY)
63
+ timeout = config.get(CONFIG_TIMEOUT_KEY) or cls.DEFAULT_ACCESS_TOKEN_TIMEOUT
64
+
65
+ if not token_url:
66
+ raise ValueError("Token URL is required for OAuth2 authentication")
67
+ if not client_id:
68
+ raise ValueError("Client ID is required for OAuth2 authentication")
69
+ if not client_secret:
70
+ raise ValueError("Client secret is required for OAuth2 authentication")
71
+ if not scope:
72
+ raise ValueError("Scope is required for OAuth2 authentication")
73
+
74
+ return cls(
75
+ token_url=token_url,
76
+ client_id=client_id,
77
+ client_secret=client_secret,
78
+ scope=scope,
79
+ timeout=timeout,
80
+ )
81
+
82
+ @property
83
+ def auth_type(self) -> AgentAuthType:
84
+ return AgentAuthType.OAUTH2
85
+
86
+ async def get_headers(self) -> Dict[str, str]:
87
+ """Return OAuth2 authentication headers."""
88
+ # Acquire lock to prevent concurrent access to the refresh the access token.
89
+ async with self._refresh_lock:
90
+ # Refresh if missing or expired
91
+ if not self._access_token or self._is_expired():
92
+ await self._refresh_access_token()
93
+ if not self._access_token:
94
+ raise ValueError("Failed to obtain access token")
95
+ return {"Authorization": f"Bearer {self._access_token}"}
96
+
97
+ def _is_expired(self) -> bool:
98
+ """Check if access token is expired."""
99
+ # Adding a buffer time to the expiration time to avoid race conditions.
100
+ return (
101
+ not self._expires_at
102
+ or self._expires_at <= time.time() + self.DEFAULT_BUFFER_TIME_SECONDS
103
+ )
104
+
105
+ async def _refresh_access_token(self) -> None:
106
+ """Fetch a new access token using client credentials flow."""
107
+ # Prepare data and headers
108
+ headers = {"Content-Type": "application/x-www-form-urlencoded"}
109
+ data = {
110
+ "grant_type": self._grant_type,
111
+ "client_id": self.client_id,
112
+ "client_secret": self.client_secret,
113
+ "scope": self.scope,
114
+ }
115
+
116
+ # Resolve environment variables in data.
117
+ resolved_data = resolve_environment_variables(data)
118
+
119
+ # Fetch access token
120
+ try:
121
+ async with httpx.AsyncClient(timeout=self.timeout) as client:
122
+ resp = await client.post(
123
+ self.token_url, data=resolved_data, headers=headers
124
+ )
125
+ resp.raise_for_status()
126
+ token_data = resp.json()
127
+ except httpx.HTTPStatusError as e:
128
+ raise ValueError(
129
+ f"OAuth2 token request failed with status {e.response.status_code}: "
130
+ f"{e.response.text}"
131
+ ) from e
132
+ except httpx.RequestError as e:
133
+ raise ValueError(f"OAuth2 token request failed: {e}") from e
134
+ except Exception as e:
135
+ raise ValueError(
136
+ f"Unexpected error during OAuth2 token request: {e}"
137
+ ) from e
138
+
139
+ # Validate token data
140
+ if KEY_ACCESS_TOKEN not in token_data:
141
+ raise ValueError(f"No {KEY_ACCESS_TOKEN} in OAuth2 response")
142
+
143
+ # Set access token and expires at
144
+ self._access_token = token_data[KEY_ACCESS_TOKEN]
145
+ self._expires_at = time.time() + token_data.get(
146
+ KEY_EXPIRES_IN, self.DEFAULT_ACCESS_TOKEN_EXPIRES_IN_SECONDS
147
+ )
148
+
149
+ async def async_auth_flow(
150
+ self, request: httpx.Request
151
+ ) -> AsyncGenerator[httpx.Request, httpx.Response]:
152
+ """Inject Authorization header into outgoing requests.
153
+
154
+ Returns:
155
+ Async generator of requests with Authorization header.
156
+ """
157
+ auth_headers = await self.get_headers()
158
+ request.headers.update(auth_headers)
159
+ yield request
@@ -0,0 +1,11 @@
1
+ CONFIG_API_KEY_KEY = "api_key"
2
+ CONFIG_TOKEN_KEY = "token"
3
+ CONFIG_OAUTH_KEY = "oauth"
4
+ CONFIG_HEADER_NAME_KEY = "header_name"
5
+ CONFIG_HEADER_FORMAT_KEY = "header_format"
6
+ CONFIG_CLIENT_ID_KEY = "client_id"
7
+ CONFIG_CLIENT_SECRET_KEY = "client_secret"
8
+ CONFIG_TOKEN_URL_KEY = "token_url"
9
+ CONFIG_SCOPE_KEY = "scope"
10
+ CONFIG_GRANT_TYPE_KEY = "grant_type"
11
+ CONFIG_TIMEOUT_KEY = "timeout"
@@ -0,0 +1,11 @@
1
+ """Fundamental types for authentication protocols."""
2
+
3
+ from enum import Enum
4
+
5
+
6
+ class AgentAuthType(Enum):
7
+ """An Enum class that represents the supported authentication protocol types."""
8
+
9
+ API_KEY = "api_key"
10
+ OAUTH2 = "oauth2"
11
+ BEARER_TOKEN = "bearer_token"
@@ -61,6 +61,7 @@ ACTION_CANCEL_INTERRUPTED_FLOWS = "action_cancel_interrupted_flows"
61
61
 
62
62
  ACTION_METADATA_EXECUTION_SUCCESS = "execution_success"
63
63
  ACTION_METADATA_EXECUTION_ERROR_MESSAGE = "execution_error_message"
64
+ ACTION_METADATA_EXECUTION_TIME = "execution_times"
64
65
 
65
66
  ACTION_METADATA_MESSAGE_KEY = "message"
66
67
  ACTION_METADATA_TEXT_KEY = "text"