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,1094 @@
1
+ import tensorflow as tf
2
+ import numpy as np
3
+ from typing import Text, List, Dict, Any, Union, Optional, Tuple, Callable
4
+
5
+ from rasa.shared.nlu.constants import TEXT
6
+ from rasa.utils.tensorflow.model_data import FeatureSignature
7
+ from rasa.utils.tensorflow.constants import (
8
+ REGULARIZATION_CONSTANT,
9
+ CONNECTION_DENSITY,
10
+ NUM_TRANSFORMER_LAYERS,
11
+ TRANSFORMER_SIZE,
12
+ NUM_HEADS,
13
+ UNIDIRECTIONAL_ENCODER,
14
+ KEY_RELATIVE_ATTENTION,
15
+ VALUE_RELATIVE_ATTENTION,
16
+ MAX_RELATIVE_POSITION,
17
+ MASKED_LM,
18
+ HIDDEN_LAYERS_SIZES,
19
+ DROP_RATE,
20
+ SPARSE_INPUT_DROPOUT,
21
+ DENSE_INPUT_DROPOUT,
22
+ DENSE_DIMENSION,
23
+ CONCAT_DIMENSION,
24
+ DROP_RATE_ATTENTION,
25
+ SEQUENCE,
26
+ SENTENCE,
27
+ )
28
+ from rasa.utils.tensorflow import layers
29
+ from rasa.utils.tensorflow.exceptions import TFLayerConfigException
30
+ from rasa.utils.tensorflow.transformer import TransformerEncoder
31
+ from rasa.nlu.constants import DEFAULT_TRANSFORMER_SIZE
32
+
33
+
34
+ class RasaCustomLayer(tf.keras.layers.Layer):
35
+ """Parent class for all classes in `rasa_layers.py`.
36
+
37
+ Allows a shared implementation for adjusting `DenseForSparse`
38
+ layers during incremental training.
39
+
40
+ During fine-tuning, sparse feature sizes might change due to addition of new data.
41
+ If this happens, we need to adjust our `DenseForSparse` layers to a new size.
42
+ `ConcatenateSparseDenseFeatures`, `RasaSequenceLayer` and
43
+ `RasaFeatureCombiningLayer` all inherit from `RasaCustomLayer` and thus can
44
+ change their own `DenseForSparse` layers if it's needed.
45
+ """
46
+
47
+ def adjust_sparse_layers_for_incremental_training(
48
+ self,
49
+ new_sparse_feature_sizes: Dict[Text, Dict[Text, List[int]]],
50
+ old_sparse_feature_sizes: Dict[Text, Dict[Text, List[int]]],
51
+ reg_lambda: float,
52
+ ) -> None:
53
+ """Finds and adjusts `DenseForSparse` layers during incremental training.
54
+
55
+ Recursively looks through the layers until it finds all the `DenseForSparse`
56
+ ones and adjusts those which have their sparse feature sizes increased.
57
+
58
+ This function heavily relies on the name of `DenseForSparse` layer being
59
+ in the following format - f"sparse_to_dense.{attribute}_{feature_type}" -
60
+ in order to correctly extract the attribute and feature type.
61
+
62
+ New and old sparse feature sizes could look like this:
63
+ {TEXT: {FEATURE_TYPE_SEQUENCE: [4, 24, 128], FEATURE_TYPE_SENTENCE: [4, 128]}}
64
+
65
+ Args:
66
+ new_sparse_feature_sizes: sizes of current sparse features.
67
+ old_sparse_feature_sizes: sizes of sparse features the model was
68
+ previously trained on.
69
+ reg_lambda: regularization constant.
70
+ """
71
+ for name, layer in self._tf_layers.items():
72
+ if isinstance(layer, RasaCustomLayer):
73
+ layer.adjust_sparse_layers_for_incremental_training(
74
+ new_sparse_feature_sizes=new_sparse_feature_sizes,
75
+ old_sparse_feature_sizes=old_sparse_feature_sizes,
76
+ reg_lambda=reg_lambda,
77
+ )
78
+ elif isinstance(layer, layers.DenseForSparse):
79
+ attribute = layer.get_attribute()
80
+ feature_type = layer.get_feature_type()
81
+ if (
82
+ attribute in new_sparse_feature_sizes
83
+ and feature_type in new_sparse_feature_sizes[attribute]
84
+ ):
85
+ new_feature_sizes = new_sparse_feature_sizes[attribute][
86
+ feature_type
87
+ ]
88
+ old_feature_sizes = old_sparse_feature_sizes[attribute][
89
+ feature_type
90
+ ]
91
+ if sum(new_feature_sizes) > sum(old_feature_sizes):
92
+ self._tf_layers[name] = self._replace_dense_for_sparse_layer(
93
+ layer_to_replace=layer,
94
+ new_sparse_feature_sizes=new_feature_sizes,
95
+ old_sparse_feature_sizes=old_feature_sizes,
96
+ attribute=attribute,
97
+ feature_type=feature_type,
98
+ reg_lambda=reg_lambda,
99
+ )
100
+
101
+ @staticmethod
102
+ def _replace_dense_for_sparse_layer(
103
+ layer_to_replace: layers.DenseForSparse,
104
+ new_sparse_feature_sizes: List[int],
105
+ old_sparse_feature_sizes: List[int],
106
+ attribute: Text,
107
+ feature_type: Text,
108
+ reg_lambda: float,
109
+ ) -> layers.DenseForSparse:
110
+ """Replaces a `DenseForSparse` layer with a new one.
111
+
112
+ Replaces an existing `DenseForSparse` layer with a new one
113
+ in order to adapt it to incremental training.
114
+
115
+ Args:
116
+ layer_to_replace: a `DenseForSparse` layer that is used to create a new one.
117
+ new_sparse_feature_sizes: sizes of sparse features that will be
118
+ the input of the layer.
119
+ old_sparse_feature_sizes: sizes of sparse features that used to be
120
+ the input of the layer.
121
+ attribute: an attribute of the data fed to the layer.
122
+ feature_type: a feature type of the data fed to the layer.
123
+ reg_lambda: regularization constant.
124
+
125
+ Returns:
126
+ New `DenseForSparse` layer.
127
+ """
128
+ kernel = layer_to_replace.get_kernel().numpy()
129
+ bias = layer_to_replace.get_bias()
130
+ if bias is not None:
131
+ bias = bias.numpy()
132
+ units = layer_to_replace.get_units()
133
+ # split kernel by feature sizes to update the layer accordingly
134
+ kernel_splits = []
135
+ splitting_index = 0
136
+ for size in old_sparse_feature_sizes:
137
+ kernel_splits.append(kernel[splitting_index : splitting_index + size, :])
138
+ splitting_index += size
139
+ additional_sizes = [
140
+ new_size - old_size
141
+ for new_size, old_size in zip(
142
+ new_sparse_feature_sizes, old_sparse_feature_sizes
143
+ )
144
+ ]
145
+ std, mean = np.std(kernel), np.mean(kernel)
146
+ additional_weights = [
147
+ np.random.normal(mean, std, size=(num_rows, units)).astype(np.float32)
148
+ for num_rows in additional_sizes
149
+ ]
150
+ merged_weights = [
151
+ np.vstack((existing, new))
152
+ for existing, new in zip(kernel_splits, additional_weights)
153
+ ]
154
+ # stack each merged weight to form a new weight tensor
155
+ new_weights = np.vstack(merged_weights)
156
+ kernel_init = tf.constant_initializer(new_weights)
157
+ bias_init = tf.constant_initializer(bias) if bias is not None else None
158
+ new_layer = layers.DenseForSparse(
159
+ name=f"sparse_to_dense.{attribute}_{feature_type}",
160
+ reg_lambda=reg_lambda,
161
+ units=units,
162
+ use_bias=bias is not None,
163
+ kernel_initializer=kernel_init,
164
+ bias_initializer=bias_init,
165
+ )
166
+ return new_layer
167
+
168
+
169
+ class ConcatenateSparseDenseFeatures(RasaCustomLayer):
170
+ """Combines multiple sparse and dense feature tensors into one dense tensor.
171
+
172
+ This layer combines features from various featurisers into a single feature array
173
+ per input example. All features must be of the same feature type, i.e. sentence-
174
+ level or sequence-level (token-level).
175
+
176
+ The layer combines a given list of tensors (whether sparse or dense) by:
177
+ 1. converting sparse tensors into dense ones
178
+ 2. optionally, applying dropout to sparse tensors before and/or after the conversion
179
+ 3. concatenating all tensors along the last dimension
180
+
181
+ Arguments:
182
+ attribute: Name of attribute (e.g. `text` or `label`) whose features will be
183
+ processed.
184
+ feature_type: Feature type to be processed -- `sequence` or `sentence`.
185
+ feature_type_signature: A list of signatures for the given attribute and feature
186
+ type.
187
+ config: A model config for correctly parametrising the layer.
188
+
189
+ Input shape:
190
+ Tuple containing one list of N-D tensors, each with shape: `(batch_size, ...,
191
+ input_dim)`.
192
+ All dense tensors must have the same shape, except possibly the last dimension.
193
+ All sparse tensors must have the same shape, including the last dimension.
194
+
195
+ Output shape:
196
+ N-D tensor with shape: `(batch_size, ..., units)` where `units` is the sum of
197
+ the last dimension sizes across all input tensors, with sparse tensors instead
198
+ contributing `config[DENSE_DIMENSION][attribute]` units each.
199
+
200
+ Raises:
201
+ A `TFLayerConfigException` if no feature signatures are provided.
202
+
203
+ Attributes:
204
+ output_units: The last dimension size of the layer's output.
205
+ """
206
+
207
+ SPARSE_DROPOUT = "sparse_dropout"
208
+ SPARSE_TO_DENSE = "sparse_to_dense"
209
+ DENSE_DROPOUT = "dense_dropout"
210
+
211
+ def __init__(
212
+ self,
213
+ attribute: Text,
214
+ feature_type: Text,
215
+ feature_type_signature: List[FeatureSignature],
216
+ config: Dict[Text, Any],
217
+ ) -> None:
218
+ """Creates a new `ConcatenateSparseDenseFeatures` object."""
219
+ if not feature_type_signature:
220
+ raise TFLayerConfigException(
221
+ "The feature type signature must contain some feature signatures."
222
+ )
223
+
224
+ super().__init__(
225
+ name=f"concatenate_sparse_dense_features_{attribute}_{feature_type}"
226
+ )
227
+
228
+ self._check_sparse_input_units(feature_type_signature)
229
+
230
+ self.output_units = self._calculate_output_units(
231
+ attribute, feature_type_signature, config
232
+ )
233
+
234
+ # Prepare dropout and sparse-to-dense layers if any sparse tensors are expected
235
+ self._tf_layers: Dict[Text, tf.keras.layers.Layer] = {}
236
+ if any([signature.is_sparse for signature in feature_type_signature]):
237
+ self._prepare_layers_for_sparse_tensors(attribute, feature_type, config)
238
+
239
+ def _check_sparse_input_units(
240
+ self, feature_type_signature: List[FeatureSignature]
241
+ ) -> None:
242
+ """Checks that all sparse features have the same last dimension size."""
243
+ sparse_units = [
244
+ feature_sig.units
245
+ for feature_sig in feature_type_signature
246
+ if feature_sig.is_sparse
247
+ ]
248
+ if len(set(sparse_units)) > 1:
249
+ raise TFLayerConfigException(
250
+ f"All sparse features must have the same last dimension size but found "
251
+ f"different sizes: {set(sparse_units)}."
252
+ )
253
+
254
+ def _prepare_layers_for_sparse_tensors(
255
+ self, attribute: Text, feature_type: Text, config: Dict[Text, Any]
256
+ ) -> None:
257
+ """Sets up sparse tensor pre-processing before combining with dense ones."""
258
+ # For optionally applying dropout to sparse tensors
259
+ if config[SPARSE_INPUT_DROPOUT]:
260
+ self._tf_layers[self.SPARSE_DROPOUT] = layers.SparseDropout(
261
+ rate=config[DROP_RATE]
262
+ )
263
+
264
+ # For converting sparse tensors to dense
265
+ self._tf_layers[self.SPARSE_TO_DENSE] = layers.DenseForSparse(
266
+ name=f"sparse_to_dense.{attribute}_{feature_type}",
267
+ units=config[DENSE_DIMENSION][attribute],
268
+ reg_lambda=config[REGULARIZATION_CONSTANT],
269
+ )
270
+
271
+ # For optionally apply dropout to sparse tensors after they're converted to
272
+ # dense tensors.
273
+ if config[DENSE_INPUT_DROPOUT]:
274
+ self._tf_layers[self.DENSE_DROPOUT] = tf.keras.layers.Dropout(
275
+ rate=config[DROP_RATE]
276
+ )
277
+
278
+ @staticmethod
279
+ def _calculate_output_units(
280
+ attribute: Text,
281
+ feature_type_signature: List[FeatureSignature],
282
+ config: Dict[Text, Any],
283
+ ) -> int:
284
+ """Determines the output units from the provided feature signatures.
285
+
286
+ Sparse features will be turned into dense ones, hence they each contribute with
287
+ their future dense number of units.
288
+ """
289
+ return sum(
290
+ [
291
+ config[DENSE_DIMENSION][attribute]
292
+ if signature.is_sparse
293
+ else signature.units
294
+ for signature in feature_type_signature
295
+ ]
296
+ )
297
+
298
+ def _process_sparse_feature(
299
+ self, feature: tf.SparseTensor, training: bool
300
+ ) -> tf.Tensor:
301
+ """Turns sparse tensor into dense, possibly adds dropout before and/or after."""
302
+ if self.SPARSE_DROPOUT in self._tf_layers:
303
+ feature = self._tf_layers[self.SPARSE_DROPOUT](feature, training)
304
+
305
+ feature = self._tf_layers[self.SPARSE_TO_DENSE](feature)
306
+
307
+ if self.DENSE_DROPOUT in self._tf_layers:
308
+ feature = self._tf_layers[self.DENSE_DROPOUT](feature, training)
309
+
310
+ return feature
311
+
312
+ def call(
313
+ self,
314
+ inputs: Tuple[List[Union[tf.Tensor, tf.SparseTensor]]],
315
+ training: bool = False,
316
+ ) -> tf.Tensor:
317
+ """Combines sparse and dense feature tensors into one tensor.
318
+
319
+ Arguments:
320
+ inputs: Contains the input tensors, all of the same rank.
321
+ training: A flag indicating whether the layer should behave in training mode
322
+ (applying dropout to sparse tensors if applicable) or in inference mode
323
+ (not applying dropout).
324
+
325
+ Returns:
326
+ Single tensor with all input tensors combined along the last dimension.
327
+ """
328
+ features = inputs[0]
329
+
330
+ dense_features = []
331
+ for f in features:
332
+ if isinstance(f, tf.SparseTensor):
333
+ f = self._process_sparse_feature(f, training)
334
+ dense_features.append(f)
335
+
336
+ # Now that all features are made dense, concatenate them along the last (units)
337
+ # dimension.
338
+ return tf.concat(dense_features, axis=-1)
339
+
340
+
341
+ class RasaFeatureCombiningLayer(RasaCustomLayer):
342
+ """Combines multiple dense or sparse feature tensors into one.
343
+
344
+ This layer combines features by following these steps:
345
+ 1. Apply a `ConcatenateSparseDenseFeatures` layer separately to sequence- and
346
+ sentence-level features, yielding two tensors (one for each feature type).
347
+ 2. Concatenate the sequence- and sentence-level tensors along the sequence dimension
348
+ by appending sentence-level features at the first available token position after
349
+ the sequence-level (token-level) features.
350
+
351
+ Arguments:
352
+ attribute: Name of attribute (e.g. `text` or `label`) whose features will be
353
+ processed.
354
+ attribute_signature: A dictionary containing two lists of feature signatures,
355
+ one for each feature type (`sequence` or `sentence`) of the given attribute.
356
+ config: A model config used for correctly parameterising the layer and the
357
+ `ConcatenateSparseDenseFeatures` layer it uses internally.
358
+
359
+ Input shape:
360
+ Tuple of three input tensors:
361
+ sequence_features: List of 3-D dense or sparse tensors, each with shape
362
+ `(batch_size, max_seq_length, input_dim)` where `input_dim` can be
363
+ different for sparse vs dense tensors. See the input shape of
364
+ `ConcatenateSparseDenseFeatures` for more information.
365
+ sentence_features: List of 3-D dense or sparse tensors, each with shape
366
+ `(batch_size, 1, input_dim)` where `input_dim` can be different for
367
+ sparse vs dense tensors, and can differ from that in
368
+ `sequence_features`. See the input shape of
369
+ `ConcatenateSparseDenseFeatures` for more information.
370
+ sequence_feature_lengths: Dense tensor of shape `(batch_size, )`.
371
+
372
+ Output shape:
373
+ combined_features: A 3-D tensor with shape `(batch_size, sequence_length,
374
+ units)` where `units` is completely determined by the internally applied
375
+ `ConcatenateSparseDenseFeatures` layer and `sequence_length` is the combined
376
+ length of sequence- and sentence-level features: `max_seq_length + 1` if
377
+ both feature types are present, `max_seq_length` if only sequence-level
378
+ features are present, and 1 if only sentence-level features are present).
379
+ mask_combined_sequence_sentence: A 3-D tensor with shape
380
+ `(batch_size, sequence_length, 1)`.
381
+
382
+ Raises:
383
+ A `TFLayerConfigException` if no feature signatures are provided.
384
+
385
+ Attributes:
386
+ output_units: The last dimension size of the layer's `combined_features` output.
387
+ """
388
+
389
+ def __init__(
390
+ self,
391
+ attribute: Text,
392
+ attribute_signature: Dict[Text, List[FeatureSignature]],
393
+ config: Dict[Text, Any],
394
+ ) -> None:
395
+ """Creates a new `RasaFeatureCombiningLayer` object."""
396
+ if not attribute_signature or not (
397
+ attribute_signature.get(SENTENCE, [])
398
+ or attribute_signature.get(SEQUENCE, [])
399
+ ):
400
+ raise TFLayerConfigException(
401
+ "The attribute signature must contain some feature signatures."
402
+ )
403
+
404
+ super().__init__(name=f"rasa_feature_combining_layer_{attribute}")
405
+
406
+ self._tf_layers: Dict[Text, tf.keras.layers.Layer] = {}
407
+
408
+ # Prepare sparse-dense combining layers for each present feature type
409
+ self._feature_types_present = self._get_present_feature_types(
410
+ attribute_signature
411
+ )
412
+ self._prepare_sparse_dense_concat_layers(attribute, attribute_signature, config)
413
+
414
+ # Prepare components for combining sequence- and sentence-level features
415
+ self._prepare_sequence_sentence_concat(attribute, config)
416
+
417
+ self.output_units = self._calculate_output_units(attribute, config)
418
+
419
+ @staticmethod
420
+ def _get_present_feature_types(
421
+ attribute_signature: Dict[Text, List[FeatureSignature]],
422
+ ) -> Dict[Text, bool]:
423
+ """Determines feature types that are present.
424
+
425
+ Knowing which feature types are present is important because many downstream
426
+ operations depend on it, e.g. combining sequence- and sentence-level features
427
+ is only done if both feature types are present.
428
+ """
429
+ return {
430
+ feature_type: (
431
+ feature_type in attribute_signature
432
+ and len(attribute_signature[feature_type]) > 0
433
+ )
434
+ for feature_type in [SEQUENCE, SENTENCE]
435
+ }
436
+
437
+ def _prepare_sparse_dense_concat_layers(
438
+ self,
439
+ attribute: Text,
440
+ attribute_signature: Dict[Text, List[FeatureSignature]],
441
+ config: Dict[Text, Any],
442
+ ) -> None:
443
+ """Prepares sparse-dense combining layers for all present feature types."""
444
+ for feature_type, present in self._feature_types_present.items():
445
+ if not present:
446
+ continue
447
+ self._tf_layers[f"sparse_dense.{feature_type}"] = (
448
+ ConcatenateSparseDenseFeatures(
449
+ attribute=attribute,
450
+ feature_type=feature_type,
451
+ feature_type_signature=attribute_signature[feature_type],
452
+ config=config,
453
+ )
454
+ )
455
+
456
+ def _prepare_sequence_sentence_concat(
457
+ self, attribute: Text, config: Dict[Text, Any]
458
+ ) -> None:
459
+ """Sets up combining sentence- and sequence-level features (if needed).
460
+
461
+ This boils down to preparing for unifying the units of the sequence- and
462
+ sentence-level features if they differ -- the same number of units is required
463
+ for combining the features.
464
+ """
465
+ if (
466
+ self._feature_types_present[SEQUENCE]
467
+ and self._feature_types_present[SENTENCE]
468
+ ):
469
+ # The output units of this layer will be based on the output sizes of the
470
+ # sparse+dense combining layers that are internally applied to all features.
471
+ sequence_units = self._tf_layers[f"sparse_dense.{SEQUENCE}"].output_units
472
+ sentence_units = self._tf_layers[f"sparse_dense.{SENTENCE}"].output_units
473
+
474
+ # Last dimension needs to be unified if sequence- and sentence-level
475
+ # features have different sizes, e.g. due to being produced by different
476
+ # featurizers.
477
+ if sequence_units != sentence_units:
478
+ for feature_type in [SEQUENCE, SENTENCE]:
479
+ self._tf_layers[
480
+ f"unify_dims_before_seq_sent_concat.{feature_type}"
481
+ ] = layers.Ffnn(
482
+ layer_name_suffix=f"unify_dims.{attribute}_{feature_type}",
483
+ layer_sizes=[config[CONCAT_DIMENSION][attribute]],
484
+ dropout_rate=config[DROP_RATE],
485
+ reg_lambda=config[REGULARIZATION_CONSTANT],
486
+ density=config[CONNECTION_DENSITY],
487
+ )
488
+
489
+ def _calculate_output_units(self, attribute: Text, config: Dict[Text, Any]) -> int:
490
+ """Calculates the number of output units for this layer class.
491
+
492
+ The number depends mainly on whether dimension unification is used or not.
493
+ """
494
+ # If dimension unification is used, output units are determined by the unifying
495
+ # layers.
496
+ if (
497
+ f"unify_dims_before_seq_sent_concat.{SEQUENCE}" in self._tf_layers
498
+ or f"unify_dims_before_seq_sent_concat.{SENTENCE}" in self._tf_layers
499
+ ):
500
+ return config[CONCAT_DIMENSION][attribute]
501
+ # Without dimension unification, the units from the underlying sparse_dense
502
+ # layers are carried over and should be the same for sequence-level features
503
+ # (if present) as for sentence-level features.
504
+ elif self._feature_types_present[SEQUENCE]:
505
+ return self._tf_layers[f"sparse_dense.{SEQUENCE}"].output_units
506
+ return self._tf_layers[f"sparse_dense.{SENTENCE}"].output_units
507
+
508
+ def _concat_sequence_sentence_features(
509
+ self,
510
+ sequence_tensor: tf.Tensor,
511
+ sentence_tensor: tf.Tensor,
512
+ mask_combined_sequence_sentence: tf.Tensor,
513
+ ) -> tf.Tensor:
514
+ """Concatenates sequence- & sentence-level features along sequence dimension."""
515
+ # If needed, pass both feature types through a dense layer to bring them to the
516
+ # same shape.
517
+ if f"unify_dims_before_seq_sent_concat.{SEQUENCE}" in self._tf_layers:
518
+ sequence_tensor = self._tf_layers[
519
+ f"unify_dims_before_seq_sent_concat.{SEQUENCE}"
520
+ ](sequence_tensor)
521
+ if f"unify_dims_before_seq_sent_concat.{SENTENCE}" in self._tf_layers:
522
+ sentence_tensor = self._tf_layers[
523
+ f"unify_dims_before_seq_sent_concat.{SENTENCE}"
524
+ ](sentence_tensor)
525
+
526
+ # mask_combined_sequence_sentence has for each input example a sequence of 1s of
527
+ # the length seq_length+1, where seq_length is the number of real tokens. The
528
+ # rest is 0s which form a padding up to the max. sequence length + 1 (max.
529
+ # number of real tokens + 1). Here the mask is turned into a mask that has 0s
530
+ # everywhere and 1 only at the immediate next position after the last real
531
+ # token's position for a given input example. Example (batch size = 2, sequence
532
+ # lengths = [1, 2]):
533
+ # [[[1], [0], [0]], ___\ [[[0], [1], [0]],
534
+ # [[1], [1], [0]]] / [[0], [0], [1]]]
535
+ sentence_feature_positions_mask = (
536
+ mask_combined_sequence_sentence
537
+ * tf.math.cumprod(
538
+ 1 - mask_combined_sequence_sentence,
539
+ axis=1,
540
+ exclusive=True,
541
+ reverse=True,
542
+ )
543
+ )
544
+
545
+ # The new mask is used to distribute the sentence features at the sequence
546
+ # positions marked by 1s. The sentence features' dimensionality effectively
547
+ # changes from `(batch_size, 1, feature_dim)` to `(batch_size, max_seq_length+1,
548
+ # feature_dim)`, but the array is sparse, with real features present only at
549
+ # positions determined by 1s in the mask.
550
+ sentence_tensor = sentence_feature_positions_mask * sentence_tensor
551
+
552
+ # Padding of sequence-level features is increased by 1 in the sequence
553
+ # dimension to match the shape of modified sentence-level features.
554
+ sequence_tensor = tf.pad(sequence_tensor, [[0, 0], [0, 1], [0, 0]])
555
+
556
+ # Sequence- and sentence-level features effectively get concatenated by
557
+ # summing the two padded feature arrays like this (batch size = 1):
558
+ # [[seq1, seq2, seq3, 0, 0]] + [[0, 0, 0, sent1, 0]] =
559
+ # = [[seq1, seq2, seq3, sent1, 0]]
560
+ return sequence_tensor + sentence_tensor
561
+
562
+ def _combine_sequence_level_features(
563
+ self,
564
+ sequence_features: List[Union[tf.Tensor, tf.SparseTensor]],
565
+ mask_sequence: tf.Tensor,
566
+ training: bool,
567
+ ) -> Optional[tf.Tensor]:
568
+ """Processes & combines sequence-level features if any are present."""
569
+ if self._feature_types_present[SEQUENCE]:
570
+ sequence_features_combined = self._tf_layers[f"sparse_dense.{SEQUENCE}"](
571
+ (sequence_features,), training=training
572
+ )
573
+
574
+ # Apply mask which has 1s at positions of real tokens and 0s at all padded
575
+ # token positions. This is needed because the sparse+dense combining layer
576
+ # might've turned some fake (padded) features (i.e. 0s) into non-zero
577
+ # numbers and we want those to become zeros again.
578
+ # This step isn't needed for sentence-level features because those are never
579
+ # padded -- the effective sequence length in their case is always 1.
580
+ return sequence_features_combined * mask_sequence
581
+
582
+ return None
583
+
584
+ def _combine_sentence_level_features(
585
+ self,
586
+ sentence_features: List[Union[tf.Tensor, tf.SparseTensor]],
587
+ sequence_feature_lengths: tf.Tensor,
588
+ training: bool,
589
+ ) -> Tuple[Optional[tf.Tensor], Optional[tf.Tensor]]:
590
+ """Processes & combines sentence-level features if any are present."""
591
+ if self._feature_types_present[SENTENCE]:
592
+ sentence_features_combined = self._tf_layers[f"sparse_dense.{SENTENCE}"](
593
+ (sentence_features,), training=training
594
+ )
595
+ # Sentence-level features have sequence dimension of length 1, add it to
596
+ # sequence-level feature lengths.
597
+ combined_sequence_sentence_feature_lengths = sequence_feature_lengths + 1
598
+
599
+ else:
600
+ sentence_features_combined = None
601
+
602
+ # Without sentence-level features, the feature sequence lengths are
603
+ # completely determined by sequence-level features.
604
+ combined_sequence_sentence_feature_lengths = sequence_feature_lengths
605
+
606
+ return sentence_features_combined, combined_sequence_sentence_feature_lengths
607
+
608
+ def call(
609
+ self,
610
+ inputs: Tuple[
611
+ List[Union[tf.Tensor, tf.SparseTensor]],
612
+ List[Union[tf.Tensor, tf.SparseTensor]],
613
+ tf.Tensor,
614
+ ],
615
+ training: bool = False,
616
+ ) -> Tuple[tf.Tensor, tf.Tensor]:
617
+ """Combines multiple 3-D dense/sparse feature tensors into one.
618
+
619
+ Arguments:
620
+ inputs: Tuple containing:
621
+ sequence_features: Dense or sparse tensors representing different
622
+ token-level features.
623
+ sentence_features: Dense or sparse tensors representing sentence-level
624
+ features.
625
+ sequence_feature_lengths: A tensor containing the real sequence length
626
+ (the number of real -- not padding -- tokens) for each example in
627
+ the batch.
628
+ training: A flag indicating whether the layer should behave in training mode
629
+ (applying dropout to sparse tensors if applicable) or in inference mode
630
+ (not applying dropout).
631
+
632
+ Returns:
633
+ combined features: A tensor containing all the features combined.
634
+ mask_combined_sequence_sentence: A binary mask with 1s in place of real
635
+ features in the combined feature tensor, and 0s in padded positions with
636
+ fake features.
637
+ """
638
+ sequence_features = inputs[0]
639
+ sentence_features = inputs[1]
640
+ sequence_feature_lengths = inputs[2]
641
+
642
+ # This mask is specifically for sequence-level features.
643
+ mask_sequence = compute_mask(sequence_feature_lengths)
644
+
645
+ sequence_features_combined = self._combine_sequence_level_features(
646
+ sequence_features, mask_sequence, training
647
+ )
648
+
649
+ (
650
+ sentence_features_combined,
651
+ combined_sequence_sentence_feature_lengths,
652
+ ) = self._combine_sentence_level_features(
653
+ sentence_features, sequence_feature_lengths, training
654
+ )
655
+
656
+ mask_combined_sequence_sentence = compute_mask(
657
+ combined_sequence_sentence_feature_lengths
658
+ )
659
+
660
+ # If both feature types are present, combine them. Otherwise, just the present
661
+ # feature type will be returned.
662
+ if (
663
+ sequence_features_combined is not None
664
+ and sentence_features_combined is not None
665
+ ):
666
+ features_to_return = self._concat_sequence_sentence_features(
667
+ sequence_features_combined,
668
+ sentence_features_combined,
669
+ mask_combined_sequence_sentence,
670
+ )
671
+ elif sequence_features_combined is not None:
672
+ features_to_return = sequence_features_combined
673
+ else:
674
+ features_to_return = sentence_features_combined
675
+
676
+ return features_to_return, mask_combined_sequence_sentence
677
+
678
+
679
+ class RasaSequenceLayer(RasaCustomLayer):
680
+ """Creates an embedding from all features for a sequence attribute; facilitates MLM.
681
+
682
+ This layer combines all features for an attribute and embeds them using a
683
+ transformer, optionally doing masked language modeling. The layer is meant only for
684
+ attributes with sequence-level features, such as `text`, `response` and
685
+ `action_text`.
686
+
687
+ Internally, this layer applies the following steps:
688
+ 1. Combine features using `RasaFeatureCombiningLayer`.
689
+ 2. Apply a dense layer(s) to the combined features.
690
+ 3. Optionally, and only during training for the `text` attribute, apply masking to
691
+ the features and create further helper variables for masked language modeling.
692
+ 4. Embed the features using a transformer, effectively reducing variable-length
693
+ sequences of features to fixed-size embeddings.
694
+
695
+ Arguments:
696
+ attribute: Name of attribute (e.g. `text` or `label`) whose features will be
697
+ processed.
698
+ attribute_signature: A dictionary containing two lists of feature signatures,
699
+ one for each feature type (`sentence` or `sequence`) of the given attribute.
700
+ config: A model config used for correctly parameterising the underlying layers.
701
+
702
+ Input shape:
703
+ Tuple of three input tensors:
704
+ sequence_features: List of 3-D dense or sparse tensors, each with shape
705
+ `(batch_size, max_seq_length, input_dim)` where `input_dim` can be
706
+ different for sparse vs dense tensors. See the input shape of
707
+ `ConcatenateSparseDenseFeatures` for more information.
708
+ sentence_features: List of 3-D dense or sparse tensors, each with shape
709
+ `(batch_size, 1, input_dim)` where `input_dim` can be different for
710
+ sparse vs dense tensors, and can differ from that in
711
+ `sequence_features`. See the input shape of
712
+ `ConcatenateSparseDenseFeatures` for more information.
713
+ sequence_feature_lengths: Dense tensor of shape `(batch_size, )`.
714
+
715
+ Output shape:
716
+ outputs: `(batch_size, seq_length, units)` where `units` matches the underlying
717
+ transformer's output size (if present), otherwise it matches the output size
718
+ of the `Ffnn` block applied to the combined features, or it's the output
719
+ size of the underlying `RasaFeatureCombiningLayer` if the `Ffnn` block has 0
720
+ layers. `seq_length` is the sum of the sequence dimension
721
+ sizes of sequence- and sentence-level features (for details, see the output
722
+ shape of `RasaFeatureCombiningLayer`). If both feature types are present,
723
+ then `seq_length` will be 1 + the length of the longest sequence of real
724
+ tokens across all examples in the given batch.
725
+ seq_sent_features: `(batch_size, seq_length, hidden_dim)`, where `hidden_dim` is
726
+ the output size of the underlying `Ffnn` block, or the output size of the
727
+ underlying `RasaFeatureCombiningLayer` if the `Ffnn` block has 0 layers.
728
+ mask_combined_sequence_sentence: `(batch_size, seq_length, 1)`
729
+ token_ids: `(batch_size, seq_length, id_dim)`. `id_dim` is 2 when no dense
730
+ sequence-level features are present. Otherwise, it's arbitrarily chosen to
731
+ match the last dimension size of the first dense sequence-level feature in
732
+ the input list of features.
733
+ mlm_boolean_mask: `(batch_size, seq_length, 1)`, empty tensor if not doing MLM.
734
+ attention_weights: `(transformer_layers, batch_size, num_transformer_heads,
735
+ seq_length, seq_length)`, empty tensor if the transformer has 0 layers.
736
+
737
+ Raises:
738
+ A `TFLayerConfigException` if no feature signatures for sequence-level features
739
+ are provided.
740
+
741
+ Attributes:
742
+ output_units: The last dimension size of the layer's first output (`outputs`).
743
+ """
744
+
745
+ FEATURE_COMBINING = "feature_combining"
746
+ FFNN = "ffnn"
747
+ TRANSFORMER = "transformer"
748
+ MLM_INPUT_MASK = "mlm_input_mask"
749
+ SPARSE_TO_DENSE_FOR_TOKEN_IDS = "sparse_to_dense_for_token_ids"
750
+
751
+ def __init__(
752
+ self,
753
+ attribute: Text,
754
+ attribute_signature: Dict[Text, List[FeatureSignature]],
755
+ config: Dict[Text, Any],
756
+ ) -> None:
757
+ """Creates a new `RasaSequenceLayer` object."""
758
+ if not attribute_signature or not attribute_signature.get(SEQUENCE, []):
759
+ raise TFLayerConfigException(
760
+ "The attribute signature must contain some sequence-level feature"
761
+ "signatures but none were found."
762
+ )
763
+
764
+ super().__init__(name=f"rasa_sequence_layer_{attribute}")
765
+
766
+ self._tf_layers: Dict[Text, Any] = {
767
+ self.FEATURE_COMBINING: RasaFeatureCombiningLayer(
768
+ attribute, attribute_signature, config
769
+ ),
770
+ self.FFNN: layers.Ffnn(
771
+ config[HIDDEN_LAYERS_SIZES][attribute],
772
+ config[DROP_RATE],
773
+ config[REGULARIZATION_CONSTANT],
774
+ config[CONNECTION_DENSITY],
775
+ layer_name_suffix=attribute,
776
+ ),
777
+ }
778
+
779
+ self._enables_mlm = False
780
+ # Note: Within TED, masked language modeling becomes just input dropout,
781
+ # since there is no loss term associated with predicting the masked tokens.
782
+ self._prepare_masked_language_modeling(attribute, attribute_signature, config)
783
+
784
+ transformer_layers, transformer_units = self._prepare_transformer(
785
+ attribute, config
786
+ )
787
+ self._has_transformer = transformer_layers > 0
788
+
789
+ self.output_units = self._calculate_output_units(
790
+ attribute, transformer_layers, transformer_units, config
791
+ )
792
+
793
+ @staticmethod
794
+ def _get_transformer_dimensions(
795
+ attribute: Text, config: Dict[Text, Any]
796
+ ) -> Tuple[int, int]:
797
+ """Determines # of transformer layers & output size from the model config.
798
+
799
+ The config can contain these directly (same for all attributes) or specified
800
+ separately for each attribute.
801
+ If a transformer is used (e.i. if `number_of_transformer_layers` is positive),
802
+ the default `transformer_size` which is `None` breaks things. Thus,
803
+ we need to set a reasonable default value so that the model works fine.
804
+ """
805
+ transformer_layers = config[NUM_TRANSFORMER_LAYERS]
806
+ if isinstance(transformer_layers, dict):
807
+ transformer_layers = transformer_layers[attribute]
808
+ transformer_units = config[TRANSFORMER_SIZE]
809
+ if isinstance(transformer_units, dict):
810
+ transformer_units = transformer_units[attribute]
811
+ if transformer_layers > 0 and (not transformer_units or transformer_units < 1):
812
+ transformer_units = DEFAULT_TRANSFORMER_SIZE
813
+
814
+ return transformer_layers, transformer_units
815
+
816
+ def _prepare_transformer(
817
+ self, attribute: Text, config: Dict[Text, Any]
818
+ ) -> Tuple[int, int]:
819
+ """Creates a transformer & returns its number of layers and output units."""
820
+ transformer_layers, transformer_units = self._get_transformer_dimensions(
821
+ attribute, config
822
+ )
823
+ self._tf_layers[self.TRANSFORMER] = prepare_transformer_layer(
824
+ attribute_name=attribute,
825
+ config=config,
826
+ num_layers=transformer_layers,
827
+ units=transformer_units,
828
+ drop_rate=config[DROP_RATE],
829
+ unidirectional=config[UNIDIRECTIONAL_ENCODER],
830
+ )
831
+ return transformer_layers, transformer_units
832
+
833
+ def _prepare_masked_language_modeling(
834
+ self,
835
+ attribute: Text,
836
+ attribute_signature: Dict[Text, List[FeatureSignature]],
837
+ config: Dict[Text, Any],
838
+ ) -> None:
839
+ """Prepares masking and computing helper variables for masked language modeling.
840
+
841
+ Only done for the text attribute and only if sequence-level (token-level)
842
+ features are present (MLM requires token-level information).
843
+ """
844
+ if attribute == TEXT and SEQUENCE in attribute_signature and config[MASKED_LM]:
845
+ self._enables_mlm = True
846
+ self._tf_layers[self.MLM_INPUT_MASK] = layers.InputMask()
847
+
848
+ # Unique IDs of different token types are needed to construct the possible
849
+ # label space for MLM. If dense features are present, they're used as such
850
+ # IDs, othwerise sparse features are embedded by a non-trainable
851
+ # DenseForSparse layer to create small embeddings that serve as IDs.
852
+ expect_dense_seq_features = any(
853
+ [not signature.is_sparse for signature in attribute_signature[SEQUENCE]]
854
+ )
855
+ if not expect_dense_seq_features:
856
+ self._tf_layers[self.SPARSE_TO_DENSE_FOR_TOKEN_IDS] = (
857
+ layers.DenseForSparse(
858
+ units=2,
859
+ use_bias=False,
860
+ trainable=False,
861
+ name=f"{self.SPARSE_TO_DENSE_FOR_TOKEN_IDS}.{attribute}",
862
+ )
863
+ )
864
+
865
+ def _calculate_output_units(
866
+ self,
867
+ attribute: Text,
868
+ transformer_layers: int,
869
+ transformer_units: int,
870
+ config: Dict[Text, Any],
871
+ ) -> int:
872
+ """Determines the output units based on what layer components are present.
873
+
874
+ The size depends on which component is the last created one in the internal
875
+ pipeline that is `RasaFeatureCombiningLayer` -> `Ffnn` -> `Transformer`, since
876
+ not all the components are always created.
877
+ """
878
+ # transformer is the last component
879
+ if transformer_layers > 0:
880
+ return transformer_units
881
+
882
+ # the Ffnn block is the last component
883
+ if len(config[HIDDEN_LAYERS_SIZES][attribute]) > 0:
884
+ # this is the output size of the last layer of the Ffnn block
885
+ return config[HIDDEN_LAYERS_SIZES][attribute][-1]
886
+
887
+ # only the RasaFeatureCombiningLayer is present
888
+ return self._tf_layers[self.FEATURE_COMBINING].output_units
889
+
890
+ def _features_as_token_ids(
891
+ self, features: List[Union[tf.Tensor, tf.SparseTensor]]
892
+ ) -> Optional[tf.Tensor]:
893
+ """Creates dense labels (token IDs) used for negative sampling in MLM."""
894
+ # If there are dense features, we use them as labels - taking the first dense
895
+ # feature in the list, but any other dense feature would do the job.
896
+ for f in features:
897
+ if not isinstance(f, tf.SparseTensor):
898
+ return tf.stop_gradient(f)
899
+
900
+ # If no dense features are found, use a sparse feature but convert it into
901
+ # a dense one first.
902
+ for f in features:
903
+ if isinstance(f, tf.SparseTensor):
904
+ return tf.stop_gradient(
905
+ self._tf_layers[self.SPARSE_TO_DENSE_FOR_TOKEN_IDS](f)
906
+ )
907
+
908
+ return None
909
+
910
+ def _create_mlm_tensors(
911
+ self,
912
+ sequence_features: List[Union[tf.Tensor, tf.SparseTensor]],
913
+ seq_sent_features: tf.Tensor,
914
+ mask_sequence: tf.Tensor,
915
+ sentence_features_present: bool,
916
+ training: bool,
917
+ ) -> Tuple[tf.Tensor, tf.Tensor, tf.Tensor]:
918
+ """Produces helper variables for masked language modelling (only in training).
919
+
920
+ The `token_ids` embeddings can be viewed as token-level labels/unique IDs of all
921
+ input tokens (to be used later in the MLM loss) because these embeddings aren't
922
+ affected by dropout or masking and are effectively always unique for different
923
+ input tokens (and same for the same tokens).
924
+ `token_ids` share the batch and sequence dimension with the combined sequence-
925
+ and sentence-level features, the last dimension is unimportant and mimics the
926
+ first dense sequence-level feature in the list of features, or alternatively the
927
+ last dimension will have size 2 if there are only sparse sequence features
928
+ present.
929
+ """
930
+ token_ids = self._features_as_token_ids(sequence_features)
931
+
932
+ # Pad in the sequence dimension to match the shape of combined sequence- and
933
+ # sentence-level features. This means padding by 1 if sentence-level features
934
+ # are present (those effectively have sequence length of 1) and not padding
935
+ # otherwise.
936
+ if sentence_features_present:
937
+ token_ids = tf.pad(token_ids, [[0, 0], [0, 1], [0, 0]])
938
+ mask_sequence = tf.pad(mask_sequence, [[0, 0], [0, 1], [0, 0]])
939
+
940
+ # mlm_boolean_mask has the same shape as the tensor with all combined features
941
+ # (except the last dimension), with True meaning tokens that are masked and
942
+ # False meaning tokens that aren't masked or that are fake (padded) tokens.
943
+ # Note that only sequence-level features are masked, nothing happens to the
944
+ # sentence-level features in the combined features tensor.
945
+ seq_sent_features, mlm_boolean_mask = self._tf_layers[self.MLM_INPUT_MASK](
946
+ seq_sent_features, mask_sequence, training
947
+ )
948
+
949
+ return seq_sent_features, token_ids, mlm_boolean_mask
950
+
951
+ def call(
952
+ self,
953
+ inputs: Tuple[
954
+ List[Union[tf.Tensor, tf.SparseTensor]],
955
+ List[Union[tf.Tensor, tf.SparseTensor]],
956
+ tf.Tensor,
957
+ ],
958
+ training: bool = False,
959
+ ) -> Tuple[tf.Tensor, tf.Tensor, tf.Tensor, tf.Tensor, tf.Tensor, tf.Tensor]:
960
+ """Combines all of an attribute's features and embeds using a transformer.
961
+
962
+ Arguments:
963
+ inputs: Tuple containing:
964
+ sequence_features: Dense or sparse tensors representing different
965
+ token-level features.
966
+ sentence_features: Dense or sparse tensors representing different
967
+ sentence-level features.
968
+ sequence_feature_lengths: A tensor containing the real sequence length
969
+ (the number of real -- not padding -- tokens) for each example in
970
+ the batch.
971
+ training: A flag indicating whether the layer should behave in training mode
972
+ (applying dropout to sparse tensors if applicable) or in inference mode
973
+ (not applying dropout).
974
+
975
+ Returns:
976
+ outputs: Tensor with all features combined, masked (if doing MLM) and
977
+ embedded with a transformer.
978
+ seq_sent_features: Tensor with all features combined from just before the
979
+ masking and transformer is applied
980
+ mask_combined_sequence_sentence: A binary mask with 1s in place of real
981
+ features in the combined feature tensor, and 0s in padded positions with
982
+ fake features.
983
+ token_ids: Tensor with dense token-level features which can serve as
984
+ IDs (unique embeddings) of all the different tokens found in the batch.
985
+ Empty tensor if not doing MLM.
986
+ mlm_boolean_mask: A boolean mask with `True` where real tokens in `outputs`
987
+ were masked and `False` elsewhere. Empty tensor if not doing MLM.
988
+ attention_weights: Tensor containing self-attention weights received
989
+ from the underlying transformer. Empty tensor if the transformer has 0
990
+ layers.
991
+ """
992
+ sequence_features = inputs[0]
993
+ sentence_features = inputs[1]
994
+ sequence_feature_lengths = inputs[2]
995
+
996
+ # Combine all features (sparse/dense, sequence-/sentence-level) into one tensor,
997
+ # also get a binary mask that has 1s at positions with real features and 0s at
998
+ # padded positions.
999
+ seq_sent_features, mask_combined_sequence_sentence = self._tf_layers[
1000
+ self.FEATURE_COMBINING
1001
+ ]((sequence_features, sentence_features, sequence_feature_lengths))
1002
+
1003
+ # Apply one or more dense layers.
1004
+ seq_sent_features = self._tf_layers[self.FFNN](seq_sent_features, training)
1005
+
1006
+ # If using masked language modeling, mask the transformer inputs and get labels
1007
+ # for the masked tokens and a boolean mask. Note that TED does not use MLM loss,
1008
+ # hence using masked language modeling (if enabled) becomes just input dropout.
1009
+ if self._enables_mlm and training:
1010
+ mask_sequence = compute_mask(sequence_feature_lengths)
1011
+ (
1012
+ seq_sent_features_masked,
1013
+ token_ids,
1014
+ mlm_boolean_mask,
1015
+ ) = self._create_mlm_tensors(
1016
+ sequence_features,
1017
+ seq_sent_features,
1018
+ mask_sequence,
1019
+ sentence_features_present=len(sentence_features) > 0,
1020
+ training=training,
1021
+ )
1022
+ else:
1023
+ # tf.zeros((0,)) is an alternative to None
1024
+ token_ids = tf.zeros((0,))
1025
+ mlm_boolean_mask = tf.zeros((0,))
1026
+ seq_sent_features_masked = seq_sent_features
1027
+
1028
+ # Apply the transformer (if present), hence reducing a sequences of features per
1029
+ # input example into a simple fixed-size embedding.
1030
+ if self._has_transformer:
1031
+ mask_padding = 1 - mask_combined_sequence_sentence
1032
+ outputs, attention_weights = self._tf_layers[self.TRANSFORMER](
1033
+ seq_sent_features_masked, mask_padding, training
1034
+ )
1035
+ outputs = tf.nn.gelu(outputs)
1036
+ else:
1037
+ # tf.zeros((0,)) is an alternative to None
1038
+ outputs, attention_weights = seq_sent_features_masked, tf.zeros((0,))
1039
+
1040
+ return (
1041
+ outputs,
1042
+ seq_sent_features,
1043
+ mask_combined_sequence_sentence,
1044
+ token_ids,
1045
+ mlm_boolean_mask,
1046
+ attention_weights,
1047
+ )
1048
+
1049
+
1050
+ def compute_mask(sequence_lengths: tf.Tensor) -> tf.Tensor:
1051
+ """Computes binary mask given real sequence lengths.
1052
+
1053
+ Takes a 1-D tensor of shape `(batch_size,)` containing the lengths of sequences
1054
+ (in terms of number of tokens) in the batch. Creates a binary mask of shape
1055
+ `(batch_size, max_seq_length, 1)` with 1s at positions with real tokens and 0s
1056
+ elsewhere.
1057
+ """
1058
+ mask = tf.sequence_mask(sequence_lengths, dtype=tf.float32)
1059
+ return tf.expand_dims(mask, -1)
1060
+
1061
+
1062
+ def prepare_transformer_layer(
1063
+ attribute_name: Text,
1064
+ config: Dict[Text, Any],
1065
+ num_layers: int,
1066
+ units: int,
1067
+ drop_rate: float,
1068
+ unidirectional: bool,
1069
+ ) -> Union[
1070
+ TransformerEncoder,
1071
+ Callable[
1072
+ [tf.Tensor, Optional[tf.Tensor], Optional[Union[tf.Tensor, bool]]],
1073
+ Tuple[tf.Tensor, Optional[tf.Tensor]],
1074
+ ],
1075
+ ]:
1076
+ """Creates & returns a transformer encoder, potentially with 0 layers."""
1077
+ if num_layers > 0:
1078
+ return TransformerEncoder(
1079
+ num_layers,
1080
+ units,
1081
+ config[NUM_HEADS],
1082
+ units * 4,
1083
+ config[REGULARIZATION_CONSTANT],
1084
+ dropout_rate=drop_rate,
1085
+ attention_dropout_rate=config[DROP_RATE_ATTENTION],
1086
+ density=config[CONNECTION_DENSITY],
1087
+ unidirectional=unidirectional,
1088
+ use_key_relative_position=config[KEY_RELATIVE_ATTENTION],
1089
+ use_value_relative_position=config[VALUE_RELATIVE_ATTENTION],
1090
+ max_relative_position=config[MAX_RELATIVE_POSITION],
1091
+ name=f"{attribute_name}_encoder",
1092
+ )
1093
+ # create lambda so that it can be used later without the check
1094
+ return lambda x, mask, training: (x, None)