rasa-pro 3.14.0.dev20250818__py3-none-any.whl → 3.14.0.dev20250901__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 (361) hide show
  1. rasa/builder/README.md +120 -0
  2. rasa/builder/__init__.py +0 -0
  3. rasa/builder/auth.py +176 -0
  4. rasa/builder/config.py +91 -0
  5. rasa/builder/copilot/__init__.py +0 -0
  6. rasa/builder/copilot/constants.py +28 -0
  7. rasa/builder/copilot/copilot.py +376 -0
  8. rasa/builder/copilot/copilot_response_handler.py +522 -0
  9. rasa/builder/copilot/copilot_templated_message_provider.py +58 -0
  10. rasa/builder/copilot/exceptions.py +32 -0
  11. rasa/builder/copilot/models.py +464 -0
  12. rasa/builder/copilot/prompts/__init__.py +0 -0
  13. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +771 -0
  14. rasa/builder/copilot/signing.py +305 -0
  15. rasa/builder/copilot/telemetry.py +200 -0
  16. rasa/builder/copilot/templated_messages/__init__.py +0 -0
  17. rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +16 -0
  18. rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +38 -0
  19. rasa/builder/document_retrieval/__init__.py +0 -0
  20. rasa/builder/document_retrieval/constants.py +15 -0
  21. rasa/builder/document_retrieval/inkeep-rag-response-schema.json +64 -0
  22. rasa/builder/document_retrieval/inkeep_document_retrieval.py +238 -0
  23. rasa/builder/document_retrieval/models.py +62 -0
  24. rasa/builder/download.py +147 -0
  25. rasa/builder/exceptions.py +91 -0
  26. rasa/builder/guardrails/__init__.py +1 -0
  27. rasa/builder/guardrails/constants.py +9 -0
  28. rasa/builder/guardrails/exceptions.py +4 -0
  29. rasa/builder/guardrails/lakera.py +206 -0
  30. rasa/builder/guardrails/models.py +231 -0
  31. rasa/builder/guardrails/store.py +238 -0
  32. rasa/builder/guardrails/utils.py +328 -0
  33. rasa/builder/job_manager.py +87 -0
  34. rasa/builder/jobs.py +270 -0
  35. rasa/builder/llm_service.py +246 -0
  36. rasa/builder/logging_utils.py +265 -0
  37. rasa/builder/main.py +258 -0
  38. rasa/builder/models.py +216 -0
  39. rasa/builder/project_generator.py +462 -0
  40. rasa/builder/project_info.py +72 -0
  41. rasa/builder/scrape_rasa_docs.py +97 -0
  42. rasa/builder/service.py +1335 -0
  43. rasa/builder/shared/tracker_context.py +212 -0
  44. rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
  45. rasa/builder/training_service.py +124 -0
  46. rasa/builder/validation_service.py +97 -0
  47. rasa/cli/project_templates/basic/actions/__init__ +0 -0
  48. rasa/cli/project_templates/basic/actions/action_human_handoff.py +40 -0
  49. rasa/cli/project_templates/basic/config.yml +27 -0
  50. rasa/cli/project_templates/basic/credentials.yml +33 -0
  51. rasa/cli/project_templates/basic/data/data.md +9 -0
  52. rasa/cli/project_templates/basic/data/general/feedback.yml +21 -0
  53. rasa/cli/project_templates/basic/data/general/goodbye.yml +6 -0
  54. rasa/cli/project_templates/basic/data/general/hello.yml +6 -0
  55. rasa/cli/project_templates/basic/data/general/help.yml +6 -0
  56. rasa/cli/project_templates/basic/data/general/human_handoff.yml +16 -0
  57. rasa/cli/project_templates/basic/data/general/show_faqs.yml +6 -0
  58. rasa/cli/project_templates/basic/data/system/patterns/pattern_cannot_handle.yml +7 -0
  59. rasa/cli/project_templates/basic/data/system/patterns/pattern_completed.yml +7 -0
  60. rasa/cli/project_templates/basic/data/system/patterns/pattern_correction.yml +7 -0
  61. rasa/cli/project_templates/basic/data/system/patterns/pattern_search.yml +8 -0
  62. rasa/cli/project_templates/basic/data/system/patterns/pattern_session_start.yml +8 -0
  63. rasa/cli/project_templates/basic/docs/docs.md +5 -0
  64. rasa/cli/project_templates/basic/docs/template.txt +28 -0
  65. rasa/cli/project_templates/basic/domain/domain.md +9 -0
  66. rasa/cli/project_templates/basic/domain/general/feedback.yml +25 -0
  67. rasa/cli/project_templates/basic/domain/general/goodbye.yml +9 -0
  68. rasa/cli/project_templates/basic/domain/general/hello.yml +7 -0
  69. rasa/cli/project_templates/basic/domain/general/help.yml +21 -0
  70. rasa/cli/project_templates/basic/domain/general/human_handoff.yml +32 -0
  71. rasa/cli/project_templates/basic/domain/general/show_faqs.yml +14 -0
  72. rasa/cli/project_templates/basic/domain/system/patterns/pattern_cannot_handle.yml +5 -0
  73. rasa/cli/project_templates/basic/domain/system/patterns/pattern_session_start.yml +19 -0
  74. rasa/cli/project_templates/basic/endpoints.yml +63 -0
  75. rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
  76. rasa/cli/project_templates/finance/actions/__init__.py +46 -0
  77. rasa/cli/project_templates/finance/actions/accounts/__init__.py +0 -0
  78. rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +47 -0
  79. rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +40 -0
  80. rasa/cli/project_templates/finance/actions/action_session_start.py +74 -0
  81. rasa/cli/project_templates/finance/actions/cards/__init__.py +0 -0
  82. rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +48 -0
  83. rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +36 -0
  84. rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +54 -0
  85. rasa/cli/project_templates/finance/actions/database.py +277 -0
  86. rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
  87. rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +52 -0
  88. rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +51 -0
  89. rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +40 -0
  90. rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +40 -0
  91. rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +46 -0
  92. rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +18 -0
  93. rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +49 -0
  94. rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +19 -0
  95. rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +36 -0
  96. rasa/cli/project_templates/finance/config.yml +21 -0
  97. rasa/cli/project_templates/finance/credentials.yml +32 -0
  98. rasa/cli/project_templates/finance/csvs/accounts.csv +8 -0
  99. rasa/cli/project_templates/finance/csvs/advisors.csv +7 -0
  100. rasa/cli/project_templates/finance/csvs/appointments.csv +211 -0
  101. rasa/cli/project_templates/finance/csvs/branches.csv +10 -0
  102. rasa/cli/project_templates/finance/csvs/cards.csv +11 -0
  103. rasa/cli/project_templates/finance/csvs/payees.csv +11 -0
  104. rasa/cli/project_templates/finance/csvs/transactions.csv +71 -0
  105. rasa/cli/project_templates/finance/csvs/users.csv +4 -0
  106. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +10 -0
  107. rasa/cli/project_templates/finance/data/cards/block_card.yml +66 -0
  108. rasa/cli/project_templates/finance/data/cards/select_card.yml +12 -0
  109. rasa/cli/project_templates/finance/data/general/bot_identity.yml +6 -0
  110. rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
  111. rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
  112. rasa/cli/project_templates/finance/data/general/hello.yml +7 -0
  113. rasa/cli/project_templates/finance/data/general/help.yml +9 -0
  114. rasa/cli/project_templates/finance/data/general/human_handoff.yml +16 -0
  115. rasa/cli/project_templates/finance/data/general/welcome.yml +9 -0
  116. rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +5 -0
  117. rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +7 -0
  118. rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +7 -0
  119. rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +8 -0
  120. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +8 -0
  121. rasa/cli/project_templates/finance/data/system/source/accounts.json +51 -0
  122. rasa/cli/project_templates/finance/data/system/source/advisors.json +44 -0
  123. rasa/cli/project_templates/finance/data/system/source/appointments.json +1474 -0
  124. rasa/cli/project_templates/finance/data/system/source/branches.json +47 -0
  125. rasa/cli/project_templates/finance/data/system/source/cards.json +72 -0
  126. rasa/cli/project_templates/finance/data/system/source/payees.json +74 -0
  127. rasa/cli/project_templates/finance/data/system/source/transactions.json +492 -0
  128. rasa/cli/project_templates/finance/data/system/source/users.json +29 -0
  129. rasa/cli/project_templates/finance/data/transfers/add_payee.yml +29 -0
  130. rasa/cli/project_templates/finance/data/transfers/list_payees.yml +5 -0
  131. rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +21 -0
  132. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +67 -0
  133. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +8 -0
  134. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +8 -0
  135. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +8 -0
  136. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +8 -0
  137. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +8 -0
  138. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +7 -0
  139. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +8 -0
  140. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +8 -0
  141. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +8 -0
  142. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +8 -0
  143. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +8 -0
  144. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +8 -0
  145. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +8 -0
  146. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +8 -0
  147. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +8 -0
  148. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +8 -0
  149. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +8 -0
  150. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +8 -0
  151. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +8 -0
  152. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +8 -0
  153. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +50 -0
  154. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +50 -0
  155. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +48 -0
  156. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +50 -0
  157. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +50 -0
  158. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +47 -0
  159. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +50 -0
  160. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +50 -0
  161. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +47 -0
  162. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +50 -0
  163. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +50 -0
  164. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +50 -0
  165. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +47 -0
  166. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +50 -0
  167. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +50 -0
  168. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +47 -0
  169. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +50 -0
  170. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +50 -0
  171. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +47 -0
  172. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +50 -0
  173. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +50 -0
  174. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +47 -0
  175. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +47 -0
  176. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +50 -0
  177. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +50 -0
  178. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +47 -0
  179. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +50 -0
  180. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +50 -0
  181. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +47 -0
  182. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +50 -0
  183. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +50 -0
  184. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +47 -0
  185. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +50 -0
  186. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +50 -0
  187. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +50 -0
  188. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +47 -0
  189. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +50 -0
  190. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +50 -0
  191. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +47 -0
  192. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +50 -0
  193. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +50 -0
  194. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +47 -0
  195. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +50 -0
  196. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +50 -0
  197. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +50 -0
  198. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +47 -0
  199. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +50 -0
  200. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +50 -0
  201. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +47 -0
  202. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +50 -0
  203. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +50 -0
  204. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +47 -0
  205. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +50 -0
  206. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +50 -0
  207. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +47 -0
  208. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +47 -0
  209. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +50 -0
  210. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +50 -0
  211. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +50 -0
  212. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +50 -0
  213. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +47 -0
  214. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +11 -0
  215. rasa/cli/project_templates/finance/domain/cards/block_card.yml +101 -0
  216. rasa/cli/project_templates/finance/domain/cards/select_card.yml +12 -0
  217. rasa/cli/project_templates/finance/domain/general/assistant_details.yml +12 -0
  218. rasa/cli/project_templates/finance/domain/general/bot_identity.yml +5 -0
  219. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +5 -0
  220. rasa/cli/project_templates/finance/domain/general/defaults.yml +24 -0
  221. rasa/cli/project_templates/finance/domain/general/feedback.yml +28 -0
  222. rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
  223. rasa/cli/project_templates/finance/domain/general/help.yml +5 -0
  224. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +30 -0
  225. rasa/cli/project_templates/finance/domain/general/utils.yml +13 -0
  226. rasa/cli/project_templates/finance/domain/general/welcome.yml +8 -0
  227. rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +47 -0
  228. rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +4 -0
  229. rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +16 -0
  230. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +79 -0
  231. rasa/cli/project_templates/finance/endpoints.yml +63 -0
  232. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +19 -0
  233. rasa/cli/project_templates/telco/actions/__init__.py +0 -0
  234. rasa/cli/project_templates/telco/actions/billing/__init__.py +0 -0
  235. rasa/cli/project_templates/telco/actions/billing/actions_billing.py +204 -0
  236. rasa/cli/project_templates/telco/actions/general/__init__.py +0 -0
  237. rasa/cli/project_templates/telco/actions/general/action_human_handoff.py +49 -0
  238. rasa/cli/project_templates/telco/actions/network/__init__.py +0 -0
  239. rasa/cli/project_templates/telco/actions/network/actions_get_data_from_db.py +48 -0
  240. rasa/cli/project_templates/telco/actions/network/actions_run_diagnostics.py +28 -0
  241. rasa/cli/project_templates/telco/actions/network/actions_session_start.py +18 -0
  242. rasa/cli/project_templates/telco/config.yml +27 -0
  243. rasa/cli/project_templates/telco/credentials.yml +33 -0
  244. rasa/cli/project_templates/telco/csvs/billing.csv +19 -0
  245. rasa/cli/project_templates/telco/csvs/customers.csv +5 -0
  246. rasa/cli/project_templates/telco/data/billing/flow_understand_bill.yml +45 -0
  247. rasa/cli/project_templates/telco/data/general/bot_challenge.yml +6 -0
  248. rasa/cli/project_templates/telco/data/general/feedback.yml +20 -0
  249. rasa/cli/project_templates/telco/data/general/goodbye.yml +6 -0
  250. rasa/cli/project_templates/telco/data/general/hello.yml +6 -0
  251. rasa/cli/project_templates/telco/data/general/human_handoff.yml +16 -0
  252. rasa/cli/project_templates/telco/data/general/patterns.yml +30 -0
  253. rasa/cli/project_templates/telco/data/network/flow_reboot_router.yml +8 -0
  254. rasa/cli/project_templates/telco/data/network/flow_reset_router.yml +7 -0
  255. rasa/cli/project_templates/telco/data/network/flow_solve_internet_issue.yml +73 -0
  256. rasa/cli/project_templates/telco/docs/docs.md +5 -0
  257. rasa/cli/project_templates/telco/docs/network/reset_vs_rboot_router.txt +1 -0
  258. rasa/cli/project_templates/telco/docs/network/restart_router.txt +6 -0
  259. rasa/cli/project_templates/telco/docs/network/run_speed_test.txt +6 -0
  260. rasa/cli/project_templates/telco/domain/billing/domain_undertand_bill.yml +102 -0
  261. rasa/cli/project_templates/telco/domain/general/bot_challenge.yml +4 -0
  262. rasa/cli/project_templates/telco/domain/general/feedback.yml +25 -0
  263. rasa/cli/project_templates/telco/domain/general/goodbye.yml +7 -0
  264. rasa/cli/project_templates/telco/domain/general/hello.yml +5 -0
  265. rasa/cli/project_templates/telco/domain/general/human_handoff.yml +29 -0
  266. rasa/cli/project_templates/telco/domain/general/patterns.yml +33 -0
  267. rasa/cli/project_templates/telco/domain/network/domain_reboot_router.yml +21 -0
  268. rasa/cli/project_templates/telco/domain/network/domain_reset_router.yml +12 -0
  269. rasa/cli/project_templates/telco/domain/network/domain_run_speed_test.yml +25 -0
  270. rasa/cli/project_templates/telco/domain/network/domain_solve_internet_issue.yml +75 -0
  271. rasa/cli/project_templates/telco/domain/shared.yml +129 -0
  272. rasa/cli/project_templates/telco/endpoints.yml +63 -0
  273. rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +40 -0
  274. rasa/cli/project_templates/tutorial/config.yml +2 -1
  275. rasa/cli/scaffold.py +46 -2
  276. rasa/core/actions/action.py +0 -1
  277. rasa/core/channels/channel.py +4 -3
  278. rasa/core/channels/constants.py +3 -0
  279. rasa/core/channels/development_inspector.py +1 -1
  280. rasa/core/channels/inspector/dist/assets/{arc-1ddec37b.js → arc-18042c22.js} +1 -1
  281. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-18af387c.js → blockDiagram-38ab4fdb-fdd6bcfa.js} +1 -1
  282. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-250127a3.js → c4Diagram-3d4e48cf-f5ae6786.js} +1 -1
  283. rasa/core/channels/inspector/dist/assets/channel-b9b536fc.js +1 -0
  284. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-c3388b34.js → classDiagram-70f12bd4-81efba3e.js} +1 -1
  285. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-9c893a82.js → classDiagram-v2-f2320105-3b6b6a92.js} +1 -1
  286. rasa/core/channels/inspector/dist/assets/clone-78d2ddcf.js +1 -0
  287. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-c111213b.js → createText-2e5e7dd3-31422447.js} +1 -1
  288. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-812a729d.js → edges-e0da2a9e-518a90db.js} +1 -1
  289. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-fd5051bc.js → erDiagram-9861fffd-a6d3c25a.js} +1 -1
  290. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-3287ac02.js → flowDb-956e92f1-e048c2be.js} +1 -1
  291. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-692fb0b2.js → flowDiagram-66a62f08-c7474c91.js} +1 -1
  292. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-8b09c060.js +1 -0
  293. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-008376f1.js → flowchart-elk-definition-4a651766-cb4d8723.js} +1 -1
  294. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-df330a69.js → ganttDiagram-c361ad54-346636a2.js} +1 -1
  295. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-e03676fb.js → gitGraphDiagram-72cf32ee-7c508874.js} +1 -1
  296. rasa/core/channels/inspector/dist/assets/{graph-46fad2ba.js → graph-14702d8a.js} +1 -1
  297. rasa/core/channels/inspector/dist/assets/{index-3862675e-a484ac55.js → index-3862675e-f18b534b.js} +1 -1
  298. rasa/core/channels/inspector/dist/assets/{index-a003633f.js → index-4d4bdf3a.js} +231 -231
  299. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-3f9e6ec2.js → infoDiagram-f8f76790-64154b83.js} +1 -1
  300. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-79f72383.js → journeyDiagram-49397b02-833a5f95.js} +1 -1
  301. rasa/core/channels/inspector/dist/assets/{layout-aad098e5.js → layout-5a3b2123.js} +1 -1
  302. rasa/core/channels/inspector/dist/assets/{line-219ab7ae.js → line-2272a8c7.js} +1 -1
  303. rasa/core/channels/inspector/dist/assets/{linear-2cddbe62.js → linear-35bcf273.js} +1 -1
  304. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-1d41ed99.js → mindmap-definition-fc14e90a-92dcb0e9.js} +1 -1
  305. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-cc496ee8.js → pieDiagram-8a3498a8-94dbc900.js} +1 -1
  306. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-84d32884.js → quadrantDiagram-120e2f19-8b7a9c33.js} +1 -1
  307. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-c0deb984.js → requirementDiagram-deff3bca-6f7eab81.js} +1 -1
  308. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-b9d7fd62.js → sankeyDiagram-04a897e0-f43e581d.js} +1 -1
  309. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-7d517565.js → sequenceDiagram-704730f1-0bcbefc3.js} +1 -1
  310. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-98ef9b27.js → stateDiagram-587899a1-b8a74083.js} +1 -1
  311. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-cee70748.js → stateDiagram-v2-d93cdb3a-2070218f.js} +1 -1
  312. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-3f9d1c96.js → styles-6aaf32cf-f1d54e34.js} +1 -1
  313. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-67471923.js → styles-9a916d00-980de489.js} +1 -1
  314. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-bd093fb7.js → styles-c10674c1-3c03abde.js} +1 -1
  315. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-675794e8.js → svgDrawCommon-08f97a94-46ba068f.js} +1 -1
  316. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-0ac67617.js → timeline-definition-85554ec2-901f5e3d.js} +1 -1
  317. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-c018dc37.js → xychartDiagram-e933f94c-acbc628a.js} +1 -1
  318. rasa/core/channels/inspector/dist/index.html +2 -2
  319. rasa/core/channels/inspector/index.html +1 -1
  320. rasa/core/channels/inspector/src/App.tsx +10 -11
  321. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +12 -3
  322. rasa/core/channels/socketio.py +212 -51
  323. rasa/core/channels/studio_chat.py +43 -23
  324. rasa/core/channels/voice_stream/voice_channel.py +5 -3
  325. rasa/core/policies/enterprise_search_policy.py +4 -7
  326. rasa/core/policies/flows/flow_executor.py +8 -1
  327. rasa/core/run.py +13 -3
  328. rasa/dialogue_understanding/generator/flow_retrieval.py +10 -9
  329. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +1 -1
  330. rasa/engine/storage/local_model_storage.py +45 -2
  331. rasa/model_manager/model_api.py +4 -5
  332. rasa/model_manager/runner_service.py +1 -1
  333. rasa/model_manager/socket_bridge.py +20 -14
  334. rasa/model_manager/trainer_service.py +12 -9
  335. rasa/model_manager/utils.py +1 -29
  336. rasa/shared/core/domain.py +62 -15
  337. rasa/shared/core/flows/flow_step.py +7 -1
  338. rasa/shared/core/flows/steps/call.py +8 -1
  339. rasa/shared/core/flows/yaml_flows_io.py +16 -8
  340. rasa/shared/core/slots.py +4 -0
  341. rasa/shared/importers/importer.py +6 -0
  342. rasa/shared/importers/utils.py +77 -1
  343. rasa/shared/providers/_utils.py +60 -44
  344. rasa/shared/providers/embedding/default_litellm_embedding_client.py +2 -0
  345. rasa/shared/providers/llm/default_litellm_llm_client.py +2 -0
  346. rasa/studio/upload.py +12 -46
  347. rasa/telemetry.py +97 -23
  348. rasa/utils/io.py +27 -9
  349. rasa/utils/json_utils.py +6 -1
  350. rasa/utils/log_utils.py +5 -1
  351. rasa/utils/openapi.py +144 -0
  352. rasa/validator.py +7 -3
  353. rasa/version.py +1 -1
  354. {rasa_pro-3.14.0.dev20250818.dist-info → rasa_pro-3.14.0.dev20250901.dist-info}/METADATA +9 -10
  355. {rasa_pro-3.14.0.dev20250818.dist-info → rasa_pro-3.14.0.dev20250901.dist-info}/RECORD +358 -83
  356. rasa/core/channels/inspector/dist/assets/channel-59f6d54b.js +0 -1
  357. rasa/core/channels/inspector/dist/assets/clone-26177ddb.js +0 -1
  358. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-29c03f5a.js +0 -1
  359. {rasa_pro-3.14.0.dev20250818.dist-info → rasa_pro-3.14.0.dev20250901.dist-info}/NOTICE +0 -0
  360. {rasa_pro-3.14.0.dev20250818.dist-info → rasa_pro-3.14.0.dev20250901.dist-info}/WHEEL +0 -0
  361. {rasa_pro-3.14.0.dev20250818.dist-info → rasa_pro-3.14.0.dev20250901.dist-info}/entry_points.txt +0 -0
