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
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import re
4
4
  from dataclasses import dataclass
5
- from typing import Any, Dict, List, Optional, Tuple
5
+ from typing import Any, Dict, List
6
6
 
7
7
  import structlog
8
8
 
@@ -16,7 +16,6 @@ from rasa.dialogue_understanding.commands.command_syntax_manager import (
16
16
  )
17
17
  from rasa.dialogue_understanding.patterns.cancel import CancelPatternFlowStackFrame
18
18
  from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
19
- from rasa.dialogue_understanding.stack.frames import DialogueStackFrame
20
19
  from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
21
20
  FlowStackFrameType,
22
21
  UserFlowStackFrame,
@@ -74,8 +73,7 @@ class CancelFlowCommand(Command):
74
73
  # we should never get here as we should always find the user flow
75
74
  # that was canceled.
76
75
  raise ValueError(
77
- f"Could not find a user flow frame to cancel. "
78
- f"Current stack: {stack}."
76
+ f"Could not find a user flow frame to cancel. Current stack: {stack}."
79
77
  )
80
78
 
81
79
  def run_command_on_tracker(
@@ -175,80 +173,3 @@ class CancelFlowCommand(Command):
175
173
  CommandSyntaxManager.get_syntax_version(),
176
174
  mapper[CommandSyntaxManager.get_default_syntax_version()],
177
175
  )
178
-
179
- def cancel_flow(
180
- self,
181
- tracker: DialogueStateTracker,
182
- stack: DialogueStack,
183
- flow_id: str,
184
- ) -> List[Event]:
185
- """Cancels a flow by flow id."""
186
- applied_events: List[Event] = []
187
-
188
- frames_to_cancel, user_frame_to_cancel = self._collect_frames_to_cancel(
189
- stack, flow_id
190
- )
191
-
192
- # if the flow is not on the stack, do nothing
193
- if user_frame_to_cancel is None:
194
- structlogger.error(
195
- "cancel_flow_command.cancel_flow.no_user_frame_to_cancel",
196
- command=self,
197
- )
198
- return []
199
-
200
- frames_ids_to_cancel = [frame.frame_id for frame in frames_to_cancel]
201
-
202
- stack.push(
203
- CancelPatternFlowStackFrame(
204
- canceled_name=flow_id,
205
- canceled_frames=frames_ids_to_cancel,
206
- )
207
- )
208
-
209
- # create flow cancelled event
210
- applied_events.extend(
211
- [
212
- FlowCancelled(
213
- user_frame_to_cancel.flow_id, user_frame_to_cancel.step_id
214
- ),
215
- ]
216
- )
217
-
218
- update_stack_events = tracker.create_stack_updated_events(stack)
219
-
220
- return applied_events + update_stack_events
221
-
222
- def _collect_frames_to_cancel(
223
- self, stack: DialogueStack, target_flow_id: str
224
- ) -> Tuple[List[DialogueStackFrame], Optional[UserFlowStackFrame]]:
225
- """Collect frames that need to be cancelled.
226
-
227
- Args:
228
- stack: The stack to collect frames from.
229
- target_flow_id: The ID of the flow to cancel.
230
-
231
- Returns:
232
- A tuple containing (frames_to_cancel, frame_to_cancel).
233
- """
234
- frames_to_cancel: List[DialogueStackFrame] = []
235
- frame_found = False
236
- frame_to_cancel = None
237
-
238
- for frame in stack.frames:
239
- if isinstance(frame, UserFlowStackFrame) and (
240
- frame.frame_type == FlowStackFrameType.REGULAR
241
- or frame.frame_type == FlowStackFrameType.INTERRUPT
242
- ):
243
- if frame.flow_id == target_flow_id:
244
- frames_to_cancel.append(frame)
245
- frame_to_cancel = frame
246
- frame_found = True
247
- continue
248
- elif frame_found:
249
- break
250
-
251
- if frame_found:
252
- frames_to_cancel.append(frame)
253
-
254
- return list(frames_to_cancel), frame_to_cancel
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import re
4
4
  from dataclasses import dataclass
5
- from typing import Any, Dict, List, Optional, Tuple
5
+ from typing import Any, Dict, List, Optional
6
6
 
7
7
  import structlog
8
8
 
@@ -11,17 +11,15 @@ from rasa.dialogue_understanding.commands.command_syntax_manager import (
11
11
  CommandSyntaxManager,
12
12
  CommandSyntaxVersion,
13
13
  )
14
- from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
15
- from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
16
- DialogueStackFrame,
14
+ from rasa.dialogue_understanding.commands.utils import (
15
+ remove_pattern_continue_interrupted_frames,
16
+ resume_flow,
17
17
  )
18
18
  from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
