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