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,1272 @@
1
+ from __future__ import annotations
2
+
3
+ import copy
4
+ import dataclasses
5
+ import enum
6
+ import logging
7
+ import math
8
+ from enum import Enum
9
+ from typing import Any, Callable, Dict, List, Optional, Set, Text, Tuple, Type, Union
10
+
11
+ import rasa.shared.constants
12
+ from rasa.core.featurizers.precomputation import (
13
+ CoreFeaturizationCollector,
14
+ CoreFeaturizationInputConverter,
15
+ )
16
+ from rasa.core.policies.ensemble import DefaultPolicyPredictionEnsemble
17
+ from rasa.dialogue_understanding.processor.command_processor_component import (
18
+ CommandProcessorComponent,
19
+ )
20
+ from rasa.engine.constants import (
21
+ PLACEHOLDER_ENDPOINTS,
22
+ PLACEHOLDER_IMPORTER,
23
+ PLACEHOLDER_MESSAGE,
24
+ PLACEHOLDER_TRACKER,
25
+ )
26
+ from rasa.engine.graph import (
27
+ GraphComponent,
28
+ GraphModelConfiguration,
29
+ GraphSchema,
30
+ SchemaNode,
31
+ )
32
+ from rasa.engine.recipes.recipe import Recipe
33
+ from rasa.engine.storage.resource import Resource
34
+ from rasa.graph_components.converters.nlu_message_converter import NLUMessageConverter
35
+ from rasa.graph_components.providers.domain_for_core_training_provider import (
36
+ DomainForCoreTrainingProvider,
37
+ )
38
+ from rasa.graph_components.providers.domain_provider import DomainProvider
39
+ from rasa.graph_components.providers.flows_provider import FlowsProvider
40
+ from rasa.graph_components.providers.forms_provider import FormsProvider
41
+ from rasa.graph_components.providers.nlu_training_data_provider import (
42
+ NLUTrainingDataProvider,
43
+ )
44
+ from rasa.graph_components.providers.responses_provider import ResponsesProvider
45
+ from rasa.graph_components.providers.rule_only_provider import RuleOnlyDataProvider
46
+ from rasa.graph_components.providers.story_graph_provider import StoryGraphProvider
47
+ from rasa.graph_components.providers.training_tracker_provider import (
48
+ TrainingTrackerProvider,
49
+ )
50
+ from rasa.shared.constants import (
51
+ ASSISTANT_ID_KEY,
52
+ CONFIG_LANGUAGE_KEY,
53
+ CONFIG_NAME_KEY,
54
+ CONFIG_PIPELINE_KEY,
55
+ CONFIG_POLICIES_KEY,
56
+ )
57
+ from rasa.shared.data import TrainingType
58
+ from rasa.shared.exceptions import (
59
+ FileNotFoundException,
60
+ InvalidConfigException,
61
+ RasaException,
62
+ )
63
+ from rasa.shared.utils.common import (
64
+ class_from_module_path,
65
+ transform_collection_to_sentence,
66
+ )
67
+ from rasa.shared.utils.yaml import read_config_file
68
+ from rasa.utils.tensorflow.constants import EPOCHS
69
+
70
+ logger = logging.getLogger(__name__)
71
+
72
+
73
+ DEFAULT_PREDICT_KWARGS = dict(constructor_name="load", eager=True, is_target=False)
74
+
75
+ COMMENTS_FOR_KEYS = {
76
+ CONFIG_PIPELINE_KEY: (
77
+ f"# # No configuration for the NLU pipeline was provided. The following "
78
+ f"default pipeline was used to train your model.\n"
79
+ f"# # If you'd like to customize it, uncomment and adjust the pipeline.\n"
80
+ f"# # See {rasa.shared.constants.DOCS_URL_PIPELINE} for more information.\n"
81
+ ),
82
+ CONFIG_POLICIES_KEY: (
83
+ f"# # No configuration for policies was provided. The following default "
84
+ f"policies were used to train your model.\n"
85
+ f"# # If you'd like to customize them, uncomment and adjust the policies.\n"
86
+ f"# # See {rasa.shared.constants.DOCS_URL_POLICIES} for more information.\n"
87
+ ),
88
+ }
89
+
90
+
91
+ GRAPH_NODE_RUN_PREFIX = "run_"
92
+ GRAPH_NODE_TRAIN_PREFIX = "train_"
93
+
94
+
95
+ class DefaultV1RecipeRegisterException(RasaException):
96
+ """If you register a class which is not of type `GraphComponent`."""
97
+
98
+ pass
99
+
100
+
101
+ class DefaultV1Recipe(Recipe):
102
+ """Recipe which converts the normal model config to train and predict graph."""
103
+
104
+ @enum.unique
105
+ class ComponentType(Enum):
106
+ """Enum to categorize and place custom components correctly in the graph."""
107
+
108
+ MESSAGE_TOKENIZER = 0
109
+ MESSAGE_FEATURIZER = 1
110
+ INTENT_CLASSIFIER = 2
111
+ ENTITY_EXTRACTOR = 3
112
+ POLICY_WITHOUT_END_TO_END_SUPPORT = 4
113
+ POLICY_WITH_END_TO_END_SUPPORT = 5
114
+ MODEL_LOADER = 6
115
+ COMMAND_GENERATOR = 7
116
+ COEXISTENCE_ROUTER = 8
117
+
118
+ name = "default.v1"
119
+ _registered_components: Dict[Text, RegisteredComponent] = {} # noqa: RUF012
120
+
121
+ def __init__(self) -> None:
122
+ """Creates recipe."""
123
+ self._use_core = True
124
+ self._use_nlu = True
125
+ self._use_end_to_end = True
126
+ self._is_finetuning = False
127
+
128
+ @dataclasses.dataclass()
129
+ class RegisteredComponent:
130
+ """Describes a graph component which was registered with the decorator."""
131
+
132
+ clazz: Type[GraphComponent]
133
+ types: Set[DefaultV1Recipe.ComponentType]
134
+ is_trainable: bool
135
+ model_from: Optional[Text]
136
+
137
+ @classmethod
138
+ def register(
139
+ cls,
140
+ component_types: Union[ComponentType, List[ComponentType]],
141
+ is_trainable: bool,
142
+ model_from: Optional[Text] = None,
143
+ ) -> Callable[[Type[GraphComponent]], Type[GraphComponent]]:
144
+ """This decorator can be used to register classes with the recipe.
145
+
146
+ Args:
147
+ component_types: Describes the types of a component which are then used
148
+ to place the component in the graph.
149
+ is_trainable: `True` if the component requires training.
150
+ model_from: Can be used if this component requires a pre-loaded model
151
+ such as `SpacyNLP` or `MitieNLP`.
152
+
153
+ Returns:
154
+ The registered class.
155
+ """
156
+
157
+ def decorator(registered_class: Type[GraphComponent]) -> Type[GraphComponent]:
158
+ if not issubclass(registered_class, GraphComponent):
159
+ raise DefaultV1RecipeRegisterException(
160
+ f"Failed to register class '{registered_class.__name__}' with "
161
+ f"the recipe '{cls.name}'. The class has to be of type "
162
+ f"'{GraphComponent.__name__}'."
163
+ )
164
+
165
+ if isinstance(component_types, cls.ComponentType):
166
+ unique_types = {component_types}
167
+ else:
168
+ unique_types = set(component_types)
169
+
170
+ cls._registered_components[registered_class.__name__] = (
171
+ cls.RegisteredComponent(
172
+ registered_class, unique_types, is_trainable, model_from
173
+ )
174
+ )
175
+ return registered_class
176
+
177
+ return decorator
178
+
179
+ @classmethod
180
+ def _from_registry(cls, name: Text) -> RegisteredComponent:
181
+ # Importing all the default Rasa components will automatically register them
182
+ from rasa.engine.recipes.default_components import DEFAULT_COMPONENTS # noqa
183
+
184
+ if name in cls._registered_components:
185
+ return cls._registered_components[name]
186
+
187
+ if "." in name:
188
+ clazz = class_from_module_path(name)
189
+ if clazz.__name__ in cls._registered_components:
190
+ return cls._registered_components[clazz.__name__]
191
+
192
+ raise InvalidConfigException(
193
+ f"Can't load class for name '{name}'. Please make sure to provide "
194
+ f"a valid name or module path and to register it using the "
195
+ f"'@DefaultV1Recipe.register' decorator."
196
+ )
197
+
198
+ def graph_config_for_recipe(
199
+ self,
200
+ config: Dict,
201
+ cli_parameters: Dict[Text, Any],
202
+ training_type: TrainingType = TrainingType.BOTH,
203
+ is_finetuning: bool = False,
204
+ ) -> GraphModelConfiguration:
205
+ """Converts the default config to graphs (see interface for full docstring)."""
206
+ self._use_core = (
207
+ bool(config.get(CONFIG_POLICIES_KEY))
208
+ and not training_type == TrainingType.NLU
209
+ )
210
+ self._use_nlu = (
211
+ bool(config.get(CONFIG_PIPELINE_KEY))
212
+ and not training_type == TrainingType.CORE
213
+ )
214
+
215
+ if not self._use_nlu and training_type == TrainingType.NLU:
216
+ raise InvalidConfigException(
217
+ "Can't train an NLU model without a specified pipeline. Please make "
218
+ "sure to specify a valid pipeline in your configuration."
219
+ )
220
+
221
+ if not self._use_core and training_type == TrainingType.CORE:
222
+ raise InvalidConfigException(
223
+ "Can't train an Core model without policies. Please make "
224
+ "sure to specify a valid policy in your configuration."
225
+ )
226
+
227
+ self._use_end_to_end = (
228
+ self._use_nlu
229
+ and self._use_core
230
+ and training_type == TrainingType.END_TO_END
231
+ )
232
+
233
+ self._is_finetuning = is_finetuning
234
+
235
+ train_nodes, preprocessors = self._create_train_nodes(config, cli_parameters)
236
+ predict_nodes = self._create_predict_nodes(config, preprocessors, train_nodes)
237
+
238
+ core_target = "select_prediction" if self._use_core else None
239
+
240
+ from rasa.nlu.classifiers.regex_message_handler import RegexMessageHandler
241
+
242
+ return GraphModelConfiguration(
243
+ train_schema=GraphSchema(train_nodes),
244
+ predict_schema=GraphSchema(predict_nodes),
245
+ training_type=training_type,
246
+ assistant_id=config.get(ASSISTANT_ID_KEY),
247
+ language=config.get(CONFIG_LANGUAGE_KEY),
248
+ core_target=core_target,
249
+ nlu_target=f"{GRAPH_NODE_RUN_PREFIX}{RegexMessageHandler.__name__}",
250
+ )
251
+
252
+ def _create_train_nodes(
253
+ self, config: Dict[Text, Any], cli_parameters: Dict[Text, Any]
254
+ ) -> Tuple[Dict[Text, SchemaNode], List[Text]]:
255
+ from rasa.graph_components.validators.default_recipe_validator import (
256
+ DefaultV1RecipeValidator,
257
+ )
258
+ from rasa.graph_components.validators.finetuning_validator import (
259
+ FinetuningValidator,
260
+ )
261
+
262
+ train_config = copy.deepcopy(config)
263
+
264
+ train_nodes = {
265
+ "schema_validator": SchemaNode(
266
+ needs={"importer": PLACEHOLDER_IMPORTER},
267
+ uses=DefaultV1RecipeValidator,
268
+ constructor_name="create",
269
+ fn="validate",
270
+ config={},
271
+ is_input=True,
272
+ ),
273
+ "finetuning_validator": SchemaNode(
274
+ needs={"importer": "schema_validator"},
275
+ uses=FinetuningValidator,
276
+ constructor_name="load" if self._is_finetuning else "create",
277
+ fn="validate",
278
+ is_input=True,
279
+ config={"validate_core": self._use_core, "validate_nlu": self._use_nlu},
280
+ ),
281
+ }
282
+
283
+ preprocessors = []
284
+
285
+ if self._use_nlu:
286
+ preprocessors = self._add_nlu_train_nodes(
287
+ train_config, train_nodes, cli_parameters
288
+ )
289
+
290
+ if self._use_core:
291
+ self._add_core_train_nodes(
292
+ train_config, train_nodes, preprocessors, cli_parameters
293
+ )
294
+
295
+ return train_nodes, preprocessors
296
+
297
+ def _add_nlu_train_nodes(
298
+ self,
299
+ train_config: Dict[Text, Any],
300
+ train_nodes: Dict[Text, SchemaNode],
301
+ cli_parameters: Dict[Text, Any],
302
+ ) -> List[Text]:
303
+ train_nodes["flows_provider"] = SchemaNode(
304
+ needs={
305
+ "importer": "finetuning_validator",
306
+ },
307
+ uses=FlowsProvider,
308
+ constructor_name="create",
309
+ fn="provide_train",
310
+ config={},
311
+ is_target=True,
312
+ is_input=True,
313
+ )
314
+ train_nodes["domain_provider"] = SchemaNode(
315
+ needs={
316
+ "importer": "finetuning_validator",
317
+ },
318
+ uses=DomainProvider,
319
+ constructor_name="create",
320
+ fn="provide_train",
321
+ config={},
322
+ is_target=True,
323
+ is_input=True,
324
+ )
325
+ persist_nlu_data = bool(cli_parameters.get("persist_nlu_training_data"))
326
+ train_nodes["nlu_training_data_provider"] = SchemaNode(
327
+ needs={"importer": "finetuning_validator"},
328
+ uses=NLUTrainingDataProvider,
329
+ constructor_name="create",
330
+ fn="provide",
331
+ config={
332
+ "language": train_config.get(CONFIG_LANGUAGE_KEY),
333
+ "persist": persist_nlu_data,
334
+ },
335
+ is_target=persist_nlu_data,
336
+ is_input=True,
337
+ )
338
+
339
+ last_run_node = "nlu_training_data_provider"
340
+ preprocessors: List[Text] = []
341
+
342
+ for idx, config in enumerate(train_config[CONFIG_PIPELINE_KEY]):
343
+ component_name = config.pop(CONFIG_NAME_KEY)
344
+ component = self._from_registry(component_name)
345
+ component_name = f"{component_name}{idx}"
346
+
347
+ if (
348
+ self.ComponentType.POLICY_WITHOUT_END_TO_END_SUPPORT in component.types
349
+ or self.ComponentType.POLICY_WITH_END_TO_END_SUPPORT in component.types
350
+ ):
351
+ raise InvalidConfigException(
352
+ f"Found policy '{component_name}' in NLU pipeline. Policies should "
353
+ f"be defined in the 'policies' section of your configuration."
354
+ )
355
+ if self.ComponentType.MODEL_LOADER in component.types:
356
+ node_name = f"provide_{component_name}"
357
+ train_nodes[node_name] = SchemaNode(
358
+ needs={},
359
+ uses=component.clazz,
360
+ constructor_name="create",
361
+ fn="provide",
362
+ config=config,
363
+ )
364
+
365
+ from_resource = None
366
+ if component.is_trainable:
367
+ from_resource = self._add_nlu_train_node(
368
+ train_nodes,
369
+ component.clazz,
370
+ component_name,
371
+ last_run_node,
372
+ config,
373
+ cli_parameters,
374
+ )
375
+
376
+ if component.types.intersection(
377
+ {
378
+ self.ComponentType.MESSAGE_TOKENIZER,
379
+ self.ComponentType.MESSAGE_FEATURIZER,
380
+ }
381
+ ):
382
+ last_run_node = self._add_nlu_process_node(
383
+ train_nodes,
384
+ component.clazz,
385
+ component_name,
386
+ last_run_node,
387
+ config,
388
+ from_resource=from_resource,
389
+ )
390
+
391
+ # Remember for End-to-End-Featurization
392
+ preprocessors.append(last_run_node)
393
+
394
+ return preprocessors
395
+
396
+ def _get_needs_from_args(
397
+ self, component: Type[GraphComponent], fn_name: str
398
+ ) -> Dict[str, str]:
399
+ """Get the needed arguments from the method on the component.
400
+
401
+ Filters out arguments that are already provided by other graph
402
+ components. Does not check if the created providers are actually
403
+ part of the graph. If they aren't an error will be raised later on
404
+ when the graph is validated.
405
+
406
+ Args:
407
+ component: The component class.
408
+ fn_name: The name of the method to inspect.
409
+
410
+ Returns:
411
+ The name of the arguments which need to be provided.
412
+ """
413
+ from inspect import signature
414
+
415
+ if not hasattr(component, fn_name):
416
+ return {}
417
+
418
+ def resolver_name_from_parameter(parameter: str) -> str:
419
+ # we got a couple special cases to handle where the parameter name
420
+ # doesn't match the provider name
421
+ if "training_trackers" == parameter:
422
+ return "training_tracker_provider"
423
+ elif "tracker" == parameter:
424
+ return PLACEHOLDER_TRACKER
425
+ elif "endpoints" == parameter:
426
+ return PLACEHOLDER_ENDPOINTS
427
+ elif "training_data" == parameter:
428
+ return "nlu_training_data_provider"
429
+ return f"{parameter}_provider"
430
+
431
+ sig = signature(getattr(component, fn_name))
432
+ parameters = {
433
+ name
434
+ for name, param in sig.parameters.items()
435
+ if param.kind == param.POSITIONAL_OR_KEYWORD
436
+ }
437
+
438
+ # filter out parameters which are already resolved in other ways
439
+ unprovided_parameters = parameters - {
440
+ "message",
441
+ "messages",
442
+ "self",
443
+ "model",
444
+ "precomputations",
445
+ }
446
+
447
+ return {
448
+ parameter: resolver_name_from_parameter(parameter)
449
+ for parameter in unprovided_parameters
450
+ }
451
+
452
+ def _add_nlu_train_node(
453
+ self,
454
+ train_nodes: Dict[Text, SchemaNode],
455
+ component: Type[GraphComponent],
456
+ component_name: Text,
457
+ last_run_node: Text,
458
+ config: Dict[Text, Any],
459
+ cli_parameters: Dict[Text, Any],
460
+ ) -> Text:
461
+ config_from_cli = self._extra_config_from_cli(cli_parameters, component, config)
462
+ needs = self._get_needs_from_args(component, "train")
463
+ needs.update(self._get_model_provider_needs(train_nodes, component))
464
+ needs["training_data"] = last_run_node
465
+
466
+ train_node_name = f"{GRAPH_NODE_TRAIN_PREFIX}{component_name}"
467
+ train_nodes[train_node_name] = SchemaNode(
468
+ needs=needs,
469
+ uses=component,
470
+ constructor_name="load" if self._is_finetuning else "create",
471
+ fn="train",
472
+ config={**config, **config_from_cli},
473
+ is_target=True,
474
+ )
475
+ return train_node_name
476
+
477
+ def _extra_config_from_cli(
478
+ self,
479
+ cli_parameters: Dict[Text, Any],
480
+ component: Type[GraphComponent],
481
+ component_config: Dict[Text, Any],
482
+ ) -> Dict[Text, Any]:
483
+ from rasa.nlu.classifiers.mitie_intent_classifier import MitieIntentClassifier
484
+ from rasa.nlu.classifiers.sklearn_intent_classifier import (
485
+ SklearnIntentClassifier,
486
+ )
487
+ from rasa.nlu.extractors.mitie_entity_extractor import MitieEntityExtractor
488
+
489
+ cli_args_mapping: Dict[Type[GraphComponent], List[Text]] = {
490
+ MitieIntentClassifier: ["num_threads"],
491
+ MitieEntityExtractor: ["num_threads"],
492
+ SklearnIntentClassifier: ["num_threads"],
493
+ }
494
+
495
+ config_from_cli = {
496
+ param: cli_parameters[param]
497
+ for param in cli_args_mapping.get(component, [])
498
+ if param in cli_parameters and cli_parameters[param] is not None
499
+ }
500
+
501
+ if (
502
+ self._is_finetuning
503
+ and "finetuning_epoch_fraction" in cli_parameters
504
+ and EPOCHS in component.get_default_config()
505
+ ):
506
+ old_number_epochs = component_config.get(
507
+ EPOCHS, component.get_default_config()[EPOCHS]
508
+ )
509
+ epoch_fraction = cli_parameters["finetuning_epoch_fraction"]
510
+ epoch_fraction = epoch_fraction if epoch_fraction is not None else 1.0
511
+ config_from_cli["finetuning_epoch_fraction"] = epoch_fraction
512
+ config_from_cli[EPOCHS] = math.ceil(
513
+ old_number_epochs * float(epoch_fraction)
514
+ )
515
+
516
+ return config_from_cli
517
+
518
+ def _add_nlu_process_node(
519
+ self,
520
+ train_nodes: Dict[Text, SchemaNode],
521
+ component_class: Type[GraphComponent],
522
+ component_name: Text,
523
+ last_run_node: Text,
524
+ component_config: Dict[Text, Any],
525
+ from_resource: Optional[Text] = None,
526
+ ) -> Text:
527
+ needs = self._get_needs_from_args(component_class, "process_training_data")
528
+ needs.update(self._get_model_provider_needs(train_nodes, component_class))
529
+
530
+ if from_resource:
531
+ needs["resource"] = from_resource
532
+
533
+ needs["training_data"] = last_run_node
534
+
535
+ node_name = f"{GRAPH_NODE_RUN_PREFIX}{component_name}"
536
+ train_nodes[node_name] = SchemaNode(
537
+ needs=needs,
538
+ uses=component_class,
539
+ constructor_name="load",
540
+ fn="process_training_data",
541
+ config=component_config,
542
+ )
543
+ return node_name
544
+
545
+ def _get_model_provider_needs(
546
+ self, nodes: Dict[Text, SchemaNode], component_class: Type[GraphComponent]
547
+ ) -> Dict[Text, Text]:
548
+ model_provider_needs = {}
549
+ component = self._from_registry(component_class.__name__)
550
+
551
+ if not component.model_from:
552
+ return {}
553
+
554
+ node_name_of_provider = next(
555
+ (
556
+ node_name
557
+ for node_name, node in nodes.items()
558
+ if node.uses.__name__ == component.model_from
559
+ ),
560
+ None,
561
+ )
562
+ if node_name_of_provider:
563
+ model_provider_needs["model"] = node_name_of_provider
564
+
565
+ return model_provider_needs
566
+
567
+ def _add_core_train_nodes(
568
+ self,
569
+ train_config: Dict[Text, Any],
570
+ train_nodes: Dict[Text, SchemaNode],
571
+ preprocessors: List[Text],
572
+ cli_parameters: Dict[Text, Any],
573
+ ) -> None:
574
+ train_nodes["domain_provider"] = SchemaNode(
575
+ needs={"importer": "finetuning_validator"},
576
+ uses=DomainProvider,
577
+ constructor_name="create",
578
+ fn="provide_train",
579
+ config={},
580
+ is_target=True,
581
+ is_input=True,
582
+ )
583
+ train_nodes["domain_for_core_training_provider"] = SchemaNode(
584
+ needs={"domain": "domain_provider"},
585
+ uses=DomainForCoreTrainingProvider,
586
+ constructor_name="create",
587
+ fn="provide",
588
+ config={},
589
+ is_input=True,
590
+ )
591
+ train_nodes["forms_provider"] = SchemaNode(
592
+ needs={"domain": "domain_provider"},
593
+ uses=FormsProvider,
594
+ constructor_name="create",
595
+ fn="provide",
596
+ config={},
597
+ is_input=True,
598
+ )
599
+ train_nodes["responses_provider"] = SchemaNode(
600
+ needs={"domain": "domain_provider"},
601
+ uses=ResponsesProvider,
602
+ constructor_name="create",
603
+ fn="provide",
604
+ config={},
605
+ is_input=True,
606
+ )
607
+ train_nodes["story_graph_provider"] = SchemaNode(
608
+ needs={"importer": "finetuning_validator"},
609
+ uses=StoryGraphProvider,
610
+ constructor_name="create",
611
+ fn="provide_train",
612
+ config={"exclusion_percentage": cli_parameters.get("exclusion_percentage")},
613
+ is_input=True,
614
+ )
615
+ train_nodes["flows_provider"] = SchemaNode(
616
+ needs={
617
+ "importer": "finetuning_validator",
618
+ },
619
+ uses=FlowsProvider,
620
+ constructor_name="create",
621
+ fn="provide_train",
622
+ config={},
623
+ is_target=True,
624
+ is_input=True,
625
+ )
626
+ train_nodes["training_tracker_provider"] = SchemaNode(
627
+ needs={
628
+ "story_graph": "story_graph_provider",
629
+ "domain": "domain_for_core_training_provider",
630
+ },
631
+ uses=TrainingTrackerProvider,
632
+ constructor_name="create",
633
+ fn="provide",
634
+ config={
635
+ param: cli_parameters[param]
636
+ for param in ["debug_plots", "augmentation_factor"]
637
+ if param in cli_parameters
638
+ },
639
+ )
640
+
641
+ policy_with_end_to_end_support_used = False
642
+ for idx, config in enumerate(train_config[CONFIG_POLICIES_KEY]):
643
+ component_name = config.pop(CONFIG_NAME_KEY)
644
+ component = self._from_registry(component_name)
645
+
646
+ extra_config_from_cli = self._extra_config_from_cli(
647
+ cli_parameters, component.clazz, config
648
+ )
649
+
650
+ requires_end_to_end_data = self._use_end_to_end and (
651
+ self.ComponentType.POLICY_WITH_END_TO_END_SUPPORT in component.types
652
+ )
653
+ policy_with_end_to_end_support_used = (
654
+ policy_with_end_to_end_support_used or requires_end_to_end_data
655
+ )
656
+
657
+ needs = self._get_needs_from_args(component.clazz, "train")
658
+ if requires_end_to_end_data:
659
+ needs["precomputations"] = "end_to_end_features_provider"
660
+ # during core training we use a stripped down version of the domain
661
+ needs["domain"] = "domain_for_core_training_provider"
662
+ train_nodes[f"{GRAPH_NODE_TRAIN_PREFIX}{component_name}{idx}"] = SchemaNode(
663
+ needs=needs,
664
+ uses=component.clazz,
665
+ constructor_name="load" if self._is_finetuning else "create",
666
+ fn="train",
667
+ is_target=True,
668
+ config={**config, **extra_config_from_cli},
669
+ )
670
+
671
+ if self._use_end_to_end and policy_with_end_to_end_support_used:
672
+ self._add_end_to_end_features_for_training(preprocessors, train_nodes)
673
+
674
+ def _add_end_to_end_features_for_training(
675
+ self, preprocessors: List[Text], train_nodes: Dict[Text, SchemaNode]
676
+ ) -> None:
677
+ train_nodes["story_to_nlu_training_data_converter"] = SchemaNode(
678
+ needs={
679
+ "story_graph": "story_graph_provider",
680
+ "domain": "domain_for_core_training_provider",
681
+ },
682
+ uses=CoreFeaturizationInputConverter,
683
+ constructor_name="create",
684
+ fn="convert_for_training",
685
+ config={},
686
+ is_input=True,
687
+ )
688
+
689
+ last_node_name = "story_to_nlu_training_data_converter"
690
+ for preprocessor in preprocessors:
691
+ node = copy.deepcopy(train_nodes[preprocessor])
692
+ node.needs["training_data"] = last_node_name
693
+
694
+ node_name = f"e2e_{preprocessor}"
695
+ train_nodes[node_name] = node
696
+ last_node_name = node_name
697
+
698
+ node_with_e2e_features = "end_to_end_features_provider"
699
+ train_nodes[node_with_e2e_features] = SchemaNode(
700
+ needs={"messages": last_node_name},
701
+ uses=CoreFeaturizationCollector,
702
+ constructor_name="create",
703
+ fn="collect",
704
+ config={},
705
+ )
706
+
707
+ def _create_predict_nodes(
708
+ self,
709
+ config: Dict[Text, SchemaNode],
710
+ preprocessors: List[Text],
711
+ train_nodes: Dict[Text, SchemaNode],
712
+ ) -> Dict[Text, SchemaNode]:
713
+ predict_config = copy.deepcopy(config)
714
+ predict_nodes = {}
715
+
716
+ from rasa.nlu.classifiers.regex_message_handler import RegexMessageHandler
717
+
718
+ predict_nodes["nlu_message_converter"] = SchemaNode(
719
+ **DEFAULT_PREDICT_KWARGS,
720
+ needs={"messages": PLACEHOLDER_MESSAGE},
721
+ uses=NLUMessageConverter,
722
+ fn="convert_user_message",
723
+ config={},
724
+ )
725
+
726
+ last_run_nlu_node = "nlu_message_converter"
727
+
728
+ if self._use_nlu:
729
+ last_run_nlu_node = self._add_nlu_predict_nodes(
730
+ last_run_nlu_node, predict_config, predict_nodes, train_nodes
731
+ )
732
+
733
+ domain_needs = {}
734
+ if self._use_core:
735
+ domain_needs["domain"] = "domain_provider"
736
+
737
+ regex_handler_node_name = (
738
+ f"{GRAPH_NODE_RUN_PREFIX}{RegexMessageHandler.__name__}"
739
+ )
740
+ predict_nodes[regex_handler_node_name] = SchemaNode(
741
+ **DEFAULT_PREDICT_KWARGS,
742
+ needs={"messages": last_run_nlu_node, **domain_needs},
743
+ uses=RegexMessageHandler,
744
+ fn="process",
745
+ config={},
746
+ )
747
+
748
+ if self._use_core:
749
+ self._add_core_predict_nodes(
750
+ predict_config, predict_nodes, train_nodes, preprocessors
751
+ )
752
+
753
+ return predict_nodes
754
+
755
+ def _add_nlu_predict_nodes(
756
+ self,
757
+ last_run_node: Text,
758
+ predict_config: Dict[Text, Any],
759
+ predict_nodes: Dict[Text, SchemaNode],
760
+ train_nodes: Dict[Text, SchemaNode],
761
+ ) -> Text:
762
+ predict_nodes["flows_provider"] = SchemaNode(
763
+ **DEFAULT_PREDICT_KWARGS,
764
+ needs={},
765
+ uses=FlowsProvider,
766
+ fn="provide_inference",
767
+ config={},
768
+ resource=Resource("flows_provider"),
769
+ )
770
+ predict_nodes["domain_provider"] = SchemaNode(
771
+ **DEFAULT_PREDICT_KWARGS,
772
+ needs={},
773
+ uses=DomainProvider,
774
+ fn="provide_inference",
775
+ config={},
776
+ resource=Resource("domain_provider"),
777
+ )
778
+
779
+ for idx, config in enumerate(predict_config[CONFIG_PIPELINE_KEY]):
780
+ component_name = config.pop(CONFIG_NAME_KEY)
781
+ component = self._from_registry(component_name)
782
+ component_name = f"{component_name}{idx}"
783
+ if self.ComponentType.MODEL_LOADER in component.types:
784
+ predict_nodes[f"provide_{component_name}"] = SchemaNode(
785
+ **DEFAULT_PREDICT_KWARGS,
786
+ needs={},
787
+ uses=component.clazz,
788
+ fn="provide",
789
+ config=config,
790
+ )
791
+
792
+ if component.types.intersection(
793
+ {
794
+ self.ComponentType.MESSAGE_TOKENIZER,
795
+ self.ComponentType.MESSAGE_FEATURIZER,
796
+ }
797
+ ):
798
+ last_run_node = self._add_nlu_predict_node_from_train(
799
+ predict_nodes,
800
+ component_name,
801
+ train_nodes,
802
+ last_run_node,
803
+ config,
804
+ from_resource=component.is_trainable,
805
+ )
806
+ elif component.types.intersection(
807
+ {
808
+ self.ComponentType.INTENT_CLASSIFIER,
809
+ self.ComponentType.ENTITY_EXTRACTOR,
810
+ self.ComponentType.COMMAND_GENERATOR,
811
+ self.ComponentType.COEXISTENCE_ROUTER,
812
+ }
813
+ ):
814
+ if component.is_trainable:
815
+ last_run_node = self._add_nlu_predict_node_from_train(
816
+ predict_nodes,
817
+ component_name,
818
+ train_nodes,
819
+ last_run_node,
820
+ config,
821
+ from_resource=component.is_trainable,
822
+ )
823
+ else:
824
+ new_node = SchemaNode(
825
+ needs={"messages": last_run_node},
826
+ uses=component.clazz,
827
+ constructor_name="create",
828
+ fn="process",
829
+ config=config,
830
+ )
831
+
832
+ last_run_node = self._add_nlu_predict_node(
833
+ predict_nodes, new_node, component_name, last_run_node
834
+ )
835
+
836
+ return last_run_node
837
+
838
+ def _add_nlu_predict_node_from_train(
839
+ self,
840
+ predict_nodes: Dict[Text, SchemaNode],
841
+ node_name: Text,
842
+ train_nodes: Dict[Text, SchemaNode],
843
+ last_run_node: Text,
844
+ item_config: Dict[Text, Any],
845
+ from_resource: bool = False,
846
+ ) -> Text:
847
+ train_node_name = f"{GRAPH_NODE_RUN_PREFIX}{node_name}"
848
+ resource = None
849
+ if from_resource:
850
+ train_node_name = f"{GRAPH_NODE_TRAIN_PREFIX}{node_name}"
851
+ resource = Resource(train_node_name)
852
+
853
+ return self._add_nlu_predict_node(
854
+ predict_nodes,
855
+ dataclasses.replace(
856
+ train_nodes[train_node_name], resource=resource, config=item_config
857
+ ),
858
+ node_name,
859
+ last_run_node,
860
+ )
861
+
862
+ def _add_nlu_predict_node(
863
+ self,
864
+ predict_nodes: Dict[Text, SchemaNode],
865
+ node: SchemaNode,
866
+ component_name: Text,
867
+ last_run_node: Text,
868
+ ) -> Text:
869
+ node_name = f"{GRAPH_NODE_RUN_PREFIX}{component_name}"
870
+
871
+ needs = self._get_needs_from_args(node.uses, "process")
872
+ needs.update(self._get_model_provider_needs(predict_nodes, node.uses))
873
+ needs["messages"] = last_run_node
874
+ predict_nodes[node_name] = dataclasses.replace(
875
+ node,
876
+ needs=needs,
877
+ fn="process",
878
+ **DEFAULT_PREDICT_KWARGS,
879
+ )
880
+
881
+ return node_name
882
+
883
+ def _add_core_predict_nodes(
884
+ self,
885
+ predict_config: Dict[Text, Any],
886
+ predict_nodes: Dict[Text, SchemaNode],
887
+ train_nodes: Dict[Text, SchemaNode],
888
+ preprocessors: List[Text],
889
+ ) -> None:
890
+ predict_nodes["domain_provider"] = SchemaNode(
891
+ **DEFAULT_PREDICT_KWARGS,
892
+ needs={},
893
+ uses=DomainProvider,
894
+ fn="provide_inference",
895
+ config={},
896
+ resource=Resource("domain_provider"),
897
+ )
898
+ predict_nodes["story_graph_provider"] = SchemaNode(
899
+ **DEFAULT_PREDICT_KWARGS,
900
+ needs={},
901
+ uses=StoryGraphProvider,
902
+ fn="provide_inference",
903
+ config={},
904
+ resource=Resource("story_graph_provider"),
905
+ )
906
+ predict_nodes["flows_provider"] = SchemaNode(
907
+ **DEFAULT_PREDICT_KWARGS,
908
+ needs={},
909
+ uses=FlowsProvider,
910
+ fn="provide_inference",
911
+ config={},
912
+ resource=Resource("flows_provider"),
913
+ )
914
+
915
+ node_with_e2e_features = None
916
+
917
+ if "end_to_end_features_provider" in train_nodes:
918
+ node_with_e2e_features = self._add_end_to_end_features_for_inference(
919
+ predict_nodes, preprocessors
920
+ )
921
+
922
+ predict_nodes["command_processor"] = SchemaNode(
923
+ **DEFAULT_PREDICT_KWARGS,
924
+ needs=self._get_needs_from_args(
925
+ CommandProcessorComponent, "execute_commands"
926
+ ),
927
+ uses=CommandProcessorComponent,
928
+ fn="execute_commands",
929
+ config={},
930
+ resource=Resource("command_processor"),
931
+ )
932
+
933
+ rule_policy_resource = None
934
+ policies: List[Text] = []
935
+
936
+ for idx, config in enumerate(predict_config[CONFIG_POLICIES_KEY]):
937
+ component_name = config.pop(CONFIG_NAME_KEY)
938
+ component = self._from_registry(component_name)
939
+
940
+ train_node_name = f"{GRAPH_NODE_TRAIN_PREFIX}{component_name}{idx}"
941
+ node_name = f"{GRAPH_NODE_RUN_PREFIX}{component_name}{idx}"
942
+
943
+ from rasa.core.policies.rule_policy import RulePolicy
944
+
945
+ if issubclass(component.clazz, RulePolicy) and not rule_policy_resource:
946
+ rule_policy_resource = train_node_name
947
+
948
+ needs = self._get_needs_from_args(
949
+ train_nodes[train_node_name].uses, "predict_action_probabilities"
950
+ )
951
+ if (
952
+ self.ComponentType.POLICY_WITH_END_TO_END_SUPPORT in component.types
953
+ and node_with_e2e_features
954
+ ):
955
+ needs["precomputations"] = node_with_e2e_features
956
+
957
+ predict_nodes[node_name] = dataclasses.replace(
958
+ train_nodes[train_node_name],
959
+ **DEFAULT_PREDICT_KWARGS,
960
+ needs=needs,
961
+ fn="predict_action_probabilities",
962
+ resource=Resource(train_node_name),
963
+ )
964
+ policies.append(node_name)
965
+
966
+ predict_nodes["rule_only_data_provider"] = SchemaNode(
967
+ **DEFAULT_PREDICT_KWARGS,
968
+ needs={},
969
+ uses=RuleOnlyDataProvider,
970
+ fn="provide",
971
+ config={},
972
+ resource=Resource(rule_policy_resource) if rule_policy_resource else None,
973
+ )
974
+
975
+ predict_nodes["select_prediction"] = SchemaNode(
976
+ **DEFAULT_PREDICT_KWARGS,
977
+ needs={
978
+ **{f"policy{idx}": name for idx, name in enumerate(policies)},
979
+ "domain": "domain_provider",
980
+ "tracker": PLACEHOLDER_TRACKER,
981
+ },
982
+ uses=DefaultPolicyPredictionEnsemble,
983
+ fn="combine_predictions_from_kwargs",
984
+ config={},
985
+ )
986
+
987
+ def _add_end_to_end_features_for_inference(
988
+ self, predict_nodes: Dict[Text, SchemaNode], preprocessors: List[Text]
989
+ ) -> Text:
990
+ predict_nodes["tracker_to_message_converter"] = SchemaNode(
991
+ **DEFAULT_PREDICT_KWARGS,
992
+ needs={"tracker": PLACEHOLDER_TRACKER},
993
+ uses=CoreFeaturizationInputConverter,
994
+ fn="convert_for_inference",
995
+ config={},
996
+ )
997
+
998
+ last_node_name = "tracker_to_message_converter"
999
+ for preprocessor in preprocessors:
1000
+ node = dataclasses.replace(
1001
+ predict_nodes[preprocessor], needs={"messages": last_node_name}
1002
+ )
1003
+
1004
+ node_name = f"e2e_{preprocessor}"
1005
+ predict_nodes[node_name] = node
1006
+ last_node_name = node_name
1007
+
1008
+ node_with_e2e_features = "end_to_end_features_provider"
1009
+ predict_nodes[node_with_e2e_features] = SchemaNode(
1010
+ **DEFAULT_PREDICT_KWARGS,
1011
+ needs={"messages": last_node_name},
1012
+ uses=CoreFeaturizationCollector,
1013
+ fn="collect",
1014
+ config={},
1015
+ )
1016
+ return node_with_e2e_features
1017
+
1018
+ @staticmethod
1019
+ def auto_configure(
1020
+ config_file_path: Optional[Text],
1021
+ config: Dict,
1022
+ training_type: Optional[TrainingType] = TrainingType.BOTH,
1023
+ ) -> Tuple[Dict[Text, Any], Set[str], Set[str]]:
1024
+ """Determine configuration from auto-filled configuration file.
1025
+
1026
+ Keys that are provided and have a value in the file are kept. Keys that are not
1027
+ provided are configured automatically.
1028
+
1029
+ Note that this needs to be called explicitly; ie. we cannot
1030
+ auto-configure automatically from importers because importers are not
1031
+ allowed to access code outside of `rasa.shared`.
1032
+
1033
+ Args:
1034
+ config_file_path: The path to the configuration file.
1035
+ config: Configuration in dictionary format.
1036
+ training_type: Optional training type to auto-configure. By default
1037
+ both core and NLU will be auto-configured.
1038
+ """
1039
+ missing_keys = DefaultV1Recipe._get_missing_config_keys(config, training_type)
1040
+ keys_to_configure = DefaultV1Recipe._get_unspecified_autoconfigurable_keys(
1041
+ config, training_type
1042
+ )
1043
+
1044
+ if keys_to_configure:
1045
+ config = DefaultV1Recipe.complete_config(config, keys_to_configure)
1046
+ DefaultV1Recipe._dump_config(
1047
+ config, config_file_path, missing_keys, keys_to_configure, training_type
1048
+ )
1049
+
1050
+ return config, missing_keys, keys_to_configure
1051
+
1052
+ @staticmethod
1053
+ def _get_unspecified_autoconfigurable_keys(
1054
+ config: Dict[Text, Any],
1055
+ training_type: Optional[TrainingType] = TrainingType.BOTH,
1056
+ ) -> Set[Text]:
1057
+ if training_type == TrainingType.NLU:
1058
+ all_keys = rasa.shared.constants.CONFIG_AUTOCONFIGURABLE_KEYS_NLU
1059
+ elif training_type == TrainingType.CORE:
1060
+ all_keys = rasa.shared.constants.CONFIG_AUTOCONFIGURABLE_KEYS_CORE
1061
+ else:
1062
+ all_keys = rasa.shared.constants.CONFIG_AUTOCONFIGURABLE_KEYS
1063
+
1064
+ return {k for k in all_keys if config.get(k) is None}
1065
+
1066
+ @staticmethod
1067
+ def _get_missing_config_keys(
1068
+ config: Dict[Text, Any],
1069
+ training_type: Optional[TrainingType] = TrainingType.BOTH,
1070
+ ) -> Set[Text]:
1071
+ if training_type == TrainingType.NLU:
1072
+ all_keys = rasa.shared.constants.CONFIG_KEYS_NLU
1073
+ elif training_type == TrainingType.CORE:
1074
+ all_keys = rasa.shared.constants.CONFIG_KEYS_CORE
1075
+ else:
1076
+ all_keys = rasa.shared.constants.CONFIG_KEYS
1077
+
1078
+ return {k for k in all_keys if k not in config.keys()}
1079
+
1080
+ @staticmethod
1081
+ def complete_config(
1082
+ config: Dict[Text, Any], keys_to_configure: Set[Text]
1083
+ ) -> Dict[Text, Any]:
1084
+ """Complete a config by adding automatic configuration for the specified keys.
1085
+
1086
+ Args:
1087
+ config: The provided configuration.
1088
+ keys_to_configure: Keys to be configured automatically (e.g. `policies`).
1089
+
1090
+ Returns:
1091
+ The resulting configuration including both the provided and
1092
+ the automatically configured keys.
1093
+ """
1094
+ import importlib_resources
1095
+
1096
+ if keys_to_configure:
1097
+ logger.debug(
1098
+ f"The provided configuration does not contain the key(s) "
1099
+ f"{transform_collection_to_sentence(keys_to_configure)}. "
1100
+ f"Values will be provided from the default configuration."
1101
+ )
1102
+
1103
+ default_config_file = str(
1104
+ importlib_resources.files(__name__)
1105
+ .joinpath("config_files")
1106
+ .joinpath("default_config.yml")
1107
+ )
1108
+ default_config = read_config_file(default_config_file)
1109
+
1110
+ config = copy.deepcopy(config)
1111
+ for key in keys_to_configure:
1112
+ config[key] = default_config[key]
1113
+
1114
+ return config
1115
+
1116
+ @staticmethod
1117
+ def _dump_config(
1118
+ config: Dict[Text, Any],
1119
+ config_file_path: Text,
1120
+ missing_keys: Set[Text],
1121
+ auto_configured_keys: Set[Text],
1122
+ training_type: Optional[TrainingType] = TrainingType.BOTH,
1123
+ ) -> None:
1124
+ """Dump the automatically configured keys into the config file.
1125
+
1126
+ The configuration provided in the file is kept as it is (preserving the order of
1127
+ keys and comments).
1128
+ For keys that were automatically configured, an explanatory
1129
+ comment is added and the automatically chosen configuration is
1130
+ added commented-out.
1131
+ If there are already blocks with comments from a previous auto
1132
+ configuration run, they are replaced with the new auto
1133
+ configuration.
1134
+
1135
+ Args:
1136
+ config: The configuration including the automatically configured keys.
1137
+ config_file_path: The file into which the configuration should be dumped.
1138
+ missing_keys: Keys that need to be added to the config file.
1139
+ auto_configured_keys: Keys for which a commented out auto
1140
+ configuration section needs to be added to the config file.
1141
+ training_type: NLU, CORE or BOTH depending on which is trained.
1142
+ """
1143
+ config_as_expected = DefaultV1Recipe._is_config_file_as_expected(
1144
+ config_file_path, missing_keys, auto_configured_keys, training_type
1145
+ )
1146
+ if not config_as_expected:
1147
+ rasa.shared.utils.cli.print_error(
1148
+ f"The configuration file at '{config_file_path}' has been removed or "
1149
+ f"modified while the automatic configuration was running. The current "
1150
+ f"configuration will therefore not be dumped to the file. If you want "
1151
+ f"your model to use the configuration provided in "
1152
+ f"'{config_file_path}' you need to re-run training."
1153
+ )
1154
+ return
1155
+
1156
+ DefaultV1Recipe._add_missing_config_keys_to_file(config_file_path, missing_keys)
1157
+
1158
+ autoconfig_lines = DefaultV1Recipe._get_commented_out_autoconfig_lines(
1159
+ config, auto_configured_keys
1160
+ )
1161
+
1162
+ current_config_content = rasa.shared.utils.io.read_file(config_file_path)
1163
+ current_config_lines = current_config_content.splitlines(keepends=True)
1164
+
1165
+ updated_lines = DefaultV1Recipe._get_lines_including_autoconfig(
1166
+ current_config_lines, autoconfig_lines
1167
+ )
1168
+
1169
+ rasa.shared.utils.io.write_text_file("".join(updated_lines), config_file_path)
1170
+
1171
+ auto_configured_keys_text = transform_collection_to_sentence(
1172
+ auto_configured_keys
1173
+ )
1174
+ rasa.shared.utils.cli.print_info(
1175
+ f"The configuration for {auto_configured_keys_text} "
1176
+ f"was chosen automatically. "
1177
+ f"It was written into the config file at '{config_file_path}'."
1178
+ )
1179
+
1180
+ @staticmethod
1181
+ def _is_config_file_as_expected(
1182
+ config_file_path: Text,
1183
+ missing_keys: Set[Text],
1184
+ auto_configured_keys: Set[Text],
1185
+ training_type: Optional[TrainingType] = TrainingType.BOTH,
1186
+ ) -> bool:
1187
+ try:
1188
+ content = read_config_file(config_file_path)
1189
+ except FileNotFoundException:
1190
+ content = {}
1191
+
1192
+ return (
1193
+ bool(content)
1194
+ and missing_keys
1195
+ == DefaultV1Recipe._get_missing_config_keys(content, training_type)
1196
+ and auto_configured_keys
1197
+ == DefaultV1Recipe._get_unspecified_autoconfigurable_keys(
1198
+ content, training_type
1199
+ )
1200
+ )
1201
+
1202
+ @staticmethod
1203
+ def _add_missing_config_keys_to_file(
1204
+ config_file_path: Text, missing_keys: Set[Text]
1205
+ ) -> None:
1206
+ if not missing_keys:
1207
+ return
1208
+ with open(
1209
+ config_file_path, "a", encoding=rasa.shared.utils.io.DEFAULT_ENCODING
1210
+ ) as f:
1211
+ for key in missing_keys:
1212
+ f.write(f"{key}:\n")
1213
+
1214
+ @staticmethod
1215
+ def _get_lines_including_autoconfig(
1216
+ lines: List[Text], autoconfig_lines: Dict[Text, List[Text]]
1217
+ ) -> List[Text]:
1218
+ auto_configured_keys = autoconfig_lines.keys()
1219
+
1220
+ lines_with_autoconfig = []
1221
+ remove_comments_until_next_uncommented_line = False
1222
+ for line in lines:
1223
+ insert_section = None
1224
+
1225
+ # remove old auto configuration
1226
+ if remove_comments_until_next_uncommented_line:
1227
+ if line.startswith("#"):
1228
+ continue
1229
+ remove_comments_until_next_uncommented_line = False
1230
+
1231
+ # add an explanatory comment to autoconfigured sections
1232
+ for key in auto_configured_keys:
1233
+ if line.startswith(f"{key}:"): # start of next auto-section
1234
+ line = line + COMMENTS_FOR_KEYS[key]
1235
+ insert_section = key
1236
+ remove_comments_until_next_uncommented_line = True
1237
+
1238
+ lines_with_autoconfig.append(line)
1239
+
1240
+ if not insert_section:
1241
+ continue
1242
+
1243
+ # add the autoconfiguration (commented out)
1244
+ lines_with_autoconfig += autoconfig_lines[insert_section]
1245
+
1246
+ return lines_with_autoconfig
1247
+
1248
+ @staticmethod
1249
+ def _get_commented_out_autoconfig_lines(
1250
+ config: Dict[Text, Any], auto_configured_keys: Set[Text]
1251
+ ) -> Dict[Text, List[Text]]:
1252
+ import ruamel.yaml
1253
+ import ruamel.yaml.compat
1254
+
1255
+ yaml_parser = ruamel.yaml.YAML()
1256
+ yaml_parser.indent(mapping=2, sequence=4, offset=2)
1257
+
1258
+ autoconfig_lines = {}
1259
+
1260
+ for key in auto_configured_keys:
1261
+ stream = ruamel.yaml.compat.StringIO()
1262
+ yaml_parser.dump(config.get(key), stream)
1263
+ dump = stream.getvalue()
1264
+
1265
+ lines = dump.split("\n")
1266
+ if not lines[-1]:
1267
+ lines = lines[:-1] # yaml dump adds an empty line at the end
1268
+ lines = [f"# {line}\n" for line in lines]
1269
+
1270
+ autoconfig_lines[key] = lines
1271
+
1272
+ return autoconfig_lines