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
@@ -0,0 +1,246 @@
1
+ """Service for handling LLM interactions."""
2
+
3
+ import asyncio
4
+ import importlib
5
+ import json
6
+ from contextlib import asynccontextmanager
7
+ from copy import deepcopy
8
+ from typing import Any, AsyncGenerator, Dict, List, Optional
9
+
10
+ import importlib_resources
11
+ import openai
12
+ import structlog
13
+ from jinja2 import Template
14
+
15
+ from rasa.builder import config
16
+ from rasa.builder.copilot.copilot import Copilot
17
+ from rasa.builder.copilot.copilot_response_handler import CopilotResponseHandler
18
+ from rasa.builder.copilot.copilot_templated_message_provider import (
19
+ load_copilot_internal_message_templates,
20
+ )
21
+ from rasa.builder.exceptions import LLMGenerationError
22
+ from rasa.builder.guardrails.lakera import LakeraAIGuardrails
23
+ from rasa.constants import PACKAGE_NAME
24
+ from rasa.shared.constants import DOMAIN_SCHEMA_FILE, RESPONSES_SCHEMA_FILE
25
+ from rasa.shared.core.flows.yaml_flows_io import FLOWS_SCHEMA_FILE
26
+ from rasa.shared.utils.io import read_json_file
27
+ from rasa.shared.utils.yaml import read_schema_file
28
+
29
+ structlogger = structlog.get_logger()
30
+
31
+
32
+ class LLMService:
33
+ """Handles OpenAI LLM interactions with caching for efficiency."""
34
+
35
+ def __init__(self) -> None:
36
+ self._client: Optional[openai.AsyncOpenAI] = None
37
+ self._domain_schema: Optional[Dict[str, Any]] = None
38
+ self._flows_schema: Optional[Dict[str, Any]] = None
39
+ self._copilot: Optional[Copilot] = None
40
+ self._guardrails: Optional[LakeraAIGuardrails] = None
41
+ self._copilot_response_handler: Optional[CopilotResponseHandler] = None
42
+ self._copilot_internal_message_templates: Optional[Dict[str, str]] = None
43
+
44
+ @property
45
+ def copilot(self) -> Copilot:
46
+ """Get or lazy create copilot instance."""
47
+ if self._copilot is None:
48
+ self._copilot = Copilot()
49
+
50
+ try:
51
+ return self._copilot
52
+ except Exception as e:
53
+ structlogger.error(
54
+ "llm_service.copilot.error",
55
+ event_info="LLM Service: Error getting copilot instance.",
56
+ error=str(e),
57
+ )
58
+ raise
59
+
60
+ @property
61
+ def copilot_response_handler(self) -> CopilotResponseHandler:
62
+ """Get or lazy create copilot response handler instance."""
63
+ if self._copilot_response_handler is None:
64
+ self._copilot_response_handler = CopilotResponseHandler(
65
+ rolling_buffer_size=config.COPILOT_HANDLER_ROLLING_BUFFER_SIZE,
66
+ )
67
+ try:
68
+ return self._copilot_response_handler
69
+ except Exception as e:
70
+ structlogger.error(
71
+ "llm_service.copilot_response_handler.error",
72
+ event_info=(
73
+ "LLM Service: Error getting copilot response handler instance."
74
+ ),
75
+ error=str(e),
76
+ )
77
+ raise
78
+
79
+ @property
80
+ def guardrails(self) -> LakeraAIGuardrails:
81
+ """Get or lazy create guardrails instance."""
82
+ if self._guardrails is None:
83
+ self._guardrails = LakeraAIGuardrails()
84
+ try:
85
+ return self._guardrails
86
+ except Exception as e:
87
+ structlogger.error(
88
+ "llm_service.guardrails.error",
89
+ event_info="LLM Service: Error getting guardrails instance.",
90
+ error=str(e),
91
+ )
92
+ raise
93
+
94
+ @property
95
+ def copilot_internal_message_templates(self) -> Dict[str, str]:
96
+ """Get or lazy load copilot internal message templates."""
97
+ if self._copilot_internal_message_templates is None:
98
+ self._copilot_internal_message_templates = (
99
+ load_copilot_internal_message_templates()
100
+ )
101
+ return self._copilot_internal_message_templates
102
+
103
+ @staticmethod
104
+ def instantiate_copilot() -> Copilot:
105
+ """Instantiate a new Copilot instance."""
106
+ return Copilot()
107
+
108
+ @staticmethod
109
+ def instantiate_handler(rolling_buffer_size: int) -> CopilotResponseHandler:
110
+ """Instantiate a new CopilotResponseHandler instance."""
111
+ return CopilotResponseHandler(
112
+ rolling_buffer_size=rolling_buffer_size,
113
+ )
114
+
115
+ @asynccontextmanager
116
+ async def _get_client(self) -> AsyncGenerator[openai.AsyncOpenAI, None]:
117
+ """Get or create OpenAI client with proper resource management."""
118
+ if self._client is None:
119
+ self._client = openai.AsyncOpenAI(timeout=config.OPENAI_TIMEOUT)
120
+
121
+ try:
122
+ yield self._client
123
+ except Exception as e:
124
+ structlogger.error("llm.client_error", error=str(e))
125
+ raise
126
+
127
+ def _prepare_schemas(self) -> None:
128
+ """Prepare and cache schemas for LLM generation."""
129
+ if self._domain_schema is None:
130
+ self._domain_schema = _prepare_domain_schema()
131
+
132
+ if self._flows_schema is None:
133
+ self._flows_schema = _prepare_flows_schema()
134
+
135
+ async def generate_rasa_project(
136
+ self, messages: List[Dict[str, Any]]
137
+ ) -> Dict[str, Any]:
138
+ """Generate Rasa project data using OpenAI."""
139
+ self._prepare_schemas()
140
+
141
+ try:
142
+ async with self._get_client() as client:
143
+ response_format = {
144
+ "type": "json_schema",
145
+ "json_schema": {
146
+ "name": "rasa_project",
147
+ "schema": {
148
+ "type": "object",
149
+ "properties": {
150
+ "domain": self._domain_schema,
151
+ "flows": self._flows_schema,
152
+ },
153
+ "required": ["domain", "flows"],
154
+ },
155
+ },
156
+ }
157
+ response = await client.chat.completions.create( # type: ignore
158
+ model=config.OPENAI_MODEL,
159
+ messages=messages,
160
+ temperature=config.OPENAI_TEMPERATURE,
161
+ response_format=response_format,
162
+ )
163
+
164
+ content = response.choices[0].message.content
165
+ if not content:
166
+ raise LLMGenerationError("Empty response from LLM")
167
+
168
+ try:
169
+ return json.loads(content)
170
+ except json.JSONDecodeError as e:
171
+ raise LLMGenerationError(f"Invalid JSON from LLM: {e}")
172
+
173
+ except openai.OpenAIError as e:
174
+ raise LLMGenerationError(f"OpenAI API error: {e}")
175
+ except asyncio.TimeoutError:
176
+ raise LLMGenerationError("LLM request timed out")
177
+
178
+
179
+ # Schema preparation functions (stateless)
180
+ def _prepare_domain_schema() -> Dict[str, Any]:
181
+ """Prepare domain schema by removing unnecessary parts."""
182
+ domain_schema = deepcopy(read_schema_file(DOMAIN_SCHEMA_FILE, PACKAGE_NAME, False))
183
+
184
+ if not isinstance(domain_schema, dict):
185
+ raise ValueError("Domain schema is not a dictionary")
186
+
187
+ # Remove parts not needed for CALM bots
188
+ unnecessary_keys = ["intents", "entities", "forms", "config", "session_config"]
189
+
190
+ for key in unnecessary_keys:
191
+ domain_schema["mapping"].pop(key, None)
192
+
193
+ # Remove problematic slot mappings
194
+ slot_mapping = domain_schema["mapping"]["slots"]["mapping"]["regex;([A-Za-z]+)"][
195
+ "mapping"
196
+ ]
197
+ slot_mapping.pop("mappings", None)
198
+ slot_mapping.pop("validation", None)
199
+
200
+ # Add responses schema
201
+ responses_schema = read_schema_file(RESPONSES_SCHEMA_FILE, PACKAGE_NAME, False)
202
+ if isinstance(responses_schema, dict):
203
+ domain_schema["mapping"]["responses"] = responses_schema["schema;responses"]
204
+ else:
205
+ raise ValueError("Expected responses schema to be a dictionary.")
206
+
207
+ return domain_schema
208
+
209
+
210
+ def _prepare_flows_schema() -> Dict[str, Any]:
211
+ """Prepare flows schema by removing nlu_trigger."""
212
+ schema_file = str(
213
+ importlib_resources.files(PACKAGE_NAME).joinpath(FLOWS_SCHEMA_FILE)
214
+ )
215
+ flows_schema = deepcopy(read_json_file(schema_file))
216
+ flows_schema["$defs"]["flow"]["properties"].pop("nlu_trigger", None)
217
+ return flows_schema
218
+
219
+
220
+ # Template functions (stateless with caching)
221
+ _skill_template: Optional[Template] = None
222
+ _helper_template: Optional[Template] = None
223
+
224
+
225
+ def get_skill_generation_messages(
226
+ skill_description: str, project_data: Dict[str, str]
227
+ ) -> List[Dict[str, Any]]:
228
+ """Get messages for skill generation."""
229
+ global _skill_template
230
+
231
+ if _skill_template is None:
232
+ template_content = importlib.resources.read_text(
233
+ "rasa.builder",
234
+ "skill_to_bot_prompt.jinja2",
235
+ )
236
+ _skill_template = Template(template_content)
237
+
238
+ system_prompt = _skill_template.render(
239
+ skill_description=skill_description,
240
+ project_data=project_data,
241
+ )
242
+ return [{"role": "system", "content": system_prompt}]
243
+
244
+
245
+ # Global service instance
246
+ llm_service = LLMService()
@@ -0,0 +1,209 @@
1
+ """Logging and Sentry utilities for the builder service."""
2
+
3
+ import collections
4
+ import logging
5
+ import threading
6
+ import time
7
+ import uuid
8
+ from typing import Any, Deque, Dict, Mapping, MutableMapping, Optional
9
+
10
+ import sentry_sdk
11
+ import structlog
12
+ from sanic import Request
13
+
14
+ from rasa.builder import config
15
+ from rasa.builder.auth import HEADER_USER_ID
16
+
17
+ structlogger = structlog.get_logger()
18
+
19
+ # Thread-safe deque for collecting recent logs
20
+ _recent_logs: Deque[str] = collections.deque(maxlen=config.MAX_LOG_ENTRIES)
21
+ _logs_lock = threading.RLock()
22
+
23
+
24
+ def collecting_logs_processor(
25
+ logger: Any, log_level: str, event_dict: MutableMapping[str, Any]
26
+ ) -> MutableMapping[str, Any]:
27
+ """Structlog processor that collects recent log entries.
28
+
29
+ This processor is thread-safe and maintains a rolling buffer of recent logs.
30
+ """
31
+ if log_level != logging.getLevelName(logging.DEBUG).lower():
32
+ event_message = event_dict.get("event_info") or event_dict.get("event", "")
33
+ log_entry = f"[{log_level}] {event_message}"
34
+
35
+ with _logs_lock:
36
+ _recent_logs.append(log_entry)
37
+
38
+ return event_dict
39
+
40
+
41
+ def attach_request_id_processor(
42
+ logger: Any, log_level: str, event_dict: MutableMapping[str, Any]
43
+ ) -> MutableMapping[str, Any]:
44
+ """Structlog processor that attaches the request id to the event dict.
45
+
46
+ This processor is thread-safe and maintains a rolling buffer of recent logs.
47
+ """
48
+ try:
49
+ request = Request.get_current()
50
+ event_dict["correlation_id"] = request.ctx.correlation_id
51
+ return event_dict
52
+ except Exception:
53
+ # there is no request context, so we don't attach the request id
54
+ return event_dict
55
+
56
+
57
+ def get_recent_logs() -> str:
58
+ """Get recent log entries as a formatted string.
59
+
60
+ Returns:
61
+ Formatted string of recent log entries, one per line.
62
+ """
63
+ with _logs_lock:
64
+ return "\n".join(list(_recent_logs))
65
+
66
+
67
+ def clear_recent_logs() -> None:
68
+ """Clear the recent logs buffer."""
69
+ with _logs_lock:
70
+ _recent_logs.clear()
71
+
72
+
73
+ def get_log_count() -> int:
74
+ """Get the current number of log entries."""
75
+ with _logs_lock:
76
+ return len(_recent_logs)
77
+
78
+
79
+ def _sanitize_headers(headers: Mapping[str, str]) -> Dict[str, Any]:
80
+ """Remove or redact sensitive headers for safe logging and Sentry context."""
81
+ lowered = {k.lower(): v for k, v in headers.items()}
82
+ result: Dict[str, Any] = {}
83
+ # Safe keepers
84
+ if "user-agent" in lowered:
85
+ result["user-agent"] = lowered["user-agent"]
86
+ if HEADER_USER_ID in lowered:
87
+ result[HEADER_USER_ID] = lowered[HEADER_USER_ID]
88
+ # Redact auth info
89
+ if "authorization" in lowered:
90
+ auth_val = lowered["authorization"]
91
+ # Keep only the scheme if present
92
+ scheme = auth_val.split(" ")[0] if auth_val else ""
93
+ result["authorization"] = f"{scheme} <redacted>" if scheme else "present"
94
+ return result
95
+
96
+
97
+ def ensure_correlation_id_on_request(request: Any) -> str:
98
+ """Ensure a correlation id exists on the request and return it."""
99
+ if not hasattr(request.ctx, "correlation_id") or not request.ctx.correlation_id:
100
+ request.ctx.correlation_id = uuid.uuid4().hex
101
+ return request.ctx.correlation_id
102
+
103
+
104
+ def extract_request_context() -> Dict[str, Any]:
105
+ """Extract safe request context for logging / Sentry."""
106
+ try:
107
+ request = Request.get_current()
108
+ headers = getattr(request, "headers", {}) or {}
109
+ args = getattr(request, "args", {}) or {}
110
+ json_body = getattr(request, "json", None)
111
+ content_length = getattr(request, "content_length", None)
112
+ ctx: Dict[str, Any] = {
113
+ "method": getattr(request, "method", None),
114
+ "path": getattr(request, "path", None),
115
+ "query_args": dict(args) if hasattr(args, "items") else args,
116
+ "remote_addr": getattr(request, "remote_addr", None),
117
+ "content_length": content_length,
118
+ "has_json": json_body is not None,
119
+ "headers": _sanitize_headers(dict(headers)),
120
+ }
121
+ if hasattr(request, "ctx"):
122
+ ctx["correlation_id"] = ensure_correlation_id_on_request(request)
123
+ # Common custom fields if present
124
+ ctx["user_id"] = request.headers.get(HEADER_USER_ID)
125
+ return ctx
126
+ except Exception:
127
+ return {}
128
+
129
+
130
+ def capture_exception_with_context(
131
+ exc: BaseException,
132
+ event_id: str,
133
+ extra: Optional[Dict[str, Any]] = None,
134
+ tags: Optional[Dict[str, str]] = None,
135
+ ) -> None:
136
+ """Capture exception in Sentry and log it with rich context.
137
+
138
+ Args:
139
+ request: Sanic request
140
+ exc: exception instance
141
+ event_id: structlog event id
142
+ extra: additional context to include
143
+ tags: sentry tags to attach
144
+ """
145
+ request_ctx = extract_request_context()
146
+ if extra is None:
147
+ extra = {}
148
+ # Sentry scope
149
+ try:
150
+ with sentry_sdk.configure_scope() as scope:
151
+ scope.set_tag("service", "bot-builder")
152
+ if tags:
153
+ for k, v in tags.items():
154
+ scope.set_tag(k, v)
155
+ # Flatten some useful fields as tags
156
+ if request_ctx.get("path"):
157
+ scope.set_tag("route", request_ctx["path"])
158
+ if request_ctx.get("method"):
159
+ scope.set_tag("method", request_ctx["method"])
160
+ if request_ctx.get("correlation_id"):
161
+ scope.set_tag("correlation_id", request_ctx["correlation_id"])
162
+ user_id = request_ctx.get("user_id")
163
+ if user_id and hasattr(scope, "set_user"):
164
+ scope.set_user({"id": str(user_id)})
165
+ # Context blocks
166
+ scope.set_context("request", request_ctx)
167
+ if extra:
168
+ scope.set_context("extra", extra)
169
+ sentry_sdk.capture_exception(exc)
170
+ except Exception:
171
+ # Never fail the app because Sentry failed
172
+ pass
173
+
174
+ # Structlog error with merged context (avoid dumping huge payloads)
175
+ structlogger.error(
176
+ event_id,
177
+ error=str(exc),
178
+ **{k: v for k, v in {**request_ctx, **extra}.items() if k not in {"headers"}},
179
+ )
180
+
181
+
182
+ def log_request_start(request: Any) -> float:
183
+ """Log request start and return start time."""
184
+ start = time.perf_counter()
185
+ cid = ensure_correlation_id_on_request(request)
186
+ ctx = extract_request_context()
187
+ structlogger.info(
188
+ "request.received",
189
+ method=ctx.get("method"),
190
+ path=ctx.get("path"),
191
+ remote_addr=ctx.get("remote_addr") or "unknown",
192
+ correlation_id=cid,
193
+ user_id=ctx.get("user_id"),
194
+ )
195
+ return start
196
+
197
+
198
+ def log_request_end(request: Any, response: Any, start: float) -> None:
199
+ """Log request completion with latency and correlation id."""
200
+ latency_ms = int((time.perf_counter() - start) * 1000)
201
+ cid = ensure_correlation_id_on_request(request)
202
+ structlogger.info(
203
+ "request.completed",
204
+ method=getattr(request, "method", None),
205
+ path=getattr(request, "path", None),
206
+ status=getattr(response, "status", None),
207
+ latency_ms=latency_ms,
208
+ correlation_id=cid,
209
+ )
rasa/builder/main.py ADDED
@@ -0,0 +1,174 @@
1
+ #!/usr/bin/env python3
2
+ """Main entry point for the prompt-to-bot service."""
3
+
4
+ import logging
5
+ import os
6
+ import sys
7
+ from typing import Optional
8
+
9
+ import structlog
10
+ from sanic import HTTPResponse, Sanic
11
+ from sanic.request import Request
12
+ from sanic_openapi import openapi3_blueprint
13
+
14
+ import rasa.core.utils
15
+ import rasa.telemetry
16
+ from rasa.builder import config
17
+ from rasa.builder.logging_utils import (
18
+ attach_request_id_processor,
19
+ collecting_logs_processor,
20
+ log_request_end,
21
+ log_request_start,
22
+ )
23
+ from rasa.builder.service import bp, setup_project_generator
24
+ from rasa.core.channels.studio_chat import StudioChatInput
25
+ from rasa.server import configure_cors
26
+ from rasa.utils.common import configure_logging_and_warnings
27
+ from rasa.utils.log_utils import configure_structlog
28
+ from rasa.utils.sanic_error_handler import register_custom_sanic_error_handler
29
+
30
+ structlogger = structlog.get_logger()
31
+
32
+
33
+ def setup_logging() -> None:
34
+ """Setup logging configuration."""
35
+ log_level = logging.DEBUG
36
+
37
+ configure_logging_and_warnings(
38
+ log_level=log_level,
39
+ logging_config_file=None,
40
+ warn_only_once=True,
41
+ filter_repeated_logs=True,
42
+ )
43
+
44
+ configure_structlog(
45
+ log_level,
46
+ include_time=True,
47
+ additional_processors=[attach_request_id_processor, collecting_logs_processor],
48
+ )
49
+
50
+
51
+ def setup_input_channel() -> StudioChatInput:
52
+ """Setup the input channel for chat interactions."""
53
+ studio_chat_credentials = config.get_default_credentials().get(
54
+ StudioChatInput.name()
55
+ )
56
+ return StudioChatInput.from_credentials(credentials=studio_chat_credentials)
57
+
58
+
59
+ def setup_middleware(app: Sanic) -> None:
60
+ """Setup middleware for request/response processing."""
61
+
62
+ @app.middleware("request") # type: ignore[misc,no-untyped-call]
63
+ async def log_request(request: Request) -> None:
64
+ # store start time on request ctx for later latency calculation
65
+ request.ctx._start_time = log_request_start(request)
66
+
67
+ @app.middleware("response") # type: ignore[misc,no-untyped-call]
68
+ async def log_response(request: Request, response: HTTPResponse) -> None:
69
+ try:
70
+ start = getattr(request.ctx, "_start_time", None)
71
+ if start is None:
72
+ # If for some reason the request middleware didn't run
73
+ start = log_request_start(request)
74
+ # propagate correlation id for clients
75
+ correlation_id = getattr(request.ctx, "correlation_id", None)
76
+ if correlation_id:
77
+ response.headers["X-Correlation-Id"] = correlation_id
78
+ log_request_end(request, response, start)
79
+ except Exception:
80
+ # avoid breaking response path
81
+ pass
82
+
83
+
84
+ def create_app(project_folder: Optional[str] = None) -> Sanic:
85
+ """Create and configure the Sanic app."""
86
+ app = Sanic("BotBuilderService")
87
+
88
+ # Basic app configuration
89
+ app.config.REQUEST_TIMEOUT = 60 # 1 minute timeout
90
+ # Expose auth toggle to app.config so decorators can read it
91
+ app.config.USE_AUTHENTICATION = True
92
+
93
+ structlogger.debug(
94
+ "builder.main.create_app",
95
+ project_folder=project_folder,
96
+ use_authentication=app.config.USE_AUTHENTICATION,
97
+ )
98
+ app.ctx.agent = None
99
+
100
+ # Set up project generator and store in app context
101
+ app.ctx.project_generator = setup_project_generator(project_folder)
102
+
103
+ # Set up input channel and store in app context
104
+ app.ctx.input_channel = setup_input_channel()
105
+
106
+ # Register the blueprint
107
+ app.blueprint(bp)
108
+
109
+ # OpenAPI docs
110
+ app.blueprint(openapi3_blueprint)
111
+ app.config.API_TITLE = "Bot Builder API"
112
+ app.config.API_VERSION = rasa.__version__
113
+ app.config.API_DESCRIPTION = (
114
+ "API for building conversational AI bots from prompts and templates. "
115
+ "The API allows to change the assistant and retrain it with new data."
116
+ )
117
+
118
+ # Setup middleware
119
+ setup_middleware(app)
120
+
121
+ configure_cors(app, cors_origins=config.CORS_ORIGINS)
122
+
123
+ # Register input channel webhooks
124
+ from rasa.core import channels
125
+
126
+ channels.channel.register([app.ctx.input_channel], app, route="/webhooks/")
127
+
128
+ return app
129
+
130
+
131
+ def main(project_folder: Optional[str] = None) -> None:
132
+ """Main entry point."""
133
+ try:
134
+ # Setup logging
135
+ setup_logging()
136
+
137
+ # Setup telemetry
138
+ rasa.telemetry.initialize_telemetry()
139
+ rasa.telemetry.initialize_error_reporting(private_mode=False)
140
+
141
+ # working directory needs to be the project folder, e.g.
142
+ # for relative paths (./docs) in a projects config to work
143
+ if project_folder:
144
+ os.chdir(project_folder)
145
+
146
+ # Create and configure app
147
+ app = create_app(project_folder)
148
+ register_custom_sanic_error_handler(app)
149
+
150
+ # Run the service
151
+ structlogger.info(
152
+ "service.starting",
153
+ host=config.BUILDER_SERVER_HOST,
154
+ port=config.BUILDER_SERVER_PORT,
155
+ )
156
+
157
+ app.run(
158
+ host=config.BUILDER_SERVER_HOST,
159
+ port=config.BUILDER_SERVER_PORT,
160
+ legacy=True,
161
+ motd=False,
162
+ )
163
+
164
+ except KeyboardInterrupt:
165
+ print("\nService stopped by user")
166
+ sys.exit(0)
167
+ except Exception as e:
168
+ print(f"Failed to start service: {e}")
169
+ sys.exit(1)
170
+
171
+
172
+ if __name__ == "__main__":
173
+ project_folder = sys.argv[1] if len(sys.argv) > 1 else None
174
+ main(project_folder)