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
rasa/core/agent.py ADDED
@@ -0,0 +1,555 @@
1
+ from __future__ import annotations
2
+ from asyncio import AbstractEventLoop, CancelledError
3
+ import functools
4
+ import logging
5
+ import os
6
+ from pathlib import Path
7
+ from typing import Any, Callable, Dict, List, Optional, Text, Union
8
+ import uuid
9
+
10
+ import aiohttp
11
+ from aiohttp import ClientError
12
+
13
+ from rasa.core import jobs
14
+ from rasa.core.channels.channel import OutputChannel, UserMessage
15
+ from rasa.core.constants import DEFAULT_REQUEST_TIMEOUT
16
+ from rasa.core.http_interpreter import RasaNLUHttpInterpreter
17
+ from rasa.shared.core.domain import Domain
18
+ from rasa.core.exceptions import AgentNotReady
19
+ from rasa.shared.constants import DEFAULT_SENDER_ID
20
+ from rasa.core.lock_store import InMemoryLockStore, LockStore
21
+ from rasa.core.nlg import NaturalLanguageGenerator, TemplatedNaturalLanguageGenerator
22
+ from rasa.core.policies.policy import PolicyPrediction
23
+ from rasa.core.processor import MessageProcessor
24
+ from rasa.core.tracker_store import FailSafeTrackerStore, InMemoryTrackerStore
25
+ from rasa.shared.core.trackers import DialogueStateTracker, EventVerbosity
26
+ from rasa.exceptions import ModelNotFound
27
+ from rasa.nlu.utils import is_url
28
+ from rasa.shared.exceptions import RasaException
29
+ import rasa.shared.utils.io
30
+ from rasa.utils.common import TempDirectoryPath, get_temp_dir_name
31
+ from rasa.utils.endpoints import EndpointConfig
32
+
33
+ from rasa.core.tracker_store import TrackerStore
34
+ from rasa.core.utils import AvailableEndpoints
35
+
36
+ logger = logging.getLogger(__name__)
37
+
38
+
39
+ async def load_from_server(agent: Agent, model_server: EndpointConfig) -> Agent:
40
+ """Load a persisted model from a server."""
41
+ # We are going to pull the model once first, and then schedule a recurring
42
+ # job. the benefit of this approach is that we can be sure that there
43
+ # is a model after this function completes -> allows to do proper
44
+ # "is alive" check on a startup server's `/status` endpoint. If the server
45
+ # is started, we can be sure that it also already loaded (or tried to)
46
+ # a model.
47
+ await _update_model_from_server(model_server, agent)
48
+
49
+ wait_time_between_pulls = model_server.kwargs.get("wait_time_between_pulls", 100)
50
+
51
+ if wait_time_between_pulls:
52
+ # continuously pull the model every `wait_time_between_pulls` seconds
53
+ await _schedule_model_pulling(model_server, int(wait_time_between_pulls), agent)
54
+
55
+ return agent
56
+
57
+
58
+ def _load_and_set_updated_model(
59
+ agent: Agent, model_directory: Text, fingerprint: Text
60
+ ) -> None:
61
+ """Load the persisted model into memory and set the model on the agent.
62
+
63
+ Args:
64
+ agent: Instance of `Agent` to update with the new model.
65
+ model_directory: Rasa model directory.
66
+ fingerprint: Fingerprint of the supplied model at `model_directory`.
67
+ """
68
+ logger.debug(f"Found new model with fingerprint {fingerprint}. Loading...")
69
+ agent.load_model(model_directory, fingerprint)
70
+
71
+ logger.debug("Finished updating agent to new model.")
72
+
73
+
74
+ async def _update_model_from_server(model_server: EndpointConfig, agent: Agent) -> None:
75
+ """Load a zipped Rasa Core model from a URL and update the passed agent."""
76
+ if not is_url(model_server.url):
77
+ raise aiohttp.InvalidURL(model_server.url)
78
+
79
+ with TempDirectoryPath(get_temp_dir_name()) as temporary_directory:
80
+ try:
81
+ new_fingerprint = await _pull_model_and_fingerprint(
82
+ model_server, agent.fingerprint, temporary_directory
83
+ )
84
+
85
+ if new_fingerprint:
86
+ _load_and_set_updated_model(agent, temporary_directory, new_fingerprint)
87
+ else:
88
+ logger.debug(f"No new model found at URL {model_server.url}")
89
+ except Exception: # skipcq: PYL-W0703
90
+ # TODO: Make this exception more specific, possibly print different log
91
+ # for each one.
92
+ logger.exception(
93
+ "Failed to update model. The previous model will stay loaded instead."
94
+ )
95
+
96
+
97
+ async def _pull_model_and_fingerprint(
98
+ model_server: EndpointConfig, fingerprint: Optional[Text], model_directory: Text
99
+ ) -> Optional[Text]:
100
+ """Queries the model server.
101
+
102
+ Args:
103
+ model_server: Model server endpoint information.
104
+ fingerprint: Current model fingerprint.
105
+ model_directory: Directory where to download model to.
106
+
107
+ Returns:
108
+ Value of the response's <ETag> header which contains the model
109
+ hash. Returns `None` if no new model is found.
110
+ """
111
+ headers = {"If-None-Match": fingerprint}
112
+
113
+ logger.debug(f"Requesting model from server {model_server.url}...")
114
+
115
+ async with model_server.session() as session:
116
+ try:
117
+ params = model_server.combine_parameters()
118
+ async with session.request(
119
+ "GET",
120
+ model_server.url,
121
+ timeout=DEFAULT_REQUEST_TIMEOUT,
122
+ headers=headers,
123
+ params=params,
124
+ ) as resp:
125
+ if resp.status in [204, 304]:
126
+ logger.debug(
127
+ "Model server returned {} status code, "
128
+ "indicating that no new model is available. "
129
+ "Current fingerprint: {}"
130
+ "".format(resp.status, fingerprint)
131
+ )
132
+ return None
133
+ elif resp.status == 404:
134
+ logger.debug(
135
+ "Model server could not find a model at the requested "
136
+ "endpoint '{}'. It's possible that no model has been "
137
+ "trained, or that the requested tag hasn't been "
138
+ "assigned.".format(model_server.url)
139
+ )
140
+ return None
141
+ elif resp.status != 200:
142
+ logger.debug(
143
+ "Tried to fetch model from server, but server response "
144
+ "status code is {}. We'll retry later..."
145
+ "".format(resp.status)
146
+ )
147
+ return None
148
+
149
+ model_path = Path(model_directory) / resp.headers.get(
150
+ "filename", "model.tar.gz"
151
+ )
152
+ with open(model_path, "wb") as file:
153
+ file.write(await resp.read())
154
+
155
+ logger.debug("Saved model to '{}'".format(os.path.abspath(model_path)))
156
+
157
+ # return the new fingerprint
158
+ return resp.headers.get("ETag")
159
+
160
+ except aiohttp.ClientError as e:
161
+ logger.debug(
162
+ "Tried to fetch model from server, but "
163
+ "couldn't reach server. We'll retry later... "
164
+ "Error: {}.".format(e)
165
+ )
166
+ return None
167
+
168
+
169
+ async def _run_model_pulling_worker(model_server: EndpointConfig, agent: Agent) -> None:
170
+ # noinspection PyBroadException
171
+ try:
172
+ await _update_model_from_server(model_server, agent)
173
+ except CancelledError:
174
+ logger.warning("Stopping model pulling (cancelled).")
175
+ except ClientError:
176
+ logger.exception(
177
+ "An exception was raised while fetching a model. Continuing anyways..."
178
+ )
179
+
180
+
181
+ async def _schedule_model_pulling(
182
+ model_server: EndpointConfig, wait_time_between_pulls: int, agent: Agent
183
+ ) -> None:
184
+ (await jobs.scheduler()).add_job(
185
+ _run_model_pulling_worker,
186
+ "interval",
187
+ seconds=wait_time_between_pulls,
188
+ args=[model_server, agent],
189
+ id="pull-model-from-server",
190
+ replace_existing=True,
191
+ )
192
+
193
+
194
+ async def load_agent(
195
+ model_path: Optional[Text] = None,
196
+ model_server: Optional[EndpointConfig] = None,
197
+ remote_storage: Optional[Text] = None,
198
+ endpoints: Optional[AvailableEndpoints] = None,
199
+ loop: Optional[AbstractEventLoop] = None,
200
+ ) -> Agent:
201
+ """Loads agent from server, remote storage or disk.
202
+
203
+ Args:
204
+ model_path: Path to the model if it's on disk.
205
+ model_server: Configuration for a potential server which serves the model.
206
+ remote_storage: URL of remote storage for model.
207
+ endpoints: Endpoint configuration.
208
+ loop: Optional async loop to pass to broker creation.
209
+
210
+ Returns:
211
+ The instantiated `Agent` or `None`.
212
+ """
213
+ from rasa.core.tracker_store import TrackerStore
214
+ from rasa.core.brokers.broker import EventBroker
215
+
216
+ tracker_store = None
217
+ lock_store = None
218
+ generator = None
219
+ action_endpoint = None
220
+ http_interpreter = None
221
+
222
+ if endpoints:
223
+ broker = await EventBroker.create(endpoints.event_broker, loop=loop)
224
+ tracker_store = TrackerStore.create(
225
+ endpoints.tracker_store, event_broker=broker
226
+ )
227
+ lock_store = LockStore.create(endpoints.lock_store)
228
+ generator = endpoints.nlg
229
+ action_endpoint = endpoints.action
230
+ model_server = endpoints.model if endpoints.model else model_server
231
+ if endpoints.nlu:
232
+ http_interpreter = RasaNLUHttpInterpreter(endpoints.nlu)
233
+
234
+ agent = Agent(
235
+ generator=generator,
236
+ tracker_store=tracker_store,
237
+ lock_store=lock_store,
238
+ action_endpoint=action_endpoint,
239
+ model_server=model_server,
240
+ remote_storage=remote_storage,
241
+ http_interpreter=http_interpreter,
242
+ endpoints=endpoints,
243
+ )
244
+
245
+ try:
246
+ if model_server is not None:
247
+ return await load_from_server(agent, model_server)
248
+
249
+ elif remote_storage is not None:
250
+ agent.load_model_from_remote_storage(model_path)
251
+
252
+ elif model_path is not None and os.path.exists(model_path):
253
+ try:
254
+ agent.load_model(model_path)
255
+ except ModelNotFound:
256
+ rasa.shared.utils.io.raise_warning(
257
+ f"No valid model found at {model_path}!"
258
+ )
259
+ else:
260
+ rasa.shared.utils.io.raise_warning(
261
+ "No valid configuration given to load agent. "
262
+ "Agent loaded with no model!"
263
+ )
264
+ return agent
265
+
266
+ except Exception as e:
267
+ logger.error(f"Could not load model due to {e}.", exc_info=True)
268
+ return agent
269
+
270
+
271
+ def agent_must_be_ready(f: Callable[..., Any]) -> Callable[..., Any]:
272
+ """Any Agent method decorated with this will raise if the agent is not ready."""
273
+
274
+ @functools.wraps(f)
275
+ def decorated(self: Agent, *args: Any, **kwargs: Any) -> Any:
276
+ if not self.is_ready():
277
+ raise AgentNotReady(
278
+ "Agent needs to be prepared before usage. You need to set a "
279
+ "processor and a tracker store."
280
+ )
281
+ return f(self, *args, **kwargs)
282
+
283
+ return decorated
284
+
285
+
286
+ class Agent:
287
+ """The Agent class provides an interface for the most important Rasa functionality.
288
+
289
+ This includes training, handling messages, loading a dialogue model,
290
+ getting the next action, and handling a channel.
291
+ """
292
+
293
+ def __init__(
294
+ self,
295
+ domain: Optional[Domain] = None,
296
+ generator: Union[EndpointConfig, NaturalLanguageGenerator, None] = None,
297
+ tracker_store: Optional[TrackerStore] = None,
298
+ lock_store: Optional[LockStore] = None,
299
+ action_endpoint: Optional[EndpointConfig] = None,
300
+ fingerprint: Optional[Text] = None,
301
+ model_server: Optional[EndpointConfig] = None,
302
+ remote_storage: Optional[Text] = None,
303
+ http_interpreter: Optional[RasaNLUHttpInterpreter] = None,
304
+ endpoints: Optional[AvailableEndpoints] = None,
305
+ ):
306
+ """Initializes an `Agent`."""
307
+ self.domain = domain
308
+ self.processor: Optional[MessageProcessor] = None
309
+
310
+ self.nlg = NaturalLanguageGenerator.create(generator, self.domain)
311
+ self.tracker_store = self._create_tracker_store(tracker_store, self.domain)
312
+ self.lock_store = self._create_lock_store(lock_store)
313
+ self.action_endpoint = action_endpoint
314
+ self.http_interpreter = http_interpreter
315
+ self.endpoints = endpoints
316
+
317
+ self._set_fingerprint(fingerprint)
318
+ self.model_server = model_server
319
+ self.remote_storage = remote_storage
320
+
321
+ @classmethod
322
+ def load(
323
+ cls,
324
+ model_path: Union[Text, Path],
325
+ domain: Optional[Domain] = None,
326
+ generator: Union[EndpointConfig, NaturalLanguageGenerator, None] = None,
327
+ tracker_store: Optional[TrackerStore] = None,
328
+ lock_store: Optional[LockStore] = None,
329
+ action_endpoint: Optional[EndpointConfig] = None,
330
+ fingerprint: Optional[Text] = None,
331
+ model_server: Optional[EndpointConfig] = None,
332
+ remote_storage: Optional[Text] = None,
333
+ http_interpreter: Optional[RasaNLUHttpInterpreter] = None,
334
+ endpoints: Optional[AvailableEndpoints] = None,
335
+ ) -> Agent:
336
+ """Constructs a new agent and loads the processer and model."""
337
+ agent = Agent(
338
+ domain=domain,
339
+ generator=generator,
340
+ tracker_store=tracker_store,
341
+ lock_store=lock_store,
342
+ action_endpoint=action_endpoint,
343
+ fingerprint=fingerprint,
344
+ model_server=model_server,
345
+ remote_storage=remote_storage,
346
+ http_interpreter=http_interpreter,
347
+ endpoints=endpoints,
348
+ )
349
+ agent.load_model(model_path=model_path, fingerprint=fingerprint)
350
+ return agent
351
+
352
+ def load_model(
353
+ self, model_path: Union[Text, Path], fingerprint: Optional[Text] = None
354
+ ) -> None:
355
+ """Loads the agent's model and processor given a new model path."""
356
+ self.processor = MessageProcessor(
357
+ model_path=model_path,
358
+ tracker_store=self.tracker_store,
359
+ lock_store=self.lock_store,
360
+ action_endpoint=self.action_endpoint,
361
+ generator=self.nlg,
362
+ http_interpreter=self.http_interpreter,
363
+ endpoints=self.endpoints,
364
+ )
365
+ self.domain = self.processor.domain
366
+
367
+ self._set_fingerprint(fingerprint)
368
+
369
+ # update domain on all instances
370
+ self.tracker_store.domain = self.domain
371
+ if isinstance(self.nlg, TemplatedNaturalLanguageGenerator):
372
+ self.nlg.responses = self.domain.responses if self.domain else {}
373
+
374
+ @property
375
+ def model_id(self) -> Optional[Text]:
376
+ """Returns the model_id from processor's model_metadata."""
377
+ return self.processor.model_metadata.model_id if self.processor else None
378
+
379
+ @property
380
+ def model_name(self) -> Optional[Text]:
381
+ """Returns the model name from processor's model_path."""
382
+ return self.processor.model_path.name if self.processor else None
383
+
384
+ def is_ready(self) -> bool:
385
+ """Check if all necessary components are instantiated to use agent."""
386
+ return self.tracker_store is not None and self.processor is not None
387
+
388
+ @agent_must_be_ready
389
+ async def parse_message(self, message_data: Text) -> Dict[Text, Any]:
390
+ """Handles message text and intent payload input messages.
391
+
392
+ The return value of this function is parsed_data.
393
+
394
+ Args:
395
+ message_data (Text): Contain the received message in text or\
396
+ intent payload format.
397
+
398
+ Returns:
399
+ The parsed message.
400
+
401
+ Example:
402
+ {\
403
+ "text": '/greet{"name":"Rasa"}',\
404
+ "intent": {"name": "greet", "confidence": 1.0},\
405
+ "intent_ranking": [{"name": "greet", "confidence": 1.0}],\
406
+ "entities": [{"entity": "name", "start": 6,\
407
+ "end": 21, "value": "Rasa"}],\
408
+ }
409
+
410
+ """
411
+ message = UserMessage(message_data)
412
+
413
+ return await self.processor.parse_message(message) # type: ignore[union-attr]
414
+
415
+ async def handle_message(
416
+ self, message: UserMessage
417
+ ) -> Optional[List[Dict[Text, Any]]]:
418
+ """Handle a single message."""
419
+ if not self.is_ready():
420
+ logger.info("Ignoring message as there is no agent to handle it.")
421
+ return None
422
+
423
+ async with self.lock_store.lock(message.sender_id):
424
+ return await self.processor.handle_message( # type: ignore[union-attr]
425
+ message
426
+ )
427
+
428
+ @agent_must_be_ready
429
+ async def predict_next_for_sender_id(
430
+ self, sender_id: Text
431
+ ) -> Optional[Dict[Text, Any]]:
432
+ """Predict the next action for a sender id."""
433
+ return await self.processor.predict_next_for_sender_id( # type: ignore[union-attr]
434
+ sender_id
435
+ )
436
+
437
+ @agent_must_be_ready
438
+ async def predict_next_with_tracker(
439
+ self,
440
+ tracker: DialogueStateTracker,
441
+ verbosity: EventVerbosity = EventVerbosity.AFTER_RESTART,
442
+ ) -> Optional[Dict[Text, Any]]:
443
+ """Predicts the next action."""
444
+ return await self.processor.predict_next_with_tracker( # type: ignore[union-attr]
445
+ tracker, verbosity
446
+ )
447
+
448
+ @agent_must_be_ready
449
+ async def log_message(self, message: UserMessage) -> DialogueStateTracker:
450
+ """Append a message to a dialogue - does not predict actions."""
451
+ return await self.processor.log_message(message) # type: ignore[union-attr]
452
+
453
+ @agent_must_be_ready
454
+ async def execute_action(
455
+ self,
456
+ sender_id: Text,
457
+ action: Text,
458
+ output_channel: OutputChannel,
459
+ policy: Optional[Text],
460
+ confidence: Optional[float],
461
+ ) -> Optional[DialogueStateTracker]:
462
+ """Executes an action."""
463
+ prediction = PolicyPrediction.for_action_name(
464
+ self.domain, action, policy, confidence or 0.0
465
+ )
466
+ return await self.processor.execute_action( # type: ignore[union-attr]
467
+ sender_id, action, output_channel, self.nlg, prediction
468
+ )
469
+
470
+ @agent_must_be_ready
471
+ async def trigger_intent(
472
+ self,
473
+ intent_name: Text,
474
+ entities: List[Dict[Text, Any]],
475
+ output_channel: OutputChannel,
476
+ tracker: DialogueStateTracker,
477
+ ) -> None:
478
+ """Trigger a user intent, e.g. triggered by an external event."""
479
+ await self.processor.trigger_external_user_uttered( # type: ignore[union-attr]
480
+ intent_name, entities, tracker, output_channel
481
+ )
482
+
483
+ @agent_must_be_ready
484
+ async def handle_text(
485
+ self,
486
+ text_message: Union[Text, Dict[Text, Any]],
487
+ output_channel: Optional[OutputChannel] = None,
488
+ sender_id: Optional[Text] = DEFAULT_SENDER_ID,
489
+ ) -> Optional[List[Dict[Text, Any]]]:
490
+ """Handle a single message.
491
+
492
+ If a message preprocessor is passed, the message will be passed to that
493
+ function first and the return value is then used as the
494
+ input for the dialogue engine.
495
+
496
+ The return value of this function depends on the ``output_channel``. If
497
+ the output channel is not set, set to ``None``, or set
498
+ to ``CollectingOutputChannel`` this function will return the messages
499
+ the bot wants to respond.
500
+
501
+ :Example:
502
+
503
+ >>> from rasa.core.agent import Agent
504
+ >>> agent = Agent.load("examples/moodbot/models")
505
+ >>> await agent.handle_text("hello")
506
+ [u'how can I help you?']
507
+
508
+ """
509
+ if isinstance(text_message, str):
510
+ text_message = {"text": text_message}
511
+
512
+ msg = UserMessage(text_message.get("text"), output_channel, sender_id)
513
+
514
+ return await self.handle_message(msg)
515
+
516
+ def _set_fingerprint(self, fingerprint: Optional[Text] = None) -> None:
517
+ if fingerprint:
518
+ self.fingerprint = fingerprint
519
+ else:
520
+ self.fingerprint = uuid.uuid4().hex
521
+
522
+ @staticmethod
523
+ def _create_tracker_store(
524
+ store: Optional[TrackerStore], domain: Domain
525
+ ) -> TrackerStore:
526
+ if store is not None:
527
+ store.domain = domain
528
+ tracker_store = store
529
+ else:
530
+ tracker_store = InMemoryTrackerStore(domain)
531
+
532
+ return FailSafeTrackerStore(tracker_store)
533
+
534
+ @staticmethod
535
+ def _create_lock_store(store: Optional[LockStore]) -> LockStore:
536
+ if store is not None:
537
+ return store
538
+
539
+ return InMemoryLockStore()
540
+
541
+ def load_model_from_remote_storage(self, model_name: Text) -> None:
542
+ """Loads an Agent from remote storage."""
543
+ from rasa.nlu.persistor import get_persistor
544
+
545
+ persistor = get_persistor(self.remote_storage)
546
+
547
+ if persistor is not None:
548
+ with TempDirectoryPath(get_temp_dir_name()) as temporary_directory:
549
+ persistor.retrieve(model_name, temporary_directory)
550
+ self.load_model(temporary_directory)
551
+
552
+ else:
553
+ raise RasaException(
554
+ f"Persistor not found for remote storage: '{self.remote_storage}'."
555
+ )
@@ -0,0 +1,122 @@
1
+ import logging
2
+ from typing import Iterable, Optional, Text
3
+
4
+ from rasa.core.brokers.broker import EventBroker
5
+ from rasa.core.tracker_store import TrackerStore, create_tracker_store
6
+ from rasa.shared.core.domain import Domain
7
+ from rasa.shared.core.trackers import DialogueStateTracker
8
+ from rasa.utils.endpoints import EndpointConfig
9
+
10
+ from rasa.core.secrets_manager.secret_manager import EndpointResolver
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+ DEFAULT_RETRIES = 3
15
+
16
+
17
+ class AuthRetryTrackerStore(TrackerStore):
18
+ """Tracker store wrapper which implements retry mechanism in every abstract method.
19
+
20
+ The retry mechanism first updates credentials from the secret manager.
21
+ """
22
+
23
+ def __init__(
24
+ self,
25
+ domain: "Domain",
26
+ endpoint_config: "EndpointConfig",
27
+ retries: int = DEFAULT_RETRIES,
28
+ event_broker: Optional["EventBroker"] = None,
29
+ ) -> None:
30
+ """Initialise the tracker store wrapper."""
31
+ self.retries = self.validate_retries(retries)
32
+ self.endpoint_config = endpoint_config
33
+
34
+ self._tracker_store = self.recreate_tracker_store(domain, event_broker)
35
+
36
+ super().__init__(domain, event_broker)
37
+
38
+ @property
39
+ def domain(self) -> Domain:
40
+ """Returns the domain of the wrapped tracker store."""
41
+ return self._tracker_store.domain
42
+
43
+ @domain.setter
44
+ def domain(self, domain: Optional[Domain]) -> None:
45
+ """Sets the domain of wrapped tracker store."""
46
+ self._tracker_store.domain = domain or Domain.empty()
47
+
48
+ @staticmethod
49
+ def validate_retries(retries: int) -> int:
50
+ """Validate the number of retries."""
51
+ if retries <= 0:
52
+ logger.warning(
53
+ f"Invalid number of retries: {retries}. "
54
+ f"Using default number of retries: {DEFAULT_RETRIES}."
55
+ )
56
+ return DEFAULT_RETRIES
57
+ else:
58
+ return retries
59
+
60
+ async def keys(self) -> Iterable[Text]:
61
+ """Retries retrieving the keys if it fails."""
62
+ # add + 1 to retries because the retries are additional to the first attempt
63
+ for _ in range(self.retries + 1):
64
+ try:
65
+ return await self._tracker_store.keys()
66
+ except Exception as e:
67
+ logger.warning("Failed to retrieve keys. Retrying...", exc_info=e)
68
+ self._tracker_store = self.recreate_tracker_store(
69
+ self.domain, self.event_broker
70
+ )
71
+ else:
72
+ logger.error(f"Failed to retrieve keys after {self.retries} retries.")
73
+ return []
74
+
75
+ async def retrieve(self, sender_id: Text) -> Optional["DialogueStateTracker"]:
76
+ """Retries retrieving the tracker if it fails."""
77
+ # add + 1 to retries because the retries are additional to the first attempt
78
+ for _ in range(self.retries + 1):
79
+ try:
80
+ return await self._tracker_store.retrieve(sender_id)
81
+ except Exception as e:
82
+ logger.warning(
83
+ f"Failed to retrieve tracker for {sender_id}. Retrying...",
84
+ exc_info=e,
85
+ )
86
+ self._tracker_store = self.recreate_tracker_store(
87
+ self.domain, self.event_broker
88
+ )
89
+ else:
90
+ logger.error(
91
+ f"Failed to retrieve tracker for {sender_id} "
92
+ f"after {self.retries} retries."
93
+ )
94
+ return None
95
+
96
+ async def save(self, tracker: "DialogueStateTracker") -> None:
97
+ """Retries saving the tracker if it fails."""
98
+ # add + 1 to retries because the retries are additional to the first attempt
99
+ for _ in range(self.retries + 1):
100
+ try:
101
+ await self._tracker_store.save(tracker)
102
+ break
103
+ except Exception as e:
104
+ logger.warning(
105
+ f"Failed to save tracker for {tracker.sender_id}. Retrying...",
106
+ exc_info=e,
107
+ )
108
+ self._tracker_store = self.recreate_tracker_store(
109
+ self.domain, self.event_broker
110
+ )
111
+ else:
112
+ logger.error(
113
+ f"Failed to save tracker for {tracker.sender_id} "
114
+ f"after {self.retries} retries."
115
+ )
116
+
117
+ def recreate_tracker_store(
118
+ self, domain: "Domain", event_broker: Optional["EventBroker"] = None
119
+ ) -> TrackerStore:
120
+ """Recreate tracker store with updated credentials."""
121
+ endpoint_config = EndpointResolver.update_config(self.endpoint_config)
122
+ return create_tracker_store(endpoint_config, domain, event_broker)
File without changes