rasa-pro 3.13.8__py3-none-any.whl → 3.14.0a2__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 (385) 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 +354 -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 +142 -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 +276 -0
  35. rasa/builder/llm_service.py +246 -0
  36. rasa/builder/logging_utils.py +265 -0
  37. rasa/builder/main.py +242 -0
  38. rasa/builder/models.py +216 -0
  39. rasa/builder/project_generator.py +351 -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/template_cache.py +244 -0
  46. rasa/builder/training_service.py +183 -0
  47. rasa/builder/validation_service.py +97 -0
  48. rasa/cli/project_templates/basic/actions/__init__ +0 -0
  49. rasa/cli/project_templates/basic/actions/action_human_handoff.py +40 -0
  50. rasa/cli/project_templates/basic/config.yml +29 -0
  51. rasa/cli/project_templates/basic/credentials.yml +33 -0
  52. rasa/cli/project_templates/basic/data/data.md +9 -0
  53. rasa/cli/project_templates/basic/data/general/feedback.yml +21 -0
  54. rasa/cli/project_templates/basic/data/general/goodbye.yml +6 -0
  55. rasa/cli/project_templates/basic/data/general/hello.yml +6 -0
  56. rasa/cli/project_templates/basic/data/general/help.yml +6 -0
  57. rasa/cli/project_templates/basic/data/general/human_handoff.yml +16 -0
  58. rasa/cli/project_templates/basic/data/general/show_faqs.yml +6 -0
  59. rasa/cli/project_templates/basic/data/system/patterns/pattern_cannot_handle.yml +7 -0
  60. rasa/cli/project_templates/basic/data/system/patterns/pattern_completed.yml +7 -0
  61. rasa/cli/project_templates/basic/data/system/patterns/pattern_correction.yml +7 -0
  62. rasa/cli/project_templates/basic/data/system/patterns/pattern_search.yml +8 -0
  63. rasa/cli/project_templates/basic/data/system/patterns/pattern_session_start.yml +8 -0
  64. rasa/cli/project_templates/basic/docs/docs.md +5 -0
  65. rasa/cli/project_templates/basic/docs/template.txt +28 -0
  66. rasa/cli/project_templates/basic/domain/domain.md +9 -0
  67. rasa/cli/project_templates/basic/domain/general/feedback.yml +25 -0
  68. rasa/cli/project_templates/basic/domain/general/goodbye.yml +9 -0
  69. rasa/cli/project_templates/basic/domain/general/hello.yml +7 -0
  70. rasa/cli/project_templates/basic/domain/general/help.yml +21 -0
  71. rasa/cli/project_templates/basic/domain/general/human_handoff.yml +32 -0
  72. rasa/cli/project_templates/basic/domain/general/show_faqs.yml +14 -0
  73. rasa/cli/project_templates/basic/domain/system/patterns/pattern_cannot_handle.yml +5 -0
  74. rasa/cli/project_templates/basic/domain/system/patterns/pattern_session_start.yml +19 -0
  75. rasa/cli/project_templates/basic/endpoints.yml +67 -0
  76. rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
  77. rasa/cli/project_templates/default/config.yml +4 -0
  78. rasa/cli/project_templates/default/endpoints.yml +4 -0
  79. rasa/cli/project_templates/finance/actions/__init__.py +46 -0
  80. rasa/cli/project_templates/finance/actions/accounts/__init__.py +0 -0
  81. rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +47 -0
  82. rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +40 -0
  83. rasa/cli/project_templates/finance/actions/action_session_start.py +74 -0
  84. rasa/cli/project_templates/finance/actions/cards/__init__.py +0 -0
  85. rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +48 -0
  86. rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +36 -0
  87. rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +54 -0
  88. rasa/cli/project_templates/finance/actions/database.py +277 -0
  89. rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
  90. rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +52 -0
  91. rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +51 -0
  92. rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +40 -0
  93. rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +40 -0
  94. rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +46 -0
  95. rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +18 -0
  96. rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +49 -0
  97. rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +19 -0
  98. rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +36 -0
  99. rasa/cli/project_templates/finance/config.yml +23 -0
  100. rasa/cli/project_templates/finance/credentials.yml +32 -0
  101. rasa/cli/project_templates/finance/csvs/accounts.csv +8 -0
  102. rasa/cli/project_templates/finance/csvs/advisors.csv +7 -0
  103. rasa/cli/project_templates/finance/csvs/appointments.csv +211 -0
  104. rasa/cli/project_templates/finance/csvs/branches.csv +10 -0
  105. rasa/cli/project_templates/finance/csvs/cards.csv +11 -0
  106. rasa/cli/project_templates/finance/csvs/payees.csv +11 -0
  107. rasa/cli/project_templates/finance/csvs/transactions.csv +71 -0
  108. rasa/cli/project_templates/finance/csvs/users.csv +4 -0
  109. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +10 -0
  110. rasa/cli/project_templates/finance/data/cards/block_card.yml +66 -0
  111. rasa/cli/project_templates/finance/data/cards/select_card.yml +12 -0
  112. rasa/cli/project_templates/finance/data/general/bot_identity.yml +6 -0
  113. rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
  114. rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
  115. rasa/cli/project_templates/finance/data/general/hello.yml +7 -0
  116. rasa/cli/project_templates/finance/data/general/help.yml +9 -0
  117. rasa/cli/project_templates/finance/data/general/human_handoff.yml +16 -0
  118. rasa/cli/project_templates/finance/data/general/welcome.yml +9 -0
  119. rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +5 -0
  120. rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +7 -0
  121. rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +7 -0
  122. rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +8 -0
  123. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +8 -0
  124. rasa/cli/project_templates/finance/data/system/source/accounts.json +51 -0
  125. rasa/cli/project_templates/finance/data/system/source/advisors.json +44 -0
  126. rasa/cli/project_templates/finance/data/system/source/appointments.json +1474 -0
  127. rasa/cli/project_templates/finance/data/system/source/branches.json +47 -0
  128. rasa/cli/project_templates/finance/data/system/source/cards.json +72 -0
  129. rasa/cli/project_templates/finance/data/system/source/payees.json +74 -0
  130. rasa/cli/project_templates/finance/data/system/source/transactions.json +492 -0
  131. rasa/cli/project_templates/finance/data/system/source/users.json +29 -0
  132. rasa/cli/project_templates/finance/data/transfers/add_payee.yml +29 -0
  133. rasa/cli/project_templates/finance/data/transfers/list_payees.yml +5 -0
  134. rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +21 -0
  135. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +67 -0
  136. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +8 -0
  137. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +8 -0
  138. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +8 -0
  139. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +8 -0
  140. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +8 -0
  141. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +7 -0
  142. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +8 -0
  143. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +8 -0
  144. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +8 -0
  145. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +8 -0
  146. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +8 -0
  147. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +8 -0
  148. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +8 -0
  149. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +8 -0
  150. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +8 -0
  151. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +8 -0
  152. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +8 -0
  153. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +8 -0
  154. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +8 -0
  155. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +8 -0
  156. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +50 -0
  157. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +50 -0
  158. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +48 -0
  159. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +50 -0
  160. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +50 -0
  161. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +47 -0
  162. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +50 -0
  163. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +50 -0
  164. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +47 -0
  165. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +50 -0
  166. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +50 -0
  167. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +50 -0
  168. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +47 -0
  169. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +50 -0
  170. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +50 -0
  171. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +47 -0
  172. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +50 -0
  173. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +50 -0
  174. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +47 -0
  175. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +50 -0
  176. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +50 -0
  177. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +47 -0
  178. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +47 -0
  179. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +50 -0
  180. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +50 -0
  181. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +47 -0
  182. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +50 -0
  183. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +50 -0
  184. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +47 -0
  185. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +50 -0
  186. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +50 -0
  187. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +47 -0
  188. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +50 -0
  189. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +50 -0
  190. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +50 -0
  191. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +47 -0
  192. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +50 -0
  193. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +50 -0
  194. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +47 -0
  195. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +50 -0
  196. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +50 -0
  197. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +47 -0
  198. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +50 -0
  199. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +50 -0
  200. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +50 -0
  201. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +47 -0
  202. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +50 -0
  203. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +50 -0
  204. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +47 -0
  205. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +50 -0
  206. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +50 -0
  207. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +47 -0
  208. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +50 -0
  209. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +50 -0
  210. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +47 -0
  211. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +47 -0
  212. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +50 -0
  213. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +50 -0
  214. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +50 -0
  215. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +50 -0
  216. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +47 -0
  217. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +11 -0
  218. rasa/cli/project_templates/finance/domain/cards/block_card.yml +101 -0
  219. rasa/cli/project_templates/finance/domain/cards/select_card.yml +12 -0
  220. rasa/cli/project_templates/finance/domain/general/assistant_details.yml +12 -0
  221. rasa/cli/project_templates/finance/domain/general/bot_identity.yml +5 -0
  222. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +5 -0
  223. rasa/cli/project_templates/finance/domain/general/defaults.yml +24 -0
  224. rasa/cli/project_templates/finance/domain/general/feedback.yml +28 -0
  225. rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
  226. rasa/cli/project_templates/finance/domain/general/help.yml +5 -0
  227. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +30 -0
  228. rasa/cli/project_templates/finance/domain/general/utils.yml +13 -0
  229. rasa/cli/project_templates/finance/domain/general/welcome.yml +8 -0
  230. rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +47 -0
  231. rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +4 -0
  232. rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +16 -0
  233. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +79 -0
  234. rasa/cli/project_templates/finance/endpoints.yml +66 -0
  235. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +19 -0
  236. rasa/cli/project_templates/telco/actions/__init__.py +0 -0
  237. rasa/cli/project_templates/telco/actions/billing/__init__.py +0 -0
  238. rasa/cli/project_templates/telco/actions/billing/actions_billing.py +204 -0
  239. rasa/cli/project_templates/telco/actions/general/__init__.py +0 -0
  240. rasa/cli/project_templates/telco/actions/general/action_human_handoff.py +49 -0
  241. rasa/cli/project_templates/telco/actions/network/__init__.py +0 -0
  242. rasa/cli/project_templates/telco/actions/network/actions_get_data_from_db.py +48 -0
  243. rasa/cli/project_templates/telco/actions/network/actions_run_diagnostics.py +28 -0
  244. rasa/cli/project_templates/telco/actions/network/actions_session_start.py +18 -0
  245. rasa/cli/project_templates/telco/config.yml +29 -0
  246. rasa/cli/project_templates/telco/credentials.yml +33 -0
  247. rasa/cli/project_templates/telco/csvs/billing.csv +19 -0
  248. rasa/cli/project_templates/telco/csvs/customers.csv +5 -0
  249. rasa/cli/project_templates/telco/data/billing/flow_understand_bill.yml +45 -0
  250. rasa/cli/project_templates/telco/data/general/bot_challenge.yml +6 -0
  251. rasa/cli/project_templates/telco/data/general/feedback.yml +20 -0
  252. rasa/cli/project_templates/telco/data/general/goodbye.yml +6 -0
  253. rasa/cli/project_templates/telco/data/general/hello.yml +6 -0
  254. rasa/cli/project_templates/telco/data/general/human_handoff.yml +16 -0
  255. rasa/cli/project_templates/telco/data/general/patterns.yml +30 -0
  256. rasa/cli/project_templates/telco/data/network/flow_reboot_router.yml +8 -0
  257. rasa/cli/project_templates/telco/data/network/flow_reset_router.yml +7 -0
  258. rasa/cli/project_templates/telco/data/network/flow_solve_internet_issue.yml +73 -0
  259. rasa/cli/project_templates/telco/docs/docs.md +5 -0
  260. rasa/cli/project_templates/telco/docs/network/reset_vs_rboot_router.txt +1 -0
  261. rasa/cli/project_templates/telco/docs/network/restart_router.txt +6 -0
  262. rasa/cli/project_templates/telco/docs/network/run_speed_test.txt +6 -0
  263. rasa/cli/project_templates/telco/domain/billing/domain_undertand_bill.yml +102 -0
  264. rasa/cli/project_templates/telco/domain/general/bot_challenge.yml +4 -0
  265. rasa/cli/project_templates/telco/domain/general/feedback.yml +25 -0
  266. rasa/cli/project_templates/telco/domain/general/goodbye.yml +7 -0
  267. rasa/cli/project_templates/telco/domain/general/hello.yml +5 -0
  268. rasa/cli/project_templates/telco/domain/general/human_handoff.yml +29 -0
  269. rasa/cli/project_templates/telco/domain/general/patterns.yml +33 -0
  270. rasa/cli/project_templates/telco/domain/network/domain_reboot_router.yml +21 -0
  271. rasa/cli/project_templates/telco/domain/network/domain_reset_router.yml +12 -0
  272. rasa/cli/project_templates/telco/domain/network/domain_run_speed_test.yml +25 -0
  273. rasa/cli/project_templates/telco/domain/network/domain_solve_internet_issue.yml +75 -0
  274. rasa/cli/project_templates/telco/domain/shared.yml +129 -0
  275. rasa/cli/project_templates/telco/endpoints.yml +67 -0
  276. rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +40 -0
  277. rasa/cli/project_templates/tutorial/config.yml +2 -1
  278. rasa/cli/scaffold.py +46 -2
  279. rasa/cli/train.py +2 -2
  280. rasa/core/actions/action.py +27 -38
  281. rasa/core/actions/action_run_slot_rejections.py +1 -1
  282. rasa/core/channels/channel.py +4 -3
  283. rasa/core/channels/constants.py +3 -0
  284. rasa/core/channels/development_inspector.py +48 -15
  285. rasa/core/channels/inspector/dist/assets/{arc-0b11fe30.js → arc-c24d8d79.js} +1 -1
  286. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-9eef30a7.js → blockDiagram-38ab4fdb-1b6b9f26.js} +1 -1
  287. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-03e94f28.js → c4Diagram-3d4e48cf-da91d0f9.js} +1 -1
  288. rasa/core/channels/inspector/dist/assets/channel-d2444dfd.js +1 -0
  289. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-95c09eba.js → classDiagram-70f12bd4-6067f302.js} +1 -1
  290. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-38e8446c.js → classDiagram-v2-f2320105-705d024a.js} +1 -1
  291. rasa/core/channels/inspector/dist/assets/clone-281a0990.js +1 -0
  292. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-57dc3038.js → createText-2e5e7dd3-3751dffe.js} +1 -1
  293. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-4bac0545.js → edges-e0da2a9e-7b25b4af.js} +1 -1
  294. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-81795c90.js → erDiagram-9861fffd-eb7deea8.js} +1 -1
  295. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-89489ae6.js → flowDb-956e92f1-67235ff6.js} +1 -1
  296. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-cd152627.js → flowDiagram-66a62f08-34c3a16a.js} +1 -1
  297. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-aa4cca3b.js +1 -0
  298. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-3da369bc.js → flowchart-elk-definition-4a651766-f1a93631.js} +1 -1
  299. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-85ec16f8.js → ganttDiagram-c361ad54-a68cbad1.js} +1 -1
  300. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-495bc140.js → gitGraphDiagram-72cf32ee-0b1e4a1d.js} +1 -1
  301. rasa/core/channels/inspector/dist/assets/{graph-1ec4d266.js → graph-f3c1d212.js} +1 -1
  302. rasa/core/channels/inspector/dist/assets/{index-c804b295.js → index-051c5a6e.js} +255 -255
  303. rasa/core/channels/inspector/dist/assets/{index-3862675e-0a0e97c9.js → index-3862675e-34cbca30.js} +1 -1
  304. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-4d54bcde.js → infoDiagram-f8f76790-e69960a1.js} +1 -1
  305. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-dc097114.js → journeyDiagram-49397b02-8dd3296a.js} +1 -1
  306. rasa/core/channels/inspector/dist/assets/{layout-1a08981e.js → layout-e93126bc.js} +1 -1
  307. rasa/core/channels/inspector/dist/assets/{line-95f7f1d3.js → line-15eb1e26.js} +1 -1
  308. rasa/core/channels/inspector/dist/assets/{linear-97e69543.js → linear-fec95d33.js} +1 -1
  309. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-8c71ff03.js → mindmap-definition-fc14e90a-2557813e.js} +1 -1
  310. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-f14c71c7.js → pieDiagram-8a3498a8-40d756b1.js} +1 -1
  311. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-f1d3c9ff.js → quadrantDiagram-120e2f19-a48cbdcd.js} +1 -1
  312. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-bfa2412f.js → requirementDiagram-deff3bca-dc778150.js} +1 -1
  313. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-53f2c97b.js → sankeyDiagram-04a897e0-10026b94.js} +1 -1
  314. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-319d7c0e.js → sequenceDiagram-704730f1-3b2ed10a.js} +1 -1
  315. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-76a09418.js → stateDiagram-587899a1-c5f3b3fb.js} +1 -1
  316. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-a67f15d4.js → stateDiagram-v2-d93cdb3a-e503656b.js} +1 -1
  317. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-0654e7c3.js → styles-6aaf32cf-a683ce56.js} +1 -1
  318. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-1394bb9d.js → styles-9a916d00-02bcdcee.js} +1 -1
  319. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-e4c5bdae.js → styles-c10674c1-8e90dbb9.js} +1 -1
  320. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-50957104.js → svgDrawCommon-08f97a94-7c23fc1e.js} +1 -1
  321. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-b0885a6a.js → timeline-definition-85554ec2-c42faec8.js} +1 -1
  322. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-79e6541a.js → xychartDiagram-e933f94c-5e3bb0ea.js} +1 -1
  323. rasa/core/channels/inspector/dist/index.html +1 -1
  324. rasa/core/channels/inspector/src/App.tsx +36 -10
  325. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +1 -1
  326. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +12 -3
  327. rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +268 -0
  328. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +6 -2
  329. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +8 -3
  330. rasa/core/channels/inspector/src/types.ts +8 -0
  331. rasa/core/channels/socketio.py +212 -51
  332. rasa/core/channels/studio_chat.py +161 -50
  333. rasa/core/channels/voice_ready/twilio_voice.py +1 -1
  334. rasa/core/channels/voice_stream/audiocodes.py +9 -6
  335. rasa/core/channels/voice_stream/browser_audio.py +39 -4
  336. rasa/core/channels/voice_stream/call_state.py +13 -2
  337. rasa/core/channels/voice_stream/genesys.py +16 -13
  338. rasa/core/channels/voice_stream/jambonz.py +13 -11
  339. rasa/core/channels/voice_stream/twilio_media_streams.py +14 -13
  340. rasa/core/channels/voice_stream/util.py +11 -1
  341. rasa/core/channels/voice_stream/voice_channel.py +106 -32
  342. rasa/core/nlg/contextual_response_rephraser.py +11 -7
  343. rasa/core/nlg/generator.py +21 -5
  344. rasa/core/nlg/response.py +43 -6
  345. rasa/core/nlg/translate.py +8 -0
  346. rasa/core/policies/enterprise_search_policy.py +4 -7
  347. rasa/core/policies/flows/flow_executor.py +8 -1
  348. rasa/core/run.py +13 -3
  349. rasa/dialogue_understanding/generator/flow_retrieval.py +10 -9
  350. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +1 -1
  351. rasa/dialogue_understanding_test/du_test_schema.yml +3 -3
  352. rasa/e2e_test/e2e_test_schema.yml +3 -3
  353. rasa/engine/graph.py +5 -1
  354. rasa/engine/storage/local_model_storage.py +41 -4
  355. rasa/model_manager/model_api.py +4 -5
  356. rasa/model_manager/runner_service.py +1 -1
  357. rasa/model_manager/socket_bridge.py +27 -15
  358. rasa/model_manager/trainer_service.py +12 -9
  359. rasa/model_manager/utils.py +1 -29
  360. rasa/shared/core/domain.py +62 -15
  361. rasa/shared/core/flows/flow_step.py +7 -1
  362. rasa/shared/core/flows/steps/call.py +8 -1
  363. rasa/shared/core/flows/yaml_flows_io.py +16 -8
  364. rasa/shared/core/slots.py +4 -0
  365. rasa/shared/importers/importer.py +6 -0
  366. rasa/shared/importers/utils.py +77 -1
  367. rasa/shared/utils/common.py +2 -1
  368. rasa/studio/upload.py +12 -46
  369. rasa/telemetry.py +97 -23
  370. rasa/utils/io.py +27 -9
  371. rasa/utils/json_utils.py +6 -1
  372. rasa/utils/licensing.py +21 -10
  373. rasa/utils/log_utils.py +5 -1
  374. rasa/utils/openapi.py +144 -0
  375. rasa/utils/plotting.py +1 -1
  376. rasa/validator.py +7 -3
  377. rasa/version.py +1 -1
  378. {rasa_pro-3.13.8.dist-info → rasa_pro-3.14.0a2.dist-info}/METADATA +23 -24
  379. {rasa_pro-3.13.8.dist-info → rasa_pro-3.14.0a2.dist-info}/RECORD +382 -105
  380. rasa/core/channels/inspector/dist/assets/channel-51d02e9e.js +0 -1
  381. rasa/core/channels/inspector/dist/assets/clone-cc738fa6.js +0 -1
  382. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-0c716443.js +0 -1
  383. {rasa_pro-3.13.8.dist-info → rasa_pro-3.14.0a2.dist-info}/NOTICE +0 -0
  384. {rasa_pro-3.13.8.dist-info → rasa_pro-3.14.0a2.dist-info}/WHEEL +0 -0
  385. {rasa_pro-3.13.8.dist-info → rasa_pro-3.14.0a2.dist-info}/entry_points.txt +0 -0
