rasa-pro 3.8.16__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rasa-pro might be problematic. Click here for more details.

Files changed (644) hide show
  1. README.md +380 -0
  2. rasa/__init__.py +10 -0
  3. rasa/__main__.py +151 -0
  4. rasa/anonymization/__init__.py +2 -0
  5. rasa/anonymization/anonymisation_rule_yaml_reader.py +91 -0
  6. rasa/anonymization/anonymization_pipeline.py +287 -0
  7. rasa/anonymization/anonymization_rule_executor.py +260 -0
  8. rasa/anonymization/anonymization_rule_orchestrator.py +120 -0
  9. rasa/anonymization/schemas/config.yml +47 -0
  10. rasa/anonymization/utils.py +117 -0
  11. rasa/api.py +146 -0
  12. rasa/cli/__init__.py +5 -0
  13. rasa/cli/arguments/__init__.py +0 -0
  14. rasa/cli/arguments/data.py +81 -0
  15. rasa/cli/arguments/default_arguments.py +165 -0
  16. rasa/cli/arguments/evaluate.py +65 -0
  17. rasa/cli/arguments/export.py +51 -0
  18. rasa/cli/arguments/interactive.py +74 -0
  19. rasa/cli/arguments/run.py +204 -0
  20. rasa/cli/arguments/shell.py +13 -0
  21. rasa/cli/arguments/test.py +211 -0
  22. rasa/cli/arguments/train.py +263 -0
  23. rasa/cli/arguments/visualize.py +34 -0
  24. rasa/cli/arguments/x.py +30 -0
  25. rasa/cli/data.py +292 -0
  26. rasa/cli/e2e_test.py +566 -0
  27. rasa/cli/evaluate.py +222 -0
  28. rasa/cli/export.py +251 -0
  29. rasa/cli/inspect.py +63 -0
  30. rasa/cli/interactive.py +164 -0
  31. rasa/cli/license.py +65 -0
  32. rasa/cli/markers.py +78 -0
  33. rasa/cli/project_templates/__init__.py +0 -0
  34. rasa/cli/project_templates/calm/actions/__init__.py +0 -0
  35. rasa/cli/project_templates/calm/actions/action_template.py +27 -0
  36. rasa/cli/project_templates/calm/actions/add_contact.py +30 -0
  37. rasa/cli/project_templates/calm/actions/db.py +57 -0
  38. rasa/cli/project_templates/calm/actions/list_contacts.py +22 -0
  39. rasa/cli/project_templates/calm/actions/remove_contact.py +35 -0
  40. rasa/cli/project_templates/calm/config.yml +12 -0
  41. rasa/cli/project_templates/calm/credentials.yml +33 -0
  42. rasa/cli/project_templates/calm/data/flows/add_contact.yml +31 -0
  43. rasa/cli/project_templates/calm/data/flows/list_contacts.yml +14 -0
  44. rasa/cli/project_templates/calm/data/flows/remove_contact.yml +29 -0
  45. rasa/cli/project_templates/calm/db/contacts.json +10 -0
  46. rasa/cli/project_templates/calm/domain/add_contact.yml +33 -0
  47. rasa/cli/project_templates/calm/domain/list_contacts.yml +14 -0
  48. rasa/cli/project_templates/calm/domain/remove_contact.yml +31 -0
  49. rasa/cli/project_templates/calm/domain/shared.yml +5 -0
  50. rasa/cli/project_templates/calm/e2e_tests/cancelations/user_cancels_during_a_correction.yml +16 -0
  51. rasa/cli/project_templates/calm/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +7 -0
  52. rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_handle.yml +20 -0
  53. rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_name.yml +19 -0
  54. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +15 -0
  55. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_lists_contacts.yml +5 -0
  56. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact.yml +11 -0
  57. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact_from_list.yml +12 -0
  58. rasa/cli/project_templates/calm/endpoints.yml +45 -0
  59. rasa/cli/project_templates/default/actions/__init__.py +0 -0
  60. rasa/cli/project_templates/default/actions/actions.py +27 -0
  61. rasa/cli/project_templates/default/config.yml +44 -0
  62. rasa/cli/project_templates/default/credentials.yml +33 -0
  63. rasa/cli/project_templates/default/data/nlu.yml +91 -0
  64. rasa/cli/project_templates/default/data/rules.yml +13 -0
  65. rasa/cli/project_templates/default/data/stories.yml +30 -0
  66. rasa/cli/project_templates/default/domain.yml +34 -0
  67. rasa/cli/project_templates/default/endpoints.yml +42 -0
  68. rasa/cli/project_templates/default/tests/test_stories.yml +91 -0
  69. rasa/cli/project_templates/tutorial/actions.py +22 -0
  70. rasa/cli/project_templates/tutorial/config.yml +11 -0
  71. rasa/cli/project_templates/tutorial/credentials.yml +33 -0
  72. rasa/cli/project_templates/tutorial/data/flows.yml +8 -0
  73. rasa/cli/project_templates/tutorial/domain.yml +17 -0
  74. rasa/cli/project_templates/tutorial/endpoints.yml +45 -0
  75. rasa/cli/run.py +136 -0
  76. rasa/cli/scaffold.py +268 -0
  77. rasa/cli/shell.py +141 -0
  78. rasa/cli/studio/__init__.py +0 -0
  79. rasa/cli/studio/download.py +51 -0
  80. rasa/cli/studio/studio.py +110 -0
  81. rasa/cli/studio/train.py +59 -0
  82. rasa/cli/studio/upload.py +85 -0
  83. rasa/cli/telemetry.py +90 -0
  84. rasa/cli/test.py +280 -0
  85. rasa/cli/train.py +260 -0
  86. rasa/cli/utils.py +453 -0
  87. rasa/cli/visualize.py +40 -0
  88. rasa/cli/x.py +205 -0
  89. rasa/constants.py +37 -0
  90. rasa/core/__init__.py +17 -0
  91. rasa/core/actions/__init__.py +0 -0
  92. rasa/core/actions/action.py +1450 -0
  93. rasa/core/actions/action_clean_stack.py +59 -0
  94. rasa/core/actions/action_run_slot_rejections.py +207 -0
  95. rasa/core/actions/action_trigger_chitchat.py +31 -0
  96. rasa/core/actions/action_trigger_flow.py +109 -0
  97. rasa/core/actions/action_trigger_search.py +31 -0
  98. rasa/core/actions/constants.py +2 -0
  99. rasa/core/actions/forms.py +737 -0
  100. rasa/core/actions/loops.py +111 -0
  101. rasa/core/actions/two_stage_fallback.py +186 -0
  102. rasa/core/agent.py +557 -0
  103. rasa/core/auth_retry_tracker_store.py +122 -0
  104. rasa/core/brokers/__init__.py +0 -0
  105. rasa/core/brokers/broker.py +126 -0
  106. rasa/core/brokers/file.py +58 -0
  107. rasa/core/brokers/kafka.py +322 -0
  108. rasa/core/brokers/pika.py +387 -0
  109. rasa/core/brokers/sql.py +86 -0
  110. rasa/core/channels/__init__.py +55 -0
  111. rasa/core/channels/audiocodes.py +463 -0
  112. rasa/core/channels/botframework.py +339 -0
  113. rasa/core/channels/callback.py +85 -0
  114. rasa/core/channels/channel.py +419 -0
  115. rasa/core/channels/console.py +243 -0
  116. rasa/core/channels/development_inspector.py +93 -0
  117. rasa/core/channels/facebook.py +422 -0
  118. rasa/core/channels/hangouts.py +335 -0
  119. rasa/core/channels/inspector/.eslintrc.cjs +25 -0
  120. rasa/core/channels/inspector/.gitignore +23 -0
  121. rasa/core/channels/inspector/README.md +54 -0
  122. rasa/core/channels/inspector/assets/favicon.ico +0 -0
  123. rasa/core/channels/inspector/assets/rasa-chat.js +2 -0
  124. rasa/core/channels/inspector/custom.d.ts +3 -0
  125. rasa/core/channels/inspector/dist/assets/arc-5623b6dc.js +1 -0
  126. rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
  127. rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-685c106a.js +10 -0
  128. rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-8cbed007.js +2 -0
  129. rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-5889cf12.js +2 -0
  130. rasa/core/channels/inspector/dist/assets/createText-62fc7601-24c249d7.js +7 -0
  131. rasa/core/channels/inspector/dist/assets/edges-f2ad444c-7dd06a75.js +4 -0
  132. rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-62c1e54c.js +51 -0
  133. rasa/core/channels/inspector/dist/assets/flowDb-1972c806-ce49b86f.js +6 -0
  134. rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-4067e48f.js +4 -0
  135. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-85583a23.js +1 -0
  136. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-59fe4051.js +139 -0
  137. rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-47e3a43b.js +266 -0
  138. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-5a2ac0d9.js +70 -0
  139. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-128cfa44.ttf +0 -0
  140. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-21dbcb97.woff +0 -0
  141. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-222b5e26.svg +329 -0
  142. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-9ad89b2a.woff2 +0 -0
  143. rasa/core/channels/inspector/dist/assets/index-268a75c0.js +1040 -0
  144. rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-dfb8efc4.js +1 -0
  145. rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
  146. rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-b0c470f2.js +7 -0
  147. rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
  148. rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-2edb829a.js +139 -0
  149. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-60c05ee4.woff +0 -0
  150. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-8335d9b8.svg +438 -0
  151. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-9cc39c75.ttf +0 -0
  152. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-ead13ccf.woff2 +0 -0
  153. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-16705655.woff2 +0 -0
  154. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-5aeb07f9.woff +0 -0
  155. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9c459044.ttf +0 -0
  156. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9e2898a4.svg +435 -0
  157. rasa/core/channels/inspector/dist/assets/layout-b6873d69.js +1 -0
  158. rasa/core/channels/inspector/dist/assets/line-1efc5781.js +1 -0
  159. rasa/core/channels/inspector/dist/assets/linear-661e9b94.js +1 -0
  160. rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-2d2e727f.js +109 -0
  161. rasa/core/channels/inspector/dist/assets/ordinal-ba9b4969.js +1 -0
  162. rasa/core/channels/inspector/dist/assets/path-53f90ab3.js +1 -0
  163. rasa/core/channels/inspector/dist/assets/pieDiagram-dbbf0591-9d3ea93d.js +35 -0
  164. rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-06a178a2.js +7 -0
  165. rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-0bfedffc.js +52 -0
  166. rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-d76d0a04.js +8 -0
  167. rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-37bb4341.js +122 -0
  168. rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-f52f7f57.js +1 -0
  169. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-4a986a20.js +1 -0
  170. rasa/core/channels/inspector/dist/assets/styles-080da4f6-7dd9ae12.js +110 -0
  171. rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-46e1ca14.js +159 -0
  172. rasa/core/channels/inspector/dist/assets/styles-9c745c82-4a97439a.js +207 -0
  173. rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-823917a3.js +1 -0
  174. rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-9ea72896.js +61 -0
  175. rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-b631a8b6.js +7 -0
  176. rasa/core/channels/inspector/dist/index.html +39 -0
  177. rasa/core/channels/inspector/index.html +37 -0
  178. rasa/core/channels/inspector/jest.config.ts +13 -0
  179. rasa/core/channels/inspector/package.json +48 -0
  180. rasa/core/channels/inspector/setupTests.ts +2 -0
  181. rasa/core/channels/inspector/src/App.tsx +170 -0
  182. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +97 -0
  183. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
  184. rasa/core/channels/inspector/src/components/DialogueStack.tsx +151 -0
  185. rasa/core/channels/inspector/src/components/ExpandIcon.tsx +16 -0
  186. rasa/core/channels/inspector/src/components/FullscreenButton.tsx +45 -0
  187. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +19 -0
  188. rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +21 -0
  189. rasa/core/channels/inspector/src/components/RasaLogo.tsx +32 -0
  190. rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +39 -0
  191. rasa/core/channels/inspector/src/components/Slots.tsx +91 -0
  192. rasa/core/channels/inspector/src/components/Welcome.tsx +54 -0
  193. rasa/core/channels/inspector/src/helpers/formatters.test.ts +385 -0
  194. rasa/core/channels/inspector/src/helpers/formatters.ts +239 -0
  195. rasa/core/channels/inspector/src/helpers/utils.ts +42 -0
  196. rasa/core/channels/inspector/src/main.tsx +13 -0
  197. rasa/core/channels/inspector/src/theme/Button/Button.ts +29 -0
  198. rasa/core/channels/inspector/src/theme/Heading/Heading.ts +31 -0
  199. rasa/core/channels/inspector/src/theme/Input/Input.ts +27 -0
  200. rasa/core/channels/inspector/src/theme/Link/Link.ts +10 -0
  201. rasa/core/channels/inspector/src/theme/Modal/Modal.ts +47 -0
  202. rasa/core/channels/inspector/src/theme/Table/Table.tsx +38 -0
  203. rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +12 -0
  204. rasa/core/channels/inspector/src/theme/base/breakpoints.ts +8 -0
  205. rasa/core/channels/inspector/src/theme/base/colors.ts +88 -0
  206. rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +29 -0
  207. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.eot +0 -0
  208. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.svg +329 -0
  209. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.ttf +0 -0
  210. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff +0 -0
  211. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff2 +0 -0
  212. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.eot +0 -0
  213. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.svg +438 -0
  214. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.ttf +0 -0
  215. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff +0 -0
  216. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff2 +0 -0
  217. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.eot +0 -0
  218. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.svg +435 -0
  219. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.ttf +0 -0
  220. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff +0 -0
  221. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff2 +0 -0
  222. rasa/core/channels/inspector/src/theme/base/radii.ts +9 -0
  223. rasa/core/channels/inspector/src/theme/base/shadows.ts +7 -0
  224. rasa/core/channels/inspector/src/theme/base/sizes.ts +7 -0
  225. rasa/core/channels/inspector/src/theme/base/space.ts +15 -0
  226. rasa/core/channels/inspector/src/theme/base/styles.ts +13 -0
  227. rasa/core/channels/inspector/src/theme/base/typography.ts +24 -0
  228. rasa/core/channels/inspector/src/theme/base/zIndices.ts +19 -0
  229. rasa/core/channels/inspector/src/theme/index.ts +101 -0
  230. rasa/core/channels/inspector/src/types.ts +64 -0
  231. rasa/core/channels/inspector/src/vite-env.d.ts +1 -0
  232. rasa/core/channels/inspector/tests/__mocks__/fileMock.ts +1 -0
  233. rasa/core/channels/inspector/tests/__mocks__/matchMedia.ts +16 -0
  234. rasa/core/channels/inspector/tests/__mocks__/styleMock.ts +1 -0
  235. rasa/core/channels/inspector/tests/renderWithProviders.tsx +14 -0
  236. rasa/core/channels/inspector/tsconfig.json +26 -0
  237. rasa/core/channels/inspector/tsconfig.node.json +10 -0
  238. rasa/core/channels/inspector/vite.config.ts +8 -0
  239. rasa/core/channels/inspector/yarn.lock +6156 -0
  240. rasa/core/channels/mattermost.py +229 -0
  241. rasa/core/channels/rasa_chat.py +126 -0
  242. rasa/core/channels/rest.py +210 -0
  243. rasa/core/channels/rocketchat.py +175 -0
  244. rasa/core/channels/slack.py +620 -0
  245. rasa/core/channels/socketio.py +274 -0
  246. rasa/core/channels/telegram.py +298 -0
  247. rasa/core/channels/twilio.py +169 -0
  248. rasa/core/channels/twilio_voice.py +367 -0
  249. rasa/core/channels/vier_cvg.py +374 -0
  250. rasa/core/channels/webexteams.py +135 -0
  251. rasa/core/concurrent_lock_store.py +210 -0
  252. rasa/core/constants.py +107 -0
  253. rasa/core/evaluation/__init__.py +0 -0
  254. rasa/core/evaluation/marker.py +267 -0
  255. rasa/core/evaluation/marker_base.py +925 -0
  256. rasa/core/evaluation/marker_stats.py +294 -0
  257. rasa/core/evaluation/marker_tracker_loader.py +103 -0
  258. rasa/core/exceptions.py +29 -0
  259. rasa/core/exporter.py +284 -0
  260. rasa/core/featurizers/__init__.py +0 -0
  261. rasa/core/featurizers/precomputation.py +410 -0
  262. rasa/core/featurizers/single_state_featurizer.py +402 -0
  263. rasa/core/featurizers/tracker_featurizers.py +1172 -0
  264. rasa/core/http_interpreter.py +89 -0
  265. rasa/core/information_retrieval/__init__.py +0 -0
  266. rasa/core/information_retrieval/faiss.py +116 -0
  267. rasa/core/information_retrieval/information_retrieval.py +72 -0
  268. rasa/core/information_retrieval/milvus.py +59 -0
  269. rasa/core/information_retrieval/qdrant.py +102 -0
  270. rasa/core/jobs.py +63 -0
  271. rasa/core/lock.py +139 -0
  272. rasa/core/lock_store.py +344 -0
  273. rasa/core/migrate.py +404 -0
  274. rasa/core/nlg/__init__.py +3 -0
  275. rasa/core/nlg/callback.py +147 -0
  276. rasa/core/nlg/contextual_response_rephraser.py +270 -0
  277. rasa/core/nlg/generator.py +230 -0
  278. rasa/core/nlg/interpolator.py +143 -0
  279. rasa/core/nlg/response.py +155 -0
  280. rasa/core/nlg/summarize.py +69 -0
  281. rasa/core/policies/__init__.py +0 -0
  282. rasa/core/policies/ensemble.py +329 -0
  283. rasa/core/policies/enterprise_search_policy.py +717 -0
  284. rasa/core/policies/enterprise_search_prompt_template.jinja2 +62 -0
  285. rasa/core/policies/flow_policy.py +205 -0
  286. rasa/core/policies/flows/__init__.py +0 -0
  287. rasa/core/policies/flows/flow_exceptions.py +44 -0
  288. rasa/core/policies/flows/flow_executor.py +582 -0
  289. rasa/core/policies/flows/flow_step_result.py +43 -0
  290. rasa/core/policies/intentless_policy.py +924 -0
  291. rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
  292. rasa/core/policies/memoization.py +538 -0
  293. rasa/core/policies/policy.py +716 -0
  294. rasa/core/policies/rule_policy.py +1276 -0
  295. rasa/core/policies/ted_policy.py +2146 -0
  296. rasa/core/policies/unexpected_intent_policy.py +1015 -0
  297. rasa/core/processor.py +1331 -0
  298. rasa/core/run.py +315 -0
  299. rasa/core/secrets_manager/__init__.py +0 -0
  300. rasa/core/secrets_manager/constants.py +32 -0
  301. rasa/core/secrets_manager/endpoints.py +391 -0
  302. rasa/core/secrets_manager/factory.py +233 -0
  303. rasa/core/secrets_manager/secret_manager.py +262 -0
  304. rasa/core/secrets_manager/vault.py +576 -0
  305. rasa/core/test.py +1337 -0
  306. rasa/core/tracker_store.py +1664 -0
  307. rasa/core/train.py +107 -0
  308. rasa/core/training/__init__.py +89 -0
  309. rasa/core/training/converters/__init__.py +0 -0
  310. rasa/core/training/converters/responses_prefix_converter.py +119 -0
  311. rasa/core/training/interactive.py +1742 -0
  312. rasa/core/training/story_conflict.py +381 -0
  313. rasa/core/training/training.py +93 -0
  314. rasa/core/utils.py +344 -0
  315. rasa/core/visualize.py +70 -0
  316. rasa/dialogue_understanding/__init__.py +0 -0
  317. rasa/dialogue_understanding/coexistence/__init__.py +0 -0
  318. rasa/dialogue_understanding/coexistence/constants.py +4 -0
  319. rasa/dialogue_understanding/coexistence/intent_based_router.py +189 -0
  320. rasa/dialogue_understanding/coexistence/llm_based_router.py +261 -0
  321. rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
  322. rasa/dialogue_understanding/commands/__init__.py +45 -0
  323. rasa/dialogue_understanding/commands/can_not_handle_command.py +61 -0
  324. rasa/dialogue_understanding/commands/cancel_flow_command.py +116 -0
  325. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +48 -0
  326. rasa/dialogue_understanding/commands/clarify_command.py +77 -0
  327. rasa/dialogue_understanding/commands/command.py +85 -0
  328. rasa/dialogue_understanding/commands/correct_slots_command.py +288 -0
  329. rasa/dialogue_understanding/commands/error_command.py +67 -0
  330. rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
  331. rasa/dialogue_understanding/commands/handle_code_change_command.py +64 -0
  332. rasa/dialogue_understanding/commands/human_handoff_command.py +57 -0
  333. rasa/dialogue_understanding/commands/knowledge_answer_command.py +48 -0
  334. rasa/dialogue_understanding/commands/noop_command.py +45 -0
  335. rasa/dialogue_understanding/commands/set_slot_command.py +125 -0
  336. rasa/dialogue_understanding/commands/skip_question_command.py +66 -0
  337. rasa/dialogue_understanding/commands/start_flow_command.py +98 -0
  338. rasa/dialogue_understanding/generator/__init__.py +6 -0
  339. rasa/dialogue_understanding/generator/command_generator.py +257 -0
  340. rasa/dialogue_understanding/generator/command_prompt_template.jinja2 +57 -0
  341. rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
  342. rasa/dialogue_understanding/generator/flow_retrieval.py +410 -0
  343. rasa/dialogue_understanding/generator/llm_command_generator.py +637 -0
  344. rasa/dialogue_understanding/generator/nlu_command_adapter.py +157 -0
  345. rasa/dialogue_understanding/patterns/__init__.py +0 -0
  346. rasa/dialogue_understanding/patterns/cancel.py +111 -0
  347. rasa/dialogue_understanding/patterns/cannot_handle.py +43 -0
  348. rasa/dialogue_understanding/patterns/chitchat.py +37 -0
  349. rasa/dialogue_understanding/patterns/clarify.py +97 -0
  350. rasa/dialogue_understanding/patterns/code_change.py +41 -0
  351. rasa/dialogue_understanding/patterns/collect_information.py +90 -0
  352. rasa/dialogue_understanding/patterns/completed.py +40 -0
  353. rasa/dialogue_understanding/patterns/continue_interrupted.py +42 -0
  354. rasa/dialogue_understanding/patterns/correction.py +278 -0
  355. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +243 -0
  356. rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
  357. rasa/dialogue_understanding/patterns/internal_error.py +47 -0
  358. rasa/dialogue_understanding/patterns/search.py +37 -0
  359. rasa/dialogue_understanding/patterns/skip_question.py +38 -0
  360. rasa/dialogue_understanding/processor/__init__.py +0 -0
  361. rasa/dialogue_understanding/processor/command_processor.py +578 -0
  362. rasa/dialogue_understanding/processor/command_processor_component.py +39 -0
  363. rasa/dialogue_understanding/stack/__init__.py +0 -0
  364. rasa/dialogue_understanding/stack/dialogue_stack.py +178 -0
  365. rasa/dialogue_understanding/stack/frames/__init__.py +19 -0
  366. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +27 -0
  367. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +137 -0
  368. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +157 -0
  369. rasa/dialogue_understanding/stack/frames/pattern_frame.py +10 -0
  370. rasa/dialogue_understanding/stack/frames/search_frame.py +27 -0
  371. rasa/dialogue_understanding/stack/utils.py +211 -0
  372. rasa/e2e_test/__init__.py +0 -0
  373. rasa/e2e_test/constants.py +10 -0
  374. rasa/e2e_test/e2e_test_case.py +322 -0
  375. rasa/e2e_test/e2e_test_result.py +34 -0
  376. rasa/e2e_test/e2e_test_runner.py +659 -0
  377. rasa/e2e_test/e2e_test_schema.yml +67 -0
  378. rasa/engine/__init__.py +0 -0
  379. rasa/engine/caching.py +464 -0
  380. rasa/engine/constants.py +17 -0
  381. rasa/engine/exceptions.py +14 -0
  382. rasa/engine/graph.py +625 -0
  383. rasa/engine/loader.py +36 -0
  384. rasa/engine/recipes/__init__.py +0 -0
  385. rasa/engine/recipes/config_files/default_config.yml +44 -0
  386. rasa/engine/recipes/default_components.py +99 -0
  387. rasa/engine/recipes/default_recipe.py +1252 -0
  388. rasa/engine/recipes/graph_recipe.py +79 -0
  389. rasa/engine/recipes/recipe.py +93 -0
  390. rasa/engine/runner/__init__.py +0 -0
  391. rasa/engine/runner/dask.py +256 -0
  392. rasa/engine/runner/interface.py +49 -0
  393. rasa/engine/storage/__init__.py +0 -0
  394. rasa/engine/storage/local_model_storage.py +248 -0
  395. rasa/engine/storage/resource.py +110 -0
  396. rasa/engine/storage/storage.py +203 -0
  397. rasa/engine/training/__init__.py +0 -0
  398. rasa/engine/training/components.py +176 -0
  399. rasa/engine/training/fingerprinting.py +64 -0
  400. rasa/engine/training/graph_trainer.py +256 -0
  401. rasa/engine/training/hooks.py +164 -0
  402. rasa/engine/validation.py +839 -0
  403. rasa/env.py +5 -0
  404. rasa/exceptions.py +69 -0
  405. rasa/graph_components/__init__.py +0 -0
  406. rasa/graph_components/converters/__init__.py +0 -0
  407. rasa/graph_components/converters/nlu_message_converter.py +48 -0
  408. rasa/graph_components/providers/__init__.py +0 -0
  409. rasa/graph_components/providers/domain_for_core_training_provider.py +87 -0
  410. rasa/graph_components/providers/domain_provider.py +71 -0
  411. rasa/graph_components/providers/flows_provider.py +74 -0
  412. rasa/graph_components/providers/forms_provider.py +44 -0
  413. rasa/graph_components/providers/nlu_training_data_provider.py +56 -0
  414. rasa/graph_components/providers/responses_provider.py +44 -0
  415. rasa/graph_components/providers/rule_only_provider.py +49 -0
  416. rasa/graph_components/providers/story_graph_provider.py +43 -0
  417. rasa/graph_components/providers/training_tracker_provider.py +55 -0
  418. rasa/graph_components/validators/__init__.py +0 -0
  419. rasa/graph_components/validators/default_recipe_validator.py +552 -0
  420. rasa/graph_components/validators/finetuning_validator.py +302 -0
  421. rasa/hooks.py +113 -0
  422. rasa/jupyter.py +63 -0
  423. rasa/keys +1 -0
  424. rasa/markers/__init__.py +0 -0
  425. rasa/markers/marker.py +269 -0
  426. rasa/markers/marker_base.py +828 -0
  427. rasa/markers/upload.py +74 -0
  428. rasa/markers/validate.py +21 -0
  429. rasa/model.py +118 -0
  430. rasa/model_testing.py +457 -0
  431. rasa/model_training.py +535 -0
  432. rasa/nlu/__init__.py +7 -0
  433. rasa/nlu/classifiers/__init__.py +3 -0
  434. rasa/nlu/classifiers/classifier.py +5 -0
  435. rasa/nlu/classifiers/diet_classifier.py +1874 -0
  436. rasa/nlu/classifiers/fallback_classifier.py +192 -0
  437. rasa/nlu/classifiers/keyword_intent_classifier.py +188 -0
  438. rasa/nlu/classifiers/llm_intent_classifier.py +519 -0
  439. rasa/nlu/classifiers/logistic_regression_classifier.py +240 -0
  440. rasa/nlu/classifiers/mitie_intent_classifier.py +156 -0
  441. rasa/nlu/classifiers/regex_message_handler.py +56 -0
  442. rasa/nlu/classifiers/sklearn_intent_classifier.py +309 -0
  443. rasa/nlu/constants.py +77 -0
  444. rasa/nlu/convert.py +40 -0
  445. rasa/nlu/emulators/__init__.py +0 -0
  446. rasa/nlu/emulators/dialogflow.py +55 -0
  447. rasa/nlu/emulators/emulator.py +49 -0
  448. rasa/nlu/emulators/luis.py +86 -0
  449. rasa/nlu/emulators/no_emulator.py +10 -0
  450. rasa/nlu/emulators/wit.py +56 -0
  451. rasa/nlu/extractors/__init__.py +0 -0
  452. rasa/nlu/extractors/crf_entity_extractor.py +672 -0
  453. rasa/nlu/extractors/duckling_entity_extractor.py +206 -0
  454. rasa/nlu/extractors/entity_synonyms.py +178 -0
  455. rasa/nlu/extractors/extractor.py +470 -0
  456. rasa/nlu/extractors/mitie_entity_extractor.py +293 -0
  457. rasa/nlu/extractors/regex_entity_extractor.py +220 -0
  458. rasa/nlu/extractors/spacy_entity_extractor.py +95 -0
  459. rasa/nlu/featurizers/__init__.py +0 -0
  460. rasa/nlu/featurizers/dense_featurizer/__init__.py +0 -0
  461. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +449 -0
  462. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
  463. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +772 -0
  464. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +170 -0
  465. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +132 -0
  466. rasa/nlu/featurizers/featurizer.py +89 -0
  467. rasa/nlu/featurizers/sparse_featurizer/__init__.py +0 -0
  468. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +840 -0
  469. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +539 -0
  470. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +269 -0
  471. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
  472. rasa/nlu/model.py +24 -0
  473. rasa/nlu/persistor.py +240 -0
  474. rasa/nlu/run.py +27 -0
  475. rasa/nlu/selectors/__init__.py +0 -0
  476. rasa/nlu/selectors/response_selector.py +990 -0
  477. rasa/nlu/test.py +1943 -0
  478. rasa/nlu/tokenizers/__init__.py +0 -0
  479. rasa/nlu/tokenizers/jieba_tokenizer.py +148 -0
  480. rasa/nlu/tokenizers/mitie_tokenizer.py +75 -0
  481. rasa/nlu/tokenizers/spacy_tokenizer.py +72 -0
  482. rasa/nlu/tokenizers/tokenizer.py +239 -0
  483. rasa/nlu/tokenizers/whitespace_tokenizer.py +106 -0
  484. rasa/nlu/utils/__init__.py +35 -0
  485. rasa/nlu/utils/bilou_utils.py +462 -0
  486. rasa/nlu/utils/hugging_face/__init__.py +0 -0
  487. rasa/nlu/utils/hugging_face/registry.py +108 -0
  488. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +311 -0
  489. rasa/nlu/utils/mitie_utils.py +113 -0
  490. rasa/nlu/utils/pattern_utils.py +168 -0
  491. rasa/nlu/utils/spacy_utils.py +312 -0
  492. rasa/plugin.py +90 -0
  493. rasa/server.py +1536 -0
  494. rasa/shared/__init__.py +0 -0
  495. rasa/shared/constants.py +181 -0
  496. rasa/shared/core/__init__.py +0 -0
  497. rasa/shared/core/constants.py +168 -0
  498. rasa/shared/core/conversation.py +46 -0
  499. rasa/shared/core/domain.py +2106 -0
  500. rasa/shared/core/events.py +2507 -0
  501. rasa/shared/core/flows/__init__.py +7 -0
  502. rasa/shared/core/flows/flow.py +353 -0
  503. rasa/shared/core/flows/flow_step.py +146 -0
  504. rasa/shared/core/flows/flow_step_links.py +319 -0
  505. rasa/shared/core/flows/flow_step_sequence.py +70 -0
  506. rasa/shared/core/flows/flows_list.py +211 -0
  507. rasa/shared/core/flows/flows_yaml_schema.json +217 -0
  508. rasa/shared/core/flows/nlu_trigger.py +117 -0
  509. rasa/shared/core/flows/steps/__init__.py +24 -0
  510. rasa/shared/core/flows/steps/action.py +51 -0
  511. rasa/shared/core/flows/steps/call.py +64 -0
  512. rasa/shared/core/flows/steps/collect.py +112 -0
  513. rasa/shared/core/flows/steps/constants.py +5 -0
  514. rasa/shared/core/flows/steps/continuation.py +36 -0
  515. rasa/shared/core/flows/steps/end.py +22 -0
  516. rasa/shared/core/flows/steps/internal.py +44 -0
  517. rasa/shared/core/flows/steps/link.py +51 -0
  518. rasa/shared/core/flows/steps/no_operation.py +48 -0
  519. rasa/shared/core/flows/steps/set_slots.py +50 -0
  520. rasa/shared/core/flows/steps/start.py +30 -0
  521. rasa/shared/core/flows/validation.py +527 -0
  522. rasa/shared/core/flows/yaml_flows_io.py +278 -0
  523. rasa/shared/core/generator.py +907 -0
  524. rasa/shared/core/slot_mappings.py +235 -0
  525. rasa/shared/core/slots.py +647 -0
  526. rasa/shared/core/trackers.py +1159 -0
  527. rasa/shared/core/training_data/__init__.py +0 -0
  528. rasa/shared/core/training_data/loading.py +90 -0
  529. rasa/shared/core/training_data/story_reader/__init__.py +0 -0
  530. rasa/shared/core/training_data/story_reader/story_reader.py +129 -0
  531. rasa/shared/core/training_data/story_reader/story_step_builder.py +168 -0
  532. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +888 -0
  533. rasa/shared/core/training_data/story_writer/__init__.py +0 -0
  534. rasa/shared/core/training_data/story_writer/story_writer.py +76 -0
  535. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +442 -0
  536. rasa/shared/core/training_data/structures.py +838 -0
  537. rasa/shared/core/training_data/visualization.html +146 -0
  538. rasa/shared/core/training_data/visualization.py +603 -0
  539. rasa/shared/data.py +192 -0
  540. rasa/shared/engine/__init__.py +0 -0
  541. rasa/shared/engine/caching.py +26 -0
  542. rasa/shared/exceptions.py +129 -0
  543. rasa/shared/importers/__init__.py +0 -0
  544. rasa/shared/importers/importer.py +705 -0
  545. rasa/shared/importers/multi_project.py +203 -0
  546. rasa/shared/importers/rasa.py +100 -0
  547. rasa/shared/importers/utils.py +34 -0
  548. rasa/shared/nlu/__init__.py +0 -0
  549. rasa/shared/nlu/constants.py +45 -0
  550. rasa/shared/nlu/interpreter.py +10 -0
  551. rasa/shared/nlu/training_data/__init__.py +0 -0
  552. rasa/shared/nlu/training_data/entities_parser.py +209 -0
  553. rasa/shared/nlu/training_data/features.py +374 -0
  554. rasa/shared/nlu/training_data/formats/__init__.py +10 -0
  555. rasa/shared/nlu/training_data/formats/dialogflow.py +162 -0
  556. rasa/shared/nlu/training_data/formats/luis.py +87 -0
  557. rasa/shared/nlu/training_data/formats/rasa.py +135 -0
  558. rasa/shared/nlu/training_data/formats/rasa_yaml.py +605 -0
  559. rasa/shared/nlu/training_data/formats/readerwriter.py +245 -0
  560. rasa/shared/nlu/training_data/formats/wit.py +52 -0
  561. rasa/shared/nlu/training_data/loading.py +137 -0
  562. rasa/shared/nlu/training_data/lookup_tables_parser.py +30 -0
  563. rasa/shared/nlu/training_data/message.py +477 -0
  564. rasa/shared/nlu/training_data/schemas/__init__.py +0 -0
  565. rasa/shared/nlu/training_data/schemas/data_schema.py +85 -0
  566. rasa/shared/nlu/training_data/schemas/nlu.yml +53 -0
  567. rasa/shared/nlu/training_data/schemas/responses.yml +70 -0
  568. rasa/shared/nlu/training_data/synonyms_parser.py +42 -0
  569. rasa/shared/nlu/training_data/training_data.py +732 -0
  570. rasa/shared/nlu/training_data/util.py +223 -0
  571. rasa/shared/providers/__init__.py +0 -0
  572. rasa/shared/providers/openai/__init__.py +0 -0
  573. rasa/shared/providers/openai/clients.py +43 -0
  574. rasa/shared/providers/openai/session_handler.py +110 -0
  575. rasa/shared/utils/__init__.py +0 -0
  576. rasa/shared/utils/cli.py +72 -0
  577. rasa/shared/utils/common.py +308 -0
  578. rasa/shared/utils/constants.py +1 -0
  579. rasa/shared/utils/io.py +403 -0
  580. rasa/shared/utils/llm.py +405 -0
  581. rasa/shared/utils/pykwalify_extensions.py +26 -0
  582. rasa/shared/utils/schemas/__init__.py +0 -0
  583. rasa/shared/utils/schemas/config.yml +2 -0
  584. rasa/shared/utils/schemas/domain.yml +142 -0
  585. rasa/shared/utils/schemas/events.py +212 -0
  586. rasa/shared/utils/schemas/model_config.yml +46 -0
  587. rasa/shared/utils/schemas/stories.yml +173 -0
  588. rasa/shared/utils/yaml.py +777 -0
  589. rasa/studio/__init__.py +0 -0
  590. rasa/studio/auth.py +252 -0
  591. rasa/studio/config.py +127 -0
  592. rasa/studio/constants.py +16 -0
  593. rasa/studio/data_handler.py +352 -0
  594. rasa/studio/download.py +350 -0
  595. rasa/studio/train.py +136 -0
  596. rasa/studio/upload.py +408 -0
  597. rasa/telemetry.py +1583 -0
  598. rasa/tracing/__init__.py +0 -0
  599. rasa/tracing/config.py +338 -0
  600. rasa/tracing/constants.py +38 -0
  601. rasa/tracing/instrumentation/__init__.py +0 -0
  602. rasa/tracing/instrumentation/attribute_extractors.py +663 -0
  603. rasa/tracing/instrumentation/instrumentation.py +939 -0
  604. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +142 -0
  605. rasa/tracing/instrumentation/metrics.py +206 -0
  606. rasa/tracing/metric_instrument_provider.py +125 -0
  607. rasa/utils/__init__.py +0 -0
  608. rasa/utils/beta.py +83 -0
  609. rasa/utils/cli.py +27 -0
  610. rasa/utils/common.py +635 -0
  611. rasa/utils/converter.py +53 -0
  612. rasa/utils/endpoints.py +303 -0
  613. rasa/utils/io.py +326 -0
  614. rasa/utils/licensing.py +319 -0
  615. rasa/utils/log_utils.py +174 -0
  616. rasa/utils/mapper.py +210 -0
  617. rasa/utils/ml_utils.py +145 -0
  618. rasa/utils/plotting.py +362 -0
  619. rasa/utils/singleton.py +23 -0
  620. rasa/utils/tensorflow/__init__.py +0 -0
  621. rasa/utils/tensorflow/callback.py +112 -0
  622. rasa/utils/tensorflow/constants.py +116 -0
  623. rasa/utils/tensorflow/crf.py +492 -0
  624. rasa/utils/tensorflow/data_generator.py +440 -0
  625. rasa/utils/tensorflow/environment.py +161 -0
  626. rasa/utils/tensorflow/exceptions.py +5 -0
  627. rasa/utils/tensorflow/layers.py +1565 -0
  628. rasa/utils/tensorflow/layers_utils.py +113 -0
  629. rasa/utils/tensorflow/metrics.py +281 -0
  630. rasa/utils/tensorflow/model_data.py +991 -0
  631. rasa/utils/tensorflow/model_data_utils.py +500 -0
  632. rasa/utils/tensorflow/models.py +936 -0
  633. rasa/utils/tensorflow/rasa_layers.py +1094 -0
  634. rasa/utils/tensorflow/transformer.py +640 -0
  635. rasa/utils/tensorflow/types.py +6 -0
  636. rasa/utils/train_utils.py +572 -0
  637. rasa/utils/yaml.py +54 -0
  638. rasa/validator.py +1035 -0
  639. rasa/version.py +3 -0
  640. rasa_pro-3.8.16.dist-info/METADATA +528 -0
  641. rasa_pro-3.8.16.dist-info/NOTICE +5 -0
  642. rasa_pro-3.8.16.dist-info/RECORD +644 -0
  643. rasa_pro-3.8.16.dist-info/WHEEL +4 -0
  644. rasa_pro-3.8.16.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,659 @@
