rasa-pro 3.12.18.dev1__py3-none-any.whl → 3.13.0a1.dev1__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 (341) hide show
  1. rasa/__init__.py +0 -6
  2. rasa/__main__.py +3 -4
  3. rasa/api.py +1 -1
  4. rasa/builder/create_openai_vector_store.py +69 -0
  5. rasa/builder/llm-helper-schema.json +69 -0
  6. rasa/builder/prompt_to_bot.py +645 -0
  7. rasa/builder/scrape_rasa_docs.py +97 -0
  8. rasa/builder/skill_to_bot_prompt.jinja +158 -0
  9. rasa/cli/dialogue_understanding_test.py +1 -1
  10. rasa/cli/e2e_test.py +1 -1
  11. rasa/cli/evaluate.py +2 -2
  12. rasa/cli/export.py +3 -3
  13. rasa/cli/llm_fine_tuning.py +1 -1
  14. rasa/cli/project_templates/default/config.yml +5 -32
  15. rasa/cli/project_templates/{calm → default}/e2e_tests/cancelations/user_cancels_during_a_correction.yml +1 -1
  16. rasa/cli/project_templates/{calm → default}/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +1 -1
  17. rasa/cli/project_templates/{calm → default}/e2e_tests/corrections/user_corrects_contact_handle.yml +1 -1
  18. rasa/cli/project_templates/{calm → default}/e2e_tests/corrections/user_corrects_contact_name.yml +1 -1
  19. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +1 -1
  20. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_lists_contacts.yml +1 -1
  21. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_removes_contact.yml +1 -1
  22. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_removes_contact_from_list.yml +1 -1
  23. rasa/cli/project_templates/default/endpoints.yml +18 -2
  24. rasa/cli/project_templates/defaults.py +133 -0
  25. rasa/cli/run.py +1 -1
  26. rasa/cli/scaffold.py +2 -3
  27. rasa/cli/studio/download.py +1 -1
  28. rasa/cli/studio/link.py +53 -0
  29. rasa/cli/studio/pull.py +78 -0
  30. rasa/cli/studio/push.py +78 -0
  31. rasa/cli/studio/studio.py +12 -0
  32. rasa/cli/studio/upload.py +5 -3
  33. rasa/cli/train.py +1 -1
  34. rasa/cli/utils.py +1 -1
  35. rasa/cli/x.py +1 -1
  36. rasa/constants.py +2 -0
  37. rasa/core/__init__.py +0 -16
  38. rasa/core/actions/action.py +42 -31
  39. rasa/core/actions/action_repeat_bot_messages.py +18 -22
  40. rasa/core/actions/action_run_slot_rejections.py +1 -2
  41. rasa/core/agent.py +18 -3
  42. rasa/core/available_endpoints.py +146 -0
  43. rasa/core/brokers/kafka.py +4 -0
  44. rasa/core/brokers/pika.py +5 -2
  45. rasa/core/brokers/sql.py +1 -1
  46. rasa/core/channels/botframework.py +2 -2
  47. rasa/core/channels/channel.py +2 -2
  48. rasa/core/channels/development_inspector.py +1 -1
  49. rasa/core/channels/facebook.py +1 -4
  50. rasa/core/channels/hangouts.py +8 -5
  51. rasa/core/channels/inspector/.eslintrc.cjs +12 -6
  52. rasa/core/channels/inspector/.prettierrc +5 -0
  53. rasa/core/channels/inspector/README.md +11 -5
  54. rasa/core/channels/inspector/dist/assets/{arc-9f75cc3b.js → arc-02053cc1.js} +1 -1
  55. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-7f34db23.js → blockDiagram-38ab4fdb-008b6289.js} +1 -1
  56. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-948bab2c.js → c4Diagram-3d4e48cf-fb2597be.js} +1 -1
  57. rasa/core/channels/inspector/dist/assets/channel-078dada8.js +1 -0
  58. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-53b0dd0e.js → classDiagram-70f12bd4-7f847e00.js} +1 -1
  59. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-fdf789e7.js → classDiagram-v2-f2320105-ba1d689b.js} +1 -1
  60. rasa/core/channels/inspector/dist/assets/clone-5b4516de.js +1 -0
  61. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-87c4ece5.js → createText-2e5e7dd3-dd8e67c4.js} +1 -1
  62. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-5a8b0749.js → edges-e0da2a9e-10784939.js} +1 -1
  63. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-66da90e2.js → erDiagram-9861fffd-24947ae6.js} +1 -1
  64. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-10044f05.js → flowDb-956e92f1-a9ced505.js} +1 -1
  65. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-f338f66a.js → flowDiagram-66a62f08-afda9c7c.js} +1 -1
  66. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-f9613071.js +1 -0
  67. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-b13140aa.js → flowchart-elk-definition-4a651766-6ef530b8.js} +1 -1
  68. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-f2b4a55a.js → ganttDiagram-c361ad54-0c7dd39a.js} +1 -1
  69. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-dedc298d.js → gitGraphDiagram-72cf32ee-b57239d6.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{graph-4ede11ff.js → graph-9ed57cec.js} +1 -1
  71. rasa/core/channels/inspector/dist/assets/{index-3862675e-65549d37.js → index-3862675e-233090de.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/{index-3a23e736.js → index-72184470.js} +123 -123
  73. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-65439671.js → infoDiagram-f8f76790-aa116649.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-56d03d98.js → journeyDiagram-49397b02-e51877cc.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/{layout-dd48f7f4.js → layout-3ca3798c.js} +1 -1
  76. rasa/core/channels/inspector/dist/assets/{line-1569ad2c.js → line-26ee10d3.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{linear-48bf4935.js → linear-aedded32.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-688504c1.js → mindmap-definition-fc14e90a-d8957261.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-78b6d7e6.js → pieDiagram-8a3498a8-d771f885.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-048b84b3.js → quadrantDiagram-120e2f19-09fdf50c.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-dd67f107.js → requirementDiagram-deff3bca-9f0af02e.js} +1 -1
  82. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-8128436e.js → sankeyDiagram-04a897e0-84415b37.js} +1 -1
  83. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-1a0d1461.js → sequenceDiagram-704730f1-8dec4055.js} +1 -1
  84. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-46d388ed.js → stateDiagram-587899a1-c5431d07.js} +1 -1
  85. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-ea42951a.js → stateDiagram-v2-d93cdb3a-274e77d9.js} +1 -1
  86. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-7427ed0c.js → styles-6aaf32cf-e364a1d7.js} +1 -1
  87. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-ff5e5a16.js → styles-9a916d00-0dae36f6.js} +1 -1
  88. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-7b3680cf.js → styles-c10674c1-c4641675.js} +1 -1
  89. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-f860f2ad.js → svgDrawCommon-08f97a94-831fe9a1.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-2eebf0c8.js → timeline-definition-85554ec2-c3304b3a.js} +1 -1
  91. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-5d7f4e96.js → xychartDiagram-e933f94c-da799369.js} +1 -1
  92. rasa/core/channels/inspector/dist/index.html +1 -1
  93. rasa/core/channels/inspector/package.json +3 -1
  94. rasa/core/channels/inspector/src/App.tsx +91 -90
  95. rasa/core/channels/inspector/src/components/Chat.tsx +45 -41
  96. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +40 -40
  97. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +57 -57
  98. rasa/core/channels/inspector/src/components/DialogueStack.tsx +36 -27
  99. rasa/core/channels/inspector/src/components/ExpandIcon.tsx +4 -4
  100. rasa/core/channels/inspector/src/components/FullscreenButton.tsx +7 -7
  101. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +28 -12
  102. rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +9 -9
  103. rasa/core/channels/inspector/src/components/RasaLogo.tsx +5 -5
  104. rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +55 -60
  105. rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +5 -5
  106. rasa/core/channels/inspector/src/components/Slots.tsx +22 -22
  107. rasa/core/channels/inspector/src/components/Welcome.tsx +28 -31
  108. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +245 -0
  109. rasa/core/channels/inspector/src/helpers/audio/microphone-processor.js +12 -0
  110. rasa/core/channels/inspector/src/helpers/audio/playback-processor.js +36 -0
  111. rasa/core/channels/inspector/src/helpers/conversation.ts +7 -7
  112. rasa/core/channels/inspector/src/helpers/formatters.test.ts +181 -181
  113. rasa/core/channels/inspector/src/helpers/formatters.ts +111 -111
  114. rasa/core/channels/inspector/src/helpers/utils.ts +78 -61
  115. rasa/core/channels/inspector/src/main.tsx +8 -8
  116. rasa/core/channels/inspector/src/theme/Button/Button.ts +8 -8
  117. rasa/core/channels/inspector/src/theme/Heading/Heading.ts +7 -7
  118. rasa/core/channels/inspector/src/theme/Input/Input.ts +9 -9
  119. rasa/core/channels/inspector/src/theme/Link/Link.ts +6 -6
  120. rasa/core/channels/inspector/src/theme/Modal/Modal.ts +13 -13
  121. rasa/core/channels/inspector/src/theme/Table/Table.tsx +10 -10
  122. rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +5 -5
  123. rasa/core/channels/inspector/src/theme/base/breakpoints.ts +7 -7
  124. rasa/core/channels/inspector/src/theme/base/colors.ts +64 -64
  125. rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +21 -18
  126. rasa/core/channels/inspector/src/theme/base/radii.ts +8 -8
  127. rasa/core/channels/inspector/src/theme/base/shadows.ts +5 -5
  128. rasa/core/channels/inspector/src/theme/base/sizes.ts +5 -5
  129. rasa/core/channels/inspector/src/theme/base/space.ts +12 -12
  130. rasa/core/channels/inspector/src/theme/base/styles.ts +5 -5
  131. rasa/core/channels/inspector/src/theme/base/typography.ts +12 -12
  132. rasa/core/channels/inspector/src/theme/base/zIndices.ts +3 -3
  133. rasa/core/channels/inspector/src/theme/index.ts +38 -38
  134. rasa/core/channels/inspector/src/types.ts +56 -50
  135. rasa/core/channels/inspector/yarn.lock +5 -0
  136. rasa/core/channels/mattermost.py +1 -1
  137. rasa/core/channels/rasa_chat.py +2 -4
  138. rasa/core/channels/rest.py +5 -4
  139. rasa/core/channels/socketio.py +56 -41
  140. rasa/core/channels/studio_chat.py +337 -71
  141. rasa/core/channels/vier_cvg.py +1 -2
  142. rasa/core/channels/voice_ready/audiocodes.py +4 -11
  143. rasa/core/channels/voice_stream/audiocodes.py +8 -5
  144. rasa/core/channels/voice_stream/browser_audio.py +1 -1
  145. rasa/core/channels/voice_stream/genesys.py +2 -2
  146. rasa/core/channels/voice_stream/tts/__init__.py +8 -0
  147. rasa/core/channels/voice_stream/twilio_media_streams.py +10 -5
  148. rasa/core/channels/voice_stream/voice_channel.py +65 -23
  149. rasa/core/concurrent_lock_store.py +24 -10
  150. rasa/core/evaluation/marker_tracker_loader.py +1 -1
  151. rasa/core/exporter.py +1 -1
  152. rasa/core/http_interpreter.py +3 -7
  153. rasa/core/information_retrieval/faiss.py +18 -11
  154. rasa/core/information_retrieval/ingestion/__init__.py +0 -0
  155. rasa/core/information_retrieval/ingestion/faq_parser.py +158 -0
  156. rasa/core/jobs.py +2 -1
  157. rasa/core/lock_store.py +151 -60
  158. rasa/core/nlg/contextual_response_rephraser.py +17 -7
  159. rasa/core/nlg/generator.py +5 -22
  160. rasa/core/nlg/interpolator.py +2 -3
  161. rasa/core/nlg/response.py +6 -43
  162. rasa/core/nlg/summarize.py +1 -1
  163. rasa/core/nlg/translate.py +0 -8
  164. rasa/core/policies/enterprise_search_policy.py +262 -62
  165. rasa/core/policies/enterprise_search_prompt_with_relevancy_check_and_citation_template.jinja2 +63 -0
  166. rasa/core/policies/flow_policy.py +1 -1
  167. rasa/core/policies/flows/flow_executor.py +96 -17
  168. rasa/core/policies/intentless_policy.py +57 -20
  169. rasa/core/processor.py +114 -54
  170. rasa/core/run.py +33 -11
  171. rasa/core/tracker_stores/__init__.py +0 -0
  172. rasa/core/{auth_retry_tracker_store.py → tracker_stores/auth_retry_tracker_store.py} +5 -1
  173. rasa/core/tracker_stores/dynamo_tracker_store.py +218 -0
  174. rasa/core/tracker_stores/mongo_tracker_store.py +206 -0
  175. rasa/core/tracker_stores/redis_tracker_store.py +219 -0
  176. rasa/core/tracker_stores/sql_tracker_store.py +555 -0
  177. rasa/core/tracker_stores/tracker_store.py +805 -0
  178. rasa/core/training/interactive.py +1 -1
  179. rasa/core/utils.py +24 -95
  180. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -1
  181. rasa/dialogue_understanding/coexistence/llm_based_router.py +10 -6
  182. rasa/dialogue_understanding/commands/can_not_handle_command.py +2 -0
  183. rasa/dialogue_understanding/commands/cancel_flow_command.py +5 -1
  184. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +2 -0
  185. rasa/dialogue_understanding/commands/clarify_command.py +4 -0
  186. rasa/dialogue_understanding/commands/command_syntax_manager.py +1 -0
  187. rasa/dialogue_understanding/commands/correct_slots_command.py +1 -3
  188. rasa/dialogue_understanding/commands/human_handoff_command.py +2 -0
  189. rasa/dialogue_understanding/commands/knowledge_answer_command.py +2 -0
  190. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +2 -0
  191. rasa/dialogue_understanding/commands/set_slot_command.py +10 -0
  192. rasa/dialogue_understanding/commands/skip_question_command.py +2 -0
  193. rasa/dialogue_understanding/commands/start_flow_command.py +4 -0
  194. rasa/dialogue_understanding/commands/utils.py +26 -2
  195. rasa/dialogue_understanding/generator/__init__.py +7 -1
  196. rasa/dialogue_understanding/generator/command_generator.py +4 -2
  197. rasa/dialogue_understanding/generator/command_parser.py +2 -2
  198. rasa/dialogue_understanding/generator/command_parser_validator.py +63 -0
  199. rasa/dialogue_understanding/generator/llm_based_command_generator.py +5 -17
  200. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -3
  201. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +4 -44
  202. rasa/dialogue_understanding/generator/nlu_command_adapter.py +2 -2
  203. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +78 -0
  204. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +26 -474
  205. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +147 -0
  206. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +477 -0
  207. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +11 -64
  208. rasa/dialogue_understanding/patterns/cancel.py +1 -2
  209. rasa/dialogue_understanding/patterns/clarify.py +1 -1
  210. rasa/dialogue_understanding/patterns/correction.py +2 -2
  211. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +37 -25
  212. rasa/dialogue_understanding/patterns/domain_for_patterns.py +190 -0
  213. rasa/dialogue_understanding/processor/command_processor.py +6 -7
  214. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +17 -4
  215. rasa/dialogue_understanding/stack/utils.py +3 -1
  216. rasa/dialogue_understanding/utils.py +68 -12
  217. rasa/dialogue_understanding_test/command_metric_calculation.py +7 -40
  218. rasa/dialogue_understanding_test/command_metrics.py +38 -0
  219. rasa/dialogue_understanding_test/du_test_case.py +58 -25
  220. rasa/dialogue_understanding_test/du_test_result.py +228 -132
  221. rasa/dialogue_understanding_test/du_test_runner.py +11 -2
  222. rasa/dialogue_understanding_test/io.py +35 -8
  223. rasa/e2e_test/e2e_test_runner.py +1 -1
  224. rasa/engine/constants.py +1 -1
  225. rasa/engine/graph.py +2 -2
  226. rasa/engine/recipes/default_recipe.py +1 -1
  227. rasa/engine/validation.py +3 -2
  228. rasa/hooks.py +2 -85
  229. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +1 -5
  230. rasa/llm_fine_tuning/utils.py +2 -4
  231. rasa/model_manager/model_api.py +90 -2
  232. rasa/model_manager/socket_bridge.py +0 -7
  233. rasa/model_manager/trainer_service.py +15 -12
  234. rasa/plugin.py +2 -15
  235. rasa/privacy/__init__.py +0 -0
  236. rasa/privacy/constants.py +83 -0
  237. rasa/privacy/event_broker_utils.py +77 -0
  238. rasa/privacy/privacy_config.py +281 -0
  239. rasa/privacy/privacy_config_schema.json +86 -0
  240. rasa/privacy/privacy_filter.py +340 -0
  241. rasa/privacy/privacy_manager.py +576 -0
  242. rasa/server.py +23 -2
  243. rasa/shared/constants.py +13 -4
  244. rasa/shared/core/command_payload_reader.py +1 -5
  245. rasa/shared/core/constants.py +4 -3
  246. rasa/shared/core/domain.py +172 -11
  247. rasa/shared/core/events.py +100 -6
  248. rasa/shared/core/flows/flow.py +35 -8
  249. rasa/shared/core/flows/flow_step.py +26 -4
  250. rasa/shared/core/flows/flow_step_links.py +15 -0
  251. rasa/shared/core/flows/flow_step_sequence.py +6 -0
  252. rasa/shared/core/flows/flows_yaml_schema.json +3 -0
  253. rasa/shared/core/flows/nlu_trigger.py +13 -0
  254. rasa/shared/core/flows/steps/action.py +7 -4
  255. rasa/shared/core/flows/steps/call.py +11 -4
  256. rasa/shared/core/flows/steps/collect.py +71 -6
  257. rasa/shared/core/flows/steps/internal.py +6 -1
  258. rasa/shared/core/flows/steps/link.py +7 -4
  259. rasa/shared/core/flows/steps/no_operation.py +7 -4
  260. rasa/shared/core/flows/steps/set_slots.py +8 -4
  261. rasa/shared/core/flows/validation.py +16 -3
  262. rasa/shared/core/flows/yaml_flows_io.py +106 -5
  263. rasa/shared/core/slots.py +33 -1
  264. rasa/shared/core/trackers.py +4 -10
  265. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +1 -4
  266. rasa/shared/importers/importer.py +14 -0
  267. rasa/shared/importers/static.py +63 -0
  268. rasa/shared/providers/constants.py +0 -9
  269. rasa/shared/providers/llm/_base_litellm_client.py +4 -14
  270. rasa/shared/providers/llm/default_litellm_llm_client.py +2 -2
  271. rasa/shared/providers/llm/litellm_router_llm_client.py +7 -17
  272. rasa/shared/providers/llm/llm_client.py +15 -24
  273. rasa/shared/providers/llm/self_hosted_llm_client.py +2 -10
  274. rasa/shared/utils/common.py +43 -1
  275. rasa/shared/utils/llm.py +155 -3
  276. rasa/shared/utils/yaml.py +32 -0
  277. rasa/studio/data_handler.py +3 -3
  278. rasa/studio/download/__init__.py +0 -0
  279. rasa/studio/download/domains.py +49 -0
  280. rasa/studio/download/download.py +416 -0
  281. rasa/studio/download/flows.py +351 -0
  282. rasa/studio/link.py +200 -0
  283. rasa/studio/pull.py +94 -0
  284. rasa/studio/push.py +131 -0
  285. rasa/studio/results_logger.py +6 -1
  286. rasa/studio/upload.py +185 -71
  287. rasa/telemetry.py +83 -26
  288. rasa/tracing/config.py +4 -5
  289. rasa/tracing/constants.py +19 -1
  290. rasa/tracing/instrumentation/attribute_extractors.py +49 -11
  291. rasa/tracing/instrumentation/instrumentation.py +54 -3
  292. rasa/tracing/instrumentation/metrics.py +98 -15
  293. rasa/tracing/metric_instrument_provider.py +75 -3
  294. rasa/utils/common.py +37 -27
  295. rasa/utils/endpoints.py +22 -1
  296. rasa/utils/licensing.py +2 -3
  297. rasa/utils/log_utils.py +1 -45
  298. rasa/validator.py +9 -11
  299. rasa/version.py +1 -1
  300. {rasa_pro-3.12.18.dev1.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/METADATA +12 -14
  301. {rasa_pro-3.12.18.dev1.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/RECORD +318 -294
  302. rasa/anonymization/__init__.py +0 -2
  303. rasa/anonymization/anonymisation_rule_yaml_reader.py +0 -91
  304. rasa/anonymization/anonymization_pipeline.py +0 -286
  305. rasa/anonymization/anonymization_rule_executor.py +0 -266
  306. rasa/anonymization/anonymization_rule_orchestrator.py +0 -119
  307. rasa/anonymization/schemas/config.yml +0 -47
  308. rasa/anonymization/utils.py +0 -118
  309. rasa/cli/project_templates/calm/config.yml +0 -10
  310. rasa/cli/project_templates/calm/credentials.yml +0 -33
  311. rasa/cli/project_templates/calm/endpoints.yml +0 -58
  312. rasa/cli/project_templates/default/actions/actions.py +0 -27
  313. rasa/cli/project_templates/default/data/nlu.yml +0 -91
  314. rasa/cli/project_templates/default/data/rules.yml +0 -13
  315. rasa/cli/project_templates/default/data/stories.yml +0 -30
  316. rasa/cli/project_templates/default/domain.yml +0 -34
  317. rasa/cli/project_templates/default/tests/test_stories.yml +0 -91
  318. rasa/core/channels/inspector/dist/assets/channel-dfa68278.js +0 -1
  319. rasa/core/channels/inspector/dist/assets/clone-edb7f119.js +0 -1
  320. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-65e7c670.js +0 -1
  321. rasa/core/channels/inspector/src/helpers/audiostream.ts +0 -191
  322. rasa/core/tracker_store.py +0 -1792
  323. rasa/monkey_patches.py +0 -91
  324. rasa/studio/download.py +0 -489
  325. /rasa/{cli/project_templates/calm/actions → builder}/__init__.py +0 -0
  326. /rasa/cli/project_templates/{calm → default}/actions/action_template.py +0 -0
  327. /rasa/cli/project_templates/{calm → default}/actions/add_contact.py +0 -0
  328. /rasa/cli/project_templates/{calm → default}/actions/db.py +0 -0
  329. /rasa/cli/project_templates/{calm → default}/actions/list_contacts.py +0 -0
  330. /rasa/cli/project_templates/{calm → default}/actions/remove_contact.py +0 -0
  331. /rasa/cli/project_templates/{calm → default}/data/flows/add_contact.yml +0 -0
  332. /rasa/cli/project_templates/{calm → default}/data/flows/list_contacts.yml +0 -0
  333. /rasa/cli/project_templates/{calm → default}/data/flows/remove_contact.yml +0 -0
  334. /rasa/cli/project_templates/{calm → default}/db/contacts.json +0 -0
  335. /rasa/cli/project_templates/{calm → default}/domain/add_contact.yml +0 -0
  336. /rasa/cli/project_templates/{calm → default}/domain/list_contacts.yml +0 -0
  337. /rasa/cli/project_templates/{calm → default}/domain/remove_contact.yml +0 -0
  338. /rasa/cli/project_templates/{calm → default}/domain/shared.yml +0 -0
  339. {rasa_pro-3.12.18.dev1.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/NOTICE +0 -0
  340. {rasa_pro-3.12.18.dev1.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/WHEEL +0 -0
  341. {rasa_pro-3.12.18.dev1.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/entry_points.txt +0 -0
@@ -320,14 +320,14 @@ def create_new_flows_from_diff(
320
320
 
321
321
 
322
322
  def import_data_from_studio(
323
- handler: StudioDataHandler, domain_path: Path, data_paths: List[Path]
323
+ handler: StudioDataHandler, domain_path: Path, data_path: Path
324
324
  ) -> Tuple[TrainingDataImporter, TrainingDataImporter]:
325
325
  """Construct TrainingDataImporter from Studio data and original data.
326
326
 
327
327
  Args:
328
328
  handler (StudioDataHandler): handler with data from studio
329
329
  domain_path (Path): Path to a domain file
330
- data_paths (List[Path]): List of paths to training data files
330
+ data_path (List[Path]): List of paths to training data files
331
331
 
332
332
  Returns:
333
333
  Tuple[TrainingDataImporter, TrainingDataImporter]:
@@ -335,7 +335,7 @@ def import_data_from_studio(
335
335
  """
336
336
  tmp_dir = get_temp_dir_name()
337
337
  data_original = TrainingDataImporter.load_from_dict(
338
- domain_path=domain_path, training_data_paths=data_paths
338
+ domain_path=str(domain_path), training_data_paths=[str(data_path)]
339
339
  )
340
340
 
341
341
  data_paths = []
File without changes
@@ -0,0 +1,49 @@
1
+ import logging
2
+ from pathlib import Path
3
+
4
+ from rasa.shared.core.domain import (
5
+ Domain,
6
+ )
7
+ from rasa.shared.importers.importer import TrainingDataImporter
8
+ from rasa.studio.constants import STUDIO_DOMAIN_FILENAME
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ def merge_domain_with_overwrite(
14
+ data_from_studio: TrainingDataImporter,
15
+ data_local: TrainingDataImporter,
16
+ domain_path: Path,
17
+ ) -> None:
18
+ """
19
+ Merges the domain from Rasa Studio with the local domain.
20
+
21
+ Args:
22
+ data_from_studio: The training data importer for the Rasa Studio domain.
23
+ data_local: The training data importer for the local domain.
24
+ domain_path: The path to the domain file or directory.
25
+ """
26
+ if domain_path.is_file():
27
+ all_local_domain_files = [str(domain_path)]
28
+ domain_path = domain_path.parent
29
+ else:
30
+ all_local_domain_files = data_local.get_domain_files([str(domain_path)])
31
+
32
+ # leftover_domain represents the items in the studio
33
+ # domain that are not in the local domain
34
+ leftover_domain = data_from_studio.get_user_domain()
35
+ for file_path in all_local_domain_files:
36
+ # For each local domain file, we do a partial merge
37
+ local_domain = Domain.from_file(str(file_path))
38
+ updated_local_domain = local_domain.partial_merge(leftover_domain)
39
+
40
+ # If this partial merge made changes, persist them
41
+ if local_domain != updated_local_domain:
42
+ updated_local_domain.persist(file_path)
43
+
44
+ # Remove every item now present in updated_local_domain from leftover_domain
45
+ leftover_domain = leftover_domain.difference(updated_local_domain)
46
+
47
+ # If there are still items in leftover_domain, persist them
48
+ if not leftover_domain.is_empty():
49
+ leftover_domain.persist(domain_path / STUDIO_DOMAIN_FILENAME)
@@ -0,0 +1,416 @@
1
+ import argparse
2
+ from pathlib import Path
3
+ from typing import Dict, Optional, Tuple
4
+
5
+ import questionary
6
+ import structlog
7
+ from ruamel import yaml
8
+ from ruamel.yaml.scalarstring import LiteralScalarString
9
+
10
+ import rasa.cli.utils
11
+ import rasa.shared.utils.cli
12
+ from rasa.shared.constants import (
13
+ DEFAULT_CONFIG_PATH,
14
+ DEFAULT_DATA_PATH,
15
+ DEFAULT_DOMAIN_PATH,
16
+ DEFAULT_DOMAIN_PATHS,
17
+ DEFAULT_ENDPOINTS_PATH,
18
+ )
19
+ from rasa.shared.core.flows.yaml_flows_io import YamlFlowsWriter
20
+ from rasa.shared.importers.importer import TrainingDataImporter
21
+ from rasa.shared.utils.yaml import read_yaml
22
+ from rasa.studio import data_handler
23
+ from rasa.studio.config import StudioConfig
24
+ from rasa.studio.constants import (
25
+ STUDIO_DOMAIN_FILENAME,
26
+ STUDIO_FLOWS_FILENAME,
27
+ STUDIO_NLU_FILENAME,
28
+ )
29
+ from rasa.studio.data_handler import StudioDataHandler, import_data_from_studio
30
+ from rasa.studio.download.domains import merge_domain_with_overwrite
31
+ from rasa.studio.download.flows import merge_flows_with_overwrite
32
+ from rasa.utils.mapper import RasaPrimitiveStorageMapper
33
+
34
+ structlogger = structlog.getLogger(__name__)
35
+
36
+
37
+ def handle_download(args: argparse.Namespace) -> None:
38
+ """Main function to handle downloading and merging data.
39
+
40
+ Args:
41
+ args: The command line arguments.
42
+ """
43
+ handler = StudioDataHandler(
44
+ studio_config=StudioConfig.read_config(),
45
+ assistant_name=args.assistant_name[0],
46
+ )
47
+ handler.request_all_data()
48
+
49
+ domain_path, data_path = _prepare_data_and_domain_paths(args)
50
+
51
+ # Handle config and endpoints.
52
+ config_path, write_config = _handle_file_overwrite(
53
+ args.config, DEFAULT_CONFIG_PATH, "config"
54
+ )
55
+ endpoints_path, write_endpoints = _handle_file_overwrite(
56
+ args.endpoints, DEFAULT_ENDPOINTS_PATH, "endpoints"
57
+ )
58
+ message_parts = []
59
+ config_path = config_path if write_config else None
60
+ endpoints_path = endpoints_path if write_endpoints else None
61
+
62
+ if config_path:
63
+ config_data = handler.get_config()
64
+ if not config_data:
65
+ rasa.shared.utils.cli.print_error_and_exit("No config data found.")
66
+ with open(config_path, "w") as f:
67
+ f.write(config_data)
68
+ message_parts.append(f"config to '{config_path}'")
69
+ if endpoints_path:
70
+ endpoints_data = handler.get_endpoints()
71
+ if not endpoints_data:
72
+ raise ValueError("No endpoints data found.")
73
+ with open(endpoints_path, "w") as f:
74
+ f.write(endpoints_data)
75
+ message_parts.append(f"endpoints to '{endpoints_path}'")
76
+ if message_parts:
77
+ message = "Downloaded " + " and ".join(message_parts)
78
+ structlogger.info("studio.download.config_endpoints", event_info=message)
79
+
80
+ if not args.overwrite:
81
+ _handle_download_no_overwrite(handler, domain_path, data_path)
82
+ else:
83
+ _handle_download_with_overwrite(handler, domain_path, data_path)
84
+
85
+
86
+ def _prepare_data_and_domain_paths(args: argparse.Namespace) -> Tuple[Path, Path]:
87
+ """Prepars the domain and data paths based on the provided arguments.
88
+
89
+ Args:
90
+ args: The command line arguments.
91
+
92
+ Returns:
93
+ A tuple containing the domain path and a list of data paths.
94
+ """
95
+ # Prepare domain path.
96
+ domain_path = rasa.cli.utils.get_validated_path(
97
+ args.domain, "domain", DEFAULT_DOMAIN_PATHS, none_is_valid=True
98
+ )
99
+ domain_or_default_path = args.domain or DEFAULT_DOMAIN_PATH
100
+
101
+ if domain_path is None:
102
+ domain_path = Path(domain_or_default_path)
103
+ domain_path.touch()
104
+
105
+ if isinstance(domain_path, str):
106
+ domain_path = Path(domain_path)
107
+
108
+ if domain_path.is_file():
109
+ if not args.overwrite:
110
+ domain_path.unlink()
111
+ domain_path.touch()
112
+
113
+ if domain_path.is_dir():
114
+ if not args.overwrite:
115
+ domain_path = domain_path / STUDIO_DOMAIN_FILENAME
116
+ domain_path.touch()
117
+
118
+ data_path = rasa.cli.utils.get_validated_path(
119
+ args.data[0], "data", DEFAULT_DATA_PATH, none_is_valid=True
120
+ )
121
+
122
+ data_path = Path(data_path or args.data[0])
123
+ if not (data_path.is_file() or data_path.is_dir()):
124
+ data_path.mkdir(parents=True, exist_ok=True)
125
+
126
+ return domain_path, data_path
127
+
128
+
129
+ def _handle_file_overwrite(
130
+ file_path: Optional[str], default_path: str, file_type: str
131
+ ) -> Tuple[Optional[Path], bool]:
132
+ """Determines whether to overwrite an existing file or create a new one.
133
+
134
+ Works for config and endpoints at this moment.
135
+
136
+ Args:
137
+ file_path: The path to the file.
138
+ default_path: The default path to use if no file path is provided.
139
+ file_type: The type of the file (e.g., config, endpoints).
140
+
141
+ Returns:
142
+ A tuple of the file path and a boolean indicating overwrite status.
143
+ """
144
+ file_already_exists = rasa.cli.utils.get_validated_path(
145
+ file_path, file_type, default_path, none_is_valid=True
146
+ )
147
+ write_file = False
148
+ path = None
149
+ file_or_default_path = file_path or default_path
150
+
151
+ if file_already_exists is None:
152
+ path = Path(file_or_default_path)
153
+ if path.is_dir():
154
+ path = path / default_path
155
+ return path, True
156
+
157
+ if questionary.confirm(
158
+ f"{file_type.capitalize()} file '{file_or_default_path}' already exists. "
159
+ f"Do you want to overwrite it?"
160
+ ).ask():
161
+ write_file = True
162
+ path = Path(file_or_default_path)
163
+ return path, write_file
164
+
165
+
166
+ def _handle_download_no_overwrite(
167
+ handler: StudioDataHandler, domain_path: Path, data_path: Path
168
+ ) -> None:
169
+ """Handles downloading without overwriting existing files.
170
+
171
+ Args:
172
+ handler: The StudioDataHandler instance.
173
+ domain_path: The path to the domain file or directory.
174
+ data_paths: The paths to the data files or directories.
175
+ """
176
+ data_from_studio, data_local = import_data_from_studio(
177
+ handler, domain_path, data_path
178
+ )
179
+ _merge_domain_no_overwrite(domain_path, data_from_studio, data_local)
180
+ _merge_data_no_overwrite(data_path, handler, data_from_studio, data_local)
181
+
182
+
183
+ def _merge_domain_no_overwrite(
184
+ domain_path: Path,
185
+ data_from_studio: TrainingDataImporter,
186
+ data_local: TrainingDataImporter,
187
+ ) -> None:
188
+ """
189
+ Merges the domain data without overwriting.
190
+
191
+ If the domain path is a directory, a new domain file is created under that folder.
192
+ If the domain path is a file, it merges both domains into that file.
193
+
194
+ Args:
195
+ domain_path: The path to the domain file or directory.
196
+ data_from_studio: The Studio data importer.
197
+ data_local: The local data importer.
198
+ """
199
+ if domain_path.is_dir():
200
+ _merge_directory_domain(domain_path, data_from_studio, data_local)
201
+ elif domain_path.is_file():
202
+ _merge_file_domain(domain_path, data_from_studio, data_local)
203
+
204
+
205
+ def _merge_directory_domain(
206
+ domain_path: Path,
207
+ data_from_studio: TrainingDataImporter,
208
+ data_local: TrainingDataImporter,
209
+ ) -> None:
210
+ """Merges domain data without overwriting when the domain is a directory.
211
+
212
+ Args:
213
+ domain_path: The path to the domain directory.
214
+ data_from_studio: The Studio data importer.
215
+ data_local: The local data importer.
216
+ """
217
+ from rasa.shared.core.domain import Domain
218
+
219
+ studio_domain_path = domain_path / STUDIO_NLU_FILENAME
220
+ new_domain_data = data_handler.combine_domains(
221
+ data_from_studio.get_user_domain().as_dict(),
222
+ data_local.get_user_domain().as_dict(),
223
+ )
224
+ studio_domain = Domain.from_dict(new_domain_data)
225
+
226
+ if not studio_domain.is_empty():
227
+ studio_domain.persist(studio_domain_path)
228
+ else:
229
+ structlogger.warning(
230
+ "studio.download.merge_directory_domain",
231
+ event_info="No additional domain data found in Studio assistant.",
232
+ )
233
+
234
+
235
+ def _merge_file_domain(
236
+ domain_path: Path,
237
+ data_from_studio: TrainingDataImporter,
238
+ data_local: TrainingDataImporter,
239
+ ) -> None:
240
+ """Merges domain data without overwriting when the domain is a file.
241
+
242
+ Args:
243
+ domain_path: The path to the domain file.
244
+ data_from_studio: The Studio data importer.
245
+ data_local: The local data importer.
246
+ """
247
+ domain_merged = data_local.get_user_domain().merge(
248
+ data_from_studio.get_user_domain()
249
+ )
250
+ domain_merged.persist(domain_path)
251
+
252
+
253
+ def _merge_data_no_overwrite(
254
+ data_path: Path,
255
+ handler: StudioDataHandler,
256
+ data_from_studio: TrainingDataImporter,
257
+ data_local: TrainingDataImporter,
258
+ ) -> None:
259
+ """Merges NLU and flow data without overwriting existing data.
260
+
261
+ Args:
262
+ data_path: The paths to the data files or directories.
263
+ handler: The StudioDataHandler instance.
264
+ data_from_studio: The Studio data importer.
265
+ data_local: The local data importer.
266
+ """
267
+ if not data_path:
268
+ structlogger.warning(
269
+ "studio.download.merge_data_no_overwrite.no_path",
270
+ event_info="No data paths provided. Skipping data merge.",
271
+ )
272
+ return
273
+
274
+ if data_path.is_file():
275
+ _merge_file_data_no_overwrite(data_path, handler, data_from_studio, data_local)
276
+ elif data_path.is_dir():
277
+ _merge_dir_data_no_overwrite(data_path, handler, data_from_studio, data_local)
278
+ else:
279
+ structlogger.warning(
280
+ "studio.download.merge_data_no_overwrite.invalid_path",
281
+ event_info=(
282
+ f"Provided path '{data_path}' is neither a file nor a directory."
283
+ ),
284
+ )
285
+
286
+
287
+ def _merge_file_data_no_overwrite(
288
+ data_path: Path,
289
+ handler: StudioDataHandler,
290
+ data_from_studio: TrainingDataImporter,
291
+ data_local: TrainingDataImporter,
292
+ ) -> None:
293
+ """Merges NLU and flows data into a single file without overwriting.
294
+
295
+ Args:
296
+ data_path: Path to the single data file.
297
+ handler: The StudioDataHandler instance.
298
+ data_from_studio: The Studio data importer.
299
+ data_local: The local data importer.
300
+ """
301
+ if handler.has_nlu():
302
+ merged_nlu = data_local.get_nlu_data().merge(data_from_studio.get_nlu_data())
303
+ merged_nlu.persist_nlu(str(data_path))
304
+ if handler.has_flows():
305
+ merged_flows = data_local.get_user_flows().merge(
306
+ data_from_studio.get_user_flows()
307
+ )
308
+ YamlFlowsWriter.dump(merged_flows.underlying_flows, data_path)
309
+
310
+
311
+ def _merge_dir_data_no_overwrite(
312
+ dir_path: Path,
313
+ handler: StudioDataHandler,
314
+ data_from_studio: TrainingDataImporter,
315
+ data_local: TrainingDataImporter,
316
+ ) -> None:
317
+ """Merges NLU and flows data into a single directory without overwriting.
318
+
319
+ Args:
320
+ dir_path: Path to the data directory.
321
+ handler: The StudioDataHandler instance.
322
+ data_from_studio: The Studio data importer.
323
+ data_local: The local data importer.
324
+ """
325
+ if handler.has_nlu():
326
+ nlu_path = dir_path / Path(STUDIO_NLU_FILENAME)
327
+ _persist_nlu_diff(data_local, data_from_studio, nlu_path)
328
+ if handler.has_flows():
329
+ flows_path = dir_path / Path(STUDIO_FLOWS_FILENAME)
330
+ _persist_flows_diff(data_local, data_from_studio, flows_path)
331
+
332
+
333
+ def _handle_download_with_overwrite(
334
+ handler: StudioDataHandler, domain_path: Path, data_path: Path
335
+ ) -> None:
336
+ """Handles downloading and merging data when the user opts for overwrite.
337
+
338
+ Args:
339
+ handler: The StudioDataHandler instance.
340
+ domain_path: The path to the domain file or directory.
341
+ data_path: The paths to the data files or directories.
342
+ """
343
+ data_from_studio, data_local = import_data_from_studio(
344
+ handler, domain_path, data_path
345
+ )
346
+ mapper = RasaPrimitiveStorageMapper(
347
+ domain_path=domain_path, training_data_paths=[data_path]
348
+ )
349
+ merge_domain_with_overwrite(data_from_studio, data_local, domain_path)
350
+ merge_flows_with_overwrite(data_path, handler, data_from_studio, data_local, mapper)
351
+
352
+
353
+ def _persist_nlu_diff(
354
+ data_local: TrainingDataImporter,
355
+ data_from_studio: TrainingDataImporter,
356
+ data_path: Path,
357
+ ) -> None:
358
+ """Creates a new NLU file from the diff of local and studio data.
359
+
360
+ Args:
361
+ data_local: The local training data.
362
+ data_from_studio: The training data from Rasa Studio.
363
+ data_path: The path to the NLU file.
364
+ """
365
+ new_nlu_data = data_handler.create_new_nlu_from_diff(
366
+ read_yaml(data_from_studio.get_nlu_data().nlu_as_yaml()),
367
+ read_yaml(data_local.get_nlu_data().nlu_as_yaml()),
368
+ )
369
+ if new_nlu_data["nlu"]:
370
+ pretty_write_nlu_yaml(new_nlu_data, data_path)
371
+ else:
372
+ structlogger.warning(
373
+ "studio.download.persist_nlu_diff",
374
+ event_info="No additional nlu data found.",
375
+ )
376
+
377
+
378
+ def _persist_flows_diff(
379
+ data_local: TrainingDataImporter,
380
+ data_from_studio: TrainingDataImporter,
381
+ data_path: Path,
382
+ ) -> None:
383
+ """Creates a new flows file from the diff of local and studio data.
384
+
385
+ Args:
386
+ data_local: The local training data.
387
+ data_from_studio: The training data from Rasa Studio.
388
+ data_path: The path to the flows file.
389
+ """
390
+ new_flows_data = data_handler.create_new_flows_from_diff(
391
+ data_from_studio.get_user_flows().underlying_flows,
392
+ data_local.get_user_flows().underlying_flows,
393
+ )
394
+ if new_flows_data:
395
+ YamlFlowsWriter.dump(new_flows_data, data_path)
396
+ else:
397
+ structlogger.warning(
398
+ "studio.download.persist_flows_diff",
399
+ event_info="No additional flows data found.",
400
+ )
401
+
402
+
403
+ def pretty_write_nlu_yaml(data: Dict, file: Path) -> None:
404
+ """Writes the NLU YAML in a pretty way.
405
+
406
+ Args:
407
+ data: The data to write.
408
+ file: The file to write to.
409
+ """
410
+ dumper = yaml.YAML()
411
+ if nlu_data := data.get("nlu"):
412
+ for item in nlu_data:
413
+ if item.get("examples"):
414
+ item["examples"] = LiteralScalarString(item["examples"])
415
+ with file.open("w", encoding="utf-8") as outfile:
416
+ dumper.dump(data, outfile)