rasa-pro 3.9.18__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 (662) hide show
  1. README.md +415 -0
  2. rasa/__init__.py +10 -0
  3. rasa/__main__.py +156 -0
  4. rasa/anonymization/__init__.py +2 -0
  5. rasa/anonymization/anonymisation_rule_yaml_reader.py +91 -0
  6. rasa/anonymization/anonymization_pipeline.py +286 -0
  7. rasa/anonymization/anonymization_rule_executor.py +260 -0
  8. rasa/anonymization/anonymization_rule_orchestrator.py +120 -0
  9. rasa/anonymization/schemas/config.yml +47 -0
  10. rasa/anonymization/utils.py +118 -0
  11. rasa/api.py +146 -0
  12. rasa/cli/__init__.py +5 -0
  13. rasa/cli/arguments/__init__.py +0 -0
  14. rasa/cli/arguments/data.py +81 -0
  15. rasa/cli/arguments/default_arguments.py +165 -0
  16. rasa/cli/arguments/evaluate.py +65 -0
  17. rasa/cli/arguments/export.py +51 -0
  18. rasa/cli/arguments/interactive.py +74 -0
  19. rasa/cli/arguments/run.py +204 -0
  20. rasa/cli/arguments/shell.py +13 -0
  21. rasa/cli/arguments/test.py +211 -0
  22. rasa/cli/arguments/train.py +263 -0
  23. rasa/cli/arguments/visualize.py +34 -0
  24. rasa/cli/arguments/x.py +30 -0
  25. rasa/cli/data.py +292 -0
  26. rasa/cli/e2e_test.py +586 -0
  27. rasa/cli/evaluate.py +222 -0
  28. rasa/cli/export.py +250 -0
  29. rasa/cli/inspect.py +63 -0
  30. rasa/cli/interactive.py +164 -0
  31. rasa/cli/license.py +65 -0
  32. rasa/cli/markers.py +78 -0
  33. rasa/cli/project_templates/__init__.py +0 -0
  34. rasa/cli/project_templates/calm/actions/__init__.py +0 -0
  35. rasa/cli/project_templates/calm/actions/action_template.py +27 -0
  36. rasa/cli/project_templates/calm/actions/add_contact.py +30 -0
  37. rasa/cli/project_templates/calm/actions/db.py +57 -0
  38. rasa/cli/project_templates/calm/actions/list_contacts.py +22 -0
  39. rasa/cli/project_templates/calm/actions/remove_contact.py +35 -0
  40. rasa/cli/project_templates/calm/config.yml +12 -0
  41. rasa/cli/project_templates/calm/credentials.yml +33 -0
  42. rasa/cli/project_templates/calm/data/flows/add_contact.yml +31 -0
  43. rasa/cli/project_templates/calm/data/flows/list_contacts.yml +14 -0
  44. rasa/cli/project_templates/calm/data/flows/remove_contact.yml +29 -0
  45. rasa/cli/project_templates/calm/db/contacts.json +10 -0
  46. rasa/cli/project_templates/calm/domain/add_contact.yml +39 -0
  47. rasa/cli/project_templates/calm/domain/list_contacts.yml +17 -0
  48. rasa/cli/project_templates/calm/domain/remove_contact.yml +38 -0
  49. rasa/cli/project_templates/calm/domain/shared.yml +10 -0
  50. rasa/cli/project_templates/calm/e2e_tests/cancelations/user_cancels_during_a_correction.yml +16 -0
  51. rasa/cli/project_templates/calm/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +7 -0
  52. rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_handle.yml +20 -0
  53. rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_name.yml +19 -0
  54. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +15 -0
  55. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_lists_contacts.yml +5 -0
  56. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact.yml +11 -0
  57. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact_from_list.yml +12 -0
  58. rasa/cli/project_templates/calm/endpoints.yml +45 -0
  59. rasa/cli/project_templates/default/actions/__init__.py +0 -0
  60. rasa/cli/project_templates/default/actions/actions.py +27 -0
  61. rasa/cli/project_templates/default/config.yml +44 -0
  62. rasa/cli/project_templates/default/credentials.yml +33 -0
  63. rasa/cli/project_templates/default/data/nlu.yml +91 -0
  64. rasa/cli/project_templates/default/data/rules.yml +13 -0
  65. rasa/cli/project_templates/default/data/stories.yml +30 -0
  66. rasa/cli/project_templates/default/domain.yml +34 -0
  67. rasa/cli/project_templates/default/endpoints.yml +42 -0
  68. rasa/cli/project_templates/default/tests/test_stories.yml +91 -0
  69. rasa/cli/project_templates/tutorial/actions.py +22 -0
  70. rasa/cli/project_templates/tutorial/config.yml +11 -0
  71. rasa/cli/project_templates/tutorial/credentials.yml +33 -0
  72. rasa/cli/project_templates/tutorial/data/flows.yml +8 -0
  73. rasa/cli/project_templates/tutorial/data/patterns.yml +6 -0
  74. rasa/cli/project_templates/tutorial/domain.yml +21 -0
  75. rasa/cli/project_templates/tutorial/endpoints.yml +45 -0
  76. rasa/cli/run.py +135 -0
  77. rasa/cli/scaffold.py +269 -0
  78. rasa/cli/shell.py +141 -0
  79. rasa/cli/studio/__init__.py +0 -0
  80. rasa/cli/studio/download.py +62 -0
  81. rasa/cli/studio/studio.py +266 -0
  82. rasa/cli/studio/train.py +59 -0
  83. rasa/cli/studio/upload.py +77 -0
  84. rasa/cli/telemetry.py +102 -0
  85. rasa/cli/test.py +280 -0
  86. rasa/cli/train.py +260 -0
  87. rasa/cli/utils.py +464 -0
  88. rasa/cli/visualize.py +40 -0
  89. rasa/cli/x.py +206 -0
  90. rasa/constants.py +37 -0
  91. rasa/core/__init__.py +17 -0
  92. rasa/core/actions/__init__.py +0 -0
  93. rasa/core/actions/action.py +1225 -0
  94. rasa/core/actions/action_clean_stack.py +59 -0
  95. rasa/core/actions/action_exceptions.py +24 -0
  96. rasa/core/actions/action_run_slot_rejections.py +207 -0
  97. rasa/core/actions/action_trigger_chitchat.py +31 -0
  98. rasa/core/actions/action_trigger_flow.py +109 -0
  99. rasa/core/actions/action_trigger_search.py +31 -0
  100. rasa/core/actions/constants.py +5 -0
  101. rasa/core/actions/custom_action_executor.py +188 -0
  102. rasa/core/actions/forms.py +741 -0
  103. rasa/core/actions/grpc_custom_action_executor.py +251 -0
  104. rasa/core/actions/http_custom_action_executor.py +140 -0
  105. rasa/core/actions/loops.py +114 -0
  106. rasa/core/actions/two_stage_fallback.py +186 -0
  107. rasa/core/agent.py +555 -0
  108. rasa/core/auth_retry_tracker_store.py +122 -0
  109. rasa/core/brokers/__init__.py +0 -0
  110. rasa/core/brokers/broker.py +126 -0
  111. rasa/core/brokers/file.py +58 -0
  112. rasa/core/brokers/kafka.py +322 -0
  113. rasa/core/brokers/pika.py +386 -0
  114. rasa/core/brokers/sql.py +86 -0
  115. rasa/core/channels/__init__.py +55 -0
  116. rasa/core/channels/audiocodes.py +463 -0
  117. rasa/core/channels/botframework.py +338 -0
  118. rasa/core/channels/callback.py +84 -0
  119. rasa/core/channels/channel.py +419 -0
  120. rasa/core/channels/console.py +241 -0
  121. rasa/core/channels/development_inspector.py +93 -0
  122. rasa/core/channels/facebook.py +419 -0
  123. rasa/core/channels/hangouts.py +329 -0
  124. rasa/core/channels/inspector/.eslintrc.cjs +25 -0
  125. rasa/core/channels/inspector/.gitignore +23 -0
  126. rasa/core/channels/inspector/README.md +54 -0
  127. rasa/core/channels/inspector/assets/favicon.ico +0 -0
  128. rasa/core/channels/inspector/assets/rasa-chat.js +2 -0
  129. rasa/core/channels/inspector/custom.d.ts +3 -0
  130. rasa/core/channels/inspector/dist/assets/arc-b6e548fe.js +1 -0
  131. rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
  132. rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-fa03ac9e.js +10 -0
  133. rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-ee67392a.js +2 -0
  134. rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-9b283fae.js +2 -0
  135. rasa/core/channels/inspector/dist/assets/createText-62fc7601-8b6fcc2a.js +7 -0
  136. rasa/core/channels/inspector/dist/assets/edges-f2ad444c-22e77f4f.js +4 -0
  137. rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-60ffc87f.js +51 -0
  138. rasa/core/channels/inspector/dist/assets/flowDb-1972c806-9dd802e4.js +6 -0
  139. rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-5fa1912f.js +4 -0
  140. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-1844e5a5.js +1 -0
  141. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-622a1fd2.js +139 -0
  142. rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-e285a63a.js +266 -0
  143. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-f237bdca.js +70 -0
  144. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-128cfa44.ttf +0 -0
  145. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-21dbcb97.woff +0 -0
  146. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-222b5e26.svg +329 -0
  147. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-9ad89b2a.woff2 +0 -0
  148. rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-4b03d70e.js +1 -0
  149. rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
  150. rasa/core/channels/inspector/dist/assets/index-a5d3e69d.js +1040 -0
  151. rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-72a0fa5f.js +7 -0
  152. rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
  153. rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-82218c41.js +139 -0
  154. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-60c05ee4.woff +0 -0
  155. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-8335d9b8.svg +438 -0
  156. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-9cc39c75.ttf +0 -0
  157. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-ead13ccf.woff2 +0 -0
  158. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-16705655.woff2 +0 -0
  159. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-5aeb07f9.woff +0 -0
  160. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9c459044.ttf +0 -0
  161. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9e2898a4.svg +435 -0
  162. rasa/core/channels/inspector/dist/assets/layout-78cff630.js +1 -0
  163. rasa/core/channels/inspector/dist/assets/line-5038b469.js +1 -0
  164. rasa/core/channels/inspector/dist/assets/linear-c4fc4098.js +1 -0
  165. rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-c33c8ea6.js +109 -0
  166. rasa/core/channels/inspector/dist/assets/ordinal-ba9b4969.js +1 -0
  167. rasa/core/channels/inspector/dist/assets/path-53f90ab3.js +1 -0
  168. rasa/core/channels/inspector/dist/assets/pieDiagram-dbbf0591-a8d03059.js +35 -0
  169. rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-6a0e56b2.js +7 -0
  170. rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-2dc7c7bd.js +52 -0
  171. rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-2360fe39.js +8 -0
  172. rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-41b9f9ad.js +122 -0
  173. rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-0aad326f.js +1 -0
  174. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-9847d984.js +1 -0
  175. rasa/core/channels/inspector/dist/assets/styles-080da4f6-564d890e.js +110 -0
  176. rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-38957613.js +159 -0
  177. rasa/core/channels/inspector/dist/assets/styles-9c745c82-f0fc6921.js +207 -0
  178. rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-ef3c5a77.js +1 -0
  179. rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-bf3e91c1.js +61 -0
  180. rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-4d4026c0.js +7 -0
  181. rasa/core/channels/inspector/dist/index.html +41 -0
  182. rasa/core/channels/inspector/index.html +39 -0
  183. rasa/core/channels/inspector/jest.config.ts +13 -0
  184. rasa/core/channels/inspector/package.json +48 -0
  185. rasa/core/channels/inspector/setupTests.ts +2 -0
  186. rasa/core/channels/inspector/src/App.tsx +170 -0
  187. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +107 -0
  188. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
  189. rasa/core/channels/inspector/src/components/DialogueStack.tsx +151 -0
  190. rasa/core/channels/inspector/src/components/ExpandIcon.tsx +16 -0
  191. rasa/core/channels/inspector/src/components/FullscreenButton.tsx +45 -0
  192. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +19 -0
  193. rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +21 -0
  194. rasa/core/channels/inspector/src/components/RasaLogo.tsx +32 -0
  195. rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +39 -0
  196. rasa/core/channels/inspector/src/components/Slots.tsx +91 -0
  197. rasa/core/channels/inspector/src/components/Welcome.tsx +54 -0
  198. rasa/core/channels/inspector/src/helpers/formatters.test.ts +382 -0
  199. rasa/core/channels/inspector/src/helpers/formatters.ts +240 -0
  200. rasa/core/channels/inspector/src/helpers/utils.ts +42 -0
  201. rasa/core/channels/inspector/src/main.tsx +13 -0
  202. rasa/core/channels/inspector/src/theme/Button/Button.ts +29 -0
  203. rasa/core/channels/inspector/src/theme/Heading/Heading.ts +31 -0
  204. rasa/core/channels/inspector/src/theme/Input/Input.ts +27 -0
  205. rasa/core/channels/inspector/src/theme/Link/Link.ts +10 -0
  206. rasa/core/channels/inspector/src/theme/Modal/Modal.ts +47 -0
  207. rasa/core/channels/inspector/src/theme/Table/Table.tsx +38 -0
  208. rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +12 -0
  209. rasa/core/channels/inspector/src/theme/base/breakpoints.ts +8 -0
  210. rasa/core/channels/inspector/src/theme/base/colors.ts +88 -0
  211. rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +29 -0
  212. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.eot +0 -0
  213. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.svg +329 -0
  214. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.ttf +0 -0
  215. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff +0 -0
  216. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff2 +0 -0
  217. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.eot +0 -0
  218. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.svg +438 -0
  219. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.ttf +0 -0
  220. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff +0 -0
  221. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff2 +0 -0
  222. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.eot +0 -0
  223. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.svg +435 -0
  224. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.ttf +0 -0
  225. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff +0 -0
  226. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff2 +0 -0
  227. rasa/core/channels/inspector/src/theme/base/radii.ts +9 -0
  228. rasa/core/channels/inspector/src/theme/base/shadows.ts +7 -0
  229. rasa/core/channels/inspector/src/theme/base/sizes.ts +7 -0
  230. rasa/core/channels/inspector/src/theme/base/space.ts +15 -0
  231. rasa/core/channels/inspector/src/theme/base/styles.ts +13 -0
  232. rasa/core/channels/inspector/src/theme/base/typography.ts +24 -0
  233. rasa/core/channels/inspector/src/theme/base/zIndices.ts +19 -0
  234. rasa/core/channels/inspector/src/theme/index.ts +101 -0
  235. rasa/core/channels/inspector/src/types.ts +64 -0
  236. rasa/core/channels/inspector/src/vite-env.d.ts +1 -0
  237. rasa/core/channels/inspector/tests/__mocks__/fileMock.ts +1 -0
  238. rasa/core/channels/inspector/tests/__mocks__/matchMedia.ts +16 -0
  239. rasa/core/channels/inspector/tests/__mocks__/styleMock.ts +1 -0
  240. rasa/core/channels/inspector/tests/renderWithProviders.tsx +14 -0
  241. rasa/core/channels/inspector/tsconfig.json +26 -0
  242. rasa/core/channels/inspector/tsconfig.node.json +10 -0
  243. rasa/core/channels/inspector/vite.config.ts +8 -0
  244. rasa/core/channels/inspector/yarn.lock +6156 -0
  245. rasa/core/channels/mattermost.py +229 -0
  246. rasa/core/channels/rasa_chat.py +126 -0
  247. rasa/core/channels/rest.py +225 -0
  248. rasa/core/channels/rocketchat.py +174 -0
  249. rasa/core/channels/slack.py +620 -0
  250. rasa/core/channels/socketio.py +274 -0
  251. rasa/core/channels/telegram.py +298 -0
  252. rasa/core/channels/twilio.py +169 -0
  253. rasa/core/channels/twilio_voice.py +367 -0
  254. rasa/core/channels/vier_cvg.py +374 -0
  255. rasa/core/channels/webexteams.py +134 -0
  256. rasa/core/concurrent_lock_store.py +210 -0
  257. rasa/core/constants.py +107 -0
  258. rasa/core/evaluation/__init__.py +0 -0
  259. rasa/core/evaluation/marker.py +267 -0
  260. rasa/core/evaluation/marker_base.py +923 -0
  261. rasa/core/evaluation/marker_stats.py +293 -0
  262. rasa/core/evaluation/marker_tracker_loader.py +103 -0
  263. rasa/core/exceptions.py +29 -0
  264. rasa/core/exporter.py +284 -0
  265. rasa/core/featurizers/__init__.py +0 -0
  266. rasa/core/featurizers/precomputation.py +410 -0
  267. rasa/core/featurizers/single_state_featurizer.py +421 -0
  268. rasa/core/featurizers/tracker_featurizers.py +1262 -0
  269. rasa/core/http_interpreter.py +89 -0
  270. rasa/core/information_retrieval/__init__.py +7 -0
  271. rasa/core/information_retrieval/faiss.py +121 -0
  272. rasa/core/information_retrieval/information_retrieval.py +129 -0
  273. rasa/core/information_retrieval/milvus.py +52 -0
  274. rasa/core/information_retrieval/qdrant.py +95 -0
  275. rasa/core/jobs.py +63 -0
  276. rasa/core/lock.py +139 -0
  277. rasa/core/lock_store.py +343 -0
  278. rasa/core/migrate.py +403 -0
  279. rasa/core/nlg/__init__.py +3 -0
  280. rasa/core/nlg/callback.py +146 -0
  281. rasa/core/nlg/contextual_response_rephraser.py +270 -0
  282. rasa/core/nlg/generator.py +230 -0
  283. rasa/core/nlg/interpolator.py +143 -0
  284. rasa/core/nlg/response.py +155 -0
  285. rasa/core/nlg/summarize.py +69 -0
  286. rasa/core/policies/__init__.py +0 -0
  287. rasa/core/policies/ensemble.py +329 -0
  288. rasa/core/policies/enterprise_search_policy.py +781 -0
  289. rasa/core/policies/enterprise_search_prompt_template.jinja2 +25 -0
  290. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +60 -0
  291. rasa/core/policies/flow_policy.py +205 -0
  292. rasa/core/policies/flows/__init__.py +0 -0
  293. rasa/core/policies/flows/flow_exceptions.py +44 -0
  294. rasa/core/policies/flows/flow_executor.py +705 -0
  295. rasa/core/policies/flows/flow_step_result.py +43 -0
  296. rasa/core/policies/intentless_policy.py +922 -0
  297. rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
  298. rasa/core/policies/memoization.py +538 -0
  299. rasa/core/policies/policy.py +725 -0
  300. rasa/core/policies/rule_policy.py +1273 -0
  301. rasa/core/policies/ted_policy.py +2169 -0
  302. rasa/core/policies/unexpected_intent_policy.py +1022 -0
  303. rasa/core/processor.py +1422 -0
  304. rasa/core/run.py +331 -0
  305. rasa/core/secrets_manager/__init__.py +0 -0
  306. rasa/core/secrets_manager/constants.py +32 -0
  307. rasa/core/secrets_manager/endpoints.py +391 -0
  308. rasa/core/secrets_manager/factory.py +233 -0
  309. rasa/core/secrets_manager/secret_manager.py +262 -0
  310. rasa/core/secrets_manager/vault.py +574 -0
  311. rasa/core/test.py +1335 -0
  312. rasa/core/tracker_store.py +1699 -0
  313. rasa/core/train.py +105 -0
  314. rasa/core/training/__init__.py +89 -0
  315. rasa/core/training/converters/__init__.py +0 -0
  316. rasa/core/training/converters/responses_prefix_converter.py +119 -0
  317. rasa/core/training/interactive.py +1745 -0
  318. rasa/core/training/story_conflict.py +381 -0
  319. rasa/core/training/training.py +93 -0
  320. rasa/core/utils.py +339 -0
  321. rasa/core/visualize.py +70 -0
  322. rasa/dialogue_understanding/__init__.py +0 -0
  323. rasa/dialogue_understanding/coexistence/__init__.py +0 -0
  324. rasa/dialogue_understanding/coexistence/constants.py +4 -0
  325. rasa/dialogue_understanding/coexistence/intent_based_router.py +196 -0
  326. rasa/dialogue_understanding/coexistence/llm_based_router.py +260 -0
  327. rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
  328. rasa/dialogue_understanding/commands/__init__.py +49 -0
  329. rasa/dialogue_understanding/commands/can_not_handle_command.py +70 -0
  330. rasa/dialogue_understanding/commands/cancel_flow_command.py +125 -0
  331. rasa/dialogue_understanding/commands/change_flow_command.py +44 -0
  332. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +57 -0
  333. rasa/dialogue_understanding/commands/clarify_command.py +86 -0
  334. rasa/dialogue_understanding/commands/command.py +85 -0
  335. rasa/dialogue_understanding/commands/correct_slots_command.py +297 -0
  336. rasa/dialogue_understanding/commands/error_command.py +79 -0
  337. rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
  338. rasa/dialogue_understanding/commands/handle_code_change_command.py +73 -0
  339. rasa/dialogue_understanding/commands/human_handoff_command.py +66 -0
  340. rasa/dialogue_understanding/commands/knowledge_answer_command.py +57 -0
  341. rasa/dialogue_understanding/commands/noop_command.py +54 -0
  342. rasa/dialogue_understanding/commands/set_slot_command.py +160 -0
  343. rasa/dialogue_understanding/commands/skip_question_command.py +75 -0
  344. rasa/dialogue_understanding/commands/start_flow_command.py +107 -0
  345. rasa/dialogue_understanding/generator/__init__.py +21 -0
  346. rasa/dialogue_understanding/generator/command_generator.py +343 -0
  347. rasa/dialogue_understanding/generator/constants.py +18 -0
  348. rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
  349. rasa/dialogue_understanding/generator/flow_retrieval.py +412 -0
  350. rasa/dialogue_understanding/generator/llm_based_command_generator.py +467 -0
  351. rasa/dialogue_understanding/generator/llm_command_generator.py +67 -0
  352. rasa/dialogue_understanding/generator/multi_step/__init__.py +0 -0
  353. rasa/dialogue_understanding/generator/multi_step/fill_slots_prompt.jinja2 +62 -0
  354. rasa/dialogue_understanding/generator/multi_step/handle_flows_prompt.jinja2 +38 -0
  355. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +827 -0
  356. rasa/dialogue_understanding/generator/nlu_command_adapter.py +218 -0
  357. rasa/dialogue_understanding/generator/single_step/__init__.py +0 -0
  358. rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2 +57 -0
  359. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +345 -0
  360. rasa/dialogue_understanding/patterns/__init__.py +0 -0
  361. rasa/dialogue_understanding/patterns/cancel.py +111 -0
  362. rasa/dialogue_understanding/patterns/cannot_handle.py +43 -0
  363. rasa/dialogue_understanding/patterns/chitchat.py +37 -0
  364. rasa/dialogue_understanding/patterns/clarify.py +97 -0
  365. rasa/dialogue_understanding/patterns/code_change.py +41 -0
  366. rasa/dialogue_understanding/patterns/collect_information.py +90 -0
  367. rasa/dialogue_understanding/patterns/completed.py +40 -0
  368. rasa/dialogue_understanding/patterns/continue_interrupted.py +42 -0
  369. rasa/dialogue_understanding/patterns/correction.py +278 -0
  370. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +248 -0
  371. rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
  372. rasa/dialogue_understanding/patterns/internal_error.py +47 -0
  373. rasa/dialogue_understanding/patterns/search.py +37 -0
  374. rasa/dialogue_understanding/patterns/skip_question.py +38 -0
  375. rasa/dialogue_understanding/processor/__init__.py +0 -0
  376. rasa/dialogue_understanding/processor/command_processor.py +687 -0
  377. rasa/dialogue_understanding/processor/command_processor_component.py +39 -0
  378. rasa/dialogue_understanding/stack/__init__.py +0 -0
  379. rasa/dialogue_understanding/stack/dialogue_stack.py +178 -0
  380. rasa/dialogue_understanding/stack/frames/__init__.py +19 -0
  381. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +27 -0
  382. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +137 -0
  383. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +157 -0
  384. rasa/dialogue_understanding/stack/frames/pattern_frame.py +10 -0
  385. rasa/dialogue_understanding/stack/frames/search_frame.py +27 -0
  386. rasa/dialogue_understanding/stack/utils.py +211 -0
  387. rasa/e2e_test/__init__.py +0 -0
  388. rasa/e2e_test/constants.py +11 -0
  389. rasa/e2e_test/e2e_test_case.py +366 -0
  390. rasa/e2e_test/e2e_test_result.py +34 -0
  391. rasa/e2e_test/e2e_test_runner.py +768 -0
  392. rasa/e2e_test/e2e_test_schema.yml +85 -0
  393. rasa/engine/__init__.py +0 -0
  394. rasa/engine/caching.py +463 -0
  395. rasa/engine/constants.py +17 -0
  396. rasa/engine/exceptions.py +14 -0
  397. rasa/engine/graph.py +637 -0
  398. rasa/engine/loader.py +36 -0
  399. rasa/engine/recipes/__init__.py +0 -0
  400. rasa/engine/recipes/config_files/default_config.yml +44 -0
  401. rasa/engine/recipes/default_components.py +99 -0
  402. rasa/engine/recipes/default_recipe.py +1251 -0
  403. rasa/engine/recipes/graph_recipe.py +79 -0
  404. rasa/engine/recipes/recipe.py +93 -0
  405. rasa/engine/runner/__init__.py +0 -0
  406. rasa/engine/runner/dask.py +250 -0
  407. rasa/engine/runner/interface.py +49 -0
  408. rasa/engine/storage/__init__.py +0 -0
  409. rasa/engine/storage/local_model_storage.py +246 -0
  410. rasa/engine/storage/resource.py +110 -0
  411. rasa/engine/storage/storage.py +203 -0
  412. rasa/engine/training/__init__.py +0 -0
  413. rasa/engine/training/components.py +176 -0
  414. rasa/engine/training/fingerprinting.py +64 -0
  415. rasa/engine/training/graph_trainer.py +256 -0
  416. rasa/engine/training/hooks.py +164 -0
  417. rasa/engine/validation.py +873 -0
  418. rasa/env.py +5 -0
  419. rasa/exceptions.py +69 -0
  420. rasa/graph_components/__init__.py +0 -0
  421. rasa/graph_components/converters/__init__.py +0 -0
  422. rasa/graph_components/converters/nlu_message_converter.py +48 -0
  423. rasa/graph_components/providers/__init__.py +0 -0
  424. rasa/graph_components/providers/domain_for_core_training_provider.py +87 -0
  425. rasa/graph_components/providers/domain_provider.py +71 -0
  426. rasa/graph_components/providers/flows_provider.py +74 -0
  427. rasa/graph_components/providers/forms_provider.py +44 -0
  428. rasa/graph_components/providers/nlu_training_data_provider.py +56 -0
  429. rasa/graph_components/providers/responses_provider.py +44 -0
  430. rasa/graph_components/providers/rule_only_provider.py +49 -0
  431. rasa/graph_components/providers/story_graph_provider.py +43 -0
  432. rasa/graph_components/providers/training_tracker_provider.py +55 -0
  433. rasa/graph_components/validators/__init__.py +0 -0
  434. rasa/graph_components/validators/default_recipe_validator.py +550 -0
  435. rasa/graph_components/validators/finetuning_validator.py +302 -0
  436. rasa/hooks.py +112 -0
  437. rasa/jupyter.py +63 -0
  438. rasa/markers/__init__.py +0 -0
  439. rasa/markers/marker.py +269 -0
  440. rasa/markers/marker_base.py +828 -0
  441. rasa/markers/upload.py +74 -0
  442. rasa/markers/validate.py +21 -0
  443. rasa/model.py +118 -0
  444. rasa/model_testing.py +457 -0
  445. rasa/model_training.py +536 -0
  446. rasa/nlu/__init__.py +7 -0
  447. rasa/nlu/classifiers/__init__.py +3 -0
  448. rasa/nlu/classifiers/classifier.py +5 -0
  449. rasa/nlu/classifiers/diet_classifier.py +1881 -0
  450. rasa/nlu/classifiers/fallback_classifier.py +192 -0
  451. rasa/nlu/classifiers/keyword_intent_classifier.py +188 -0
  452. rasa/nlu/classifiers/llm_intent_classifier.py +519 -0
  453. rasa/nlu/classifiers/logistic_regression_classifier.py +253 -0
  454. rasa/nlu/classifiers/mitie_intent_classifier.py +156 -0
  455. rasa/nlu/classifiers/regex_message_handler.py +56 -0
  456. rasa/nlu/classifiers/sklearn_intent_classifier.py +330 -0
  457. rasa/nlu/constants.py +77 -0
  458. rasa/nlu/convert.py +40 -0
  459. rasa/nlu/emulators/__init__.py +0 -0
  460. rasa/nlu/emulators/dialogflow.py +55 -0
  461. rasa/nlu/emulators/emulator.py +49 -0
  462. rasa/nlu/emulators/luis.py +86 -0
  463. rasa/nlu/emulators/no_emulator.py +10 -0
  464. rasa/nlu/emulators/wit.py +56 -0
  465. rasa/nlu/extractors/__init__.py +0 -0
  466. rasa/nlu/extractors/crf_entity_extractor.py +715 -0
  467. rasa/nlu/extractors/duckling_entity_extractor.py +206 -0
  468. rasa/nlu/extractors/entity_synonyms.py +178 -0
  469. rasa/nlu/extractors/extractor.py +470 -0
  470. rasa/nlu/extractors/mitie_entity_extractor.py +293 -0
  471. rasa/nlu/extractors/regex_entity_extractor.py +220 -0
  472. rasa/nlu/extractors/spacy_entity_extractor.py +95 -0
  473. rasa/nlu/featurizers/__init__.py +0 -0
  474. rasa/nlu/featurizers/dense_featurizer/__init__.py +0 -0
  475. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +445 -0
  476. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
  477. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +768 -0
  478. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +170 -0
  479. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +132 -0
  480. rasa/nlu/featurizers/featurizer.py +89 -0
  481. rasa/nlu/featurizers/sparse_featurizer/__init__.py +0 -0
  482. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +867 -0
  483. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +571 -0
  484. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +271 -0
  485. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
  486. rasa/nlu/model.py +24 -0
  487. rasa/nlu/persistor.py +282 -0
  488. rasa/nlu/run.py +27 -0
  489. rasa/nlu/selectors/__init__.py +0 -0
  490. rasa/nlu/selectors/response_selector.py +987 -0
  491. rasa/nlu/test.py +1940 -0
  492. rasa/nlu/tokenizers/__init__.py +0 -0
  493. rasa/nlu/tokenizers/jieba_tokenizer.py +148 -0
  494. rasa/nlu/tokenizers/mitie_tokenizer.py +75 -0
  495. rasa/nlu/tokenizers/spacy_tokenizer.py +72 -0
  496. rasa/nlu/tokenizers/tokenizer.py +239 -0
  497. rasa/nlu/tokenizers/whitespace_tokenizer.py +106 -0
  498. rasa/nlu/utils/__init__.py +35 -0
  499. rasa/nlu/utils/bilou_utils.py +462 -0
  500. rasa/nlu/utils/hugging_face/__init__.py +0 -0
  501. rasa/nlu/utils/hugging_face/registry.py +108 -0
  502. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +311 -0
  503. rasa/nlu/utils/mitie_utils.py +113 -0
  504. rasa/nlu/utils/pattern_utils.py +168 -0
  505. rasa/nlu/utils/spacy_utils.py +310 -0
  506. rasa/plugin.py +90 -0
  507. rasa/server.py +1551 -0
  508. rasa/shared/__init__.py +0 -0
  509. rasa/shared/constants.py +192 -0
  510. rasa/shared/core/__init__.py +0 -0
  511. rasa/shared/core/command_payload_reader.py +109 -0
  512. rasa/shared/core/constants.py +167 -0
  513. rasa/shared/core/conversation.py +46 -0
  514. rasa/shared/core/domain.py +2107 -0
  515. rasa/shared/core/events.py +2504 -0
  516. rasa/shared/core/flows/__init__.py +7 -0
  517. rasa/shared/core/flows/flow.py +362 -0
  518. rasa/shared/core/flows/flow_step.py +146 -0
  519. rasa/shared/core/flows/flow_step_links.py +319 -0
  520. rasa/shared/core/flows/flow_step_sequence.py +70 -0
  521. rasa/shared/core/flows/flows_list.py +223 -0
  522. rasa/shared/core/flows/flows_yaml_schema.json +217 -0
  523. rasa/shared/core/flows/nlu_trigger.py +117 -0
  524. rasa/shared/core/flows/steps/__init__.py +24 -0
  525. rasa/shared/core/flows/steps/action.py +56 -0
  526. rasa/shared/core/flows/steps/call.py +64 -0
  527. rasa/shared/core/flows/steps/collect.py +112 -0
  528. rasa/shared/core/flows/steps/constants.py +5 -0
  529. rasa/shared/core/flows/steps/continuation.py +36 -0
  530. rasa/shared/core/flows/steps/end.py +22 -0
  531. rasa/shared/core/flows/steps/internal.py +44 -0
  532. rasa/shared/core/flows/steps/link.py +51 -0
  533. rasa/shared/core/flows/steps/no_operation.py +48 -0
  534. rasa/shared/core/flows/steps/set_slots.py +50 -0
  535. rasa/shared/core/flows/steps/start.py +30 -0
  536. rasa/shared/core/flows/validation.py +527 -0
  537. rasa/shared/core/flows/yaml_flows_io.py +278 -0
  538. rasa/shared/core/generator.py +908 -0
  539. rasa/shared/core/slot_mappings.py +526 -0
  540. rasa/shared/core/slots.py +649 -0
  541. rasa/shared/core/trackers.py +1177 -0
  542. rasa/shared/core/training_data/__init__.py +0 -0
  543. rasa/shared/core/training_data/loading.py +89 -0
  544. rasa/shared/core/training_data/story_reader/__init__.py +0 -0
  545. rasa/shared/core/training_data/story_reader/story_reader.py +129 -0
  546. rasa/shared/core/training_data/story_reader/story_step_builder.py +168 -0
  547. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +888 -0
  548. rasa/shared/core/training_data/story_writer/__init__.py +0 -0
  549. rasa/shared/core/training_data/story_writer/story_writer.py +76 -0
  550. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +444 -0
  551. rasa/shared/core/training_data/structures.py +838 -0
  552. rasa/shared/core/training_data/visualization.html +146 -0
  553. rasa/shared/core/training_data/visualization.py +603 -0
  554. rasa/shared/data.py +249 -0
  555. rasa/shared/engine/__init__.py +0 -0
  556. rasa/shared/engine/caching.py +26 -0
  557. rasa/shared/exceptions.py +163 -0
  558. rasa/shared/importers/__init__.py +0 -0
  559. rasa/shared/importers/importer.py +704 -0
  560. rasa/shared/importers/multi_project.py +203 -0
  561. rasa/shared/importers/rasa.py +99 -0
  562. rasa/shared/importers/utils.py +34 -0
  563. rasa/shared/nlu/__init__.py +0 -0
  564. rasa/shared/nlu/constants.py +47 -0
  565. rasa/shared/nlu/interpreter.py +10 -0
  566. rasa/shared/nlu/training_data/__init__.py +0 -0
  567. rasa/shared/nlu/training_data/entities_parser.py +208 -0
  568. rasa/shared/nlu/training_data/features.py +492 -0
  569. rasa/shared/nlu/training_data/formats/__init__.py +10 -0
  570. rasa/shared/nlu/training_data/formats/dialogflow.py +163 -0
  571. rasa/shared/nlu/training_data/formats/luis.py +87 -0
  572. rasa/shared/nlu/training_data/formats/rasa.py +135 -0
  573. rasa/shared/nlu/training_data/formats/rasa_yaml.py +603 -0
  574. rasa/shared/nlu/training_data/formats/readerwriter.py +244 -0
  575. rasa/shared/nlu/training_data/formats/wit.py +52 -0
  576. rasa/shared/nlu/training_data/loading.py +137 -0
  577. rasa/shared/nlu/training_data/lookup_tables_parser.py +30 -0
  578. rasa/shared/nlu/training_data/message.py +490 -0
  579. rasa/shared/nlu/training_data/schemas/__init__.py +0 -0
  580. rasa/shared/nlu/training_data/schemas/data_schema.py +85 -0
  581. rasa/shared/nlu/training_data/schemas/nlu.yml +53 -0
  582. rasa/shared/nlu/training_data/schemas/responses.yml +70 -0
  583. rasa/shared/nlu/training_data/synonyms_parser.py +42 -0
  584. rasa/shared/nlu/training_data/training_data.py +730 -0
  585. rasa/shared/nlu/training_data/util.py +223 -0
  586. rasa/shared/providers/__init__.py +0 -0
  587. rasa/shared/providers/openai/__init__.py +0 -0
  588. rasa/shared/providers/openai/clients.py +43 -0
  589. rasa/shared/providers/openai/session_handler.py +110 -0
  590. rasa/shared/utils/__init__.py +0 -0
  591. rasa/shared/utils/cli.py +72 -0
  592. rasa/shared/utils/common.py +308 -0
  593. rasa/shared/utils/constants.py +4 -0
  594. rasa/shared/utils/io.py +415 -0
  595. rasa/shared/utils/llm.py +404 -0
  596. rasa/shared/utils/pykwalify_extensions.py +27 -0
  597. rasa/shared/utils/schemas/__init__.py +0 -0
  598. rasa/shared/utils/schemas/config.yml +2 -0
  599. rasa/shared/utils/schemas/domain.yml +145 -0
  600. rasa/shared/utils/schemas/events.py +212 -0
  601. rasa/shared/utils/schemas/model_config.yml +46 -0
  602. rasa/shared/utils/schemas/stories.yml +173 -0
  603. rasa/shared/utils/yaml.py +786 -0
  604. rasa/studio/__init__.py +0 -0
  605. rasa/studio/auth.py +268 -0
  606. rasa/studio/config.py +127 -0
  607. rasa/studio/constants.py +18 -0
  608. rasa/studio/data_handler.py +359 -0
  609. rasa/studio/download.py +483 -0
  610. rasa/studio/results_logger.py +137 -0
  611. rasa/studio/train.py +135 -0
  612. rasa/studio/upload.py +433 -0
  613. rasa/telemetry.py +1737 -0
  614. rasa/tracing/__init__.py +0 -0
  615. rasa/tracing/config.py +353 -0
  616. rasa/tracing/constants.py +62 -0
  617. rasa/tracing/instrumentation/__init__.py +0 -0
  618. rasa/tracing/instrumentation/attribute_extractors.py +672 -0
  619. rasa/tracing/instrumentation/instrumentation.py +1185 -0
  620. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +144 -0
  621. rasa/tracing/instrumentation/metrics.py +294 -0
  622. rasa/tracing/metric_instrument_provider.py +205 -0
  623. rasa/utils/__init__.py +0 -0
  624. rasa/utils/beta.py +83 -0
  625. rasa/utils/cli.py +28 -0
  626. rasa/utils/common.py +635 -0
  627. rasa/utils/converter.py +53 -0
  628. rasa/utils/endpoints.py +302 -0
  629. rasa/utils/io.py +260 -0
  630. rasa/utils/licensing.py +534 -0
  631. rasa/utils/log_utils.py +174 -0
  632. rasa/utils/mapper.py +210 -0
  633. rasa/utils/ml_utils.py +145 -0
  634. rasa/utils/plotting.py +362 -0
  635. rasa/utils/singleton.py +23 -0
  636. rasa/utils/tensorflow/__init__.py +0 -0
  637. rasa/utils/tensorflow/callback.py +112 -0
  638. rasa/utils/tensorflow/constants.py +116 -0
  639. rasa/utils/tensorflow/crf.py +492 -0
  640. rasa/utils/tensorflow/data_generator.py +440 -0
  641. rasa/utils/tensorflow/environment.py +161 -0
  642. rasa/utils/tensorflow/exceptions.py +5 -0
  643. rasa/utils/tensorflow/feature_array.py +366 -0
  644. rasa/utils/tensorflow/layers.py +1565 -0
  645. rasa/utils/tensorflow/layers_utils.py +113 -0
  646. rasa/utils/tensorflow/metrics.py +281 -0
  647. rasa/utils/tensorflow/model_data.py +798 -0
  648. rasa/utils/tensorflow/model_data_utils.py +499 -0
  649. rasa/utils/tensorflow/models.py +935 -0
  650. rasa/utils/tensorflow/rasa_layers.py +1094 -0
  651. rasa/utils/tensorflow/transformer.py +640 -0
  652. rasa/utils/tensorflow/types.py +6 -0
  653. rasa/utils/train_utils.py +572 -0
  654. rasa/utils/url_tools.py +53 -0
  655. rasa/utils/yaml.py +54 -0
  656. rasa/validator.py +1337 -0
  657. rasa/version.py +3 -0
  658. rasa_pro-3.9.18.dist-info/METADATA +563 -0
  659. rasa_pro-3.9.18.dist-info/NOTICE +5 -0
  660. rasa_pro-3.9.18.dist-info/RECORD +662 -0
  661. rasa_pro-3.9.18.dist-info/WHEEL +4 -0
  662. rasa_pro-3.9.18.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,286 @@
