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,781 @@
1
+ import importlib.resources
2
+ import json
3
+ import re
4
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text
5
+
6
+ import dotenv
7
+ import structlog
8
+ from jinja2 import Template
9
+ from pydantic import ValidationError
10
+
11
+ import rasa.shared.utils.io
12
+ from rasa.telemetry import (
13
+ track_enterprise_search_policy_predict,
14
+ track_enterprise_search_policy_train_completed,
15
+ track_enterprise_search_policy_train_started,
16
+ )
17
+ from rasa.shared.exceptions import RasaException
18
+ from rasa.core.constants import (
19
+ POLICY_MAX_HISTORY,
20
+ POLICY_PRIORITY,
21
+ SEARCH_POLICY_PRIORITY,
22
+ )
23
+ from rasa.core.policies.policy import Policy, PolicyPrediction
24
+ from rasa.core.utils import AvailableEndpoints
25
+ from rasa.dialogue_understanding.patterns.internal_error import (
26
+ InternalErrorPatternFlowStackFrame,
27
+ )
28
+ from rasa.dialogue_understanding.patterns.cannot_handle import (
29
+ CannotHandlePatternFlowStackFrame,
30
+ )
31
+ from rasa.dialogue_understanding.stack.frames import PatternFlowStackFrame
32
+ from rasa.dialogue_understanding.stack.frames import (
33
+ DialogueStackFrame,
34
+ SearchStackFrame,
35
+ )
36
+ from rasa.engine.graph import ExecutionContext
37
+ from rasa.engine.recipes.default_recipe import DefaultV1Recipe
38
+ from rasa.engine.storage.resource import Resource
39
+ from rasa.engine.storage.storage import ModelStorage
40
+ from rasa.graph_components.providers.forms_provider import Forms
41
+ from rasa.graph_components.providers.responses_provider import Responses
42
+ from rasa.shared.core.constants import (
43
+ ACTION_CANCEL_FLOW,
44
+ ACTION_SEND_TEXT_NAME,
45
+ DEFAULT_SLOT_NAMES,
46
+ )
47
+ from rasa.shared.core.domain import Domain
48
+ from rasa.shared.core.events import Event
49
+ from rasa.shared.core.generator import TrackerWithCachedStates
50
+ from rasa.shared.core.trackers import DialogueStateTracker, EventVerbosity
51
+ from rasa.shared.nlu.training_data.training_data import TrainingData
52
+ from rasa.shared.utils.cli import print_error_and_exit
53
+ from rasa.shared.utils.io import deep_container_fingerprint
54
+ from rasa.shared.utils.llm import (
55
+ DEFAULT_OPENAI_CHAT_MODEL_NAME,
56
+ DEFAULT_OPENAI_EMBEDDING_MODEL_NAME,
57
+ embedder_factory,
58
+ get_prompt_template,
59
+ llm_factory,
60
+ sanitize_message_for_prompt,
61
+ tracker_as_readable_transcript,
62
+ )
63
+ from rasa.core.information_retrieval.faiss import FAISS_Store
64
+ from rasa.core.information_retrieval import (
65
+ InformationRetrieval,
66
+ SearchResult,
67
+ InformationRetrievalException,
68
+ create_from_endpoint_config,
69
+ )
70
+
71
+ if TYPE_CHECKING:
72
+ from langchain.schema.embeddings import Embeddings
73
+ from langchain.llms.base import BaseLLM
74
+ from rasa.core.featurizers.tracker_featurizers import TrackerFeaturizer
75
+
76
+ from rasa.utils.log_utils import log_llm
77
+
78
+ logger = structlog.get_logger()
79
+
80
+ dotenv.load_dotenv("./.env")
81
+
82
+ SOURCE_PROPERTY = "source"
83
+ VECTOR_STORE_TYPE_PROPERTY = "type"
84
+ VECTOR_STORE_PROPERTY = "vector_store"
85
+ VECTOR_STORE_THRESHOLD_PROPERTY = "threshold"
86
+ TRACE_TOKENS_PROPERTY = "trace_prompt_tokens"
87
+ CITATION_ENABLED_PROPERTY = "citation_enabled"
88
+ USE_LLM_PROPERTY = "use_generative_llm"
89
+
90
+ DEFAULT_VECTOR_STORE_TYPE = "faiss"
91
+ DEFAULT_VECTOR_STORE_THRESHOLD = 0.0
92
+ DEFAULT_VECTOR_STORE = {
93
+ VECTOR_STORE_TYPE_PROPERTY: DEFAULT_VECTOR_STORE_TYPE,
94
+ SOURCE_PROPERTY: "./docs",
95
+ VECTOR_STORE_THRESHOLD_PROPERTY: DEFAULT_VECTOR_STORE_THRESHOLD,
96
+ }
97
+
98
+ DEFAULT_LLM_CONFIG = {
99
+ "_type": "openai",
100
+ "request_timeout": 10,
101
+ "temperature": 0.0,
102
+ "max_tokens": 256,
103
+ "model_name": DEFAULT_OPENAI_CHAT_MODEL_NAME,
104
+ "max_retries": 1,
105
+ }
106
+
107
+ DEFAULT_EMBEDDINGS_CONFIG = {
108
+ "_type": "openai",
109
+ "model": DEFAULT_OPENAI_EMBEDDING_MODEL_NAME,
110
+ }
111
+
112
+ EMBEDDINGS_CONFIG_KEY = "embeddings"
113
+ LLM_CONFIG_KEY = "llm"
114
+ ENTERPRISE_SEARCH_PROMPT_FILE_NAME = "enterprise_search_policy_prompt.jinja2"
115
+
116
+ DEFAULT_ENTERPRISE_SEARCH_PROMPT_TEMPLATE = importlib.resources.read_text(
117
+ "rasa.core.policies", "enterprise_search_prompt_template.jinja2"
118
+ )
119
+
120
+ DEFAULT_ENTERPRISE_SEARCH_PROMPT_WITH_CITATION_TEMPLATE = importlib.resources.read_text(
121
+ "rasa.core.policies", "enterprise_search_prompt_with_citation_template.jinja2"
122
+ )
123
+
124
+
125
+ class VectorStoreConnectionError(RasaException):
126
+ """Exception raised for errors in connecting to the vector store."""
127
+
128
+
129
+ class VectorStoreConfigurationError(RasaException):
130
+ """Exception raised for errors in vector store configuration."""
131
+
132
+
133
+ @DefaultV1Recipe.register(
134
+ DefaultV1Recipe.ComponentType.POLICY_WITH_END_TO_END_SUPPORT, is_trainable=True
135
+ )
136
+ class EnterpriseSearchPolicy(Policy):
137
+ """Policy which uses a vector store and LLMs to respond to user messages.
138
+
139
+ The policy uses a vector store and LLMs to respond to user messages. The
140
+ vector store is used to retrieve the most relevant responses to the user
141
+ message. The LLMs are used to rank the responses and select the best
142
+ response. The policy can be used to respond to user messages without
143
+ training data.
144
+
145
+ Example Configuration:
146
+
147
+ policies:
148
+ # - ...
149
+ - name: EnterpriseSearchPolicy
150
+ vector_store:
151
+ type: "milvus"
152
+ <vector_store_config>
153
+ # - ...
154
+ """
155
+
156
+ @staticmethod
157
+ def does_support_stack_frame(frame: DialogueStackFrame) -> bool:
158
+ """Checks if the policy supports the given stack frame."""
159
+ return isinstance(frame, SearchStackFrame)
160
+
161
+ @staticmethod
162
+ def get_default_config() -> Dict[str, Any]:
163
+ """Returns the default config of the policy."""
164
+ return {
165
+ POLICY_PRIORITY: SEARCH_POLICY_PRIORITY,
166
+ VECTOR_STORE_PROPERTY: DEFAULT_VECTOR_STORE,
167
+ }
168
+
169
+ def __init__(
170
+ self,
171
+ config: Dict[Text, Any],
172
+ model_storage: ModelStorage,
173
+ resource: Resource,
174
+ execution_context: ExecutionContext,
175
+ vector_store: Optional[InformationRetrieval] = None,
176
+ featurizer: Optional["TrackerFeaturizer"] = None,
177
+ prompt_template: Optional[Text] = None,
178
+ ) -> None:
179
+ """Constructs a new Policy object."""
180
+ super().__init__(config, model_storage, resource, execution_context, featurizer)
181
+
182
+ self.vector_store = vector_store
183
+ self.vector_store_config = config.get(
184
+ VECTOR_STORE_PROPERTY, DEFAULT_VECTOR_STORE
185
+ )
186
+ self.llm_config = self.config.get(LLM_CONFIG_KEY, DEFAULT_LLM_CONFIG)
187
+ self.embeddings_config = self.config.get(
188
+ EMBEDDINGS_CONFIG_KEY, DEFAULT_EMBEDDINGS_CONFIG
189
+ )
190
+ self.max_history = self.config.get(POLICY_MAX_HISTORY)
191
+ self.prompt_template = prompt_template or get_prompt_template(
192
+ self.config.get("prompt"),
193
+ DEFAULT_ENTERPRISE_SEARCH_PROMPT_TEMPLATE,
194
+ )
195
+ self.trace_prompt_tokens = self.config.get(TRACE_TOKENS_PROPERTY, False)
196
+ self.use_llm = self.config.get(USE_LLM_PROPERTY, True)
197
+ self.citation_enabled = self.config.get(CITATION_ENABLED_PROPERTY, False)
198
+ self.citation_prompt_template = get_prompt_template(
199
+ self.config.get("prompt"),
200
+ DEFAULT_ENTERPRISE_SEARCH_PROMPT_WITH_CITATION_TEMPLATE,
201
+ )
202
+ if self.citation_enabled:
203
+ self.prompt_template = self.citation_prompt_template
204
+
205
+ @classmethod
206
+ def _create_plain_embedder(cls, config: Dict[Text, Any]) -> "Embeddings":
207
+ """Creates an embedder based on the given configuration.
208
+
209
+ Returns:
210
+ The embedder.
211
+ """
212
+ return embedder_factory(
213
+ config.get(EMBEDDINGS_CONFIG_KEY), DEFAULT_EMBEDDINGS_CONFIG
214
+ )
215
+
216
+ def train( # type: ignore[override]
217
+ self,
218
+ training_trackers: List[TrackerWithCachedStates],
219
+ domain: Domain,
220
+ responses: Responses,
221
+ forms: Forms,
222
+ training_data: TrainingData,
223
+ **kwargs: Any,
224
+ ) -> Resource:
225
+ """Trains a policy.
226
+
227
+ Args:
228
+ training_trackers: The story and rules trackers from the training data.
229
+ domain: The model's domain.
230
+ responses: The model's responses.
231
+ forms: The model's forms.
232
+ training_data: The model's training data.
233
+ **kwargs: Depending on the specified `needs` section and the resulting
234
+ graph structure the policy can use different input to train itself.
235
+
236
+ Returns:
237
+ A policy must return its resource locator so that potential children nodes
238
+ can load the policy from the resource.
239
+ """
240
+ store_type = self.vector_store_config.get(VECTOR_STORE_TYPE_PROPERTY)
241
+
242
+ # telemetry call to track training start
243
+ track_enterprise_search_policy_train_started()
244
+
245
+ # validate embedding configuration
246
+ try:
247
+ embeddings = self._create_plain_embedder(self.config)
248
+ except ValidationError as e:
249
+ print_error_and_exit(
250
+ "Unable to create embedder. Please make sure you specified the "
251
+ f"required environment variables. Error: {e}"
252
+ )
253
+
254
+ # validate llm configuration
255
+ try:
256
+ llm_factory(self.config.get(LLM_CONFIG_KEY), DEFAULT_LLM_CONFIG)
257
+ except (ImportError, ValueError, ValidationError) as e:
258
+ # ImportError: llm library is likely not installed
259
+ # ValueError: llm config is likely invalid
260
+ # ValidationError: environment variables are likely not set
261
+ print_error_and_exit(f"Unable to create LLM. Error: {e}")
262
+
263
+ if store_type == DEFAULT_VECTOR_STORE_TYPE:
264
+ logger.info("enterprise_search_policy.train.faiss")
265
+ with self._model_storage.write_to(self._resource) as path:
266
+ self.vector_store = FAISS_Store(
267
+ docs_folder=self.vector_store_config.get(SOURCE_PROPERTY),
268
+ embeddings=embeddings,
269
+ index_path=path,
270
+ create_index=True,
271
+ )
272
+ else:
273
+ logger.info("enterprise_search_policy.train.custom", store_type=store_type)
274
+
275
+ # telemetry call to track training completion
276
+ track_enterprise_search_policy_train_completed(
277
+ vector_store_type=store_type,
278
+ embeddings_type=self.embeddings_config.get("_type"),
279
+ embeddings_model=self.embeddings_config.get("model")
280
+ or self.embeddings_config.get("model_name"),
281
+ llm_type=self.llm_config.get("_type"),
282
+ llm_model=self.llm_config.get("model") or self.llm_config.get("model_name"),
283
+ citation_enabled=self.citation_enabled,
284
+ )
285
+ self.persist()
286
+ return self._resource
287
+
288
+ def persist(self) -> None:
289
+ """Persists the policy to storage."""
290
+ with self._model_storage.write_to(self._resource) as path:
291
+ rasa.shared.utils.io.write_text_file(
292
+ self.prompt_template, path / ENTERPRISE_SEARCH_PROMPT_FILE_NAME
293
+ )
294
+
295
+ def _prepare_slots_for_template(
296
+ self, tracker: DialogueStateTracker
297
+ ) -> List[Dict[str, str]]:
298
+ """Prepares the slots for the template.
299
+
300
+ Args:
301
+ tracker: The tracker containing the conversation history up to now.
302
+
303
+ Returns:
304
+ The non-empty slots.
305
+ """
306
+ template_slots = []
307
+ for name, slot in tracker.slots.items():
308
+ if name not in DEFAULT_SLOT_NAMES and slot.value is not None:
309
+ template_slots.append(
310
+ {
311
+ "name": name,
312
+ "value": str(slot.value),
313
+ "type": slot.type_name,
314
+ }
315
+ )
316
+ return template_slots
317
+
318
+ def _connect_vector_store_or_raise(
319
+ self, endpoints: Optional[AvailableEndpoints]
320
+ ) -> None:
321
+ """Connects to the vector store or raises an exception.
322
+
323
+ Raise exceptions for the following cases:
324
+ - The configuration is not specified
325
+ - Unable to connect to the vector store
326
+
327
+ Args:
328
+ endpoints: Endpoints configuration.
329
+ """
330
+ config = endpoints.vector_store if endpoints else None
331
+ store_type = self.vector_store_config.get(VECTOR_STORE_TYPE_PROPERTY)
332
+ if config is None and store_type != DEFAULT_VECTOR_STORE_TYPE:
333
+ logger.error(
334
+ "enterprise_search_policy._connect_vector_store_or_raise.no_config"
335
+ )
336
+ raise VectorStoreConfigurationError(
337
+ """No vector store specified. Please specify a vector
338
+ store in the endpoints configuration"""
339
+ )
340
+ try:
341
+ self.vector_store.connect(config) # type: ignore
342
+ except Exception as e:
343
+ logger.error(
344
+ "enterprise_search_policy._connect_vector_store_or_raise.connect_error",
345
+ error=e,
346
+ )
347
+ raise VectorStoreConnectionError(
348
+ f"Unable to connect to the vector store. Error: {e}"
349
+ )
350
+
351
+ def _get_last_user_message(self, tracker: DialogueStateTracker) -> str:
352
+ """Get the last user message from the tracker.
353
+
354
+ Args:
355
+ tracker: The tracker containing the conversation history up to now.
356
+
357
+ Returns:
358
+ The last user message.
359
+ """
360
+ for event in reversed(tracker.events):
361
+ if isinstance(event, rasa.shared.core.events.UserUttered):
362
+ return sanitize_message_for_prompt(event.text)
363
+ return ""
364
+
365
+ async def predict_action_probabilities( # type: ignore[override]
366
+ self,
367
+ tracker: DialogueStateTracker,
368
+ domain: Domain,
369
+ endpoints: Optional[AvailableEndpoints],
370
+ rule_only_data: Optional[Dict[Text, Any]] = None,
371
+ **kwargs: Any,
372
+ ) -> PolicyPrediction:
373
+ """Predicts the next action the bot should take after seeing the tracker.
374
+
375
+ Args:
376
+ tracker: The tracker containing the conversation history up to now.
377
+ domain: The model's domain.
378
+ endpoints: The model's endpoints.
379
+ rule_only_data: Slots and loops which are specific to rules and hence
380
+ should be ignored by this policy.
381
+ **kwargs: Depending on the specified `needs` section and the resulting
382
+ graph structure the policy can use different input to make predictions.
383
+
384
+ Returns:
385
+ The prediction.
386
+ """
387
+ logger_key = "enterprise_search_policy.predict_action_probabilities"
388
+ vector_search_threshold = self.vector_store_config.get(
389
+ VECTOR_STORE_THRESHOLD_PROPERTY, DEFAULT_VECTOR_STORE_THRESHOLD
390
+ )
391
+ llm = llm_factory(self.config.get(LLM_CONFIG_KEY), DEFAULT_LLM_CONFIG)
392
+ if not self.supports_current_stack_frame(
393
+ tracker, False, False
394
+ ) or self.should_abstain_in_coexistence(tracker, True):
395
+ return self._prediction(self._default_predictions(domain))
396
+
397
+ if not self.vector_store:
398
+ logger.error(f"{logger_key}.no_vector_store")
399
+ return self._create_prediction_internal_error(domain, tracker)
400
+
401
+ try:
402
+ self._connect_vector_store_or_raise(endpoints)
403
+ except (VectorStoreConfigurationError, VectorStoreConnectionError) as e:
404
+ logger.error(f"{logger_key}.connection_error", error=e)
405
+ return self._create_prediction_internal_error(domain, tracker)
406
+
407
+ search_query = self._get_last_user_message(tracker)
408
+ tracker_state = tracker.current_state(EventVerbosity.AFTER_RESTART)
409
+
410
+ try:
411
+ documents = await self.vector_store.search(
412
+ query=search_query,
413
+ tracker_state=tracker_state,
414
+ threshold=vector_search_threshold,
415
+ )
416
+ except InformationRetrievalException as e:
417
+ logger.error(f"{logger_key}.search_error", error=e)
418
+ return self._create_prediction_internal_error(domain, tracker)
419
+
420
+ if not documents.results:
421
+ logger.info(f"{logger_key}.no_documents")
422
+ return self._create_prediction_cannot_handle(domain, tracker)
423
+
424
+ if self.use_llm:
425
+ prompt = self._render_prompt(tracker, documents.results)
426
+ llm_answer = await self._generate_llm_answer(llm, prompt)
427
+
428
+ if self.citation_enabled:
429
+ llm_answer = self.post_process_citations(llm_answer)
430
+
431
+ logger.debug(f"{logger_key}.llm_answer", llm_answer=llm_answer)
432
+ response = llm_answer
433
+ else:
434
+ response = documents.results[0].metadata.get("answer", None)
435
+ if not response:
436
+ logger.error(
437
+ f"{logger_key}.answer_key_missing_in_metadata",
438
+ search_results=documents.results,
439
+ )
440
+ logger.debug(
441
+ "enterprise_search_policy.predict_action_probabilities.no_llm",
442
+ search_results=documents,
443
+ )
444
+
445
+ if response is None:
446
+ return self._create_prediction_internal_error(domain, tracker)
447
+
448
+ action_metadata = {
449
+ "message": {
450
+ "text": response,
451
+ }
452
+ }
453
+
454
+ # telemetry call to track policy prediction
455
+ track_enterprise_search_policy_predict(
456
+ vector_store_type=self.vector_store_config.get(VECTOR_STORE_TYPE_PROPERTY),
457
+ embeddings_type=self.embeddings_config.get("_type"),
458
+ embeddings_model=self.embeddings_config.get("model")
459
+ or self.embeddings_config.get("model_name"),
460
+ llm_type=self.llm_config.get("_type"),
461
+ llm_model=self.llm_config.get("model") or self.llm_config.get("model_name"),
462
+ citation_enabled=self.citation_enabled,
463
+ )
464
+ return self._create_prediction(
465
+ domain=domain, tracker=tracker, action_metadata=action_metadata
466
+ )
467
+
468
+ def _render_prompt(
469
+ self, tracker: DialogueStateTracker, documents: List[SearchResult]
470
+ ) -> Text:
471
+ """Renders the prompt from the template.
472
+
473
+ Args:
474
+ tracker: The tracker containing the conversation history up to now.
475
+ documents: The documents retrieved from search
476
+
477
+ Returns:
478
+ The rendered prompt.
479
+ """
480
+ inputs = {
481
+ "current_conversation": tracker_as_readable_transcript(
482
+ tracker, max_turns=self.max_history
483
+ ),
484
+ "docs": documents,
485
+ "slots": self._prepare_slots_for_template(tracker),
486
+ "citation_enabled": self.citation_enabled,
487
+ }
488
+ prompt = Template(self.prompt_template).render(**inputs)
489
+ log_llm(
490
+ logger=logger,
491
+ log_module="EnterpriseSearchPolicy",
492
+ log_event="enterprise_search_policy._render_prompt.prompt_rendered",
493
+ prompt=prompt,
494
+ )
495
+ return prompt
496
+
497
+ async def _generate_llm_answer(
498
+ self, llm: "BaseLLM", prompt: Text
499
+ ) -> Optional[Text]:
500
+ try:
501
+ llm_answer = await llm.apredict(prompt)
502
+ except Exception as e:
503
+ # unfortunately, langchain does not wrap LLM exceptions which means
504
+ # we have to catch all exceptions here
505
+ logger.error(
506
+ "enterprise_search_policy._generate_llm_answer.llm_error",
507
+ error=e,
508
+ )
509
+ llm_answer = None
510
+
511
+ return llm_answer
512
+
513
+ def _create_prediction(
514
+ self,
515
+ domain: Domain,
516
+ tracker: DialogueStateTracker,
517
+ action_metadata: Dict[Text, Any],
518
+ ) -> PolicyPrediction:
519
+ """Create a policy prediction result with ACTION_SEND_TEXT_NAME.
520
+
521
+ Args:
522
+ domain: The model's domain.
523
+ tracker: The tracker containing the conversation history up to now.
524
+ action_metadata: The metadata for the predicted action.
525
+
526
+ Returns:
527
+ The prediction.
528
+ """
529
+ result = self._prediction_result(ACTION_SEND_TEXT_NAME, domain)
530
+ stack = tracker.stack
531
+ if not stack.is_empty():
532
+ stack.pop()
533
+ events: List[Event] = tracker.create_stack_updated_events(stack)
534
+ else:
535
+ events = []
536
+
537
+ return self._prediction(result, action_metadata=action_metadata, events=events)
538
+
539
+ def _create_prediction_internal_error(
540
+ self, domain: Domain, tracker: DialogueStateTracker
541
+ ) -> PolicyPrediction:
542
+ return self._create_prediction_for_pattern(
543
+ domain, tracker, InternalErrorPatternFlowStackFrame()
544
+ )
545
+
546
+ def _create_prediction_cannot_handle(
547
+ self, domain: Domain, tracker: DialogueStateTracker
548
+ ) -> PolicyPrediction:
549
+ return self._create_prediction_for_pattern(
550
+ domain, tracker, CannotHandlePatternFlowStackFrame()
551
+ )
552
+
553
+ def _create_prediction_for_pattern(
554
+ self,
555
+ domain: Domain,
556
+ tracker: DialogueStateTracker,
557
+ pattern_stack_frame: PatternFlowStackFrame,
558
+ ) -> PolicyPrediction:
559
+ """Create a policy prediction result for error.
560
+
561
+ We should cancel the current flow (hence ACTION_CANCEL_FLOW) and push a
562
+ pattern stack frame (Internal Error Pattern by default) to start the pattern.
563
+
564
+ Args:
565
+ domain: The model's domain.
566
+ tracker: The tracker containing the conversation history up to now.
567
+ pattern_stack_frame: The pattern stack frame to push.
568
+
569
+ Returns:
570
+ The prediction.
571
+ """
572
+ # TODO: replace ACTION_CANCEL_FLOW (ATO-2097)
573
+ result = self._prediction_result(ACTION_CANCEL_FLOW, domain)
574
+ stack = tracker.stack
575
+ if not stack.is_empty():
576
+ stack.pop()
577
+ stack.push(pattern_stack_frame)
578
+ events: List[Event] = tracker.create_stack_updated_events(stack)
579
+ return self._prediction(result, action_metadata=None, events=events)
580
+
581
+ def _prediction_result(
582
+ self, action_name: Optional[Text], domain: Domain, score: Optional[float] = 1.0
583
+ ) -> List[float]:
584
+ """Creates a prediction result.
585
+
586
+ Args:
587
+ action_name: The name of the predicted action.
588
+ domain: The model's domain.
589
+ score: The score of the predicted action.
590
+
591
+ Returns:
592
+ The prediction result where the score is used for one hot encoding.
593
+ """
594
+ result = self._default_predictions(domain)
595
+ if action_name:
596
+ result[domain.index_for_action(action_name)] = score # type: ignore[assignment]
597
+ return result
598
+
599
+ @classmethod
600
+ def load(
601
+ cls,
602
+ config: Dict[Text, Any],
603
+ model_storage: ModelStorage,
604
+ resource: Resource,
605
+ execution_context: ExecutionContext,
606
+ **kwargs: Any,
607
+ ) -> "EnterpriseSearchPolicy":
608
+ """Loads a trained policy (see parent class for full docstring)."""
609
+ prompt_template = None
610
+ store_type = config.get(VECTOR_STORE_PROPERTY, {}).get(
611
+ VECTOR_STORE_TYPE_PROPERTY
612
+ )
613
+
614
+ embeddings = cls._create_plain_embedder(config)
615
+ logger.info("enterprise_search_policy.load", config=config)
616
+ if store_type == DEFAULT_VECTOR_STORE_TYPE:
617
+ # if a vector store is not specified,
618
+ # default to using FAISS with the index stored in the model
619
+ # TODO figure out a way to get path without context manager
620
+ with model_storage.read_from(resource) as path:
621
+ vector_store = FAISS_Store(
622
+ embeddings=embeddings,
623
+ index_path=path,
624
+ docs_folder=None,
625
+ create_index=False,
626
+ )
627
+ else:
628
+ vector_store = create_from_endpoint_config(
629
+ config_type=store_type,
630
+ embeddings=embeddings,
631
+ ) # type: ignore
632
+ try:
633
+ with model_storage.read_from(resource) as path:
634
+ prompt_template = rasa.shared.utils.io.read_file(
635
+ path / ENTERPRISE_SEARCH_PROMPT_FILE_NAME
636
+ )
637
+
638
+ except (FileNotFoundError, FileNotFoundError) as e:
639
+ logger.warning(
640
+ "enterprise_search_policy.load.failed", error=e, resource=resource.name
641
+ )
642
+
643
+ return cls(
644
+ config,
645
+ model_storage,
646
+ resource,
647
+ execution_context,
648
+ vector_store=vector_store,
649
+ prompt_template=prompt_template,
650
+ )
651
+
652
+ @classmethod
653
+ def _get_local_knowledge_data(cls, config: Dict[str, Any]) -> Optional[List[str]]:
654
+ """This is required only for local knowledge base types.
655
+
656
+ e.g. FAISS, to ensure that the graph component is retrained when the knowledge
657
+ base is updated.
658
+ """
659
+ merged_config = {**cls.get_default_config(), **config}
660
+
661
+ store_type = merged_config.get(VECTOR_STORE_PROPERTY, {}).get(
662
+ VECTOR_STORE_TYPE_PROPERTY
663
+ )
664
+ if store_type != DEFAULT_VECTOR_STORE_TYPE:
665
+ return None
666
+
667
+ source = merged_config.get(VECTOR_STORE_PROPERTY, {}).get(SOURCE_PROPERTY)
668
+ if not source:
669
+ return None
670
+
671
+ docs = FAISS_Store.load_documents(source)
672
+
673
+ if len(docs) == 0:
674
+ return None
675
+
676
+ docs_as_strings = [
677
+ json.dumps(doc.dict(), ensure_ascii=False, sort_keys=True) for doc in docs
678
+ ]
679
+ return sorted(docs_as_strings)
680
+
681
+ @classmethod
682
+ def fingerprint_addon(cls, config: Dict[str, Any]) -> Optional[str]:
683
+ """Add a fingerprint of the knowledge base and prompt template for the graph."""
684
+ local_knowledge_data = cls._get_local_knowledge_data(config)
685
+
686
+ prompt_template = get_prompt_template(
687
+ config.get("prompt"),
688
+ DEFAULT_ENTERPRISE_SEARCH_PROMPT_TEMPLATE,
689
+ )
690
+ return deep_container_fingerprint([prompt_template, local_knowledge_data])
691
+
692
+ @staticmethod
693
+ def post_process_citations(llm_answer: str) -> str:
694
+ """Post-process the LLM answer.
695
+
696
+ Re-writes the bracketed numbers to start from 1 and
697
+ re-arranges the sources to follow the enumeration order.
698
+
699
+ Args:
700
+ llm_answer: The LLM answer.
701
+
702
+ Returns:
703
+ The post-processed LLM answer.
704
+ """
705
+ logger.debug(
706
+ "enterprise_search_policy.post_process_citations", llm_answer=llm_answer
707
+ )
708
+
709
+ # Split llm_answer into answer and citations
710
+ try:
711
+ answer, citations = llm_answer.rsplit("Sources:", 1)
712
+ except ValueError:
713
+ # if there is no "Sources:" in the llm_answer
714
+ return llm_answer
715
+
716
+ # Find all source references in the answer
717
+ pattern = r"\[\s*(\d+(?:\s*,\s*\d+)*)\s*\]"
718
+ matches = re.findall(pattern, answer)
719
+ old_source_indices = [
720
+ int(num.strip()) for match in matches for num in match.split(",")
721
+ ]
722
+
723
+ # Map old source references to the correct enumeration
724
+ renumber_mapping = {num: idx + 1 for idx, num in enumerate(old_source_indices)}
725
+
726
+ # remove whitespace from original source citations in answer
727
+ for match in matches:
728
+ answer = answer.replace(f"[{match}]", f"[{match.replace(' ', '')}]")
729
+
730
+ new_answer = []
731
+ for word in answer.split():
732
+ matches = re.findall(pattern, word)
733
+ if matches:
734
+ for match in matches:
735
+ if "," in match:
736
+ old_indices = [
737
+ int(num.strip()) for num in match.split(",") if num
738
+ ]
739
+ new_indices = [
740
+ renumber_mapping[old_index]
741
+ for old_index in old_indices
742
+ if old_index in renumber_mapping
743
+ ]
744
+ if not new_indices:
745
+ continue
746
+
747
+ word = word.replace(
748
+ match, f"{', '.join(map(str, new_indices))}"
749
+ )
750
+ else:
751
+ old_index = int(match.strip("[].,:;?!"))
752
+ new_index = renumber_mapping.get(old_index)
753
+ if not new_index:
754
+ continue
755
+
756
+ word = word.replace(str(old_index), str(new_index))
757
+ new_answer.append(word)
758
+
759
+ # join the words
760
+ joined_answer = " ".join(new_answer)
761
+ joined_answer += "\nSources:\n"
762
+
763
+ new_sources: List[str] = []
764
+
765
+ for line in citations.split("\n"):
766
+ pattern = r"(?<=\[)\d+"
767
+ match = re.search(pattern, line)
768
+ if match:
769
+ old_index = int(match.group(0))
770
+ new_index = renumber_mapping[old_index]
771
+ # replace only the first occurrence of the old index
772
+ line = line.replace(f"[{old_index}]", f"[{new_index}]", 1)
773
+
774
+ # insert the line into the new_index position
775
+ new_sources.insert(new_index - 1, line)
776
+ elif line.strip():
777
+ new_sources.append(line)
778
+
779
+ joined_sources = "\n".join(new_sources)
780
+
781
+ return joined_answer + joined_sources