19
- AgentStackFrame,
20
19
  AgentState,
21
20
  FlowStackFrameType,
22
21
  UserFlowStackFrame,
23
22
  )
24
- from rasa.dialogue_understanding.stack.frames.pattern_frame import PatternFlowStackFrame
25
23
  from rasa.dialogue_understanding.stack.utils import (
26
24
  is_continue_interrupted_flow_active,
27
25
  top_user_flow_frame,
@@ -29,10 +27,8 @@ from rasa.dialogue_understanding.stack.utils import (
29
27
  )
30
28
  from rasa.shared.core.events import (
31
29
  AgentInterrupted,
32
- AgentResumed,
33
30
  Event,
34
31
  FlowInterrupted,
35
- FlowResumed,
36
32
  )
37
33
  from rasa.shared.core.flows import FlowsList
38
34
  from rasa.shared.core.trackers import DialogueStateTracker
@@ -108,7 +104,7 @@ class StartFlowCommand(Command):
108
104
  # predicted a start flow command for the flow which is on top of the stack,
109
105
  # we just need to remove the pattern_continue_interrupted frame(s) from the
110
106
  # stack
111
- stack = _remove_pattern_continue_interrupted_frames(stack)
107
+ stack = remove_pattern_continue_interrupted_frames(stack)
112
108
  return applied_events + tracker.create_stack_updated_events(stack)
113
109
 
114
110
  # if the flow is already on the stack, resume it
@@ -118,11 +114,22 @@ class StartFlowCommand(Command):
118
114
  ):
119
115
  # if pattern_continue_interrupted is active, we need to remove it
120
116
  # from the stack before resuming the flow
121
- stack = _remove_pattern_continue_interrupted_frames(stack)
122
- return self.resume_flow(tracker, stack, original_user_frame)
117
+ stack = remove_pattern_continue_interrupted_frames(stack)
118
+ applied_events.extend(resume_flow(self.flow, tracker, stack))
119
+ # the current active flow is interrupted
120
+ applied_events.append(
121
+ FlowInterrupted(
122
+ original_user_frame.flow_id, original_user_frame.step_id
123
+ )
124
+ )
125
+ return applied_events
123
126
 
124
127
  frame_type = FlowStackFrameType.REGULAR
125
128
 
129
+ # remove the pattern_continue_interrupted frames from the stack
130
+ # if it is currently active but the user digressed from the pattern
131
+ stack = remove_pattern_continue_interrupted_frames(stack)
132
+
126
133
  if original_top_flow:
127
134
  # if the original top flow is not the same as the flow to start,
128
135
  # interrupt the current active flow
@@ -198,105 +205,3 @@ class StartFlowCommand(Command):
198
205
  CommandSyntaxManager.get_syntax_version(),
199
206
  mapper[CommandSyntaxManager.get_default_syntax_version()],
200
207
  )