1
+ from __future__ import annotations
2
+
3
+ import copy
4
+ import json
5
+ import logging
6
+ import queue
7
+ from typing import Any, Dict, List, Optional, Text
8
+
9
+ from apscheduler.schedulers.background import BackgroundScheduler
10
+ from rasa.core.brokers.kafka import KafkaEventBroker
11
+ from rasa.shared.core.events import Event
12
+ from rasa.utils.endpoints import EndpointConfig, read_endpoint_config
13
+
14
+ from rasa.anonymization.anonymisation_rule_yaml_reader import (
15
+ AnonymizationRulesYamlReader,
16
+ )
17
+ from rasa.anonymization.anonymization_rule_executor import AnonymizationRuleList
18
+ from rasa.anonymization.anonymization_rule_orchestrator import (
19
+ AnonymizationRuleOrchestrator,
20
+ )
21
+ from rasa.utils.singleton import Singleton
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ class AnonymizationPipeline:
27
+ def run(self, event: Dict[Text, Any]) -> None:
28
+ """Run the anonymization pipeline on the given event.
29
+
30
+ Args:
31
+ event: The event to anonymize
32
+ """
33
+ ...
34
+
35
+ def log_run(self, data: Any) -> Any:
36
+ """Anonymize the log data.
37
+
38
+ Args:
39
+ data: log data to anonymize
40
+
41
+ Returns:
42
+ Anonymized log data
43
+ """
44
+ ...
45
+
46
+ def stop(self) -> None:
47
+ """Stop the anonymization pipeline."""
48
+ ...
49
+
50
+
51
+ class BackgroundAnonymizationPipeline(AnonymizationPipeline):
52
+ EVENT_QUEUE_PROCESSING_TIMEOUT_IN_SECONDS = 2.0
53
+
54
+ def __init__(self, anonymization_pipeline: AnonymizationPipeline):
55
+ self.anonymization_pipeline = anonymization_pipeline
56
+
57
+ # Order of the initialisation is important
58
+ # The event queue must be created before the scheduler
59
+ # The can_consume_event_queue must be set to True before the scheduler starts
60
+ self.event_queue: queue.Queue = queue.Queue()
61
+
62
+ # This flag is used to stop the scheduler
63
+ self.can_consume_from_event_queue = True
64
+ self.event_anonymisation_scheduler = BackgroundScheduler()
65
+ self.event_anonymisation_scheduler.add_job(
66
+ self._consumer_queue, max_instances=1
67
+ )
68
+ self.event_anonymisation_scheduler.start()
69
+
70
+ def stop(self) -> None:
71
+ logger.debug("Shutting down the anonymization pipeline...")
72
+ self.can_consume_from_event_queue = False
73
+ self.event_anonymisation_scheduler.shutdown()
74
+
75
+ def run(self, event: Dict[Text, Any]) -> None:
76
+ self.event_queue.put(event)
77
+
78
+ def log_run(self, data: Any) -> Any:
79
+ return self.anonymization_pipeline.log_run(data)
80
+
81
+ def _consumer_queue(self) -> None:
82
+ while self.can_consume_from_event_queue:
83
+ try:
84
+ # Wait for 2 seconds for an event to be added to the queue
85
+ # If no event is added to the queue, continue
86
+ # This is done to avoid the scheduler to be stuck in the while loop
87
+ # when we want to stop the scheduler
88
+ event = self.event_queue.get(
89
+ timeout=self.EVENT_QUEUE_PROCESSING_TIMEOUT_IN_SECONDS
90
+ )
91
+ self.anonymization_pipeline.run(event)
92
+ self.event_queue.task_done()
93
+ except queue.Empty:
94
+ continue
95
+
96
+
97
+ class SyncAnonymizationPipeline(AnonymizationPipeline):
98
+ """Pipeline for anonymizing events."""
99
+
100
+ def __init__(self, orchestrators: List[AnonymizationRuleOrchestrator]) -> None:
101
+ """Initializes the pipeline."""
102
+ self.orchestrators = orchestrators
103
+
104
+ def stop(self) -> None:
105
+ pass
106
+
107
+ def run(self, event: Dict[Text, Any]) -> None:
108
+ """Runs the anonymization pipeline."""
109
+ logger.debug("Running the anonymization pipeline for event...")
110
+
111
+ for orchestrator in self.orchestrators:
112
+ anonymized_event = orchestrator.anonymize_event(event)
113
+ is_anonymized = True if event != anonymized_event else False
114
+ orchestrator.publish_event(anonymized_event, is_anonymized)
115
+
116
+ def log_run(self, data: Any) -> Any:
117
+ """Runs the anonymization pipeline for logging."""
118
+ logger.debug("Running the anonymization pipeline for logs....")
119
+
120
+ anonymized_data = None
121
+
122
+ # this is to make sure that the original data is not modified
123
+ data_copy = copy.deepcopy(data)
124
+
125
+ for orchestrator in self.orchestrators:
126
+ # orchestrator for anonymizing logs has its event broker set to None
127
+ if isinstance(orchestrator.event_broker, KafkaEventBroker):
128
+ continue
129
+
130
+ if isinstance(data_copy, str):
131
+ anonymized_data = orchestrator.anonymize_log_message(data_copy)
132
+
133
+ elif isinstance(data_copy, list):
134
+ anonymized_data = [
135
+ Event.from_parameters(orchestrator.anonymize_event(item.as_dict()))
136
+ if isinstance(item, Event)
137
+ else orchestrator.anonymize_log_message(str(item["value"]))
138
+ if isinstance(item, dict) and item.get("value") is not None
139
+ else item
140
+ for item in data_copy
141
+ ]
142
+
143
+ elif isinstance(data_copy, dict) and "event" in data_copy:
144
+ anonymized_data = orchestrator.anonymize_event(data_copy)
145
+
146
+ elif isinstance(data_copy, dict):
147
+ anonymized_data = {}
148
+
149
+ for key, value in data_copy.items():
150
+ try:
151
+ serialized_value = json.dumps(value)
152
+ except TypeError as error:
153
+ logger.error(
154
+ f"Failed to serialize value of type '{type(value)}' "
155
+ f"for key '{key}' before anonymization. "
156
+ f"Encountered error: {error}. "
157
+ f"Setting value to None."
158
+ )
159
+ serialized_value = None
160
+
161
+ anonymized_data[key] = (
162
+ orchestrator.anonymize_log_message(serialized_value)
163
+ if serialized_value is not None
164
+ else None
165
+ )
166
+
167
+ else:
168
+ logger.debug("Unsupported data type for logging anonymization.")
169
+
170
+ if anonymized_data:
171
+ return anonymized_data
172
+ return data
173
+
174
+
175
+ class AnonymizationPipelineProvider(metaclass=Singleton):
176
+ """Represents a provider for anonymization pipeline."""
177
+
178
+ anonymization_pipeline: Optional[AnonymizationPipeline] = None
179
+
180
+ def register_anonymization_pipeline(self, pipeline: AnonymizationPipeline) -> None:
181
+ """Register an anonymization pipeline.
182
+
183
+ Args:
184
+ pipeline: The anonymization pipeline to register.
185
+ """
186
+ self.anonymization_pipeline = pipeline
187
+
188
+ def get_anonymization_pipeline(self) -> Optional[AnonymizationPipeline]:
189
+ """Get the anonymization pipeline.
190
+
191
+ Returns:
192
+ The anonymization pipeline.
193
+ """
194
+ return self.anonymization_pipeline
195
+
196
+
197
+ def load_anonymization_pipeline(endpoints_file: Optional[Text]) -> None:
198
+ """Creates an anonymization pipeline."""
199
+ yaml_reader = AnonymizationRulesYamlReader(endpoints_filename=endpoints_file)
200
+ anonymization_rules = yaml_reader.read_anonymization_rules()
201
+
202
+ if anonymization_rules is None:
203
+ return None
204
+
205
+ event_broker_config = read_endpoint_config(
206
+ endpoints_file, endpoint_type="event_broker"
207
+ )
208
+ logging_config = read_endpoint_config(endpoints_file, endpoint_type="logger")
209
+
210
+ orchestrators = _load_orchestrators(
211
+ logging_config, event_broker_config, anonymization_rules
212
+ )
213
+
214
+ if not orchestrators:
215
+ return None
216
+
217
+ pipeline = SyncAnonymizationPipeline(orchestrators)
218
+ async_anonymization_pipeline = BackgroundAnonymizationPipeline(pipeline)
219
+ provider = AnonymizationPipelineProvider()
220
+ provider.register_anonymization_pipeline(async_anonymization_pipeline)
221
+
222
+ return None
223
+
224
+
225
+ def create_event_broker(
226
+ topic_name: Text, event_broker_config: EndpointConfig
227
+ ) -> Optional[KafkaEventBroker]:
228
+ """Create a KafkaEventBroker object.
229
+
230
+ Returns None if the event broker config is not of type 'kafka'.
231
+ """
232
+ if event_broker_config.type != "kafka":
233
+ logger.warning(
234
+ f"Unsupported event broker config provided. "
235
+ f"Expected type 'kafka' but got "
236
+ f"'{event_broker_config.type}'. "
237
+ f"Setting event broker to None."
238
+ )
239
+ event_broker = None
240
+ else:
241
+ logger.debug(f"Setting topic to '{topic_name}'.")
242
+ event_broker_config.kwargs["topic"] = topic_name
243
+ event_broker = KafkaEventBroker(
244
+ event_broker_config.url, **event_broker_config.kwargs
245
+ )
246
+
247
+ return event_broker
248
+
249
+
250
+ def _load_orchestrators(
251
+ logging_config: EndpointConfig,
252
+ event_broker_config: EndpointConfig,
253
+ anonymization_rules: List[AnonymizationRuleList],
254
+ ) -> List[AnonymizationRuleOrchestrator]:
255
+ orchestrators = []
256
+
257
+ if logging_config:
258
+ formatter = logging_config.kwargs.get("formatter", "")
259
+ logging_rule = formatter.get("anonymization_rules")
260
+
261
+ for rule_list in anonymization_rules:
262
+ if rule_list.id == logging_rule:
263
+ orchestrators.append(AnonymizationRuleOrchestrator(None, rule_list))
264
+
265
+ if event_broker_config:
266
+ anonymization_topics = event_broker_config.kwargs.get(
267
+ "anonymization_topics", []
268
+ )
269
+ visited_topics = []
270
+
271
+ for rule_list in anonymization_rules:
272
+ for topic in anonymization_topics:
273
+ topic_name = topic.get("name")
274
+
275
+ if topic_name in visited_topics:
276
+ continue
277
+
278
+ if rule_list.id == topic.get("anonymization_rules"):
279
+ event_broker = create_event_broker(topic_name, event_broker_config)
280
+
281
+ orchestrators.append(
282
+ AnonymizationRuleOrchestrator(event_broker, rule_list)
283
+ )
284
+
285
+ visited_topics.append(topic_name)
286
+ return orchestrators
@@ -0,0 +1,260 @@
1
+ import logging
2
+ import typing
3
+ from dataclasses import dataclass
4
+ from typing import Any, Dict, List, Optional, Text, Union
5
+
6
+ from faker import Faker
7
+ from presidio_analyzer import AnalyzerEngine
8
+ from presidio_analyzer.nlp_engine import (
9
+ SpacyNlpEngine,
10
+ StanzaNlpEngine,
11
+ TransformersNlpEngine,
12
+ )
13
+ from presidio_anonymizer import AnonymizerEngine
14
+ from presidio_anonymizer.entities import OperatorConfig
15
+ from rasa.shared.exceptions import RasaException
16
+
17
+ from rasa.utils.singleton import Singleton
18
+
19
+ if typing.TYPE_CHECKING:
20
+ from presidio_analyzer.nlp_engine.nlp_engine import NlpEngine
21
+
22
+ DEFAULT_PRESIDIO_LANG_CODE = "en"
23
+ DEFAULT_PRESIDIO_MODEL_NAME = "en_core_web_lg"
24
+ DEFAULT_PRESIDIO_MODEL_PROVIDER = "spacy"
25
+
26
+ logger = logging.getLogger(__name__)
27
+
28
+
29
+ @dataclass
30
+ class AnonymizationRule:
31
+ """A rule for anonymizing a given text."""
32
+
33
+ entity_name: Text
34
+ substitution: Text = "mask"
35
+ value: Optional[Text] = None
36
+
37
+
38
+ @dataclass
39
+ class AnonymizationRuleList:
40
+ """A list of anonymization rules."""
41
+
42
+ id: Text
43
+ rule_list: List[AnonymizationRule]
44
+ language: Text = DEFAULT_PRESIDIO_LANG_CODE
45
+ model_provider: Text = DEFAULT_PRESIDIO_MODEL_PROVIDER
46
+ models: Union[Text, Dict[Text, Text]] = DEFAULT_PRESIDIO_MODEL_NAME
47
+
48
+
49
+ class AnonymizationAnalyzer(metaclass=Singleton):
50
+ """Anonymization analyzer."""
51
+
52
+ presidio_analyzer_engine = None
53
+
54
+ def __init__(self, anonymization_rule_list: AnonymizationRuleList):
55
+ """Initialise the anonymization analyzer."""
56
+ if self.presidio_analyzer_engine is None:
57
+ self.presidio_analyzer_engine = self._get_analyzer_engine(
58
+ anonymization_rule_list
59
+ )
60
+
61
+ @staticmethod
62
+ def _get_analyzer_engine(
63
+ anonymization_rule_list: AnonymizationRuleList,
64
+ ) -> AnalyzerEngine:
65
+ """Returns an analyzer engine for all the anonymization rule lists."""
66
+ try:
67
+ nlp_engine = AnonymizationAnalyzer._build_presidio_nlp_engine(
68
+ anonymization_rule_list
69
+ )
70
+ except (OSError, ImportError) as exception:
71
+ raise RasaException(
72
+ "Failed to load Presidio nlp engine. "
73
+ "Please check that you have provided "
74
+ "a valid model name."
75
+ ) from exception
76
+
77
+ return AnalyzerEngine(
78
+ nlp_engine=nlp_engine,
79
+ supported_languages=[anonymization_rule_list.language],
80
+ )
81
+
82
+ @staticmethod
83
+ def _build_presidio_nlp_engine(
84
+ anonymization_rule_list: AnonymizationRuleList,
85
+ ) -> "NlpEngine":
86
+ """Creates an instance of the Presidio nlp engine."""
87
+ if anonymization_rule_list.model_provider == "transformers":
88
+ nlp_engine = TransformersNlpEngine(
89
+ models={
90
+ anonymization_rule_list.language: anonymization_rule_list.models
91
+ },
92
+ )
93
+ elif anonymization_rule_list.model_provider == "stanza":
94
+ nlp_engine = StanzaNlpEngine(
95
+ models={
96
+ anonymization_rule_list.language: anonymization_rule_list.models
97
+ },
98
+ )
99
+ else:
100
+ nlp_engine = SpacyNlpEngine(
101
+ models={
102
+ anonymization_rule_list.language: anonymization_rule_list.models
103
+ },
104
+ )
105
+
106
+ return nlp_engine
107
+
108
+
109
+ class AnonymizationRuleExecutor:
110
+ """Executes a given anonymization rule set on a given text."""
111
+
112
+ def __init__(self, anonymization_rule_list: AnonymizationRuleList):
113
+ """Initialize the anonymization rule executor."""
114
+ self.anonymization_rule_list = anonymization_rule_list
115
+
116
+ is_valid_rule_list = self._validate_anonymization_rule_list(
117
+ anonymization_rule_list
118
+ )
119
+
120
+ self.analyzer = (
121
+ AnonymizationAnalyzer(anonymization_rule_list)
122
+ if is_valid_rule_list
123
+ else None
124
+ )
125
+
126
+ self.anonymizer_engine = AnonymizerEngine()
127
+
128
+ @staticmethod
129
+ def _validate_anonymization_rule_list(
130
+ anonymization_rule_list: AnonymizationRuleList,
131
+ ) -> bool:
132
+ """Validates the given anonymization rule list object."""
133
+ if (
134
+ anonymization_rule_list.language != DEFAULT_PRESIDIO_LANG_CODE
135
+ and anonymization_rule_list.models == DEFAULT_PRESIDIO_MODEL_NAME
136
+ ):
137
+ logger.debug(
138
+ f"Anonymization rule list language is "
139
+ f"'{anonymization_rule_list.language}', "
140
+ f"but no specific model name was provided. "
141
+ f"You must specify the spaCy model name in the"
142
+ f"endpoints yaml file. "
143
+ f"Cannot proceed with anonymization."
144
+ )
145
+ return False
146
+
147
+ return True
148
+
149
+ def run(self, text: Text) -> Text:
150
+ """Anonymizes the given text using the given anonymization rule list."""
151
+ if (
152
+ self.analyzer is None
153
+ or not self.anonymization_rule_list
154
+ or self.analyzer.presidio_analyzer_engine is None
155
+ ):
156
+ return text
157
+
158
+ if not self.anonymization_rule_list.rule_list:
159
+ return text
160
+
161
+ analyzer_results = self.analyzer.presidio_analyzer_engine.analyze(
162
+ text=text,
163
+ entities=[
164
+ rule.entity_name for rule in self.anonymization_rule_list.rule_list
165
+ ],
166
+ language=self.anonymization_rule_list.language,
167
+ )
168
+
169
+ operators = self.get_operators()
170
+
171
+ anonymized_text = self.anonymizer_engine.anonymize(
172
+ text=text,
173
+ analyzer_results=analyzer_results,
174
+ operators=operators,
175
+ )
176
+
177
+ return anonymized_text.text
178
+
179
+ @staticmethod
180
+ @typing.no_type_check # faker is not typed correctly
181
+ def _get_supported_faker_entities() -> Dict[Text, Any]:
182
+ faker = Faker(["en_US", "es_ES", "it_IT"])
183
+
184
+ # Presidio entities: https://microsoft.github.io/presidio/supported_entities/
185
+ # Faker providers: https://faker.readthedocs.io/en/master/providers.html
186
+ # Unsupported entities by faker:
187
+ # CRYPTO, NRP, MEDICAL_LICENSE, US_BANK_NUMBER, US_DRIVER_LICENSE
188
+ # UK_NHS, IT_FISCAL_CODE, IT_DRIVER_LICENSE, IT_PASSPORT, IT_IDENTITY_CARD
189
+ # SG_NRIC_FIN, AU_ABN, AU_ACN, AU_TFN, AU_MEDICARE
190
+ supported_entities = {
191
+ "PERSON": lambda value: faker["en_US"].name(),
192
+ "PHONE_NUMBER": lambda value: faker["en_US"].phone_number(),
193
+ "EMAIL_ADDRESS": lambda value: faker["en_US"].ascii_email(),
194
+ "CREDIT_CARD": lambda value: faker["en_US"].credit_card_number(),
195
+ "IBAN_CODE": lambda value: faker["en_US"].iban(),
196
+ "DATE_TIME": lambda value: faker["en_US"].date(),
197
+ "IP_ADDRESS": lambda value: faker["en_US"].ipv4(),
198
+ "URL": lambda value: faker["en_US"].url(),
199
+ # This faker method returns a tuple of
200
+ # (latitude, longitude, place name, country code, timezone)
201
+ "LOCATION": lambda value: faker["en_US"].location_on_land()[2],
202
+ # USA
203
+ "US_ITIN": lambda value: faker["en_US"].itin(),
204
+ "US_PASSPORT": lambda value: faker["en_US"].passport_number(),
205
+ "US_SSN": lambda value: faker["en_US"].ssn(),
206
+ # Spain
207
+ "ES_NIF": lambda value: faker["es_ES"].nif(),
208
+ # Italy
209
+ "IT_VAT_CODE": lambda value: faker["it_IT"].company_vat(),
210
+ }
211
+
212
+ return supported_entities
213
+
214
+ @staticmethod
215
+ def _mask_anonymize(value: Text) -> Text:
216
+ return "*" * len(value)
217
+
218
+ def get_substitution_func(self, rule: AnonymizationRule) -> Optional[Any]:
219
+ """Returns a function that anonymizes the given text.
220
+
221
+ Args:
222
+ rule: The anonymization rule to use.
223
+
224
+ Returns:
225
+ A function that anonymizes the given text.
226
+ """
227
+ if rule.substitution == "faker":
228
+ supported_faker_entities = self._get_supported_faker_entities()
229
+
230
+ if rule.entity_name not in supported_faker_entities:
231
+ logger.debug(
232
+ f"Unsupported faker entity: {rule.entity_name}. "
233
+ f"Supported entities are: {supported_faker_entities.keys()}"
234
+ f"Using mask anonymization instead."
235
+ )
236
+ func = self._mask_anonymize
237
+ else:
238
+ func = supported_faker_entities.get(rule.entity_name)
239
+ elif rule.substitution == "mask":
240
+ func = self._mask_anonymize
241
+ else:
242
+ raise RasaException(f"Unknown substitution type: {rule.substitution}")
243
+
244
+ return func
245
+
246
+ def get_operators(self) -> Dict[Text, OperatorConfig]:
247
+ """Returns a dictionary of operators for the given anonymization rule list."""
248
+ operators = {}
249
+
250
+ for rule in self.anonymization_rule_list.rule_list:
251
+ if rule.substitution == "text":
252
+ operators[rule.entity_name] = OperatorConfig(
253
+ "replace", {"new_value": rule.value}
254
+ )
255
+ else:
256
+ operators[rule.entity_name] = OperatorConfig(
257
+ "custom", {"lambda": self.get_substitution_func(rule)}
258
+ )
259
+
260
+ return operators
@@ -0,0 +1,120 @@
1
+ import copy
2
+ import json
3
+ import logging
4
+ from typing import Any, Dict, List, Optional, Text
5
+
6
+ from rasa.core.brokers.broker import EventBroker
7
+ from rasa.core.brokers.kafka import KafkaEventBroker
8
+
9
+ from rasa.anonymization.anonymization_rule_executor import (
10
+ AnonymizationRuleExecutor,
11
+ AnonymizationRuleList,
12
+ )
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class AnonymizationRuleOrchestrator:
18
+ """Orchestrates the execution of anonymization rules."""
19
+
20
+ def __init__(
21
+ self,
22
+ event_broker: Optional[EventBroker],
23
+ anonymization_rule_list: AnonymizationRuleList,
24
+ ):
25
+ """Initializes the orchestrator."""
26
+ self.event_broker = (
27
+ event_broker if isinstance(event_broker, KafkaEventBroker) else None
28
+ )
29
+ self.anonymization_rule_executor = AnonymizationRuleExecutor(
30
+ anonymization_rule_list
31
+ )
32
+
33
+ def anonymize_event(self, event: Dict[Text, Any]) -> Dict[Text, Any]:
34
+ """Anonymizes one of the supported event types.
35
+
36
+ The supported event types: user, bot, slot, entities.
37
+ """
38
+ event_copy = copy.deepcopy(event)
39
+ event_type = event["event"]
40
+
41
+ if event_type == "user" or event_type == "bot":
42
+ if event["text"] is None:
43
+ return event_copy
44
+
45
+ anonymized_text = self.anonymization_rule_executor.run(event["text"])
46
+ event_copy["text"] = anonymized_text
47
+
48
+ if "parse_data" in event_copy:
49
+ event_copy["parse_data"]["text"] = anonymized_text
50
+
51
+ entities = event_copy["parse_data"]["entities"]
52
+
53
+ if entities:
54
+ anonymized_entities = self._anonymize_entities(entities)
55
+ event_copy["parse_data"]["entities"] = anonymized_entities
56
+
57
+ elif event_type == "slot":
58
+ slot_value = event["value"]
59
+
60
+ if slot_value is None:
61
+ return event_copy
62
+ elif not isinstance(slot_value, str):
63
+ slot_value = json.dumps(slot_value)
64
+
65
+ anonymized_value = self.anonymization_rule_executor.run(slot_value)
66
+ event_copy["value"] = anonymized_value
67
+
68
+ elif event_type == "entities":
69
+ entities = event_copy["entities"]
70
+ anonymized_entities = self._anonymize_entities(entities)
71
+
72
+ event_copy["entities"] = anonymized_entities
73
+ else:
74
+ logger.debug(f"Unsupported event type for anonymization: {event_type}.")
75
+
76
+ return event_copy
77
+
78
+ def publish_event(
79
+ self, anonymized_event: Dict[Text, Any], is_anonymized: bool
80
+ ) -> None:
81
+ """Publishes the anonymized event to the event broker."""
82
+ if self.event_broker is None:
83
+ return None
84
+
85
+ # this assumes that the event broker's topic attribute
86
+ # is set to the correct anonymization topic
87
+ if is_anonymized:
88
+ event_type = anonymized_event["event"]
89
+ sender_id = anonymized_event["sender_id"]
90
+ logger.debug(
91
+ f"Publishing event of type '{event_type}' from "
92
+ f"sender ID '{sender_id}' to "
93
+ f"Kafka topic '{self.event_broker.topic}'. "
94
+ f"The anonymization pipeline used rule named "
95
+ f"'{self.anonymization_rule_executor.anonymization_rule_list.id}'."
96
+ )
97
+
98
+ self.event_broker.publish(anonymized_event)
99
+
100
+ def _anonymize_entities(
101
+ self, entities: List[Dict[Text, Any]]
102
+ ) -> List[Dict[Text, Any]]:
103
+ """Anonymizes entities."""
104
+ anonymized_entities = []
105
+
106
+ for entity in entities:
107
+ entity_value = entity.get("value")
108
+
109
+ if entity_value is not None:
110
+ value = self.anonymization_rule_executor.run(str(entity_value))
111
+ entity["value"] = value
112
+ anonymized_entities.append(entity)
113
+
114
+ return anonymized_entities
115
+
116
+ def anonymize_log_message(self, message: Text) -> Any:
117
+ """Anonymizes log messages."""
118
+ if self.event_broker:
119
+ return None
120
+ return self.anonymization_rule_executor.run(message)