rasa-pro 3.14.0.dev3__py3-none-any.whl → 3.14.0.dev5__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 (437) hide show
  1. rasa/api.py +0 -5
  2. rasa/builder/README.md +120 -0
  3. rasa/builder/auth.py +176 -0
  4. rasa/builder/config.py +115 -0
  5. rasa/builder/copilot/constants.py +25 -0
  6. rasa/builder/copilot/copilot.py +372 -0
  7. rasa/builder/copilot/copilot_response_handler.py +487 -0
  8. rasa/builder/copilot/copilot_templated_message_provider.py +58 -0
  9. rasa/builder/copilot/exceptions.py +20 -0
  10. rasa/builder/copilot/models.py +431 -0
  11. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +726 -0
  12. rasa/builder/copilot/telemetry.py +195 -0
  13. rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +16 -0
  14. rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +26 -0
  15. rasa/builder/document_retrieval/constants.py +15 -0
  16. rasa/builder/document_retrieval/inkeep-rag-response-schema.json +64 -0
  17. rasa/builder/document_retrieval/inkeep_document_retrieval.py +238 -0
  18. rasa/builder/document_retrieval/models.py +62 -0
  19. rasa/builder/download.py +140 -0
  20. rasa/builder/exceptions.py +55 -0
  21. rasa/builder/guardrails/__init__.py +1 -0
  22. rasa/builder/guardrails/constants.py +3 -0
  23. rasa/builder/guardrails/exceptions.py +4 -0
  24. rasa/builder/guardrails/lakera.py +206 -0
  25. rasa/builder/guardrails/models.py +199 -0
  26. rasa/builder/guardrails/utils.py +305 -0
  27. rasa/builder/job_manager.py +87 -0
  28. rasa/builder/jobs.py +234 -0
  29. rasa/builder/llm_service.py +246 -0
  30. rasa/builder/logging_utils.py +209 -0
  31. rasa/builder/main.py +174 -0
  32. rasa/builder/models.py +197 -0
  33. rasa/builder/project_generator.py +450 -0
  34. rasa/builder/project_info.py +72 -0
  35. rasa/builder/scrape_rasa_docs.py +97 -0
  36. rasa/builder/service.py +1142 -0
  37. rasa/builder/shared/tracker_context.py +212 -0
  38. rasa/builder/skill_to_bot_prompt.jinja2 +164 -0
  39. rasa/builder/training_service.py +132 -0
  40. rasa/builder/validation_service.py +93 -0
  41. rasa/cli/arguments/default_arguments.py +0 -12
  42. rasa/cli/arguments/run.py +0 -2
  43. rasa/cli/dialogue_understanding_test.py +0 -4
  44. rasa/cli/e2e_test.py +0 -4
  45. rasa/cli/inspect.py +0 -3
  46. rasa/cli/llm_fine_tuning.py +0 -5
  47. rasa/cli/project_templates/basic/actions/action_api.py +15 -0
  48. rasa/cli/project_templates/basic/actions/action_human_handoff.py +44 -0
  49. rasa/cli/project_templates/basic/config.yml +23 -0
  50. rasa/cli/project_templates/basic/credentials.yml +34 -0
  51. rasa/cli/project_templates/basic/data/general/feedback.yml +20 -0
  52. rasa/cli/project_templates/basic/data/general/goodbye.yml +6 -0
  53. rasa/cli/project_templates/basic/data/general/hello.yml +7 -0
  54. rasa/cli/project_templates/basic/data/general/help.yml +6 -0
  55. rasa/cli/project_templates/basic/data/general/human_handoff.yml +16 -0
  56. rasa/cli/project_templates/basic/data/general/welcome.yml +9 -0
  57. rasa/cli/project_templates/basic/data/system/pattern_completed.yml +7 -0
  58. rasa/cli/project_templates/basic/data/system/pattern_correction.yml +7 -0
  59. rasa/cli/project_templates/basic/data/system/pattern_search.yml +8 -0
  60. rasa/cli/project_templates/basic/data/system/pattern_session_start.yml +8 -0
  61. rasa/cli/project_templates/basic/docs/rasa_assistant_qa.txt +65 -0
  62. rasa/cli/project_templates/basic/docs/template.txt +7 -0
  63. rasa/cli/project_templates/basic/domain/general/assistant_details.yml +12 -0
  64. rasa/cli/project_templates/basic/domain/general/bot_identity.yml +5 -0
  65. rasa/cli/project_templates/basic/domain/general/cannot_handle.yml +5 -0
  66. rasa/cli/project_templates/basic/domain/general/feedback.yml +28 -0
  67. rasa/cli/project_templates/basic/domain/general/goodbye.yml +7 -0
  68. rasa/cli/project_templates/basic/domain/general/help.yml +5 -0
  69. rasa/cli/project_templates/basic/domain/general/human_handoff_domain.yml +35 -0
  70. rasa/cli/project_templates/basic/domain/general/utils.yml +13 -0
  71. rasa/cli/project_templates/basic/domain/general/welcome.yml +7 -0
  72. rasa/cli/project_templates/basic/endpoints.yml +73 -0
  73. rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +19 -0
  74. rasa/cli/project_templates/finance/actions/__init__.py +46 -0
  75. rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +47 -0
  76. rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +40 -0
  77. rasa/cli/project_templates/finance/actions/action_session_start.py +74 -0
  78. rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +48 -0
  79. rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +36 -0
  80. rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +54 -0
  81. rasa/cli/project_templates/finance/actions/database.py +277 -0
  82. rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
  83. rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +52 -0
  84. rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +51 -0
  85. rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +40 -0
  86. rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +40 -0
  87. rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +46 -0
  88. rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +18 -0
  89. rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +49 -0
  90. rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +19 -0
  91. rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +36 -0
  92. rasa/cli/project_templates/finance/config.yml +21 -0
  93. rasa/cli/project_templates/finance/credentials.yml +32 -0
  94. rasa/cli/project_templates/finance/csvs/accounts.csv +8 -0
  95. rasa/cli/project_templates/finance/csvs/advisors.csv +7 -0
  96. rasa/cli/project_templates/finance/csvs/appointments.csv +211 -0
  97. rasa/cli/project_templates/finance/csvs/branches.csv +10 -0
  98. rasa/cli/project_templates/finance/csvs/cards.csv +11 -0
  99. rasa/cli/project_templates/finance/csvs/payees.csv +11 -0
  100. rasa/cli/project_templates/finance/csvs/transactions.csv +71 -0
  101. rasa/cli/project_templates/finance/csvs/users.csv +4 -0
  102. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +10 -0
  103. rasa/cli/project_templates/finance/data/cards/block_card.yml +66 -0
  104. rasa/cli/project_templates/finance/data/cards/select_card.yml +12 -0
  105. rasa/cli/project_templates/finance/data/general/bot_identity.yml +6 -0
  106. rasa/cli/project_templates/finance/data/general/feedback.yml +20 -0
  107. rasa/cli/project_templates/finance/data/general/goodbye.yml +6 -0
  108. rasa/cli/project_templates/finance/data/general/hello.yml +7 -0
  109. rasa/cli/project_templates/finance/data/general/help.yml +9 -0
  110. rasa/cli/project_templates/finance/data/general/human_handoff.yml +16 -0
  111. rasa/cli/project_templates/finance/data/general/welcome.yml +9 -0
  112. rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +5 -0
  113. rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +7 -0
  114. rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +7 -0
  115. rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +8 -0
  116. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +8 -0
  117. rasa/cli/project_templates/finance/data/system/source/accounts.json +51 -0
  118. rasa/cli/project_templates/finance/data/system/source/advisors.json +44 -0
  119. rasa/cli/project_templates/finance/data/system/source/appointments.json +1474 -0
  120. rasa/cli/project_templates/finance/data/system/source/branches.json +47 -0
  121. rasa/cli/project_templates/finance/data/system/source/cards.json +72 -0
  122. rasa/cli/project_templates/finance/data/system/source/payees.json +74 -0
  123. rasa/cli/project_templates/finance/data/system/source/transactions.json +492 -0
  124. rasa/cli/project_templates/finance/data/system/source/users.json +29 -0
  125. rasa/cli/project_templates/finance/data/transfers/add_payee.yml +29 -0
  126. rasa/cli/project_templates/finance/data/transfers/list_payees.yml +5 -0
  127. rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +21 -0
  128. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +67 -0
  129. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +8 -0
  130. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +8 -0
  131. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +8 -0
  132. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +8 -0
  133. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +8 -0
  134. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +7 -0
  135. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +8 -0
  136. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +8 -0
  137. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +8 -0
  138. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +8 -0
  139. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +8 -0
  140. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +8 -0
  141. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +8 -0
  142. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +8 -0
  143. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +8 -0
  144. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +8 -0
  145. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +8 -0
  146. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +8 -0
  147. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +8 -0
  148. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +8 -0
  149. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +50 -0
  150. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +50 -0
  151. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +48 -0
  152. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +50 -0
  153. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +50 -0
  154. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +47 -0
  155. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +50 -0
  156. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +50 -0
  157. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +47 -0
  158. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +50 -0
  159. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +50 -0
  160. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +50 -0
  161. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +47 -0
  162. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +50 -0
  163. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +50 -0
  164. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +47 -0
  165. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +50 -0
  166. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +50 -0
  167. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +47 -0
  168. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +50 -0
  169. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +50 -0
  170. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +47 -0
  171. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +47 -0
  172. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +50 -0
  173. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +50 -0
  174. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +47 -0
  175. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +50 -0
  176. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +50 -0
  177. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +47 -0
  178. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +50 -0
  179. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +50 -0
  180. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +47 -0
  181. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +50 -0
  182. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +50 -0
  183. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +50 -0
  184. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +47 -0
  185. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +50 -0
  186. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +50 -0
  187. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +47 -0
  188. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +50 -0
  189. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +50 -0
  190. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +47 -0
  191. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +50 -0
  192. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +50 -0
  193. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +50 -0
  194. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +47 -0
  195. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +50 -0
  196. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +50 -0
  197. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +47 -0
  198. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +50 -0
  199. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +50 -0
  200. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +47 -0
  201. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +50 -0
  202. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +50 -0
  203. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +47 -0
  204. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +47 -0
  205. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +50 -0
  206. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +50 -0
  207. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +50 -0
  208. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +50 -0
  209. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +47 -0
  210. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +11 -0
  211. rasa/cli/project_templates/finance/domain/cards/block_card.yml +101 -0
  212. rasa/cli/project_templates/finance/domain/cards/select_card.yml +12 -0
  213. rasa/cli/project_templates/finance/domain/general/assistant_details.yml +12 -0
  214. rasa/cli/project_templates/finance/domain/general/bot_identity.yml +5 -0
  215. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +5 -0
  216. rasa/cli/project_templates/finance/domain/general/defaults.yml +24 -0
  217. rasa/cli/project_templates/finance/domain/general/feedback.yml +28 -0
  218. rasa/cli/project_templates/finance/domain/general/goodbye.yml +7 -0
  219. rasa/cli/project_templates/finance/domain/general/help.yml +5 -0
  220. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +30 -0
  221. rasa/cli/project_templates/finance/domain/general/utils.yml +13 -0
  222. rasa/cli/project_templates/finance/domain/general/welcome.yml +8 -0
  223. rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +47 -0
  224. rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +4 -0
  225. rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +16 -0
  226. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +79 -0
  227. rasa/cli/project_templates/finance/endpoints.yml +63 -0
  228. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +19 -0
  229. rasa/cli/project_templates/telco/actions/__init__.py +0 -0
  230. rasa/cli/project_templates/telco/actions/actions_billing.py +204 -0
  231. rasa/cli/project_templates/telco/actions/actions_get_data_from_db.py +48 -0
  232. rasa/cli/project_templates/telco/actions/actions_run_diagnostics.py +28 -0
  233. rasa/cli/project_templates/telco/actions/actions_session_start.py +18 -0
  234. rasa/cli/project_templates/telco/config.yml +25 -0
  235. rasa/cli/project_templates/telco/credentials.yml +33 -0
  236. rasa/cli/project_templates/telco/csvs/billing.csv +10 -0
  237. rasa/cli/project_templates/telco/csvs/customers.csv +5 -0
  238. rasa/cli/project_templates/telco/data/flows/flow_global.yml +5 -0
  239. rasa/cli/project_templates/telco/data/flows/flow_reboot_router.yml +8 -0
  240. rasa/cli/project_templates/telco/data/flows/flow_reset_router.yml +7 -0
  241. rasa/cli/project_templates/telco/data/flows/flow_solve_internet_issue.yml +73 -0
  242. rasa/cli/project_templates/telco/data/flows/flow_undertand_bill.yml +45 -0
  243. rasa/cli/project_templates/telco/data/patterns/pattern_completed.yml +7 -0
  244. rasa/cli/project_templates/telco/data/patterns/pattern_human_handoff.yml +6 -0
  245. rasa/cli/project_templates/telco/data/patterns/pattern_search.yml +7 -0
  246. rasa/cli/project_templates/telco/data/patterns/pattern_session_start.yml +9 -0
  247. rasa/cli/project_templates/telco/docs/reset_vs_rboot_router.txt +1 -0
  248. rasa/cli/project_templates/telco/docs/restart_router.txt +6 -0
  249. rasa/cli/project_templates/telco/docs/run_speed_test.txt +6 -0
  250. rasa/cli/project_templates/telco/domain/domain_global.yml +29 -0
  251. rasa/cli/project_templates/telco/domain/domain_patterns.yml +17 -0
  252. rasa/cli/project_templates/telco/domain/domain_reboot_router.yml +20 -0
  253. rasa/cli/project_templates/telco/domain/domain_reset_router.yml +11 -0
  254. rasa/cli/project_templates/telco/domain/domain_run_speed_test.yml +24 -0
  255. rasa/cli/project_templates/telco/domain/domain_solve_internet_issue.yml +74 -0
  256. rasa/cli/project_templates/telco/domain/domain_undertand_bill.yml +102 -0
  257. rasa/cli/project_templates/telco/endpoints.yml +60 -0
  258. rasa/{dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 → cli/project_templates/telco/prompts/command-generator.jinja2} +3 -7
  259. rasa/cli/project_templates/telco/tests/e2e_results_failed.yml +62 -0
  260. rasa/cli/project_templates/telco/tests/e2e_results_passed.yml +130 -0
  261. rasa/cli/project_templates/telco/tests/e2e_test_cases/billing_test_cases.yml +68 -0
  262. rasa/cli/project_templates/telco/tests/e2e_test_cases/global_test_cases.yml +13 -0
  263. rasa/cli/project_templates/telco/tests/e2e_test_cases/internet_slow_test_case.yml +47 -0
  264. rasa/cli/project_templates/telco/tests/e2e_test_cases/out_of_scope_test_case.yml +21 -0
  265. rasa/cli/project_templates/telco/tests/e2e_test_cases/patterns_test_cases.yml +15 -0
  266. rasa/cli/project_templates/tutorial/config.yml +2 -1
  267. rasa/cli/run.py +0 -4
  268. rasa/cli/scaffold.py +46 -2
  269. rasa/cli/shell.py +0 -3
  270. rasa/constants.py +0 -6
  271. rasa/core/actions/action.py +2 -43
  272. rasa/core/agent.py +0 -16
  273. rasa/core/available_endpoints.py +0 -30
  274. rasa/core/channels/channel.py +4 -3
  275. rasa/core/channels/constants.py +3 -0
  276. rasa/core/channels/development_inspector.py +1 -1
  277. rasa/core/channels/inspector/dist/assets/{arc-2e78c586.js → arc-18042c22.js} +1 -1
  278. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-806b712e.js → blockDiagram-38ab4fdb-fdd6bcfa.js} +1 -1
  279. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-0745efa9.js → c4Diagram-3d4e48cf-f5ae6786.js} +1 -1
  280. rasa/core/channels/inspector/dist/assets/channel-b9b536fc.js +1 -0
  281. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-7bd1082b.js → classDiagram-70f12bd4-81efba3e.js} +1 -1
  282. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-d937ba49.js → classDiagram-v2-f2320105-3b6b6a92.js} +1 -1
  283. rasa/core/channels/inspector/dist/assets/clone-78d2ddcf.js +1 -0
  284. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-a2a564ca.js → createText-2e5e7dd3-31422447.js} +1 -1
  285. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-b5256940.js → edges-e0da2a9e-518a90db.js} +1 -1
  286. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-e6883ad2.js → erDiagram-9861fffd-a6d3c25a.js} +1 -1
  287. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-e576fc02.js → flowDb-956e92f1-e048c2be.js} +1 -1
  288. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-2e298d01.js → flowDiagram-66a62f08-c7474c91.js} +1 -1
  289. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-8b09c060.js +1 -0
  290. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-dd7b150a.js → flowchart-elk-definition-4a651766-cb4d8723.js} +1 -1
  291. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-5b79575c.js → ganttDiagram-c361ad54-346636a2.js} +1 -1
  292. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-3016f40a.js → gitGraphDiagram-72cf32ee-7c508874.js} +1 -1
  293. rasa/core/channels/inspector/dist/assets/{graph-3e19170f.js → graph-14702d8a.js} +1 -1
  294. rasa/core/channels/inspector/dist/assets/{index-3862675e-eb9c86de.js → index-3862675e-f18b534b.js} +1 -1
  295. rasa/core/channels/inspector/dist/assets/index-4d4bdf3a.js +1335 -0
  296. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-b4280e4d.js → infoDiagram-f8f76790-64154b83.js} +1 -1
  297. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-556091f8.js → journeyDiagram-49397b02-833a5f95.js} +1 -1
  298. rasa/core/channels/inspector/dist/assets/{layout-08436411.js → layout-5a3b2123.js} +1 -1
  299. rasa/core/channels/inspector/dist/assets/{line-683c4f3b.js → line-2272a8c7.js} +1 -1
  300. rasa/core/channels/inspector/dist/assets/{linear-cee6d791.js → linear-35bcf273.js} +1 -1
  301. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-a0bf0b1a.js → mindmap-definition-fc14e90a-92dcb0e9.js} +1 -1
  302. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-3730d5c4.js → pieDiagram-8a3498a8-94dbc900.js} +1 -1
  303. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-12a20fed.js → quadrantDiagram-120e2f19-8b7a9c33.js} +1 -1
  304. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-b9732102.js → requirementDiagram-deff3bca-6f7eab81.js} +1 -1
  305. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-a2e72776.js → sankeyDiagram-04a897e0-f43e581d.js} +1 -1
  306. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-8b7a76bb.js → sequenceDiagram-704730f1-0bcbefc3.js} +1 -1
  307. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-e65853ac.js → stateDiagram-587899a1-b8a74083.js} +1 -1
  308. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-6f58a44b.js → stateDiagram-v2-d93cdb3a-2070218f.js} +1 -1
  309. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-df25b934.js → styles-6aaf32cf-f1d54e34.js} +1 -1
  310. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-88357141.js → styles-9a916d00-980de489.js} +1 -1
  311. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-d600174d.js → styles-c10674c1-3c03abde.js} +1 -1
  312. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-4adc3e0b.js → svgDrawCommon-08f97a94-46ba068f.js} +1 -1
  313. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-42816fa1.js → timeline-definition-85554ec2-901f5e3d.js} +1 -1
  314. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-621eb66a.js → xychartDiagram-e933f94c-acbc628a.js} +1 -1
  315. rasa/core/channels/inspector/dist/index.html +2 -2
  316. rasa/core/channels/inspector/index.html +1 -1
  317. rasa/core/channels/inspector/src/App.tsx +10 -11
  318. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +12 -3
  319. rasa/core/channels/inspector/src/components/DialogueStack.tsx +5 -7
  320. rasa/core/channels/inspector/src/helpers/formatters.ts +3 -24
  321. rasa/core/channels/inspector/src/theme/base/styles.ts +1 -19
  322. rasa/core/channels/inspector/src/types.ts +0 -4
  323. rasa/core/channels/socketio.py +212 -51
  324. rasa/core/channels/studio_chat.py +43 -23
  325. rasa/core/channels/voice_stream/voice_channel.py +5 -3
  326. rasa/core/constants.py +0 -4
  327. rasa/core/policies/enterprise_search_policy.py +6 -11
  328. rasa/core/policies/flow_policy.py +4 -4
  329. rasa/core/policies/flows/flow_executor.py +45 -415
  330. rasa/core/processor.py +1 -6
  331. rasa/core/run.py +14 -11
  332. rasa/core/utils.py +1 -21
  333. rasa/dialogue_understanding/commands/__init__.py +0 -8
  334. rasa/dialogue_understanding/commands/cancel_flow_command.py +4 -97
  335. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +0 -11
  336. rasa/dialogue_understanding/commands/clarify_command.py +0 -10
  337. rasa/dialogue_understanding/commands/knowledge_answer_command.py +0 -11
  338. rasa/dialogue_understanding/commands/start_flow_command.py +8 -164
  339. rasa/dialogue_understanding/commands/utils.py +2 -6
  340. rasa/dialogue_understanding/generator/command_parser.py +0 -4
  341. rasa/dialogue_understanding/generator/flow_retrieval.py +10 -9
  342. rasa/dialogue_understanding/generator/llm_based_command_generator.py +12 -50
  343. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +6 -7
  344. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +6 -7
  345. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +2 -41
  346. rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -163
  347. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +8 -52
  348. rasa/dialogue_understanding/processor/command_processor.py +15 -31
  349. rasa/dialogue_understanding/stack/dialogue_stack.py +2 -123
  350. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +0 -57
  351. rasa/dialogue_understanding/stack/utils.py +2 -17
  352. rasa/dialogue_understanding_test/du_test_runner.py +2 -7
  353. rasa/e2e_test/e2e_test_runner.py +0 -5
  354. rasa/engine/storage/local_model_storage.py +45 -2
  355. rasa/model_manager/model_api.py +4 -5
  356. rasa/model_manager/runner_service.py +1 -1
  357. rasa/model_manager/socket_bridge.py +20 -14
  358. rasa/model_manager/trainer_service.py +12 -9
  359. rasa/model_manager/utils.py +1 -29
  360. rasa/server.py +0 -10
  361. rasa/shared/constants.py +0 -5
  362. rasa/shared/core/constants.py +1 -12
  363. rasa/shared/core/domain.py +58 -11
  364. rasa/shared/core/events.py +0 -319
  365. rasa/shared/core/flows/flow_step.py +7 -1
  366. rasa/shared/core/flows/flows_list.py +2 -2
  367. rasa/shared/core/flows/flows_yaml_schema.json +186 -112
  368. rasa/shared/core/flows/steps/call.py +5 -53
  369. rasa/shared/core/flows/validation.py +7 -46
  370. rasa/shared/core/flows/yaml_flows_io.py +16 -8
  371. rasa/shared/core/slots.py +4 -0
  372. rasa/shared/importers/importer.py +6 -0
  373. rasa/shared/importers/utils.py +77 -1
  374. rasa/shared/providers/_utils.py +60 -44
  375. rasa/shared/providers/embedding/default_litellm_embedding_client.py +2 -0
  376. rasa/shared/providers/llm/_base_litellm_client.py +7 -39
  377. rasa/shared/providers/llm/default_litellm_llm_client.py +2 -0
  378. rasa/shared/providers/llm/litellm_router_llm_client.py +4 -8
  379. rasa/shared/providers/llm/llm_client.py +3 -7
  380. rasa/shared/providers/llm/llm_response.py +0 -49
  381. rasa/shared/providers/llm/self_hosted_llm_client.py +4 -8
  382. rasa/shared/utils/llm.py +5 -28
  383. rasa/shared/utils/schemas/events.py +0 -42
  384. rasa/studio/upload.py +16 -47
  385. rasa/telemetry.py +97 -23
  386. rasa/tracing/instrumentation/instrumentation.py +2 -4
  387. rasa/utils/common.py +0 -79
  388. rasa/utils/io.py +27 -9
  389. rasa/utils/json_utils.py +6 -1
  390. rasa/utils/log_utils.py +5 -1
  391. rasa/utils/openapi.py +144 -0
  392. rasa/validator.py +7 -3
  393. rasa/version.py +1 -1
  394. {rasa_pro-3.14.0.dev3.dist-info → rasa_pro-3.14.0.dev5.dist-info}/METADATA +3 -3
  395. {rasa_pro-3.14.0.dev3.dist-info → rasa_pro-3.14.0.dev5.dist-info}/RECORD +405 -174
  396. rasa/agents/agent_factory.py +0 -122
  397. rasa/agents/agent_manager.py +0 -162
  398. rasa/agents/constants.py +0 -32
  399. rasa/agents/core/agent_protocol.py +0 -108
  400. rasa/agents/core/types.py +0 -70
  401. rasa/agents/exceptions.py +0 -8
  402. rasa/agents/protocol/__init__.py +0 -5
  403. rasa/agents/protocol/a2a/a2a_agent.py +0 -51
  404. rasa/agents/protocol/mcp/mcp_base_agent.py +0 -674
  405. rasa/agents/protocol/mcp/mcp_open_agent.py +0 -276
  406. rasa/agents/protocol/mcp/mcp_task_agent.py +0 -469
  407. rasa/agents/schemas/__init__.py +0 -12
  408. rasa/agents/schemas/agent_input.py +0 -38
  409. rasa/agents/schemas/agent_output.py +0 -26
  410. rasa/agents/schemas/agent_tool_result.py +0 -51
  411. rasa/agents/schemas/agent_tool_schema.py +0 -134
  412. rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +0 -15
  413. rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +0 -17
  414. rasa/agents/utils.py +0 -72
  415. rasa/core/available_agents.py +0 -196
  416. rasa/core/channels/inspector/dist/assets/channel-c436ca7c.js +0 -1
  417. rasa/core/channels/inspector/dist/assets/clone-50dd656b.js +0 -1
  418. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-2b2aeaf8.js +0 -1
  419. rasa/core/channels/inspector/dist/assets/index-1bd9135e.js +0 -1353
  420. rasa/core/policies/flows/mcp_tool_executor.py +0 -277
  421. rasa/dialogue_understanding/commands/continue_agent_command.py +0 -91
  422. rasa/dialogue_understanding/commands/restart_agent_command.py +0 -162
  423. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +0 -61
  424. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +0 -81
  425. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +0 -81
  426. rasa/shared/agents/utils.py +0 -35
  427. rasa/shared/utils/mcp/server_connection.py +0 -157
  428. /rasa/{agents → builder}/__init__.py +0 -0
  429. /rasa/{agents/core → builder/copilot}/__init__.py +0 -0
  430. /rasa/{agents/protocol/a2a → builder/copilot/prompts}/__init__.py +0 -0
  431. /rasa/{agents/protocol/mcp → builder/copilot/templated_messages}/__init__.py +0 -0
  432. /rasa/{agents/templates → builder/document_retrieval}/__init__.py +0 -0
  433. /rasa/{shared/agents → cli/project_templates/finance/actions/accounts}/__init__.py +0 -0
  434. /rasa/{shared/utils/mcp → cli/project_templates/finance/actions/cards}/__init__.py +0 -0
  435. {rasa_pro-3.14.0.dev3.dist-info → rasa_pro-3.14.0.dev5.dist-info}/NOTICE +0 -0
  436. {rasa_pro-3.14.0.dev3.dist-info → rasa_pro-3.14.0.dev5.dist-info}/WHEEL +0 -0
  437. {rasa_pro-3.14.0.dev3.dist-info → rasa_pro-3.14.0.dev5.dist-info}/entry_points.txt +0 -0
