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
rasa/cli/e2e_test.py ADDED
@@ -0,0 +1,586 @@
1
+ import argparse
2
+ import asyncio
3
+ import logging
4
+ import math
5
+ import shutil
6
+ import sys
7
+ from pathlib import Path
8
+ from textwrap import dedent
9
+ from typing import Any, Dict, Generator, List, Optional, Text, Tuple, Union
10
+
11
+ import rasa.cli.arguments.run
12
+ import rasa.cli.utils
13
+ import rasa.shared.data
14
+ import rasa.shared.utils.cli
15
+ import rasa.shared.utils.io
16
+ import rich
17
+ from rasa.cli import SubParsersAction
18
+ from rasa.cli.arguments.default_arguments import add_endpoint_param, add_model_param
19
+ from rasa.core.exceptions import AgentNotReady
20
+ from rasa.core.utils import AvailableEndpoints
21
+ from rasa.exceptions import RasaException
22
+ from rasa.shared.constants import DEFAULT_ENDPOINTS_PATH, DEFAULT_MODELS_PATH
23
+
24
+ from rasa.e2e_test.constants import SCHEMA_FILE_PATH, KEY_TEST_CASE
25
+ from rasa.e2e_test.e2e_test_case import (
26
+ KEY_FIXTURES,
27
+ KEY_METADATA,
28
+ Fixture,
29
+ Metadata,
30
+ TestCase,
31
+ TestSuite,
32
+ )
33
+ from rasa.e2e_test.e2e_test_result import TestResult
34
+ from rasa.e2e_test.e2e_test_runner import E2ETestRunner
35
+ import rasa.utils.io
36
+ from rasa.shared.utils.yaml import (
37
+ parse_raw_yaml,
38
+ read_schema_file,
39
+ validate_yaml_content_using_schema,
40
+ is_key_in_yaml,
41
+ )
42
+
43
+ DEFAULT_E2E_INPUT_TESTS_PATH = "tests/e2e_test_cases.yml"
44
+ DEFAULT_E2E_OUTPUT_TESTS_PATH = "tests/e2e_results.yml"
45
+ KEY_TEST_CASES = "test_cases"
46
+
47
+ logger = logging.getLogger(__name__)
48
+
49
+
50
+ def add_subparser(
51
+ subparsers: SubParsersAction, parents: List[argparse.ArgumentParser]
52
+ ) -> None:
53
+ """Add the e2e subparser to `rasa test`.
54
+
55
+ Args:
56
+ subparsers: subparser we are going to attach to
57
+ parents: Parent parsers, needed to ensure tree structure in argparse
58
+ """
59
+ for subparser in subparsers.choices.values():
60
+ if subparser.prog == "rasa test":
61
+ e2e_test_subparser = create_e2e_test_subparser(parents)
62
+
63
+ for action in subparser._subparsers._actions:
64
+ if action.choices is not None:
65
+ action.choices["e2e"] = e2e_test_subparser
66
+ return
67
+
68
+ # If we get here, we couldn't hook the subparser to `rasa test`
69
+ raise RasaException(
70
+ "Hooking the e2e subparser to `rasa test` command "
71
+ "could not be completed. Cannot run end-to-end testing."
72
+ )
73
+
74
+
75
+ def create_e2e_test_subparser(
76
+ parents: List[argparse.ArgumentParser],
77
+ ) -> argparse.ArgumentParser:
78
+ """Create e2e test subparser."""
79
+ e2e_test_subparser = argparse.ArgumentParser(
80
+ prog="rasa test e2e",
81
+ parents=parents,
82
+ conflict_handler="resolve",
83
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter,
84
+ description="Runs end-to-end testing.",
85
+ )
86
+
87
+ e2e_test_subparser.set_defaults(func=execute_e2e_tests)
88
+
89
+ add_e2e_test_arguments(e2e_test_subparser)
90
+ add_model_param(e2e_test_subparser, add_positional_arg=False)
91
+ add_endpoint_param(
92
+ e2e_test_subparser,
93
+ help_text="Configuration file for the model server and the connectors as a "
94
+ "yml file.",
95
+ )
96
+
97
+ return e2e_test_subparser
98
+
99
+
100
+ def add_e2e_test_arguments(parser: argparse.ArgumentParser) -> None:
101
+ """Arguments for running E2E tests directly using `rasa e2e`."""
102
+ e2e_arguments = parser.add_argument_group("Testing Settings")
103
+ e2e_arguments.add_argument(
104
+ "path-to-test-cases",
105
+ nargs="?",
106
+ type=str,
107
+ help="Input file or folder containing end-to-end test cases.",
108
+ default=DEFAULT_E2E_INPUT_TESTS_PATH,
109
+ )
110
+ e2e_arguments.add_argument(
111
+ "--fail-fast",
112
+ action="store_true",
113
+ help="Fail the test suite as soon as a unit test fails.",
114
+ )
115
+
116
+ parser.add_argument(
117
+ "-o",
118
+ "--e2e-results",
119
+ action="store_const",
120
+ const=DEFAULT_E2E_OUTPUT_TESTS_PATH,
121
+ help="Results file containing end-to-end testing summary.",
122
+ )
123
+
124
+ parser.add_argument(
125
+ "--remote-storage",
126
+ help="Set the remote location where your Rasa model is stored, e.g. on AWS.",
127
+ )
128
+
129
+
130
+ def split_into_passed_failed(
131
+ results: List[TestResult],
132
+ ) -> Tuple[List[TestResult], List[TestResult]]:
133
+ """Get the summary of the test results.
134
+
135
+ Args:
136
+ results: List of test results.
137
+
138
+ Returns:
139
+ Tuple consisting of passed count, failed count and failed test cases.
140
+ """
141
+ passed_cases = [r for r in results if r.pass_status]
142
+ failed_cases = [r for r in results if not r.pass_status]
143
+
144
+ return passed_cases, failed_cases
145
+
146
+
147
+ def is_test_case_file(file_path: Union[Text, Path]) -> bool:
148
+ """Check if file contains test cases.
149
+
150
+ Args:
151
+ file_path: Path of the file to check.
152
+
153
+ Returns:
154
+ `True` if the file contains test cases, `False` otherwise.
155
+ """
156
+ return rasa.shared.data.is_likely_yaml_file(file_path) and is_key_in_yaml(
157
+ file_path, KEY_TEST_CASES
158
+ )
159
+
160
+
161
+ def validate_path_to_test_cases(path: Text) -> None:
162
+ """Validate that path to test cases exists."""
163
+ if not Path(path).exists():
164
+ rasa.shared.utils.io.raise_warning(
165
+ f"Path to test cases does not exist: {path}. "
166
+ f"Please provide a valid path to test cases. "
167
+ f"Exiting...",
168
+ UserWarning,
169
+ )
170
+ sys.exit(1)
171
+
172
+
173
+ def extract_test_case_from_path(path: Text) -> Tuple[Text, Text]:
174
+ """Extract test case from path if specified.
175
+
176
+ Args:
177
+ path: Path to the file or folder containing test cases.
178
+
179
+ Returns:
180
+ Tuple consisting of the path to test cases and the extracted test case name.
181
+ """
182
+ test_case_name = ""
183
+
184
+ if "::" in str(path):
185
+ splitted_path = path.split("::")
186
+ test_case_name = splitted_path[-1]
187
+ path = splitted_path[0]
188
+
189
+ return path, test_case_name
190
+
191
+
192
+ def validate_test_case(test_case_name: Text, input_test_cases: List[TestCase]) -> None:
193
+ """Validate that test case exists."""
194
+ if test_case_name and not input_test_cases:
195
+ rasa.shared.utils.io.raise_warning(
196
+ f"Test case does not exist: {test_case_name}. "
197
+ f"Please check for typos and provide a valid test case name. "
198
+ f"Exiting...",
199
+ UserWarning,
200
+ )
201
+ sys.exit(1)
202
+
203
+
204
+ def read_test_cases(path: Text) -> TestSuite:
205
+ """Read test cases from the given path.
206
+
207
+ Args:
208
+ path: Path to the file or folder containing test cases.
209
+
210
+ Returns:
211
+ TestSuite.
212
+ """
213
+ path, test_case_name = extract_test_case_from_path(path)
214
+ validate_path_to_test_cases(path)
215
+
216
+ test_files = rasa.shared.data.get_data_files([path], is_test_case_file)
217
+ e2e_test_schema = read_e2e_test_schema()
218
+
219
+ input_test_cases = []
220
+ fixtures: Dict[Text, Fixture] = {}
221
+ metadata: Dict[Text, Metadata] = {}
222
+
223
+ for test_file in test_files:
224
+ test_file_content = parse_raw_yaml(Path(test_file).read_text())
225
+ validate_yaml_content_using_schema(test_file_content, e2e_test_schema)
226
+
227
+ test_cases_content = test_file_content.get(KEY_TEST_CASES) or []
228
+
229
+ if test_case_name:
230
+ test_cases = [
231
+ TestCase.from_dict(test_case_dict, file=test_file)
232
+ for test_case_dict in test_cases_content
233
+ if test_case_name == test_case_dict.get(KEY_TEST_CASE)
234
+ ]
235
+ else:
236
+ test_cases = [
237
+ TestCase.from_dict(test_case_dict, file=test_file)
238
+ for test_case_dict in test_cases_content
239
+ ]
240
+
241
+ input_test_cases.extend(test_cases)
242
+ fixtures_content = test_file_content.get(KEY_FIXTURES) or []
243
+ metadata_contents = test_file_content.get(KEY_METADATA) or []
244
+ for fixture in fixtures_content:
245
+ fixture_obj = Fixture.from_dict(fixture_dict=fixture)
246
+
247
+ # avoid adding duplicates from across multiple files
248
+ if fixtures.get(fixture_obj.name) is None:
249
+ fixtures[fixture_obj.name] = fixture_obj
250
+
251
+ for metadata_content in metadata_contents:
252
+ metadata_obj = Metadata.from_dict(metadata_dict=metadata_content)
253
+
254
+ # avoid adding duplicates from across multiple files
255
+ if metadata.get(metadata_obj.name) is None:
256
+ metadata[metadata_obj.name] = metadata_obj
257
+
258
+ validate_test_case(test_case_name, input_test_cases)
259
+ return TestSuite(input_test_cases, list(fixtures.values()), list(metadata.values()))
260
+
261
+
262
+ def execute_e2e_tests(args: argparse.Namespace) -> None:
263
+ """Run the end-to-end tests.
264
+
265
+ Args:
266
+ args: Commandline arguments.
267
+ """
268
+ args.endpoints = rasa.cli.utils.get_validated_path(
269
+ args.endpoints, "endpoints", DEFAULT_ENDPOINTS_PATH, True
270
+ )
271
+ endpoints = AvailableEndpoints.read_endpoints(args.endpoints)
272
+
273
+ # Ignore all endpoints apart from action server, model, nlu and nlg
274
+ # to ensure InMemoryTrackerStore is being used instead of production
275
+ # tracker store
276
+ endpoints.tracker_store = None
277
+ endpoints.lock_store = None
278
+ endpoints.event_broker = None
279
+
280
+ if endpoints.model is None:
281
+ args.model = validate_model_path(args.model, "model", DEFAULT_MODELS_PATH)
282
+
283
+ path_to_test_cases = getattr(
284
+ args, "path-to-test-cases", DEFAULT_E2E_INPUT_TESTS_PATH
285
+ )
286
+
287
+ test_suite = read_test_cases(path_to_test_cases)
288
+
289
+ try:
290
+ test_runner = E2ETestRunner(
291
+ remote_storage=args.remote_storage,
292
+ model_path=args.model,
293
+ model_server=endpoints.model,
294
+ endpoints=endpoints,
295
+ )
296
+ except AgentNotReady as error:
297
+ logger.error(msg=error.message)
298
+ sys.exit(1)
299
+
300
+ results = asyncio.run(
301
+ test_runner.run_tests(
302
+ test_suite.test_cases,
303
+ test_suite.fixtures,
304
+ args.fail_fast,
305
+ input_metadata=test_suite.metadata,
306
+ )
307
+ )
308
+
309
+ if args.e2e_results is not None:
310
+ write_test_results_to_file(results, args.e2e_results)
311
+
312
+ passed, failed = split_into_passed_failed(results)
313
+ print_test_result(passed, failed, args.fail_fast)
314
+
315
+
316
+ def write_test_results_to_file(results: List[TestResult], output_file: Text) -> None:
317
+ """Write test results to a file.
318
+
319
+ Args:
320
+ results: List of test results.
321
+ output_file: Path to the output file.
322
+ """
323
+ Path(output_file).touch()
324
+
325
+ data = {"test_results": [test_result.as_dict() for test_result in results]}
326
+
327
+ rasa.utils.io.write_yaml(
328
+ data, target=output_file, transform=transform_results_output_to_yaml
329
+ )
330
+
331
+ rasa.shared.utils.cli.print_info(
332
+ f"Overall results have been saved at path: {output_file}."
333
+ )
334
+
335
+
336
+ def transform_results_output_to_yaml(yaml_string: Text) -> Text:
337
+ """Transform the output of the YAML writer to make it more readable.
338
+
339
+ Args:
340
+ yaml_string: The YAML string to transform.
341
+
342
+ Returns:
343
+ The transformed YAML string.
344
+ """
345
+ result = []
346
+ for s in yaml_string.splitlines(True):
347
+ if s.startswith("- name"):
348
+ result.append("\n")
349
+ result.append(s)
350
+ elif s.startswith("\n"):
351
+ result.append(s.strip())
352
+ else:
353
+ result.append(s)
354
+ return "".join(result)
355
+
356
+
357
+ def pad(text: Text, char: Text = "=", min: int = 3) -> Text:
358
+ """Pad text to a certain length.
359
+
360
+ Uses `char` to pad the text to the specified length. If the text is longer
361
+ than the specified length, at least `min` are used.
362
+
363
+ The padding is applied to the left and right of the text (almost) equally.
364
+
365
+ Example:
366
+ >>> pad("Hello")
367
+ "========= Hello ========"
368
+ >>> pad("Hello", char="-")
369
+ "--------- Hello --------"
370
+
371
+ Args:
372
+ text: Text to pad.
373
+ min: Minimum length of the padding.
374
+ char: Character to pad with.
375
+
376
+ Returns:
377
+ Padded text.
378
+ """
379
+ width = shutil.get_terminal_size((80, 20)).columns
380
+ padding = max(width - len(text) - 2, min * 2)
381
+
382
+ return char * (padding // 2) + " " + text + " " + char * math.ceil(padding / 2)
383
+
384
+
385
+ def color_difference(diff: List[Text]) -> Generator[Text, None, None]:
386
+ """Colorize the difference between two strings.
387
+
388
+ Example:
389
+ >>> color_difference(["+ Hello", "- World"])
390
+ ["<ansigreen>+ Hello</ansigreen>", "<ansired>- World</ansired>"]
391
+
392
+ Args:
393
+ diff: List of lines of the diff.
394
+
395
+ Returns:
396
+ Generator of colored lines.
397
+ """
398
+ for line in diff:
399
+ if line.startswith("+"):
400
+ yield "[green3]" + line + "[/green3]"
401
+ elif line.startswith("-"):
402
+ yield "[red3]" + line + "[/red3]"
403
+ elif line.startswith("^"):
404
+ yield "[blue3]" + line + "[/blue3]"
405
+ elif line.startswith("?"):
406
+ yield "[grey37]" + line + "[/grey37]"
407
+ else:
408
+ yield line
409
+
410
+
411
+ def print_failed_case(fail: TestResult) -> None:
412
+ """Print the details of a failed test case.
413
+
414
+ Example:
415
+ >>> print_failed_case(TestResult(TestCase("test", "test.md"), 1,
416
+ ... ["- Hello", "+ World"]))
417
+ ---------------------- test in test.md failed ----------------------
418
+ Mismatch starting at test.md:1:
419
+ <ansired>- Hello</ansired>
420
+ <ansigreen>+ World</ansigreen>
421
+ """
422
+ fail_headline = (
423
+ f"'{fail.test_case.name}' in {fail.test_case.file_with_line()} failed"
424
+ )
425
+ rasa.shared.utils.cli.print_error(f"{pad(fail_headline, char='-')}\n")
426
+ print(f"Mismatch starting at {fail.test_case.file}:{fail.error_line}: \n")
427
+ rich.print(("\n".join(color_difference(fail.difference))))
428
+
429
+
430
+ def print_test_summary(failed: List[TestResult]) -> None:
431
+ """Print the summary of the test run.
432
+
433
+ Example:
434
+ >>> print_test_summary([TestResult(TestCase("test", "test.md"), 1,
435
+ ... ["- Hello", "+ World"])])
436
+ =================== short test summary info ===================
437
+ FAILED test.md::test
438
+ """
439
+ rasa.shared.utils.cli.print_info(pad("short test summary info"))
440
+
441
+ for f in failed:
442
+ rasa.shared.utils.cli.print_error(
443
+ f"FAILED {f.test_case.file}::{f.test_case.name}"
444
+ )
445
+
446
+
447
+ def print_final_line(
448
+ passed: List[TestResult], failed: List[TestResult], has_failed: bool
449
+ ) -> None:
450
+ """Print the final line of the test output.
451
+
452
+ Args:
453
+ passed: List of passed test cases.
454
+ failed: List of failed test cases.
455
+ has_failed: Boolean, true if the test run has failed.
456
+ """
457
+ final_line_color = "green3" if not has_failed else "red3"
458
+
459
+ width = shutil.get_terminal_size((80, 20)).columns
460
+
461
+ # calculate the length of the text - this is a bit hacky but works
462
+ text_lengt = (
463
+ math.ceil(len(passed) / 10) # length of the number of passed tests
464
+ + math.ceil(len(failed) / 10) # length of the number of failed tests
465
+ + 18 # length of the text " failed, passed "
466
+ )
467
+ # we can't use the padding function here as the text contains html tags
468
+ # which are not taken into account when calculating the length
469
+ padding = max(6, width - text_lengt)
470
+ pre_pad = "=" * max(3, padding // 2)
471
+ post_pad = "=" * max(3, math.ceil(padding / 2))
472
+ rich.print(
473
+ f"[{final_line_color}]{pre_pad} "
474
+ f"[bold red3]{len(failed)} failed[/bold red3]"
475
+ f"[bright_white], [/bright_white]"
476
+ f"[bold green3]{len(passed)} passed[/bold green3]"
477
+ f" {post_pad}[/{final_line_color}]"
478
+ )
479
+
480
+
481
+ def print_test_result(
482
+ passed: List[TestResult],
483
+ failed: List[TestResult],
484
+ fail_fast: bool = False,
485
+ ) -> None:
486
+ """Print the result of the test run.
487
+
488
+ Args:
489
+ passed: List of passed test cases.
490
+ failed: List of failed test cases.
491
+ fail_fast: If true, stop after the first failure.
492
+ """
493
+ if failed:
494
+ # print failure headline
495
+ print("\n")
496
+ rich.print(f"[bold]{pad('FAILURES', char='=')}[/bold]")
497
+
498
+ # print failed test_Case
499
+ for fail in failed:
500
+ print_failed_case(fail)
501
+
502
+ print_test_summary(failed)
503
+
504
+ if fail_fast:
505
+ rasa.shared.utils.cli.print_error(pad("stopping after 1 failure", char="!"))
506
+ has_failed = True
507
+ elif len(failed) + len(passed) == 0:
508
+ # no tests were run, print error
509
+ rasa.shared.utils.cli.print_error(pad("no test cases found", char="!"))
510
+ print_e2e_help()
511
+ has_failed = True
512
+ elif failed:
513
+ has_failed = True
514
+ else:
515
+ has_failed = False
516
+
517
+ print_final_line(passed, failed, has_failed=has_failed)
518
+ sys.exit(1 if has_failed else 0)
519
+
520
+
521
+ def print_e2e_help() -> None:
522
+ """Print help guiding users how to write e2e tests."""
523
+ rasa.shared.utils.cli.print_info(
524
+ dedent(
525
+ """\
526
+ To start using e2e tests create a yaml file in a test directory, e.g.
527
+ 'tests/test_cases.yml'. You can find example test cases in the starter
528
+ pack at
529
+
530
+ https://github.com/RasaHQ/starter-pack-intentless-policy#testing-the-policy
531
+
532
+ Here is an example of a test case in yaml format:
533
+
534
+ test_cases:
535
+ - test_case: "test_greet"
536
+ steps:
537
+ - user: "hello there!"
538
+ - bot: "Hey! How are you?"
539
+
540
+ To run the e2e tests, execute:
541
+ >>> rasa test e2e <path-to-test-cases>
542
+ """
543
+ )
544
+ )
545
+
546
+
547
+ def validate_model_path(
548
+ model_path: Optional[Text], parameter: Text, default: Text
549
+ ) -> Text:
550
+ """Validate the model path.
551
+
552
+ Args:
553
+ model_path: Path to the model.
554
+ parameter: Name of the parameter.
555
+ default: Default path to the model.
556
+
557
+ Returns:
558
+ Path to the model.
559
+ """
560
+ if model_path and Path(model_path).exists():
561
+ return model_path
562
+
563
+ if model_path and not Path(model_path).exists():
564
+ rasa.shared.utils.io.raise_warning(
565
+ f"The provided model path '{model_path}' could not be found. "
566
+ f"Using default location '{default}' instead.",
567
+ UserWarning,
568
+ )
569
+
570
+ elif model_path is None:
571
+ logger.info(
572
+ f"Parameter '{parameter}' is not set. "
573
+ f"Using default location '{default}' instead."
574
+ )
575
+
576
+ Path(default).mkdir(exist_ok=True)
577
+ return default
578
+
579
+
580
+ def read_e2e_test_schema() -> Union[List[Any], Dict[Text, Any]]:
581
+ """Read the schema for the e2e test files.
582
+
583
+ Returns:
584
+ The content of the schema.
585
+ """
586
+ return read_schema_file(SCHEMA_FILE_PATH)