rasa-pro 3.8.16__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 (644) hide show
  1. README.md +380 -0
  2. rasa/__init__.py +10 -0
  3. rasa/__main__.py +151 -0
  4. rasa/anonymization/__init__.py +2 -0
  5. rasa/anonymization/anonymisation_rule_yaml_reader.py +91 -0
  6. rasa/anonymization/anonymization_pipeline.py +287 -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 +117 -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 +566 -0
  27. rasa/cli/evaluate.py +222 -0
  28. rasa/cli/export.py +251 -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 +33 -0
  47. rasa/cli/project_templates/calm/domain/list_contacts.yml +14 -0
  48. rasa/cli/project_templates/calm/domain/remove_contact.yml +31 -0
  49. rasa/cli/project_templates/calm/domain/shared.yml +5 -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/domain.yml +17 -0
  74. rasa/cli/project_templates/tutorial/endpoints.yml +45 -0
  75. rasa/cli/run.py +136 -0
  76. rasa/cli/scaffold.py +268 -0
  77. rasa/cli/shell.py +141 -0
  78. rasa/cli/studio/__init__.py +0 -0
  79. rasa/cli/studio/download.py +51 -0
  80. rasa/cli/studio/studio.py +110 -0
  81. rasa/cli/studio/train.py +59 -0
  82. rasa/cli/studio/upload.py +85 -0
  83. rasa/cli/telemetry.py +90 -0
  84. rasa/cli/test.py +280 -0
  85. rasa/cli/train.py +260 -0
  86. rasa/cli/utils.py +453 -0
  87. rasa/cli/visualize.py +40 -0
  88. rasa/cli/x.py +205 -0
  89. rasa/constants.py +37 -0
  90. rasa/core/__init__.py +17 -0
  91. rasa/core/actions/__init__.py +0 -0
  92. rasa/core/actions/action.py +1450 -0
  93. rasa/core/actions/action_clean_stack.py +59 -0
  94. rasa/core/actions/action_run_slot_rejections.py +207 -0
  95. rasa/core/actions/action_trigger_chitchat.py +31 -0
  96. rasa/core/actions/action_trigger_flow.py +109 -0
  97. rasa/core/actions/action_trigger_search.py +31 -0
  98. rasa/core/actions/constants.py +2 -0
  99. rasa/core/actions/forms.py +737 -0
  100. rasa/core/actions/loops.py +111 -0
  101. rasa/core/actions/two_stage_fallback.py +186 -0
  102. rasa/core/agent.py +557 -0
  103. rasa/core/auth_retry_tracker_store.py +122 -0
  104. rasa/core/brokers/__init__.py +0 -0
  105. rasa/core/brokers/broker.py +126 -0
  106. rasa/core/brokers/file.py +58 -0
  107. rasa/core/brokers/kafka.py +322 -0
  108. rasa/core/brokers/pika.py +387 -0
  109. rasa/core/brokers/sql.py +86 -0
  110. rasa/core/channels/__init__.py +55 -0
  111. rasa/core/channels/audiocodes.py +463 -0
  112. rasa/core/channels/botframework.py +339 -0
  113. rasa/core/channels/callback.py +85 -0
  114. rasa/core/channels/channel.py +419 -0
  115. rasa/core/channels/console.py +243 -0
  116. rasa/core/channels/development_inspector.py +93 -0
  117. rasa/core/channels/facebook.py +422 -0
  118. rasa/core/channels/hangouts.py +335 -0
  119. rasa/core/channels/inspector/.eslintrc.cjs +25 -0
  120. rasa/core/channels/inspector/.gitignore +23 -0
  121. rasa/core/channels/inspector/README.md +54 -0
  122. rasa/core/channels/inspector/assets/favicon.ico +0 -0
  123. rasa/core/channels/inspector/assets/rasa-chat.js +2 -0
  124. rasa/core/channels/inspector/custom.d.ts +3 -0
  125. rasa/core/channels/inspector/dist/assets/arc-5623b6dc.js +1 -0
  126. rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
  127. rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-685c106a.js +10 -0
  128. rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-8cbed007.js +2 -0
  129. rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-5889cf12.js +2 -0
  130. rasa/core/channels/inspector/dist/assets/createText-62fc7601-24c249d7.js +7 -0
  131. rasa/core/channels/inspector/dist/assets/edges-f2ad444c-7dd06a75.js +4 -0
  132. rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-62c1e54c.js +51 -0
  133. rasa/core/channels/inspector/dist/assets/flowDb-1972c806-ce49b86f.js +6 -0
  134. rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-4067e48f.js +4 -0
  135. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-85583a23.js +1 -0
  136. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-59fe4051.js +139 -0
  137. rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-47e3a43b.js +266 -0
  138. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-5a2ac0d9.js +70 -0
  139. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-128cfa44.ttf +0 -0
  140. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-21dbcb97.woff +0 -0
  141. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-222b5e26.svg +329 -0
  142. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-9ad89b2a.woff2 +0 -0
  143. rasa/core/channels/inspector/dist/assets/index-268a75c0.js +1040 -0
  144. rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-dfb8efc4.js +1 -0
  145. rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
  146. rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-b0c470f2.js +7 -0
  147. rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
  148. rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-2edb829a.js +139 -0
  149. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-60c05ee4.woff +0 -0
  150. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-8335d9b8.svg +438 -0
  151. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-9cc39c75.ttf +0 -0
  152. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-ead13ccf.woff2 +0 -0
  153. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-16705655.woff2 +0 -0
  154. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-5aeb07f9.woff +0 -0
  155. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9c459044.ttf +0 -0
  156. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9e2898a4.svg +435 -0
  157. rasa/core/channels/inspector/dist/assets/layout-b6873d69.js +1 -0
  158. rasa/core/channels/inspector/dist/assets/line-1efc5781.js +1 -0
  159. rasa/core/channels/inspector/dist/assets/linear-661e9b94.js +1 -0
  160. rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-2d2e727f.js +109 -0
  161. rasa/core/channels/inspector/dist/assets/ordinal-ba9b4969.js +1 -0
  162. rasa/core/channels/inspector/dist/assets/path-53f90ab3.js +1 -0
  163. rasa/core/channels/inspector/dist/assets/pieDiagram-dbbf0591-9d3ea93d.js +35 -0
  164. rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-06a178a2.js +7 -0
  165. rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-0bfedffc.js +52 -0
  166. rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-d76d0a04.js +8 -0
  167. rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-37bb4341.js +122 -0
  168. rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-f52f7f57.js +1 -0
  169. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-4a986a20.js +1 -0
  170. rasa/core/channels/inspector/dist/assets/styles-080da4f6-7dd9ae12.js +110 -0
  171. rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-46e1ca14.js +159 -0
  172. rasa/core/channels/inspector/dist/assets/styles-9c745c82-4a97439a.js +207 -0
  173. rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-823917a3.js +1 -0
  174. rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-9ea72896.js +61 -0
  175. rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-b631a8b6.js +7 -0
  176. rasa/core/channels/inspector/dist/index.html +39 -0
  177. rasa/core/channels/inspector/index.html +37 -0
  178. rasa/core/channels/inspector/jest.config.ts +13 -0
  179. rasa/core/channels/inspector/package.json +48 -0
  180. rasa/core/channels/inspector/setupTests.ts +2 -0
  181. rasa/core/channels/inspector/src/App.tsx +170 -0
  182. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +97 -0
  183. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
  184. rasa/core/channels/inspector/src/components/DialogueStack.tsx +151 -0
  185. rasa/core/channels/inspector/src/components/ExpandIcon.tsx +16 -0
  186. rasa/core/channels/inspector/src/components/FullscreenButton.tsx +45 -0
  187. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +19 -0
  188. rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +21 -0
  189. rasa/core/channels/inspector/src/components/RasaLogo.tsx +32 -0
  190. rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +39 -0
  191. rasa/core/channels/inspector/src/components/Slots.tsx +91 -0
  192. rasa/core/channels/inspector/src/components/Welcome.tsx +54 -0
  193. rasa/core/channels/inspector/src/helpers/formatters.test.ts +385 -0
  194. rasa/core/channels/inspector/src/helpers/formatters.ts +239 -0
  195. rasa/core/channels/inspector/src/helpers/utils.ts +42 -0
  196. rasa/core/channels/inspector/src/main.tsx +13 -0
  197. rasa/core/channels/inspector/src/theme/Button/Button.ts +29 -0
  198. rasa/core/channels/inspector/src/theme/Heading/Heading.ts +31 -0
  199. rasa/core/channels/inspector/src/theme/Input/Input.ts +27 -0
  200. rasa/core/channels/inspector/src/theme/Link/Link.ts +10 -0
  201. rasa/core/channels/inspector/src/theme/Modal/Modal.ts +47 -0
  202. rasa/core/channels/inspector/src/theme/Table/Table.tsx +38 -0
  203. rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +12 -0
  204. rasa/core/channels/inspector/src/theme/base/breakpoints.ts +8 -0
  205. rasa/core/channels/inspector/src/theme/base/colors.ts +88 -0
  206. rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +29 -0
  207. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.eot +0 -0
  208. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.svg +329 -0
  209. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.ttf +0 -0
  210. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff +0 -0
  211. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff2 +0 -0
  212. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.eot +0 -0
  213. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.svg +438 -0
  214. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.ttf +0 -0
  215. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff +0 -0
  216. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff2 +0 -0
  217. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.eot +0 -0
  218. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.svg +435 -0
  219. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.ttf +0 -0
  220. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff +0 -0
  221. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff2 +0 -0
  222. rasa/core/channels/inspector/src/theme/base/radii.ts +9 -0
  223. rasa/core/channels/inspector/src/theme/base/shadows.ts +7 -0
  224. rasa/core/channels/inspector/src/theme/base/sizes.ts +7 -0
  225. rasa/core/channels/inspector/src/theme/base/space.ts +15 -0
  226. rasa/core/channels/inspector/src/theme/base/styles.ts +13 -0
  227. rasa/core/channels/inspector/src/theme/base/typography.ts +24 -0
  228. rasa/core/channels/inspector/src/theme/base/zIndices.ts +19 -0
  229. rasa/core/channels/inspector/src/theme/index.ts +101 -0
  230. rasa/core/channels/inspector/src/types.ts +64 -0
  231. rasa/core/channels/inspector/src/vite-env.d.ts +1 -0
  232. rasa/core/channels/inspector/tests/__mocks__/fileMock.ts +1 -0
  233. rasa/core/channels/inspector/tests/__mocks__/matchMedia.ts +16 -0
  234. rasa/core/channels/inspector/tests/__mocks__/styleMock.ts +1 -0
  235. rasa/core/channels/inspector/tests/renderWithProviders.tsx +14 -0
  236. rasa/core/channels/inspector/tsconfig.json +26 -0
  237. rasa/core/channels/inspector/tsconfig.node.json +10 -0
  238. rasa/core/channels/inspector/vite.config.ts +8 -0
  239. rasa/core/channels/inspector/yarn.lock +6156 -0
  240. rasa/core/channels/mattermost.py +229 -0
  241. rasa/core/channels/rasa_chat.py +126 -0
  242. rasa/core/channels/rest.py +210 -0
  243. rasa/core/channels/rocketchat.py +175 -0
  244. rasa/core/channels/slack.py +620 -0
  245. rasa/core/channels/socketio.py +274 -0
  246. rasa/core/channels/telegram.py +298 -0
  247. rasa/core/channels/twilio.py +169 -0
  248. rasa/core/channels/twilio_voice.py +367 -0
  249. rasa/core/channels/vier_cvg.py +374 -0
  250. rasa/core/channels/webexteams.py +135 -0
  251. rasa/core/concurrent_lock_store.py +210 -0
  252. rasa/core/constants.py +107 -0
  253. rasa/core/evaluation/__init__.py +0 -0
  254. rasa/core/evaluation/marker.py +267 -0
  255. rasa/core/evaluation/marker_base.py +925 -0
  256. rasa/core/evaluation/marker_stats.py +294 -0
  257. rasa/core/evaluation/marker_tracker_loader.py +103 -0
  258. rasa/core/exceptions.py +29 -0
  259. rasa/core/exporter.py +284 -0
  260. rasa/core/featurizers/__init__.py +0 -0
  261. rasa/core/featurizers/precomputation.py +410 -0
  262. rasa/core/featurizers/single_state_featurizer.py +402 -0
  263. rasa/core/featurizers/tracker_featurizers.py +1172 -0
  264. rasa/core/http_interpreter.py +89 -0
  265. rasa/core/information_retrieval/__init__.py +0 -0
  266. rasa/core/information_retrieval/faiss.py +116 -0
  267. rasa/core/information_retrieval/information_retrieval.py +72 -0
  268. rasa/core/information_retrieval/milvus.py +59 -0
  269. rasa/core/information_retrieval/qdrant.py +102 -0
  270. rasa/core/jobs.py +63 -0
  271. rasa/core/lock.py +139 -0
  272. rasa/core/lock_store.py +344 -0
  273. rasa/core/migrate.py +404 -0
  274. rasa/core/nlg/__init__.py +3 -0
  275. rasa/core/nlg/callback.py +147 -0
  276. rasa/core/nlg/contextual_response_rephraser.py +270 -0
  277. rasa/core/nlg/generator.py +230 -0
  278. rasa/core/nlg/interpolator.py +143 -0
  279. rasa/core/nlg/response.py +155 -0
  280. rasa/core/nlg/summarize.py +69 -0
  281. rasa/core/policies/__init__.py +0 -0
  282. rasa/core/policies/ensemble.py +329 -0
  283. rasa/core/policies/enterprise_search_policy.py +717 -0
  284. rasa/core/policies/enterprise_search_prompt_template.jinja2 +62 -0
  285. rasa/core/policies/flow_policy.py +205 -0
  286. rasa/core/policies/flows/__init__.py +0 -0
  287. rasa/core/policies/flows/flow_exceptions.py +44 -0
  288. rasa/core/policies/flows/flow_executor.py +582 -0
  289. rasa/core/policies/flows/flow_step_result.py +43 -0
  290. rasa/core/policies/intentless_policy.py +924 -0
  291. rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
  292. rasa/core/policies/memoization.py +538 -0
  293. rasa/core/policies/policy.py +716 -0
  294. rasa/core/policies/rule_policy.py +1276 -0
  295. rasa/core/policies/ted_policy.py +2146 -0
  296. rasa/core/policies/unexpected_intent_policy.py +1015 -0
  297. rasa/core/processor.py +1331 -0
  298. rasa/core/run.py +315 -0
  299. rasa/core/secrets_manager/__init__.py +0 -0
  300. rasa/core/secrets_manager/constants.py +32 -0
  301. rasa/core/secrets_manager/endpoints.py +391 -0
  302. rasa/core/secrets_manager/factory.py +233 -0
  303. rasa/core/secrets_manager/secret_manager.py +262 -0
  304. rasa/core/secrets_manager/vault.py +576 -0
  305. rasa/core/test.py +1337 -0
  306. rasa/core/tracker_store.py +1664 -0
  307. rasa/core/train.py +107 -0
  308. rasa/core/training/__init__.py +89 -0
  309. rasa/core/training/converters/__init__.py +0 -0
  310. rasa/core/training/converters/responses_prefix_converter.py +119 -0
  311. rasa/core/training/interactive.py +1742 -0
  312. rasa/core/training/story_conflict.py +381 -0
  313. rasa/core/training/training.py +93 -0
  314. rasa/core/utils.py +344 -0
  315. rasa/core/visualize.py +70 -0
  316. rasa/dialogue_understanding/__init__.py +0 -0
  317. rasa/dialogue_understanding/coexistence/__init__.py +0 -0
  318. rasa/dialogue_understanding/coexistence/constants.py +4 -0
  319. rasa/dialogue_understanding/coexistence/intent_based_router.py +189 -0
  320. rasa/dialogue_understanding/coexistence/llm_based_router.py +261 -0
  321. rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
  322. rasa/dialogue_understanding/commands/__init__.py +45 -0
  323. rasa/dialogue_understanding/commands/can_not_handle_command.py +61 -0
  324. rasa/dialogue_understanding/commands/cancel_flow_command.py +116 -0
  325. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +48 -0
  326. rasa/dialogue_understanding/commands/clarify_command.py +77 -0
  327. rasa/dialogue_understanding/commands/command.py +85 -0
  328. rasa/dialogue_understanding/commands/correct_slots_command.py +288 -0
  329. rasa/dialogue_understanding/commands/error_command.py +67 -0
  330. rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
  331. rasa/dialogue_understanding/commands/handle_code_change_command.py +64 -0
  332. rasa/dialogue_understanding/commands/human_handoff_command.py +57 -0
  333. rasa/dialogue_understanding/commands/knowledge_answer_command.py +48 -0
  334. rasa/dialogue_understanding/commands/noop_command.py +45 -0
  335. rasa/dialogue_understanding/commands/set_slot_command.py +125 -0
  336. rasa/dialogue_understanding/commands/skip_question_command.py +66 -0
  337. rasa/dialogue_understanding/commands/start_flow_command.py +98 -0
  338. rasa/dialogue_understanding/generator/__init__.py +6 -0
  339. rasa/dialogue_understanding/generator/command_generator.py +257 -0
  340. rasa/dialogue_understanding/generator/command_prompt_template.jinja2 +57 -0
  341. rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
  342. rasa/dialogue_understanding/generator/flow_retrieval.py +410 -0
  343. rasa/dialogue_understanding/generator/llm_command_generator.py +637 -0
  344. rasa/dialogue_understanding/generator/nlu_command_adapter.py +157 -0
  345. rasa/dialogue_understanding/patterns/__init__.py +0 -0
  346. rasa/dialogue_understanding/patterns/cancel.py +111 -0
  347. rasa/dialogue_understanding/patterns/cannot_handle.py +43 -0
  348. rasa/dialogue_understanding/patterns/chitchat.py +37 -0
  349. rasa/dialogue_understanding/patterns/clarify.py +97 -0
  350. rasa/dialogue_understanding/patterns/code_change.py +41 -0
  351. rasa/dialogue_understanding/patterns/collect_information.py +90 -0
  352. rasa/dialogue_understanding/patterns/completed.py +40 -0
  353. rasa/dialogue_understanding/patterns/continue_interrupted.py +42 -0
  354. rasa/dialogue_understanding/patterns/correction.py +278 -0
  355. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +243 -0
  356. rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
  357. rasa/dialogue_understanding/patterns/internal_error.py +47 -0
  358. rasa/dialogue_understanding/patterns/search.py +37 -0
  359. rasa/dialogue_understanding/patterns/skip_question.py +38 -0
  360. rasa/dialogue_understanding/processor/__init__.py +0 -0
  361. rasa/dialogue_understanding/processor/command_processor.py +578 -0
  362. rasa/dialogue_understanding/processor/command_processor_component.py +39 -0
  363. rasa/dialogue_understanding/stack/__init__.py +0 -0
  364. rasa/dialogue_understanding/stack/dialogue_stack.py +178 -0
  365. rasa/dialogue_understanding/stack/frames/__init__.py +19 -0
  366. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +27 -0
  367. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +137 -0
  368. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +157 -0
  369. rasa/dialogue_understanding/stack/frames/pattern_frame.py +10 -0
  370. rasa/dialogue_understanding/stack/frames/search_frame.py +27 -0
  371. rasa/dialogue_understanding/stack/utils.py +211 -0
  372. rasa/e2e_test/__init__.py +0 -0
  373. rasa/e2e_test/constants.py +10 -0
  374. rasa/e2e_test/e2e_test_case.py +322 -0
  375. rasa/e2e_test/e2e_test_result.py +34 -0
  376. rasa/e2e_test/e2e_test_runner.py +659 -0
  377. rasa/e2e_test/e2e_test_schema.yml +67 -0
  378. rasa/engine/__init__.py +0 -0
  379. rasa/engine/caching.py +464 -0
  380. rasa/engine/constants.py +17 -0
  381. rasa/engine/exceptions.py +14 -0
  382. rasa/engine/graph.py +625 -0
  383. rasa/engine/loader.py +36 -0
  384. rasa/engine/recipes/__init__.py +0 -0
  385. rasa/engine/recipes/config_files/default_config.yml +44 -0
  386. rasa/engine/recipes/default_components.py +99 -0
  387. rasa/engine/recipes/default_recipe.py +1252 -0
  388. rasa/engine/recipes/graph_recipe.py +79 -0
  389. rasa/engine/recipes/recipe.py +93 -0
  390. rasa/engine/runner/__init__.py +0 -0
  391. rasa/engine/runner/dask.py +256 -0
  392. rasa/engine/runner/interface.py +49 -0
  393. rasa/engine/storage/__init__.py +0 -0
  394. rasa/engine/storage/local_model_storage.py +248 -0
  395. rasa/engine/storage/resource.py +110 -0
  396. rasa/engine/storage/storage.py +203 -0
  397. rasa/engine/training/__init__.py +0 -0
  398. rasa/engine/training/components.py +176 -0
  399. rasa/engine/training/fingerprinting.py +64 -0
  400. rasa/engine/training/graph_trainer.py +256 -0
  401. rasa/engine/training/hooks.py +164 -0
  402. rasa/engine/validation.py +839 -0
  403. rasa/env.py +5 -0
  404. rasa/exceptions.py +69 -0
  405. rasa/graph_components/__init__.py +0 -0
  406. rasa/graph_components/converters/__init__.py +0 -0
  407. rasa/graph_components/converters/nlu_message_converter.py +48 -0
  408. rasa/graph_components/providers/__init__.py +0 -0
  409. rasa/graph_components/providers/domain_for_core_training_provider.py +87 -0
  410. rasa/graph_components/providers/domain_provider.py +71 -0
  411. rasa/graph_components/providers/flows_provider.py +74 -0
  412. rasa/graph_components/providers/forms_provider.py +44 -0
  413. rasa/graph_components/providers/nlu_training_data_provider.py +56 -0
  414. rasa/graph_components/providers/responses_provider.py +44 -0
  415. rasa/graph_components/providers/rule_only_provider.py +49 -0
  416. rasa/graph_components/providers/story_graph_provider.py +43 -0
  417. rasa/graph_components/providers/training_tracker_provider.py +55 -0
  418. rasa/graph_components/validators/__init__.py +0 -0
  419. rasa/graph_components/validators/default_recipe_validator.py +552 -0
  420. rasa/graph_components/validators/finetuning_validator.py +302 -0
  421. rasa/hooks.py +113 -0
  422. rasa/jupyter.py +63 -0
  423. rasa/keys +1 -0
  424. rasa/markers/__init__.py +0 -0
  425. rasa/markers/marker.py +269 -0
  426. rasa/markers/marker_base.py +828 -0
  427. rasa/markers/upload.py +74 -0
  428. rasa/markers/validate.py +21 -0
  429. rasa/model.py +118 -0
  430. rasa/model_testing.py +457 -0
  431. rasa/model_training.py +535 -0
  432. rasa/nlu/__init__.py +7 -0
  433. rasa/nlu/classifiers/__init__.py +3 -0
  434. rasa/nlu/classifiers/classifier.py +5 -0
  435. rasa/nlu/classifiers/diet_classifier.py +1874 -0
  436. rasa/nlu/classifiers/fallback_classifier.py +192 -0
  437. rasa/nlu/classifiers/keyword_intent_classifier.py +188 -0
  438. rasa/nlu/classifiers/llm_intent_classifier.py +519 -0
  439. rasa/nlu/classifiers/logistic_regression_classifier.py +240 -0
  440. rasa/nlu/classifiers/mitie_intent_classifier.py +156 -0
  441. rasa/nlu/classifiers/regex_message_handler.py +56 -0
  442. rasa/nlu/classifiers/sklearn_intent_classifier.py +309 -0
  443. rasa/nlu/constants.py +77 -0
  444. rasa/nlu/convert.py +40 -0
  445. rasa/nlu/emulators/__init__.py +0 -0
  446. rasa/nlu/emulators/dialogflow.py +55 -0
  447. rasa/nlu/emulators/emulator.py +49 -0
  448. rasa/nlu/emulators/luis.py +86 -0
  449. rasa/nlu/emulators/no_emulator.py +10 -0
  450. rasa/nlu/emulators/wit.py +56 -0
  451. rasa/nlu/extractors/__init__.py +0 -0
  452. rasa/nlu/extractors/crf_entity_extractor.py +672 -0
  453. rasa/nlu/extractors/duckling_entity_extractor.py +206 -0
  454. rasa/nlu/extractors/entity_synonyms.py +178 -0
  455. rasa/nlu/extractors/extractor.py +470 -0
  456. rasa/nlu/extractors/mitie_entity_extractor.py +293 -0
  457. rasa/nlu/extractors/regex_entity_extractor.py +220 -0
  458. rasa/nlu/extractors/spacy_entity_extractor.py +95 -0
  459. rasa/nlu/featurizers/__init__.py +0 -0
  460. rasa/nlu/featurizers/dense_featurizer/__init__.py +0 -0
  461. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +449 -0
  462. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
  463. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +772 -0
  464. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +170 -0
  465. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +132 -0
  466. rasa/nlu/featurizers/featurizer.py +89 -0
  467. rasa/nlu/featurizers/sparse_featurizer/__init__.py +0 -0
  468. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +840 -0
  469. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +539 -0
  470. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +269 -0
  471. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
  472. rasa/nlu/model.py +24 -0
  473. rasa/nlu/persistor.py +240 -0
  474. rasa/nlu/run.py +27 -0
  475. rasa/nlu/selectors/__init__.py +0 -0
  476. rasa/nlu/selectors/response_selector.py +990 -0
  477. rasa/nlu/test.py +1943 -0
  478. rasa/nlu/tokenizers/__init__.py +0 -0
  479. rasa/nlu/tokenizers/jieba_tokenizer.py +148 -0
  480. rasa/nlu/tokenizers/mitie_tokenizer.py +75 -0
  481. rasa/nlu/tokenizers/spacy_tokenizer.py +72 -0
  482. rasa/nlu/tokenizers/tokenizer.py +239 -0
  483. rasa/nlu/tokenizers/whitespace_tokenizer.py +106 -0
  484. rasa/nlu/utils/__init__.py +35 -0
  485. rasa/nlu/utils/bilou_utils.py +462 -0
  486. rasa/nlu/utils/hugging_face/__init__.py +0 -0
  487. rasa/nlu/utils/hugging_face/registry.py +108 -0
  488. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +311 -0
  489. rasa/nlu/utils/mitie_utils.py +113 -0
  490. rasa/nlu/utils/pattern_utils.py +168 -0
  491. rasa/nlu/utils/spacy_utils.py +312 -0
  492. rasa/plugin.py +90 -0
  493. rasa/server.py +1536 -0
  494. rasa/shared/__init__.py +0 -0
  495. rasa/shared/constants.py +181 -0
  496. rasa/shared/core/__init__.py +0 -0
  497. rasa/shared/core/constants.py +168 -0
  498. rasa/shared/core/conversation.py +46 -0
  499. rasa/shared/core/domain.py +2106 -0
  500. rasa/shared/core/events.py +2507 -0
  501. rasa/shared/core/flows/__init__.py +7 -0
  502. rasa/shared/core/flows/flow.py +353 -0
  503. rasa/shared/core/flows/flow_step.py +146 -0
  504. rasa/shared/core/flows/flow_step_links.py +319 -0
  505. rasa/shared/core/flows/flow_step_sequence.py +70 -0
  506. rasa/shared/core/flows/flows_list.py +211 -0
  507. rasa/shared/core/flows/flows_yaml_schema.json +217 -0
  508. rasa/shared/core/flows/nlu_trigger.py +117 -0
  509. rasa/shared/core/flows/steps/__init__.py +24 -0
  510. rasa/shared/core/flows/steps/action.py +51 -0
  511. rasa/shared/core/flows/steps/call.py +64 -0
  512. rasa/shared/core/flows/steps/collect.py +112 -0
  513. rasa/shared/core/flows/steps/constants.py +5 -0
  514. rasa/shared/core/flows/steps/continuation.py +36 -0
  515. rasa/shared/core/flows/steps/end.py +22 -0
  516. rasa/shared/core/flows/steps/internal.py +44 -0
  517. rasa/shared/core/flows/steps/link.py +51 -0
  518. rasa/shared/core/flows/steps/no_operation.py +48 -0
  519. rasa/shared/core/flows/steps/set_slots.py +50 -0
  520. rasa/shared/core/flows/steps/start.py +30 -0
  521. rasa/shared/core/flows/validation.py +527 -0
  522. rasa/shared/core/flows/yaml_flows_io.py +278 -0
  523. rasa/shared/core/generator.py +907 -0
  524. rasa/shared/core/slot_mappings.py +235 -0
  525. rasa/shared/core/slots.py +647 -0
  526. rasa/shared/core/trackers.py +1159 -0
  527. rasa/shared/core/training_data/__init__.py +0 -0
  528. rasa/shared/core/training_data/loading.py +90 -0
  529. rasa/shared/core/training_data/story_reader/__init__.py +0 -0
  530. rasa/shared/core/training_data/story_reader/story_reader.py +129 -0
  531. rasa/shared/core/training_data/story_reader/story_step_builder.py +168 -0
  532. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +888 -0
  533. rasa/shared/core/training_data/story_writer/__init__.py +0 -0
  534. rasa/shared/core/training_data/story_writer/story_writer.py +76 -0
  535. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +442 -0
  536. rasa/shared/core/training_data/structures.py +838 -0
  537. rasa/shared/core/training_data/visualization.html +146 -0
  538. rasa/shared/core/training_data/visualization.py +603 -0
  539. rasa/shared/data.py +192 -0
  540. rasa/shared/engine/__init__.py +0 -0
  541. rasa/shared/engine/caching.py +26 -0
  542. rasa/shared/exceptions.py +129 -0
  543. rasa/shared/importers/__init__.py +0 -0
  544. rasa/shared/importers/importer.py +705 -0
  545. rasa/shared/importers/multi_project.py +203 -0
  546. rasa/shared/importers/rasa.py +100 -0
  547. rasa/shared/importers/utils.py +34 -0
  548. rasa/shared/nlu/__init__.py +0 -0
  549. rasa/shared/nlu/constants.py +45 -0
  550. rasa/shared/nlu/interpreter.py +10 -0
  551. rasa/shared/nlu/training_data/__init__.py +0 -0
  552. rasa/shared/nlu/training_data/entities_parser.py +209 -0
  553. rasa/shared/nlu/training_data/features.py +374 -0
  554. rasa/shared/nlu/training_data/formats/__init__.py +10 -0
  555. rasa/shared/nlu/training_data/formats/dialogflow.py +162 -0
  556. rasa/shared/nlu/training_data/formats/luis.py +87 -0
  557. rasa/shared/nlu/training_data/formats/rasa.py +135 -0
  558. rasa/shared/nlu/training_data/formats/rasa_yaml.py +605 -0
  559. rasa/shared/nlu/training_data/formats/readerwriter.py +245 -0
  560. rasa/shared/nlu/training_data/formats/wit.py +52 -0
  561. rasa/shared/nlu/training_data/loading.py +137 -0
  562. rasa/shared/nlu/training_data/lookup_tables_parser.py +30 -0
  563. rasa/shared/nlu/training_data/message.py +477 -0
  564. rasa/shared/nlu/training_data/schemas/__init__.py +0 -0
  565. rasa/shared/nlu/training_data/schemas/data_schema.py +85 -0
  566. rasa/shared/nlu/training_data/schemas/nlu.yml +53 -0
  567. rasa/shared/nlu/training_data/schemas/responses.yml +70 -0
  568. rasa/shared/nlu/training_data/synonyms_parser.py +42 -0
  569. rasa/shared/nlu/training_data/training_data.py +732 -0
  570. rasa/shared/nlu/training_data/util.py +223 -0
  571. rasa/shared/providers/__init__.py +0 -0
  572. rasa/shared/providers/openai/__init__.py +0 -0
  573. rasa/shared/providers/openai/clients.py +43 -0
  574. rasa/shared/providers/openai/session_handler.py +110 -0
  575. rasa/shared/utils/__init__.py +0 -0
  576. rasa/shared/utils/cli.py +72 -0
  577. rasa/shared/utils/common.py +308 -0
  578. rasa/shared/utils/constants.py +1 -0
  579. rasa/shared/utils/io.py +403 -0
  580. rasa/shared/utils/llm.py +405 -0
  581. rasa/shared/utils/pykwalify_extensions.py +26 -0
  582. rasa/shared/utils/schemas/__init__.py +0 -0
  583. rasa/shared/utils/schemas/config.yml +2 -0
  584. rasa/shared/utils/schemas/domain.yml +142 -0
  585. rasa/shared/utils/schemas/events.py +212 -0
  586. rasa/shared/utils/schemas/model_config.yml +46 -0
  587. rasa/shared/utils/schemas/stories.yml +173 -0
  588. rasa/shared/utils/yaml.py +777 -0
  589. rasa/studio/__init__.py +0 -0
  590. rasa/studio/auth.py +252 -0
  591. rasa/studio/config.py +127 -0
  592. rasa/studio/constants.py +16 -0
  593. rasa/studio/data_handler.py +352 -0
  594. rasa/studio/download.py +350 -0
  595. rasa/studio/train.py +136 -0
  596. rasa/studio/upload.py +408 -0
  597. rasa/telemetry.py +1583 -0
  598. rasa/tracing/__init__.py +0 -0
  599. rasa/tracing/config.py +338 -0
  600. rasa/tracing/constants.py +38 -0
  601. rasa/tracing/instrumentation/__init__.py +0 -0
  602. rasa/tracing/instrumentation/attribute_extractors.py +663 -0
  603. rasa/tracing/instrumentation/instrumentation.py +939 -0
  604. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +142 -0
  605. rasa/tracing/instrumentation/metrics.py +206 -0
  606. rasa/tracing/metric_instrument_provider.py +125 -0
  607. rasa/utils/__init__.py +0 -0
  608. rasa/utils/beta.py +83 -0
  609. rasa/utils/cli.py +27 -0
  610. rasa/utils/common.py +635 -0
  611. rasa/utils/converter.py +53 -0
  612. rasa/utils/endpoints.py +303 -0
  613. rasa/utils/io.py +326 -0
  614. rasa/utils/licensing.py +319 -0
  615. rasa/utils/log_utils.py +174 -0
  616. rasa/utils/mapper.py +210 -0
  617. rasa/utils/ml_utils.py +145 -0
  618. rasa/utils/plotting.py +362 -0
  619. rasa/utils/singleton.py +23 -0
  620. rasa/utils/tensorflow/__init__.py +0 -0
  621. rasa/utils/tensorflow/callback.py +112 -0
  622. rasa/utils/tensorflow/constants.py +116 -0
  623. rasa/utils/tensorflow/crf.py +492 -0
  624. rasa/utils/tensorflow/data_generator.py +440 -0
  625. rasa/utils/tensorflow/environment.py +161 -0
  626. rasa/utils/tensorflow/exceptions.py +5 -0
  627. rasa/utils/tensorflow/layers.py +1565 -0
  628. rasa/utils/tensorflow/layers_utils.py +113 -0
  629. rasa/utils/tensorflow/metrics.py +281 -0
  630. rasa/utils/tensorflow/model_data.py +991 -0
  631. rasa/utils/tensorflow/model_data_utils.py +500 -0
  632. rasa/utils/tensorflow/models.py +936 -0
  633. rasa/utils/tensorflow/rasa_layers.py +1094 -0
  634. rasa/utils/tensorflow/transformer.py +640 -0
  635. rasa/utils/tensorflow/types.py +6 -0
  636. rasa/utils/train_utils.py +572 -0
  637. rasa/utils/yaml.py +54 -0
  638. rasa/validator.py +1035 -0
  639. rasa/version.py +3 -0
  640. rasa_pro-3.8.16.dist-info/METADATA +528 -0
  641. rasa_pro-3.8.16.dist-info/NOTICE +5 -0
  642. rasa_pro-3.8.16.dist-info/RECORD +644 -0
  643. rasa_pro-3.8.16.dist-info/WHEEL +4 -0
  644. rasa_pro-3.8.16.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,319 @@
1
+ import hashlib
2
+ import logging
3
+ import os
4
+ import re
5
+ import time
6
+ import uuid
7
+ from datetime import datetime, timezone
8
+ from typing import Any, Callable, Dict, Optional, Set, Text
9
+
10
+ import jwt
11
+ from dotenv import dotenv_values
12
+
13
+ LICENSE_ENV_VAR = "RASA_PRO_LICENSE"
14
+ ALGORITHM = "RS256"
15
+ # deepcode ignore HardcodedKey: This is a public key - not a security issue.
16
+ PUBLIC_KEY = """-----BEGIN PUBLIC KEY-----
17
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6L90HBMIeiEUkLw85aRx
18
+ L8qisVwiJwy3E4E/MPKHEuzguUJG3KwQE3Yb37HWi6I8EXOI5UfP2RvbNPKbmYFo
19
+ 90P27rKpvhZRCG9sy3cNu3Xr1XcQ6Eue2e12LWBAgzBZSqjzwkCOtt+L6LIm3lPf
20
+ 2QYSFORTZR9PtOvI1b677W1lVjioRrbg1IG6UXGVOTCmeSFT/JzbsYzR7QFzFdWe
21
+ ytjHVgeb/R9inY1/LeiP2KCHYcYUF2sGc+6CsGvr9Kkio5KS10jBF27EeBaeVpXO
22
+ JH5viXVuRPCu5ymvnih5Rk4VYK3X3rG1rf5oju9OBDPLq7lKklY1pPZjBHADPU3o
23
+ /QIDAQAB
24
+ -----END PUBLIC KEY-----"""
25
+
26
+ # If a license must be revoked before expiration, add its JTI to this list.
27
+ # Adding to this list requires cutting a new release for the change to affect users.
28
+ # Versions prior to the one including the blocked JTI will still
29
+ # be available to blocked users until the regular expiration date
30
+ JTI_BLOCKLIST: Set[Text] = set([])
31
+
32
+ SCOPE_DELIMITER = ":"
33
+ PRODUCT_AREA = "rasa:pro:plus"
34
+ VOICE_SCOPE = "rasa:voice"
35
+
36
+ logger = logging.getLogger(__name__)
37
+
38
+
39
+ class LicenseValidationException(Exception):
40
+ """Parent class for exceptions raised when handling licenses."""
41
+
42
+
43
+ class LicenseSchemaException(LicenseValidationException):
44
+ """Exception raised when a license does not contain the correct fields."""
45
+
46
+
47
+ class LicenseScopeException(LicenseValidationException):
48
+ """Exception raised when a license does not contain the correct scope."""
49
+
50
+
51
+ class LicenseEncodingException(LicenseValidationException):
52
+ """Exception raised when the JWT representing a license is not well-formed."""
53
+
54
+
55
+ class LicenseSignatureInvalidException(LicenseValidationException):
56
+ """Exception raised when a license signature could not be verified."""
57
+
58
+
59
+ class LicenseExpiredException(LicenseValidationException):
60
+ """Exception raised when a license has expired (exp)."""
61
+
62
+
63
+ class LicenseNotYetValidException(LicenseValidationException):
64
+ """Exception raised when a license is not valid yet (nbf)."""
65
+
66
+
67
+ class License:
68
+ """Represents a Rasa Pro license.
69
+
70
+ There a are two ways of instancing an `License` object:
71
+ - Via `decode`: This is the option that should be used 99% of the times.
72
+ This option allows callers to decode a JWT into an `License`
73
+ object, which means that only correctly signed JWT will be decodable.
74
+ Other checks will be performed on the JWT as well. This implies that any
75
+ `License` obtained via `decode` is guaranteed to represent a
76
+ valid license, that is, a license that was obtained via a
77
+ contract/deal/etc. with Rasa Inc (i.e. the owner of the private key).
78
+ - Via `__init__`: This creates an `License` object directly, without
79
+ performing any validations. Useful only for creating new licenses (which
80
+ requires access to the private key to then encode) or for testing
81
+ purposes.
82
+
83
+ """
84
+
85
+ __slots__ = ["jti", "iat", "nbf", "scope", "exp", "email", "company"]
86
+
87
+ def __init__(
88
+ self,
89
+ *,
90
+ company: Text,
91
+ email: Text,
92
+ exp: int,
93
+ scope: Text,
94
+ jti: Optional[Text] = None,
95
+ iat: Optional[int] = None,
96
+ nbf: Optional[int] = None,
97
+ ) -> None:
98
+ """Initializes an instance of `License`.
99
+
100
+ Args:
101
+ company: Company this license is issued to.
102
+ email: Contact email for this license.
103
+ exp: Expiration date (UNIX epoch time).
104
+ scope: The license scope
105
+ jti: JWT unique identifier - a unique identifier for this
106
+ license. Defaults to a UUID4 if not set.
107
+ iat: Created at (UNIX epoch time).
108
+ Defaults to current time if not set.
109
+ nbf: Time at which the license starts being valid (UNIX epoch time).
110
+ Defaults to current time if not set.
111
+ """
112
+ self.company = company
113
+ self.email = email
114
+ self.exp = exp
115
+ self.jti = jti or str(uuid.uuid4())
116
+ self.iat = iat or int(time.time())
117
+ self.nbf = nbf or self.iat
118
+ self.scope = scope
119
+
120
+ def as_dict(self) -> Dict[Text, Any]:
121
+ """Returns this license as a dictionary object.
122
+
123
+ Returns:
124
+ License represented using a `dict`.
125
+ """
126
+ return {attr: getattr(self, attr) for attr in License.__slots__}
127
+
128
+ def __str__(self) -> Text:
129
+ """Returns a text representation of this license.
130
+
131
+ Returns:
132
+ String representing this license.
133
+ """
134
+ return f"License <{self.as_dict()}>"
135
+
136
+ @staticmethod
137
+ def decode(
138
+ encoded_license: Text,
139
+ check_not_before: Optional[bool] = True,
140
+ check_expiration: Optional[bool] = True,
141
+ product_area: Text = PRODUCT_AREA,
142
+ ) -> "License":
143
+ """Returns an instance of `License` from an encoded JWT.
144
+
145
+ Args:
146
+ encoded_license: JWT in encoded form.
147
+ check_not_before: Check if not_before is in the future.
148
+ check_expiration: Check if token has expired.
149
+ product_area: The product scope of the license.
150
+
151
+ Raises:
152
+ LicenseSignatureInvalidException: If the license signature could
153
+ not be validated.
154
+ LicenseNotYetValidException: If the license is not valid yet.
155
+ LicenseExpiredException: If the license has expired, or has been
156
+ blocklisted.
157
+ LicenseEncodingException: If the JWT was not correctly encoded.
158
+ LicenseSchemaException: If the license contains unknown or extra
159
+ fields, or if it is missing fields.
160
+
161
+ Returns:
162
+ A validated enterprise license.
163
+ """
164
+ try:
165
+ decoded = jwt.decode(
166
+ encoded_license,
167
+ key=PUBLIC_KEY,
168
+ algorithms=[ALGORITHM],
169
+ options={
170
+ "verify_nbf": check_not_before,
171
+ "verify_exp": check_expiration,
172
+ },
173
+ )
174
+ except jwt.exceptions.InvalidSignatureError:
175
+ raise LicenseSignatureInvalidException(
176
+ "Could not verify the license's signature."
177
+ )
178
+ except jwt.exceptions.ImmatureSignatureError:
179
+ raise LicenseNotYetValidException("The license is not valid yet (nbf).")
180
+ except jwt.exceptions.ExpiredSignatureError:
181
+ raise LicenseExpiredException("The license has already expired (exp).")
182
+ except jwt.exceptions.DecodeError:
183
+ # Handle `DecodeError` last since other more specific exceptions
184
+ # such as `InvalidSignatureError` inherit from it.
185
+ raise LicenseEncodingException("Could not decode license as JWT.")
186
+
187
+ if set(decoded.keys()) != set(License.__slots__):
188
+ raise LicenseSchemaException("Invalid license schema.")
189
+
190
+ license_scope = decoded.get("scope", "")
191
+ if not is_valid_license_scope(product_area, license_scope):
192
+ raise LicenseScopeException(
193
+ f"The product scope of your issued license does not "
194
+ f"include {product_area}."
195
+ )
196
+
197
+ if decoded["jti"] in JTI_BLOCKLIST:
198
+ raise LicenseExpiredException("The license has already expired.")
199
+
200
+ return License(**decoded)
201
+
202
+ def encode(self, private_key: Text) -> Text:
203
+ """Encodes this license into a JWT.
204
+
205
+ NOTE: This method is only useful in the context of testing, or when
206
+ using administrative scripts such as `license.py`. It
207
+ should not be used otherwise.
208
+
209
+ Args:
210
+ private_key: Private key to use. Should correspond to `PUBLIC_KEY`.
211
+
212
+ Returns:
213
+ Encoded license.
214
+ """
215
+ return jwt.encode(self.as_dict(), key=private_key, algorithm=ALGORITHM)
216
+
217
+
218
+ def date_as_unix_timestamp(utc_date: Text) -> int:
219
+ """Returns a date represented as a UNIX timestamp.
220
+
221
+ Args:
222
+ utc_date: Date as text (YYYY-MM-DD), UTC timezone.
223
+
224
+ Returns:
225
+ Date as UNIX timestamp.
226
+ """
227
+ dt = datetime.strptime(utc_date, "%Y-%m-%d")
228
+ return int(dt.replace(tzinfo=timezone.utc).timestamp())
229
+
230
+
231
+ def retrieve_license_from_env() -> Text:
232
+ """Return the license found in the env var."""
233
+ stored_env_values = dotenv_values(".env")
234
+ license_from_env = os.environ.get(LICENSE_ENV_VAR)
235
+ license = license_from_env or stored_env_values.get(LICENSE_ENV_VAR)
236
+ if not license:
237
+ raise SystemExit(
238
+ f"A Rasa Pro license is required. "
239
+ f"Please set the environmental variable "
240
+ f"`{LICENSE_ENV_VAR}` to a valid license string. "
241
+ )
242
+ return license
243
+
244
+
245
+ def validate_license_from_env(product_area: Text = PRODUCT_AREA) -> None:
246
+ license = retrieve_license_from_env()
247
+ try:
248
+ License.decode(license, product_area=product_area)
249
+ except LicenseValidationException as e:
250
+ logger.error(e)
251
+ raise SystemExit(
252
+ f"Failed to validate Rasa Pro license "
253
+ f"which was read from environmental variable `{LICENSE_ENV_VAR}`. "
254
+ f"Please ensure `{LICENSE_ENV_VAR}` is set to a valid license string. "
255
+ )
256
+
257
+
258
+ def is_valid_license_scope(product_area: Text, license_scope: Text) -> bool:
259
+ """Verifies that the license scope matches the rasa-plus product area."""
260
+ required_scopes = derive_scope_hierarchy(product_area)
261
+ licensed_product_areas = derive_scope_hierarchy(license_scope)
262
+
263
+ # update scopes that are required but not present in the license scope
264
+ required_scopes.difference_update(licensed_product_areas)
265
+
266
+ # this is dependent on a format where each product area is separated
267
+ # by whitespace in the license scope field value
268
+ licensed_scopes = license_scope.split()
269
+
270
+ # initialise a variable to count matches of
271
+ # licensed sub product scope pattern found in the required scopes set
272
+ sub_product_scope_match_count = 0
273
+
274
+ for required in required_scopes:
275
+ for licensed in licensed_scopes:
276
+ if re.search(licensed, required) is not None:
277
+ sub_product_scope_match_count += 1
278
+
279
+ return sub_product_scope_match_count == len(required_scopes)
280
+
281
+
282
+ def derive_scope_hierarchy(scope: Text) -> Set[Text]:
283
+ """Derives all upper levels of the specified scopes and adds to a resulting set.
284
+
285
+ For example, the `rasa:pro:plus` scope would result in the following set:
286
+ {rasa, rasa:pro, rasa:pro:plus}.
287
+ """
288
+ product_hierarchy = [area.split(SCOPE_DELIMITER) for area in scope.split()]
289
+ required_scopes = [
290
+ SCOPE_DELIMITER.join(hierarchy[0:end])
291
+ for hierarchy in product_hierarchy
292
+ for end in range(1, len(hierarchy) + 1)
293
+ ]
294
+
295
+ return set(required_scopes)
296
+
297
+
298
+ def property_of_active_license(prop: Callable[[License], str]) -> Optional[str]:
299
+ """Return a property for this installation based on license.
300
+
301
+ Returns:
302
+ The property of the license if it exists, otherwise None.
303
+ """
304
+ retrieved_license = os.environ.get(LICENSE_ENV_VAR)
305
+ if not retrieved_license:
306
+ return None
307
+
308
+ try:
309
+ decoded = License.decode(retrieved_license)
310
+ return prop(decoded)
311
+ except LicenseValidationException as e:
312
+ logger.warning("The provided license is invalid.", exc_info=e)
313
+ return None
314
+
315
+
316
+ def get_license_hash() -> Optional[Text]:
317
+ """Return the hash of the current active license."""
318
+ license_value = retrieve_license_from_env()
319
+ return hashlib.sha256(license_value.encode("utf-8")).hexdigest()
@@ -0,0 +1,174 @@
1
+ from __future__ import annotations
2
+ import os
3
+ import logging
4
+ import sys
5
+ from typing import Any, Dict, Optional
6
+
7
+ import structlog
8
+ from structlog_sentry import SentryProcessor
9
+ from structlog.dev import ConsoleRenderer
10
+ from structlog.typing import EventDict, WrappedLogger
11
+ from rasa.shared.constants import (
12
+ ENV_LOG_LEVEL,
13
+ DEFAULT_LOG_LEVEL,
14
+ ENV_LOG_LEVEL_LLM,
15
+ ENV_LOG_LEVEL_LLM_MODULE_NAMES,
16
+ DEFAULT_LOG_LEVEL_LLM,
17
+ )
18
+ from rasa.plugin import plugin_manager
19
+
20
+
21
+ FORCE_JSON_LOGGING = os.environ.get("FORCE_JSON_LOGGING")
22
+
23
+
24
+ class HumanConsoleRenderer(ConsoleRenderer):
25
+ """Console renderer that outputs human-readable logs."""
26
+
27
+ def __call__(self, logger: WrappedLogger, name: str, event_dict: EventDict) -> str:
28
+ if "event_info" in event_dict:
29
+ event_key = event_dict["event"]
30
+ event_dict["event"] = event_dict["event_info"]
31
+ event_dict["event_key"] = event_key
32
+ del event_dict["event_info"]
33
+
34
+ return super().__call__(logger, name, event_dict)
35
+
36
+
37
+ def _anonymizer(
38
+ _: structlog.BoundLogger, __: str, event_dict: Dict[str, Any]
39
+ ) -> Dict[str, Any]:
40
+ """Anonymizes event dict."""
41
+ anonymizable_keys = [
42
+ "text",
43
+ "response_text",
44
+ "user_text",
45
+ "slots",
46
+ "parse_data_text",
47
+ "parse_data_entities",
48
+ "prediction_events",
49
+ "tracker_latest_message",
50
+ "prefilled_slots",
51
+ "message",
52
+ "response",
53
+ "slot_candidates",
54
+ "rasa_event",
55
+ "rasa_events",
56
+ "tracker_states",
57
+ "current_states",
58
+ "old_states",
59
+ "current_states",
60
+ "successes",
61
+ "current_entity",
62
+ "next_entity",
63
+ "states",
64
+ "entity",
65
+ "token_text",
66
+ "user_message",
67
+ "json_message",
68
+ ]
69
+ anonymization_pipeline = plugin_manager().hook.get_anonymization_pipeline()
70
+
71
+ if anonymization_pipeline:
72
+ for key in anonymizable_keys:
73
+ if key in event_dict:
74
+ anonymized_value = anonymization_pipeline.log_run(event_dict[key])
75
+ event_dict[key] = anonymized_value
76
+ return event_dict
77
+
78
+
79
+ def configure_structlog(
80
+ log_level: Optional[int] = None,
81
+ ) -> None:
82
+ """Configure logging of the server."""
83
+ if log_level is None: # Log level NOTSET is 0 so we use `is None` here
84
+ log_level_name = os.environ.get(ENV_LOG_LEVEL, DEFAULT_LOG_LEVEL)
85
+ # Change log level from str to int (note that log_level in function parameter
86
+ # int already, coming from CLI argparse parameter).
87
+ log_level = logging.getLevelName(log_level_name)
88
+
89
+ logging.basicConfig(
90
+ format="%(message)s",
91
+ stream=sys.stdout,
92
+ level=log_level,
93
+ )
94
+
95
+ shared_processors = [
96
+ _anonymizer,
97
+ # Processors that have nothing to do with output,
98
+ # e.g., add timestamps or log level names.
99
+ # If log level is too low, abort pipeline and throw away log entry.
100
+ structlog.stdlib.filter_by_level,
101
+ structlog.contextvars.merge_contextvars,
102
+ # Add the name of the logger to event dict.
103
+ # structlog.stdlib.add_logger_name,
104
+ # Add log level to event dict.
105
+ structlog.processors.add_log_level,
106
+ # If the "stack_info" key in the event dict is true, remove it and
107
+ # render the current stack trace in the "stack" key.
108
+ structlog.processors.StackInfoRenderer(),
109
+ # If some value is in bytes, decode it to a unicode str.
110
+ structlog.processors.UnicodeDecoder(),
111
+ structlog.dev.set_exc_info,
112
+ # add structlog sentry integration. only log fatal log entries
113
+ # as events as we are tracking exceptions anyways
114
+ SentryProcessor(event_level=logging.FATAL),
115
+ ]
116
+
117
+ if not FORCE_JSON_LOGGING and sys.stderr.isatty():
118
+ # Pretty printing when we run in a terminal session.
119
+ # Automatically prints pretty tracebacks when "rich" is installed
120
+ processors = shared_processors + [
121
+ HumanConsoleRenderer(),
122
+ ]
123
+ else:
124
+ # Print JSON when we run, e.g., in a Docker container.
125
+ # Also print structured tracebacks.
126
+ processors = shared_processors + [
127
+ structlog.processors.dict_tracebacks,
128
+ structlog.processors.JSONRenderer(),
129
+ ]
130
+
131
+ structlog.configure(
132
+ processors=processors, # type: ignore
133
+ context_class=dict,
134
+ # `logger_factory` is used to create wrapped loggers that are used for
135
+ # OUTPUT. This one returns a `logging.Logger`. The final value (a JSON
136
+ # string) from the final processor (`JSONRenderer`) will be passed to
137
+ # the method of the same name as that you've called on the bound logger.
138
+ logger_factory=structlog.stdlib.LoggerFactory(),
139
+ # `wrapper_class` is the bound logger that you get back from
140
+ # get_logger(). This one imitates the API of `logging.Logger`.
141
+ wrapper_class=structlog.make_filtering_bound_logger(log_level),
142
+ # Effectively freeze configuration after creating the first bound
143
+ # logger.
144
+ cache_logger_on_first_use=True,
145
+ )
146
+
147
+
148
+ def log_llm(logger: Any, log_module: str, log_event: str, **kwargs: Any) -> None:
149
+ """Logs LLM-specific events depending on a flag passed through an environment
150
+ variable. If the module's flag is set to INFO (e.g.
151
+ LOG_PROMPT_LLM_COMMAND_GENERATOR=INFO), its prompt is logged at INFO level,
152
+ overriding the general log level setting.
153
+
154
+ Args:
155
+ logger: instance of the structlogger of the component
156
+ log_module: name of the module/component logging the event
157
+ log_event: string describing the log event
158
+ **kwargs: dictionary of additional logging context
159
+ """
160
+ log_level_llm_name = os.environ.get(ENV_LOG_LEVEL_LLM, DEFAULT_LOG_LEVEL_LLM)
161
+ log_level_llm = logging.getLevelName(log_level_llm_name.upper())
162
+
163
+ module_env_variable = ENV_LOG_LEVEL_LLM_MODULE_NAMES.get(
164
+ log_module, "LOG_LEVEL_LLM_" + log_module.upper()
165
+ )
166
+ log_level_llm_module_name = os.environ.get(
167
+ module_env_variable, DEFAULT_LOG_LEVEL_LLM
168
+ )
169
+ log_level_llm_module = logging.getLevelName(log_level_llm_module_name.upper())
170
+
171
+ # log at the highest specified level, e.g. max(DEBUG=10, INFO=20)
172
+ log_level = max(log_level_llm, log_level_llm_module)
173
+
174
+ logger.log(log_level, log_event, **kwargs)
rasa/utils/mapper.py ADDED
@@ -0,0 +1,210 @@
1
+ from pathlib import Path
2
+ from typing import Dict, List, Optional, Text, Union
3
+
4
+ import rasa.shared.data
5
+ import rasa.shared.utils.io
6
+ from rasa.shared.core.domain import (
7
+ KEY_ACTIONS,
8
+ KEY_ENTITIES,
9
+ KEY_FORMS,
10
+ KEY_INTENTS,
11
+ KEY_RESPONSES,
12
+ KEY_SLOTS,
13
+ Domain,
14
+ )
15
+ from rasa.shared.core.flows.yaml_flows_io import KEY_FLOWS, is_flows_file
16
+ from rasa.shared.core.training_data.story_reader.yaml_story_reader import (
17
+ KEY_RULE_NAME,
18
+ KEY_RULES,
19
+ KEY_STORIES,
20
+ KEY_STORY_NAME,
21
+ YAMLStoryReader,
22
+ )
23
+ from rasa.shared.nlu.training_data.formats.rasa_yaml import (
24
+ KEY_INTENT,
25
+ KEY_NLU,
26
+ )
27
+ from rasa.shared.utils.yaml import read_yaml_file
28
+
29
+
30
+ class RasaPrimitiveStorageMapper:
31
+ """Maps the Rasa primitives to the file its located in."""
32
+
33
+ def __init__(
34
+ self,
35
+ domain_path: Optional[Union[Text, Path]] = None,
36
+ training_data_paths: Optional[Union[List[Text], List[Path], Text, Path]] = None,
37
+ ):
38
+ self._primitives: Dict[str, Dict] = {
39
+ "entities": {},
40
+ "slots": {},
41
+ "forms": {},
42
+ "intents": {},
43
+ "stories": {},
44
+ "rules": {},
45
+ "actions": {},
46
+ "responses": {},
47
+ "flows": {},
48
+ }
49
+
50
+ if domain_path:
51
+ self._load_domain(domain_path)
52
+
53
+ if training_data_paths:
54
+ self._load_training_data(training_data_paths)
55
+
56
+ def _load_domain(self, domain_path: Union[Text, Path]) -> None:
57
+ self._resolve_domain_files(domain_path)
58
+ self._parse_domain_files()
59
+
60
+ def _load_training_data(
61
+ self, training_data_paths: Union[List[Text], List[Path], Text, Path]
62
+ ) -> None:
63
+ self._resolve_training_data_files(training_data_paths)
64
+
65
+ self._nlu_files = rasa.shared.data.get_data_files(
66
+ self._training_data_paths, rasa.shared.data.is_nlu_file
67
+ )
68
+ self._parse_nlu_data()
69
+
70
+ self._story_files = rasa.shared.data.get_data_files(
71
+ self._training_data_paths, YAMLStoryReader.is_stories_file
72
+ )
73
+ self._parse_story_data()
74
+
75
+ self._flow_files = rasa.shared.data.get_data_files(
76
+ self._training_data_paths, is_flows_file
77
+ )
78
+ self._parse_flow_data()
79
+
80
+ def _resolve_training_data_files(
81
+ self, training_data_paths: Union[List[Text], List[Path], Text, Path]
82
+ ) -> None:
83
+ if isinstance(training_data_paths, list):
84
+ training_data_paths = [Path(p) for p in training_data_paths]
85
+ elif isinstance(training_data_paths, str):
86
+ training_data_paths = [Path(training_data_paths)]
87
+ elif isinstance(training_data_paths, Path):
88
+ training_data_paths = [training_data_paths]
89
+
90
+ self._training_data_paths = training_data_paths
91
+
92
+ def _resolve_domain_files(self, domain_path: Union[Text, Path]) -> None:
93
+ domain_path = Path(domain_path) if isinstance(domain_path, str) else domain_path
94
+
95
+ if domain_path.is_dir():
96
+ self._domain_files = [
97
+ file for file in domain_path.iterdir() if Domain.is_domain_file(file)
98
+ ]
99
+ else:
100
+ self._domain_files = [domain_path]
101
+
102
+ def _parse_domain_files(self) -> None:
103
+ for domain_file in self._domain_files:
104
+ content = read_yaml_file(domain_file)
105
+ for entity in content.get(KEY_ENTITIES, []): # type: ignore[union-attr]
106
+ self._assign_value(
107
+ self._primitives["entities"], "domain", domain_file, entity
108
+ )
109
+ for intent in content.get(KEY_INTENTS, []): # type: ignore[union-attr]
110
+ self._assign_value(
111
+ self._primitives["intents"], "domain", domain_file, intent
112
+ )
113
+ for slot in content.get(KEY_SLOTS, []): # type: ignore[union-attr]
114
+ self._assign_value(
115
+ self._primitives["slots"], "domain", domain_file, slot
116
+ )
117
+ for form in content.get(KEY_FORMS, []): # type: ignore[union-attr]
118
+ self._assign_value(
119
+ self._primitives["forms"], "domain", domain_file, form
120
+ )
121
+ for action in content.get(KEY_ACTIONS, []): # type: ignore[union-attr]
122
+ self._assign_value(
123
+ self._primitives["actions"], "domain", domain_file, action
124
+ )
125
+ for response in content.get(KEY_RESPONSES, []): # type: ignore[union-attr]
126
+ self._assign_value(
127
+ self._primitives["responses"], "domain", domain_file, response
128
+ )
129
+
130
+ def _parse_nlu_data(self) -> None:
131
+ """Parses the nlu data and extracts the intents."""
132
+ for nlu_file in self._nlu_files:
133
+ content = read_yaml_file(nlu_file)
134
+ for intent in content.get(KEY_NLU, []): # type: ignore[union-attr]
135
+ if KEY_INTENT in intent:
136
+ self._assign_value(
137
+ self._primitives["intents"],
138
+ "training",
139
+ nlu_file,
140
+ intent.get(KEY_INTENT),
141
+ )
142
+
143
+ def _parse_story_data(self) -> None:
144
+ """Parses the story data and extracts the stories and rules."""
145
+ for story_file in self._story_files:
146
+ content = read_yaml_file(story_file)
147
+ for story in content.get(KEY_STORIES, []): # type: ignore[union-attr]
148
+ self._assign_value(
149
+ self._primitives["stories"],
150
+ "training",
151
+ story_file,
152
+ story[KEY_STORY_NAME],
153
+ )
154
+ for rule in content.get(KEY_RULES, []): # type: ignore[union-attr]
155
+ self._assign_value(
156
+ self._primitives["rules"],
157
+ "training",
158
+ story_file,
159
+ rule[KEY_RULE_NAME],
160
+ )
161
+
162
+ def _parse_flow_data(self) -> None:
163
+ """Parses the flow data and extracts the flow ids."""
164
+ for flow_file in self._flow_files:
165
+ content = read_yaml_file(flow_file)
166
+ for flow in content.get(KEY_FLOWS, []): # type: ignore[union-attr]
167
+ self._assign_value(
168
+ self._primitives["flows"],
169
+ "training",
170
+ flow_file,
171
+ flow,
172
+ )
173
+
174
+ @staticmethod
175
+ def _assign_value(
176
+ primitive: Dict, file_type: str, value: Union[str, Path], key: str
177
+ ) -> None:
178
+ if not isinstance(value, Path):
179
+ value = Path(value)
180
+
181
+ if isinstance(key, dict):
182
+ key = next(iter(key.keys()))
183
+
184
+ if key in primitive:
185
+ if file_type in primitive[key]:
186
+ primitive[key][file_type].append(value)
187
+ else:
188
+ primitive[key][file_type] = [value]
189
+ else:
190
+ primitive[key] = {file_type: [value]}
191
+
192
+ def get_file(self, primitive: Text, primitive_type: Text) -> Dict[str, List[Path]]:
193
+ """Returns the file where the primitive is located.
194
+
195
+ If the primitive is not found, empty dict is returned.
196
+
197
+ Args:
198
+ primitive: The name or ID of the primitive to search for.
199
+ primitive_type: The type of the primitive to search for.
200
+ either entities, slots, forms, intents, stories or rules.
201
+
202
+ Returns:
203
+ A dictionary containing the file type and the list of file paths.
204
+ file_type can be either domain or training.
205
+ get_file()[file_type] -> List[Path]
206
+ """
207
+ try:
208
+ return self._primitives[primitive_type][primitive]
209
+ except KeyError:
210
+ return {}