rasa-pro 3.14.0.dev20250825__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 (350) 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/inspector/dist/assets/{arc-1ddec37b.js → arc-18042c22.js} +1 -1
  278. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-18af387c.js → blockDiagram-38ab4fdb-fdd6bcfa.js} +1 -1
  279. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-250127a3.js → c4Diagram-3d4e48cf-f5ae6786.js} +1 -1
  280. rasa/core/channels/inspector/dist/assets/channel-b9b536fc.js +1 -0
  281. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-c3388b34.js → classDiagram-70f12bd4-81efba3e.js} +1 -1
  282. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-9c893a82.js → classDiagram-v2-f2320105-3b6b6a92.js} +1 -1
  283. rasa/core/channels/inspector/dist/assets/clone-78d2ddcf.js +1 -0
  284. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-c111213b.js → createText-2e5e7dd3-31422447.js} +1 -1
  285. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-812a729d.js → edges-e0da2a9e-518a90db.js} +1 -1
  286. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-fd5051bc.js → erDiagram-9861fffd-a6d3c25a.js} +1 -1
  287. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-3287ac02.js → flowDb-956e92f1-e048c2be.js} +1 -1
  288. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-692fb0b2.js → flowDiagram-66a62f08-c7474c91.js} +1 -1
  289. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-8b09c060.js +1 -0
  290. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-008376f1.js → flowchart-elk-definition-4a651766-cb4d8723.js} +1 -1
  291. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-df330a69.js → ganttDiagram-c361ad54-346636a2.js} +1 -1
  292. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-e03676fb.js → gitGraphDiagram-72cf32ee-7c508874.js} +1 -1
  293. rasa/core/channels/inspector/dist/assets/{graph-46fad2ba.js → graph-14702d8a.js} +1 -1
  294. rasa/core/channels/inspector/dist/assets/{index-3862675e-a484ac55.js → index-3862675e-f18b534b.js} +1 -1
  295. rasa/core/channels/inspector/dist/assets/{index-a003633f.js → index-4d4bdf3a.js} +231 -231
  296. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-3f9e6ec2.js → infoDiagram-f8f76790-64154b83.js} +1 -1
  297. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-79f72383.js → journeyDiagram-49397b02-833a5f95.js} +1 -1
  298. rasa/core/channels/inspector/dist/assets/{layout-aad098e5.js → layout-5a3b2123.js} +1 -1
  299. rasa/core/channels/inspector/dist/assets/{line-219ab7ae.js → line-2272a8c7.js} +1 -1
  300. rasa/core/channels/inspector/dist/assets/{linear-2cddbe62.js → linear-35bcf273.js} +1 -1
  301. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-1d41ed99.js → mindmap-definition-fc14e90a-92dcb0e9.js} +1 -1
  302. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-cc496ee8.js → pieDiagram-8a3498a8-94dbc900.js} +1 -1
  303. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-84d32884.js → quadrantDiagram-120e2f19-8b7a9c33.js} +1 -1
  304. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-c0deb984.js → requirementDiagram-deff3bca-6f7eab81.js} +1 -1
  305. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-b9d7fd62.js → sankeyDiagram-04a897e0-f43e581d.js} +1 -1
  306. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-7d517565.js → sequenceDiagram-704730f1-0bcbefc3.js} +1 -1
  307. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-98ef9b27.js → stateDiagram-587899a1-b8a74083.js} +1 -1
  308. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-cee70748.js → stateDiagram-v2-d93cdb3a-2070218f.js} +1 -1
  309. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-3f9d1c96.js → styles-6aaf32cf-f1d54e34.js} +1 -1
  310. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-67471923.js → styles-9a916d00-980de489.js} +1 -1
  311. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-bd093fb7.js → styles-c10674c1-3c03abde.js} +1 -1
  312. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-675794e8.js → svgDrawCommon-08f97a94-46ba068f.js} +1 -1
  313. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-0ac67617.js → timeline-definition-85554ec2-901f5e3d.js} +1 -1
  314. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-c018dc37.js → xychartDiagram-e933f94c-acbc628a.js} +1 -1
  315. rasa/core/channels/inspector/dist/index.html +2 -2
  316. rasa/core/channels/inspector/index.html +1 -1
  317. rasa/core/channels/inspector/src/App.tsx +10 -11
  318. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +12 -3
  319. rasa/core/channels/studio_chat.py +25 -7
  320. rasa/core/policies/enterprise_search_policy.py +4 -7
  321. rasa/core/policies/flows/flow_executor.py +8 -1
  322. rasa/dialogue_understanding/generator/flow_retrieval.py +10 -9
  323. rasa/engine/storage/local_model_storage.py +45 -2
  324. rasa/model_manager/model_api.py +1 -2
  325. rasa/model_manager/runner_service.py +1 -1
  326. rasa/model_manager/trainer_service.py +12 -9
  327. rasa/model_manager/utils.py +1 -29
  328. rasa/shared/core/domain.py +62 -15
  329. rasa/shared/core/flows/flow_step.py +7 -1
  330. rasa/shared/core/flows/steps/call.py +8 -1
  331. rasa/shared/core/flows/yaml_flows_io.py +16 -8
  332. rasa/shared/core/slots.py +4 -0
  333. rasa/shared/importers/importer.py +6 -0
  334. rasa/shared/importers/utils.py +77 -1
  335. rasa/studio/upload.py +12 -46
  336. rasa/telemetry.py +97 -23
  337. rasa/utils/io.py +27 -9
  338. rasa/utils/json_utils.py +6 -1
  339. rasa/utils/log_utils.py +5 -1
  340. rasa/utils/openapi.py +144 -0
  341. rasa/validator.py +7 -3
  342. rasa/version.py +1 -1
  343. {rasa_pro-3.14.0.dev20250825.dist-info → rasa_pro-3.14.0.dev20250901.dist-info}/METADATA +9 -10
  344. {rasa_pro-3.14.0.dev20250825.dist-info → rasa_pro-3.14.0.dev20250901.dist-info}/RECORD +347 -73
  345. rasa/core/channels/inspector/dist/assets/channel-59f6d54b.js +0 -1
  346. rasa/core/channels/inspector/dist/assets/clone-26177ddb.js +0 -1
  347. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-29c03f5a.js +0 -1
  348. {rasa_pro-3.14.0.dev20250825.dist-info → rasa_pro-3.14.0.dev20250901.dist-info}/NOTICE +0 -0
  349. {rasa_pro-3.14.0.dev20250825.dist-info → rasa_pro-3.14.0.dev20250901.dist-info}/WHEEL +0 -0
  350. {rasa_pro-3.14.0.dev20250825.dist-info → rasa_pro-3.14.0.dev20250901.dist-info}/entry_points.txt +0 -0
