rasa-pro 3.12.18__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 (330) hide show
  1. rasa/__main__.py +3 -4
  2. rasa/api.py +1 -1
  3. rasa/builder/create_openai_vector_store.py +69 -0
  4. rasa/builder/llm-helper-schema.json +69 -0
  5. rasa/builder/prompt_to_bot.py +645 -0
  6. rasa/builder/scrape_rasa_docs.py +97 -0
  7. rasa/builder/skill_to_bot_prompt.jinja +158 -0
  8. rasa/cli/dialogue_understanding_test.py +1 -1
  9. rasa/cli/e2e_test.py +1 -1
  10. rasa/cli/evaluate.py +2 -2
  11. rasa/cli/export.py +3 -3
  12. rasa/cli/llm_fine_tuning.py +1 -1
  13. rasa/cli/project_templates/default/config.yml +5 -32
  14. rasa/cli/project_templates/{calm → default}/e2e_tests/cancelations/user_cancels_during_a_correction.yml +1 -1
  15. rasa/cli/project_templates/{calm → default}/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +1 -1
  16. rasa/cli/project_templates/{calm → default}/e2e_tests/corrections/user_corrects_contact_handle.yml +1 -1
  17. rasa/cli/project_templates/{calm → default}/e2e_tests/corrections/user_corrects_contact_name.yml +1 -1
  18. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +1 -1
  19. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_lists_contacts.yml +1 -1
  20. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_removes_contact.yml +1 -1
  21. rasa/cli/project_templates/{calm → default}/e2e_tests/happy_paths/user_removes_contact_from_list.yml +1 -1
  22. rasa/cli/project_templates/default/endpoints.yml +18 -2
  23. rasa/cli/project_templates/defaults.py +133 -0
  24. rasa/cli/run.py +1 -1
  25. rasa/cli/scaffold.py +2 -3
  26. rasa/cli/studio/download.py +1 -1
  27. rasa/cli/studio/link.py +53 -0
  28. rasa/cli/studio/pull.py +78 -0
  29. rasa/cli/studio/push.py +78 -0
  30. rasa/cli/studio/studio.py +12 -0
  31. rasa/cli/studio/upload.py +5 -3
  32. rasa/cli/train.py +1 -1
  33. rasa/cli/utils.py +1 -1
  34. rasa/cli/x.py +1 -1
  35. rasa/constants.py +2 -0
  36. rasa/core/__init__.py +0 -16
  37. rasa/core/actions/action.py +43 -29
  38. rasa/core/actions/action_repeat_bot_messages.py +18 -22
  39. rasa/core/actions/action_run_slot_rejections.py +1 -2
  40. rasa/core/agent.py +18 -3
  41. rasa/core/available_endpoints.py +146 -0
  42. rasa/core/brokers/kafka.py +4 -0
  43. rasa/core/brokers/pika.py +5 -2
  44. rasa/core/brokers/sql.py +1 -1
  45. rasa/core/channels/botframework.py +2 -2
  46. rasa/core/channels/channel.py +2 -2
  47. rasa/core/channels/development_inspector.py +1 -1
  48. rasa/core/channels/facebook.py +1 -4
  49. rasa/core/channels/hangouts.py +8 -5
  50. rasa/core/channels/inspector/.eslintrc.cjs +12 -6
  51. rasa/core/channels/inspector/.prettierrc +5 -0
  52. rasa/core/channels/inspector/README.md +11 -5
  53. rasa/core/channels/inspector/dist/assets/{arc-9f75cc3b.js → arc-02053cc1.js} +1 -1
  54. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-7f34db23.js → blockDiagram-38ab4fdb-008b6289.js} +1 -1
  55. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-948bab2c.js → c4Diagram-3d4e48cf-fb2597be.js} +1 -1
  56. rasa/core/channels/inspector/dist/assets/channel-078dada8.js +1 -0
  57. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-53b0dd0e.js → classDiagram-70f12bd4-7f847e00.js} +1 -1
  58. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-fdf789e7.js → classDiagram-v2-f2320105-ba1d689b.js} +1 -1
  59. rasa/core/channels/inspector/dist/assets/clone-5b4516de.js +1 -0
  60. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-87c4ece5.js → createText-2e5e7dd3-dd8e67c4.js} +1 -1
  61. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-5a8b0749.js → edges-e0da2a9e-10784939.js} +1 -1
  62. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-66da90e2.js → erDiagram-9861fffd-24947ae6.js} +1 -1
  63. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-10044f05.js → flowDb-956e92f1-a9ced505.js} +1 -1
  64. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-f338f66a.js → flowDiagram-66a62f08-afda9c7c.js} +1 -1
  65. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-f9613071.js +1 -0
  66. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-b13140aa.js → flowchart-elk-definition-4a651766-6ef530b8.js} +1 -1
  67. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-f2b4a55a.js → ganttDiagram-c361ad54-0c7dd39a.js} +1 -1
  68. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-dedc298d.js → gitGraphDiagram-72cf32ee-b57239d6.js} +1 -1
  69. rasa/core/channels/inspector/dist/assets/{graph-4ede11ff.js → graph-9ed57cec.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{index-3862675e-65549d37.js → index-3862675e-233090de.js} +1 -1
  71. rasa/core/channels/inspector/dist/assets/{index-3a23e736.js → index-72184470.js} +123 -123
  72. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-65439671.js → infoDiagram-f8f76790-aa116649.js} +1 -1
  73. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-56d03d98.js → journeyDiagram-49397b02-e51877cc.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{layout-dd48f7f4.js → layout-3ca3798c.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/{line-1569ad2c.js → line-26ee10d3.js} +1 -1
  76. rasa/core/channels/inspector/dist/assets/{linear-48bf4935.js → linear-aedded32.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-688504c1.js → mindmap-definition-fc14e90a-d8957261.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-78b6d7e6.js → pieDiagram-8a3498a8-d771f885.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-048b84b3.js → quadrantDiagram-120e2f19-09fdf50c.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-dd67f107.js → requirementDiagram-deff3bca-9f0af02e.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-8128436e.js → sankeyDiagram-04a897e0-84415b37.js} +1 -1
  82. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-1a0d1461.js → sequenceDiagram-704730f1-8dec4055.js} +1 -1
  83. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-46d388ed.js → stateDiagram-587899a1-c5431d07.js} +1 -1
  84. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-ea42951a.js → stateDiagram-v2-d93cdb3a-274e77d9.js} +1 -1
  85. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-7427ed0c.js → styles-6aaf32cf-e364a1d7.js} +1 -1
  86. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-ff5e5a16.js → styles-9a916d00-0dae36f6.js} +1 -1
  87. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-7b3680cf.js → styles-c10674c1-c4641675.js} +1 -1
  88. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-f860f2ad.js → svgDrawCommon-08f97a94-831fe9a1.js} +1 -1
  89. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-2eebf0c8.js → timeline-definition-85554ec2-c3304b3a.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-5d7f4e96.js → xychartDiagram-e933f94c-da799369.js} +1 -1
  91. rasa/core/channels/inspector/dist/index.html +1 -1
  92. rasa/core/channels/inspector/package.json +3 -1
  93. rasa/core/channels/inspector/src/App.tsx +91 -90
  94. rasa/core/channels/inspector/src/components/Chat.tsx +45 -41
  95. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +40 -40
  96. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +57 -57
  97. rasa/core/channels/inspector/src/components/DialogueStack.tsx +36 -27
  98. rasa/core/channels/inspector/src/components/ExpandIcon.tsx +4 -4
  99. rasa/core/channels/inspector/src/components/FullscreenButton.tsx +7 -7
  100. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +28 -12
  101. rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +9 -9
  102. rasa/core/channels/inspector/src/components/RasaLogo.tsx +5 -5
  103. rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +55 -60
  104. rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +5 -5
  105. rasa/core/channels/inspector/src/components/Slots.tsx +22 -22
  106. rasa/core/channels/inspector/src/components/Welcome.tsx +28 -31
  107. rasa/core/channels/inspector/src/helpers/audio/audiostream.ts +245 -0
  108. rasa/core/channels/inspector/src/helpers/audio/microphone-processor.js +12 -0
  109. rasa/core/channels/inspector/src/helpers/audio/playback-processor.js +36 -0
  110. rasa/core/channels/inspector/src/helpers/conversation.ts +7 -7
  111. rasa/core/channels/inspector/src/helpers/formatters.test.ts +181 -181
  112. rasa/core/channels/inspector/src/helpers/formatters.ts +111 -111
  113. rasa/core/channels/inspector/src/helpers/utils.ts +78 -61
  114. rasa/core/channels/inspector/src/main.tsx +8 -8
  115. rasa/core/channels/inspector/src/theme/Button/Button.ts +8 -8
  116. rasa/core/channels/inspector/src/theme/Heading/Heading.ts +7 -7
  117. rasa/core/channels/inspector/src/theme/Input/Input.ts +9 -9
  118. rasa/core/channels/inspector/src/theme/Link/Link.ts +6 -6
  119. rasa/core/channels/inspector/src/theme/Modal/Modal.ts +13 -13
  120. rasa/core/channels/inspector/src/theme/Table/Table.tsx +10 -10
  121. rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +5 -5
  122. rasa/core/channels/inspector/src/theme/base/breakpoints.ts +7 -7
  123. rasa/core/channels/inspector/src/theme/base/colors.ts +64 -64
  124. rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +21 -18
  125. rasa/core/channels/inspector/src/theme/base/radii.ts +8 -8
  126. rasa/core/channels/inspector/src/theme/base/shadows.ts +5 -5
  127. rasa/core/channels/inspector/src/theme/base/sizes.ts +5 -5
  128. rasa/core/channels/inspector/src/theme/base/space.ts +12 -12
  129. rasa/core/channels/inspector/src/theme/base/styles.ts +5 -5
  130. rasa/core/channels/inspector/src/theme/base/typography.ts +12 -12
  131. rasa/core/channels/inspector/src/theme/base/zIndices.ts +3 -3
  132. rasa/core/channels/inspector/src/theme/index.ts +38 -38
  133. rasa/core/channels/inspector/src/types.ts +56 -50
  134. rasa/core/channels/inspector/yarn.lock +5 -0
  135. rasa/core/channels/mattermost.py +1 -1
  136. rasa/core/channels/rasa_chat.py +2 -4
  137. rasa/core/channels/rest.py +5 -4
  138. rasa/core/channels/socketio.py +56 -41
  139. rasa/core/channels/studio_chat.py +337 -71
  140. rasa/core/channels/vier_cvg.py +1 -2
  141. rasa/core/channels/voice_ready/audiocodes.py +4 -11
  142. rasa/core/channels/voice_stream/audiocodes.py +8 -5
  143. rasa/core/channels/voice_stream/browser_audio.py +1 -1
  144. rasa/core/channels/voice_stream/genesys.py +2 -2
  145. rasa/core/channels/voice_stream/tts/__init__.py +8 -0
  146. rasa/core/channels/voice_stream/twilio_media_streams.py +10 -5
  147. rasa/core/channels/voice_stream/voice_channel.py +65 -23
  148. rasa/core/concurrent_lock_store.py +24 -10
  149. rasa/core/evaluation/marker_tracker_loader.py +1 -1
  150. rasa/core/exporter.py +1 -1
  151. rasa/core/http_interpreter.py +3 -7
  152. rasa/core/information_retrieval/faiss.py +18 -11
  153. rasa/core/information_retrieval/ingestion/__init__.py +0 -0
  154. rasa/core/information_retrieval/ingestion/faq_parser.py +158 -0
  155. rasa/core/jobs.py +2 -1
  156. rasa/core/lock_store.py +151 -60
  157. rasa/core/nlg/contextual_response_rephraser.py +17 -7
  158. rasa/core/nlg/generator.py +5 -22
  159. rasa/core/nlg/interpolator.py +2 -3
  160. rasa/core/nlg/response.py +6 -43
  161. rasa/core/nlg/summarize.py +1 -1
  162. rasa/core/nlg/translate.py +0 -8
  163. rasa/core/policies/enterprise_search_policy.py +262 -62
  164. rasa/core/policies/enterprise_search_prompt_with_relevancy_check_and_citation_template.jinja2 +63 -0
  165. rasa/core/policies/flow_policy.py +1 -1
  166. rasa/core/policies/flows/flow_executor.py +96 -17
  167. rasa/core/policies/intentless_policy.py +56 -17
  168. rasa/core/processor.py +64 -49
  169. rasa/core/run.py +33 -11
  170. rasa/core/tracker_stores/__init__.py +0 -0
  171. rasa/core/{auth_retry_tracker_store.py → tracker_stores/auth_retry_tracker_store.py} +5 -1
  172. rasa/core/tracker_stores/dynamo_tracker_store.py +218 -0
  173. rasa/core/tracker_stores/mongo_tracker_store.py +206 -0
  174. rasa/core/tracker_stores/redis_tracker_store.py +219 -0
  175. rasa/core/tracker_stores/sql_tracker_store.py +555 -0
  176. rasa/core/tracker_stores/tracker_store.py +805 -0
  177. rasa/core/training/interactive.py +1 -1
  178. rasa/core/utils.py +24 -95
  179. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -1
  180. rasa/dialogue_understanding/coexistence/llm_based_router.py +9 -6
  181. rasa/dialogue_understanding/commands/can_not_handle_command.py +2 -0
  182. rasa/dialogue_understanding/commands/cancel_flow_command.py +5 -1
  183. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +2 -0
  184. rasa/dialogue_understanding/commands/clarify_command.py +4 -0
  185. rasa/dialogue_understanding/commands/command_syntax_manager.py +1 -0
  186. rasa/dialogue_understanding/commands/correct_slots_command.py +1 -3
  187. rasa/dialogue_understanding/commands/human_handoff_command.py +2 -0
  188. rasa/dialogue_understanding/commands/knowledge_answer_command.py +2 -0
  189. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +2 -0
  190. rasa/dialogue_understanding/commands/set_slot_command.py +4 -0
  191. rasa/dialogue_understanding/commands/skip_question_command.py +2 -0
  192. rasa/dialogue_understanding/commands/start_flow_command.py +4 -0
  193. rasa/dialogue_understanding/generator/__init__.py +7 -1
  194. rasa/dialogue_understanding/generator/command_generator.py +4 -2
  195. rasa/dialogue_understanding/generator/command_parser.py +2 -2
  196. rasa/dialogue_understanding/generator/command_parser_validator.py +63 -0
  197. rasa/dialogue_understanding/generator/llm_based_command_generator.py +1 -2
  198. rasa/dialogue_understanding/generator/nlu_command_adapter.py +2 -2
  199. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +78 -0
  200. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +26 -461
  201. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +147 -0
  202. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +477 -0
  203. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +11 -64
  204. rasa/dialogue_understanding/patterns/cancel.py +1 -2
  205. rasa/dialogue_understanding/patterns/clarify.py +1 -1
  206. rasa/dialogue_understanding/patterns/correction.py +2 -2
  207. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +37 -25
  208. rasa/dialogue_understanding/patterns/domain_for_patterns.py +190 -0
  209. rasa/dialogue_understanding/processor/command_processor.py +6 -7
  210. rasa/dialogue_understanding/stack/utils.py +3 -1
  211. rasa/dialogue_understanding_test/command_metric_calculation.py +7 -40
  212. rasa/dialogue_understanding_test/command_metrics.py +38 -0
  213. rasa/dialogue_understanding_test/du_test_case.py +58 -25
  214. rasa/dialogue_understanding_test/du_test_result.py +228 -132
  215. rasa/dialogue_understanding_test/du_test_runner.py +11 -2
  216. rasa/dialogue_understanding_test/du_test_schema.yml +3 -3
  217. rasa/dialogue_understanding_test/io.py +35 -8
  218. rasa/e2e_test/e2e_test_runner.py +1 -1
  219. rasa/e2e_test/e2e_test_schema.yml +3 -3
  220. rasa/engine/constants.py +1 -1
  221. rasa/engine/graph.py +2 -2
  222. rasa/engine/recipes/default_recipe.py +1 -1
  223. rasa/engine/validation.py +3 -2
  224. rasa/hooks.py +2 -30
  225. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +1 -5
  226. rasa/model_manager/model_api.py +90 -2
  227. rasa/model_manager/socket_bridge.py +0 -7
  228. rasa/model_manager/trainer_service.py +15 -12
  229. rasa/plugin.py +2 -15
  230. rasa/privacy/__init__.py +0 -0
  231. rasa/privacy/constants.py +83 -0
  232. rasa/privacy/event_broker_utils.py +77 -0
  233. rasa/privacy/privacy_config.py +281 -0
  234. rasa/privacy/privacy_config_schema.json +86 -0
  235. rasa/privacy/privacy_filter.py +340 -0
  236. rasa/privacy/privacy_manager.py +576 -0
  237. rasa/server.py +23 -2
  238. rasa/shared/constants.py +14 -0
  239. rasa/shared/core/command_payload_reader.py +1 -5
  240. rasa/shared/core/constants.py +4 -3
  241. rasa/shared/core/domain.py +172 -11
  242. rasa/shared/core/events.py +100 -6
  243. rasa/shared/core/flows/flow.py +35 -8
  244. rasa/shared/core/flows/flow_step.py +26 -4
  245. rasa/shared/core/flows/flow_step_links.py +15 -0
  246. rasa/shared/core/flows/flow_step_sequence.py +6 -0
  247. rasa/shared/core/flows/flows_yaml_schema.json +3 -0
  248. rasa/shared/core/flows/nlu_trigger.py +13 -0
  249. rasa/shared/core/flows/steps/action.py +7 -4
  250. rasa/shared/core/flows/steps/call.py +11 -4
  251. rasa/shared/core/flows/steps/collect.py +71 -6
  252. rasa/shared/core/flows/steps/internal.py +6 -1
  253. rasa/shared/core/flows/steps/link.py +7 -4
  254. rasa/shared/core/flows/steps/no_operation.py +7 -4
  255. rasa/shared/core/flows/steps/set_slots.py +8 -4
  256. rasa/shared/core/flows/validation.py +16 -3
  257. rasa/shared/core/flows/yaml_flows_io.py +106 -5
  258. rasa/shared/core/slots.py +33 -1
  259. rasa/shared/core/trackers.py +4 -10
  260. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +1 -4
  261. rasa/shared/importers/importer.py +14 -0
  262. rasa/shared/importers/static.py +63 -0
  263. rasa/shared/providers/llm/default_litellm_llm_client.py +2 -2
  264. rasa/shared/utils/common.py +43 -1
  265. rasa/shared/utils/llm.py +155 -3
  266. rasa/shared/utils/yaml.py +32 -0
  267. rasa/studio/data_handler.py +3 -3
  268. rasa/studio/download/__init__.py +0 -0
  269. rasa/studio/download/domains.py +49 -0
  270. rasa/studio/download/download.py +416 -0
  271. rasa/studio/download/flows.py +351 -0
  272. rasa/studio/link.py +200 -0
  273. rasa/studio/pull.py +94 -0
  274. rasa/studio/push.py +131 -0
  275. rasa/studio/results_logger.py +6 -1
  276. rasa/studio/upload.py +185 -71
  277. rasa/telemetry.py +83 -26
  278. rasa/tracing/config.py +4 -5
  279. rasa/tracing/constants.py +19 -1
  280. rasa/tracing/instrumentation/attribute_extractors.py +47 -9
  281. rasa/tracing/instrumentation/instrumentation.py +54 -3
  282. rasa/tracing/instrumentation/metrics.py +98 -15
  283. rasa/tracing/metric_instrument_provider.py +75 -3
  284. rasa/utils/common.py +37 -27
  285. rasa/utils/endpoints.py +22 -1
  286. rasa/utils/licensing.py +2 -3
  287. rasa/utils/log_utils.py +1 -45
  288. rasa/validator.py +9 -11
  289. rasa/version.py +1 -1
  290. {rasa_pro-3.12.18.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/METADATA +12 -13
  291. {rasa_pro-3.12.18.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/RECORD +308 -283
  292. rasa/anonymization/__init__.py +0 -2
  293. rasa/anonymization/anonymisation_rule_yaml_reader.py +0 -91
  294. rasa/anonymization/anonymization_pipeline.py +0 -286
  295. rasa/anonymization/anonymization_rule_executor.py +0 -266
  296. rasa/anonymization/anonymization_rule_orchestrator.py +0 -119
  297. rasa/anonymization/schemas/config.yml +0 -47
  298. rasa/anonymization/utils.py +0 -118
  299. rasa/cli/project_templates/calm/config.yml +0 -10
  300. rasa/cli/project_templates/calm/credentials.yml +0 -33
  301. rasa/cli/project_templates/calm/endpoints.yml +0 -58
  302. rasa/cli/project_templates/default/actions/actions.py +0 -27
  303. rasa/cli/project_templates/default/data/nlu.yml +0 -91
  304. rasa/cli/project_templates/default/data/rules.yml +0 -13
  305. rasa/cli/project_templates/default/data/stories.yml +0 -30
  306. rasa/cli/project_templates/default/domain.yml +0 -34
  307. rasa/cli/project_templates/default/tests/test_stories.yml +0 -91
  308. rasa/core/channels/inspector/dist/assets/channel-dfa68278.js +0 -1
  309. rasa/core/channels/inspector/dist/assets/clone-edb7f119.js +0 -1
  310. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-65e7c670.js +0 -1
  311. rasa/core/channels/inspector/src/helpers/audiostream.ts +0 -191
  312. rasa/core/tracker_store.py +0 -1792
  313. rasa/studio/download.py +0 -489
  314. /rasa/{cli/project_templates/calm/actions → builder}/__init__.py +0 -0
  315. /rasa/cli/project_templates/{calm → default}/actions/action_template.py +0 -0
  316. /rasa/cli/project_templates/{calm → default}/actions/add_contact.py +0 -0
  317. /rasa/cli/project_templates/{calm → default}/actions/db.py +0 -0
  318. /rasa/cli/project_templates/{calm → default}/actions/list_contacts.py +0 -0
  319. /rasa/cli/project_templates/{calm → default}/actions/remove_contact.py +0 -0
  320. /rasa/cli/project_templates/{calm → default}/data/flows/add_contact.yml +0 -0
  321. /rasa/cli/project_templates/{calm → default}/data/flows/list_contacts.yml +0 -0
  322. /rasa/cli/project_templates/{calm → default}/data/flows/remove_contact.yml +0 -0
  323. /rasa/cli/project_templates/{calm → default}/db/contacts.json +0 -0
  324. /rasa/cli/project_templates/{calm → default}/domain/add_contact.yml +0 -0
  325. /rasa/cli/project_templates/{calm → default}/domain/list_contacts.yml +0 -0
  326. /rasa/cli/project_templates/{calm → default}/domain/remove_contact.yml +0 -0
  327. /rasa/cli/project_templates/{calm → default}/domain/shared.yml +0 -0
  328. {rasa_pro-3.12.18.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/NOTICE +0 -0
  329. {rasa_pro-3.12.18.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/WHEEL +0 -0
  330. {rasa_pro-3.12.18.dist-info → rasa_pro-3.13.0a1.dev1.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,77 @@
1
+ from typing import TYPE_CHECKING, List, Optional
2
+
3
+ import structlog
4
+
5
+ from rasa.core.brokers.broker import EventBroker
6
+ from rasa.utils.endpoints import EndpointConfig
7
+
8
+ if TYPE_CHECKING:
9
+ from asyncio import AbstractEventLoop
10
+
11
+ structlogger = structlog.get_logger(__name__)
12
+
13
+
14
+ async def create_event_brokers(
15
+ event_broker_endpoint: Optional[EndpointConfig],
16
+ event_loop: Optional["AbstractEventLoop"] = None,
17
+ ) -> List[EventBroker]:
18
+ """Create EventBroker objects for each anonymization topic or queue."""
19
+ if event_broker_endpoint is None or event_broker_endpoint.type is None:
20
+ structlogger.debug(
21
+ "rasa.privacy_filtering.create_event_broker.no_event_broker_type",
22
+ )
23
+ return []
24
+
25
+ if event_broker_endpoint.type == "kafka":
26
+ event_collection = event_broker_endpoint.kwargs.get("anonymization_topics", [])
27
+ event_collection_type = "topic"
28
+ elif event_broker_endpoint.type == "pika":
29
+ event_collection = event_broker_endpoint.kwargs.get("anonymization_queues", [])
30
+ event_collection_type = "queues"
31
+ else:
32
+ structlogger.debug(
33
+ "rasa.privacy_filtering.create_event_broker.unsupported_event_broker_type",
34
+ event_broker_type=event_broker_endpoint.type,
35
+ )
36
+ return []
37
+
38
+ if not event_collection:
39
+ structlogger.debug(
40
+ f"rasa.privacy_filtering.create_event_broker.no_anonymization_{event_collection_type}",
41
+ event_collection_type=event_collection_type,
42
+ )
43
+ return []
44
+
45
+ return await _create_event_brokers(
46
+ event_broker_endpoint, event_collection, event_collection_type, event_loop
47
+ )
48
+
49
+
50
+ async def _create_event_brokers(
51
+ event_broker_endpoint: EndpointConfig,
52
+ event_collection: List[str],
53
+ event_collection_type: str,
54
+ event_loop: Optional["AbstractEventLoop"] = None,
55
+ ) -> List[EventBroker]:
56
+ """Create event brokers."""
57
+ event_brokers = []
58
+ for item in event_collection:
59
+ event_broker_endpoint.kwargs[event_collection_type] = (
60
+ item if event_collection_type == "topic" else [item]
61
+ )
62
+ structlogger.debug(
63
+ "rasa.privacy_filtering.create_event_broker",
64
+ event_info=f"Setting anonymized event streaming to '{item}'.",
65
+ )
66
+
67
+ event_broker = await EventBroker.create(event_broker_endpoint, event_loop)
68
+ if event_broker is None:
69
+ structlogger.debug(
70
+ "rasa.privacy_filtering.create_event_broker.no_event_broker_created",
71
+ event_info=f"No event broker created for publishing to '{item}'.",
72
+ )
73
+ continue
74
+
75
+ event_brokers.append(event_broker)
76
+
77
+ return event_brokers
@@ -0,0 +1,281 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import sys
5
+ from enum import Enum
6
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional
7
+
8
+ import structlog
9
+ from apscheduler.triggers.cron import CronTrigger
10
+ from pydantic import BaseModel, ConfigDict
11
+
12
+ from rasa.constants import PACKAGE_NAME
13
+ from rasa.privacy.constants import (
14
+ ANONYMIZATION_KEY,
15
+ DELETION_KEY,
16
+ KEEP_LEFT_KEY,
17
+ KEEP_RIGHT_KEY,
18
+ PRIVACY_CONFIG_SCHEMA,
19
+ REDACTION_CHAR_KEY,
20
+ SLOT_KEY,
21
+ TRACKER_STORE_SETTINGS,
22
+ USER_CHAT_INACTIVITY_IN_MINUTES_ENV_VAR_NAME,
23
+ )
24
+ from rasa.shared.exceptions import RasaException
25
+ from rasa.shared.utils.io import read_json_file
26
+ from rasa.shared.utils.yaml import (
27
+ YamlValidationException,
28
+ validate_data_with_jsonschema,
29
+ )
30
+
31
+ if TYPE_CHECKING:
32
+ from rasa.shared.core.domain import Domain
33
+
34
+ structlogger = structlog.get_logger(__name__)
35
+
36
+
37
+ class AnonymizationType(Enum):
38
+ """Enum for the anonymization types."""
39
+
40
+ REDACT = "redact"
41
+ """Replaces the PII plaintext value with the same character
42
+ for the entire or partial length of the value."""
43
+ MASK = "mask"
44
+ """Replaces the PII plaintext value with the uppercase slot name
45
+ in square brackets, e.g. [CREDIT_CARD_NUMBER]."""
46
+
47
+
48
+ class AnonymizationMethod(BaseModel):
49
+ """Class for configuring the anonymization method."""
50
+
51
+ method_type: AnonymizationType
52
+ """The anonymization method to be used."""
53
+ redaction_char: str
54
+ """The character to use for redaction."""
55
+ keep_left: Optional[int] = None
56
+ """The number of characters to be kept intact on the left side."""
57
+ keep_right: Optional[int] = None
58
+ """The number of characters to be kept intact on the right side."""
59
+
60
+ @classmethod
61
+ def from_dict(cls, data: Dict[str, Any]) -> AnonymizationMethod:
62
+ """Create an AnonymizationMethod object from parsed data."""
63
+ method_type = AnonymizationType(
64
+ data.get("type", AnonymizationType.REDACT.value)
65
+ )
66
+ redaction_char = data.get(REDACTION_CHAR_KEY, "*")
67
+ keep_left = data.get(KEEP_LEFT_KEY)
68
+ keep_right = data.get(KEEP_RIGHT_KEY)
69
+
70
+ return cls(
71
+ method_type=method_type,
72
+ redaction_char=redaction_char,
73
+ keep_left=keep_left,
74
+ keep_right=keep_right,
75
+ )
76
+
77
+
78
+ class PrivacyPolicy(BaseModel):
79
+ """Parent class for configuring privacy policies."""
80
+
81
+ model_config = ConfigDict(arbitrary_types_allowed=True)
82
+
83
+ min_after_session_end: int
84
+ """Minimum time in minutes after session end before the policy is executed."""
85
+ cron: CronTrigger
86
+ """Cron trigger for periodic execution of the privacy policy."""
87
+
88
+ @classmethod
89
+ def from_dict(cls, data: Dict[str, Any]) -> PrivacyPolicy:
90
+ """Create an AnonymizationPolicy object from parsed data."""
91
+ min_after_session_end = data.get("min_after_session_end", 1)
92
+ validate_min_after_session_end(min_after_session_end)
93
+
94
+ cron_expression = get_cron_trigger(data.get("cron"))
95
+
96
+ return cls(
97
+ min_after_session_end=min_after_session_end,
98
+ cron=cron_expression,
99
+ )
100
+
101
+
102
+ class DeletionPolicy(PrivacyPolicy):
103
+ """Class for configuring periodic deletion in the tracker store."""
104
+
105
+ type: str = "deletion"
106
+
107
+
108
+ class AnonymizationPolicy(PrivacyPolicy):
109
+ """Class for configuring periodic anonymization in the tracker store."""
110
+
111
+ type: str = "anonymization"
112
+
113
+
114
+ class TrackerStoreSettings(BaseModel):
115
+ """Class for configuring tracker store settings."""
116
+
117
+ deletion_policy: Optional[DeletionPolicy] = None
118
+ """The deletion policy to be used."""
119
+ anonymization_policy: Optional[AnonymizationPolicy] = None
120
+ """The anonymization policy to be used."""
121
+
122
+ @classmethod
123
+ def from_dict(cls, data: Dict[str, Any]) -> TrackerStoreSettings:
124
+ """Create a TrackerStoreSettings object from parsed data."""
125
+ deletion_policy = data.get(DELETION_KEY)
126
+ anonymization_policy = data.get(ANONYMIZATION_KEY)
127
+
128
+ deletion_policy = (
129
+ DeletionPolicy.from_dict(deletion_policy) if deletion_policy else None
130
+ )
131
+ anonymization_policy = (
132
+ AnonymizationPolicy.from_dict(anonymization_policy)
133
+ if anonymization_policy
134
+ else None
135
+ )
136
+
137
+ validate_policies(deletion_policy, anonymization_policy)
138
+
139
+ return cls(
140
+ deletion_policy=deletion_policy,
141
+ anonymization_policy=anonymization_policy,
142
+ )
143
+
144
+
145
+ class PrivacyConfig(BaseModel):
146
+ """Class for configuring PII management."""
147
+
148
+ anonymization_rules: Dict[str, AnonymizationMethod]
149
+ """"Mapping of slot names to rules for anonymizing sensitive information."""
150
+ tracker_store_settings: Optional[TrackerStoreSettings] = None
151
+ """The tracker store settings to be used for periodic jobs
152
+ anonymizing and deleting conversation data in the tracker store."""
153
+
154
+ @classmethod
155
+ def from_dict(cls, data: Dict[str, Any]) -> PrivacyConfig:
156
+ """Create a PrivacyConfig object from parsed privacy config."""
157
+ # Validate the data against the schema
158
+ validate_privacy_config(data)
159
+
160
+ anonymization_rules = {
161
+ rule[SLOT_KEY]: AnonymizationMethod.from_dict(
162
+ rule.get(ANONYMIZATION_KEY, {})
163
+ )
164
+ for rule in data.get("rules", [])
165
+ }
166
+
167
+ tracker_store_settings = data.get(TRACKER_STORE_SETTINGS, {})
168
+ tracker_store_settings = (
169
+ TrackerStoreSettings.from_dict(tracker_store_settings)
170
+ if tracker_store_settings
171
+ else None
172
+ )
173
+ return cls(
174
+ anonymization_rules=anonymization_rules,
175
+ tracker_store_settings=tracker_store_settings,
176
+ )
177
+
178
+
179
+ def validate_privacy_config(data: Dict[str, Any]) -> None:
180
+ """Validate the privacy configuration."""
181
+ import importlib_resources
182
+
183
+ schema_file = str(
184
+ importlib_resources.files(PACKAGE_NAME).joinpath(PRIVACY_CONFIG_SCHEMA)
185
+ )
186
+ schema_content = read_json_file(schema_file)
187
+ try:
188
+ validate_data_with_jsonschema(data, schema_content)
189
+ except YamlValidationException as exception:
190
+ validation_errors = (
191
+ [error.message for error in exception.validation_errors]
192
+ if exception.validation_errors
193
+ else []
194
+ )
195
+ exception_message = exception.message
196
+ structlogger.error(
197
+ "privacy_config.invalid_privacy_config",
198
+ validation_errors=validation_errors,
199
+ event_info=f"Invalid privacy config: {exception_message}. "
200
+ f"Please check the configuration file.",
201
+ )
202
+ sys.exit(1)
203
+
204
+
205
+ def get_cron_trigger(cron_expression: str) -> CronTrigger:
206
+ """Validate the crontab expression."""
207
+ try:
208
+ cron = CronTrigger.from_crontab(cron_expression)
209
+ except Exception as exc:
210
+ structlogger.error(
211
+ "privacy_config.invalid_cron_expression",
212
+ cron=cron_expression,
213
+ )
214
+ raise RasaException from exc
215
+
216
+ return cron
217
+
218
+
219
+ def validate_min_after_session_end(min_after_session_end: int) -> None:
220
+ """Validate the minimum time after session end."""
221
+ try:
222
+ inactivity_period = int(
223
+ os.getenv(USER_CHAT_INACTIVITY_IN_MINUTES_ENV_VAR_NAME, "30")
224
+ )
225
+ except (ValueError, TypeError) as exc:
226
+ raise RasaException(
227
+ f"Invalid value for {USER_CHAT_INACTIVITY_IN_MINUTES_ENV_VAR_NAME} "
228
+ f"env var: {exc}."
229
+ )
230
+
231
+ if min_after_session_end < inactivity_period:
232
+ raise RasaException(
233
+ f"Minimum time in minutes after session end must be greater than "
234
+ f"{USER_CHAT_INACTIVITY_IN_MINUTES_ENV_VAR_NAME} env var value."
235
+ )
236
+
237
+
238
+ def validate_policies(
239
+ deletion_policy: Optional[DeletionPolicy],
240
+ anonymization_policy: Optional[AnonymizationPolicy],
241
+ ) -> None:
242
+ """Validate the deletion and anonymization policies' configurations."""
243
+ if not deletion_policy or not anonymization_policy:
244
+ return None
245
+
246
+ if (
247
+ deletion_policy.min_after_session_end
248
+ <= anonymization_policy.min_after_session_end
249
+ ):
250
+ raise RasaException(
251
+ "Minimum time in minutes after session end for deletion policy "
252
+ "must be greater than that of the anonymization policy."
253
+ )
254
+
255
+ if deletion_policy.cron.fields == anonymization_policy.cron.fields:
256
+ raise RasaException(
257
+ "Cron expressions for the deletion and anonymization policies "
258
+ "must be different."
259
+ )
260
+
261
+ return None
262
+
263
+
264
+ def validate_sensitive_slots(sensitive_slots: List[str], domain: "Domain") -> None:
265
+ """Validate the sensitive slots defined in the privacy config against the domain."""
266
+ all_slot_names = [slot.name for slot in domain.slots]
267
+ all_good = True
268
+ for sensitive_slot in sensitive_slots:
269
+ if sensitive_slot not in all_slot_names:
270
+ structlogger.error(
271
+ "privacy_config.invalid_sensitive_slot",
272
+ sensitive_slot=sensitive_slot,
273
+ event_info="Sensitive slot not found in the domain.",
274
+ )
275
+ all_good = False
276
+
277
+ if not all_good:
278
+ raise RasaException(
279
+ "Sensitive slots defined in the privacy config do not match "
280
+ "the slots defined in the domain. Please check the slot names."
281
+ )
@@ -0,0 +1,86 @@
1
+ {
2
+ "type": "object",
3
+ "required": [
4
+ "rules"
5
+ ],
6
+ "properties": {
7
+ "rules": {
8
+ "type": "array",
9
+ "items": {
10
+ "type": "object",
11
+ "properties": {
12
+ "slot": {
13
+ "type": "string"
14
+ },
15
+ "anonymization": {
16
+ "type": "object",
17
+ "properties": {
18
+ "type": {
19
+ "type": "string",
20
+ "enum": [
21
+ "redact",
22
+ "mask"
23
+ ]
24
+ },
25
+ "redaction_char": {
26
+ "type": "string",
27
+ "minLength": 1,
28
+ "maxLength": 1
29
+ },
30
+ "keep_left": {
31
+ "type": "number",
32
+ "exclusiveMinimum": 0
33
+ },
34
+ "keep_right": {
35
+ "type": "number",
36
+ "exclusiveMinimum": 0
37
+ }
38
+ },
39
+ "required": [
40
+ "type"
41
+ ]
42
+ }
43
+ },
44
+ "required": [
45
+ "slot",
46
+ "anonymization"
47
+ ],
48
+ "additionalProperties": false
49
+ }
50
+ },
51
+ "tracker_store_settings": {
52
+ "type": "object",
53
+ "properties": {
54
+ "deletion": {
55
+ "$ref": "#/$defs/trigger_settings"
56
+ },
57
+ "anonymization": {
58
+ "$ref": "#/$defs/trigger_settings"
59
+ }
60
+ }
61
+ }
62
+ },
63
+ "$defs": {
64
+ "trigger_settings": {
65
+ "type": "object",
66
+ "properties": {
67
+ "min_after_session_end": {
68
+ "type": "number",
69
+ "exclusiveMinimum": 0
70
+ },
71
+ "cron": {
72
+ "type": "string"
73
+ }
74
+ },
75
+ "additionalProperties": false,
76
+ "dependentRequired": {
77
+ "min_after_session_end": [
78
+ "cron"
79
+ ],
80
+ "cron": [
81
+ "min_after_session_end"
82
+ ]
83
+ }
84
+ }
85
+ }
86
+ }