rasa-pro 3.11.3a1.dev2__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 (784) hide show
  1. README.md +41 -0
  2. rasa/__init__.py +9 -0
  3. rasa/__main__.py +177 -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 +160 -0
  12. rasa/cli/__init__.py +5 -0
  13. rasa/cli/arguments/__init__.py +0 -0
  14. rasa/cli/arguments/data.py +106 -0
  15. rasa/cli/arguments/default_arguments.py +207 -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 +219 -0
  20. rasa/cli/arguments/shell.py +17 -0
  21. rasa/cli/arguments/test.py +211 -0
  22. rasa/cli/arguments/train.py +279 -0
  23. rasa/cli/arguments/visualize.py +34 -0
  24. rasa/cli/arguments/x.py +30 -0
  25. rasa/cli/data.py +354 -0
  26. rasa/cli/e2e_test.py +259 -0
  27. rasa/cli/evaluate.py +222 -0
  28. rasa/cli/export.py +250 -0
  29. rasa/cli/inspect.py +75 -0
  30. rasa/cli/interactive.py +166 -0
  31. rasa/cli/license.py +65 -0
  32. rasa/cli/llm_fine_tuning.py +403 -0
  33. rasa/cli/markers.py +78 -0
  34. rasa/cli/project_templates/__init__.py +0 -0
  35. rasa/cli/project_templates/calm/actions/__init__.py +0 -0
  36. rasa/cli/project_templates/calm/actions/action_template.py +27 -0
  37. rasa/cli/project_templates/calm/actions/add_contact.py +30 -0
  38. rasa/cli/project_templates/calm/actions/db.py +57 -0
  39. rasa/cli/project_templates/calm/actions/list_contacts.py +22 -0
  40. rasa/cli/project_templates/calm/actions/remove_contact.py +35 -0
  41. rasa/cli/project_templates/calm/config.yml +10 -0
  42. rasa/cli/project_templates/calm/credentials.yml +33 -0
  43. rasa/cli/project_templates/calm/data/flows/add_contact.yml +31 -0
  44. rasa/cli/project_templates/calm/data/flows/list_contacts.yml +14 -0
  45. rasa/cli/project_templates/calm/data/flows/remove_contact.yml +29 -0
  46. rasa/cli/project_templates/calm/db/contacts.json +10 -0
  47. rasa/cli/project_templates/calm/domain/add_contact.yml +39 -0
  48. rasa/cli/project_templates/calm/domain/list_contacts.yml +17 -0
  49. rasa/cli/project_templates/calm/domain/remove_contact.yml +38 -0
  50. rasa/cli/project_templates/calm/domain/shared.yml +10 -0
  51. rasa/cli/project_templates/calm/e2e_tests/cancelations/user_cancels_during_a_correction.yml +16 -0
  52. rasa/cli/project_templates/calm/e2e_tests/cancelations/user_changes_mind_on_a_whim.yml +7 -0
  53. rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_handle.yml +20 -0
  54. rasa/cli/project_templates/calm/e2e_tests/corrections/user_corrects_contact_name.yml +19 -0
  55. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_adds_contact_to_their_list.yml +15 -0
  56. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_lists_contacts.yml +5 -0
  57. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact.yml +11 -0
  58. rasa/cli/project_templates/calm/e2e_tests/happy_paths/user_removes_contact_from_list.yml +12 -0
  59. rasa/cli/project_templates/calm/endpoints.yml +58 -0
  60. rasa/cli/project_templates/default/actions/__init__.py +0 -0
  61. rasa/cli/project_templates/default/actions/actions.py +27 -0
  62. rasa/cli/project_templates/default/config.yml +44 -0
  63. rasa/cli/project_templates/default/credentials.yml +33 -0
  64. rasa/cli/project_templates/default/data/nlu.yml +91 -0
  65. rasa/cli/project_templates/default/data/rules.yml +13 -0
  66. rasa/cli/project_templates/default/data/stories.yml +30 -0
  67. rasa/cli/project_templates/default/domain.yml +34 -0
  68. rasa/cli/project_templates/default/endpoints.yml +42 -0
  69. rasa/cli/project_templates/default/tests/test_stories.yml +91 -0
  70. rasa/cli/project_templates/tutorial/actions/__init__.py +0 -0
  71. rasa/cli/project_templates/tutorial/actions/actions.py +22 -0
  72. rasa/cli/project_templates/tutorial/config.yml +12 -0
  73. rasa/cli/project_templates/tutorial/credentials.yml +33 -0
  74. rasa/cli/project_templates/tutorial/data/flows.yml +8 -0
  75. rasa/cli/project_templates/tutorial/data/patterns.yml +11 -0
  76. rasa/cli/project_templates/tutorial/domain.yml +35 -0
  77. rasa/cli/project_templates/tutorial/endpoints.yml +55 -0
  78. rasa/cli/run.py +143 -0
  79. rasa/cli/scaffold.py +273 -0
  80. rasa/cli/shell.py +141 -0
  81. rasa/cli/studio/__init__.py +0 -0
  82. rasa/cli/studio/download.py +62 -0
  83. rasa/cli/studio/studio.py +296 -0
  84. rasa/cli/studio/train.py +59 -0
  85. rasa/cli/studio/upload.py +62 -0
  86. rasa/cli/telemetry.py +102 -0
  87. rasa/cli/test.py +280 -0
  88. rasa/cli/train.py +278 -0
  89. rasa/cli/utils.py +484 -0
  90. rasa/cli/visualize.py +40 -0
  91. rasa/cli/x.py +206 -0
  92. rasa/constants.py +45 -0
  93. rasa/core/__init__.py +17 -0
  94. rasa/core/actions/__init__.py +0 -0
  95. rasa/core/actions/action.py +1320 -0
  96. rasa/core/actions/action_clean_stack.py +59 -0
  97. rasa/core/actions/action_exceptions.py +24 -0
  98. rasa/core/actions/action_hangup.py +29 -0
  99. rasa/core/actions/action_repeat_bot_messages.py +89 -0
  100. rasa/core/actions/action_run_slot_rejections.py +210 -0
  101. rasa/core/actions/action_trigger_chitchat.py +31 -0
  102. rasa/core/actions/action_trigger_flow.py +109 -0
  103. rasa/core/actions/action_trigger_search.py +31 -0
  104. rasa/core/actions/constants.py +5 -0
  105. rasa/core/actions/custom_action_executor.py +191 -0
  106. rasa/core/actions/direct_custom_actions_executor.py +109 -0
  107. rasa/core/actions/e2e_stub_custom_action_executor.py +72 -0
  108. rasa/core/actions/forms.py +741 -0
  109. rasa/core/actions/grpc_custom_action_executor.py +251 -0
  110. rasa/core/actions/http_custom_action_executor.py +145 -0
  111. rasa/core/actions/loops.py +114 -0
  112. rasa/core/actions/two_stage_fallback.py +186 -0
  113. rasa/core/agent.py +559 -0
  114. rasa/core/auth_retry_tracker_store.py +122 -0
  115. rasa/core/brokers/__init__.py +0 -0
  116. rasa/core/brokers/broker.py +126 -0
  117. rasa/core/brokers/file.py +58 -0
  118. rasa/core/brokers/kafka.py +324 -0
  119. rasa/core/brokers/pika.py +388 -0
  120. rasa/core/brokers/sql.py +86 -0
  121. rasa/core/channels/__init__.py +61 -0
  122. rasa/core/channels/botframework.py +338 -0
  123. rasa/core/channels/callback.py +84 -0
  124. rasa/core/channels/channel.py +456 -0
  125. rasa/core/channels/console.py +241 -0
  126. rasa/core/channels/development_inspector.py +200 -0
  127. rasa/core/channels/facebook.py +419 -0
  128. rasa/core/channels/hangouts.py +329 -0
  129. rasa/core/channels/inspector/.eslintrc.cjs +25 -0
  130. rasa/core/channels/inspector/.gitignore +23 -0
  131. rasa/core/channels/inspector/README.md +54 -0
  132. rasa/core/channels/inspector/assets/favicon.ico +0 -0
  133. rasa/core/channels/inspector/assets/rasa-chat.js +2 -0
  134. rasa/core/channels/inspector/custom.d.ts +3 -0
  135. rasa/core/channels/inspector/dist/assets/arc-861ddd57.js +1 -0
  136. rasa/core/channels/inspector/dist/assets/array-9f3ba611.js +1 -0
  137. rasa/core/channels/inspector/dist/assets/c4Diagram-d0fbc5ce-921f02db.js +10 -0
  138. rasa/core/channels/inspector/dist/assets/classDiagram-936ed81e-b436c4f8.js +2 -0
  139. rasa/core/channels/inspector/dist/assets/classDiagram-v2-c3cb15f1-511a23cb.js +2 -0
  140. rasa/core/channels/inspector/dist/assets/createText-62fc7601-ef476ecd.js +7 -0
  141. rasa/core/channels/inspector/dist/assets/edges-f2ad444c-f1878e0a.js +4 -0
  142. rasa/core/channels/inspector/dist/assets/erDiagram-9d236eb7-fac75185.js +51 -0
  143. rasa/core/channels/inspector/dist/assets/flowDb-1972c806-201c5bbc.js +6 -0
  144. rasa/core/channels/inspector/dist/assets/flowDiagram-7ea5b25a-f904ae41.js +4 -0
  145. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +1 -0
  146. rasa/core/channels/inspector/dist/assets/flowchart-elk-definition-abe16c3d-1813da66.js +139 -0
  147. rasa/core/channels/inspector/dist/assets/ganttDiagram-9b5ea136-872af172.js +266 -0
  148. rasa/core/channels/inspector/dist/assets/gitGraphDiagram-99d0ae7c-34a0af5a.js +70 -0
  149. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-128cfa44.ttf +0 -0
  150. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-21dbcb97.woff +0 -0
  151. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-222b5e26.svg +329 -0
  152. rasa/core/channels/inspector/dist/assets/ibm-plex-mono-v4-latin-regular-9ad89b2a.woff2 +0 -0
  153. rasa/core/channels/inspector/dist/assets/index-2c4b9a3b-42ba3e3d.js +1 -0
  154. rasa/core/channels/inspector/dist/assets/index-37817b51.js +1317 -0
  155. rasa/core/channels/inspector/dist/assets/index-3ee28881.css +1 -0
  156. rasa/core/channels/inspector/dist/assets/infoDiagram-736b4530-6b731386.js +7 -0
  157. rasa/core/channels/inspector/dist/assets/init-77b53fdd.js +1 -0
  158. rasa/core/channels/inspector/dist/assets/journeyDiagram-df861f2b-e8579ac6.js +139 -0
  159. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-60c05ee4.woff +0 -0
  160. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-8335d9b8.svg +438 -0
  161. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-9cc39c75.ttf +0 -0
  162. rasa/core/channels/inspector/dist/assets/lato-v14-latin-700-ead13ccf.woff2 +0 -0
  163. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-16705655.woff2 +0 -0
  164. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-5aeb07f9.woff +0 -0
  165. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9c459044.ttf +0 -0
  166. rasa/core/channels/inspector/dist/assets/lato-v14-latin-regular-9e2898a4.svg +435 -0
  167. rasa/core/channels/inspector/dist/assets/layout-89e6403a.js +1 -0
  168. rasa/core/channels/inspector/dist/assets/line-dc73d3fc.js +1 -0
  169. rasa/core/channels/inspector/dist/assets/linear-f5b1d2bc.js +1 -0
  170. rasa/core/channels/inspector/dist/assets/mindmap-definition-beec6740-82cb74fa.js +109 -0
  171. rasa/core/channels/inspector/dist/assets/ordinal-ba9b4969.js +1 -0
  172. rasa/core/channels/inspector/dist/assets/path-53f90ab3.js +1 -0
  173. rasa/core/channels/inspector/dist/assets/pieDiagram-dbbf0591-bdf5f29b.js +35 -0
  174. rasa/core/channels/inspector/dist/assets/quadrantDiagram-4d7f4fd6-c7a0cbe4.js +7 -0
  175. rasa/core/channels/inspector/dist/assets/requirementDiagram-6fc4c22a-7ec5410f.js +52 -0
  176. rasa/core/channels/inspector/dist/assets/sankeyDiagram-8f13d901-caee5554.js +8 -0
  177. rasa/core/channels/inspector/dist/assets/sequenceDiagram-b655622a-2935f8db.js +122 -0
  178. rasa/core/channels/inspector/dist/assets/stateDiagram-59f0c015-8f5d9693.js +1 -0
  179. rasa/core/channels/inspector/dist/assets/stateDiagram-v2-2b26beab-d565d1de.js +1 -0
  180. rasa/core/channels/inspector/dist/assets/styles-080da4f6-75ad421d.js +110 -0
  181. rasa/core/channels/inspector/dist/assets/styles-3dcbcfbf-7e764226.js +159 -0
  182. rasa/core/channels/inspector/dist/assets/styles-9c745c82-7a4e0e61.js +207 -0
  183. rasa/core/channels/inspector/dist/assets/svgDrawCommon-4835440b-4019d1bf.js +1 -0
  184. rasa/core/channels/inspector/dist/assets/timeline-definition-5b62e21b-01ea12df.js +61 -0
  185. rasa/core/channels/inspector/dist/assets/xychartDiagram-2b33534f-89407137.js +7 -0
  186. rasa/core/channels/inspector/dist/index.html +42 -0
  187. rasa/core/channels/inspector/index.html +40 -0
  188. rasa/core/channels/inspector/jest.config.ts +13 -0
  189. rasa/core/channels/inspector/package.json +52 -0
  190. rasa/core/channels/inspector/setupTests.ts +2 -0
  191. rasa/core/channels/inspector/src/App.tsx +220 -0
  192. rasa/core/channels/inspector/src/components/Chat.tsx +95 -0
  193. rasa/core/channels/inspector/src/components/DiagramFlow.tsx +108 -0
  194. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +187 -0
  195. rasa/core/channels/inspector/src/components/DialogueStack.tsx +136 -0
  196. rasa/core/channels/inspector/src/components/ExpandIcon.tsx +16 -0
  197. rasa/core/channels/inspector/src/components/FullscreenButton.tsx +45 -0
  198. rasa/core/channels/inspector/src/components/LoadingSpinner.tsx +22 -0
  199. rasa/core/channels/inspector/src/components/NoActiveFlow.tsx +21 -0
  200. rasa/core/channels/inspector/src/components/RasaLogo.tsx +32 -0
  201. rasa/core/channels/inspector/src/components/SaraDiagrams.tsx +39 -0
  202. rasa/core/channels/inspector/src/components/Slots.tsx +91 -0
  203. rasa/core/channels/inspector/src/components/Welcome.tsx +54 -0
  204. rasa/core/channels/inspector/src/helpers/audiostream.ts +191 -0
  205. rasa/core/channels/inspector/src/helpers/formatters.test.ts +392 -0
  206. rasa/core/channels/inspector/src/helpers/formatters.ts +306 -0
  207. rasa/core/channels/inspector/src/helpers/utils.ts +127 -0
  208. rasa/core/channels/inspector/src/main.tsx +13 -0
  209. rasa/core/channels/inspector/src/theme/Button/Button.ts +29 -0
  210. rasa/core/channels/inspector/src/theme/Heading/Heading.ts +31 -0
  211. rasa/core/channels/inspector/src/theme/Input/Input.ts +27 -0
  212. rasa/core/channels/inspector/src/theme/Link/Link.ts +10 -0
  213. rasa/core/channels/inspector/src/theme/Modal/Modal.ts +47 -0
  214. rasa/core/channels/inspector/src/theme/Table/Table.tsx +38 -0
  215. rasa/core/channels/inspector/src/theme/Tooltip/Tooltip.ts +12 -0
  216. rasa/core/channels/inspector/src/theme/base/breakpoints.ts +8 -0
  217. rasa/core/channels/inspector/src/theme/base/colors.ts +88 -0
  218. rasa/core/channels/inspector/src/theme/base/fonts/fontFaces.css +29 -0
  219. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.eot +0 -0
  220. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.svg +329 -0
  221. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.ttf +0 -0
  222. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff +0 -0
  223. rasa/core/channels/inspector/src/theme/base/fonts/ibm-plex-mono-v4-latin/ibm-plex-mono-v4-latin-regular.woff2 +0 -0
  224. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.eot +0 -0
  225. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.svg +438 -0
  226. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.ttf +0 -0
  227. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff +0 -0
  228. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-700.woff2 +0 -0
  229. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.eot +0 -0
  230. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.svg +435 -0
  231. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.ttf +0 -0
  232. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff +0 -0
  233. rasa/core/channels/inspector/src/theme/base/fonts/lato-v14-latin/lato-v14-latin-regular.woff2 +0 -0
  234. rasa/core/channels/inspector/src/theme/base/radii.ts +9 -0
  235. rasa/core/channels/inspector/src/theme/base/shadows.ts +7 -0
  236. rasa/core/channels/inspector/src/theme/base/sizes.ts +7 -0
  237. rasa/core/channels/inspector/src/theme/base/space.ts +15 -0
  238. rasa/core/channels/inspector/src/theme/base/styles.ts +13 -0
  239. rasa/core/channels/inspector/src/theme/base/typography.ts +24 -0
  240. rasa/core/channels/inspector/src/theme/base/zIndices.ts +19 -0
  241. rasa/core/channels/inspector/src/theme/index.ts +101 -0
  242. rasa/core/channels/inspector/src/types.ts +84 -0
  243. rasa/core/channels/inspector/src/vite-env.d.ts +1 -0
  244. rasa/core/channels/inspector/tests/__mocks__/fileMock.ts +1 -0
  245. rasa/core/channels/inspector/tests/__mocks__/matchMedia.ts +16 -0
  246. rasa/core/channels/inspector/tests/__mocks__/styleMock.ts +1 -0
  247. rasa/core/channels/inspector/tests/renderWithProviders.tsx +14 -0
  248. rasa/core/channels/inspector/tsconfig.json +26 -0
  249. rasa/core/channels/inspector/tsconfig.node.json +10 -0
  250. rasa/core/channels/inspector/vite.config.ts +8 -0
  251. rasa/core/channels/inspector/yarn.lock +6249 -0
  252. rasa/core/channels/mattermost.py +229 -0
  253. rasa/core/channels/rasa_chat.py +126 -0
  254. rasa/core/channels/rest.py +230 -0
  255. rasa/core/channels/rocketchat.py +174 -0
  256. rasa/core/channels/slack.py +620 -0
  257. rasa/core/channels/socketio.py +306 -0
  258. rasa/core/channels/telegram.py +298 -0
  259. rasa/core/channels/twilio.py +169 -0
  260. rasa/core/channels/vier_cvg.py +374 -0
  261. rasa/core/channels/voice_ready/__init__.py +0 -0
  262. rasa/core/channels/voice_ready/audiocodes.py +501 -0
  263. rasa/core/channels/voice_ready/jambonz.py +121 -0
  264. rasa/core/channels/voice_ready/jambonz_protocol.py +396 -0
  265. rasa/core/channels/voice_ready/twilio_voice.py +403 -0
  266. rasa/core/channels/voice_ready/utils.py +37 -0
  267. rasa/core/channels/voice_stream/__init__.py +0 -0
  268. rasa/core/channels/voice_stream/asr/__init__.py +0 -0
  269. rasa/core/channels/voice_stream/asr/asr_engine.py +89 -0
  270. rasa/core/channels/voice_stream/asr/asr_event.py +18 -0
  271. rasa/core/channels/voice_stream/asr/azure.py +130 -0
  272. rasa/core/channels/voice_stream/asr/deepgram.py +90 -0
  273. rasa/core/channels/voice_stream/audio_bytes.py +8 -0
  274. rasa/core/channels/voice_stream/browser_audio.py +107 -0
  275. rasa/core/channels/voice_stream/call_state.py +23 -0
  276. rasa/core/channels/voice_stream/tts/__init__.py +0 -0
  277. rasa/core/channels/voice_stream/tts/azure.py +106 -0
  278. rasa/core/channels/voice_stream/tts/cartesia.py +118 -0
  279. rasa/core/channels/voice_stream/tts/tts_cache.py +27 -0
  280. rasa/core/channels/voice_stream/tts/tts_engine.py +58 -0
  281. rasa/core/channels/voice_stream/twilio_media_streams.py +173 -0
  282. rasa/core/channels/voice_stream/util.py +57 -0
  283. rasa/core/channels/voice_stream/voice_channel.py +427 -0
  284. rasa/core/channels/webexteams.py +134 -0
  285. rasa/core/concurrent_lock_store.py +210 -0
  286. rasa/core/constants.py +112 -0
  287. rasa/core/evaluation/__init__.py +0 -0
  288. rasa/core/evaluation/marker.py +267 -0
  289. rasa/core/evaluation/marker_base.py +923 -0
  290. rasa/core/evaluation/marker_stats.py +293 -0
  291. rasa/core/evaluation/marker_tracker_loader.py +103 -0
  292. rasa/core/exceptions.py +29 -0
  293. rasa/core/exporter.py +284 -0
  294. rasa/core/featurizers/__init__.py +0 -0
  295. rasa/core/featurizers/precomputation.py +410 -0
  296. rasa/core/featurizers/single_state_featurizer.py +421 -0
  297. rasa/core/featurizers/tracker_featurizers.py +1262 -0
  298. rasa/core/http_interpreter.py +89 -0
  299. rasa/core/information_retrieval/__init__.py +7 -0
  300. rasa/core/information_retrieval/faiss.py +124 -0
  301. rasa/core/information_retrieval/information_retrieval.py +137 -0
  302. rasa/core/information_retrieval/milvus.py +59 -0
  303. rasa/core/information_retrieval/qdrant.py +96 -0
  304. rasa/core/jobs.py +63 -0
  305. rasa/core/lock.py +139 -0
  306. rasa/core/lock_store.py +343 -0
  307. rasa/core/migrate.py +403 -0
  308. rasa/core/nlg/__init__.py +3 -0
  309. rasa/core/nlg/callback.py +146 -0
  310. rasa/core/nlg/contextual_response_rephraser.py +379 -0
  311. rasa/core/nlg/generator.py +230 -0
  312. rasa/core/nlg/interpolator.py +143 -0
  313. rasa/core/nlg/response.py +155 -0
  314. rasa/core/nlg/summarize.py +70 -0
  315. rasa/core/persistor.py +538 -0
  316. rasa/core/policies/__init__.py +0 -0
  317. rasa/core/policies/ensemble.py +329 -0
  318. rasa/core/policies/enterprise_search_policy.py +973 -0
  319. rasa/core/policies/enterprise_search_prompt_template.jinja2 +25 -0
  320. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +60 -0
  321. rasa/core/policies/flow_policy.py +205 -0
  322. rasa/core/policies/flows/__init__.py +0 -0
  323. rasa/core/policies/flows/flow_exceptions.py +44 -0
  324. rasa/core/policies/flows/flow_executor.py +778 -0
  325. rasa/core/policies/flows/flow_step_result.py +43 -0
  326. rasa/core/policies/intentless_policy.py +1031 -0
  327. rasa/core/policies/intentless_prompt_template.jinja2 +22 -0
  328. rasa/core/policies/memoization.py +538 -0
  329. rasa/core/policies/policy.py +725 -0
  330. rasa/core/policies/rule_policy.py +1273 -0
  331. rasa/core/policies/ted_policy.py +2169 -0
  332. rasa/core/policies/unexpected_intent_policy.py +1022 -0
  333. rasa/core/processor.py +1465 -0
  334. rasa/core/run.py +342 -0
  335. rasa/core/secrets_manager/__init__.py +0 -0
  336. rasa/core/secrets_manager/constants.py +36 -0
  337. rasa/core/secrets_manager/endpoints.py +391 -0
  338. rasa/core/secrets_manager/factory.py +241 -0
  339. rasa/core/secrets_manager/secret_manager.py +262 -0
  340. rasa/core/secrets_manager/vault.py +584 -0
  341. rasa/core/test.py +1335 -0
  342. rasa/core/tracker_store.py +1703 -0
  343. rasa/core/train.py +105 -0
  344. rasa/core/training/__init__.py +89 -0
  345. rasa/core/training/converters/__init__.py +0 -0
  346. rasa/core/training/converters/responses_prefix_converter.py +119 -0
  347. rasa/core/training/interactive.py +1744 -0
  348. rasa/core/training/story_conflict.py +381 -0
  349. rasa/core/training/training.py +93 -0
  350. rasa/core/utils.py +366 -0
  351. rasa/core/visualize.py +70 -0
  352. rasa/dialogue_understanding/__init__.py +0 -0
  353. rasa/dialogue_understanding/coexistence/__init__.py +0 -0
  354. rasa/dialogue_understanding/coexistence/constants.py +4 -0
  355. rasa/dialogue_understanding/coexistence/intent_based_router.py +196 -0
  356. rasa/dialogue_understanding/coexistence/llm_based_router.py +327 -0
  357. rasa/dialogue_understanding/coexistence/router_template.jinja2 +12 -0
  358. rasa/dialogue_understanding/commands/__init__.py +61 -0
  359. rasa/dialogue_understanding/commands/can_not_handle_command.py +70 -0
  360. rasa/dialogue_understanding/commands/cancel_flow_command.py +125 -0
  361. rasa/dialogue_understanding/commands/change_flow_command.py +44 -0
  362. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +57 -0
  363. rasa/dialogue_understanding/commands/clarify_command.py +86 -0
  364. rasa/dialogue_understanding/commands/command.py +85 -0
  365. rasa/dialogue_understanding/commands/correct_slots_command.py +297 -0
  366. rasa/dialogue_understanding/commands/error_command.py +79 -0
  367. rasa/dialogue_understanding/commands/free_form_answer_command.py +9 -0
  368. rasa/dialogue_understanding/commands/handle_code_change_command.py +73 -0
  369. rasa/dialogue_understanding/commands/human_handoff_command.py +66 -0
  370. rasa/dialogue_understanding/commands/knowledge_answer_command.py +57 -0
  371. rasa/dialogue_understanding/commands/noop_command.py +54 -0
  372. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +60 -0
  373. rasa/dialogue_understanding/commands/restart_command.py +58 -0
  374. rasa/dialogue_understanding/commands/session_end_command.py +61 -0
  375. rasa/dialogue_understanding/commands/session_start_command.py +59 -0
  376. rasa/dialogue_understanding/commands/set_slot_command.py +160 -0
  377. rasa/dialogue_understanding/commands/skip_question_command.py +75 -0
  378. rasa/dialogue_understanding/commands/start_flow_command.py +107 -0
  379. rasa/dialogue_understanding/commands/user_silence_command.py +59 -0
  380. rasa/dialogue_understanding/commands/utils.py +45 -0
  381. rasa/dialogue_understanding/generator/__init__.py +21 -0
  382. rasa/dialogue_understanding/generator/command_generator.py +472 -0
  383. rasa/dialogue_understanding/generator/constants.py +27 -0
  384. rasa/dialogue_understanding/generator/flow_document_template.jinja2 +4 -0
  385. rasa/dialogue_understanding/generator/flow_retrieval.py +466 -0
  386. rasa/dialogue_understanding/generator/llm_based_command_generator.py +502 -0
  387. rasa/dialogue_understanding/generator/llm_command_generator.py +68 -0
  388. rasa/dialogue_understanding/generator/multi_step/__init__.py +0 -0
  389. rasa/dialogue_understanding/generator/multi_step/fill_slots_prompt.jinja2 +62 -0
  390. rasa/dialogue_understanding/generator/multi_step/handle_flows_prompt.jinja2 +38 -0
  391. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +935 -0
  392. rasa/dialogue_understanding/generator/nlu_command_adapter.py +261 -0
  393. rasa/dialogue_understanding/generator/single_step/__init__.py +0 -0
  394. rasa/dialogue_understanding/generator/single_step/command_prompt_template.jinja2 +60 -0
  395. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +489 -0
  396. rasa/dialogue_understanding/patterns/__init__.py +0 -0
  397. rasa/dialogue_understanding/patterns/cancel.py +111 -0
  398. rasa/dialogue_understanding/patterns/cannot_handle.py +43 -0
  399. rasa/dialogue_understanding/patterns/chitchat.py +37 -0
  400. rasa/dialogue_understanding/patterns/clarify.py +97 -0
  401. rasa/dialogue_understanding/patterns/code_change.py +41 -0
  402. rasa/dialogue_understanding/patterns/collect_information.py +90 -0
  403. rasa/dialogue_understanding/patterns/completed.py +40 -0
  404. rasa/dialogue_understanding/patterns/continue_interrupted.py +42 -0
  405. rasa/dialogue_understanding/patterns/correction.py +278 -0
  406. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +301 -0
  407. rasa/dialogue_understanding/patterns/human_handoff.py +37 -0
  408. rasa/dialogue_understanding/patterns/internal_error.py +47 -0
  409. rasa/dialogue_understanding/patterns/repeat.py +37 -0
  410. rasa/dialogue_understanding/patterns/restart.py +37 -0
  411. rasa/dialogue_understanding/patterns/search.py +37 -0
  412. rasa/dialogue_understanding/patterns/session_start.py +37 -0
  413. rasa/dialogue_understanding/patterns/skip_question.py +38 -0
  414. rasa/dialogue_understanding/patterns/user_silence.py +37 -0
  415. rasa/dialogue_understanding/processor/__init__.py +0 -0
  416. rasa/dialogue_understanding/processor/command_processor.py +720 -0
  417. rasa/dialogue_understanding/processor/command_processor_component.py +43 -0
  418. rasa/dialogue_understanding/stack/__init__.py +0 -0
  419. rasa/dialogue_understanding/stack/dialogue_stack.py +178 -0
  420. rasa/dialogue_understanding/stack/frames/__init__.py +19 -0
  421. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +27 -0
  422. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +137 -0
  423. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +157 -0
  424. rasa/dialogue_understanding/stack/frames/pattern_frame.py +10 -0
  425. rasa/dialogue_understanding/stack/frames/search_frame.py +27 -0
  426. rasa/dialogue_understanding/stack/utils.py +211 -0
  427. rasa/dialogue_understanding/utils.py +14 -0
  428. rasa/dialogue_understanding_test/__init__.py +0 -0
  429. rasa/dialogue_understanding_test/constants.py +15 -0
  430. rasa/dialogue_understanding_test/du_test_case.py +118 -0
  431. rasa/dialogue_understanding_test/du_test_result.py +11 -0
  432. rasa/e2e_test/__init__.py +0 -0
  433. rasa/e2e_test/aggregate_test_stats_calculator.py +134 -0
  434. rasa/e2e_test/assertions.py +1345 -0
  435. rasa/e2e_test/assertions_schema.yml +129 -0
  436. rasa/e2e_test/constants.py +31 -0
  437. rasa/e2e_test/e2e_config.py +220 -0
  438. rasa/e2e_test/e2e_config_schema.yml +26 -0
  439. rasa/e2e_test/e2e_test_case.py +569 -0
  440. rasa/e2e_test/e2e_test_converter.py +363 -0
  441. rasa/e2e_test/e2e_test_converter_prompt.jinja2 +70 -0
  442. rasa/e2e_test/e2e_test_coverage_report.py +364 -0
  443. rasa/e2e_test/e2e_test_result.py +54 -0
  444. rasa/e2e_test/e2e_test_runner.py +1190 -0
  445. rasa/e2e_test/e2e_test_schema.yml +181 -0
  446. rasa/e2e_test/pykwalify_extensions.py +39 -0
  447. rasa/e2e_test/stub_custom_action.py +70 -0
  448. rasa/e2e_test/utils/__init__.py +0 -0
  449. rasa/e2e_test/utils/e2e_yaml_utils.py +55 -0
  450. rasa/e2e_test/utils/io.py +598 -0
  451. rasa/e2e_test/utils/validation.py +178 -0
  452. rasa/engine/__init__.py +0 -0
  453. rasa/engine/caching.py +463 -0
  454. rasa/engine/constants.py +17 -0
  455. rasa/engine/exceptions.py +14 -0
  456. rasa/engine/graph.py +642 -0
  457. rasa/engine/loader.py +48 -0
  458. rasa/engine/recipes/__init__.py +0 -0
  459. rasa/engine/recipes/config_files/default_config.yml +41 -0
  460. rasa/engine/recipes/default_components.py +97 -0
  461. rasa/engine/recipes/default_recipe.py +1272 -0
  462. rasa/engine/recipes/graph_recipe.py +79 -0
  463. rasa/engine/recipes/recipe.py +93 -0
  464. rasa/engine/runner/__init__.py +0 -0
  465. rasa/engine/runner/dask.py +250 -0
  466. rasa/engine/runner/interface.py +49 -0
  467. rasa/engine/storage/__init__.py +0 -0
  468. rasa/engine/storage/local_model_storage.py +244 -0
  469. rasa/engine/storage/resource.py +110 -0
  470. rasa/engine/storage/storage.py +199 -0
  471. rasa/engine/training/__init__.py +0 -0
  472. rasa/engine/training/components.py +176 -0
  473. rasa/engine/training/fingerprinting.py +64 -0
  474. rasa/engine/training/graph_trainer.py +256 -0
  475. rasa/engine/training/hooks.py +164 -0
  476. rasa/engine/validation.py +1451 -0
  477. rasa/env.py +14 -0
  478. rasa/exceptions.py +69 -0
  479. rasa/graph_components/__init__.py +0 -0
  480. rasa/graph_components/converters/__init__.py +0 -0
  481. rasa/graph_components/converters/nlu_message_converter.py +48 -0
  482. rasa/graph_components/providers/__init__.py +0 -0
  483. rasa/graph_components/providers/domain_for_core_training_provider.py +87 -0
  484. rasa/graph_components/providers/domain_provider.py +71 -0
  485. rasa/graph_components/providers/flows_provider.py +74 -0
  486. rasa/graph_components/providers/forms_provider.py +44 -0
  487. rasa/graph_components/providers/nlu_training_data_provider.py +56 -0
  488. rasa/graph_components/providers/responses_provider.py +44 -0
  489. rasa/graph_components/providers/rule_only_provider.py +49 -0
  490. rasa/graph_components/providers/story_graph_provider.py +96 -0
  491. rasa/graph_components/providers/training_tracker_provider.py +55 -0
  492. rasa/graph_components/validators/__init__.py +0 -0
  493. rasa/graph_components/validators/default_recipe_validator.py +550 -0
  494. rasa/graph_components/validators/finetuning_validator.py +302 -0
  495. rasa/hooks.py +112 -0
  496. rasa/jupyter.py +63 -0
  497. rasa/llm_fine_tuning/__init__.py +0 -0
  498. rasa/llm_fine_tuning/annotation_module.py +241 -0
  499. rasa/llm_fine_tuning/conversations.py +144 -0
  500. rasa/llm_fine_tuning/llm_data_preparation_module.py +178 -0
  501. rasa/llm_fine_tuning/paraphrasing/__init__.py +0 -0
  502. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +281 -0
  503. rasa/llm_fine_tuning/paraphrasing/default_rephrase_prompt_template.jina2 +44 -0
  504. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +121 -0
  505. rasa/llm_fine_tuning/paraphrasing/rephrased_user_message.py +10 -0
  506. rasa/llm_fine_tuning/paraphrasing_module.py +128 -0
  507. rasa/llm_fine_tuning/storage.py +174 -0
  508. rasa/llm_fine_tuning/train_test_split_module.py +441 -0
  509. rasa/markers/__init__.py +0 -0
  510. rasa/markers/marker.py +269 -0
  511. rasa/markers/marker_base.py +828 -0
  512. rasa/markers/upload.py +74 -0
  513. rasa/markers/validate.py +21 -0
  514. rasa/model.py +118 -0
  515. rasa/model_manager/__init__.py +0 -0
  516. rasa/model_manager/config.py +40 -0
  517. rasa/model_manager/model_api.py +559 -0
  518. rasa/model_manager/runner_service.py +287 -0
  519. rasa/model_manager/socket_bridge.py +152 -0
  520. rasa/model_manager/studio_jwt_auth.py +86 -0
  521. rasa/model_manager/trainer_service.py +325 -0
  522. rasa/model_manager/utils.py +87 -0
  523. rasa/model_manager/warm_rasa_process.py +187 -0
  524. rasa/model_service.py +112 -0
  525. rasa/model_testing.py +457 -0
  526. rasa/model_training.py +596 -0
  527. rasa/nlu/__init__.py +7 -0
  528. rasa/nlu/classifiers/__init__.py +3 -0
  529. rasa/nlu/classifiers/classifier.py +5 -0
  530. rasa/nlu/classifiers/diet_classifier.py +1881 -0
  531. rasa/nlu/classifiers/fallback_classifier.py +192 -0
  532. rasa/nlu/classifiers/keyword_intent_classifier.py +188 -0
  533. rasa/nlu/classifiers/logistic_regression_classifier.py +253 -0
  534. rasa/nlu/classifiers/mitie_intent_classifier.py +156 -0
  535. rasa/nlu/classifiers/regex_message_handler.py +56 -0
  536. rasa/nlu/classifiers/sklearn_intent_classifier.py +330 -0
  537. rasa/nlu/constants.py +77 -0
  538. rasa/nlu/convert.py +40 -0
  539. rasa/nlu/emulators/__init__.py +0 -0
  540. rasa/nlu/emulators/dialogflow.py +55 -0
  541. rasa/nlu/emulators/emulator.py +49 -0
  542. rasa/nlu/emulators/luis.py +86 -0
  543. rasa/nlu/emulators/no_emulator.py +10 -0
  544. rasa/nlu/emulators/wit.py +56 -0
  545. rasa/nlu/extractors/__init__.py +0 -0
  546. rasa/nlu/extractors/crf_entity_extractor.py +715 -0
  547. rasa/nlu/extractors/duckling_entity_extractor.py +206 -0
  548. rasa/nlu/extractors/entity_synonyms.py +178 -0
  549. rasa/nlu/extractors/extractor.py +470 -0
  550. rasa/nlu/extractors/mitie_entity_extractor.py +293 -0
  551. rasa/nlu/extractors/regex_entity_extractor.py +220 -0
  552. rasa/nlu/extractors/spacy_entity_extractor.py +95 -0
  553. rasa/nlu/featurizers/__init__.py +0 -0
  554. rasa/nlu/featurizers/dense_featurizer/__init__.py +0 -0
  555. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +445 -0
  556. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +57 -0
  557. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +768 -0
  558. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +170 -0
  559. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +132 -0
  560. rasa/nlu/featurizers/featurizer.py +89 -0
  561. rasa/nlu/featurizers/sparse_featurizer/__init__.py +0 -0
  562. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +867 -0
  563. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +571 -0
  564. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +271 -0
  565. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +9 -0
  566. rasa/nlu/model.py +24 -0
  567. rasa/nlu/run.py +27 -0
  568. rasa/nlu/selectors/__init__.py +0 -0
  569. rasa/nlu/selectors/response_selector.py +987 -0
  570. rasa/nlu/test.py +1940 -0
  571. rasa/nlu/tokenizers/__init__.py +0 -0
  572. rasa/nlu/tokenizers/jieba_tokenizer.py +148 -0
  573. rasa/nlu/tokenizers/mitie_tokenizer.py +75 -0
  574. rasa/nlu/tokenizers/spacy_tokenizer.py +72 -0
  575. rasa/nlu/tokenizers/tokenizer.py +239 -0
  576. rasa/nlu/tokenizers/whitespace_tokenizer.py +95 -0
  577. rasa/nlu/utils/__init__.py +35 -0
  578. rasa/nlu/utils/bilou_utils.py +462 -0
  579. rasa/nlu/utils/hugging_face/__init__.py +0 -0
  580. rasa/nlu/utils/hugging_face/registry.py +108 -0
  581. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +311 -0
  582. rasa/nlu/utils/mitie_utils.py +113 -0
  583. rasa/nlu/utils/pattern_utils.py +168 -0
  584. rasa/nlu/utils/spacy_utils.py +310 -0
  585. rasa/plugin.py +90 -0
  586. rasa/server.py +1588 -0
  587. rasa/shared/__init__.py +0 -0
  588. rasa/shared/constants.py +321 -0
  589. rasa/shared/core/__init__.py +0 -0
  590. rasa/shared/core/command_payload_reader.py +109 -0
  591. rasa/shared/core/constants.py +180 -0
  592. rasa/shared/core/conversation.py +46 -0
  593. rasa/shared/core/domain.py +2172 -0
  594. rasa/shared/core/events.py +2559 -0
  595. rasa/shared/core/flows/__init__.py +7 -0
  596. rasa/shared/core/flows/flow.py +562 -0
  597. rasa/shared/core/flows/flow_path.py +84 -0
  598. rasa/shared/core/flows/flow_step.py +146 -0
  599. rasa/shared/core/flows/flow_step_links.py +319 -0
  600. rasa/shared/core/flows/flow_step_sequence.py +70 -0
  601. rasa/shared/core/flows/flows_list.py +258 -0
  602. rasa/shared/core/flows/flows_yaml_schema.json +303 -0
  603. rasa/shared/core/flows/nlu_trigger.py +117 -0
  604. rasa/shared/core/flows/steps/__init__.py +24 -0
  605. rasa/shared/core/flows/steps/action.py +56 -0
  606. rasa/shared/core/flows/steps/call.py +64 -0
  607. rasa/shared/core/flows/steps/collect.py +112 -0
  608. rasa/shared/core/flows/steps/constants.py +5 -0
  609. rasa/shared/core/flows/steps/continuation.py +36 -0
  610. rasa/shared/core/flows/steps/end.py +22 -0
  611. rasa/shared/core/flows/steps/internal.py +44 -0
  612. rasa/shared/core/flows/steps/link.py +51 -0
  613. rasa/shared/core/flows/steps/no_operation.py +48 -0
  614. rasa/shared/core/flows/steps/set_slots.py +50 -0
  615. rasa/shared/core/flows/steps/start.py +30 -0
  616. rasa/shared/core/flows/utils.py +39 -0
  617. rasa/shared/core/flows/validation.py +735 -0
  618. rasa/shared/core/flows/yaml_flows_io.py +405 -0
  619. rasa/shared/core/generator.py +908 -0
  620. rasa/shared/core/slot_mappings.py +526 -0
  621. rasa/shared/core/slots.py +654 -0
  622. rasa/shared/core/trackers.py +1183 -0
  623. rasa/shared/core/training_data/__init__.py +0 -0
  624. rasa/shared/core/training_data/loading.py +89 -0
  625. rasa/shared/core/training_data/story_reader/__init__.py +0 -0
  626. rasa/shared/core/training_data/story_reader/story_reader.py +129 -0
  627. rasa/shared/core/training_data/story_reader/story_step_builder.py +168 -0
  628. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +888 -0
  629. rasa/shared/core/training_data/story_writer/__init__.py +0 -0
  630. rasa/shared/core/training_data/story_writer/story_writer.py +76 -0
  631. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +444 -0
  632. rasa/shared/core/training_data/structures.py +858 -0
  633. rasa/shared/core/training_data/visualization.html +146 -0
  634. rasa/shared/core/training_data/visualization.py +603 -0
  635. rasa/shared/data.py +249 -0
  636. rasa/shared/engine/__init__.py +0 -0
  637. rasa/shared/engine/caching.py +26 -0
  638. rasa/shared/exceptions.py +167 -0
  639. rasa/shared/importers/__init__.py +0 -0
  640. rasa/shared/importers/importer.py +770 -0
  641. rasa/shared/importers/multi_project.py +215 -0
  642. rasa/shared/importers/rasa.py +108 -0
  643. rasa/shared/importers/remote_importer.py +196 -0
  644. rasa/shared/importers/utils.py +36 -0
  645. rasa/shared/nlu/__init__.py +0 -0
  646. rasa/shared/nlu/constants.py +54 -0
  647. rasa/shared/nlu/interpreter.py +10 -0
  648. rasa/shared/nlu/training_data/__init__.py +0 -0
  649. rasa/shared/nlu/training_data/entities_parser.py +208 -0
  650. rasa/shared/nlu/training_data/features.py +492 -0
  651. rasa/shared/nlu/training_data/formats/__init__.py +10 -0
  652. rasa/shared/nlu/training_data/formats/dialogflow.py +163 -0
  653. rasa/shared/nlu/training_data/formats/luis.py +87 -0
  654. rasa/shared/nlu/training_data/formats/rasa.py +135 -0
  655. rasa/shared/nlu/training_data/formats/rasa_yaml.py +618 -0
  656. rasa/shared/nlu/training_data/formats/readerwriter.py +244 -0
  657. rasa/shared/nlu/training_data/formats/wit.py +52 -0
  658. rasa/shared/nlu/training_data/loading.py +137 -0
  659. rasa/shared/nlu/training_data/lookup_tables_parser.py +30 -0
  660. rasa/shared/nlu/training_data/message.py +490 -0
  661. rasa/shared/nlu/training_data/schemas/__init__.py +0 -0
  662. rasa/shared/nlu/training_data/schemas/data_schema.py +85 -0
  663. rasa/shared/nlu/training_data/schemas/nlu.yml +53 -0
  664. rasa/shared/nlu/training_data/schemas/responses.yml +70 -0
  665. rasa/shared/nlu/training_data/synonyms_parser.py +42 -0
  666. rasa/shared/nlu/training_data/training_data.py +729 -0
  667. rasa/shared/nlu/training_data/util.py +223 -0
  668. rasa/shared/providers/__init__.py +0 -0
  669. rasa/shared/providers/_configs/__init__.py +0 -0
  670. rasa/shared/providers/_configs/azure_openai_client_config.py +183 -0
  671. rasa/shared/providers/_configs/client_config.py +57 -0
  672. rasa/shared/providers/_configs/default_litellm_client_config.py +130 -0
  673. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +234 -0
  674. rasa/shared/providers/_configs/litellm_router_client_config.py +220 -0
  675. rasa/shared/providers/_configs/model_group_config.py +167 -0
  676. rasa/shared/providers/_configs/openai_client_config.py +175 -0
  677. rasa/shared/providers/_configs/rasa_llm_client_config.py +73 -0
  678. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +177 -0
  679. rasa/shared/providers/_configs/utils.py +117 -0
  680. rasa/shared/providers/_ssl_verification_utils.py +124 -0
  681. rasa/shared/providers/_utils.py +79 -0
  682. rasa/shared/providers/embedding/__init__.py +0 -0
  683. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +243 -0
  684. rasa/shared/providers/embedding/_langchain_embedding_client_adapter.py +74 -0
  685. rasa/shared/providers/embedding/azure_openai_embedding_client.py +310 -0
  686. rasa/shared/providers/embedding/default_litellm_embedding_client.py +126 -0
  687. rasa/shared/providers/embedding/embedding_client.py +90 -0
  688. rasa/shared/providers/embedding/embedding_response.py +41 -0
  689. rasa/shared/providers/embedding/huggingface_local_embedding_client.py +191 -0
  690. rasa/shared/providers/embedding/litellm_router_embedding_client.py +135 -0
  691. rasa/shared/providers/embedding/openai_embedding_client.py +172 -0
  692. rasa/shared/providers/llm/__init__.py +0 -0
  693. rasa/shared/providers/llm/_base_litellm_client.py +263 -0
  694. rasa/shared/providers/llm/azure_openai_llm_client.py +359 -0
  695. rasa/shared/providers/llm/default_litellm_llm_client.py +108 -0
  696. rasa/shared/providers/llm/litellm_router_llm_client.py +182 -0
  697. rasa/shared/providers/llm/llm_client.py +76 -0
  698. rasa/shared/providers/llm/llm_response.py +79 -0
  699. rasa/shared/providers/llm/openai_llm_client.py +155 -0
  700. rasa/shared/providers/llm/rasa_llm_client.py +112 -0
  701. rasa/shared/providers/llm/self_hosted_llm_client.py +269 -0
  702. rasa/shared/providers/mappings.py +94 -0
  703. rasa/shared/providers/router/__init__.py +0 -0
  704. rasa/shared/providers/router/_base_litellm_router_client.py +183 -0
  705. rasa/shared/providers/router/router_client.py +73 -0
  706. rasa/shared/utils/__init__.py +0 -0
  707. rasa/shared/utils/cli.py +102 -0
  708. rasa/shared/utils/common.py +324 -0
  709. rasa/shared/utils/constants.py +4 -0
  710. rasa/shared/utils/health_check/__init__.py +0 -0
  711. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +31 -0
  712. rasa/shared/utils/health_check/health_check.py +258 -0
  713. rasa/shared/utils/health_check/llm_health_check_mixin.py +31 -0
  714. rasa/shared/utils/io.py +499 -0
  715. rasa/shared/utils/llm.py +760 -0
  716. rasa/shared/utils/pykwalify_extensions.py +27 -0
  717. rasa/shared/utils/schemas/__init__.py +0 -0
  718. rasa/shared/utils/schemas/config.yml +2 -0
  719. rasa/shared/utils/schemas/domain.yml +145 -0
  720. rasa/shared/utils/schemas/events.py +214 -0
  721. rasa/shared/utils/schemas/model_config.yml +36 -0
  722. rasa/shared/utils/schemas/stories.yml +173 -0
  723. rasa/shared/utils/yaml.py +1068 -0
  724. rasa/studio/__init__.py +0 -0
  725. rasa/studio/auth.py +270 -0
  726. rasa/studio/config.py +136 -0
  727. rasa/studio/constants.py +19 -0
  728. rasa/studio/data_handler.py +368 -0
  729. rasa/studio/download.py +489 -0
  730. rasa/studio/results_logger.py +137 -0
  731. rasa/studio/train.py +134 -0
  732. rasa/studio/upload.py +563 -0
  733. rasa/telemetry.py +1876 -0
  734. rasa/tracing/__init__.py +0 -0
  735. rasa/tracing/config.py +355 -0
  736. rasa/tracing/constants.py +62 -0
  737. rasa/tracing/instrumentation/__init__.py +0 -0
  738. rasa/tracing/instrumentation/attribute_extractors.py +765 -0
  739. rasa/tracing/instrumentation/instrumentation.py +1306 -0
  740. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +144 -0
  741. rasa/tracing/instrumentation/metrics.py +294 -0
  742. rasa/tracing/metric_instrument_provider.py +205 -0
  743. rasa/utils/__init__.py +0 -0
  744. rasa/utils/beta.py +83 -0
  745. rasa/utils/cli.py +28 -0
  746. rasa/utils/common.py +639 -0
  747. rasa/utils/converter.py +53 -0
  748. rasa/utils/endpoints.py +331 -0
  749. rasa/utils/io.py +252 -0
  750. rasa/utils/json_utils.py +60 -0
  751. rasa/utils/licensing.py +542 -0
  752. rasa/utils/log_utils.py +181 -0
  753. rasa/utils/mapper.py +210 -0
  754. rasa/utils/ml_utils.py +147 -0
  755. rasa/utils/plotting.py +362 -0
  756. rasa/utils/sanic_error_handler.py +32 -0
  757. rasa/utils/singleton.py +23 -0
  758. rasa/utils/tensorflow/__init__.py +0 -0
  759. rasa/utils/tensorflow/callback.py +112 -0
  760. rasa/utils/tensorflow/constants.py +116 -0
  761. rasa/utils/tensorflow/crf.py +492 -0
  762. rasa/utils/tensorflow/data_generator.py +440 -0
  763. rasa/utils/tensorflow/environment.py +161 -0
  764. rasa/utils/tensorflow/exceptions.py +5 -0
  765. rasa/utils/tensorflow/feature_array.py +366 -0
  766. rasa/utils/tensorflow/layers.py +1565 -0
  767. rasa/utils/tensorflow/layers_utils.py +113 -0
  768. rasa/utils/tensorflow/metrics.py +281 -0
  769. rasa/utils/tensorflow/model_data.py +798 -0
  770. rasa/utils/tensorflow/model_data_utils.py +499 -0
  771. rasa/utils/tensorflow/models.py +935 -0
  772. rasa/utils/tensorflow/rasa_layers.py +1094 -0
  773. rasa/utils/tensorflow/transformer.py +640 -0
  774. rasa/utils/tensorflow/types.py +6 -0
  775. rasa/utils/train_utils.py +572 -0
  776. rasa/utils/url_tools.py +53 -0
  777. rasa/utils/yaml.py +54 -0
  778. rasa/validator.py +1644 -0
  779. rasa/version.py +3 -0
  780. rasa_pro-3.11.3a1.dev2.dist-info/METADATA +198 -0
  781. rasa_pro-3.11.3a1.dev2.dist-info/NOTICE +5 -0
  782. rasa_pro-3.11.3a1.dev2.dist-info/RECORD +784 -0
  783. rasa_pro-3.11.3a1.dev2.dist-info/WHEEL +4 -0
  784. rasa_pro-3.11.3a1.dev2.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,1320 @@
