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