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,173 @@
1
+ import base64
2
+ import json
3
+ import uuid
4
+
5
+ import structlog
6
+ from typing import Any, Awaitable, Callable, Dict, Optional, Text, Tuple
7
+
8
+ from sanic import Blueprint, HTTPResponse, Request, response
9
+ from sanic import Websocket # type: ignore
10
+
11
+
12
+ from rasa.core.channels import UserMessage
13
+ from rasa.core.channels.voice_ready.utils import CallParameters
14
+ from rasa.core.channels.voice_stream.call_state import call_state
15
+ from rasa.core.channels.voice_stream.tts.tts_engine import TTSEngine
16
+ from rasa.core.channels.voice_stream.audio_bytes import RasaAudioBytes
17
+ from rasa.core.channels.voice_stream.voice_channel import (
18
+ EndConversationAction,
19
+ NewAudioAction,
20
+ VoiceChannelAction,
21
+ ContinueConversationAction,
22
+ VoiceInputChannel,
23
+ VoiceOutputChannel,
24
+ )
25
+
26
+ logger = structlog.get_logger(__name__)
27
+
28
+
29
+ def map_call_params(data: Dict[Text, Any]) -> CallParameters:
30
+ """Map the twilio stream parameters to the CallParameters dataclass."""
31
+ stream_sid = data["streamSid"]
32
+ parameters = data["start"]["customParameters"]
33
+ return CallParameters(
34
+ call_id=parameters.get("call_id", ""),
35
+ user_phone=parameters.get("user_phone", ""),
36
+ bot_phone=parameters.get("bot_phone", ""),
37
+ direction=parameters.get("direction"),
38
+ stream_id=stream_sid,
39
+ )
40
+
41
+
42
+ class TwilioMediaStreamsOutputChannel(VoiceOutputChannel):
43
+ @classmethod
44
+ def name(cls) -> str:
45
+ return "twilio_media_streams"
46
+
47
+ def rasa_audio_bytes_to_channel_bytes(
48
+ self, rasa_audio_bytes: RasaAudioBytes
49
+ ) -> bytes:
50
+ return base64.b64encode(rasa_audio_bytes)
51
+
52
+ def create_marker_message(self, recipient_id: str) -> Tuple[str, str]:
53
+ message_id = uuid.uuid4().hex
54
+ mark_message = json.dumps(
55
+ {
56
+ "event": "mark",
57
+ "streamSid": recipient_id,
58
+ "mark": {"name": message_id},
59
+ }
60
+ )
61
+ return mark_message, message_id
62
+
63
+ def channel_bytes_to_message(self, recipient_id: str, channel_bytes: bytes) -> str:
64
+ media_message = json.dumps(
65
+ {
66
+ "event": "media",
67
+ "streamSid": recipient_id,
68
+ "media": {
69
+ "payload": channel_bytes.decode("utf-8"),
70
+ },
71
+ }
72
+ )
73
+ return media_message
74
+
75
+
76
+ class TwilioMediaStreamsInputChannel(VoiceInputChannel):
77
+ @classmethod
78
+ def name(cls) -> str:
79
+ return "twilio_media_streams"
80
+
81
+ def channel_bytes_to_rasa_audio_bytes(self, input_bytes: bytes) -> RasaAudioBytes:
82
+ return RasaAudioBytes(base64.b64decode(input_bytes))
83
+
84
+ async def collect_call_parameters(
85
+ self, channel_websocket: Websocket
86
+ ) -> Optional[CallParameters]:
87
+ async for message in channel_websocket:
88
+ data = json.loads(message)
89
+ if data["event"] == "start":
90
+ # retrieve parameters set in the webhook - contains info about the
91
+ # caller
92
+ return map_call_params(data)
93
+ return None
94
+
95
+ def map_input_message(
96
+ self,
97
+ message: Any,
98
+ ) -> VoiceChannelAction:
99
+ data = json.loads(message)
100
+ if data["event"] == "media":
101
+ audio_bytes = self.channel_bytes_to_rasa_audio_bytes(
102
+ data["media"]["payload"]
103
+ )
104
+ return NewAudioAction(audio_bytes)
105
+ elif data["event"] == "stop":
106
+ return EndConversationAction()
107
+ elif data["event"] == "mark":
108
+ if data["mark"]["name"] == call_state.latest_bot_audio_id:
109
+ # Just finished streaming last audio bytes
110
+ call_state.is_bot_speaking = False # type: ignore[attr-defined]
111
+ if call_state.should_hangup:
112
+ logger.debug(
113
+ "twilio_streams.hangup", marker=call_state.latest_bot_audio_id
114
+ )
115
+ return EndConversationAction()
116
+ else:
117
+ call_state.is_bot_speaking = True # type: ignore[attr-defined]
118
+ return ContinueConversationAction()
119
+
120
+ def create_output_channel(
121
+ self, voice_websocket: Websocket, tts_engine: TTSEngine
122
+ ) -> VoiceOutputChannel:
123
+ return TwilioMediaStreamsOutputChannel(
124
+ voice_websocket,
125
+ tts_engine,
126
+ self.tts_cache,
127
+ )
128
+
129
+ def websocket_stream_url(self) -> str:
130
+ """Returns the websocket stream URL."""
131
+ # depending on the config value, the url might contain http as a
132
+ # protocol or not - we'll make sure both work
133
+ if self.server_url.startswith("http"):
134
+ base_url = self.server_url.replace("http", "ws")
135
+ else:
136
+ base_url = f"wss://{self.server_url}"
137
+ return f"{base_url}/webhooks/twilio_media_streams/websocket"
138
+
139
+ def blueprint(
140
+ self, on_new_message: Callable[[UserMessage], Awaitable[Any]]
141
+ ) -> Blueprint:
142
+ """Defines a Sanic bluelogger.debug."""
143
+ blueprint = Blueprint("twilio_media_streams", __name__)
144
+
145
+ @blueprint.route("/", methods=["GET"])
146
+ async def health(_: Request) -> HTTPResponse:
147
+ return response.json({"status": "ok"})
148
+
149
+ @blueprint.route("/webhook", methods=["POST"])
150
+ async def receive(request: Request) -> HTTPResponse:
151
+ from twilio.twiml.voice_response import Connect, VoiceResponse
152
+
153
+ voice_response = VoiceResponse()
154
+ start = Connect()
155
+ stream = start.stream(url=self.websocket_stream_url())
156
+ # pass information about the call to the webhook - so we can
157
+ # store it in the input channel
158
+ stream.parameter(name="call_id", value=request.form.get("CallSid", None))
159
+ stream.parameter(name="user_phone", value=request.form.get("From", None))
160
+ stream.parameter(name="bot_phone", value=request.form.get("To", None))
161
+ stream.parameter(
162
+ name="direction", value=request.form.get("Direction", None)
163
+ )
164
+
165
+ voice_response.append(start)
166
+
167
+ return response.text(str(voice_response), content_type="text/xml")
168
+
169
+ @blueprint.websocket("/websocket") # type: ignore
170
+ async def handle_message(request: Request, ws: Websocket) -> None:
171
+ await self.run_audio_streaming(on_new_message, ws)
172
+
173
+ return blueprint
@@ -0,0 +1,57 @@
1
+ import wave
2
+ import audioop
3
+ from dataclasses import asdict, dataclass
4
+ from typing import Optional, Type, TypeVar
5
+
6
+ import structlog
7
+
8
+ from rasa.core.channels.voice_stream.audio_bytes import HERTZ, RasaAudioBytes
9
+ from rasa.shared.exceptions import RasaException
10
+
11
+ structlogger = structlog.get_logger()
12
+
13
+
14
+ def read_wav_to_rasa_audio_bytes(file_name: str) -> Optional[RasaAudioBytes]:
15
+ """Reads rasa audio bytes from a file."""
16
+ if not file_name.endswith(".wav"):
17
+ raise RasaException("Should only read .wav files with this method.")
18
+ wave_object = wave.open(file_name, "rb")
19
+ wave_data = wave_object.readframes(wave_object.getnframes())
20
+ if wave_object.getnchannels() != 1:
21
+ wave_data = audioop.tomono(wave_data, wave_object.getsampwidth(), 1, 1)
22
+ if wave_object.getsampwidth() != 1:
23
+ wave_data = audioop.lin2lin(wave_data, wave_object.getsampwidth(), 1)
24
+ # 8 bit is unsigned
25
+ # wave_data = audioop.bias(wave_data, 1, 128)
26
+ if wave_object.getframerate() != HERTZ:
27
+ wave_data, _ = audioop.ratecv(
28
+ wave_data, 1, 1, wave_object.getframerate(), HERTZ, None
29
+ )
30
+ wave_data = audioop.lin2ulaw(wave_data, 1)
31
+ return RasaAudioBytes(wave_data)
32
+
33
+
34
+ def generate_silence(length_in_seconds: float = 1.0) -> RasaAudioBytes:
35
+ return RasaAudioBytes(b"\00" * int(length_in_seconds * HERTZ))
36
+
37
+
38
+ T = TypeVar("T", bound="MergeableConfig")
39
+
40
+
41
+ @dataclass
42
+ class MergeableConfig:
43
+ def __init__(self) -> None:
44
+ pass
45
+
46
+ def merge(self: T, other: Optional[T]) -> T:
47
+ """Merges two configs while dropping None values of the second config."""
48
+ if other is None:
49
+ return self
50
+ other_dict = asdict(other)
51
+ other_dict_clean = {k: v for k, v in other_dict.items() if v is not None}
52
+ merged = {**asdict(self), **other_dict_clean}
53
+ return self.from_dict(merged)
54
+
55
+ @classmethod
56
+ def from_dict(cls: Type[T], data: dict[str, Optional[str]]) -> T:
57
+ return cls(**data)
@@ -0,0 +1,427 @@
1
+ import asyncio
2
+ import structlog
3
+ import copy
4
+ from dataclasses import asdict, dataclass
5
+ from typing import Any, AsyncIterator, Awaitable, Callable, Dict, List, Optional, Tuple
6
+
7
+ from rasa.core.channels.voice_stream.util import generate_silence
8
+ from rasa.shared.core.constants import SLOT_SILENCE_TIMEOUT
9
+ from rasa.shared.utils.common import (
10
+ class_from_module_path,
11
+ mark_as_beta_feature,
12
+ )
13
+ from rasa.shared.utils.cli import print_error_and_exit
14
+
15
+ from sanic.exceptions import ServerError, WebsocketClosed
16
+
17
+ from rasa.core.channels import InputChannel, OutputChannel, UserMessage
18
+ from rasa.core.channels.voice_ready.utils import CallParameters
19
+ from rasa.core.channels.voice_ready.utils import validate_voice_license_scope
20
+ from rasa.core.channels.voice_stream.asr.asr_engine import ASREngine
21
+ from rasa.core.channels.voice_stream.asr.asr_event import (
22
+ ASREvent,
23
+ NewTranscript,
24
+ UserIsSpeaking,
25
+ )
26
+ from sanic import Websocket # type: ignore
27
+
28
+ from rasa.core.channels.voice_stream.asr.deepgram import DeepgramASR
29
+ from rasa.core.channels.voice_stream.asr.azure import AzureASR
30
+ from rasa.core.channels.voice_stream.audio_bytes import HERTZ, RasaAudioBytes
31
+ from rasa.core.channels.voice_stream.call_state import (
32
+ CallState,
33
+ _call_state,
34
+ call_state,
35
+ )
36
+ from rasa.core.channels.voice_stream.tts.azure import AzureTTS
37
+ from rasa.core.channels.voice_stream.tts.tts_engine import TTSEngine, TTSError
38
+ from rasa.core.channels.voice_stream.tts.cartesia import CartesiaTTS
39
+ from rasa.core.channels.voice_stream.tts.tts_cache import TTSCache
40
+ from rasa.utils.io import remove_emojis
41
+
42
+ logger = structlog.get_logger(__name__)
43
+
44
+
45
+ @dataclass
46
+ class VoiceChannelAction:
47
+ pass
48
+
49
+
50
+ @dataclass
51
+ class NewAudioAction(VoiceChannelAction):
52
+ audio_bytes: RasaAudioBytes
53
+
54
+
55
+ @dataclass
56
+ class EndConversationAction(VoiceChannelAction):
57
+ pass
58
+
59
+
60
+ @dataclass
61
+ class ContinueConversationAction(VoiceChannelAction):
62
+ pass
63
+
64
+
65
+ def asr_engine_from_config(asr_config: Dict) -> ASREngine:
66
+ name = str(asr_config["name"])
67
+ asr_config = copy.copy(asr_config)
68
+ asr_config.pop("name")
69
+ if name.lower() == "deepgram":
70
+ return DeepgramASR.from_config_dict(asr_config)
71
+ if name == "azure":
72
+ return AzureASR.from_config_dict(asr_config)
73
+ else:
74
+ mark_as_beta_feature("Custom ASR Engine")
75
+ try:
76
+ asr_engine_class = class_from_module_path(name)
77
+ return asr_engine_class.from_config_dict(asr_config)
78
+ except NameError:
79
+ print_error_and_exit(
80
+ f"Failed to initialize ASR Engine with type '{name}'. "
81
+ f"Please make sure the method `from_config_dict`is implemented."
82
+ )
83
+ except TypeError as e:
84
+ print_error_and_exit(
85
+ f"Failed to initialize ASR Engine with type '{name}'. "
86
+ f"Invalid configuration provided. "
87
+ f"Error: {e}"
88
+ )
89
+
90
+
91
+ def tts_engine_from_config(tts_config: Dict) -> TTSEngine:
92
+ name = str(tts_config["name"])
93
+ tts_config = copy.copy(tts_config)
94
+ tts_config.pop("name")
95
+ if name.lower() == "azure":
96
+ return AzureTTS.from_config_dict(tts_config)
97
+ elif name.lower() == "cartesia":
98
+ return CartesiaTTS.from_config_dict(tts_config)
99
+ else:
100
+ mark_as_beta_feature("Custom TTS Engine")
101
+ try:
102
+ tts_engine_class = class_from_module_path(name)
103
+ return tts_engine_class.from_config_dict(tts_config)
104
+ except NameError:
105
+ print_error_and_exit(
106
+ f"Failed to initialize TTS Engine with type '{name}'. "
107
+ f"Please make sure the method `from_config_dict`is implemented."
108
+ )
109
+ except TypeError as e:
110
+ print_error_and_exit(
111
+ f"Failed to initialize ASR Engine with type '{name}'. "
112
+ f"Invalid configuration provided. "
113
+ f"Error: {e}"
114
+ )
115
+
116
+
117
+ class VoiceOutputChannel(OutputChannel):
118
+ def __init__(
119
+ self,
120
+ voice_websocket: Websocket,
121
+ tts_engine: TTSEngine,
122
+ tts_cache: TTSCache,
123
+ ):
124
+ super().__init__()
125
+ self.voice_websocket = voice_websocket
126
+ self.tts_engine = tts_engine
127
+ self.tts_cache = tts_cache
128
+
129
+ self.latest_message_id: Optional[str] = None
130
+
131
+ def rasa_audio_bytes_to_channel_bytes(
132
+ self, rasa_audio_bytes: RasaAudioBytes
133
+ ) -> bytes:
134
+ """Turn rasa's audio byte format into the format for the channel."""
135
+ raise NotImplementedError
136
+
137
+ def channel_bytes_to_message(self, recipient_id: str, channel_bytes: bytes) -> str:
138
+ """Wrap the bytes for the channel in the proper format."""
139
+ raise NotImplementedError
140
+
141
+ def create_marker_message(self, recipient_id: str) -> Tuple[str, str]:
142
+ """Create a marker message for a specific channel."""
143
+ raise NotImplementedError
144
+
145
+ async def send_marker_message(self, recipient_id: str) -> None:
146
+ """Send a message that marks positions in the audio stream."""
147
+ marker_message, mark_id = self.create_marker_message(recipient_id)
148
+ await self.voice_websocket.send(marker_message)
149
+ self.latest_message_id = mark_id
150
+
151
+ def update_silence_timeout(self) -> None:
152
+ """Updates the silence timeout for the session."""
153
+ if self.tracker_state:
154
+ call_state.silence_timeout = ( # type: ignore[attr-defined]
155
+ self.tracker_state["slots"][SLOT_SILENCE_TIMEOUT]
156
+ )
157
+
158
+ async def send_text_with_buttons(
159
+ self,
160
+ recipient_id: str,
161
+ text: str,
162
+ buttons: List[Dict[str, Any]],
163
+ **kwargs: Any,
164
+ ) -> None:
165
+ """Uses the concise button output format for voice channels."""
166
+ await self.send_text_with_buttons_concise(recipient_id, text, buttons, **kwargs)
167
+
168
+ async def send_text_message(
169
+ self, recipient_id: str, text: str, **kwargs: Any
170
+ ) -> None:
171
+ text = remove_emojis(text)
172
+ self.update_silence_timeout()
173
+ cached_audio_bytes = self.tts_cache.get(text)
174
+ collected_audio_bytes = RasaAudioBytes(b"")
175
+ seconds_marker = -1
176
+ if cached_audio_bytes:
177
+ audio_stream = self.chunk_audio(cached_audio_bytes)
178
+ else:
179
+ # Todo: make kwargs compatible with engine config
180
+ synth_config = self.tts_engine.config.__class__.from_dict({})
181
+ try:
182
+ audio_stream = self.tts_engine.synthesize(text, synth_config)
183
+ except TTSError:
184
+ # TODO: add message that works without tts, e.g. loading from disc
185
+ audio_stream = self.chunk_audio(generate_silence())
186
+
187
+ async for audio_bytes in audio_stream:
188
+ try:
189
+ await self.send_audio_bytes(recipient_id, audio_bytes)
190
+ full_seconds_of_audio = len(collected_audio_bytes) // HERTZ
191
+ if full_seconds_of_audio > seconds_marker:
192
+ await self.send_marker_message(recipient_id)
193
+ seconds_marker = full_seconds_of_audio
194
+
195
+ except (WebsocketClosed, ServerError):
196
+ # ignore sending error, and keep collecting and caching audio bytes
197
+ call_state.connection_failed = True # type: ignore[attr-defined]
198
+ collected_audio_bytes = RasaAudioBytes(collected_audio_bytes + audio_bytes)
199
+ try:
200
+ await self.send_marker_message(recipient_id)
201
+ except (WebsocketClosed, ServerError):
202
+ # ignore sending error
203
+ pass
204
+ call_state.latest_bot_audio_id = self.latest_message_id # type: ignore[attr-defined]
205
+
206
+ if not cached_audio_bytes:
207
+ self.tts_cache.put(text, collected_audio_bytes)
208
+
209
+ async def send_audio_bytes(
210
+ self, recipient_id: str, audio_bytes: RasaAudioBytes
211
+ ) -> None:
212
+ channel_bytes = self.rasa_audio_bytes_to_channel_bytes(audio_bytes)
213
+ message = self.channel_bytes_to_message(recipient_id, channel_bytes)
214
+ await self.voice_websocket.send(message)
215
+
216
+ async def chunk_audio(
217
+ self, audio_bytes: RasaAudioBytes, chunk_size: int = 2048
218
+ ) -> AsyncIterator[RasaAudioBytes]:
219
+ """Generate chunks from cached audio bytes."""
220
+ offset = 0
221
+ while offset < len(audio_bytes):
222
+ chunk = audio_bytes[offset : offset + chunk_size]
223
+ if len(chunk):
224
+ yield RasaAudioBytes(chunk)
225
+ offset += chunk_size
226
+ return
227
+
228
+ async def hangup(self, recipient_id: str, **kwargs: Any) -> None:
229
+ call_state.should_hangup = True # type: ignore[attr-defined]
230
+
231
+
232
+ class VoiceInputChannel(InputChannel):
233
+ def __init__(
234
+ self,
235
+ server_url: str,
236
+ asr_config: Dict,
237
+ tts_config: Dict,
238
+ monitor_silence: bool = False,
239
+ ):
240
+ validate_voice_license_scope()
241
+ self.server_url = server_url
242
+ self.asr_config = asr_config
243
+ self.tts_config = tts_config
244
+ self.monitor_silence = monitor_silence
245
+ self.tts_cache = TTSCache(tts_config.get("cache_size", 1000))
246
+
247
+ async def handle_silence_timeout(
248
+ self,
249
+ voice_websocket: Websocket,
250
+ on_new_message: Callable[[UserMessage], Awaitable[Any]],
251
+ tts_engine: TTSEngine,
252
+ call_parameters: CallParameters,
253
+ ) -> None:
254
+ timeout = call_state.silence_timeout
255
+ if not timeout:
256
+ return
257
+ if not self.monitor_silence:
258
+ return
259
+ logger.debug("voice_channel.silence_timeout_watch_started", timeout=timeout)
260
+ await asyncio.sleep(timeout)
261
+ logger.debug("voice_channel.silence_timeout_tripped")
262
+ output_channel = self.create_output_channel(voice_websocket, tts_engine)
263
+ message = UserMessage(
264
+ "/silence_timeout",
265
+ output_channel,
266
+ call_parameters.stream_id,
267
+ input_channel=self.name(),
268
+ metadata=asdict(call_parameters),
269
+ )
270
+ await on_new_message(message)
271
+
272
+ @staticmethod
273
+ def _cancel_silence_timeout_watcher() -> None:
274
+ """Cancels the silent timeout task if it exists."""
275
+ if call_state.silence_timeout_watcher:
276
+ logger.debug("voice_channel.cancelling_current_timeout_watcher_task")
277
+ call_state.silence_timeout_watcher.cancel()
278
+ call_state.silence_timeout_watcher = None # type: ignore[attr-defined]
279
+
280
+ @classmethod
281
+ def from_credentials(cls, credentials: Optional[Dict[str, Any]]) -> InputChannel:
282
+ credentials = credentials or {}
283
+ return cls(
284
+ credentials["server_url"],
285
+ credentials["asr"],
286
+ credentials["tts"],
287
+ credentials.get("monitor_silence", False),
288
+ )
289
+
290
+ def channel_bytes_to_rasa_audio_bytes(self, input_bytes: bytes) -> RasaAudioBytes:
291
+ raise NotImplementedError
292
+
293
+ async def collect_call_parameters(
294
+ self, channel_websocket: Websocket
295
+ ) -> Optional[CallParameters]:
296
+ raise NotImplementedError
297
+
298
+ async def start_session(
299
+ self,
300
+ channel_websocket: Websocket,
301
+ on_new_message: Callable[[UserMessage], Awaitable[Any]],
302
+ tts_engine: TTSEngine,
303
+ call_parameters: CallParameters,
304
+ ) -> None:
305
+ output_channel = self.create_output_channel(channel_websocket, tts_engine)
306
+ message = UserMessage(
307
+ "/session_start",
308
+ output_channel,
309
+ call_parameters.stream_id,
310
+ input_channel=self.name(),
311
+ metadata=asdict(call_parameters),
312
+ )
313
+ await on_new_message(message)
314
+
315
+ def map_input_message(
316
+ self,
317
+ message: Any,
318
+ ) -> VoiceChannelAction:
319
+ """Map a channel input message to a voice channel action."""
320
+ raise NotImplementedError
321
+
322
+ async def run_audio_streaming(
323
+ self,
324
+ on_new_message: Callable[[UserMessage], Awaitable[Any]],
325
+ channel_websocket: Websocket,
326
+ ) -> None:
327
+ """Pipe input audio to ASR and consume ASR events simultaneously."""
328
+ _call_state.set(CallState())
329
+ asr_engine = asr_engine_from_config(self.asr_config)
330
+ tts_engine = tts_engine_from_config(self.tts_config)
331
+ await asr_engine.connect()
332
+
333
+ call_parameters = await self.collect_call_parameters(channel_websocket)
334
+ if call_parameters is None:
335
+ raise ValueError("Failed to extract call parameters for call.")
336
+ await self.start_session(
337
+ channel_websocket, on_new_message, tts_engine, call_parameters
338
+ )
339
+
340
+ async def consume_audio_bytes() -> None:
341
+ async for message in channel_websocket:
342
+ is_bot_speaking_before = call_state.is_bot_speaking
343
+ channel_action = self.map_input_message(message)
344
+ is_bot_speaking_after = call_state.is_bot_speaking
345
+
346
+ if not is_bot_speaking_before and is_bot_speaking_after:
347
+ logger.debug("voice_channel.bot_started_speaking")
348
+ # relevant when the bot speaks multiple messages in one turn
349
+ self._cancel_silence_timeout_watcher()
350
+
351
+ # we just stopped speaking, starting a watcher for silence timeout
352
+ if is_bot_speaking_before and not is_bot_speaking_after:
353
+ logger.debug("voice_channel.bot_stopped_speaking")
354
+ self._cancel_silence_timeout_watcher()
355
+ call_state.silence_timeout_watcher = ( # type: ignore[attr-defined]
356
+ asyncio.create_task(
357
+ self.handle_silence_timeout(
358
+ channel_websocket,
359
+ on_new_message,
360
+ tts_engine,
361
+ call_parameters,
362
+ )
363
+ )
364
+ )
365
+ if isinstance(channel_action, NewAudioAction):
366
+ await asr_engine.send_audio_chunks(channel_action.audio_bytes)
367
+ elif isinstance(channel_action, EndConversationAction):
368
+ # end stream event came from the other side
369
+ break
370
+
371
+ async def consume_asr_events() -> None:
372
+ async for event in asr_engine.stream_asr_events():
373
+ await self.handle_asr_event(
374
+ event,
375
+ channel_websocket,
376
+ on_new_message,
377
+ tts_engine,
378
+ call_parameters,
379
+ )
380
+
381
+ audio_forwarding_task = asyncio.create_task(consume_audio_bytes())
382
+ asr_event_task = asyncio.create_task(consume_asr_events())
383
+ await asyncio.wait(
384
+ [audio_forwarding_task, asr_event_task],
385
+ return_when=asyncio.FIRST_COMPLETED,
386
+ )
387
+ if not audio_forwarding_task.done():
388
+ audio_forwarding_task.cancel()
389
+ if not asr_event_task.done():
390
+ asr_event_task.cancel()
391
+ await tts_engine.close_connection()
392
+ await asr_engine.close_connection()
393
+ await channel_websocket.close()
394
+ self._cancel_silence_timeout_watcher()
395
+
396
+ def create_output_channel(
397
+ self, voice_websocket: Websocket, tts_engine: TTSEngine
398
+ ) -> VoiceOutputChannel:
399
+ """Create a matching voice output channel for this voice input channel."""
400
+ raise NotImplementedError
401
+
402
+ async def handle_asr_event(
403
+ self,
404
+ e: ASREvent,
405
+ voice_websocket: Websocket,
406
+ on_new_message: Callable[[UserMessage], Awaitable[Any]],
407
+ tts_engine: TTSEngine,
408
+ call_parameters: CallParameters,
409
+ ) -> None:
410
+ """Handle a new event from the ASR system."""
411
+ if isinstance(e, NewTranscript) and e.text:
412
+ logger.debug(
413
+ "VoiceInputChannel.handle_asr_event.new_transcript", transcript=e.text
414
+ )
415
+ call_state.is_user_speaking = False # type: ignore[attr-defined]
416
+ output_channel = self.create_output_channel(voice_websocket, tts_engine)
417
+ message = UserMessage(
418
+ e.text,
419
+ output_channel,
420
+ call_parameters.stream_id,
421
+ input_channel=self.name(),
422
+ metadata=asdict(call_parameters),
423
+ )
424
+ await on_new_message(message)
425
+ elif isinstance(e, UserIsSpeaking):
426
+ self._cancel_silence_timeout_watcher()
427
+ call_state.is_user_speaking = True # type: ignore[attr-defined]