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,403 @@
1
+ from sanic import Blueprint, response
2
+ from sanic.request import Request, RequestParameters
3
+ from sanic.response import HTTPResponse
4
+ from twilio.twiml.voice_response import VoiceResponse, Gather
5
+ from typing import Text, Callable, Awaitable, List, Any, Dict, Optional
6
+ from dataclasses import asdict
7
+
8
+ import structlog
9
+ import rasa.utils.io
10
+ import rasa.shared.utils.io
11
+ from rasa.shared.core.events import BotUttered
12
+ from rasa.shared.exceptions import InvalidConfigException
13
+ from rasa.core.channels.channel import (
14
+ InputChannel,
15
+ CollectingOutputChannel,
16
+ UserMessage,
17
+ )
18
+ from rasa.core.channels.voice_ready.utils import CallParameters
19
+
20
+ logger = structlog.get_logger(__name__)
21
+
22
+
23
+ def map_call_params(form: RequestParameters) -> CallParameters:
24
+ """Map the Audiocodes parameters to the CallParameters dataclass."""
25
+ return CallParameters(
26
+ call_id=form.get("CallSid"),
27
+ user_phone=form.get("Caller"),
28
+ bot_phone=form.get("Called"),
29
+ direction=form.get("Direction"),
30
+ )
31
+
32
+
33
+ class TwilioVoiceInput(InputChannel):
34
+ """Input channel for Twilio Voice."""
35
+
36
+ SUPPORTED_VOICES = [ # noqa: RUF012
37
+ "man",
38
+ "woman",
39
+ "alice",
40
+ "Polly.Mads",
41
+ "Polly.Naja",
42
+ "Polly.Lotte",
43
+ "Polly.Reuben",
44
+ "Polly.Nicole",
45
+ "Polly.Russell",
46
+ "Polly.Amy",
47
+ "Polly.Brian",
48
+ "Polly.Emma",
49
+ "Polly.Amy-Neural",
50
+ "Polly.Emma-Neural",
51
+ "Polly.Brian-Neural",
52
+ "Polly.Raveena",
53
+ "Polly.Ivy",
54
+ "Polly.Joanna",
55
+ "Polly.Joey",
56
+ "Polly.Justin",
57
+ "Polly.Kendra",
58
+ "Polly.Kimberly",
59
+ "Polly.Matthew",
60
+ "Polly.Salli",
61
+ "Polly.Ivy-Neural",
62
+ "Polly.Joanna-Neural",
63
+ "Polly.Kendra-Neural",
64
+ "Polly.Kimberly-Neural",
65
+ "Polly.Sally-Neural",
66
+ "Polly.Joey-Neural",
67
+ "Polly.Justin-Neural",
68
+ "Polly.Matthew-Neural",
69
+ "Polly.Geraint",
70
+ "Polly.Celine",
71
+ "Polly.Mathieu",
72
+ "Polly.Chantal",
73
+ "Polly.Hans",
74
+ "Polly.Marlene",
75
+ "Polly.Vicki",
76
+ "Polly.Dora",
77
+ "Polly.Karl",
78
+ "Polly.Carla",
79
+ "Polly.Giorgio",
80
+ "Polly.Mizuki",
81
+ "Polly.Takumi",
82
+ "Polly.Liv",
83
+ "Polly.Jacek",
84
+ "Polly.Jan",
85
+ "Polly.Ewa",
86
+ "Polly.Maja",
87
+ "Polly.Ricardo",
88
+ "Polly.Vitoria",
89
+ "Polly.Camila-Neural",
90
+ "Polly.Cristiano",
91
+ "Polly.Ines",
92
+ "Polly.Carmen",
93
+ "Polly.Maxim",
94
+ "Polly.Tatyana",
95
+ "Polly.Conchita",
96
+ "Polly.Enrique",
97
+ "Polly.Miguel",
98
+ "Polly.Penelope",
99
+ "Polly.Lupe-Neural",
100
+ "Polly.Astrid",
101
+ "Polly.Filiz",
102
+ "Polly.Gwyneth",
103
+ "Polly.Aditi",
104
+ ]
105
+
106
+ SUPPORTED_SPEECH_MODELS = [ # noqa: RUF012
107
+ "default",
108
+ "numbers_and_commands",
109
+ "phone_call",
110
+ ]
111
+
112
+ @classmethod
113
+ def name(cls) -> Text:
114
+ """Name of channel."""
115
+ return "twilio_voice"
116
+
117
+ @classmethod
118
+ def from_credentials(cls, credentials: Optional[Dict[Text, Any]]) -> InputChannel:
119
+ """Load custom configurations."""
120
+ credentials = credentials or {}
121
+
122
+ return cls(
123
+ credentials.get(
124
+ "reprompt_fallback_phrase",
125
+ "I'm sorry I didn't get that could you rephrase.",
126
+ ),
127
+ credentials.get("assistant_voice", "woman"),
128
+ credentials.get("speech_timeout", "5"),
129
+ credentials.get("speech_model", "default"),
130
+ credentials.get("enhanced", "false"),
131
+ )
132
+
133
+ def __init__(
134
+ self,
135
+ reprompt_fallback_phrase: Optional[Text],
136
+ assistant_voice: Optional[Text],
137
+ speech_timeout: Text = "5",
138
+ speech_model: Text = "default",
139
+ enhanced: Text = "false",
140
+ ) -> None:
141
+ """Creates a connection to Twilio voice.
142
+
143
+ Args:
144
+ reprompt_fallback_phrase: phrase to use if no user response.
145
+ assistant_voice: name of the assistant voice to use.
146
+ speech_timeout: how long to pause when user finished speaking.
147
+ speech_model: type of transcription model to use from Twilio.
148
+ enhanced: toggle to use Twilio's premium speech transcription model.
149
+ """
150
+ self.reprompt_fallback_phrase = reprompt_fallback_phrase
151
+ self.assistant_voice = assistant_voice
152
+ self.speech_timeout = speech_timeout
153
+ self.speech_model = speech_model
154
+ self.enhanced = enhanced
155
+
156
+ self._validate_configuration()
157
+
158
+ def _validate_configuration(self) -> None:
159
+ """Checks that the user configurations are valid."""
160
+ if self.assistant_voice not in self.SUPPORTED_VOICES:
161
+ self._raise_invalid_voice_exception()
162
+
163
+ try:
164
+ int(self.speech_timeout)
165
+ except ValueError:
166
+ if self.speech_timeout.lower() != "auto":
167
+ self._raise_invalid_speech_timeout_exception()
168
+
169
+ if self.speech_model not in self.SUPPORTED_SPEECH_MODELS:
170
+ self._raise_invalid_speech_model_exception()
171
+
172
+ if self.enhanced.lower() not in [
173
+ "true",
174
+ "false",
175
+ ]:
176
+ self._raise_invalid_enhanced_option_exception()
177
+
178
+ if (
179
+ self.enhanced.lower() == "true"
180
+ and self.speech_model.lower() != "phone_call"
181
+ ):
182
+ self._raise_invalid_enhanced_speech_model_exception()
183
+
184
+ if (
185
+ self.speech_model.lower() != "numbers_and_commands"
186
+ and self.speech_timeout.lower() == "auto"
187
+ ):
188
+ self._raise_invalid_speech_model_timeout_exception()
189
+
190
+ def _raise_invalid_speech_model_timeout_exception(self) -> None:
191
+ """Raises an error if incompatible speech_timeout and speech_model used."""
192
+ raise InvalidConfigException(
193
+ "If speech_timeout is 'auto' the speech_model must be "
194
+ "'numbers_and_commands'. Please update your speech_model "
195
+ "to be 'numbers_and_commands' if you would like to continue "
196
+ "using the 'auto' speech_model."
197
+ )
198
+
199
+ def _raise_invalid_enhanced_option_exception(self) -> None:
200
+ """Raises an error if an invalid value is passed to the enhanced parameter."""
201
+ raise InvalidConfigException(
202
+ f"The value {self.enhanced} is invalid for the enhanced parameter. "
203
+ f"You must provide either `true` or `false` for this value."
204
+ )
205
+
206
+ def _raise_invalid_speech_model_exception(self) -> None:
207
+ """Raises an error if an invalid speech_model is provided."""
208
+ raise InvalidConfigException(
209
+ f"The value {self.speech_model} for speech_model is invalid. "
210
+ f"You must choose one of 'default', 'numbers_and_commands', "
211
+ f"or 'phone_call'. Refer to the documentation for details "
212
+ f"about the selections."
213
+ )
214
+
215
+ def _raise_invalid_speech_timeout_exception(self) -> None:
216
+ """Raises an error if an invalid speech_timeout is provided."""
217
+ raise InvalidConfigException(
218
+ f"The vale {self.speech_timeout} is an invalid value for speech_timeout. "
219
+ f"Only integers and 'auto' are valid entries."
220
+ )
221
+
222
+ def _raise_invalid_voice_exception(self) -> None:
223
+ """Raises an error if an invalid voice is provided."""
224
+ raise InvalidConfigException(
225
+ f"The value {self.assistant_voice} is an invalid for assistant_voice. "
226
+ f"Please refer to the documentation for a list of valid voices "
227
+ f"you can use for your voice assistant."
228
+ )
229
+
230
+ def _raise_invalid_enhanced_speech_model_exception(self) -> None:
231
+ """Raises error if enhanced is used with an incompatible speech_model."""
232
+ raise InvalidConfigException(
233
+ f"If you set enhanced to 'true' then speech_model must be 'phone_call'. "
234
+ f"Current speech_model is: {self.speech_model}."
235
+ )
236
+
237
+ def blueprint(
238
+ self, on_new_message: Callable[[UserMessage], Awaitable[None]]
239
+ ) -> Blueprint:
240
+ """Defines endpoints for Twilio voice channel."""
241
+ twilio_voice_webhook = Blueprint("Twilio_voice_webhook", __name__)
242
+
243
+ @twilio_voice_webhook.route("/", methods=["GET"])
244
+ async def health(request: Request) -> HTTPResponse:
245
+ return response.json({"status": "ok"})
246
+
247
+ @twilio_voice_webhook.route("/webhook", methods=["POST"])
248
+ async def receive(request: Request) -> HTTPResponse:
249
+ sender_id = request.form.get("From")
250
+ text = request.form.get("SpeechResult")
251
+ input_channel = self.name()
252
+ call_status = request.form.get("CallStatus")
253
+ metadata = {}
254
+
255
+ collector = TwilioVoiceCollectingOutputChannel()
256
+
257
+ logger.debug(
258
+ "twilio_voice.webhook",
259
+ sender_id=sender_id,
260
+ text=text,
261
+ call_status=call_status,
262
+ )
263
+ # Provide an initial greeting to answer the user's call.
264
+ if (text is None) and (call_status == "ringing"):
265
+ text = "/session_start"
266
+ metadata = asdict(map_call_params(request.form))
267
+
268
+ # when call is disconnected
269
+ if call_status == "completed":
270
+ text = "/session_end"
271
+ metadata = {"reason": "user disconnected"}
272
+
273
+ # determine the response.
274
+ if text is not None:
275
+ logger.info("twilio_voice.webhook.text_not_none", sender_id=sender_id)
276
+ await on_new_message(
277
+ UserMessage(
278
+ text,
279
+ collector,
280
+ sender_id,
281
+ input_channel=input_channel,
282
+ metadata=metadata,
283
+ )
284
+ )
285
+
286
+ twilio_response = self._build_twilio_voice_response(collector.messages)
287
+ # If the user doesn't respond resend the last message.
288
+ else:
289
+ logger.info("twilio_voice.webhook.text_none", sender_id=sender_id)
290
+ # Get last user utterance from tracker.
291
+ tracker = await request.app.ctx.agent.tracker_store.retrieve(sender_id)
292
+ last_response = None
293
+ if tracker:
294
+ last_response = next(
295
+ (
296
+ e
297
+ for e in reversed(tracker.events)
298
+ if isinstance(e, BotUttered)
299
+ ),
300
+ None,
301
+ )
302
+
303
+ # If no previous utterance found use the reprompt_fallback phrase.
304
+ if last_response is None:
305
+ last_response_text = self.reprompt_fallback_phrase
306
+ else:
307
+ last_response_text = last_response.text
308
+
309
+ twilio_response = self._build_twilio_voice_response(
310
+ [{"text": last_response_text}]
311
+ )
312
+ return response.text(str(twilio_response), content_type="text/xml")
313
+
314
+ return twilio_voice_webhook
315
+
316
+ def _build_twilio_voice_response(
317
+ self, messages: List[Dict[Text, Any]]
318
+ ) -> VoiceResponse:
319
+ """Builds the Twilio Voice Response object."""
320
+ logger.debug("twilio_voice.build_twilio_voice_response", messages=messages)
321
+ voice_response = VoiceResponse()
322
+ gather = Gather(
323
+ input="speech",
324
+ action=f"/webhooks/{self.name()}/webhook",
325
+ actionOnEmptyResult=True,
326
+ speechTimeout=self.speech_timeout,
327
+ speechModel=self.speech_model,
328
+ enhanced=self.enhanced,
329
+ )
330
+
331
+ # Add pauses between messages.
332
+ # Add a listener to the last message to listen for user response.
333
+ for i, message in enumerate(messages):
334
+ msg_text = message["text"]
335
+ # Check if the message is a hangup message.
336
+ if message.get("custom", {}).get("hangup"):
337
+ voice_response.hangup()
338
+ break
339
+
340
+ if i + 1 == len(messages):
341
+ gather.say(msg_text, voice=self.assistant_voice)
342
+ voice_response.append(gather)
343
+ else:
344
+ voice_response.say(msg_text, voice=self.assistant_voice)
345
+ voice_response.pause(length=1)
346
+
347
+ return voice_response
348
+
349
+
350
+ class TwilioVoiceCollectingOutputChannel(CollectingOutputChannel):
351
+ """Output channel that collects send messages in a list.
352
+
353
+ (doesn't send them anywhere, just collects them).
354
+ """
355
+
356
+ @classmethod
357
+ def name(cls) -> Text:
358
+ """Name of the output channel."""
359
+ return "twilio_voice"
360
+
361
+ async def send_text_message(
362
+ self, recipient_id: Text, text: Text, **kwargs: Any
363
+ ) -> None:
364
+ """Sends the text message after removing emojis."""
365
+ text = rasa.utils.io.remove_emojis(text)
366
+ for message_part in text.strip().split("\n\n"):
367
+ await self._persist_message(self._message(recipient_id, text=message_part))
368
+
369
+ async def send_text_with_buttons(
370
+ self,
371
+ recipient_id: str,
372
+ text: str,
373
+ buttons: List[Dict[str, Any]],
374
+ **kwargs: Any,
375
+ ) -> None:
376
+ """Uses the concise button output format for voice channels."""
377
+ await self.send_text_with_buttons_concise(recipient_id, text, buttons, **kwargs)
378
+
379
+ async def send_image_url(
380
+ self, recipient_id: Text, image: Text, **kwargs: Any
381
+ ) -> None:
382
+ """For voice channel do not send images."""
383
+ rasa.shared.utils.io.raise_warning(
384
+ "An image was removed from the voice message and "
385
+ "only the text of message was sent. "
386
+ "It's recommended that you define voice-friendly "
387
+ "alternatives for all responses "
388
+ "with a visual elements such as images and emojis "
389
+ "that are used in your voice channel."
390
+ )
391
+
392
+ async def hangup(self, recipient_id: Text, **kwargs: Any) -> None:
393
+ """
394
+ Indicate that the conversation should be ended.
395
+
396
+ Parent class is a collecting output channel, so we don't actually hang up
397
+ but we add a custom message to the list of messages to be sent.
398
+ This message will be picked up by _build_twilio_voice_response
399
+ which will hang up the call.
400
+ """
401
+ await self._persist_message(
402
+ self._message(recipient_id, custom={"hangup": True})
403
+ )
@@ -0,0 +1,37 @@
1
+ import structlog
2
+ from dataclasses import dataclass
3
+ from typing import Optional
4
+
5
+
6
+ structlogger = structlog.get_logger()
7
+
8
+
9
+ def validate_voice_license_scope() -> None:
10
+ from rasa.utils.licensing import (
11
+ PRODUCT_AREA,
12
+ VOICE_SCOPE,
13
+ validate_license_from_env,
14
+ )
15
+
16
+ """Validate that the correct license scope is present."""
17
+ structlogger.info(
18
+ f"Validating current Rasa Pro license scope which must include "
19
+ f"the '{VOICE_SCOPE}' scope to use the voice channel."
20
+ )
21
+
22
+ voice_product_scope = PRODUCT_AREA + " " + VOICE_SCOPE
23
+ validate_license_from_env(product_area=voice_product_scope)
24
+
25
+
26
+ @dataclass
27
+ class CallParameters:
28
+ """Standardized call parameters for voice channels."""
29
+
30
+ call_id: str
31
+ user_phone: str
32
+ bot_phone: str
33
+ user_name: Optional[str] = None
34
+ user_host: Optional[str] = None
35
+ bot_host: Optional[str] = None
36
+ direction: Optional[str] = None
37
+ stream_id: Optional[str] = None
File without changes
File without changes
@@ -0,0 +1,89 @@
1
+ from dataclasses import dataclass
2
+ from typing import (
3
+ Dict,
4
+ AsyncIterator,
5
+ Any,
6
+ Generic,
7
+ Optional,
8
+ Tuple,
9
+ Type,
10
+ TypeVar,
11
+ )
12
+
13
+ from websockets.legacy.client import WebSocketClientProtocol
14
+
15
+ from rasa.core.channels.voice_stream.asr.asr_event import ASREvent
16
+ from rasa.core.channels.voice_stream.audio_bytes import RasaAudioBytes
17
+ from rasa.core.channels.voice_stream.util import MergeableConfig
18
+ from rasa.shared.exceptions import ConnectionException
19
+ from rasa.shared.utils.common import validate_environment
20
+
21
+ T = TypeVar("T", bound="ASREngineConfig")
22
+ E = TypeVar("E", bound="ASREngine")
23
+
24
+
25
+ @dataclass
26
+ class ASREngineConfig(MergeableConfig):
27
+ pass
28
+
29
+
30
+ class ASREngine(Generic[T]):
31
+ required_env_vars: Tuple[str, ...] = ()
32
+ required_packages: Tuple[str, ...] = ()
33
+
34
+ def __init__(self, config: Optional[T] = None):
35
+ self.config = self.get_default_config().merge(config)
36
+ self.asr_socket: Optional[WebSocketClientProtocol] = None
37
+ validate_environment(
38
+ self.required_env_vars,
39
+ self.required_packages,
40
+ f"ASR Engine {self.__class__.__name__}",
41
+ )
42
+
43
+ async def connect(self) -> None:
44
+ self.asr_socket = await self.open_websocket_connection()
45
+
46
+ async def open_websocket_connection(self) -> WebSocketClientProtocol:
47
+ """Connect to the ASR system."""
48
+ raise NotImplementedError
49
+
50
+ @classmethod
51
+ def from_config_dict(cls: Type[E], config: Dict) -> E:
52
+ raise NotImplementedError
53
+
54
+ async def close_connection(self) -> None:
55
+ if self.asr_socket:
56
+ await self.asr_socket.close()
57
+
58
+ async def signal_audio_done(self) -> None:
59
+ """Signal to the ASR Api that you are done sending data."""
60
+ raise NotImplementedError
61
+
62
+ async def send_audio_chunks(self, chunk: RasaAudioBytes) -> None:
63
+ """Send audio chunks to the ASR system via the websocket."""
64
+ if self.asr_socket is None:
65
+ raise ConnectionException("Websocket not connected.")
66
+ engine_bytes = self.rasa_audio_bytes_to_engine_bytes(chunk)
67
+ await self.asr_socket.send(engine_bytes)
68
+
69
+ def rasa_audio_bytes_to_engine_bytes(self, chunk: RasaAudioBytes) -> bytes:
70
+ """Convert RasaAudioBytes to bytes usable by this engine."""
71
+ raise NotImplementedError
72
+
73
+ async def stream_asr_events(self) -> AsyncIterator[ASREvent]:
74
+ """Stream the events returned by the ASR system as it is fed audio bytes."""
75
+ if self.asr_socket is None:
76
+ raise ConnectionException("Websocket not connected.")
77
+ async for message in self.asr_socket:
78
+ asr_event = self.engine_event_to_asr_event(message)
79
+ if asr_event:
80
+ yield asr_event
81
+
82
+ def engine_event_to_asr_event(self, e: Any) -> Optional[ASREvent]:
83
+ """Translate an engine event to a common ASREvent."""
84
+ raise NotImplementedError
85
+
86
+ @staticmethod
87
+ def get_default_config() -> T:
88
+ """Get the default config for this component."""
89
+ raise NotImplementedError
@@ -0,0 +1,18 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass
5
+ class ASREvent:
6
+ @classmethod
7
+ def name(cls) -> str:
8
+ return cls.__name__
9
+
10
+
11
+ @dataclass
12
+ class NewTranscript(ASREvent):
13
+ text: str
14
+
15
+
16
+ @dataclass
17
+ class UserIsSpeaking(ASREvent):
18
+ pass
@@ -0,0 +1,130 @@
1
+ import os
2
+ from dataclasses import dataclass
3
+ from typing import Any, Dict, Optional, AsyncIterator
4
+ import asyncio
5
+
6
+ from rasa.core.channels.voice_stream.asr.asr_engine import ASREngine, ASREngineConfig
7
+ from rasa.core.channels.voice_stream.asr.asr_event import (
8
+ ASREvent,
9
+ NewTranscript,
10
+ UserIsSpeaking,
11
+ )
12
+ from rasa.core.channels.voice_stream.audio_bytes import HERTZ, RasaAudioBytes
13
+ from rasa.shared.constants import AZURE_SPEECH_API_KEY_ENV_VAR
14
+ from rasa.shared.exceptions import ConnectionException
15
+
16
+
17
+ @dataclass
18
+ class AzureASRConfig(ASREngineConfig):
19
+ language: Optional[str] = None
20
+ speech_region: Optional[str] = None
21
+
22
+
23
+ class AzureASR(ASREngine[AzureASRConfig]):
24
+ required_env_vars = (AZURE_SPEECH_API_KEY_ENV_VAR,)
25
+ required_packages = ("azure.cognitiveservices.speech",)
26
+
27
+ def __init__(self, config: Optional[AzureASRConfig] = None):
28
+ super().__init__(config)
29
+
30
+ import azure.cognitiveservices.speech as speechsdk
31
+
32
+ self.speech_recognizer: Optional[speechsdk.SpeechRecognizer] = None
33
+ self.stream: Optional[speechsdk.audio.PushAudioInputStream] = None
34
+ self.is_recognizing = False
35
+ self.queue: asyncio.Queue[speechsdk.SpeechRecognitionEventArgs] = (
36
+ asyncio.Queue()
37
+ )
38
+ self.main_loop = asyncio.get_running_loop()
39
+
40
+ def signal_user_is_speaking(self, event: Any) -> None:
41
+ """Replace the azure event with a generic is speaking event."""
42
+ self.fill_queue(UserIsSpeaking())
43
+
44
+ def fill_queue(self, event: Any) -> None:
45
+ """Either puts the event or a dedicated ASR Event into the queue."""
46
+ # This function is used by call backs of the azure speech library
47
+ # which seems to run separate threads/processes
48
+ # To properly wake up the task waiting at queue.get, we need to
49
+ # put to the queue in the same event loop
50
+ self.main_loop.call_soon_threadsafe(self.queue.put_nowait, event)
51
+
52
+ async def connect(self) -> None:
53
+ import azure.cognitiveservices.speech as speechsdk
54
+
55
+ speech_config = speechsdk.SpeechConfig(
56
+ subscription=os.environ[AZURE_SPEECH_API_KEY_ENV_VAR],
57
+ region=self.config.speech_region,
58
+ )
59
+ audio_format = speechsdk.audio.AudioStreamFormat(
60
+ samples_per_second=HERTZ,
61
+ bits_per_sample=8,
62
+ channels=1,
63
+ wave_stream_format=speechsdk.AudioStreamWaveFormat.MULAW,
64
+ )
65
+ self.stream = speechsdk.audio.PushAudioInputStream(stream_format=audio_format)
66
+ audio_config = speechsdk.audio.AudioConfig(stream=self.stream)
67
+ self.speech_recognizer = speechsdk.SpeechRecognizer(
68
+ speech_config=speech_config,
69
+ language=self.config.language,
70
+ audio_config=audio_config,
71
+ )
72
+ self.speech_recognizer.recognized.connect(self.fill_queue)
73
+ self.speech_recognizer.recognizing.connect(self.signal_user_is_speaking)
74
+ self.speech_recognizer.start_continuous_recognition_async()
75
+ self.is_recognizing = True
76
+
77
+ async def close_connection(self) -> None:
78
+ if self.speech_recognizer is None:
79
+ raise ConnectionException("Websocket not connected.")
80
+ self.speech_recognizer.stop_continuous_recognition_async()
81
+
82
+ async def signal_audio_done(self) -> None:
83
+ """Signal to the ASR Api that you are done sending data."""
84
+ self.is_recognizing = False
85
+
86
+ def rasa_audio_bytes_to_engine_bytes(self, chunk: RasaAudioBytes) -> bytes:
87
+ """Convert RasaAudioBytes to bytes usable by this engine."""
88
+ return chunk
89
+
90
+ async def send_audio_chunks(self, chunk: RasaAudioBytes) -> None:
91
+ """Send audio chunks to the ASR system via the websocket."""
92
+ if self.speech_recognizer is None or self.stream is None:
93
+ raise ConnectionException("ASR not connected.")
94
+ engine_bytes = self.rasa_audio_bytes_to_engine_bytes(chunk)
95
+ self.stream.write(engine_bytes)
96
+
97
+ async def stream_asr_events(self) -> AsyncIterator[ASREvent]:
98
+ """Stream the events returned by the ASR system as it is fed audio bytes."""
99
+ if self.speech_recognizer is None:
100
+ raise ConnectionException("Websocket not connected.")
101
+ while self.is_recognizing or not self.queue.empty():
102
+ try:
103
+ message = await asyncio.wait_for(self.queue.get(), timeout=2)
104
+ asr_event = self.engine_event_to_asr_event(message)
105
+ if asr_event:
106
+ yield asr_event
107
+ except asyncio.TimeoutError:
108
+ pass
109
+
110
+ def engine_event_to_asr_event(self, e: Any) -> Optional[ASREvent]:
111
+ """Translate an engine event to a common ASREvent."""
112
+ import azure.cognitiveservices.speech as speechsdk
113
+
114
+ if isinstance(e, speechsdk.SpeechRecognitionEventArgs) and isinstance(
115
+ e.result, speechsdk.SpeechRecognitionResult
116
+ ):
117
+ return NewTranscript(e.result.text)
118
+ if isinstance(e, ASREvent):
119
+ # transformation happened before
120
+ return e
121
+
122
+ return None
123
+
124
+ @staticmethod
125
+ def get_default_config() -> AzureASRConfig:
126
+ return AzureASRConfig("en-US", "germanywestcentral")
127
+
128
+ @classmethod
129
+ def from_config_dict(cls, config: Dict) -> "AzureASR":
130
+ return AzureASR(AzureASRConfig.from_dict(config))