201
-
202
- def resume_flow(
203
- self,
204
- tracker: DialogueStateTracker,
205
- stack: DialogueStack,
206
- original_user_frame: UserFlowStackFrame,
207
- ) -> List[Event]:
208
- """Resumes a flow by reordering frames."""
209
- applied_events: List[Event] = []
210
-
211
- # Resume existing flow by reordering frames
212
- frames_to_resume, user_frame_to_resume = self._collect_frames_to_resume(
213
- stack, self.flow
214
- )
215
-
216
- # if the flow is not on the stack, do nothing
217
- # this should not happen, but just in case
218
- if user_frame_to_resume is None:
219
- structlogger.error(
220
- "start_flow_command.resume_flow.no_user_frame_to_resume",
221
- command=self,
222
- )
223
- return []
224
-
225
- # move the frames to the top of the stack, e.g. reorder the frames
226
- # on the stack
227
- stack.move_frames_to_top(frames_to_resume)
228
- agent_stack_frame = next(
229
- (frame for frame in frames_to_resume if isinstance(frame, AgentStackFrame)),
230
- None,
231
- )
232
- if agent_stack_frame:
233
- agent_id = agent_stack_frame.agent_id
234
- applied_events.append(AgentResumed(agent_id, agent_stack_frame.flow_id))
235
-
236
- # Create flow interruption and resumption events
237
- applied_events.extend(
238
- [
239
- # the current active flow is interrupted
240
- FlowInterrupted(
241
- original_user_frame.flow_id, original_user_frame.step_id
242
- ),
243
- # the flow, which was on the stack, is resumed
244
- FlowResumed(user_frame_to_resume.flow_id, user_frame_to_resume.step_id),
245
- ]
246
- )
247
-
248
- return applied_events + tracker.create_stack_updated_events(stack)
249
-
250
- def _collect_frames_to_resume(
251
- self, stack: DialogueStack, target_flow_id: str
252
- ) -> Tuple[List[DialogueStackFrame], Optional[UserFlowStackFrame]]:
253
- """Collect frames that need to be resumed for the target flow.
254
-
255
- Args:
256
- stack: The stack to collect frames from.
257
- target_flow_id: The ID of the flow to resume.
258
-
259
- Returns:
260
- A tuple containing (frames_to_resume, frame_to_resume).
261
- """
262
- frames_to_resume: List[DialogueStackFrame] = []
263
- frame_found = False
264
- frame_to_resume = None
265
-
266
- for frame in stack.frames:
267
- if isinstance(frame, UserFlowStackFrame) and (
268
- frame.frame_type == FlowStackFrameType.REGULAR
269
- or frame.frame_type == FlowStackFrameType.INTERRUPT
270
- ):
271
- if frame.flow_id == target_flow_id:
272
- frames_to_resume.append(frame)
273
- frame_to_resume = frame
274
- frame_found = True
275
- continue
276
- elif frame_found:
277
- break
278
-
279
- if frame_found:
280
- frames_to_resume.append(frame)
281
-
282
- return list(frames_to_resume), frame_to_resume
283
-
284
-
285
- def _remove_pattern_continue_interrupted_frames(stack: DialogueStack) -> DialogueStack:
286
- """Remove pattern_continue_interrupted frames from the stack."""
287
- if not is_continue_interrupted_flow_active(stack):
288
- return stack
289
-
290
- # remove pattern_continue_interrupted from the stack
291
- top_frame = stack.top()
292
- while isinstance(top_frame, PatternFlowStackFrame):
293
- # If the top frame is a pattern frame, we need to remove it
294
- # before continuing with the active user flow frame.
295
- # This prevents the pattern frame
296
- # from being left on the stack when the flow is started
297
- # which would prevent pattern_completed to be triggered
298
- # once the user flow is completed.
299
- stack.pop()
300
- top_frame = stack.top()
301
-
302
- return stack
@@ -5,9 +5,21 @@ import structlog
5
5
  from rasa.dialogue_understanding.patterns.validate_slot import (
6
6
  ValidateSlotPatternFlowStackFrame,
7
7
  )
8
+ from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
9
+ from rasa.dialogue_understanding.stack.frames.dialogue_stack_frame import (
10
+ DialogueStackFrame,
11
+ )
12
+ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
13
+ AgentStackFrame,
14
+ FlowStackFrameType,
15
+ UserFlowStackFrame,
16
+ )
17
+ from rasa.dialogue_understanding.stack.frames.pattern_frame import PatternFlowStackFrame
8
18
  from rasa.shared.constants import ACTION_ASK_PREFIX, UTTER_ASK_PREFIX
9
19
  from rasa.shared.core.events import (
20
+ AgentResumed,
10
21
  Event,
22
+ FlowResumed,
11
23
  SlotSet,
12
24
  )
13
25
  from rasa.shared.core.flows import FlowsList
@@ -154,3 +166,109 @@ def find_default_flows_collecting_slot(
154
166
  for step in flow.get_collect_steps()
155
167
  )
156
168
  ]
