rasa-pro 3.14.0.dev6__py3-none-any.whl → 3.14.0.dev8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rasa-pro might be problematic. Click here for more details.

Files changed (491) hide show
  1. rasa/agents/agent_manager.py +1 -1
  2. rasa/agents/constants.py +2 -2
  3. rasa/agents/exceptions.py +31 -1
  4. rasa/agents/protocol/a2a/a2a_agent.py +385 -227
  5. rasa/agents/protocol/mcp/mcp_base_agent.py +37 -19
  6. rasa/agents/protocol/mcp/mcp_open_agent.py +31 -8
  7. rasa/agents/protocol/mcp/mcp_task_agent.py +33 -10
  8. rasa/agents/schemas/agent_output.py +1 -1
  9. rasa/agents/utils.py +95 -1
  10. rasa/agents/validation.py +484 -0
  11. rasa/api.py +9 -6
  12. rasa/builder/README.md +120 -0
  13. rasa/builder/__init__.py +0 -0
  14. rasa/builder/auth.py +176 -0
  15. rasa/builder/config.py +92 -0
  16. rasa/builder/copilot/__init__.py +0 -0
  17. rasa/builder/copilot/constants.py +31 -0
  18. rasa/builder/copilot/copilot.py +450 -0
  19. rasa/builder/copilot/copilot_response_handler.py +522 -0
  20. rasa/builder/copilot/copilot_templated_message_provider.py +58 -0
  21. rasa/builder/copilot/exceptions.py +32 -0
  22. rasa/builder/copilot/models.py +500 -0
  23. rasa/builder/copilot/prompts/__init__.py +0 -0
  24. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +766 -0
  25. rasa/builder/copilot/prompts/latest_user_message_context_prompt.jinja2 +61 -0
  26. rasa/builder/copilot/signing.py +305 -0
  27. rasa/builder/copilot/telemetry.py +210 -0
  28. rasa/builder/copilot/templated_messages/__init__.py +0 -0
  29. rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +16 -0
  30. rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +38 -0
  31. rasa/builder/document_retrieval/__init__.py +0 -0
  32. rasa/builder/document_retrieval/constants.py +15 -0
  33. rasa/builder/document_retrieval/inkeep-rag-response-schema.json +64 -0
  34. rasa/builder/document_retrieval/inkeep_document_retrieval.py +238 -0
  35. rasa/builder/document_retrieval/models.py +62 -0
  36. rasa/builder/download.py +140 -0
  37. rasa/builder/exceptions.py +91 -0
  38. rasa/builder/guardrails/__init__.py +1 -0
  39. rasa/builder/guardrails/constants.py +9 -0
  40. rasa/builder/guardrails/exceptions.py +4 -0
  41. rasa/builder/guardrails/lakera.py +206 -0
  42. rasa/builder/guardrails/models.py +231 -0
  43. rasa/builder/guardrails/store.py +238 -0
  44. rasa/builder/guardrails/utils.py +328 -0
  45. rasa/builder/job_manager.py +87 -0
  46. rasa/builder/jobs.py +282 -0
  47. rasa/builder/llm_service.py +246 -0
  48. rasa/builder/logging_utils.py +265 -0
  49. rasa/builder/main.py +243 -0
  50. rasa/builder/models.py +216 -0
  51. rasa/builder/project_generator.py +458 -0
  52. rasa/builder/project_info.py +72 -0
  53. rasa/builder/scrape_rasa_docs.py +97 -0
  54. rasa/builder/service.py +1345 -0
  55. rasa/builder/shared/tracker_context.py +212 -0
  56. rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
  57. rasa/builder/template_cache.py +244 -0
  58. rasa/builder/training_service.py +194 -0
  59. rasa/builder/validation_service.py +97 -0
  60. rasa/cli/arguments/train.py +2 -0
  61. rasa/cli/interactive.py +2 -0
  62. rasa/cli/project_templates/basic/README.md +23 -0
  63. rasa/cli/project_templates/basic/actions/__init__ +0 -0
  64. rasa/cli/project_templates/basic/actions/action_human_handoff.py +40 -0
  65. rasa/cli/project_templates/basic/actions/actions.md +10 -0
  66. rasa/cli/project_templates/basic/config.yml +29 -0
  67. rasa/cli/project_templates/basic/credentials.yml +33 -0
  68. rasa/cli/project_templates/basic/data/data.md +9 -0
  69. rasa/cli/project_templates/basic/data/general/feedback.yml +21 -0
  70. rasa/cli/project_templates/basic/data/general/goodbye.yml +6 -0
  71. rasa/cli/project_templates/basic/data/general/hello.yml +6 -0
  72. rasa/cli/project_templates/basic/data/general/help.yml +6 -0
  73. rasa/cli/project_templates/basic/data/general/human_handoff.yml +16 -0
  74. rasa/cli/project_templates/basic/data/general/show_faqs.yml +6 -0
  75. rasa/cli/project_templates/basic/data/system/patterns/pattern_cannot_handle.yml +7 -0
  76. rasa/cli/project_templates/basic/data/system/patterns/pattern_completed.yml +7 -0
  77. rasa/cli/project_templates/basic/data/system/patterns/pattern_correction.yml +7 -0
  78. rasa/cli/project_templates/basic/data/system/patterns/pattern_search.yml +8 -0
  79. rasa/cli/project_templates/basic/data/system/patterns/pattern_session_start.yml +8 -0
  80. rasa/cli/project_templates/basic/docs/docs.md +5 -0
  81. rasa/cli/project_templates/basic/docs/template.txt +28 -0
  82. rasa/cli/project_templates/basic/domain/domain.md +8 -0
  83. rasa/cli/project_templates/basic/domain/general/feedback.yml +25 -0
  84. rasa/cli/project_templates/basic/domain/general/goodbye.yml +9 -0
  85. rasa/cli/project_templates/basic/domain/general/hello.yml +7 -0
  86. rasa/cli/project_templates/basic/domain/general/help.yml +21 -0
  87. rasa/cli/project_templates/basic/domain/general/human_handoff.yml +32 -0
  88. rasa/cli/project_templates/basic/domain/general/show_faqs.yml +14 -0
  89. rasa/cli/project_templates/basic/domain/system/patterns/pattern_cannot_handle.yml +5 -0
  90. rasa/cli/project_templates/basic/domain/system/patterns/pattern_session_start.yml +19 -0
  91. rasa/cli/project_templates/basic/endpoints.yml +67 -0
  92. rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +38 -0
  93. rasa/cli/project_templates/default/config.yml +4 -0
  94. rasa/cli/project_templates/default/endpoints.yml +4 -0
  95. rasa/cli/project_templates/finance/README.md +25 -0
  96. rasa/cli/project_templates/finance/actions/__init__.py +46 -0
  97. rasa/cli/project_templates/finance/actions/accounts/__init__.py +0 -0
  98. rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +47 -0
  99. rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +40 -0
  100. rasa/cli/project_templates/finance/actions/action_session_start.py +74 -0
  101. rasa/cli/project_templates/finance/actions/actions.md +15 -0
  102. rasa/cli/project_templates/finance/actions/cards/__init__.py +0 -0
  103. rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +48 -0
  104. rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +36 -0
  105. rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +54 -0
  106. rasa/cli/project_templates/finance/actions/database.py +277 -0
  107. rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
  108. rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +52 -0
  109. rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +51 -0
  110. rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +40 -0
  111. rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +40 -0
  112. rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +46 -0
  113. rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +18 -0
  114. rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +49 -0
  115. rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +19 -0
  116. rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +36 -0
  117. rasa/cli/project_templates/finance/config.yml +23 -0
  118. rasa/cli/project_templates/finance/credentials.yml +32 -0
  119. rasa/cli/project_templates/finance/csvs/accounts.csv +8 -0
  120. rasa/cli/project_templates/finance/csvs/advisors.csv +7 -0
  121. rasa/cli/project_templates/finance/csvs/appointments.csv +211 -0
  122. rasa/cli/project_templates/finance/csvs/branches.csv +10 -0
  123. rasa/cli/project_templates/finance/csvs/cards.csv +11 -0
  124. rasa/cli/project_templates/finance/csvs/payees.csv +11 -0
  125. rasa/cli/project_templates/finance/csvs/transactions.csv +71 -0
  126. rasa/cli/project_templates/finance/csvs/users.csv +4 -0
  127. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +10 -0
  128. rasa/cli/project_templates/finance/data/cards/block_card.yml +66 -0
  129. rasa/cli/project_templates/finance/data/cards/select_card.yml +12 -0
  130. rasa/cli/project_templates/finance/data/data.md +11 -0
  131. rasa/cli/project_templates/finance/data/general/bot_identity.yml +6 -0
  132. rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
  133. rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
  134. rasa/cli/project_templates/finance/data/general/hello.yml +7 -0
  135. rasa/cli/project_templates/finance/data/general/help.yml +9 -0
  136. rasa/cli/project_templates/finance/data/general/human_handoff.yml +16 -0
  137. rasa/cli/project_templates/finance/data/general/welcome.yml +9 -0
  138. rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +5 -0
  139. rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +7 -0
  140. rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +7 -0
  141. rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +8 -0
  142. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +8 -0
  143. rasa/cli/project_templates/finance/data/system/source/accounts.json +51 -0
  144. rasa/cli/project_templates/finance/data/system/source/advisors.json +44 -0
  145. rasa/cli/project_templates/finance/data/system/source/appointments.json +1474 -0
  146. rasa/cli/project_templates/finance/data/system/source/branches.json +47 -0
  147. rasa/cli/project_templates/finance/data/system/source/cards.json +72 -0
  148. rasa/cli/project_templates/finance/data/system/source/payees.json +74 -0
  149. rasa/cli/project_templates/finance/data/system/source/transactions.json +492 -0
  150. rasa/cli/project_templates/finance/data/system/source/users.json +29 -0
  151. rasa/cli/project_templates/finance/data/transfers/add_payee.yml +29 -0
  152. rasa/cli/project_templates/finance/data/transfers/list_payees.yml +5 -0
  153. rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +21 -0
  154. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +67 -0
  155. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +8 -0
  156. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +8 -0
  157. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +8 -0
  158. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +8 -0
  159. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +8 -0
  160. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +7 -0
  161. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +8 -0
  162. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +8 -0
  163. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +8 -0
  164. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +8 -0
  165. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +8 -0
  166. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +8 -0
  167. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +8 -0
  168. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +8 -0
  169. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +8 -0
  170. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +8 -0
  171. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +8 -0
  172. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +8 -0
  173. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +8 -0
  174. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +8 -0
  175. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +50 -0
  176. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +50 -0
  177. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +48 -0
  178. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +50 -0
  179. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +50 -0
  180. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +47 -0
  181. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +50 -0
  182. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +50 -0
  183. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +47 -0
  184. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +50 -0
  185. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +50 -0
  186. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +50 -0
  187. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +47 -0
  188. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +50 -0
  189. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +50 -0
  190. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +47 -0
  191. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +50 -0
  192. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +50 -0
  193. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +47 -0
  194. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +50 -0
  195. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +50 -0
  196. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +47 -0
  197. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +47 -0
  198. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +50 -0
  199. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +50 -0
  200. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +47 -0
  201. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +50 -0
  202. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +50 -0
  203. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +47 -0
  204. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +50 -0
  205. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +50 -0
  206. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +47 -0
  207. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +50 -0
  208. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +50 -0
  209. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +50 -0
  210. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +47 -0
  211. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +50 -0
  212. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +50 -0
  213. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +47 -0
  214. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +50 -0
  215. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +50 -0
  216. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +47 -0
  217. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +50 -0
  218. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +50 -0
  219. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +50 -0
  220. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +47 -0
  221. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +50 -0
  222. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +50 -0
  223. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +47 -0
  224. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +50 -0
  225. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +50 -0
  226. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +47 -0
  227. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +50 -0
  228. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +50 -0
  229. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +47 -0
  230. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +47 -0
  231. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +50 -0
  232. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +50 -0
  233. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +50 -0
  234. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +50 -0
  235. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +47 -0
  236. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +11 -0
  237. rasa/cli/project_templates/finance/domain/cards/block_card.yml +101 -0
  238. rasa/cli/project_templates/finance/domain/cards/select_card.yml +12 -0
  239. rasa/cli/project_templates/finance/domain/domain.md +10 -0
  240. rasa/cli/project_templates/finance/domain/general/agent_details.yml +12 -0
  241. rasa/cli/project_templates/finance/domain/general/bot_identity.yml +5 -0
  242. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +5 -0
  243. rasa/cli/project_templates/finance/domain/general/defaults.yml +24 -0
  244. rasa/cli/project_templates/finance/domain/general/feedback.yml +28 -0
  245. rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
  246. rasa/cli/project_templates/finance/domain/general/help.yml +5 -0
  247. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +30 -0
  248. rasa/cli/project_templates/finance/domain/general/utils.yml +13 -0
  249. rasa/cli/project_templates/finance/domain/general/welcome.yml +8 -0
  250. rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +47 -0
  251. rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +4 -0
  252. rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +16 -0
  253. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +79 -0
  254. rasa/cli/project_templates/finance/endpoints.yml +66 -0
  255. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +19 -0
  256. rasa/cli/project_templates/telco/README.md +25 -0
  257. rasa/cli/project_templates/telco/actions/__init__.py +0 -0
  258. rasa/cli/project_templates/telco/actions/actions.md +12 -0
  259. rasa/cli/project_templates/telco/actions/billing/__init__.py +0 -0
  260. rasa/cli/project_templates/telco/actions/billing/actions_billing.py +204 -0
  261. rasa/cli/project_templates/telco/actions/general/__init__.py +0 -0
  262. rasa/cli/project_templates/telco/actions/general/action_human_handoff.py +49 -0
  263. rasa/cli/project_templates/telco/actions/network/__init__.py +0 -0
  264. rasa/cli/project_templates/telco/actions/network/actions_get_data_from_db.py +48 -0
  265. rasa/cli/project_templates/telco/actions/network/actions_run_diagnostics.py +28 -0
  266. rasa/cli/project_templates/telco/actions/network/actions_session_start.py +18 -0
  267. rasa/cli/project_templates/telco/config.yml +29 -0
  268. rasa/cli/project_templates/telco/credentials.yml +33 -0
  269. rasa/cli/project_templates/telco/csvs/billing.csv +19 -0
  270. rasa/cli/project_templates/telco/csvs/customers.csv +5 -0
  271. rasa/cli/project_templates/telco/data/billing/flow_understand_bill.yml +45 -0
  272. rasa/cli/project_templates/telco/data/data.md +11 -0
  273. rasa/cli/project_templates/telco/data/general/bot_challenge.yml +6 -0
  274. rasa/cli/project_templates/telco/data/general/feedback.yml +20 -0
  275. rasa/cli/project_templates/telco/data/general/goodbye.yml +6 -0
  276. rasa/cli/project_templates/telco/data/general/hello.yml +6 -0
  277. rasa/cli/project_templates/telco/data/general/human_handoff.yml +16 -0
  278. rasa/cli/project_templates/telco/data/general/patterns.yml +30 -0
  279. rasa/cli/project_templates/telco/data/network/flow_reboot_router.yml +8 -0
  280. rasa/cli/project_templates/telco/data/network/flow_reset_router.yml +7 -0
  281. rasa/cli/project_templates/telco/data/network/flow_solve_internet_issue.yml +73 -0
  282. rasa/cli/project_templates/telco/docs/docs.md +5 -0
  283. rasa/cli/project_templates/telco/docs/network/reset_vs_rboot_router.txt +1 -0
  284. rasa/cli/project_templates/telco/docs/network/restart_router.txt +6 -0
  285. rasa/cli/project_templates/telco/docs/network/run_speed_test.txt +6 -0
  286. rasa/cli/project_templates/telco/domain/billing/understand_bill.yml +102 -0
  287. rasa/cli/project_templates/telco/domain/domain.md +14 -0
  288. rasa/cli/project_templates/telco/domain/general/bot_challenge.yml +4 -0
  289. rasa/cli/project_templates/telco/domain/general/feedback.yml +25 -0
  290. rasa/cli/project_templates/telco/domain/general/goodbye.yml +7 -0
  291. rasa/cli/project_templates/telco/domain/general/hello.yml +5 -0
  292. rasa/cli/project_templates/telco/domain/general/human_handoff.yml +26 -0
  293. rasa/cli/project_templates/telco/domain/general/patterns.yml +33 -0
  294. rasa/cli/project_templates/telco/domain/network/reboot_router.yml +21 -0
  295. rasa/cli/project_templates/telco/domain/network/reset_router.yml +12 -0
  296. rasa/cli/project_templates/telco/domain/network/run_speed_test.yml +25 -0
  297. rasa/cli/project_templates/telco/domain/network/solve_internet_issue.yml +75 -0
  298. rasa/cli/project_templates/telco/domain/shared.yml +129 -0
  299. rasa/cli/project_templates/telco/endpoints.yml +67 -0
  300. rasa/cli/project_templates/telco/prompts/rephraser_demo_personality_prompt.jinja2 +40 -0
  301. rasa/cli/project_templates/telco/tests/e2e_test_cases/billing/understand_bill.yml +67 -0
  302. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/bot_challenge.yml +8 -0
  303. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/feedback.yml +46 -0
  304. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/goodbye.yml +9 -0
  305. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/hello.yml +8 -0
  306. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/human_handoff.yml +35 -0
  307. rasa/cli/project_templates/telco/tests/e2e_test_cases/general/patterns.yml +23 -0
  308. rasa/cli/project_templates/telco/tests/e2e_test_cases/network/solve_internet_issue.yml +57 -0
  309. rasa/cli/project_templates/tutorial/config.yml +2 -1
  310. rasa/cli/scaffold.py +46 -2
  311. rasa/cli/train.py +2 -0
  312. rasa/cli/utils.py +85 -1
  313. rasa/core/actions/action.py +2 -7
  314. rasa/core/available_agents.py +49 -26
  315. rasa/core/available_endpoints.py +17 -2
  316. rasa/core/channels/channel.py +4 -3
  317. rasa/core/channels/constants.py +3 -0
  318. rasa/core/channels/development_inspector.py +2 -22
  319. rasa/core/channels/inspector/README.md +26 -14
  320. rasa/core/channels/inspector/dist/assets/{arc-63212852.js → arc-edef10dd.js} +1 -1
  321. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-eecf6b13.js → blockDiagram-38ab4fdb-49f6762b.js} +1 -1
  322. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-8f798a9a.js → c4Diagram-3d4e48cf-313c08e6.js} +1 -1
  323. rasa/core/channels/inspector/dist/assets/channel-63aa27d1.js +1 -0
  324. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-df71a04c.js → classDiagram-70f12bd4-35e41ce9.js} +1 -1
  325. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-9b275968.js → classDiagram-v2-f2320105-f346068d.js} +1 -1
  326. rasa/core/channels/inspector/dist/assets/clone-5566bae8.js +1 -0
  327. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-1c669cad.js → createText-2e5e7dd3-7a44bce8.js} +1 -1
  328. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-b1553799.js → edges-e0da2a9e-d7cf78c7.js} +1 -1
  329. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-112388d6.js → erDiagram-9861fffd-9813e81c.js} +1 -1
  330. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-fdebec47.js → flowDb-956e92f1-d8ba0870.js} +1 -1
  331. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-6280ede1.js → flowDiagram-66a62f08-51f0db4d.js} +1 -1
  332. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-32936074.js +1 -0
  333. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-e1dc03e5.js → flowchart-elk-definition-4a651766-ff9ea384.js} +1 -1
  334. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-83f68c51.js → ganttDiagram-c361ad54-a8e13b6b.js} +1 -1
  335. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-22f8666f.js → gitGraphDiagram-72cf32ee-3b171c6d.js} +1 -1
  336. rasa/core/channels/inspector/dist/assets/{graph-ca9e6217.js → graph-790ef78b.js} +1 -1
  337. rasa/core/channels/inspector/dist/assets/{index-3862675e-c5ceb692.js → index-3862675e-ecdce073.js} +1 -1
  338. rasa/core/channels/inspector/dist/assets/index-d705da80.js +1352 -0
  339. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-faa9999b.js → infoDiagram-f8f76790-f5a422fe.js} +1 -1
  340. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-c4dda8d9.js → journeyDiagram-49397b02-3185b7ac.js} +1 -1
  341. rasa/core/channels/inspector/dist/assets/{layout-d4307784.js → layout-837fd3aa.js} +1 -1
  342. rasa/core/channels/inspector/dist/assets/{line-0567aaa7.js → line-7e05afcb.js} +1 -1
  343. rasa/core/channels/inspector/dist/assets/{linear-c11b95cf.js → linear-162eb295.js} +1 -1
  344. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-0c7d3ca9.js → mindmap-definition-fc14e90a-f4978aee.js} +1 -1
  345. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-34b433fa.js → pieDiagram-8a3498a8-b25d0a52.js} +1 -1
  346. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-4cab816e.js → quadrantDiagram-120e2f19-63db1afa.js} +1 -1
  347. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-8c22fa9e.js → requirementDiagram-deff3bca-1b486cc9.js} +1 -1
  348. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-70ce9e8e.js → sankeyDiagram-04a897e0-7e795291.js} +1 -1
  349. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-fbcd7fc9.js → sequenceDiagram-704730f1-b8aba159.js} +1 -1
  350. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-45f05ea6.js → stateDiagram-587899a1-41529fd5.js} +1 -1
  351. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-beab1ea6.js → stateDiagram-v2-d93cdb3a-b241043c.js} +1 -1
  352. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-2f29dbd5.js → styles-6aaf32cf-b5b53234.js} +1 -1
  353. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-951eac83.js → styles-9a916d00-13d138e5.js} +1 -1
  354. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-897fbfdd.js → styles-c10674c1-94cbde3f.js} +1 -1
  355. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-d667fac1.js → svgDrawCommon-08f97a94-453ae764.js} +1 -1
  356. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-e3205144.js → timeline-definition-85554ec2-8dcb88a4.js} +1 -1
  357. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-4abeb0e2.js → xychartDiagram-e933f94c-376af5f0.js} +1 -1
  358. rasa/core/channels/inspector/dist/index.html +2 -2
  359. rasa/core/channels/inspector/index.html +1 -1
  360. rasa/core/channels/inspector/src/App.tsx +42 -44
  361. rasa/core/channels/inspector/src/components/Chat.tsx +2 -3
  362. rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
  363. rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +8 -8
  364. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +20 -3
  365. rasa/core/channels/inspector/src/components/LatencyDisplay.tsx +63 -35
  366. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +14 -0
  367. rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
  368. rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
  369. rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
  370. rasa/core/channels/inspector/src/types.ts +49 -7
  371. rasa/core/channels/socketio.py +212 -51
  372. rasa/core/channels/studio_chat.py +59 -57
  373. rasa/core/channels/voice_stream/asr/asr_event.py +1 -1
  374. rasa/core/channels/voice_stream/asr/azure.py +6 -3
  375. rasa/core/channels/voice_stream/asr/deepgram.py +1 -1
  376. rasa/core/channels/voice_stream/audiocodes.py +3 -0
  377. rasa/core/channels/voice_stream/browser_audio.py +53 -3
  378. rasa/core/channels/voice_stream/genesys.py +2 -1
  379. rasa/core/channels/voice_stream/jambonz.py +9 -1
  380. rasa/core/channels/voice_stream/twilio_media_streams.py +16 -0
  381. rasa/core/channels/voice_stream/voice_channel.py +66 -3
  382. rasa/core/constants.py +6 -0
  383. rasa/core/iam_credentials_providers/__init__.py +0 -0
  384. rasa/core/iam_credentials_providers/aws_iam_credentials_providers.py +66 -0
  385. rasa/core/iam_credentials_providers/credentials_provider_protocol.py +89 -0
  386. rasa/core/policies/enterprise_search_policy.py +4 -7
  387. rasa/core/policies/flows/flow_executor.py +66 -36
  388. rasa/core/policies/ted_policy.py +7 -5
  389. rasa/core/processor.py +32 -0
  390. rasa/core/redis_connection_factory.py +411 -0
  391. rasa/core/run.py +13 -3
  392. rasa/core/tracker_stores/redis_tracker_store.py +32 -14
  393. rasa/core/tracker_stores/sql_tracker_store.py +57 -1
  394. rasa/dialogue_understanding/commands/cancel_flow_command.py +2 -81
  395. rasa/dialogue_understanding/commands/start_flow_command.py +18 -113
  396. rasa/dialogue_understanding/commands/utils.py +118 -0
  397. rasa/dialogue_understanding/generator/flow_retrieval.py +10 -9
  398. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +10 -5
  399. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +10 -5
  400. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +20 -12
  401. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +19 -12
  402. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +6 -35
  403. rasa/dialogue_understanding/patterns/cancel.py +27 -6
  404. rasa/dialogue_understanding/patterns/clarify.py +3 -14
  405. rasa/dialogue_understanding/patterns/continue_interrupted.py +185 -114
  406. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +18 -24
  407. rasa/dialogue_understanding/processor/command_processor.py +35 -0
  408. rasa/dialogue_understanding/stack/utils.py +43 -4
  409. rasa/dialogue_understanding/utils.py +24 -4
  410. rasa/engine/graph.py +5 -1
  411. rasa/engine/recipes/default_components.py +78 -10
  412. rasa/engine/recipes/default_recipe.py +41 -1
  413. rasa/engine/storage/local_model_storage.py +83 -3
  414. rasa/graph_components/validators/default_recipe_validator.py +153 -135
  415. rasa/model_manager/model_api.py +4 -5
  416. rasa/model_manager/runner_service.py +1 -1
  417. rasa/model_manager/socket_bridge.py +20 -15
  418. rasa/model_manager/trainer_service.py +12 -9
  419. rasa/model_manager/utils.py +1 -29
  420. rasa/model_manager/warm_rasa_process.py +1 -1
  421. rasa/model_training.py +22 -6
  422. rasa/nlu/classifiers/diet_classifier.py +22 -6
  423. rasa/nlu/classifiers/logistic_regression_classifier.py +18 -0
  424. rasa/nlu/extractors/extractor.py +1 -2
  425. rasa/shared/agents/auth/__init__.py +0 -0
  426. rasa/shared/agents/auth/agent_auth_factory.py +74 -0
  427. rasa/shared/agents/auth/agent_auth_manager.py +86 -0
  428. rasa/shared/agents/auth/auth_strategy/__init__.py +19 -0
  429. rasa/shared/agents/auth/auth_strategy/agent_auth_strategy.py +52 -0
  430. rasa/shared/agents/auth/auth_strategy/api_key_auth_strategy.py +42 -0
  431. rasa/shared/agents/auth/auth_strategy/bearer_token_auth_strategy.py +28 -0
  432. rasa/shared/agents/auth/auth_strategy/oauth2_auth_strategy.py +159 -0
  433. rasa/shared/agents/auth/constants.py +11 -0
  434. rasa/shared/agents/auth/types.py +11 -0
  435. rasa/shared/constants.py +3 -0
  436. rasa/shared/core/constants.py +6 -6
  437. rasa/shared/core/domain.py +58 -11
  438. rasa/shared/core/events.py +2 -0
  439. rasa/shared/core/flows/constants.py +5 -0
  440. rasa/shared/core/flows/flow_step.py +7 -1
  441. rasa/shared/core/flows/flows_list.py +6 -0
  442. rasa/shared/core/flows/steps/call.py +15 -12
  443. rasa/shared/core/flows/validation.py +238 -44
  444. rasa/shared/core/flows/yaml_flows_io.py +15 -6
  445. rasa/shared/core/slots.py +4 -0
  446. rasa/shared/exceptions.py +12 -0
  447. rasa/shared/importers/importer.py +6 -0
  448. rasa/shared/importers/utils.py +77 -1
  449. rasa/shared/nlu/training_data/schemas/responses.yml +3 -0
  450. rasa/shared/providers/_utils.py +60 -44
  451. rasa/shared/providers/embedding/default_litellm_embedding_client.py +2 -0
  452. rasa/shared/providers/llm/_base_litellm_client.py +2 -2
  453. rasa/shared/providers/llm/default_litellm_llm_client.py +2 -0
  454. rasa/shared/providers/llm/llm_response.py +4 -4
  455. rasa/shared/utils/common.py +24 -0
  456. rasa/shared/utils/health_check/health_check.py +7 -3
  457. rasa/shared/utils/llm.py +2 -1
  458. rasa/shared/utils/mcp/server_connection.py +108 -27
  459. rasa/shared/utils/mcp/utils.py +20 -0
  460. rasa/studio/upload.py +16 -47
  461. rasa/telemetry.py +97 -23
  462. rasa/tracing/config.py +38 -12
  463. rasa/tracing/instrumentation/attribute_extractors.py +5 -1
  464. rasa/tracing/instrumentation/instrumentation.py +85 -8
  465. rasa/utils/common.py +1 -1
  466. rasa/utils/io.py +27 -9
  467. rasa/utils/json_utils.py +6 -1
  468. rasa/utils/log_utils.py +5 -1
  469. rasa/utils/openapi.py +144 -0
  470. rasa/utils/tensorflow/__init__.py +29 -0
  471. rasa/utils/tensorflow/callback.py +1 -1
  472. rasa/utils/tensorflow/crf.py +1 -1
  473. rasa/utils/tensorflow/data_generator.py +21 -8
  474. rasa/utils/tensorflow/layers.py +11 -4
  475. rasa/utils/tensorflow/metrics.py +7 -3
  476. rasa/utils/tensorflow/models.py +41 -6
  477. rasa/utils/tensorflow/rasa_layers.py +6 -4
  478. rasa/utils/tensorflow/transformer.py +2 -3
  479. rasa/utils/train_utils.py +68 -38
  480. rasa/validator.py +18 -16
  481. rasa/version.py +1 -1
  482. rasa_pro-3.14.0.dev8.dist-info/METADATA +199 -0
  483. {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/RECORD +486 -173
  484. rasa/core/channels/inspector/dist/assets/channel-0cd70adf.js +0 -1
  485. rasa/core/channels/inspector/dist/assets/clone-a0f9c4ed.js +0 -1
  486. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-de9cc4aa.js +0 -1
  487. rasa/core/channels/inspector/dist/assets/index-3e293924.js +0 -1353
  488. rasa_pro-3.14.0.dev6.dist-info/METADATA +0 -190
  489. {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/NOTICE +0 -0
  490. {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/WHEEL +0 -0
  491. {rasa_pro-3.14.0.dev6.dist-info → rasa_pro-3.14.0.dev8.dist-info}/entry_points.txt +0 -0
@@ -1,16 +1,17 @@
1
1
  version: "3.1"
2
2
  responses:
3
3
 
4
- utter_ask_continue_interrupted_flow:
5
- - text: "Would you like to continue with {{ context.previous_flow_name }}?"
4
+ utter_ask_continue_interrupted_flow_confirmation:
5
+ - text: "Would you like to continue with {{context.interrupted_flow_options}}?"
6
+ metadata:
7
+ rephrase: True
8
+ template: jinja
9
+
10
+ utter_ask_interrupted_flow_to_continue:
11
+ - text: "Would you like to resume {{context.interrupted_flow_options}}?"
6
12
  metadata:
7
13
  rephrase: True
8
14
  template: jinja
9
- buttons:
10
- - title: "Yes"
11
- payload: "/SetSlots(confirmation_continue_interrupted_flow=true)"
12
- - title: "No"
13
- payload: "/SetSlots(confirmation_continue_interrupted_flow=false)"
14
15
 
15
16
  utter_ask_rephrase:
16
17
  - text: I’m sorry I am unable to understand you, could you please rephrase?
@@ -86,7 +87,7 @@ responses:
86
87
  rephrase: True
87
88
 
88
89
  utter_inform_hangup:
89
- - text: It seems you are not there anymore. I will hang up shortly.
90
+ - text: I haven’t heard from you, so I’ll end our conversation shortly.
90
91
  metadata:
91
92
  rephrase: True
92
93
 
@@ -129,19 +130,14 @@ slots:
129
130
  type: float
130
131
  initial_value: 0.0
131
132
  max_value: 1000000
132
- interrupted_flows:
133
- type: list
134
- multiple_flows_interrupted:
135
- type: bool
136
- initial_value: false
137
- confirmation_continue_interrupted_flow:
138
- type: bool
139
- mappings:
140
- - type: from_llm
141
133
  interrupted_flow_to_continue:
142
134
  type: text
143
135
  mappings:
144
136
  - type: from_llm
137
+ continue_interrupted_flow_confirmation:
138
+ type: bool
139
+ mappings:
140
+ - type: from_llm
145
141
 
146
142
  flows:
147
143
  pattern_cancel_flow:
@@ -228,10 +224,9 @@ flows:
228
224
  description: Conversation repair flow for managing when users switch between different flows
229
225
  name: pattern continue interrupted
230
226
  steps:
231
- - action: action_set_interrupted_flows
232
227
  - noop: true
233
228
  next:
234
- - if: slots.multiple_flows_interrupted
229
+ - if: context.multiple_flows_interrupted
235
230
  then:
236
231
  - collect: interrupted_flow_to_continue
237
232
  description: "Fill this slot with the name of the flow the user wants to continue. If the user does not want to continue any of the interrupted flows, fill this slot with 'none'."
@@ -241,19 +236,18 @@ flows:
241
236
  - action: action_continue_interrupted_flow
242
237
  next: END
243
238
  - else:
244
- - action: action_cancel_interrupted_flow
239
+ - action: action_cancel_interrupted_flows
245
240
  next: END
246
241
  - else:
247
- - collect: confirmation_continue_interrupted_flow
242
+ - collect: continue_interrupted_flow_confirmation
248
243
  description: "If the user wants to continue the interrupted flow, fill this slot with true. If the user does not want to continue the interrupted flow, fill this slot with false."
249
- utter: utter_ask_continue_interrupted_flow
250
244
  next:
251
- - if: slots.confirmation_continue_interrupted_flow
245
+ - if: slots.continue_interrupted_flow_confirmation
252
246
  then:
253
247
  - action: action_continue_interrupted_flow
254
248
  next: END
255
249
  - else:
256
- - action: action_cancel_interrupted_flow
250
+ - action: action_cancel_interrupted_flows
257
251
  next: END
258
252
 
259
253
  pattern_correction:
@@ -2,16 +2,22 @@ from typing import Dict, List, Optional, Set, Type
2
2
 
3
3
  import structlog
4
4
 
5
+ from rasa.agents.utils import (
6
+ is_agent_completed,
7
+ is_agent_valid,
8
+ )
5
9
  from rasa.dialogue_understanding.commands import (
6
10
  CancelFlowCommand,
7
11
  CannotHandleCommand,
8
12
  ChitChatAnswerCommand,
9
13
  ClarifyCommand,
10
14
  Command,
15
+ ContinueAgentCommand,
11
16
  CorrectedSlot,
12
17
  CorrectSlotsCommand,
13
18
  FreeFormAnswerCommand,
14
19
  RepeatBotMessagesCommand,
20
+ RestartAgentCommand,
15
21
  SetSlotCommand,
16
22
  StartFlowCommand,
17
23
  )
@@ -461,6 +467,35 @@ def clean_up_commands(
461
467
  "drop_clarify_given_other_commands",
462
468
  command=command,
463
469
  )
470
+
471
+ # Keep the Restart agent commands only if the command is referencing
472
+ # a valid agent that was already completed
473
+ elif isinstance(command, RestartAgentCommand):
474
+ if not is_agent_valid(command.agent_id):
475
+ structlogger.debug(
476
+ "command_processor.clean_up_commands.skip_restart_agent_invalid_agent",
477
+ agent_id=command.agent_id,
478
+ command=command,
479
+ )
480
+ elif not is_agent_completed(tracker, command.agent_id):
481
+ structlogger.debug(
482
+ "command_processor.clean_up_commands.skip_restart_agent_not_completed",
483
+ agent_id=command.agent_id,
484
+ command=command,
485
+ )
486
+ else:
487
+ clean_commands.append(command)
488
+
489
+ # Clean up Continue agent commands if there is currently no active agent
490
+ elif isinstance(command, ContinueAgentCommand):
491
+ if not tracker.stack.agent_is_active():
492
+ structlogger.debug(
493
+ "command_processor.clean_up_commands.skip_continue_agent_no_active_agent",
494
+ command=command,
495
+ )
496
+ else:
497
+ clean_commands.append(command)
498
+
464
499
  else:
465
500
  clean_commands.append(command)
466
501
 
@@ -17,6 +17,9 @@ from rasa.shared.core.flows.steps.constants import END_STEP
17
17
  from rasa.shared.core.flows.steps.continuation import ContinueFlowStep
18
18
 
19
19
  if typing.TYPE_CHECKING:
20
+ from rasa.dialogue_understanding.patterns.continue_interrupted import (
21
+ ContinueInterruptedPatternFlowStackFrame,
22
+ )
20
23
  from rasa.shared.core.trackers import DialogueStateTracker
21
24
 
22
25
 
@@ -171,10 +174,40 @@ def user_flows_on_the_stack(dialogue_stack: DialogueStack) -> Set[str]:
171
174
  All user flows that are currently on the stack.
172
175
  """
173
176
  return {
174
- f.flow_id for f in dialogue_stack.frames if isinstance(f, UserFlowStackFrame)
177
+ frame.flow_id
178
+ for frame in user_frames_on_the_stack(
179
+ dialogue_stack, ignore_call_and_link_frames=False
180
+ )
175
181
  }
176
182
 
177
183
 
184
+ def user_frames_on_the_stack(
185
+ dialogue_stack: DialogueStack, ignore_call_and_link_frames: bool = True
186
+ ) -> List[UserFlowStackFrame]:
187
+ """Get all user frames that are currently on the stack.
188
+
189
+ Args:
190
+ dialogue_stack: The dialogue stack.
191
+ ignore_call_and_link_frames: Whether to ignore user frames of type `call`
192
+ and `link`. By default, these frames are ignored.
193
+
194
+ Returns:
195
+ All user frames that are currently on the stack.
196
+ """
197
+ return [
198
+ frame
199
+ for frame in dialogue_stack.frames
200
+ if isinstance(frame, UserFlowStackFrame)
201
+ and (
202
+ not ignore_call_and_link_frames
203
+ or (
204
+ frame.frame_type != FlowStackFrameType.CALL
205
+ and frame.frame_type != FlowStackFrameType.LINK
206
+ )
207
+ )
208
+ ]
209
+
210
+
178
211
  def end_top_user_flow(stack: DialogueStack) -> DialogueStack:
179
212
  """Ends all frames on top of the stack including the topmost user frame.
180
213
 
@@ -235,13 +268,19 @@ def get_collect_steps_excluding_ask_before_filling_for_active_flow(
235
268
 
236
269
  def is_continue_interrupted_flow_active(stack: DialogueStack) -> bool:
237
270
  """Check if the continue interrupted flow is active."""
271
+ return get_active_continue_interrupted_pattern_frame(stack) is not None
272
+
273
+
274
+ def get_active_continue_interrupted_pattern_frame(
275
+ stack: DialogueStack,
276
+ ) -> Optional["ContinueInterruptedPatternFlowStackFrame"]:
238
277
  from rasa.dialogue_understanding.patterns.continue_interrupted import (
239
278
  ContinueInterruptedPatternFlowStackFrame,
240
279
  )
241
280
 
242
281
  for frame in reversed(stack.frames):
243
282
  if isinstance(frame, ContinueInterruptedPatternFlowStackFrame):
244
- return True
283
+ return frame
245
284
  if isinstance(frame, UserFlowStackFrame):
246
- return False
247
- return False
285
+ return None
286
+ return None
@@ -1,9 +1,9 @@
1
+ import typing
1
2
  from contextlib import contextmanager
2
3
  from typing import Any, Dict, Generator, List, Optional, Text
3
4
 
4
5
  import structlog
5
6
 
6
- from rasa.dialogue_understanding.commands import Command, NoopCommand, SetSlotCommand
7
7
  from rasa.dialogue_understanding.constants import (
8
8
  RASA_RECORD_COMMANDS_AND_PROMPTS_ENV_VAR_NAME,
9
9
  )
@@ -23,6 +23,9 @@ from rasa.shared.nlu.training_data.message import Message
23
23
  from rasa.shared.providers.llm.llm_response import LLMResponse
24
24
  from rasa.utils.common import get_bool_env_variable
25
25
 
26
+ if typing.TYPE_CHECKING:
27
+ from rasa.dialogue_understanding.commands import Command
28
+
26
29
  record_commands_and_prompts = get_bool_env_variable(
27
30
  RASA_RECORD_COMMANDS_AND_PROMPTS_ENV_VAR_NAME, False
28
31
  )
@@ -41,7 +44,7 @@ def set_record_commands_and_prompts() -> Generator:
41
44
 
42
45
 
43
46
  def add_commands_to_message_parse_data(
44
- message: Message, component_name: str, commands: List[Command]
47
+ message: Message, component_name: str, commands: List["Command"]
45
48
  ) -> None:
46
49
  """Add commands to the message parse data.
47
50
 
@@ -144,6 +147,11 @@ def _handle_via_nlu_in_coexistence(
144
147
  tracker: Optional[DialogueStateTracker], message: Message
145
148
  ) -> bool:
146
149
  """Check if the message should be handled by the NLU subsystem in coexistence mode.""" # noqa: E501
150
+ from rasa.dialogue_understanding.commands import (
151
+ NoopCommand,
152
+ SetSlotCommand,
153
+ )
154
+
147
155
  if not tracker:
148
156
  return False
149
157
 
@@ -156,8 +164,7 @@ def _handle_via_nlu_in_coexistence(
156
164
  "utils.handle_via_nlu_in_coexistence"
157
165
  ".tracker_missing_route_session_to_calm_slot",
158
166
  event_info=(
159
- f"Tracker doesn't have the '{ROUTE_TO_CALM_SLOT}' slot."
160
- f"Routing to CALM."
167
+ f"Tracker doesn't have the '{ROUTE_TO_CALM_SLOT}' slot.Routing to CALM."
161
168
  ),
162
169
  route_session_to_calm=commands,
163
170
  )
@@ -218,3 +225,16 @@ def _handle_via_nlu_in_coexistence(
218
225
  commands=commands,
219
226
  )
220
227
  return False
228
+
229
+
230
+ def assemble_options_string(names: List[str], conjunction: str = "and") -> str:
231
+ """Concatenate options to a human-readable string."""
232
+ option_message = ""
233
+ for i, name in enumerate(names):
234
+ if i == 0:
235
+ option_message += name
236
+ elif i == len(names) - 1:
237
+ option_message += f" {conjunction} {name}"
238
+ else:
239
+ option_message += f", {name}"
240
+ return option_message
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
 
@@ -1,7 +1,8 @@
1
1
  from rasa.core.policies.enterprise_search_policy import EnterpriseSearchPolicy
2
2
  from rasa.core.policies.flow_policy import FlowPolicy
3
3
  from rasa.core.policies.intentless_policy import IntentlessPolicy
4
- from rasa.core.policies.memoization import AugmentedMemoizationPolicy
4
+ from rasa.core.policies.memoization import AugmentedMemoizationPolicy, MemoizationPolicy
5
+ from rasa.core.policies.rule_policy import RulePolicy
5
6
  from rasa.dialogue_understanding.coexistence.intent_based_router import (
6
7
  IntentBasedRouter,
7
8
  )
@@ -10,6 +11,7 @@ from rasa.dialogue_understanding.generator import (
10
11
  LLMCommandGenerator,
11
12
  )
12
13
  from rasa.dialogue_understanding.generator.nlu_command_adapter import NLUCommandAdapter
14
+ from rasa.engine.graph import GraphComponent
13
15
  from rasa.nlu.classifiers.fallback_classifier import FallbackClassifier
14
16
  from rasa.nlu.classifiers.keyword_intent_classifier import KeywordIntentClassifier
15
17
  from rasa.nlu.classifiers.logistic_regression_classifier import (
@@ -17,6 +19,7 @@ from rasa.nlu.classifiers.logistic_regression_classifier import (
17
19
  )
18
20
  from rasa.nlu.classifiers.mitie_intent_classifier import MitieIntentClassifier
19
21
  from rasa.nlu.classifiers.sklearn_intent_classifier import SklearnIntentClassifier
22
+ from rasa.nlu.extractors.crf_entity_extractor import CRFEntityExtractor
20
23
  from rasa.nlu.extractors.duckling_entity_extractor import DucklingEntityExtractor
21
24
  from rasa.nlu.extractors.entity_synonyms import EntitySynonymMapper
22
25
  from rasa.nlu.extractors.mitie_entity_extractor import MitieEntityExtractor
@@ -37,10 +40,30 @@ from rasa.nlu.tokenizers.spacy_tokenizer import SpacyTokenizer
37
40
  from rasa.nlu.tokenizers.whitespace_tokenizer import WhitespaceTokenizer
38
41
  from rasa.nlu.utils.mitie_utils import MitieNLP
39
42
  from rasa.nlu.utils.spacy_utils import SpacyNLP
43
+ from rasa.shared.utils.common import conditional_import
44
+
45
+ # Conditional imports for TensorFlow-dependent components
46
+ TEDPolicy, TED_POLICY_AVAILABLE = conditional_import(
47
+ "rasa.core.policies.ted_policy", "TEDPolicy"
48
+ )
49
+ UnexpecTEDIntentPolicy, UNEXPECTED_INTENT_POLICY_AVAILABLE = conditional_import(
50
+ "rasa.core.policies.unexpected_intent_policy", "UnexpecTEDIntentPolicy"
51
+ )
52
+ DIETClassifier, DIET_CLASSIFIER_AVAILABLE = conditional_import(
53
+ "rasa.nlu.classifiers.diet_classifier", "DIETClassifier"
54
+ )
55
+ ConveRTFeaturizer, CONVERT_FEATURIZER_AVAILABLE = conditional_import(
56
+ "rasa.nlu.featurizers.dense_featurizer.convert_featurizer", "ConveRTFeaturizer"
57
+ )
58
+ LanguageModelFeaturizer, LANGUAGE_MODEL_FEATURIZER_AVAILABLE = conditional_import(
59
+ "rasa.nlu.featurizers.dense_featurizer.lm_featurizer", "LanguageModelFeaturizer"
60
+ )
61
+ ResponseSelector, RESPONSE_SELECTOR_AVAILABLE = conditional_import(
62
+ "rasa.nlu.selectors.response_selector", "ResponseSelector"
63
+ )
40
64
 
41
65
  DEFAULT_COMPONENTS = [
42
66
  # Message Classifiers
43
- # DIETClassifier,
44
67
  FallbackClassifier,
45
68
  KeywordIntentClassifier,
46
69
  MitieIntentClassifier,
@@ -51,9 +74,8 @@ DEFAULT_COMPONENTS = [
51
74
  LLMBasedRouter,
52
75
  IntentBasedRouter,
53
76
  # Response Selectors
54
- # ResponseSelector,
55
77
  # Message Entity Extractors
56
- # CRFEntityExtractor,
78
+ CRFEntityExtractor,
57
79
  DucklingEntityExtractor,
58
80
  EntitySynonymMapper,
59
81
  MitieEntityExtractor,
@@ -61,11 +83,9 @@ DEFAULT_COMPONENTS = [
61
83
  RegexEntityExtractor,
62
84
  # Message Feauturizers
63
85
  LexicalSyntacticFeaturizer,
64
- # ConveRTFeaturizer,
65
86
  MitieFeaturizer,
66
87
  SpacyFeaturizer,
67
88
  CountVectorsFeaturizer,
68
- # LanguageModelFeaturizer,
69
89
  RegexFeaturizer,
70
90
  # Tokenizers
71
91
  JiebaTokenizer,
@@ -76,12 +96,60 @@ DEFAULT_COMPONENTS = [
76
96
  MitieNLP,
77
97
  SpacyNLP,
78
98
  # Dialogue Management Policies
79
- # TEDPolicy,
80
- # UnexpecTEDIntentPolicy,
81
- # RulePolicy,
82
- # MemoizationPolicy,
99
+ RulePolicy,
100
+ MemoizationPolicy,
83
101
  AugmentedMemoizationPolicy,
84
102
  FlowPolicy,
85
103
  EnterpriseSearchPolicy,
86
104
  IntentlessPolicy,
87
105
  ]
106
+
107
+
108
+ class ComponentInserter:
109
+ """Manages insertion of components at specific positions with index adjustment."""
110
+
111
+ def __init__(self, insertion_points: dict[str, int]):
112
+ self.insertion_points = insertion_points
113
+ self.insertion_counts = {category: 0 for category in insertion_points}
114
+
115
+ def insert_if_available(
116
+ self, component: GraphComponent, is_available: bool, category: str
117
+ ) -> None:
118
+ """Insert a component at the appropriate position if available."""
119
+ if is_available and component is not None:
120
+ # Calculate the adjusted index based on insertions in earlier categories
121
+ adjusted_index = self.insertion_points[category]
122
+ for cat, count in self.insertion_counts.items():
123
+ if self.insertion_points[cat] < self.insertion_points[category]:
124
+ adjusted_index += count
125
+
126
+ DEFAULT_COMPONENTS.insert(adjusted_index, component)
127
+ self.insertion_counts[category] += 1
128
+
129
+
130
+ # Define insertion points by component category to preserve order
131
+ INSERTION_POINTS = {
132
+ "classifiers": 1,
133
+ "response_selectors": 11,
134
+ "featurizers": 20,
135
+ "policies": 35,
136
+ }
137
+
138
+ # Create inserter instance
139
+ inserter = ComponentInserter(INSERTION_POINTS)
140
+
141
+ # Conditionally add TensorFlow-dependent components
142
+ inserter.insert_if_available(DIETClassifier, DIET_CLASSIFIER_AVAILABLE, "classifiers")
143
+ inserter.insert_if_available(
144
+ ResponseSelector, RESPONSE_SELECTOR_AVAILABLE, "response_selectors"
145
+ )
146
+ inserter.insert_if_available(
147
+ ConveRTFeaturizer, CONVERT_FEATURIZER_AVAILABLE, "featurizers"
148
+ )
149
+ inserter.insert_if_available(
150
+ LanguageModelFeaturizer, LANGUAGE_MODEL_FEATURIZER_AVAILABLE, "featurizers"
151
+ )
152
+ inserter.insert_if_available(TEDPolicy, TED_POLICY_AVAILABLE, "policies")
153
+ inserter.insert_if_available(
154
+ UnexpecTEDIntentPolicy, UNEXPECTED_INTENT_POLICY_AVAILABLE, "policies"
155
+ )
@@ -5,6 +5,7 @@ import dataclasses
5
5
  import enum
6
6
  import logging
7
7
  import math
8
+ import sys
8
9
  from enum import Enum
9
10
  from typing import Any, Callable, Dict, List, Optional, Set, Text, Tuple, Type, Union
10
11
 
@@ -180,7 +181,14 @@ class DefaultV1Recipe(Recipe):
180
181
  @classmethod
181
182
  def _from_registry(cls, name: Text) -> RegisteredComponent:
182
183
  # Importing all the default Rasa components will automatically register them
183
- from rasa.engine.recipes.default_components import DEFAULT_COMPONENTS # noqa
184
+ from rasa.engine.recipes.default_components import (
185
+ CONVERT_FEATURIZER_AVAILABLE,
186
+ DIET_CLASSIFIER_AVAILABLE,
187
+ LANGUAGE_MODEL_FEATURIZER_AVAILABLE,
188
+ RESPONSE_SELECTOR_AVAILABLE,
189
+ TED_POLICY_AVAILABLE,
190
+ UNEXPECTED_INTENT_POLICY_AVAILABLE,
191
+ )
184
192
 
185
193
  if name in cls._registered_components:
186
194
  return cls._registered_components[name]
@@ -190,6 +198,38 @@ class DefaultV1Recipe(Recipe):
190
198
  if clazz.__name__ in cls._registered_components:
191
199
  return cls._registered_components[clazz.__name__]
192
200
 
201
+ # Check Python version compatibility for TensorFlow components
202
+ # TensorFlow support was removed for Python 3.12+ due to compatibility issues
203
+ if sys.version_info >= (3, 12):
204
+ raise InvalidConfigException(
205
+ f"{name} is not available on Python 3.12+. "
206
+ "TensorFlow support has been removed for Python 3.12+ versions. "
207
+ "Please use Python 3.11 or earlier for TensorFlow-based components. "
208
+ )
209
+
210
+ # Check for TensorFlow components that failed to load
211
+ # because conditional module import of those components did not succeed
212
+ tensorflow_component_availability = {
213
+ "DIETClassifier": DIET_CLASSIFIER_AVAILABLE,
214
+ "TEDPolicy": TED_POLICY_AVAILABLE,
215
+ "UnexpecTEDIntentPolicy": UNEXPECTED_INTENT_POLICY_AVAILABLE,
216
+ "ResponseSelector": RESPONSE_SELECTOR_AVAILABLE,
217
+ "ConveRTFeaturizer": CONVERT_FEATURIZER_AVAILABLE,
218
+ "LanguageModelFeaturizer": LANGUAGE_MODEL_FEATURIZER_AVAILABLE,
219
+ }
220
+
221
+ if name in tensorflow_component_availability:
222
+ # TensorFlow-dependent component failed to load
223
+ # if TensorFlow is not available
224
+ if not tensorflow_component_availability[name]:
225
+ raise InvalidConfigException(
226
+ f"{name} requires TensorFlow. "
227
+ "Please install it with: "
228
+ "`pip install rasa[tensorflow]`. "
229
+ "If using poetry, install it with "
230
+ "`poetry install --extras tensorflow`."
231
+ )
232
+
193
233
  raise InvalidConfigException(
194
234
  f"Can't load class for name '{name}'. Please make sure to provide "
195
235
  f"a valid name or module path and to register it using the "
@@ -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, List, 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,9 +153,29 @@ 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(
162
+ f"\\\\?\\{temporary_directory}",
163
+ members=yield_safe_members(tar.getmembers()),
164
+ )
165
+ except Exception:
166
+ # Fallback for Python versions with tarfile security fix
167
+ logger.warning(
168
+ "Failed to extract model archive with long path support. "
169
+ "Falling back to regular extraction."
170
+ )
171
+ tar.extractall(
172
+ temporary_directory,
173
+ members=yield_safe_members(tar.getmembers()),
174
+ )
126
175
  else:
127
- tar.extractall(temporary_directory)
176
+ tar.extractall(
177
+ temporary_directory, members=yield_safe_members(tar.getmembers())
178
+ )
128
179
  LocalModelStorage._assert_not_rasa2_archive(temporary_directory)
129
180
 
130
181
  @staticmethod
@@ -244,3 +295,32 @@ class LocalModelStorage(ModelStorage):
244
295
  core_target=model_configuration.core_target,
245
296
  nlu_target=model_configuration.nlu_target,
246
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