@@ -5,26 +5,25 @@ import {
5
5
  useColorModeValue,
6
6
  useToast,
7
7
  } from '@chakra-ui/react'
8
- import { useEffect, useState, useCallback } from 'react'
9
8
  import axios from 'axios'
10
- import { useOurTheme } from './theme'
11
- import { Welcome } from './components/Welcome'
12
- import { DialogueStack } from './components/DialogueStack'
9
+ import queryString from 'query-string'
10
+ import { useCallback, useEffect, useState } from 'react'
11
+ import useWebSocket, { ReadyState } from 'react-use-websocket'
12
+ import { Chat } from './components/Chat'
13
+ import { DiagramFlow } from './components/DiagramFlow'
13
14
  import { DialougeInformation } from './components/DialogueInformation'
15
+ import { DialogueStack } from './components/DialogueStack'
14
16
  import { LoadingSpinner } from './components/LoadingSpinner'
15
- import { DiagramFlow } from './components/DiagramFlow'
16
17
  import { RecruitmentPanel } from './components/RecruitmentPanel'
18
+ import { Welcome } from './components/Welcome'
17
19
  import { formatSlots } from './helpers/formatters'
18
- import { Slot, Stack, Event, Flow, SelectedStack, Tracker } from './types'
19
20
  import {
20
21
  createHistoricalStack,
21
22
  flowStepTrail,
22
23
  updatedActiveFrame,
23
24
  } from './helpers/utils'
24
- import queryString from 'query-string'
25
- import { Chat } from './components/Chat'
26
- import { LatencyDisplay } from './components/LatencyDisplay'
27
- import useWebSocket, { ReadyState } from 'react-use-websocket'
25
+ import { useOurTheme } from './theme'
26
+ import { Event, Flow, SelectedStack, Slot, Stack, Tracker } from './types'
28
27
 