1
+ import asyncio
2
+ import datetime
3
+ import difflib
4
+ import logging
5
+ from asyncio import CancelledError
6
+ from typing import Dict, List, Optional, Text, Tuple, Union
7
+ from urllib.parse import urlparse
8
+
9
+ import rasa.shared.utils.io
10
+ import requests
11
+ from rasa.core.channels import CollectingOutputChannel, UserMessage
12
+ from rasa.core.exceptions import AgentNotReady
13
+ from rasa.core.utils import AvailableEndpoints
14
+ from rasa.shared.core.events import BotUttered, SlotSet, UserUttered
15
+ from rasa.shared.core.trackers import DialogueStateTracker
16
+ from rasa.shared.exceptions import RasaException
17
+ from rasa.utils.endpoints import EndpointConfig
18
+
19
+ from rasa.e2e_test.e2e_test_case import (
20
+ ActualStepOutput,
21
+ Fixture,
22
+ TestCase,
23
+ TestStep,
24
+ )
25
+ from rasa.e2e_test.e2e_test_result import (
26
+ NO_RESPONSE,
27
+ NO_SLOT,
28
+ TestFailure,
29
+ TestResult,
30
+ )
31
+
32
+ from rasa.telemetry import track_e2e_test_run
33
+
34
+ logger = logging.getLogger(__name__)
35
+ TEST_TURNS_TYPE = Dict[int, Union[TestStep, ActualStepOutput]]
36
+
37
+
38
+ class E2ETestRunner:
39
+ def __init__(
40
+ self,
41
+ model_path: Optional[Text] = None,
42
+ model_server: Optional[EndpointConfig] = None,
43
+ remote_storage: Optional[Text] = None,
44
+ endpoints: Optional[AvailableEndpoints] = None,
45
+ ) -> None:
46
+ """Initializes the E2E test suite runner.
47
+
48
+ Args:
49
+ model_path: Path to the model.
50
+ model_server: Model server configuration.
51
+ remote_storage: Remote storage configuration.
52
+ endpoints: Endpoints configuration.
53
+ """
54
+ import rasa.core.agent
55
+
56
+ logger.warning(
57
+ "Started running end-to-end testing. "
58
+ "Note that this feature is not intended for use in a "
59
+ "production environment. Don't use it to process sensitive data. "
60
+ "If you do, it's at your own risk. "
61
+ "We're looking forward to your feedback."
62
+ )
63
+
64
+ if endpoints:
65
+ self._action_server_is_reachable(endpoints)
66
+
67
+ self.agent = asyncio.run(
68
+ rasa.core.agent.load_agent(
69
+ model_path=model_path,
70
+ model_server=model_server,
71
+ remote_storage=remote_storage,
72
+ endpoints=endpoints,
73
+ )
74
+ )
75
+
76
+ if not self.agent.is_ready():
77
+ raise AgentNotReady(
78
+ "Agent needs to be prepared before usage. "
79
+ "Please check that the agent was able to "
80
+ "load the trained model."
81
+ )
82
+
83
+ async def run_prediction_loop(
84
+ self,
85
+ collector: CollectingOutputChannel,
86
+ steps: List[TestStep],
87
+ sender_id: Text,
88
+ ) -> TEST_TURNS_TYPE:
89
+ """Runs dialogue prediction.
90
+
91
+ Args:
92
+ collector: Output channel.
93
+ steps: List of steps to run.
94
+ sender_id: The test case name with added timestamp suffix.
95
+
96
+ Returns:
97
+ Test turns: {turn_sequence (int) : TestStep or ActualStepOutput}.
98
+ """
99
+ turns: TEST_TURNS_TYPE = {}
100
+ event_cursor = 0
101
+
102
+ tracker = await self.agent.processor.fetch_tracker_with_initial_session( # type: ignore[union-attr] # noqa: E501
103
+ sender_id
104
+ )
105
+ # turn -1 i used to contain events that happen during
106
+ # the start of the session and before the first user message
107
+ # TestStep is a placeholder just for the sake of having a turn
108
+ # to specify the actor
109
+ turns[-1], event_cursor = self.get_actual_step_output(
110
+ tracker, TestStep(actor="bot", text=None), event_cursor
111
+ )
112
+
113
+ for position, step in enumerate(steps):
114
+ if step.actor != "user":
115
+ turns[position] = step
116
+ continue
117
+ elif not step.text:
118
+ rasa.shared.utils.io.raise_warning(
119
+ f"The test case '{sender_id}' contains a `user` step in line "
120
+ f"{position + 1} without a text value. "
121
+ f"Skipping this step and proceeding to the next user step.",
122
+ UserWarning,
123
+ )
124
+ continue
125
+
126
+ try:
127
+ await self.agent.handle_message(
128
+ UserMessage(
129
+ step.text,
130
+ collector,
131
+ sender_id,
132
+ )
133
+ )
134
+ except CancelledError:
135
+ logger.error(
136
+ f"Message handling timed out for user message '{step.text}'.",
137
+ exc_info=True,
138
+ )
139
+ except Exception:
140
+ logger.exception(
141
+ f"An exception occurred while handling "
142
+ f"user message '{step.text}'."
143
+ )
144
+ tracker = await self.agent.tracker_store.retrieve(sender_id)
145
+ turns[position], event_cursor = self.get_actual_step_output(
146
+ tracker, step, event_cursor
147
+ )
148
+ return turns
149
+
150
+ @staticmethod
151
+ def get_actual_step_output(
152
+ tracker: DialogueStateTracker,
153
+ test_step: TestStep,
154
+ event_cursor: int,
155
+ ) -> Tuple[ActualStepOutput, int]:
156
+ """Returns the events that are generated from the current step.
157
+
158
+ Args:
159
+ tracker: The tracker for the current test case.
160
+ test_step: The test step.
161
+ event_cursor: The event cursor where the previous step left off.
162
+
163
+ Returns:
164
+ The events generated from the current step and the updated event
165
+ cursor position.
166
+ """
167
+ session_events = list(tracker.events)[event_cursor:]
168
+ if session_events:
169
+ event_cursor += len(session_events)
170
+ return (
171
+ ActualStepOutput.from_test_step(
172
+ test_step,
173
+ [
174
+ event
175
+ for event in session_events
176
+ if isinstance(event, (BotUttered, UserUttered, SlotSet))
177
+ ],
178
+ ),
179
+ event_cursor,
180
+ )
181
+ else:
182
+ logger.warning(
183
+ f"No events found for '{tracker.sender_id}' after processing test "
184
+ f"step '{test_step.text}'."
185
+ )
186
+ # if there are no events, we still want to return an
187
+ # ActualStepOutput object with the test step as the
188
+ # response to be able to generate a diff
189
+ return (
190
+ ActualStepOutput.from_test_step(
191
+ test_step,
192
+ [
193
+ UserUttered(text=test_step.text),
194
+ BotUttered(text=NO_RESPONSE),
195
+ ],
196
+ ),
197
+ event_cursor,
198
+ )
199
+
200
+ @classmethod
201
+ def generate_test_result(
202
+ cls,
203
+ test_turns: TEST_TURNS_TYPE,
204
+ test_case: TestCase,
205
+ ) -> TestResult:
206
+ """Generates test result.
207
+
208
+ Args:
209
+ test_turns: the turns that happened when running the test case or test step.
210
+ test_case: the `TestCase` instance.
211
+
212
+ Returns:
213
+ Test result.
214
+ """
215
+ test_failures = cls.find_test_failures(test_turns, test_case)
216
+ difference = []
217
+ first_failure = None
218
+ if test_failures:
219
+ first_failure = test_failures[0][0]
220
+ difference = cls.human_readable_diff(test_turns, test_failures)
221
+ else:
222
+ difference = []
223
+
224
+ return TestResult(
225
+ pass_status=len(test_failures) == 0,
226
+ test_case=test_case,
227
+ difference=difference,
228
+ error_line=first_failure.error_line if first_failure else None,
229
+ )
230
+
231
+ @classmethod
232
+ def _resolve_successful_bot_utter(
233
+ cls,
234
+ expected_result: TestStep,
235
+ test_response: ActualStepOutput,
236
+ ) -> str:
237
+ """Returns the diff text for a successful bot utter test step."""
238
+ for event in test_response.bot_uttered_events:
239
+ if expected_result.matches_event(event):
240
+ # remove the event that is already matched so
241
+ # that we dont compare against it again
242
+ test_response.remove_bot_uttered_event(event)
243
+ if expected_result.text is not None:
244
+ text = f"{expected_result.actor}: {expected_result.text}"
245
+ elif expected_result.template is not None:
246
+ text = f"{expected_result.actor}: {expected_result.template}"
247
+ break
248
+
249
+ return text
250
+
251
+ @classmethod
252
+ def _resolve_successful_set_slot(
253
+ cls,
254
+ expected_result: TestStep,
255
+ test_response: ActualStepOutput,
256
+ ) -> str:
257
+ """Returns the diff text for a successful set slot test step."""
258
+ slot_name = expected_result.get_slot_name()
259
+ text = f"slot_was_set: {slot_name}"
260
+
261
+ for event in test_response.slot_set_events:
262
+ if expected_result.matches_event(event):
263
+ # remove the event that is already matched so
264
+ # that we dont compare against it again
265
+ test_response.remove_slot_set_event(event)
266
+ if event.value is not None:
267
+ text += f": {event.value} ({type(event.value).__name__})"
268
+ break
269
+
270
+ return text
271
+
272
+ @classmethod
273
+ def _resolve_successful_slot_was_not_set(cls, expected_result: TestStep) -> str:
274
+ """Returns the diff text for a successful slot was not set test step."""
275
+ slot_name = expected_result.get_slot_name()
276
+ slot_value = expected_result.get_slot_value()
277
+ text = f"slot_was_not_set: {slot_name}"
278
+ if expected_result.is_slot_instance_dict():
279
+ text += f": {slot_value}"
280
+
281
+ return text
282
+
283
+ @classmethod
284
+ def _find_first_non_matched_utterance(
285
+ cls,
286
+ test_response: ActualStepOutput,
287
+ bot_utter_test_steps: List[TestStep],
288
+ ) -> Optional[BotUttered]:
289
+ """Finds the first non matched utterance in events (if any)."""
290
+ bot_events = test_response.bot_uttered_events
291
+ matching_events = []
292
+ for event in bot_events:
293
+ for test_step in bot_utter_test_steps:
294
+ if test_step.matches_event(event):
295
+ matching_events.append(event)
296
+ break
297
+ not_matching_events = [
298
+ event for event in bot_events if event not in matching_events
299
+ ]
300
+ return not_matching_events[0] if not_matching_events else None
301
+
302
+ @classmethod
303
+ def _handle_fail_diff(
304
+ cls,
305
+ failed_step: TestStep,
306
+ test_response: ActualStepOutput,
307
+ bot_utter_test_steps: List[TestStep],
308
+ ) -> Tuple[str, str]:
309
+ """Handles generating the diff text for a failed test step."""
310
+ if failed_step.text is not None:
311
+ diff_test_text = f"{failed_step.actor}: {failed_step.text}"
312
+ diff_actual_text = NO_RESPONSE
313
+ event: Optional[
314
+ Union[BotUttered, SlotSet]
315
+ ] = cls._find_first_non_matched_utterance(
316
+ test_response, bot_utter_test_steps
317
+ )
318
+ if event and isinstance(event, BotUttered):
319
+ test_response.remove_bot_uttered_event(event)
320
+ diff_actual_text = f"bot: {event.text}"
321
+
322
+ elif failed_step.template is not None:
323
+ diff_test_text = f"{failed_step.actor}: {failed_step.template}"
324
+ diff_actual_text = NO_RESPONSE
325
+ event = cls._find_first_non_matched_utterance(
326
+ test_response, bot_utter_test_steps
327
+ )
328
+ if event:
329
+ test_response.remove_bot_uttered_event(event)
330
+ diff_actual_text = f"bot: {event.metadata.get('utter_action')}"
331
+
332
+ elif failed_step.slot_was_set:
333
+ slot_name = failed_step.get_slot_name()
334
+
335
+ diff_test_text = f"slot_was_set: {slot_name}"
336
+ if failed_step.is_slot_instance_dict():
337
+ slot_value = failed_step.get_slot_value()
338
+ diff_test_text += f": {slot_value} ({type(slot_value).__name__})"
339
+
340
+ diff_actual_text = NO_SLOT
341
+ for event in test_response.slot_set_events:
342
+ if slot_name == event.key:
343
+ diff_actual_text = (
344
+ f"slot_was_set: {event.key}: {event.value} "
345
+ f"({type(event.value).__name__})"
346
+ )
347
+ test_response.remove_slot_set_event(event)
348
+ break
349
+
350
+ elif failed_step.slot_was_not_set:
351
+ slot_name = failed_step.get_slot_name()
352
+
353
+ diff_test_text = f"slot_was_not_set: {slot_name}"
354
+ if failed_step.is_slot_instance_dict():
355
+ slot_value = failed_step.get_slot_value()
356
+ diff_test_text += f": {slot_value}"
357
+
358
+ for event in test_response.slot_set_events:
359
+ if slot_name == event.key:
360
+ diff_actual_text = (
361
+ f"slot_was_set: {event.key}: {event.value} "
362
+ f"({type(event.value).__name__})"
363
+ )
364
+ test_response.remove_slot_set_event(event)
365
+ break
366
+
367
+ return diff_test_text, diff_actual_text
368
+
369
+ @classmethod
370
+ def _select_bot_utter_turns(
371
+ cls,
372
+ test_turns: TEST_TURNS_TYPE,
373
+ start_index: int,
374
+ ) -> List[TestStep]:
375
+ """Selects the TestSteps from the test turns that match BotUttered events."""
376
+ bot_utter_turns = []
377
+ for index in range(start_index, len(test_turns) - 1):
378
+ test_turn = test_turns[index]
379
+ if isinstance(test_turn, TestStep):
380
+ if test_turn.text is not None or test_turn.template is not None:
381
+ bot_utter_turns.append(test_turn)
382
+ elif isinstance(test_turn, ActualStepOutput):
383
+ break
384
+
385
+ return bot_utter_turns
386
+
387
+ @classmethod
388
+ def human_readable_diff(
389
+ cls,
390
+ test_turns: TEST_TURNS_TYPE,
391
+ fail_positions: List[Tuple[TestFailure, int]],
392
+ ) -> List[str]:
393
+ """Returns a human readable diff of the test case and the actual conversation.
394
+
395
+ Given an ordered list of test steps and actual conversation events, this
396
+ method will return a human readable diff of the two.
397
+ The diff uses difflib to compare the two lists and will highlight
398
+ differences between the two in a pytest style diff.
399
+
400
+ Args:
401
+ test_turns: The transcript of test cases and events.
402
+ fail_positions: The positions of the test failures.
403
+
404
+ Returns:
405
+ The human readable diff.
406
+ """
407
+ actual_transcript = []
408
+ expected_transcript = []
409
+ failure_points = {position for _, position in fail_positions}
410
+ # This will only be used when the TestCase is not started
411
+ # with a user step
412
+ latest_response: ActualStepOutput = test_turns[-1] # type: ignore[assignment]
413
+
414
+ for index in range(max(failure_points) + 1):
415
+ test_result = test_turns[index]
416
+ if index in failure_points:
417
+ diff_test_text, diff_actual_text = cls._handle_fail_diff(
418
+ test_result, # type: ignore[arg-type]
419
+ latest_response,
420
+ cls._select_bot_utter_turns(test_turns, index),
421
+ ) # test_result can only be TestStep in failure_points
422
+ actual_transcript.append(diff_actual_text)
423
+ expected_transcript.append(diff_test_text)
424
+ continue
425
+
426
+ if isinstance(test_result, TestStep):
427
+ if test_result.text is not None or test_result.template is not None:
428
+ diff_test_text = cls._resolve_successful_bot_utter(
429
+ expected_result=test_result,
430
+ test_response=latest_response,
431
+ )
432
+
433
+ if test_result.slot_was_set:
434
+ diff_test_text = cls._resolve_successful_set_slot(
435
+ expected_result=test_result,
436
+ test_response=latest_response,
437
+ )
438
+
439
+ if test_result.slot_was_not_set:
440
+ diff_test_text = cls._resolve_successful_slot_was_not_set(
441
+ expected_result=test_result,
442
+ )
443
+
444
+ elif isinstance(test_result, ActualStepOutput):
445
+ latest_response = test_result
446
+ event = test_result.get_user_uttered_event()
447
+ if event:
448
+ diff_test_text = f"{test_result.actor}: {event.text}"
449
+ else:
450
+ raise RasaException(
451
+ f"Bot did not catch user "
452
+ f"event: {test_result.actor}: {test_result.text}."
453
+ )
454
+ else:
455
+ raise ValueError(f"Unexpected test result type: {type(test_result)}")
456
+
457
+ # test passed in these cases so it's the same
458
+ actual_transcript.append(diff_test_text)
459
+ expected_transcript.append(diff_test_text)
460
+
461
+ return list(difflib.ndiff(actual_transcript, expected_transcript))
462
+
463
+ @classmethod
464
+ def find_test_failures(
465
+ cls,
466
+ test_turns: TEST_TURNS_TYPE,
467
+ test_case: TestCase,
468
+ ) -> List[Tuple[TestFailure, int]]:
469
+ """Finds the test failures in the transcript.
470
+
471
+ Args:
472
+ test_turns: The transcript of test cases and events.
473
+ test_case: The test case.
474
+
475
+ Returns:
476
+ The test failures or an empty list if there is no test failure.
477
+ """
478
+ # This will only be used when the TestCase is not started
479
+ # with a user step
480
+ latest_response: ActualStepOutput = test_turns[-1] # type: ignore[assignment]
481
+ failures = []
482
+ position = 0
483
+ match = None
484
+ for position in range(len(test_turns) - 1):
485
+ turn_value = test_turns[position]
486
+ if isinstance(turn_value, ActualStepOutput):
487
+ latest_response = turn_value
488
+ elif isinstance(turn_value, TestStep):
489
+ if turn_value.text is not None or turn_value.template is not None:
490
+ match = cls._does_match_exist(
491
+ latest_response.bot_uttered_events, turn_value
492
+ )
493
+ if turn_value.slot_was_set:
494
+ match = cls._does_match_exist(
495
+ latest_response.slot_set_events, turn_value
496
+ )
497
+ if turn_value.slot_was_not_set:
498
+ match = not cls._does_match_exist(
499
+ latest_response.slot_set_events, turn_value
500
+ )
501
+ if not match:
502
+ failures.append((TestFailure(test_case, turn_value.line), position))
503
+ else:
504
+ raise ValueError(f"Unexpected turn value type: {type(turn_value)}")
505
+
506
+ return failures
507
+
508
+ @classmethod
509
+ def _does_match_exist(
510
+ cls,
511
+ actual_events: Optional[List[Union[UserUttered, BotUttered, SlotSet]]],
512
+ expected: TestStep,
513
+ ) -> bool:
514
+ if not actual_events:
515
+ return False
516
+
517
+ match = False
518
+ for event in actual_events:
519
+ if expected.matches_event(event):
520
+ return True
521
+ return match
522
+
523
+ async def set_up_fixtures(
524
+ self,
525
+ fixtures: List[Fixture],
526
+ sender_id: Text,
527
+ ) -> None:
528
+ """Sets slots in the tracker as defined by the input fixtures.
529
+
530
+ Args:
531
+ fixtures: List of `Fixture` objects.
532
+ sender_id: The conversation id.
533
+ """
534
+ if not fixtures:
535
+ return
536
+ tracker = await self.agent.processor.fetch_tracker_with_initial_session( # type: ignore[union-attr] # noqa: E501
537
+ sender_id
538
+ )
539
+
540
+ for fixture in fixtures:
541
+ for slot_name, slot_value in fixture.slots_set.items():
542
+ tracker.update(SlotSet(slot_name, slot_value))
543
+
544
+ await self.agent.tracker_store.save(tracker)
545
+
546
+ @staticmethod
547
+ def filter_fixtures_for_test_case(
548
+ test_case: TestCase, fixtures: List[Fixture]
549
+ ) -> List[Fixture]:
550
+ """Filters the input fixtures for the input test case.
551
+
552
+ Args:
553
+ test_case: The test case.
554
+ fixtures: The fixtures.
555
+
556
+ Returns:
557
+ The filtered fixtures.
558
+ """
559
+ return list(
560
+ filter(
561
+ lambda fixture: test_case.fixture_names
562
+ and fixture.name in test_case.fixture_names,
563
+ fixtures,
564
+ )
565
+ )
566
+
567
+ async def run_tests(
568
+ self,
569
+ input_test_cases: List[TestCase],
570
+ input_fixtures: List[Fixture],
571
+ fail_fast: bool = False,
572
+ ) -> List["TestResult"]:
573
+ """Runs the test cases.
574
+
575
+ Args:
576
+ input_test_cases: Input test cases.
577
+ input_fixtures: Input fixtures.
578
+ fail_fast: Whether to fail fast.
579
+
580
+ Returns:
581
+ List of test results.
582
+ """
583
+ results = []
584
+
585
+ # telemetry call for tracking test runs
586
+ track_e2e_test_run(input_test_cases, input_fixtures)
587
+
588
+ for test_case in input_test_cases:
589
+ collector = CollectingOutputChannel()
590
+
591
+ # add timestamp suffix to ensure sender_id is unique
592
+ sender_id = f"{test_case.name}_{datetime.datetime.now()}"
593
+
594
+ if input_fixtures:
595
+ test_fixtures = self.filter_fixtures_for_test_case(
596
+ test_case, input_fixtures
597
+ )
598
+ await self.set_up_fixtures(test_fixtures, sender_id)
599
+
600
+ tracker = await self.run_prediction_loop(
601
+ collector, test_case.steps, sender_id
602
+ )
603
+
604
+ test_result = self.generate_test_result(tracker, test_case)
605
+ results.append(test_result)
606
+
607
+ if fail_fast and not test_result.pass_status:
608
+ break
609
+
610
+ return results
611
+
612
+ @staticmethod
613
+ def _action_server_is_reachable(endpoints: AvailableEndpoints) -> None:
614
+ """Calls the action server health endpoint."""
615
+ if not endpoints.action:
616
+ logger.debug(
617
+ "No action endpoint configured. Skipping the health check of the "
618
+ "action server."
619
+ )
620
+ return
621
+
622
+ if not endpoints.action.url:
623
+ logger.debug(
624
+ "Action endpoint URL is not defined in the endpoint configuration."
625
+ )
626
+ return
627
+
628
+ logger.debug(
629
+ "Detected action URL in the endpoint configuration.\n"
630
+ f"Action Server URL: {endpoints.action.url}\n"
631
+ "Sending a health request to the action endpoint."
632
+ )
633
+ url = urlparse(endpoints.action.url)
634
+ # replace /<path> with just /health
635
+ url = url._replace(path="/health").geturl() # type: ignore[assignment]
636
+ try:
637
+ response = requests.get(url, timeout=3)
638
+ except requests.exceptions.ConnectionError as error:
639
+ raise RasaException(
640
+ "Action endpoint could not be reached. "
641
+ "Actions server URL is defined in your endpoint configuration as "
642
+ f"'{endpoints.action.url}'.\n"
643
+ "Please make sure your action server is running and properly "
644
+ "configured. Since running e2e tests without a action server may "
645
+ f"lead to unpredictable results.\n{error}"
646
+ )
647
+
648
+ if response.status_code != 200:
649
+ raise RasaException(
650
+ "Action endpoint is responding, but health status responded with "
651
+ f"code {response.status_code}. Make sure your action server"
652
+ " is properly configured and that the '/health' endpoint is available."
653
+ )
654
+
655
+ logger.debug(
656
+ "Action endpoint has responded successfully.\n"
657
+ f"Response message: {response.text}\n"
658
+ f"Response status code: {response.status_code}."
659
+ )