@@ -5,26 +5,25 @@ import {
5
5
  useColorModeValue,
6
6
  useToast,
7
7
  } from '@chakra-ui/react'
8
- import { useEffect, useState, useCallback } from 'react'
9
8
  import axios from 'axios'
10
- import { useOurTheme } from './theme'
11
- import { Welcome } from './components/Welcome'
12
- import { DialogueStack } from './components/DialogueStack'
9
+ import queryString from 'query-string'
10
+ import { useCallback, useEffect, useState } from 'react'
11
+ import useWebSocket, { ReadyState } from 'react-use-websocket'
12
+ import { Chat } from './components/Chat'
13
+ import { DiagramFlow } from './components/DiagramFlow'
13
14
  import { DialougeInformation } from './components/DialogueInformation'
15
+ import { DialogueStack } from './components/DialogueStack'
14
16
  import { LoadingSpinner } from './components/LoadingSpinner'
15
- import { DiagramFlow } from './components/DiagramFlow'
16
17
  import { RecruitmentPanel } from './components/RecruitmentPanel'
18
+ import { Welcome } from './components/Welcome'
17
19
  import { formatSlots } from './helpers/formatters'
18
- import { Slot, Stack, Event, Flow, SelectedStack, Tracker } from './types'
19
20
  import {
20
21
  createHistoricalStack,
21
22
  flowStepTrail,
22
23
  updatedActiveFrame,
23
24
  } from './helpers/utils'