1
+ import copy
2
+ import logging
3
+ from functools import lru_cache
4
+ from typing import (
5
+ TYPE_CHECKING,
6
+ Any,
7
+ Dict,
8
+ List,
9
+ Optional,
10
+ Set,
11
+ Text,
12
+ Tuple,
13
+ cast,
14
+ )
15
+
16
+ from jsonschema import Draft202012Validator
17
+
18
+ import rasa.core
19
+ import rasa.shared.utils.io
20
+ from rasa.core.actions.custom_action_executor import (
21
+ CustomActionExecutor,
22
+ NoEndpointCustomActionExecutor,
23
+ RetryCustomActionExecutor,
24
+ )
25
+ from rasa.core.actions.direct_custom_actions_executor import DirectCustomActionExecutor
26
+ from rasa.core.actions.e2e_stub_custom_action_executor import (
27
+ E2EStubCustomActionExecutor,
28
+ )
29
+ from rasa.core.actions.grpc_custom_action_executor import GRPCCustomActionExecutor
30
+ from rasa.core.actions.http_custom_action_executor import HTTPCustomActionExecutor
31
+ from rasa.core.constants import (
32
+ UTTER_SOURCE_METADATA_KEY,
33
+ )
34
+ from rasa.core.policies.policy import PolicyPrediction
35
+ from rasa.core.utils import add_bot_utterance_metadata
36
+ from rasa.e2e_test.constants import KEY_STUB_CUSTOM_ACTIONS
37
+ from rasa.nlu.constants import (
38
+ RESPONSE_SELECTOR_DEFAULT_INTENT,
39
+ RESPONSE_SELECTOR_PREDICTION_KEY,
40
+ RESPONSE_SELECTOR_PROPERTY_NAME,
41
+ RESPONSE_SELECTOR_UTTER_ACTION_KEY,
42
+ )
43
+ from rasa.shared.constants import (
44
+ DEFAULT_NLU_FALLBACK_INTENT_NAME,
45
+ DOCS_BASE_URL,
46
+ FLOW_PREFIX,
47
+ ROUTE_TO_CALM_SLOT,
48
+ UTTER_PREFIX,
49
+ )
50
+ from rasa.shared.core.constants import (
51
+ ACTION_BACK_NAME,
52
+ ACTION_DEACTIVATE_LOOP_NAME,
53
+ ACTION_DEFAULT_ASK_AFFIRMATION_NAME,
54
+ ACTION_DEFAULT_ASK_REPHRASE_NAME,
55
+ ACTION_DEFAULT_FALLBACK_NAME,
56
+ ACTION_EXTRACT_SLOTS,
57
+ ACTION_LISTEN_NAME,
58
+ ACTION_RESET_ROUTING,
59
+ ACTION_RESTART_NAME,
60
+ ACTION_REVERT_FALLBACK_EVENTS_NAME,
61
+ ACTION_SEND_TEXT_NAME,
62
+ ACTION_SESSION_START_NAME,
63
+ ACTION_UNLIKELY_INTENT_NAME,
64
+ ACTION_VALIDATE_SLOT_MAPPINGS,
65
+ DEFAULT_SLOT_NAMES,
66
+ KNOWLEDGE_BASE_SLOT_NAMES,
67
+ MAPPING_TYPE,
68
+ REQUESTED_SLOT,
69
+ USER_INTENT_OUT_OF_SCOPE,
70
+ SlotMappingType,
71
+ )
72
+ from rasa.shared.core.domain import Domain
73
+ from rasa.shared.core.events import (
74
+ ActionExecuted,
75
+ ActiveLoop,
76
+ BotUttered,
77
+ Event,
78
+ Restarted,
79
+ RoutingSessionEnded,
80
+ SessionStarted,
81
+ SlotSet,
82
+ UserUtteranceReverted,
83
+ UserUttered,
84
+ )
85
+ from rasa.shared.core.flows import FlowsList
86
+ from rasa.shared.core.slot_mappings import (
87
+ SlotFillingManager,
88
+ extract_slot_value,
89
+ )
90
+ from rasa.shared.core.trackers import DialogueStateTracker
91
+ from rasa.shared.exceptions import RasaException
92
+ from rasa.shared.nlu.constants import (
93
+ INTENT_NAME_KEY,
94
+ INTENT_RANKING_KEY,
95
+ )
96
+ from rasa.shared.nlu.constants import PROMPTS
97
+ from rasa.shared.utils.io import raise_warning
98
+ from rasa.shared.utils.schemas.events import EVENTS_SCHEMA
99
+ from rasa.utils.endpoints import ClientResponseError, EndpointConfig
100
+ from rasa.utils.url_tools import UrlSchema, get_url_schema
101
+
102
+ if TYPE_CHECKING:
103
+ from rasa.core.channels.channel import OutputChannel
104
+ from rasa.core.nlg import NaturalLanguageGenerator
105
+ from rasa.shared.core.events import IntentPrediction
106
+
107
+ logger = logging.getLogger(__name__)
108
+
109
+
110
+ def default_actions(action_endpoint: Optional[EndpointConfig] = None) -> List["Action"]:
111
+ """List default actions."""
112
+ from rasa.core.actions.action_clean_stack import ActionCleanStack
113
+ from rasa.core.actions.action_run_slot_rejections import ActionRunSlotRejections
114
+ from rasa.core.actions.action_trigger_chitchat import ActionTriggerChitchat
115
+ from rasa.core.actions.action_trigger_search import ActionTriggerSearch
116
+ from rasa.core.actions.two_stage_fallback import TwoStageFallbackAction
117
+ from rasa.core.actions.action_hangup import ActionHangup
118
+ from rasa.core.actions.action_repeat_bot_messages import ActionRepeatBotMessages
119
+ from rasa.dialogue_understanding.patterns.cancel import ActionCancelFlow
120
+ from rasa.dialogue_understanding.patterns.clarify import ActionClarifyFlows
121
+ from rasa.dialogue_understanding.patterns.correction import ActionCorrectFlowSlot
122
+
123
+ return [
124
+ ActionListen(),
125
+ ActionRestart(),
126
+ ActionSessionStart(),
127
+ ActionDefaultFallback(),
128
+ ActionDeactivateLoop(),
129
+ ActionRevertFallbackEvents(),
130
+ ActionDefaultAskAffirmation(),
131
+ ActionDefaultAskRephrase(),
132
+ TwoStageFallbackAction(action_endpoint),
133
+ ActionUnlikelyIntent(),
134
+ ActionSendText(),
135
+ ActionBack(),
136
+ ActionExtractSlots(action_endpoint),
137
+ ActionCancelFlow(),
138
+ ActionCorrectFlowSlot(),
139
+ ActionClarifyFlows(),
140
+ ActionRunSlotRejections(),
141
+ ActionCleanStack(),
142
+ ActionTriggerSearch(),
143
+ ActionTriggerChitchat(),
144
+ ActionResetRouting(),
145
+ ActionHangup(),
146
+ ActionRepeatBotMessages(),
147
+ ]
148
+
149
+
150
+ def action_for_index(
151
+ index: int,
152
+ domain: Domain,
153
+ action_endpoint: Optional[EndpointConfig],
154
+ ) -> "Action":
155
+ """Get an action based on its index in the list of available actions.
156
+
157
+ Args:
158
+ index: The index of the action. This is usually used by `Policy`s as they
159
+ predict the action index instead of the name.
160
+ domain: The `Domain` of the current model. The domain contains the actions
161
+ provided by the user + the default actions.
162
+ action_endpoint: Can be used to run `custom_actions`
163
+ (e.g. using the `rasa-sdk`).
164
+
165
+ Returns:
166
+ The instantiated `Action` or `None` if no `Action` was found for the given
167
+ index.
168
+ """
169
+ if domain.num_actions <= index or index < 0:
170
+ raise IndexError(
171
+ f"Cannot access action at index {index}. "
172
+ f"Domain has {domain.num_actions} actions."
173
+ )
174
+
175
+ return action_for_name_or_text(
176
+ domain.action_names_or_texts[index],
177
+ domain,
178
+ action_endpoint,
179
+ )
180
+
181
+
182
+ def is_retrieval_action(action_name: Text, retrieval_intents: List[Text]) -> bool:
183
+ """Check if an action name is a retrieval action.
184
+
185
+ The name for a retrieval action has an extra `utter_` prefix added to
186
+ the corresponding retrieval intent name.
187
+
188
+ Args:
189
+ action_name: Name of the action.
190
+ retrieval_intents: List of retrieval intents defined in the NLU training data.
191
+
192
+ Returns:
193
+ `True` if the resolved intent name is present in the list of retrieval
194
+ intents, `False` otherwise.
195
+ """
196
+ return (
197
+ ActionRetrieveResponse.intent_name_from_action(action_name) in retrieval_intents
198
+ )
199
+
200
+
201
+ def action_for_name_or_text(
202
+ action_name_or_text: Text,
203
+ domain: Domain,
204
+ action_endpoint: Optional[EndpointConfig],
205
+ ) -> "Action":
206
+ """Retrieves an action by its name or by its text in case it's an end-to-end action.
207
+
208
+ Args:
209
+ action_name_or_text: The name of the action.
210
+ domain: The current model domain.
211
+ action_endpoint: The endpoint to execute custom actions.
212
+
213
+ Raises:
214
+ ActionNotFoundException: If action not in current domain.
215
+
216
+ Returns:
217
+ The instantiated action.
218
+ """
219
+ if action_name_or_text not in domain.action_names_or_texts:
220
+ domain.raise_action_not_found_exception(action_name_or_text)
221
+
222
+ defaults = {a.name(): a for a in default_actions(action_endpoint)}
223
+
224
+ if (
225
+ action_name_or_text in defaults
226
+ and action_name_or_text not in domain.user_actions_and_forms
227
+ ):
228
+ return defaults[action_name_or_text]
229
+
230
+ if action_name_or_text.startswith(UTTER_PREFIX) and is_retrieval_action(
231
+ action_name_or_text, domain.retrieval_intents
232
+ ):
233
+ return ActionRetrieveResponse(action_name_or_text)
234
+
235
+ if action_name_or_text in domain.action_texts:
236
+ return ActionEndToEndResponse(action_name_or_text)
237
+
238
+ if action_name_or_text.startswith(UTTER_PREFIX):
239
+ return ActionBotResponse(action_name_or_text)
240
+
241
+ is_form = action_name_or_text in domain.form_names
242
+ # Users can override the form by defining an action with the same name as the form
243
+ user_overrode_form_action = is_form and action_name_or_text in domain.user_actions
244
+ if is_form and not user_overrode_form_action:
245
+ from rasa.core.actions.forms import FormAction
246
+
247
+ return FormAction(action_name_or_text, action_endpoint)
248
+
249
+ if action_name_or_text.startswith(FLOW_PREFIX):
250
+ from rasa.core.actions.action_trigger_flow import ActionTriggerFlow
251
+
252
+ return ActionTriggerFlow(action_name_or_text)
253
+ return RemoteAction(action_name_or_text, action_endpoint)
254
+
255
+
256
+ def create_bot_utterance(message: Dict[Text, Any]) -> BotUttered:
257
+ """Create BotUttered event from message."""
258
+ bot_message = BotUttered(
259
+ text=message.pop("text", None),
260
+ data={
261
+ "elements": message.pop("elements", None),
262
+ "quick_replies": message.pop("quick_replies", None),
263
+ "buttons": message.pop("buttons", None),
264
+ # for legacy / compatibility reasons we need to set the image
265
+ # to be the attachment if there is no other attachment (the
266
+ # `.get` is intentional - no `pop` as we still need the image`
267
+ # property to set it in the following line)
268
+ "attachment": message.pop("attachment", None) or message.get("image", None),
269
+ "image": message.pop("image", None),
270
+ "custom": message.pop("custom", None),
271
+ PROMPTS: message.pop(PROMPTS, None),
272
+ },
273
+ metadata=message,
274
+ )
275
+ return bot_message
276
+
277
+
278
+ class Action:
279
+ """Next action to be taken in response to a dialogue state."""
280
+
281
+ def name(self) -> Text:
282
+ """Unique identifier of this simple action."""
283
+ raise NotImplementedError
284
+
285
+ async def run(
286
+ self,
287
+ output_channel: "OutputChannel",
288
+ nlg: "NaturalLanguageGenerator",
289
+ tracker: "DialogueStateTracker",
290
+ domain: "Domain",
291
+ metadata: Optional[Dict[Text, Any]] = None,
292
+ ) -> List[Event]:
293
+ """Execute the side effects of this action.
294
+
295
+ Args:
296
+ nlg: which ``nlg`` to use for response generation
297
+ output_channel: ``output_channel`` to which to send the resulting message.
298
+ tracker (DialogueStateTracker): the state tracker for the current
299
+ user. You can access slot values using
300
+ ``tracker.get_slot(slot_name)`` and the most recent user
301
+ message is ``tracker.latest_message.text``.
302
+ domain (Domain): the bot's domain
303
+ metadata: Additional information for the action.
304
+
305
+ Returns:
306
+ A list of :class:`rasa.core.events.Event` instances
307
+ """
308
+ raise NotImplementedError
309
+
310
+ def __str__(self) -> Text:
311
+ """Returns text representation of form."""
312
+ return f"{self.__class__.__name__}('{self.name()}')"
313
+
314
+ def event_for_successful_execution(
315
+ self, prediction: PolicyPrediction
316
+ ) -> ActionExecuted:
317
+ """Event which should be logged for the successful execution of this action.
318
+
319
+ Args:
320
+ prediction: Prediction which led to the execution of this event.
321
+
322
+ Returns:
323
+ Event which should be logged onto the tracker.
324
+ """
325
+ return ActionExecuted(
326
+ self.name(),
327
+ prediction.policy_name,
328
+ prediction.max_confidence,
329
+ hide_rule_turn=prediction.hide_rule_turn,
330
+ metadata=prediction.action_metadata,
331
+ )
332
+
333
+
334
+ class ActionBotResponse(Action):
335
+ """An action which only effect is to utter a response when it is run."""
336
+
337
+ def __init__(self, name: Text, silent_fail: Optional[bool] = False) -> None:
338
+ """Creates action.
339
+
340
+ Args:
341
+ name: Name of the action.
342
+ silent_fail: `True` if the action should fail silently in case no response
343
+ was defined for this action.
344
+ """
345
+ self.utter_action = name
346
+ self.silent_fail = silent_fail
347
+
348
+ async def run(
349
+ self,
350
+ output_channel: "OutputChannel",
351
+ nlg: "NaturalLanguageGenerator",
352
+ tracker: "DialogueStateTracker",
353
+ domain: "Domain",
354
+ metadata: Optional[Dict[Text, Any]] = None,
355
+ ) -> List[Event]:
356
+ """Simple run implementation uttering a (hopefully defined) response."""
357
+ kwargs = {
358
+ "domain_responses": domain.responses,
359
+ }
360
+
361
+ message = await nlg.generate(
362
+ self.utter_action,
363
+ tracker,
364
+ output_channel.name(),
365
+ **kwargs,
366
+ )
367
+ if message is None:
368
+ if not self.silent_fail:
369
+ logger.error(
370
+ "Couldn't create message for response '{}'.".format(
371
+ self.utter_action
372
+ )
373
+ )
374
+ return []
375
+
376
+ message.update(metadata or {})
377
+ message = add_bot_utterance_metadata(
378
+ message, self.utter_action, nlg, domain, tracker
379
+ )
380
+ return [create_bot_utterance(message)]
381
+
382
+ def name(self) -> Text:
383
+ """Returns action name."""
384
+ return self.utter_action
385
+
386
+
387
+ class ActionEndToEndResponse(Action):
388
+ """Action to utter end-to-end responses to the user."""
389
+
390
+ def __init__(self, action_text: Text) -> None:
391
+ """Creates action.
392
+
393
+ Args:
394
+ action_text: Text of end-to-end bot response.
395
+ """
396
+ self.action_text = action_text
397
+
398
+ def name(self) -> Text:
399
+ """Returns action name."""
400
+ # In case of an end-to-end action there is no label (aka name) for the action.
401
+ # We fake a name by returning the text which the bot sends back to the user.
402
+ return self.action_text
403
+
404
+ async def run(
405
+ self,
406
+ output_channel: "OutputChannel",
407
+ nlg: "NaturalLanguageGenerator",
408
+ tracker: "DialogueStateTracker",
409
+ domain: "Domain",
410
+ metadata: Optional[Dict[Text, Any]] = None,
411
+ ) -> List[Event]:
412
+ """Runs action (see parent class for full docstring)."""
413
+ message = {"text": self.action_text}
414
+ return [create_bot_utterance(message)]
415
+
416
+ def event_for_successful_execution(
417
+ self, prediction: PolicyPrediction
418
+ ) -> ActionExecuted:
419
+ """Event which should be logged for the successful execution of this action.
420
+
421
+ Args:
422
+ prediction: Prediction which led to the execution of this event.
423
+
424
+ Returns:
425
+ Event which should be logged onto the tracker.
426
+ """
427
+ return ActionExecuted(
428
+ policy=prediction.policy_name,
429
+ confidence=prediction.max_confidence,
430
+ action_text=self.action_text,
431
+ hide_rule_turn=prediction.hide_rule_turn,
432
+ metadata=prediction.action_metadata,
433
+ )
434
+
435
+
436
+ class ActionRetrieveResponse(ActionBotResponse):
437
+ """An action which queries the Response Selector for the appropriate response."""
438
+
439
+ def __init__(self, name: Text, silent_fail: Optional[bool] = False) -> None:
440
+ """Creates action. See docstring of parent class."""
441
+ super().__init__(name, silent_fail)
442
+ self.action_name = name
443
+ self.silent_fail = silent_fail
444
+
445
+ @staticmethod
446
+ def intent_name_from_action(action_name: Text) -> Text:
447
+ """Resolve the name of the intent from the action name."""
448
+ return action_name.split(UTTER_PREFIX)[1]
449
+
450
+ def get_full_retrieval_name(
451
+ self, tracker: "DialogueStateTracker"
452
+ ) -> Optional[Text]:
453
+ """Returns full retrieval name for the action.
454
+
455
+ Extracts retrieval intent from response selector and
456
+ returns complete action utterance name.
457
+
458
+ Args:
459
+ tracker: Tracker containing past conversation events.
460
+
461
+ Returns:
462
+ Full retrieval name of the action if the last user utterance
463
+ contains a response selector output, `None` otherwise.
464
+ """
465
+ latest_message = tracker.latest_message
466
+
467
+ if latest_message is None:
468
+ return None
469
+
470
+ if RESPONSE_SELECTOR_PROPERTY_NAME not in latest_message.parse_data:
471
+ return None
472
+
473
+ response_selector_properties = latest_message.parse_data[
474
+ RESPONSE_SELECTOR_PROPERTY_NAME # type: ignore[literal-required]
475
+ ]
476
+
477
+ if (
478
+ self.intent_name_from_action(self.action_name)
479
+ in response_selector_properties
480
+ ):
481
+ query_key = self.intent_name_from_action(self.action_name)
482
+ elif RESPONSE_SELECTOR_DEFAULT_INTENT in response_selector_properties:
483
+ query_key = RESPONSE_SELECTOR_DEFAULT_INTENT
484
+ else:
485
+ return None
486
+
487
+ selected = response_selector_properties[query_key]
488
+ full_retrieval_utter_action = selected[RESPONSE_SELECTOR_PREDICTION_KEY][
489
+ RESPONSE_SELECTOR_UTTER_ACTION_KEY
490
+ ]
491
+ return full_retrieval_utter_action
492
+
493
+ async def run(
494
+ self,
495
+ output_channel: "OutputChannel",
496
+ nlg: "NaturalLanguageGenerator",
497
+ tracker: "DialogueStateTracker",
498
+ domain: "Domain",
499
+ metadata: Optional[Dict[Text, Any]] = None,
500
+ ) -> List[Event]:
501
+ """Query the appropriate response and create a bot utterance with that."""
502
+ latest_message = tracker.latest_message
503
+
504
+ if latest_message is None:
505
+ return []
506
+
507
+ response_selector_properties = latest_message.parse_data[
508
+ RESPONSE_SELECTOR_PROPERTY_NAME # type: ignore[literal-required]
509
+ ]
510
+
511
+ if (
512
+ self.intent_name_from_action(self.action_name)
513
+ in response_selector_properties
514
+ ):
515
+ query_key = self.intent_name_from_action(self.action_name)
516
+ elif RESPONSE_SELECTOR_DEFAULT_INTENT in response_selector_properties:
517
+ query_key = RESPONSE_SELECTOR_DEFAULT_INTENT
518
+ else:
519
+ if not self.silent_fail:
520
+ logger.error(
521
+ "Couldn't create message for response action '{}'.".format(
522
+ self.action_name
523
+ )
524
+ )
525
+ return []
526
+
527
+ logger.debug(f"Picking response from selector of type {query_key}")
528
+ selected = response_selector_properties[query_key]
529
+
530
+ # Override utter action of ActionBotResponse
531
+ # with the complete utter action retrieved from
532
+ # the output of response selector.
533
+ self.utter_action = selected[RESPONSE_SELECTOR_PREDICTION_KEY][
534
+ RESPONSE_SELECTOR_UTTER_ACTION_KEY
535
+ ]
536
+
537
+ return await super().run(output_channel, nlg, tracker, domain)
538
+
539
+ def name(self) -> Text:
540
+ """Returns action name."""
541
+ return self.action_name
542
+
543
+
544
+ class ActionBack(ActionBotResponse):
545
+ """Revert the tracker state by two user utterances."""
546
+
547
+ def name(self) -> Text:
548
+ """Returns action back name."""
549
+ return ACTION_BACK_NAME
550
+
551
+ def __init__(self) -> None:
552
+ """Initializes action back."""
553
+ super().__init__("utter_back", silent_fail=True)
554
+
555
+ async def run(
556
+ self,
557
+ output_channel: "OutputChannel",
558
+ nlg: "NaturalLanguageGenerator",
559
+ tracker: "DialogueStateTracker",
560
+ domain: "Domain",
561
+ metadata: Optional[Dict[Text, Any]] = None,
562
+ ) -> List[Event]:
563
+ """Runs action. Please see parent class for the full docstring."""
564
+ # only utter the response if it is available
565
+ evts = await super().run(output_channel, nlg, tracker, domain)
566
+
567
+ return evts + [UserUtteranceReverted(), UserUtteranceReverted()]
568
+
569
+
570
+ class ActionListen(Action):
571
+ """The first action in any turn - bot waits for a user message.
572
+
573
+ The bot should stop taking further actions and wait for the user to say
574
+ something.
575
+ """
576
+
577
+ def name(self) -> Text:
578
+ """Returns action listen name."""
579
+ return ACTION_LISTEN_NAME
580
+
581
+ async def run(
582
+ self,
583
+ output_channel: "OutputChannel",
584
+ nlg: "NaturalLanguageGenerator",
585
+ tracker: "DialogueStateTracker",
586
+ domain: "Domain",
587
+ metadata: Optional[Dict[Text, Any]] = None,
588
+ ) -> List[Event]:
589
+ """Runs action. Please see parent class for the full docstring."""
590
+ return []
591
+
592
+
593
+ class ActionResetRouting(Action):
594
+ """Resets the tracker to its initial state.
595
+
596
+ Utters the restart response if available.
597
+ """
598
+
599
+ def name(self) -> Text:
600
+ """Returns action restart name."""
601
+ return ACTION_RESET_ROUTING
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
+ # SlotSet(ROUTE_TO_CALM_SLOT, None) is needed to ensure the routing slot
613
+ # is really reset to None and not just reset to an initial value
614
+ return [RoutingSessionEnded(), SlotSet(ROUTE_TO_CALM_SLOT, None)]
615
+
616
+
617
+ class ActionRestart(ActionBotResponse):
618
+ """Resets the tracker to its initial state.
619
+
620
+ Utters the restart response if available.
621
+ """
622
+
623
+ def name(self) -> Text:
624
+ """Returns action restart name."""
625
+ return ACTION_RESTART_NAME
626
+
627
+ def __init__(self) -> None:
628
+ """Initializes action restart."""
629
+ super().__init__("utter_restart", silent_fail=True)
630
+
631
+ async def run(
632
+ self,
633
+ output_channel: "OutputChannel",
634
+ nlg: "NaturalLanguageGenerator",
635
+ tracker: "DialogueStateTracker",
636
+ domain: "Domain",
637
+ metadata: Optional[Dict[Text, Any]] = None,
638
+ ) -> List[Event]:
639
+ """Runs action. Please see parent class for the full docstring."""
640
+ # only utter the response if it is available
641
+ evts = await super().run(output_channel, nlg, tracker, domain)
642
+
643
+ return evts + [Restarted()]
644
+
645
+
646
+ class ActionSessionStart(Action):
647
+ """Applies a conversation session start.
648
+
649
+ Takes all `SlotSet` events from the previous session and applies them to the new
650
+ session.
651
+ """
652
+
653
+ def name(self) -> Text:
654
+ """Returns action start name."""
655
+ return ACTION_SESSION_START_NAME
656
+
657
+ @staticmethod
658
+ def _slot_set_events_from_tracker(
659
+ tracker: "DialogueStateTracker",
660
+ ) -> List["SlotSet"]:
661
+ """Fetch SlotSet events from tracker and carry over key, value and metadata."""
662
+ return [
663
+ SlotSet(key=event.key, value=event.value, metadata=event.metadata)
664
+ for event in tracker.applied_events()
665
+ if isinstance(event, SlotSet)
666
+ ]
667
+
668
+ async def run(
669
+ self,
670
+ output_channel: "OutputChannel",
671
+ nlg: "NaturalLanguageGenerator",
672
+ tracker: "DialogueStateTracker",
673
+ domain: "Domain",
674
+ metadata: Optional[Dict[Text, Any]] = None,
675
+ ) -> List[Event]:
676
+ """Runs action. Please see parent class for the full docstring."""
677
+ _events: List[Event] = [SessionStarted()]
678
+
679
+ if domain.session_config.carry_over_slots:
680
+ _events.extend(self._slot_set_events_from_tracker(tracker))
681
+
682
+ _events.append(ActionExecuted(ACTION_LISTEN_NAME))
683
+
684
+ return _events
685
+
686
+
687
+ class ActionDefaultFallback(ActionBotResponse):
688
+ """Executes the fallback action and goes back to the prev state of the dialogue."""
689
+
690
+ def name(self) -> Text:
691
+ """Returns action default fallback name."""
692
+ return ACTION_DEFAULT_FALLBACK_NAME
693
+
694
+ def __init__(self) -> None:
695
+ """Initializes action default fallback."""
696
+ super().__init__("utter_default", silent_fail=True)
697
+
698
+ async def run(
699
+ self,
700
+ output_channel: "OutputChannel",
701
+ nlg: "NaturalLanguageGenerator",
702
+ tracker: "DialogueStateTracker",
703
+ domain: "Domain",
704
+ metadata: Optional[Dict[Text, Any]] = None,
705
+ ) -> List[Event]:
706
+ """Runs action. Please see parent class for the full docstring."""
707
+ # only utter the response if it is available
708
+ evts = await super().run(output_channel, nlg, tracker, domain)
709
+
710
+ return evts + [UserUtteranceReverted()]
711
+
712
+
713
+ class ActionDeactivateLoop(Action):
714
+ """Deactivates an active loop."""
715
+
716
+ def name(self) -> Text:
717
+ return ACTION_DEACTIVATE_LOOP_NAME
718
+
719
+ async def run(
720
+ self,
721
+ output_channel: "OutputChannel",
722
+ nlg: "NaturalLanguageGenerator",
723
+ tracker: "DialogueStateTracker",
724
+ domain: "Domain",
725
+ metadata: Optional[Dict[Text, Any]] = None,
726
+ ) -> List[Event]:
727
+ """Runs action. Please see parent class for the full docstring."""
728
+ return [ActiveLoop(None), SlotSet(REQUESTED_SLOT, None)]
729
+
730
+
731
+ class RemoteActionJSONValidator:
732
+ """
733
+ A validator class for ensuring that the JSON response from a custom action executor
734
+ adheres to the expected schema.
735
+ """
736
+
737
+ @staticmethod
738
+ def action_response_format_spec() -> Dict[Text, Any]:
739
+ """Expected response schema for an Action endpoint.
740
+
741
+ Used for validation of the response returned from the
742
+ Action endpoint.
743
+
744
+ Returns:
745
+ Dict[Text, Any]: A dictionary representing the JSON schema for validation.
746
+ """
747
+ schema = {
748
+ "type": "object",
749
+ "properties": {
750
+ "events": EVENTS_SCHEMA,
751
+ "responses": {"type": "array", "items": {"type": "object"}},
752
+ },
753
+ }
754
+ return schema
755
+
756
+ @classmethod
757
+ def validate(cls, result: Dict[Text, Any]) -> bool:
758
+ """
759
+ Validate the given JSON result against the expected Action response schema.
760
+
761
+ This method uses a cached JSON schema validator to check if the provided result
762
+ conforms to the predefined schema.
763
+
764
+ Args:
765
+ result (Dict[Text, Any]): The JSON response to validate.
766
+
767
+ Returns:
768
+ bool: True if validation is successful.
769
+
770
+ Raises:
771
+ ValidationError: If the JSON response does not conform to the schema.
772
+ """
773
+ from jsonschema import ValidationError
774
+
775
+ try:
776
+ validator = cls.get_action_response_validator()
777
+ validator.validate(
778
+ result, RemoteActionJSONValidator.action_response_format_spec()
779
+ )
780
+ return True
781
+ except ValidationError as e:
782
+ e.message += (
783
+ f". Failed to validate Action server response from API, "
784
+ f"make sure your response from the Action endpoint is valid. "
785
+ f"For more information about the format visit "
786
+ f"{DOCS_BASE_URL}/custom-actions"
787
+ )
788
+ raise e
789
+
790
+ @classmethod
791
+ @lru_cache(maxsize=1)
792
+ def get_action_response_validator(cls) -> Draft202012Validator:
793
+ """
794
+ Retrieve a cached JSON schema validator for the Action response schema.
795
+
796
+ Returns:
797
+ Draft202012Validator: An instance of the JSON schema validator.
798
+ """
799
+ return Draft202012Validator(cls.action_response_format_spec())
800
+
801
+
802
+ class RemoteAction(Action):
803
+ def __init__(
804
+ self,
805
+ name: Text,
806
+ action_endpoint: Optional[EndpointConfig] = None,
807
+ ) -> None:
808
+ self._name = name
809
+ self.action_endpoint = action_endpoint
810
+ self.executor = self._create_executor()
811
+
812
+ @lru_cache(maxsize=1)
813
+ def _create_executor(self) -> CustomActionExecutor:
814
+ """Creates an executor based on the action endpoint configuration.
815
+
816
+ Returns:
817
+ An instance of CustomActionExecutor.
818
+
819
+ Raises:
820
+ RasaException: If no valid action endpoint is configured.
821
+ """
822
+ if not self.action_endpoint:
823
+ return NoEndpointCustomActionExecutor(self.name())
824
+
825
+ if self.action_endpoint.kwargs.get(KEY_STUB_CUSTOM_ACTIONS):
826
+ return E2EStubCustomActionExecutor(self.name(), self.action_endpoint)
827
+
828
+ if self.action_endpoint.url and self.action_endpoint.actions_module:
829
+ raise_warning(
830
+ "Both 'actions_module' and 'url' are defined. "
831
+ "As they are mutually exclusive and 'actions_module' "
832
+ "is prioritized, actions will be executed by the assistant."
833
+ )
834
+
835
+ if self.action_endpoint and self.action_endpoint.actions_module:
836
+ return DirectCustomActionExecutor(self.name(), self.action_endpoint)
837
+
838
+ url_schema = get_url_schema(self.action_endpoint.url)
839
+
840
+ if url_schema == UrlSchema.GRPC:
841
+ return RetryCustomActionExecutor(
842
+ GRPCCustomActionExecutor(self.name(), self.action_endpoint)
843
+ )
844
+ elif (
845
+ url_schema == UrlSchema.HTTP
846
+ or url_schema == UrlSchema.HTTPS
847
+ or url_schema == UrlSchema.NOT_SPECIFIED
848
+ ):
849
+ return RetryCustomActionExecutor(
850
+ HTTPCustomActionExecutor(self.name(), self.action_endpoint)
851
+ )
852
+ raise RasaException(
853
+ f"Failed to create a custom action executor. "
854
+ f"Please make sure to include an action endpoint configuration in your "
855
+ f"endpoints configuration file. Make sure that for grpc, http and https "
856
+ f"an url schema is set. "
857
+ f"Found url '{self.action_endpoint.url}'."
858
+ )
859
+
860
+ @staticmethod
861
+ async def _utter_responses(
862
+ responses: List[Dict[Text, Any]],
863
+ output_channel: "OutputChannel",
864
+ nlg: "NaturalLanguageGenerator",
865
+ tracker: "DialogueStateTracker",
866
+ **kwargs: Any,
867
+ ) -> List[BotUttered]:
868
+ """Use the responses generated by the action endpoint and utter them."""
869
+ bot_messages = []
870
+ domain: Domain = kwargs.get("domain", None)
871
+ action_name: str = kwargs.get("action_name", None)
872
+ for response in responses:
873
+ generated_response = response.pop("response", None)
874
+ if generated_response is not None:
875
+ draft = await nlg.generate(
876
+ generated_response, tracker, output_channel.name(), **response
877
+ )
878
+ if not draft:
879
+ continue
880
+ draft = add_bot_utterance_metadata(
881
+ draft, generated_response, nlg, domain, tracker
882
+ )
883
+ else:
884
+ draft = {UTTER_SOURCE_METADATA_KEY: action_name}
885
+
886
+ buttons = response.pop("buttons", []) or []
887
+ if buttons:
888
+ draft.setdefault("buttons", [])
889
+ draft["buttons"].extend(buttons)
890
+
891
+ # Avoid overwriting `draft` values with empty values
892
+ response = {k: v for k, v in response.items() if v}
893
+ draft.update(response)
894
+ bot_messages.append(create_bot_utterance(draft))
895
+
896
+ return bot_messages
897
+
898
+ async def run(
899
+ self,
900
+ output_channel: "OutputChannel",
901
+ nlg: "NaturalLanguageGenerator",
902
+ tracker: "DialogueStateTracker",
903
+ domain: "Domain",
904
+ metadata: Optional[Dict[Text, Any]] = None,
905
+ ) -> List[Event]:
906
+ """Runs action. Please see parent class for the full docstring."""
907
+ response = await self.executor.run(
908
+ domain=domain,
909
+ tracker=tracker,
910
+ )
911
+
912
+ events_json = response.get("events", [])
913
+ responses = response.get("responses", [])
914
+ bot_messages = await self._utter_responses(
915
+ responses,
916
+ output_channel,
917
+ nlg,
918
+ tracker,
919
+ domain=domain,
920
+ action_name=self.name(),
921
+ )
922
+
923
+ events = rasa.shared.core.events.deserialise_events(events_json)
924
+ return cast(List[Event], bot_messages) + events
925
+
926
+ def name(self) -> Text:
927
+ return self._name
928
+
929
+
930
+ class ActionRevertFallbackEvents(Action):
931
+ """Reverts events which were done during the `TwoStageFallbackPolicy`.
932
+
933
+ This reverts user messages and bot utterances done during a fallback
934
+ of the `TwoStageFallbackPolicy`. By doing so it is not necessary to
935
+ write custom stories for the different paths, but only of the happy
936
+ path. This is deprecated and can be removed once the
937
+ `TwoStageFallbackPolicy` is removed.
938
+ """
939
+
940
+ def name(self) -> Text:
941
+ return ACTION_REVERT_FALLBACK_EVENTS_NAME
942
+
943
+ async def run(
944
+ self,
945
+ output_channel: "OutputChannel",
946
+ nlg: "NaturalLanguageGenerator",
947
+ tracker: "DialogueStateTracker",
948
+ domain: "Domain",
949
+ metadata: Optional[Dict[Text, Any]] = None,
950
+ ) -> List[Event]:
951
+ """Runs action. Please see parent class for the full docstring."""
952
+ from rasa.core.policies.two_stage_fallback import has_user_rephrased
953
+
954
+ # User rephrased
955
+ if has_user_rephrased(tracker):
956
+ return _revert_successful_rephrasing(tracker)
957
+ # User affirmed
958
+ elif has_user_affirmed(tracker):
959
+ return _revert_affirmation_events(tracker)
960
+ else:
961
+ return []
962
+
963
+
964
+ class ActionUnlikelyIntent(Action):
965
+ """An action that indicates that the intent predicted by NLU is unexpected.
966
+
967
+ This action can be predicted by `UnexpecTEDIntentPolicy`.
968
+ """
969
+
970
+ def name(self) -> Text:
971
+ """Returns the name of the action."""
972
+ return ACTION_UNLIKELY_INTENT_NAME
973
+
974
+ async def run(
975
+ self,
976
+ output_channel: "OutputChannel",
977
+ nlg: "NaturalLanguageGenerator",
978
+ tracker: "DialogueStateTracker",
979
+ domain: "Domain",
980
+ metadata: Optional[Dict[Text, Any]] = None,
981
+ ) -> List[Event]:
982
+ """Runs action. Please see parent class for the full docstring."""
983
+ return []
984
+
985
+
986
+ def has_user_affirmed(tracker: "DialogueStateTracker") -> bool:
987
+ """Indicates if the last executed action is `action_default_ask_affirmation`."""
988
+ return tracker.last_executed_action_has(ACTION_DEFAULT_ASK_AFFIRMATION_NAME)
989
+
990
+
991
+ def _revert_affirmation_events(tracker: "DialogueStateTracker") -> List[Event]:
992
+ revert_events = _revert_single_affirmation_events()
993
+
994
+ # User affirms the rephrased intent
995
+ rephrased_intent = tracker.last_executed_action_has(
996
+ name=ACTION_DEFAULT_ASK_REPHRASE_NAME, skip=1
997
+ )
998
+ if rephrased_intent:
999
+ revert_events += _revert_rephrasing_events()
1000
+
1001
+ last_user_event = tracker.get_last_event_for(UserUttered)
1002
+ if not last_user_event:
1003
+ raise TypeError("Cannot find last event to revert to.")
1004
+
1005
+ last_user_event = copy.deepcopy(last_user_event)
1006
+ # FIXME: better type annotation for `parse_data` would require
1007
+ # a larger refactoring (e.g. switch to dataclass)
1008
+ last_user_event.parse_data["intent"]["confidence"] = 1.0 # type: ignore[typeddict-item]
1009
+
1010
+ return revert_events + [last_user_event]
1011
+
1012
+
1013
+ def _revert_single_affirmation_events() -> List[Event]:
1014
+ return [
1015
+ UserUtteranceReverted(), # revert affirmation and request
1016
+ # revert original intent (has to be re-added later)
1017
+ UserUtteranceReverted(),
1018
+ # add action listen intent
1019
+ ActionExecuted(action_name=ACTION_LISTEN_NAME),
1020
+ ]
1021
+
1022
+
1023
+ def _revert_successful_rephrasing(tracker: "DialogueStateTracker") -> List[Event]:
1024
+ last_user_event = tracker.get_last_event_for(UserUttered)
1025
+ if not last_user_event:
1026
+ raise TypeError("Cannot find last event to revert to.")
1027
+
1028
+ last_user_event = copy.deepcopy(last_user_event)
1029
+ return _revert_rephrasing_events() + [last_user_event]
1030
+
1031
+
1032
+ def _revert_rephrasing_events() -> List[Event]:
1033
+ return [
1034
+ UserUtteranceReverted(), # remove rephrasing
1035
+ # remove feedback and rephrase request
1036
+ UserUtteranceReverted(),
1037
+ # remove affirmation request and false intent
1038
+ UserUtteranceReverted(),
1039
+ # replace action with action listen
1040
+ ActionExecuted(action_name=ACTION_LISTEN_NAME),
1041
+ ]
1042
+
1043
+
1044
+ class ActionDefaultAskAffirmation(Action):
1045
+ """Default implementation which asks the user to affirm his intent.
1046
+
1047
+ It is suggested to overwrite this default action with a custom action
1048
+ to have more meaningful prompts for the affirmations. E.g. have a
1049
+ description of the intent instead of its identifier name.
1050
+ """
1051
+
1052
+ def name(self) -> Text:
1053
+ return ACTION_DEFAULT_ASK_AFFIRMATION_NAME
1054
+
1055
+ async def run(
1056
+ self,
1057
+ output_channel: "OutputChannel",
1058
+ nlg: "NaturalLanguageGenerator",
1059
+ tracker: "DialogueStateTracker",
1060
+ domain: "Domain",
1061
+ metadata: Optional[Dict[Text, Any]] = None,
1062
+ ) -> List[Event]:
1063
+ """Runs action. Please see parent class for the full docstring."""
1064
+ latest_message = tracker.latest_message
1065
+ if latest_message is None:
1066
+ raise TypeError(
1067
+ "Cannot find last user message for detecting fallback affirmation."
1068
+ )
1069
+
1070
+ intent_to_affirm = latest_message.intent.get(INTENT_NAME_KEY)
1071
+
1072
+ # FIXME: better type annotation for `parse_data` would require
1073
+ # a larger refactoring (e.g. switch to dataclass)
1074
+ intent_ranking = cast(
1075
+ List["IntentPrediction"],
1076
+ latest_message.parse_data.get(INTENT_RANKING_KEY) or [],
1077
+ )
1078
+ if (
1079
+ intent_to_affirm == DEFAULT_NLU_FALLBACK_INTENT_NAME
1080
+ and len(intent_ranking) > 1
1081
+ ):
1082
+ intent_to_affirm = intent_ranking[1][INTENT_NAME_KEY] # type: ignore[literal-required]
1083
+
1084
+ affirmation_message = f"Did you mean '{intent_to_affirm}'?"
1085
+
1086
+ message = {
1087
+ "text": affirmation_message,
1088
+ "buttons": [
1089
+ {"title": "Yes", "payload": f"/{intent_to_affirm}"},
1090
+ {"title": "No", "payload": f"/{USER_INTENT_OUT_OF_SCOPE}"},
1091
+ ],
1092
+ "utter_action": self.name(),
1093
+ }
1094
+
1095
+ return [create_bot_utterance(message)]
1096
+
1097
+
1098
+ class ActionDefaultAskRephrase(ActionBotResponse):
1099
+ """Default implementation which asks the user to rephrase his intent."""
1100
+
1101
+ def name(self) -> Text:
1102
+ """Returns action default ask rephrase name."""
1103
+ return ACTION_DEFAULT_ASK_REPHRASE_NAME
1104
+
1105
+ def __init__(self) -> None:
1106
+ """Initializes action default ask rephrase."""
1107
+ super().__init__("utter_ask_rephrase", silent_fail=True)
1108
+
1109
+
1110
+ class ActionSendText(Action):
1111
+ """Sends a text message to the output channel."""
1112
+
1113
+ def name(self) -> Text:
1114
+ return ACTION_SEND_TEXT_NAME
1115
+
1116
+ async def run(
1117
+ self,
1118
+ output_channel: "OutputChannel",
1119
+ nlg: "NaturalLanguageGenerator",
1120
+ tracker: "DialogueStateTracker",
1121
+ domain: "Domain",
1122
+ metadata: Optional[Dict[Text, Any]] = None,
1123
+ ) -> List[Event]:
1124
+ """Runs action. Please see parent class for the full docstring."""
1125
+ fallback = {"text": ""}
1126
+ metadata_copy = copy.deepcopy(metadata) if metadata else {}
1127
+ message = metadata_copy.get("message", fallback)
1128
+ return [create_bot_utterance(message)]
1129
+
1130
+
1131
+ class ActionExtractSlots(Action):
1132
+ """Default action that runs after each user turn.
1133
+
1134
+ Action is executed automatically in MessageProcessor.handle_message(...)
1135
+ before the next predicted action is run.
1136
+
1137
+ Set slots to extracted values from user message
1138
+ according to assigned slot mappings.
1139
+ """
1140
+
1141
+ def __init__(self, action_endpoint: Optional[EndpointConfig]) -> None:
1142
+ """Initializes default action extract slots."""
1143
+ self._action_endpoint = action_endpoint
1144
+
1145
+ def name(self) -> Text:
1146
+ """Returns action_extract_slots name."""
1147
+ return ACTION_EXTRACT_SLOTS
1148
+
1149
+ async def _run_custom_action(
1150
+ self,
1151
+ custom_action: Text,
1152
+ output_channel: "OutputChannel",
1153
+ nlg: "NaturalLanguageGenerator",
1154
+ tracker: "DialogueStateTracker",
1155
+ domain: "Domain",
1156
+ ) -> List[Event]:
1157
+ slot_events: List[Event] = []
1158
+ remote_action = RemoteAction(custom_action, self._action_endpoint)
1159
+ disallowed_types = set()
1160
+
1161
+ try:
1162
+ custom_events = await remote_action.run(
1163
+ output_channel, nlg, tracker, domain
1164
+ )
1165
+ for event in custom_events:
1166
+ if isinstance(event, SlotSet):
1167
+ slot_events.append(event)
1168
+ elif isinstance(event, BotUttered):
1169
+ slot_events.append(event)
1170
+ else:
1171
+ disallowed_types.add(event.type_name)
1172
+ except (RasaException, ClientResponseError) as e:
1173
+ logger.warning(
1174
+ f"Failed to execute custom action '{custom_action}' "
1175
+ f"as a result of error '{e!s}'. The default action "
1176
+ f"'{self.name()}' failed to fill slots with custom "
1177
+ f"mappings."
1178
+ )
1179
+
1180
+ for type_name in disallowed_types:
1181
+ logger.info(
1182
+ f"Running custom action '{custom_action}' has resulted "
1183
+ f"in an event of type '{type_name}'. This is "
1184
+ f"disallowed and the tracker will not be "
1185
+ f"updated with this event."
1186
+ )
1187
+
1188
+ return slot_events
1189
+
1190
+ async def _execute_custom_action(
1191
+ self,
1192
+ mapping: Dict[Text, Any],
1193
+ executed_custom_actions: Set[Text],
1194
+ output_channel: "OutputChannel",
1195
+ nlg: "NaturalLanguageGenerator",
1196
+ tracker: "DialogueStateTracker",
1197
+ domain: "Domain",
1198
+ calm_custom_action_names: Optional[Set[str]] = None,
1199
+ ) -> Tuple[List[Event], Set[Text]]:
1200
+ custom_action = mapping.get("action")
1201
+
1202
+ if not custom_action or custom_action in executed_custom_actions:
1203
+ return [], executed_custom_actions
1204
+
1205
+ if (
1206
+ calm_custom_action_names is not None
1207
+ and custom_action in calm_custom_action_names
1208
+ ):
1209
+ return [], executed_custom_actions
1210
+
1211
+ slot_events = await self._run_custom_action(
1212
+ custom_action, output_channel, nlg, tracker, domain
1213
+ )
1214
+
1215
+ executed_custom_actions.add(custom_action)
1216
+
1217
+ return slot_events, executed_custom_actions
1218
+
1219
+ async def _execute_validation_action(
1220
+ self,
1221
+ extraction_events: List[Event],
1222
+ output_channel: "OutputChannel",
1223
+ nlg: "NaturalLanguageGenerator",
1224
+ tracker: "DialogueStateTracker",
1225
+ domain: "Domain",
1226
+ ) -> List[Event]:
1227
+ slot_events: List[SlotSet] = [
1228
+ event for event in extraction_events if isinstance(event, SlotSet)
1229
+ ]
1230
+
1231
+ slot_candidates = "\n".join([e.key for e in slot_events])
1232
+ logger.debug(f"Validating extracted slots: {slot_candidates}")
1233
+
1234
+ if ACTION_VALIDATE_SLOT_MAPPINGS not in domain.user_actions:
1235
+ return cast(List[Event], slot_events)
1236
+
1237
+ _tracker = DialogueStateTracker.from_events(
1238
+ tracker.sender_id,
1239
+ tracker.events_after_latest_restart() + cast(List[Event], slot_events),
1240
+ slots=domain.slots,
1241
+ )
1242
+ validate_events = await self._run_custom_action(
1243
+ ACTION_VALIDATE_SLOT_MAPPINGS, output_channel, nlg, _tracker, domain
1244
+ )
1245
+ validated_slot_names = [
1246
+ event.key for event in validate_events if isinstance(event, SlotSet)
1247
+ ]
1248
+
1249
+ # If the custom action doesn't return a SlotSet event for an extracted slot
1250
+ # candidate we assume that it was valid. The custom action has to return a
1251
+ # SlotSet(slot_name, None) event to mark a Slot as invalid.
1252
+ return validate_events + [
1253
+ event for event in slot_events if event.key not in validated_slot_names
1254
+ ]
1255
+
1256
+ async def run(
1257
+ self,
1258
+ output_channel: "OutputChannel",
1259
+ nlg: "NaturalLanguageGenerator",
1260
+ tracker: "DialogueStateTracker",
1261
+ domain: "Domain",
1262
+ metadata: Optional[Dict[Text, Any]] = None,
1263
+ ) -> List[Event]:
1264
+ """Runs action. Please see parent class for the full docstring."""
1265
+ slot_events: List[Event] = []
1266
+ executed_custom_actions: Set[Text] = set()
1267
+
1268
+ user_slots = [
1269
+ slot
1270
+ for slot in domain.slots
1271
+ if slot.name not in DEFAULT_SLOT_NAMES | KNOWLEDGE_BASE_SLOT_NAMES
1272
+ ]
1273
+
1274
+ calm_slot_names = set()
1275
+ calm_custom_action_names = None
1276
+ flows = None
1277
+
1278
+ if metadata is not None:
1279
+ flows = metadata.get("all_flows")
1280
+
1281
+ if flows is not None:
1282
+ flows = FlowsList.from_json(flows)
1283
+ calm_slot_names = flows.available_slot_names()
1284
+ calm_custom_action_names = flows.available_custom_actions()
1285
+
1286
+ slot_filling_manager = SlotFillingManager(
1287
+ domain, tracker, action_endpoint=self._action_endpoint
1288
+ )
1289
+
1290
+ for slot in user_slots:
1291
+ if slot.name in calm_slot_names:
1292
+ continue
1293
+
1294
+ slot_value, is_extracted = extract_slot_value(slot, slot_filling_manager)
1295
+ if is_extracted:
1296
+ slot_events.append(SlotSet(slot.name, slot_value))
1297
+
1298
+ for mapping in slot.mappings:
1299
+ mapping_type = SlotMappingType(mapping.get(MAPPING_TYPE))
1300
+ should_fill_custom_slot = mapping_type == SlotMappingType.CUSTOM
1301
+
1302
+ if should_fill_custom_slot:
1303
+ (
1304
+ custom_evts,
1305
+ executed_custom_actions,
1306
+ ) = await self._execute_custom_action(
1307
+ mapping,
1308
+ executed_custom_actions,
1309
+ output_channel,
1310
+ nlg,
1311
+ tracker,
1312
+ domain,
1313
+ calm_custom_action_names,
1314
+ )
1315
+ slot_events.extend(custom_evts)
1316
+
1317
+ validated_events = await self._execute_validation_action(
1318
+ slot_events, output_channel, nlg, tracker, domain
1319
+ )
1320
+ return validated_events