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,908 @@
1
+ from collections import defaultdict, namedtuple, deque
2
+
3
+ import copy
4
+ import logging
5
+ import random
6
+ from contextlib import contextmanager
7
+
8
+ from tqdm import tqdm
9
+ from typing import (
10
+ Optional,
11
+ List,
12
+ Text,
13
+ Set,
14
+ Dict,
15
+ Tuple,
16
+ Deque,
17
+ DefaultDict,
18
+ Any,
19
+ Iterable,
20
+ Generator,
21
+ )
22
+
23
+ from rasa.shared.constants import DOCS_URL_STORIES
24
+ from rasa.shared.core.constants import SHOULD_NOT_BE_SET
25
+ from rasa.shared.core.domain import Domain, State
26
+ from rasa.shared.core.events import (
27
+ ActionExecuted,
28
+ UserUttered,
29
+ ActionReverted,
30
+ UserUtteranceReverted,
31
+ Restarted,
32
+ Event,
33
+ SlotSet,
34
+ ActiveLoop,
35
+ )
36
+ from rasa.shared.core.trackers import DialogueStateTracker, FrozenState
37
+ from rasa.shared.core.slots import Slot
38
+ from rasa.shared.core.training_data.structures import (
39
+ StoryGraph,
40
+ STORY_START,
41
+ StoryStep,
42
+ RuleStep,
43
+ GENERATED_CHECKPOINT_PREFIX,
44
+ )
45
+ from rasa.shared.utils.io import is_logging_disabled
46
+ import rasa.shared.utils.io
47
+
48
+ logger = logging.getLogger(__name__)
49
+
50
+ ExtractorConfig = namedtuple(
51
+ "ExtractorConfig",
52
+ "remove_duplicates "
53
+ "unique_last_num_states "
54
+ "augmentation_factor "
55
+ "max_number_of_augmented_trackers "
56
+ "tracker_limit "
57
+ "use_story_concatenation "
58
+ "rand",
59
+ )
60
+
61
+
62
+ class TrackerWithCachedStates(DialogueStateTracker):
63
+ """A tracker wrapper that caches the state creation of the tracker."""
64
+
65
+ def __init__(
66
+ self,
67
+ sender_id: Text,
68
+ slots: Optional[Iterable[Slot]],
69
+ max_event_history: Optional[int] = None,
70
+ domain: Optional[Domain] = None,
71
+ is_augmented: bool = False,
72
+ is_rule_tracker: bool = False,
73
+ ) -> None:
74
+ """Initializes a tracker with cached states."""
75
+ super().__init__(
76
+ sender_id, slots, max_event_history, is_rule_tracker=is_rule_tracker
77
+ )
78
+ self._states_for_hashing: Deque[FrozenState] = deque()
79
+ self.domain = domain if domain is not None else Domain.empty()
80
+ # T/F property to filter augmented stories
81
+ self.is_augmented = is_augmented
82
+ self.__skip_states = False
83
+
84
+ @classmethod
85
+ def from_events(
86
+ cls,
87
+ sender_id: Text,
88
+ evts: List[Event],
89
+ slots: Optional[Iterable[Slot]] = None,
90
+ max_event_history: Optional[int] = None,
91
+ sender_source: Optional[Text] = None,
92
+ domain: Optional[Domain] = None,
93
+ is_rule_tracker: bool = False,
94
+ ) -> "TrackerWithCachedStates":
95
+ """Initializes a tracker with given events."""
96
+ tracker = cls(
97
+ sender_id, slots, max_event_history, domain, is_rule_tracker=is_rule_tracker
98
+ )
99
+ for e in evts:
100
+ tracker.update(e)
101
+ return tracker
102
+
103
+ def past_states_for_hashing(
104
+ self, domain: Domain, omit_unset_slots: bool = False
105
+ ) -> Deque[FrozenState]:
106
+ """Generates and caches the past states of this tracker based on the history.
107
+
108
+ Args:
109
+ domain: a :class:`rasa.shared.core.domain.Domain`
110
+ omit_unset_slots: If `True` do not include the initial values of slots.
111
+
112
+ Returns:
113
+ A list of states
114
+ """
115
+ if domain != self.domain:
116
+ raise ValueError(
117
+ "TrackerWithCachedStates cannot be used with a domain "
118
+ "that is different from the one it was created with."
119
+ )
120
+
121
+ if omit_unset_slots:
122
+ # the tracker caches states with omit_unset_slots=False
123
+ # Retrieving them from cache with omit_unset_slots=True is not possible as
124
+ # this information is lost after a position in the event stream is turned
125
+ # into a state
126
+ states = super().past_states(domain, omit_unset_slots=omit_unset_slots)
127
+ states_for_hashing = deque(self.freeze_current_state(s) for s in states)
128
+ else:
129
+ # if don't have it cached, we use the domain to calculate the states
130
+ # from the events
131
+ # note: we ignore omit_unset_slots here as the cache was generated
132
+ # with the default value
133
+ states_for_hashing = self._states_for_hashing
134
+ if not states_for_hashing:
135
+ states = super().past_states(domain)
136
+ states_for_hashing = deque(self.freeze_current_state(s) for s in states)
137
+
138
+ self._states_for_hashing = states_for_hashing
139
+
140
+ return states_for_hashing
141
+
142
+ @staticmethod
143
+ def _unfreeze_states(frozen_states: Deque[FrozenState]) -> List[State]:
144
+ return [
145
+ {key: dict(value) for key, value in dict(frozen_state).items()}
146
+ for frozen_state in frozen_states
147
+ ]
148
+
149
+ def past_states(
150
+ self,
151
+ domain: Domain,
152
+ omit_unset_slots: bool = False,
153
+ ignore_rule_only_turns: bool = False,
154
+ rule_only_data: Optional[Dict[Text, Any]] = None,
155
+ ) -> List[State]:
156
+ """Generates the past states of this tracker based on the history.
157
+
158
+ Args:
159
+ domain: The Domain.
160
+ omit_unset_slots: If `True` do not include the initial values of slots.
161
+ ignore_rule_only_turns: If True ignore dialogue turns that are present
162
+ only in rules.
163
+ rule_only_data: Slots and loops,
164
+ which only occur in rules but not in stories.
165
+
166
+ Returns:
167
+ a list of states
168
+ """
169
+ states_for_hashing = self.past_states_for_hashing(
170
+ domain, omit_unset_slots=omit_unset_slots
171
+ )
172
+ return self._unfreeze_states(states_for_hashing)
173
+
174
+ def clear_states(self) -> None:
175
+ """Reset the states."""
176
+ self._states_for_hashing = deque()
177
+
178
+ def init_copy(self) -> "TrackerWithCachedStates":
179
+ """Create a new state tracker with the same initial values."""
180
+ return type(self)(
181
+ "",
182
+ self.slots.values(),
183
+ self._max_event_history,
184
+ self.domain,
185
+ self.is_augmented,
186
+ self.is_rule_tracker,
187
+ )
188
+
189
+ @contextmanager
190
+ def _skip_states_manager(self) -> Generator[None, None, None]:
191
+ self.__skip_states = True
192
+ try:
193
+ yield
194
+ finally:
195
+ self.__skip_states = False
196
+
197
+ def copy(
198
+ self, sender_id: Text = "", sender_source: Text = ""
199
+ ) -> "TrackerWithCachedStates":
200
+ """Creates a duplicate of this tracker.
201
+
202
+ A new tracker will be created and all events
203
+ will be replayed.
204
+ """
205
+ # This is an optimization, we could use the original copy, but
206
+ # the states would be lost and we would need to recalculate them
207
+
208
+ tracker = self.init_copy()
209
+ tracker.sender_id = sender_id
210
+ tracker.sender_source = sender_source
211
+
212
+ with tracker._skip_states_manager():
213
+ for event in self.events:
214
+ tracker.update(event)
215
+
216
+ tracker._states_for_hashing = copy.copy(self._states_for_hashing)
217
+
218
+ return tracker
219
+
220
+ def _append_current_state(self) -> None:
221
+ if self._states_for_hashing is None:
222
+ self._states_for_hashing = self.past_states_for_hashing(self.domain)
223
+ else:
224
+ state = self.domain.get_active_state(self)
225
+ frozen_state = self.freeze_current_state(state)
226
+ self._states_for_hashing.append(frozen_state)
227
+
228
+ def update(
229
+ self,
230
+ event: Event,
231
+ domain: Optional[Domain] = None,
232
+ ) -> None:
233
+ """Modify the state of the tracker according to an ``Event``."""
234
+ # if `skip_states` is `True`, this function behaves exactly like the
235
+ # normal update of the `DialogueStateTracker`
236
+ if not self._states_for_hashing and not self.__skip_states:
237
+ # rest of this function assumes we have the previous state
238
+ # cached. let's make sure it is there.
239
+ self._states_for_hashing = self.past_states_for_hashing(self.domain)
240
+
241
+ super().update(event)
242
+
243
+ if not self.__skip_states:
244
+ if isinstance(event, ActionExecuted):
245
+ pass
246
+ elif isinstance(event, ActionReverted):
247
+ self._states_for_hashing.pop() # removes the state after the action
248
+ self._states_for_hashing.pop() # removes the state used for the action
249
+ elif isinstance(event, UserUtteranceReverted):
250
+ self.clear_states()
251
+ elif isinstance(event, Restarted):
252
+ self.clear_states()
253
+ else:
254
+ self._states_for_hashing.pop()
255
+
256
+ self._append_current_state()
257
+
258
+
259
+ # define types
260
+ TrackerLookupDict = DefaultDict[Text, List[TrackerWithCachedStates]]
261
+
262
+ TrackersTuple = Tuple[List[TrackerWithCachedStates], List[TrackerWithCachedStates]]
263
+
264
+
265
+ class TrainingDataGenerator:
266
+ """Generates trackers from training data."""
267
+
268
+ def __init__(
269
+ self,
270
+ story_graph: StoryGraph,
271
+ domain: Domain,
272
+ remove_duplicates: bool = True,
273
+ unique_last_num_states: Optional[int] = None,
274
+ augmentation_factor: int = 50,
275
+ tracker_limit: Optional[int] = None,
276
+ use_story_concatenation: bool = True,
277
+ debug_plots: bool = False,
278
+ ):
279
+ """Given a set of story parts, generates all stories that are possible.
280
+
281
+ The different story parts can end and start with checkpoints
282
+ and this generator will match start and end checkpoints to
283
+ connect complete stories. Afterwards, duplicate stories will be
284
+ removed and the data is augmented (if augmentation is enabled).
285
+ """
286
+ self.story_graph = story_graph.with_cycles_removed()
287
+ if debug_plots:
288
+ self.story_graph.visualize("story_blocks_connections.html")
289
+
290
+ self.domain = domain
291
+
292
+ # 10x factor is a heuristic for augmentation rounds
293
+ max_number_of_augmented_trackers = augmentation_factor * 10
294
+
295
+ self.config = ExtractorConfig(
296
+ remove_duplicates=remove_duplicates,
297
+ unique_last_num_states=unique_last_num_states,
298
+ augmentation_factor=augmentation_factor,
299
+ max_number_of_augmented_trackers=max_number_of_augmented_trackers,
300
+ tracker_limit=tracker_limit,
301
+ use_story_concatenation=use_story_concatenation,
302
+ rand=random.Random(42),
303
+ )
304
+ # hashed featurization of all finished trackers
305
+ self.hashed_featurizations: Set[int] = set()
306
+
307
+ @staticmethod
308
+ def _phase_name(everything_reachable_is_reached: bool, phase: int) -> Text:
309
+ if everything_reachable_is_reached:
310
+ return f"augmentation round {phase}"
311
+ else:
312
+ return f"data generation round {phase}"
313
+
314
+ def generate(self) -> List[TrackerWithCachedStates]:
315
+ """Generate trackers from stories and rules.
316
+
317
+ Returns:
318
+ The generated trackers.
319
+ """
320
+ return self.generate_story_trackers() + self._generate_rule_trackers()
321
+
322
+ def generate_story_trackers(self) -> List[TrackerWithCachedStates]:
323
+ """Generate trackers from stories (exclude rule trackers).
324
+
325
+ Returns:
326
+ The generated story trackers.
327
+ """
328
+ steps = [
329
+ step
330
+ for step in self.story_graph.ordered_steps()
331
+ if not isinstance(step, RuleStep)
332
+ ]
333
+
334
+ return self._generate(steps, is_rule_data=False)
335
+
336
+ def _generate_rule_trackers(self) -> List[TrackerWithCachedStates]:
337
+ steps = [
338
+ step
339
+ for step in self.story_graph.ordered_steps()
340
+ if isinstance(step, RuleStep)
341
+ ]
342
+
343
+ return self._generate(steps, is_rule_data=True)
344
+
345
+ def _generate(
346
+ self, story_steps: List[StoryStep], is_rule_data: bool = False
347
+ ) -> List[TrackerWithCachedStates]:
348
+ if not story_steps:
349
+ logger.debug(f"No {'rules' if is_rule_data else 'story blocks'} found.")
350
+ return []
351
+
352
+ if self.config.remove_duplicates and self.config.unique_last_num_states:
353
+ logger.debug(
354
+ "Generated trackers will be deduplicated "
355
+ "based on their unique last {} states."
356
+ "".format(self.config.unique_last_num_states)
357
+ )
358
+ self._mark_first_action_in_story_steps_as_unpredictable()
359
+
360
+ active_trackers: DefaultDict[Text, List[TrackerWithCachedStates]] = defaultdict(
361
+ list
362
+ )
363
+
364
+ init_tracker = TrackerWithCachedStates(
365
+ "",
366
+ self.domain.slots,
367
+ max_event_history=self.config.tracker_limit,
368
+ domain=self.domain,
369
+ is_rule_tracker=is_rule_data,
370
+ )
371
+ active_trackers[STORY_START].append(init_tracker)
372
+
373
+ # trackers that are sent to a featurizer
374
+ finished_trackers = []
375
+ # keep story end trackers separately for augmentation
376
+ story_end_trackers = []
377
+
378
+ phase = 0 # one phase is one traversal of all story steps.
379
+
380
+ # do not augment rule data
381
+ if not is_rule_data:
382
+ min_num_aug_phases = 3 if self.config.augmentation_factor > 0 else 0
383
+ logger.debug(f"Number of augmentation rounds is {min_num_aug_phases}")
384
+ else:
385
+ min_num_aug_phases = 0
386
+
387
+ # placeholder to track gluing process of checkpoints
388
+ used_checkpoints: Set[Text] = set()
389
+ previous_unused: Set[Text] = set()
390
+ everything_reachable_is_reached = False
391
+
392
+ # we will continue generating data until we have reached all
393
+ # checkpoints that seem to be reachable. This is a heuristic,
394
+ # if we did not reach any new checkpoints in an iteration, we
395
+ # assume we have reached all and stop.
396
+
397
+ while not everything_reachable_is_reached or phase < min_num_aug_phases:
398
+ phase_name = self._phase_name(everything_reachable_is_reached, phase)
399
+
400
+ num_active_trackers = self._count_trackers(active_trackers)
401
+
402
+ if num_active_trackers:
403
+ logger.debug(
404
+ "Starting {} ... (with {} trackers)".format(
405
+ phase_name, num_active_trackers
406
+ )
407
+ )
408
+ else:
409
+ logger.debug(f"There are no trackers for {phase_name}")
410
+ break
411
+
412
+ # track unused checkpoints for this phase
413
+ unused_checkpoints: Set[Text] = set()
414
+
415
+ desc = f"Processed {'rules' if is_rule_data else 'story blocks'}"
416
+ pbar = tqdm(story_steps, desc=desc, disable=is_logging_disabled())
417
+ for step in pbar:
418
+ incoming_trackers: List[TrackerWithCachedStates] = []
419
+ for start in step.start_checkpoints:
420
+ if active_trackers[start.name]:
421
+ ts = start.filter_trackers(active_trackers[start.name])
422
+ incoming_trackers.extend(ts)
423
+ used_checkpoints.add(start.name)
424
+ elif start.name not in used_checkpoints:
425
+ # need to skip - there was no previous step that
426
+ # had this start checkpoint as an end checkpoint
427
+ # it will be processed in next phases
428
+ unused_checkpoints.add(start.name)
429
+ if not incoming_trackers:
430
+ # if there are no trackers,
431
+ # we can skip the rest of the loop
432
+ continue
433
+
434
+ # these are the trackers that reached this story
435
+ # step and that need to handle all events of the step
436
+
437
+ if self.config.remove_duplicates:
438
+ incoming_trackers, end_trackers = self._remove_duplicate_trackers(
439
+ incoming_trackers
440
+ )
441
+
442
+ # append end trackers to finished trackers
443
+ finished_trackers.extend(end_trackers)
444
+
445
+ if everything_reachable_is_reached:
446
+ # augmentation round
447
+ incoming_trackers = self._subsample_trackers(
448
+ incoming_trackers, self.config.max_number_of_augmented_trackers
449
+ )
450
+
451
+ # update progress bar
452
+ pbar.set_postfix({"# trackers": "{:d}".format(len(incoming_trackers))})
453
+
454
+ trackers, end_trackers = self._process_step(step, incoming_trackers)
455
+
456
+ # add end trackers to finished trackers
457
+ finished_trackers.extend(end_trackers)
458
+
459
+ # update our tracker dictionary with the trackers
460
+ # that handled the events of the step and
461
+ # that can now be used for further story steps
462
+ # that start with the checkpoint this step ended with
463
+
464
+ for end in step.end_checkpoints:
465
+ start_name = self._find_start_checkpoint_name(end.name)
466
+
467
+ active_trackers[start_name].extend(trackers)
468
+
469
+ if start_name in used_checkpoints:
470
+ # add end checkpoint as unused
471
+ # if this checkpoint was processed as
472
+ # start one before
473
+ unused_checkpoints.add(start_name)
474
+
475
+ if not step.end_checkpoints:
476
+ unique_ends = self._remove_duplicate_story_end_trackers(trackers)
477
+ story_end_trackers.extend(unique_ends)
478
+
479
+ num_finished = len(finished_trackers) + len(story_end_trackers)
480
+ logger.debug(f"Finished phase ({num_finished} training samples found).")
481
+
482
+ # prepare next round
483
+ phase += 1
484
+
485
+ if not everything_reachable_is_reached:
486
+ # check if we reached all nodes that can be reached
487
+ # if we reached at least one more node this round
488
+ # than last one, we assume there is still
489
+ # something left to reach and we continue
490
+
491
+ unused_checkpoints = self._add_unused_end_checkpoints(
492
+ set(active_trackers.keys()), unused_checkpoints, used_checkpoints
493
+ )
494
+ active_trackers = self._filter_active_trackers(
495
+ active_trackers, unused_checkpoints
496
+ )
497
+ num_active_trackers = self._count_trackers(active_trackers)
498
+
499
+ everything_reachable_is_reached = (
500
+ unused_checkpoints == previous_unused or num_active_trackers == 0
501
+ )
502
+ previous_unused = unused_checkpoints
503
+
504
+ if everything_reachable_is_reached:
505
+ # should happen only once
506
+
507
+ previous_unused -= used_checkpoints
508
+ # add trackers with unused checkpoints
509
+ # to finished trackers
510
+ for start_name in previous_unused:
511
+ finished_trackers.extend(active_trackers[start_name])
512
+
513
+ logger.debug("Data generation rounds finished.")
514
+ logger.debug(
515
+ "Found {} unused checkpoints".format(len(previous_unused))
516
+ )
517
+ phase = 0
518
+ else:
519
+ logger.debug(
520
+ "Found {} unused checkpoints in current phase.".format(
521
+ len(unused_checkpoints)
522
+ )
523
+ )
524
+ logger.debug(
525
+ "Found {} active trackers for these checkpoints.".format(
526
+ num_active_trackers
527
+ )
528
+ )
529
+
530
+ if everything_reachable_is_reached:
531
+ # augmentation round, so we process only
532
+ # story end checkpoints
533
+ # reset used checkpoints
534
+ used_checkpoints = set()
535
+
536
+ # generate active trackers for augmentation
537
+ active_trackers = self._create_start_trackers_for_augmentation(
538
+ story_end_trackers
539
+ )
540
+
541
+ finished_trackers.extend(story_end_trackers)
542
+ self._issue_unused_checkpoint_notification(previous_unused)
543
+ logger.debug("Found {} training trackers.".format(len(finished_trackers)))
544
+
545
+ if self.config.augmentation_factor > 0:
546
+ augmented_trackers, original_trackers = [], []
547
+ for t in finished_trackers:
548
+ if t.is_augmented:
549
+ augmented_trackers.append(t)
550
+ else:
551
+ original_trackers.append(t)
552
+ augmented_trackers = self._subsample_trackers(
553
+ augmented_trackers, self.config.max_number_of_augmented_trackers
554
+ )
555
+ logger.debug(
556
+ "Subsampled to {} augmented training trackers.".format(
557
+ len(augmented_trackers)
558
+ )
559
+ )
560
+ logger.debug(
561
+ "There are {} original trackers.".format(len(original_trackers))
562
+ )
563
+ finished_trackers = original_trackers + augmented_trackers
564
+
565
+ return finished_trackers
566
+
567
+ @staticmethod
568
+ def _count_trackers(active_trackers: TrackerLookupDict) -> int:
569
+ """Count the number of trackers in the tracker dictionary."""
570
+ return sum(len(ts) for ts in active_trackers.values())
571
+
572
+ def _subsample_trackers(
573
+ self,
574
+ incoming_trackers: List[TrackerWithCachedStates],
575
+ max_number_of_trackers: int,
576
+ ) -> List[TrackerWithCachedStates]:
577
+ """Subsample the list of trackers to retrieve a random subset."""
578
+ # if flows get very long and have a lot of forks we
579
+ # get into trouble by collecting too many trackers
580
+ # hence the sub sampling
581
+ if max_number_of_trackers is not None:
582
+ return _subsample_array(
583
+ incoming_trackers, max_number_of_trackers, rand=self.config.rand
584
+ )
585
+ else:
586
+ return incoming_trackers
587
+
588
+ def _find_start_checkpoint_name(self, end_name: Text) -> Text:
589
+ """Find start checkpoint name given end checkpoint name of a cycle."""
590
+ return self.story_graph.story_end_checkpoints.get(end_name, end_name)
591
+
592
+ @staticmethod
593
+ def _add_unused_end_checkpoints(
594
+ start_checkpoints: Set[Text],
595
+ unused_checkpoints: Set[Text],
596
+ used_checkpoints: Set[Text],
597
+ ) -> Set[Text]:
598
+ """Add unused end checkpoints
599
+ if they were never encountered as start checkpoints.
600
+ """
601
+ return unused_checkpoints.union(
602
+ {
603
+ start_name
604
+ for start_name in start_checkpoints
605
+ if start_name not in used_checkpoints
606
+ }
607
+ )
608
+
609
+ @staticmethod
610
+ def _filter_active_trackers(
611
+ active_trackers: TrackerLookupDict, unused_checkpoints: Set[Text]
612
+ ) -> TrackerLookupDict:
613
+ """Filter active trackers that ended with unused checkpoint
614
+ or are parts of loops.
615
+ """
616
+ next_active_trackers = defaultdict(list)
617
+
618
+ for start_name in unused_checkpoints:
619
+ # process trackers ended with unused checkpoints further
620
+ if start_name != STORY_START:
621
+ # there is no point to process STORY_START checkpoint again
622
+ next_active_trackers[start_name] = active_trackers.get(start_name, [])
623
+
624
+ return next_active_trackers
625
+
626
+ def _create_start_trackers_for_augmentation(
627
+ self, story_end_trackers: List[TrackerWithCachedStates]
628
+ ) -> TrackerLookupDict:
629
+ """This is where the augmentation magic happens.
630
+
631
+ We will reuse all the trackers that reached the
632
+ end checkpoint `None` (which is the end of a
633
+ story) and start processing all steps again. So instead
634
+ of starting with a fresh tracker, the second and
635
+ all following phases will reuse a couple of the trackers
636
+ that made their way to a story end.
637
+
638
+ We need to do some cleanup before processing them again.
639
+ """
640
+ next_active_trackers = defaultdict(list)
641
+
642
+ if self.config.use_story_concatenation:
643
+ ending_trackers = _subsample_array(
644
+ story_end_trackers,
645
+ self.config.augmentation_factor,
646
+ rand=self.config.rand,
647
+ )
648
+ for t in ending_trackers:
649
+ # this is a nasty thing - all stories end and
650
+ # start with action listen - so after logging the first
651
+ # actions in the next phase the trackers would
652
+ # contain action listen followed by action listen.
653
+ # to fix this we are going to "undo" the last action listen
654
+
655
+ # tracker should be copied,
656
+ # otherwise original tracker is updated
657
+ aug_t = t.copy()
658
+ aug_t.is_augmented = True
659
+ aug_t.update(ActionReverted())
660
+ next_active_trackers[STORY_START].append(aug_t)
661
+
662
+ return next_active_trackers
663
+
664
+ def _process_step(
665
+ self, step: StoryStep, incoming_trackers: List[TrackerWithCachedStates]
666
+ ) -> TrackersTuple:
667
+ """Processes a steps events with all trackers.
668
+
669
+ The trackers that reached the steps starting checkpoint will
670
+ be used to process the events. Collects and returns training
671
+ data while processing the story step.
672
+ """
673
+ events = step.explicit_events(self.domain)
674
+
675
+ trackers = []
676
+ if events: # small optimization
677
+ # need to copy the tracker as multiple story steps
678
+ # might start with the same checkpoint and all of them
679
+ # will use the same set of incoming trackers
680
+
681
+ for tracker in incoming_trackers:
682
+ # sender id is used to be able for a human to see where the
683
+ # messages and events for this tracker came from - to do this
684
+ # we concatenate the story block names of the blocks that
685
+ # contribute to the trackers events
686
+ if tracker.sender_id:
687
+ if (
688
+ step.block_name
689
+ and step.block_name not in tracker.sender_id.split(" > ")
690
+ ):
691
+ new_sender = tracker.sender_id + " > " + step.block_name
692
+ else:
693
+ new_sender = tracker.sender_id
694
+ else:
695
+ new_sender = step.block_name
696
+ trackers.append(tracker.copy(new_sender, step.source_name))
697
+
698
+ end_trackers = []
699
+ for event in events:
700
+ if (
701
+ isinstance(event, ActionExecuted)
702
+ and event.action_text
703
+ and event.action_text not in self.domain.action_texts
704
+ ):
705
+ rasa.shared.utils.cli.print_warning(
706
+ f"Test story '{step.block_name}' in "
707
+ f"'{step.source_name}' contains the bot utterance "
708
+ f"'{event.action_text}', which is not part "
709
+ f"of the training data / domain."
710
+ )
711
+ for tracker in trackers:
712
+ if isinstance(
713
+ event, (ActionReverted, UserUtteranceReverted, Restarted)
714
+ ):
715
+ end_trackers.append(tracker.copy(tracker.sender_id))
716
+ if isinstance(step, RuleStep):
717
+ # The rules can specify that a form or a slot shouldn't be set,
718
+ # therefore we need to distinguish between not set
719
+ # and explicitly set to None
720
+ if isinstance(event, ActiveLoop) and event.name is None:
721
+ event.name = SHOULD_NOT_BE_SET
722
+
723
+ if isinstance(event, SlotSet) and event.value is None:
724
+ event.value = SHOULD_NOT_BE_SET
725
+
726
+ tracker.update(event)
727
+
728
+ # end trackers should be returned separately
729
+ # to avoid using them for augmentation
730
+ return trackers, end_trackers
731
+
732
+ def _remove_duplicate_trackers(
733
+ self, trackers: List[TrackerWithCachedStates]
734
+ ) -> TrackersTuple:
735
+ """Removes trackers that create equal featurizations
736
+ for current story step.
737
+
738
+ From multiple trackers that create equal featurizations
739
+ we only need to keep one. Because as we continue processing
740
+ events and story steps, all trackers that created the
741
+ same featurization once will do so in the future (as we
742
+ feed the same events to all trackers).
743
+ """
744
+ step_hashed_featurizations = set()
745
+
746
+ # collected trackers that created different featurizations
747
+ unique_trackers = [] # for current step
748
+ end_trackers = [] # for all steps
749
+
750
+ for tracker in trackers:
751
+ states_for_hashing = tuple(tracker.past_states_for_hashing(self.domain))
752
+ hashed = hash(states_for_hashing)
753
+
754
+ # only continue with trackers that created a
755
+ # hashed_featurization we haven't observed
756
+ if hashed not in step_hashed_featurizations:
757
+ if self.config.unique_last_num_states:
758
+ last_states = states_for_hashing[
759
+ -self.config.unique_last_num_states :
760
+ ]
761
+ last_hashed = hash(last_states)
762
+
763
+ if last_hashed not in step_hashed_featurizations:
764
+ step_hashed_featurizations.add(last_hashed)
765
+ unique_trackers.append(tracker)
766
+ elif (
767
+ len(states_for_hashing) > len(last_states)
768
+ and hashed not in self.hashed_featurizations
769
+ ):
770
+ self.hashed_featurizations.add(hashed)
771
+ end_trackers.append(tracker)
772
+ else:
773
+ unique_trackers.append(tracker)
774
+
775
+ step_hashed_featurizations.add(hashed)
776
+
777
+ return unique_trackers, end_trackers
778
+
779
+ def _remove_duplicate_story_end_trackers(
780
+ self, trackers: List[TrackerWithCachedStates]
781
+ ) -> List[TrackerWithCachedStates]:
782
+ """Removes trackers that reached story end and
783
+ created equal featurizations.
784
+ """
785
+ # collected trackers that created different featurizations
786
+ unique_trackers = [] # for all steps
787
+
788
+ # deduplication of finished trackers is needed,
789
+ # otherwise featurization does a lot of unnecessary work
790
+
791
+ for tracker in trackers:
792
+ states_for_hashing = tuple(tracker.past_states_for_hashing(self.domain))
793
+ hashed = hash(states_for_hashing + (tracker.is_rule_tracker,))
794
+
795
+ # only continue with trackers that created a
796
+ # hashed_featurization we haven't observed
797
+
798
+ if hashed not in self.hashed_featurizations:
799
+ self.hashed_featurizations.add(hashed)
800
+ unique_trackers.append(tracker)
801
+
802
+ return unique_trackers
803
+
804
+ def _mark_first_action_in_story_steps_as_unpredictable(self) -> None:
805
+ """Mark actions which shouldn't be used during ML training.
806
+
807
+ If a story starts with an action, we can not use
808
+ that first action as a training example, as there is no
809
+ history. There is one exception though, we do want to
810
+ predict action listen. But because stories never
811
+ contain action listen events (they are added when a
812
+ story gets converted to a dialogue) we need to apply a
813
+ small trick to avoid marking actions occurring after
814
+ an action listen as unpredictable.
815
+ """
816
+ for step in self.story_graph.story_steps:
817
+ # TODO: this does not work if a step is the conversational start
818
+ # as well as an intermediary part of a conversation.
819
+ # This means a checkpoint can either have multiple
820
+ # checkpoints OR be the start of a conversation
821
+ # but not both.
822
+ if STORY_START in {s.name for s in step.start_checkpoints}:
823
+ for i, e in enumerate(step.events):
824
+ if isinstance(e, UserUttered):
825
+ # if there is a user utterance, that means before the
826
+ # user uttered something there has to be
827
+ # an action listen. therefore, any action that comes
828
+ # after this user utterance isn't the first
829
+ # action anymore and the tracker used for prediction
830
+ # is not empty anymore. Hence, it is fine
831
+ # to predict anything that occurs after an utterance.
832
+ break
833
+ if isinstance(e, ActionExecuted):
834
+ e.unpredictable = True
835
+ break
836
+
837
+ def _issue_unused_checkpoint_notification(
838
+ self, unused_checkpoints: Set[Text]
839
+ ) -> None:
840
+ """Warns about unused story blocks.
841
+
842
+ Unused steps are ones having a start or end checkpoint
843
+ that no one provided.
844
+ """
845
+ if STORY_START in unused_checkpoints:
846
+ rasa.shared.utils.io.raise_warning(
847
+ "There is no starting story block "
848
+ "in the training data. "
849
+ "All your story blocks start with some checkpoint. "
850
+ "There should be at least one story block "
851
+ "that starts without any checkpoint.",
852
+ docs=DOCS_URL_STORIES + "#stories",
853
+ )
854
+
855
+ # running through the steps first will result in only one warning
856
+ # per block (as one block might have multiple steps)
857
+ collected_start = set()
858
+ collected_end = set()
859
+ for step in self.story_graph.story_steps:
860
+ for start in step.start_checkpoints:
861
+ if start.name in unused_checkpoints:
862
+ # After processing, there shouldn't be a story part left.
863
+ # This indicates a start checkpoint that doesn't exist
864
+ collected_start.add((start.name, step.block_name))
865
+
866
+ for end in step.end_checkpoints:
867
+ if end.name in unused_checkpoints:
868
+ # After processing, there shouldn't be a story part left.
869
+ # This indicates an end checkpoint that doesn't exist
870
+ collected_end.add((end.name, step.block_name))
871
+
872
+ for cp, block_name in collected_start:
873
+ if not cp.startswith(GENERATED_CHECKPOINT_PREFIX):
874
+ rasa.shared.utils.io.raise_warning(
875
+ f"Unsatisfied start checkpoint '{cp}' "
876
+ f"in block '{block_name}'. "
877
+ f"Remove this checkpoint or add "
878
+ f"story blocks that end "
879
+ f"with this checkpoint.",
880
+ docs=DOCS_URL_STORIES + "#checkpoints",
881
+ )
882
+
883
+ for cp, block_name in collected_end:
884
+ if not cp.startswith(GENERATED_CHECKPOINT_PREFIX):
885
+ rasa.shared.utils.io.raise_warning(
886
+ f"Unsatisfied end checkpoint '{cp}' "
887
+ f"in block '{block_name}'. "
888
+ f"Remove this checkpoint or add "
889
+ f"story blocks that start "
890
+ f"with this checkpoint.",
891
+ docs=DOCS_URL_STORIES + "#checkpoints",
892
+ )
893
+
894
+
895
+ def _subsample_array(
896
+ arr: List[Any],
897
+ max_values: int,
898
+ can_modify_incoming_array: bool = True,
899
+ rand: Optional[random.Random] = None,
900
+ ) -> List[Any]:
901
+ """Shuffles the array and returns `max_values` number of elements."""
902
+ if not can_modify_incoming_array:
903
+ arr = arr[:]
904
+ if rand is not None:
905
+ rand.shuffle(arr)
906
+ else:
907
+ random.shuffle(arr)
908
+ return arr[:max_values]