rasa-pro 3.11.3__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 (779) 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/e2e_test.py +259 -0
  27. rasa/cli/evaluate.py +222 -0
  28. rasa/cli/export.py +250 -0
  29. rasa/cli/inspect.py +75 -0
  30. rasa/cli/interactive.py +166 -0
  31. rasa/cli/license.py +65 -0
  32. rasa/cli/llm_fine_tuning.py +403 -0
  33. rasa/cli/markers.py +78 -0
  34. rasa/cli/project_templates/__init__.py +0 -0
  35. rasa/cli/project_templates/calm/actions/__init__.py +0 -0
  36. rasa/cli/project_templates/calm/actions/action_template.py +27 -0
  37. rasa/cli/project_templates/calm/actions/add_contact.py +30 -0
  38. rasa/cli/project_templates/calm/actions/db.py +57 -0
  39. rasa/cli/project_templates/calm/actions/list_contacts.py +22 -0
  40. rasa/cli/project_templates/calm/actions/remove_contact.py +35 -0
  41. rasa/cli/project_templates/calm/config.yml +10 -0
  42. rasa/cli/project_templates/calm/credentials.yml +33 -0
  43. rasa/cli/project_templates/calm/data/flows/add_contact.yml +31 -0
  44. rasa/cli/project_templates/calm/data/flows/list_contacts.yml +14 -0
  45. rasa/cli/project_templates/calm/data/flows/remove_contact.yml +29 -0
  46. rasa/cli/project_templates/calm/db/contacts.json +10 -0
  47. rasa/cli/project_templates/calm/domain/add_contact.yml +39 -0
  48. rasa/cli/project_templates/calm/domain/list_contacts.yml +17 -0
  49. rasa/cli/project_templates/calm/domain/remove_contact.yml +38 -0
  50. rasa/cli/project_templates/calm/domain/shared.yml +10 -0
  51. rasa/cli/project_templates/calm/e2e_tests/cancelations/user_cancels_during_a_correction.yml +16 -0
  52. rasa/cli/project_templates/calm/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +7 -0
  53. rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_handle.yml +20 -0
  54. rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_name.yml +19 -0
  55. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +15 -0
  56. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_lists_contacts.yml +5 -0
  57. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact.yml +11 -0
  58. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact_from_list.yml +12 -0
  59. rasa/cli/project_templates/calm/endpoints.yml +58 -0
  60. rasa/cli/project_templates/default/actions/__init__.py +0 -0
  61. rasa/cli/project_templates/default/actions/actions.py +27 -0
  62. rasa/cli/project_templates/default/config.yml +44 -0
  63. rasa/cli/project_templates/default/credentials.yml +33 -0
  64. rasa/cli/project_templates/default/data/nlu.yml +91 -0
  65. rasa/cli/project_templates/default/data/rules.yml +13 -0
  66. rasa/cli/project_templates/default/data/stories.yml +30 -0
  67. rasa/cli/project_templates/default/domain.yml +34 -0
  68. rasa/cli/project_templates/default/endpoints.yml +42 -0
  69. rasa/cli/project_templates/default/tests/test_stories.yml +91 -0
  70. rasa/cli/project_templates/tutorial/actions/__init__.py +0 -0
  71. rasa/cli/project_templates/tutorial/actions/actions.py +22 -0
  72. rasa/cli/project_templates/tutorial/config.yml +12 -0
  73. rasa/cli/project_templates/tutorial/credentials.yml +33 -0
  74. rasa/cli/project_templates/tutorial/data/flows.yml +8 -0
  75. rasa/cli/project_templates/tutorial/data/patterns.yml +11 -0
  76. rasa/cli/project_templates/tutorial/domain.yml +35 -0
  77. rasa/cli/project_templates/tutorial/endpoints.yml +55 -0
  78. rasa/cli/run.py +143 -0
  79. rasa/cli/scaffold.py +273 -0
  80. rasa/cli/shell.py +141 -0
  81. rasa/cli/studio/__init__.py +0 -0
  82. rasa/cli/studio/download.py +62 -0
  83. rasa/cli/studio/studio.py +296 -0
  84. rasa/cli/studio/train.py +59 -0
  85. rasa/cli/studio/upload.py +62 -0
  86. rasa/cli/telemetry.py +102 -0
  87. rasa/cli/test.py +280 -0
  88. rasa/cli/train.py +278 -0
  89. rasa/cli/utils.py +484 -0
  90. rasa/cli/visualize.py +40 -0
  91. rasa/cli/x.py +206 -0
  92. rasa/constants.py +45 -0
  93. rasa/core/__init__.py +17 -0
  94. rasa/core/actions/__init__.py +0 -0
  95. rasa/core/actions/action.py +1318 -0
  96. rasa/core/actions/action_clean_stack.py +59 -0
  97. rasa/core/actions/action_exceptions.py +24 -0
  98. rasa/core/actions/action_hangup.py +29 -0
  99. rasa/core/actions/action_repeat_bot_messages.py +89 -0
  100. rasa/core/actions/action_run_slot_rejections.py +210 -0
  101. rasa/core/actions/action_trigger_chitchat.py +31 -0
  102. rasa/core/actions/action_trigger_flow.py +109 -0
  103. rasa/core/actions/action_trigger_search.py +31 -0
  104. rasa/core/actions/constants.py +5 -0
  105. rasa/core/actions/custom_action_executor.py +191 -0
  106. rasa/core/actions/direct_custom_actions_executor.py +80 -0
  107. rasa/core/actions/e2e_stub_custom_action_executor.py +72 -0
  108. rasa/core/actions/forms.py +741 -0
  109. rasa/core/actions/grpc_custom_action_executor.py +251 -0
  110. rasa/core/actions/http_custom_action_executor.py +145 -0
  111. rasa/core/actions/loops.py +114 -0
  112. rasa/core/actions/two_stage_fallback.py +186 -0
  113. rasa/core/agent.py +559 -0
  114. rasa/core/auth_retry_tracker_store.py +122 -0
  115. rasa/core/brokers/__init__.py +0 -0
  116. rasa/core/brokers/broker.py +126 -0
  117. rasa/core/brokers/file.py +58 -0
  118. rasa/core/brokers/kafka.py +324 -0
  119. rasa/core/brokers/pika.py +388 -0
  120. rasa/core/brokers/sql.py +86 -0
  121. rasa/core/channels/__init__.py +61 -0
  122. rasa/core/channels/botframework.py +338 -0
  123. rasa/core/channels/callback.py +84 -0
  124. rasa/core/channels/channel.py +456 -0
  125. rasa/core/channels/console.py +241 -0
  126. rasa/core/channels/development_inspector.py +197 -0
  127. rasa/core/channels/facebook.py +419 -0
  128. rasa/core/channels/hangouts.py +329 -0
  129. rasa/core/channels/inspector/.eslintrc.cjs +25 -0
  130. rasa/core/channels/inspector/.gitignore +23 -0
  131. rasa/core/channels/inspector/README.md +54 -0
  132. rasa/core/channels/inspector/assets/favicon.ico +0 -0
  133. rasa/core/channels/inspector/assets/rasa-chat.js +2 -0
  134. rasa/core/channels/inspector/custom.d.ts +3 -0
  135. rasa/core/channels/inspector/dist/assets/arc-632a63ec.js +1 -0
  136. rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
  137. rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-081e0df4.js +10 -0
  138. rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-3df0afc2.js +2 -0
  139. rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-8c5ed31e.js +2 -0
  140. rasa/core/channels/inspector/dist/assets/createText-62fc7601-89c73b31.js +7 -0
  141. rasa/core/channels/inspector/dist/assets/edges-f2ad444c-4fc48c3e.js +4 -0
  142. rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-907e0440.js +51 -0
  143. rasa/core/channels/inspector/dist/assets/flowDb-1972c806-9ec53a3c.js +6 -0
  144. rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-41da787a.js +4 -0
  145. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +1 -0
  146. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-ce370633.js +139 -0
  147. rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-90a36523.js +266 -0
  148. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-41e1aa3f.js +70 -0
  149. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-128cfa44.ttf +0 -0
  150. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-21dbcb97.woff +0 -0
  151. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-222b5e26.svg +329 -0
  152. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-9ad89b2a.woff2 +0 -0
  153. rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-e6f2af62.js +1 -0
  154. rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
  155. rasa/core/channels/inspector/dist/assets/index-e793d777.js +1317 -0
  156. rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-8ceba4db.js +7 -0
  157. rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
  158. rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-960d3809.js +139 -0
  159. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-60c05ee4.woff +0 -0
  160. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-8335d9b8.svg +438 -0
  161. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-9cc39c75.ttf +0 -0
  162. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-ead13ccf.woff2 +0 -0
  163. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-16705655.woff2 +0 -0
  164. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-5aeb07f9.woff +0 -0
  165. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9c459044.ttf +0 -0
  166. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9e2898a4.svg +435 -0
  167. rasa/core/channels/inspector/dist/assets/layout-498807d8.js +1 -0
  168. rasa/core/channels/inspector/dist/assets/line-eeccc4e2.js +1 -0
  169. rasa/core/channels/inspector/dist/assets/linear-8a078617.js +1 -0
  170. rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-396d17dd.js +109 -0
  171. rasa/core/channels/inspector/dist/assets/ordinal-ba9b4969.js +1 -0
  172. rasa/core/channels/inspector/dist/assets/path-53f90ab3.js +1 -0
  173. rasa/core/channels/inspector/dist/assets/pieDiagram-dbbf0591-dc9b5e1b.js +35 -0
  174. rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-a08cba6d.js +7 -0
  175. rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-87242b9e.js +52 -0
  176. rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-53f6f391.js +8 -0
  177. rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-715c9c20.js +122 -0
  178. rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-2e8fb31f.js +1 -0
  179. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-7e2d2aa0.js +1 -0
  180. rasa/core/channels/inspector/dist/assets/styles-080da4f6-4420cea6.js +110 -0
  181. rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-28676cf4.js +159 -0
  182. rasa/core/channels/inspector/dist/assets/styles-9c745c82-cef936a6.js +207 -0
  183. rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-151251e9.js +1 -0
  184. rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-0d39bdb2.js +61 -0
  185. rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-a03fa445.js +7 -0
  186. rasa/core/channels/inspector/dist/index.html +44 -0
  187. rasa/core/channels/inspector/index.html +42 -0
  188. rasa/core/channels/inspector/jest.config.ts +13 -0
  189. rasa/core/channels/inspector/package.json +52 -0
  190. rasa/core/channels/inspector/setupTests.ts +2 -0
  191. rasa/core/channels/inspector/src/App.tsx +217 -0
  192. rasa/core/channels/inspector/src/components/Chat.tsx +95 -0
  193. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +108 -0
  194. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
  195. rasa/core/channels/inspector/src/components/DialogueStack.tsx +136 -0
  196. rasa/core/channels/inspector/src/components/ExpandIcon.tsx +16 -0
  197. rasa/core/channels/inspector/src/components/FullscreenButton.tsx +45 -0
  198. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +22 -0
  199. rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +21 -0
  200. rasa/core/channels/inspector/src/components/RasaLogo.tsx +32 -0
  201. rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +39 -0
  202. rasa/core/channels/inspector/src/components/Slots.tsx +91 -0
  203. rasa/core/channels/inspector/src/components/Welcome.tsx +54 -0
  204. rasa/core/channels/inspector/src/helpers/audiostream.ts +191 -0
  205. rasa/core/channels/inspector/src/helpers/formatters.test.ts +392 -0
  206. rasa/core/channels/inspector/src/helpers/formatters.ts +306 -0
  207. rasa/core/channels/inspector/src/helpers/utils.ts +127 -0
  208. rasa/core/channels/inspector/src/main.tsx +13 -0
  209. rasa/core/channels/inspector/src/theme/Button/Button.ts +29 -0
  210. rasa/core/channels/inspector/src/theme/Heading/Heading.ts +31 -0
  211. rasa/core/channels/inspector/src/theme/Input/Input.ts +27 -0
  212. rasa/core/channels/inspector/src/theme/Link/Link.ts +10 -0
  213. rasa/core/channels/inspector/src/theme/Modal/Modal.ts +47 -0
  214. rasa/core/channels/inspector/src/theme/Table/Table.tsx +38 -0
  215. rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +12 -0
  216. rasa/core/channels/inspector/src/theme/base/breakpoints.ts +8 -0
  217. rasa/core/channels/inspector/src/theme/base/colors.ts +88 -0
  218. rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +29 -0
  219. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.eot +0 -0
  220. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.svg +329 -0
  221. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.ttf +0 -0
  222. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff +0 -0
  223. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff2 +0 -0
  224. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.eot +0 -0
  225. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.svg +438 -0
  226. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.ttf +0 -0
  227. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff +0 -0
  228. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff2 +0 -0
  229. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.eot +0 -0
  230. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.svg +435 -0
  231. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.ttf +0 -0
  232. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff +0 -0
  233. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff2 +0 -0
  234. rasa/core/channels/inspector/src/theme/base/radii.ts +9 -0
  235. rasa/core/channels/inspector/src/theme/base/shadows.ts +7 -0
  236. rasa/core/channels/inspector/src/theme/base/sizes.ts +7 -0
  237. rasa/core/channels/inspector/src/theme/base/space.ts +15 -0
  238. rasa/core/channels/inspector/src/theme/base/styles.ts +13 -0
  239. rasa/core/channels/inspector/src/theme/base/typography.ts +24 -0
  240. rasa/core/channels/inspector/src/theme/base/zIndices.ts +19 -0
  241. rasa/core/channels/inspector/src/theme/index.ts +101 -0
  242. rasa/core/channels/inspector/src/types.ts +84 -0
  243. rasa/core/channels/inspector/src/vite-env.d.ts +1 -0
  244. rasa/core/channels/inspector/tests/__mocks__/fileMock.ts +1 -0
  245. rasa/core/channels/inspector/tests/__mocks__/matchMedia.ts +16 -0
  246. rasa/core/channels/inspector/tests/__mocks__/styleMock.ts +1 -0
  247. rasa/core/channels/inspector/tests/renderWithProviders.tsx +14 -0
  248. rasa/core/channels/inspector/tsconfig.json +26 -0
  249. rasa/core/channels/inspector/tsconfig.node.json +10 -0
  250. rasa/core/channels/inspector/vite.config.ts +8 -0
  251. rasa/core/channels/inspector/yarn.lock +6249 -0
  252. rasa/core/channels/mattermost.py +229 -0
  253. rasa/core/channels/rasa_chat.py +126 -0
  254. rasa/core/channels/rest.py +230 -0
  255. rasa/core/channels/rocketchat.py +174 -0
  256. rasa/core/channels/slack.py +620 -0
  257. rasa/core/channels/socketio.py +301 -0
  258. rasa/core/channels/telegram.py +298 -0
  259. rasa/core/channels/twilio.py +169 -0
  260. rasa/core/channels/vier_cvg.py +374 -0
  261. rasa/core/channels/voice_ready/__init__.py +0 -0
  262. rasa/core/channels/voice_ready/audiocodes.py +501 -0
  263. rasa/core/channels/voice_ready/jambonz.py +121 -0
  264. rasa/core/channels/voice_ready/jambonz_protocol.py +396 -0
  265. rasa/core/channels/voice_ready/twilio_voice.py +403 -0
  266. rasa/core/channels/voice_ready/utils.py +37 -0
  267. rasa/core/channels/voice_stream/__init__.py +0 -0
  268. rasa/core/channels/voice_stream/asr/__init__.py +0 -0
  269. rasa/core/channels/voice_stream/asr/asr_engine.py +89 -0
  270. rasa/core/channels/voice_stream/asr/asr_event.py +18 -0
  271. rasa/core/channels/voice_stream/asr/azure.py +130 -0
  272. rasa/core/channels/voice_stream/asr/deepgram.py +90 -0
  273. rasa/core/channels/voice_stream/audio_bytes.py +8 -0
  274. rasa/core/channels/voice_stream/browser_audio.py +107 -0
  275. rasa/core/channels/voice_stream/call_state.py +23 -0
  276. rasa/core/channels/voice_stream/tts/__init__.py +0 -0
  277. rasa/core/channels/voice_stream/tts/azure.py +106 -0
  278. rasa/core/channels/voice_stream/tts/cartesia.py +118 -0
  279. rasa/core/channels/voice_stream/tts/tts_cache.py +27 -0
  280. rasa/core/channels/voice_stream/tts/tts_engine.py +58 -0
  281. rasa/core/channels/voice_stream/twilio_media_streams.py +173 -0
  282. rasa/core/channels/voice_stream/util.py +57 -0
  283. rasa/core/channels/voice_stream/voice_channel.py +427 -0
  284. rasa/core/channels/webexteams.py +134 -0
  285. rasa/core/concurrent_lock_store.py +210 -0
  286. rasa/core/constants.py +112 -0
  287. rasa/core/evaluation/__init__.py +0 -0
  288. rasa/core/evaluation/marker.py +267 -0
  289. rasa/core/evaluation/marker_base.py +923 -0
  290. rasa/core/evaluation/marker_stats.py +293 -0
  291. rasa/core/evaluation/marker_tracker_loader.py +103 -0
  292. rasa/core/exceptions.py +29 -0
  293. rasa/core/exporter.py +284 -0
  294. rasa/core/featurizers/__init__.py +0 -0
  295. rasa/core/featurizers/precomputation.py +410 -0
  296. rasa/core/featurizers/single_state_featurizer.py +421 -0
  297. rasa/core/featurizers/tracker_featurizers.py +1262 -0
  298. rasa/core/http_interpreter.py +89 -0
  299. rasa/core/information_retrieval/__init__.py +7 -0
  300. rasa/core/information_retrieval/faiss.py +124 -0
  301. rasa/core/information_retrieval/information_retrieval.py +137 -0
  302. rasa/core/information_retrieval/milvus.py +59 -0
  303. rasa/core/information_retrieval/qdrant.py +96 -0
  304. rasa/core/jobs.py +63 -0
  305. rasa/core/lock.py +139 -0
  306. rasa/core/lock_store.py +343 -0
  307. rasa/core/migrate.py +403 -0
  308. rasa/core/nlg/__init__.py +3 -0
  309. rasa/core/nlg/callback.py +146 -0
  310. rasa/core/nlg/contextual_response_rephraser.py +320 -0
  311. rasa/core/nlg/generator.py +230 -0
  312. rasa/core/nlg/interpolator.py +143 -0
  313. rasa/core/nlg/response.py +155 -0
  314. rasa/core/nlg/summarize.py +70 -0
  315. rasa/core/persistor.py +538 -0
  316. rasa/core/policies/__init__.py +0 -0
  317. rasa/core/policies/ensemble.py +329 -0
  318. rasa/core/policies/enterprise_search_policy.py +905 -0
  319. rasa/core/policies/enterprise_search_prompt_template.jinja2 +25 -0
  320. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +60 -0
  321. rasa/core/policies/flow_policy.py +205 -0
  322. rasa/core/policies/flows/__init__.py +0 -0
  323. rasa/core/policies/flows/flow_exceptions.py +44 -0
  324. rasa/core/policies/flows/flow_executor.py +754 -0
  325. rasa/core/policies/flows/flow_step_result.py +43 -0
  326. rasa/core/policies/intentless_policy.py +1031 -0
  327. rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
  328. rasa/core/policies/memoization.py +538 -0
  329. rasa/core/policies/policy.py +725 -0
  330. rasa/core/policies/rule_policy.py +1273 -0
  331. rasa/core/policies/ted_policy.py +2169 -0
  332. rasa/core/policies/unexpected_intent_policy.py +1022 -0
  333. rasa/core/processor.py +1465 -0
  334. rasa/core/run.py +342 -0
  335. rasa/core/secrets_manager/__init__.py +0 -0
  336. rasa/core/secrets_manager/constants.py +36 -0
  337. rasa/core/secrets_manager/endpoints.py +391 -0
  338. rasa/core/secrets_manager/factory.py +241 -0
  339. rasa/core/secrets_manager/secret_manager.py +262 -0
  340. rasa/core/secrets_manager/vault.py +584 -0
  341. rasa/core/test.py +1335 -0
  342. rasa/core/tracker_store.py +1703 -0
  343. rasa/core/train.py +105 -0
  344. rasa/core/training/__init__.py +89 -0
  345. rasa/core/training/converters/__init__.py +0 -0
  346. rasa/core/training/converters/responses_prefix_converter.py +119 -0
  347. rasa/core/training/interactive.py +1744 -0
  348. rasa/core/training/story_conflict.py +381 -0
  349. rasa/core/training/training.py +93 -0
  350. rasa/core/utils.py +366 -0
  351. rasa/core/visualize.py +70 -0
  352. rasa/dialogue_understanding/__init__.py +0 -0
  353. rasa/dialogue_understanding/coexistence/__init__.py +0 -0
  354. rasa/dialogue_understanding/coexistence/constants.py +4 -0
  355. rasa/dialogue_understanding/coexistence/intent_based_router.py +196 -0
  356. rasa/dialogue_understanding/coexistence/llm_based_router.py +327 -0
  357. rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
  358. rasa/dialogue_understanding/commands/__init__.py +61 -0
  359. rasa/dialogue_understanding/commands/can_not_handle_command.py +70 -0
  360. rasa/dialogue_understanding/commands/cancel_flow_command.py +125 -0
  361. rasa/dialogue_understanding/commands/change_flow_command.py +44 -0
  362. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +57 -0
  363. rasa/dialogue_understanding/commands/clarify_command.py +86 -0
  364. rasa/dialogue_understanding/commands/command.py +85 -0
  365. rasa/dialogue_understanding/commands/correct_slots_command.py +297 -0
  366. rasa/dialogue_understanding/commands/error_command.py +79 -0
  367. rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
  368. rasa/dialogue_understanding/commands/handle_code_change_command.py +73 -0
  369. rasa/dialogue_understanding/commands/human_handoff_command.py +66 -0
  370. rasa/dialogue_understanding/commands/knowledge_answer_command.py +57 -0
  371. rasa/dialogue_understanding/commands/noop_command.py +54 -0
  372. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +60 -0
  373. rasa/dialogue_understanding/commands/restart_command.py +58 -0
  374. rasa/dialogue_understanding/commands/session_end_command.py +61 -0
  375. rasa/dialogue_understanding/commands/session_start_command.py +59 -0
  376. rasa/dialogue_understanding/commands/set_slot_command.py +160 -0
  377. rasa/dialogue_understanding/commands/skip_question_command.py +75 -0
  378. rasa/dialogue_understanding/commands/start_flow_command.py +107 -0
  379. rasa/dialogue_understanding/commands/user_silence_command.py +59 -0
  380. rasa/dialogue_understanding/commands/utils.py +45 -0
  381. rasa/dialogue_understanding/generator/__init__.py +21 -0
  382. rasa/dialogue_understanding/generator/command_generator.py +343 -0
  383. rasa/dialogue_understanding/generator/constants.py +27 -0
  384. rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
  385. rasa/dialogue_understanding/generator/flow_retrieval.py +466 -0
  386. rasa/dialogue_understanding/generator/llm_based_command_generator.py +500 -0
  387. rasa/dialogue_understanding/generator/llm_command_generator.py +67 -0
  388. rasa/dialogue_understanding/generator/multi_step/__init__.py +0 -0
  389. rasa/dialogue_understanding/generator/multi_step/fill_slots_prompt.jinja2 +62 -0
  390. rasa/dialogue_understanding/generator/multi_step/handle_flows_prompt.jinja2 +38 -0
  391. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +893 -0
  392. rasa/dialogue_understanding/generator/nlu_command_adapter.py +258 -0
  393. rasa/dialogue_understanding/generator/single_step/__init__.py +0 -0
  394. rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2 +60 -0
  395. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +478 -0
  396. rasa/dialogue_understanding/patterns/__init__.py +0 -0
  397. rasa/dialogue_understanding/patterns/cancel.py +111 -0
  398. rasa/dialogue_understanding/patterns/cannot_handle.py +43 -0
  399. rasa/dialogue_understanding/patterns/chitchat.py +37 -0
  400. rasa/dialogue_understanding/patterns/clarify.py +97 -0
  401. rasa/dialogue_understanding/patterns/code_change.py +41 -0
  402. rasa/dialogue_understanding/patterns/collect_information.py +90 -0
  403. rasa/dialogue_understanding/patterns/completed.py +40 -0
  404. rasa/dialogue_understanding/patterns/continue_interrupted.py +42 -0
  405. rasa/dialogue_understanding/patterns/correction.py +278 -0
  406. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +301 -0
  407. rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
  408. rasa/dialogue_understanding/patterns/internal_error.py +47 -0
  409. rasa/dialogue_understanding/patterns/repeat.py +37 -0
  410. rasa/dialogue_understanding/patterns/restart.py +37 -0
  411. rasa/dialogue_understanding/patterns/search.py +37 -0
  412. rasa/dialogue_understanding/patterns/session_start.py +37 -0
  413. rasa/dialogue_understanding/patterns/skip_question.py +38 -0
  414. rasa/dialogue_understanding/patterns/user_silence.py +37 -0
  415. rasa/dialogue_understanding/processor/__init__.py +0 -0
  416. rasa/dialogue_understanding/processor/command_processor.py +720 -0
  417. rasa/dialogue_understanding/processor/command_processor_component.py +43 -0
  418. rasa/dialogue_understanding/stack/__init__.py +0 -0
  419. rasa/dialogue_understanding/stack/dialogue_stack.py +178 -0
  420. rasa/dialogue_understanding/stack/frames/__init__.py +19 -0
  421. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +27 -0
  422. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +137 -0
  423. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +157 -0
  424. rasa/dialogue_understanding/stack/frames/pattern_frame.py +10 -0
  425. rasa/dialogue_understanding/stack/frames/search_frame.py +27 -0
  426. rasa/dialogue_understanding/stack/utils.py +211 -0
  427. rasa/e2e_test/__init__.py +0 -0
  428. rasa/e2e_test/aggregate_test_stats_calculator.py +134 -0
  429. rasa/e2e_test/assertions.py +1345 -0
  430. rasa/e2e_test/assertions_schema.yml +129 -0
  431. rasa/e2e_test/constants.py +31 -0
  432. rasa/e2e_test/e2e_config.py +220 -0
  433. rasa/e2e_test/e2e_config_schema.yml +26 -0
  434. rasa/e2e_test/e2e_test_case.py +568 -0
  435. rasa/e2e_test/e2e_test_converter.py +363 -0
  436. rasa/e2e_test/e2e_test_converter_prompt.jinja2 +70 -0
  437. rasa/e2e_test/e2e_test_coverage_report.py +364 -0
  438. rasa/e2e_test/e2e_test_result.py +54 -0
  439. rasa/e2e_test/e2e_test_runner.py +1190 -0
  440. rasa/e2e_test/e2e_test_schema.yml +181 -0
  441. rasa/e2e_test/pykwalify_extensions.py +39 -0
  442. rasa/e2e_test/stub_custom_action.py +70 -0
  443. rasa/e2e_test/utils/__init__.py +0 -0
  444. rasa/e2e_test/utils/e2e_yaml_utils.py +55 -0
  445. rasa/e2e_test/utils/io.py +598 -0
  446. rasa/e2e_test/utils/validation.py +80 -0
  447. rasa/engine/__init__.py +0 -0
  448. rasa/engine/caching.py +463 -0
  449. rasa/engine/constants.py +17 -0
  450. rasa/engine/exceptions.py +14 -0
  451. rasa/engine/graph.py +642 -0
  452. rasa/engine/loader.py +48 -0
  453. rasa/engine/recipes/__init__.py +0 -0
  454. rasa/engine/recipes/config_files/default_config.yml +41 -0
  455. rasa/engine/recipes/default_components.py +97 -0
  456. rasa/engine/recipes/default_recipe.py +1258 -0
  457. rasa/engine/recipes/graph_recipe.py +78 -0
  458. rasa/engine/recipes/recipe.py +93 -0
  459. rasa/engine/runner/__init__.py +0 -0
  460. rasa/engine/runner/dask.py +250 -0
  461. rasa/engine/runner/interface.py +49 -0
  462. rasa/engine/storage/__init__.py +0 -0
  463. rasa/engine/storage/local_model_storage.py +244 -0
  464. rasa/engine/storage/resource.py +110 -0
  465. rasa/engine/storage/storage.py +199 -0
  466. rasa/engine/training/__init__.py +0 -0
  467. rasa/engine/training/components.py +176 -0
  468. rasa/engine/training/fingerprinting.py +64 -0
  469. rasa/engine/training/graph_trainer.py +256 -0
  470. rasa/engine/training/hooks.py +164 -0
  471. rasa/engine/validation.py +1451 -0
  472. rasa/env.py +14 -0
  473. rasa/exceptions.py +69 -0
  474. rasa/graph_components/__init__.py +0 -0
  475. rasa/graph_components/converters/__init__.py +0 -0
  476. rasa/graph_components/converters/nlu_message_converter.py +48 -0
  477. rasa/graph_components/providers/__init__.py +0 -0
  478. rasa/graph_components/providers/domain_for_core_training_provider.py +87 -0
  479. rasa/graph_components/providers/domain_provider.py +71 -0
  480. rasa/graph_components/providers/flows_provider.py +74 -0
  481. rasa/graph_components/providers/forms_provider.py +44 -0
  482. rasa/graph_components/providers/nlu_training_data_provider.py +56 -0
  483. rasa/graph_components/providers/responses_provider.py +44 -0
  484. rasa/graph_components/providers/rule_only_provider.py +49 -0
  485. rasa/graph_components/providers/story_graph_provider.py +96 -0
  486. rasa/graph_components/providers/training_tracker_provider.py +55 -0
  487. rasa/graph_components/validators/__init__.py +0 -0
  488. rasa/graph_components/validators/default_recipe_validator.py +550 -0
  489. rasa/graph_components/validators/finetuning_validator.py +302 -0
  490. rasa/hooks.py +112 -0
  491. rasa/jupyter.py +63 -0
  492. rasa/llm_fine_tuning/__init__.py +0 -0
  493. rasa/llm_fine_tuning/annotation_module.py +241 -0
  494. rasa/llm_fine_tuning/conversations.py +144 -0
  495. rasa/llm_fine_tuning/llm_data_preparation_module.py +178 -0
  496. rasa/llm_fine_tuning/paraphrasing/__init__.py +0 -0
  497. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +281 -0
  498. rasa/llm_fine_tuning/paraphrasing/default_rephrase_prompt_template.jina2 +44 -0
  499. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +121 -0
  500. rasa/llm_fine_tuning/paraphrasing/rephrased_user_message.py +10 -0
  501. rasa/llm_fine_tuning/paraphrasing_module.py +128 -0
  502. rasa/llm_fine_tuning/storage.py +174 -0
  503. rasa/llm_fine_tuning/train_test_split_module.py +441 -0
  504. rasa/markers/__init__.py +0 -0
  505. rasa/markers/marker.py +269 -0
  506. rasa/markers/marker_base.py +828 -0
  507. rasa/markers/upload.py +74 -0
  508. rasa/markers/validate.py +21 -0
  509. rasa/model.py +118 -0
  510. rasa/model_manager/__init__.py +0 -0
  511. rasa/model_manager/config.py +40 -0
  512. rasa/model_manager/model_api.py +559 -0
  513. rasa/model_manager/runner_service.py +286 -0
  514. rasa/model_manager/socket_bridge.py +146 -0
  515. rasa/model_manager/studio_jwt_auth.py +86 -0
  516. rasa/model_manager/trainer_service.py +325 -0
  517. rasa/model_manager/utils.py +87 -0
  518. rasa/model_manager/warm_rasa_process.py +187 -0
  519. rasa/model_service.py +112 -0
  520. rasa/model_testing.py +457 -0
  521. rasa/model_training.py +595 -0
  522. rasa/nlu/__init__.py +7 -0
  523. rasa/nlu/classifiers/__init__.py +3 -0
  524. rasa/nlu/classifiers/classifier.py +5 -0
  525. rasa/nlu/classifiers/diet_classifier.py +1881 -0
  526. rasa/nlu/classifiers/fallback_classifier.py +192 -0
  527. rasa/nlu/classifiers/keyword_intent_classifier.py +188 -0
  528. rasa/nlu/classifiers/logistic_regression_classifier.py +253 -0
  529. rasa/nlu/classifiers/mitie_intent_classifier.py +156 -0
  530. rasa/nlu/classifiers/regex_message_handler.py +56 -0
  531. rasa/nlu/classifiers/sklearn_intent_classifier.py +330 -0
  532. rasa/nlu/constants.py +77 -0
  533. rasa/nlu/convert.py +40 -0
  534. rasa/nlu/emulators/__init__.py +0 -0
  535. rasa/nlu/emulators/dialogflow.py +55 -0
  536. rasa/nlu/emulators/emulator.py +49 -0
  537. rasa/nlu/emulators/luis.py +86 -0
  538. rasa/nlu/emulators/no_emulator.py +10 -0
  539. rasa/nlu/emulators/wit.py +56 -0
  540. rasa/nlu/extractors/__init__.py +0 -0
  541. rasa/nlu/extractors/crf_entity_extractor.py +715 -0
  542. rasa/nlu/extractors/duckling_entity_extractor.py +206 -0
  543. rasa/nlu/extractors/entity_synonyms.py +178 -0
  544. rasa/nlu/extractors/extractor.py +470 -0
  545. rasa/nlu/extractors/mitie_entity_extractor.py +293 -0
  546. rasa/nlu/extractors/regex_entity_extractor.py +220 -0
  547. rasa/nlu/extractors/spacy_entity_extractor.py +95 -0
  548. rasa/nlu/featurizers/__init__.py +0 -0
  549. rasa/nlu/featurizers/dense_featurizer/__init__.py +0 -0
  550. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +445 -0
  551. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
  552. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +768 -0
  553. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +170 -0
  554. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +132 -0
  555. rasa/nlu/featurizers/featurizer.py +89 -0
  556. rasa/nlu/featurizers/sparse_featurizer/__init__.py +0 -0
  557. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +867 -0
  558. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +571 -0
  559. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +271 -0
  560. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
  561. rasa/nlu/model.py +24 -0
  562. rasa/nlu/run.py +27 -0
  563. rasa/nlu/selectors/__init__.py +0 -0
  564. rasa/nlu/selectors/response_selector.py +987 -0
  565. rasa/nlu/test.py +1940 -0
  566. rasa/nlu/tokenizers/__init__.py +0 -0
  567. rasa/nlu/tokenizers/jieba_tokenizer.py +148 -0
  568. rasa/nlu/tokenizers/mitie_tokenizer.py +75 -0
  569. rasa/nlu/tokenizers/spacy_tokenizer.py +72 -0
  570. rasa/nlu/tokenizers/tokenizer.py +239 -0
  571. rasa/nlu/tokenizers/whitespace_tokenizer.py +95 -0
  572. rasa/nlu/utils/__init__.py +35 -0
  573. rasa/nlu/utils/bilou_utils.py +462 -0
  574. rasa/nlu/utils/hugging_face/__init__.py +0 -0
  575. rasa/nlu/utils/hugging_face/registry.py +108 -0
  576. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +311 -0
  577. rasa/nlu/utils/mitie_utils.py +113 -0
  578. rasa/nlu/utils/pattern_utils.py +168 -0
  579. rasa/nlu/utils/spacy_utils.py +310 -0
  580. rasa/plugin.py +90 -0
  581. rasa/server.py +1624 -0
  582. rasa/shared/__init__.py +0 -0
  583. rasa/shared/constants.py +310 -0
  584. rasa/shared/core/__init__.py +0 -0
  585. rasa/shared/core/command_payload_reader.py +109 -0
  586. rasa/shared/core/constants.py +180 -0
  587. rasa/shared/core/conversation.py +46 -0
  588. rasa/shared/core/domain.py +2172 -0
  589. rasa/shared/core/events.py +2559 -0
  590. rasa/shared/core/flows/__init__.py +7 -0
  591. rasa/shared/core/flows/flow.py +562 -0
  592. rasa/shared/core/flows/flow_path.py +84 -0
  593. rasa/shared/core/flows/flow_step.py +146 -0
  594. rasa/shared/core/flows/flow_step_links.py +319 -0
  595. rasa/shared/core/flows/flow_step_sequence.py +70 -0
  596. rasa/shared/core/flows/flows_list.py +258 -0
  597. rasa/shared/core/flows/flows_yaml_schema.json +303 -0
  598. rasa/shared/core/flows/nlu_trigger.py +117 -0
  599. rasa/shared/core/flows/steps/__init__.py +24 -0
  600. rasa/shared/core/flows/steps/action.py +56 -0
  601. rasa/shared/core/flows/steps/call.py +64 -0
  602. rasa/shared/core/flows/steps/collect.py +112 -0
  603. rasa/shared/core/flows/steps/constants.py +5 -0
  604. rasa/shared/core/flows/steps/continuation.py +36 -0
  605. rasa/shared/core/flows/steps/end.py +22 -0
  606. rasa/shared/core/flows/steps/internal.py +44 -0
  607. rasa/shared/core/flows/steps/link.py +51 -0
  608. rasa/shared/core/flows/steps/no_operation.py +48 -0
  609. rasa/shared/core/flows/steps/set_slots.py +50 -0
  610. rasa/shared/core/flows/steps/start.py +30 -0
  611. rasa/shared/core/flows/utils.py +39 -0
  612. rasa/shared/core/flows/validation.py +735 -0
  613. rasa/shared/core/flows/yaml_flows_io.py +405 -0
  614. rasa/shared/core/generator.py +908 -0
  615. rasa/shared/core/slot_mappings.py +526 -0
  616. rasa/shared/core/slots.py +654 -0
  617. rasa/shared/core/trackers.py +1183 -0
  618. rasa/shared/core/training_data/__init__.py +0 -0
  619. rasa/shared/core/training_data/loading.py +89 -0
  620. rasa/shared/core/training_data/story_reader/__init__.py +0 -0
  621. rasa/shared/core/training_data/story_reader/story_reader.py +129 -0
  622. rasa/shared/core/training_data/story_reader/story_step_builder.py +168 -0
  623. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +888 -0
  624. rasa/shared/core/training_data/story_writer/__init__.py +0 -0
  625. rasa/shared/core/training_data/story_writer/story_writer.py +76 -0
  626. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +444 -0
  627. rasa/shared/core/training_data/structures.py +858 -0
  628. rasa/shared/core/training_data/visualization.html +146 -0
  629. rasa/shared/core/training_data/visualization.py +603 -0
  630. rasa/shared/data.py +249 -0
  631. rasa/shared/engine/__init__.py +0 -0
  632. rasa/shared/engine/caching.py +26 -0
  633. rasa/shared/exceptions.py +167 -0
  634. rasa/shared/importers/__init__.py +0 -0
  635. rasa/shared/importers/importer.py +770 -0
  636. rasa/shared/importers/multi_project.py +215 -0
  637. rasa/shared/importers/rasa.py +108 -0
  638. rasa/shared/importers/remote_importer.py +196 -0
  639. rasa/shared/importers/utils.py +36 -0
  640. rasa/shared/nlu/__init__.py +0 -0
  641. rasa/shared/nlu/constants.py +49 -0
  642. rasa/shared/nlu/interpreter.py +10 -0
  643. rasa/shared/nlu/training_data/__init__.py +0 -0
  644. rasa/shared/nlu/training_data/entities_parser.py +208 -0
  645. rasa/shared/nlu/training_data/features.py +492 -0
  646. rasa/shared/nlu/training_data/formats/__init__.py +10 -0
  647. rasa/shared/nlu/training_data/formats/dialogflow.py +163 -0
  648. rasa/shared/nlu/training_data/formats/luis.py +87 -0
  649. rasa/shared/nlu/training_data/formats/rasa.py +135 -0
  650. rasa/shared/nlu/training_data/formats/rasa_yaml.py +618 -0
  651. rasa/shared/nlu/training_data/formats/readerwriter.py +244 -0
  652. rasa/shared/nlu/training_data/formats/wit.py +52 -0
  653. rasa/shared/nlu/training_data/loading.py +137 -0
  654. rasa/shared/nlu/training_data/lookup_tables_parser.py +30 -0
  655. rasa/shared/nlu/training_data/message.py +490 -0
  656. rasa/shared/nlu/training_data/schemas/__init__.py +0 -0
  657. rasa/shared/nlu/training_data/schemas/data_schema.py +85 -0
  658. rasa/shared/nlu/training_data/schemas/nlu.yml +53 -0
  659. rasa/shared/nlu/training_data/schemas/responses.yml +70 -0
  660. rasa/shared/nlu/training_data/synonyms_parser.py +42 -0
  661. rasa/shared/nlu/training_data/training_data.py +729 -0
  662. rasa/shared/nlu/training_data/util.py +223 -0
  663. rasa/shared/providers/__init__.py +0 -0
  664. rasa/shared/providers/_configs/__init__.py +0 -0
  665. rasa/shared/providers/_configs/azure_openai_client_config.py +183 -0
  666. rasa/shared/providers/_configs/client_config.py +57 -0
  667. rasa/shared/providers/_configs/default_litellm_client_config.py +130 -0
  668. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +234 -0
  669. rasa/shared/providers/_configs/litellm_router_client_config.py +220 -0
  670. rasa/shared/providers/_configs/model_group_config.py +167 -0
  671. rasa/shared/providers/_configs/openai_client_config.py +175 -0
  672. rasa/shared/providers/_configs/rasa_llm_client_config.py +73 -0
  673. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +177 -0
  674. rasa/shared/providers/_configs/utils.py +117 -0
  675. rasa/shared/providers/_ssl_verification_utils.py +124 -0
  676. rasa/shared/providers/_utils.py +79 -0
  677. rasa/shared/providers/embedding/__init__.py +0 -0
  678. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +243 -0
  679. rasa/shared/providers/embedding/_langchain_embedding_client_adapter.py +74 -0
  680. rasa/shared/providers/embedding/azure_openai_embedding_client.py +310 -0
  681. rasa/shared/providers/embedding/default_litellm_embedding_client.py +126 -0
  682. rasa/shared/providers/embedding/embedding_client.py +90 -0
  683. rasa/shared/providers/embedding/embedding_response.py +41 -0
  684. rasa/shared/providers/embedding/huggingface_local_embedding_client.py +191 -0
  685. rasa/shared/providers/embedding/litellm_router_embedding_client.py +135 -0
  686. rasa/shared/providers/embedding/openai_embedding_client.py +172 -0
  687. rasa/shared/providers/llm/__init__.py +0 -0
  688. rasa/shared/providers/llm/_base_litellm_client.py +263 -0
  689. rasa/shared/providers/llm/azure_openai_llm_client.py +359 -0
  690. rasa/shared/providers/llm/default_litellm_llm_client.py +108 -0
  691. rasa/shared/providers/llm/litellm_router_llm_client.py +182 -0
  692. rasa/shared/providers/llm/llm_client.py +76 -0
  693. rasa/shared/providers/llm/llm_response.py +50 -0
  694. rasa/shared/providers/llm/openai_llm_client.py +155 -0
  695. rasa/shared/providers/llm/rasa_llm_client.py +112 -0
  696. rasa/shared/providers/llm/self_hosted_llm_client.py +269 -0
  697. rasa/shared/providers/mappings.py +94 -0
  698. rasa/shared/providers/router/__init__.py +0 -0
  699. rasa/shared/providers/router/_base_litellm_router_client.py +183 -0
  700. rasa/shared/providers/router/router_client.py +73 -0
  701. rasa/shared/utils/__init__.py +0 -0
  702. rasa/shared/utils/cli.py +102 -0
  703. rasa/shared/utils/common.py +324 -0
  704. rasa/shared/utils/constants.py +4 -0
  705. rasa/shared/utils/health_check/__init__.py +0 -0
  706. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +31 -0
  707. rasa/shared/utils/health_check/health_check.py +258 -0
  708. rasa/shared/utils/health_check/llm_health_check_mixin.py +31 -0
  709. rasa/shared/utils/io.py +499 -0
  710. rasa/shared/utils/llm.py +760 -0
  711. rasa/shared/utils/pykwalify_extensions.py +27 -0
  712. rasa/shared/utils/schemas/__init__.py +0 -0
  713. rasa/shared/utils/schemas/config.yml +2 -0
  714. rasa/shared/utils/schemas/domain.yml +145 -0
  715. rasa/shared/utils/schemas/events.py +214 -0
  716. rasa/shared/utils/schemas/model_config.yml +36 -0
  717. rasa/shared/utils/schemas/stories.yml +173 -0
  718. rasa/shared/utils/yaml.py +1067 -0
  719. rasa/studio/__init__.py +0 -0
  720. rasa/studio/auth.py +270 -0
  721. rasa/studio/config.py +136 -0
  722. rasa/studio/constants.py +19 -0
  723. rasa/studio/data_handler.py +368 -0
  724. rasa/studio/download.py +489 -0
  725. rasa/studio/results_logger.py +137 -0
  726. rasa/studio/train.py +134 -0
  727. rasa/studio/upload.py +549 -0
  728. rasa/telemetry.py +1869 -0
  729. rasa/tracing/__init__.py +0 -0
  730. rasa/tracing/config.py +355 -0
  731. rasa/tracing/constants.py +62 -0
  732. rasa/tracing/instrumentation/__init__.py +0 -0
  733. rasa/tracing/instrumentation/attribute_extractors.py +764 -0
  734. rasa/tracing/instrumentation/instrumentation.py +1306 -0
  735. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +144 -0
  736. rasa/tracing/instrumentation/metrics.py +294 -0
  737. rasa/tracing/metric_instrument_provider.py +205 -0
  738. rasa/utils/__init__.py +0 -0
  739. rasa/utils/beta.py +83 -0
  740. rasa/utils/cli.py +28 -0
  741. rasa/utils/common.py +639 -0
  742. rasa/utils/converter.py +53 -0
  743. rasa/utils/endpoints.py +331 -0
  744. rasa/utils/io.py +252 -0
  745. rasa/utils/json_utils.py +60 -0
  746. rasa/utils/licensing.py +542 -0
  747. rasa/utils/log_utils.py +181 -0
  748. rasa/utils/mapper.py +210 -0
  749. rasa/utils/ml_utils.py +147 -0
  750. rasa/utils/plotting.py +362 -0
  751. rasa/utils/sanic_error_handler.py +32 -0
  752. rasa/utils/singleton.py +23 -0
  753. rasa/utils/tensorflow/__init__.py +0 -0
  754. rasa/utils/tensorflow/callback.py +112 -0
  755. rasa/utils/tensorflow/constants.py +116 -0
  756. rasa/utils/tensorflow/crf.py +492 -0
  757. rasa/utils/tensorflow/data_generator.py +440 -0
  758. rasa/utils/tensorflow/environment.py +161 -0
  759. rasa/utils/tensorflow/exceptions.py +5 -0
  760. rasa/utils/tensorflow/feature_array.py +366 -0
  761. rasa/utils/tensorflow/layers.py +1565 -0
  762. rasa/utils/tensorflow/layers_utils.py +113 -0
  763. rasa/utils/tensorflow/metrics.py +281 -0
  764. rasa/utils/tensorflow/model_data.py +798 -0
  765. rasa/utils/tensorflow/model_data_utils.py +499 -0
  766. rasa/utils/tensorflow/models.py +935 -0
  767. rasa/utils/tensorflow/rasa_layers.py +1094 -0
  768. rasa/utils/tensorflow/transformer.py +640 -0
  769. rasa/utils/tensorflow/types.py +6 -0
  770. rasa/utils/train_utils.py +572 -0
  771. rasa/utils/url_tools.py +53 -0
  772. rasa/utils/yaml.py +54 -0
  773. rasa/validator.py +1653 -0
  774. rasa/version.py +3 -0
  775. rasa_pro-3.11.3.dist-info/METADATA +198 -0
  776. rasa_pro-3.11.3.dist-info/NOTICE +5 -0
  777. rasa_pro-3.11.3.dist-info/RECORD +779 -0
  778. rasa_pro-3.11.3.dist-info/WHEEL +4 -0
  779. rasa_pro-3.11.3.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,893 @@
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
+
148
+ # Perform health check of the LLM client config
149
+ llm_config = resolve_model_client_config(config.get(LLM_CONFIG_KEY, {}))
150
+ cls.perform_llm_health_check(
151
+ llm_config,
152
+ DEFAULT_LLM_CONFIG,
153
+ "multi_step_llm_command_generator.load",
154
+ MultiStepLLMCommandGenerator.__name__,
155
+ )
156
+
157
+ prompts = cls._load_prompt_templates(model_storage, resource)
158
+
159
+ # init base command generator
160
+ command_generator = cls(config, model_storage, resource, prompts)
161
+ # load flow retrieval if enabled
162
+ if command_generator.enabled_flow_retrieval:
163
+ command_generator.flow_retrieval = cls.load_flow_retrival(
164
+ command_generator.config, model_storage, resource
165
+ )
166
+
167
+ return command_generator
168
+
169
+ def persist(self) -> None:
170
+ """Persist this component to disk for future loading."""
171
+ self._persist_prompt_templates()
172
+ self._persist_config()
173
+ if self.flow_retrieval is not None:
174
+ self.flow_retrieval.persist()
175
+
176
+ async def predict_commands(
177
+ self,
178
+ message: Message,
179
+ flows: FlowsList,
180
+ tracker: Optional[DialogueStateTracker] = None,
181
+ **kwargs: Any,
182
+ ) -> List[Command]:
183
+ """Predict commands using the LLM.
184
+
185
+ Args:
186
+ message: The message from the user.
187
+ flows: The flows available to the user.
188
+ tracker: The tracker containing the current state of the conversation.
189
+ **kwargs: Keyword arguments for forward compatibility.
190
+
191
+ Returns:
192
+ The commands generated by the llm.
193
+ """
194
+ if tracker is None or flows.is_empty():
195
+ # cannot do anything if there are no flows or no tracker
196
+ return []
197
+
198
+ try:
199
+ commands = await self._predict_commands_with_multi_step(
200
+ message, flows, tracker
201
+ )
202
+ commands = self._clean_up_commands(commands)
203
+ except ProviderClientAPIException:
204
+ # if any step resulted in API exception, the command prediction cannot
205
+ # be completed, "predict" the ErrorCommand
206
+ commands = [ErrorCommand()]
207
+
208
+ if not commands:
209
+ # if for any reason the final list of commands is empty,
210
+ # "predict" CannotHandle
211
+ commands = [CannotHandleCommand()]
212
+
213
+ if tracker.has_coexistence_routing_slot:
214
+ # if coexistence feature is used, set the routing slot
215
+ commands += [SetSlotCommand(ROUTE_TO_CALM_SLOT, True)]
216
+
217
+ structlogger.debug(
218
+ "multi_step_llm_command_generator.predict_commands.finished",
219
+ commands=commands,
220
+ )
221
+
222
+ return commands
223
+
224
+ @classmethod
225
+ def parse_commands(
226
+ cls,
227
+ actions: Optional[str],
228
+ tracker: DialogueStateTracker,
229
+ flows: FlowsList,
230
+ is_handle_flows_prompt: bool = False,
231
+ ) -> List[Command]:
232
+ """Parse the actions returned by the llm into intent and entities.
233
+
234
+ Args:
235
+ actions: The actions returned by the llm.
236
+ tracker: The tracker containing the current state of the conversation.
237
+ flows: The list of flows.
238
+ is_handle_flows_prompt: bool
239
+
240
+ Returns:
241
+ The parsed commands.
242
+ """
243
+ if not actions:
244
+ return []
245
+
246
+ commands: List[Command] = []
247
+
248
+ slot_set_re = re.compile(
249
+ r"""SetSlot\(['"]?([a-zA-Z_][a-zA-Z0-9_-]*)['"]?, ?['"]?(.*)['"]?\)"""
250
+ )
251
+ start_flow_re = re.compile(r"StartFlow\(['\"]?([a-zA-Z0-9_-]+)['\"]?\)")
252
+ change_flow_re = re.compile(r"ChangeFlow\(\)")
253
+ cancel_flow_re = re.compile(r"CancelFlow\(\)")
254
+ chitchat_re = re.compile(r"ChitChat\(\)")
255
+ skip_question_re = re.compile(r"SkipQuestion\(\)")
256
+ knowledge_re = re.compile(r"SearchAndReply\(\)")
257
+ humand_handoff_re = re.compile(r"HumanHandoff\(\)")
258
+ clarify_re = re.compile(r"Clarify\(([\"\'a-zA-Z0-9_, ]+)\)")
259
+ cannot_handle_re = re.compile(r"CannotHandle\(\)")
260
+
261
+ for action in actions.strip().splitlines():
262
+ if is_handle_flows_prompt:
263
+ if (
264
+ len(commands) >= 2
265
+ or len(commands) == 1
266
+ and isinstance(commands[0], ClarifyCommand)
267
+ ):
268
+ break
269
+
270
+ if cannot_handle_re.search(action):
271
+ commands.append(
272
+ CannotHandleCommand(RASA_PATTERN_CANNOT_HANDLE_NOT_SUPPORTED)
273
+ )
274
+ if match := slot_set_re.search(action):
275
+ slot_name = cls.clean_extracted_value(match.group(1).strip())
276
+ slot_value = cls.clean_extracted_value(match.group(2))
277
+ # error case where the llm tries to start a flow using a slot set
278
+ if slot_name == "flow_name":
279
+ commands.extend(cls.start_flow_by_name(slot_value, flows))
280
+ else:
281
+ typed_slot_value = cls.get_nullable_slot_value(slot_value)
282
+ commands.append(
283
+ SetSlotCommand(name=slot_name, value=typed_slot_value)
284
+ )
285
+ elif match := start_flow_re.search(action):
286
+ flow_name = match.group(1).strip()
287
+ commands.extend(cls.start_flow_by_name(flow_name, flows))
288
+ elif cancel_flow_re.search(action):
289
+ commands.append(CancelFlowCommand())
290
+ elif chitchat_re.search(action):
291
+ commands.append(ChitChatAnswerCommand())
292
+ elif skip_question_re.search(action):
293
+ commands.append(SkipQuestionCommand())
294
+ elif knowledge_re.search(action):
295
+ commands.append(KnowledgeAnswerCommand())
296
+ elif humand_handoff_re.search(action):
297
+ commands.append(HumanHandoffCommand())
298
+ elif match := clarify_re.search(action):
299
+ options = sorted([opt.strip() for opt in match.group(1).split(",")])
300
+ # Remove surrounding quotes if present
301
+ cleaned_options = []
302
+ for flow in options:
303
+ if (flow.startswith('"') and flow.endswith('"')) or (
304
+ flow.startswith("'") and flow.endswith("'")
305
+ ):
306
+ cleaned_options.append(flow[1:-1])
307
+ else:
308
+ cleaned_options.append(flow)
309
+ # check if flow is valid
310
+ valid_options = [
311
+ flow
312
+ for flow in cleaned_options
313
+ if flow in flows.user_flow_ids
314
+ and flow not in user_flows_on_the_stack(tracker.stack)
315
+ ]
316
+ if len(valid_options) == 1:
317
+ commands.extend(cls.start_flow_by_name(valid_options[0], flows))
318
+ elif 1 < len(valid_options) <= 5:
319
+ commands.append(ClarifyCommand(valid_options))
320
+ elif change_flow_re.search(action):
321
+ commands.append(ChangeFlowCommand())
322
+
323
+ if not commands:
324
+ structlogger.debug(
325
+ "multi_step_llm_command_generator.parse_commands",
326
+ message="No commands were parsed from the LLM actions.",
327
+ actions=actions,
328
+ )
329
+
330
+ return commands
331
+
332
+ ### Helper methods
333
+ @property
334
+ def handle_flows_prompt(self) -> Optional[Text]:
335
+ return self._prompts[HANDLE_FLOWS_KEY]
336
+
337
+ @property
338
+ def fill_slots_prompt(self) -> Optional[Text]:
339
+ return self._prompts[FILL_SLOTS_KEY]
340
+
341
+ def _init_prompt_templates(self, prompt_templates: Dict[Text, Any]) -> None:
342
+ for key in self._prompts.keys():
343
+ _, default_template = PROMPT_TEMPLATES[key]
344
+ self._prompts[key] = self._resolve_prompt_template(
345
+ prompt_templates, self.config, key, default_template
346
+ )
347
+
348
+ @staticmethod
349
+ def _resolve_prompt_template(
350
+ prompt_templates: Optional[Dict[Text, Optional[Text]]],
351
+ config: Dict[Text, Any],
352
+ key: Text,
353
+ default_value: Text,
354
+ ) -> Text:
355
+ """Determines and retrieves a prompt template for a specific step in the
356
+ multistep command generator process using a given key. If the prompt
357
+ associated with the key is missing in both the `prompt_templates` and the
358
+ `config`, this method defaults to using a predefined prompt template. Each key
359
+ is uniquely associated with a distinct step of the command generation process.
360
+
361
+ Args:
362
+ prompt_templates: A dictionary of override templates.
363
+ config: The components config that may contain the file paths to the prompt
364
+ templates.
365
+ key: The key for the desired template.
366
+ default_value: The default template to use if no other is found.
367
+
368
+ Returns:
369
+ Prompt template.
370
+ """
371
+ if (
372
+ prompt_templates is not None
373
+ and key in prompt_templates
374
+ and prompt_templates[key] is not None
375
+ ):
376
+ return prompt_templates[key] # type: ignore[return-value]
377
+ return get_prompt_template(
378
+ config.get("prompt_templates", {}).get(key, {}).get(FILE_PATH_KEY),
379
+ default_value,
380
+ )
381
+
382
+ @classmethod
383
+ def _load_prompt_templates(
384
+ cls, model_storage: ModelStorage, resource: Resource
385
+ ) -> Dict[Text, Text]:
386
+ """Loads persisted prompt templates from the model storage. If a prompt template
387
+ cannot be loaded, default value is used.
388
+ """
389
+ prompts = {}
390
+ for key, (file_name, default_value) in PROMPT_TEMPLATES.items():
391
+ prompt_template = cls.load_prompt_template_from_model_storage(
392
+ model_storage, resource, file_name
393
+ )
394
+ prompts[key] = prompt_template if prompt_template else default_value
395
+ return prompts
396
+
397
+ def _persist_prompt_templates(self) -> None:
398
+ """Persist the prompt templates to disk for future loading."""
399
+ with self._model_storage.write_to(self._resource) as path:
400
+ for key, template in self._prompts.items():
401
+ file_name, _ = PROMPT_TEMPLATES[key]
402
+ file_path = path / file_name
403
+ rasa.shared.utils.io.write_text_file(template, file_path)
404
+
405
+ def _persist_config(self) -> None:
406
+ """Persist config as a source of truth for resolved clients."""
407
+ with self._model_storage.write_to(self._resource) as path:
408
+ rasa.shared.utils.io.dump_obj_as_json_to_file(
409
+ path / MULTI_STEP_LLM_COMMAND_GENERATOR_CONFIG_FILE, self.config
410
+ )
411
+
412
+ async def _predict_commands_with_multi_step(
413
+ self,
414
+ message: Message,
415
+ flows: FlowsList,
416
+ tracker: DialogueStateTracker,
417
+ ) -> List[Command]:
418
+ """Predict commands using the LLM.
419
+
420
+ Args:
421
+ message: The message from the user.
422
+ flows: The flows available to the user.
423
+ tracker: The tracker containing the current state of the conversation.
424
+
425
+ Returns:
426
+ The commands generated by the llm.
427
+
428
+ Raises:
429
+ ProviderClientAPIException: If API calls raised an error.
430
+ """
431
+ # retrieve relevant flows
432
+ filtered_flows = await self.filter_flows(message, flows, tracker)
433
+
434
+ # 1st step: Handle active flow
435
+ if tracker.has_active_user_flow:
436
+ commands_from_active_flow = await self._predict_commands_for_active_flow(
437
+ message,
438
+ tracker,
439
+ available_flows=filtered_flows,
440
+ all_flows=flows,
441
+ )
442
+ else:
443
+ commands_from_active_flow = []
444
+
445
+ # 2nd step: Check if we need to switch to another flow
446
+ contains_change_flow_command = any(
447
+ isinstance(command, ChangeFlowCommand)
448
+ for command in commands_from_active_flow
449
+ )
450
+ should_change_flows = (
451
+ not commands_from_active_flow or contains_change_flow_command
452
+ )
453
+
454
+ if should_change_flows:
455
+ commands_for_handling_flows = (
456
+ await self._predict_commands_for_handling_flows(
457
+ message,
458
+ tracker,
459
+ available_flows=filtered_flows,
460
+ all_flows=flows,
461
+ )
462
+ )
463
+ else:
464
+ commands_for_handling_flows = []
465
+
466
+ if contains_change_flow_command:
467
+ commands_from_active_flow.pop(
468
+ commands_from_active_flow.index(ChangeFlowCommand())
469
+ )
470
+
471
+ # 3rd step: Fill slots for started flows
472
+ newly_started_flows = FlowsList(
473
+ [
474
+ flow
475
+ for command in commands_for_handling_flows
476
+ if (
477
+ isinstance(command, StartFlowCommand)
478
+ and (flow := filtered_flows.flow_by_id(command.flow)) is not None
479
+ )
480
+ ]
481
+ )
482
+
483
+ commands_for_newly_started_flows = (
484
+ await self._predict_commands_for_newly_started_flows(
485
+ message,
486
+ tracker,
487
+ newly_started_flows=newly_started_flows,
488
+ all_flows=flows,
489
+ )
490
+ )
491
+
492
+ # concatenate predicted commands
493
+ commands = list(
494
+ set(
495
+ commands_from_active_flow
496
+ + commands_for_handling_flows
497
+ + commands_for_newly_started_flows
498
+ )
499
+ )
500
+
501
+ return commands
502
+
503
+ async def _predict_commands_for_active_flow(
504
+ self,
505
+ message: Message,
506
+ tracker: DialogueStateTracker,
507
+ available_flows: FlowsList,
508
+ all_flows: FlowsList,
509
+ ) -> List[Command]:
510
+ """Predicts set slots commands for currently active flow.
511
+
512
+ Args:
513
+ message: The message from the user.
514
+ tracker: The tracker containing the current state of the conversation.
515
+ available_flows: Startable and active flows.
516
+ all_flows: All flows.
517
+
518
+ inputs = self._prepare_inputs(message, tracker, startable_flows, all_flows)
519
+
520
+ Returns:
521
+ Predicted commands for the active flow.
522
+ """
523
+ inputs = self._prepare_inputs(message, tracker, available_flows, all_flows)
524
+
525
+ if inputs["current_flow"] is None:
526
+ return []
527
+
528
+ prompt = Template(self.fill_slots_prompt).render(**inputs).strip()
529
+ structlogger.debug(
530
+ "multi_step_llm_command_generator"
531
+ ".predict_commands_for_active_flow"
532
+ ".prompt_rendered",
533
+ prompt=prompt,
534
+ )
535
+
536
+ actions = await self.invoke_llm(prompt)
537
+ structlogger.debug(
538
+ "multi_step_llm_command_generator"
539
+ ".predict_commands_for_active_flow"
540
+ ".actions_generated",
541
+ action_list=actions,
542
+ )
543
+
544
+ commands = self.parse_commands(actions, tracker, available_flows)
545
+ return commands
546
+
547
+ async def _predict_commands_for_handling_flows(
548
+ self,
549
+ message: Message,
550
+ tracker: DialogueStateTracker,
551
+ available_flows: FlowsList,
552
+ all_flows: FlowsList,
553
+ ) -> List[Command]:
554
+ """Predicts commands for starting and canceling flows.
555
+
556
+ Args:
557
+ message: The message from the user.
558
+ tracker: The tracker containing the current state of the conversation.
559
+ available_flows: Startable and active flows.
560
+ all_flows: All flows.
561
+
562
+ inputs = self._prepare_inputs(message, tracker, startable_flows, all_flows, 2)
563
+
564
+ Returns:
565
+ Predicted commands for the starting/canceling flows.
566
+ """
567
+ inputs = self._prepare_inputs(message, tracker, available_flows, all_flows, 2)
568
+ prompt = Template(self.handle_flows_prompt).render(**inputs).strip()
569
+ structlogger.debug(
570
+ "multi_step_llm_command_generator"
571
+ ".predict_commands_for_handling_flows"
572
+ ".prompt_rendered",
573
+ prompt=prompt,
574
+ )
575
+
576
+ actions = await self.invoke_llm(prompt)
577
+ structlogger.debug(
578
+ "multi_step_llm_command_generator"
579
+ ".predict_commands_for_handling_flows"
580
+ ".actions_generated",
581
+ action_list=actions,
582
+ )
583
+
584
+ commands = self.parse_commands(actions, tracker, available_flows, True)
585
+ # filter out flows that are already started and active
586
+ commands = self._filter_redundant_start_flow_commands(tracker, commands)
587
+
588
+ return commands
589
+
590
+ @staticmethod
591
+ def _filter_redundant_start_flow_commands(
592
+ tracker: DialogueStateTracker, commands: List[Command]
593
+ ) -> List[Command]:
594
+ """Filters out StartFlowCommand commands for flows that are already active,
595
+ based on the current tracker state.
596
+ """
597
+ frames = tracker.stack.frames
598
+ active_user_flows = {
599
+ frame.flow_id for frame in frames if isinstance(frame, UserFlowStackFrame)
600
+ }
601
+ commands = [
602
+ command
603
+ for command in commands
604
+ if not (
605
+ isinstance(command, StartFlowCommand)
606
+ and command.flow in active_user_flows
607
+ )
608
+ ]
609
+ return commands
610
+
611
+ async def _predict_commands_for_newly_started_flows(
612
+ self,
613
+ message: Message,
614
+ tracker: DialogueStateTracker,
615
+ newly_started_flows: FlowsList,
616
+ all_flows: FlowsList,
617
+ ) -> List[Command]:
618
+ """Predict set slot commands for newly started flows."""
619
+ commands_for_newly_started_flows = []
620
+ for newly_started_flow in newly_started_flows:
621
+ commands_for_newly_started_flows += (
622
+ await self._predict_commands_for_newly_started_flow(
623
+ newly_started_flow, message, tracker, newly_started_flows
624
+ )
625
+ )
626
+ return commands_for_newly_started_flows
627
+
628
+ async def _predict_commands_for_newly_started_flow(
629
+ self,
630
+ newly_started_flow: Flow,
631
+ message: Message,
632
+ tracker: DialogueStateTracker,
633
+ newly_started_flows: FlowsList,
634
+ ) -> List[Command]:
635
+ inputs = self._prepare_inputs_for_single_flow(
636
+ message, tracker, newly_started_flow, max_turns=20
637
+ )
638
+
639
+ if len(inputs["flow_slots"]) == 0:
640
+ # return empty if the newly started flow does not have any slots
641
+ return []
642
+
643
+ prompt = Template(self.fill_slots_prompt).render(**inputs)
644
+ structlogger.debug(
645
+ "multi_step_llm_command_generator"
646
+ ".predict_commands_for_newly_started_flow"
647
+ ".prompt_rendered",
648
+ flow=newly_started_flow.id,
649
+ prompt=prompt,
650
+ )
651
+
652
+ actions = await self.invoke_llm(prompt)
653
+ structlogger.debug(
654
+ "multi_step_llm_command_generator"
655
+ ".predict_commands_for_newly_started_flow"
656
+ ".actions_generated",
657
+ flow=newly_started_flow.id,
658
+ action_list=actions,
659
+ )
660
+
661
+ commands = self.parse_commands(actions, tracker, newly_started_flows)
662
+
663
+ # filter out all commands that unset values for newly started flow
664
+ commands = [
665
+ command
666
+ for command in commands
667
+ if isinstance(command, SetSlotCommand) and command.value
668
+ ]
669
+ structlogger.debug(
670
+ "multi_step_llm_command_generator"
671
+ ".predict_commands_for_newly_started_flow"
672
+ ".filtered_commands",
673
+ flow=newly_started_flow.id,
674
+ commands=commands,
675
+ )
676
+
677
+ return commands
678
+
679
+ def _prepare_inputs(
680
+ self,
681
+ message: Message,
682
+ tracker: DialogueStateTracker,
683
+ available_flows: FlowsList,
684
+ all_flows: FlowsList,
685
+ max_turns: int = 1,
686
+ ) -> Dict[str, Any]:
687
+ """Prepare input information to be used by prompt template.
688
+
689
+ Args:
690
+ message: The message from the user.
691
+ tracker: The tracker containing the current state of the conversation.
692
+ available_flows: Startable and active flows.
693
+ all_flows: All flows.
694
+ max_turns: Max turns of the conversation history between the user
695
+ and the assistant
696
+
697
+ Returns:
698
+ Dictionary of inputs.
699
+ """
700
+ top_relevant_frame = top_flow_frame(tracker.stack)
701
+ top_flow = top_relevant_frame.flow(all_flows) if top_relevant_frame else None
702
+ current_step = (
703
+ top_relevant_frame.step(all_flows) if top_relevant_frame else None
704
+ )
705
+ if top_flow is not None:
706
+ flow_slots = self.prepare_current_flow_slots_for_template(
707
+ top_flow, current_step, tracker
708
+ )
709
+ top_flow_is_pattern = top_flow.is_rasa_default_flow
710
+ else:
711
+ flow_slots = []
712
+ top_flow_is_pattern = False
713
+
714
+ if top_flow_is_pattern:
715
+ top_user_frame = top_user_flow_frame(tracker.stack)
716
+ top_user_flow = (
717
+ top_user_frame.flow(available_flows) if top_user_frame else None
718
+ )
719
+ top_user_flow_step = (
720
+ top_user_frame.step(available_flows) if top_user_frame else None
721
+ )
722
+ top_user_flow_slots = self.prepare_current_flow_slots_for_template(
723
+ top_user_flow, top_user_flow_step, tracker
724
+ )
725
+ else:
726
+ top_user_flow = None
727
+ top_user_flow_slots = []
728
+
729
+ current_slot, current_slot_description = self.prepare_current_slot_for_template(
730
+ current_step
731
+ )
732
+ current_slot_type = None
733
+ current_slot_allowed_values = None
734
+ if current_slot:
735
+ current_slot_type = (
736
+ slot.type_name
737
+ if (slot := tracker.slots.get(current_slot)) is not None
738
+ else None
739
+ )
740
+ current_slot_allowed_values = allowed_values_for_slot(
741
+ tracker.slots.get(current_slot)
742
+ )
743
+ (
744
+ current_conversation,
745
+ latest_user_message,
746
+ ) = self.prepare_conversation_context_for_template(message, tracker, max_turns)
747
+
748
+ inputs = {
749
+ "available_flows": self.prepare_flows_for_template(
750
+ available_flows, tracker
751
+ ),
752
+ "current_conversation": current_conversation,
753
+ "current_flow": top_flow.id if top_flow is not None else None,
754
+ "current_slot": current_slot,
755
+ "current_slot_description": current_slot_description,
756
+ "current_slot_type": current_slot_type,
757
+ "current_slot_allowed_values": current_slot_allowed_values,
758
+ "last_user_message": latest_user_message,
759
+ "flow_slots": flow_slots,
760
+ "top_flow_is_pattern": top_flow_is_pattern,
761
+ "top_user_flow": top_user_flow.id if top_user_flow is not None else None,
762
+ "top_user_flow_slots": top_user_flow_slots,
763
+ "flow_active": True,
764
+ }
765
+ return inputs
766
+
767
+ def _prepare_inputs_for_single_flow(
768
+ self,
769
+ message: Message,
770
+ tracker: DialogueStateTracker,
771
+ flow: Flow,
772
+ max_turns: int = 1,
773
+ ) -> Dict[Text, Any]:
774
+ flow_slots = self.prepare_current_flow_slots_for_template(
775
+ flow, flow.first_step_in_flow(), tracker
776
+ )
777
+ (
778
+ current_conversation,
779
+ latest_user_message,
780
+ ) = self.prepare_conversation_context_for_template(message, tracker, max_turns)
781
+ inputs = {
782
+ "current_conversation": current_conversation,
783
+ "flow_slots": flow_slots,
784
+ "current_flow": flow.id,
785
+ "last_user_message": latest_user_message,
786
+ "flow_active": False,
787
+ }
788
+ return inputs
789
+
790
+ @classmethod
791
+ def fingerprint_addon(cls, config: Dict[str, Any]) -> Optional[str]:
792
+ """Add a fingerprint for the graph."""
793
+ handle_flows_template = get_prompt_template(
794
+ config.get("prompt_templates", {})
795
+ .get(HANDLE_FLOWS_KEY, {})
796
+ .get(FILE_PATH_KEY),
797
+ DEFAULT_HANDLE_FLOWS_TEMPLATE,
798
+ )
799
+ fill_slots_template = get_prompt_template(
800
+ config.get("prompt_templates", {})
801
+ .get(FILL_SLOTS_KEY, {})
802
+ .get(FILE_PATH_KEY),
803
+ DEFAULT_FILL_SLOTS_TEMPLATE,
804
+ )
805
+
806
+ llm_config = resolve_model_client_config(
807
+ config.get(LLM_CONFIG_KEY), MultiStepLLMCommandGenerator.__name__
808
+ )
809
+ embedding_config = resolve_model_client_config(
810
+ config.get(FLOW_RETRIEVAL_KEY, {}).get(EMBEDDINGS_CONFIG_KEY),
811
+ FlowRetrieval.__name__,
812
+ )
813
+
814
+ return deep_container_fingerprint(
815
+ [handle_flows_template, fill_slots_template, llm_config, embedding_config]
816
+ )
817
+
818
+ @staticmethod
819
+ def prepare_conversation_context_for_template(
820
+ message: Message, tracker: DialogueStateTracker, max_turns: int = 20
821
+ ) -> Tuple[Text, Text]:
822
+ current_conversation = tracker_as_readable_transcript(
823
+ tracker, max_turns=max_turns
824
+ )
825
+ latest_user_message = sanitize_message_for_prompt(message.get(TEXT))
826
+ current_conversation += f"\nUSER: {latest_user_message}"
827
+ return current_conversation, latest_user_message
828
+
829
+ def prepare_current_flow_slots_for_template(
830
+ self, top_flow: Flow, current_step: FlowStep, tracker: DialogueStateTracker
831
+ ) -> List[Dict[Text, Any]]:
832
+ """Prepare the current flow slots for the template.
833
+
834
+ Args:
835
+ top_flow: The top flow.
836
+ current_step: The current step in the flow.
837
+ tracker: The tracker containing the current state of the conversation.
838
+
839
+ Returns:
840
+ The slots with values, types, allowed values and a description.
841
+ """
842
+ if top_flow is not None:
843
+ flow_slots = [
844
+ {
845
+ "name": collect_step.collect,
846
+ "value": self.get_slot_value(tracker, collect_step.collect),
847
+ "type": tracker.slots[collect_step.collect].type_name,
848
+ "allowed_values": allowed_values_for_slot(
849
+ tracker.slots[collect_step.collect]
850
+ ),
851
+ "description": collect_step.description,
852
+ }
853
+ for collect_step in top_flow.get_collect_steps()
854
+ if self.is_extractable(collect_step, tracker, current_step)
855
+ ]
856
+ else:
857
+ flow_slots = []
858
+ return flow_slots
859
+
860
+ @staticmethod
861
+ def prepare_current_slot_for_template(
862
+ current_step: FlowStep,
863
+ ) -> Tuple[Union[str, None], Union[str, None]]:
864
+ """Prepare the current slot for the template."""
865
+ return (
866
+ (current_step.collect, current_step.description)
867
+ if isinstance(current_step, CollectInformationFlowStep)
868
+ else (None, None)
869
+ )
870
+
871
+ @staticmethod
872
+ def _clean_up_commands(commands: List[Command]) -> List[Command]:
873
+ """Cleans the list of commands by removing CannotHandleCommand,
874
+ if it exists and there are other commands in the list.
875
+ """
876
+ other_commands_count = sum(
877
+ not isinstance(command, CannotHandleCommand) for command in commands
878
+ )
879
+
880
+ if other_commands_count == len(commands):
881
+ # no cannot handle command found
882
+ return commands
883
+
884
+ if other_commands_count:
885
+ # remove cannot handle commands
886
+ return [
887
+ command
888
+ for command in commands
889
+ if not isinstance(command, CannotHandleCommand)
890
+ ]
891
+
892
+ # only cannot handle commands present
893
+ return [CannotHandleCommand(RASA_PATTERN_CANNOT_HANDLE_NOT_SUPPORTED)]