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,737 @@
1
+ import copy
2
+ from typing import Text, List, Optional, Union, Any, Dict, Set
3
+ import itertools
4
+ import logging
5
+ import structlog
6
+ import json
7
+
8
+ from rasa.core.actions import action
9
+ from rasa.core.actions.loops import LoopAction
10
+ from rasa.core.channels import OutputChannel
11
+ from rasa.shared.core.domain import Domain, KEY_SLOTS
12
+ from rasa.shared.core.constants import SlotMappingType, SLOT_MAPPINGS, MAPPING_TYPE
13
+
14
+ from rasa.core.actions.action import ActionExecutionRejection, RemoteAction
15
+ from rasa.shared.core.constants import (
16
+ ACTION_EXTRACT_SLOTS,
17
+ ACTION_LISTEN_NAME,
18
+ REQUESTED_SLOT,
19
+ )
20
+ from rasa.shared.constants import UTTER_PREFIX
21
+ from rasa.shared.core.events import (
22
+ Event,
23
+ SlotSet,
24
+ ActionExecuted,
25
+ ActiveLoop,
26
+ ActionExecutionRejected,
27
+ Restarted,
28
+ )
29
+ from rasa.core.nlg import NaturalLanguageGenerator
30
+ from rasa.shared.core.slot_mappings import SlotMapping
31
+ from rasa.shared.core.slots import ListSlot
32
+ from rasa.shared.core.trackers import DialogueStateTracker
33
+ from rasa.utils.endpoints import EndpointConfig
34
+
35
+ logger = logging.getLogger(__name__)
36
+ structlogger = structlog.get_logger()
37
+
38
+
39
+ class FormAction(LoopAction):
40
+ """Action which implements and executes the form logic."""
41
+
42
+ def __init__(
43
+ self, form_name: Text, action_endpoint: Optional[EndpointConfig]
44
+ ) -> None:
45
+ """Creates a `FormAction`.
46
+
47
+ Args:
48
+ form_name: Name of the form.
49
+ action_endpoint: Endpoint to execute custom actions.
50
+ """
51
+ self._form_name = form_name
52
+ self.action_endpoint = action_endpoint
53
+ # creating it requires domain, which we don't have in init
54
+ # we'll create it on the first call
55
+ self._unique_entity_mappings: Set[Text] = set()
56
+ self._have_unique_entity_mappings_been_initialized = False
57
+
58
+ def name(self) -> Text:
59
+ """Return the form name."""
60
+ return self._form_name
61
+
62
+ def required_slots(self, domain: Domain) -> List[Text]:
63
+ """A list of required slots that the form has to fill.
64
+
65
+ Returns:
66
+ A list of slot names.
67
+ """
68
+ return domain.required_slots_for_form(self.name())
69
+
70
+ def from_entity(
71
+ self,
72
+ entity: Text,
73
+ intent: Optional[Union[Text, List[Text]]] = None,
74
+ not_intent: Optional[Union[Text, List[Text]]] = None,
75
+ role: Optional[Text] = None,
76
+ group: Optional[Text] = None,
77
+ ) -> Dict[Text, Any]:
78
+ """A dictionary for slot mapping to extract slot value.
79
+
80
+ From:
81
+ - an extracted entity
82
+ - conditioned on
83
+ - intent if it is not None
84
+ - not_intent if it is not None,
85
+ meaning user intent should not be this intent
86
+ - role if it is not None
87
+ - group if it is not None
88
+ """
89
+ intent, not_intent = (
90
+ SlotMapping.to_list(intent),
91
+ SlotMapping.to_list(not_intent),
92
+ )
93
+
94
+ return {
95
+ "type": str(SlotMappingType.FROM_ENTITY),
96
+ "entity": entity,
97
+ "intent": intent,
98
+ "not_intent": not_intent,
99
+ "role": role,
100
+ "group": group,
101
+ }
102
+
103
+ def get_mappings_for_slot(
104
+ self, slot_to_fill: Text, domain: Domain
105
+ ) -> List[Dict[Text, Any]]:
106
+ """Get mappings for requested slot.
107
+
108
+ If None, map requested slot to an entity with the same name
109
+ """
110
+ domain_slots = domain.as_dict().get(KEY_SLOTS, {})
111
+ requested_slot_mappings = domain_slots.get(slot_to_fill, {}).get("mappings", [])
112
+
113
+ # check provided slot mappings
114
+ for requested_slot_mapping in requested_slot_mappings:
115
+ if (
116
+ not isinstance(requested_slot_mapping, dict)
117
+ or requested_slot_mapping.get("type") is None
118
+ ):
119
+ raise TypeError("Provided incompatible slot mapping")
120
+
121
+ return requested_slot_mappings
122
+
123
+ def _create_unique_entity_mappings(self, domain: Domain) -> Set[Text]:
124
+ """Finds mappings of type `from_entity` that uniquely set a slot.
125
+
126
+ For example in the following form:
127
+ some_form:
128
+ departure_city:
129
+ - type: from_entity
130
+ entity: city
131
+ role: from
132
+ - type: from_entity
133
+ entity: city
134
+ arrival_city:
135
+ - type: from_entity
136
+ entity: city
137
+ role: to
138
+ - type: from_entity
139
+ entity: city
140
+
141
+ An entity `city` with a role `from` uniquely sets the slot `departure_city`
142
+ and an entity `city` with a role `to` uniquely sets the slot `arrival_city`,
143
+ so corresponding mappings are unique.
144
+ But an entity `city` without a role can fill both `departure_city`
145
+ and `arrival_city`, so corresponding mapping is not unique.
146
+
147
+ Args:
148
+ domain: The domain.
149
+
150
+ Returns:
151
+ A set of json dumps of unique mappings of type `from_entity`.
152
+ """
153
+ unique_entity_slot_mappings: Set[Text] = set()
154
+ duplicate_entity_slot_mappings: Set[Text] = set()
155
+ domain_slots = domain.as_dict().get(KEY_SLOTS, {})
156
+ for slot in domain.required_slots_for_form(self.name()):
157
+ for slot_mapping in domain_slots.get(slot, {}).get(SLOT_MAPPINGS, []):
158
+ if slot_mapping.get(MAPPING_TYPE) == str(SlotMappingType.FROM_ENTITY):
159
+ mapping_as_string = json.dumps(slot_mapping, sort_keys=True)
160
+ if mapping_as_string in unique_entity_slot_mappings:
161
+ unique_entity_slot_mappings.remove(mapping_as_string)
162
+ duplicate_entity_slot_mappings.add(mapping_as_string)
163
+ elif mapping_as_string not in duplicate_entity_slot_mappings:
164
+ unique_entity_slot_mappings.add(mapping_as_string)
165
+
166
+ return unique_entity_slot_mappings
167
+
168
+ def entity_mapping_is_unique(
169
+ self, slot_mapping: Dict[Text, Any], domain: Domain
170
+ ) -> bool:
171
+ """Verifies if the from_entity mapping is unique."""
172
+ if not self._have_unique_entity_mappings_been_initialized:
173
+ # create unique entity mappings on the first call
174
+ self._unique_entity_mappings = self._create_unique_entity_mappings(domain)
175
+ self._have_unique_entity_mappings_been_initialized = True
176
+
177
+ mapping_as_string = json.dumps(slot_mapping, sort_keys=True)
178
+ return mapping_as_string in self._unique_entity_mappings
179
+
180
+ @staticmethod
181
+ def get_entity_value_for_slot(
182
+ name: Text,
183
+ tracker: "DialogueStateTracker",
184
+ slot_to_be_filled: Text,
185
+ role: Optional[Text] = None,
186
+ group: Optional[Text] = None,
187
+ ) -> Any:
188
+ """Extract entities for given name and optional role and group.
189
+
190
+ Args:
191
+ name: entity type (name) of interest
192
+ tracker: the tracker
193
+ slot_to_be_filled: Slot which is supposed to be filled by this entity.
194
+ role: optional entity role of interest
195
+ group: optional entity group of interest
196
+
197
+ Returns:
198
+ Value of entity.
199
+ """
200
+ # list is used to cover the case of list slot type
201
+ value = list(
202
+ tracker.get_latest_entity_values(name, entity_group=group, entity_role=role)
203
+ )
204
+
205
+ if isinstance(tracker.slots.get(slot_to_be_filled), ListSlot):
206
+ return value
207
+
208
+ if len(value) == 0:
209
+ return None
210
+
211
+ if len(value) == 1:
212
+ return value[0]
213
+
214
+ return value
215
+
216
+ def get_slot_to_fill(self, tracker: "DialogueStateTracker") -> Optional[str]:
217
+ """Gets the name of the slot which should be filled next.
218
+
219
+ When switching to another form, the requested slot setting is still from the
220
+ previous form and must be ignored.
221
+
222
+ Returns:
223
+ The slot name or `None`
224
+ """
225
+ return (
226
+ tracker.get_slot(REQUESTED_SLOT)
227
+ if tracker.active_loop_name == self.name()
228
+ else None
229
+ )
230
+
231
+ async def validate_slots(
232
+ self,
233
+ slot_candidates: Dict[Text, Any],
234
+ tracker: "DialogueStateTracker",
235
+ domain: Domain,
236
+ output_channel: OutputChannel,
237
+ nlg: NaturalLanguageGenerator,
238
+ ) -> List[Union[SlotSet, Event]]:
239
+ """Validate the extracted slots.
240
+
241
+ If a custom action is available for validating the slots, we call it to validate
242
+ them. Otherwise there is no validation.
243
+
244
+ Args:
245
+ slot_candidates: Extracted slots which are candidates to fill the slots
246
+ required by the form.
247
+ tracker: The current conversation tracker.
248
+ domain: The current model domain.
249
+ output_channel: The output channel which can be used to send messages
250
+ to the user.
251
+ nlg: `NaturalLanguageGenerator` to use for response generation.
252
+
253
+ Returns:
254
+ The validation events including potential bot messages and `SlotSet` events
255
+ for the validated slots, if the custom form validation action is present in
256
+ domain actions.
257
+ Otherwise, returns empty list since the extracted slots already have
258
+ corresponding `SlotSet` events in the tracker.
259
+ """
260
+ structlogger.debug(
261
+ "forms.slots.validate", slot_candidates=copy.deepcopy(slot_candidates)
262
+ )
263
+ events: List[Union[SlotSet, Event]] = [
264
+ SlotSet(slot_name, value) for slot_name, value in slot_candidates.items()
265
+ ]
266
+
267
+ validate_name = f"validate_{self.name()}"
268
+
269
+ if validate_name not in domain.action_names_or_texts:
270
+ return []
271
+
272
+ # create temporary tracker with only the SlotSet events added
273
+ # since last user utterance
274
+ _tracker = self._temporary_tracker(tracker, events, domain)
275
+
276
+ _action = RemoteAction(validate_name, self.action_endpoint)
277
+ validate_events = await _action.run(output_channel, nlg, _tracker, domain)
278
+
279
+ # Only return the validated SlotSet events by the custom form validation action
280
+ # to avoid adding duplicate SlotSet events for slots that are already valid.
281
+ return validate_events
282
+
283
+ def _temporary_tracker(
284
+ self,
285
+ current_tracker: DialogueStateTracker,
286
+ additional_events: List[Event],
287
+ domain: Domain,
288
+ ) -> DialogueStateTracker:
289
+ return DialogueStateTracker.from_events(
290
+ current_tracker.sender_id,
291
+ current_tracker.events_after_latest_restart()
292
+ # Insert SlotSet event to make sure REQUESTED_SLOT belongs to active form.
293
+ + [SlotSet(REQUESTED_SLOT, self.get_slot_to_fill(current_tracker))]
294
+ # Insert form execution event so that it's clearly distinguishable which
295
+ # events were newly added.
296
+ + [ActionExecuted(self.name())] + additional_events,
297
+ slots=domain.slots,
298
+ )
299
+
300
+ def _user_rejected_manually(self, validation_events: List[Event]) -> bool:
301
+ """Checks if user rejected the form execution during a slot_validation.
302
+
303
+ Args:
304
+ validation_events: Events returned by the custom slot_validation action
305
+
306
+ Returns:
307
+ True if the validation_events include an ActionExecutionRejected event,
308
+ else False.
309
+ """
310
+ return any(
311
+ isinstance(event, ActionExecutionRejected) for event in validation_events
312
+ )
313
+
314
+ @staticmethod
315
+ def _get_events_since_last_user_uttered(
316
+ tracker: "DialogueStateTracker",
317
+ ) -> List[SlotSet]:
318
+ # TODO: Better way to get this latest_message index is through an instance
319
+ # variable, eg. tracker.latest_message_index
320
+ index_from_end = next(
321
+ (
322
+ i
323
+ for i, event in enumerate(reversed(tracker.events))
324
+ if event == Restarted() or event == tracker.latest_message
325
+ ),
326
+ len(tracker.events) - 1,
327
+ )
328
+ index = len(tracker.events) - index_from_end - 1
329
+ events_since_last_user_uttered = [
330
+ event
331
+ for event in itertools.islice(tracker.events, index, None)
332
+ if isinstance(event, SlotSet)
333
+ ]
334
+
335
+ return events_since_last_user_uttered
336
+
337
+ def _update_slot_values(
338
+ self,
339
+ event: SlotSet,
340
+ tracker: "DialogueStateTracker",
341
+ domain: Domain,
342
+ slot_values: Dict[Text, Any],
343
+ ) -> Dict[Text, Any]:
344
+ slot_values[event.key] = event.value
345
+
346
+ return slot_values
347
+
348
+ def _add_dynamic_slots_requested_by_dynamic_forms(
349
+ self, tracker: "DialogueStateTracker", domain: Domain
350
+ ) -> Set[Text]:
351
+ required_slots = set(self.required_slots(domain))
352
+ requested_slot = self.get_slot_to_fill(tracker)
353
+
354
+ if requested_slot:
355
+ required_slots.add(requested_slot)
356
+
357
+ return required_slots
358
+
359
+ def _get_slot_extractions(
360
+ self, tracker: "DialogueStateTracker", domain: Domain
361
+ ) -> Dict[Text, Any]:
362
+ events_since_last_user_uttered = FormAction._get_events_since_last_user_uttered(
363
+ tracker
364
+ )
365
+ slot_values: Dict[Text, Any] = {}
366
+
367
+ required_slots = self._add_dynamic_slots_requested_by_dynamic_forms(
368
+ tracker, domain
369
+ )
370
+
371
+ for event in events_since_last_user_uttered:
372
+ if event.key not in required_slots:
373
+ continue
374
+
375
+ slot_values = self._update_slot_values(event, tracker, domain, slot_values)
376
+
377
+ return slot_values
378
+
379
+ async def validate(
380
+ self,
381
+ tracker: "DialogueStateTracker",
382
+ domain: Domain,
383
+ output_channel: OutputChannel,
384
+ nlg: NaturalLanguageGenerator,
385
+ ) -> List[Union[SlotSet, Event]]:
386
+ """Extract and validate value of requested slot and other slots.
387
+
388
+ Returns:
389
+ The new validation events created by the custom form validation action
390
+
391
+ Raises:
392
+ ActionExecutionRejection exception to reject execution of form action
393
+ if nothing was extracted.
394
+
395
+ Subclass this method to add custom validation and rejection logic.
396
+ """
397
+ extracted_slot_values = self._get_slot_extractions(tracker, domain)
398
+
399
+ validation_events = await self.validate_slots(
400
+ extracted_slot_values, tracker, domain, output_channel, nlg
401
+ )
402
+
403
+ some_slots_were_validated = any(
404
+ isinstance(event, SlotSet) and not event.key == REQUESTED_SLOT
405
+ for event in validation_events
406
+ # Ignore `SlotSet`s for `REQUESTED_SLOT` as that's not a slot which needs
407
+ # to be filled by the user.
408
+ )
409
+
410
+ # extract requested slot
411
+ slot_to_fill = self.get_slot_to_fill(tracker)
412
+
413
+ if (
414
+ slot_to_fill
415
+ and not extracted_slot_values
416
+ and not some_slots_were_validated
417
+ and not self._user_rejected_manually(validation_events)
418
+ ):
419
+ # reject to execute the form action
420
+ # if some slot was requested but nothing was extracted
421
+ # it will allow other policies to predict another action
422
+ #
423
+ # don't raise it here if the user rejected manually, to allow slots other
424
+ # than the requested slot to be filled.
425
+ #
426
+ raise ActionExecutionRejection(
427
+ self.name(),
428
+ f"Failed to extract slot {slot_to_fill} with action {self.name()}",
429
+ )
430
+ return validation_events
431
+
432
+ async def request_next_slot(
433
+ self,
434
+ tracker: "DialogueStateTracker",
435
+ domain: Domain,
436
+ output_channel: OutputChannel,
437
+ nlg: NaturalLanguageGenerator,
438
+ events_so_far: List[Event],
439
+ ) -> List[Union[SlotSet, Event]]:
440
+ """Request the next slot and response if needed, else return `None`."""
441
+ request_slot_events: List[Event] = []
442
+
443
+ if await self.is_done(output_channel, nlg, tracker, domain, events_so_far):
444
+ # The custom action for slot validation decided to stop the form early
445
+ return [SlotSet(REQUESTED_SLOT, None)]
446
+
447
+ slot_to_request = next(
448
+ (
449
+ event.value
450
+ for event in events_so_far
451
+ if isinstance(event, SlotSet) and event.key == REQUESTED_SLOT
452
+ ),
453
+ None,
454
+ )
455
+
456
+ temp_tracker = self._temporary_tracker(tracker, events_so_far, domain)
457
+
458
+ if not slot_to_request:
459
+ slot_to_request = self._find_next_slot_to_request(temp_tracker, domain)
460
+ request_slot_events.append(SlotSet(REQUESTED_SLOT, slot_to_request))
461
+
462
+ if slot_to_request:
463
+ bot_message_events = await self._ask_for_slot(
464
+ domain, nlg, output_channel, slot_to_request, temp_tracker
465
+ )
466
+ return request_slot_events + bot_message_events
467
+
468
+ # no more required slots to fill
469
+ return [SlotSet(REQUESTED_SLOT, None)]
470
+
471
+ def _find_next_slot_to_request(
472
+ self, tracker: DialogueStateTracker, domain: Domain
473
+ ) -> Optional[Text]:
474
+ return next(
475
+ (
476
+ slot
477
+ for slot in self.required_slots(domain)
478
+ if self._should_request_slot(tracker, slot)
479
+ ),
480
+ None,
481
+ )
482
+
483
+ def _name_of_utterance(self, domain: Domain, slot_name: Text) -> Optional[Text]:
484
+ search_path = [
485
+ f"action_ask_{self._form_name}_{slot_name}",
486
+ f"{UTTER_PREFIX}ask_{self._form_name}_{slot_name}",
487
+ f"action_ask_{slot_name}",
488
+ f"{UTTER_PREFIX}ask_{slot_name}",
489
+ ]
490
+
491
+ found_actions = (
492
+ action_name
493
+ for action_name in search_path
494
+ if action_name in domain.action_names_or_texts
495
+ )
496
+
497
+ return next(found_actions, None)
498
+
499
+ async def _ask_for_slot(
500
+ self,
501
+ domain: Domain,
502
+ nlg: NaturalLanguageGenerator,
503
+ output_channel: OutputChannel,
504
+ slot_name: Text,
505
+ tracker: DialogueStateTracker,
506
+ ) -> List[Event]:
507
+ logger.debug(f"Request next slot '{slot_name}'")
508
+
509
+ action_name_to_ask_for_next_slot = self._name_of_utterance(domain, slot_name)
510
+ if not action_name_to_ask_for_next_slot:
511
+ # Use a debug log as the user might have asked as part of a custom action
512
+ logger.debug(
513
+ f"There was no action found to ask for slot '{slot_name}' "
514
+ f"name to be filled."
515
+ )
516
+ return []
517
+
518
+ action_to_ask_for_next_slot = action.action_for_name_or_text(
519
+ action_name_to_ask_for_next_slot, domain, self.action_endpoint
520
+ )
521
+ return await action_to_ask_for_next_slot.run(
522
+ output_channel, nlg, tracker, domain
523
+ )
524
+
525
+ async def _validate_if_required(
526
+ self,
527
+ tracker: "DialogueStateTracker",
528
+ domain: Domain,
529
+ output_channel: OutputChannel,
530
+ nlg: NaturalLanguageGenerator,
531
+ ) -> List[Event]:
532
+ """Return a list of events from `self.validate(...)`.
533
+
534
+ Validation is required if:
535
+ - the form is active
536
+ - the form is called after `action_listen`
537
+ - form validation was not cancelled
538
+ """
539
+ # no active_loop means that it is called during activation
540
+ needs_validation = not tracker.active_loop or (
541
+ tracker.latest_action_name == ACTION_LISTEN_NAME
542
+ and not tracker.is_active_loop_interrupted
543
+ )
544
+
545
+ if needs_validation:
546
+ structlogger.debug(
547
+ "forms.validation.required",
548
+ tracker_latest_message=copy.deepcopy(tracker.latest_message),
549
+ )
550
+ return await self.validate(tracker, domain, output_channel, nlg)
551
+ else:
552
+ # Needed to determine which slots to request although there are no slots
553
+ # to actually validate, which happens when coming back to the form after
554
+ # an unhappy path
555
+ return await self.validate_slots({}, tracker, domain, output_channel, nlg)
556
+
557
+ @staticmethod
558
+ def _should_request_slot(tracker: "DialogueStateTracker", slot_name: Text) -> bool:
559
+ """Check whether form action should request given slot."""
560
+ return tracker.get_slot(slot_name) is None
561
+
562
+ async def activate(
563
+ self,
564
+ output_channel: "OutputChannel",
565
+ nlg: "NaturalLanguageGenerator",
566
+ tracker: "DialogueStateTracker",
567
+ domain: "Domain",
568
+ ) -> List[Event]:
569
+ """Activate form if the form is called for the first time.
570
+
571
+ If activating, run action_extract_slots to fill slots with
572
+ mapping conditions from trigger intents.
573
+ Validate any required slots that can be filled, and return any `SlotSet`
574
+ events from the extraction and validation of these pre-filled slots.
575
+
576
+ Args:
577
+ output_channel: The output channel which can be used to send messages
578
+ to the user.
579
+ nlg: `NaturalLanguageGenerator` to use for response generation.
580
+ tracker: Current conversation tracker of the user.
581
+ domain: Current model domain.
582
+
583
+ Returns:
584
+ Events from the activation.
585
+ """
586
+ logger.debug(f"Activated the form '{self.name()}'.")
587
+ # collect values of required slots filled before activation
588
+ prefilled_slots = {}
589
+
590
+ action_extract_slots = action.action_for_name_or_text(
591
+ ACTION_EXTRACT_SLOTS, domain, self.action_endpoint
592
+ )
593
+
594
+ logger.debug(
595
+ f"Executing default action '{ACTION_EXTRACT_SLOTS}' at form activation."
596
+ )
597
+
598
+ extraction_events = await action_extract_slots.run(
599
+ output_channel, nlg, tracker, domain
600
+ )
601
+
602
+ events_as_str = "\n".join(str(e) for e in extraction_events)
603
+ logger.debug(
604
+ f"The execution of '{ACTION_EXTRACT_SLOTS}' resulted in "
605
+ f"these events: {events_as_str}."
606
+ )
607
+
608
+ tracker.update_with_events(extraction_events)
609
+
610
+ for slot_name in self.required_slots(domain):
611
+ if not self._should_request_slot(tracker, slot_name):
612
+ prefilled_slots[slot_name] = tracker.get_slot(slot_name)
613
+
614
+ if not prefilled_slots:
615
+ logger.debug("No pre-filled required slots to validate.")
616
+ else:
617
+ structlogger.debug(
618
+ "forms.validate.prefilled_slots",
619
+ prefilled_slots=copy.deepcopy(prefilled_slots),
620
+ )
621
+
622
+ validate_name = f"validate_{self.name()}"
623
+
624
+ if validate_name not in domain.action_names_or_texts:
625
+ logger.debug(
626
+ f"There is no validation action '{validate_name}' "
627
+ f"to execute at form activation."
628
+ )
629
+ return [event for event in extraction_events if isinstance(event, SlotSet)]
630
+
631
+ logger.debug(
632
+ f"Executing validation action '{validate_name}' at form activation."
633
+ )
634
+
635
+ validated_events = await self.validate_slots(
636
+ prefilled_slots, tracker, domain, output_channel, nlg
637
+ )
638
+
639
+ validated_slot_names = [
640
+ event.key for event in validated_events if isinstance(event, SlotSet)
641
+ ]
642
+
643
+ return validated_events + [
644
+ event
645
+ for event in extraction_events
646
+ if isinstance(event, SlotSet) and event.key not in validated_slot_names
647
+ ]
648
+
649
+ async def do(
650
+ self,
651
+ output_channel: "OutputChannel",
652
+ nlg: "NaturalLanguageGenerator",
653
+ tracker: "DialogueStateTracker",
654
+ domain: "Domain",
655
+ events_so_far: List[Event],
656
+ ) -> List[Event]:
657
+ """Executes form loop after activation."""
658
+ events: List[Event] = []
659
+ """
660
+ Call to validation is not required when the slots are already validated
661
+ at the time of form activation.
662
+ events_so_far:
663
+ - empty when slots have not been validated.
664
+ - has SlotSet objects when already validated.
665
+ - ActiveLoop object when events have not been validated.
666
+ Hence the events are filtered to remove ActiveLoop object that was added
667
+ at the time of form activation.
668
+ """
669
+ filtered_events = [
670
+ event for event in events_so_far if not isinstance(event, ActiveLoop)
671
+ ]
672
+ if not filtered_events:
673
+ events = await self._validate_if_required(
674
+ tracker, domain, output_channel, nlg
675
+ )
676
+
677
+ if not self._user_rejected_manually(events):
678
+ events += await self.request_next_slot(
679
+ tracker, domain, output_channel, nlg, events_so_far + events
680
+ )
681
+
682
+ return events
683
+
684
+ async def is_done(
685
+ self,
686
+ output_channel: "OutputChannel",
687
+ nlg: "NaturalLanguageGenerator",
688
+ tracker: "DialogueStateTracker",
689
+ domain: "Domain",
690
+ events_so_far: List[Event],
691
+ ) -> bool:
692
+ """Checks if loop can be terminated."""
693
+ if any(isinstance(event, ActionExecutionRejected) for event in events_so_far):
694
+ return False
695
+
696
+ # Custom validation actions can decide to terminate the loop early by
697
+ # setting the requested slot to `None` or setting `ActiveLoop(None)`.
698
+ # We explicitly check only the last occurrences for each possible termination
699
+ # event instead of doing `return event in events_so_far` to make it possible
700
+ # to override termination events which were returned earlier.
701
+ return next(
702
+ (
703
+ event
704
+ for event in reversed(events_so_far)
705
+ if isinstance(event, SlotSet) and event.key == REQUESTED_SLOT
706
+ ),
707
+ None,
708
+ ) == SlotSet(REQUESTED_SLOT, None) or next(
709
+ (
710
+ event
711
+ for event in reversed(events_so_far)
712
+ if isinstance(event, ActiveLoop)
713
+ ),
714
+ None,
715
+ ) == ActiveLoop(
716
+ None
717
+ )
718
+
719
+ async def deactivate(self, *args: Any, **kwargs: Any) -> List[Event]:
720
+ """Deactivates form."""
721
+ logger.debug(f"Deactivating the form '{self.name()}'")
722
+ return []
723
+
724
+ async def _activate_loop(
725
+ self,
726
+ output_channel: "OutputChannel",
727
+ nlg: "NaturalLanguageGenerator",
728
+ tracker: "DialogueStateTracker",
729
+ domain: "Domain",
730
+ ) -> List[Event]:
731
+ events = self._default_activation_events()
732
+
733
+ temp_tracker = tracker.copy()
734
+ temp_tracker.update_with_events(events)
735
+ events += await self.activate(output_channel, nlg, temp_tracker, domain)
736
+
737
+ return events