169
+
170
+
171
+ def resume_flow(
172
+ flow_to_resume: str,
173
+ tracker: DialogueStateTracker,
174
+ stack: DialogueStack,
175
+ ) -> List[Event]:
176
+ """Resumes a flow by reordering frames."""
177
+ applied_events: List[Event] = []
178
+
179
+ # Resume existing flow by reordering frames
180
+ frames_to_resume, user_frame_to_resume = collect_frames_to_resume(
181
+ stack, flow_to_resume
182
+ )
183
+
184
+ # if the flow is not on the stack, do nothing
185
+ # this should not happen, but just in case
186
+ if user_frame_to_resume is None:
187
+ structlogger.error(
188
+ "resume_flow.no_user_frame_to_resume",
189
+ flow_to_resume=flow_to_resume,
190
+ )
191
+ return []
192
+
193
+ # move the frames to the top of the stack, e.g. reorder the frames
194
+ # on the stack
195
+ stack.move_frames_to_top(frames_to_resume)
196
+
197
+ # create agent resumed events if the agent frame is now on top of the stack
198
+ agent_stack_frame = next(
199
+ (frame for frame in frames_to_resume if isinstance(frame, AgentStackFrame)),
200
+ None,
201
+ )
202
+ if agent_stack_frame:
203
+ agent_id = agent_stack_frame.agent_id
204
+ applied_events.append(AgentResumed(agent_id, agent_stack_frame.flow_id))
205
+
206
+ # Create flow interruption and resumption events
207
+ applied_events.extend(
208
+ [
209
+ # the flow, which was on the stack, is resumed
210
+ FlowResumed(user_frame_to_resume.flow_id, user_frame_to_resume.step_id),
211
+ ]
212
+ )
213
+
214
+ return applied_events + tracker.create_stack_updated_events(stack)
215
+
216
+
217
+ def collect_frames_to_resume(
218
+ stack: DialogueStack,
219
+ target_flow_id: str, # pyright: ignore[reportUndefinedVariable]
220
+ ) -> Tuple[List[DialogueStackFrame], Optional[UserFlowStackFrame]]:
221
+ """Collect frames that need to be resumed for the target flow.
222
+
223
+ Args:
224
+ stack: The stack to collect frames from.
225
+ target_flow_id: The ID of the flow to resume.
226
+
227
+ Returns:
228
+ A tuple containing (frames_to_resume, frame_to_resume).
229
+ """
230
+ frames_to_resume: List[DialogueStackFrame] = []
231
+ frame_found = False
232
+ frame_to_resume = None
233
+
234
+ for frame in stack.frames:
235
+ if isinstance(frame, UserFlowStackFrame) and (
236
+ frame.frame_type == FlowStackFrameType.REGULAR
237
+ or frame.frame_type == FlowStackFrameType.INTERRUPT
238
+ ):
239
+ if frame.flow_id == target_flow_id:
240
+ frames_to_resume.append(frame)
241
+ frame_to_resume = frame
242
+ frame_found = True
243
+ continue
244
+ elif frame_found:
245
+ break
246
+
247
+ if frame_found:
248
+ frames_to_resume.append(frame)
249
+
250
+ return list(frames_to_resume), frame_to_resume
251
+
252
+
253
+ def remove_pattern_continue_interrupted_frames(stack: DialogueStack) -> DialogueStack:
254
+ """Remove pattern_continue_interrupted frames from the stack."""
255
+ from rasa.dialogue_understanding.stack.utils import (
256
+ is_continue_interrupted_flow_active,
257
+ )
258
+
259
+ if not is_continue_interrupted_flow_active(stack):
260
+ return stack
261
+
262
+ # remove pattern_continue_interrupted from the stack
263
+ top_frame = stack.top()
264
+ while isinstance(top_frame, PatternFlowStackFrame):
265
+ # If the top frame is a pattern frame, we need to remove it
266
+ # before continuing with the active user flow frame.
267
+ # This prevents the pattern frame
268
+ # from being left on the stack when the flow is started
269
+ # which would prevent pattern_completed to be triggered
270
+ # once the user flow is completed.
271
+ stack.pop()
272
+ top_frame = stack.top()
273
+
274
+ return stack
@@ -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 = (
@@ -5,15 +5,15 @@ Your task is to analyze the current conversation context and generate a list of
5
5
 
6
6
  ## Available Actions:
7
7
  * `start flow flow_name`: Starting a flow. For example, `start flow transfer_money` or `start flow list_contacts`.
8
- * `set slot slot_name slot_value`: Slot setting. For example, `set slot transfer_money_recipient Freddy`. Can be used to correct and change previously set values.
8
+ * `set slot slot_name slot_value`: Slot setting. For example, `set slot transfer_money_recipient Freddy`. Can be used to correct and change previously set values. ONLY use slots that are explicitly defined in the flow's slot list.
9
9
  * `cancel flow`: Cancelling the current flow.
10
10
  * `disambiguate flows flow_name1 flow_name2 ... flow_name_n`: Disambiguate which flow should be started when user input is ambiguous by listing the potential flows as options. For example, `disambiguate flows list_contacts add_contact remove_contact ...` if the user just wrote "contacts".
11
11
  * `provide info`: Responding to the user's questions by supplying relevant information, such as answering FAQs or explaining services.
12
12
  * `offtopic reply`: Responding to casual or social user messages that are unrelated to any flows, engaging in friendly conversation and addressing off-topic remarks.
13
13
  * `hand over`: Handing over to a human, in case the user seems frustrated or explicitly asks to speak to one.
14
14
  * `repeat message`: Repeating the last bot message.
15
- {% if active_agent %} * `continue agent`: Continue the currently active agent {{ active_agent.name }}.{% endif %}
16
- {% if completed_agents %}* `restart agent agent_name`: Restart the agent with the given name, in case the user wants to change some answer to a previous question asked by the agent. For example, `restart agent car_research_agent` if the user chnaged his mind about the car he wants to buy.{% endif %}
15
+ {% if active_agent %} * `continue agent`: Continue the currently active agent {{ active_agent.name }}. This has HIGHEST PRIORITY when an agent is active and the user is responding to agent questions.{% endif %}
16
+ {% if completed_agents %}* `restart agent agent_name`: Restart the agent with the given name, in case the user wants to change some answer to a previous question asked by the agent. For example, `restart agent car_research_agent` if the user changed his mind about the car he wants to buy. ONLY use agents that are listed in the `completed_agents` section.{% endif %}
17
17
 
18
18
  --
19
19
 
@@ -23,13 +23,18 @@ Your task is to analyze the current conversation context and generate a list of
23
23
  * Set the boolean slots based on the user response. Map positive responses to `True`, and negative to `False`.
24
24
  * Always refer to the slot description to determine what information should be extracted and how it should be formatted.
25
25
  * For text slots, extract values exactly as provided by the user unless the slot description specifies otherwise. Preserve formatting and avoid rewording, truncation, or making assumptions.
26
+ * ONLY use `set slot` with slots that are explicitly defined in the current flow's slot list. Do NOT create or assume slots that don't exist.
26
27
  * Only use information provided by the user.
27
28
  * Use clarification in ambiguous cases.
28
29
  * Multiple flows can be started. If a user wants to digress into a second flow, you do not need to cancel the current flow.
29
30
  * Do not cancel the flow unless the user explicitly requests it.
30
31
  * Strictly adhere to the provided action format.
32
+ * ONLY use the exact actions listed above. Do NOT invent new actions like "respond <message>" or any other variations.
31
33
  * Focus on the last message and take it one step at a time.
32
- * Use the previous conversation steps only to aid understanding.
34
+ * Use the previous conversation steps only to aid understanding.{% if active_agent %}
35
+ * When an agent is active, ALWAYS prioritize `continue agent` over `provide info` or `offtopic reply` unless the user is clearly asking something unrelated to the agent's task.{% endif %}{% if completed_agents %}
36
+ * ONLY use `restart agent` with agents that are listed in the `completed_agents` section. Do NOT restart non-existent agents.{% endif %}{% if active_agent or completed_agents %}
37
+ * If you're unsure about agent names, refer to the structured data provided in the `Current State` section.{% endif %}
33
38
 
34
39
  --
35
40
 
@@ -44,7 +49,7 @@ Use the following structured data:
44
49
  ## Current State
45
50
  {% if current_flow != None %}Use the following structured data:
46
51
  ```json
47
- {"active_flow": "{{ current_flow }}","current_step": {"requested_slot": "{{ current_slot }}","requested_slot_description": {{ current_slot_description | to_json_escaped_string }}},"slots": [{% for slot in flow_slots %}{"name": "{{ slot.name }}","value": "{{ slot.value }}","type": "{{ slot.type }}"{{ "," if slot.description or slot.allowed_values else "" }}{% if slot.description %}"description": {{ slot.description | to_json_escaped_string }}{{ "," if slot.allowed_values else "" }}{% endif %}{% if slot.allowed_values %}"allowed_values": "{{ slot.allowed_values }}"{% endif %}}{% if not loop.last %},{% endif %}{% endfor %}]{% if active_agent or completed_agents %},{% endif %}{% if active_agent %}"active_agent": {"name": "{{ active_agent.name }}","description": "{{ active_agent.description }}"}{% if completed_agents %},{% endif %}{% endif %}{% if completed_agents %}"completed_agents": [{% for agent in completed_agents %}{"name": "{{ agent.name }}","description": "{{ agent.description }}"}{% if not loop.last %},{% endif %}{% endfor %}]{% endif %}}
52
+ {"active_flow":{"name":"{{ current_flow }}","current_step":{"requested_slot":"{{ current_slot }}","requested_slot_description":{{ current_slot_description | to_json_escaped_string }}},"slots":[{% for slot in flow_slots %}{"name":"{{ slot.name }}","value":"{{ slot.value }}","type":"{{ slot.type }}"{% if slot.description %},"description":{{ slot.description | to_json_escaped_string }}{% endif %}{% if slot.allowed_values %},"allowed_values":"{{ slot.allowed_values }}"{% endif %}}{% if not loop.last %},{% endif %}{% endfor %}]}{% if active_agent %},"active_agent":{"name":"{{ active_agent.name }}","description":{{ active_agent.description | to_json_escaped_string }}}{% endif %}{% if completed_agents %},"completed_agents":[{% for agent in completed_agents %}{"name":"{{ agent.name }}","description":{{ agent.description | to_json_escaped_string }}}{% if not loop.last %},{% endif %}{% endfor %}]{% endif %}}
48
53
  ```{% else %}
49
54
  You are currently not inside any flow.{% endif %}
50
55
 
@@ -13,15 +13,15 @@ Use the following structured data:
13
13
 
14
14
  ## Available Actions:
15
15
  * `start flow flow_name`: Starting a flow. For example, `start flow transfer_money` or `start flow list_contacts`.
16
- * `set slot slot_name slot_value`: Slot setting. For example, `set slot transfer_money_recipient Freddy`. Can be used to correct and change previously set values.
16
+ * `set slot slot_name slot_value`: Slot setting. For example, `set slot transfer_money_recipient Freddy`. Can be used to correct and change previously set values. ONLY use slots that are explicitly defined in the flow's slot list.
17
17
  * `cancel flow`: Cancelling the current flow.
18
18
  * `disambiguate flows flow_name1 flow_name2 ... flow_name_n`: Disambiguate which flow should be started when user input is ambiguous by listing the potential flows as options. For example, `disambiguate flows list_contacts add_contact remove_contact ...` if the user just wrote "contacts".
19
19
  * `provide info`: Responding to the user's questions by supplying relevant information, such as answering FAQs or explaining services.
20
20
  * `offtopic reply`: Responding to casual or social user messages that are unrelated to any flows, engaging in friendly conversation and addressing off-topic remarks.
21
21
  * `hand over`: Handing over to a human, in case the user seems frustrated or explicitly asks to speak to one.
22
22
  * `repeat message`: Repeating the last bot message.
23
- {% if active_agent %} * `continue agent`: Continue the currently active agent {{ active_agent.name }}.{% endif %}
24
- {% if completed_agents %}* `restart agent agent_name`: Restart the agent with the given name, in case the user wants to change some answer to a previous question asked by the agent. For example, `restart agent car_research_agent` if the user chnaged his mind about the car he wants to buy.{% endif %}
23
+ {% if active_agent %} * `continue agent`: Continue the currently active agent {{ active_agent.name }}. This has HIGHEST PRIORITY when an agent is active and the user is responding to agent questions.{% endif %}
24
+ {% if completed_agents %}* `restart agent agent_name`: Restart the agent with the given name, in case the user wants to change some answer to a previous question asked by the agent. For example, `restart agent car_research_agent` if the user changed his mind about the car he wants to buy. ONLY use agents that are listed in the `completed_agents` section.{% endif %}
25
25
 
26
26
  ---
27
27
 
@@ -30,13 +30,18 @@ Use the following structured data:
30
30
  * For categorical slots try to match the user message with allowed slot values. Use "other" if you cannot match it.
31
31
  * Set the boolean slots based on the user response. Map positive responses to `True`, and negative to `False`.
32
32
  * Extract text slot values exactly as provided by the user. Avoid assumptions, format changes, or partial extractions.
33
+ * ONLY use `set slot` with slots that are explicitly defined in the current flow's slot list. Do NOT create or assume slots that don't exist.
33
34
  * Only use information provided by the user.
34
35
  * Use clarification in ambiguous cases.
35
36
  * Multiple flows can be started. If a user wants to digress into a second flow, you do not need to cancel the current flow.
36
37
  * Do not cancel the flow unless the user explicitly requests it.
37
38
  * Strictly adhere to the provided action format.
39
+ * ONLY use the exact actions listed above. Do NOT invent new actions like "respond <message>" or any other variations.
38
40
  * Focus on the last message and take it one step at a time.
39
- * Use the previous conversation steps only to aid understanding.
41
+ * Use the previous conversation steps only to aid understanding.{% if active_agent %}
42
+ * When an agent is active, ALWAYS prioritize `continue agent` over `provide info` or `offtopic reply` unless the user is clearly asking something unrelated to the agent's task.{% endif %}{% if completed_agents %}
43
+ * ONLY use `restart agent` with agents that are listed in the `completed_agents` section. Do NOT restart non-existent agents.{% endif %}{% if active_agent or completed_agents %}
44
+ * If you're unsure about agent names, refer to the structured data provided in the `Current State` section.{% endif %}
40
45
 
41
46
  ---
42
47
 
@@ -44,7 +49,7 @@ Use the following structured data:
44
49
  {% if current_flow != None %}
45
50
  Use the following structured data:
46
51
  ```json
47
- {"active_flow": "{{ current_flow }}","current_step": {"requested_slot": "{{ current_slot }}","requested_slot_description": {{ current_slot_description | to_json_escaped_string }}},"slots": [{% for slot in flow_slots %}{"name": "{{ slot.name }}","value": "{{ slot.value }}","type": "{{ slot.type }}"{{ "," if slot.description or slot.allowed_values else "" }}{% if slot.description %}"description": {{ slot.description | to_json_escaped_string }}{{ "," if slot.allowed_values else "" }}{% endif %}{% if slot.allowed_values %}"allowed_values": "{{ slot.allowed_values }}"{% endif %}}{% if not loop.last %},{% endif %}{% endfor %}]{% if active_agent or completed_agents %},{% endif %}{% if active_agent %}"active_agent": {"name": "{{ active_agent.name }}","description": "{{ active_agent.description }}"}{% if completed_agents %},{% endif %}{% endif %}{% if completed_agents %}"completed_agents": [{% for agent in completed_agents %}{"name": "{{ agent.name }}","description": "{{ agent.description }}"}{% if not loop.last %},{% endif %}{% endfor %}]{% endif %}}
52
+ {"active_flow":{"name":"{{ current_flow }}","current_step":{"requested_slot":"{{ current_slot }}","requested_slot_description":{{ current_slot_description | to_json_escaped_string }}},"slots":[{% for slot in flow_slots %}{"name":"{{ slot.name }}","value":"{{ slot.value }}","type":"{{ slot.type }}"{% if slot.description %},"description":{{ slot.description | to_json_escaped_string }}{% endif %}{% if slot.allowed_values %},"allowed_values":"{{ slot.allowed_values }}"{% endif %}}{% if not loop.last %},{% endif %}{% endfor %}]}{% if active_agent %},"active_agent":{"name":"{{ active_agent.name }}","description":{{ active_agent.description | to_json_escaped_string }}}{% endif %}{% if completed_agents %},"completed_agents":[{% for agent in completed_agents %}{"name":"{{ agent.name }}","description":{{ agent.description | to_json_escaped_string }}}{% if not loop.last %},{% endif %}{% endfor %}]{% endif %}}
48
53
  ```{% else %}
49
54
  You are currently not inside any flow.{% endif %}
50
55
 
@@ -5,13 +5,13 @@ Your task is to analyze the current conversation context and generate a list of
5
5
 
6
6
  ## Available Actions:
7
7
  * `start flow flow_name`: Start a flow. For example, `start flow transfer_money` or `start flow list_contacts`.
8
- * `set slot slot_name slot_value`: Set a slot for the active flow. For example, `set slot transfer_money_recipient Freddy`. Can be used to correct and change previously set values.
8
+ * `set slot slot_name slot_value`: Set a slot for the active flow. For example, `set slot transfer_money_recipient Freddy`. Can be used to correct and change previously set values. ONLY use slots that are explicitly defined in the flow's slot list.
9
9
  * `disambiguate flows flow_name1 flow_name2 ... flow_name_n`: When a message could refer to multiple flows, list the possible flows as options to clarify. Example: `disambiguate flows list_contacts add_contact remove_contact`.
10
10
  * `search and reply`: Provide a response from the knowledge base to address the user's inquiry when no flows fit, including domain knowledge, FAQs, and all off-topic or social messages.
11
11
  * `cancel flow`: Cancel the current flow if the user requests it.
12
12
  * `repeat message`: Repeat the last bot message.
13
- {% if active_agent %} * `continue agent`: Continue the currently active agent {{ active_agent.name }}.{% endif %}
14
- {% if completed_agents %}* `restart agent agent_name`: Restart the agent with the given name, in case the user wants to change some answer to a previous question asked by the agent. For example, `restart agent car_research_agent` if the user chnaged his mind about the car he wants to buy.{% endif %}
13
+ {% if active_agent %} * `continue agent`: Continue the currently active agent {{ active_agent.name }}. This has HIGHEST PRIORITY when an agent is active and the user is responding to agent questions.{% endif %}
14
+ {% if completed_agents %}* `restart agent agent_name`: Restart the agent with the given name, in case the user wants to change some answer to a previous question asked by the agent. For example, `restart agent car_research_agent` if the user changed his mind about the car he wants to buy. ONLY use agents that are listed in the `completed_agents` section.{% endif %}
15
15
 
16
16
  ---
17
17
 
@@ -24,6 +24,7 @@ Your task is to analyze the current conversation context and generate a list of
24
24
  * For categorical slots, try to match the user message with allowed slot values. Use "other" if you cannot match it.
25
25
  * Set the boolean slots based on the user's response. Map positive responses to `True`, and negative to `False`.
26
26
  * Extract text slot values exactly as provided by the user. Avoid assumptions, format changes, or partial extractions.
27
+ * ONLY use `set slot` with slots that are explicitly defined in the current flow's slot list. Do NOT create or assume slots that don't exist.
27
28
  ### Disambiguate Flows
28
29
  * Use `disambiguate flows` when the user's message matches multiple flows and you cannot decide which flow is most appropriate.
29
30
  * If the user message is short and not precise enough to start a flow or `search and reply`, disambiguate.
@@ -34,22 +35,29 @@ Your task is to analyze the current conversation context and generate a list of
34
35
  * Flow Priority: If you are unsure between starting a flow or `search and reply`, always prioritize starting a flow.
35
36
  ### Cancel Flow
36
37
  * Do not cancel any flow unless the user explicitly requests it.
37
- * Multiple flows can be started without cancelling the previous, if the user wants to pursue multiple processes.
38
- ### General Tips
38
+ * Multiple flows can be started without cancelling the previous, if the user wants to pursue multiple processes.{% if active_agent or completed_agents %}
39
+ ### Agents{% if active_agent %}
40
+ * When an agent is active, ALWAYS prioritize `continue agent` over `search and reply` unless the user is clearly asking something unrelated to the agent's task.{% endif %}{% if completed_agents %}
41
+ * ONLY use `restart agent` with agents that are listed in the `completed_agents` section. Do NOT restart non-existent agents.{% endif %}
42
+ * If you're unsure about agent names, refer to the structured data provided in the `Current State` section.
43
+ {% endif %}### General Tips
39
44
  * Only use information provided by the user.
40
45
  * Strictly adhere to the provided action format.
46
+ * ONLY use the exact actions listed above. Do NOT invent new actions like "respond <message>" or any other variations.
41
47
  * Focus on the last message and take it one step at a time.
42
48
  * Use the previous conversation steps only to aid understanding.
43
49
 
50
+
44
51
  ---
45
52
 
46
53
  ## Decision Rule Table
47
- | Condition | Action |
48
- |-------------------------------------------------------|--------------------|
49
- | Flow perfectly matches user's message | start flow |
50
- | Multiple flows are equally strong, relevant matches | disambiguate flows |
51
- | User's message is unclear or imprecise | disambiguate flows |
52
- | No flow fits at all, but knowledge base may help | search and reply |
54
+ | Condition | Action |
55
+ |---------------------------------------------------------------|--------------------|{% if active_agent %}
56
+ | Agent is active and the user is responding to agent questions | continue agent |{% endif %}
57
+ | Flow perfectly matches user's message | start flow |
58
+ | Multiple flows are equally strong, relevant matches | disambiguate flows |
59
+ | User's message is unclear or imprecise | disambiguate flows |
60
+ | No flow fits at all, but knowledge base may help | search and reply |
53
61
 
54
62
  ---
55
63
 
@@ -64,7 +72,7 @@ Use the following structured data:
64
72
  ## Current State
65
73
  {% if current_flow != None %}Use the following structured data:
66
74
  ```json
67
- {"active_flow": "{{ current_flow }}","current_step": {"requested_slot": "{{ current_slot }}","requested_slot_description": {{ current_slot_description | to_json_escaped_string }}},"slots": [{% for slot in flow_slots %}{"name": "{{ slot.name }}","value": "{{ slot.value }}","type": "{{ slot.type }}"{{ "," if slot.description or slot.allowed_values else "" }}{% if slot.description %}"description": {{ slot.description | to_json_escaped_string }}{{ "," if slot.allowed_values else "" }}{% endif %}{% if slot.allowed_values %}"allowed_values": "{{ slot.allowed_values }}"{% endif %}}{% if not loop.last %},{% endif %}{% endfor %}]{% if active_agent or completed_agents %},{% endif %}{% if active_agent %}"active_agent": {"name": "{{ active_agent.name }}","description": "{{ active_agent.description }}"}{% if completed_agents %},{% endif %}{% endif %}{% if completed_agents %}"completed_agents": [{% for agent in completed_agents %}{"name": "{{ agent.name }}","description": "{{ agent.description }}"}{% if not loop.last %},{% endif %}{% endfor %}]{% endif %}}
75
+ {"active_flow":{"name":"{{ current_flow }}","current_step":{"requested_slot":"{{ current_slot }}","requested_slot_description":{{ current_slot_description | to_json_escaped_string }}},"slots":[{% for slot in flow_slots %}{"name":"{{ slot.name }}","value":"{{ slot.value }}","type":"{{ slot.type }}"{% if slot.description %},"description":{{ slot.description | to_json_escaped_string }}{% endif %}{% if slot.allowed_values %},"allowed_values":"{{ slot.allowed_values }}"{% endif %}}{% if not loop.last %},{% endif %}{% endfor %}]}{% if active_agent %},"active_agent":{"name":"{{ active_agent.name }}","description":{{ active_agent.description | to_json_escaped_string }}}{% endif %}{% if completed_agents %},"completed_agents":[{% for agent in completed_agents %}{"name":"{{ agent.name }}","description":{{ agent.description | to_json_escaped_string }}}{% if not loop.last %},{% endif %}{% endfor %}]{% endif %}}
68
76
  ```{% else %}
69
77
  You are currently not inside any flow.{% endif %}
70
78