@@ -17,9 +17,9 @@ from typing import (
17
17
  Optional,
18
18
  Text,
19
19
  Tuple,
20
+ Union,
20
21
  )
21
22
 
22
- import orjson
23
23
  import structlog
24
24
 
25
25
  from rasa.core.channels import UserMessage
@@ -47,7 +47,6 @@ if TYPE_CHECKING:
47
47
  from sanic import Sanic, Websocket # type: ignore[attr-defined]
48
48
  from socketio import AsyncServer
49
49
 
50
- from rasa.core.channels.channel import UserMessage
51
50
  from rasa.shared.core.trackers import DialogueStateTracker
52
51
 
53
52
 
@@ -56,7 +55,7 @@ structlogger = structlog.get_logger()
56
55
 
57
56
  def tracker_as_dump(
58
57
  tracker: "DialogueStateTracker", latency: Optional[float] = None
59
- ) -> str:
58
+ ) -> Dict[str, Any]:
60
59
  """Create a dump of the tracker state."""
61
60
  from rasa.shared.core.trackers import get_trackers_for_conversation_sessions
62
61
 
@@ -67,11 +66,14 @@ def tracker_as_dump(
67
66
  else:
68
67
  last_tracker = multiple_tracker_sessions[-1]
69
68
 
69
+ # TODO: this is a bug: the bridge converts this back to json, but it
70
+ # should be json in the first place
70
71
  state = last_tracker.current_state(EventVerbosity.AFTER_RESTART)
71
72
 
72
73
  if latency is not None:
73
74
  state["latency"] = {"rasa_processing_latency_ms": latency}
74
- return orjson.dumps(state, option=orjson.OPT_SERIALIZE_NUMPY).decode("utf-8")
75
+
76
+ return state
75
77
 
76
78
 
77
79
  def does_need_action_prediction(tracker: "DialogueStateTracker") -> bool:
@@ -153,6 +155,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
153
155
  jwt_key: Optional[Text] = None,
154
156
  jwt_method: Optional[Text] = "HS256",
155
157
  metadata_key: Optional[Text] = "metadata",
158
+ enable_silence_timeout: bool = False,
156
159
  ) -> None:
157
160
  """Creates a `StudioChatInput` object."""
158
161
  from rasa.core.agent import Agent
@@ -170,6 +173,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
170
173
  jwt_key=jwt_key,
171
174
  jwt_method=jwt_method,
172
175
  metadata_key=metadata_key,
176
+ enable_silence_timeout=enable_silence_timeout,
173
177
  )
174
178
 
175
179
  # Initialize the Voice Input Channel
@@ -210,14 +214,15 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
210
214
  jwt_key=credentials.get("jwt_key"),
211
215
  jwt_method=credentials.get("jwt_method", "HS256"),
212
216
  metadata_key=credentials.get("metadata_key", "metadata"),
217
+ enable_silence_timeout=credentials.get("enable_silence_timeout", False),
213
218
  )
214
219
 
215
- async def emit(self, event: str, data: str, room: str) -> None:
220
+ async def emit(self, event: str, data: Union[Dict, str], room: str) -> None:
216
221
  """Emits an event to the websocket."""
217
- if not self.sio:
222
+ if not self.sio_server:
218
223
  structlogger.error("studio_chat.emit.sio_not_initialized")
219
224
  return
220
- await self.sio.emit(event, data, room=room)
225
+ await self.sio_server.emit(event, data, room=room)
221
226
 
222
227
  def _register_tracker_update_hook(self) -> None:
223
228
  plugin_manager().register(StudioTrackerUpdatePlugin(self))
@@ -250,15 +255,22 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
250
255
 
251
256
  async def on_message_proxy(
252
257
  self,
253
- on_new_message: Callable[["UserMessage"], Awaitable[Any]],
254
- message: "UserMessage",
258
+ on_new_message: Callable[[UserMessage], Awaitable[Any]],
259
+ message: UserMessage,
255
260
  ) -> None:
256
261
  """Proxies the on_new_message call to the underlying channel.
257
262
 
258
263
  Triggers a tracker update notification after processing the message.
259
264
  """
260
265
  self._record_turn_start_time(message.sender_id)
261
- await on_new_message(message)
266
+ try:
267
+ await on_new_message(message)
268
+ except Exception as e:
269
+ structlogger.exception(
270
+ "studio_chat.on_new_message.error",
271
+ error=str(e),
272
+ sender_id=message.sender_id,
273
+ )
262
274
 
263
275
  if not self.agent or not self.agent.is_ready():
264
276
  structlogger.error("studio_chat.on_message_proxy.agent_not_initialized")
@@ -377,7 +389,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
377
389
  call_state.is_bot_speaking = True
378
390
  return ContinueConversationAction()
379
391
 
380
- def create_output_channel(
392
+ def _create_output_channel(
381
393
  self, voice_websocket: "Websocket", tts_engine: TTSEngine
382
394
  ) -> VoiceOutputChannel:
383
395
  """Create a voice output channel."""
@@ -407,7 +419,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
407
419
 
408
420
  # Create a websocket adapter for this connection
409
421
  ws_adapter = SocketIOVoiceWebsocketAdapter(
410
- sio=self.sio,
422
+ sio_server=self.sio_server,
411
423
  session_id=session_id,
412
424
  sid=sid,
413
425
  bot_message_evt=self.bot_message_evt,
@@ -455,12 +467,12 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
455
467
  task.cancel()
456
468
 
457
469
  def blueprint(
458
- self, on_new_message: Callable[["UserMessage"], Awaitable[Any]]
470
+ self, on_new_message: Callable[[UserMessage], Awaitable[Any]]
459
471
  ) -> SocketBlueprint:
460
472
  proxied_on_message = partial(self.on_message_proxy, on_new_message)
461
473
  socket_blueprint = super().blueprint(proxied_on_message)
462
474
 
463
- if not self.sio:
475
+ if not self.sio_server:
464
476
  structlogger.error("studio_chat.blueprint.sio_not_initialized")
465
477
  return socket_blueprint
466
478
 
@@ -470,12 +482,12 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
470
482
  ) -> None:
471
483
  self.agent = app.ctx.agent
472
484
 
473
- @self.sio.on("disconnect", namespace=self.namespace)
485
+ @self.sio_server.on("disconnect", namespace=self.namespace)
474
486
  async def disconnect(sid: Text) -> None:
475
487
  structlogger.debug("studio_chat.sio.disconnect", sid=sid)
476
488
  self._cleanup_tasks_for_sid(sid)
477
489
 
478
- @self.sio.on("session_request", namespace=self.namespace)
490
+ @self.sio_server.on("session_request", namespace=self.namespace)
479
491
  async def session_request(sid: Text, data: Optional[Dict]) -> None:
480
492
  """Overrides the base SocketIOInput session_request handler.
481
493
 
@@ -495,7 +507,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
495
507
  if data and data.get("is_voice", False):
496
508
  self._start_voice_session(data["session_id"], sid, proxied_on_message)
497
509
 
498
- @self.sio.on(self.user_message_evt, namespace=self.namespace)
510
+ @self.sio_server.on(self.user_message_evt, namespace=self.namespace)
499
511
  async def handle_message(sid: Text, data: Dict) -> None:
500
512
  """Overrides the base SocketIOInput handle_message handler."""
501
513
  # Handle voice messages
@@ -506,10 +518,18 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
506
518
  ws.put_message(data)
507
519
  return
508
520
 
509
- # Handle text messages
510
- await self.handle_user_message(sid, data, proxied_on_message)
521
+ try:
522
+ # Handle text messages
523
+ await self.handle_user_message(sid, data, proxied_on_message)
524
+ except Exception as e:
525
+ structlogger.exception(
526
+ "studio_chat.sio.handle_message.error",
527
+ error=str(e),
528
+ sid=sid,
529
+ )
530
+ await self.emit("error", str(e), room=sid)
511
531
 
512
- @self.sio.on("update_tracker", namespace=self.namespace)
532
+ @self.sio_server.on("update_tracker", namespace=self.namespace)
513
533
  async def on_update_tracker(sid: Text, data: Dict) -> None:
514
534
  await self.handle_tracker_update(sid, data)
515
535
 
@@ -555,9 +575,9 @@ class SocketIOVoiceWebsocketAdapter:
555
575
  """Adapter to make Socket.IO work like a Sanic WebSocket for voice channels."""
556
576
 
557
577
  def __init__(
558
- self, sio: "AsyncServer", session_id: str, sid: str, bot_message_evt: str
578
+ self, sio_server: "AsyncServer", session_id: str, sid: str, bot_message_evt: str
559
579
  ) -> None:
560
- self.sio = sio
580
+ self.sio_server = sio_server
561
581
  self.bot_message_evt = bot_message_evt
562
582
  self._closed = False
563
583
  self._receive_queue: asyncio.Queue[Any] = asyncio.Queue()
@@ -576,7 +596,7 @@ class SocketIOVoiceWebsocketAdapter:
576
596
  async def send(self, data: Any) -> None:
577
597
  """Send data to the client."""
578
598
  if not self.closed:
579
- await self.sio.emit(self.bot_message_evt, data, room=self.sid)
599
+ await self.sio_server.emit(self.bot_message_evt, data, room=self.sid)
580
600
 
581
601
  async def recv(self) -> Any:
582
602
  """Receive data from the client."""
@@ -11,6 +11,11 @@ from sanic import Websocket # type: ignore
11
11
  from sanic.exceptions import ServerError, WebsocketClosed
12
12
 
13
13
  from rasa.core.channels import InputChannel, OutputChannel, UserMessage
14
+ from rasa.core.channels.constants import (
15
+ USER_CONVERSATION_SESSION_END,
16
+ USER_CONVERSATION_SESSION_START,
17
+ USER_CONVERSATION_SILENCE_TIMEOUT,
18
+ )
14
19
  from rasa.core.channels.voice_ready.utils import (
15
20
  CallParameters,
16
21
  validate_voice_license_scope,
@@ -48,9 +53,6 @@ from rasa.utils.io import remove_emojis
48
53
  logger = structlog.get_logger(__name__)
49
54
 
50
55
  # define constants for the voice channel
51
- USER_CONVERSATION_SESSION_END = "/session_end"
52
- USER_CONVERSATION_SESSION_START = "/session_start"
53
- USER_CONVERSATION_SILENCE_TIMEOUT = "/silence_timeout"
54
56
 
55
57
 
56
58
  @dataclass
@@ -781,7 +781,7 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
781
781
  if not os.path.exists(docs_folder) or not os.path.isdir(docs_folder):
782
782
  error_message = (
783
783
  f"Document source directory does not exist or is not a "
784
- f"directory: '{docs_folder}'. "
784
+ f"directory: '{os.path.abspath(docs_folder)}'. "
785
785
  "Please specify a valid path to the documents source directory in the "
786
786
  "vector_store configuration."
787
787
  )
@@ -1130,8 +1130,7 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
1130
1130
  embeddings_config: Dict[Text, Any],
1131
1131
  log_source_method: str,
1132
1132
  ) -> None:
1133
- """
1134
- Perform the health checks using resolved LLM and embeddings configurations.
1133
+ """Perform the health checks using resolved LLM and embeddings configurations.
1135
1134
  Resolved means the configuration is either:
1136
1135
  - A reference to a model group that has already been expanded into
1137
1136
  its corresponding configuration using the information from
@@ -1160,8 +1159,7 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
1160
1159
 
1161
1160
  @classmethod
1162
1161
  def get_system_default_prompt_based_on_config(cls, config: Dict[str, Any]) -> str:
1163
- """
1164
- Resolves the default prompt template for Enterprise Search Policy based on
1162
+ """Resolves the default prompt template for Enterprise Search Policy based on
1165
1163
  the component's configuration.
1166
1164
 
1167
1165
  - The old prompt is selected when both citation and relevancy check are either
@@ -1192,8 +1190,7 @@ class EnterpriseSearchPolicy(LLMHealthCheckMixin, EmbeddingsHealthCheckMixin, Po
1192
1190
  relevancy_check_enabled: bool,
1193
1191
  citation_enabled: bool,
1194
1192
  ) -> str:
1195
- """
1196
- Returns the appropriate default prompt template based on the feature flags.
1193
+ """Returns the appropriate default prompt template based on the feature flags.
1197
1194
 
1198
1195
  The selection follows this priority:
1199
1196
  1. If relevancy check is enabled, return the prompt that includes both relevancy
@@ -740,7 +740,14 @@ def _run_action_step(
740
740
  # do not log about non-existing validation actions of collect steps
741
741
  utter_action_name = render_template_variables("{{context.utter}}", context)
742
742
  if utter_action_name not in available_actions:
743
- structlogger.warning("flow.step.run.action.unknown", action=action_name)
743
+ structlogger.warning(
744
+ "flow.step.run.action.unknown",
745
+ action=action_name,
746
+ event_info=(
747
+ f"The action '{action_name}' is not defined in the domain but "
748
+ f"getting triggered by the flow '{step.flow_id}'."
749
+ ),
750
+ )
744
751
  return ContinueFlowWithNextStep(events=initial_events)
745
752
 
746
753
 
rasa/core/run.py CHANGED
@@ -42,10 +42,20 @@ from rasa.utils import licensing
42
42
  logger = logging.getLogger() # get the root logger
43
43
 
44
44
 
45
- def create_http_input_channels(
45
+ def create_input_channels(
46
46
  channel: Optional[Text], credentials_file: Optional[Text]
47
47
  ) -> List[InputChannel]:
48
- """Instantiate the chosen input channel."""
48
+ """Instantiate the chosen input channel.
49
+
50
+ Args:
51
+ channel (optional): The name of the specific input channel to create.
52
+ credentials_file: Path to the credentials file containing channel credentials.
53
+
54
+ Returns:
55
+ A list of instantiated input channels. If a specific channel is provided,
56
+ it returns a list with that single channel. If no channel is specified,
57
+ it returns a list of all channels defined in the credentials file.
58
+ """
49
59
  if credentials_file:
50
60
  all_credentials = read_config_file(credentials_file)
51
61
  else:
@@ -253,7 +263,7 @@ def serve_application(
253
263
  if not channel and not credentials:
254
264
  channel = "cmdline"
255
265
 
256
- input_channels = create_http_input_channels(channel, credentials)
266
+ input_channels = create_input_channels(channel, credentials)
257
267
 
258
268
  if inspect:
259
269
  logger.info("Starting development inspector.")
@@ -219,11 +219,6 @@ class FlowRetrieval(EmbeddingsHealthCheckMixin):
219
219
  if self.vector_store is not None:
220
220
  with self._model_storage.write_to(self._resource) as model_path:
221
221
  self.vector_store.save_local(model_path)
222
- else:
223
- structlogger.warning(
224
- "flow_retrieval.persist_vector_store.not_initialized",
225
- event_info="Vector store is None, not persisted.",
226
- )
227
222
 
228
223
  def _persist_config(self) -> None:
229
224
  with self._model_storage.write_to(self._resource) as path:
@@ -249,6 +244,16 @@ class FlowRetrieval(EmbeddingsHealthCheckMixin):
249
244
  )
250
245
 
251
246
  flows_to_embedd = flows.exclude_link_only_flows()
247
+
248
+ if not flows_to_embedd:
249
+ structlogger.debug(
250
+ "flow_retrieval.populate_vector_store.no_flows_to_embed",
251
+ event_info=(
252
+ "No flows to embed in the vector store, skipping population."
253
+ ),
254
+ )
255
+ return
256
+
252
257
  embeddings = self._create_embedder(self.config)
253
258
  documents = self._generate_flow_documents(flows_to_embedd, domain)
254
259
  try:
@@ -420,10 +425,6 @@ class FlowRetrieval(EmbeddingsHealthCheckMixin):
420
425
  The top k documents with similarity scores.
421
426
  """
422
427
  if self.vector_store is None:
423
- structlogger.error(
424
- "flow_retrieval.query_vector_store.vector_store_not_configured",
425
- event_info="Vector store is not configured",
426
- )
427
428
  return []
428
429
  try:
429
430
  documents_with_scores = (
@@ -81,7 +81,7 @@ responses:
81
81
  rephrase: True
82
82
 
83
83
  utter_inform_hangup:
84
- - text: It seems you are not there anymore. I will hang up shortly.
84
+ - text: I haven’t heard from you, so I’ll end our conversation shortly.
85
85
  metadata:
86
86
  rephrase: True
87
87
 
@@ -1,14 +1,16 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
+ import os
4
5
  import shutil
5
6
  import sys
7
+ import tarfile
6
8
  import tempfile
7
9
  import uuid
8
10
  from contextlib import contextmanager
9
11
  from datetime import datetime
10
12
  from pathlib import Path
11
- from typing import Generator, Optional, Text, Tuple, Union
13
+ from typing import Callable, Generator, Optional, Text, Tuple, Union
12
14
 
13
15
  from tarsafe import TarSafe
14
16
 
@@ -57,6 +59,35 @@ def windows_safe_temporary_directory(
57
59
  yield temporary_directory
58
60
 
59
61
 
62
+ def filter_normpath(member: tarfile.TarInfo, dest_path: str) -> tarfile.TarInfo:
63
+ """Normalize tar member paths for safe extraction"""
64
+ if member.name:
65
+ member.name = os.path.normpath(member.name)
66
+ return member
67
+
68
+
69
+ FilterFunction = Callable[[tarfile.TarInfo, str], Optional[tarfile.TarInfo]]
70
+
71
+
72
+ def create_combined_filter(existing_filter: Optional[FilterFunction]) -> FilterFunction:
73
+ """Create a filter that combines existing filter with path normalization"""
74
+
75
+ def combined_filter(
76
+ member: tarfile.TarInfo, dest_path: str
77
+ ) -> Optional[tarfile.TarInfo]:
78
+ """Apply existing filter first, then path normalization"""
79
+ if existing_filter is not None:
80
+ filtered_member = existing_filter(member, dest_path)
81
+ if filtered_member is None:
82
+ return None # Rejected by existing filter
83
+ member = filtered_member # Use the filtered result
84
+
85
+ # Apply our path normalization
86
+ return filter_normpath(member, dest_path)
87
+
88
+ return combined_filter
89
+
90
+
60
91
  class LocalModelStorage(ModelStorage):
61
92
  """Stores and provides output of `GraphComponents` on local disk."""
62
93
 
@@ -122,7 +153,19 @@ class LocalModelStorage(ModelStorage):
122
153
  # this restriction in environments where it's not possible
123
154
  # to override this behavior, mostly for internal policy reasons
124
155
  # reference: https://stackoverflow.com/a/49102229
125
- tar.extractall(f"\\\\?\\{temporary_directory}")
156
+ try:
157
+ # Use extraction filter to normalize paths for compatibility
158
+ # before trying the \\?\ prefix approach first
159
+ prev_filter = getattr(tar, "extraction_filter", None)
160
+ tar.extraction_filter = create_combined_filter(prev_filter)
161
+ tar.extractall(f"\\\\?\\{temporary_directory}")
162
+ except Exception:
163
+ # Fallback for Python versions with tarfile security fix
164
+ logger.warning(
165
+ "Failed to extract model archive with long path support. "
166
+ "Falling back to regular extraction."
167
+ )
168
+ tar.extractall(temporary_directory)
126
169
  else:
127
170
  tar.extractall(temporary_directory)
128
171
  LocalModelStorage._assert_not_rasa2_archive(temporary_directory)
@@ -39,11 +39,9 @@ from rasa.model_manager.trainer_service import (
39
39
  update_training_status,
40
40
  )
41
41
  from rasa.model_manager.utils import (
42
- InvalidPathException,
43
42
  get_logs_content,
44
43
  logs_base_path,
45
44
  models_base_path,
46
- subpath,
47
45
  )
48
46
  from rasa.model_manager.warm_rasa_process import (
49
47
  initialize_warm_rasa_process,
@@ -53,6 +51,7 @@ from rasa.server import ErrorResponse
53
51
  from rasa.shared.exceptions import InvalidConfigException
54
52
  from rasa.shared.utils.yaml import dump_obj_as_yaml_to_string
55
53
  from rasa.studio.upload import build_calm_import_parts
54
+ from rasa.utils.io import InvalidPathException, subpath
56
55
 
57
56
  dotenv.load_dotenv()
58
57
 
@@ -571,10 +570,10 @@ def external_blueprint() -> Blueprint:
571
570
  """Create a blueprint for the model manager API."""
572
571
  from rasa.core.channels.socketio import SocketBlueprint
573
572
 
574
- sio = AsyncServer(async_mode="sanic", cors_allowed_origins="*")
575
- bp = SocketBlueprint(sio, "", "model_api_external")
573
+ sio_server = AsyncServer(async_mode="sanic", cors_allowed_origins="*")
574
+ bp = SocketBlueprint(sio_server, "", "model_api_external")
576
575
 
577
- create_bridge_server(sio, running_bots)
576
+ create_bridge_server(sio_server, running_bots)
578
577
 
579
578
  @bp.get("/health")
580
579
  async def health(request: Request) -> response.HTTPResponse:
@@ -15,11 +15,11 @@ from rasa.model_manager import config
15
15
  from rasa.model_manager.utils import (
16
16
  logs_path,
17
17
  models_base_path,
18
- subpath,
19
18
  write_encoded_data_to_file,
20
19
  )
21
20
  from rasa.model_manager.warm_rasa_process import start_rasa_process
22
21
  from rasa.studio.prompts import handle_prompts
22
+ from rasa.utils.io import subpath
23
23
 
24
24
  structlogger = structlog.get_logger()
25
25
 
@@ -19,7 +19,7 @@ socket_proxy_clients = {}
19
19
 
20
20
 
21
21
  async def socketio_websocket_traffic_wrapper(
22
- sio: AsyncServer,
22
+ sio_server: AsyncServer,
23
23
  running_bots: Dict[str, BotSession],
24
24
  sid: str,
25
25
  auth: Optional[Dict],
@@ -55,7 +55,9 @@ async def socketio_websocket_traffic_wrapper(
55
55
  structlogger.error("model_runner.bot_not_alive", deployment_id=deployment_id)
56
56
  raise ConnectionRefusedError("model_runner.bot_not_alive")
57
57
 
58
- client = await create_bridge_client(sio, bot.internal_url, sid, deployment_id)
58
+ client = await create_bridge_client(
59
+ sio_server, bot.internal_url, sid, deployment_id
60
+ )
59
61
 
60
62
  if client.sid is not None:
61
63
  structlogger.debug(
@@ -70,20 +72,24 @@ async def socketio_websocket_traffic_wrapper(
70
72
  raise ConnectionRefusedError("model_runner.bot_connection_failed")
71
73
 
72
74
 
73
- def create_bridge_server(sio: AsyncServer, running_bots: Dict[str, BotSession]) -> None:
75
+ def create_bridge_server(
76
+ sio_server: AsyncServer, running_bots: Dict[str, BotSession]
77
+ ) -> None:
74
78
  """Create handlers for the socket server side.
75
79
 
76
80
  Forwards messages coming from the user to the bot.
77
81
  """
78
82
 
79
- @sio.on("connect")
83
+ @sio_server.on("connect")
80
84
  async def socketio_websocket_traffic(
81
85
  sid: str, environ: Dict, auth: Optional[Dict]
82
86
  ) -> bool:
83
87
  """Bridge websockets between user chat socket and bot server."""
84
- return await socketio_websocket_traffic_wrapper(sio, running_bots, sid, auth)
88
+ return await socketio_websocket_traffic_wrapper(
89
+ sio_server, running_bots, sid, auth
90
+ )
85
91
 
86
- @sio.on("disconnect")
92
+ @sio_server.on("disconnect")
87
93
  async def disconnect(sid: str) -> None:
88
94
  """Disconnect the bot connection."""
89
95
  structlogger.debug("model_runner.bot_disconnect", sid=sid)
@@ -91,7 +97,7 @@ def create_bridge_server(sio: AsyncServer, running_bots: Dict[str, BotSession])
91
97
  await socket_proxy_clients[sid].disconnect()
92
98
  del socket_proxy_clients[sid]
93
99
 
94
- @sio.on("*")
100
+ @sio_server.on("*")
95
101
  async def handle_message(event: str, sid: str, data: Dict[str, Any]) -> None:
96
102
  """Bridge messages between user and bot.
97
103
 
@@ -108,7 +114,7 @@ def create_bridge_server(sio: AsyncServer, running_bots: Dict[str, BotSession])
108
114
 
109
115
 
110
116
  async def create_bridge_client(
111
- sio: AsyncServer, url: str, sid: str, deployment_id: str
117
+ sio_server: AsyncServer, url: str, sid: str, deployment_id: str
112
118
  ) -> AsyncClient:
113
119
  """Create a new socket bridge client.
114
120
 
@@ -123,36 +129,36 @@ async def create_bridge_client(
123
129
  structlogger.debug(
124
130
  "model_runner.bot_session_confirmed", deployment_id=deployment_id
125
131
  )
126
- await sio.emit("session_confirm", room=sid)
132
+ await sio_server.emit("session_confirm", room=sid)
127
133
 
128
134
  @client.event # type: ignore[misc]
129
135
  async def bot_message(data: Dict[str, Any]) -> None:
130
136
  structlogger.debug("model_runner.bot_message", deployment_id=deployment_id)
131
- await sio.emit("bot_message", data, room=sid)
137
+ await sio_server.emit("bot_message", data, room=sid)
132
138
 
133
139
  @client.event # type: ignore[misc]
134
140
  async def error(data: Dict[str, Any]) -> None:
135
141
  structlogger.debug(
136
142
  "model_runner.bot_error", deployment_id=deployment_id, data=data
137
143
  )
138
- await sio.emit("error", data, room=sid)
144
+ await sio_server.emit("error", data, room=sid)
139
145
 
140
146
  @client.event # type: ignore[misc]
141
147
  async def tracker(data: Dict[str, Any]) -> None:
142
- await sio.emit("tracker", json.loads(data), room=sid)
148
+ await sio_server.emit("tracker", json.loads(data), room=sid)
143
149
 
144
150
  @client.event # type: ignore[misc]
145
151
  async def disconnect() -> None:
146
152
  structlogger.debug(
147
153
  "model_runner.bot_connection_closed", deployment_id=deployment_id
148
154
  )
149
- await sio.emit("disconnect", room=sid)
155
+ await sio_server.emit("disconnect", room=sid)
150
156
 
151
157
  @client.event # type: ignore[misc]
152
158
  async def connect_error() -> None:
153
159
  structlogger.error(
154
160
  "model_runner.bot_connection_error", deployment_id=deployment_id
155
161
  )
156
- await sio.emit("disconnect", room=sid)
162
+ await sio_server.emit("disconnect", room=sid)
157
163
 
158
164
  return client
@@ -14,7 +14,6 @@ from rasa.model_manager.utils import (
14
14
  ensure_base_directory_exists,
15
15
  logs_path,
16
16
  models_base_path,
17
- subpath,
18
17
  write_encoded_data_to_file,
19
18
  )
20
19
  from rasa.model_manager.warm_rasa_process import (
@@ -22,6 +21,7 @@ from rasa.model_manager.warm_rasa_process import (
22
21
  )
23
22
  from rasa.model_training import generate_random_model_name
24
23
  from rasa.studio.prompts import handle_prompts
24
+ from rasa.utils.io import subpath
25
25
 
26
26
  structlogger = structlog.get_logger()
27
27
 
@@ -53,6 +53,15 @@ class TrainingSession(BaseModel):
53
53
  """Check if the training is running."""
54
54
  return self.status == TrainingSessionStatus.RUNNING
55
55
 
56
+ def has_just_finished(self) -> bool:
57
+ if not self.is_status_indicating_alive():
58
+ # skip if the training is not running
59
+ return False
60
+ if self.process.poll() is None:
61
+ # process is still running
62
+ return False
63
+ return True
64
+
56
65
  def model_path(self) -> str:
57
66
  """Return the path to the model."""
58
67
  return subpath(models_base_path(), f"{self.model_name}.tar.gz")
@@ -89,14 +98,8 @@ def terminate_training(training: TrainingSession) -> None:
89
98
 
90
99
 
91
100
  def update_training_status(training: TrainingSession) -> None:
92
- if not training.is_status_indicating_alive():
93
- # skip if the training is not running
94
- return
95
- if training.process.poll() is None:
96
- # process is still running
97
- return
98
-
99
- complete_training(training)
101
+ if training.has_just_finished():
102
+ complete_training(training)
100
103
 
101
104
 
102
105
  def complete_training(training: TrainingSession) -> None: