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,786 @@
1
+ import logging
2
+ import os
3
+ import re
4
+ from collections import OrderedDict
5
+ from dataclasses import dataclass
6
+ from dataclasses import field
7
+ from functools import lru_cache
8
+ from io import StringIO
9
+ from pathlib import Path
10
+ from typing import Dict, List, Optional, Any, Callable, Tuple, Union
11
+
12
+ import jsonschema
13
+ from importlib_resources import files
14
+ from packaging import version
15
+ from packaging.version import LegacyVersion
16
+ from pykwalify.core import Core
17
+ from pykwalify.errors import SchemaError
18
+ from ruamel import yaml as yaml
19
+ from ruamel.yaml import RoundTripRepresenter, YAMLError
20
+ from ruamel.yaml.constructor import DuplicateKeyError, BaseConstructor, ScalarNode
21
+ from ruamel.yaml.comments import CommentedSeq, CommentedMap
22
+
23
+ from rasa.shared.constants import (
24
+ MODEL_CONFIG_SCHEMA_FILE,
25
+ CONFIG_SCHEMA_FILE,
26
+ DOCS_URL_TRAINING_DATA,
27
+ PACKAGE_NAME,
28
+ LATEST_TRAINING_DATA_FORMAT_VERSION,
29
+ SCHEMA_EXTENSIONS_FILE,
30
+ RESPONSES_SCHEMA_FILE,
31
+ )
32
+ from rasa.shared.exceptions import (
33
+ YamlException,
34
+ YamlSyntaxException,
35
+ SchemaValidationError,
36
+ RasaException,
37
+ FileNotFoundException,
38
+ )
39
+ from rasa.shared.utils.constants import (
40
+ DEFAULT_ENCODING,
41
+ READ_YAML_FILE_CACHE_MAXSIZE_ENV_VAR,
42
+ DEFAULT_READ_YAML_FILE_CACHE_MAXSIZE,
43
+ )
44
+ from rasa.shared.utils.io import (
45
+ read_file,
46
+ convert_to_ordered_dict,
47
+ raise_warning,
48
+ read_json_file,
49
+ )
50
+
51
+ logger = logging.getLogger(__name__)
52
+
53
+ KEY_TRAINING_DATA_FORMAT_VERSION = "version"
54
+ YAML_VERSION = (1, 2)
55
+ READ_YAML_FILE_CACHE_MAXSIZE = os.environ.get(
56
+ READ_YAML_FILE_CACHE_MAXSIZE_ENV_VAR, DEFAULT_READ_YAML_FILE_CACHE_MAXSIZE
57
+ )
58
+
59
+
60
+ @dataclass
61
+ class PathWithError:
62
+ message: str
63
+ path: List[str] = field(default_factory=list)
64
+
65
+
66
+ def fix_yaml_loader() -> None:
67
+ """Ensure that any string read by yaml is represented as unicode."""
68
+
69
+ def construct_yaml_str(self: BaseConstructor, node: ScalarNode) -> Any:
70
+ # Override the default string handling function
71
+ # to always return unicode objects
72
+ return self.construct_scalar(node)
73
+
74
+ yaml.Loader.add_constructor("tag:yaml.org,2002:str", construct_yaml_str)
75
+ yaml.SafeLoader.add_constructor("tag:yaml.org,2002:str", construct_yaml_str)
76
+
77
+
78
+ def replace_environment_variables() -> None:
79
+ """Enable yaml loader to process the environment variables in the yaml."""
80
+ # eg. ${USER_NAME}, ${PASSWORD}
81
+ env_var_pattern = re.compile(r"^(.*)\$\{(.*)\}(.*)$")
82
+ yaml.Resolver.add_implicit_resolver("!env_var", env_var_pattern, None)
83
+
84
+ def env_var_constructor(loader: BaseConstructor, node: ScalarNode) -> str:
85
+ """Process environment variables found in the YAML."""
86
+ value = loader.construct_scalar(node)
87
+ expanded_vars = os.path.expandvars(value)
88
+ not_expanded = [
89
+ w for w in expanded_vars.split() if w.startswith("$") and w in value
90
+ ]
91
+ if not_expanded:
92
+ raise RasaException(
93
+ f"Error when trying to expand the "
94
+ f"environment variables in '{value}'. "
95
+ f"Please make sure to also set these "
96
+ f"environment variables: '{not_expanded}'."
97
+ )
98
+ return expanded_vars
99
+
100
+ yaml.SafeConstructor.add_constructor("!env_var", env_var_constructor)
101
+
102
+
103
+ fix_yaml_loader()
104
+ replace_environment_variables()
105
+
106
+
107
+ class YamlValidationException(YamlException, ValueError):
108
+ """Raised if a yaml file does not correspond to the expected schema."""
109
+
110
+ def __init__(
111
+ self,
112
+ message: str,
113
+ validation_errors: Optional[List[PathWithError]] = None,
114
+ filename: Optional[str] = None,
115
+ content: Any = None,
116
+ ) -> None:
117
+ """Create The Error.
118
+
119
+ Args:
120
+ message: error message
121
+ validation_errors: validation errors
122
+ filename: name of the file which was validated
123
+ content: yaml content loaded from the file (used for line information)
124
+ """
125
+ super(YamlValidationException, self).__init__(filename)
126
+
127
+ self.message = message
128
+ self.validation_errors = validation_errors
129
+ self.content = content
130
+
131
+ def __str__(self) -> str:
132
+ msg = self.file_error_message()
133
+ msg += " Failed to validate YAML. "
134
+ msg += self.message
135
+ if self.validation_errors:
136
+ unique_errors = {}
137
+ for error in self.validation_errors:
138
+ line_number = self._line_number_for_path(self.content, error.path)
139
+
140
+ if line_number and self.filename:
141
+ error_representation = f" in {self.filename}:{line_number}:\n"
142
+ elif line_number:
143
+ error_representation = f" in Line {line_number}:\n"
144
+ else:
145
+ error_representation = ""
146
+
147
+ error_representation += f" {error.message}"
148
+ unique_errors[error.message] = error_representation
149
+ error_msg = "\n".join(unique_errors.values())
150
+ msg += f":\n{error_msg}"
151
+ return msg
152
+
153
+ def _calculate_number_of_lines(
154
+ self,
155
+ current: Union[CommentedSeq, CommentedMap],
156
+ target: Optional[str] = None,
157
+ ) -> Tuple[int, bool]:
158
+ """Counts the lines that are missing due to the ruamel yaml parser logic.
159
+
160
+ Since not all nodes returned from the ruamel yaml parser
161
+ have line numbers attached (arrays have them, dicts have
162
+ them, but strings don't), this method calculates the number
163
+ of lines that are missing instead of just returning line of the parent element
164
+
165
+ Args:
166
+ current: current content
167
+ target: target key to find the line number of
168
+
169
+ Returns:
170
+ A tuple containing a number of missing lines
171
+ and a flag indicating if an element with a line number was found
172
+ """
173
+ if isinstance(current, list):
174
+ # return the line number of the last list element
175
+ line_number = current[-1].lc.line + 1
176
+ logger.debug(f"Returning from list: last element at {line_number}")
177
+ return line_number, True
178
+
179
+ keys_to_check = list(current.keys())
180
+ if target:
181
+ # If target is specified, only check keys before it
182
+ keys_to_check = keys_to_check[: keys_to_check.index(target)]
183
+ try:
184
+ # find the last key that has a line number attached
185
+ last_key_with_lc = next(
186
+ iter(
187
+ [
188
+ key
189
+ for key in reversed(keys_to_check)
190
+ if hasattr(current[key], "lc")
191
+ ]
192
+ )
193
+ )
194
+ logger.debug(f"Last key with line number: {last_key_with_lc}")
195
+ except StopIteration:
196
+ # otherwise return the number of elements on that level up to the target
197
+ logger.debug(f"No line number found in {current}")
198
+ if target:
199
+ return list(current.keys()).index(target), False
200
+ return len(list(current.keys())), False
201
+
202
+ offset = current[last_key_with_lc].lc.line if not target else 0
203
+ # Recursively calculate the number of lines
204
+ # for the element associated with the last key with a line number
205
+ child_offset, found_lc = self._calculate_number_of_lines(
206
+ current[last_key_with_lc]
207
+ )
208
+ if not found_lc:
209
+ child_offset += offset
210
+ if target:
211
+ child_offset += 1
212
+ # add the number of trailing keys without line numbers to the offset
213
+ last_idx_with_lc = keys_to_check.index(last_key_with_lc)
214
+ child_offset += len(keys_to_check[last_idx_with_lc + 1 :])
215
+
216
+ logger.debug(f"Analysed {current}, found {child_offset} lines")
217
+ # Return the calculated child offset and True indicating a line number was found
218
+ return child_offset, True
219
+
220
+ def _line_number_for_path(self, current: Any, path: List[str]) -> Optional[int]:
221
+ """Get line number for a yaml path in the current content.
222
+
223
+ Implemented using recursion: algorithm goes down the path navigating to the
224
+ leaf in the YAML tree.
225
+
226
+ Args:
227
+ current: current content
228
+ path: path to traverse within the content
229
+
230
+ Returns:
231
+ the line number of the path in the content.
232
+ """
233
+ if not current:
234
+ return None
235
+
236
+ this_line = current.lc.line + 1 if hasattr(current, "lc") else None
237
+
238
+ if not path:
239
+ return this_line
240
+
241
+ head, tail = path[0], path[1:]
242
+
243
+ if head == "":
244
+ return current.lc.line
245
+
246
+ if head:
247
+ if isinstance(current, dict) and head in current:
248
+ line = self._line_number_for_path(current[head], tail)
249
+ if line is None:
250
+ line_offset, found_lc = self._calculate_number_of_lines(
251
+ current, head
252
+ )
253
+ if found_lc:
254
+ return line_offset
255
+ return this_line + line_offset
256
+ return line
257
+ elif isinstance(current, list) and head.isdigit():
258
+ return self._line_number_for_path(current[int(head)], tail) or this_line
259
+ else:
260
+ return this_line
261
+ return self._line_number_for_path(current, tail) or this_line
262
+
263
+
264
+ def read_schema_file(
265
+ schema_file: str, package_name: str = PACKAGE_NAME
266
+ ) -> Union[List[Any], Dict[str, Any]]:
267
+ """Read a schema file from the package.
268
+
269
+ Args:
270
+ schema_file: The schema file to read.
271
+ package_name: the name of the package the schema is located in. defaults
272
+ to `rasa`.
273
+
274
+ Returns:
275
+ The schema as a dictionary.
276
+ """
277
+ schema_path = str(files(package_name).joinpath(schema_file))
278
+ return read_yaml_file(schema_path)
279
+
280
+
281
+ def parse_raw_yaml(raw_yaml_content: str) -> Dict[str, Any]:
282
+ """Parses yaml from a text and raises an exception if the content is not valid.
283
+
284
+ Args:
285
+ raw_yaml_content: A raw text containing yaml content.
286
+
287
+ Returns:
288
+ The parsed content of the YAML.
289
+ If the content is not valid, a `YamlSyntaxException` will be raised.
290
+ """
291
+ try:
292
+ source_data = read_yaml(raw_yaml_content, reader_type=["safe", "rt"])
293
+ except (YAMLError, DuplicateKeyError) as e:
294
+ raise YamlSyntaxException(underlying_yaml_exception=e)
295
+
296
+ return source_data
297
+
298
+
299
+ def validate_yaml_content_using_schema(
300
+ yaml_content: Any,
301
+ schema_content: Union[List[Any], Dict[str, Any]],
302
+ schema_extensions: Optional[List[str]] = None,
303
+ ) -> None:
304
+ """Validate yaml content using a schema with optional schema extensions.
305
+
306
+ Args:
307
+ yaml_content: the content of the YAML to be validated
308
+ schema_content: the content of the YAML schema
309
+ schema_extensions: pykwalify schema extension files
310
+ """
311
+ log = logging.getLogger("pykwalify")
312
+ log.setLevel(logging.CRITICAL)
313
+
314
+ core = Core(
315
+ source_data=yaml_content,
316
+ schema_data=schema_content,
317
+ extensions=schema_extensions,
318
+ )
319
+
320
+ try:
321
+ core.validate(raise_exception=True)
322
+ except SchemaError:
323
+ raise YamlValidationException(
324
+ "Please make sure the file is correct and all "
325
+ "mandatory parameters are specified. Here are the errors "
326
+ "found during validation",
327
+ [
328
+ PathWithError(message=str(e), path=e.path.split("/"))
329
+ for e in core.errors
330
+ ],
331
+ content=yaml_content,
332
+ )
333
+
334
+
335
+ def validate_raw_yaml_using_schema(
336
+ raw_yaml_content: str,
337
+ schema_content: Dict[str, Any],
338
+ schema_extensions: Optional[List[str]] = None,
339
+ ) -> None:
340
+ """Validate raw yaml content using a schema.
341
+
342
+ If the content is not valid, a `YamlSyntaxException` will be raised.
343
+
344
+ Args:
345
+ raw_yaml_content: the raw YAML content to be validated (usually a string)
346
+ schema_content: the schema for the yaml_file_content
347
+ schema_extensions: pykwalify schema extension files
348
+ """
349
+ try:
350
+ # we need "rt" since
351
+ # it will add meta information to the parsed output. this meta information
352
+ # will include e.g. at which line an object was parsed. this is very
353
+ # helpful when we validate files later on and want to point the user to the
354
+ # right line
355
+ yaml_data = read_yaml(raw_yaml_content, reader_type=["safe", "rt"])
356
+ except (YAMLError, DuplicateKeyError) as e:
357
+ raise YamlSyntaxException(underlying_yaml_exception=e)
358
+
359
+ validate_yaml_content_using_schema(yaml_data, schema_content, schema_extensions)
360
+
361
+
362
+ def validate_raw_yaml_using_schema_file(
363
+ raw_yaml_content: str, schema_path: str, package_name: str = PACKAGE_NAME
364
+ ) -> None:
365
+ """Validate raw yaml content using a schema from file.
366
+
367
+ Args:
368
+ raw_yaml_content: the raw YAML content to be validated (usually a string)
369
+ schema_path: the schema used for validation
370
+ package_name: the name of the package the schema is located in. defaults
371
+ to `rasa`.
372
+ """
373
+ schema_content = read_schema_file(schema_path, package_name)
374
+ validate_raw_yaml_using_schema(raw_yaml_content, schema_content)
375
+
376
+
377
+ def validate_raw_yaml_content_using_schema_with_responses(
378
+ raw_yaml_content: str,
379
+ schema_content: Union[List[Any], Dict[str, Any]],
380
+ package_name: str = PACKAGE_NAME,
381
+ ) -> None:
382
+ """Validate raw yaml content using a schema with responses sub-schema.
383
+
384
+ Args:
385
+ raw_yaml_content: the raw YAML content to be validated (usually a string)
386
+ schema_content: the content of the YAML schema
387
+ package_name: the name of the package the schema is located in. defaults
388
+ to `rasa`.
389
+ """
390
+ # bot responses are part of the schema extension
391
+ # it will be included if the schema explicitly references it with include: responses
392
+ bot_responses_schema_content = read_schema_file(RESPONSES_SCHEMA_FILE, package_name)
393
+ schema_content = dict(schema_content, **bot_responses_schema_content)
394
+ schema_extensions = [str(files(package_name).joinpath(SCHEMA_EXTENSIONS_FILE))]
395
+
396
+ validate_raw_yaml_using_schema(raw_yaml_content, schema_content, schema_extensions)
397
+
398
+
399
+ def validate_raw_yaml_using_schema_file_with_responses(
400
+ raw_yaml_content: str, schema_path: str, package_name: str = PACKAGE_NAME
401
+ ) -> None:
402
+ """Validate domain yaml content using a schema from file with responses sub-schema.
403
+
404
+ Args:
405
+ raw_yaml_content: the raw YAML content to be validated (usually a string)
406
+ schema_path: the schema of the yaml file
407
+ package_name: the name of the package the schema is located in. defaults
408
+ to `rasa`.
409
+ """
410
+ schema_content = read_schema_file(schema_path, package_name)
411
+ validate_raw_yaml_content_using_schema_with_responses(
412
+ raw_yaml_content, schema_content, package_name
413
+ )
414
+
415
+
416
+ def read_yaml(content: str, reader_type: Union[str, List[str]] = "safe") -> Any:
417
+ """Parses yaml from a text.
418
+
419
+ Args:
420
+ content: A text containing yaml content.
421
+ reader_type: Reader type to use. By default, "safe" will be used.
422
+
423
+ Raises:
424
+ ruamel.yaml.parser.ParserError: If there was an error when parsing the YAML.
425
+ """
426
+ if _is_ascii(content):
427
+ # Required to make sure emojis are correctly parsed
428
+ content = (
429
+ content.encode("utf-8")
430
+ .decode("raw_unicode_escape")
431
+ .encode("utf-16", "surrogatepass")
432
+ .decode("utf-16")
433
+ )
434
+
435
+ yaml_parser = yaml.YAML(typ=reader_type)
436
+ yaml_parser.version = YAML_VERSION # type: ignore[assignment]
437
+ yaml_parser.preserve_quotes = True # type: ignore[assignment]
438
+
439
+ return yaml_parser.load(content) or {}
440
+
441
+
442
+ def _is_ascii(text: str) -> bool:
443
+ return all(ord(character) < 128 for character in text)
444
+
445
+
446
+ @lru_cache(maxsize=READ_YAML_FILE_CACHE_MAXSIZE)
447
+ def read_yaml_file(
448
+ filename: Union[str, Path], reader_type: Union[str, Tuple[str]] = "safe"
449
+ ) -> Union[List[Any], Dict[str, Any]]:
450
+ """Parses a yaml file.
451
+
452
+ Raises an exception if the content of the file can not be parsed as YAML.
453
+
454
+ Args:
455
+ filename: The path to the file which should be read.
456
+ reader_type: Reader type to use. By default "safe" will be used.
457
+
458
+ Returns:
459
+ Parsed content of the file.
460
+ """
461
+ try:
462
+ fixed_reader_type = (
463
+ list(reader_type) if isinstance(reader_type, tuple) else reader_type
464
+ )
465
+ return read_yaml(read_file(filename, DEFAULT_ENCODING), fixed_reader_type)
466
+ except (YAMLError, DuplicateKeyError) as e:
467
+ raise YamlSyntaxException(filename, e)
468
+
469
+
470
+ def read_config_file(
471
+ filename: Union[Path, str], reader_type: Union[str, List[str]] = "safe"
472
+ ) -> Dict[str, Any]:
473
+ """Parses a yaml configuration file. Content needs to be a dictionary.
474
+
475
+ Args:
476
+ filename: The path to the file which should be read.
477
+ reader_type: Reader type to use. By default "safe" will be used.
478
+
479
+ Raises:
480
+ YamlValidationException: In case file content is not a `Dict`.
481
+
482
+ Returns:
483
+ Parsed config file.
484
+ """
485
+ return read_validated_yaml(filename, CONFIG_SCHEMA_FILE, reader_type)
486
+
487
+
488
+ def read_model_configuration(filename: Union[Path, str]) -> Dict[str, Any]:
489
+ """Parses a model configuration file.
490
+
491
+ Args:
492
+ filename: The path to the file which should be read.
493
+
494
+ Raises:
495
+ YamlValidationException: In case the model configuration doesn't match the
496
+ expected schema.
497
+
498
+ Returns:
499
+ Parsed config file.
500
+ """
501
+ return read_validated_yaml(filename, MODEL_CONFIG_SCHEMA_FILE)
502
+
503
+
504
+ def dump_obj_as_yaml_to_string(
505
+ obj: Any, should_preserve_key_order: bool = False
506
+ ) -> str:
507
+ """Writes data (python dict) to a yaml string.
508
+
509
+ Args:
510
+ obj: The object to dump. Has to be serializable.
511
+ should_preserve_key_order: Whether to force preserve key order in `data`.
512
+
513
+ Returns:
514
+ The object converted to a YAML string.
515
+ """
516
+ buffer = StringIO()
517
+
518
+ write_yaml(obj, buffer, should_preserve_key_order=should_preserve_key_order)
519
+
520
+ return buffer.getvalue()
521
+
522
+
523
+ def _enable_ordered_dict_yaml_dumping() -> None:
524
+ """Ensure that `OrderedDict`s are dumped so that the order of keys is respected."""
525
+ yaml.add_representer(
526
+ OrderedDict,
527
+ RoundTripRepresenter.represent_dict,
528
+ representer=RoundTripRepresenter,
529
+ )
530
+
531
+
532
+ YAML_LINE_MAX_WIDTH = 4096
533
+
534
+
535
+ def write_yaml(
536
+ data: Any,
537
+ target: Union[str, Path, StringIO],
538
+ should_preserve_key_order: bool = False,
539
+ ) -> None:
540
+ """Writes a yaml to the file or to the stream.
541
+
542
+ Args:
543
+ data: The data to write.
544
+ target: The path to the file which should be written or a stream object
545
+ should_preserve_key_order: Whether to force preserve key order in `data`.
546
+ """
547
+ _enable_ordered_dict_yaml_dumping()
548
+
549
+ if should_preserve_key_order:
550
+ data = convert_to_ordered_dict(data)
551
+
552
+ dumper = yaml.YAML()
553
+ # no wrap lines
554
+ dumper.width = YAML_LINE_MAX_WIDTH # type: ignore[assignment]
555
+
556
+ # use `null` to represent `None`
557
+ dumper.representer.add_representer(
558
+ type(None),
559
+ lambda self, _: self.represent_scalar("tag:yaml.org,2002:null", "null"),
560
+ )
561
+
562
+ if isinstance(target, StringIO):
563
+ dumper.dump(data, target)
564
+ return
565
+
566
+ with Path(target).open("w", encoding=DEFAULT_ENCODING) as outfile:
567
+ dumper.dump(data, outfile)
568
+
569
+
570
+ def is_key_in_yaml(file_path: Union[str, Path], *keys: str) -> bool:
571
+ """Checks if any of the keys is contained in the root object of the yaml file.
572
+
573
+ Arguments:
574
+ file_path: path to the yaml file
575
+ keys: keys to look for
576
+
577
+ Returns:
578
+ `True` if at least one of the keys is found, `False` otherwise.
579
+
580
+ Raises:
581
+ FileNotFoundException: if the file cannot be found.
582
+ """
583
+ try:
584
+ with open(file_path, encoding=DEFAULT_ENCODING) as file:
585
+ return any(
586
+ any(line.lstrip().startswith(f"{key}:") for key in keys)
587
+ for line in file
588
+ )
589
+ except FileNotFoundError:
590
+ raise FileNotFoundException(
591
+ f"Failed to read file, " f"'{os.path.abspath(file_path)}' does not exist."
592
+ )
593
+
594
+
595
+ def read_validated_yaml(
596
+ filename: Union[str, Path],
597
+ schema: str,
598
+ reader_type: Union[str, List[str]] = "safe",
599
+ ) -> Any:
600
+ """Validates YAML file content and returns parsed content.
601
+
602
+ Args:
603
+ filename: The path to the file which should be read.
604
+ schema: The path to the schema file which should be used for validating the
605
+ file content.
606
+ reader_type: Reader type to use. By default, "safe" will be used.
607
+
608
+ Returns:
609
+ The parsed file content.
610
+
611
+ Raises:
612
+ YamlValidationException: In case the model configuration doesn't match the
613
+ expected schema.
614
+ """
615
+ content = read_file(filename)
616
+
617
+ validate_raw_yaml_using_schema_file(content, schema)
618
+ return read_yaml(content, reader_type)
619
+
620
+
621
+ def validate_training_data(json_data: Dict[str, Any], schema: Dict[str, Any]) -> None:
622
+ """Validate rasa training data format to ensure proper training.
623
+
624
+ Args:
625
+ json_data: the data to validate
626
+ schema: the schema
627
+
628
+ Raises:
629
+ SchemaValidationError if validation fails.
630
+ """
631
+ try:
632
+ jsonschema.validate(json_data, schema)
633
+ except jsonschema.ValidationError as e:
634
+ e.message += (
635
+ f". Failed to validate data, make sure your data "
636
+ f"is valid. For more information about the format visit "
637
+ f"{DOCS_URL_TRAINING_DATA}."
638
+ )
639
+ raise SchemaValidationError.create_from(e) from e
640
+
641
+
642
+ def validate_training_data_format_version(
643
+ yaml_file_content: Dict[str, Any], filename: Optional[str]
644
+ ) -> bool:
645
+ """Validates version on the training data content using `version` field.
646
+
647
+ Warns users if the file is not compatible with the current version of
648
+ Rasa Pro.
649
+
650
+ Args:
651
+ yaml_file_content: Raw content of training data file as a dictionary.
652
+ filename: Name of the validated file.
653
+
654
+ Returns:
655
+ `True` if the file can be processed by current version of Rasa Pro,
656
+ `False` otherwise.
657
+ """
658
+ if filename:
659
+ filename = os.path.abspath(filename)
660
+
661
+ if not isinstance(yaml_file_content, dict):
662
+ raise YamlValidationException(
663
+ "YAML content in is not a mapping, can not validate training "
664
+ "data schema version.",
665
+ filename=filename,
666
+ )
667
+
668
+ version_value = yaml_file_content.get(KEY_TRAINING_DATA_FORMAT_VERSION)
669
+
670
+ if not version_value:
671
+ # not raising here since it's not critical
672
+ logger.info(
673
+ f"The '{KEY_TRAINING_DATA_FORMAT_VERSION}' key is missing in "
674
+ f"the training data file {filename}. "
675
+ f"Rasa Pro will read the file as a "
676
+ f"version '{LATEST_TRAINING_DATA_FORMAT_VERSION}' file. "
677
+ f"See {DOCS_URL_TRAINING_DATA}."
678
+ )
679
+ return True
680
+
681
+ try:
682
+ if isinstance(version_value, str):
683
+ version_value = version_value.strip("\"'")
684
+ parsed_version = version.parse(version_value)
685
+ latest_version = version.parse(LATEST_TRAINING_DATA_FORMAT_VERSION)
686
+
687
+ if isinstance(parsed_version, LegacyVersion):
688
+ raise TypeError
689
+
690
+ if parsed_version < latest_version:
691
+ raise_warning(
692
+ f"Training data file {filename} has a lower "
693
+ f"format version than your Rasa Pro installation: "
694
+ f"{version_value} < {LATEST_TRAINING_DATA_FORMAT_VERSION}. "
695
+ f"Rasa Pro will read the file as a version "
696
+ f"{LATEST_TRAINING_DATA_FORMAT_VERSION} file. "
697
+ f"Please update your version key to "
698
+ f"{LATEST_TRAINING_DATA_FORMAT_VERSION}. "
699
+ f"See {DOCS_URL_TRAINING_DATA}."
700
+ )
701
+
702
+ if latest_version >= parsed_version:
703
+ return True
704
+
705
+ except TypeError:
706
+ raise_warning(
707
+ f"Training data file {filename} must specify "
708
+ f"'{KEY_TRAINING_DATA_FORMAT_VERSION}' as string, for example:\n"
709
+ f"{KEY_TRAINING_DATA_FORMAT_VERSION}: "
710
+ f"'{LATEST_TRAINING_DATA_FORMAT_VERSION}'\n"
711
+ f"Rasa Pro will read the file as a "
712
+ f"version '{LATEST_TRAINING_DATA_FORMAT_VERSION}' file.",
713
+ docs=DOCS_URL_TRAINING_DATA,
714
+ )
715
+ return True
716
+
717
+ raise_warning(
718
+ f"Training data file {filename} has a greater "
719
+ f"format version than your Rasa Pro installation: "
720
+ f"{version_value} > {LATEST_TRAINING_DATA_FORMAT_VERSION}. "
721
+ f"Please consider updating to the latest version of Rasa Pro."
722
+ f"This file will be skipped.",
723
+ docs=DOCS_URL_TRAINING_DATA,
724
+ )
725
+ return False
726
+
727
+
728
+ def default_error_humanizer(error: jsonschema.ValidationError) -> str:
729
+ """Creates a user readable error message for an error."""
730
+ return error.message
731
+
732
+
733
+ def validate_yaml_with_jsonschema(
734
+ yaml_file_content: str,
735
+ schema_path: str,
736
+ package_name: str = PACKAGE_NAME,
737
+ humanize_error: Callable[
738
+ [jsonschema.ValidationError], str
739
+ ] = default_error_humanizer,
740
+ ) -> None:
741
+ """Validate data format.
742
+
743
+ Args:
744
+ yaml_file_content: the content of the yaml file to be validated
745
+ schema_path: the schema of the yaml file
746
+ package_name: the name of the package the schema is located in. defaults
747
+ to `rasa`.
748
+ humanize_error: a function to convert a jsonschema.ValidationError into a
749
+ human-readable error message. Defaults to `default_error_humanizer`.
750
+
751
+ Raises:
752
+ YamlSyntaxException: if the yaml file is not valid.
753
+ SchemaValidationError: if validation fails.
754
+ """
755
+ from ruamel.yaml import YAMLError
756
+ import importlib_resources
757
+
758
+ schema_file = str(importlib_resources.files(package_name).joinpath(schema_path))
759
+ schema_content = read_json_file(schema_file)
760
+
761
+ try:
762
+ # we need "rt" since
763
+ # it will add meta information to the parsed output. this meta information
764
+ # will include e.g. at which line an object was parsed. this is very
765
+ # helpful when we validate files later on and want to point the user to the
766
+ # right line
767
+ source_data = read_yaml(yaml_file_content, reader_type=["safe", "rt"])
768
+ except (YAMLError, DuplicateKeyError) as e:
769
+ raise YamlSyntaxException(underlying_yaml_exception=e)
770
+
771
+ try:
772
+ jsonschema.validate(source_data, schema_content)
773
+ except jsonschema.ValidationError as error:
774
+ errors = [
775
+ PathWithError(
776
+ message=humanize_error(error),
777
+ path=[str(e) for e in error.absolute_path],
778
+ )
779
+ ]
780
+ raise YamlValidationException(
781
+ "Please make sure the file is correct and all "
782
+ "mandatory parameters are specified. Here are the errors "
783
+ "found during validation",
784
+ errors,
785
+ content=source_data,
786
+ )