24
- import queryString from 'query-string'
25
- import { Chat } from './components/Chat'
26
- import { LatencyDisplay } from './components/LatencyDisplay'
27
- import useWebSocket, { ReadyState } from 'react-use-websocket'
25
+ import { useOurTheme } from './theme'
26
+ import { Event, Flow, SelectedStack, Slot, Stack, Tracker } from './types'
28
27
 
29
28
  export function App() {
30
29
  const toast = useToast()
@@ -252,6 +251,7 @@ export function App() {
252
251
  slots={slots}
253
252
  events={events}
254
253
  story={story}
254
+ latency={latency}
255
255
  />
256
256
  </Grid>
257
257
  </GridItem>
@@ -265,7 +265,6 @@ export function App() {
265
265
  </GridItem>
266
266
  <GridItem overflow="hidden">
267
267
  <Grid sx={rightColumnSx}>
268
- <LatencyDisplay latency={latency} sx={boxSx} />
269
268
  {shouldShowTranscript && (
270
269
  <GridItem sx={chatContainerSx}>
271
270
  <Chat events={events || []} />
@@ -13,13 +13,14 @@ import {
13
13
  useTab,
14
14
  useToast,
15
15
  } from '@chakra-ui/react'
16
+ import { useEffect } from 'react'
16
17
  import { Light as SyntaxHighlighter } from 'react-syntax-highlighter'
18
+ import { useCopyToClipboard } from 'usehooks-ts'
19
+ import { formatTestCases } from '../helpers/formatters'
17
20
  import { useOurTheme } from '../theme'
18
21
  import { Event, Slot } from '../types'
19
- import { formatTestCases } from '../helpers/formatters'
20
- import { useCopyToClipboard } from 'usehooks-ts'
21
- import { useEffect } from 'react'
22
22
  import { FullscreenButton } from './FullscreenButton'
23
+ import { LatencyDisplay } from './LatencyDisplay'
23
24
  import { SlotTable, Slots } from './Slots'
24
25
 
25
26
  interface Props extends FlexProps {
@@ -27,6 +28,7 @@ interface Props extends FlexProps {
27
28
  events: Event[]
28
29
  story: string
29
30
  slots: Slot[]
31
+ latency: any
30
32
  }
31
33
 
32
34
  export const DialougeInformation = ({
@@ -35,6 +37,7 @@ export const DialougeInformation = ({
35
37
  events,
36
38
  story,
37
39
  slots,
40
+ latency,
38
41
  ...props
39
42
  }: Props) => {
40
43
  const toast = useToast()
@@ -105,6 +108,7 @@ export const DialougeInformation = ({
105
108
  <CustomTab>Slots</CustomTab>
106
109
  <CustomTab>End-2-end test</CustomTab>
107
110
  <CustomTab>Tracker state</CustomTab>
111
+ <CustomTab>Latency</CustomTab>
108
112
  </TabList>
109
113
  <TabPanels height="100%" overflow="hidden">
110
114
  <TabPanel sx={tabPanelSx}>
@@ -160,6 +164,11 @@ export const DialougeInformation = ({
160
164
  </FullscreenButton>
161
165
  </HStack>
162
166
  </TabPanel>
167
+ <TabPanel sx={tabPanelSx}>
168
+ <Box sx={overflowBox}>
169
+ <LatencyDisplay latency={latency} />
170
+ </Box>
171
+ </TabPanel>
163
172
  </TabPanels>
164
173
  </Tabs>
165
174
  </Flex>
@@ -52,8 +52,6 @@ function StackRow({
52
52
  },
53
53
  }
54
54
 
55
- const agentOrStep = stack.agent_id ?? stack.step_id;
56
-
57
55
  return (
58
56
  <Tr
59
57
  sx={
@@ -63,16 +61,16 @@ function StackRow({
63
61
  >
64
62
  <Td>
65
63
  <Tooltip label={`${stack.flow_id} (${stack.frame_id})`} hasArrow>
66
- <Text noOfLines={1}>{stack.step_id}</Text>
64
+ <Text noOfLines={1}>{stack.flow_id}</Text>
67
65
  </Tooltip>
68
66
  </Td>
69
67
  <Td>
70
- {shouldShowTooltip(agentOrStep) ? (
71
- <Tooltip label={`${agentOrStep} ${stack.agent_id && `(${stack.step_id})`}`} hasArrow>
72
- <Text noOfLines={1}>{agentOrStep}</Text>
68
+ {shouldShowTooltip(stack.step_id) ? (
69
+ <Tooltip label={stack.step_id} hasArrow>
70
+ <Text noOfLines={1}>{stack.step_id}</Text>
73
71
  </Tooltip>
74
72
  ) : (
75
- <Text noOfLines={1}>{agentOrStep}</Text>
73
+ <Text noOfLines={1}>{stack.step_id}</Text>
76
74
  )}
77
75
  </Td>
78
76
  </Tr>
@@ -1,5 +1,5 @@
1
- import {rasaColors} from '../theme/base/colors'
2
- import type {Event, Flow, Slot, Stack} from '../types'
1
+ import { rasaColors } from '../theme/base/colors'
2
+ import type { Event, Flow, Slot, Stack } from '../types'
3
3
 
4
4
  export function formatSlots(slots: { [key: string]: unknown }) {
5
5
  if (!slots) {
@@ -13,7 +13,7 @@ export function formatSlots(slots: { [key: string]: unknown }) {
13
13
  slotDuple[0] !== 'flow_hashes' &&
14
14
  slotDuple[1] != null,
15
15
  )
16
- .map((slotDuple) => ({name: slotDuple[0], value: slotDuple[1]}))
16
+ .map((slotDuple) => ({ name: slotDuple[0], value: slotDuple[1] }))
17
17
  }
18
18
 
19
19
  export const formatTestCases = (events: Event[], sessionId: string) => {
@@ -85,14 +85,11 @@ export const formatFlow = (
85
85
  `flowchart TD
86
86
  classDef collect stroke-width:1px
87
87
  classDef action fill:#FBFCFD,stroke:#A0B8CF
88
- classDef noop fill:#FBFCFD
89
- classDef callstep fill:#FBFCFD
90
88
  classDef link fill:#f43
91
89
  classDef slot fill:#e8f3db,stroke:#c5e1a5
92
90
  classDef endstep fill:#ccc,stroke:#444
93
91
  classDef previous stroke:${rasaColors.rasaOrange[400]},stroke-width:1px
94
92
  classDef active stroke:${rasaColors.rasaOrange[400]},stroke-width:3px,fill:${rasaColors.warning[50]}
95
- classDef pulse animation:pulse 2s infinite
96
93
  `,
97
94
  ]
98
95
  try {
@@ -213,24 +210,6 @@ function renderStepSequence(
213
210
  )}"]:::slot\n`
214
211
  }
215
212
 
216
- if (step.call) {
217
- const isAgentWaitingOnInput = !!currentStack?.agent_id && currentStack?.state === 'waiting_for_input'
218
- mermaidTextFragment += `${mermaidId}["${encodeDoubleQuotes(
219
- stepId,
220
- )} 🤖"]:::callstep\n`
221
-
222
- if (isAgentWaitingOnInput) {
223
- mermaidTextFragment += `class ${mermaidId} pulse\n`
224
- }
225
- }
226
-
227
- if (step.noop) {
228
- mermaidTextFragment += `${mermaidId}["${parseFieldUsingStack(
229
- stepId,
230
- currentStack
231
- )}"]:::noop\n`
232
- }
233
-
234
213
  if (activeStep && stepId === activeStep) {
235
214
  mermaidTextFragment += `class ${mermaidId} active\n`
236
215
  } else if (stepTrail?.includes(stepId)) {
@@ -1,19 +1,4 @@
1
- import {mode, StyleFunctionProps} from '@chakra-ui/theme-tools'
2
- import {keyframes} from "@chakra-ui/react";
3
-
4
-
5
- const pulse = keyframes`
6
- 0% {
7
- opacity: 1;
8
- }
9
- 50% {
10
- opacity: 0.5;
11
- }
12
- 100% {
13
- opacity: 1;
14
- }
15
- `;
16
-
1
+ import { mode, StyleFunctionProps } from '@chakra-ui/theme-tools'
17
2
 
18
3
  export const styles = {
19
4
  global: {
@@ -24,8 +9,5 @@ export const styles = {
24
9
  fontSize: theme.rasaFontSizes.md,
25
10
  letterSpacing: '0.025rem',
26
11
  }),
27
- '.pulse': {
28
- animation: `${pulse} 2s infinite`,
29
- },
30
12
  },
31
13
  }
@@ -40,8 +40,6 @@ export interface Stack {
40
40
  collect?: string
41
41
  utter?: string
42
42
  ended: boolean
43
- agent_id?: string
44
- state?: "waiting_for_input" | "interrupted"
45
43
  }
46
44
 
47
45
  export interface LatencyData {
@@ -97,6 +95,4 @@ interface Step {
97
95
  reset_after_flow_ends: boolean
98
96
  utter: string
99
97
  set_slots?: unknown
100
- call?: string
101
- noop?: boolean
102
98
  }
@@ -1,34 +1,54 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
1
4
  import inspect
2
5
  import json
3
- import logging
4
6
  import uuid
7
+ from asyncio import Task
8
+ from dataclasses import dataclass
5
9
  from typing import Any, Awaitable, Callable, Dict, Iterable, List, Optional, Text
6
10
 
11
+ import structlog
7
12
  from sanic import Blueprint, Sanic, response
8
13
  from sanic.request import Request
9
14
  from sanic.response import HTTPResponse
10
15
  from socketio import AsyncServer
11
16
 
12
- import rasa.core.channels.channel
13
17
  import rasa.shared.utils.io
14
- from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
18
+ from rasa.core.channels.channel import (
19
+ InputChannel,
20
+ OnNewMessageType,
21
+ OutputChannel,
22
+ UserMessage,
23
+ )
24
+ from rasa.core.channels.constants import USER_CONVERSATION_SILENCE_TIMEOUT
25
+ from rasa.shared.core.constants import SILENCE_TIMEOUT_SLOT
26
+
27
+ logger = structlog.getLogger(__name__)
28
+
15
29
 
16
- logger = logging.getLogger(__name__)
30
+ @dataclass
31
+ class SilenceTimeout:
32
+ sender_id: str
33
+ timeout: float
34
+
35
+
36
+ UserSilenceHandlerType = Callable[[SilenceTimeout], Awaitable[Any]]
17
37
 
18
38
 
19
39
  class SocketBlueprint(Blueprint):
20
40
  """Blueprint for socketio connections."""
21
41
 
22
42
  def __init__(
23
- self, sio: AsyncServer, socketio_path: Text, *args: Any, **kwargs: Any
43
+ self, sio_server: AsyncServer, socketio_path: Text, *args: Any, **kwargs: Any
24
44
  ) -> None:
25
- """Creates a :class:`sanic.Blueprint` for routing socketio connenctions.
45
+ """Creates a :class:`sanic.Blueprint` for routing socketio connections.
26
46
 
27
- :param sio: Instance of :class:`socketio.AsyncServer` class
47
+ :param sio_server: Instance of :class:`socketio.AsyncServer` class
28
48
  :param socketio_path: string indicating the route to accept requests on.
29
49
  """
30
50
  super().__init__(*args, **kwargs)
31
- self.ctx.sio = sio
51
+ self.ctx.sio_server = sio_server
32
52
  self.ctx.socketio_path = socketio_path
33
53
 
34
54
  def register(self, app: Sanic, options: Dict[Text, Any]) -> None:
@@ -42,7 +62,7 @@ class SocketBlueprint(Blueprint):
42
62
  path = self.ctx.socketio_path
43
63
  else:
44
64
  path = options.get("url_prefix", "/socket.io")
45
- self.ctx.sio.attach(app, path)
65
+ self.ctx.sio_server.attach(app, path)
46
66
  super().register(app, options)
47
67
 
48
68
 
@@ -51,14 +71,45 @@ class SocketIOOutput(OutputChannel):
51
71
  def name(cls) -> Text:
52
72
  return "socketio"
53
73
 
54
- def __init__(self, sio: AsyncServer, bot_message_evt: Text) -> None:
74
+ def __init__(
75
+ self,
76
+ input_channel: SocketIOInput,
77
+ sio_server: AsyncServer,
78
+ bot_message_evt: Text,
79
+ ) -> None:
55
80
  super().__init__()
56
- self.sio = sio
81
+ self._input_channel = input_channel
82
+ self.sio_server = sio_server
57
83
  self.bot_message_evt = bot_message_evt
58
84
 
59
85
  async def _send_message(self, socket_id: Text, response: Any) -> None:
60
86
  """Sends a message to the recipient using the bot event."""
61
- await self.sio.emit(self.bot_message_evt, response, room=socket_id)
87
+ await self.sio_server.emit(self.bot_message_evt, response, room=socket_id)
88
+ if self.tracker_state and self._input_channel.enable_silence_timeout:
89
+ silence_timeout = self.tracker_state["slots"][SILENCE_TIMEOUT_SLOT]
90
+
91
+ logger.debug(
92
+ "socketio_channel.silence_timeout_updated",
93
+ sender_id=socket_id,
94
+ silence_timeout=silence_timeout,
95
+ )
96
+
97
+ silence_timeout_counts = self.tracker_state["slots"][
98
+ "consecutive_silence_timeouts"
99
+ ]
100
+
101
+ logger.debug(
102
+ "socketio_channel.consecutive_silence_timeouts_updated",
103
+ sender_id=socket_id,
104
+ silence_timeout_counts=silence_timeout_counts,
105
+ )
106
+
107
+ self._input_channel.reset_silence_timeout(
108
+ SilenceTimeout(
109
+ sender_id=socket_id,
110
+ timeout=silence_timeout,
111
+ ),
112
+ )
62
113
 
63
114
  async def send_text_message(
64
115
  self, recipient_id: Text, text: Text, **kwargs: Any
@@ -123,9 +174,11 @@ class SocketIOOutput(OutputChannel):
123
174
  """Sends custom json to the output."""
124
175
  if "data" in json_message:
125
176
  json_message.setdefault("room", recipient_id)
126
- await self.sio.emit(self.bot_message_evt, **json_message)
177
+ await self.sio_server.emit(self.bot_message_evt, **json_message)
127
178
  else:
128
- await self.sio.emit(self.bot_message_evt, json_message, room=recipient_id)
179
+ await self.sio_server.emit(
180
+ self.bot_message_evt, json_message, room=recipient_id
181
+ )
129
182
 
130
183
  async def send_attachment( # type: ignore[override]
131
184
  self, recipient_id: Text, attachment: Dict[Text, Any], **kwargs: Any
@@ -133,26 +186,38 @@ class SocketIOOutput(OutputChannel):
133
186
  """Sends an attachment to the user."""
134
187
  await self._send_message(recipient_id, {"attachment": attachment})
135
188
 
189
+ async def hangup(self, recipient_id: Text, **kwargs: Any) -> None:
190
+ """Hangs up the call for the given sender."""
191
+ # This method is not applicable for socket.io, but we implement it
192
+ # to satisfy the OutputChannel interface.
193
+ logger.debug(
194
+ "socketio_channel.output.hangup",
195
+ message=f"Hanging up call for user {recipient_id}.",
196
+ )
197
+
198
+ self._input_channel.disconnect(recipient_id)
199
+
136
200
 
137
201
  class SocketIOInput(InputChannel):
138
202
  """A socket.io input channel."""
139
203
 
140
204
  @classmethod
141
- def name(cls) -> Text:
205
+ def name(cls) -> str:
142
206
  return "socketio"
143
207
 
144
208
  @classmethod
145
209
  def from_credentials(cls, credentials: Optional[Dict[Text, Any]]) -> InputChannel:
146
210
  credentials = credentials or {}
147
211
  return cls(
148
- credentials.get("user_message_evt", "user_uttered"),
149
- credentials.get("bot_message_evt", "bot_uttered"),
150
- credentials.get("namespace"),
151
- credentials.get("session_persistence", False),
152
- credentials.get("socketio_path", "/socket.io"),
153
- credentials.get("jwt_key"),
154
- credentials.get("jwt_method", "HS256"),
155
- credentials.get("metadata_key", "metadata"),
212
+ user_message_evt=credentials.get("user_message_evt", "user_uttered"),
213
+ bot_message_evt=credentials.get("bot_message_evt", "bot_uttered"),
214
+ namespace=credentials.get("namespace"),
215
+ session_persistence=credentials.get("session_persistence", False),
216
+ socketio_path=credentials.get("socketio_path", "/socket.io"),
217
+ jwt_key=credentials.get("jwt_key"),
218
+ jwt_method=credentials.get("jwt_method", "HS256"),
219
+ metadata_key=credentials.get("metadata_key", "metadata"),
220
+ enable_silence_timeout=credentials.get("enable_silence_timeout", False),
156
221
  )
157
222
 
158
223
  def __init__(
@@ -165,6 +230,7 @@ class SocketIOInput(InputChannel):
165
230
  jwt_key: Optional[Text] = None,
166
231
  jwt_method: Optional[Text] = "HS256",
167
232
  metadata_key: Optional[Text] = "metadata",
233
+ enable_silence_timeout: bool = False,
168
234
  ):
169
235
  """Creates a ``SocketIOInput`` object."""
170
236
  self.bot_message_evt = bot_message_evt
@@ -172,15 +238,18 @@ class SocketIOInput(InputChannel):
172
238
  self.user_message_evt = user_message_evt
173
239
  self.namespace = namespace
174
240
  self.socketio_path = socketio_path
175
- self.sio: Optional[AsyncServer] = None
241
+ self.sio_server: Optional[AsyncServer] = None
176
242
  self.metadata_key = metadata_key
243
+ self.enable_silence_timeout = enable_silence_timeout
177
244
 
178
245
  self.jwt_key = jwt_key
179
246
  self.jwt_algorithm = jwt_method
247
+ self.on_new_message: Optional[OnNewMessageType] = None
248
+ self.sender_silence_map: Dict[str, Task] = {}
180
249
 
181
- def get_output_channel(self) -> Optional["OutputChannel"]:
250
+ def get_output_channel(self) -> Optional[OutputChannel]:
182
251
  """Creates socket.io output channel object."""
183
- if self.sio is None:
252
+ if self.sio_server is None:
184
253
  rasa.shared.utils.io.raise_warning(
185
254
  "SocketIO output channel cannot be recreated. "
186
255
  "This is expected behavior when using multiple Sanic "
@@ -189,7 +258,7 @@ class SocketIOInput(InputChannel):
189
258
  "scenarios."
190
259
  )
191
260
  return None
192
- return SocketIOOutput(self.sio, self.bot_message_evt)
261
+ return SocketIOOutput(self, self.sio_server, self.bot_message_evt)
193
262
 
194
263
  async def handle_session_request(
195
264
  self, sid: Text, data: Optional[Dict] = None
@@ -200,23 +269,26 @@ class SocketIOInput(InputChannel):
200
269
  if "session_id" not in data or data["session_id"] is None:
201
270
  data["session_id"] = uuid.uuid4().hex
202
271
  if self.session_persistence:
203
- if inspect.iscoroutinefunction(self.sio.enter_room): # type: ignore[union-attr]
204
- await self.sio.enter_room(sid, data["session_id"]) # type: ignore[union-attr]
272
+ if inspect.iscoroutinefunction(self.sio_server.enter_room): # type: ignore[union-attr]
273
+ await self.sio_server.enter_room(sid, data["session_id"]) # type: ignore[union-attr]
205
274
  else:
206
275
  # for backwards compatibility with python-socketio < 5.10.
207
276
  # previously, this function was NOT async.
208
- self.sio.enter_room(sid, data["session_id"]) # type: ignore[union-attr]
209
- await self.sio.emit("session_confirm", data["session_id"], room=sid) # type: ignore[union-attr]
210
- logger.debug(f"User {sid} connected to socketIO endpoint.")
277
+ self.sio_server.enter_room(sid, data["session_id"]) # type: ignore[union-attr]
278
+ await self.sio_server.emit("session_confirm", data["session_id"], room=sid) # type: ignore[union-attr]
279
+ logger.debug(
280
+ "socketio_channel.input.handle_session_request",
281
+ message=f"User {sid} connected to socketIO endpoint.",
282
+ )
211
283
 
212
284
  async def handle_user_message(
213
285
  self,
214
286
  sid: Text,
215
287
  data: Dict,
216
- on_new_message: Callable[[UserMessage], Awaitable[Any]],
288
+ on_new_message: OnNewMessageType,
217
289
  ) -> None:
218
290
  """Handles user messages received from the client."""
219
- output_channel = SocketIOOutput(self.sio, self.bot_message_evt)
291
+ output_channel = self.get_output_channel()
220
292
 
221
293
  if self.session_persistence:
222
294
  if not data.get("session_id"):
@@ -232,38 +304,44 @@ class SocketIOInput(InputChannel):
232
304
  else:
233
305
  sender_id = sid
234
306
 
307
+ # We cancel silence timeout when a new message is received
308
+ # to prevent sending a silence timeout message
309
+ # if the user sends a message after the silence timeout
310
+ self._cancel_silence_timeout(sender_id)
311
+
235
312
  metadata = data.get(self.metadata_key, {})
236
313
  if isinstance(metadata, Text):
237
314
  metadata = json.loads(metadata)
238
315
 
239
316
  message = UserMessage(
240
- data.get("message", ""),
241
- output_channel,
242
- sender_id,
317
+ text=data.get("message", ""),
318
+ output_channel=output_channel,
319
+ sender_id=sender_id,
243
320
  input_channel=self.name(),
244
321
  metadata=metadata,
245
322
  )
246
323
  await on_new_message(message)
247
324
 
248
- def blueprint(
249
- self, on_new_message: Callable[[UserMessage], Awaitable[Any]]
250
- ) -> SocketBlueprint:
325
+ def blueprint(self, on_new_message: OnNewMessageType) -> SocketBlueprint:
251
326
  """Defines a Sanic blueprint."""
252
327
  # Workaround so that socketio works with requests from other origins.
253
328
  # https://github.com/miguelgrinberg/python-socketio/issues/205#issuecomment-493769183
254
- sio = AsyncServer(async_mode="sanic", cors_allowed_origins=[])
329
+ sio_server = AsyncServer(async_mode="sanic", cors_allowed_origins=[])
255
330
  socketio_webhook = SocketBlueprint(
256
- sio, self.socketio_path, "socketio_webhook", __name__
331
+ sio_server, self.socketio_path, "socketio_webhook", __name__
257
332
  )
258
333
 
259
- # make sio object static to use in get_output_channel
260
- self.sio = sio
334
+ # make sio_server object static to use in get_output_channel
335
+ self.sio_server = sio_server
336
+ # We need to store the on_new_message callback
337
+ # so that we can call it when a silence timeout occurs
338
+ self.on_new_message = on_new_message
261
339
 
262
340
  @socketio_webhook.route("/", methods=["GET"])
263
341
  async def health(_: Request) -> HTTPResponse:
264
342
  return response.json({"status": "ok"})
265
343
 
266
- @sio.on("connect", namespace=self.namespace)
344
+ @sio_server.on("connect", namespace=self.namespace)
267
345
  async def connect(sid: Text, environ: Dict, auth: Optional[Dict]) -> bool:
268
346
  if self.jwt_key:
269
347
  jwt_payload = None
@@ -273,24 +351,107 @@ class SocketIOInput(InputChannel):
273
351
  )
274
352
 
275
353
  if jwt_payload:
276
- logger.debug(f"User {sid} connected to socketIO endpoint.")
354
+ logger.debug(
355
+ "socketio_channel.input.connect.jwt",
356
+ message=f"User {sid} connected to socketIO endpoint.",
357
+ )
358
+ # Store the chat state for this user
277
359
  return True
278
360
  else:
279
361
  return False
280
362
  else:
281
- logger.debug(f"User {sid} connected to socketIO endpoint.")
363
+ logger.debug(
364
+ "socketio_channel.input.connect",
365
+ message=f"User {sid} connected to socketIO endpoint.",
366
+ )
367
+ # Store the chat state for this user
282
368
  return True
283
369
 
284
- @sio.on("disconnect", namespace=self.namespace)
370
+ @sio_server.on("disconnect", namespace=self.namespace)
285
371
  async def disconnect(sid: Text) -> None:
286
- logger.debug(f"User {sid} disconnected from socketIO endpoint.")
372
+ logger.debug(
373
+ "socketio_channel.input.disconnect",
374
+ message=f"User {sid} disconnected from socketIO endpoint.",
375
+ )
287
376
 
288
- @sio.on("session_request", namespace=self.namespace)
377
+ @sio_server.on("session_request", namespace=self.namespace)
289
378
  async def session_request(sid: Text, data: Optional[Dict]) -> None:
379
+ logger.debug(
380
+ "socketio_channel.input.session_request",
381
+ message=f"User {sid} requested a session.",
382
+ )
290
383
  await self.handle_session_request(sid, data)
291
384
 
292
- @sio.on(self.user_message_evt, namespace=self.namespace)
385
+ @sio_server.on(self.user_message_evt, namespace=self.namespace)
293
386
  async def handle_message(sid: Text, data: Dict) -> None:
387
+ logger.debug(
388
+ "socketio_channel.input.handle_message",
389
+ message=f"User {sid} sent a message.",
390
+ data=data,
391
+ )
294
392
  await self.handle_user_message(sid, data, on_new_message)
295
393
 
296
394
  return socketio_webhook
395
+
396
+ def reset_silence_timeout(self, silence_timeout: SilenceTimeout) -> None:
397
+ self._cancel_silence_timeout(silence_timeout.sender_id)
398
+
399
+ self.sender_silence_map[silence_timeout.sender_id] = (
400
+ asyncio.get_event_loop().create_task(
401
+ self._monitor_silence_timeout(
402
+ silence_timeout,
403
+ )
404
+ )
405
+ )
406
+
407
+ def disconnect(self, sender_id: str) -> None:
408
+ """Disconnects the user with the given sender ID."""
409
+ self._cancel_silence_timeout(sender_id)
410
+ if self.sio_server:
411
+ asyncio.get_event_loop().create_task(self.sio_server.disconnect(sender_id))
412
+ logger.debug(
413
+ "socketio_channel.input.disconnect",
414
+ message=f"User {sender_id} disconnected from socketIO endpoint.",
415
+ )
416
+
417
+ async def _monitor_silence_timeout(self, silence_timeout: SilenceTimeout) -> None:
418
+ logger.debug(
419
+ "socketio_channel.input.silence_timeout_watch_started",
420
+ sender_id=silence_timeout.sender_id,
421
+ timeout=silence_timeout.timeout,
422
+ )
423
+ await asyncio.sleep(silence_timeout.timeout)
424
+
425
+ # once the timer is up, we call the handler
426
+ # to notify the user about the silence timeout
427
+ # this is important if monitoring trask is cancelled while handler is executed
428
+ asyncio.get_event_loop().create_task(
429
+ self._handle_silence_timeout(silence_timeout)
430
+ )
431
+
432
+ logger.debug(
433
+ "socketio_channel.input.silence_timeout_tripped",
434
+ sender_id=silence_timeout.sender_id,
435
+ silence_timeout=silence_timeout.timeout,
436
+ )
437
+
438
+ async def _handle_silence_timeout(self, event: SilenceTimeout) -> None:
439
+ if self.on_new_message:
440
+ output_channel = self.get_output_channel()
441
+ message = UserMessage(
442
+ text=USER_CONVERSATION_SILENCE_TIMEOUT,
443
+ output_channel=output_channel,
444
+ sender_id=event.sender_id,
445
+ input_channel=self.name(),
446
+ )
447
+ await self.on_new_message(message)
448
+
449
+ def _cancel_silence_timeout(self, sender_id: str) -> None:
450
+ """Cancels the silence timeout task for the given sender."""
451
+ task = self.sender_silence_map.pop(sender_id, None)
452
+ if task and not task.done():
453
+ logger.debug(
454
+ "socketio_channel.input.silence_timeout_cancelled",
455
+ sender_id=sender_id,
456
+ )
457
+ task.cancel()