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,1183 @@
1
+ import copy
2
+ import dataclasses
3
+ import itertools
4
+ import logging
5
+ import os
6
+ import time
7
+ from collections import deque
8
+ from enum import Enum
9
+ from typing import (
10
+ Dict,
11
+ Text,
12
+ Any,
13
+ Optional,
14
+ Iterator,
15
+ Generator,
16
+ Type,
17
+ TypeVar,
18
+ List,
19
+ Deque,
20
+ Iterable,
21
+ Union,
22
+ FrozenSet,
23
+ Tuple,
24
+ TYPE_CHECKING,
25
+ cast,
26
+ )
27
+
28
+ import rasa.shared.utils.io
29
+ from rasa.shared.constants import (
30
+ ASSISTANT_ID_KEY,
31
+ DEFAULT_SENDER_ID,
32
+ ROUTE_TO_CALM_SLOT,
33
+ )
34
+ from rasa.shared.core import events
35
+ from rasa.shared.core.constants import (
36
+ ACTION_LISTEN_NAME,
37
+ LOOP_NAME,
38
+ SHOULD_NOT_BE_SET,
39
+ PREVIOUS_ACTION,
40
+ ACTIVE_LOOP,
41
+ ACTION_SESSION_START_NAME,
42
+ FOLLOWUP_ACTION,
43
+ )
44
+ from rasa.shared.core.conversation import Dialogue
45
+ from rasa.shared.core.domain import Domain, State
46
+ from rasa.shared.core.events import (
47
+ DialogueStackUpdated,
48
+ RoutingSessionEnded,
49
+ SlotSet,
50
+ UserUttered,
51
+ ActionExecuted,
52
+ Event,
53
+ Restarted,
54
+ ActionReverted,
55
+ UserUtteranceReverted,
56
+ BotUttered,
57
+ ActiveLoop,
58
+ SessionStarted,
59
+ ActionExecutionRejected,
60
+ DefinePrevUserUtteredFeaturization,
61
+ FlowStarted,
62
+ )
63
+ from rasa.shared.core.flows import FlowsList
64
+ from rasa.shared.core.slots import AnySlot, Slot
65
+ from rasa.shared.nlu.constants import (
66
+ ENTITY_ATTRIBUTE_VALUE,
67
+ ENTITY_ATTRIBUTE_TYPE,
68
+ ENTITY_ATTRIBUTE_GROUP,
69
+ ENTITY_ATTRIBUTE_ROLE,
70
+ ACTION_TEXT,
71
+ ACTION_NAME,
72
+ ENTITIES,
73
+ METADATA_MODEL_ID,
74
+ )
75
+
76
+ if TYPE_CHECKING:
77
+ from rasa.shared.core.events import NLUPredictionData
78
+ from rasa.shared.core.training_data.structures import Story
79
+ from rasa.shared.core.training_data.story_writer.story_writer import StoryWriter
80
+ from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
81
+
82
+ EventTypeAlias = TypeVar("EventTypeAlias", bound=Event)
83
+
84
+
85
+ @dataclasses.dataclass
86
+ class TrackerActiveLoop:
87
+ """Dataclass for `DialogueStateTracker.active_loop`."""
88
+
89
+ name: Optional[Text]
90
+ is_interrupted: bool
91
+ rejected: bool
92
+ trigger_message: Optional[Dict]
93
+
94
+
95
+ logger = logging.getLogger(__name__)
96
+
97
+ # same as State but with Dict[...] substituted with FrozenSet[Tuple[...]]
98
+ FrozenState = FrozenSet[Tuple[Text, FrozenSet[Tuple[Text, Tuple[Union[float, Text]]]]]]
99
+
100
+
101
+ class EventVerbosity(Enum):
102
+ """Filter on which events to include in tracker dumps."""
103
+
104
+ # no events will be included
105
+ NONE = 1
106
+
107
+ # all events, that contribute to the trackers state are included
108
+ # these are all you need to reconstruct the tracker state
109
+ APPLIED = 2
110
+
111
+ # include even more events, in this case everything that comes
112
+ # after the most recent restart event. this will also include
113
+ # utterances that got reverted and actions that got undone.
114
+ AFTER_RESTART = 3
115
+
116
+ # include every logged event
117
+ ALL = 4
118
+
119
+
120
+ class AnySlotDict(dict):
121
+ """A slot dictionary that pretends every slot exists, by creating slots on demand.
122
+
123
+ This only uses the generic slot type! This means certain functionality wont work,
124
+ e.g. properly featurizing the slot.
125
+ """
126
+
127
+ def __missing__(self, key: Text) -> Slot:
128
+ value = self[key] = AnySlot(key, mappings=[])
129
+ return value
130
+
131
+ def __contains__(self, key: Any) -> bool:
132
+ return True
133
+
134
+
135
+ class DialogueStateTracker:
136
+ """Maintains the state of a conversation.
137
+
138
+ The field max_event_history will only give you these last events,
139
+ it can be set in the tracker_store.
140
+ """
141
+
142
+ @classmethod
143
+ def from_dict(
144
+ cls,
145
+ sender_id: Text,
146
+ events_as_dict: List[Dict[Text, Any]],
147
+ slots: Optional[Iterable[Slot]] = None,
148
+ max_event_history: Optional[int] = None,
149
+ ) -> "DialogueStateTracker":
150
+ """Create a tracker from dump.
151
+
152
+ The dump should be an array of dumped events. When restoring
153
+ the tracker, these events will be replayed to recreate the state.
154
+ """
155
+ evts = events.deserialise_events(events_as_dict)
156
+
157
+ return cls.from_events(sender_id, evts, slots, max_event_history)
158
+
159
+ @classmethod
160
+ def from_events(
161
+ cls,
162
+ sender_id: Text,
163
+ evts: List[Event],
164
+ slots: Optional[Iterable[Slot]] = None,
165
+ max_event_history: Optional[int] = None,
166
+ sender_source: Optional[Text] = None,
167
+ domain: Optional[Domain] = None,
168
+ ) -> "DialogueStateTracker":
169
+ """Creates tracker from existing events.
170
+
171
+ Args:
172
+ sender_id: The ID of the conversation.
173
+ evts: Existing events which should be applied to the new tracker.
174
+ slots: Slots which can be set.
175
+ max_event_history: Maximum number of events which should be stored.
176
+ sender_source: File source of the messages.
177
+ domain: The current model domain.
178
+
179
+ Returns:
180
+ Instantiated tracker with its state updated according to the given
181
+ events.
182
+ """
183
+ tracker = cls(sender_id, slots, max_event_history, sender_source)
184
+
185
+ for e in evts:
186
+ tracker.update(e, domain)
187
+
188
+ return tracker
189
+
190
+ def __init__(
191
+ self,
192
+ sender_id: Text,
193
+ slots: Optional[Iterable[Slot]],
194
+ max_event_history: Optional[int] = None,
195
+ sender_source: Optional[Text] = None,
196
+ is_rule_tracker: bool = False,
197
+ ) -> None:
198
+ """Initialize the tracker.
199
+
200
+ A set of events can be stored externally, and we will run through all
201
+ of them to get the current state. The tracker will represent all the
202
+ information we captured while processing messages of the dialogue.
203
+ """
204
+ from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
205
+
206
+ # maximum number of events to store
207
+ self._max_event_history = max_event_history
208
+ # list of previously seen events
209
+ self.events = self._create_events([])
210
+ # id of the source of the messages
211
+ self.sender_id = sender_id
212
+ # slots that can be filled in this domain
213
+ self.slots: Dict[str, Slot] = AnySlotDict()
214
+ if slots is not None:
215
+ self.slots = {slot.name: copy.copy(slot) for slot in slots}
216
+
217
+ self._underlying_stack = DialogueStack.empty()
218
+ # file source of the messages
219
+ self.sender_source = sender_source
220
+ # whether the tracker belongs to a rule-based data
221
+ self.is_rule_tracker = is_rule_tracker
222
+
223
+ ###
224
+ # current state of the tracker - MUST be re-creatable by processing
225
+ # all the events. This only defines the attributes, values are set in
226
+ # `reset()`
227
+ ###
228
+ # if tracker is paused, no actions should be taken
229
+ self._paused = False
230
+ # A deterministically scheduled action to be executed next
231
+ self.followup_action: Optional[Text] = ACTION_LISTEN_NAME
232
+ self.latest_action: Optional[Dict[Text, Text]] = None
233
+ # Stores the most recent message sent by the user
234
+ self.latest_message: Optional[UserUttered] = None
235
+ self.latest_bot_utterance: Optional[BotUttered] = None
236
+ self._reset()
237
+ self.active_loop: Optional[TrackerActiveLoop] = None
238
+
239
+ # Optional model_id to add to all events.
240
+ self.model_id: Optional[Text] = None
241
+ self.assistant_id: Optional[Text] = None
242
+
243
+ ###
244
+ # Public tracker interface
245
+ ###
246
+ def current_state(
247
+ self, event_verbosity: EventVerbosity = EventVerbosity.NONE
248
+ ) -> Dict[Text, Any]:
249
+ """Returns the current tracker state as an object."""
250
+ events = self._events_for_verbosity(event_verbosity)
251
+ events_as_dict = [e.as_dict() for e in events] if events is not None else None
252
+ latest_event_time = None
253
+ if len(self.events) > 0:
254
+ latest_event_time = self.events[-1].timestamp
255
+
256
+ return {
257
+ "sender_id": self.sender_id,
258
+ "slots": self.current_slot_values(),
259
+ "latest_message": self._latest_message_data(),
260
+ "latest_event_time": latest_event_time,
261
+ FOLLOWUP_ACTION: self.followup_action,
262
+ "paused": self.is_paused(),
263
+ "stack": self.stack.as_dict(),
264
+ "events": events_as_dict,
265
+ "latest_input_channel": self.get_latest_input_channel(),
266
+ ACTIVE_LOOP: (
267
+ dataclasses.asdict(self.active_loop) if self.active_loop else {}
268
+ ),
269
+ "latest_action": self.latest_action,
270
+ "latest_action_name": self.latest_action_name,
271
+ }
272
+
273
+ def _events_for_verbosity(
274
+ self, event_verbosity: EventVerbosity
275
+ ) -> Optional[List[Event]]:
276
+ if event_verbosity == EventVerbosity.ALL:
277
+ return list(self.events)
278
+ if event_verbosity == EventVerbosity.AFTER_RESTART:
279
+ return self.events_after_latest_restart()
280
+ if event_verbosity == EventVerbosity.APPLIED:
281
+ return self.applied_events()
282
+
283
+ return None
284
+
285
+ def _latest_message_data(self) -> Optional["NLUPredictionData"]:
286
+ if not self.latest_message:
287
+ return None
288
+
289
+ parse_data_with_nlu_state = self.latest_message.parse_data.copy()
290
+ # Combine entities predicted by NLU with entities predicted by policies so that
291
+ # users can access them together via `latest_message` (e.g. in custom actions)
292
+ parse_data_with_nlu_state[ENTITIES] = self.latest_message.entities # type: ignore[literal-required]
293
+
294
+ return parse_data_with_nlu_state
295
+
296
+ @staticmethod
297
+ def freeze_current_state(state: State) -> FrozenState:
298
+ """Convert State dict into a hashable format FrozenState.
299
+
300
+ Args:
301
+ state: The state which should be converted
302
+
303
+ Return:
304
+ hashable form of the state of type `FrozenState`
305
+ """
306
+ return frozenset(
307
+ {
308
+ key: frozenset(values.items())
309
+ if isinstance(values, Dict)
310
+ else frozenset(values)
311
+ for key, values in state.items()
312
+ }.items()
313
+ )
314
+
315
+ def past_states(
316
+ self,
317
+ domain: Domain,
318
+ omit_unset_slots: bool = False,
319
+ ignore_rule_only_turns: bool = False,
320
+ rule_only_data: Optional[Dict[Text, Any]] = None,
321
+ ) -> List[State]:
322
+ """Generates the past states of this tracker based on the history.
323
+
324
+ Args:
325
+ domain: The Domain.
326
+ omit_unset_slots: If `True` do not include the initial values of slots.
327
+ ignore_rule_only_turns: If True ignore dialogue turns that are present
328
+ only in rules.
329
+ rule_only_data: Slots and loops,
330
+ which only occur in rules but not in stories.
331
+
332
+ Returns:
333
+ A list of states
334
+ """
335
+ return domain.states_for_tracker_history(
336
+ self,
337
+ omit_unset_slots=omit_unset_slots,
338
+ ignore_rule_only_turns=ignore_rule_only_turns,
339
+ rule_only_data=rule_only_data,
340
+ )
341
+
342
+ def change_loop_to(self, loop_name: Optional[Text]) -> None:
343
+ """Set the currently active loop.
344
+
345
+ Args:
346
+ loop_name: The name of loop which should be marked as active.
347
+ """
348
+ if loop_name is not None:
349
+ self.active_loop = TrackerActiveLoop(
350
+ loop_name,
351
+ False,
352
+ False,
353
+ self.latest_message.parse_data if self.latest_message else None,
354
+ )
355
+ else:
356
+ self.active_loop = None
357
+
358
+ def interrupt_loop(self, is_interrupted: bool) -> None:
359
+ """Interrupt loop and mark that we entered an unhappy path in the conversation.
360
+
361
+ Args:
362
+ is_interrupted: `True` if the loop was run after an unhappy path.
363
+ """
364
+ if self.active_loop is not None:
365
+ self.active_loop.is_interrupted = is_interrupted
366
+
367
+ def reject_action(self, action_name: Text) -> None:
368
+ """Notify active loop that it was rejected."""
369
+ if self.active_loop is not None and action_name == self.active_loop_name:
370
+ self.active_loop.rejected = True
371
+
372
+ def set_latest_action(self, action: Dict[Text, Text]) -> None:
373
+ """Sets latest action name or text.
374
+
375
+ Resets loop validation and rejection parameters.
376
+
377
+ Args:
378
+ action: Serialized action event.
379
+ """
380
+ self.latest_action = action
381
+ if self.active_loop is not None and self.active_loop_name:
382
+ # reset form validation if some loop is active
383
+ self.active_loop.is_interrupted = False
384
+
385
+ if (
386
+ self.active_loop is not None
387
+ and action.get(ACTION_NAME) == self.active_loop_name
388
+ ):
389
+ # reset loop rejection if it was predicted again
390
+ self.active_loop.rejected = False
391
+
392
+ def current_slot_values(self) -> Dict[Text, Any]:
393
+ """Return the currently set values of the slots."""
394
+ return {key: slot.value for key, slot in self.slots.items()}
395
+
396
+ def get_slot(self, key: Text) -> Optional[Any]:
397
+ """Retrieves the value of a slot."""
398
+ if key in self.slots:
399
+ return self.slots[key].value
400
+ else:
401
+ logger.info(f"Tried to access non existent slot '{key}'")
402
+ return None
403
+
404
+ def create_stack_updated_events(
405
+ self, updated_stack: "DialogueStack"
406
+ ) -> List[Event]:
407
+ """Creates events to update the stack to the given one."""
408
+ patch = self._underlying_stack.create_stack_patch(updated_stack)
409
+
410
+ # if there is no patch, this is a no-op
411
+ if patch:
412
+ return [DialogueStackUpdated(patch)]
413
+ return []
414
+
415
+ def update_stack(self, updated_stack: "DialogueStack") -> None:
416
+ """Set's the updated stack on this tracker."""
417
+ for event in self.create_stack_updated_events(updated_stack):
418
+ self.update(event)
419
+
420
+ def apply_stack_update(self, update: str) -> None:
421
+ self._underlying_stack = self._underlying_stack.update_from_patch(update)
422
+
423
+ def previous_stack_states(self) -> Generator["DialogueStack", None, None]:
424
+ """Generates the previous stack states of this tracker."""
425
+ from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
426
+
427
+ tracker = self.init_copy()
428
+ previous_stack = DialogueStack.empty()
429
+ yield previous_stack
430
+ for event in self.applied_events():
431
+ tracker.update(event)
432
+ stack = tracker.stack
433
+ if stack != previous_stack:
434
+ previous_stack = stack
435
+ yield stack
436
+
437
+ @property
438
+ def stack(self) -> "DialogueStack":
439
+ """Returns the current stack as a copy.
440
+
441
+ Important, modifying the returned stack does not modify the stack
442
+ stored on the tracker.
443
+ """
444
+ return self._underlying_stack.copy()
445
+
446
+ @property
447
+ def active_flow(self) -> Optional[Text]:
448
+ """Returns the name of the active flow."""
449
+ current_context = self.stack.current_context()
450
+ return current_context.get("flow_id")
451
+
452
+ @property
453
+ def current_step_id(self) -> Optional[str]:
454
+ """Returns the id of the current step id."""
455
+ current_context = self.stack.current_context()
456
+ return current_context.get("step_id")
457
+
458
+ @property
459
+ def has_coexistence_routing_slot(self) -> bool:
460
+ """Returns whether the coexistence routing slot is present."""
461
+ if self.slots:
462
+ return ROUTE_TO_CALM_SLOT in self.slots
463
+ return False
464
+
465
+ def has_bot_message_after_latest_user_message(self) -> bool:
466
+ """Checks if there is a bot message after the most recent user message.
467
+
468
+ Returns:
469
+ `True` if there is an action after the most recent user message.
470
+ """
471
+ for event in reversed(self.applied_events()):
472
+ if isinstance(event, BotUttered):
473
+ return True
474
+ elif isinstance(event, UserUttered):
475
+ return False
476
+ return False
477
+
478
+ def has_action_after_latest_user_message(self) -> bool:
479
+ """Check if there is an action after the most recent user message.
480
+
481
+ Returns:
482
+ `True` if there is an action after the most recent user message.
483
+ """
484
+ for event in reversed(self.applied_events()):
485
+ if isinstance(event, ActionExecuted):
486
+ return True
487
+ elif isinstance(event, UserUttered):
488
+ return False
489
+ return False
490
+
491
+ def get_latest_entity_values(
492
+ self,
493
+ entity_type: Text,
494
+ entity_role: Optional[Text] = None,
495
+ entity_group: Optional[Text] = None,
496
+ ) -> Iterator[Text]:
497
+ """Get entity values for latest message.
498
+
499
+ Returns entity values found for the passed entity type and
500
+ optional role and group in latest message.
501
+
502
+ If you are only interested in the first entity of a given type use
503
+ `next(tracker.get_latest_entity_values(`"`my_entity_name`"`), None)`.
504
+ If no entity is found `None` is the default result.
505
+
506
+ Args:
507
+ entity_type: the entity type of interest
508
+ entity_role: optional entity role of interest
509
+ entity_group: optional entity group of interest
510
+
511
+ Returns:
512
+ Entity values.
513
+ """
514
+ if self.latest_message is None:
515
+ return iter([])
516
+
517
+ return (
518
+ cast(Text, x[ENTITY_ATTRIBUTE_VALUE])
519
+ for x in self.latest_message.entities
520
+ if x.get(ENTITY_ATTRIBUTE_TYPE) == entity_type
521
+ and x.get(ENTITY_ATTRIBUTE_GROUP) == entity_group
522
+ and x.get(ENTITY_ATTRIBUTE_ROLE) == entity_role
523
+ )
524
+
525
+ def get_latest_input_channel(self) -> Optional[Text]:
526
+ """Get the name of the input_channel of the latest UserUttered event."""
527
+ for e in reversed(self.events):
528
+ if isinstance(e, UserUttered):
529
+ return e.input_channel
530
+ return None
531
+
532
+ def is_paused(self) -> bool:
533
+ """State whether the tracker is currently paused."""
534
+ return self._paused
535
+
536
+ def idx_after_latest_restart(self) -> int:
537
+ """Return the idx of the most recent restart in the list of events.
538
+
539
+ If the conversation has not been restarted, ``0`` is returned.
540
+ """
541
+ for i, event in enumerate(reversed(self.events)):
542
+ if isinstance(event, Restarted):
543
+ return len(self.events) - i
544
+
545
+ return 0
546
+
547
+ def events_after_latest_restart(self) -> List[Event]:
548
+ """Return a list of events after the most recent restart."""
549
+ return list(self.events)[self.idx_after_latest_restart() :]
550
+
551
+ def init_copy(self) -> "DialogueStateTracker":
552
+ """Creates a new state tracker with the same initial values."""
553
+ return DialogueStateTracker(
554
+ self.sender_id or DEFAULT_SENDER_ID,
555
+ self.slots.values(),
556
+ self._max_event_history,
557
+ is_rule_tracker=self.is_rule_tracker,
558
+ )
559
+
560
+ def generate_all_prior_trackers(
561
+ self,
562
+ ) -> Generator[Tuple["DialogueStateTracker", bool], None, None]:
563
+ """Returns a generator of the previous trackers of this tracker.
564
+
565
+ Returns:
566
+ The tuple with the tracker before each action,
567
+ and the boolean flag representing whether this action should be hidden
568
+ in the dialogue history created for ML-based policies.
569
+ """
570
+ tracker = self.init_copy()
571
+
572
+ for event in self.applied_events(True):
573
+ if isinstance(event, ActionExecuted):
574
+ yield tracker, event.hide_rule_turn
575
+
576
+ tracker.update(event)
577
+
578
+ yield tracker, False
579
+
580
+ def applied_events(self, featurization_for_policies: bool = False) -> List[Event]:
581
+ """Returns all actions that should be applied - w/o reverted events.
582
+
583
+ Returns:
584
+ The events applied to the tracker.
585
+ """
586
+ loop_names = [
587
+ event.name
588
+ for event in self.events
589
+ if isinstance(event, ActiveLoop) and event.name
590
+ ]
591
+
592
+ applied_events: List[Event] = []
593
+
594
+ for event in self.events:
595
+ if isinstance(event, (Restarted, SessionStarted)):
596
+ applied_events = []
597
+ elif isinstance(event, RoutingSessionEnded) and featurization_for_policies:
598
+ # remove all events but the set slots events for the slots that are
599
+ # shared for coexistence.
600
+ applied_events = [
601
+ e
602
+ for e in applied_events
603
+ if isinstance(e, SlotSet)
604
+ and (slot := self.slots.get(e.key)) is not None
605
+ and slot.shared_for_coexistence
606
+ ]
607
+ elif isinstance(event, ActionReverted):
608
+ self._undo_till_previous(ActionExecuted, applied_events)
609
+ elif isinstance(event, UserUtteranceReverted):
610
+ # Seeing a user uttered event automatically implies there was
611
+ # a listen event right before it, so we'll first rewind the
612
+ # user utterance, then get the action right before it (also removes
613
+ # the `action_listen` action right before it).
614
+ self._undo_till_previous(UserUttered, applied_events)
615
+ self._undo_till_previous(ActionExecuted, applied_events)
616
+ elif (
617
+ isinstance(event, ActionExecuted)
618
+ and event.action_name in loop_names
619
+ and not self._first_loop_execution_or_unhappy_path(
620
+ event.action_name, applied_events
621
+ )
622
+ ):
623
+ self._undo_till_previous_loop_execution(
624
+ event.action_name, applied_events
625
+ )
626
+ else:
627
+ applied_events.append(event)
628
+
629
+ return applied_events
630
+
631
+ @staticmethod
632
+ def _undo_till_previous(event_type: Type[Event], done_events: List[Event]) -> None:
633
+ """Removes events from `done_events`.
634
+
635
+ Removes events from `done_events` until the first occurrence `event_type`
636
+ is found which is also removed.
637
+ """
638
+ # list gets modified - hence we need to copy events!
639
+ for e in reversed(done_events[:]):
640
+ del done_events[-1]
641
+ if isinstance(e, event_type):
642
+ break
643
+
644
+ def _first_loop_execution_or_unhappy_path(
645
+ self, loop_action_name: Text, applied_events: List[Event]
646
+ ) -> bool:
647
+ next_action: Optional[Text] = None
648
+
649
+ for event in reversed(applied_events):
650
+ # Stop looking for a previous loop execution if there is a loop deactivation
651
+ # event because it means that the current loop is running for the first
652
+ # time and previous loop events belong to different loops.
653
+ if isinstance(event, ActiveLoop) and event.name is None:
654
+ return True
655
+
656
+ if self._is_within_unhappy_path(loop_action_name, event, next_action):
657
+ return True
658
+
659
+ if isinstance(event, ActionExecuted):
660
+ # We found a previous execution of the loop and we are not within an
661
+ # unhappy path.
662
+ if event.action_name == loop_action_name:
663
+ return False
664
+
665
+ # Remember the action as we need that to check whether we might be
666
+ # within an unhappy path.
667
+ next_action = event.action_name
668
+
669
+ return True
670
+
671
+ @staticmethod
672
+ def _is_within_unhappy_path(
673
+ loop_action_name: Text, event: Event, next_action_in_the_future: Optional[Text]
674
+ ) -> bool:
675
+ # When actual users are talking to the action has to return an
676
+ # `ActionExecutionRejected` in order to enter an unhappy path.
677
+ loop_was_rejected_previously = (
678
+ isinstance(event, ActionExecutionRejected)
679
+ and event.action_name == loop_action_name
680
+ )
681
+ # During the policy training there are no `ActionExecutionRejected` events
682
+ # which let us see whether we are within an unhappy path. Hence, we check if a
683
+ # different action was executed instead of the loop after last user utterance.
684
+ other_action_after_latest_user_utterance = (
685
+ isinstance(event, UserUttered)
686
+ and next_action_in_the_future is not None
687
+ and next_action_in_the_future != loop_action_name
688
+ )
689
+
690
+ return loop_was_rejected_previously or other_action_after_latest_user_utterance
691
+
692
+ @staticmethod
693
+ def _undo_till_previous_loop_execution(
694
+ loop_action_name: Text, done_events: List[Event]
695
+ ) -> None:
696
+ offset = 0
697
+ for e in reversed(done_events[:]):
698
+ if isinstance(e, ActionExecuted) and e.action_name == loop_action_name:
699
+ break
700
+
701
+ if isinstance(
702
+ e, (ActionExecuted, UserUttered, DefinePrevUserUtteredFeaturization)
703
+ ):
704
+ del done_events[-1 - offset]
705
+ else:
706
+ # Remember events which aren't unfeaturized to get the index right
707
+ offset += 1
708
+
709
+ def replay_events(self) -> None:
710
+ """Update the tracker based on a list of events."""
711
+ applied_events = self.applied_events()
712
+ for event in applied_events:
713
+ event.apply_to(self)
714
+
715
+ def recreate_from_dialogue(self, dialogue: Dialogue) -> None:
716
+ """Use a serialised `Dialogue` to update the trackers state.
717
+
718
+ This uses the state as is persisted in a ``TrackerStore``. If the
719
+ tracker is blank before calling this method, the final state will be
720
+ identical to the tracker from which the dialogue was created.
721
+ """
722
+ if not isinstance(dialogue, Dialogue):
723
+ raise ValueError(
724
+ f"story {dialogue} is not of type Dialogue. "
725
+ f"Have you deserialized it?"
726
+ )
727
+
728
+ self._reset()
729
+ self.events.extend(dialogue.events)
730
+ self.replay_events()
731
+
732
+ def copy(self) -> "DialogueStateTracker":
733
+ """Creates a duplicate of this tracker."""
734
+ return copy.deepcopy(self)
735
+
736
+ def travel_back_in_time(self, target_time: float) -> "DialogueStateTracker":
737
+ """Creates a new tracker with a state at a specific timestamp.
738
+
739
+ A new tracker will be created and all events previous to the
740
+ passed time stamp will be replayed. Events that occur exactly
741
+ at the target time will be included.
742
+ """
743
+ tracker = self.init_copy()
744
+
745
+ for event in self.events:
746
+ if event.timestamp <= target_time:
747
+ tracker.update(event)
748
+ else:
749
+ break
750
+
751
+ return tracker # yields the final state
752
+
753
+ def as_dialogue(self) -> Dialogue:
754
+ """Return a ``Dialogue`` object containing all of the turns.
755
+
756
+ This can be serialised and later used to recover the state
757
+ of this tracker exactly.
758
+ """
759
+ return Dialogue(self.sender_id, list(self.events))
760
+
761
+ def update(self, event: Event, domain: Optional[Domain] = None) -> None:
762
+ """Modify the state of the tracker according to an ``Event``."""
763
+ if not isinstance(event, Event): # pragma: no cover
764
+ raise ValueError("event to log must be an instance of a subclass of Event.")
765
+
766
+ if self.model_id and METADATA_MODEL_ID not in event.metadata:
767
+ event.metadata = {**event.metadata, METADATA_MODEL_ID: self.model_id}
768
+
769
+ if self.assistant_id and ASSISTANT_ID_KEY not in event.metadata:
770
+ event.metadata = {**event.metadata, ASSISTANT_ID_KEY: self.assistant_id}
771
+
772
+ self.events.append(event)
773
+ event.apply_to(self)
774
+
775
+ def update_with_events(
776
+ self,
777
+ new_events: List[Event],
778
+ # TODO: remove domain argument - breaking change.
779
+ domain: Optional[Domain] = None,
780
+ override_timestamp: bool = True,
781
+ ) -> None:
782
+ """Adds multiple events to the tracker.
783
+
784
+ Args:
785
+ new_events: Events to apply.
786
+ domain: The current model's domain. Not needed anymore.
787
+ kept for backwards compatibility.
788
+ override_timestamp: If `True` refresh all timestamps of the events. As the
789
+ events are usually created at some earlier point, this makes sure that
790
+ all new events come after any current tracker events.
791
+ """
792
+ for e in new_events:
793
+ if override_timestamp:
794
+ e.timestamp = time.time()
795
+ self.update(e, domain)
796
+
797
+ def as_story(self, include_source: bool = False) -> "Story":
798
+ """Dump the tracker as a story in the Rasa Core story format.
799
+
800
+ Returns the dumped tracker as a string.
801
+ """
802
+ from rasa.shared.core.training_data.structures import Story
803
+
804
+ story_name = (
805
+ f"{self.sender_id} ({self.sender_source})"
806
+ if include_source
807
+ else self.sender_id
808
+ )
809
+ return Story.from_events(list(self.events), story_name)
810
+
811
+ def export_stories(
812
+ self,
813
+ writer: "StoryWriter",
814
+ e2e: bool = False,
815
+ include_source: bool = False,
816
+ should_append_stories: bool = False,
817
+ ) -> Text:
818
+ """Dump the tracker as a story in the Rasa Core story format.
819
+
820
+ Returns:
821
+ The dumped tracker as a string.
822
+ """
823
+ story = self.as_story(include_source)
824
+ return writer.dumps(
825
+ story.story_steps, is_appendable=should_append_stories, is_test_story=e2e
826
+ )
827
+
828
+ def export_stories_to_file(self, export_path: Text = "debug_stories.yml") -> None:
829
+ """Dump the tracker as a story to a file."""
830
+ from rasa.shared.core.training_data.story_writer.yaml_story_writer import (
831
+ YAMLStoryWriter,
832
+ )
833
+
834
+ append = os.path.exists(export_path)
835
+
836
+ rasa.shared.utils.io.write_text_file(
837
+ self.export_stories(YAMLStoryWriter(), should_append_stories=append) + "\n",
838
+ export_path,
839
+ append=append,
840
+ )
841
+
842
+ def get_last_event_for(
843
+ self,
844
+ event_type: Union[Type["EventTypeAlias"], Tuple[Type["EventTypeAlias"], ...]],
845
+ action_names_to_exclude: Optional[List[Text]] = None,
846
+ skip: int = 0,
847
+ event_verbosity: EventVerbosity = EventVerbosity.APPLIED,
848
+ ) -> Optional["EventTypeAlias"]:
849
+ """Gets the last event of a given type which was actually applied.
850
+
851
+ Args:
852
+ event_type: The type of event you want to find.
853
+ action_names_to_exclude: Events of type `ActionExecuted` which
854
+ should be excluded from the results. Can be used to skip
855
+ `action_listen` events.
856
+ skip: Skips n possible results before return an event.
857
+ event_verbosity: Which `EventVerbosity` should be used to search for events.
858
+
859
+ Returns:
860
+ event which matched the query or `None` if no event matched.
861
+ """
862
+ to_exclude = action_names_to_exclude or []
863
+
864
+ def filter_function(e: Event) -> bool:
865
+ has_instance = isinstance(e, event_type)
866
+ excluded = isinstance(e, ActionExecuted) and e.action_name in to_exclude
867
+ return has_instance and not excluded
868
+
869
+ filtered = filter(
870
+ filter_function, reversed(self._events_for_verbosity(event_verbosity) or [])
871
+ )
872
+
873
+ for i in range(skip):
874
+ next(filtered, None)
875
+
876
+ return next(filtered, None)
877
+
878
+ def last_executed_action_has(self, name: Text, skip: int = 0) -> bool:
879
+ """Returns whether last `ActionExecuted` event had a specific name.
880
+
881
+ Args:
882
+ name: Name of the event which should be matched.
883
+ skip: Skips n possible results in between.
884
+
885
+ Returns:
886
+ `True` if last executed action had name `name`, otherwise `False`.
887
+ """
888
+ last: Optional[ActionExecuted] = self.get_last_event_for(
889
+ ActionExecuted, action_names_to_exclude=[ACTION_LISTEN_NAME], skip=skip
890
+ )
891
+ return last is not None and last.action_name == name
892
+
893
+ ###
894
+ # Internal methods for the modification of the trackers state. Should
895
+ # only be called by events, not directly. Rather update the tracker
896
+ # with an event that in its ``apply_to`` method modifies the tracker.
897
+ ###
898
+ def _reset(self, is_coexistence_reset: bool = False) -> None:
899
+ """Reset tracker to initial state - doesn't delete events though!."""
900
+ from rasa.dialogue_understanding.stack.dialogue_stack import DialogueStack
901
+
902
+ self._reset_slots(is_coexistence_reset)
903
+ self._paused = False
904
+ self.latest_action = {}
905
+ self.latest_message = UserUttered.empty()
906
+ self.latest_bot_utterance = BotUttered.empty()
907
+ self.followup_action = ACTION_LISTEN_NAME
908
+ self.active_loop = None
909
+ self._underlying_stack = DialogueStack.empty()
910
+
911
+ def _reset_slots(self, is_coexistence_reset: bool = False) -> None:
912
+ """Set all the slots to their initial value."""
913
+ for slot in self.slots.values():
914
+ # skip slots with shared_for_coexistence during this reset
915
+ if is_coexistence_reset and slot.shared_for_coexistence:
916
+ continue
917
+ slot.reset()
918
+
919
+ def _set_slot(self, key: Text, value: Any) -> None:
920
+ """Sets the value of a slot if that slot exists."""
921
+ if key in self.slots:
922
+ slot = self.slots[key]
923
+ slot.value = value
924
+ else:
925
+ logger.error(
926
+ f"Tried to set non existent slot '{key}'. Make sure you "
927
+ f"added all your slots to your domain file."
928
+ )
929
+
930
+ def _create_events(self, evts: List[Event]) -> Deque[Event]:
931
+ if evts and not isinstance(evts[0], Event): # pragma: no cover
932
+ raise ValueError("events, if given, must be a list of events")
933
+ return deque(evts, self._max_event_history)
934
+
935
+ def __eq__(self, other: Any) -> bool:
936
+ if isinstance(self, type(other)):
937
+ return other.events == self.events and self.sender_id == other.sender_id
938
+ else:
939
+ return False
940
+
941
+ def __ne__(self, other: Any) -> bool:
942
+ return not self.__eq__(other)
943
+
944
+ def __repr__(self) -> Text:
945
+ """Returns event as string for debugging."""
946
+ return f"DialogueStateTracker(sender_id: {self.sender_id})"
947
+
948
+ def __str__(self) -> Text:
949
+ """Returns event as human-readable string."""
950
+ return f"{self.__class__.__name__}({self.sender_id})"
951
+
952
+ def trigger_followup_action(self, action: Text) -> None:
953
+ """Triggers another action following the execution of the current."""
954
+ self.followup_action = action
955
+
956
+ def clear_followup_action(self) -> None:
957
+ """Clears follow up action when it was executed."""
958
+ self.followup_action = None
959
+
960
+ @property
961
+ def active_loop_name(self) -> Optional[Text]:
962
+ """Get the name of the currently active loop.
963
+
964
+ Returns: `None` if no active loop or the name of the currently active loop.
965
+ """
966
+ if not self.active_loop or self.active_loop.name == SHOULD_NOT_BE_SET:
967
+ return None
968
+
969
+ return self.active_loop.name
970
+
971
+ @property
972
+ def latest_action_name(self) -> Optional[Text]:
973
+ """Get the name of the previously executed action or text of e2e action.
974
+
975
+ Returns: name of the previously executed action or text of e2e action
976
+ """
977
+ if self.latest_action is None:
978
+ return None
979
+
980
+ return self.latest_action.get(ACTION_NAME) or self.latest_action.get(
981
+ ACTION_TEXT
982
+ )
983
+
984
+ @property
985
+ def is_active_loop_rejected(self) -> bool:
986
+ """Return True if there is an active loop and it's rejected."""
987
+ return self.active_loop is not None and self.active_loop.rejected
988
+
989
+ @property
990
+ def is_active_loop_interrupted(self) -> bool:
991
+ """Return True if there is an active loop and it's interrupted."""
992
+ return self.active_loop is not None and self.active_loop.is_interrupted
993
+
994
+ def fingerprint(self) -> Text:
995
+ """Returns a unique hash for the tracker which is stable across python runs.
996
+
997
+ Returns:
998
+ fingerprint of the tracker
999
+ """
1000
+ data: Dict[Text, Any] = {"sender_id": self.sender_id}
1001
+
1002
+ if self.slots:
1003
+ data.update(self.slots)
1004
+
1005
+ if self.events:
1006
+ data["events"] = list(self.events)
1007
+
1008
+ return rasa.shared.utils.io.get_dictionary_fingerprint(data)
1009
+
1010
+ def get_previously_started_flows(
1011
+ self,
1012
+ flows: FlowsList,
1013
+ max_turns: Optional[int] = 20,
1014
+ ) -> FlowsList:
1015
+ """Retrieves a list of previously started flows.
1016
+
1017
+ Returned flows have been started in the past within a given
1018
+ number of conversation turns.
1019
+
1020
+ Args:
1021
+ flows: list of flows to check against for started flows.
1022
+ max_turns: the maximum number of turns to include in the transcript.
1023
+
1024
+ Returns:
1025
+ List of flows that have been started within the specified number of turns
1026
+ """
1027
+ previously_started_flows = dict()
1028
+ turn_counter = 0
1029
+
1030
+ # cycle through events in reverse order (newest events are appended at the end)
1031
+ for event in reversed(self.events):
1032
+ # check for FlowStarted event and append flow if it's in the flows lists
1033
+ if (
1034
+ isinstance(event, FlowStarted)
1035
+ and event.flow_id not in previously_started_flows
1036
+ and (flow := flows.flow_by_id(event.flow_id))
1037
+ ):
1038
+ previously_started_flows[event.flow_id] = flow
1039
+
1040
+ # count turns only for user or bot utterances
1041
+ if isinstance(event, (UserUttered, BotUttered)):
1042
+ turn_counter += 1
1043
+ if max_turns is not None and turn_counter > max_turns:
1044
+ break
1045
+
1046
+ return FlowsList(underlying_flows=list(previously_started_flows.values()))
1047
+
1048
+ def get_startable_flows(self, flows: FlowsList) -> FlowsList:
1049
+ """Retrieves a list of flows that can be started.
1050
+
1051
+ Returned flows are startable given the current
1052
+ state (context and slot values) of the tracker.
1053
+
1054
+ Args:
1055
+ flows: list of flows to check against for startable flows.
1056
+
1057
+ Returns:
1058
+ List of flows that are startable within the current state of the tracker
1059
+ """
1060
+ # get the current context and slot values for the flow guard check
1061
+ context = self.stack.current_context()
1062
+ slots = self.slots
1063
+ return flows.get_startable_flows(context, slots)
1064
+
1065
+ @property
1066
+ def has_active_user_flow(self) -> bool:
1067
+ from rasa.dialogue_understanding.stack.utils import top_user_flow_frame
1068
+
1069
+ top_relevant_frame = top_user_flow_frame(self.stack)
1070
+ return bool(top_relevant_frame and top_relevant_frame.flow_id)
1071
+
1072
+ def get_active_flows(self, flows: FlowsList) -> FlowsList:
1073
+ """Retrieve a list of all currently active flows.
1074
+
1075
+ Args:
1076
+ flows: list of flows to check against for active flows.
1077
+
1078
+ Returns:
1079
+ List of flows that are active within the current state of the tracker
1080
+ """
1081
+ from rasa.dialogue_understanding.stack.frames import UserFlowStackFrame
1082
+ from rasa.dialogue_understanding.stack.frames.flow_stack_frame import (
1083
+ FlowStackFrameType,
1084
+ )
1085
+
1086
+ active_flows = []
1087
+ for frame in reversed(self.stack.frames):
1088
+ # The stack just contains the current active frames and we are just
1089
+ # interested in the user flow stack frames.
1090
+ if isinstance(frame, UserFlowStackFrame):
1091
+ active_flows.append(frame.flow(flows))
1092
+ if frame.frame_type != FlowStackFrameType.CALL:
1093
+ # Iterate unitl we reach a frame that is not a call frame.
1094
+ break
1095
+
1096
+ return FlowsList(active_flows)
1097
+
1098
+
1099
+ class TrackerEventDiffEngine:
1100
+ """Computes event difference of two trackers."""
1101
+
1102
+ @staticmethod
1103
+ def event_difference(
1104
+ original: DialogueStateTracker, tracker: DialogueStateTracker
1105
+ ) -> List[Event]:
1106
+ """Find all events in the tracker not present in the original tracker.
1107
+
1108
+ Args:
1109
+ original: Original tracker to compare against.
1110
+ tracker: Tracker containing events from the current conversation session.
1111
+
1112
+ Returns:
1113
+ List of events from the new tracker which are not present
1114
+ in the original tracker.
1115
+ """
1116
+ offset = len(original.events) if original else 0
1117
+ events = tracker.events
1118
+ return list(itertools.islice(events, offset, len(events)))
1119
+
1120
+
1121
+ def get_active_loop_name(
1122
+ state: State,
1123
+ ) -> Optional[Text]:
1124
+ """Get the name of current active loop.
1125
+
1126
+ Args:
1127
+ state: The state from which the name of active loop should be extracted
1128
+
1129
+ Return:
1130
+ the name of active loop or None
1131
+ """
1132
+ if (
1133
+ not state.get(ACTIVE_LOOP)
1134
+ or state[ACTIVE_LOOP].get(LOOP_NAME) == SHOULD_NOT_BE_SET
1135
+ ):
1136
+ return None
1137
+
1138
+ # FIXME: better type annotation for `State` would require
1139
+ # a larger refactoring (e.g. switch to dataclass)
1140
+ return cast(Optional[Text], state[ACTIVE_LOOP].get(LOOP_NAME))
1141
+
1142
+
1143
+ def is_prev_action_listen_in_state(state: State) -> bool:
1144
+ """Check if action_listen is the previous executed action.
1145
+
1146
+ Args:
1147
+ state: The state for which the check should be performed
1148
+
1149
+ Return:
1150
+ boolean value indicating whether action_listen is previous action
1151
+ """
1152
+ prev_action_name = state.get(PREVIOUS_ACTION, {}).get(ACTION_NAME)
1153
+ return prev_action_name == ACTION_LISTEN_NAME
1154
+
1155
+
1156
+ def get_trackers_for_conversation_sessions(
1157
+ tracker: DialogueStateTracker,
1158
+ ) -> List[DialogueStateTracker]:
1159
+ """Generate trackers for `tracker` that are split by conversation sessions.
1160
+
1161
+ Args:
1162
+ tracker: Instance of `DialogueStateTracker` to split.
1163
+
1164
+ Returns:
1165
+ The trackers split by conversation sessions.
1166
+ """
1167
+ split_conversations = events.split_events(
1168
+ tracker.events,
1169
+ ActionExecuted,
1170
+ {"action_name": ACTION_SESSION_START_NAME},
1171
+ include_splitting_event=True,
1172
+ )
1173
+
1174
+ return [
1175
+ DialogueStateTracker.from_events(
1176
+ tracker.sender_id,
1177
+ evts,
1178
+ tracker.slots.values(),
1179
+ sender_source=tracker.sender_source,
1180
+ max_event_history=tracker._max_event_history,
1181
+ )
1182
+ for evts in split_conversations
1183
+ ]