29
28
  export function App() {
30
29
  const toast = useToast()
@@ -252,6 +251,7 @@ export function App() {
252
251
  slots={slots}
253
252
  events={events}
254
253
  story={story}
254
+ latency={latency}
255
255
  />
256
256
  </Grid>
257
257
  </GridItem>
@@ -265,7 +265,6 @@ export function App() {
265
265
  </GridItem>
266
266
  <GridItem overflow="hidden">
267
267
  <Grid sx={rightColumnSx}>
268
- <LatencyDisplay latency={latency} sx={boxSx} />
269
268
  {shouldShowTranscript && (
270
269
  <GridItem sx={chatContainerSx}>
271
270
  <Chat events={events || []} />
@@ -13,13 +13,14 @@ import {
13
13
  useTab,
14
14
  useToast,
15
15
  } from '@chakra-ui/react'
16
+ import { useEffect } from 'react'
16
17
  import { Light as SyntaxHighlighter } from 'react-syntax-highlighter'
18
+ import { useCopyToClipboard } from 'usehooks-ts'
19
+ import { formatTestCases } from '../helpers/formatters'
17
20
  import { useOurTheme } from '../theme'
18
21
  import { Event, Slot } from '../types'
19
- import { formatTestCases } from '../helpers/formatters'
20
- import { useCopyToClipboard } from 'usehooks-ts'
21
- import { useEffect } from 'react'
22
22
  import { FullscreenButton } from './FullscreenButton'
23
+ import { LatencyDisplay } from './LatencyDisplay'
23
24
  import { SlotTable, Slots } from './Slots'
24
25
 
25
26
  interface Props extends FlexProps {
@@ -27,6 +28,7 @@ interface Props extends FlexProps {
27
28
  events: Event[]
28
29
  story: string
29
30
  slots: Slot[]
31
+ latency: any
30
32
  }
31
33
 
32
34
  export const DialougeInformation = ({
@@ -35,6 +37,7 @@ export const DialougeInformation = ({
35
37
  events,
36
38
  story,
37
39
  slots,
40
+ latency,
38
41
  ...props
39
42
  }: Props) => {
40
43
  const toast = useToast()
@@ -105,6 +108,7 @@ export const DialougeInformation = ({
105
108
  <CustomTab>Slots</CustomTab>
106
109
  <CustomTab>End-2-end test</CustomTab>
107
110
  <CustomTab>Tracker state</CustomTab>
111
+ <CustomTab>Latency</CustomTab>
108
112
  </TabList>
109
113
  <TabPanels height="100%" overflow="hidden">
110
114
  <TabPanel sx={tabPanelSx}>
@@ -160,6 +164,11 @@ export const DialougeInformation = ({
160
164
  </FullscreenButton>
161
165
  </HStack>
162
166
  </TabPanel>
167
+ <TabPanel sx={tabPanelSx}>
168
+ <Box sx={overflowBox}>
169
+ <LatencyDisplay latency={latency} />
170
+ </Box>
171
+ </TabPanel>
163
172
  </TabPanels>
164
173
  </Tabs>
165
174
  </Flex>
@@ -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
@@ -55,7 +55,7 @@ structlogger = structlog.get_logger()
55
55
 
56
56
  def tracker_as_dump(
57
57
  tracker: "DialogueStateTracker", latency: Optional[float] = None
58
- ) -> str:
58
+ ) -> Dict[str, Any]:
59
59
  """Create a dump of the tracker state."""
60
60
  from rasa.shared.core.trackers import get_trackers_for_conversation_sessions
61
61
 
@@ -66,11 +66,14 @@ def tracker_as_dump(
66
66
  else:
67
67
  last_tracker = multiple_tracker_sessions[-1]
68
68
 
69
+ # TODO: this is a bug: the bridge converts this back to json, but it
70
+ # should be json in the first place
69
71
  state = last_tracker.current_state(EventVerbosity.AFTER_RESTART)
70
72
 
71
73
  if latency is not None:
72
74
  state["latency"] = {"rasa_processing_latency_ms": latency}
73
- return orjson.dumps(state, option=orjson.OPT_SERIALIZE_NUMPY).decode("utf-8")
75
+
76
+ return state
74
77
 
75
78
 
76
79
  def does_need_action_prediction(tracker: "DialogueStateTracker") -> bool:
@@ -214,7 +217,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
214
217
  enable_silence_timeout=credentials.get("enable_silence_timeout", False),
215
218
  )
216
219
 
217
- 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:
218
221
  """Emits an event to the websocket."""
219
222
  if not self.sio_server:
220
223
  structlogger.error("studio_chat.emit.sio_not_initialized")
@@ -260,7 +263,14 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
260
263
  Triggers a tracker update notification after processing the message.
261
264
  """
262
265
  self._record_turn_start_time(message.sender_id)
263
- 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
+ )
264
274
 
265
275
  if not self.agent or not self.agent.is_ready():
266
276
  structlogger.error("studio_chat.on_message_proxy.agent_not_initialized")
@@ -508,8 +518,16 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
508
518
  ws.put_message(data)
509
519
  return
510
520
 
511
- # Handle text messages
512
- 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)
513
531
 
514
532
  @self.sio_server.on("update_tracker", namespace=self.namespace)
515
533
  async def on_update_tracker(sid: Text, data: Dict) -> None:
@@ -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
 
@@ -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 = (
@@ -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
 
@@ -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
 
@@ -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:
@@ -98,6 +98,8 @@ IS_RETRIEVAL_INTENT_KEY = "is_retrieval_intent"
98
98
  ENTITY_ROLES_KEY = "roles"
99
99
  ENTITY_GROUPS_KEY = "groups"
100
100
  ENTITY_FEATURIZATION_KEY = "influence_conversation"
101
+ STORE_ENTITIES_AS_SLOTS_KEY = "store_entities_as_slots"
102
+ DOMAIN_CONFIG_KEY = "config"
101
103
 
102
104
  KEY_SLOTS = "slots"
103
105
  KEY_INTENTS = "intents"
@@ -146,6 +148,8 @@ MERGE_FUNC_MAPPING: Dict[Text, Callable[..., Any]] = {
146
148
  KEY_FORMS: rasa.shared.utils.common.merge_dicts,
147
149
  }
148
150
 
151
+ DEFAULT_STORE_ENTITIES_AS_SLOTS = True
152
+
149
153
  DICT_DATA_KEYS = [
150
154
  key
151
155
  for key, value in MERGE_FUNC_MAPPING.items()
@@ -318,7 +322,7 @@ class Domain:
318
322
  actions = cls._collect_action_names(domain_actions)
319
323
 
320
324
  additional_arguments = {
321
- **data.get("config", {}),
325
+ **data.get(DOMAIN_CONFIG_KEY, {}),
322
326
  "actions_which_explicitly_need_domain": (
323
327
  cls._collect_actions_which_explicitly_need_domain(domain_actions)
324
328
  ),
@@ -468,9 +472,9 @@ class Domain:
468
472
  return domain_dict
469
473
 
470
474
  if override:
471
- config = domain_dict.get("config", {})
475
+ config = domain_dict.get(DOMAIN_CONFIG_KEY, {})
472
476
  for key, val in config.items():
473
- combined["config"][key] = val
477
+ combined[DOMAIN_CONFIG_KEY][key] = val
474
478
 
475
479
  if (
476
480
  override
@@ -508,10 +512,10 @@ class Domain:
508
512
  return combined
509
513
 
510
514
  def partial_merge(self, other: Domain) -> Domain:
511
- """
512
- Returns a new Domain with intersection-based merging:
513
- - For each domain section only overwrite items that already exist in self.
514
- - Brand-new items in `other` are ignored.
515
+ """Returns a new Domain with intersection-based merging.
516
+
517
+ For each domain section only overwrite items that already exist in self.
518
+ Brand-new items in `other` are ignored.
515
519
 
516
520
  Args:
517
521
  other: The domain to merge with.
@@ -543,9 +547,9 @@ class Domain:
543
547
  return Domain.from_dict(updated_self)
544
548
 
545
549
  def difference(self, other: Domain) -> Domain:
546
- """
547
- Returns a new Domain containing items in `self` that are NOT in `other`,
548
- using simple equality checks for dict/list items.
550
+ """Returns a new Domain containing items in `self` that are NOT in `other`.
551
+
552
+ Uses simple equality checks for dict/list items.
549
553
 
550
554
  Args:
551
555
  other: The domain to compare with.
@@ -598,9 +602,16 @@ class Domain:
598
602
  ) -> Dict:
599
603
  # add the config, session_config and training data version defaults
600
604
  # if not included in the original domain dict
601
- if "config" not in data and not store_entities_as_slots:
605
+ if (
606
+ DOMAIN_CONFIG_KEY not in data
607
+ and store_entities_as_slots != DEFAULT_STORE_ENTITIES_AS_SLOTS
608
+ ):
602
609
  data.update(
603
- {"config": {"store_entities_as_slots": store_entities_as_slots}}
610
+ {
611
+ DOMAIN_CONFIG_KEY: {
612
+ STORE_ENTITIES_AS_SLOTS_KEY: store_entities_as_slots
613
+ }
614
+ }
604
615
  )
605
616
 
606
617
  if SESSION_CONFIG_KEY not in data:
@@ -937,7 +948,7 @@ class Domain:
937
948
  forms: Union[Dict[Text, Any], List[Text]],
938
949
  data: Dict,
939
950
  action_texts: Optional[List[Text]] = None,
940
- store_entities_as_slots: bool = True,
951
+ store_entities_as_slots: bool = DEFAULT_STORE_ENTITIES_AS_SLOTS,
941
952
  session_config: SessionConfig = SessionConfig.default(),
942
953
  **kwargs: Any,
943
954
  ) -> None:
@@ -1711,9 +1722,45 @@ class Domain:
1711
1722
  else:
1712
1723
  return True
1713
1724
 
1714
- def as_dict(self) -> Dict[Text, Any]:
1725
+ def _uses_custom_session_config(self) -> bool:
1726
+ """Check if the domain uses a custom session config."""
1727
+ return self._data.get(SESSION_CONFIG_KEY) != SessionConfig.default().as_dict()
1728
+
1729
+ def _uses_custom_domain_config(self) -> bool:
1730
+ """Check if the domain uses a custom domain config."""
1731
+ return self._data.get(DOMAIN_CONFIG_KEY) != {
1732
+ STORE_ENTITIES_AS_SLOTS_KEY: DEFAULT_STORE_ENTITIES_AS_SLOTS
1733
+ }
1734
+
1735
+ def _cleaned_json_data(self) -> Dict[Text, Any]:
1736
+ """Remove default values from the domain data.
1737
+
1738
+ Only retains data that was customized by the user.
1739
+
1740
+ Returns:
1741
+ A cleaned dictionary version of the domain.
1742
+ """
1743
+ cleaned_data = copy.deepcopy(self._data)
1744
+
1745
+ # Remove default config if it only contains store_entities_as_slots: False
1746
+ if DOMAIN_CONFIG_KEY in cleaned_data and not self._uses_custom_domain_config():
1747
+ del cleaned_data[DOMAIN_CONFIG_KEY]
1748
+
1749
+ # Remove default session config if it matches the default values
1750
+ if (
1751
+ SESSION_CONFIG_KEY in cleaned_data
1752
+ and not self._uses_custom_session_config()
1753
+ ):
1754
+ del cleaned_data[SESSION_CONFIG_KEY]
1755
+
1756
+ return cleaned_data
1757
+
1758
+ def as_dict(self, should_clean_json: bool = False) -> Dict[Text, Any]:
1715
1759
  """Return serialized `Domain`."""
1716
- return self._data
1760
+ if should_clean_json:
1761
+ return self._cleaned_json_data()
1762
+ else:
1763
+ return self._data
1717
1764
 
1718
1765
  @staticmethod
1719
1766
  def get_responses_with_multilines(
@@ -52,7 +52,13 @@ def step_from_json(flow_id: Text, data: Dict[Text, Any]) -> FlowStep:
52
52
  return SetSlotsFlowStep.from_json(flow_id, data)
53
53
  if "noop" in data:
54
54
  return NoOperationFlowStep.from_json(flow_id, data)
55
- raise RasaException(f"Failed to parse step from json. Unknown type for {data}.")
55
+
56
+ required_properties = ["action", "collect", "link", "call", "set_slots", "noop"]
57
+ raise RasaException(
58
+ f"Failed to parse step from json. Unknown type for {data}. "
59
+ f"At least one of the following properties is required: "
60
+ f"{', '.join(required_properties)}"
61
+ )
56
62
 
57
63
 
58
64
  @dataclass
@@ -50,7 +50,14 @@ class CallFlowStep(FlowStep):
50
50
 
51
51
  if should_resolve_calls:
52
52
  if not self.called_flow_reference:
53
- raise ValueError("Call flow reference not set.")
53
+ raise ValueError(
54
+ f"Flow step '{self.id}' in flow '{self.flow_id}' is trying "
55
+ f"to call flow '{self.call}', but the flow reference could "
56
+ f"not be resolved. Please ensure that:\n"
57
+ f"1. A flow named '{self.call}' is defined in your domain\n"
58
+ f"2. The flow name is spelled correctly (case-sensitive)\n"
59
+ f"3. The called flow is properly formatted with valid YAML syntax"
60
+ )
54
61
 
55
62
  yield from self.called_flow_reference.steps_with_calls_resolved
56
63