rasa-pro 3.12.0.dev1__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 (790) hide show
  1. README.md +41 -0
  2. rasa/__init__.py +9 -0
  3. rasa/__main__.py +177 -0
  4. rasa/anonymization/__init__.py +2 -0
  5. rasa/anonymization/anonymisation_rule_yaml_reader.py +91 -0
  6. rasa/anonymization/anonymization_pipeline.py +286 -0
  7. rasa/anonymization/anonymization_rule_executor.py +260 -0
  8. rasa/anonymization/anonymization_rule_orchestrator.py +120 -0
  9. rasa/anonymization/schemas/config.yml +47 -0
  10. rasa/anonymization/utils.py +118 -0
  11. rasa/api.py +160 -0
  12. rasa/cli/__init__.py +5 -0
  13. rasa/cli/arguments/__init__.py +0 -0
  14. rasa/cli/arguments/data.py +106 -0
  15. rasa/cli/arguments/default_arguments.py +207 -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 +219 -0
  20. rasa/cli/arguments/shell.py +17 -0
  21. rasa/cli/arguments/test.py +211 -0
  22. rasa/cli/arguments/train.py +279 -0
  23. rasa/cli/arguments/visualize.py +34 -0
  24. rasa/cli/arguments/x.py +30 -0
  25. rasa/cli/data.py +354 -0
  26. rasa/cli/dialogue_understanding_test.py +251 -0
  27. rasa/cli/e2e_test.py +259 -0
  28. rasa/cli/evaluate.py +222 -0
  29. rasa/cli/export.py +250 -0
  30. rasa/cli/inspect.py +75 -0
  31. rasa/cli/interactive.py +166 -0
  32. rasa/cli/license.py +65 -0
  33. rasa/cli/llm_fine_tuning.py +403 -0
  34. rasa/cli/markers.py +78 -0
  35. rasa/cli/project_templates/__init__.py +0 -0
  36. rasa/cli/project_templates/calm/actions/__init__.py +0 -0
  37. rasa/cli/project_templates/calm/actions/action_template.py +27 -0
  38. rasa/cli/project_templates/calm/actions/add_contact.py +30 -0
  39. rasa/cli/project_templates/calm/actions/db.py +57 -0
  40. rasa/cli/project_templates/calm/actions/list_contacts.py +22 -0
  41. rasa/cli/project_templates/calm/actions/remove_contact.py +35 -0
  42. rasa/cli/project_templates/calm/config.yml +10 -0
  43. rasa/cli/project_templates/calm/credentials.yml +33 -0
  44. rasa/cli/project_templates/calm/data/flows/add_contact.yml +31 -0
  45. rasa/cli/project_templates/calm/data/flows/list_contacts.yml +14 -0
  46. rasa/cli/project_templates/calm/data/flows/remove_contact.yml +29 -0
  47. rasa/cli/project_templates/calm/db/contacts.json +10 -0
  48. rasa/cli/project_templates/calm/domain/add_contact.yml +39 -0
  49. rasa/cli/project_templates/calm/domain/list_contacts.yml +17 -0
  50. rasa/cli/project_templates/calm/domain/remove_contact.yml +38 -0
  51. rasa/cli/project_templates/calm/domain/shared.yml +10 -0
  52. rasa/cli/project_templates/calm/e2e_tests/cancelations/user_cancels_during_a_correction.yml +16 -0
  53. rasa/cli/project_templates/calm/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +7 -0
  54. rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_handle.yml +20 -0
  55. rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_name.yml +19 -0
  56. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +15 -0
  57. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_lists_contacts.yml +5 -0
  58. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact.yml +11 -0
  59. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact_from_list.yml +12 -0
  60. rasa/cli/project_templates/calm/endpoints.yml +58 -0
  61. rasa/cli/project_templates/default/actions/__init__.py +0 -0
  62. rasa/cli/project_templates/default/actions/actions.py +27 -0
  63. rasa/cli/project_templates/default/config.yml +44 -0
  64. rasa/cli/project_templates/default/credentials.yml +33 -0
  65. rasa/cli/project_templates/default/data/nlu.yml +91 -0
  66. rasa/cli/project_templates/default/data/rules.yml +13 -0
  67. rasa/cli/project_templates/default/data/stories.yml +30 -0
  68. rasa/cli/project_templates/default/domain.yml +34 -0
  69. rasa/cli/project_templates/default/endpoints.yml +42 -0
  70. rasa/cli/project_templates/default/tests/test_stories.yml +91 -0
  71. rasa/cli/project_templates/tutorial/actions/__init__.py +0 -0
  72. rasa/cli/project_templates/tutorial/actions/actions.py +22 -0
  73. rasa/cli/project_templates/tutorial/config.yml +12 -0
  74. rasa/cli/project_templates/tutorial/credentials.yml +33 -0
  75. rasa/cli/project_templates/tutorial/data/flows.yml +8 -0
  76. rasa/cli/project_templates/tutorial/data/patterns.yml +11 -0
  77. rasa/cli/project_templates/tutorial/domain.yml +35 -0
  78. rasa/cli/project_templates/tutorial/endpoints.yml +55 -0
  79. rasa/cli/run.py +143 -0
  80. rasa/cli/scaffold.py +273 -0
  81. rasa/cli/shell.py +141 -0
  82. rasa/cli/studio/__init__.py +0 -0
  83. rasa/cli/studio/download.py +62 -0
  84. rasa/cli/studio/studio.py +296 -0
  85. rasa/cli/studio/train.py +59 -0
  86. rasa/cli/studio/upload.py +62 -0
  87. rasa/cli/telemetry.py +102 -0
  88. rasa/cli/test.py +280 -0
  89. rasa/cli/train.py +278 -0
  90. rasa/cli/utils.py +484 -0
  91. rasa/cli/visualize.py +40 -0
  92. rasa/cli/x.py +206 -0
  93. rasa/constants.py +45 -0
  94. rasa/core/__init__.py +17 -0
  95. rasa/core/actions/__init__.py +0 -0
  96. rasa/core/actions/action.py +1318 -0
  97. rasa/core/actions/action_clean_stack.py +59 -0
  98. rasa/core/actions/action_exceptions.py +24 -0
  99. rasa/core/actions/action_hangup.py +29 -0
  100. rasa/core/actions/action_repeat_bot_messages.py +89 -0
  101. rasa/core/actions/action_run_slot_rejections.py +210 -0
  102. rasa/core/actions/action_trigger_chitchat.py +31 -0
  103. rasa/core/actions/action_trigger_flow.py +109 -0
  104. rasa/core/actions/action_trigger_search.py +31 -0
  105. rasa/core/actions/constants.py +5 -0
  106. rasa/core/actions/custom_action_executor.py +191 -0
  107. rasa/core/actions/direct_custom_actions_executor.py +109 -0
  108. rasa/core/actions/e2e_stub_custom_action_executor.py +72 -0
  109. rasa/core/actions/forms.py +741 -0
  110. rasa/core/actions/grpc_custom_action_executor.py +251 -0
  111. rasa/core/actions/http_custom_action_executor.py +145 -0
  112. rasa/core/actions/loops.py +114 -0
  113. rasa/core/actions/two_stage_fallback.py +186 -0
  114. rasa/core/agent.py +559 -0
  115. rasa/core/auth_retry_tracker_store.py +122 -0
  116. rasa/core/brokers/__init__.py +0 -0
  117. rasa/core/brokers/broker.py +126 -0
  118. rasa/core/brokers/file.py +58 -0
  119. rasa/core/brokers/kafka.py +324 -0
  120. rasa/core/brokers/pika.py +388 -0
  121. rasa/core/brokers/sql.py +86 -0
  122. rasa/core/channels/__init__.py +61 -0
  123. rasa/core/channels/botframework.py +338 -0
  124. rasa/core/channels/callback.py +84 -0
  125. rasa/core/channels/channel.py +456 -0
  126. rasa/core/channels/console.py +241 -0
  127. rasa/core/channels/development_inspector.py +197 -0
  128. rasa/core/channels/facebook.py +419 -0
  129. rasa/core/channels/hangouts.py +329 -0
  130. rasa/core/channels/inspector/.eslintrc.cjs +25 -0
  131. rasa/core/channels/inspector/.gitignore +23 -0
  132. rasa/core/channels/inspector/README.md +54 -0
  133. rasa/core/channels/inspector/assets/favicon.ico +0 -0
  134. rasa/core/channels/inspector/assets/rasa-chat.js +2 -0
  135. rasa/core/channels/inspector/custom.d.ts +3 -0
  136. rasa/core/channels/inspector/dist/assets/arc-861ddd57.js +1 -0
  137. rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
  138. rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-921f02db.js +10 -0
  139. rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-b436c4f8.js +2 -0
  140. rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-511a23cb.js +2 -0
  141. rasa/core/channels/inspector/dist/assets/createText-62fc7601-ef476ecd.js +7 -0
  142. rasa/core/channels/inspector/dist/assets/edges-f2ad444c-f1878e0a.js +4 -0
  143. rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-fac75185.js +51 -0
  144. rasa/core/channels/inspector/dist/assets/flowDb-1972c806-201c5bbc.js +6 -0
  145. rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-f904ae41.js +4 -0
  146. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +1 -0
  147. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-1813da66.js +139 -0
  148. rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-872af172.js +266 -0
  149. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-34a0af5a.js +70 -0
  150. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-128cfa44.ttf +0 -0
  151. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-21dbcb97.woff +0 -0
  152. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-222b5e26.svg +329 -0
  153. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-9ad89b2a.woff2 +0 -0
  154. rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-42ba3e3d.js +1 -0
  155. rasa/core/channels/inspector/dist/assets/index-37817b51.js +1317 -0
  156. rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
  157. rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-6b731386.js +7 -0
  158. rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
  159. rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-e8579ac6.js +139 -0
  160. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-60c05ee4.woff +0 -0
  161. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-8335d9b8.svg +438 -0
  162. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-9cc39c75.ttf +0 -0
  163. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-ead13ccf.woff2 +0 -0
  164. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-16705655.woff2 +0 -0
  165. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-5aeb07f9.woff +0 -0
  166. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9c459044.ttf +0 -0
  167. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9e2898a4.svg +435 -0
  168. rasa/core/channels/inspector/dist/assets/layout-89e6403a.js +1 -0
  169. rasa/core/channels/inspector/dist/assets/line-dc73d3fc.js +1 -0
  170. rasa/core/channels/inspector/dist/assets/linear-f5b1d2bc.js +1 -0
  171. rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-82cb74fa.js +109 -0
  172. rasa/core/channels/inspector/dist/assets/ordinal-ba9b4969.js +1 -0
  173. rasa/core/channels/inspector/dist/assets/path-53f90ab3.js +1 -0
  174. rasa/core/channels/inspector/dist/assets/pieDiagram-dbbf0591-bdf5f29b.js +35 -0
  175. rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-c7a0cbe4.js +7 -0
  176. rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-7ec5410f.js +52 -0
  177. rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-caee5554.js +8 -0
  178. rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-2935f8db.js +122 -0
  179. rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-8f5d9693.js +1 -0
  180. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-d565d1de.js +1 -0
  181. rasa/core/channels/inspector/dist/assets/styles-080da4f6-75ad421d.js +110 -0
  182. rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-7e764226.js +159 -0
  183. rasa/core/channels/inspector/dist/assets/styles-9c745c82-7a4e0e61.js +207 -0
  184. rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-4019d1bf.js +1 -0
  185. rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-01ea12df.js +61 -0
  186. rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-89407137.js +7 -0
  187. rasa/core/channels/inspector/dist/index.html +42 -0
  188. rasa/core/channels/inspector/index.html +40 -0
  189. rasa/core/channels/inspector/jest.config.ts +13 -0
  190. rasa/core/channels/inspector/package.json +52 -0
  191. rasa/core/channels/inspector/setupTests.ts +2 -0
  192. rasa/core/channels/inspector/src/App.tsx +220 -0
  193. rasa/core/channels/inspector/src/components/Chat.tsx +95 -0
  194. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +108 -0
  195. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
  196. rasa/core/channels/inspector/src/components/DialogueStack.tsx +136 -0
  197. rasa/core/channels/inspector/src/components/ExpandIcon.tsx +16 -0
  198. rasa/core/channels/inspector/src/components/FullscreenButton.tsx +45 -0
  199. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +22 -0
  200. rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +21 -0
  201. rasa/core/channels/inspector/src/components/RasaLogo.tsx +32 -0
  202. rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +39 -0
  203. rasa/core/channels/inspector/src/components/Slots.tsx +91 -0
  204. rasa/core/channels/inspector/src/components/Welcome.tsx +54 -0
  205. rasa/core/channels/inspector/src/helpers/audiostream.ts +191 -0
  206. rasa/core/channels/inspector/src/helpers/formatters.test.ts +392 -0
  207. rasa/core/channels/inspector/src/helpers/formatters.ts +306 -0
  208. rasa/core/channels/inspector/src/helpers/utils.ts +127 -0
  209. rasa/core/channels/inspector/src/main.tsx +13 -0
  210. rasa/core/channels/inspector/src/theme/Button/Button.ts +29 -0
  211. rasa/core/channels/inspector/src/theme/Heading/Heading.ts +31 -0
  212. rasa/core/channels/inspector/src/theme/Input/Input.ts +27 -0
  213. rasa/core/channels/inspector/src/theme/Link/Link.ts +10 -0
  214. rasa/core/channels/inspector/src/theme/Modal/Modal.ts +47 -0
  215. rasa/core/channels/inspector/src/theme/Table/Table.tsx +38 -0
  216. rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +12 -0
  217. rasa/core/channels/inspector/src/theme/base/breakpoints.ts +8 -0
  218. rasa/core/channels/inspector/src/theme/base/colors.ts +88 -0
  219. rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +29 -0
  220. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.eot +0 -0
  221. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.svg +329 -0
  222. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.ttf +0 -0
  223. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff +0 -0
  224. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff2 +0 -0
  225. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.eot +0 -0
  226. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.svg +438 -0
  227. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.ttf +0 -0
  228. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff +0 -0
  229. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff2 +0 -0
  230. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.eot +0 -0
  231. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.svg +435 -0
  232. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.ttf +0 -0
  233. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff +0 -0
  234. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff2 +0 -0
  235. rasa/core/channels/inspector/src/theme/base/radii.ts +9 -0
  236. rasa/core/channels/inspector/src/theme/base/shadows.ts +7 -0
  237. rasa/core/channels/inspector/src/theme/base/sizes.ts +7 -0
  238. rasa/core/channels/inspector/src/theme/base/space.ts +15 -0
  239. rasa/core/channels/inspector/src/theme/base/styles.ts +13 -0
  240. rasa/core/channels/inspector/src/theme/base/typography.ts +24 -0
  241. rasa/core/channels/inspector/src/theme/base/zIndices.ts +19 -0
  242. rasa/core/channels/inspector/src/theme/index.ts +101 -0
  243. rasa/core/channels/inspector/src/types.ts +84 -0
  244. rasa/core/channels/inspector/src/vite-env.d.ts +1 -0
  245. rasa/core/channels/inspector/tests/__mocks__/fileMock.ts +1 -0
  246. rasa/core/channels/inspector/tests/__mocks__/matchMedia.ts +16 -0
  247. rasa/core/channels/inspector/tests/__mocks__/styleMock.ts +1 -0
  248. rasa/core/channels/inspector/tests/renderWithProviders.tsx +14 -0
  249. rasa/core/channels/inspector/tsconfig.json +26 -0
  250. rasa/core/channels/inspector/tsconfig.node.json +10 -0
  251. rasa/core/channels/inspector/vite.config.ts +8 -0
  252. rasa/core/channels/inspector/yarn.lock +6249 -0
  253. rasa/core/channels/mattermost.py +229 -0
  254. rasa/core/channels/rasa_chat.py +126 -0
  255. rasa/core/channels/rest.py +230 -0
  256. rasa/core/channels/rocketchat.py +174 -0
  257. rasa/core/channels/slack.py +620 -0
  258. rasa/core/channels/socketio.py +302 -0
  259. rasa/core/channels/telegram.py +298 -0
  260. rasa/core/channels/twilio.py +169 -0
  261. rasa/core/channels/vier_cvg.py +374 -0
  262. rasa/core/channels/voice_ready/__init__.py +0 -0
  263. rasa/core/channels/voice_ready/audiocodes.py +501 -0
  264. rasa/core/channels/voice_ready/jambonz.py +121 -0
  265. rasa/core/channels/voice_ready/jambonz_protocol.py +396 -0
  266. rasa/core/channels/voice_ready/twilio_voice.py +403 -0
  267. rasa/core/channels/voice_ready/utils.py +37 -0
  268. rasa/core/channels/voice_stream/__init__.py +0 -0
  269. rasa/core/channels/voice_stream/asr/__init__.py +0 -0
  270. rasa/core/channels/voice_stream/asr/asr_engine.py +89 -0
  271. rasa/core/channels/voice_stream/asr/asr_event.py +18 -0
  272. rasa/core/channels/voice_stream/asr/azure.py +130 -0
  273. rasa/core/channels/voice_stream/asr/deepgram.py +90 -0
  274. rasa/core/channels/voice_stream/audio_bytes.py +8 -0
  275. rasa/core/channels/voice_stream/browser_audio.py +107 -0
  276. rasa/core/channels/voice_stream/call_state.py +23 -0
  277. rasa/core/channels/voice_stream/tts/__init__.py +0 -0
  278. rasa/core/channels/voice_stream/tts/azure.py +106 -0
  279. rasa/core/channels/voice_stream/tts/cartesia.py +118 -0
  280. rasa/core/channels/voice_stream/tts/tts_cache.py +27 -0
  281. rasa/core/channels/voice_stream/tts/tts_engine.py +58 -0
  282. rasa/core/channels/voice_stream/twilio_media_streams.py +173 -0
  283. rasa/core/channels/voice_stream/util.py +57 -0
  284. rasa/core/channels/voice_stream/voice_channel.py +427 -0
  285. rasa/core/channels/webexteams.py +134 -0
  286. rasa/core/concurrent_lock_store.py +210 -0
  287. rasa/core/constants.py +112 -0
  288. rasa/core/evaluation/__init__.py +0 -0
  289. rasa/core/evaluation/marker.py +267 -0
  290. rasa/core/evaluation/marker_base.py +923 -0
  291. rasa/core/evaluation/marker_stats.py +293 -0
  292. rasa/core/evaluation/marker_tracker_loader.py +103 -0
  293. rasa/core/exceptions.py +29 -0
  294. rasa/core/exporter.py +284 -0
  295. rasa/core/featurizers/__init__.py +0 -0
  296. rasa/core/featurizers/precomputation.py +410 -0
  297. rasa/core/featurizers/single_state_featurizer.py +421 -0
  298. rasa/core/featurizers/tracker_featurizers.py +1262 -0
  299. rasa/core/http_interpreter.py +89 -0
  300. rasa/core/information_retrieval/__init__.py +7 -0
  301. rasa/core/information_retrieval/faiss.py +124 -0
  302. rasa/core/information_retrieval/information_retrieval.py +137 -0
  303. rasa/core/information_retrieval/milvus.py +59 -0
  304. rasa/core/information_retrieval/qdrant.py +96 -0
  305. rasa/core/jobs.py +63 -0
  306. rasa/core/lock.py +139 -0
  307. rasa/core/lock_store.py +343 -0
  308. rasa/core/migrate.py +403 -0
  309. rasa/core/nlg/__init__.py +3 -0
  310. rasa/core/nlg/callback.py +146 -0
  311. rasa/core/nlg/contextual_response_rephraser.py +320 -0
  312. rasa/core/nlg/generator.py +230 -0
  313. rasa/core/nlg/interpolator.py +143 -0
  314. rasa/core/nlg/response.py +155 -0
  315. rasa/core/nlg/summarize.py +70 -0
  316. rasa/core/persistor.py +538 -0
  317. rasa/core/policies/__init__.py +0 -0
  318. rasa/core/policies/ensemble.py +329 -0
  319. rasa/core/policies/enterprise_search_policy.py +905 -0
  320. rasa/core/policies/enterprise_search_prompt_template.jinja2 +25 -0
  321. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +60 -0
  322. rasa/core/policies/flow_policy.py +205 -0
  323. rasa/core/policies/flows/__init__.py +0 -0
  324. rasa/core/policies/flows/flow_exceptions.py +44 -0
  325. rasa/core/policies/flows/flow_executor.py +754 -0
  326. rasa/core/policies/flows/flow_step_result.py +43 -0
  327. rasa/core/policies/intentless_policy.py +1031 -0
  328. rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
  329. rasa/core/policies/memoization.py +538 -0
  330. rasa/core/policies/policy.py +725 -0
  331. rasa/core/policies/rule_policy.py +1273 -0
  332. rasa/core/policies/ted_policy.py +2169 -0
  333. rasa/core/policies/unexpected_intent_policy.py +1022 -0
  334. rasa/core/processor.py +1465 -0
  335. rasa/core/run.py +342 -0
  336. rasa/core/secrets_manager/__init__.py +0 -0
  337. rasa/core/secrets_manager/constants.py +36 -0
  338. rasa/core/secrets_manager/endpoints.py +391 -0
  339. rasa/core/secrets_manager/factory.py +241 -0
  340. rasa/core/secrets_manager/secret_manager.py +262 -0
  341. rasa/core/secrets_manager/vault.py +584 -0
  342. rasa/core/test.py +1335 -0
  343. rasa/core/tracker_store.py +1703 -0
  344. rasa/core/train.py +105 -0
  345. rasa/core/training/__init__.py +89 -0
  346. rasa/core/training/converters/__init__.py +0 -0
  347. rasa/core/training/converters/responses_prefix_converter.py +119 -0
  348. rasa/core/training/interactive.py +1744 -0
  349. rasa/core/training/story_conflict.py +381 -0
  350. rasa/core/training/training.py +93 -0
  351. rasa/core/utils.py +366 -0
  352. rasa/core/visualize.py +70 -0
  353. rasa/dialogue_understanding/__init__.py +0 -0
  354. rasa/dialogue_understanding/coexistence/__init__.py +0 -0
  355. rasa/dialogue_understanding/coexistence/constants.py +4 -0
  356. rasa/dialogue_understanding/coexistence/intent_based_router.py +196 -0
  357. rasa/dialogue_understanding/coexistence/llm_based_router.py +327 -0
  358. rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
  359. rasa/dialogue_understanding/commands/__init__.py +61 -0
  360. rasa/dialogue_understanding/commands/can_not_handle_command.py +70 -0
  361. rasa/dialogue_understanding/commands/cancel_flow_command.py +125 -0
  362. rasa/dialogue_understanding/commands/change_flow_command.py +44 -0
  363. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +57 -0
  364. rasa/dialogue_understanding/commands/clarify_command.py +86 -0
  365. rasa/dialogue_understanding/commands/command.py +85 -0
  366. rasa/dialogue_understanding/commands/correct_slots_command.py +297 -0
  367. rasa/dialogue_understanding/commands/error_command.py +79 -0
  368. rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
  369. rasa/dialogue_understanding/commands/handle_code_change_command.py +73 -0
  370. rasa/dialogue_understanding/commands/human_handoff_command.py +66 -0
  371. rasa/dialogue_understanding/commands/knowledge_answer_command.py +57 -0
  372. rasa/dialogue_understanding/commands/noop_command.py +54 -0
  373. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +60 -0
  374. rasa/dialogue_understanding/commands/restart_command.py +58 -0
  375. rasa/dialogue_understanding/commands/session_end_command.py +61 -0
  376. rasa/dialogue_understanding/commands/session_start_command.py +59 -0
  377. rasa/dialogue_understanding/commands/set_slot_command.py +160 -0
  378. rasa/dialogue_understanding/commands/skip_question_command.py +75 -0
  379. rasa/dialogue_understanding/commands/start_flow_command.py +107 -0
  380. rasa/dialogue_understanding/commands/user_silence_command.py +59 -0
  381. rasa/dialogue_understanding/commands/utils.py +45 -0
  382. rasa/dialogue_understanding/generator/__init__.py +21 -0
  383. rasa/dialogue_understanding/generator/command_generator.py +464 -0
  384. rasa/dialogue_understanding/generator/constants.py +27 -0
  385. rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
  386. rasa/dialogue_understanding/generator/flow_retrieval.py +466 -0
  387. rasa/dialogue_understanding/generator/llm_based_command_generator.py +500 -0
  388. rasa/dialogue_understanding/generator/llm_command_generator.py +67 -0
  389. rasa/dialogue_understanding/generator/multi_step/__init__.py +0 -0
  390. rasa/dialogue_understanding/generator/multi_step/fill_slots_prompt.jinja2 +62 -0
  391. rasa/dialogue_understanding/generator/multi_step/handle_flows_prompt.jinja2 +38 -0
  392. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +920 -0
  393. rasa/dialogue_understanding/generator/nlu_command_adapter.py +261 -0
  394. rasa/dialogue_understanding/generator/single_step/__init__.py +0 -0
  395. rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2 +60 -0
  396. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +486 -0
  397. rasa/dialogue_understanding/patterns/__init__.py +0 -0
  398. rasa/dialogue_understanding/patterns/cancel.py +111 -0
  399. rasa/dialogue_understanding/patterns/cannot_handle.py +43 -0
  400. rasa/dialogue_understanding/patterns/chitchat.py +37 -0
  401. rasa/dialogue_understanding/patterns/clarify.py +97 -0
  402. rasa/dialogue_understanding/patterns/code_change.py +41 -0
  403. rasa/dialogue_understanding/patterns/collect_information.py +90 -0
  404. rasa/dialogue_understanding/patterns/completed.py +40 -0
  405. rasa/dialogue_understanding/patterns/continue_interrupted.py +42 -0
  406. rasa/dialogue_understanding/patterns/correction.py +278 -0
  407. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +301 -0
  408. rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
  409. rasa/dialogue_understanding/patterns/internal_error.py +47 -0
  410. rasa/dialogue_understanding/patterns/repeat.py +37 -0
  411. rasa/dialogue_understanding/patterns/restart.py +37 -0
  412. rasa/dialogue_understanding/patterns/search.py +37 -0
  413. rasa/dialogue_understanding/patterns/session_start.py +37 -0
  414. rasa/dialogue_understanding/patterns/skip_question.py +38 -0
  415. rasa/dialogue_understanding/patterns/user_silence.py +37 -0
  416. rasa/dialogue_understanding/processor/__init__.py +0 -0
  417. rasa/dialogue_understanding/processor/command_processor.py +720 -0
  418. rasa/dialogue_understanding/processor/command_processor_component.py +43 -0
  419. rasa/dialogue_understanding/stack/__init__.py +0 -0
  420. rasa/dialogue_understanding/stack/dialogue_stack.py +178 -0
  421. rasa/dialogue_understanding/stack/frames/__init__.py +19 -0
  422. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +27 -0
  423. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +137 -0
  424. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +157 -0
  425. rasa/dialogue_understanding/stack/frames/pattern_frame.py +10 -0
  426. rasa/dialogue_understanding/stack/frames/search_frame.py +27 -0
  427. rasa/dialogue_understanding/stack/utils.py +211 -0
  428. rasa/dialogue_understanding/utils.py +14 -0
  429. rasa/dialogue_understanding_test/__init__.py +0 -0
  430. rasa/dialogue_understanding_test/command_metric_calculation.py +12 -0
  431. rasa/dialogue_understanding_test/constants.py +17 -0
  432. rasa/dialogue_understanding_test/du_test_case.py +118 -0
  433. rasa/dialogue_understanding_test/du_test_result.py +11 -0
  434. rasa/dialogue_understanding_test/du_test_runner.py +93 -0
  435. rasa/dialogue_understanding_test/io.py +54 -0
  436. rasa/dialogue_understanding_test/validation.py +22 -0
  437. rasa/e2e_test/__init__.py +0 -0
  438. rasa/e2e_test/aggregate_test_stats_calculator.py +134 -0
  439. rasa/e2e_test/assertions.py +1345 -0
  440. rasa/e2e_test/assertions_schema.yml +129 -0
  441. rasa/e2e_test/constants.py +31 -0
  442. rasa/e2e_test/e2e_config.py +220 -0
  443. rasa/e2e_test/e2e_config_schema.yml +26 -0
  444. rasa/e2e_test/e2e_test_case.py +569 -0
  445. rasa/e2e_test/e2e_test_converter.py +363 -0
  446. rasa/e2e_test/e2e_test_converter_prompt.jinja2 +70 -0
  447. rasa/e2e_test/e2e_test_coverage_report.py +364 -0
  448. rasa/e2e_test/e2e_test_result.py +54 -0
  449. rasa/e2e_test/e2e_test_runner.py +1192 -0
  450. rasa/e2e_test/e2e_test_schema.yml +181 -0
  451. rasa/e2e_test/pykwalify_extensions.py +39 -0
  452. rasa/e2e_test/stub_custom_action.py +70 -0
  453. rasa/e2e_test/utils/__init__.py +0 -0
  454. rasa/e2e_test/utils/e2e_yaml_utils.py +55 -0
  455. rasa/e2e_test/utils/io.py +598 -0
  456. rasa/e2e_test/utils/validation.py +178 -0
  457. rasa/engine/__init__.py +0 -0
  458. rasa/engine/caching.py +463 -0
  459. rasa/engine/constants.py +17 -0
  460. rasa/engine/exceptions.py +14 -0
  461. rasa/engine/graph.py +642 -0
  462. rasa/engine/loader.py +48 -0
  463. rasa/engine/recipes/__init__.py +0 -0
  464. rasa/engine/recipes/config_files/default_config.yml +41 -0
  465. rasa/engine/recipes/default_components.py +97 -0
  466. rasa/engine/recipes/default_recipe.py +1272 -0
  467. rasa/engine/recipes/graph_recipe.py +79 -0
  468. rasa/engine/recipes/recipe.py +93 -0
  469. rasa/engine/runner/__init__.py +0 -0
  470. rasa/engine/runner/dask.py +250 -0
  471. rasa/engine/runner/interface.py +49 -0
  472. rasa/engine/storage/__init__.py +0 -0
  473. rasa/engine/storage/local_model_storage.py +244 -0
  474. rasa/engine/storage/resource.py +110 -0
  475. rasa/engine/storage/storage.py +199 -0
  476. rasa/engine/training/__init__.py +0 -0
  477. rasa/engine/training/components.py +176 -0
  478. rasa/engine/training/fingerprinting.py +64 -0
  479. rasa/engine/training/graph_trainer.py +256 -0
  480. rasa/engine/training/hooks.py +164 -0
  481. rasa/engine/validation.py +1451 -0
  482. rasa/env.py +14 -0
  483. rasa/exceptions.py +69 -0
  484. rasa/graph_components/__init__.py +0 -0
  485. rasa/graph_components/converters/__init__.py +0 -0
  486. rasa/graph_components/converters/nlu_message_converter.py +48 -0
  487. rasa/graph_components/providers/__init__.py +0 -0
  488. rasa/graph_components/providers/domain_for_core_training_provider.py +87 -0
  489. rasa/graph_components/providers/domain_provider.py +71 -0
  490. rasa/graph_components/providers/flows_provider.py +74 -0
  491. rasa/graph_components/providers/forms_provider.py +44 -0
  492. rasa/graph_components/providers/nlu_training_data_provider.py +56 -0
  493. rasa/graph_components/providers/responses_provider.py +44 -0
  494. rasa/graph_components/providers/rule_only_provider.py +49 -0
  495. rasa/graph_components/providers/story_graph_provider.py +96 -0
  496. rasa/graph_components/providers/training_tracker_provider.py +55 -0
  497. rasa/graph_components/validators/__init__.py +0 -0
  498. rasa/graph_components/validators/default_recipe_validator.py +550 -0
  499. rasa/graph_components/validators/finetuning_validator.py +302 -0
  500. rasa/hooks.py +111 -0
  501. rasa/jupyter.py +63 -0
  502. rasa/llm_fine_tuning/__init__.py +0 -0
  503. rasa/llm_fine_tuning/annotation_module.py +241 -0
  504. rasa/llm_fine_tuning/conversations.py +144 -0
  505. rasa/llm_fine_tuning/llm_data_preparation_module.py +178 -0
  506. rasa/llm_fine_tuning/paraphrasing/__init__.py +0 -0
  507. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +281 -0
  508. rasa/llm_fine_tuning/paraphrasing/default_rephrase_prompt_template.jina2 +44 -0
  509. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +121 -0
  510. rasa/llm_fine_tuning/paraphrasing/rephrased_user_message.py +10 -0
  511. rasa/llm_fine_tuning/paraphrasing_module.py +128 -0
  512. rasa/llm_fine_tuning/storage.py +174 -0
  513. rasa/llm_fine_tuning/train_test_split_module.py +441 -0
  514. rasa/markers/__init__.py +0 -0
  515. rasa/markers/marker.py +269 -0
  516. rasa/markers/marker_base.py +828 -0
  517. rasa/markers/upload.py +74 -0
  518. rasa/markers/validate.py +21 -0
  519. rasa/model.py +118 -0
  520. rasa/model_manager/__init__.py +0 -0
  521. rasa/model_manager/config.py +40 -0
  522. rasa/model_manager/model_api.py +559 -0
  523. rasa/model_manager/runner_service.py +286 -0
  524. rasa/model_manager/socket_bridge.py +146 -0
  525. rasa/model_manager/studio_jwt_auth.py +86 -0
  526. rasa/model_manager/trainer_service.py +325 -0
  527. rasa/model_manager/utils.py +87 -0
  528. rasa/model_manager/warm_rasa_process.py +187 -0
  529. rasa/model_service.py +112 -0
  530. rasa/model_testing.py +457 -0
  531. rasa/model_training.py +596 -0
  532. rasa/nlu/__init__.py +7 -0
  533. rasa/nlu/classifiers/__init__.py +3 -0
  534. rasa/nlu/classifiers/classifier.py +5 -0
  535. rasa/nlu/classifiers/diet_classifier.py +1881 -0
  536. rasa/nlu/classifiers/fallback_classifier.py +192 -0
  537. rasa/nlu/classifiers/keyword_intent_classifier.py +188 -0
  538. rasa/nlu/classifiers/logistic_regression_classifier.py +253 -0
  539. rasa/nlu/classifiers/mitie_intent_classifier.py +156 -0
  540. rasa/nlu/classifiers/regex_message_handler.py +56 -0
  541. rasa/nlu/classifiers/sklearn_intent_classifier.py +330 -0
  542. rasa/nlu/constants.py +77 -0
  543. rasa/nlu/convert.py +40 -0
  544. rasa/nlu/emulators/__init__.py +0 -0
  545. rasa/nlu/emulators/dialogflow.py +55 -0
  546. rasa/nlu/emulators/emulator.py +49 -0
  547. rasa/nlu/emulators/luis.py +86 -0
  548. rasa/nlu/emulators/no_emulator.py +10 -0
  549. rasa/nlu/emulators/wit.py +56 -0
  550. rasa/nlu/extractors/__init__.py +0 -0
  551. rasa/nlu/extractors/crf_entity_extractor.py +715 -0
  552. rasa/nlu/extractors/duckling_entity_extractor.py +206 -0
  553. rasa/nlu/extractors/entity_synonyms.py +178 -0
  554. rasa/nlu/extractors/extractor.py +470 -0
  555. rasa/nlu/extractors/mitie_entity_extractor.py +293 -0
  556. rasa/nlu/extractors/regex_entity_extractor.py +220 -0
  557. rasa/nlu/extractors/spacy_entity_extractor.py +95 -0
  558. rasa/nlu/featurizers/__init__.py +0 -0
  559. rasa/nlu/featurizers/dense_featurizer/__init__.py +0 -0
  560. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +445 -0
  561. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
  562. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +768 -0
  563. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +170 -0
  564. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +132 -0
  565. rasa/nlu/featurizers/featurizer.py +89 -0
  566. rasa/nlu/featurizers/sparse_featurizer/__init__.py +0 -0
  567. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +867 -0
  568. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +571 -0
  569. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +271 -0
  570. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
  571. rasa/nlu/model.py +24 -0
  572. rasa/nlu/run.py +27 -0
  573. rasa/nlu/selectors/__init__.py +0 -0
  574. rasa/nlu/selectors/response_selector.py +987 -0
  575. rasa/nlu/test.py +1940 -0
  576. rasa/nlu/tokenizers/__init__.py +0 -0
  577. rasa/nlu/tokenizers/jieba_tokenizer.py +148 -0
  578. rasa/nlu/tokenizers/mitie_tokenizer.py +75 -0
  579. rasa/nlu/tokenizers/spacy_tokenizer.py +72 -0
  580. rasa/nlu/tokenizers/tokenizer.py +239 -0
  581. rasa/nlu/tokenizers/whitespace_tokenizer.py +95 -0
  582. rasa/nlu/utils/__init__.py +35 -0
  583. rasa/nlu/utils/bilou_utils.py +462 -0
  584. rasa/nlu/utils/hugging_face/__init__.py +0 -0
  585. rasa/nlu/utils/hugging_face/registry.py +108 -0
  586. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +311 -0
  587. rasa/nlu/utils/mitie_utils.py +113 -0
  588. rasa/nlu/utils/pattern_utils.py +168 -0
  589. rasa/nlu/utils/spacy_utils.py +310 -0
  590. rasa/plugin.py +90 -0
  591. rasa/server.py +1588 -0
  592. rasa/shared/__init__.py +0 -0
  593. rasa/shared/constants.py +311 -0
  594. rasa/shared/core/__init__.py +0 -0
  595. rasa/shared/core/command_payload_reader.py +109 -0
  596. rasa/shared/core/constants.py +180 -0
  597. rasa/shared/core/conversation.py +46 -0
  598. rasa/shared/core/domain.py +2172 -0
  599. rasa/shared/core/events.py +2559 -0
  600. rasa/shared/core/flows/__init__.py +7 -0
  601. rasa/shared/core/flows/flow.py +562 -0
  602. rasa/shared/core/flows/flow_path.py +84 -0
  603. rasa/shared/core/flows/flow_step.py +146 -0
  604. rasa/shared/core/flows/flow_step_links.py +319 -0
  605. rasa/shared/core/flows/flow_step_sequence.py +70 -0
  606. rasa/shared/core/flows/flows_list.py +258 -0
  607. rasa/shared/core/flows/flows_yaml_schema.json +303 -0
  608. rasa/shared/core/flows/nlu_trigger.py +117 -0
  609. rasa/shared/core/flows/steps/__init__.py +24 -0
  610. rasa/shared/core/flows/steps/action.py +56 -0
  611. rasa/shared/core/flows/steps/call.py +64 -0
  612. rasa/shared/core/flows/steps/collect.py +112 -0
  613. rasa/shared/core/flows/steps/constants.py +5 -0
  614. rasa/shared/core/flows/steps/continuation.py +36 -0
  615. rasa/shared/core/flows/steps/end.py +22 -0
  616. rasa/shared/core/flows/steps/internal.py +44 -0
  617. rasa/shared/core/flows/steps/link.py +51 -0
  618. rasa/shared/core/flows/steps/no_operation.py +48 -0
  619. rasa/shared/core/flows/steps/set_slots.py +50 -0
  620. rasa/shared/core/flows/steps/start.py +30 -0
  621. rasa/shared/core/flows/utils.py +39 -0
  622. rasa/shared/core/flows/validation.py +735 -0
  623. rasa/shared/core/flows/yaml_flows_io.py +405 -0
  624. rasa/shared/core/generator.py +908 -0
  625. rasa/shared/core/slot_mappings.py +526 -0
  626. rasa/shared/core/slots.py +654 -0
  627. rasa/shared/core/trackers.py +1183 -0
  628. rasa/shared/core/training_data/__init__.py +0 -0
  629. rasa/shared/core/training_data/loading.py +89 -0
  630. rasa/shared/core/training_data/story_reader/__init__.py +0 -0
  631. rasa/shared/core/training_data/story_reader/story_reader.py +129 -0
  632. rasa/shared/core/training_data/story_reader/story_step_builder.py +168 -0
  633. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +888 -0
  634. rasa/shared/core/training_data/story_writer/__init__.py +0 -0
  635. rasa/shared/core/training_data/story_writer/story_writer.py +76 -0
  636. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +444 -0
  637. rasa/shared/core/training_data/structures.py +858 -0
  638. rasa/shared/core/training_data/visualization.html +146 -0
  639. rasa/shared/core/training_data/visualization.py +603 -0
  640. rasa/shared/data.py +249 -0
  641. rasa/shared/engine/__init__.py +0 -0
  642. rasa/shared/engine/caching.py +26 -0
  643. rasa/shared/exceptions.py +167 -0
  644. rasa/shared/importers/__init__.py +0 -0
  645. rasa/shared/importers/importer.py +770 -0
  646. rasa/shared/importers/multi_project.py +215 -0
  647. rasa/shared/importers/rasa.py +108 -0
  648. rasa/shared/importers/remote_importer.py +196 -0
  649. rasa/shared/importers/utils.py +36 -0
  650. rasa/shared/nlu/__init__.py +0 -0
  651. rasa/shared/nlu/constants.py +53 -0
  652. rasa/shared/nlu/interpreter.py +10 -0
  653. rasa/shared/nlu/training_data/__init__.py +0 -0
  654. rasa/shared/nlu/training_data/entities_parser.py +208 -0
  655. rasa/shared/nlu/training_data/features.py +492 -0
  656. rasa/shared/nlu/training_data/formats/__init__.py +10 -0
  657. rasa/shared/nlu/training_data/formats/dialogflow.py +163 -0
  658. rasa/shared/nlu/training_data/formats/luis.py +87 -0
  659. rasa/shared/nlu/training_data/formats/rasa.py +135 -0
  660. rasa/shared/nlu/training_data/formats/rasa_yaml.py +618 -0
  661. rasa/shared/nlu/training_data/formats/readerwriter.py +244 -0
  662. rasa/shared/nlu/training_data/formats/wit.py +52 -0
  663. rasa/shared/nlu/training_data/loading.py +137 -0
  664. rasa/shared/nlu/training_data/lookup_tables_parser.py +30 -0
  665. rasa/shared/nlu/training_data/message.py +490 -0
  666. rasa/shared/nlu/training_data/schemas/__init__.py +0 -0
  667. rasa/shared/nlu/training_data/schemas/data_schema.py +85 -0
  668. rasa/shared/nlu/training_data/schemas/nlu.yml +53 -0
  669. rasa/shared/nlu/training_data/schemas/responses.yml +70 -0
  670. rasa/shared/nlu/training_data/synonyms_parser.py +42 -0
  671. rasa/shared/nlu/training_data/training_data.py +729 -0
  672. rasa/shared/nlu/training_data/util.py +223 -0
  673. rasa/shared/providers/__init__.py +0 -0
  674. rasa/shared/providers/_configs/__init__.py +0 -0
  675. rasa/shared/providers/_configs/azure_openai_client_config.py +677 -0
  676. rasa/shared/providers/_configs/client_config.py +59 -0
  677. rasa/shared/providers/_configs/default_litellm_client_config.py +132 -0
  678. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +236 -0
  679. rasa/shared/providers/_configs/litellm_router_client_config.py +222 -0
  680. rasa/shared/providers/_configs/model_group_config.py +173 -0
  681. rasa/shared/providers/_configs/openai_client_config.py +177 -0
  682. rasa/shared/providers/_configs/rasa_llm_client_config.py +75 -0
  683. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +178 -0
  684. rasa/shared/providers/_configs/utils.py +117 -0
  685. rasa/shared/providers/_ssl_verification_utils.py +124 -0
  686. rasa/shared/providers/_utils.py +79 -0
  687. rasa/shared/providers/constants.py +7 -0
  688. rasa/shared/providers/embedding/__init__.py +0 -0
  689. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +243 -0
  690. rasa/shared/providers/embedding/_langchain_embedding_client_adapter.py +74 -0
  691. rasa/shared/providers/embedding/azure_openai_embedding_client.py +335 -0
  692. rasa/shared/providers/embedding/default_litellm_embedding_client.py +126 -0
  693. rasa/shared/providers/embedding/embedding_client.py +90 -0
  694. rasa/shared/providers/embedding/embedding_response.py +41 -0
  695. rasa/shared/providers/embedding/huggingface_local_embedding_client.py +191 -0
  696. rasa/shared/providers/embedding/litellm_router_embedding_client.py +138 -0
  697. rasa/shared/providers/embedding/openai_embedding_client.py +172 -0
  698. rasa/shared/providers/llm/__init__.py +0 -0
  699. rasa/shared/providers/llm/_base_litellm_client.py +265 -0
  700. rasa/shared/providers/llm/azure_openai_llm_client.py +415 -0
  701. rasa/shared/providers/llm/default_litellm_llm_client.py +110 -0
  702. rasa/shared/providers/llm/litellm_router_llm_client.py +202 -0
  703. rasa/shared/providers/llm/llm_client.py +78 -0
  704. rasa/shared/providers/llm/llm_response.py +50 -0
  705. rasa/shared/providers/llm/openai_llm_client.py +161 -0
  706. rasa/shared/providers/llm/rasa_llm_client.py +120 -0
  707. rasa/shared/providers/llm/self_hosted_llm_client.py +276 -0
  708. rasa/shared/providers/mappings.py +94 -0
  709. rasa/shared/providers/router/__init__.py +0 -0
  710. rasa/shared/providers/router/_base_litellm_router_client.py +185 -0
  711. rasa/shared/providers/router/router_client.py +75 -0
  712. rasa/shared/utils/__init__.py +0 -0
  713. rasa/shared/utils/cli.py +102 -0
  714. rasa/shared/utils/common.py +324 -0
  715. rasa/shared/utils/constants.py +4 -0
  716. rasa/shared/utils/health_check/__init__.py +0 -0
  717. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +31 -0
  718. rasa/shared/utils/health_check/health_check.py +258 -0
  719. rasa/shared/utils/health_check/llm_health_check_mixin.py +31 -0
  720. rasa/shared/utils/io.py +499 -0
  721. rasa/shared/utils/llm.py +764 -0
  722. rasa/shared/utils/pykwalify_extensions.py +27 -0
  723. rasa/shared/utils/schemas/__init__.py +0 -0
  724. rasa/shared/utils/schemas/config.yml +2 -0
  725. rasa/shared/utils/schemas/domain.yml +145 -0
  726. rasa/shared/utils/schemas/events.py +214 -0
  727. rasa/shared/utils/schemas/model_config.yml +36 -0
  728. rasa/shared/utils/schemas/stories.yml +173 -0
  729. rasa/shared/utils/yaml.py +1068 -0
  730. rasa/studio/__init__.py +0 -0
  731. rasa/studio/auth.py +270 -0
  732. rasa/studio/config.py +136 -0
  733. rasa/studio/constants.py +19 -0
  734. rasa/studio/data_handler.py +368 -0
  735. rasa/studio/download.py +489 -0
  736. rasa/studio/results_logger.py +137 -0
  737. rasa/studio/train.py +134 -0
  738. rasa/studio/upload.py +563 -0
  739. rasa/telemetry.py +1876 -0
  740. rasa/tracing/__init__.py +0 -0
  741. rasa/tracing/config.py +355 -0
  742. rasa/tracing/constants.py +62 -0
  743. rasa/tracing/instrumentation/__init__.py +0 -0
  744. rasa/tracing/instrumentation/attribute_extractors.py +765 -0
  745. rasa/tracing/instrumentation/instrumentation.py +1306 -0
  746. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +144 -0
  747. rasa/tracing/instrumentation/metrics.py +294 -0
  748. rasa/tracing/metric_instrument_provider.py +205 -0
  749. rasa/utils/__init__.py +0 -0
  750. rasa/utils/beta.py +83 -0
  751. rasa/utils/cli.py +28 -0
  752. rasa/utils/common.py +639 -0
  753. rasa/utils/converter.py +53 -0
  754. rasa/utils/endpoints.py +331 -0
  755. rasa/utils/io.py +252 -0
  756. rasa/utils/json_utils.py +60 -0
  757. rasa/utils/licensing.py +542 -0
  758. rasa/utils/log_utils.py +181 -0
  759. rasa/utils/mapper.py +210 -0
  760. rasa/utils/ml_utils.py +147 -0
  761. rasa/utils/plotting.py +362 -0
  762. rasa/utils/sanic_error_handler.py +32 -0
  763. rasa/utils/singleton.py +23 -0
  764. rasa/utils/tensorflow/__init__.py +0 -0
  765. rasa/utils/tensorflow/callback.py +112 -0
  766. rasa/utils/tensorflow/constants.py +116 -0
  767. rasa/utils/tensorflow/crf.py +492 -0
  768. rasa/utils/tensorflow/data_generator.py +440 -0
  769. rasa/utils/tensorflow/environment.py +161 -0
  770. rasa/utils/tensorflow/exceptions.py +5 -0
  771. rasa/utils/tensorflow/feature_array.py +366 -0
  772. rasa/utils/tensorflow/layers.py +1565 -0
  773. rasa/utils/tensorflow/layers_utils.py +113 -0
  774. rasa/utils/tensorflow/metrics.py +281 -0
  775. rasa/utils/tensorflow/model_data.py +798 -0
  776. rasa/utils/tensorflow/model_data_utils.py +499 -0
  777. rasa/utils/tensorflow/models.py +935 -0
  778. rasa/utils/tensorflow/rasa_layers.py +1094 -0
  779. rasa/utils/tensorflow/transformer.py +640 -0
  780. rasa/utils/tensorflow/types.py +6 -0
  781. rasa/utils/train_utils.py +572 -0
  782. rasa/utils/url_tools.py +53 -0
  783. rasa/utils/yaml.py +54 -0
  784. rasa/validator.py +1644 -0
  785. rasa/version.py +3 -0
  786. rasa_pro-3.12.0.dev1.dist-info/METADATA +199 -0
  787. rasa_pro-3.12.0.dev1.dist-info/NOTICE +5 -0
  788. rasa_pro-3.12.0.dev1.dist-info/RECORD +790 -0
  789. rasa_pro-3.12.0.dev1.dist-info/WHEEL +4 -0
  790. rasa_pro-3.12.0.dev1.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,1262 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ from abc import abstractmethod
