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,1172 @@
1
+ from __future__ import annotations
2
+ from pathlib import Path
3
+ from collections import defaultdict
4
+ from abc import abstractmethod
5
+ import jsonpickle
6
+ import logging
7
+
8
+ from tqdm import tqdm
9
+ from typing import (
10
+ Tuple,
11
+ List,
12
+ Optional,
13
+ Dict,
14
+ Text,
15
+ Union,
16
+ Any,
17
+ Iterator,
18
+ Set,
19
+ DefaultDict,
20
+ cast,
21
+ )
22
+ import numpy as np
23
+
24
+ from rasa.core.featurizers.single_state_featurizer import SingleStateFeaturizer
25
+ from rasa.core.featurizers.precomputation import MessageContainerForCoreFeaturization
26
+ from rasa.core.exceptions import InvalidTrackerFeaturizerUsageError
27
+ import rasa.shared.core.trackers
28
+ import rasa.shared.utils.io
29
+ from rasa.shared.nlu.constants import TEXT, INTENT, ENTITIES, ACTION_NAME
30
+ from rasa.shared.nlu.training_data.features import Features
31
+ from rasa.shared.core.trackers import DialogueStateTracker
32
+ from rasa.shared.core.domain import State, Domain
33
+ from rasa.shared.core.events import Event, ActionExecuted, UserUttered
34
+ from rasa.shared.core.constants import (
35
+ USER,
36
+ ACTION_UNLIKELY_INTENT_NAME,
37
+ PREVIOUS_ACTION,
38
+ )
39
+ from rasa.shared.exceptions import RasaException
40
+ from rasa.utils.tensorflow.constants import LABEL_PAD_ID
41
+ from rasa.utils.tensorflow.model_data import ragged_array_to_ndarray
42
+
43
+ FEATURIZER_FILE = "featurizer.json"
44
+
45
+ logger = logging.getLogger(__name__)
46
+
47
+
48
+ class InvalidStory(RasaException):
49
+ """Exception that can be raised if story cannot be featurized."""
50
+
51
+ def __init__(self, message: Text) -> None:
52
+ """Creates an InvalidStory exception.
53
+
54
+ Args:
55
+ message: a custom exception message.
56
+ """
57
+ self.message = message
58
+ super(InvalidStory, self).__init__()
59
+
60
+ def __str__(self) -> Text:
61
+ return self.message
62
+
63
+
64
+ class TrackerFeaturizer:
65
+ """Base class for actual tracker featurizers."""
66
+
67
+ def __init__(
68
+ self, state_featurizer: Optional[SingleStateFeaturizer] = None
69
+ ) -> None:
70
+ """Initializes the tracker featurizer.
71
+
72
+ Args:
73
+ state_featurizer: The state featurizer used to encode tracker states.
74
+ """
75
+ self.state_featurizer = state_featurizer
76
+
77
+ @staticmethod
78
+ def _create_states(
79
+ tracker: DialogueStateTracker,
80
+ domain: Domain,
81
+ omit_unset_slots: bool = False,
82
+ ignore_rule_only_turns: bool = False,
83
+ rule_only_data: Optional[Dict[Text, Any]] = None,
84
+ ) -> List[State]:
85
+ """Creates states for the given tracker.
86
+
87
+ Args:
88
+ tracker: The tracker to transform to states.
89
+ domain: The domain of the tracker.
90
+ omit_unset_slots: If `True` do not include the initial values of slots.
91
+ ignore_rule_only_turns: If `True` ignore dialogue turns that are present
92
+ only in rules.
93
+ rule_only_data: Slots and loops,
94
+ which only occur in rules but not in stories.
95
+
96
+ Returns:
97
+ Trackers as states.
98
+ """
99
+ return tracker.past_states(
100
+ domain,
101
+ omit_unset_slots=omit_unset_slots,
102
+ ignore_rule_only_turns=ignore_rule_only_turns,
103
+ rule_only_data=rule_only_data,
104
+ )
105
+
106
+ def _featurize_states(
107
+ self,
108
+ trackers_as_states: List[List[State]],
109
+ precomputations: Optional[MessageContainerForCoreFeaturization],
110
+ ) -> List[List[Dict[Text, List[Features]]]]:
111
+ """Featurizes state histories with `state_featurizer`.
112
+
113
+ Args:
114
+ trackers_as_states: Lists of states produced by a `DialogueStateTracker`
115
+ instance.
116
+ precomputations: Contains precomputed features and attributes.
117
+
118
+ Returns:
119
+ Featurized tracker states.
120
+ """
121
+ if self.state_featurizer is None:
122
+ return [[{}]]
123
+ else:
124
+ return [
125
+ [
126
+ self.state_featurizer.encode_state(state, precomputations)
127
+ for state in tracker_states
128
+ ]
129
+ for tracker_states in trackers_as_states
130
+ ]
131
+
132
+ @staticmethod
133
+ def _convert_labels_to_ids(
134
+ trackers_as_actions: List[List[Text]], domain: Domain
135
+ ) -> np.ndarray:
136
+ """Converts actions to label ids for each tracker.
137
+
138
+ Args:
139
+ trackers_as_actions: A list of tracker labels.
140
+
141
+ Returns:
142
+ Label IDs for each tracker
143
+ """
144
+ # store labels in numpy arrays so that it corresponds to np arrays of input
145
+ # features
146
+ return ragged_array_to_ndarray(
147
+ [
148
+ np.array(
149
+ [domain.index_for_action(action) for action in tracker_actions]
150
+ )
151
+ for tracker_actions in trackers_as_actions
152
+ ]
153
+ )
154
+
155
+ def _create_entity_tags(
156
+ self,
157
+ trackers_as_entities: List[List[Dict[Text, Any]]],
158
+ precomputations: Optional[MessageContainerForCoreFeaturization],
159
+ bilou_tagging: bool = False,
160
+ ) -> List[List[Dict[Text, List[Features]]]]:
161
+ """Featurizes extracted entities with `state_featurizer`.
162
+
163
+ Args:
164
+ trackers_as_entities: Extracted entities from trackers.
165
+ precomputations: Contains precomputed features and attributes.
166
+ bilou_tagging: When `True` use the BILOU tagging scheme.
167
+
168
+ Returns:
169
+ Trackers as entity features.
170
+ """
171
+ if self.state_featurizer is None:
172
+ return [[{}]]
173
+ else:
174
+ return [
175
+ [
176
+ self.state_featurizer.encode_entities(
177
+ entity_data, precomputations, bilou_tagging
178
+ )
179
+ for entity_data in trackers_entities
180
+ ]
181
+ for trackers_entities in trackers_as_entities
182
+ ]
183
+
184
+ @staticmethod
185
+ def _entity_data(event: UserUttered) -> Dict[Text, Any]:
186
+ """Extracts entities from event if not using intents.
187
+
188
+ Args:
189
+ event: The event from which to extract entities.
190
+
191
+ Returns:
192
+ Event text and entities if no intent is present.
193
+ """
194
+ # train stories support both text and intent,
195
+ # but if intent is present, the text is ignored
196
+ if event.text and not event.intent_name:
197
+ return {TEXT: event.text, ENTITIES: event.entities}
198
+
199
+ # input is not textual, so add empty dict
200
+ return {}
201
+
202
+ @staticmethod
203
+ def _remove_user_text_if_intent(trackers_as_states: List[List[State]]) -> None:
204
+ """Deletes user text from state dictionaries if intent is present.
205
+
206
+ Only featurizing either the intent or user text is currently supported. When
207
+ both are present in a state, the user text is removed so that only the intent
208
+ is featurized.
209
+
210
+ `trackers_as_states` is modified in place.
211
+
212
+ Args:
213
+ trackers_as_states: States produced by a `DialogueStateTracker` instance.
214
+ """
215
+ for states in trackers_as_states:
216
+ for state in states:
217
+ # remove text features to only use intent
218
+ if state.get(USER, {}).get(INTENT) and state.get(USER, {}).get(TEXT):
219
+ del state[USER][TEXT]
220
+
221
+ def training_states_and_labels(
222
+ self,
223
+ trackers: List[DialogueStateTracker],
224
+ domain: Domain,
225
+ omit_unset_slots: bool = False,
226
+ ignore_action_unlikely_intent: bool = False,
227
+ ) -> Tuple[List[List[State]], List[List[Text]]]:
228
+ """Transforms trackers to states and labels.
229
+
230
+ Args:
231
+ trackers: The trackers to transform.
232
+ domain: The domain.
233
+ omit_unset_slots: If `True` do not include the initial values of slots.
234
+ ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
235
+ from training states.
236
+
237
+ Returns:
238
+ Trackers as states and labels.
239
+ """
240
+ (
241
+ trackers_as_states,
242
+ trackers_as_labels,
243
+ _,
244
+ ) = self.training_states_labels_and_entities(
245
+ trackers,
246
+ domain,
247
+ omit_unset_slots=omit_unset_slots,
248
+ ignore_action_unlikely_intent=ignore_action_unlikely_intent,
249
+ )
250
+ return trackers_as_states, trackers_as_labels
251
+
252
+ @abstractmethod
253
+ def training_states_labels_and_entities(
254
+ self,
255
+ trackers: List[DialogueStateTracker],
256
+ domain: Domain,
257
+ omit_unset_slots: bool = False,
258
+ ignore_action_unlikely_intent: bool = False,
259
+ ) -> Tuple[List[List[State]], List[List[Text]], List[List[Dict[Text, Any]]]]:
260
+ """Transforms trackers to states, labels, and entity data.
261
+
262
+ Args:
263
+ trackers: The trackers to transform.
264
+ domain: The domain.
265
+ omit_unset_slots: If `True` do not include the initial values of slots.
266
+ ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
267
+ from training states.
268
+
269
+ Returns:
270
+ Trackers as states, labels, and entity data.
271
+ """
272
+ raise NotImplementedError(
273
+ f"`{self.__class__.__name__}` should implement how to "
274
+ f"encode trackers as feature vectors"
275
+ )
276
+
277
+ def prepare_for_featurization(
278
+ self, domain: Domain, bilou_tagging: bool = False
279
+ ) -> None:
280
+ """Ensures that the featurizer is ready to be called during training.
281
+
282
+ State featurizer needs to build its vocabulary from the domain
283
+ for it to be ready to be used during training.
284
+
285
+ Args:
286
+ domain: Domain of the assistant.
287
+ bilou_tagging: Whether to consider bilou tagging.
288
+ """
289
+ if self.state_featurizer is None:
290
+ raise InvalidTrackerFeaturizerUsageError(
291
+ f"Instance variable 'state_featurizer' is not set. "
292
+ f"During initialization set 'state_featurizer' to an instance of "
293
+ f"'{SingleStateFeaturizer.__class__.__name__}' class "
294
+ f"to get numerical features for trackers."
295
+ )
296
+ self.state_featurizer.prepare_for_training(domain, bilou_tagging)
297
+
298
+ def featurize_trackers(
299
+ self,
300
+ trackers: List[DialogueStateTracker],
301
+ domain: Domain,
302
+ precomputations: Optional[MessageContainerForCoreFeaturization],
303
+ bilou_tagging: bool = False,
304
+ ignore_action_unlikely_intent: bool = False,
305
+ ) -> Tuple[
306
+ List[List[Dict[Text, List[Features]]]],
307
+ np.ndarray,
308
+ List[List[Dict[Text, List[Features]]]],
309
+ ]:
310
+ """Featurizes the training trackers.
311
+
312
+ Args:
313
+ trackers: list of training trackers
314
+ domain: the domain
315
+ precomputations: Contains precomputed features and attributes.
316
+ bilou_tagging: indicates whether BILOU tagging should be used or not
317
+ ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
318
+ from training state features.
319
+
320
+ Returns:
321
+ - a dictionary of state types (INTENT, TEXT, ACTION_NAME, ACTION_TEXT,
322
+ ENTITIES, SLOTS, ACTIVE_LOOP) to a list of features for all dialogue
323
+ turns in all training trackers
324
+ - the label ids (e.g. action ids) for every dialogue turn in all training
325
+ trackers
326
+ - A dictionary of entity type (ENTITY_TAGS) to a list of features
327
+ containing entity tag ids for text user inputs otherwise empty dict
328
+ for all dialogue turns in all training trackers
329
+ """
330
+ self.prepare_for_featurization(domain, bilou_tagging)
331
+ (
332
+ trackers_as_states,
333
+ trackers_as_labels,
334
+ trackers_as_entities,
335
+ ) = self.training_states_labels_and_entities(
336
+ trackers,
337
+ domain,
338
+ ignore_action_unlikely_intent=ignore_action_unlikely_intent,
339
+ )
340
+
341
+ tracker_state_features = self._featurize_states(
342
+ trackers_as_states, precomputations
343
+ )
344
+
345
+ if not tracker_state_features and not trackers_as_labels:
346
+ # If input and output were empty, it means there is
347
+ # no data on which the policy can be trained
348
+ # hence return them as it is. They'll be handled
349
+ # appropriately inside the policy.
350
+ return tracker_state_features, np.ndarray(trackers_as_labels), []
351
+
352
+ label_ids = self._convert_labels_to_ids(trackers_as_labels, domain)
353
+
354
+ entity_tags = self._create_entity_tags(
355
+ trackers_as_entities, precomputations, bilou_tagging
356
+ )
357
+
358
+ return tracker_state_features, label_ids, entity_tags
359
+
360
+ def _choose_last_user_input(
361
+ self, trackers_as_states: List[List[State]], use_text_for_last_user_input: bool
362
+ ) -> None:
363
+ for states in trackers_as_states:
364
+ last_state = states[-1]
365
+ # only update the state of the real user utterance
366
+ if not rasa.shared.core.trackers.is_prev_action_listen_in_state(last_state):
367
+ continue
368
+
369
+ if use_text_for_last_user_input:
370
+ # remove intent features to only use text
371
+ if last_state.get(USER, {}).get(INTENT):
372
+ del last_state[USER][INTENT]
373
+ # don't add entities if text is used for featurization
374
+ if last_state.get(USER, {}).get(ENTITIES):
375
+ del last_state[USER][ENTITIES]
376
+ else:
377
+ # remove text features to only use intent
378
+ if last_state.get(USER, {}).get(TEXT):
379
+ del last_state[USER][TEXT]
380
+
381
+ # make sure that all dialogue steps are either intent or text based
382
+ self._remove_user_text_if_intent(trackers_as_states)
383
+
384
+ def prediction_states(
385
+ self,
386
+ trackers: List[DialogueStateTracker],
387
+ domain: Domain,
388
+ use_text_for_last_user_input: bool = False,
389
+ ignore_rule_only_turns: bool = False,
390
+ rule_only_data: Optional[Dict[Text, Any]] = None,
391
+ ignore_action_unlikely_intent: bool = False,
392
+ ) -> List[List[State]]:
393
+ """Transforms trackers to states for prediction.
394
+
395
+ Args:
396
+ trackers: The trackers to transform.
397
+ domain: The domain.
398
+ use_text_for_last_user_input: Indicates whether to use text or intent label
399
+ for featurizing last user input.
400
+ ignore_rule_only_turns: If True ignore dialogue turns that are present
401
+ only in rules.
402
+ rule_only_data: Slots and loops,
403
+ which only occur in rules but not in stories.
404
+ ignore_action_unlikely_intent: Whether to remove states containing
405
+ `action_unlikely_intent` from prediction states.
406
+
407
+ Returns:
408
+ Trackers as states for prediction.
409
+ """
410
+ raise NotImplementedError(
411
+ "Featurizer must have the capacity to create feature vector"
412
+ )
413
+
414
+ def create_state_features(
415
+ self,
416
+ trackers: List[DialogueStateTracker],
417
+ domain: Domain,
418
+ precomputations: Optional[MessageContainerForCoreFeaturization],
419
+ use_text_for_last_user_input: bool = False,
420
+ ignore_rule_only_turns: bool = False,
421
+ rule_only_data: Optional[Dict[Text, Any]] = None,
422
+ ignore_action_unlikely_intent: bool = False,
423
+ ) -> List[List[Dict[Text, List[Features]]]]:
424
+ """Creates state features for prediction.
425
+
426
+ Args:
427
+ trackers: A list of state trackers
428
+ domain: The domain
429
+ precomputations: Contains precomputed features and attributes.
430
+ use_text_for_last_user_input: Indicates whether to use text or intent label
431
+ for featurizing last user input.
432
+ ignore_rule_only_turns: If True ignore dialogue turns that are present
433
+ only in rules.
434
+ rule_only_data: Slots and loops,
435
+ which only occur in rules but not in stories.
436
+ ignore_action_unlikely_intent: Whether to remove any states containing
437
+ `action_unlikely_intent` from state features.
438
+
439
+ Returns:
440
+ Dictionaries of state type (INTENT, TEXT, ACTION_NAME, ACTION_TEXT,
441
+ ENTITIES, SLOTS, ACTIVE_LOOP) to a list of features for all dialogue
442
+ turns in all trackers.
443
+ """
444
+ trackers_as_states = self.prediction_states(
445
+ trackers,
446
+ domain,
447
+ use_text_for_last_user_input,
448
+ ignore_rule_only_turns,
449
+ rule_only_data,
450
+ ignore_action_unlikely_intent=ignore_action_unlikely_intent,
451
+ )
452
+ return self._featurize_states(trackers_as_states, precomputations)
453
+
454
+ def persist(self, path: Union[Text, Path]) -> None:
455
+ """Persists the tracker featurizer to the given path.
456
+
457
+ Args:
458
+ path: The path to persist the tracker featurizer to.
459
+ """
460
+ featurizer_file = Path(path) / FEATURIZER_FILE
461
+ rasa.shared.utils.io.create_directory_for_file(featurizer_file)
462
+
463
+ # entity tags are persisted in TED policy, they are not needed for prediction
464
+ if self.state_featurizer is not None:
465
+ self.state_featurizer.entity_tag_specs = []
466
+
467
+ # noinspection PyTypeChecker
468
+ rasa.shared.utils.io.write_text_file(
469
+ str(jsonpickle.encode(self)), featurizer_file
470
+ )
471
+
472
+ @staticmethod
473
+ def load(path: Union[Text, Path]) -> Optional[TrackerFeaturizer]:
474
+ """Loads the featurizer from file.
475
+
476
+ Args:
477
+ path: The path to load the tracker featurizer from.
478
+
479
+ Returns:
480
+ The loaded tracker featurizer.
481
+ """
482
+ featurizer_file = Path(path) / FEATURIZER_FILE
483
+ if featurizer_file.is_file():
484
+ return jsonpickle.decode(rasa.shared.utils.io.read_file(featurizer_file))
485
+
486
+ logger.error(
487
+ f"Couldn't load featurizer for policy. "
488
+ f"File '{featurizer_file}' doesn't exist."
489
+ )
490
+ return None
491
+
492
+ @staticmethod
493
+ def _remove_action_unlikely_intent_from_states(states: List[State]) -> List[State]:
494
+ return [
495
+ state
496
+ for state in states
497
+ if not _is_prev_action_unlikely_intent_in_state(state)
498
+ ]
499
+
500
+ @staticmethod
501
+ def _remove_action_unlikely_intent_from_events(events: List[Event]) -> List[Event]:
502
+ return [
503
+ event
504
+ for event in events
505
+ if (
506
+ not isinstance(event, ActionExecuted)
507
+ or event.action_name != ACTION_UNLIKELY_INTENT_NAME
508
+ )
509
+ ]
510
+
511
+
512
+ class FullDialogueTrackerFeaturizer(TrackerFeaturizer):
513
+ """Creates full dialogue training data for time distributed architectures.
514
+
515
+ Creates training data that uses each time output for prediction.
516
+ """
517
+
518
+ def training_states_labels_and_entities(
519
+ self,
520
+ trackers: List[DialogueStateTracker],
521
+ domain: Domain,
522
+ omit_unset_slots: bool = False,
523
+ ignore_action_unlikely_intent: bool = False,
524
+ ) -> Tuple[List[List[State]], List[List[Text]], List[List[Dict[Text, Any]]]]:
525
+ """Transforms trackers to states, action labels, and entity data.
526
+
527
+ Args:
528
+ trackers: The trackers to transform.
529
+ domain: The domain.
530
+ omit_unset_slots: If `True` do not include the initial values of slots.
531
+ ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
532
+ from training states.
533
+
534
+ Returns:
535
+ Trackers as states, action labels, and entity data.
536
+ """
537
+ trackers_as_states = []
538
+ trackers_as_actions = []
539
+ trackers_as_entities = []
540
+
541
+ logger.debug(
542
+ "Creating states and action examples from "
543
+ "collected trackers (by {}({}))..."
544
+ "".format(type(self).__name__, type(self.state_featurizer).__name__)
545
+ )
546
+ pbar = tqdm(
547
+ trackers,
548
+ desc="Processed trackers",
549
+ disable=rasa.shared.utils.io.is_logging_disabled(),
550
+ )
551
+ for tracker in pbar:
552
+ states = self._create_states(
553
+ tracker, domain, omit_unset_slots=omit_unset_slots
554
+ )
555
+ events = tracker.applied_events(True)
556
+
557
+ if ignore_action_unlikely_intent:
558
+ states = self._remove_action_unlikely_intent_from_states(states)
559
+ events = self._remove_action_unlikely_intent_from_events(events)
560
+
561
+ delete_first_state = False
562
+ actions = []
563
+ entities = []
564
+ entity_data = {}
565
+ for event in events:
566
+ if isinstance(event, UserUttered):
567
+ entity_data = self._entity_data(event)
568
+
569
+ if not isinstance(event, ActionExecuted):
570
+ continue
571
+
572
+ if not event.unpredictable:
573
+ # only actions which can be
574
+ # predicted at a stories start
575
+ action = event.action_name or event.action_text
576
+ if action is not None:
577
+ actions.append(action)
578
+ entities.append(entity_data)
579
+ else:
580
+ # unpredictable actions can be
581
+ # only the first in the story
582
+ if delete_first_state:
583
+ raise InvalidStory(
584
+ f"Found two unpredictable actions in one story "
585
+ f"'{tracker.sender_id}'. Check your story files."
586
+ )
587
+ delete_first_state = True
588
+
589
+ # reset entity_data for the the next turn
590
+ entity_data = {}
591
+
592
+ if delete_first_state:
593
+ states = states[1:]
594
+
595
+ trackers_as_states.append(states[:-1])
596
+ trackers_as_actions.append(actions)
597
+ trackers_as_entities.append(entities)
598
+
599
+ self._remove_user_text_if_intent(trackers_as_states)
600
+
601
+ return trackers_as_states, trackers_as_actions, trackers_as_entities
602
+
603
+ def prediction_states(
604
+ self,
605
+ trackers: List[DialogueStateTracker],
606
+ domain: Domain,
607
+ use_text_for_last_user_input: bool = False,
608
+ ignore_rule_only_turns: bool = False,
609
+ rule_only_data: Optional[Dict[Text, Any]] = None,
610
+ ignore_action_unlikely_intent: bool = False,
611
+ ) -> List[List[State]]:
612
+ """Transforms trackers to states for prediction.
613
+
614
+ Args:
615
+ trackers: The trackers to transform.
616
+ domain: The domain.
617
+ use_text_for_last_user_input: Indicates whether to use text or intent label
618
+ for featurizing last user input.
619
+ ignore_rule_only_turns: If True ignore dialogue turns that are present
620
+ only in rules.
621
+ rule_only_data: Slots and loops,
622
+ which only occur in rules but not in stories.
623
+ ignore_action_unlikely_intent: Whether to remove any states containing
624
+ `action_unlikely_intent` from prediction states.
625
+
626
+ Returns:
627
+ Trackers as states for prediction.
628
+ """
629
+ trackers_as_states = [
630
+ self._create_states(
631
+ tracker,
632
+ domain,
633
+ ignore_rule_only_turns=ignore_rule_only_turns,
634
+ rule_only_data=rule_only_data,
635
+ )
636
+ for tracker in trackers
637
+ ]
638
+
639
+ if ignore_action_unlikely_intent:
640
+ trackers_as_states = [
641
+ self._remove_action_unlikely_intent_from_states(states)
642
+ for states in trackers_as_states
643
+ ]
644
+
645
+ self._choose_last_user_input(trackers_as_states, use_text_for_last_user_input)
646
+
647
+ return trackers_as_states
648
+
649
+
650
+ class MaxHistoryTrackerFeaturizer(TrackerFeaturizer):
651
+ """Truncates the tracker history into `max_history` long sequences.
652
+
653
+ Creates training data from trackers where actions are the output prediction
654
+ labels. Tracker state sequences which represent policy input are truncated
655
+ to not excede `max_history` states.
656
+ """
657
+
658
+ LABEL_NAME = "action"
659
+
660
+ def __init__(
661
+ self,
662
+ state_featurizer: Optional[SingleStateFeaturizer] = None,
663
+ max_history: Optional[int] = None,
664
+ remove_duplicates: bool = True,
665
+ ) -> None:
666
+ """Initializes the tracker featurizer.
667
+
668
+ Args:
669
+ state_featurizer: The state featurizer used to encode the states.
670
+ max_history: The maximum length of an extracted state sequence.
671
+ remove_duplicates: Keep only unique training state sequence/label pairs.
672
+ """
673
+ super().__init__(state_featurizer)
674
+ self.max_history = max_history
675
+ self.remove_duplicates = remove_duplicates
676
+
677
+ @staticmethod
678
+ def slice_state_history(
679
+ states: List[State], slice_length: Optional[int]
680
+ ) -> List[State]:
681
+ """Slices states from the trackers history.
682
+
683
+ Args:
684
+ states: The states
685
+ slice_length: The slice length
686
+
687
+ Returns:
688
+ The sliced states.
689
+ """
690
+ if not slice_length:
691
+ return states
692
+
693
+ return states[-slice_length:]
694
+
695
+ @staticmethod
696
+ def _hash_example(states: List[State], labels: Optional[List[Text]] = None) -> int:
697
+ """Hashes states (and optionally label).
698
+
699
+ Produces a hash of the tracker state sequence (and optionally the labels).
700
+ If `labels` is `None`, labels don't get hashed.
701
+
702
+ Args:
703
+ states: The tracker state sequence to hash.
704
+ labels: Label strings associated with this state sequence.
705
+
706
+ Returns:
707
+ The hash of the states and (optionally) the label.
708
+ """
709
+ frozen_states = tuple(
710
+ s if s is None else DialogueStateTracker.freeze_current_state(s)
711
+ for s in states
712
+ )
713
+ if labels is not None:
714
+ frozen_labels = tuple(labels)
715
+ return hash((frozen_states, frozen_labels))
716
+ else:
717
+ return hash(frozen_states)
718
+
719
+ def training_states_labels_and_entities(
720
+ self,
721
+ trackers: List[DialogueStateTracker],
722
+ domain: Domain,
723
+ omit_unset_slots: bool = False,
724
+ ignore_action_unlikely_intent: bool = False,
725
+ ) -> Tuple[List[List[State]], List[List[Text]], List[List[Dict[Text, Any]]]]:
726
+ """Transforms trackers to states, action labels, and entity data.
727
+
728
+ Args:
729
+ trackers: The trackers to transform.
730
+ domain: The domain.
731
+ omit_unset_slots: If `True` do not include the initial values of slots.
732
+ ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
733
+ from training states.
734
+
735
+ Returns:
736
+ Trackers as states, labels, and entity data.
737
+ """
738
+ example_states = []
739
+ example_labels = []
740
+ example_entities = []
741
+
742
+ # Store of example hashes for removing duplicate training examples.
743
+ hashed_examples = set()
744
+
745
+ logger.debug(
746
+ f"Creating states and {self.LABEL_NAME} label examples from "
747
+ f"collected trackers "
748
+ f"(by {type(self).__name__}({type(self.state_featurizer).__name__}))..."
749
+ )
750
+ pbar = tqdm(
751
+ trackers,
752
+ desc="Processed trackers",
753
+ disable=rasa.shared.utils.io.is_logging_disabled(),
754
+ )
755
+ for tracker in pbar:
756
+
757
+ for states, label, entities in self._extract_examples(
758
+ tracker,
759
+ domain,
760
+ omit_unset_slots=omit_unset_slots,
761
+ ignore_action_unlikely_intent=ignore_action_unlikely_intent,
762
+ ):
763
+
764
+ if self.remove_duplicates:
765
+ hashed = self._hash_example(states, label)
766
+ if hashed in hashed_examples:
767
+ continue
768
+ hashed_examples.add(hashed)
769
+
770
+ example_states.append(states)
771
+ example_labels.append(label)
772
+ example_entities.append(entities)
773
+
774
+ pbar.set_postfix({f"# {self.LABEL_NAME}": f"{len(example_labels):d}"})
775
+
776
+ self._remove_user_text_if_intent(example_states)
777
+
778
+ logger.debug(f"Created {len(example_states)} {self.LABEL_NAME} examples.")
779
+
780
+ return example_states, example_labels, example_entities
781
+
782
+ def _extract_examples(
783
+ self,
784
+ tracker: DialogueStateTracker,
785
+ domain: Domain,
786
+ omit_unset_slots: bool = False,
787
+ ignore_action_unlikely_intent: bool = False,
788
+ ) -> Iterator[Tuple[List[State], List[Text], List[Dict[Text, Any]]]]:
789
+ """Creates an iterator over training examples from a tracker.
790
+
791
+ Args:
792
+ trackers: The tracker from which to extract training examples.
793
+ domain: The domain of the training data.
794
+ omit_unset_slots: If `True` do not include the initial values of slots.
795
+ ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
796
+ from training states.
797
+
798
+ Returns:
799
+ An iterator over example states, labels, and entity data.
800
+ """
801
+ tracker_states = self._create_states(
802
+ tracker, domain, omit_unset_slots=omit_unset_slots
803
+ )
804
+ events = tracker.applied_events(True)
805
+
806
+ if ignore_action_unlikely_intent:
807
+ tracker_states = self._remove_action_unlikely_intent_from_states(
808
+ tracker_states
809
+ )
810
+ events = self._remove_action_unlikely_intent_from_events(events)
811
+
812
+ label_index = 0
813
+ entity_data = {}
814
+ for event in events:
815
+ if isinstance(event, UserUttered):
816
+ entity_data = self._entity_data(event)
817
+
818
+ elif isinstance(event, ActionExecuted):
819
+
820
+ label_index += 1
821
+
822
+ # use only actions which can be predicted at a stories start
823
+ if event.unpredictable:
824
+ continue
825
+
826
+ sliced_states = self.slice_state_history(
827
+ tracker_states[:label_index], self.max_history
828
+ )
829
+ label = cast(List[Text], [event.action_name or event.action_text])
830
+ entities = [entity_data]
831
+
832
+ yield sliced_states, label, entities
833
+
834
+ # reset entity_data for the the next turn
835
+ entity_data = {}
836
+
837
+ def prediction_states(
838
+ self,
839
+ trackers: List[DialogueStateTracker],
840
+ domain: Domain,
841
+ use_text_for_last_user_input: bool = False,
842
+ ignore_rule_only_turns: bool = False,
843
+ rule_only_data: Optional[Dict[Text, Any]] = None,
844
+ ignore_action_unlikely_intent: bool = False,
845
+ ) -> List[List[State]]:
846
+ """Transforms trackers to states for prediction.
847
+
848
+ Args:
849
+ trackers: The trackers to transform.
850
+ domain: The domain.
851
+ use_text_for_last_user_input: Indicates whether to use text or intent label
852
+ for featurizing last user input.
853
+ ignore_rule_only_turns: If True ignore dialogue turns that are present
854
+ only in rules.
855
+ rule_only_data: Slots and loops,
856
+ which only occur in rules but not in stories.
857
+ ignore_action_unlikely_intent: Whether to remove any states containing
858
+ `action_unlikely_intent` from prediction states.
859
+
860
+ Returns:
861
+ Trackers as states for prediction.
862
+ """
863
+ trackers_as_states = [
864
+ self._create_states(
865
+ tracker,
866
+ domain,
867
+ ignore_rule_only_turns=ignore_rule_only_turns,
868
+ rule_only_data=rule_only_data,
869
+ )
870
+ for tracker in trackers
871
+ ]
872
+
873
+ # Remove `action_unlikely_intent` from `trackers_as_states`.
874
+ # This must be done before state history slicing to ensure the
875
+ # max history of the sliced states matches training time.
876
+ if ignore_action_unlikely_intent:
877
+ trackers_as_states = [
878
+ self._remove_action_unlikely_intent_from_states(states)
879
+ for states in trackers_as_states
880
+ ]
881
+
882
+ trackers_as_states = [
883
+ self.slice_state_history(states, self.max_history)
884
+ for states in trackers_as_states
885
+ ]
886
+ self._choose_last_user_input(trackers_as_states, use_text_for_last_user_input)
887
+
888
+ return trackers_as_states
889
+
890
+
891
+ class IntentMaxHistoryTrackerFeaturizer(MaxHistoryTrackerFeaturizer):
892
+ """Truncates the tracker history into `max_history` long sequences.
893
+
894
+ Creates training data from trackers where intents are the output prediction
895
+ labels. Tracker state sequences which represent policy input are truncated
896
+ to not excede `max_history` states.
897
+ """
898
+
899
+ LABEL_NAME = "intent"
900
+
901
+ @classmethod
902
+ def _convert_labels_to_ids(
903
+ cls, trackers_as_intents: List[List[Text]], domain: Domain
904
+ ) -> np.ndarray:
905
+ """Converts a list of labels to a matrix of label ids.
906
+
907
+ The number of rows is equal to `len(trackers_as_intents)`. The number of
908
+ columns is equal to the maximum number of positive labels that any training
909
+ example is associated with. Rows are padded with `LABEL_PAD_ID` if not all rows
910
+ have the same number of labels.
911
+
912
+ Args:
913
+ trackers_as_intents: Positive example label ids
914
+ associated with each training example.
915
+ domain: The domain of the training data.
916
+
917
+ Returns:
918
+ A matrix of label ids.
919
+ """
920
+ # store labels in numpy arrays so that it corresponds to np arrays
921
+ # of input features
922
+ label_ids = [
923
+ [domain.intents.index(intent) for intent in tracker_intents]
924
+ for tracker_intents in trackers_as_intents
925
+ ]
926
+
927
+ return np.array(cls._pad_label_ids(label_ids))
928
+
929
+ @staticmethod
930
+ def _pad_label_ids(label_ids: List[List[int]]) -> List[List[int]]:
931
+ """Pads label ids so that all are of the same length.
932
+
933
+ Args:
934
+ label_ids: Label ids of varying lengths
935
+
936
+ Returns:
937
+ Label ids padded to be of uniform length.
938
+ """
939
+ # If `label_ids` is an empty list, no padding needs to be added.
940
+ if not label_ids:
941
+ return label_ids
942
+
943
+ # Add `LABEL_PAD_ID` padding to labels array so that
944
+ # each example has equal number of labels
945
+ multiple_labels_count = [len(a) for a in label_ids]
946
+ max_labels_count = max(multiple_labels_count)
947
+ num_padding_needed = [max_labels_count - len(a) for a in label_ids]
948
+
949
+ padded_label_ids = []
950
+ for ids, num_pads in zip(label_ids, num_padding_needed):
951
+ padded_row = list(ids) + [LABEL_PAD_ID] * num_pads
952
+ padded_label_ids.append(padded_row)
953
+ return padded_label_ids
954
+
955
+ def training_states_labels_and_entities(
956
+ self,
957
+ trackers: List[DialogueStateTracker],
958
+ domain: Domain,
959
+ omit_unset_slots: bool = False,
960
+ ignore_action_unlikely_intent: bool = False,
961
+ ) -> Tuple[List[List[State]], List[List[Text]], List[List[Dict[Text, Any]]]]:
962
+ """Transforms trackers to states, intent labels, and entity data.
963
+
964
+ Args:
965
+ trackers: The trackers to transform.
966
+ domain: The domain.
967
+ omit_unset_slots: If `True` do not include the initial values of slots.
968
+ ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
969
+ from training states.
970
+
971
+ Returns:
972
+ Trackers as states, labels, and entity data.
973
+ """
974
+ example_states = []
975
+ example_entities = []
976
+
977
+ # Store of example hashes (of both states and labels) for removing
978
+ # duplicate training examples.
979
+ hashed_examples = set()
980
+ # Mapping of example state hash to set of
981
+ # positive labels associated with the state.
982
+ state_hash_to_label_set: DefaultDict[int, Set[Text]] = defaultdict(set)
983
+
984
+ logger.debug(
985
+ f"Creating states and {self.LABEL_NAME} label examples from "
986
+ f"collected trackers "
987
+ f"(by {type(self).__name__}({type(self.state_featurizer).__name__}))..."
988
+ )
989
+ pbar = tqdm(
990
+ trackers,
991
+ desc="Processed trackers",
992
+ disable=rasa.shared.utils.io.is_logging_disabled(),
993
+ )
994
+ for tracker in pbar:
995
+
996
+ for states, label, entities in self._extract_examples(
997
+ tracker,
998
+ domain,
999
+ omit_unset_slots=omit_unset_slots,
1000
+ ignore_action_unlikely_intent=ignore_action_unlikely_intent,
1001
+ ):
1002
+
1003
+ if self.remove_duplicates:
1004
+ hashed = self._hash_example(states, label)
1005
+ if hashed in hashed_examples:
1006
+ continue
1007
+ hashed_examples.add(hashed)
1008
+
1009
+ # Store all positive labels associated with a training state.
1010
+ state_hash = self._hash_example(states)
1011
+
1012
+ # Only add unique example states unless `remove_duplicates` is `False`.
1013
+ if (
1014
+ not self.remove_duplicates
1015
+ or state_hash not in state_hash_to_label_set
1016
+ ):
1017
+ example_states.append(states)
1018
+ example_entities.append(entities)
1019
+
1020
+ state_hash_to_label_set[state_hash].add(label[0])
1021
+
1022
+ pbar.set_postfix({f"# {self.LABEL_NAME}": f"{len(example_states):d}"})
1023
+
1024
+ # Collect positive labels for each state example.
1025
+ example_labels = [
1026
+ list(state_hash_to_label_set[self._hash_example(state)])
1027
+ for state in example_states
1028
+ ]
1029
+
1030
+ self._remove_user_text_if_intent(example_states)
1031
+
1032
+ logger.debug(f"Created {len(example_states)} {self.LABEL_NAME} examples.")
1033
+
1034
+ return example_states, example_labels, example_entities
1035
+
1036
+ def _extract_examples(
1037
+ self,
1038
+ tracker: DialogueStateTracker,
1039
+ domain: Domain,
1040
+ omit_unset_slots: bool = False,
1041
+ ignore_action_unlikely_intent: bool = False,
1042
+ ) -> Iterator[Tuple[List[State], List[Text], List[Dict[Text, Any]]]]:
1043
+ """Creates an iterator over training examples from a tracker.
1044
+
1045
+ Args:
1046
+ tracker: The tracker from which to extract training examples.
1047
+ domain: The domain of the training data.
1048
+ omit_unset_slots: If `True` do not include the initial values of slots.
1049
+ ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
1050
+ from training states.
1051
+
1052
+ Returns:
1053
+ An iterator over example states, labels, and entity data.
1054
+ """
1055
+ tracker_states = self._create_states(
1056
+ tracker, domain, omit_unset_slots=omit_unset_slots
1057
+ )
1058
+ events = tracker.applied_events(True)
1059
+
1060
+ if ignore_action_unlikely_intent:
1061
+ tracker_states = self._remove_action_unlikely_intent_from_states(
1062
+ tracker_states
1063
+ )
1064
+ events = self._remove_action_unlikely_intent_from_events(events)
1065
+
1066
+ label_index = 0
1067
+ for event in events:
1068
+
1069
+ if isinstance(event, ActionExecuted):
1070
+ label_index += 1
1071
+
1072
+ elif isinstance(event, UserUttered):
1073
+
1074
+ sliced_states = self.slice_state_history(
1075
+ tracker_states[:label_index], self.max_history
1076
+ )
1077
+ label = cast(List[Text], [event.intent_name or event.text])
1078
+ entities: List[Dict[Text, Any]] = [{}]
1079
+
1080
+ yield sliced_states, label, entities
1081
+
1082
+ @staticmethod
1083
+ def _cleanup_last_user_state_with_action_listen(
1084
+ trackers_as_states: List[List[State]],
1085
+ ) -> List[List[State]]:
1086
+ """Removes the last tracker state if the previous action is `action_listen`.
1087
+
1088
+ States with the previous action equal to `action_listen` correspond to states
1089
+ with a new user intent. This information is what `UnexpecTEDIntentPolicy` is
1090
+ trying to predict so it needs to be removed before obtaining a prediction.
1091
+
1092
+ Args:
1093
+ trackers_as_states: Trackers converted to states
1094
+
1095
+ Returns:
1096
+ Filtered states with last `action_listen` removed.
1097
+ """
1098
+ for states in trackers_as_states:
1099
+ if not states:
1100
+ continue
1101
+ last_state = states[-1]
1102
+ if rasa.shared.core.trackers.is_prev_action_listen_in_state(last_state):
1103
+ del states[-1]
1104
+
1105
+ return trackers_as_states
1106
+
1107
+ def prediction_states(
1108
+ self,
1109
+ trackers: List[DialogueStateTracker],
1110
+ domain: Domain,
1111
+ use_text_for_last_user_input: bool = False,
1112
+ ignore_rule_only_turns: bool = False,
1113
+ rule_only_data: Optional[Dict[Text, Any]] = None,
1114
+ ignore_action_unlikely_intent: bool = False,
1115
+ ) -> List[List[State]]:
1116
+ """Transforms trackers to states for prediction.
1117
+
1118
+ Args:
1119
+ trackers: The trackers to transform.
1120
+ domain: The domain.
1121
+ use_text_for_last_user_input: Indicates whether to use text or intent label
1122
+ for featurizing last user input.
1123
+ ignore_rule_only_turns: If True ignore dialogue turns that are present
1124
+ only in rules.
1125
+ rule_only_data: Slots and loops,
1126
+ which only occur in rules but not in stories.
1127
+ ignore_action_unlikely_intent: Whether to remove any states containing
1128
+ `action_unlikely_intent` from prediction states.
1129
+
1130
+ Returns:
1131
+ Trackers as states for prediction.
1132
+ """
1133
+ trackers_as_states = [
1134
+ self._create_states(
1135
+ tracker,
1136
+ domain,
1137
+ ignore_rule_only_turns=ignore_rule_only_turns,
1138
+ rule_only_data=rule_only_data,
1139
+ )
1140
+ for tracker in trackers
1141
+ ]
1142
+
1143
+ # Remove `action_unlikely_intent` from `trackers_as_states`.
1144
+ # This must be done before state history slicing to ensure the
1145
+ # max history of the sliced states matches training time.
1146
+ if ignore_action_unlikely_intent:
1147
+ trackers_as_states = [
1148
+ self._remove_action_unlikely_intent_from_states(states)
1149
+ for states in trackers_as_states
1150
+ ]
1151
+
1152
+ self._choose_last_user_input(trackers_as_states, use_text_for_last_user_input)
1153
+
1154
+ # `tracker_as_states` contain a state with intent = last intent
1155
+ # and previous action = action_listen. This state needs to be
1156
+ # removed as it was not present during training as well because
1157
+ # predicting the last intent is what the policies using this
1158
+ # featurizer do. This is specifically done before state history
1159
+ # is sliced so that the number of past states is same as `max_history`.
1160
+ self._cleanup_last_user_state_with_action_listen(trackers_as_states)
1161
+
1162
+ trackers_as_states = [
1163
+ self.slice_state_history(states, self.max_history)
1164
+ for states in trackers_as_states
1165
+ ]
1166
+
1167
+ return trackers_as_states
1168
+
1169
+
1170
+ def _is_prev_action_unlikely_intent_in_state(state: State) -> bool:
1171
+ prev_action_name = state.get(PREVIOUS_ACTION, {}).get(ACTION_NAME)
1172
+ return prev_action_name == ACTION_UNLIKELY_INTENT_NAME