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
rasa/core/exporter.py ADDED
@@ -0,0 +1,284 @@
1
+ import logging
2
+ import uuid
3
+ import datetime
4
+ from typing import AsyncIterator, Text, Optional, List, Set, Dict, Any
5
+
6
+ from tqdm import tqdm
7
+
8
+ import rasa.shared.utils.cli
9
+ import rasa.shared.utils.io
10
+ from rasa.core.brokers.broker import EventBroker
11
+ from rasa.core.brokers.pika import PikaEventBroker
12
+ from rasa.core.constants import RASA_EXPORT_PROCESS_ID_HEADER_NAME
13
+ from rasa.core.tracker_store import TrackerStore
14
+ from rasa.shared.core.trackers import EventVerbosity
15
+ from rasa.exceptions import (
16
+ NoEventsToMigrateError,
17
+ NoConversationsInTrackerStoreError,
18
+ PublishingError,
19
+ )
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+
24
+ class Exporter:
25
+ """Manages the publishing of events in a tracker store to an event broker.
26
+
27
+ Attributes:
28
+ endpoints_path: Path to the endpoints file used to configure the event
29
+ broker and tracker store. If `None`, the default path ('endpoints.yml')
30
+ is used.
31
+ tracker_store: `TrackerStore` to export conversations from.
32
+ event_broker: `EventBroker` to export conversations to.
33
+ requested_conversation_ids: List of conversation IDs requested to be
34
+ processed.
35
+ minimum_timestamp: Minimum timestamp of events that are published.
36
+ If `None`, apply no such constraint.
37
+ maximum_timestamp: Maximum timestamp of events that are published.
38
+ If `None`, apply no such constraint.
39
+ """
40
+
41
+ def __init__(
42
+ self,
43
+ tracker_store: TrackerStore,
44
+ event_broker: EventBroker,
45
+ endpoints_path: Text,
46
+ requested_conversation_ids: Optional[Text] = None,
47
+ minimum_timestamp: Optional[float] = None,
48
+ maximum_timestamp: Optional[float] = None,
49
+ offset_timestamps_by_seconds: Optional[int] = None,
50
+ ) -> None:
51
+ self.endpoints_path = endpoints_path
52
+ self.tracker_store = tracker_store
53
+
54
+ self.event_broker = event_broker
55
+ self.requested_conversation_ids = requested_conversation_ids
56
+ self.minimum_timestamp = minimum_timestamp
57
+ self.maximum_timestamp = maximum_timestamp
58
+ self.offset_timestamps_by_seconds = offset_timestamps_by_seconds
59
+
60
+ async def publish_events(self) -> int:
61
+ """Publish events in a tracker store using an event broker.
62
+
63
+ Exits if the publishing of events is interrupted due to an error. In that case,
64
+ the CLI command to continue the export where it was interrupted is printed.
65
+
66
+ Returns:
67
+ The number of successfully published events.
68
+ """
69
+ self._print_offset_info()
70
+
71
+ published_events = 0
72
+ current_timestamp = None
73
+
74
+ headers = self._get_message_headers()
75
+
76
+ async for event in self._fetch_events_within_time_range():
77
+ # noinspection PyBroadException
78
+ try:
79
+ self._publish_with_message_headers(event, headers)
80
+ published_events += 1
81
+ current_timestamp = event["timestamp"]
82
+ except Exception as e:
83
+ logger.exception(e)
84
+ raise PublishingError(current_timestamp)
85
+
86
+ await self.event_broker.close()
87
+
88
+ return published_events
89
+
90
+ def _print_offset_info(self) -> None:
91
+ """Output information about the offset applied to event timestamps."""
92
+ if self.offset_timestamps_by_seconds is None:
93
+ return
94
+
95
+ delta = datetime.timedelta(seconds=abs(self.offset_timestamps_by_seconds))
96
+ operator = "-" if self.offset_timestamps_by_seconds > 0 else ""
97
+ rasa.shared.utils.cli.print_info(
98
+ f"All event timestamps will be offset by {operator}{delta}! ⏰"
99
+ )
100
+
101
+ def _get_message_headers(self) -> Optional[Dict[Text, Text]]:
102
+ """Generate a message header for publishing events to a `PikaEventBroker`.
103
+
104
+ Returns:
105
+ Message headers with a randomly generated uuid under the
106
+ `RASA_EXPORT_PROCESS_ID_HEADER_NAME` key if `self.event_broker` is a
107
+ `PikaEventBroker`, else `None`.
108
+
109
+ """
110
+ if isinstance(self.event_broker, PikaEventBroker):
111
+ return {RASA_EXPORT_PROCESS_ID_HEADER_NAME: uuid.uuid4().hex}
112
+
113
+ return None
114
+
115
+ def _publish_with_message_headers(
116
+ self, original_event: Dict[Text, Any], headers: Optional[Dict[Text, Text]]
117
+ ) -> None:
118
+ """Publish `event` to a message broker with `headers`.
119
+
120
+ Args:
121
+ original_event: Serialized event to be published.
122
+ headers: Message headers to be published if `self.event_broker` is a
123
+ `PikaEventBroker`.
124
+
125
+ """
126
+ if self.offset_timestamps_by_seconds is not None:
127
+ event = dict(original_event)
128
+ event["timestamp"] += self.offset_timestamps_by_seconds
129
+ else:
130
+ event = original_event
131
+
132
+ if isinstance(self.event_broker, PikaEventBroker):
133
+ self.event_broker.publish(event=event, headers=headers)
134
+ else:
135
+ self.event_broker.publish(event)
136
+
137
+ async def _get_conversation_ids_in_tracker(self) -> Set[Text]:
138
+ """Fetch conversation IDs in `self.tracker_store`.
139
+
140
+ Returns:
141
+ A set of conversation IDs in `self.tracker_store`.
142
+
143
+ Raises:
144
+ `NoConversationsInTrackerStoreError` if
145
+ `conversation_ids_in_tracker_store` is empty.
146
+
147
+ """
148
+ conversation_ids_in_tracker_store = set(await self.tracker_store.keys())
149
+
150
+ if conversation_ids_in_tracker_store:
151
+ return conversation_ids_in_tracker_store
152
+
153
+ raise NoConversationsInTrackerStoreError(
154
+ "Could not find any conversations in connected tracker store. "
155
+ "Please validate your `endpoints.yml` and make sure the defined "
156
+ "tracker store exists. Exiting."
157
+ )
158
+
159
+ def _validate_all_requested_ids_exist(
160
+ self, conversation_ids_in_tracker_store: Set[Text]
161
+ ) -> None:
162
+ """Warn user if `self.requested_conversation_ids` contains IDs not found in
163
+ `conversation_ids_in_tracker_store`.
164
+
165
+ Args:
166
+ conversation_ids_in_tracker_store: Set of conversation IDs contained in
167
+ the tracker store.
168
+
169
+ """
170
+ missing_ids_in_tracker_store = (
171
+ set(self.requested_conversation_ids) - conversation_ids_in_tracker_store
172
+ )
173
+ if missing_ids_in_tracker_store:
174
+ rasa.shared.utils.cli.print_warning(
175
+ f"Could not find the following requested "
176
+ f"conversation IDs in connected tracker store: "
177
+ f"{', '.join(sorted(missing_ids_in_tracker_store))}"
178
+ )
179
+
180
+ async def _get_conversation_ids_to_process(self) -> Set[Text]:
181
+ """Get conversation IDs that are good for processing.
182
+
183
+ Finds the intersection of events that are contained in the tracker store with
184
+ those events requested as a command-line argument.
185
+
186
+ Returns:
187
+ Conversation IDs that are both requested and contained in the tracker
188
+ store. If no conversation IDs are requested, all conversation IDs in the
189
+ tracker store are returned.
190
+
191
+ """
192
+ conversation_ids_in_tracker_store = (
193
+ await self._get_conversation_ids_in_tracker()
194
+ )
195
+
196
+ if not self.requested_conversation_ids:
197
+ return conversation_ids_in_tracker_store
198
+
199
+ self._validate_all_requested_ids_exist(conversation_ids_in_tracker_store)
200
+
201
+ conversation_ids_to_process = conversation_ids_in_tracker_store & set(
202
+ self.requested_conversation_ids
203
+ )
204
+
205
+ if not conversation_ids_to_process:
206
+ raise NoEventsToMigrateError(
207
+ "Could not find an overlap between the requested "
208
+ "conversation IDs and those found in the tracker store. Exiting."
209
+ )
210
+
211
+ return conversation_ids_to_process
212
+
213
+ async def _fetch_events_within_time_range(self) -> AsyncIterator[Dict[Text, Any]]:
214
+ """Fetch all events for `conversation_ids` within the supplied time range.
215
+
216
+ Returns:
217
+ Serialized events with added `sender_id` field.
218
+
219
+ """
220
+ conversation_ids_to_process = await self._get_conversation_ids_to_process()
221
+
222
+ rasa.shared.utils.cli.print_info(
223
+ f"Fetching events for {len(conversation_ids_to_process)} "
224
+ f"conversation IDs:"
225
+ )
226
+ for conversation_id in tqdm(conversation_ids_to_process, "conversation IDs"):
227
+ tracker = await self.tracker_store.retrieve_full_tracker(conversation_id)
228
+ if not tracker:
229
+ logger.info(
230
+ f"Could not retrieve tracker for conversation ID "
231
+ f"'{conversation_id}'. Skipping."
232
+ )
233
+ continue
234
+
235
+ _events = tracker.current_state(EventVerbosity.ALL)["events"]
236
+
237
+ if not _events:
238
+ logger.info(
239
+ f"No events to migrate for conversation ID '{conversation_id}'."
240
+ )
241
+ continue
242
+
243
+ events = self._get_events_for_conversation_id(_events, conversation_id)
244
+
245
+ # the order of events was changed after ATO-2192
246
+ # more context: https://github.com/RasaHQ/rasa/pull/13019
247
+ # we should sort the events by timestamp to keep the order
248
+ events.sort(key=lambda x: x["timestamp"])
249
+
250
+ # the conversation IDs are needed in the event publishing
251
+ for event in events:
252
+ if (
253
+ self.minimum_timestamp is not None
254
+ and event["timestamp"] < self.minimum_timestamp
255
+ ):
256
+ continue
257
+ if (
258
+ self.maximum_timestamp is not None
259
+ and event["timestamp"] >= self.maximum_timestamp
260
+ ):
261
+ continue
262
+ yield event
263
+
264
+ @staticmethod
265
+ def _get_events_for_conversation_id(
266
+ events: List[Dict[Text, Any]], conversation_id: Text
267
+ ) -> List[Dict[Text, Any]]:
268
+ """Get serialised events with added `sender_id` key.
269
+
270
+ Args:
271
+ events: Events to modify.
272
+ conversation_id: Conversation ID to add to events.
273
+
274
+ Returns:
275
+ Events with added `sender_id` key.
276
+
277
+ """
278
+ events_with_conversation_id = []
279
+
280
+ for event in events:
281
+ event["sender_id"] = conversation_id
282
+ events_with_conversation_id.append(event)
283
+
284
+ return events_with_conversation_id
File without changes
@@ -0,0 +1,410 @@
1
+ from __future__ import annotations
2
+ from typing import Optional, Text, Dict, List, Union, Iterable, Any
3
+ from collections.abc import ValuesView, KeysView
4
+
5
+ from rasa.engine.graph import GraphComponent
6
+ from rasa.engine.storage.storage import ModelStorage
7
+ from rasa.engine.storage.resource import Resource
8
+ from rasa.engine.graph import ExecutionContext
9
+ from rasa.shared.core.domain import Domain, SubState
10
+ from rasa.shared.core.events import ActionExecuted, UserUttered, Event
11
+ from rasa.shared.core.trackers import DialogueStateTracker
12
+ from rasa.shared.core.training_data.structures import StoryGraph
13
+ from rasa.shared.nlu.constants import ACTION_NAME, ACTION_TEXT, INTENT, TEXT
14
+ from rasa.shared.nlu.training_data.message import Message
15
+ from rasa.shared.nlu.training_data.training_data import TrainingData
16
+ from rasa.shared.nlu.training_data.features import Features
17
+ import rasa.shared.utils.io
18
+
19
+ # TODO: make precomputations (MessageContainerForCoreFeaturization) cacheable
20
+
21
+
22
+ class MessageContainerForCoreFeaturization:
23
+ """A key-value store for specific `Messages`.
24
+
25
+ This container can be only be used to store messages that contain exactly
26
+ one of the following attributes: `ACTION_NAME`, `ACTION_TEXT`, `TEXT`, or `INTENT`.
27
+ A combination of the key attribute and the corresponding value will be used as
28
+ key for the respective message.
29
+
30
+ Background/Motivation:
31
+ - Our policies only require these attributes to be tokenized and/or featurized
32
+ via NLU graph components, which is why we don't care about storing anything else.
33
+ - Our tokenizers and featurizers work independently for each attribute,
34
+ which is why we can separate them and ask for "exactly one" of the key
35
+ attributes.
36
+ - Our tokenizers add attributes (e.g. token sequences) and not just `Features`,
37
+ which is why we need messages and why we allow messages to contain more than
38
+ just the key attributes.
39
+ - Due to the way we use this datastructure, it won't contain all features that the
40
+ policies need (cf. `rasa.core.featurizers.SingleStateFeaturizer`) and sometimes
41
+ the messages will contain no features at all, which is the motivation for the
42
+ name of this class.
43
+ - Values for different attributes might coincide (e.g. 'greet' can appear as user
44
+ text as well as name of an intent), but attributes are not all tokenized and
45
+ featurized in the same way, which is why we use the combination of key attribute
46
+ and value to identify a message.
47
+
48
+ Usage:
49
+ - At the start of core's featurization pipeline, we use this container to
50
+ de-duplicate the given story data during training (e.g. "Hello" might appear very
51
+ often but it will end up in the training data only once) and to de-duplicate
52
+ the data given in the tracker (e.g. if a text appears repeatedly in the
53
+ dialogue, it will only be featurized once later).
54
+ See: `rasa.core.featurizers.precomputation.CoreFeaturizationInputConverter`.
55
+ - At the end of core's featurization pipeline, we wrap all resulting
56
+ (training data) messages into this container again.
57
+ See: `rasa.core.featurizers.precomputation.CoreFeaturizationCollector`.
58
+ """
59
+
60
+ KEY_ATTRIBUTES = [ACTION_NAME, ACTION_TEXT, TEXT, INTENT] # noqa: RUF012
61
+
62
+ def __init__(self) -> None:
63
+ """Creates an empty container for precomputations."""
64
+ self._table: Dict[Text, Dict[Text, Message]] = {
65
+ key: {} for key in self.KEY_ATTRIBUTES
66
+ }
67
+ self._num_collisions_ignored = 0
68
+
69
+ def fingerprint(self) -> Text:
70
+ """Fingerprint the container.
71
+
72
+ Returns:
73
+ hex string as a fingerprint of the container.
74
+ """
75
+ message_fingerprints = [
76
+ message.fingerprint() for message in self.all_messages()
77
+ ]
78
+ return rasa.shared.utils.io.deep_container_fingerprint(message_fingerprints)
79
+
80
+ def __repr__(self) -> Text:
81
+ return f"{self.__class__.__name__}({self._table})"
82
+
83
+ def __len__(self) -> int:
84
+ return sum(
85
+ len(key_attribute_table) for key_attribute_table in self._table.values()
86
+ )
87
+
88
+ def messages(self, key_attribute: Optional[Text] = None) -> ValuesView:
89
+ """Returns a view of all messages."""
90
+ if key_attribute not in self._table:
91
+ raise ValueError(
92
+ f"Expected key attribute (i.e. one of {self.KEY_ATTRIBUTES}) "
93
+ f"but received {key_attribute}."
94
+ )
95
+ return self._table[key_attribute].values()
96
+
97
+ def all_messages(self) -> List[Message]:
98
+ """Returns a list containing all messages."""
99
+ return [
100
+ message
101
+ for key_attribute_table in self._table.values()
102
+ for message in key_attribute_table.values()
103
+ ]
104
+
105
+ def keys(self, key_attribute: Text) -> KeysView:
106
+ """Returns a view of the value keys for the given key attribute."""
107
+ if key_attribute not in self._table:
108
+ raise ValueError(
109
+ f"Expected key attribute (i.e. one of {self.KEY_ATTRIBUTES}) "
110
+ f"but received {key_attribute}."
111
+ )
112
+ return self._table[key_attribute].keys()
113
+
114
+ @property
115
+ def num_collisions_ignored(self) -> int:
116
+ """Returns the number of collisions that have been ignored."""
117
+ return self._num_collisions_ignored
118
+
119
+ def add(self, message_with_one_key_attribute: Message) -> None:
120
+ """Adds the given message if it is not already present.
121
+
122
+ Args:
123
+ message_with_one_key_attribute: The message we want to add to the lookup
124
+ table. It must have exactly one key attribute.
125
+
126
+ Raises:
127
+ `ValueError` if the given message does not contain exactly one key
128
+ attribute or if there is a collision with a message that has a different
129
+ hash value
130
+ """
131
+ # extract the key pair
132
+ attributes = message_with_one_key_attribute.data.keys()
133
+ key_attributes = set(attributes).intersection(self.KEY_ATTRIBUTES)
134
+ if not key_attributes or len(key_attributes) != 1:
135
+ raise ValueError(
136
+ f"Expected exactly one attribute out of "
137
+ f"{self.KEY_ATTRIBUTES} but received {len(attributes)} attributes "
138
+ f"({attributes})."
139
+ )
140
+ key_attribute = list(key_attributes)[0] # noqa: RUF015
141
+ key_value = str(message_with_one_key_attribute.data[key_attribute])
142
+ # extract the message
143
+ existing_message = self._table[key_attribute].get(key_value)
144
+ if existing_message is not None:
145
+ if hash(existing_message) != hash(message_with_one_key_attribute):
146
+ raise ValueError(
147
+ f"Expected added message to be consistent. "
148
+ f"({key_attribute}, {key_value}) already maps "
149
+ f"to {existing_message}, but we want to add "
150
+ f"{message_with_one_key_attribute} now."
151
+ )
152
+ else:
153
+ self._num_collisions_ignored += 1
154
+ else:
155
+ self._table[key_attribute][key_value] = message_with_one_key_attribute
156
+
157
+ def add_all(self, messages_with_one_key_attribute: List[Message]) -> None:
158
+ """Adds the given messages.
159
+
160
+ Args:
161
+ messages_with_one_key_attribute: The messages that we want to add.
162
+ Each one must have exactly one key attribute.
163
+
164
+ Raises:
165
+ `ValueError` if we cannot create a key for the given message or if there is
166
+ a collisions with a message that has a different hash value
167
+ """
168
+ for message in messages_with_one_key_attribute:
169
+ self.add(message)
170
+
171
+ def collect_features(
172
+ self, sub_state: SubState, attributes: Optional[Iterable[Text]] = None
173
+ ) -> Dict[Text, List[Features]]:
174
+ """Collects features for all attributes in the given substate.
175
+
176
+ There might be be multiple messages in the container that contain features
177
+ relevant for the given substate, e.g. this is the case if `TEXT` and
178
+ `INTENT` are present in the given substate. All of those messages will be
179
+ collected and their features combined.
180
+
181
+ Args:
182
+ sub_state: substate for which we want to extract the relevent features
183
+ attributes: if not `None`, this specifies the list of the attributes of the
184
+ `Features` that we're interested in (i.e. all other `Features` contained
185
+ in the relevant messages will be ignored)
186
+
187
+ Returns:
188
+ a dictionary that maps all the (requested) attributes to a list of `Features`
189
+
190
+ Raises:
191
+ `ValueError`: if there exists some key pair (i.e. key attribute and
192
+ corresponding value) from the given substate cannot be found
193
+ `RuntimeError`: if features for the same attribute are found in two
194
+ different messages that are associated with the given substate
195
+ """
196
+ # If we specify a list of attributes, then we want a dict with one entry
197
+ # for each attribute back - even if the corresponding list of features is empty.
198
+ features: Dict[Text, List[Features]] = (
199
+ dict()
200
+ if attributes is None
201
+ else {attribute: [] for attribute in attributes}
202
+ )
203
+ # collect all relevant key attributes
204
+ key_attributes = set(sub_state.keys()).intersection(self.KEY_ATTRIBUTES)
205
+ for key_attribute in key_attributes:
206
+ key_value = str(sub_state[key_attribute])
207
+ message = self._table[key_attribute].get(key_value)
208
+ if not message:
209
+ raise ValueError(
210
+ f"Unknown key ({key_attribute},{key_value}). Cannot retrieve "
211
+ f"features for substate {sub_state}"
212
+ )
213
+ features_from_message = Features.groupby_attribute(
214
+ message.features, attributes=attributes
215
+ )
216
+ for feat_attribute, feat_value in features_from_message.items():
217
+ existing_values = features.get(feat_attribute)
218
+ # Note: the following if-s are needed because if we specify a list of
219
+ # attributes then `features_from_message` will contain one entry per
220
+ # attribute even if the corresponding feature list is empty.
221
+ if feat_value and existing_values:
222
+ raise RuntimeError(
223
+ f"Feature for attribute {feat_attribute} has already been "
224
+ f"extracted from a different message stored under a key "
225
+ f"in {key_attributes} "
226
+ f"that is different from {key_attribute}. This means there's a "
227
+ f"redundancy in the message container."
228
+ )
229
+ if feat_value:
230
+ features[feat_attribute] = feat_value
231
+ return features
232
+
233
+ def lookup_message(self, user_text: Text) -> Message:
234
+ """Returns a message that contains the given user text.
235
+
236
+ Args:
237
+ user_text: the text of a user utterance
238
+ Raises:
239
+ `ValueError` if there is no message associated with the given user text
240
+ """
241
+ message = self._table[TEXT].get(user_text)
242
+ if message is None:
243
+ raise ValueError(
244
+ f"Expected a message with key ({TEXT}, {user_text}) in lookup table."
245
+ )
246
+ return message
247
+
248
+ def derive_messages_from_domain_and_add(self, domain: Domain) -> None:
249
+ """Adds all lookup table entries that can be derived from the domain.
250
+
251
+ That is, all action names, action texts, and intents defined in the domain
252
+ will be turned into a (separate) messages and added to this lookup table.
253
+
254
+ Args:
255
+ domain: the domain from which we extract the substates
256
+ """
257
+ if (
258
+ domain.action_texts
259
+ and domain.action_names_or_texts[-len(domain.action_texts) :]
260
+ != domain.action_texts
261
+ ):
262
+ raise NotImplementedError(
263
+ "We assumed that domain's `action_names_or_texts` start with a list of "
264
+ "all action names, followed by the action texts. "
265
+ "Please update the code to grab the action_name and action_texts from "
266
+ "the domain correctly."
267
+ )
268
+ action_texts = domain.action_texts
269
+ action_names = domain.action_names_or_texts[
270
+ slice(0, -len(domain.action_texts) if domain.action_texts else None)
271
+ ]
272
+
273
+ for key_attribute, actions in [
274
+ (ACTION_NAME, action_names),
275
+ (ACTION_TEXT, action_texts),
276
+ ]:
277
+ for action in actions:
278
+ self.add(Message({key_attribute: action}))
279
+
280
+ for intent in domain.intent_properties.keys():
281
+ self.add(Message({INTENT: intent}))
282
+
283
+ def derive_messages_from_events_and_add(self, events: Iterable[Event]) -> None:
284
+ """Adds all relevant messages that can be derived from the given events.
285
+
286
+ That is, each action name, action text, user text and intent that can be
287
+ found in the given events will be turned into a (separate) message and added
288
+ to this container.
289
+
290
+ Args:
291
+ events: list of events to extract the substate from
292
+ """
293
+ for event in events:
294
+ key_value_list = []
295
+ if isinstance(event, UserUttered):
296
+ key_value_list = [(TEXT, event.text), (INTENT, event.intent_name)]
297
+ elif isinstance(event, ActionExecuted):
298
+ key_value_list = [
299
+ (ACTION_TEXT, event.action_text),
300
+ (ACTION_NAME, event.action_name),
301
+ ]
302
+ for key, value in key_value_list:
303
+ if value is not None:
304
+ self.add(Message(data={key: value}))
305
+
306
+
307
+ class CoreFeaturizationInputConverter(GraphComponent):
308
+ """Provides data for the featurization pipeline.
309
+
310
+ During training as well as during inference, the converter de-duplicates the given
311
+ data (i.e. story graph or list of messages) such that each text and intent from a
312
+ user message and each action name and action text appears exactly once.
313
+ """
314
+
315
+ @classmethod
316
+ def create(
317
+ cls,
318
+ config: Dict[Text, Any],
319
+ model_storage: ModelStorage,
320
+ resource: Resource,
321
+ execution_context: ExecutionContext,
322
+ ) -> CoreFeaturizationInputConverter:
323
+ """Creates a new instance (see parent class for full docstring)."""
324
+ return cls()
325
+
326
+ def convert_for_training(
327
+ self, domain: Domain, story_graph: StoryGraph
328
+ ) -> TrainingData:
329
+ """Creates de-duplicated training data.
330
+
331
+ Each possible user text and intent and each action name and action text
332
+ that can be found in the given domain and story graph appears exactly once
333
+ in the resulting training data. Moreover, each item is contained in a separate
334
+ messsage.
335
+
336
+ Args:
337
+ domain: the domain
338
+ story_graph: a story graph
339
+ Returns:
340
+ training data
341
+ """
342
+ container = MessageContainerForCoreFeaturization()
343
+
344
+ # collect all action and user (intent-only) substates known from domain
345
+ container.derive_messages_from_domain_and_add(domain=domain)
346
+
347
+ # collect all substates we see in the given data
348
+ all_events = (
349
+ event
350
+ for step in story_graph.story_steps
351
+ for event in step.events
352
+ if isinstance(event, UserUttered)
353
+ # because all action names and texts are known to the domain
354
+ )
355
+ container.derive_messages_from_events_and_add(events=all_events)
356
+
357
+ # Reminder: in case of complex recipes that train CountVectorizers, we'll have
358
+ # to make sure that there is at least one user substate with a TEXT to ensure
359
+ # `CountVectorizer` is trained...
360
+
361
+ return TrainingData(training_examples=container.all_messages())
362
+
363
+ def convert_for_inference(self, tracker: DialogueStateTracker) -> List[Message]:
364
+ """Creates a list of messages containing single user and action attributes.
365
+
366
+ Each possible user text and intent and each action name and action text
367
+ that can be found in the events of the given tracker will appear exactly once
368
+ in the resulting messages. Moreover, each item is contained in a separate
369
+ messsage.
370
+
371
+ Args:
372
+ tracker: a dialogue state tracker containing events
373
+ Returns:
374
+ a list of messages
375
+ """
376
+ # Note: `tracker.applied_events()` doesn't convert any events to a different
377
+ # type and hence just iterating over the events is quicker than "applying"
378
+ # events first and then iterating over results (again).
379
+ container = MessageContainerForCoreFeaturization()
380
+ container.derive_messages_from_events_and_add(tracker.events)
381
+ return container.all_messages()
382
+
383
+
384
+ class CoreFeaturizationCollector(GraphComponent):
385
+ """Collects featurized messages for use by a policy."""
386
+
387
+ @classmethod
388
+ def create(
389
+ cls,
390
+ config: Dict[Text, Any],
391
+ model_storage: ModelStorage,
392
+ resource: Resource,
393
+ execution_context: ExecutionContext,
394
+ ) -> CoreFeaturizationCollector:
395
+ """Creates a new instance (see parent class for full docstring)."""
396
+ return cls()
397
+
398
+ def collect(
399
+ self, messages: Union[TrainingData, List[Message]]
400
+ ) -> MessageContainerForCoreFeaturization:
401
+ """Collects messages."""
402
+ if isinstance(messages, TrainingData):
403
+ messages = messages.training_examples
404
+ # Note that the input messages had been contained in a lookup table in
405
+ # `StoryToTrainingDataConverter. Hence, we don't need to worry about
406
+ # collisions here anymore.
407
+ container = MessageContainerForCoreFeaturization()
408
+ for message in messages:
409
+ container.add(message)
410
+ return container