@@ -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
 
@@ -5,12 +5,12 @@ mapping:
5
5
  sequence:
6
6
  - type: map
7
7
  mapping:
8
- regex;(^[a-zA-Z_]+[a-zA-Z0-9_]*$):
8
+ regex;(^[a-zA-Z_]+[a-zA-Z0-9_\-]*$):
9
9
  type: "seq"
10
10
  sequence:
11
11
  - type: map
12
12
  mapping:
13
- regex;(^[a-zA-Z_]+[a-zA-Z0-9_]*$):
13
+ regex;(^[a-zA-Z_]+[a-zA-Z0-9_\-]*$):
14
14
  type: any
15
15
 
16
16
  metadata:
@@ -129,7 +129,7 @@ mapping:
129
129
  type: "seq"
130
130
  sequence:
131
131
  - type: "str"
132
- pattern: ^[a-zA-Z_]+[a-zA-Z0-9_]*$
132
+ pattern: ^[a-zA-Z_]+[a-zA-Z0-9_\-]*$
133
133
  metadata:
134
134
  type: "str"
135
135
  pattern: ^[a-zA-Z_]+[a-zA-Z0-9_]*$
@@ -5,12 +5,12 @@ mapping:
5
5
  sequence:
6
6
  - type: map
7
7
  mapping:
8
- regex;(^[a-zA-Z_]+[a-zA-Z0-9_]*$):
8
+ regex;(^[a-zA-Z_]+[a-zA-Z0-9_\-]*$):
9
9
  type: "seq"
10
10
  sequence:
11
11
  - type: map
12
12
  mapping:
13
- regex;(^[a-zA-Z_]+[a-zA-Z0-9_]*$):
13
+ regex;(^[a-zA-Z_]+[a-zA-Z0-9_\-]*$):
14
14
  type: any
15
15
 
16
16
  metadata:
@@ -129,7 +129,7 @@ mapping:
129
129
  type: "seq"
130
130
  sequence:
131
131
  - type: "str"
132
- pattern: ^[a-zA-Z_]+[a-zA-Z0-9_]*$
132
+ pattern: ^[a-zA-Z_]+[a-zA-Z0-9_\-]*$
133
133
  metadata:
134
134
  type: "str"
135
135
  pattern: ^[a-zA-Z_]+[a-zA-Z0-9_]*$
rasa/engine/graph.py CHANGED
@@ -69,6 +69,7 @@ class SchemaNode:
69
69
 
70
70
  def matches_type(self, node_type: Type, include_subtypes: bool = True) -> bool:
71
71
  """Checks if schema node's 'uses' is of specified node type.
72
+
72
73
  By default, it also checks for subtypes of the specified node type.
73
74
  """
