rasa-pro 3.12.0.dev1__py3-none-any.whl → 3.12.0.dev3__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 (499) hide show
  1. rasa/__main__.py +7 -7
  2. rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
  3. rasa/anonymization/anonymization_pipeline.py +3 -3
  4. rasa/anonymization/anonymization_rule_executor.py +1 -1
  5. rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
  6. rasa/cli/arguments/data.py +2 -2
  7. rasa/cli/arguments/evaluate.py +2 -1
  8. rasa/cli/arguments/interactive.py +1 -1
  9. rasa/cli/arguments/run.py +1 -1
  10. rasa/cli/arguments/test.py +7 -5
  11. rasa/cli/arguments/train.py +3 -3
  12. rasa/cli/arguments/visualize.py +2 -2
  13. rasa/cli/arguments/x.py +1 -0
  14. rasa/cli/data.py +4 -3
  15. rasa/cli/dialogue_understanding_test.py +116 -18
  16. rasa/cli/evaluate.py +1 -1
  17. rasa/cli/export.py +6 -6
  18. rasa/cli/interactive.py +4 -5
  19. rasa/cli/llm_fine_tuning.py +5 -5
  20. rasa/cli/markers.py +1 -2
  21. rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
  22. rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
  23. rasa/cli/shell.py +2 -3
  24. rasa/cli/studio/download.py +1 -2
  25. rasa/cli/studio/studio.py +2 -3
  26. rasa/cli/studio/train.py +0 -1
  27. rasa/cli/telemetry.py +2 -2
  28. rasa/cli/test.py +11 -11
  29. rasa/cli/utils.py +7 -5
  30. rasa/core/__init__.py +0 -1
  31. rasa/core/actions/action.py +42 -21
  32. rasa/core/actions/action_hangup.py +1 -1
  33. rasa/core/actions/action_repeat_bot_messages.py +2 -2
  34. rasa/core/actions/action_run_slot_rejections.py +2 -2
  35. rasa/core/actions/action_trigger_chitchat.py +1 -1
  36. rasa/core/actions/action_trigger_flow.py +5 -5
  37. rasa/core/actions/action_trigger_search.py +1 -1
  38. rasa/core/actions/forms.py +14 -12
  39. rasa/core/actions/http_custom_action_executor.py +8 -1
  40. rasa/core/actions/loops.py +3 -3
  41. rasa/core/actions/two_stage_fallback.py +13 -13
  42. rasa/core/auth_retry_tracker_store.py +1 -2
  43. rasa/core/brokers/broker.py +2 -1
  44. rasa/core/brokers/file.py +1 -1
  45. rasa/core/brokers/kafka.py +8 -8
  46. rasa/core/brokers/pika.py +8 -9
  47. rasa/core/brokers/sql.py +4 -3
  48. rasa/core/channels/__init__.py +3 -0
  49. rasa/core/channels/botframework.py +2 -2
  50. rasa/core/channels/callback.py +4 -4
  51. rasa/core/channels/channel.py +11 -11
  52. rasa/core/channels/console.py +0 -1
  53. rasa/core/channels/development_inspector.py +6 -6
  54. rasa/core/channels/facebook.py +5 -5
  55. rasa/core/channels/hangouts.py +7 -8
  56. rasa/core/channels/inspector/dist/assets/{arc-861ddd57.js → arc-632a63ec.js} +1 -1
  57. rasa/core/channels/inspector/dist/assets/{c4Diagram-d0fbc5ce-921f02db.js → c4Diagram-d0fbc5ce-081e0df4.js} +1 -1
  58. rasa/core/channels/inspector/dist/assets/{classDiagram-936ed81e-b436c4f8.js → classDiagram-936ed81e-3df0afc2.js} +1 -1
  59. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-c3cb15f1-511a23cb.js → classDiagram-v2-c3cb15f1-8c5ed31e.js} +1 -1
  60. rasa/core/channels/inspector/dist/assets/{createText-62fc7601-ef476ecd.js → createText-62fc7601-89c73b31.js} +1 -1
  61. rasa/core/channels/inspector/dist/assets/{edges-f2ad444c-f1878e0a.js → edges-f2ad444c-4fc48c3e.js} +1 -1
  62. rasa/core/channels/inspector/dist/assets/{erDiagram-9d236eb7-fac75185.js → erDiagram-9d236eb7-907e0440.js} +1 -1
  63. rasa/core/channels/inspector/dist/assets/{flowDb-1972c806-201c5bbc.js → flowDb-1972c806-9ec53a3c.js} +1 -1
  64. rasa/core/channels/inspector/dist/assets/{flowDiagram-7ea5b25a-f904ae41.js → flowDiagram-7ea5b25a-41da787a.js} +1 -1
  65. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-8bea338b.js +1 -0
  66. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-abe16c3d-1813da66.js → flowchart-elk-definition-abe16c3d-ce370633.js} +1 -1
  67. rasa/core/channels/inspector/dist/assets/{ganttDiagram-9b5ea136-872af172.js → ganttDiagram-9b5ea136-90a36523.js} +1 -1
  68. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-99d0ae7c-34a0af5a.js → gitGraphDiagram-99d0ae7c-41e1aa3f.js} +1 -1
  69. rasa/core/channels/inspector/dist/assets/{index-2c4b9a3b-42ba3e3d.js → index-2c4b9a3b-e6f2af62.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{index-37817b51.js → index-e793d777.js} +3 -3
  71. rasa/core/channels/inspector/dist/assets/{infoDiagram-736b4530-6b731386.js → infoDiagram-736b4530-8ceba4db.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/{journeyDiagram-df861f2b-e8579ac6.js → journeyDiagram-df861f2b-960d3809.js} +1 -1
  73. rasa/core/channels/inspector/dist/assets/{layout-89e6403a.js → layout-498807d8.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{line-dc73d3fc.js → line-eeccc4e2.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/{linear-f5b1d2bc.js → linear-8a078617.js} +1 -1
  76. rasa/core/channels/inspector/dist/assets/{mindmap-definition-beec6740-82cb74fa.js → mindmap-definition-beec6740-396d17dd.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{pieDiagram-dbbf0591-bdf5f29b.js → pieDiagram-dbbf0591-dc9b5e1b.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-4d7f4fd6-c7a0cbe4.js → quadrantDiagram-4d7f4fd6-a08cba6d.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{requirementDiagram-6fc4c22a-7ec5410f.js → requirementDiagram-6fc4c22a-87242b9e.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-8f13d901-caee5554.js → sankeyDiagram-8f13d901-53f6f391.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-b655622a-2935f8db.js → sequenceDiagram-b655622a-715c9c20.js} +1 -1
  82. rasa/core/channels/inspector/dist/assets/{stateDiagram-59f0c015-8f5d9693.js → stateDiagram-59f0c015-2e8fb31f.js} +1 -1
  83. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-2b26beab-d565d1de.js → stateDiagram-v2-2b26beab-7e2d2aa0.js} +1 -1
  84. rasa/core/channels/inspector/dist/assets/{styles-080da4f6-75ad421d.js → styles-080da4f6-4420cea6.js} +1 -1
  85. rasa/core/channels/inspector/dist/assets/{styles-3dcbcfbf-7e764226.js → styles-3dcbcfbf-28676cf4.js} +1 -1
  86. rasa/core/channels/inspector/dist/assets/{styles-9c745c82-7a4e0e61.js → styles-9c745c82-cef936a6.js} +1 -1
  87. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-4835440b-4019d1bf.js → svgDrawCommon-4835440b-151251e9.js} +1 -1
  88. rasa/core/channels/inspector/dist/assets/{timeline-definition-5b62e21b-01ea12df.js → timeline-definition-5b62e21b-0d39bdb2.js} +1 -1
  89. rasa/core/channels/inspector/dist/assets/{xychartDiagram-2b33534f-89407137.js → xychartDiagram-2b33534f-a03fa445.js} +1 -1
  90. rasa/core/channels/inspector/dist/index.html +3 -1
  91. rasa/core/channels/inspector/index.html +2 -0
  92. rasa/core/channels/inspector/src/App.tsx +1 -4
  93. rasa/core/channels/mattermost.py +4 -4
  94. rasa/core/channels/rasa_chat.py +4 -4
  95. rasa/core/channels/rest.py +11 -12
  96. rasa/core/channels/rocketchat.py +4 -3
  97. rasa/core/channels/slack.py +6 -5
  98. rasa/core/channels/socketio.py +7 -28
  99. rasa/core/channels/studio_chat.py +193 -0
  100. rasa/core/channels/telegram.py +73 -41
  101. rasa/core/channels/twilio.py +3 -3
  102. rasa/core/channels/vier_cvg.py +2 -2
  103. rasa/core/channels/voice_ready/audiocodes.py +8 -8
  104. rasa/core/channels/voice_ready/jambonz.py +5 -5
  105. rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
  106. rasa/core/channels/voice_ready/twilio_voice.py +9 -8
  107. rasa/core/channels/voice_ready/utils.py +1 -1
  108. rasa/core/channels/voice_stream/asr/asr_engine.py +2 -2
  109. rasa/core/channels/voice_stream/asr/azure.py +2 -2
  110. rasa/core/channels/voice_stream/asr/deepgram.py +57 -16
  111. rasa/core/channels/voice_stream/browser_audio.py +9 -6
  112. rasa/core/channels/voice_stream/call_state.py +2 -1
  113. rasa/core/channels/voice_stream/tts/azure.py +1 -2
  114. rasa/core/channels/voice_stream/tts/cartesia.py +5 -4
  115. rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
  116. rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
  117. rasa/core/channels/voice_stream/twilio_media_streams.py +10 -7
  118. rasa/core/channels/voice_stream/util.py +1 -1
  119. rasa/core/channels/voice_stream/voice_channel.py +15 -15
  120. rasa/core/channels/webexteams.py +3 -4
  121. rasa/core/evaluation/marker.py +7 -6
  122. rasa/core/evaluation/marker_base.py +15 -16
  123. rasa/core/evaluation/marker_stats.py +3 -4
  124. rasa/core/evaluation/marker_tracker_loader.py +5 -4
  125. rasa/core/exporter.py +4 -4
  126. rasa/core/featurizers/precomputation.py +8 -8
  127. rasa/core/featurizers/single_state_featurizer.py +7 -7
  128. rasa/core/featurizers/tracker_featurizers.py +13 -13
  129. rasa/core/http_interpreter.py +3 -4
  130. rasa/core/information_retrieval/__init__.py +1 -1
  131. rasa/core/information_retrieval/faiss.py +4 -4
  132. rasa/core/information_retrieval/information_retrieval.py +2 -2
  133. rasa/core/information_retrieval/milvus.py +3 -3
  134. rasa/core/information_retrieval/qdrant.py +3 -3
  135. rasa/core/jobs.py +1 -0
  136. rasa/core/lock.py +2 -3
  137. rasa/core/lock_store.py +3 -3
  138. rasa/core/migrate.py +11 -8
  139. rasa/core/nlg/__init__.py +1 -1
  140. rasa/core/nlg/callback.py +2 -3
  141. rasa/core/nlg/contextual_response_rephraser.py +63 -13
  142. rasa/core/nlg/generator.py +2 -2
  143. rasa/core/nlg/interpolator.py +4 -3
  144. rasa/core/nlg/response.py +3 -4
  145. rasa/core/nlg/summarize.py +1 -0
  146. rasa/core/persistor.py +3 -3
  147. rasa/core/policies/ensemble.py +10 -9
  148. rasa/core/policies/enterprise_search_policy.py +86 -21
  149. rasa/core/policies/flow_policy.py +13 -14
  150. rasa/core/policies/flows/flow_executor.py +35 -11
  151. rasa/core/policies/intentless_policy.py +6 -7
  152. rasa/core/policies/memoization.py +22 -20
  153. rasa/core/policies/policy.py +24 -22
  154. rasa/core/policies/rule_policy.py +37 -36
  155. rasa/core/policies/ted_policy.py +87 -85
  156. rasa/core/policies/unexpected_intent_policy.py +77 -75
  157. rasa/core/processor.py +96 -65
  158. rasa/core/run.py +1 -1
  159. rasa/core/secrets_manager/endpoints.py +2 -3
  160. rasa/core/secrets_manager/factory.py +2 -3
  161. rasa/core/secrets_manager/secret_manager.py +2 -3
  162. rasa/core/secrets_manager/vault.py +2 -2
  163. rasa/core/test.py +30 -30
  164. rasa/core/tracker_store.py +15 -15
  165. rasa/core/train.py +1 -1
  166. rasa/core/training/__init__.py +2 -2
  167. rasa/core/training/converters/responses_prefix_converter.py +1 -2
  168. rasa/core/training/interactive.py +13 -13
  169. rasa/core/training/story_conflict.py +4 -5
  170. rasa/core/training/training.py +3 -5
  171. rasa/core/utils.py +5 -5
  172. rasa/core/visualize.py +1 -1
  173. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
  174. rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
  175. rasa/dialogue_understanding/commands/__init__.py +22 -22
  176. rasa/dialogue_understanding/commands/can_not_handle_command.py +20 -1
  177. rasa/dialogue_understanding/commands/cancel_flow_command.py +18 -7
  178. rasa/dialogue_understanding/commands/change_flow_command.py +18 -2
  179. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +18 -4
  180. rasa/dialogue_understanding/commands/clarify_command.py +19 -3
  181. rasa/dialogue_understanding/commands/command.py +19 -3
  182. rasa/dialogue_understanding/commands/correct_slots_command.py +3 -3
  183. rasa/dialogue_understanding/commands/error_command.py +1 -1
  184. rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
  185. rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
  186. rasa/dialogue_understanding/commands/human_handoff_command.py +16 -4
  187. rasa/dialogue_understanding/commands/knowledge_answer_command.py +18 -4
  188. rasa/dialogue_understanding/commands/noop_command.py +2 -1
  189. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +16 -4
  190. rasa/dialogue_understanding/commands/restart_command.py +2 -5
  191. rasa/dialogue_understanding/commands/session_end_command.py +3 -5
  192. rasa/dialogue_understanding/commands/session_start_command.py +3 -5
  193. rasa/dialogue_understanding/commands/set_slot_command.py +27 -3
  194. rasa/dialogue_understanding/commands/skip_question_command.py +16 -4
  195. rasa/dialogue_understanding/commands/start_flow_command.py +17 -2
  196. rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
  197. rasa/dialogue_understanding/commands/utils.py +64 -45
  198. rasa/dialogue_understanding/constants.py +1 -0
  199. rasa/dialogue_understanding/generator/command_generator.py +2 -119
  200. rasa/dialogue_understanding/generator/command_parser.py +201 -0
  201. rasa/dialogue_understanding/generator/constants.py +2 -2
  202. rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
  203. rasa/dialogue_understanding/generator/llm_based_command_generator.py +11 -57
  204. rasa/dialogue_understanding/generator/llm_command_generator.py +2 -1
  205. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +67 -120
  206. rasa/dialogue_understanding/generator/nlu_command_adapter.py +8 -10
  207. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +32 -93
  208. rasa/dialogue_understanding/generator/utils.py +45 -0
  209. rasa/dialogue_understanding/patterns/cancel.py +2 -1
  210. rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
  211. rasa/dialogue_understanding/patterns/chitchat.py +1 -1
  212. rasa/dialogue_understanding/patterns/clarify.py +2 -1
  213. rasa/dialogue_understanding/patterns/code_change.py +2 -0
  214. rasa/dialogue_understanding/patterns/collect_information.py +6 -3
  215. rasa/dialogue_understanding/patterns/completed.py +1 -1
  216. rasa/dialogue_understanding/patterns/continue_interrupted.py +10 -1
  217. rasa/dialogue_understanding/patterns/correction.py +4 -2
  218. rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
  219. rasa/dialogue_understanding/patterns/internal_error.py +1 -0
  220. rasa/dialogue_understanding/patterns/search.py +1 -1
  221. rasa/dialogue_understanding/patterns/session_start.py +1 -1
  222. rasa/dialogue_understanding/patterns/skip_question.py +1 -0
  223. rasa/dialogue_understanding/patterns/user_silence.py +1 -1
  224. rasa/dialogue_understanding/processor/command_processor.py +13 -9
  225. rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
  226. rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
  227. rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
  228. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
  229. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
  230. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
  231. rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
  232. rasa/dialogue_understanding/stack/utils.py +8 -4
  233. rasa/dialogue_understanding/utils.py +121 -2
  234. rasa/dialogue_understanding_test/README.md +379 -0
  235. rasa/dialogue_understanding_test/command_comparison.py +60 -0
  236. rasa/dialogue_understanding_test/command_metric_calculation.py +110 -4
  237. rasa/dialogue_understanding_test/constants.py +6 -1
  238. rasa/dialogue_understanding_test/du_test_case.py +252 -38
  239. rasa/dialogue_understanding_test/du_test_result.py +281 -2
  240. rasa/dialogue_understanding_test/du_test_runner.py +239 -10
  241. rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
  242. rasa/dialogue_understanding_test/io.py +338 -20
  243. rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
  244. rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
  245. rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
  246. rasa/dialogue_understanding_test/utils.py +70 -0
  247. rasa/dialogue_understanding_test/validation.py +59 -4
  248. rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
  249. rasa/e2e_test/assertions.py +1 -1
  250. rasa/e2e_test/e2e_config.py +1 -1
  251. rasa/e2e_test/e2e_test_case.py +3 -4
  252. rasa/e2e_test/e2e_test_converter.py +2 -3
  253. rasa/e2e_test/e2e_test_coverage_report.py +6 -6
  254. rasa/e2e_test/e2e_test_result.py +1 -1
  255. rasa/e2e_test/e2e_test_runner.py +134 -31
  256. rasa/e2e_test/stub_custom_action.py +1 -1
  257. rasa/e2e_test/utils/e2e_yaml_utils.py +1 -1
  258. rasa/e2e_test/utils/io.py +132 -65
  259. rasa/e2e_test/utils/validation.py +1 -1
  260. rasa/engine/caching.py +5 -7
  261. rasa/engine/constants.py +1 -1
  262. rasa/engine/graph.py +2 -2
  263. rasa/engine/recipes/default_components.py +13 -15
  264. rasa/engine/recipes/recipe.py +2 -2
  265. rasa/engine/runner/dask.py +2 -2
  266. rasa/engine/runner/interface.py +1 -0
  267. rasa/engine/storage/local_model_storage.py +5 -4
  268. rasa/engine/storage/resource.py +2 -1
  269. rasa/engine/storage/storage.py +5 -3
  270. rasa/engine/training/components.py +2 -1
  271. rasa/engine/training/fingerprinting.py +4 -2
  272. rasa/engine/training/graph_trainer.py +4 -4
  273. rasa/engine/training/hooks.py +2 -2
  274. rasa/engine/validation.py +34 -33
  275. rasa/exceptions.py +3 -2
  276. rasa/graph_components/converters/nlu_message_converter.py +3 -3
  277. rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
  278. rasa/graph_components/providers/domain_provider.py +3 -2
  279. rasa/graph_components/providers/flows_provider.py +2 -3
  280. rasa/graph_components/providers/forms_provider.py +4 -4
  281. rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
  282. rasa/graph_components/providers/responses_provider.py +4 -4
  283. rasa/graph_components/providers/rule_only_provider.py +3 -2
  284. rasa/graph_components/providers/story_graph_provider.py +8 -8
  285. rasa/graph_components/providers/training_tracker_provider.py +3 -2
  286. rasa/graph_components/validators/default_recipe_validator.py +16 -16
  287. rasa/graph_components/validators/finetuning_validator.py +10 -8
  288. rasa/hooks.py +18 -12
  289. rasa/jupyter.py +2 -2
  290. rasa/llm_fine_tuning/annotation_module.py +4 -4
  291. rasa/llm_fine_tuning/conversations.py +6 -6
  292. rasa/llm_fine_tuning/llm_data_preparation_module.py +1 -1
  293. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
  294. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +1 -1
  295. rasa/llm_fine_tuning/paraphrasing_module.py +1 -1
  296. rasa/llm_fine_tuning/storage.py +3 -3
  297. rasa/markers/marker.py +2 -3
  298. rasa/markers/marker_base.py +1 -2
  299. rasa/markers/upload.py +2 -2
  300. rasa/markers/validate.py +2 -3
  301. rasa/model.py +3 -5
  302. rasa/model_manager/config.py +1 -1
  303. rasa/model_manager/model_api.py +5 -4
  304. rasa/model_manager/runner_service.py +6 -6
  305. rasa/model_manager/socket_bridge.py +8 -3
  306. rasa/model_manager/studio_jwt_auth.py +1 -0
  307. rasa/model_manager/trainer_service.py +9 -7
  308. rasa/model_manager/utils.py +1 -1
  309. rasa/model_manager/warm_rasa_process.py +14 -8
  310. rasa/model_service.py +5 -6
  311. rasa/model_testing.py +13 -15
  312. rasa/nlu/classifiers/diet_classifier.py +72 -73
  313. rasa/nlu/classifiers/fallback_classifier.py +9 -8
  314. rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
  315. rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
  316. rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
  317. rasa/nlu/classifiers/regex_message_handler.py +3 -2
  318. rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
  319. rasa/nlu/convert.py +2 -2
  320. rasa/nlu/emulators/dialogflow.py +3 -3
  321. rasa/nlu/emulators/luis.py +5 -5
  322. rasa/nlu/emulators/no_emulator.py +1 -0
  323. rasa/nlu/emulators/wit.py +4 -4
  324. rasa/nlu/extractors/crf_entity_extractor.py +11 -11
  325. rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
  326. rasa/nlu/extractors/entity_synonyms.py +10 -9
  327. rasa/nlu/extractors/extractor.py +16 -16
  328. rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
  329. rasa/nlu/extractors/regex_entity_extractor.py +11 -10
  330. rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
  331. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
  332. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
  333. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
  334. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
  335. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
  336. rasa/nlu/featurizers/featurizer.py +5 -4
  337. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
  338. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
  339. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
  340. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
  341. rasa/nlu/model.py +0 -1
  342. rasa/nlu/selectors/response_selector.py +67 -68
  343. rasa/nlu/test.py +38 -38
  344. rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
  345. rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
  346. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
  347. rasa/nlu/tokenizers/tokenizer.py +6 -7
  348. rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
  349. rasa/nlu/utils/bilou_utils.py +7 -7
  350. rasa/nlu/utils/hugging_face/registry.py +22 -22
  351. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
  352. rasa/nlu/utils/mitie_utils.py +2 -1
  353. rasa/nlu/utils/pattern_utils.py +1 -1
  354. rasa/nlu/utils/spacy_utils.py +3 -3
  355. rasa/plugin.py +12 -1
  356. rasa/server.py +37 -1
  357. rasa/shared/constants.py +22 -2
  358. rasa/shared/core/command_payload_reader.py +15 -7
  359. rasa/shared/core/constants.py +4 -1
  360. rasa/shared/core/conversation.py +1 -2
  361. rasa/shared/core/events.py +47 -37
  362. rasa/shared/core/flows/__init__.py +0 -1
  363. rasa/shared/core/flows/flow.py +11 -11
  364. rasa/shared/core/flows/flow_step.py +19 -13
  365. rasa/shared/core/flows/flow_step_links.py +21 -14
  366. rasa/shared/core/flows/flow_step_sequence.py +6 -4
  367. rasa/shared/core/flows/flows_list.py +3 -3
  368. rasa/shared/core/flows/nlu_trigger.py +1 -1
  369. rasa/shared/core/flows/steps/__init__.py +2 -2
  370. rasa/shared/core/flows/steps/action.py +4 -3
  371. rasa/shared/core/flows/steps/call.py +4 -4
  372. rasa/shared/core/flows/steps/collect.py +7 -4
  373. rasa/shared/core/flows/steps/continuation.py +3 -1
  374. rasa/shared/core/flows/steps/end.py +3 -1
  375. rasa/shared/core/flows/steps/internal.py +3 -2
  376. rasa/shared/core/flows/steps/link.py +6 -4
  377. rasa/shared/core/flows/steps/no_operation.py +7 -5
  378. rasa/shared/core/flows/steps/set_slots.py +4 -3
  379. rasa/shared/core/flows/steps/start.py +3 -1
  380. rasa/shared/core/flows/utils.py +1 -0
  381. rasa/shared/core/flows/validation.py +3 -5
  382. rasa/shared/core/generator.py +20 -21
  383. rasa/shared/core/slot_mappings.py +15 -15
  384. rasa/shared/core/slots.py +3 -3
  385. rasa/shared/core/trackers.py +31 -31
  386. rasa/shared/core/training_data/loading.py +1 -1
  387. rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
  388. rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
  389. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
  390. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
  391. rasa/shared/core/training_data/structures.py +11 -12
  392. rasa/shared/core/training_data/visualization.py +10 -10
  393. rasa/shared/data.py +6 -6
  394. rasa/shared/engine/caching.py +0 -1
  395. rasa/shared/exceptions.py +2 -2
  396. rasa/shared/importers/rasa.py +5 -6
  397. rasa/shared/importers/utils.py +1 -1
  398. rasa/shared/nlu/constants.py +3 -0
  399. rasa/shared/nlu/training_data/entities_parser.py +6 -6
  400. rasa/shared/nlu/training_data/features.py +3 -3
  401. rasa/shared/nlu/training_data/formats/__init__.py +1 -1
  402. rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
  403. rasa/shared/nlu/training_data/formats/luis.py +7 -8
  404. rasa/shared/nlu/training_data/formats/rasa.py +4 -5
  405. rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
  406. rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
  407. rasa/shared/nlu/training_data/formats/wit.py +3 -4
  408. rasa/shared/nlu/training_data/loading.py +4 -4
  409. rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
  410. rasa/shared/nlu/training_data/message.py +13 -14
  411. rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
  412. rasa/shared/nlu/training_data/schemas/responses.yml +1 -0
  413. rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
  414. rasa/shared/nlu/training_data/training_data.py +12 -13
  415. rasa/shared/nlu/training_data/util.py +11 -10
  416. rasa/shared/providers/_configs/azure_openai_client_config.py +3 -497
  417. rasa/shared/providers/_configs/client_config.py +1 -3
  418. rasa/shared/providers/_configs/default_litellm_client_config.py +1 -3
  419. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +1 -3
  420. rasa/shared/providers/_configs/litellm_router_client_config.py +1 -3
  421. rasa/shared/providers/_configs/model_group_config.py +2 -7
  422. rasa/shared/providers/_configs/openai_client_config.py +1 -3
  423. rasa/shared/providers/_configs/rasa_llm_client_config.py +1 -3
  424. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +1 -3
  425. rasa/shared/providers/_configs/utils.py +1 -0
  426. rasa/shared/providers/_ssl_verification_utils.py +5 -6
  427. rasa/shared/providers/_utils.py +5 -5
  428. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
  429. rasa/shared/providers/embedding/azure_openai_embedding_client.py +3 -28
  430. rasa/shared/providers/embedding/embedding_client.py +1 -1
  431. rasa/shared/providers/embedding/litellm_router_embedding_client.py +1 -3
  432. rasa/shared/providers/llm/_base_litellm_client.py +1 -3
  433. rasa/shared/providers/llm/azure_openai_llm_client.py +25 -81
  434. rasa/shared/providers/llm/default_litellm_llm_client.py +1 -3
  435. rasa/shared/providers/llm/litellm_router_llm_client.py +2 -21
  436. rasa/shared/providers/llm/llm_client.py +1 -3
  437. rasa/shared/providers/llm/llm_response.py +41 -2
  438. rasa/shared/providers/llm/openai_llm_client.py +3 -9
  439. rasa/shared/providers/llm/rasa_llm_client.py +6 -20
  440. rasa/shared/providers/llm/self_hosted_llm_client.py +3 -9
  441. rasa/shared/providers/mappings.py +18 -19
  442. rasa/shared/providers/router/_base_litellm_router_client.py +1 -3
  443. rasa/shared/providers/router/router_client.py +1 -3
  444. rasa/shared/utils/cli.py +1 -1
  445. rasa/shared/utils/common.py +1 -1
  446. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
  447. rasa/shared/utils/health_check/health_check.py +3 -3
  448. rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
  449. rasa/shared/utils/io.py +1 -1
  450. rasa/shared/utils/llm.py +5 -9
  451. rasa/shared/utils/pykwalify_extensions.py +1 -1
  452. rasa/shared/utils/schemas/events.py +1 -1
  453. rasa/shared/utils/yaml.py +29 -26
  454. rasa/studio/auth.py +3 -3
  455. rasa/studio/config.py +1 -2
  456. rasa/studio/data_handler.py +3 -3
  457. rasa/studio/download.py +1 -1
  458. rasa/studio/results_logger.py +3 -3
  459. rasa/studio/upload.py +2 -0
  460. rasa/telemetry.py +31 -0
  461. rasa/tracing/config.py +3 -3
  462. rasa/tracing/instrumentation/attribute_extractors.py +2 -0
  463. rasa/tracing/instrumentation/instrumentation.py +4 -4
  464. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
  465. rasa/tracing/instrumentation/metrics.py +11 -11
  466. rasa/tracing/metric_instrument_provider.py +14 -14
  467. rasa/utils/common.py +12 -9
  468. rasa/utils/endpoints.py +1 -1
  469. rasa/utils/io.py +7 -7
  470. rasa/utils/licensing.py +3 -4
  471. rasa/utils/log_utils.py +7 -6
  472. rasa/utils/ml_utils.py +1 -0
  473. rasa/utils/plotting.py +3 -3
  474. rasa/utils/sanic_error_handler.py +1 -1
  475. rasa/utils/tensorflow/callback.py +2 -2
  476. rasa/utils/tensorflow/crf.py +2 -2
  477. rasa/utils/tensorflow/data_generator.py +5 -5
  478. rasa/utils/tensorflow/environment.py +3 -3
  479. rasa/utils/tensorflow/feature_array.py +2 -3
  480. rasa/utils/tensorflow/layers.py +18 -12
  481. rasa/utils/tensorflow/layers_utils.py +2 -1
  482. rasa/utils/tensorflow/metrics.py +2 -2
  483. rasa/utils/tensorflow/model_data.py +7 -7
  484. rasa/utils/tensorflow/model_data_utils.py +10 -9
  485. rasa/utils/tensorflow/models.py +31 -32
  486. rasa/utils/tensorflow/rasa_layers.py +20 -19
  487. rasa/utils/tensorflow/types.py +2 -1
  488. rasa/utils/train_utils.py +23 -21
  489. rasa/utils/url_tools.py +1 -1
  490. rasa/validator.py +17 -1
  491. rasa/version.py +1 -1
  492. {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/METADATA +8 -9
  493. rasa_pro-3.12.0.dev3.dist-info/RECORD +800 -0
  494. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-855bc5b3-b080d6f2.js +0 -1
  495. rasa/shared/providers/constants.py +0 -7
  496. rasa_pro-3.12.0.dev1.dist-info/RECORD +0 -790
  497. {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/NOTICE +0 -0
  498. {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/WHEEL +0 -0
  499. {rasa_pro-3.12.0.dev1.dist-info → rasa_pro-3.12.0.dev3.dist-info}/entry_points.txt +0 -0
@@ -1,23 +1,26 @@
1
- import asyncio
2
1
  import json
3
2
  import logging
4
3
  from copy import deepcopy
5
- from sanic import Blueprint, response
6
- from sanic.request import Request
7
- from sanic.response import HTTPResponse
4
+ from typing import Any, Awaitable, Callable, Dict, List, Optional, Text
5
+
8
6
  from aiogram import Bot
7
+ from aiogram.exceptions import TelegramAPIError
9
8
  from aiogram.types import (
10
9
  InlineKeyboardButton,
11
- Update,
12
- InlineKeyboardMarkup,
13
10
  KeyboardButton,
14
- ReplyKeyboardMarkup,
15
11
  Message,
12
+ Update,
16
13
  )
17
- from aiogram.utils.exceptions import TelegramAPIError
18
- from typing import Dict, Text, Any, List, Optional, Callable, Awaitable
14
+ from aiogram.utils.keyboard import (
15
+ InlineKeyboardBuilder,
16
+ KeyboardBuilder,
17
+ ReplyKeyboardBuilder,
18
+ )
19
+ from sanic import Blueprint, response
20
+ from sanic.request import Request
21
+ from sanic.response import HTTPResponse
19
22
 
20
- from rasa.core.channels.channel import InputChannel, UserMessage, OutputChannel
23
+ from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
21
24
  from rasa.shared.constants import INTENT_MESSAGE_PREFIX
22
25
  from rasa.shared.core.constants import USER_INTENT_RESTART
23
26
  from rasa.shared.exceptions import RasaException
@@ -68,33 +71,37 @@ class TelegramOutput(Bot, OutputChannel):
68
71
  :button_type reply: reply keyboard
69
72
  """
70
73
  if button_type == "inline":
71
- reply_markup = InlineKeyboardMarkup()
74
+ reply_markup_builder: KeyboardBuilder = InlineKeyboardBuilder()
72
75
  button_list = [
73
- InlineKeyboardButton(s["title"], callback_data=s["payload"])
76
+ InlineKeyboardButton(text=s["title"], callback_data=s["payload"])
74
77
  for s in buttons
75
78
  ]
76
- reply_markup.row(*button_list)
79
+ reply_markup_builder.row(*button_list)
80
+ reply_markup = reply_markup_builder.as_markup()
77
81
 
78
82
  elif button_type == "vertical":
79
- reply_markup = InlineKeyboardMarkup()
83
+ reply_markup_builder = InlineKeyboardBuilder()
80
84
  [
81
- reply_markup.row(
82
- InlineKeyboardButton(s["title"], callback_data=s["payload"])
85
+ reply_markup_builder.row(
86
+ InlineKeyboardButton(text=s["title"], callback_data=s["payload"])
83
87
  )
84
88
  for s in buttons
85
89
  ]
90
+ reply_markup = reply_markup_builder.as_markup()
86
91
 
87
92
  elif button_type == "reply":
88
- reply_markup = ReplyKeyboardMarkup(
89
- resize_keyboard=False, one_time_keyboard=True
90
- )
91
- # drop button_type from button_list
92
- button_list = [b for b in buttons if b.get("title")]
93
+ reply_markup_builder = ReplyKeyboardBuilder()
94
+
93
95
  for idx, button in enumerate(buttons):
94
96
  if isinstance(button, list):
95
- reply_markup.add(KeyboardButton(s["title"]) for s in button)
97
+ reply_markup_builder.add(
98
+ *[KeyboardButton(text=s["title"]) for s in button]
99
+ )
96
100
  else:
97
- reply_markup.add(KeyboardButton(button["title"]))
101
+ reply_markup_builder.add(KeyboardButton(text=button["title"]))
102
+ reply_markup = reply_markup_builder.as_markup(
103
+ resize_keyboard=False, one_time_keyboard=True
104
+ )
98
105
  else:
99
106
  logger.error(
100
107
  "Trying to send text with buttons for unknown button type {}".format(
@@ -205,13 +212,14 @@ class TelegramInput(InputChannel):
205
212
 
206
213
  @telegram_webhook.route("/set_webhook", methods=["GET", "POST"])
207
214
  async def set_webhook(_: Request) -> HTTPResponse:
208
- s = await out_channel.set_webhook(self.webhook_url)
209
- if s:
210
- logger.info("Webhook Setup Successful")
211
- return response.text("Webhook setup successful")
212
- else:
213
- logger.warning("Webhook Setup Failed")
214
- return response.text("Invalid webhook")
215
+ try:
216
+ await self.set_webhook(out_channel)
217
+ except RasaException as exc:
218
+ logger.error(exc)
219
+ return response.text(str(exc))
220
+
221
+ logger.info("Webhook Setup Successful")
222
+ return response.text("Webhook setup successful")
215
223
 
216
224
  @telegram_webhook.route("/webhook", methods=["GET", "POST"])
217
225
  async def message(request: Request) -> Any:
@@ -226,24 +234,49 @@ class TelegramInput(InputChannel):
226
234
  return response.text("failed")
227
235
 
228
236
  if self._is_button(update):
229
- msg = update.callback_query.message
230
- text = update.callback_query.data
237
+ msg = (
238
+ update.callback_query.message
239
+ if update.callback_query is not None
240
+ else None
241
+ )
242
+ text = (
243
+ update.callback_query.data
244
+ if update.callback_query is not None
245
+ else None
246
+ )
231
247
  elif self._is_edited_message(update):
232
248
  msg = update.edited_message
233
- text = update.edited_message.text
249
+ text = (
250
+ update.edited_message.text
251
+ if update.edited_message is not None
252
+ else None
253
+ )
234
254
  else:
235
255
  msg = update.message
236
256
  if self._is_user_message(msg):
237
- text = msg.text.replace("/bot", "")
257
+ text = (
258
+ msg.text.replace("/bot", "")
259
+ if msg is not None and msg.text is not None
260
+ else None
261
+ )
238
262
  elif self._is_location(msg):
239
- text = '{{"lng":{0}, "lat":{1}}}'.format(
240
- msg.location.longitude, msg.location.latitude
263
+ text = (
264
+ '{{"lng":{0}, "lat":{1}}}'.format(
265
+ msg.location.longitude, msg.location.latitude
266
+ )
267
+ if msg is not None and msg.location is not None
268
+ else None
241
269
  )
242
270
  else:
243
271
  return response.text("success")
244
- sender_id = msg.chat.id
272
+
245
273
  metadata = self.get_metadata(request)
246
274
  try:
275
+ if msg is not None:
276
+ sender_id = str(msg.chat.id)
277
+ else:
278
+ raise ValueError("No message found.")
279
+
247
280
  if text == (INTENT_MESSAGE_PREFIX + USER_INTENT_RESTART):
248
281
  await on_new_message(
249
282
  UserMessage(
@@ -286,13 +319,12 @@ class TelegramInput(InputChannel):
286
319
 
287
320
  def get_output_channel(self) -> TelegramOutput:
288
321
  """Loads the telegram channel."""
289
- channel = TelegramOutput(self.access_token)
322
+ return TelegramOutput(self.access_token)
290
323
 
324
+ async def set_webhook(self, channel: TelegramOutput) -> None:
291
325
  try:
292
- asyncio.run(channel.set_webhook(url=self.webhook_url))
326
+ await channel.set_webhook(url=self.webhook_url)
293
327
  except TelegramAPIError as error:
294
328
  raise RasaException(
295
329
  "Failed to set channel webhook: " + str(error)
296
330
  ) from error
297
-
298
- return channel
@@ -1,13 +1,13 @@
1
1
  import logging
2
+ from typing import TYPE_CHECKING, Any, Awaitable, Callable, Dict, Optional, Text
3
+
2
4
  from sanic import Blueprint, response
3
5
  from sanic.request import Request
4
6
  from sanic.response import HTTPResponse
5
7
  from twilio.base.exceptions import TwilioRestException
6
8
  from twilio.rest import Client
7
- from typing import Dict, Text, Any, Callable, Awaitable, Optional, TYPE_CHECKING
8
9
 
9
- from rasa.core.channels.channel import InputChannel
10
- from rasa.core.channels.channel import UserMessage, OutputChannel
10
+ from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
11
11
 
12
12
  if TYPE_CHECKING:
13
13
  from twilio.rest.api.v2010.account.message import MessageInstance
@@ -8,10 +8,10 @@ from dataclasses import dataclass
8
8
  from functools import wraps
9
9
  from typing import Any, Awaitable, Callable, Dict, Optional, Text
10
10
 
11
- import rasa.shared.utils.io
12
11
  import structlog
13
- from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
14
12
 
13
+ import rasa.shared.utils.io
14
+ from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
15
15
  from rasa.utils.beta import ensure_beta_feature_is_enabled
16
16
 
17
17
  # ignore ResourceWarning, InsecureRequestWarning
@@ -1,26 +1,26 @@
1
1
  import copy
2
- from datetime import datetime, timezone, timedelta
3
2
  import json
4
3
  import uuid
5
- from typing import Any, Awaitable, Callable, Dict, List, Optional, Text, Union
6
4
  from dataclasses import asdict
5
+ from datetime import datetime, timedelta, timezone
6
+ from typing import Any, Awaitable, Callable, Dict, List, Optional, Text, Union
7
7
 
8
8
  import structlog
9
9
  from jsonschema import ValidationError, validate
10
+ from sanic import Blueprint, response
11
+ from sanic.exceptions import NotFound, SanicException, ServerError
12
+ from sanic.request import Request
13
+ from sanic.response import HTTPResponse
14
+
10
15
  from rasa.core import jobs
11
16
  from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
12
17
  from rasa.core.channels.voice_ready.utils import (
13
- validate_voice_license_scope,
14
18
  CallParameters,
19
+ validate_voice_license_scope,
15
20
  )
16
21
  from rasa.shared.constants import INTENT_MESSAGE_PREFIX
17
22
  from rasa.shared.core.constants import USER_INTENT_SESSION_START
18
23
  from rasa.shared.exceptions import RasaException
19
- from sanic import Blueprint, response
20
- from sanic.exceptions import NotFound, SanicException, ServerError
21
- from sanic.request import Request
22
- from sanic.response import HTTPResponse
23
-
24
24
  from rasa.utils.io import remove_emojis
25
25
 
26
26
  structlogger = structlog.get_logger()
@@ -1,18 +1,18 @@
1
1
  from typing import Any, Awaitable, Callable, Dict, List, Optional, Text
2
2
 
3
3
  import structlog
4
+ from sanic import Blueprint, Websocket, response # type: ignore[attr-defined]
5
+ from sanic.request import Request
6
+ from sanic.response import HTTPResponse
7
+
4
8
  from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
5
9
  from rasa.core.channels.voice_ready.jambonz_protocol import (
10
+ send_ws_hangup_message,
6
11
  send_ws_text_message,
7
12
  websocket_message_handler,
8
- send_ws_hangup_message,
9
13
  )
10
14
  from rasa.core.channels.voice_ready.utils import validate_voice_license_scope
11
15
  from rasa.shared.exceptions import RasaException
12
- from sanic import Blueprint, response, Websocket # type: ignore[attr-defined]
13
- from sanic.request import Request
14
- from sanic.response import HTTPResponse
15
-
16
16
  from rasa.shared.utils.common import mark_as_beta_feature
17
17
  from rasa.utils.io import remove_emojis
18
18
 
@@ -1,14 +1,13 @@
1
- from dataclasses import dataclass, field
2
1
  import json
3
2
  import uuid
3
+ from dataclasses import asdict, dataclass, field
4
4
  from typing import Any, Awaitable, Callable, Dict, List, Text
5
5
 
6
6
  import structlog
7
- from rasa.core.channels.channel import UserMessage
8
- from rasa.core.channels.voice_ready.utils import CallParameters
9
- from dataclasses import asdict
10
7
  from sanic import Websocket # type: ignore[attr-defined]
11
8
 
9
+ from rasa.core.channels.channel import UserMessage
10
+ from rasa.core.channels.voice_ready.utils import CallParameters
12
11
 
13
12
  structlogger = structlog.get_logger()
14
13
 
@@ -1,21 +1,22 @@
1
+ from dataclasses import asdict
2
+ from typing import Any, Awaitable, Callable, Dict, List, Optional, Text
3
+
4
+ import structlog
1
5
  from sanic import Blueprint, response
2
6
  from sanic.request import Request, RequestParameters
3
7
  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
8
+ from twilio.twiml.voice_response import Gather, VoiceResponse
7
9
 
8
- import structlog
9
- import rasa.utils.io
10
10
  import rasa.shared.utils.io
11
- from rasa.shared.core.events import BotUttered
12
- from rasa.shared.exceptions import InvalidConfigException
11
+ import rasa.utils.io
13
12
  from rasa.core.channels.channel import (
14
- InputChannel,
15
13
  CollectingOutputChannel,
14
+ InputChannel,
16
15
  UserMessage,
17
16
  )
18
17
  from rasa.core.channels.voice_ready.utils import CallParameters
18
+ from rasa.shared.core.events import BotUttered
19
+ from rasa.shared.exceptions import InvalidConfigException
19
20
 
20
21
  logger = structlog.get_logger(__name__)
21
22
 
@@ -1,7 +1,7 @@
1
- import structlog
2
1
  from dataclasses import dataclass
3
2
  from typing import Optional
4
3
 
4
+ import structlog
5
5
 
6
6
  structlogger = structlog.get_logger()
7
7
 
@@ -1,8 +1,8 @@
1
1
  from dataclasses import dataclass
2
2
  from typing import (
3
- Dict,
4
- AsyncIterator,
5
3
  Any,
4
+ AsyncIterator,
5
+ Dict,
6
6
  Generic,
7
7
  Optional,
8
8
  Tuple,
@@ -1,7 +1,7 @@
1
+ import asyncio
1
2
  import os
2
3
  from dataclasses import dataclass
3
- from typing import Any, Dict, Optional, AsyncIterator
4
- import asyncio
4
+ from typing import Any, AsyncIterator, Dict, Optional
5
5
 
6
6
  from rasa.core.channels.voice_stream.asr.asr_engine import ASREngine, ASREngineConfig
7
7
  from rasa.core.channels.voice_stream.asr.asr_event import (
@@ -1,7 +1,8 @@
1
- from dataclasses import dataclass
2
- from typing import Any, Dict, Optional
3
1
  import json
4
2
  import os
3
+ from dataclasses import dataclass
4
+ from typing import Any, Dict, Optional
5
+ from urllib.parse import urlencode
5
6
 
6
7
  import websockets
7
8
  from websockets.legacy.client import WebSocketClientProtocol
@@ -19,11 +20,14 @@ from rasa.shared.constants import DEEPGRAM_API_KEY_ENV_VAR
19
20
  @dataclass
20
21
  class DeepgramASRConfig(ASREngineConfig):
21
22
  endpoint: Optional[str] = None
22
- # number of miliseconds of silence to determine end of speech
23
+ # number of milliseconds of silence to determine end of speech
23
24
  endpointing: Optional[int] = None
24
25
  language: Optional[str] = None
25
26
  model: Optional[str] = None
26
27
  smart_format: Optional[bool] = None
28
+ # number of milliseconds of no new transcript to determine end of speech
29
+ # should be at least 1000 according to docs
30
+ utterance_end_ms: Optional[int] = None
27
31
 
28
32
 
29
33
  class DeepgramASR(ASREngine[DeepgramASRConfig]):
@@ -37,22 +41,35 @@ class DeepgramASR(ASREngine[DeepgramASRConfig]):
37
41
  """Connect to the ASR system."""
38
42
  deepgram_api_key = os.environ[DEEPGRAM_API_KEY_ENV_VAR]
39
43
  extra_headers = {"Authorization": f"Token {deepgram_api_key}"}
40
- api_url = self._get_api_url()
41
- query_params = self._get_query_params()
42
44
  return await websockets.connect( # type: ignore
43
- api_url + query_params,
45
+ self._get_api_url_with_query_params(),
44
46
  extra_headers=extra_headers,
45
47
  )
46
48
 
49
+ def _get_api_url_with_query_params(self) -> str:
50
+ """Combine api url and query params."""
51
+ return self._get_api_url() + self._get_query_params()
52
+
47
53
  def _get_api_url(self) -> str:
54
+ """Get the api url with the configured endpoint."""
48
55
  return f"wss://{self.config.endpoint}/v1/listen?"
49
56
 
50
57
  def _get_query_params(self) -> str:
51
- return (
52
- f"encoding=mulaw&sample_rate={HERTZ}&endpointing={self.config.endpointing}"
53
- f"&vad_events=true&language={self.config.language}&interim_results=true"
54
- f"&model={self.config.model}&smart_format={str(self.config.smart_format).lower()}"
55
- )
58
+ """Get the configured query parameters for the api."""
59
+ query_params = {
60
+ "encoding": "mulaw",
61
+ "sample_rate": HERTZ,
62
+ "endpointing": self.config.endpointing,
63
+ "vad_events": "true",
64
+ "language": self.config.language,
65
+ "interim_results": "true",
66
+ "model": self.config.model,
67
+ "smart_format": str(self.config.smart_format).lower(),
68
+ }
69
+ if self.config.utterance_end_ms and self.config.utterance_end_ms > 0:
70
+ query_params["utterance_end_ms"] = self.config.utterance_end_ms
71
+
72
+ return urlencode(query_params)
56
73
 
57
74
  async def signal_audio_done(self) -> None:
58
75
  """Signal to the ASR Api that you are done sending data."""
@@ -67,24 +84,48 @@ class DeepgramASR(ASREngine[DeepgramASRConfig]):
67
84
  def engine_event_to_asr_event(self, e: Any) -> Optional[ASREvent]:
68
85
  """Translate an engine event to a common ASREvent."""
69
86
  data = json.loads(e)
70
- if "is_final" in data:
71
- transcript = data["channel"]["alternatives"][0]["transcript"]
87
+ data_type = data["type"]
88
+ if data_type == "Results":
89
+ transcript_data = data["channel"]["alternatives"][0]
90
+ transcript = transcript_data["transcript"]
72
91
  if data["is_final"]:
73
92
  if data.get("speech_final"):
74
- full_transcript = self.accumulated_transcript + transcript
93
+ full_transcript = self.concatenate_transcripts(
94
+ self.accumulated_transcript, transcript
95
+ )
75
96
  self.accumulated_transcript = ""
76
97
  if full_transcript:
77
98
  return NewTranscript(full_transcript)
78
99
  else:
79
- self.accumulated_transcript += transcript
100
+ self.accumulated_transcript = self.concatenate_transcripts(
101
+ self.accumulated_transcript, transcript
102
+ )
80
103
  elif transcript:
81
104
  return UserIsSpeaking()
105
+ # event that comes after utterance_end_ms of no new transcript
106
+ elif data_type == "UtteranceEnd":
107
+ if self.accumulated_transcript:
108
+ transcript = self.accumulated_transcript
109
+ self.accumulated_transcript = ""
110
+ return NewTranscript(transcript)
82
111
  return None
83
112
 
84
113
  @staticmethod
85
114
  def get_default_config() -> DeepgramASRConfig:
86
- return DeepgramASRConfig("api.deepgram.com", 400, "en", "nova-2-general", True)
115
+ return DeepgramASRConfig(
116
+ endpoint="api.deepgram.com",
117
+ endpointing=400,
118
+ language="en",
119
+ model="nova-2-general",
120
+ smart_format=True,
121
+ utterance_end_ms=1000,
122
+ )
87
123
 
88
124
  @classmethod
89
125
  def from_config_dict(cls, config: Dict) -> "DeepgramASR":
90
126
  return DeepgramASR(DeepgramASRConfig.from_dict(config))
127
+
128
+ @staticmethod
129
+ def concatenate_transcripts(t1: str, t2: str) -> str:
130
+ """Concatenate two transcripts making sure there is a space between them."""
131
+ return (t1.strip() + " " + t2.strip()).strip()
@@ -1,20 +1,23 @@
1
1
  import audioop
2
2
  import base64
3
3
  import json
4
-
5
- import structlog
6
4
  import uuid
7
5
  from typing import Any, Awaitable, Callable, Optional, Tuple
8
6
 
9
- from sanic import Blueprint, HTTPResponse, Request, response
10
- from sanic import Websocket # type: ignore
11
-
7
+ import structlog
8
+ from sanic import ( # type: ignore[attr-defined]
9
+ Blueprint,
10
+ HTTPResponse,
11
+ Request,
12
+ Websocket,
13
+ response,
14
+ )
12
15
 
13
16
  from rasa.core.channels import UserMessage
14
17
  from rasa.core.channels.voice_ready.utils import CallParameters
18
+ from rasa.core.channels.voice_stream.audio_bytes import RasaAudioBytes
15
19
  from rasa.core.channels.voice_stream.call_state import call_state
16
20
  from rasa.core.channels.voice_stream.tts.tts_engine import TTSEngine
17
- from rasa.core.channels.voice_stream.audio_bytes import RasaAudioBytes
18
21
  from rasa.core.channels.voice_stream.voice_channel import (
19
22
  ContinueConversationAction,
20
23
  EndConversationAction,
@@ -1,9 +1,10 @@
1
1
  import asyncio
2
2
  from contextvars import ContextVar
3
- from werkzeug.local import LocalProxy
4
3
  from dataclasses import dataclass
5
4
  from typing import Optional
6
5
 
6
+ from werkzeug.local import LocalProxy
7
+
7
8
 
8
9
  # Per voice session data
9
10
  # This is similar to how flask makes the "request" object available as a global variable
@@ -1,6 +1,6 @@
1
1
  import os
2
- from typing import AsyncIterator, Dict, Optional
3
2
  from dataclasses import dataclass
3
+ from typing import AsyncIterator, Dict, Optional
4
4
 
5
5
  import aiohttp
6
6
  import structlog
@@ -15,7 +15,6 @@ from rasa.core.channels.voice_stream.tts.tts_engine import (
15
15
  from rasa.shared.constants import AZURE_SPEECH_API_KEY_ENV_VAR
16
16
  from rasa.shared.exceptions import ConnectionException
17
17
 
18
-
19
18
  structlogger = structlog.get_logger()
20
19
 
21
20
 
@@ -1,16 +1,17 @@
1
+ import os
1
2
  from dataclasses import dataclass
2
3
  from typing import AsyncIterator, Dict, Optional
3
- import os
4
+
4
5
  import aiohttp
5
6
  import structlog
6
7
  from aiohttp import ClientConnectorError, ClientTimeout
7
8
 
9
+ from rasa.core.channels.voice_stream.audio_bytes import HERTZ, RasaAudioBytes
8
10
  from rasa.core.channels.voice_stream.tts.tts_engine import (
11
+ TTSEngine,
9
12
  TTSEngineConfig,
13
+ TTSError,
10
14
  )
11
-
12
- from rasa.core.channels.voice_stream.audio_bytes import HERTZ, RasaAudioBytes
13
- from rasa.core.channels.voice_stream.tts.tts_engine import TTSEngine, TTSError
14
15
  from rasa.shared.constants import CARTESIA_API_KEY_ENV_VAR
15
16
  from rasa.shared.exceptions import ConnectionException
16
17
 
@@ -1,6 +1,7 @@
1
- from typing import Optional
2
- from collections import OrderedDict
3
1
  import logging
2
+ from collections import OrderedDict
3
+ from typing import Optional
4
+
4
5
  from rasa.core.channels.voice_stream.audio_bytes import RasaAudioBytes
5
6
 
6
7
  logger = logging.getLogger(__name__)
@@ -1,5 +1,5 @@
1
- from typing import AsyncIterator, Dict, Generic, Optional, Tuple, Type, TypeVar
2
1
  from dataclasses import dataclass
2
+ from typing import AsyncIterator, Dict, Generic, Optional, Tuple, Type, TypeVar
3
3
 
4
4
  from rasa.core.channels.voice_stream.audio_bytes import RasaAudioBytes
5
5
  from rasa.core.channels.voice_stream.util import MergeableConfig
@@ -1,24 +1,27 @@
1
1
  import base64
2
2
  import json
3
3
  import uuid
4
-
5
- import structlog
6
4
  from typing import Any, Awaitable, Callable, Dict, Optional, Text, Tuple
7
5
 
8
- from sanic import Blueprint, HTTPResponse, Request, response
9
- from sanic import Websocket # type: ignore
10
-
6
+ import structlog
7
+ from sanic import ( # type: ignore[attr-defined]
8
+ Blueprint,
9
+ HTTPResponse,
10
+ Request,
11
+ Websocket,
12
+ response,
13
+ )
11
14
 
12
15
  from rasa.core.channels import UserMessage
13
16
  from rasa.core.channels.voice_ready.utils import CallParameters
17
+ from rasa.core.channels.voice_stream.audio_bytes import RasaAudioBytes
14
18
  from rasa.core.channels.voice_stream.call_state import call_state
15
19
  from rasa.core.channels.voice_stream.tts.tts_engine import TTSEngine
16
- from rasa.core.channels.voice_stream.audio_bytes import RasaAudioBytes
17
20
  from rasa.core.channels.voice_stream.voice_channel import (
21
+ ContinueConversationAction,
18
22
  EndConversationAction,
19
23
  NewAudioAction,
20
24
  VoiceChannelAction,
21
- ContinueConversationAction,
22
25
  VoiceInputChannel,
23
26
  VoiceOutputChannel,
24
27
  )
@@ -1,5 +1,5 @@
1
- import wave
2
1
  import audioop
2
+ import wave
3
3
  from dataclasses import asdict, dataclass
4
4
  from typing import Optional, Type, TypeVar
5
5