5
+ from collections import defaultdict
6
+ from pathlib import Path
7
+ from typing import (
8
+ Tuple,
9
+ List,
10
+ Optional,
11
+ Dict,
12
+ Text,
13
+ Union,
14
+ Any,
15
+ Iterator,
16
+ Set,
17
+ DefaultDict,
18
+ cast,
19
+ Type,
20
+ Callable,
21
+ ClassVar,
22
+ )
23
+
24
+ import numpy as np
25
+ from tqdm import tqdm
26
+
27
+ import rasa.shared.core.trackers
28
+ import rasa.shared.utils.io
29
+ from rasa.core.exceptions import InvalidTrackerFeaturizerUsageError
30
+ from rasa.core.featurizers.precomputation import MessageContainerForCoreFeaturization
31
+ from rasa.core.featurizers.single_state_featurizer import SingleStateFeaturizer
32
+ from rasa.shared.core.constants import (
33
+ USER,
34
+ ACTION_UNLIKELY_INTENT_NAME,
35
+ PREVIOUS_ACTION,
36
+ )
37
+ from rasa.shared.core.domain import State, Domain
38
+ from rasa.shared.core.events import Event, ActionExecuted, UserUttered
39
+ from rasa.shared.core.trackers import DialogueStateTracker
40
+ from rasa.shared.exceptions import RasaException
41
+ from rasa.shared.nlu.constants import TEXT, INTENT, ENTITIES, ACTION_NAME
42
+ from rasa.shared.nlu.training_data.features import Features
43
+ from rasa.utils.tensorflow.constants import LABEL_PAD_ID
44
+ from rasa.utils.tensorflow.model_data import ragged_array_to_ndarray
45
+
46
+ FEATURIZER_FILE = "featurizer.json"
47
+
48
+ logger = logging.getLogger(__name__)
49
+
50
+
51
+ class InvalidStory(RasaException):
52
+ """Exception that can be raised if story cannot be featurized."""
53
+
54
+ def __init__(self, message: Text) -> None:
55
+ """Creates an InvalidStory exception.
56
+
57
+ Args:
58
+ message: a custom exception message.
59
+ """
60
+ self.message = message
61
+ super(InvalidStory, self).__init__()
62
+
63
+ def __str__(self) -> Text:
64
+ return self.message
65
+
66
+
67
+ class TrackerFeaturizer:
68
+ """Base class for actual tracker featurizers."""
69
+
70
+ # Class registry to store all subclasses
71
+ _registry: ClassVar[Dict[str, Type["TrackerFeaturizer"]]] = {}
72
+ _featurizer_type: str = "TrackerFeaturizer"
73
+
74
+ def __init__(
75
+ self, state_featurizer: Optional[SingleStateFeaturizer] = None
76
+ ) -> None:
77
+ """Initializes the tracker featurizer.
78
+
79
+ Args:
80
+ state_featurizer: The state featurizer used to encode tracker states.
81
+ """
82
+ self.state_featurizer = state_featurizer
83
+
84
+ @classmethod
85
+ def register(cls, featurizer_type: str) -> Callable:
86
+ """Decorator to register featurizer subclasses."""
87
+
88
+ def wrapper(subclass: Type["TrackerFeaturizer"]) -> Type["TrackerFeaturizer"]:
89
+ cls._registry[featurizer_type] = subclass
90
+ # Store the type identifier in the class for serialization
91
+ subclass._featurizer_type = featurizer_type
92
+ return subclass
93
+
94
+ return wrapper
95
+
96
+ @classmethod
97
+ def from_dict(cls, data: Dict[str, Any]) -> "TrackerFeaturizer":
98
+ """Create featurizer instance from dictionary."""
99
+ featurizer_type = data.pop("type")
100
+
101
+ if featurizer_type not in cls._registry:
102
+ raise ValueError(f"Unknown featurizer type: {featurizer_type}")
103
+
104
+ # Get the correct subclass and instantiate it
105
+ subclass = cls._registry[featurizer_type]
106
+ return subclass.create_from_dict(data)
107
+
108
+ @classmethod
109
+ @abstractmethod
110
+ def create_from_dict(cls, data: Dict[str, Any]) -> "TrackerFeaturizer":
111
+ """Each subclass must implement its own creation from dict method."""
112
+ pass
113
+
114
+ @staticmethod
115
+ def _create_states(
116
+ tracker: DialogueStateTracker,
117
+ domain: Domain,
118
+ omit_unset_slots: bool = False,
119
+ ignore_rule_only_turns: bool = False,
120
+ rule_only_data: Optional[Dict[Text, Any]] = None,
121
+ ) -> List[State]:
122
+ """Creates states for the given tracker.
123
+
124
+ Args:
125
+ tracker: The tracker to transform to states.
126
+ domain: The domain of the tracker.
127
+ omit_unset_slots: If `True` do not include the initial values of slots.
128
+ ignore_rule_only_turns: If `True` ignore dialogue turns that are present
129
+ only in rules.
130
+ rule_only_data: Slots and loops,
131
+ which only occur in rules but not in stories.
132
+
133
+ Returns:
134
+ Trackers as states.
135
+ """
136
+ return tracker.past_states(
137
+ domain,
138
+ omit_unset_slots=omit_unset_slots,
139
+ ignore_rule_only_turns=ignore_rule_only_turns,
140
+ rule_only_data=rule_only_data,
141
+ )
142
+
143
+ def _featurize_states(
144
+ self,
145
+ trackers_as_states: List[List[State]],
146
+ precomputations: Optional[MessageContainerForCoreFeaturization],
147
+ ) -> List[List[Dict[Text, List[Features]]]]:
148
+ """Featurizes state histories with `state_featurizer`.
149
+
150
+ Args:
151
+ trackers_as_states: Lists of states produced by a `DialogueStateTracker`
152
+ instance.
153
+ precomputations: Contains precomputed features and attributes.
154
+
155
+ Returns:
156
+ Featurized tracker states.
157
+ """
158
+ if self.state_featurizer is None:
159
+ return [[{}]]
160
+ else:
161
+ return [
162
+ [
163
+ self.state_featurizer.encode_state(state, precomputations)
164
+ for state in tracker_states
165
+ ]
166
+ for tracker_states in trackers_as_states
167
+ ]
168
+
169
+ @staticmethod
170
+ def _convert_labels_to_ids(
171
+ trackers_as_actions: List[List[Text]], domain: Domain
172
+ ) -> np.ndarray:
173
+ """Converts actions to label ids for each tracker.
174
+
175
+ Args:
176
+ trackers_as_actions: A list of tracker labels.
177
+
178
+ Returns:
179
+ Label IDs for each tracker
180
+ """
181
+ # store labels in numpy arrays so that it corresponds to np arrays of input
182
+ # features
183
+ return ragged_array_to_ndarray(
184
+ [
185
+ np.array(
186
+ [domain.index_for_action(action) for action in tracker_actions]
187
+ )
188
+ for tracker_actions in trackers_as_actions
189
+ ]
190
+ )
191
+
192
+ def _create_entity_tags(
193
+ self,
194
+ trackers_as_entities: List[List[Dict[Text, Any]]],
195
+ precomputations: Optional[MessageContainerForCoreFeaturization],
196
+ bilou_tagging: bool = False,
197
+ ) -> List[List[Dict[Text, List[Features]]]]:
198
+ """Featurizes extracted entities with `state_featurizer`.
199
+
200
+ Args:
201
+ trackers_as_entities: Extracted entities from trackers.
202
+ precomputations: Contains precomputed features and attributes.
203
+ bilou_tagging: When `True` use the BILOU tagging scheme.
204
+
205
+ Returns:
206
+ Trackers as entity features.
207
+ """
208
+ if self.state_featurizer is None:
209
+ return [[{}]]
210
+ else:
211
+ return [
212
+ [
213
+ self.state_featurizer.encode_entities(
214
+ entity_data, precomputations, bilou_tagging
215
+ )
216
+ for entity_data in trackers_entities
217
+ ]
218
+ for trackers_entities in trackers_as_entities
219
+ ]
220
+
221
+ @staticmethod
222
+ def _entity_data(event: UserUttered) -> Dict[Text, Any]:
223
+ """Extracts entities from event if not using intents.
224
+
225
+ Args:
226
+ event: The event from which to extract entities.
227
+
228
+ Returns:
229
+ Event text and entities if no intent is present.
230
+ """
231
+ # train stories support both text and intent,
232
+ # but if intent is present, the text is ignored
233
+ if event.text and not event.intent_name:
234
+ return {TEXT: event.text, ENTITIES: event.entities}
235
+
236
+ # input is not textual, so add empty dict
237
+ return {}
238
+
239
+ @staticmethod
240
+ def _remove_user_text_if_intent(trackers_as_states: List[List[State]]) -> None:
241
+ """Deletes user text from state dictionaries if intent is present.
242
+
243
+ Only featurizing either the intent or user text is currently supported. When
244
+ both are present in a state, the user text is removed so that only the intent
245
+ is featurized.
246
+
247
+ `trackers_as_states` is modified in place.
248
+
249
+ Args:
250
+ trackers_as_states: States produced by a `DialogueStateTracker` instance.
251
+ """
252
+ for states in trackers_as_states:
253
+ for state in states:
254
+ # remove text features to only use intent
255
+ if state.get(USER, {}).get(INTENT) and state.get(USER, {}).get(TEXT):
256
+ del state[USER][TEXT]
257
+
258
+ def training_states_and_labels(
259
+ self,
260
+ trackers: List[DialogueStateTracker],
261
+ domain: Domain,
262
+ omit_unset_slots: bool = False,
263
+ ignore_action_unlikely_intent: bool = False,
264
+ ) -> Tuple[List[List[State]], List[List[Text]]]:
265
+ """Transforms trackers to states and labels.
266
+
267
+ Args:
268
+ trackers: The trackers to transform.
269
+ domain: The domain.
270
+ omit_unset_slots: If `True` do not include the initial values of slots.
271
+ ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
272
+ from training states.
273
+
274
+ Returns:
275
+ Trackers as states and labels.
276
+ """
277
+ (
278
+ trackers_as_states,
279
+ trackers_as_labels,
280
+ _,
281
+ ) = self.training_states_labels_and_entities(
282
+ trackers,
283
+ domain,
284
+ omit_unset_slots=omit_unset_slots,
285
+ ignore_action_unlikely_intent=ignore_action_unlikely_intent,
286
+ )
287
+ return trackers_as_states, trackers_as_labels
288
+
289
+ @abstractmethod
290
+ def training_states_labels_and_entities(
291
+ self,
292
+ trackers: List[DialogueStateTracker],
293
+ domain: Domain,
294
+ omit_unset_slots: bool = False,
295
+ ignore_action_unlikely_intent: bool = False,
296
+ ) -> Tuple[List[List[State]], List[List[Text]], List[List[Dict[Text, Any]]]]:
297
+ """Transforms trackers to states, labels, and entity data.
298
+
299
+ Args:
300
+ trackers: The trackers to transform.
301
+ domain: The domain.
302
+ omit_unset_slots: If `True` do not include the initial values of slots.
303
+ ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
304
+ from training states.
305
+
306
+ Returns:
307
+ Trackers as states, labels, and entity data.
308
+ """
309
+ raise NotImplementedError(
310
+ f"`{self.__class__.__name__}` should implement how to "
311
+ f"encode trackers as feature vectors"
312
+ )
313
+
314
+ def prepare_for_featurization(
315
+ self, domain: Domain, bilou_tagging: bool = False
316
+ ) -> None:
317
+ """Ensures that the featurizer is ready to be called during training.
318
+
319
+ State featurizer needs to build its vocabulary from the domain
320
+ for it to be ready to be used during training.
321
+
322
+ Args:
323
+ domain: Domain of the assistant.
324
+ bilou_tagging: Whether to consider bilou tagging.
325
+ """
326
+ if self.state_featurizer is None:
327
+ raise InvalidTrackerFeaturizerUsageError(
328
+ f"Instance variable 'state_featurizer' is not set. "
329
+ f"During initialization set 'state_featurizer' to an instance of "
330
+ f"'{SingleStateFeaturizer.__class__.__name__}' class "
331
+ f"to get numerical features for trackers."
332
+ )
333
+ self.state_featurizer.prepare_for_training(domain, bilou_tagging)
334
+
335
+ def featurize_trackers(
336
+ self,
337
+ trackers: List[DialogueStateTracker],
338
+ domain: Domain,
339
+ precomputations: Optional[MessageContainerForCoreFeaturization],
340
+ bilou_tagging: bool = False,
341
+ ignore_action_unlikely_intent: bool = False,
342
+ ) -> Tuple[
343
+ List[List[Dict[Text, List[Features]]]],
344
+ np.ndarray,
345
+ List[List[Dict[Text, List[Features]]]],
346
+ ]:
347
+ """Featurizes the training trackers.
348
+
349
+ Args:
350
+ trackers: list of training trackers
351
+ domain: the domain
352
+ precomputations: Contains precomputed features and attributes.
353
+ bilou_tagging: indicates whether BILOU tagging should be used or not
354
+ ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
355
+ from training state features.
356
+
357
+ Returns:
358
+ - a dictionary of state types (INTENT, TEXT, ACTION_NAME, ACTION_TEXT,
359
+ ENTITIES, SLOTS, ACTIVE_LOOP) to a list of features for all dialogue
360
+ turns in all training trackers
361
+ - the label ids (e.g. action ids) for every dialogue turn in all training
362
+ trackers
363
+ - A dictionary of entity type (ENTITY_TAGS) to a list of features
364
+ containing entity tag ids for text user inputs otherwise empty dict
365
+ for all dialogue turns in all training trackers
366
+ """
367
+ self.prepare_for_featurization(domain, bilou_tagging)
368
+ (
369
+ trackers_as_states,
370
+ trackers_as_labels,
371
+ trackers_as_entities,
372
+ ) = self.training_states_labels_and_entities(
373
+ trackers,
374
+ domain,
375
+ ignore_action_unlikely_intent=ignore_action_unlikely_intent,
376
+ )
377
+
378
+ tracker_state_features = self._featurize_states(
379
+ trackers_as_states, precomputations
380
+ )
381
+
382
+ if not tracker_state_features and not trackers_as_labels:
383
+ # If input and output were empty, it means there is
384
+ # no data on which the policy can be trained
385
+ # hence return them as it is. They'll be handled
386
+ # appropriately inside the policy.
387
+ return tracker_state_features, np.ndarray(trackers_as_labels), []
388
+
389
+ label_ids = self._convert_labels_to_ids(trackers_as_labels, domain)
390
+
391
+ entity_tags = self._create_entity_tags(
392
+ trackers_as_entities, precomputations, bilou_tagging
393
+ )
394
+
395
+ return tracker_state_features, label_ids, entity_tags
396
+
397
+ def _choose_last_user_input(
398
+ self, trackers_as_states: List[List[State]], use_text_for_last_user_input: bool
399
+ ) -> None:
400
+ for states in trackers_as_states:
401
+ last_state = states[-1]
402
+ # only update the state of the real user utterance
403
+ if not rasa.shared.core.trackers.is_prev_action_listen_in_state(last_state):
404
+ continue
405
+
406
+ if use_text_for_last_user_input:
407
+ # remove intent features to only use text
408
+ if last_state.get(USER, {}).get(INTENT):
409
+ del last_state[USER][INTENT]
410
+ # don't add entities if text is used for featurization
411
+ if last_state.get(USER, {}).get(ENTITIES):
412
+ del last_state[USER][ENTITIES]
413
+ else:
414
+ # remove text features to only use intent
415
+ if last_state.get(USER, {}).get(TEXT):
416
+ del last_state[USER][TEXT]
417
+
418
+ # make sure that all dialogue steps are either intent or text based
419
+ self._remove_user_text_if_intent(trackers_as_states)
420
+
421
+ def prediction_states(
422
+ self,
423
+ trackers: List[DialogueStateTracker],
424
+ domain: Domain,
425
+ use_text_for_last_user_input: bool = False,
426
+ ignore_rule_only_turns: bool = False,
427
+ rule_only_data: Optional[Dict[Text, Any]] = None,
428
+ ignore_action_unlikely_intent: bool = False,
429
+ ) -> List[List[State]]:
430
+ """Transforms trackers to states for prediction.
431
+
432
+ Args:
433
+ trackers: The trackers to transform.
434
+ domain: The domain.
435
+ use_text_for_last_user_input: Indicates whether to use text or intent label
436
+ for featurizing last user input.
437
+ ignore_rule_only_turns: If True ignore dialogue turns that are present
438
+ only in rules.
439
+ rule_only_data: Slots and loops,
440
+ which only occur in rules but not in stories.
441
+ ignore_action_unlikely_intent: Whether to remove states containing
442
+ `action_unlikely_intent` from prediction states.
443
+
444
+ Returns:
445
+ Trackers as states for prediction.
446
+ """
447
+ raise NotImplementedError(
448
+ "Featurizer must have the capacity to create feature vector"
449
+ )
450
+
451
+ def create_state_features(
452
+ self,
453
+ trackers: List[DialogueStateTracker],
454
+ domain: Domain,
455
+ precomputations: Optional[MessageContainerForCoreFeaturization],
456
+ use_text_for_last_user_input: bool = False,
457
+ ignore_rule_only_turns: bool = False,
458
+ rule_only_data: Optional[Dict[Text, Any]] = None,
459
+ ignore_action_unlikely_intent: bool = False,
460
+ ) -> List[List[Dict[Text, List[Features]]]]:
461
+ """Creates state features for prediction.
462
+
463
+ Args:
464
+ trackers: A list of state trackers
465
+ domain: The domain
466
+ precomputations: Contains precomputed features and attributes.
467
+ use_text_for_last_user_input: Indicates whether to use text or intent label
468
+ for featurizing last user input.
469
+ ignore_rule_only_turns: If True ignore dialogue turns that are present
470
+ only in rules.
471
+ rule_only_data: Slots and loops,
472
+ which only occur in rules but not in stories.
473
+ ignore_action_unlikely_intent: Whether to remove any states containing
474
+ `action_unlikely_intent` from state features.
475
+
476
+ Returns:
477
+ Dictionaries of state type (INTENT, TEXT, ACTION_NAME, ACTION_TEXT,
478
+ ENTITIES, SLOTS, ACTIVE_LOOP) to a list of features for all dialogue
479
+ turns in all trackers.
480
+ """
481
+ trackers_as_states = self.prediction_states(
482
+ trackers,
483
+ domain,
484
+ use_text_for_last_user_input,
485
+ ignore_rule_only_turns,
486
+ rule_only_data,
487
+ ignore_action_unlikely_intent=ignore_action_unlikely_intent,
488
+ )
489
+ return self._featurize_states(trackers_as_states, precomputations)
490
+
491
+ def persist(self, path: Union[Text, Path]) -> None:
492
+ """Persists the tracker featurizer to the given path.
493
+
494
+ Args:
495
+ path: The path to persist the tracker featurizer to.
496
+ """
497
+ featurizer_file = Path(path) / FEATURIZER_FILE
498
+ rasa.shared.utils.io.create_directory_for_file(featurizer_file)
499
+
500
+ # entity tags are persisted in TED policy, they are not needed for prediction
501
+ if self.state_featurizer is not None:
502
+ self.state_featurizer.entity_tag_specs = []
503
+
504
+ # noinspection PyTypeChecker
505
+ rasa.shared.utils.io.dump_obj_as_json_to_file(featurizer_file, self.to_dict())
506
+
507
+ @staticmethod
508
+ def load(path: Union[Text, Path]) -> Optional[TrackerFeaturizer]:
509
+ """Loads the featurizer from file.
510
+
511
+ Args:
512
+ path: The path to load the tracker featurizer from.
513
+
514
+ Returns:
515
+ The loaded tracker featurizer.
516
+ """
517
+ featurizer_file = Path(path) / FEATURIZER_FILE
518
+ if featurizer_file.is_file():
519
+ data = rasa.shared.utils.io.read_json_file(featurizer_file)
520
+
521
+ if "type" not in data:
522
+ logger.error(
523
+ f"Couldn't load featurizer for policy. "
524
+ f"File '{featurizer_file}' does not contain all "
525
+ f"necessary information. 'type' is missing."
526
+ )
527
+ return None
528
+
529
+ return TrackerFeaturizer.from_dict(data)
530
+
531
+ logger.error(
532
+ f"Couldn't load featurizer for policy. "
533
+ f"File '{featurizer_file}' doesn't exist."
534
+ )
535
+ return None
536
+
537
+ @staticmethod
538
+ def _remove_action_unlikely_intent_from_states(states: List[State]) -> List[State]:
539
+ return [
540
+ state
541
+ for state in states
542
+ if not _is_prev_action_unlikely_intent_in_state(state)
543
+ ]
544
+
545
+ @staticmethod
546
+ def _remove_action_unlikely_intent_from_events(events: List[Event]) -> List[Event]:
547
+ return [
548
+ event
549
+ for event in events
550
+ if (
551
+ not isinstance(event, ActionExecuted)
552
+ or event.action_name != ACTION_UNLIKELY_INTENT_NAME
553
+ )
554
+ ]
555
+
556
+ def to_dict(self) -> Dict[str, Any]:
557
+ return {
558
+ "type": self.__class__._featurizer_type,
559
+ "state_featurizer": (
560
+ self.state_featurizer.to_dict() if self.state_featurizer else None
561
+ ),
562
+ }
563
+
564
+
565
+ @TrackerFeaturizer.register("FullDialogueTrackerFeaturizer")
566
+ class FullDialogueTrackerFeaturizer(TrackerFeaturizer):
567
+ """Creates full dialogue training data for time distributed architectures.
568
+
569
+ Creates training data that uses each time output for prediction.
570
+ """
571
+
572
+ def training_states_labels_and_entities(
573
+ self,
574
+ trackers: List[DialogueStateTracker],
575
+ domain: Domain,
576
+ omit_unset_slots: bool = False,
577
+ ignore_action_unlikely_intent: bool = False,
578
+ ) -> Tuple[List[List[State]], List[List[Text]], List[List[Dict[Text, Any]]]]:
579
+ """Transforms trackers to states, action labels, and entity data.
580
+
581
+ Args:
582
+ trackers: The trackers to transform.
583
+ domain: The domain.
584
+ omit_unset_slots: If `True` do not include the initial values of slots.
585
+ ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
586
+ from training states.
587
+
588
+ Returns:
589
+ Trackers as states, action labels, and entity data.
590
+ """
591
+ trackers_as_states = []
592
+ trackers_as_actions = []
593
+ trackers_as_entities = []
594
+
595
+ logger.debug(
596
+ "Creating states and action examples from "
597
+ "collected trackers (by {}({}))..."
598
+ "".format(type(self).__name__, type(self.state_featurizer).__name__)
599
+ )
600
+ pbar = tqdm(
601
+ trackers,
602
+ desc="Processed trackers",
603
+ disable=rasa.shared.utils.io.is_logging_disabled(),
604
+ )
605
+ for tracker in pbar:
606
+ states = self._create_states(
607
+ tracker, domain, omit_unset_slots=omit_unset_slots
608
+ )
609
+ events = tracker.applied_events(True)
610
+
611
+ if ignore_action_unlikely_intent:
612
+ states = self._remove_action_unlikely_intent_from_states(states)
613
+ events = self._remove_action_unlikely_intent_from_events(events)
614
+
615
+ delete_first_state = False
616
+ actions = []
617
+ entities = []
618
+ entity_data = {}
619
+ for event in events:
620
+ if isinstance(event, UserUttered):
621
+ entity_data = self._entity_data(event)
622
+
623
+ if not isinstance(event, ActionExecuted):
624
+ continue
625
+
626
+ if not event.unpredictable:
627
+ # only actions which can be
628
+ # predicted at a stories start
629
+ action = event.action_name or event.action_text
630
+ if action is not None:
631
+ actions.append(action)
632
+ entities.append(entity_data)
633
+ else:
634
+ # unpredictable actions can be
635
+ # only the first in the story
636
+ if delete_first_state:
637
+ raise InvalidStory(
638
+ f"Found two unpredictable actions in one story "
639
+ f"'{tracker.sender_id}'. Check your story files."
640
+ )
641
+ delete_first_state = True
642
+
643
+ # reset entity_data for the the next turn
644
+ entity_data = {}
645
+
646
+ if delete_first_state:
647
+ states = states[1:]
648
+
649
+ trackers_as_states.append(states[:-1])
650
+ trackers_as_actions.append(actions)
651
+ trackers_as_entities.append(entities)
652
+
653
+ self._remove_user_text_if_intent(trackers_as_states)
654
+
655
+ return trackers_as_states, trackers_as_actions, trackers_as_entities
656
+
657
+ def prediction_states(
658
+ self,
659
+ trackers: List[DialogueStateTracker],
660
+ domain: Domain,
661
+ use_text_for_last_user_input: bool = False,
662
+ ignore_rule_only_turns: bool = False,
663
+ rule_only_data: Optional[Dict[Text, Any]] = None,
664
+ ignore_action_unlikely_intent: bool = False,
665
+ ) -> List[List[State]]:
666
+ """Transforms trackers to states for prediction.
667
+
668
+ Args:
669
+ trackers: The trackers to transform.
670
+ domain: The domain.
671
+ use_text_for_last_user_input: Indicates whether to use text or intent label
672
+ for featurizing last user input.
673
+ ignore_rule_only_turns: If True ignore dialogue turns that are present
674
+ only in rules.
675
+ rule_only_data: Slots and loops,
676
+ which only occur in rules but not in stories.
677
+ ignore_action_unlikely_intent: Whether to remove any states containing
678
+ `action_unlikely_intent` from prediction states.
679
+
680
+ Returns:
681
+ Trackers as states for prediction.
682
+ """
683
+ trackers_as_states = [
684
+ self._create_states(
685
+ tracker,
686
+ domain,
687
+ ignore_rule_only_turns=ignore_rule_only_turns,
688
+ rule_only_data=rule_only_data,
689
+ )
690
+ for tracker in trackers
691
+ ]
692
+
693
+ if ignore_action_unlikely_intent:
694
+ trackers_as_states = [
695
+ self._remove_action_unlikely_intent_from_states(states)
696
+ for states in trackers_as_states
697
+ ]
698
+
699
+ self._choose_last_user_input(trackers_as_states, use_text_for_last_user_input)
700
+
701
+ return trackers_as_states
702
+
703
+ def to_dict(self) -> Dict[str, Any]:
704
+ return super().to_dict()
705
+
706
+ @classmethod
707
+ def create_from_dict(cls, data: Dict[str, Any]) -> "FullDialogueTrackerFeaturizer":
708
+ state_featurizer = SingleStateFeaturizer.create_from_dict(
709
+ data["state_featurizer"]
710
+ )
711
+ return cls(
712
+ state_featurizer,
713
+ )
714
+
715
+
716
+ @TrackerFeaturizer.register("MaxHistoryTrackerFeaturizer")
717
+ class MaxHistoryTrackerFeaturizer(TrackerFeaturizer):
718
+ """Truncates the tracker history into `max_history` long sequences.
719
+
720
+ Creates training data from trackers where actions are the output prediction
721
+ labels. Tracker state sequences which represent policy input are truncated
722
+ to not excede `max_history` states.
723
+ """
724
+
725
+ LABEL_NAME = "action"
726
+
727
+ def __init__(
728
+ self,
729
+ state_featurizer: Optional[SingleStateFeaturizer] = None,
730
+ max_history: Optional[int] = None,
731
+ remove_duplicates: bool = True,
732
+ ) -> None:
733
+ """Initializes the tracker featurizer.
734
+
735
+ Args:
736
+ state_featurizer: The state featurizer used to encode the states.
737
+ max_history: The maximum length of an extracted state sequence.
738
+ remove_duplicates: Keep only unique training state sequence/label pairs.
739
+ """
740
+ super().__init__(state_featurizer)
741
+ self.max_history = max_history
742
+ self.remove_duplicates = remove_duplicates
743
+
744
+ @staticmethod
745
+ def slice_state_history(
746
+ states: List[State], slice_length: Optional[int]
747
+ ) -> List[State]:
748
+ """Slices states from the trackers history.
749
+
750
+ Args:
751
+ states: The states
752
+ slice_length: The slice length
753
+
754
+ Returns:
755
+ The sliced states.
756
+ """
757
+ if not slice_length:
758
+ return states
759
+
760
+ return states[-slice_length:]
761
+
762
+ @staticmethod
763
+ def _hash_example(states: List[State], labels: Optional[List[Text]] = None) -> int:
764
+ """Hashes states (and optionally label).
765
+
766
+ Produces a hash of the tracker state sequence (and optionally the labels).
767
+ If `labels` is `None`, labels don't get hashed.
768
+
769
+ Args:
770
+ states: The tracker state sequence to hash.
771
+ labels: Label strings associated with this state sequence.
772
+
773
+ Returns:
774
+ The hash of the states and (optionally) the label.
775
+ """
776
+ frozen_states = tuple(
777
+ s if s is None else DialogueStateTracker.freeze_current_state(s)
778
+ for s in states
779
+ )
780
+ if labels is not None:
781
+ frozen_labels = tuple(labels)
782
+ return hash((frozen_states, frozen_labels))
783
+ else:
784
+ return hash(frozen_states)
785
+
786
+ def training_states_labels_and_entities(
787
+ self,
788
+ trackers: List[DialogueStateTracker],
789
+ domain: Domain,
790
+ omit_unset_slots: bool = False,
791
+ ignore_action_unlikely_intent: bool = False,
792
+ ) -> Tuple[List[List[State]], List[List[Text]], List[List[Dict[Text, Any]]]]:
793
+ """Transforms trackers to states, action labels, and entity data.
794
+
795
+ Args:
796
+ trackers: The trackers to transform.
797
+ domain: The domain.
798
+ omit_unset_slots: If `True` do not include the initial values of slots.
799
+ ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
800
+ from training states.
801
+
802
+ Returns:
803
+ Trackers as states, labels, and entity data.
804
+ """
805
+ example_states = []
806
+ example_labels = []
807
+ example_entities = []
808
+
809
+ # Store of example hashes for removing duplicate training examples.
810
+ hashed_examples = set()
811
+
812
+ logger.debug(
813
+ f"Creating states and {self.LABEL_NAME} label examples from "
814
+ f"collected trackers "
815
+ f"(by {type(self).__name__}({type(self.state_featurizer).__name__}))..."
816
+ )
817
+ pbar = tqdm(
818
+ trackers,
819
+ desc="Processed trackers",
820
+ disable=rasa.shared.utils.io.is_logging_disabled(),
821
+ )
822
+ for tracker in pbar:
823
+ for states, label, entities in self._extract_examples(
824
+ tracker,
825
+ domain,
826
+ omit_unset_slots=omit_unset_slots,
827
+ ignore_action_unlikely_intent=ignore_action_unlikely_intent,
828
+ ):
829
+ if self.remove_duplicates:
830
+ hashed = self._hash_example(states, label)
831
+ if hashed in hashed_examples:
832
+ continue
833
+ hashed_examples.add(hashed)
834
+
835
+ example_states.append(states)
836
+ example_labels.append(label)
837
+ example_entities.append(entities)
838
+
839
+ pbar.set_postfix({f"# {self.LABEL_NAME}": f"{len(example_labels):d}"})
840
+
841
+ self._remove_user_text_if_intent(example_states)
842
+
843
+ logger.debug(f"Created {len(example_states)} {self.LABEL_NAME} examples.")
844
+
845
+ return example_states, example_labels, example_entities
846
+
847
+ def _extract_examples(
848
+ self,
849
+ tracker: DialogueStateTracker,
850
+ domain: Domain,
851
+ omit_unset_slots: bool = False,
852
+ ignore_action_unlikely_intent: bool = False,
853
+ ) -> Iterator[Tuple[List[State], List[Text], List[Dict[Text, Any]]]]:
854
+ """Creates an iterator over training examples from a tracker.
855
+
856
+ Args:
857
+ trackers: The tracker from which to extract training examples.
858
+ domain: The domain of the training data.
859
+ omit_unset_slots: If `True` do not include the initial values of slots.
860
+ ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
861
+ from training states.
862
+
863
+ Returns:
864
+ An iterator over example states, labels, and entity data.
865
+ """
866
+ tracker_states = self._create_states(
867
+ tracker, domain, omit_unset_slots=omit_unset_slots
868
+ )
869
+ events = tracker.applied_events(True)
870
+
871
+ if ignore_action_unlikely_intent:
872
+ tracker_states = self._remove_action_unlikely_intent_from_states(
873
+ tracker_states
874
+ )
875
+ events = self._remove_action_unlikely_intent_from_events(events)
876
+
877
+ label_index = 0
878
+ entity_data = {}
879
+ for event in events:
880
+ if isinstance(event, UserUttered):
881
+ entity_data = self._entity_data(event)
882
+
883
+ elif isinstance(event, ActionExecuted):
884
+ label_index += 1
885
+
886
+ # use only actions which can be predicted at a stories start
887
+ if event.unpredictable:
888
+ continue
889
+
890
+ sliced_states = self.slice_state_history(
891
+ tracker_states[:label_index], self.max_history
892
+ )
893
+ label = cast(List[Text], [event.action_name or event.action_text])
894
+ entities = [entity_data]
895
+
896
+ yield sliced_states, label, entities
897
+
898
+ # reset entity_data for the the next turn
899
+ entity_data = {}
900
+
901
+ def prediction_states(
902
+ self,
903
+ trackers: List[DialogueStateTracker],
904
+ domain: Domain,
905
+ use_text_for_last_user_input: bool = False,
906
+ ignore_rule_only_turns: bool = False,
907
+ rule_only_data: Optional[Dict[Text, Any]] = None,
908
+ ignore_action_unlikely_intent: bool = False,
909
+ ) -> List[List[State]]:
910
+ """Transforms trackers to states for prediction.
911
+
912
+ Args:
913
+ trackers: The trackers to transform.
914
+ domain: The domain.
915
+ use_text_for_last_user_input: Indicates whether to use text or intent label
916
+ for featurizing last user input.
917
+ ignore_rule_only_turns: If True ignore dialogue turns that are present
918
+ only in rules.
919
+ rule_only_data: Slots and loops,
920
+ which only occur in rules but not in stories.
921
+ ignore_action_unlikely_intent: Whether to remove any states containing
922
+ `action_unlikely_intent` from prediction states.
923
+
924
+ Returns:
925
+ Trackers as states for prediction.
926
+ """
927
+ trackers_as_states = [
928
+ self._create_states(
929
+ tracker,
930
+ domain,
931
+ ignore_rule_only_turns=ignore_rule_only_turns,
932
+ rule_only_data=rule_only_data,
933
+ )
934
+ for tracker in trackers
935
+ ]
936
+
937
+ # Remove `action_unlikely_intent` from `trackers_as_states`.
938
+ # This must be done before state history slicing to ensure the
939
+ # max history of the sliced states matches training time.
940
+ if ignore_action_unlikely_intent:
941
+ trackers_as_states = [
942
+ self._remove_action_unlikely_intent_from_states(states)
943
+ for states in trackers_as_states
944
+ ]
945
+
946
+ trackers_as_states = [
947
+ self.slice_state_history(states, self.max_history)
948
+ for states in trackers_as_states
949
+ ]
950
+ self._choose_last_user_input(trackers_as_states, use_text_for_last_user_input)
951
+
952
+ return trackers_as_states
953
+
954
+ def to_dict(self) -> Dict[str, Any]:
955
+ data = super().to_dict()
956
+ data.update(
957
+ {
958
+ "remove_duplicates": self.remove_duplicates,
959
+ "max_history": self.max_history,
960
+ }
961
+ )
962
+ return data
963
+
964
+ @classmethod
965
+ def create_from_dict(cls, data: Dict[str, Any]) -> "MaxHistoryTrackerFeaturizer":
966
+ state_featurizer = SingleStateFeaturizer.create_from_dict(
967
+ data["state_featurizer"]
968
+ )
969
+ return cls(state_featurizer, data["max_history"], data["remove_duplicates"])
970
+
971
+
972
+ @TrackerFeaturizer.register("IntentMaxHistoryTrackerFeaturizer")
973
+ class IntentMaxHistoryTrackerFeaturizer(MaxHistoryTrackerFeaturizer):
974
+ """Truncates the tracker history into `max_history` long sequences.
975
+
976
+ Creates training data from trackers where intents are the output prediction
977
+ labels. Tracker state sequences which represent policy input are truncated
978
+ to not excede `max_history` states.
979
+ """
980
+
981
+ LABEL_NAME = "intent"
982
+
983
+ @classmethod
984
+ def _convert_labels_to_ids(
985
+ cls, trackers_as_intents: List[List[Text]], domain: Domain
986
+ ) -> np.ndarray:
987
+ """Converts a list of labels to a matrix of label ids.
988
+
989
+ The number of rows is equal to `len(trackers_as_intents)`. The number of
990
+ columns is equal to the maximum number of positive labels that any training
991
+ example is associated with. Rows are padded with `LABEL_PAD_ID` if not all rows
992
+ have the same number of labels.
993
+
994
+ Args:
995
+ trackers_as_intents: Positive example label ids
996
+ associated with each training example.
997
+ domain: The domain of the training data.
998
+
999
+ Returns:
1000
+ A matrix of label ids.
1001
+ """
1002
+ # store labels in numpy arrays so that it corresponds to np arrays
1003
+ # of input features
1004
+ label_ids = [
1005
+ [domain.intents.index(intent) for intent in tracker_intents]
1006
+ for tracker_intents in trackers_as_intents
1007
+ ]
1008
+
1009
+ return np.array(cls._pad_label_ids(label_ids))
1010
+
1011
+ @staticmethod
1012
+ def _pad_label_ids(label_ids: List[List[int]]) -> List[List[int]]:
1013
+ """Pads label ids so that all are of the same length.
1014
+
1015
+ Args:
1016
+ label_ids: Label ids of varying lengths
1017
+
1018
+ Returns:
1019
+ Label ids padded to be of uniform length.
1020
+ """
1021
+ # If `label_ids` is an empty list, no padding needs to be added.
1022
+ if not label_ids:
1023
+ return label_ids
1024
+
1025
+ # Add `LABEL_PAD_ID` padding to labels array so that
1026
+ # each example has equal number of labels
1027
+ multiple_labels_count = [len(a) for a in label_ids]
1028
+ max_labels_count = max(multiple_labels_count)
1029
+ num_padding_needed = [max_labels_count - len(a) for a in label_ids]
1030
+
1031
+ padded_label_ids = []
1032
+ for ids, num_pads in zip(label_ids, num_padding_needed):
1033
+ padded_row = list(ids) + [LABEL_PAD_ID] * num_pads
1034
+ padded_label_ids.append(padded_row)
1035
+ return padded_label_ids
1036
+
1037
+ def training_states_labels_and_entities(
1038
+ self,
1039
+ trackers: List[DialogueStateTracker],
1040
+ domain: Domain,
1041
+ omit_unset_slots: bool = False,
1042
+ ignore_action_unlikely_intent: bool = False,
1043
+ ) -> Tuple[List[List[State]], List[List[Text]], List[List[Dict[Text, Any]]]]:
1044
+ """Transforms trackers to states, intent labels, and entity data.
1045
+
1046
+ Args:
1047
+ trackers: The trackers to transform.
1048
+ domain: The domain.
1049
+ omit_unset_slots: If `True` do not include the initial values of slots.
1050
+ ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
1051
+ from training states.
1052
+
1053
+ Returns:
1054
+ Trackers as states, labels, and entity data.
1055
+ """
1056
+ example_states = []
1057
+ example_entities = []
1058
+
1059
+ # Store of example hashes (of both states and labels) for removing
1060
+ # duplicate training examples.
1061
+ hashed_examples = set()
1062
+ # Mapping of example state hash to set of
1063
+ # positive labels associated with the state.
1064
+ state_hash_to_label_set: DefaultDict[int, Set[Text]] = defaultdict(set)
1065
+
1066
+ logger.debug(
1067
+ f"Creating states and {self.LABEL_NAME} label examples from "
1068
+ f"collected trackers "
1069
+ f"(by {type(self).__name__}({type(self.state_featurizer).__name__}))..."
1070
+ )
1071
+ pbar = tqdm(
1072
+ trackers,
1073
+ desc="Processed trackers",
1074
+ disable=rasa.shared.utils.io.is_logging_disabled(),
1075
+ )
1076
+ for tracker in pbar:
1077
+ for states, label, entities in self._extract_examples(
1078
+ tracker,
1079
+ domain,
1080
+ omit_unset_slots=omit_unset_slots,
1081
+ ignore_action_unlikely_intent=ignore_action_unlikely_intent,
1082
+ ):
1083
+ if self.remove_duplicates:
1084
+ hashed = self._hash_example(states, label)
1085
+ if hashed in hashed_examples:
1086
+ continue
1087
+ hashed_examples.add(hashed)
1088
+
1089
+ # Store all positive labels associated with a training state.
1090
+ state_hash = self._hash_example(states)
1091
+
1092
+ # Only add unique example states unless `remove_duplicates` is `False`.
1093
+ if (
1094
+ not self.remove_duplicates
1095
+ or state_hash not in state_hash_to_label_set
1096
+ ):
1097
+ example_states.append(states)
1098
+ example_entities.append(entities)
1099
+
1100
+ state_hash_to_label_set[state_hash].add(label[0])
1101
+
1102
+ pbar.set_postfix({f"# {self.LABEL_NAME}": f"{len(example_states):d}"})
1103
+
1104
+ # Collect positive labels for each state example.
1105
+ example_labels = [
1106
+ list(state_hash_to_label_set[self._hash_example(state)])
1107
+ for state in example_states
1108
+ ]
1109
+
1110
+ self._remove_user_text_if_intent(example_states)
1111
+
1112
+ logger.debug(f"Created {len(example_states)} {self.LABEL_NAME} examples.")
1113
+
1114
+ return example_states, example_labels, example_entities
1115
+
1116
+ def _extract_examples(
1117
+ self,
1118
+ tracker: DialogueStateTracker,
1119
+ domain: Domain,
1120
+ omit_unset_slots: bool = False,
1121
+ ignore_action_unlikely_intent: bool = False,
1122
+ ) -> Iterator[Tuple[List[State], List[Text], List[Dict[Text, Any]]]]:
1123
+ """Creates an iterator over training examples from a tracker.
1124
+
1125
+ Args:
1126
+ tracker: The tracker from which to extract training examples.
1127
+ domain: The domain of the training data.
1128
+ omit_unset_slots: If `True` do not include the initial values of slots.
1129
+ ignore_action_unlikely_intent: Whether to remove `action_unlikely_intent`
1130
+ from training states.
1131
+
1132
+ Returns:
1133
+ An iterator over example states, labels, and entity data.
1134
+ """
1135
+ tracker_states = self._create_states(
1136
+ tracker, domain, omit_unset_slots=omit_unset_slots
1137
+ )
1138
+ events = tracker.applied_events(True)
1139
+
1140
+ if ignore_action_unlikely_intent:
1141
+ tracker_states = self._remove_action_unlikely_intent_from_states(
1142
+ tracker_states
1143
+ )
1144
+ events = self._remove_action_unlikely_intent_from_events(events)
1145
+
1146
+ label_index = 0
1147
+ for event in events:
1148
+ if isinstance(event, ActionExecuted):
1149
+ label_index += 1
1150
+
1151
+ elif isinstance(event, UserUttered):
1152
+ sliced_states = self.slice_state_history(
1153
+ tracker_states[:label_index], self.max_history
1154
+ )
1155
+ label = cast(List[Text], [event.intent_name or event.text])
1156
+ entities: List[Dict[Text, Any]] = [{}]
1157
+
1158
+ yield sliced_states, label, entities
1159
+
1160
+ @staticmethod
1161
+ def _cleanup_last_user_state_with_action_listen(
1162
+ trackers_as_states: List[List[State]],
1163
+ ) -> List[List[State]]:
1164
+ """Removes the last tracker state if the previous action is `action_listen`.
1165
+
1166
+ States with the previous action equal to `action_listen` correspond to states
1167
+ with a new user intent. This information is what `UnexpecTEDIntentPolicy` is
1168
+ trying to predict so it needs to be removed before obtaining a prediction.
1169
+
1170
+ Args:
1171
+ trackers_as_states: Trackers converted to states
1172
+
1173
+ Returns:
1174
+ Filtered states with last `action_listen` removed.
1175
+ """
1176
+ for states in trackers_as_states:
1177
+ if not states:
1178
+ continue
1179
+ last_state = states[-1]
1180
+ if rasa.shared.core.trackers.is_prev_action_listen_in_state(last_state):
1181
+ del states[-1]
1182
+
1183
+ return trackers_as_states
1184
+
1185
+ def prediction_states(
1186
+ self,
1187
+ trackers: List[DialogueStateTracker],
1188
+ domain: Domain,
1189
+ use_text_for_last_user_input: bool = False,
1190
+ ignore_rule_only_turns: bool = False,
1191
+ rule_only_data: Optional[Dict[Text, Any]] = None,
1192
+ ignore_action_unlikely_intent: bool = False,
1193
+ ) -> List[List[State]]:
1194
+ """Transforms trackers to states for prediction.
1195
+
1196
+ Args:
1197
+ trackers: The trackers to transform.
1198
+ domain: The domain.
1199
+ use_text_for_last_user_input: Indicates whether to use text or intent label
1200
+ for featurizing last user input.
1201
+ ignore_rule_only_turns: If True ignore dialogue turns that are present
1202
+ only in rules.
1203
+ rule_only_data: Slots and loops,
1204
+ which only occur in rules but not in stories.
1205
+ ignore_action_unlikely_intent: Whether to remove any states containing
1206
+ `action_unlikely_intent` from prediction states.
1207
+
1208
+ Returns:
1209
+ Trackers as states for prediction.
1210
+ """
1211
+ trackers_as_states = [
1212
+ self._create_states(
1213
+ tracker,
1214
+ domain,
1215
+ ignore_rule_only_turns=ignore_rule_only_turns,
1216
+ rule_only_data=rule_only_data,
1217
+ )
1218
+ for tracker in trackers
1219
+ ]
1220
+
1221
+ # Remove `action_unlikely_intent` from `trackers_as_states`.
1222
+ # This must be done before state history slicing to ensure the
1223
+ # max history of the sliced states matches training time.
1224
+ if ignore_action_unlikely_intent:
1225
+ trackers_as_states = [
1226
+ self._remove_action_unlikely_intent_from_states(states)
1227
+ for states in trackers_as_states
1228
+ ]
1229
+
1230
+ self._choose_last_user_input(trackers_as_states, use_text_for_last_user_input)
1231
+
1232
+ # `tracker_as_states` contain a state with intent = last intent
1233
+ # and previous action = action_listen. This state needs to be
1234
+ # removed as it was not present during training as well because
1235
+ # predicting the last intent is what the policies using this
1236
+ # featurizer do. This is specifically done before state history
1237
+ # is sliced so that the number of past states is same as `max_history`.
1238
+ self._cleanup_last_user_state_with_action_listen(trackers_as_states)
1239
+
1240
+ trackers_as_states = [
1241
+ self.slice_state_history(states, self.max_history)
1242
+ for states in trackers_as_states
1243
+ ]
1244
+
1245
+ return trackers_as_states
1246
+
1247
+ def to_dict(self) -> Dict[str, Any]:
1248
+ return super().to_dict()
1249
+
1250
+ @classmethod
1251
+ def create_from_dict(
1252
+ cls, data: Dict[str, Any]
1253
+ ) -> "IntentMaxHistoryTrackerFeaturizer":
1254
+ state_featurizer = SingleStateFeaturizer.create_from_dict(
1255
+ data["state_featurizer"]
1256
+ )
1257
+ return cls(state_featurizer, data["max_history"], data["remove_duplicates"])
1258
+
1259
+
1260
+ def _is_prev_action_unlikely_intent_in_state(state: State) -> bool:
1261
+ prev_action_name = state.get(PREVIOUS_ACTION, {}).get(ACTION_NAME)
1262
+ return prev_action_name == ACTION_UNLIKELY_INTENT_NAME