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,920 @@
1
+ import importlib.resources
2
+ import re
3
+ from typing import Dict, Any, List, Optional, Tuple, Union, Text
4
+
5
+ import structlog
6
+ from jinja2 import Template
7
+
8
+ import rasa.shared.utils.io
9
+ from rasa.dialogue_understanding.commands import (
10
+ Command,
11
+ ErrorCommand,
12
+ SetSlotCommand,
13
+ CancelFlowCommand,
14
+ StartFlowCommand,
15
+ HumanHandoffCommand,
16
+ ChitChatAnswerCommand,
17
+ SkipQuestionCommand,
18
+ KnowledgeAnswerCommand,
19
+ ClarifyCommand,
20
+ CannotHandleCommand,
21
+ )
22
+ from rasa.dialogue_understanding.commands.change_flow_command import ChangeFlowCommand
23
+ from rasa.dialogue_understanding.generator.constants import (
24
+ LLM_CONFIG_KEY,
25
+ USER_INPUT_CONFIG_KEY,
26
+ FLOW_RETRIEVAL_KEY,
27
+ DEFAULT_LLM_CONFIG,
28
+ )
29
+ from rasa.dialogue_understanding.generator.flow_retrieval import FlowRetrieval
30
+ from rasa.dialogue_understanding.generator.llm_based_command_generator import (
31
+ LLMBasedCommandGenerator,
32
+ )
33
+ from rasa.dialogue_understanding.stack.frames import UserFlowStackFrame
34
+ from rasa.dialogue_understanding.stack.utils import (
35
+ top_flow_frame,
36
+ top_user_flow_frame,
37
+ user_flows_on_the_stack,
38
+ )
39
+ from rasa.engine.graph import ExecutionContext
40
+ from rasa.engine.recipes.default_recipe import DefaultV1Recipe
41
+ from rasa.engine.storage.resource import Resource
42
+ from rasa.engine.storage.storage import ModelStorage
43
+ from rasa.shared.constants import (
44
+ RASA_PATTERN_CANNOT_HANDLE_NOT_SUPPORTED,
45
+ EMBEDDINGS_CONFIG_KEY,
46
+ )
47
+ from rasa.shared.constants import ROUTE_TO_CALM_SLOT
48
+ from rasa.shared.core.flows import FlowStep, Flow, FlowsList
49
+ from rasa.shared.core.flows.steps.collect import CollectInformationFlowStep
50
+ from rasa.shared.core.trackers import DialogueStateTracker
51
+ from rasa.shared.exceptions import ProviderClientAPIException
52
+ from rasa.shared.nlu.constants import TEXT
53
+ from rasa.shared.nlu.training_data.message import Message
54
+ from rasa.shared.utils.io import deep_container_fingerprint
55
+ from rasa.shared.utils.llm import (
56
+ get_prompt_template,
57
+ tracker_as_readable_transcript,
58
+ sanitize_message_for_prompt,
59
+ allowed_values_for_slot,
60
+ resolve_model_client_config,
61
+ )
62
+
63
+ # multistep template keys
64
+ HANDLE_FLOWS_KEY = "handle_flows"
65
+ FILL_SLOTS_KEY = "fill_slots"
66
+
67
+ # multistep template file names
68
+ HANDLE_FLOWS_PROMPT_FILE_NAME = "handle_flows_prompt.jinja2"
69
+ FILL_SLOTS_PROMPT_FILE_NAME = "fill_slots_prompt.jinja2"
70
+
71
+ # multistep templates
72
+ DEFAULT_HANDLE_FLOWS_TEMPLATE = importlib.resources.read_text(
73
+ "rasa.dialogue_understanding.generator.multi_step", "handle_flows_prompt.jinja2"
74
+ ).strip()
75
+ DEFAULT_FILL_SLOTS_TEMPLATE = importlib.resources.read_text(
76
+ "rasa.dialogue_understanding.generator.multi_step", "fill_slots_prompt.jinja2"
77
+ ).strip()
78
+ MULTI_STEP_LLM_COMMAND_GENERATOR_CONFIG_FILE = "config.json"
79
+
80
+ # dictionary of template names and associated file names and default values
81
+ PROMPT_TEMPLATES = {
82
+ HANDLE_FLOWS_KEY: (
83
+ HANDLE_FLOWS_PROMPT_FILE_NAME,
84
+ DEFAULT_HANDLE_FLOWS_TEMPLATE,
85
+ ),
86
+ FILL_SLOTS_KEY: (
87
+ FILL_SLOTS_PROMPT_FILE_NAME,
88
+ DEFAULT_FILL_SLOTS_TEMPLATE,
89
+ ),
90
+ }
91
+
92
+ FILE_PATH_KEY = "file_path"
93
+
94
+ structlogger = structlog.get_logger()
95
+
96
+
97
+ @DefaultV1Recipe.register(
98
+ [
99
+ DefaultV1Recipe.ComponentType.COMMAND_GENERATOR,
100
+ ],
101
+ is_trainable=True,
102
+ )
103
+ class MultiStepLLMCommandGenerator(LLMBasedCommandGenerator):
104
+ """An multi step command generator using LLM."""
105
+
106
+ def __init__(
107
+ self,
108
+ config: Dict[Text, Any],
109
+ model_storage: ModelStorage,
110
+ resource: Resource,
111
+ prompt_templates: Optional[Dict[Text, Optional[Text]]] = None,
112
+ **kwargs: Any,
113
+ ) -> None:
114
+ super().__init__(
115
+ config, model_storage, resource, prompt_templates=prompt_templates, **kwargs
116
+ )
117
+
118
+ self._prompts: Dict[Text, Optional[Text]] = {
119
+ HANDLE_FLOWS_KEY: None,
120
+ FILL_SLOTS_KEY: None,
121
+ }
122
+ self._init_prompt_templates(prompt_templates)
123
+
124
+ self.trace_prompt_tokens = self.config.get("trace_prompt_tokens", False)
125
+
126
+ ### Implementations of LLMBasedCommandGenerator parent
127
+ @staticmethod
128
+ def get_default_config() -> Dict[str, Any]:
129
+ """The component's default config (see parent class for full docstring)."""
130
+ return {
131
+ "prompt_templates": {},
132
+ USER_INPUT_CONFIG_KEY: None,
133
+ LLM_CONFIG_KEY: None,
134
+ FLOW_RETRIEVAL_KEY: FlowRetrieval.get_default_config(),
135
+ }
136
+
137
+ @classmethod
138
+ def load(
139
+ cls: Any,
140
+ config: Dict[str, Any],
141
+ model_storage: ModelStorage,
142
+ resource: Resource,
143
+ execution_context: ExecutionContext,
144
+ **kwargs: Any,
145
+ ) -> "MultiStepLLMCommandGenerator":
146
+ """Loads trained component (see parent class for full docstring)."""
147
+ # Perform health check of the LLM client config
148
+ llm_config = resolve_model_client_config(config.get(LLM_CONFIG_KEY, {}))
149
+ cls.perform_llm_health_check(
150
+ llm_config,
151
+ DEFAULT_LLM_CONFIG,
152
+ "multi_step_llm_command_generator.load",
153
+ MultiStepLLMCommandGenerator.__name__,
154
+ )
155
+
156
+ prompts = cls._load_prompt_templates(model_storage, resource)
157
+
158
+ # init base command generator
159
+ command_generator = cls(config, model_storage, resource, prompts)
160
+ # load flow retrieval if enabled
161
+ if command_generator.enabled_flow_retrieval:
162
+ command_generator.flow_retrieval = cls.load_flow_retrival(
163
+ command_generator.config, model_storage, resource
164
+ )
165
+
166
+ return command_generator
167
+
168
+ def persist(self) -> None:
169
+ """Persist this component to disk for future loading."""
170
+ self._persist_prompt_templates()
171
+ self._persist_config()
172
+ if self.flow_retrieval is not None:
173
+ self.flow_retrieval.persist()
174
+
175
+ async def predict_commands(
176
+ self,
177
+ message: Message,
178
+ flows: FlowsList,
179
+ tracker: Optional[DialogueStateTracker] = None,
180
+ **kwargs: Any,
181
+ ) -> List[Command]:
182
+ """Predict commands using the LLM.
183
+
184
+ Args:
185
+ message: The message from the user.
186
+ flows: The flows available to the user.
187
+ tracker: The tracker containing the current state of the conversation.
188
+ **kwargs: Keyword arguments for forward compatibility.
189
+
190
+ Returns:
191
+ The commands generated by the llm.
192
+ """
193
+ if tracker is None or flows.is_empty():
194
+ # cannot do anything if there are no flows or no tracker
195
+ return []
196
+
197
+ try:
198
+ commands = await self._predict_commands_with_multi_step(
199
+ message, flows, tracker
200
+ )
201
+ commands = self._clean_up_commands(commands)
202
+ self._add_commands_to_message_parse_data(
203
+ message, MultiStepLLMCommandGenerator.__name__, commands
204
+ )
205
+ except ProviderClientAPIException:
206
+ # if any step resulted in API exception, the command prediction cannot
207
+ # be completed, "predict" the ErrorCommand
208
+ commands = [ErrorCommand()]
209
+
210
+ if not commands:
211
+ # if for any reason the final list of commands is empty,
212
+ # "predict" CannotHandle
213
+ commands = [CannotHandleCommand()]
214
+
215
+ if tracker.has_coexistence_routing_slot:
216
+ # if coexistence feature is used, set the routing slot
217
+ commands += [SetSlotCommand(ROUTE_TO_CALM_SLOT, True)]
218
+
219
+ structlogger.debug(
220
+ "multi_step_llm_command_generator.predict_commands.finished",
221
+ commands=commands,
222
+ )
223
+
224
+ return commands
225
+
226
+ @classmethod
227
+ def parse_commands(
228
+ cls,
229
+ actions: Optional[str],
230
+ tracker: DialogueStateTracker,
231
+ flows: FlowsList,
232
+ is_handle_flows_prompt: bool = False,
233
+ ) -> List[Command]:
234
+ """Parse the actions returned by the llm into intent and entities.
235
+
236
+ Args:
237
+ actions: The actions returned by the llm.
238
+ tracker: The tracker containing the current state of the conversation.
239
+ flows: The list of flows.
240
+ is_handle_flows_prompt: bool
241
+
242
+ Returns:
243
+ The parsed commands.
244
+ """
245
+ if not actions:
246
+ return []
247
+
248
+ commands: List[Command] = []
249
+
250
+ slot_set_re = re.compile(
251
+ r"""SetSlot\(['"]?([a-zA-Z_][a-zA-Z0-9_-]*)['"]?, ?['"]?(.*)['"]?\)"""
252
+ )
253
+ start_flow_re = re.compile(r"StartFlow\(['\"]?([a-zA-Z0-9_-]+)['\"]?\)")
254
+ change_flow_re = re.compile(r"ChangeFlow\(\)")
255
+ cancel_flow_re = re.compile(r"CancelFlow\(\)")
256
+ chitchat_re = re.compile(r"ChitChat\(\)")
257
+ skip_question_re = re.compile(r"SkipQuestion\(\)")
258
+ knowledge_re = re.compile(r"SearchAndReply\(\)")
259
+ humand_handoff_re = re.compile(r"HumanHandoff\(\)")
260
+ clarify_re = re.compile(r"Clarify\(([\"\'a-zA-Z0-9_, ]+)\)")
261
+ cannot_handle_re = re.compile(r"CannotHandle\(\)")
262
+
263
+ for action in actions.strip().splitlines():
264
+ if is_handle_flows_prompt:
265
+ if (
266
+ len(commands) >= 2
267
+ or len(commands) == 1
268
+ and isinstance(commands[0], ClarifyCommand)
269
+ ):
270
+ break
271
+
272
+ if cannot_handle_re.search(action):
273
+ commands.append(
274
+ CannotHandleCommand(RASA_PATTERN_CANNOT_HANDLE_NOT_SUPPORTED)
275
+ )
276
+ if match := slot_set_re.search(action):
277
+ slot_name = cls.clean_extracted_value(match.group(1).strip())
278
+ slot_value = cls.clean_extracted_value(match.group(2))
279
+ # error case where the llm tries to start a flow using a slot set
280
+ if slot_name == "flow_name":
281
+ commands.extend(cls.start_flow_by_name(slot_value, flows))
282
+ else:
283
+ typed_slot_value = cls.get_nullable_slot_value(slot_value)
284
+ commands.append(
285
+ SetSlotCommand(name=slot_name, value=typed_slot_value)
286
+ )
287
+ elif match := start_flow_re.search(action):
288
+ flow_name = match.group(1).strip()
289
+ commands.extend(cls.start_flow_by_name(flow_name, flows))
290
+ elif cancel_flow_re.search(action):
291
+ commands.append(CancelFlowCommand())
292
+ elif chitchat_re.search(action):
293
+ commands.append(ChitChatAnswerCommand())
294
+ elif skip_question_re.search(action):
295
+ commands.append(SkipQuestionCommand())
296
+ elif knowledge_re.search(action):
297
+ commands.append(KnowledgeAnswerCommand())
298
+ elif humand_handoff_re.search(action):
299
+ commands.append(HumanHandoffCommand())
300
+ elif match := clarify_re.search(action):
301
+ options = sorted([opt.strip() for opt in match.group(1).split(",")])
302
+ # Remove surrounding quotes if present
303
+ cleaned_options = []
304
+ for flow in options:
305
+ if (flow.startswith('"') and flow.endswith('"')) or (
306
+ flow.startswith("'") and flow.endswith("'")
307
+ ):
308
+ cleaned_options.append(flow[1:-1])
309
+ else:
310
+ cleaned_options.append(flow)
311
+ # check if flow is valid
312
+ valid_options = [
313
+ flow
314
+ for flow in cleaned_options
315
+ if flow in flows.user_flow_ids
316
+ and flow not in user_flows_on_the_stack(tracker.stack)
317
+ ]
318
+ if len(valid_options) == 1:
319
+ commands.extend(cls.start_flow_by_name(valid_options[0], flows))
320
+ elif 1 < len(valid_options) <= 5:
321
+ commands.append(ClarifyCommand(valid_options))
322
+ elif change_flow_re.search(action):
323
+ commands.append(ChangeFlowCommand())
324
+
325
+ if not commands:
326
+ structlogger.debug(
327
+ "multi_step_llm_command_generator.parse_commands",
328
+ message="No commands were parsed from the LLM actions.",
329
+ actions=actions,
330
+ )
331
+
332
+ return commands
333
+
334
+ ### Helper methods
335
+ @property
336
+ def handle_flows_prompt(self) -> Optional[Text]:
337
+ return self._prompts[HANDLE_FLOWS_KEY]
338
+
339
+ @property
340
+ def fill_slots_prompt(self) -> Optional[Text]:
341
+ return self._prompts[FILL_SLOTS_KEY]
342
+
343
+ def _init_prompt_templates(self, prompt_templates: Dict[Text, Any]) -> None:
344
+ for key in self._prompts.keys():
345
+ _, default_template = PROMPT_TEMPLATES[key]
346
+ self._prompts[key] = self._resolve_prompt_template(
347
+ prompt_templates, self.config, key, default_template
348
+ )
349
+
350
+ @staticmethod
351
+ def _resolve_prompt_template(
352
+ prompt_templates: Optional[Dict[Text, Optional[Text]]],
353
+ config: Dict[Text, Any],
354
+ key: Text,
355
+ default_value: Text,
356
+ ) -> Text:
357
+ """Determines and retrieves a prompt template for a specific step in the
358
+ multistep command generator process using a given key. If the prompt
359
+ associated with the key is missing in both the `prompt_templates` and the
360
+ `config`, this method defaults to using a predefined prompt template. Each key
361
+ is uniquely associated with a distinct step of the command generation process.
362
+
363
+ Args:
364
+ prompt_templates: A dictionary of override templates.
365
+ config: The components config that may contain the file paths to the prompt
366
+ templates.
367
+ key: The key for the desired template.
368
+ default_value: The default template to use if no other is found.
369
+
370
+ Returns:
371
+ Prompt template.
372
+ """
373
+ if (
374
+ prompt_templates is not None
375
+ and key in prompt_templates
376
+ and prompt_templates[key] is not None
377
+ ):
378
+ return prompt_templates[key] # type: ignore[return-value]
379
+ return get_prompt_template(
380
+ config.get("prompt_templates", {}).get(key, {}).get(FILE_PATH_KEY),
381
+ default_value,
382
+ )
383
+
384
+ @classmethod
385
+ def _load_prompt_templates(
386
+ cls, model_storage: ModelStorage, resource: Resource
387
+ ) -> Dict[Text, Text]:
388
+ """Loads persisted prompt templates from the model storage. If a prompt template
389
+ cannot be loaded, default value is used.
390
+ """
391
+ prompts = {}
392
+ for key, (file_name, default_value) in PROMPT_TEMPLATES.items():
393
+ prompt_template = cls.load_prompt_template_from_model_storage(
394
+ model_storage, resource, file_name
395
+ )
396
+ prompts[key] = prompt_template if prompt_template else default_value
397
+ return prompts
398
+
399
+ def _persist_prompt_templates(self) -> None:
400
+ """Persist the prompt templates to disk for future loading."""
401
+ with self._model_storage.write_to(self._resource) as path:
402
+ for key, template in self._prompts.items():
403
+ file_name, _ = PROMPT_TEMPLATES[key]
404
+ file_path = path / file_name
405
+ rasa.shared.utils.io.write_text_file(template, file_path)
406
+
407
+ def _persist_config(self) -> None:
408
+ """Persist config as a source of truth for resolved clients."""
409
+ with self._model_storage.write_to(self._resource) as path:
410
+ rasa.shared.utils.io.dump_obj_as_json_to_file(
411
+ path / MULTI_STEP_LLM_COMMAND_GENERATOR_CONFIG_FILE, self.config
412
+ )
413
+
414
+ async def _predict_commands_with_multi_step(
415
+ self,
416
+ message: Message,
417
+ flows: FlowsList,
418
+ tracker: DialogueStateTracker,
419
+ ) -> List[Command]:
420
+ """Predict commands using the LLM.
421
+
422
+ Args:
423
+ message: The message from the user.
424
+ flows: The flows available to the user.
425
+ tracker: The tracker containing the current state of the conversation.
426
+
427
+ Returns:
428
+ The commands generated by the llm.
429
+
430
+ Raises:
431
+ ProviderClientAPIException: If API calls raised an error.
432
+ """
433
+ # retrieve relevant flows
434
+ filtered_flows = await self.filter_flows(message, flows, tracker)
435
+
436
+ # 1st step: Handle active flow
437
+ if tracker.has_active_user_flow:
438
+ commands_from_active_flow = await self._predict_commands_for_active_flow(
439
+ message,
440
+ tracker,
441
+ available_flows=filtered_flows,
442
+ all_flows=flows,
443
+ )
444
+ else:
445
+ commands_from_active_flow = []
446
+
447
+ # 2nd step: Check if we need to switch to another flow
448
+ contains_change_flow_command = any(
449
+ isinstance(command, ChangeFlowCommand)
450
+ for command in commands_from_active_flow
451
+ )
452
+ should_change_flows = (
453
+ not commands_from_active_flow or contains_change_flow_command
454
+ )
455
+
456
+ if should_change_flows:
457
+ commands_for_handling_flows = (
458
+ await self._predict_commands_for_handling_flows(
459
+ message,
460
+ tracker,
461
+ available_flows=filtered_flows,
462
+ all_flows=flows,
463
+ )
464
+ )
465
+ else:
466
+ commands_for_handling_flows = []
467
+
468
+ if contains_change_flow_command:
469
+ commands_from_active_flow.pop(
470
+ commands_from_active_flow.index(ChangeFlowCommand())
471
+ )
472
+
473
+ # 3rd step: Fill slots for started flows
474
+ newly_started_flows = FlowsList(
475
+ [
476
+ flow
477
+ for command in commands_for_handling_flows
478
+ if (
479
+ isinstance(command, StartFlowCommand)
480
+ and (flow := filtered_flows.flow_by_id(command.flow)) is not None
481
+ )
482
+ ]
483
+ )
484
+
485
+ commands_for_newly_started_flows = (
486
+ await self._predict_commands_for_newly_started_flows(
487
+ message,
488
+ tracker,
489
+ newly_started_flows=newly_started_flows,
490
+ all_flows=flows,
491
+ )
492
+ )
493
+
494
+ # concatenate predicted commands
495
+ commands = list(
496
+ set(
497
+ commands_from_active_flow
498
+ + commands_for_handling_flows
499
+ + commands_for_newly_started_flows
500
+ )
501
+ )
502
+
503
+ return commands
504
+
505
+ async def _predict_commands_for_active_flow(
506
+ self,
507
+ message: Message,
508
+ tracker: DialogueStateTracker,
509
+ available_flows: FlowsList,
510
+ all_flows: FlowsList,
511
+ ) -> List[Command]:
512
+ """Predicts set slots commands for currently active flow.
513
+
514
+ Args:
515
+ message: The message from the user.
516
+ tracker: The tracker containing the current state of the conversation.
517
+ available_flows: Startable and active flows.
518
+ all_flows: All flows.
519
+
520
+ inputs = self._prepare_inputs(message, tracker, startable_flows, all_flows)
521
+
522
+ Returns:
523
+ Predicted commands for the active flow.
524
+ """
525
+ inputs = self._prepare_inputs(message, tracker, available_flows, all_flows)
526
+
527
+ if inputs["current_flow"] is None:
528
+ return []
529
+
530
+ prompt = Template(self.fill_slots_prompt).render(**inputs).strip()
531
+ structlogger.debug(
532
+ "multi_step_llm_command_generator"
533
+ ".predict_commands_for_active_flow"
534
+ ".prompt_rendered",
535
+ prompt=prompt,
536
+ )
537
+
538
+ actions = await self.invoke_llm(prompt)
539
+ structlogger.debug(
540
+ "multi_step_llm_command_generator"
541
+ ".predict_commands_for_active_flow"
542
+ ".actions_generated",
543
+ action_list=actions,
544
+ )
545
+
546
+ commands = self.parse_commands(actions, tracker, available_flows)
547
+
548
+ if commands:
549
+ self._add_prompt_to_message_parse_data(
550
+ message,
551
+ MultiStepLLMCommandGenerator.__name__,
552
+ "fill_slots_for_active_flow_prompt",
553
+ prompt,
554
+ )
555
+
556
+ return commands
557
+
558
+ async def _predict_commands_for_handling_flows(
559
+ self,
560
+ message: Message,
561
+ tracker: DialogueStateTracker,
562
+ available_flows: FlowsList,
563
+ all_flows: FlowsList,
564
+ ) -> List[Command]:
565
+ """Predicts commands for starting and canceling flows.
566
+
567
+ Args:
568
+ message: The message from the user.
569
+ tracker: The tracker containing the current state of the conversation.
570
+ available_flows: Startable and active flows.
571
+ all_flows: All flows.
572
+
573
+ inputs = self._prepare_inputs(message, tracker, startable_flows, all_flows, 2)
574
+
575
+ Returns:
576
+ Predicted commands for the starting/canceling flows.
577
+ """
578
+ inputs = self._prepare_inputs(message, tracker, available_flows, all_flows, 2)
579
+ prompt = Template(self.handle_flows_prompt).render(**inputs).strip()
580
+ structlogger.debug(
581
+ "multi_step_llm_command_generator"
582
+ ".predict_commands_for_handling_flows"
583
+ ".prompt_rendered",
584
+ prompt=prompt,
585
+ )
586
+
587
+ actions = await self.invoke_llm(prompt)
588
+ structlogger.debug(
589
+ "multi_step_llm_command_generator"
590
+ ".predict_commands_for_handling_flows"
591
+ ".actions_generated",
592
+ action_list=actions,
593
+ )
594
+
595
+ commands = self.parse_commands(actions, tracker, available_flows, True)
596
+ # filter out flows that are already started and active
597
+ commands = self._filter_redundant_start_flow_commands(tracker, commands)
598
+
599
+ if commands:
600
+ self._add_prompt_to_message_parse_data(
601
+ message,
602
+ MultiStepLLMCommandGenerator.__name__,
603
+ "handle_flows_prompt",
604
+ prompt,
605
+ )
606
+
607
+ return commands
608
+
609
+ @staticmethod
610
+ def _filter_redundant_start_flow_commands(
611
+ tracker: DialogueStateTracker, commands: List[Command]
612
+ ) -> List[Command]:
613
+ """Filters out StartFlowCommand commands for flows that are already active,
614
+ based on the current tracker state.
615
+ """
616
+ frames = tracker.stack.frames
617
+ active_user_flows = {
618
+ frame.flow_id for frame in frames if isinstance(frame, UserFlowStackFrame)
619
+ }
620
+ commands = [
621
+ command
622
+ for command in commands
623
+ if not (
624
+ isinstance(command, StartFlowCommand)
625
+ and command.flow in active_user_flows
626
+ )
627
+ ]
628
+ return commands
629
+
630
+ async def _predict_commands_for_newly_started_flows(
631
+ self,
632
+ message: Message,
633
+ tracker: DialogueStateTracker,
634
+ newly_started_flows: FlowsList,
635
+ all_flows: FlowsList,
636
+ ) -> List[Command]:
637
+ """Predict set slot commands for newly started flows."""
638
+ commands_for_newly_started_flows = []
639
+ for newly_started_flow in newly_started_flows:
640
+ commands_for_newly_started_flows += (
641
+ await self._predict_commands_for_newly_started_flow(
642
+ newly_started_flow, message, tracker, newly_started_flows
643
+ )
644
+ )
645
+ return commands_for_newly_started_flows
646
+
647
+ async def _predict_commands_for_newly_started_flow(
648
+ self,
649
+ newly_started_flow: Flow,
650
+ message: Message,
651
+ tracker: DialogueStateTracker,
652
+ newly_started_flows: FlowsList,
653
+ ) -> List[Command]:
654
+ inputs = self._prepare_inputs_for_single_flow(
655
+ message, tracker, newly_started_flow, max_turns=20
656
+ )
657
+
658
+ if len(inputs["flow_slots"]) == 0:
659
+ # return empty if the newly started flow does not have any slots
660
+ return []
661
+
662
+ prompt = Template(self.fill_slots_prompt).render(**inputs)
663
+ structlogger.debug(
664
+ "multi_step_llm_command_generator"
665
+ ".predict_commands_for_newly_started_flow"
666
+ ".prompt_rendered",
667
+ flow=newly_started_flow.id,
668
+ prompt=prompt,
669
+ )
670
+
671
+ actions = await self.invoke_llm(prompt)
672
+ structlogger.debug(
673
+ "multi_step_llm_command_generator"
674
+ ".predict_commands_for_newly_started_flow"
675
+ ".actions_generated",
676
+ flow=newly_started_flow.id,
677
+ action_list=actions,
678
+ )
679
+
680
+ commands = self.parse_commands(actions, tracker, newly_started_flows)
681
+
682
+ # filter out all commands that unset values for newly started flow
683
+ commands = [
684
+ command
685
+ for command in commands
686
+ if isinstance(command, SetSlotCommand) and command.value
687
+ ]
688
+ structlogger.debug(
689
+ "multi_step_llm_command_generator"
690
+ ".predict_commands_for_newly_started_flow"
691
+ ".filtered_commands",
692
+ flow=newly_started_flow.id,
693
+ commands=commands,
694
+ )
695
+
696
+ if commands:
697
+ self._add_prompt_to_message_parse_data(
698
+ message,
699
+ MultiStepLLMCommandGenerator.__name__,
700
+ "fill_slots_for_new_flow_prompt",
701
+ prompt,
702
+ )
703
+
704
+ return commands
705
+
706
+ def _prepare_inputs(
707
+ self,
708
+ message: Message,
709
+ tracker: DialogueStateTracker,
710
+ available_flows: FlowsList,
711
+ all_flows: FlowsList,
712
+ max_turns: int = 1,
713
+ ) -> Dict[str, Any]:
714
+ """Prepare input information to be used by prompt template.
715
+
716
+ Args:
717
+ message: The message from the user.
718
+ tracker: The tracker containing the current state of the conversation.
719
+ available_flows: Startable and active flows.
720
+ all_flows: All flows.
721
+ max_turns: Max turns of the conversation history between the user
722
+ and the assistant
723
+
724
+ Returns:
725
+ Dictionary of inputs.
726
+ """
727
+ top_relevant_frame = top_flow_frame(tracker.stack)
728
+ top_flow = top_relevant_frame.flow(all_flows) if top_relevant_frame else None
729
+ current_step = (
730
+ top_relevant_frame.step(all_flows) if top_relevant_frame else None
731
+ )
732
+ if top_flow is not None:
733
+ flow_slots = self.prepare_current_flow_slots_for_template(
734
+ top_flow, current_step, tracker
735
+ )
736
+ top_flow_is_pattern = top_flow.is_rasa_default_flow
737
+ else:
738
+ flow_slots = []
739
+ top_flow_is_pattern = False
740
+
741
+ if top_flow_is_pattern:
742
+ top_user_frame = top_user_flow_frame(tracker.stack)
743
+ top_user_flow = (
744
+ top_user_frame.flow(available_flows) if top_user_frame else None
745
+ )
746
+ top_user_flow_step = (
747
+ top_user_frame.step(available_flows) if top_user_frame else None
748
+ )
749
+ top_user_flow_slots = self.prepare_current_flow_slots_for_template(
750
+ top_user_flow, top_user_flow_step, tracker
751
+ )
752
+ else:
753
+ top_user_flow = None
754
+ top_user_flow_slots = []
755
+
756
+ current_slot, current_slot_description = self.prepare_current_slot_for_template(
757
+ current_step
758
+ )
759
+ current_slot_type = None
760
+ current_slot_allowed_values = None
761
+ if current_slot:
762
+ current_slot_type = (
763
+ slot.type_name
764
+ if (slot := tracker.slots.get(current_slot)) is not None
765
+ else None
766
+ )
767
+ current_slot_allowed_values = allowed_values_for_slot(
768
+ tracker.slots.get(current_slot)
769
+ )
770
+ (
771
+ current_conversation,
772
+ latest_user_message,
773
+ ) = self.prepare_conversation_context_for_template(message, tracker, max_turns)
774
+
775
+ inputs = {
776
+ "available_flows": self.prepare_flows_for_template(
777
+ available_flows, tracker
778
+ ),
779
+ "current_conversation": current_conversation,
780
+ "current_flow": top_flow.id if top_flow is not None else None,
781
+ "current_slot": current_slot,
782
+ "current_slot_description": current_slot_description,
783
+ "current_slot_type": current_slot_type,
784
+ "current_slot_allowed_values": current_slot_allowed_values,
785
+ "last_user_message": latest_user_message,
786
+ "flow_slots": flow_slots,
787
+ "top_flow_is_pattern": top_flow_is_pattern,
788
+ "top_user_flow": top_user_flow.id if top_user_flow is not None else None,
789
+ "top_user_flow_slots": top_user_flow_slots,
790
+ "flow_active": True,
791
+ }
792
+ return inputs
793
+
794
+ def _prepare_inputs_for_single_flow(
795
+ self,
796
+ message: Message,
797
+ tracker: DialogueStateTracker,
798
+ flow: Flow,
799
+ max_turns: int = 1,
800
+ ) -> Dict[Text, Any]:
801
+ flow_slots = self.prepare_current_flow_slots_for_template(
802
+ flow, flow.first_step_in_flow(), tracker
803
+ )
804
+ (
805
+ current_conversation,
806
+ latest_user_message,
807
+ ) = self.prepare_conversation_context_for_template(message, tracker, max_turns)
808
+ inputs = {
809
+ "current_conversation": current_conversation,
810
+ "flow_slots": flow_slots,
811
+ "current_flow": flow.id,
812
+ "last_user_message": latest_user_message,
813
+ "flow_active": False,
814
+ }
815
+ return inputs
816
+
817
+ @classmethod
818
+ def fingerprint_addon(cls, config: Dict[str, Any]) -> Optional[str]:
819
+ """Add a fingerprint for the graph."""
820
+ handle_flows_template = get_prompt_template(
821
+ config.get("prompt_templates", {})
822
+ .get(HANDLE_FLOWS_KEY, {})
823
+ .get(FILE_PATH_KEY),
824
+ DEFAULT_HANDLE_FLOWS_TEMPLATE,
825
+ )
826
+ fill_slots_template = get_prompt_template(
827
+ config.get("prompt_templates", {})
828
+ .get(FILL_SLOTS_KEY, {})
829
+ .get(FILE_PATH_KEY),
830
+ DEFAULT_FILL_SLOTS_TEMPLATE,
831
+ )
832
+
833
+ llm_config = resolve_model_client_config(
834
+ config.get(LLM_CONFIG_KEY), MultiStepLLMCommandGenerator.__name__
835
+ )
836
+ embedding_config = resolve_model_client_config(
837
+ config.get(FLOW_RETRIEVAL_KEY, {}).get(EMBEDDINGS_CONFIG_KEY),
838
+ FlowRetrieval.__name__,
839
+ )
840
+
841
+ return deep_container_fingerprint(
842
+ [handle_flows_template, fill_slots_template, llm_config, embedding_config]
843
+ )
844
+
845
+ @staticmethod
846
+ def prepare_conversation_context_for_template(
847
+ message: Message, tracker: DialogueStateTracker, max_turns: int = 20
848
+ ) -> Tuple[Text, Text]:
849
+ current_conversation = tracker_as_readable_transcript(
850
+ tracker, max_turns=max_turns
851
+ )
852
+ latest_user_message = sanitize_message_for_prompt(message.get(TEXT))
853
+ current_conversation += f"\nUSER: {latest_user_message}"
854
+ return current_conversation, latest_user_message
855
+
856
+ def prepare_current_flow_slots_for_template(
857
+ self, top_flow: Flow, current_step: FlowStep, tracker: DialogueStateTracker
858
+ ) -> List[Dict[Text, Any]]:
859
+ """Prepare the current flow slots for the template.
860
+
861
+ Args:
862
+ top_flow: The top flow.
863
+ current_step: The current step in the flow.
864
+ tracker: The tracker containing the current state of the conversation.
865
+
866
+ Returns:
867
+ The slots with values, types, allowed values and a description.
868
+ """
869
+ if top_flow is not None:
870
+ flow_slots = [
871
+ {
872
+ "name": collect_step.collect,
873
+ "value": self.get_slot_value(tracker, collect_step.collect),
874
+ "type": tracker.slots[collect_step.collect].type_name,
875
+ "allowed_values": allowed_values_for_slot(
876
+ tracker.slots[collect_step.collect]
877
+ ),
878
+ "description": collect_step.description,
879
+ }
880
+ for collect_step in top_flow.get_collect_steps()
881
+ if self.is_extractable(collect_step, tracker, current_step)
882
+ ]
883
+ else:
884
+ flow_slots = []
885
+ return flow_slots
886
+
887
+ @staticmethod
888
+ def prepare_current_slot_for_template(
889
+ current_step: FlowStep,
890
+ ) -> Tuple[Union[str, None], Union[str, None]]:
891
+ """Prepare the current slot for the template."""
892
+ return (
893
+ (current_step.collect, current_step.description)
894
+ if isinstance(current_step, CollectInformationFlowStep)
895
+ else (None, None)
896
+ )
897
+
898
+ @staticmethod
899
+ def _clean_up_commands(commands: List[Command]) -> List[Command]:
900
+ """Cleans the list of commands by removing CannotHandleCommand,
901
+ if it exists and there are other commands in the list.
902
+ """
903
+ other_commands_count = sum(
904
+ not isinstance(command, CannotHandleCommand) for command in commands
905
+ )
906
+
907
+ if other_commands_count == len(commands):
908
+ # no cannot handle command found
909
+ return commands
910
+
911
+ if other_commands_count:
912
+ # remove cannot handle commands
913
+ return [
914
+ command
915
+ for command in commands
916
+ if not isinstance(command, CannotHandleCommand)
917
+ ]
918
+
919
+ # only cannot handle commands present
920
+ return [CannotHandleCommand(RASA_PATTERN_CANNOT_HANDLE_NOT_SUPPORTED)]