74
75
  return (self.uses is node_type) or (
@@ -171,6 +172,7 @@ class GraphSchema:
171
172
 
172
173
  def has_node(self, node_type: Type, include_subtypes: bool = True) -> bool:
173
174
  """Checks if the graph schema contains a node of the specified node type.
175
+
174
176
  By default, it also checks for subtypes of the specified node type.
175
177
  """
176
178
  for node in self.nodes.values():
@@ -181,7 +183,7 @@ class GraphSchema:
181
183
  def count_nodes_of_a_given_type(
182
184
  self, node_type: Type, include_subtypes: bool = True
183
185
  ) -> int:
184
- """Counts the number of the nodes of specified class"""
186
+ """Counts the number of the nodes of specified class."""
185
187
  counter = 0
186
188
  for node in self.nodes.values():
187
189
  if (node.uses is node_type) or (
@@ -353,6 +355,7 @@ class ExecutionContext:
353
355
 
354
356
  def has_node(self, node_type: Type, include_subtypes: bool = True) -> bool:
355
357
  """Checks if the graph node of the given type is present in the graph schema.
358
+
356
359
  By default, it also checks for subtypes of the specified node type.
357
360
  """
358
361
  return self.graph_schema.has_node(node_type, include_subtypes)
@@ -555,6 +558,7 @@ class GraphNode:
555
558
  structlogger.error(
556
559
  "graph.node.error_running_component",
557
560
  node_name=self._node_name,
561
+ error=str(e),
558
562
  )
559
563
  raise
560
564
 
@@ -10,7 +10,7 @@ import uuid
10
10
  from contextlib import contextmanager
11
11
  from datetime import datetime
12
12
  from pathlib import Path
13
- from typing import Callable, Generator, Optional, Text, Tuple, Union
13
+ from typing import Callable, Generator, List, Optional, Text, Tuple, Union
14
14
 
15
15
  from tarsafe import TarSafe
16
16
 
@@ -158,16 +158,24 @@ class LocalModelStorage(ModelStorage):
158
158
  # before trying the \\?\ prefix approach first
159
159
  prev_filter = getattr(tar, "extraction_filter", None)
160
160
  tar.extraction_filter = create_combined_filter(prev_filter)
161
- tar.extractall(f"\\\\?\\{temporary_directory}")
161
+ tar.extractall(
162
+ f"\\\\?\\{temporary_directory}",
163
+ members=yield_safe_members(tar.getmembers()),
164
+ )
162
165
  except Exception:
163
166
  # Fallback for Python versions with tarfile security fix
164
167
  logger.warning(
165
168
  "Failed to extract model archive with long path support. "
166
169
  "Falling back to regular extraction."
167
170
  )
168
- tar.extractall(temporary_directory)
171
+ tar.extractall(
172
+ temporary_directory,
173
+ members=yield_safe_members(tar.getmembers()),
174
+ )
169
175
  else:
170
- tar.extractall(temporary_directory)
176
+ tar.extractall(
177
+ temporary_directory, members=yield_safe_members(tar.getmembers())
178
+ )
171
179
  LocalModelStorage._assert_not_rasa2_archive(temporary_directory)
172
180
 
173
181
  @staticmethod
@@ -287,3 +295,32 @@ class LocalModelStorage(ModelStorage):
287
295
  core_target=model_configuration.core_target,
288
296
  nlu_target=model_configuration.nlu_target,
289
297
  )
298
+
299
+
300
+ def yield_safe_members(
301
+ members: List[tarfile.TarInfo],
302
+ ) -> Generator[tarfile.TarInfo, None, None]:
303
+ """
304
+ Filter function for tar.extractall members parameter.
305
+ Validates each member and yields only safe ones.
306
+
307
+ Args:
308
+ members: Iterator of TarInfo objects from tar.getmembers()
309
+
310
+ Yields:
311
+ TarInfo: Safe members to extract
312
+ """
313
+ for member in members:
314
+ # Skip absolute paths
315
+ if Path(member.name).is_absolute():
316
+ continue
317
+
318
+ # Skip paths with directory traversal sequences
319
+ if ".." in member.name or "\\.." in member.name:
320
+ continue
321
+
322
+ # Skip special file types unless you need them
323
+ if member.isdev() or member.issym():
324
+ continue
325
+
326
+ yield member
@@ -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
 
@@ -2,8 +2,7 @@ import json
2
2
  from typing import Any, Dict, Optional
3
3
 
4
4
  import structlog
5
- from socketio import AsyncServer
6
- from socketio.asyncio_client import AsyncClient
5
+ from socketio import AsyncClient, AsyncServer # type: ignore[attr-defined]
7
6
  from socketio.exceptions import ConnectionRefusedError
8
7
 
9
8
  from rasa.model_manager.runner_service import BotSession
@@ -20,7 +19,7 @@ socket_proxy_clients = {}
20
19
 
21
20
 
22
21
  async def socketio_websocket_traffic_wrapper(
23
- sio: AsyncServer,
22
+ sio_server: AsyncServer,
24
23
  running_bots: Dict[str, BotSession],
25
24
  sid: str,
26
25
  auth: Optional[Dict],
@@ -56,7 +55,9 @@ async def socketio_websocket_traffic_wrapper(
56
55
  structlogger.error("model_runner.bot_not_alive", deployment_id=deployment_id)
57
56
  raise ConnectionRefusedError("model_runner.bot_not_alive")
58
57
 
59
- 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
+ )
60
61
 
61
62
  if client.sid is not None:
62
63
  structlogger.debug(
@@ -71,20 +72,24 @@ async def socketio_websocket_traffic_wrapper(
71
72
  raise ConnectionRefusedError("model_runner.bot_connection_failed")
72
73
 
73
74
 
74
- 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:
75
78
  """Create handlers for the socket server side.
76
79
 
77
80
  Forwards messages coming from the user to the bot.
78
81
  """
79
82
 
80
- @sio.on("connect")
83
+ @sio_server.on("connect")
81
84
  async def socketio_websocket_traffic(
82
85
  sid: str, environ: Dict, auth: Optional[Dict]
83
86
  ) -> bool:
84
87
  """Bridge websockets between user chat socket and bot server."""
85
- 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
+ )
86
91
 
87
- @sio.on("disconnect")
92
+ @sio_server.on("disconnect")
88
93
  async def disconnect(sid: str) -> None:
89
94
  """Disconnect the bot connection."""
90
95
  structlogger.debug("model_runner.bot_disconnect", sid=sid)
@@ -92,7 +97,7 @@ def create_bridge_server(sio: AsyncServer, running_bots: Dict[str, BotSession])
92
97
  await socket_proxy_clients[sid].disconnect()
93
98
  del socket_proxy_clients[sid]
94
99
 
95
- @sio.on("*")
100
+ @sio_server.on("*")
96
101
  async def handle_message(event: str, sid: str, data: Dict[str, Any]) -> None:
97
102
  """Bridge messages between user and bot.
98
103
 
@@ -109,7 +114,7 @@ def create_bridge_server(sio: AsyncServer, running_bots: Dict[str, BotSession])
109
114
 
110
115
 
111
116
  async def create_bridge_client(
112
- sio: AsyncServer, url: str, sid: str, deployment_id: str
117
+ sio_server: AsyncServer, url: str, sid: str, deployment_id: str
113
118
  ) -> AsyncClient:
114
119
  """Create a new socket bridge client.
115
120
 
@@ -124,29 +129,36 @@ async def create_bridge_client(
124
129
  structlogger.debug(
125
130
  "model_runner.bot_session_confirmed", deployment_id=deployment_id
126
131
  )
127
- await sio.emit("session_confirm", room=sid)
132
+ await sio_server.emit("session_confirm", room=sid)
128
133
 
129
134
  @client.event # type: ignore[misc]
130
135
  async def bot_message(data: Dict[str, Any]) -> None:
131
136
  structlogger.debug("model_runner.bot_message", deployment_id=deployment_id)
132
- await sio.emit("bot_message", data, room=sid)
137
+ await sio_server.emit("bot_message", data, room=sid)
138
+
139
+ @client.event # type: ignore[misc]
140
+ async def error(data: Dict[str, Any]) -> None:
141
+ structlogger.debug(
142
+ "model_runner.bot_error", deployment_id=deployment_id, data=data
143
+ )
144
+ await sio_server.emit("error", data, room=sid)
133
145
 
134
146
  @client.event # type: ignore[misc]
135
147
  async def tracker(data: Dict[str, Any]) -> None:
136
- await sio.emit("tracker", json.loads(data), room=sid)
148
+ await sio_server.emit("tracker", json.loads(data), room=sid)
137
149
 
138
150
  @client.event # type: ignore[misc]
139
151
  async def disconnect() -> None:
140
152
  structlogger.debug(
141
153
  "model_runner.bot_connection_closed", deployment_id=deployment_id
142
154
  )
143
- await sio.emit("disconnect", room=sid)
155
+ await sio_server.emit("disconnect", room=sid)
144
156
 
145
157
  @client.event # type: ignore[misc]
146
158
  async def connect_error() -> None:
147
159
  structlogger.error(
148
160
  "model_runner.bot_connection_error", deployment_id=deployment_id
149
161
  )
150
- await sio.emit("disconnect", room=sid)
162
+ await sio_server.emit("disconnect", room=sid)
151
163
 
152
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:
@@ -5,15 +5,11 @@ from typing import Optional
5
5
  import structlog
6
6
 
7
7
  from rasa.model_manager import config
8
- from rasa.shared.exceptions import RasaException
8
+ from rasa.utils.io import subpath
9
9
 
10
10
  structlogger = structlog.get_logger()
11
11
 
12
12
 
13
- class InvalidPathException(RasaException):
14
- """Raised if a path is invalid - e.g. path traversal is detected."""
15
-
16
-
17
13
  def write_encoded_data_to_file(encoded_data: bytes, file: str) -> None:
18
14
  """Write base64 encoded data to a file."""
19
15
  # create the directory if it does not exist of the parent directory
@@ -53,30 +49,6 @@ def logs_path(action_id: str) -> str:
53
49
  return subpath(logs_base_path(), f"{action_id}.txt")
54
50
 
55
51
 
56
- def subpath(parent: str, child: str) -> str:
57
- """Return the path to the child directory of the parent directory.
58
-
59
- Ensures, that child doesn't navigate to parent directories. Prevents
60
- path traversal. Raises an InvalidPathException if the path is invalid.
61
-
62
- Based on Snyk's directory traversal mitigation:
63
- https://learn.snyk.io/lesson/directory-traversal/
64
- """
65
- safe_path = os.path.abspath(os.path.join(parent, child))
66
- parent = os.path.abspath(parent)
67
-
68
- common_base = os.path.commonpath([parent, safe_path])
69
- if common_base != parent:
70
- raise InvalidPathException(f"Invalid path: {safe_path}")
71
-
72
- if os.path.basename(safe_path) != child:
73
- raise InvalidPathException(
74
- f"Invalid path - path traversal detected: {safe_path}"
75
- )
76
-
77
- return safe_path
78
-
79
-
80
52
  def get_logs_content(action_id: str) -> Optional[str]:
81
53
  """Return the content of the log file for a given action id."""
82
54
  try: