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,922 @@
1
+ import importlib.resources
2
+ import math
3
+ from dataclasses import dataclass, field
4
+ from typing import Any, Dict, List, Optional, Set, TYPE_CHECKING, Text, Tuple
5
+
6
+ import structlog
7
+ import tiktoken
8
+ from jinja2 import Template
9
+ from langchain.docstore.document import Document
10
+ from langchain.schema.embeddings import Embeddings
11
+ from langchain.vectorstores import FAISS
12
+
13
+ import rasa.shared.utils.io
14
+ from rasa import telemetry
15
+ from rasa.core.constants import (
16
+ CHAT_POLICY_PRIORITY,
17
+ POLICY_PRIORITY,
18
+ )
19
+ from rasa.core.policies.policy import Policy, PolicyPrediction, SupportedData
20
+ from rasa.dialogue_understanding.stack.frames import (
21
+ ChitChatStackFrame,
22
+ DialogueStackFrame,
23
+ )
24
+ from rasa.engine.graph import ExecutionContext
25
+ from rasa.engine.recipes.default_recipe import DefaultV1Recipe
26
+ from rasa.engine.storage.resource import Resource
27
+ from rasa.engine.storage.storage import ModelStorage
28
+ from rasa.graph_components.providers.forms_provider import Forms
29
+ from rasa.graph_components.providers.responses_provider import Responses
30
+ from rasa.shared.constants import REQUIRED_SLOTS_KEY
31
+ from rasa.shared.core.constants import ACTION_LISTEN_NAME
32
+ from rasa.shared.core.domain import KEY_RESPONSES_TEXT, Domain
33
+ from rasa.shared.core.events import (
34
+ ActionExecuted,
35
+ BotUttered,
36
+ Event,
37
+ UserUttered,
38
+ )
39
+ from rasa.shared.core.flows import FlowsList
40
+ from rasa.shared.core.generator import TrackerWithCachedStates
41
+ from rasa.shared.core.trackers import DialogueStateTracker
42
+ from rasa.shared.exceptions import FileIOException, RasaCoreException
43
+ from rasa.shared.nlu.constants import PREDICTED_CONFIDENCE_KEY
44
+ from rasa.shared.nlu.training_data.training_data import TrainingData
45
+ from rasa.shared.utils.io import deep_container_fingerprint
46
+ from rasa.shared.utils.llm import (
47
+ AI,
48
+ DEFAULT_OPENAI_CHAT_MODEL_NAME,
49
+ DEFAULT_OPENAI_EMBEDDING_MODEL_NAME,
50
+ DEFAULT_OPENAI_MAX_GENERATED_TOKENS,
51
+ USER,
52
+ combine_custom_and_default_config,
53
+ embedder_factory,
54
+ get_prompt_template,
55
+ llm_factory,
56
+ sanitize_message_for_prompt,
57
+ tracker_as_readable_transcript,
58
+ )
59
+ from rasa.utils.ml_utils import (
60
+ extract_ai_response_examples,
61
+ extract_participant_messages_from_transcript,
62
+ form_utterances_to_action,
63
+ load_faiss_vector_store,
64
+ persist_faiss_vector_store,
65
+ response_for_template,
66
+ )
67
+ from rasa.utils.log_utils import log_llm
68
+
69
+ if TYPE_CHECKING:
70
+ from rasa.core.featurizers.tracker_featurizers import TrackerFeaturizer
71
+ from langchain.llms.base import BaseLLM
72
+
73
+ structlogger = structlog.get_logger()
74
+
75
+ NUMBER_OF_CONVERSATION_SAMPLES = 5
76
+
77
+ NUMBER_OF_RESPONSE_SAMPLES = 20
78
+
79
+ # GPT-3 model's MAX_TOKEN = 2049
80
+ # https://platform.openai.com/docs/models/gpt-3
81
+ # get_response_prompt empty template uses around 149 tokens
82
+ # equal number of tokens for conversation and responses
83
+ # (2049 - 149) / 2 = 950
84
+ # 100 tokens for input
85
+ MAX_NUMBER_OF_TOKENS_FOR_SAMPLES = 900
86
+
87
+ # the config property name for the confidence of the nlu prediction
88
+ NLU_ABSTENTION_THRESHOLD = "nlu_abstention_threshold"
89
+
90
+ PROMPT = "prompt"
91
+
92
+ DEFAULT_LLM_CONFIG = {
93
+ "_type": "openai",
94
+ "request_timeout": 5,
95
+ "temperature": 0.0,
96
+ "model_name": DEFAULT_OPENAI_CHAT_MODEL_NAME,
97
+ "max_tokens": DEFAULT_OPENAI_MAX_GENERATED_TOKENS,
98
+ }
99
+
100
+ DEFAULT_EMBEDDINGS_CONFIG = {
101
+ "_type": "openai",
102
+ "model": DEFAULT_OPENAI_EMBEDDING_MODEL_NAME,
103
+ }
104
+
105
+ DEFAULT_INTENTLESS_PROMPT_TEMPLATE = importlib.resources.open_text(
106
+ "rasa.core.policies", "intentless_prompt_template.jinja2"
107
+ ).name
108
+
109
+ EMBEDDINGS_CONFIG_KEY = "embeddings"
110
+ LLM_CONFIG_KEY = "llm"
111
+ INTENTLESS_PROMPT_TEMPLATE_FILE_NAME = "intentless_policy_prompt.jinja2"
112
+
113
+
114
+ class RasaMLPolicyTrainingException(RasaCoreException):
115
+ """Raised when training fails."""
116
+
117
+ pass
118
+
119
+
120
+ @dataclass
121
+ class Interaction:
122
+ text: str
123
+ actor: str
124
+
125
+
126
+ @dataclass
127
+ class Conversation:
128
+ interactions: List[Interaction] = field(default_factory=list)
129
+
130
+
131
+ def collect_form_responses(forms: Forms) -> Set[Text]:
132
+ """Collect responses that belong the requested slots in forms.
133
+
134
+ Args:
135
+ forms: the forms from the domain
136
+ Returns:
137
+ all utterances used in forms
138
+ """
139
+ form_responses = set()
140
+ for _, form_info in forms.data.items():
141
+ for required_slot in form_info.get(REQUIRED_SLOTS_KEY, []):
142
+ form_responses.add(f"utter_ask_{required_slot}")
143
+ return form_responses
144
+
145
+
146
+ def filter_responses(responses: Responses, forms: Forms, flows: FlowsList) -> Responses:
147
+ """Filters out responses that are unwanted for the intentless policy.
148
+
149
+ This includes utterances used in flows and forms.
150
+
151
+ Args:
152
+ responses: the responses from the domain
153
+ forms: the forms from the domain
154
+ flows: all flows
155
+ Returns:
156
+ The remaining, relevant responses for the intentless policy.
157
+ """
158
+ form_responses = collect_form_responses(forms)
159
+ flow_responses = flows.utterances
160
+ combined_responses = form_responses | flow_responses
161
+ filtered_responses = {
162
+ name: variants
163
+ for name, variants in responses.data.items()
164
+ if name not in combined_responses
165
+ }
166
+ return Responses(data=filtered_responses)
167
+
168
+
169
+ def action_from_response(
170
+ text: Optional[str], responses: Dict[Text, List[Dict[Text, Any]]]
171
+ ) -> Optional[str]:
172
+ """Returns the action associated with the given response text.
173
+
174
+ Args:
175
+ text: The response text.
176
+ responses: The responses from the domain.
177
+
178
+ Returns:
179
+ The action associated with the response text, or None if no action is found.
180
+ """
181
+ if not text:
182
+ return None
183
+
184
+ for action, variations in responses.items():
185
+ for variation in variations:
186
+ if variation.get(KEY_RESPONSES_TEXT) == text:
187
+ return action
188
+ return None
189
+
190
+
191
+ def _conversation_sample_from_tracker(
192
+ tracker: DialogueStateTracker,
193
+ responses: Dict[Text, List[Dict[Text, Any]]],
194
+ ) -> Optional[Conversation]:
195
+ """Extracts a conversation sample from the given tracker.
196
+
197
+ Example:
198
+ >>> tracker = DialogueStateTracker(
199
+ ... "default",
200
+ ... slots=[],
201
+ ... active_loop={},
202
+ ... events=[
203
+ ... UserUttered("hello"),
204
+ ... BotUttered("hey there!"),
205
+ ... UserUttered("goodbye"),
206
+ ... BotUttered("bye bye!"),
207
+ ... ],
208
+ ... )
209
+ >>> _conversation_sample_from_tracker(tracker)
210
+ Conversation(interactions=[
211
+ Interaction(actor='user', text='hello'),
212
+ Interaction(actor='bot', text='hey there!'),
213
+ Interaction(actor='user', text='goodbye'),
214
+ Interaction(actor='bot', text='bye bye!'),
215
+ ])
216
+
217
+ Args:
218
+ tracker: The tracker to extract a conversation sample from.
219
+ responses: The responses from the domain.
220
+
221
+ Returns:
222
+ The conversation sample, or None if the tracker doesn't contain a
223
+ conversation sample.
224
+ """
225
+ conversation = Conversation()
226
+ for event in tracker.applied_events():
227
+ if isinstance(event, UserUttered):
228
+ if event.text is None:
229
+ # need to abort here, as we can't use this conversation
230
+ # sample as it doesn't have an actual user message attached
231
+ # likely, this is just an intent.
232
+ return None
233
+ conversation.interactions.append(Interaction(actor=USER, text=event.text))
234
+ elif isinstance(event, BotUttered):
235
+ conversation.interactions.append(
236
+ Interaction(actor=AI, text=event.text or "")
237
+ )
238
+ elif (
239
+ isinstance(event, ActionExecuted)
240
+ and event.action_name
241
+ and event.action_name.startswith("utter_")
242
+ ):
243
+ response = response_for_template(event.action_name, responses)
244
+ if response:
245
+ interaction = Interaction(actor=AI, text=response)
246
+ conversation.interactions.append(interaction)
247
+ else:
248
+ # need to abort here, as we can't use this conversation
249
+ # sample as it doesn't have a response for the utterance
250
+ # that was used in the story.
251
+ return None
252
+ # Do not use reduced conversations with just one or no utterances
253
+ if len(conversation.interactions) < 2:
254
+ structlogger.debug(
255
+ "intentless_policy.sampled_conversation.skipped",
256
+ interations=conversation.interactions,
257
+ )
258
+ return None
259
+ # Do not use conversation with only user or only bot
260
+ if len({m.actor for m in conversation.interactions}) < 2:
261
+ structlogger.debug(
262
+ "intentless_policy.sampled_conversation.skipped",
263
+ interactions=conversation.interactions,
264
+ )
265
+ return None
266
+ return conversation
267
+
268
+
269
+ def conversation_samples_from_trackers(
270
+ training_trackers: List[TrackerWithCachedStates],
271
+ responses: Dict[Text, List[Dict[Text, Any]]],
272
+ ) -> List[Conversation]:
273
+ """Extracts conversation samples from the given trackers.
274
+
275
+ Args:
276
+ training_trackers: The trackers to extract conversation samples from.
277
+ responses: The responses from the domain.
278
+
279
+ Returns:
280
+ The conversation samples.
281
+ """
282
+ return [
283
+ sample
284
+ for tracker in training_trackers
285
+ if (sample := _conversation_sample_from_tracker(tracker, responses))
286
+ ]
287
+
288
+
289
+ def truncate_documents(
290
+ docs: List[Document],
291
+ max_number_of_tokens: int,
292
+ model_name: str = DEFAULT_OPENAI_CHAT_MODEL_NAME,
293
+ ) -> List[Document]:
294
+ """Takes first n documents that contains less then `max_number_of_tokens` tokens.
295
+
296
+ Args:
297
+ docs: Sequence of documents that needs to be truncated.
298
+ max_number_of_tokens: Maximum number of tokens to preserve.
299
+ model_name: Name of the model to use for tokenization.
300
+
301
+ Returns:
302
+ Sequence of documents that contains less then `max_number_of_tokens` tokens.
303
+ """
304
+ enc = tiktoken.encoding_for_model(model_name)
305
+
306
+ truncated_docs = []
307
+ docs_token_num = 0
308
+ for doc in docs:
309
+ doc_token_num = len(enc.encode(doc.page_content))
310
+ if docs_token_num + doc_token_num > max_number_of_tokens:
311
+ break
312
+
313
+ docs_token_num += doc_token_num
314
+ truncated_docs.append(doc)
315
+
316
+ return truncated_docs
317
+
318
+
319
+ def conversation_as_prompt(conversation: Conversation) -> str:
320
+ """Converts the given conversation to a prompt.
321
+
322
+ Example:
323
+ >>> conversation = Conversation(interactions=[
324
+ ... Interaction(actor=USER, text="hi"),
325
+ ... Interaction(actor=AI, text="Hello World!")
326
+ ... ])
327
+ >>> print(conversation_as_prompt(conversation))
328
+ USER: hi
329
+ AI: Hello World!
330
+
331
+ Args:
332
+ conversation: The conversation to convert.
333
+
334
+ Returns:
335
+ The prompt.
336
+ """
337
+ return "\n".join(
338
+ f"{m.actor}: {sanitize_message_for_prompt(m.text)}"
339
+ for m in conversation.interactions
340
+ )
341
+
342
+
343
+ @DefaultV1Recipe.register(
344
+ DefaultV1Recipe.ComponentType.POLICY_WITH_END_TO_END_SUPPORT, is_trainable=True
345
+ )
346
+ class IntentlessPolicy(Policy):
347
+ """Policy which uses a language model to generate the next action.
348
+
349
+ The policy uses the OpenAI API to generate the next action based on the
350
+ conversation history. The policy can be used to generate a response for
351
+ the user or to predict the next action.
352
+ """
353
+
354
+ @staticmethod
355
+ def get_default_config() -> Dict[Text, Any]:
356
+ """Returns the default config (see parent class for full docstring)."""
357
+ # please make sure to update the docs when changing a default parameter
358
+ return {
359
+ POLICY_PRIORITY: CHAT_POLICY_PRIORITY,
360
+ # the abstention threshold is used to determine whether the policy
361
+ # should predict an action or abstain from prediction. if the
362
+ # nlu predictions confidence is above the threshold, the
363
+ # policy will predict with a score lower than the threshold. this
364
+ # ensures that the policy will not override a deterministic policy
365
+ # which utilizes the nlu predictions confidence (e.g. Memoization).
366
+ NLU_ABSTENTION_THRESHOLD: 0.9,
367
+ LLM_CONFIG_KEY: DEFAULT_LLM_CONFIG,
368
+ EMBEDDINGS_CONFIG_KEY: DEFAULT_EMBEDDINGS_CONFIG,
369
+ PROMPT: DEFAULT_INTENTLESS_PROMPT_TEMPLATE,
370
+ }
371
+
372
+ @staticmethod
373
+ def supported_data() -> SupportedData:
374
+ """The type of data supported by this policy.
375
+
376
+ By default, this is only ML-based training data. If policies support rule data,
377
+ or both ML-based data and rule data, they need to override this method.
378
+
379
+ Returns:
380
+ The data type supported by this policy (ML-based training data).
381
+ """
382
+ return SupportedData.ML_DATA
383
+
384
+ @staticmethod
385
+ def does_support_stack_frame(frame: DialogueStackFrame) -> bool:
386
+ """Checks if the policy supports the given stack frame."""
387
+ return isinstance(frame, ChitChatStackFrame)
388
+
389
+ def __init__(
390
+ self,
391
+ config: Dict[Text, Any],
392
+ model_storage: ModelStorage,
393
+ resource: Resource,
394
+ execution_context: ExecutionContext,
395
+ featurizer: Optional["TrackerFeaturizer"] = None,
396
+ responses_docsearch: Optional["FAISS"] = None,
397
+ samples_docsearch: Optional["FAISS"] = None,
398
+ prompt_template: Optional[Text] = None,
399
+ ) -> None:
400
+ """Constructs a new Policy object."""
401
+ super().__init__(config, model_storage, resource, execution_context, featurizer)
402
+
403
+ self.nlu_abstention_threshold: float = self.config[NLU_ABSTENTION_THRESHOLD]
404
+ self.response_index = responses_docsearch
405
+ self.conversation_samples_index = samples_docsearch
406
+ self.embedder = self._create_plain_embedder(config)
407
+ self.prompt_template = prompt_template or rasa.shared.utils.io.read_file(
408
+ self.config[PROMPT]
409
+ )
410
+ self.trace_prompt_tokens = self.config.get("trace_prompt_tokens", False)
411
+
412
+ @classmethod
413
+ def _create_plain_embedder(cls, config: Dict[Text, Any]) -> Embeddings:
414
+ """Creates an embedder that uses the OpenAI API.
415
+
416
+ Returns:
417
+ The embedder.
418
+ """
419
+ return embedder_factory(
420
+ config.get(EMBEDDINGS_CONFIG_KEY), DEFAULT_EMBEDDINGS_CONFIG
421
+ )
422
+
423
+ def embeddings_property(self, prop: str) -> Optional[str]:
424
+ """Returns the property of the embeddings config."""
425
+ return combine_custom_and_default_config(
426
+ self.config.get(EMBEDDINGS_CONFIG_KEY), DEFAULT_EMBEDDINGS_CONFIG
427
+ ).get(prop)
428
+
429
+ def llm_property(self, prop: str) -> Optional[str]:
430
+ """Returns the property of the LLM config."""
431
+ return combine_custom_and_default_config(
432
+ self.config.get(LLM_CONFIG_KEY), DEFAULT_LLM_CONFIG
433
+ ).get(prop)
434
+
435
+ def train( # type: ignore[override]
436
+ self,
437
+ training_trackers: List[TrackerWithCachedStates],
438
+ domain: Domain,
439
+ responses: Responses,
440
+ forms: Forms,
441
+ training_data: TrainingData,
442
+ flows: Optional[FlowsList],
443
+ **kwargs: Any,
444
+ ) -> Resource:
445
+ """Trains a policy.
446
+
447
+ Args:
448
+ training_trackers: The story and rules trackers from the training data.
449
+ domain: The model's domain.
450
+ responses: The model's responses.
451
+ forms: The model's forms.
452
+ training_data: The model's training data.
453
+ flows: all existing flows for task-oriented processes
454
+ **kwargs: Depending on the specified `needs` section and the resulting
455
+ graph structure the policy can use different input to train itself.
456
+
457
+ Returns:
458
+ A policy must return its resource locator so that potential children nodes
459
+ can load the policy from the resource.
460
+ """
461
+ responses = filter_responses(responses, forms, flows or FlowsList([]))
462
+ telemetry.track_intentless_policy_train()
463
+ response_texts = [r for r in extract_ai_response_examples(responses.data)]
464
+
465
+ selected_trackers = [
466
+ t for t in training_trackers if not t.is_augmented and not t.is_rule_tracker
467
+ ]
468
+
469
+ conversation_samples = conversation_samples_from_trackers(
470
+ selected_trackers, responses.data
471
+ )
472
+ conversations = [
473
+ prompt
474
+ for c in conversation_samples
475
+ if (prompt := conversation_as_prompt(c))
476
+ ]
477
+
478
+ try:
479
+ self.response_index = (
480
+ FAISS.from_texts(response_texts, self.embedder, normalize_L2=True)
481
+ if response_texts
482
+ else None
483
+ )
484
+
485
+ self.conversation_samples_index = (
486
+ FAISS.from_texts(conversations, self.embedder)
487
+ if conversations
488
+ else None
489
+ )
490
+ except Exception as e:
491
+ structlogger.error(
492
+ "intentless_policy.train.llm.error",
493
+ error=e,
494
+ )
495
+ raise RasaMLPolicyTrainingException(
496
+ "The training of the Intentless Policy failed due to an error "
497
+ "with the LLM provider. Sorry about that! "
498
+ "You can retry your request."
499
+ )
500
+
501
+ structlogger.info("intentless_policy.training.completed")
502
+ telemetry.track_intentless_policy_train_completed(
503
+ embeddings_type=self.embeddings_property("_type"),
504
+ embeddings_model=self.embeddings_property("model")
505
+ or self.embeddings_property("model_name"),
506
+ llm_type=self.llm_property("_type"),
507
+ llm_model=self.llm_property("model") or self.llm_property("model_name"),
508
+ )
509
+
510
+ self.persist()
511
+ return self._resource
512
+
513
+ def persist(self) -> None:
514
+ """Persists the policy to storage."""
515
+ with self._model_storage.write_to(self._resource) as path:
516
+ persist_faiss_vector_store(path / "responses_faiss", self.response_index)
517
+ persist_faiss_vector_store(
518
+ path / "samples_faiss", self.conversation_samples_index
519
+ )
520
+ rasa.shared.utils.io.write_text_file(
521
+ self.prompt_template, path / INTENTLESS_PROMPT_TEMPLATE_FILE_NAME
522
+ )
523
+
524
+ async def predict_action_probabilities(
525
+ self,
526
+ tracker: DialogueStateTracker,
527
+ domain: Domain,
528
+ rule_only_data: Optional[Dict[Text, Any]] = None,
529
+ **kwargs: Any,
530
+ ) -> PolicyPrediction:
531
+ """Predicts the next action the bot should take after seeing the tracker.
532
+
533
+ Args:
534
+ tracker: The tracker containing the conversation history up to now.
535
+ domain: The model's domain.
536
+ rule_only_data: Slots and loops which are specific to rules and hence
537
+ should be ignored by this policy.
538
+ **kwargs: Depending on the specified `needs` section and the resulting
539
+ graph structure the policy can use different input to make predictions.
540
+
541
+ Returns:
542
+ The prediction.
543
+ """
544
+ if not self.supports_current_stack_frame(
545
+ tracker
546
+ ) or self.should_abstain_in_coexistence(tracker, True):
547
+ return self._prediction(self._default_predictions(domain))
548
+
549
+ if tracker.has_bot_message_after_latest_user_message():
550
+ # if the last event was a bot utterance, we either want to
551
+ # return to the active loop or else predict action_listen as
552
+ # this is the end of the turn
553
+ if tracker.active_loop_name:
554
+ result = self._prediction_result(tracker.active_loop_name, domain)
555
+ else:
556
+ result = self._prediction_result(ACTION_LISTEN_NAME, domain)
557
+ return self._prediction(result)
558
+
559
+ if not self.response_index:
560
+ # we don't have any responses, so we can't predict anything
561
+ result = self._default_predictions(domain)
562
+ return self._prediction(result)
563
+
564
+ response, score = await self.find_closest_response(tracker)
565
+
566
+ predicted_action_name = action_from_response(response, domain.responses)
567
+
568
+ form_utterances = form_utterances_to_action(domain)
569
+ if predicted_action_name in form_utterances:
570
+ # if the predicted action is a form utterance, we need to predict the form
571
+ # action instead
572
+ predicted_action_name = form_utterances[predicted_action_name]
573
+
574
+ structlogger.info(
575
+ "intentless_policy.prediction.completed",
576
+ predicted_action_name=predicted_action_name,
577
+ score=score,
578
+ )
579
+
580
+ telemetry.track_intentless_policy_predict(
581
+ embeddings_type=self.embeddings_property("_type"),
582
+ embeddings_model=self.embeddings_property("model")
583
+ or self.embeddings_property("model_name"),
584
+ llm_type=self.llm_property("_type"),
585
+ llm_model=self.llm_property("model") or self.llm_property("model_name"),
586
+ score=score,
587
+ )
588
+
589
+ result = self._prediction_result(predicted_action_name, domain, score)
590
+
591
+ stack = tracker.stack
592
+ if not stack.is_empty():
593
+ stack.pop()
594
+ events: List[Event] = tracker.create_stack_updated_events(stack)
595
+ else:
596
+ events = []
597
+
598
+ return self._prediction(result, events=events)
599
+
600
+ async def generate_answer(
601
+ self,
602
+ response_examples: List[str],
603
+ conversation_samples: List[str],
604
+ history: str,
605
+ ) -> Optional[str]:
606
+ """Make the llm call to generate an answer."""
607
+ llm = llm_factory(self.config[LLM_CONFIG_KEY], DEFAULT_LLM_CONFIG)
608
+ inputs = {
609
+ "conversations": conversation_samples,
610
+ "responses": response_examples,
611
+ "current_conversation": history,
612
+ }
613
+ prompt = Template(self.prompt_template).render(**inputs)
614
+ log_llm(
615
+ logger=structlogger,
616
+ log_module="IntentlessPolicy",
617
+ log_event="intentless_policy.generate_answer.prompt_rendered",
618
+ prompt=prompt,
619
+ )
620
+ return await self._generate_llm_answer(llm, prompt)
621
+
622
+ async def _generate_llm_answer(self, llm: "BaseLLM", prompt: str) -> Optional[str]:
623
+ try:
624
+ return await llm.apredict(prompt)
625
+ except Exception as e:
626
+ # unfortunately, langchain does not wrap LLM exceptions which means
627
+ # we have to catch all exceptions here
628
+ structlogger.error("intentless_policy.answer_generation.failed", error=e)
629
+ return None
630
+
631
+ def embed_llm_response(self, llm_response: str) -> Optional[List[float]]:
632
+ """Embed the llm response."""
633
+ try:
634
+ # using embed documents here because the responses are the documents
635
+ return self.embedder.embed_documents([llm_response])[0]
636
+ except Exception as e:
637
+ # unfortunately, langchain does not wrap LLM exceptions which means
638
+ # we have to catch all exceptions here
639
+ structlogger.error("intentless_policy.answer_embedding.failed", error=e)
640
+ return None
641
+
642
+ async def find_closest_response(
643
+ self, tracker: DialogueStateTracker
644
+ ) -> Tuple[Optional[str], float]:
645
+ """Find the closest response fitting the conversation in the tracker.
646
+
647
+ Generates a response using the OpenAI API and then finds the closest
648
+ response in the domains responses. The closest response is determined
649
+ using embeddings of the response and all the responses in the domain.
650
+ The embedding is generated using the OpenAI API and the HyDE model.
651
+
652
+ Args:
653
+ tracker: The tracker containing the conversation history up to now.
654
+ policy_model: The model's persisted data.
655
+ company: The company the model is used for.
656
+
657
+ Returns:
658
+ The response and the score of the response.
659
+ """
660
+ if not self.response_index:
661
+ structlogger.debug("intentless_policy.prediction.skip_noresponses")
662
+ return None, 0.0
663
+
664
+ if not tracker.latest_message or not tracker.latest_message.text:
665
+ # we can't generate a response if there is no text on the latest
666
+ # user message
667
+ structlogger.debug("intentless_policy.prediction.skip_notext")
668
+ return None, 0.0
669
+
670
+ if tracker.latest_message.text.startswith("/"):
671
+ # we don't want to generate a response if the user is trying to
672
+ # execute a "command" - this should be handled by the regex
673
+ # intent classifier in rasa pro.
674
+ structlogger.debug("intentless_policy.prediction.skip_slash")
675
+ return None, 0.0
676
+
677
+ history = tracker_as_readable_transcript(tracker)
678
+ ai_response_examples = self.select_response_examples(
679
+ history,
680
+ number_of_samples=NUMBER_OF_RESPONSE_SAMPLES,
681
+ max_number_of_tokens=MAX_NUMBER_OF_TOKENS_FOR_SAMPLES,
682
+ )
683
+ conversation_samples = self.select_few_shot_conversations(
684
+ history,
685
+ number_of_samples=NUMBER_OF_CONVERSATION_SAMPLES,
686
+ max_number_of_tokens=MAX_NUMBER_OF_TOKENS_FOR_SAMPLES,
687
+ )
688
+ extra_ai_responses = self.extract_ai_responses(conversation_samples)
689
+
690
+ # put conversation responses in front of sampled examples,
691
+ # keeping the order of samples
692
+ final_response_examples = extra_ai_responses
693
+ for resp in ai_response_examples:
694
+ if resp not in final_response_examples:
695
+ final_response_examples.append(resp)
696
+
697
+ llm_response = await self.generate_answer(
698
+ final_response_examples, conversation_samples, history
699
+ )
700
+ if not llm_response:
701
+ structlogger.debug("intentless_policy.prediction.skip_llm_fail")
702
+ return None, 0.0
703
+ embedded_llm_response = self.embed_llm_response(llm_response)
704
+ if not embedded_llm_response:
705
+ structlogger.debug("intentless_policy.prediction.skip_response_embed_fail")
706
+ return None, 0.0
707
+
708
+ search_results = self.response_index.similarity_search_with_score_by_vector(
709
+ embedded_llm_response
710
+ )
711
+
712
+ return self._get_response_and_score(search_results, tracker)
713
+
714
+ def extract_ai_responses(self, conversation_samples: List[str]) -> List[str]:
715
+ """Extracts the AI responses from the conversation samples.
716
+
717
+ Args:
718
+ conversation_samples: The conversation samples.
719
+
720
+ Returns:
721
+ The AI responses.
722
+ """
723
+ ai_replies = []
724
+
725
+ for conversation_sample in conversation_samples:
726
+ ai_texts = extract_participant_messages_from_transcript(
727
+ conversation_sample, participant=AI
728
+ )
729
+ for ai_text in ai_texts:
730
+ if ai_text not in ai_replies:
731
+ ai_replies.append(ai_text)
732
+ return ai_replies
733
+
734
+ def _get_response_and_score(
735
+ self,
736
+ search_results: List[Tuple["Document", float]],
737
+ tracker: DialogueStateTracker,
738
+ ) -> Tuple[Optional[str], float]:
739
+ """Returns the response and score of the response.
740
+
741
+ If there are no search results, returns None for the response
742
+ and 0 for the score.
743
+
744
+ Args:
745
+ search_results: The search results.
746
+ tracker: The tracker containing the conversation history up to now.
747
+
748
+
749
+ Returns:
750
+ The response and the score of the response.
751
+ """
752
+ if not search_results:
753
+ return None, 0.0
754
+
755
+ first_search_result = search_results[0]
756
+ document, l2dist = first_search_result
757
+ response = document.page_content
758
+ score = 1.0 - float(l2dist) / math.sqrt(2) # from L2 distance to score
759
+
760
+ if tracker.latest_message:
761
+ nlu_confidence = tracker.latest_message.intent.get(
762
+ PREDICTED_CONFIDENCE_KEY, 1.0
763
+ )
764
+ else:
765
+ nlu_confidence = 1.0
766
+ # --- If we have high NLU confidence, let rules / memo run the show
767
+ if nlu_confidence > self.nlu_abstention_threshold:
768
+ score = min(score, nlu_confidence - 0.01)
769
+ return response, score
770
+
771
+ def select_response_examples(
772
+ self,
773
+ history: str,
774
+ number_of_samples: int,
775
+ max_number_of_tokens: int,
776
+ ) -> List[str]:
777
+ """Samples responses that fit the current conversation.
778
+
779
+ Args:
780
+ history: The conversation history.
781
+ policy_model: The policy model.
782
+ number_of_samples: The number of samples to return.
783
+ max_number_of_tokens: Maximum number of tokens for responses.
784
+
785
+ Returns:
786
+ The sampled conversation in order of score decrease.
787
+ """
788
+ if not self.response_index or not history:
789
+ return []
790
+
791
+ try:
792
+ embedding = self.embedder.embed_query(history)
793
+ except Exception as e:
794
+ structlogger.error(
795
+ "intentless_policy.select_response_examples.error", error=e
796
+ )
797
+ return []
798
+
799
+ docs = self.response_index.similarity_search_by_vector(
800
+ embedding, k=number_of_samples
801
+ )
802
+ structlogger.debug(
803
+ "intentless_policy.select_response_examples.success",
804
+ number_of_samples=number_of_samples,
805
+ docs=docs,
806
+ )
807
+
808
+ return [
809
+ document.page_content
810
+ for document in truncate_documents(
811
+ docs, max_number_of_tokens=max_number_of_tokens
812
+ )
813
+ ]
814
+
815
+ def select_few_shot_conversations(
816
+ self,
817
+ history: str,
818
+ number_of_samples: int,
819
+ max_number_of_tokens: int,
820
+ ) -> List[str]:
821
+ """Samples conversations from the given conversation samples.
822
+
823
+ Excludes conversations without AI replies
824
+
825
+ Args:
826
+ history: The conversation history.
827
+ number_of_samples: The number of samples to return.
828
+ max_number_of_tokens: Maximum number of tokens for conversations.
829
+
830
+ Returns:
831
+ The sampled conversation ordered by similarity decrease.
832
+ """
833
+ if not self.conversation_samples_index or not history:
834
+ return []
835
+
836
+ docs = self.conversation_samples_index.similarity_search(
837
+ history, k=number_of_samples
838
+ )
839
+
840
+ structlogger.debug(
841
+ "intentless_policy.sampled_conversation",
842
+ number_of_samples=number_of_samples,
843
+ docs=docs,
844
+ )
845
+ conversations = []
846
+
847
+ for doc in truncate_documents(docs, max_number_of_tokens=max_number_of_tokens):
848
+ conversations.append(doc.page_content)
849
+ return conversations
850
+
851
+ def _prediction_result(
852
+ self, action_name: Optional[Text], domain: Domain, score: Optional[float] = 1.0
853
+ ) -> List[float]:
854
+ """Creates a prediction result.
855
+
856
+ Args:
857
+ action_name: The name of the predicted action.
858
+ domain: The model's domain.
859
+ score: The score of the predicted action.
860
+
861
+ Resturns:
862
+ The prediction result where the score is used for one hot encoding.
863
+ """
864
+ result = self._default_predictions(domain)
865
+ if action_name:
866
+ result[domain.index_for_action(action_name)] = score # type: ignore[assignment]
867
+ return result
868
+
869
+ @classmethod
870
+ def load(
871
+ cls,
872
+ config: Dict[Text, Any],
873
+ model_storage: ModelStorage,
874
+ resource: Resource,
875
+ execution_context: ExecutionContext,
876
+ **kwargs: Any,
877
+ ) -> "IntentlessPolicy":
878
+ """Loads a trained policy (see parent class for full docstring)."""
879
+ responses_docsearch = None
880
+ samples_docsearch = None
881
+ prompt_template = None
882
+ try:
883
+ with model_storage.read_from(resource) as path:
884
+ responses_docsearch = load_faiss_vector_store(
885
+ path / "responses_faiss", cls._create_plain_embedder(config)
886
+ )
887
+ samples_docsearch = load_faiss_vector_store(
888
+ path / "samples_faiss", cls._create_plain_embedder(config)
889
+ )
890
+
891
+ # FIXME: This is a hack to make sure that the docsearches are
892
+ # normalized. unfortunatley langchain doesn't persist / load
893
+ # this parameter.
894
+ if responses_docsearch:
895
+ responses_docsearch._normalize_L2 = True # pylint: disable=protected-access
896
+ prompt_template = rasa.shared.utils.io.read_file(
897
+ path / INTENTLESS_PROMPT_TEMPLATE_FILE_NAME
898
+ )
899
+
900
+ except (ValueError, FileNotFoundError, FileIOException) as e:
901
+ structlogger.warning(
902
+ "intentless_policy.load.failed", error=e, resource_name=resource.name
903
+ )
904
+
905
+ return cls(
906
+ config,
907
+ model_storage,
908
+ resource,
909
+ execution_context,
910
+ responses_docsearch=responses_docsearch,
911
+ samples_docsearch=samples_docsearch,
912
+ prompt_template=prompt_template,
913
+ )
914
+
915
+ @classmethod
916
+ def fingerprint_addon(cls, config: Dict[str, Any]) -> Optional[str]:
917
+ """Add a fingerprint of the knowledge base for the graph."""
918
+ prompt_template = get_prompt_template(
919
+ config.get("prompt"),
920
+ DEFAULT_INTENTLESS_PROMPT_TEMPLATE,
921
+ )
922
+ return deep_container_fingerprint(prompt_template)