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,1225 @@
1
+ import copy
2
+ import logging
3
+ from typing import (
4
+ List,
5
+ Text,
6
+ Optional,
7
+ Dict,
8
+ Any,
9
+ TYPE_CHECKING,
10
+ Tuple,
11
+ Set,
12
+ cast,
13
+ )
14
+
15
+ import rasa.core
16
+ import rasa.shared.utils.io
17
+ from rasa.core.actions.custom_action_executor import (
18
+ CustomActionExecutor,
19
+ RetryCustomActionExecutor,
20
+ NoEndpointCustomActionExecutor,
21
+ )
22
+ from rasa.core.actions.grpc_custom_action_executor import GRPCCustomActionExecutor
23
+ from rasa.core.actions.http_custom_action_executor import HTTPCustomActionExecutor
24
+ from rasa.core.policies.policy import PolicyPrediction
25
+ from rasa.nlu.constants import (
26
+ RESPONSE_SELECTOR_DEFAULT_INTENT,
27
+ RESPONSE_SELECTOR_PROPERTY_NAME,
28
+ RESPONSE_SELECTOR_PREDICTION_KEY,
29
+ RESPONSE_SELECTOR_UTTER_ACTION_KEY,
30
+ )
31
+ from rasa.shared.constants import (
32
+ DOCS_BASE_URL,
33
+ DEFAULT_NLU_FALLBACK_INTENT_NAME,
34
+ ROUTE_TO_CALM_SLOT,
35
+ UTTER_PREFIX,
36
+ FLOW_PREFIX,
37
+ )
38
+ from rasa.shared.core.constants import (
39
+ ACTION_RESET_ROUTING,
40
+ USER_INTENT_OUT_OF_SCOPE,
41
+ ACTION_LISTEN_NAME,
42
+ ACTION_RESTART_NAME,
43
+ ACTION_SEND_TEXT_NAME,
44
+ ACTION_SESSION_START_NAME,
45
+ ACTION_DEFAULT_FALLBACK_NAME,
46
+ ACTION_DEACTIVATE_LOOP_NAME,
47
+ ACTION_REVERT_FALLBACK_EVENTS_NAME,
48
+ ACTION_DEFAULT_ASK_AFFIRMATION_NAME,
49
+ ACTION_DEFAULT_ASK_REPHRASE_NAME,
50
+ ACTION_UNLIKELY_INTENT_NAME,
51
+ ACTION_BACK_NAME,
52
+ REQUESTED_SLOT,
53
+ ACTION_EXTRACT_SLOTS,
54
+ DEFAULT_SLOT_NAMES,
55
+ ACTION_VALIDATE_SLOT_MAPPINGS,
56
+ MAPPING_TYPE,
57
+ SlotMappingType,
58
+ KNOWLEDGE_BASE_SLOT_NAMES,
59
+ )
60
+ from rasa.shared.core.domain import Domain
61
+ from rasa.shared.core.events import (
62
+ RoutingSessionEnded,
63
+ UserUtteranceReverted,
64
+ UserUttered,
65
+ ActionExecuted,
66
+ Event,
67
+ BotUttered,
68
+ SlotSet,
69
+ ActiveLoop,
70
+ Restarted,
71
+ SessionStarted,
72
+ )
73
+ from rasa.shared.core.flows import FlowsList
74
+ from rasa.shared.core.slot_mappings import (
75
+ SlotFillingManager,
76
+ extract_slot_value,
77
+ )
78
+ from rasa.shared.core.trackers import DialogueStateTracker
79
+ from rasa.shared.exceptions import RasaException
80
+ from rasa.shared.nlu.constants import (
81
+ INTENT_NAME_KEY,
82
+ INTENT_RANKING_KEY,
83
+ )
84
+ from rasa.shared.utils.schemas.events import EVENTS_SCHEMA
85
+ from rasa.utils.endpoints import EndpointConfig, ClientResponseError
86
+ from rasa.utils.url_tools import get_url_schema, UrlSchema
87
+
88
+ if TYPE_CHECKING:
89
+ from rasa.core.nlg import NaturalLanguageGenerator
90
+ from rasa.core.channels.channel import OutputChannel
91
+ from rasa.shared.core.events import IntentPrediction
92
+
93
+ logger = logging.getLogger(__name__)
94
+
95
+
96
+ def default_actions(action_endpoint: Optional[EndpointConfig] = None) -> List["Action"]:
97
+ """List default actions."""
98
+ from rasa.core.actions.two_stage_fallback import TwoStageFallbackAction
99
+ from rasa.dialogue_understanding.patterns.correction import ActionCorrectFlowSlot
100
+ from rasa.dialogue_understanding.patterns.cancel import ActionCancelFlow
101
+ from rasa.dialogue_understanding.patterns.clarify import ActionClarifyFlows
102
+ from rasa.core.actions.action_run_slot_rejections import ActionRunSlotRejections
103
+ from rasa.core.actions.action_trigger_chitchat import ActionTriggerChitchat
104
+ from rasa.core.actions.action_trigger_search import ActionTriggerSearch
105
+ from rasa.core.actions.action_clean_stack import ActionCleanStack
106
+
107
+ return [
108
+ ActionListen(),
109
+ ActionRestart(),
110
+ ActionSessionStart(),
111
+ ActionDefaultFallback(),
112
+ ActionDeactivateLoop(),
113
+ ActionRevertFallbackEvents(),
114
+ ActionDefaultAskAffirmation(),
115
+ ActionDefaultAskRephrase(),
116
+ TwoStageFallbackAction(action_endpoint),
117
+ ActionUnlikelyIntent(),
118
+ ActionSendText(),
119
+ ActionBack(),
120
+ ActionExtractSlots(action_endpoint),
121
+ ActionCancelFlow(),
122
+ ActionCorrectFlowSlot(),
123
+ ActionClarifyFlows(),
124
+ ActionRunSlotRejections(),
125
+ ActionCleanStack(),
126
+ ActionTriggerSearch(),
127
+ ActionTriggerChitchat(),
128
+ ActionResetRouting(),
129
+ ]
130
+
131
+
132
+ def action_for_index(
133
+ index: int, domain: Domain, action_endpoint: Optional[EndpointConfig]
134
+ ) -> "Action":
135
+ """Get an action based on its index in the list of available actions.
136
+
137
+ Args:
138
+ index: The index of the action. This is usually used by `Policy`s as they
139
+ predict the action index instead of the name.
140
+ domain: The `Domain` of the current model. The domain contains the actions
141
+ provided by the user + the default actions.
142
+ action_endpoint: Can be used to run `custom_actions`
143
+ (e.g. using the `rasa-sdk`).
144
+
145
+ Returns:
146
+ The instantiated `Action` or `None` if no `Action` was found for the given
147
+ index.
148
+ """
149
+ if domain.num_actions <= index or index < 0:
150
+ raise IndexError(
151
+ f"Cannot access action at index {index}. "
152
+ f"Domain has {domain.num_actions} actions."
153
+ )
154
+
155
+ return action_for_name_or_text(
156
+ domain.action_names_or_texts[index], domain, action_endpoint
157
+ )
158
+
159
+
160
+ def is_retrieval_action(action_name: Text, retrieval_intents: List[Text]) -> bool:
161
+ """Check if an action name is a retrieval action.
162
+
163
+ The name for a retrieval action has an extra `utter_` prefix added to
164
+ the corresponding retrieval intent name.
165
+
166
+ Args:
167
+ action_name: Name of the action.
168
+ retrieval_intents: List of retrieval intents defined in the NLU training data.
169
+
170
+ Returns:
171
+ `True` if the resolved intent name is present in the list of retrieval
172
+ intents, `False` otherwise.
173
+ """
174
+ return (
175
+ ActionRetrieveResponse.intent_name_from_action(action_name) in retrieval_intents
176
+ )
177
+
178
+
179
+ def action_for_name_or_text(
180
+ action_name_or_text: Text, domain: Domain, action_endpoint: Optional[EndpointConfig]
181
+ ) -> "Action":
182
+ """Retrieves an action by its name or by its text in case it's an end-to-end action.
183
+
184
+ Args:
185
+ action_name_or_text: The name of the action.
186
+ domain: The current model domain.
187
+ action_endpoint: The endpoint to execute custom actions.
188
+
189
+ Raises:
190
+ ActionNotFoundException: If action not in current domain.
191
+
192
+ Returns:
193
+ The instantiated action.
194
+ """
195
+ if action_name_or_text not in domain.action_names_or_texts:
196
+ domain.raise_action_not_found_exception(action_name_or_text)
197
+
198
+ defaults = {a.name(): a for a in default_actions(action_endpoint)}
199
+
200
+ if (
201
+ action_name_or_text in defaults
202
+ and action_name_or_text not in domain.user_actions_and_forms
203
+ ):
204
+ return defaults[action_name_or_text]
205
+
206
+ if action_name_or_text.startswith(UTTER_PREFIX) and is_retrieval_action(
207
+ action_name_or_text, domain.retrieval_intents
208
+ ):
209
+ return ActionRetrieveResponse(action_name_or_text)
210
+
211
+ if action_name_or_text in domain.action_texts:
212
+ return ActionEndToEndResponse(action_name_or_text)
213
+
214
+ if action_name_or_text.startswith(UTTER_PREFIX):
215
+ return ActionBotResponse(action_name_or_text)
216
+
217
+ is_form = action_name_or_text in domain.form_names
218
+ # Users can override the form by defining an action with the same name as the form
219
+ user_overrode_form_action = is_form and action_name_or_text in domain.user_actions
220
+ if is_form and not user_overrode_form_action:
221
+ from rasa.core.actions.forms import FormAction
222
+
223
+ return FormAction(action_name_or_text, action_endpoint)
224
+
225
+ if action_name_or_text.startswith(FLOW_PREFIX):
226
+ from rasa.core.actions.action_trigger_flow import ActionTriggerFlow
227
+
228
+ return ActionTriggerFlow(action_name_or_text)
229
+ return RemoteAction(action_name_or_text, action_endpoint)
230
+
231
+
232
+ def create_bot_utterance(message: Dict[Text, Any]) -> BotUttered:
233
+ """Create BotUttered event from message."""
234
+ bot_message = BotUttered(
235
+ text=message.pop("text", None),
236
+ data={
237
+ "elements": message.pop("elements", None),
238
+ "quick_replies": message.pop("quick_replies", None),
239
+ "buttons": message.pop("buttons", None),
240
+ # for legacy / compatibility reasons we need to set the image
241
+ # to be the attachment if there is no other attachment (the
242
+ # `.get` is intentional - no `pop` as we still need the image`
243
+ # property to set it in the following line)
244
+ "attachment": message.pop("attachment", None) or message.get("image", None),
245
+ "image": message.pop("image", None),
246
+ "custom": message.pop("custom", None),
247
+ },
248
+ metadata=message,
249
+ )
250
+ return bot_message
251
+
252
+
253
+ class Action:
254
+ """Next action to be taken in response to a dialogue state."""
255
+
256
+ def name(self) -> Text:
257
+ """Unique identifier of this simple action."""
258
+ raise NotImplementedError
259
+
260
+ async def run(
261
+ self,
262
+ output_channel: "OutputChannel",
263
+ nlg: "NaturalLanguageGenerator",
264
+ tracker: "DialogueStateTracker",
265
+ domain: "Domain",
266
+ metadata: Optional[Dict[Text, Any]] = None,
267
+ ) -> List[Event]:
268
+ """Execute the side effects of this action.
269
+
270
+ Args:
271
+ nlg: which ``nlg`` to use for response generation
272
+ output_channel: ``output_channel`` to which to send the resulting message.
273
+ tracker (DialogueStateTracker): the state tracker for the current
274
+ user. You can access slot values using
275
+ ``tracker.get_slot(slot_name)`` and the most recent user
276
+ message is ``tracker.latest_message.text``.
277
+ domain (Domain): the bot's domain
278
+ metadata: Additional information for the action.
279
+
280
+ Returns:
281
+ A list of :class:`rasa.core.events.Event` instances
282
+ """
283
+ raise NotImplementedError
284
+
285
+ def __str__(self) -> Text:
286
+ """Returns text representation of form."""
287
+ return f"{self.__class__.__name__}('{self.name()}')"
288
+
289
+ def event_for_successful_execution(
290
+ self, prediction: PolicyPrediction
291
+ ) -> ActionExecuted:
292
+ """Event which should be logged for the successful execution of this action.
293
+
294
+ Args:
295
+ prediction: Prediction which led to the execution of this event.
296
+
297
+ Returns:
298
+ Event which should be logged onto the tracker.
299
+ """
300
+ return ActionExecuted(
301
+ self.name(),
302
+ prediction.policy_name,
303
+ prediction.max_confidence,
304
+ hide_rule_turn=prediction.hide_rule_turn,
305
+ metadata=prediction.action_metadata,
306
+ )
307
+
308
+
309
+ class ActionBotResponse(Action):
310
+ """An action which only effect is to utter a response when it is run."""
311
+
312
+ def __init__(self, name: Text, silent_fail: Optional[bool] = False) -> None:
313
+ """Creates action.
314
+
315
+ Args:
316
+ name: Name of the action.
317
+ silent_fail: `True` if the action should fail silently in case no response
318
+ was defined for this action.
319
+ """
320
+ self.utter_action = name
321
+ self.silent_fail = silent_fail
322
+
323
+ async def run(
324
+ self,
325
+ output_channel: "OutputChannel",
326
+ nlg: "NaturalLanguageGenerator",
327
+ tracker: "DialogueStateTracker",
328
+ domain: "Domain",
329
+ metadata: Optional[Dict[Text, Any]] = None,
330
+ ) -> List[Event]:
331
+ """Simple run implementation uttering a (hopefully defined) response."""
332
+ kwargs = {
333
+ "domain_responses": domain.responses,
334
+ }
335
+
336
+ message = await nlg.generate(
337
+ self.utter_action,
338
+ tracker,
339
+ output_channel.name(),
340
+ **kwargs,
341
+ )
342
+ if message is None:
343
+ if not self.silent_fail:
344
+ logger.error(
345
+ "Couldn't create message for response '{}'.".format(
346
+ self.utter_action
347
+ )
348
+ )
349
+ return []
350
+ message["utter_action"] = self.utter_action
351
+
352
+ return [create_bot_utterance(message)]
353
+
354
+ def name(self) -> Text:
355
+ """Returns action name."""
356
+ return self.utter_action
357
+
358
+
359
+ class ActionEndToEndResponse(Action):
360
+ """Action to utter end-to-end responses to the user."""
361
+
362
+ def __init__(self, action_text: Text) -> None:
363
+ """Creates action.
364
+
365
+ Args:
366
+ action_text: Text of end-to-end bot response.
367
+ """
368
+ self.action_text = action_text
369
+
370
+ def name(self) -> Text:
371
+ """Returns action name."""
372
+ # In case of an end-to-end action there is no label (aka name) for the action.
373
+ # We fake a name by returning the text which the bot sends back to the user.
374
+ return self.action_text
375
+
376
+ async def run(
377
+ self,
378
+ output_channel: "OutputChannel",
379
+ nlg: "NaturalLanguageGenerator",
380
+ tracker: "DialogueStateTracker",
381
+ domain: "Domain",
382
+ metadata: Optional[Dict[Text, Any]] = None,
383
+ ) -> List[Event]:
384
+ """Runs action (see parent class for full docstring)."""
385
+ message = {"text": self.action_text}
386
+ return [create_bot_utterance(message)]
387
+
388
+ def event_for_successful_execution(
389
+ self, prediction: PolicyPrediction
390
+ ) -> ActionExecuted:
391
+ """Event which should be logged for the successful execution of this action.
392
+
393
+ Args:
394
+ prediction: Prediction which led to the execution of this event.
395
+
396
+ Returns:
397
+ Event which should be logged onto the tracker.
398
+ """
399
+ return ActionExecuted(
400
+ policy=prediction.policy_name,
401
+ confidence=prediction.max_confidence,
402
+ action_text=self.action_text,
403
+ hide_rule_turn=prediction.hide_rule_turn,
404
+ metadata=prediction.action_metadata,
405
+ )
406
+
407
+
408
+ class ActionRetrieveResponse(ActionBotResponse):
409
+ """An action which queries the Response Selector for the appropriate response."""
410
+
411
+ def __init__(self, name: Text, silent_fail: Optional[bool] = False) -> None:
412
+ """Creates action. See docstring of parent class."""
413
+ super().__init__(name, silent_fail)
414
+ self.action_name = name
415
+ self.silent_fail = silent_fail
416
+
417
+ @staticmethod
418
+ def intent_name_from_action(action_name: Text) -> Text:
419
+ """Resolve the name of the intent from the action name."""
420
+ return action_name.split(UTTER_PREFIX)[1]
421
+
422
+ def get_full_retrieval_name(
423
+ self, tracker: "DialogueStateTracker"
424
+ ) -> Optional[Text]:
425
+ """Returns full retrieval name for the action.
426
+
427
+ Extracts retrieval intent from response selector and
428
+ returns complete action utterance name.
429
+
430
+ Args:
431
+ tracker: Tracker containing past conversation events.
432
+
433
+ Returns:
434
+ Full retrieval name of the action if the last user utterance
435
+ contains a response selector output, `None` otherwise.
436
+ """
437
+ latest_message = tracker.latest_message
438
+
439
+ if latest_message is None:
440
+ return None
441
+
442
+ if RESPONSE_SELECTOR_PROPERTY_NAME not in latest_message.parse_data:
443
+ return None
444
+
445
+ response_selector_properties = latest_message.parse_data[
446
+ RESPONSE_SELECTOR_PROPERTY_NAME # type: ignore[literal-required]
447
+ ]
448
+
449
+ if (
450
+ self.intent_name_from_action(self.action_name)
451
+ in response_selector_properties
452
+ ):
453
+ query_key = self.intent_name_from_action(self.action_name)
454
+ elif RESPONSE_SELECTOR_DEFAULT_INTENT in response_selector_properties:
455
+ query_key = RESPONSE_SELECTOR_DEFAULT_INTENT
456
+ else:
457
+ return None
458
+
459
+ selected = response_selector_properties[query_key]
460
+ full_retrieval_utter_action = selected[RESPONSE_SELECTOR_PREDICTION_KEY][
461
+ RESPONSE_SELECTOR_UTTER_ACTION_KEY
462
+ ]
463
+ return full_retrieval_utter_action
464
+
465
+ async def run(
466
+ self,
467
+ output_channel: "OutputChannel",
468
+ nlg: "NaturalLanguageGenerator",
469
+ tracker: "DialogueStateTracker",
470
+ domain: "Domain",
471
+ metadata: Optional[Dict[Text, Any]] = None,
472
+ ) -> List[Event]:
473
+ """Query the appropriate response and create a bot utterance with that."""
474
+ latest_message = tracker.latest_message
475
+
476
+ if latest_message is None:
477
+ return []
478
+
479
+ response_selector_properties = latest_message.parse_data[
480
+ RESPONSE_SELECTOR_PROPERTY_NAME # type: ignore[literal-required]
481
+ ]
482
+
483
+ if (
484
+ self.intent_name_from_action(self.action_name)
485
+ in response_selector_properties
486
+ ):
487
+ query_key = self.intent_name_from_action(self.action_name)
488
+ elif RESPONSE_SELECTOR_DEFAULT_INTENT in response_selector_properties:
489
+ query_key = RESPONSE_SELECTOR_DEFAULT_INTENT
490
+ else:
491
+ if not self.silent_fail:
492
+ logger.error(
493
+ "Couldn't create message for response action '{}'.".format(
494
+ self.action_name
495
+ )
496
+ )
497
+ return []
498
+
499
+ logger.debug(f"Picking response from selector of type {query_key}")
500
+ selected = response_selector_properties[query_key]
501
+
502
+ # Override utter action of ActionBotResponse
503
+ # with the complete utter action retrieved from
504
+ # the output of response selector.
505
+ self.utter_action = selected[RESPONSE_SELECTOR_PREDICTION_KEY][
506
+ RESPONSE_SELECTOR_UTTER_ACTION_KEY
507
+ ]
508
+
509
+ return await super().run(output_channel, nlg, tracker, domain)
510
+
511
+ def name(self) -> Text:
512
+ """Returns action name."""
513
+ return self.action_name
514
+
515
+
516
+ class ActionBack(ActionBotResponse):
517
+ """Revert the tracker state by two user utterances."""
518
+
519
+ def name(self) -> Text:
520
+ """Returns action back name."""
521
+ return ACTION_BACK_NAME
522
+
523
+ def __init__(self) -> None:
524
+ """Initializes action back."""
525
+ super().__init__("utter_back", silent_fail=True)
526
+
527
+ async def run(
528
+ self,
529
+ output_channel: "OutputChannel",
530
+ nlg: "NaturalLanguageGenerator",
531
+ tracker: "DialogueStateTracker",
532
+ domain: "Domain",
533
+ metadata: Optional[Dict[Text, Any]] = None,
534
+ ) -> List[Event]:
535
+ """Runs action. Please see parent class for the full docstring."""
536
+ # only utter the response if it is available
537
+ evts = await super().run(output_channel, nlg, tracker, domain)
538
+
539
+ return evts + [UserUtteranceReverted(), UserUtteranceReverted()]
540
+
541
+
542
+ class ActionListen(Action):
543
+ """The first action in any turn - bot waits for a user message.
544
+
545
+ The bot should stop taking further actions and wait for the user to say
546
+ something.
547
+ """
548
+
549
+ def name(self) -> Text:
550
+ """Returns action listen name."""
551
+ return ACTION_LISTEN_NAME
552
+
553
+ async def run(
554
+ self,
555
+ output_channel: "OutputChannel",
556
+ nlg: "NaturalLanguageGenerator",
557
+ tracker: "DialogueStateTracker",
558
+ domain: "Domain",
559
+ metadata: Optional[Dict[Text, Any]] = None,
560
+ ) -> List[Event]:
561
+ """Runs action. Please see parent class for the full docstring."""
562
+ return []
563
+
564
+
565
+ class ActionResetRouting(Action):
566
+ """Resets the tracker to its initial state.
567
+
568
+ Utters the restart response if available.
569
+ """
570
+
571
+ def name(self) -> Text:
572
+ """Returns action restart name."""
573
+ return ACTION_RESET_ROUTING
574
+
575
+ async def run(
576
+ self,
577
+ output_channel: "OutputChannel",
578
+ nlg: "NaturalLanguageGenerator",
579
+ tracker: "DialogueStateTracker",
580
+ domain: "Domain",
581
+ metadata: Optional[Dict[Text, Any]] = None,
582
+ ) -> List[Event]:
583
+ """Runs action. Please see parent class for the full docstring."""
584
+ # SlotSet(ROUTE_TO_CALM_SLOT, None) is needed to ensure the routing slot
585
+ # is really reset to None and not just reset to an initial value
586
+ return [RoutingSessionEnded(), SlotSet(ROUTE_TO_CALM_SLOT, None)]
587
+
588
+
589
+ class ActionRestart(ActionBotResponse):
590
+ """Resets the tracker to its initial state.
591
+
592
+ Utters the restart response if available.
593
+ """
594
+
595
+ def name(self) -> Text:
596
+ """Returns action restart name."""
597
+ return ACTION_RESTART_NAME
598
+
599
+ def __init__(self) -> None:
600
+ """Initializes action restart."""
601
+ super().__init__("utter_restart", silent_fail=True)
602
+
603
+ async def run(
604
+ self,
605
+ output_channel: "OutputChannel",
606
+ nlg: "NaturalLanguageGenerator",
607
+ tracker: "DialogueStateTracker",
608
+ domain: "Domain",
609
+ metadata: Optional[Dict[Text, Any]] = None,
610
+ ) -> List[Event]:
611
+ """Runs action. Please see parent class for the full docstring."""
612
+ # only utter the response if it is available
613
+ evts = await super().run(output_channel, nlg, tracker, domain)
614
+
615
+ return evts + [Restarted()]
616
+
617
+
618
+ class ActionSessionStart(Action):
619
+ """Applies a conversation session start.
620
+
621
+ Takes all `SlotSet` events from the previous session and applies them to the new
622
+ session.
623
+ """
624
+
625
+ def name(self) -> Text:
626
+ """Returns action start name."""
627
+ return ACTION_SESSION_START_NAME
628
+
629
+ @staticmethod
630
+ def _slot_set_events_from_tracker(
631
+ tracker: "DialogueStateTracker",
632
+ ) -> List["SlotSet"]:
633
+ """Fetch SlotSet events from tracker and carry over key, value and metadata."""
634
+ return [
635
+ SlotSet(key=event.key, value=event.value, metadata=event.metadata)
636
+ for event in tracker.applied_events()
637
+ if isinstance(event, SlotSet)
638
+ ]
639
+
640
+ async def run(
641
+ self,
642
+ output_channel: "OutputChannel",
643
+ nlg: "NaturalLanguageGenerator",
644
+ tracker: "DialogueStateTracker",
645
+ domain: "Domain",
646
+ metadata: Optional[Dict[Text, Any]] = None,
647
+ ) -> List[Event]:
648
+ """Runs action. Please see parent class for the full docstring."""
649
+ _events: List[Event] = [SessionStarted()]
650
+
651
+ if domain.session_config.carry_over_slots:
652
+ _events.extend(self._slot_set_events_from_tracker(tracker))
653
+
654
+ _events.append(ActionExecuted(ACTION_LISTEN_NAME))
655
+
656
+ return _events
657
+
658
+
659
+ class ActionDefaultFallback(ActionBotResponse):
660
+ """Executes the fallback action and goes back to the prev state of the dialogue."""
661
+
662
+ def name(self) -> Text:
663
+ """Returns action default fallback name."""
664
+ return ACTION_DEFAULT_FALLBACK_NAME
665
+
666
+ def __init__(self) -> None:
667
+ """Initializes action default fallback."""
668
+ super().__init__("utter_default", silent_fail=True)
669
+
670
+ async def run(
671
+ self,
672
+ output_channel: "OutputChannel",
673
+ nlg: "NaturalLanguageGenerator",
674
+ tracker: "DialogueStateTracker",
675
+ domain: "Domain",
676
+ metadata: Optional[Dict[Text, Any]] = None,
677
+ ) -> List[Event]:
678
+ """Runs action. Please see parent class for the full docstring."""
679
+ # only utter the response if it is available
680
+ evts = await super().run(output_channel, nlg, tracker, domain)
681
+
682
+ return evts + [UserUtteranceReverted()]
683
+
684
+
685
+ class ActionDeactivateLoop(Action):
686
+ """Deactivates an active loop."""
687
+
688
+ def name(self) -> Text:
689
+ return ACTION_DEACTIVATE_LOOP_NAME
690
+
691
+ async def run(
692
+ self,
693
+ output_channel: "OutputChannel",
694
+ nlg: "NaturalLanguageGenerator",
695
+ tracker: "DialogueStateTracker",
696
+ domain: "Domain",
697
+ metadata: Optional[Dict[Text, Any]] = None,
698
+ ) -> List[Event]:
699
+ """Runs action. Please see parent class for the full docstring."""
700
+ return [ActiveLoop(None), SlotSet(REQUESTED_SLOT, None)]
701
+
702
+
703
+ class RemoteAction(Action):
704
+ def __init__(
705
+ self, name: Text, action_endpoint: Optional[EndpointConfig] = None
706
+ ) -> None:
707
+ self._name = name
708
+ self.action_endpoint = action_endpoint
709
+ self.executor = self._create_executor()
710
+
711
+ def _create_executor(self) -> CustomActionExecutor:
712
+ """Creates an executor based on the action endpoint configuration.
713
+
714
+ Returns:
715
+ An instance of CustomActionExecutor.
716
+
717
+ Raises:
718
+ RasaException: If no valid action endpoint is configured.
719
+ """
720
+
721
+ if not self.action_endpoint:
722
+ return NoEndpointCustomActionExecutor(self.name())
723
+
724
+ url_schema = get_url_schema(self.action_endpoint.url)
725
+
726
+ if url_schema == UrlSchema.GRPC:
727
+ return RetryCustomActionExecutor(
728
+ GRPCCustomActionExecutor(self.name(), self.action_endpoint)
729
+ )
730
+ elif (
731
+ url_schema == UrlSchema.HTTP
732
+ or url_schema == UrlSchema.HTTPS
733
+ or url_schema == UrlSchema.NOT_SPECIFIED
734
+ ):
735
+ return RetryCustomActionExecutor(
736
+ HTTPCustomActionExecutor(self.name(), self.action_endpoint)
737
+ )
738
+ raise RasaException(
739
+ f"Failed to create a custom action executor. "
740
+ f"Please make sure to include an action endpoint configuration in your "
741
+ f"endpoints configuration file. Make sure that for grpc, http and https "
742
+ f"an url schema is set. "
743
+ f"Found url '{self.action_endpoint.url}'."
744
+ )
745
+
746
+ @staticmethod
747
+ def action_response_format_spec() -> Dict[Text, Any]:
748
+ """Expected response schema for an Action endpoint.
749
+
750
+ Used for validation of the response returned from the
751
+ Action endpoint.
752
+ """
753
+ schema = {
754
+ "type": "object",
755
+ "properties": {
756
+ "events": EVENTS_SCHEMA,
757
+ "responses": {"type": "array", "items": {"type": "object"}},
758
+ },
759
+ }
760
+ return schema
761
+
762
+ def _validate_action_result(self, result: Dict[Text, Any]) -> bool:
763
+ from jsonschema import validate
764
+ from jsonschema import ValidationError
765
+
766
+ try:
767
+ validate(result, self.action_response_format_spec())
768
+ return True
769
+ except ValidationError as e:
770
+ e.message += (
771
+ f". Failed to validate Action server response from API, "
772
+ f"make sure your response from the Action endpoint is valid. "
773
+ f"For more information about the format visit "
774
+ f"{DOCS_BASE_URL}/custom-actions"
775
+ )
776
+ raise e
777
+
778
+ @staticmethod
779
+ async def _utter_responses(
780
+ responses: List[Dict[Text, Any]],
781
+ output_channel: "OutputChannel",
782
+ nlg: "NaturalLanguageGenerator",
783
+ tracker: "DialogueStateTracker",
784
+ ) -> List[BotUttered]:
785
+ """Use the responses generated by the action endpoint and utter them."""
786
+ bot_messages = []
787
+ for response in responses:
788
+ generated_response = response.pop("response", None)
789
+ if generated_response:
790
+ draft = await nlg.generate(
791
+ generated_response, tracker, output_channel.name(), **response
792
+ )
793
+ if not draft:
794
+ continue
795
+ draft["utter_action"] = generated_response
796
+ else:
797
+ draft = {}
798
+
799
+ buttons = response.pop("buttons", []) or []
800
+ if buttons:
801
+ draft.setdefault("buttons", [])
802
+ draft["buttons"].extend(buttons)
803
+
804
+ # Avoid overwriting `draft` values with empty values
805
+ response = {k: v for k, v in response.items() if v}
806
+ draft.update(response)
807
+ bot_messages.append(create_bot_utterance(draft))
808
+
809
+ return bot_messages
810
+
811
+ async def run(
812
+ self,
813
+ output_channel: "OutputChannel",
814
+ nlg: "NaturalLanguageGenerator",
815
+ tracker: "DialogueStateTracker",
816
+ domain: "Domain",
817
+ metadata: Optional[Dict[Text, Any]] = None,
818
+ ) -> List[Event]:
819
+ """Runs action. Please see parent class for the full docstring."""
820
+ response = await self.executor.run(tracker=tracker, domain=domain)
821
+ self._validate_action_result(response)
822
+
823
+ events_json = response.get("events", [])
824
+ responses = response.get("responses", [])
825
+ bot_messages = await self._utter_responses(
826
+ responses, output_channel, nlg, tracker
827
+ )
828
+
829
+ events = rasa.shared.core.events.deserialise_events(events_json)
830
+ return cast(List[Event], bot_messages) + events
831
+
832
+ def name(self) -> Text:
833
+ return self._name
834
+
835
+
836
+ class ActionRevertFallbackEvents(Action):
837
+ """Reverts events which were done during the `TwoStageFallbackPolicy`.
838
+
839
+ This reverts user messages and bot utterances done during a fallback
840
+ of the `TwoStageFallbackPolicy`. By doing so it is not necessary to
841
+ write custom stories for the different paths, but only of the happy
842
+ path. This is deprecated and can be removed once the
843
+ `TwoStageFallbackPolicy` is removed.
844
+ """
845
+
846
+ def name(self) -> Text:
847
+ return ACTION_REVERT_FALLBACK_EVENTS_NAME
848
+
849
+ async def run(
850
+ self,
851
+ output_channel: "OutputChannel",
852
+ nlg: "NaturalLanguageGenerator",
853
+ tracker: "DialogueStateTracker",
854
+ domain: "Domain",
855
+ metadata: Optional[Dict[Text, Any]] = None,
856
+ ) -> List[Event]:
857
+ """Runs action. Please see parent class for the full docstring."""
858
+ from rasa.core.policies.two_stage_fallback import has_user_rephrased
859
+
860
+ # User rephrased
861
+ if has_user_rephrased(tracker):
862
+ return _revert_successful_rephrasing(tracker)
863
+ # User affirmed
864
+ elif has_user_affirmed(tracker):
865
+ return _revert_affirmation_events(tracker)
866
+ else:
867
+ return []
868
+
869
+
870
+ class ActionUnlikelyIntent(Action):
871
+ """An action that indicates that the intent predicted by NLU is unexpected.
872
+
873
+ This action can be predicted by `UnexpecTEDIntentPolicy`.
874
+ """
875
+
876
+ def name(self) -> Text:
877
+ """Returns the name of the action."""
878
+ return ACTION_UNLIKELY_INTENT_NAME
879
+
880
+ async def run(
881
+ self,
882
+ output_channel: "OutputChannel",
883
+ nlg: "NaturalLanguageGenerator",
884
+ tracker: "DialogueStateTracker",
885
+ domain: "Domain",
886
+ metadata: Optional[Dict[Text, Any]] = None,
887
+ ) -> List[Event]:
888
+ """Runs action. Please see parent class for the full docstring."""
889
+ return []
890
+
891
+
892
+ def has_user_affirmed(tracker: "DialogueStateTracker") -> bool:
893
+ """Indicates if the last executed action is `action_default_ask_affirmation`."""
894
+ return tracker.last_executed_action_has(ACTION_DEFAULT_ASK_AFFIRMATION_NAME)
895
+
896
+
897
+ def _revert_affirmation_events(tracker: "DialogueStateTracker") -> List[Event]:
898
+ revert_events = _revert_single_affirmation_events()
899
+
900
+ # User affirms the rephrased intent
901
+ rephrased_intent = tracker.last_executed_action_has(
902
+ name=ACTION_DEFAULT_ASK_REPHRASE_NAME, skip=1
903
+ )
904
+ if rephrased_intent:
905
+ revert_events += _revert_rephrasing_events()
906
+
907
+ last_user_event = tracker.get_last_event_for(UserUttered)
908
+ if not last_user_event:
909
+ raise TypeError("Cannot find last event to revert to.")
910
+
911
+ last_user_event = copy.deepcopy(last_user_event)
912
+ # FIXME: better type annotation for `parse_data` would require
913
+ # a larger refactoring (e.g. switch to dataclass)
914
+ last_user_event.parse_data["intent"]["confidence"] = 1.0 # type: ignore[typeddict-item]
915
+
916
+ return revert_events + [last_user_event]
917
+
918
+
919
+ def _revert_single_affirmation_events() -> List[Event]:
920
+ return [
921
+ UserUtteranceReverted(), # revert affirmation and request
922
+ # revert original intent (has to be re-added later)
923
+ UserUtteranceReverted(),
924
+ # add action listen intent
925
+ ActionExecuted(action_name=ACTION_LISTEN_NAME),
926
+ ]
927
+
928
+
929
+ def _revert_successful_rephrasing(tracker: "DialogueStateTracker") -> List[Event]:
930
+ last_user_event = tracker.get_last_event_for(UserUttered)
931
+ if not last_user_event:
932
+ raise TypeError("Cannot find last event to revert to.")
933
+
934
+ last_user_event = copy.deepcopy(last_user_event)
935
+ return _revert_rephrasing_events() + [last_user_event]
936
+
937
+
938
+ def _revert_rephrasing_events() -> List[Event]:
939
+ return [
940
+ UserUtteranceReverted(), # remove rephrasing
941
+ # remove feedback and rephrase request
942
+ UserUtteranceReverted(),
943
+ # remove affirmation request and false intent
944
+ UserUtteranceReverted(),
945
+ # replace action with action listen
946
+ ActionExecuted(action_name=ACTION_LISTEN_NAME),
947
+ ]
948
+
949
+
950
+ class ActionDefaultAskAffirmation(Action):
951
+ """Default implementation which asks the user to affirm his intent.
952
+
953
+ It is suggested to overwrite this default action with a custom action
954
+ to have more meaningful prompts for the affirmations. E.g. have a
955
+ description of the intent instead of its identifier name.
956
+ """
957
+
958
+ def name(self) -> Text:
959
+ return ACTION_DEFAULT_ASK_AFFIRMATION_NAME
960
+
961
+ async def run(
962
+ self,
963
+ output_channel: "OutputChannel",
964
+ nlg: "NaturalLanguageGenerator",
965
+ tracker: "DialogueStateTracker",
966
+ domain: "Domain",
967
+ metadata: Optional[Dict[Text, Any]] = None,
968
+ ) -> List[Event]:
969
+ """Runs action. Please see parent class for the full docstring."""
970
+ latest_message = tracker.latest_message
971
+ if latest_message is None:
972
+ raise TypeError(
973
+ "Cannot find last user message for detecting fallback affirmation."
974
+ )
975
+
976
+ intent_to_affirm = latest_message.intent.get(INTENT_NAME_KEY)
977
+
978
+ # FIXME: better type annotation for `parse_data` would require
979
+ # a larger refactoring (e.g. switch to dataclass)
980
+ intent_ranking = cast(
981
+ List["IntentPrediction"],
982
+ latest_message.parse_data.get(INTENT_RANKING_KEY) or [],
983
+ )
984
+ if (
985
+ intent_to_affirm == DEFAULT_NLU_FALLBACK_INTENT_NAME
986
+ and len(intent_ranking) > 1
987
+ ):
988
+ intent_to_affirm = intent_ranking[1][INTENT_NAME_KEY] # type: ignore[literal-required]
989
+
990
+ affirmation_message = f"Did you mean '{intent_to_affirm}'?"
991
+
992
+ message = {
993
+ "text": affirmation_message,
994
+ "buttons": [
995
+ {"title": "Yes", "payload": f"/{intent_to_affirm}"},
996
+ {"title": "No", "payload": f"/{USER_INTENT_OUT_OF_SCOPE}"},
997
+ ],
998
+ "utter_action": self.name(),
999
+ }
1000
+
1001
+ return [create_bot_utterance(message)]
1002
+
1003
+
1004
+ class ActionDefaultAskRephrase(ActionBotResponse):
1005
+ """Default implementation which asks the user to rephrase his intent."""
1006
+
1007
+ def name(self) -> Text:
1008
+ """Returns action default ask rephrase name."""
1009
+ return ACTION_DEFAULT_ASK_REPHRASE_NAME
1010
+
1011
+ def __init__(self) -> None:
1012
+ """Initializes action default ask rephrase."""
1013
+ super().__init__("utter_ask_rephrase", silent_fail=True)
1014
+
1015
+
1016
+ class ActionSendText(Action):
1017
+ """Sends a text message to the output channel."""
1018
+
1019
+ def name(self) -> Text:
1020
+ return ACTION_SEND_TEXT_NAME
1021
+
1022
+ async def run(
1023
+ self,
1024
+ output_channel: "OutputChannel",
1025
+ nlg: "NaturalLanguageGenerator",
1026
+ tracker: "DialogueStateTracker",
1027
+ domain: "Domain",
1028
+ metadata: Optional[Dict[Text, Any]] = None,
1029
+ ) -> List[Event]:
1030
+ """Runs action. Please see parent class for the full docstring."""
1031
+ fallback = {"text": ""}
1032
+ message = metadata.get("message", fallback) if metadata else fallback
1033
+ return [create_bot_utterance(message)]
1034
+
1035
+
1036
+ class ActionExtractSlots(Action):
1037
+ """Default action that runs after each user turn.
1038
+
1039
+ Action is executed automatically in MessageProcessor.handle_message(...)
1040
+ before the next predicted action is run.
1041
+
1042
+ Set slots to extracted values from user message
1043
+ according to assigned slot mappings.
1044
+ """
1045
+
1046
+ def __init__(self, action_endpoint: Optional[EndpointConfig]) -> None:
1047
+ """Initializes default action extract slots."""
1048
+ self._action_endpoint = action_endpoint
1049
+
1050
+ def name(self) -> Text:
1051
+ """Returns action_extract_slots name."""
1052
+ return ACTION_EXTRACT_SLOTS
1053
+
1054
+ async def _run_custom_action(
1055
+ self,
1056
+ custom_action: Text,
1057
+ output_channel: "OutputChannel",
1058
+ nlg: "NaturalLanguageGenerator",
1059
+ tracker: "DialogueStateTracker",
1060
+ domain: "Domain",
1061
+ ) -> List[Event]:
1062
+ slot_events: List[Event] = []
1063
+ remote_action = RemoteAction(custom_action, self._action_endpoint)
1064
+ disallowed_types = set()
1065
+
1066
+ try:
1067
+ custom_events = await remote_action.run(
1068
+ output_channel, nlg, tracker, domain
1069
+ )
1070
+ for event in custom_events:
1071
+ if isinstance(event, SlotSet):
1072
+ slot_events.append(event)
1073
+ elif isinstance(event, BotUttered):
1074
+ slot_events.append(event)
1075
+ else:
1076
+ disallowed_types.add(event.type_name)
1077
+ except (RasaException, ClientResponseError) as e:
1078
+ logger.warning(
1079
+ f"Failed to execute custom action '{custom_action}' "
1080
+ f"as a result of error '{e!s}'. The default action "
1081
+ f"'{self.name()}' failed to fill slots with custom "
1082
+ f"mappings."
1083
+ )
1084
+
1085
+ for type_name in disallowed_types:
1086
+ logger.info(
1087
+ f"Running custom action '{custom_action}' has resulted "
1088
+ f"in an event of type '{type_name}'. This is "
1089
+ f"disallowed and the tracker will not be "
1090
+ f"updated with this event."
1091
+ )
1092
+
1093
+ return slot_events
1094
+
1095
+ async def _execute_custom_action(
1096
+ self,
1097
+ mapping: Dict[Text, Any],
1098
+ executed_custom_actions: Set[Text],
1099
+ output_channel: "OutputChannel",
1100
+ nlg: "NaturalLanguageGenerator",
1101
+ tracker: "DialogueStateTracker",
1102
+ domain: "Domain",
1103
+ calm_custom_action_names: Optional[Set[str]] = None,
1104
+ ) -> Tuple[List[Event], Set[Text]]:
1105
+ custom_action = mapping.get("action")
1106
+
1107
+ if not custom_action or custom_action in executed_custom_actions:
1108
+ return [], executed_custom_actions
1109
+
1110
+ if (
1111
+ calm_custom_action_names is not None
1112
+ and custom_action in calm_custom_action_names
1113
+ ):
1114
+ return [], executed_custom_actions
1115
+
1116
+ slot_events = await self._run_custom_action(
1117
+ custom_action, output_channel, nlg, tracker, domain
1118
+ )
1119
+
1120
+ executed_custom_actions.add(custom_action)
1121
+
1122
+ return slot_events, executed_custom_actions
1123
+
1124
+ async def _execute_validation_action(
1125
+ self,
1126
+ extraction_events: List[Event],
1127
+ output_channel: "OutputChannel",
1128
+ nlg: "NaturalLanguageGenerator",
1129
+ tracker: "DialogueStateTracker",
1130
+ domain: "Domain",
1131
+ ) -> List[Event]:
1132
+ slot_events: List[SlotSet] = [
1133
+ event for event in extraction_events if isinstance(event, SlotSet)
1134
+ ]
1135
+
1136
+ slot_candidates = "\n".join([e.key for e in slot_events])
1137
+ logger.debug(f"Validating extracted slots: {slot_candidates}")
1138
+
1139
+ if ACTION_VALIDATE_SLOT_MAPPINGS not in domain.user_actions:
1140
+ return cast(List[Event], slot_events)
1141
+
1142
+ _tracker = DialogueStateTracker.from_events(
1143
+ tracker.sender_id,
1144
+ tracker.events_after_latest_restart() + cast(List[Event], slot_events),
1145
+ slots=domain.slots,
1146
+ )
1147
+ validate_events = await self._run_custom_action(
1148
+ ACTION_VALIDATE_SLOT_MAPPINGS, output_channel, nlg, _tracker, domain
1149
+ )
1150
+ validated_slot_names = [
1151
+ event.key for event in validate_events if isinstance(event, SlotSet)
1152
+ ]
1153
+
1154
+ # If the custom action doesn't return a SlotSet event for an extracted slot
1155
+ # candidate we assume that it was valid. The custom action has to return a
1156
+ # SlotSet(slot_name, None) event to mark a Slot as invalid.
1157
+ return validate_events + [
1158
+ event for event in slot_events if event.key not in validated_slot_names
1159
+ ]
1160
+
1161
+ async def run(
1162
+ self,
1163
+ output_channel: "OutputChannel",
1164
+ nlg: "NaturalLanguageGenerator",
1165
+ tracker: "DialogueStateTracker",
1166
+ domain: "Domain",
1167
+ metadata: Optional[Dict[Text, Any]] = None,
1168
+ ) -> List[Event]:
1169
+ """Runs action. Please see parent class for the full docstring."""
1170
+ slot_events: List[Event] = []
1171
+ executed_custom_actions: Set[Text] = set()
1172
+
1173
+ user_slots = [
1174
+ slot
1175
+ for slot in domain.slots
1176
+ if slot.name not in DEFAULT_SLOT_NAMES | KNOWLEDGE_BASE_SLOT_NAMES
1177
+ ]
1178
+
1179
+ calm_slot_names = set()
1180
+ calm_custom_action_names = None
1181
+ flows = None
1182
+
1183
+ if metadata is not None:
1184
+ flows = metadata.get("all_flows")
1185
+
1186
+ if flows is not None:
1187
+ flows = FlowsList.from_json(flows)
1188
+ calm_slot_names = flows.available_slot_names()
1189
+ calm_custom_action_names = flows.available_custom_actions()
1190
+
1191
+ slot_filling_manager = SlotFillingManager(
1192
+ domain, tracker, action_endpoint=self._action_endpoint
1193
+ )
1194
+
1195
+ for slot in user_slots:
1196
+ if slot.name in calm_slot_names:
1197
+ continue
1198
+
1199
+ slot_value, is_extracted = extract_slot_value(slot, slot_filling_manager)
1200
+ if is_extracted:
1201
+ slot_events.append(SlotSet(slot.name, slot_value))
1202
+
1203
+ for mapping in slot.mappings:
1204
+ mapping_type = SlotMappingType(mapping.get(MAPPING_TYPE))
1205
+ should_fill_custom_slot = mapping_type == SlotMappingType.CUSTOM
1206
+
1207
+ if should_fill_custom_slot:
1208
+ (
1209
+ custom_evts,
1210
+ executed_custom_actions,
1211
+ ) = await self._execute_custom_action(
1212
+ mapping,
1213
+ executed_custom_actions,
1214
+ output_channel,
1215
+ nlg,
1216
+ tracker,
1217
+ domain,
1218
+ calm_custom_action_names,
1219
+ )
1220
+ slot_events.extend(custom_evts)
1221
+
1222
+ validated_events = await self._execute_validation_action(
1223
+ slot_events, output_channel, nlg, tracker, domain
1224
+ )
1225
+ return validated_events