rasa-pro 3.11.5__py3-none-any.whl → 3.12.0__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 (559) hide show
  1. README.md +10 -13
  2. rasa/__main__.py +7 -7
  3. rasa/anonymization/anonymisation_rule_yaml_reader.py +1 -1
  4. rasa/anonymization/anonymization_pipeline.py +3 -3
  5. rasa/anonymization/anonymization_rule_executor.py +17 -11
  6. rasa/anonymization/anonymization_rule_orchestrator.py +2 -3
  7. rasa/cli/arguments/data.py +2 -2
  8. rasa/cli/arguments/default_arguments.py +1 -1
  9. rasa/cli/arguments/evaluate.py +2 -1
  10. rasa/cli/arguments/interactive.py +1 -1
  11. rasa/cli/arguments/run.py +1 -1
  12. rasa/cli/arguments/test.py +7 -5
  13. rasa/cli/arguments/train.py +3 -3
  14. rasa/cli/arguments/visualize.py +2 -2
  15. rasa/cli/arguments/x.py +1 -0
  16. rasa/cli/data.py +20 -3
  17. rasa/cli/dialogue_understanding_test.py +386 -0
  18. rasa/cli/evaluate.py +1 -1
  19. rasa/cli/export.py +6 -6
  20. rasa/cli/inspect.py +20 -1
  21. rasa/cli/interactive.py +4 -5
  22. rasa/cli/llm_fine_tuning.py +51 -16
  23. rasa/cli/markers.py +1 -2
  24. rasa/cli/project_templates/calm/actions/add_contact.py +1 -1
  25. rasa/cli/project_templates/calm/config.yml +2 -2
  26. rasa/cli/project_templates/calm/domain/list_contacts.yml +1 -2
  27. rasa/cli/project_templates/calm/domain/remove_contact.yml +1 -2
  28. rasa/cli/project_templates/calm/domain/shared.yml +1 -4
  29. rasa/cli/project_templates/calm/endpoints.yml +2 -2
  30. rasa/cli/project_templates/tutorial/actions/actions.py +3 -2
  31. rasa/cli/shell.py +5 -6
  32. rasa/cli/studio/download.py +1 -2
  33. rasa/cli/studio/studio.py +2 -3
  34. rasa/cli/studio/train.py +0 -1
  35. rasa/cli/telemetry.py +2 -2
  36. rasa/cli/test.py +11 -11
  37. rasa/cli/train.py +3 -0
  38. rasa/cli/utils.py +25 -5
  39. rasa/constants.py +0 -1
  40. rasa/core/__init__.py +0 -1
  41. rasa/core/actions/action.py +135 -208
  42. rasa/core/actions/action_handle_digressions.py +164 -0
  43. rasa/core/actions/action_hangup.py +1 -1
  44. rasa/core/actions/action_repeat_bot_messages.py +2 -2
  45. rasa/core/actions/action_run_slot_rejections.py +18 -6
  46. rasa/core/actions/action_trigger_chitchat.py +1 -1
  47. rasa/core/actions/action_trigger_flow.py +5 -5
  48. rasa/core/actions/action_trigger_search.py +1 -1
  49. rasa/core/actions/custom_action_executor.py +1 -1
  50. rasa/core/actions/direct_custom_actions_executor.py +1 -0
  51. rasa/core/actions/forms.py +22 -15
  52. rasa/core/actions/http_custom_action_executor.py +8 -1
  53. rasa/core/actions/loops.py +3 -3
  54. rasa/core/actions/two_stage_fallback.py +13 -13
  55. rasa/core/auth_retry_tracker_store.py +1 -2
  56. rasa/core/brokers/broker.py +2 -1
  57. rasa/core/brokers/file.py +1 -1
  58. rasa/core/brokers/kafka.py +8 -8
  59. rasa/core/brokers/pika.py +8 -9
  60. rasa/core/brokers/sql.py +4 -3
  61. rasa/core/channels/__init__.py +7 -0
  62. rasa/core/channels/botframework.py +2 -2
  63. rasa/core/channels/callback.py +4 -4
  64. rasa/core/channels/channel.py +11 -11
  65. rasa/core/channels/console.py +0 -1
  66. rasa/core/channels/development_inspector.py +80 -24
  67. rasa/core/channels/facebook.py +5 -5
  68. rasa/core/channels/hangouts.py +7 -8
  69. rasa/core/channels/inspector/dist/assets/{arc-f0f8bd46.js → arc-9f1365dc.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-7162c77d.js → blockDiagram-38ab4fdb-e0f81b12.js} +1 -1
  71. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-b1d0d098.js → c4Diagram-3d4e48cf-9deaee1c.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/channel-44956714.js +1 -0
  73. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-807a1b27.js → classDiagram-70f12bd4-20450a96.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-5238dcdb.js → classDiagram-v2-f2320105-749d2abf.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/clone-a9475142.js +1 -0
  76. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-75dfaa67.js → createText-2e5e7dd3-bef0b38c.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-df20501d.js → edges-e0da2a9e-943801a7.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-13cf4797.js → erDiagram-9861fffd-d523a948.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-a4991264.js → flowDb-956e92f1-54e4cf19.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-ccecf773.js → flowDiagram-66a62f08-48bfbbe8.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-43fa749a.js +1 -0
  82. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-b5801783.js → flowchart-elk-definition-4a651766-17c30827.js} +1 -1
  83. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-161e079a.js → ganttDiagram-c361ad54-43086f2d.js} +1 -1
  84. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-f38e86a4.js → gitGraphDiagram-72cf32ee-5c8b693e.js} +1 -1
  85. rasa/core/channels/inspector/dist/assets/{graph-be6ef5d8.js → graph-41a90d26.js} +1 -1
  86. rasa/core/channels/inspector/dist/assets/{index-3862675e-d9ce8994.js → index-3862675e-b43eeae9.js} +1 -1
  87. rasa/core/channels/inspector/dist/assets/{index-7794b245.js → index-e8affe45.js} +155 -155
  88. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-5000a3dc.js → infoDiagram-f8f76790-0b20676b.js} +1 -1
  89. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-8ef0a17a.js → journeyDiagram-49397b02-39bce7b5.js} +1 -1
  90. rasa/core/channels/inspector/dist/assets/{layout-d649bc98.js → layout-dc8eeea4.js} +1 -1
  91. rasa/core/channels/inspector/dist/assets/{line-95add810.js → line-c4d2e756.js} +1 -1
  92. rasa/core/channels/inspector/dist/assets/{linear-f6025094.js → linear-86f6f2d9.js} +1 -1
  93. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-2e8531c4.js → mindmap-definition-fc14e90a-4216f771.js} +1 -1
  94. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-918adfdb.js → pieDiagram-8a3498a8-1a0cfa96.js} +1 -1
  95. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-cbd01797.js → quadrantDiagram-120e2f19-f91e67cf.js} +1 -1
  96. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6a8b877b.js → requirementDiagram-deff3bca-d4046bed.js} +1 -1
  97. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-c377c3fe.js → sankeyDiagram-04a897e0-2cf6d1d7.js} +1 -1
  98. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-ab9e9b7f.js → sequenceDiagram-704730f1-751ac4f5.js} +1 -1
  99. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-5e6ae67d.js → stateDiagram-587899a1-f734f4d4.js} +1 -1
  100. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-40643476.js → stateDiagram-v2-d93cdb3a-91c65710.js} +1 -1
  101. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-afb8d108.js → styles-6aaf32cf-e0cff7be.js} +1 -1
  102. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-7edc9423.js → styles-9a916d00-c8029e5d.js} +1 -1
  103. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-c1d8f7e9.js → styles-c10674c1-114f312a.js} +1 -1
  104. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-f494b2ef.js → svgDrawCommon-08f97a94-b7b9dc00.js} +1 -1
  105. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-11c7cdd0.js → timeline-definition-85554ec2-9536d189.js} +1 -1
  106. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-3f191ec1.js → xychartDiagram-e933f94c-bf3b0f36.js} +1 -1
  107. rasa/core/channels/inspector/dist/index.html +1 -1
  108. rasa/core/channels/inspector/package.json +1 -0
  109. rasa/core/channels/inspector/src/App.tsx +15 -2
  110. rasa/core/channels/inspector/src/components/RasaLogo.tsx +31 -0
  111. rasa/core/channels/inspector/src/components/RecruitmentPanel.tsx +68 -0
  112. rasa/core/channels/inspector/src/components/Welcome.tsx +19 -13
  113. rasa/core/channels/inspector/yarn.lock +5 -0
  114. rasa/core/channels/mattermost.py +4 -4
  115. rasa/core/channels/rasa_chat.py +4 -4
  116. rasa/core/channels/rest.py +11 -12
  117. rasa/core/channels/rocketchat.py +4 -3
  118. rasa/core/channels/slack.py +6 -5
  119. rasa/core/channels/socketio.py +8 -28
  120. rasa/core/channels/studio_chat.py +212 -0
  121. rasa/core/channels/telegram.py +105 -55
  122. rasa/core/channels/twilio.py +3 -3
  123. rasa/core/channels/vier_cvg.py +2 -2
  124. rasa/core/channels/voice_ready/audiocodes.py +9 -9
  125. rasa/core/channels/voice_ready/jambonz.py +5 -5
  126. rasa/core/channels/voice_ready/jambonz_protocol.py +3 -4
  127. rasa/core/channels/voice_ready/twilio_voice.py +9 -8
  128. rasa/core/channels/voice_ready/utils.py +2 -2
  129. rasa/core/channels/voice_stream/asr/asr_engine.py +12 -6
  130. rasa/core/channels/voice_stream/asr/asr_event.py +5 -0
  131. rasa/core/channels/voice_stream/asr/azure.py +16 -3
  132. rasa/core/channels/voice_stream/asr/deepgram.py +76 -19
  133. rasa/core/channels/voice_stream/audiocodes.py +292 -0
  134. rasa/core/channels/voice_stream/browser_audio.py +14 -7
  135. rasa/core/channels/voice_stream/call_state.py +6 -2
  136. rasa/core/channels/voice_stream/genesys.py +320 -0
  137. rasa/core/channels/voice_stream/tts/azure.py +13 -5
  138. rasa/core/channels/voice_stream/tts/cartesia.py +34 -14
  139. rasa/core/channels/voice_stream/tts/tts_cache.py +3 -2
  140. rasa/core/channels/voice_stream/tts/tts_engine.py +1 -1
  141. rasa/core/channels/voice_stream/twilio_media_streams.py +12 -8
  142. rasa/core/channels/voice_stream/util.py +1 -1
  143. rasa/core/channels/voice_stream/voice_channel.py +100 -56
  144. rasa/core/channels/webexteams.py +3 -4
  145. rasa/core/constants.py +2 -0
  146. rasa/core/evaluation/marker.py +7 -6
  147. rasa/core/evaluation/marker_base.py +15 -16
  148. rasa/core/evaluation/marker_stats.py +3 -4
  149. rasa/core/evaluation/marker_tracker_loader.py +5 -4
  150. rasa/core/exporter.py +4 -4
  151. rasa/core/featurizers/precomputation.py +8 -8
  152. rasa/core/featurizers/single_state_featurizer.py +7 -7
  153. rasa/core/featurizers/tracker_featurizers.py +13 -13
  154. rasa/core/http_interpreter.py +3 -4
  155. rasa/core/information_retrieval/__init__.py +1 -1
  156. rasa/core/information_retrieval/faiss.py +4 -4
  157. rasa/core/information_retrieval/information_retrieval.py +2 -2
  158. rasa/core/information_retrieval/milvus.py +3 -3
  159. rasa/core/information_retrieval/qdrant.py +3 -3
  160. rasa/core/jobs.py +1 -0
  161. rasa/core/lock.py +2 -3
  162. rasa/core/lock_store.py +3 -3
  163. rasa/core/migrate.py +12 -9
  164. rasa/core/nlg/__init__.py +1 -1
  165. rasa/core/nlg/callback.py +2 -3
  166. rasa/core/nlg/contextual_response_rephraser.py +82 -14
  167. rasa/core/nlg/generator.py +85 -17
  168. rasa/core/nlg/interpolator.py +4 -3
  169. rasa/core/nlg/response.py +9 -7
  170. rasa/core/nlg/summarize.py +1 -0
  171. rasa/core/nlg/translate.py +55 -0
  172. rasa/core/persistor.py +3 -3
  173. rasa/core/policies/ensemble.py +10 -9
  174. rasa/core/policies/enterprise_search_policy.py +87 -21
  175. rasa/core/policies/enterprise_search_prompt_with_citation_template.jinja2 +1 -1
  176. rasa/core/policies/flow_policy.py +13 -14
  177. rasa/core/policies/flows/flow_executor.py +85 -55
  178. rasa/core/policies/intentless_policy.py +6 -7
  179. rasa/core/policies/memoization.py +22 -20
  180. rasa/core/policies/policy.py +24 -22
  181. rasa/core/policies/rule_policy.py +37 -36
  182. rasa/core/policies/ted_policy.py +87 -85
  183. rasa/core/policies/unexpected_intent_policy.py +77 -75
  184. rasa/core/processor.py +167 -74
  185. rasa/core/run.py +5 -4
  186. rasa/core/secrets_manager/endpoints.py +2 -3
  187. rasa/core/secrets_manager/factory.py +2 -3
  188. rasa/core/secrets_manager/secret_manager.py +2 -3
  189. rasa/core/secrets_manager/vault.py +2 -2
  190. rasa/core/test.py +30 -30
  191. rasa/core/tracker_store.py +138 -49
  192. rasa/core/train.py +1 -1
  193. rasa/core/training/__init__.py +2 -2
  194. rasa/core/training/converters/responses_prefix_converter.py +1 -2
  195. rasa/core/training/interactive.py +13 -13
  196. rasa/core/training/story_conflict.py +4 -5
  197. rasa/core/training/training.py +3 -5
  198. rasa/core/utils.py +5 -5
  199. rasa/core/visualize.py +1 -1
  200. rasa/dialogue_understanding/coexistence/intent_based_router.py +2 -2
  201. rasa/dialogue_understanding/coexistence/llm_based_router.py +5 -5
  202. rasa/dialogue_understanding/commands/__init__.py +22 -22
  203. rasa/dialogue_understanding/commands/can_not_handle_command.py +38 -1
  204. rasa/dialogue_understanding/commands/cancel_flow_command.py +96 -9
  205. rasa/dialogue_understanding/commands/change_flow_command.py +36 -2
  206. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +36 -4
  207. rasa/dialogue_understanding/commands/clarify_command.py +46 -4
  208. rasa/dialogue_understanding/commands/command.py +3 -2
  209. rasa/dialogue_understanding/commands/command_syntax_manager.py +55 -0
  210. rasa/dialogue_understanding/commands/correct_slots_command.py +14 -5
  211. rasa/dialogue_understanding/commands/error_command.py +1 -1
  212. rasa/dialogue_understanding/commands/free_form_answer_command.py +2 -1
  213. rasa/dialogue_understanding/commands/handle_code_change_command.py +2 -2
  214. rasa/dialogue_understanding/commands/handle_digressions_command.py +144 -0
  215. rasa/dialogue_understanding/commands/human_handoff_command.py +34 -4
  216. rasa/dialogue_understanding/commands/knowledge_answer_command.py +36 -4
  217. rasa/dialogue_understanding/commands/noop_command.py +2 -1
  218. rasa/dialogue_understanding/commands/prompt_command.py +94 -0
  219. rasa/dialogue_understanding/commands/repeat_bot_messages_command.py +34 -4
  220. rasa/dialogue_understanding/commands/restart_command.py +2 -5
  221. rasa/dialogue_understanding/commands/session_end_command.py +3 -5
  222. rasa/dialogue_understanding/commands/session_start_command.py +3 -5
  223. rasa/dialogue_understanding/commands/set_slot_command.py +55 -16
  224. rasa/dialogue_understanding/commands/skip_question_command.py +34 -4
  225. rasa/dialogue_understanding/commands/start_flow_command.py +78 -2
  226. rasa/dialogue_understanding/commands/user_silence_command.py +3 -5
  227. rasa/dialogue_understanding/commands/utils.py +126 -43
  228. rasa/dialogue_understanding/constants.py +2 -0
  229. rasa/dialogue_understanding/generator/__init__.py +2 -0
  230. rasa/dialogue_understanding/generator/command_generator.py +120 -79
  231. rasa/dialogue_understanding/generator/command_parser.py +245 -0
  232. rasa/dialogue_understanding/generator/constants.py +12 -4
  233. rasa/dialogue_understanding/generator/flow_retrieval.py +7 -7
  234. rasa/dialogue_understanding/generator/llm_based_command_generator.py +187 -59
  235. rasa/dialogue_understanding/generator/llm_command_generator.py +6 -3
  236. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +106 -110
  237. rasa/dialogue_understanding/generator/nlu_command_adapter.py +53 -11
  238. rasa/dialogue_understanding/generator/prompt_templates/__init__.py +0 -0
  239. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +58 -0
  240. rasa/dialogue_understanding/generator/prompt_templates/command_prompt_v2_gpt_4o_2024_11_20_template.jinja2 +57 -0
  241. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +574 -0
  242. rasa/dialogue_understanding/generator/single_step/single_step_llm_command_generator.py +41 -386
  243. rasa/dialogue_understanding/generator/utils.py +76 -0
  244. rasa/dialogue_understanding/patterns/cancel.py +2 -1
  245. rasa/dialogue_understanding/patterns/cannot_handle.py +1 -0
  246. rasa/dialogue_understanding/patterns/chitchat.py +1 -1
  247. rasa/dialogue_understanding/patterns/clarify.py +2 -1
  248. rasa/dialogue_understanding/patterns/code_change.py +2 -0
  249. rasa/dialogue_understanding/patterns/collect_information.py +7 -4
  250. rasa/dialogue_understanding/patterns/completed.py +1 -1
  251. rasa/dialogue_understanding/patterns/continue_interrupted.py +1 -1
  252. rasa/dialogue_understanding/patterns/correction.py +17 -3
  253. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +78 -2
  254. rasa/dialogue_understanding/patterns/handle_digressions.py +81 -0
  255. rasa/dialogue_understanding/patterns/human_handoff.py +1 -1
  256. rasa/dialogue_understanding/patterns/internal_error.py +1 -0
  257. rasa/dialogue_understanding/patterns/search.py +1 -1
  258. rasa/dialogue_understanding/patterns/session_start.py +1 -1
  259. rasa/dialogue_understanding/patterns/skip_question.py +1 -0
  260. rasa/dialogue_understanding/patterns/user_silence.py +1 -1
  261. rasa/dialogue_understanding/patterns/validate_slot.py +65 -0
  262. rasa/dialogue_understanding/processor/command_processor.py +193 -43
  263. rasa/dialogue_understanding/processor/command_processor_component.py +1 -1
  264. rasa/dialogue_understanding/stack/dialogue_stack.py +4 -3
  265. rasa/dialogue_understanding/stack/frames/__init__.py +2 -2
  266. rasa/dialogue_understanding/stack/frames/chit_chat_frame.py +4 -1
  267. rasa/dialogue_understanding/stack/frames/dialogue_stack_frame.py +2 -3
  268. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +5 -2
  269. rasa/dialogue_understanding/stack/frames/search_frame.py +4 -1
  270. rasa/dialogue_understanding/stack/utils.py +56 -10
  271. rasa/dialogue_understanding/utils.py +164 -0
  272. rasa/dialogue_understanding_test/README.md +429 -0
  273. rasa/dialogue_understanding_test/__init__.py +0 -0
  274. rasa/dialogue_understanding_test/command_comparison.py +60 -0
  275. rasa/dialogue_understanding_test/command_metric_calculation.py +122 -0
  276. rasa/dialogue_understanding_test/constants.py +22 -0
  277. rasa/dialogue_understanding_test/du_test_case.py +448 -0
  278. rasa/dialogue_understanding_test/du_test_result.py +390 -0
  279. rasa/dialogue_understanding_test/du_test_runner.py +322 -0
  280. rasa/dialogue_understanding_test/du_test_schema.yml +161 -0
  281. rasa/dialogue_understanding_test/io.py +443 -0
  282. rasa/dialogue_understanding_test/test_case_simulation/__init__.py +0 -0
  283. rasa/dialogue_understanding_test/test_case_simulation/exception.py +28 -0
  284. rasa/dialogue_understanding_test/test_case_simulation/test_case_tracker_simulator.py +336 -0
  285. rasa/dialogue_understanding_test/utils.py +70 -0
  286. rasa/dialogue_understanding_test/validation.py +77 -0
  287. rasa/e2e_test/aggregate_test_stats_calculator.py +1 -1
  288. rasa/e2e_test/assertions.py +202 -175
  289. rasa/e2e_test/assertions_schema.yml +6 -0
  290. rasa/e2e_test/constants.py +16 -1
  291. rasa/e2e_test/e2e_config.py +102 -41
  292. rasa/e2e_test/e2e_config_schema.yml +28 -10
  293. rasa/e2e_test/e2e_test_case.py +5 -5
  294. rasa/e2e_test/e2e_test_converter.py +2 -3
  295. rasa/e2e_test/e2e_test_coverage_report.py +6 -6
  296. rasa/e2e_test/e2e_test_result.py +1 -1
  297. rasa/e2e_test/e2e_test_runner.py +143 -38
  298. rasa/e2e_test/llm_judge_prompts/answer_relevance_prompt_template.jinja2 +93 -0
  299. rasa/e2e_test/llm_judge_prompts/groundedness_prompt_template.jinja2 +169 -0
  300. rasa/e2e_test/stub_custom_action.py +1 -1
  301. rasa/e2e_test/utils/generative_assertions.py +243 -0
  302. rasa/e2e_test/utils/io.py +123 -93
  303. rasa/e2e_test/utils/validation.py +101 -3
  304. rasa/engine/caching.py +5 -7
  305. rasa/engine/constants.py +1 -1
  306. rasa/engine/graph.py +3 -2
  307. rasa/engine/language.py +182 -0
  308. rasa/engine/recipes/config_files/default_config.yml +4 -0
  309. rasa/engine/recipes/default_components.py +13 -15
  310. rasa/engine/recipes/default_recipe.py +65 -49
  311. rasa/engine/recipes/graph_recipe.py +10 -7
  312. rasa/engine/recipes/recipe.py +2 -2
  313. rasa/engine/runner/dask.py +2 -2
  314. rasa/engine/runner/interface.py +1 -0
  315. rasa/engine/storage/local_model_storage.py +6 -4
  316. rasa/engine/storage/resource.py +2 -1
  317. rasa/engine/storage/storage.py +8 -3
  318. rasa/engine/training/components.py +2 -1
  319. rasa/engine/training/fingerprinting.py +4 -2
  320. rasa/engine/training/graph_trainer.py +4 -4
  321. rasa/engine/training/hooks.py +2 -2
  322. rasa/engine/validation.py +36 -33
  323. rasa/exceptions.py +3 -2
  324. rasa/graph_components/converters/nlu_message_converter.py +3 -3
  325. rasa/graph_components/providers/domain_for_core_training_provider.py +3 -3
  326. rasa/graph_components/providers/domain_provider.py +3 -2
  327. rasa/graph_components/providers/flows_provider.py +2 -3
  328. rasa/graph_components/providers/forms_provider.py +4 -4
  329. rasa/graph_components/providers/nlu_training_data_provider.py +5 -3
  330. rasa/graph_components/providers/responses_provider.py +4 -4
  331. rasa/graph_components/providers/rule_only_provider.py +3 -2
  332. rasa/graph_components/providers/story_graph_provider.py +8 -8
  333. rasa/graph_components/providers/training_tracker_provider.py +3 -2
  334. rasa/graph_components/validators/default_recipe_validator.py +16 -16
  335. rasa/graph_components/validators/finetuning_validator.py +10 -8
  336. rasa/hooks.py +19 -14
  337. rasa/jupyter.py +2 -2
  338. rasa/llm_fine_tuning/annotation_module.py +4 -4
  339. rasa/llm_fine_tuning/conversations.py +5 -33
  340. rasa/llm_fine_tuning/llm_data_preparation_module.py +6 -4
  341. rasa/llm_fine_tuning/paraphrasing/conversation_rephraser.py +4 -4
  342. rasa/llm_fine_tuning/paraphrasing/rephrase_validator.py +18 -13
  343. rasa/llm_fine_tuning/paraphrasing_module.py +6 -2
  344. rasa/llm_fine_tuning/storage.py +3 -3
  345. rasa/llm_fine_tuning/train_test_split_module.py +27 -27
  346. rasa/llm_fine_tuning/utils.py +7 -0
  347. rasa/markers/marker.py +2 -3
  348. rasa/markers/marker_base.py +1 -2
  349. rasa/markers/upload.py +2 -2
  350. rasa/markers/validate.py +2 -3
  351. rasa/model.py +3 -5
  352. rasa/model_manager/config.py +1 -1
  353. rasa/model_manager/model_api.py +5 -4
  354. rasa/model_manager/runner_service.py +13 -10
  355. rasa/model_manager/socket_bridge.py +15 -9
  356. rasa/model_manager/studio_jwt_auth.py +1 -0
  357. rasa/model_manager/trainer_service.py +9 -7
  358. rasa/model_manager/utils.py +1 -1
  359. rasa/model_manager/warm_rasa_process.py +14 -9
  360. rasa/model_service.py +5 -6
  361. rasa/model_testing.py +13 -15
  362. rasa/model_training.py +29 -29
  363. rasa/nlu/classifiers/diet_classifier.py +72 -73
  364. rasa/nlu/classifiers/fallback_classifier.py +9 -8
  365. rasa/nlu/classifiers/keyword_intent_classifier.py +7 -6
  366. rasa/nlu/classifiers/logistic_regression_classifier.py +3 -3
  367. rasa/nlu/classifiers/mitie_intent_classifier.py +5 -4
  368. rasa/nlu/classifiers/regex_message_handler.py +3 -2
  369. rasa/nlu/classifiers/sklearn_intent_classifier.py +2 -2
  370. rasa/nlu/convert.py +2 -2
  371. rasa/nlu/emulators/dialogflow.py +3 -3
  372. rasa/nlu/emulators/luis.py +5 -5
  373. rasa/nlu/emulators/no_emulator.py +1 -0
  374. rasa/nlu/emulators/wit.py +4 -4
  375. rasa/nlu/extractors/crf_entity_extractor.py +11 -11
  376. rasa/nlu/extractors/duckling_entity_extractor.py +7 -6
  377. rasa/nlu/extractors/entity_synonyms.py +10 -9
  378. rasa/nlu/extractors/extractor.py +16 -16
  379. rasa/nlu/extractors/mitie_entity_extractor.py +10 -9
  380. rasa/nlu/extractors/regex_entity_extractor.py +11 -10
  381. rasa/nlu/extractors/spacy_entity_extractor.py +2 -2
  382. rasa/nlu/featurizers/dense_featurizer/convert_featurizer.py +15 -14
  383. rasa/nlu/featurizers/dense_featurizer/dense_featurizer.py +2 -1
  384. rasa/nlu/featurizers/dense_featurizer/lm_featurizer.py +10 -9
  385. rasa/nlu/featurizers/dense_featurizer/mitie_featurizer.py +9 -7
  386. rasa/nlu/featurizers/dense_featurizer/spacy_featurizer.py +13 -12
  387. rasa/nlu/featurizers/featurizer.py +5 -4
  388. rasa/nlu/featurizers/sparse_featurizer/count_vectors_featurizer.py +6 -6
  389. rasa/nlu/featurizers/sparse_featurizer/lexical_syntactic_featurizer.py +4 -4
  390. rasa/nlu/featurizers/sparse_featurizer/regex_featurizer.py +4 -4
  391. rasa/nlu/featurizers/sparse_featurizer/sparse_featurizer.py +2 -0
  392. rasa/nlu/model.py +0 -1
  393. rasa/nlu/selectors/response_selector.py +67 -68
  394. rasa/nlu/test.py +38 -38
  395. rasa/nlu/tokenizers/jieba_tokenizer.py +1 -2
  396. rasa/nlu/tokenizers/mitie_tokenizer.py +2 -2
  397. rasa/nlu/tokenizers/spacy_tokenizer.py +3 -3
  398. rasa/nlu/tokenizers/tokenizer.py +6 -7
  399. rasa/nlu/tokenizers/whitespace_tokenizer.py +1 -1
  400. rasa/nlu/utils/bilou_utils.py +7 -7
  401. rasa/nlu/utils/hugging_face/registry.py +22 -22
  402. rasa/nlu/utils/hugging_face/transformers_pre_post_processors.py +2 -1
  403. rasa/nlu/utils/mitie_utils.py +2 -1
  404. rasa/nlu/utils/pattern_utils.py +1 -1
  405. rasa/nlu/utils/spacy_utils.py +3 -3
  406. rasa/plugin.py +12 -1
  407. rasa/server.py +3 -2
  408. rasa/shared/constants.py +45 -18
  409. rasa/shared/core/command_payload_reader.py +15 -7
  410. rasa/shared/core/constants.py +34 -4
  411. rasa/shared/core/conversation.py +1 -2
  412. rasa/shared/core/domain.py +19 -20
  413. rasa/shared/core/events.py +60 -39
  414. rasa/shared/core/flows/__init__.py +0 -1
  415. rasa/shared/core/flows/constants.py +11 -0
  416. rasa/shared/core/flows/flow.py +107 -26
  417. rasa/shared/core/flows/flow_step.py +4 -3
  418. rasa/shared/core/flows/flow_step_links.py +1 -2
  419. rasa/shared/core/flows/flow_step_sequence.py +1 -1
  420. rasa/shared/core/flows/flows_list.py +3 -3
  421. rasa/shared/core/flows/flows_yaml_schema.json +69 -3
  422. rasa/shared/core/flows/nlu_trigger.py +1 -1
  423. rasa/shared/core/flows/steps/__init__.py +2 -2
  424. rasa/shared/core/flows/steps/action.py +1 -1
  425. rasa/shared/core/flows/steps/call.py +1 -1
  426. rasa/shared/core/flows/steps/collect.py +22 -40
  427. rasa/shared/core/flows/steps/internal.py +1 -1
  428. rasa/shared/core/flows/steps/link.py +1 -1
  429. rasa/shared/core/flows/steps/no_operation.py +2 -2
  430. rasa/shared/core/flows/steps/set_slots.py +1 -1
  431. rasa/shared/core/flows/utils.py +44 -4
  432. rasa/shared/core/flows/validation.py +4 -6
  433. rasa/shared/core/generator.py +20 -21
  434. rasa/shared/core/slot_mappings.py +360 -121
  435. rasa/shared/core/slots.py +163 -6
  436. rasa/shared/core/trackers.py +108 -33
  437. rasa/shared/core/training_data/loading.py +1 -1
  438. rasa/shared/core/training_data/story_reader/story_reader.py +3 -3
  439. rasa/shared/core/training_data/story_reader/story_step_builder.py +4 -4
  440. rasa/shared/core/training_data/story_reader/yaml_story_reader.py +29 -31
  441. rasa/shared/core/training_data/story_writer/yaml_story_writer.py +22 -24
  442. rasa/shared/core/training_data/structures.py +11 -12
  443. rasa/shared/core/training_data/visualization.py +10 -10
  444. rasa/shared/data.py +6 -6
  445. rasa/shared/engine/caching.py +0 -1
  446. rasa/shared/exceptions.py +2 -2
  447. rasa/shared/importers/importer.py +58 -2
  448. rasa/shared/importers/rasa.py +5 -6
  449. rasa/shared/importers/utils.py +1 -1
  450. rasa/shared/nlu/constants.py +9 -0
  451. rasa/shared/nlu/training_data/entities_parser.py +6 -6
  452. rasa/shared/nlu/training_data/features.py +3 -3
  453. rasa/shared/nlu/training_data/formats/__init__.py +1 -1
  454. rasa/shared/nlu/training_data/formats/dialogflow.py +4 -5
  455. rasa/shared/nlu/training_data/formats/luis.py +7 -8
  456. rasa/shared/nlu/training_data/formats/rasa.py +4 -5
  457. rasa/shared/nlu/training_data/formats/rasa_yaml.py +17 -16
  458. rasa/shared/nlu/training_data/formats/readerwriter.py +8 -11
  459. rasa/shared/nlu/training_data/formats/wit.py +3 -4
  460. rasa/shared/nlu/training_data/loading.py +4 -4
  461. rasa/shared/nlu/training_data/lookup_tables_parser.py +1 -1
  462. rasa/shared/nlu/training_data/message.py +13 -14
  463. rasa/shared/nlu/training_data/schemas/data_schema.py +1 -1
  464. rasa/shared/nlu/training_data/schemas/responses.yml +19 -11
  465. rasa/shared/nlu/training_data/synonyms_parser.py +3 -3
  466. rasa/shared/nlu/training_data/training_data.py +12 -13
  467. rasa/shared/nlu/training_data/util.py +11 -10
  468. rasa/shared/providers/_configs/azure_entra_id_config.py +541 -0
  469. rasa/shared/providers/_configs/azure_openai_client_config.py +150 -15
  470. rasa/shared/providers/_configs/client_config.py +3 -1
  471. rasa/shared/providers/_configs/default_litellm_client_config.py +9 -7
  472. rasa/shared/providers/_configs/huggingface_local_embedding_client_config.py +13 -11
  473. rasa/shared/providers/_configs/litellm_router_client_config.py +12 -10
  474. rasa/shared/providers/_configs/model_group_config.py +8 -5
  475. rasa/shared/providers/_configs/oauth_config.py +33 -0
  476. rasa/shared/providers/_configs/openai_client_config.py +14 -12
  477. rasa/shared/providers/_configs/rasa_llm_client_config.py +5 -3
  478. rasa/shared/providers/_configs/self_hosted_llm_client_config.py +12 -11
  479. rasa/shared/providers/_configs/utils.py +1 -0
  480. rasa/shared/providers/_ssl_verification_utils.py +5 -6
  481. rasa/shared/providers/_utils.py +5 -5
  482. rasa/shared/providers/constants.py +6 -0
  483. rasa/shared/providers/embedding/_base_litellm_embedding_client.py +1 -1
  484. rasa/shared/providers/embedding/azure_openai_embedding_client.py +32 -7
  485. rasa/shared/providers/embedding/embedding_client.py +1 -1
  486. rasa/shared/providers/embedding/litellm_router_embedding_client.py +5 -2
  487. rasa/shared/providers/llm/_base_litellm_client.py +43 -18
  488. rasa/shared/providers/llm/azure_openai_llm_client.py +90 -34
  489. rasa/shared/providers/llm/default_litellm_llm_client.py +4 -2
  490. rasa/shared/providers/llm/litellm_router_llm_client.py +32 -9
  491. rasa/shared/providers/llm/llm_client.py +24 -8
  492. rasa/shared/providers/llm/llm_response.py +61 -2
  493. rasa/shared/providers/llm/openai_llm_client.py +11 -5
  494. rasa/shared/providers/llm/rasa_llm_client.py +17 -14
  495. rasa/shared/providers/llm/self_hosted_llm_client.py +35 -15
  496. rasa/shared/providers/mappings.py +18 -19
  497. rasa/shared/providers/router/_base_litellm_router_client.py +48 -15
  498. rasa/shared/providers/router/router_client.py +3 -1
  499. rasa/shared/utils/cli.py +1 -1
  500. rasa/shared/utils/common.py +15 -1
  501. rasa/shared/utils/constants.py +3 -0
  502. rasa/shared/utils/health_check/embeddings_health_check_mixin.py +1 -1
  503. rasa/shared/utils/health_check/health_check.py +3 -3
  504. rasa/shared/utils/health_check/llm_health_check_mixin.py +1 -1
  505. rasa/shared/utils/io.py +1 -1
  506. rasa/shared/utils/llm.py +100 -18
  507. rasa/shared/utils/pykwalify_extensions.py +25 -1
  508. rasa/shared/utils/schemas/domain.yml +26 -1
  509. rasa/shared/utils/schemas/events.py +1 -1
  510. rasa/shared/utils/yaml.py +24 -20
  511. rasa/studio/auth.py +3 -3
  512. rasa/studio/config.py +1 -2
  513. rasa/studio/data_handler.py +3 -3
  514. rasa/studio/download.py +1 -1
  515. rasa/studio/results_logger.py +3 -3
  516. rasa/studio/upload.py +21 -5
  517. rasa/telemetry.py +127 -48
  518. rasa/tracing/config.py +5 -3
  519. rasa/tracing/constants.py +12 -0
  520. rasa/tracing/instrumentation/attribute_extractors.py +92 -14
  521. rasa/tracing/instrumentation/instrumentation.py +61 -5
  522. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +1 -1
  523. rasa/tracing/instrumentation/metrics.py +52 -11
  524. rasa/tracing/metric_instrument_provider.py +54 -14
  525. rasa/utils/common.py +12 -24
  526. rasa/utils/endpoints.py +1 -1
  527. rasa/utils/io.py +7 -7
  528. rasa/utils/licensing.py +3 -4
  529. rasa/utils/log_utils.py +7 -6
  530. rasa/utils/ml_utils.py +1 -0
  531. rasa/utils/plotting.py +3 -3
  532. rasa/utils/sanic_error_handler.py +1 -1
  533. rasa/utils/tensorflow/callback.py +2 -2
  534. rasa/utils/tensorflow/crf.py +2 -2
  535. rasa/utils/tensorflow/data_generator.py +5 -5
  536. rasa/utils/tensorflow/environment.py +3 -3
  537. rasa/utils/tensorflow/feature_array.py +2 -3
  538. rasa/utils/tensorflow/layers.py +18 -12
  539. rasa/utils/tensorflow/layers_utils.py +2 -1
  540. rasa/utils/tensorflow/metrics.py +2 -2
  541. rasa/utils/tensorflow/model_data.py +7 -7
  542. rasa/utils/tensorflow/model_data_utils.py +10 -9
  543. rasa/utils/tensorflow/models.py +31 -32
  544. rasa/utils/tensorflow/rasa_layers.py +20 -19
  545. rasa/utils/tensorflow/types.py +2 -1
  546. rasa/utils/train_utils.py +23 -21
  547. rasa/utils/url_tools.py +1 -1
  548. rasa/validator.py +594 -115
  549. rasa/version.py +1 -1
  550. {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/METADATA +23 -26
  551. rasa_pro-3.12.0.dist-info/RECORD +829 -0
  552. rasa/core/channels/inspector/dist/assets/channel-e265ea59.js +0 -1
  553. rasa/core/channels/inspector/dist/assets/clone-21f8a43d.js +0 -1
  554. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-5c8ce12d.js +0 -1
  555. rasa_pro-3.11.5.dist-info/RECORD +0 -785
  556. /rasa/dialogue_understanding/generator/{single_step → prompt_templates}/command_prompt_template.jinja2 +0 -0
  557. {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/NOTICE +0 -0
  558. {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/WHEEL +0 -0
  559. {rasa_pro-3.11.5.dist-info → rasa_pro-3.12.0.dist-info}/entry_points.txt +0 -0
@@ -1,32 +1,26 @@
1
1
  import asyncio
2
- import structlog
3
2
  import copy
4
3
  from dataclasses import asdict, dataclass
5
4
  from typing import Any, AsyncIterator, Awaitable, Callable, Dict, List, Optional, Tuple
6
5
 
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
-
6
+ import structlog
7
+ from sanic import Websocket # type: ignore
15
8
  from sanic.exceptions import ServerError, WebsocketClosed
16
9
 
17
10
  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
11
+ from rasa.core.channels.voice_ready.utils import (
12
+ CallParameters,
13
+ validate_voice_license_scope,
14
+ )
20
15
  from rasa.core.channels.voice_stream.asr.asr_engine import ASREngine
21
16
  from rasa.core.channels.voice_stream.asr.asr_event import (
22
17
  ASREvent,
23
18
  NewTranscript,
24
19
  UserIsSpeaking,
20
+ UserSilence,
25
21
  )
26
- from sanic import Websocket # type: ignore
27
-
28
- from rasa.core.channels.voice_stream.asr.deepgram import DeepgramASR
29
22
  from rasa.core.channels.voice_stream.asr.azure import AzureASR
23
+ from rasa.core.channels.voice_stream.asr.deepgram import DeepgramASR
30
24
  from rasa.core.channels.voice_stream.audio_bytes import HERTZ, RasaAudioBytes
31
25
  from rasa.core.channels.voice_stream.call_state import (
32
26
  CallState,
@@ -34,9 +28,16 @@ from rasa.core.channels.voice_stream.call_state import (
34
28
  call_state,
35
29
  )
36
30
  from rasa.core.channels.voice_stream.tts.azure import AzureTTS
37
- from rasa.core.channels.voice_stream.tts.tts_engine import TTSEngine, TTSError
38
31
  from rasa.core.channels.voice_stream.tts.cartesia import CartesiaTTS
39
32
  from rasa.core.channels.voice_stream.tts.tts_cache import TTSCache
33
+ from rasa.core.channels.voice_stream.tts.tts_engine import TTSEngine, TTSError
34
+ from rasa.core.channels.voice_stream.util import generate_silence
35
+ from rasa.shared.core.constants import SLOT_SILENCE_TIMEOUT
36
+ from rasa.shared.utils.cli import print_error_and_exit
37
+ from rasa.shared.utils.common import (
38
+ class_from_module_path,
39
+ mark_as_beta_feature,
40
+ )
40
41
  from rasa.utils.io import remove_emojis
41
42
 
42
43
  logger = structlog.get_logger(__name__)
@@ -120,13 +121,14 @@ class VoiceOutputChannel(OutputChannel):
120
121
  voice_websocket: Websocket,
121
122
  tts_engine: TTSEngine,
122
123
  tts_cache: TTSCache,
124
+ min_buffer_size: int = 0,
123
125
  ):
124
126
  super().__init__()
125
127
  self.voice_websocket = voice_websocket
126
128
  self.tts_engine = tts_engine
127
129
  self.tts_cache = tts_cache
128
-
129
130
  self.latest_message_id: Optional[str] = None
131
+ self.min_buffer_size = min_buffer_size
130
132
 
131
133
  def rasa_audio_bytes_to_channel_bytes(
132
134
  self, rasa_audio_bytes: RasaAudioBytes
@@ -148,6 +150,19 @@ class VoiceOutputChannel(OutputChannel):
148
150
  await self.voice_websocket.send(marker_message)
149
151
  self.latest_message_id = mark_id
150
152
 
153
+ async def send_start_marker(self, recipient_id: str) -> None:
154
+ """Send a marker message before the first audio chunk."""
155
+ # Default implementation uses the generic marker message
156
+ await self.send_marker_message(recipient_id)
157
+
158
+ async def send_intermediate_marker(self, recipient_id: str) -> None:
159
+ """Send a marker message during audio streaming."""
160
+ await self.send_marker_message(recipient_id)
161
+
162
+ async def send_end_marker(self, recipient_id: str) -> None:
163
+ """Send a marker message after the last audio chunk."""
164
+ await self.send_marker_message(recipient_id)
165
+
151
166
  def update_silence_timeout(self) -> None:
152
167
  """Updates the silence timeout for the session."""
153
168
  if self.tracker_state:
@@ -173,6 +188,14 @@ class VoiceOutputChannel(OutputChannel):
173
188
  cached_audio_bytes = self.tts_cache.get(text)
174
189
  collected_audio_bytes = RasaAudioBytes(b"")
175
190
  seconds_marker = -1
191
+ last_sent_offset = 0
192
+
193
+ # Send start marker before first chunk
194
+ try:
195
+ await self.send_start_marker(recipient_id)
196
+ except (WebsocketClosed, ServerError):
197
+ call_state.connection_failed = True # type: ignore[attr-defined]
198
+
176
199
  if cached_audio_bytes:
177
200
  audio_stream = self.chunk_audio(cached_audio_bytes)
178
201
  else:
@@ -185,19 +208,40 @@ class VoiceOutputChannel(OutputChannel):
185
208
  audio_stream = self.chunk_audio(generate_silence())
186
209
 
187
210
  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
211
+ collected_audio_bytes = RasaAudioBytes(collected_audio_bytes + audio_bytes)
194
212
 
213
+ # Check if we have enough new bytes to send
214
+ current_buffer_size = len(collected_audio_bytes) - last_sent_offset
215
+ should_send = current_buffer_size >= self.min_buffer_size
216
+
217
+ if should_send:
218
+ try:
219
+ # Send only the new bytes since last send
220
+ new_bytes = RasaAudioBytes(collected_audio_bytes[last_sent_offset:])
221
+ await self.send_audio_bytes(recipient_id, new_bytes)
222
+ last_sent_offset = len(collected_audio_bytes)
223
+
224
+ full_seconds_of_audio = len(collected_audio_bytes) // HERTZ
225
+ if full_seconds_of_audio > seconds_marker:
226
+ await self.send_intermediate_marker(recipient_id)
227
+ seconds_marker = full_seconds_of_audio
228
+
229
+ except (WebsocketClosed, ServerError):
230
+ # ignore sending error, and keep collecting and caching audio bytes
231
+ call_state.connection_failed = True # type: ignore[attr-defined]
232
+
233
+ # Send any remaining audio not yet sent
234
+ remaining_bytes = len(collected_audio_bytes) - last_sent_offset
235
+ if remaining_bytes > 0:
236
+ try:
237
+ new_bytes = RasaAudioBytes(collected_audio_bytes[last_sent_offset:])
238
+ await self.send_audio_bytes(recipient_id, new_bytes)
195
239
  except (WebsocketClosed, ServerError):
196
- # ignore sending error, and keep collecting and caching audio bytes
240
+ # ignore sending error
197
241
  call_state.connection_failed = True # type: ignore[attr-defined]
198
- collected_audio_bytes = RasaAudioBytes(collected_audio_bytes + audio_bytes)
242
+
199
243
  try:
200
- await self.send_marker_message(recipient_id)
244
+ await self.send_end_marker(recipient_id)
201
245
  except (WebsocketClosed, ServerError):
202
246
  # ignore sending error
203
247
  pass
@@ -244,13 +288,7 @@ class VoiceInputChannel(InputChannel):
244
288
  self.monitor_silence = monitor_silence
245
289
  self.tts_cache = TTSCache(tts_config.get("cache_size", 1000))
246
290
 
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:
291
+ async def monitor_silence_timeout(self, asr_event_queue: asyncio.Queue) -> None:
254
292
  timeout = call_state.silence_timeout
255
293
  if not timeout:
256
294
  return
@@ -258,16 +296,8 @@ class VoiceInputChannel(InputChannel):
258
296
  return
259
297
  logger.debug("voice_channel.silence_timeout_watch_started", timeout=timeout)
260
298
  await asyncio.sleep(timeout)
299
+ await asr_event_queue.put(UserSilence())
261
300
  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
301
 
272
302
  @staticmethod
273
303
  def _cancel_silence_timeout_watcher() -> None:
@@ -315,6 +345,7 @@ class VoiceInputChannel(InputChannel):
315
345
  def map_input_message(
316
346
  self,
317
347
  message: Any,
348
+ ws: Websocket,
318
349
  ) -> VoiceChannelAction:
319
350
  """Map a channel input message to a voice channel action."""
320
351
  raise NotImplementedError
@@ -328,6 +359,7 @@ class VoiceInputChannel(InputChannel):
328
359
  _call_state.set(CallState())
329
360
  asr_engine = asr_engine_from_config(self.asr_config)
330
361
  tts_engine = tts_engine_from_config(self.tts_config)
362
+ asr_event_queue: asyncio.Queue = asyncio.Queue()
331
363
  await asr_engine.connect()
332
364
 
333
365
  call_parameters = await self.collect_call_parameters(channel_websocket)
@@ -340,7 +372,7 @@ class VoiceInputChannel(InputChannel):
340
372
  async def consume_audio_bytes() -> None:
341
373
  async for message in channel_websocket:
342
374
  is_bot_speaking_before = call_state.is_bot_speaking
343
- channel_action = self.map_input_message(message)
375
+ channel_action = self.map_input_message(message, channel_websocket)
344
376
  is_bot_speaking_after = call_state.is_bot_speaking
345
377
 
346
378
  if not is_bot_speaking_before and is_bot_speaking_after:
@@ -354,12 +386,7 @@ class VoiceInputChannel(InputChannel):
354
386
  self._cancel_silence_timeout_watcher()
355
387
  call_state.silence_timeout_watcher = ( # type: ignore[attr-defined]
356
388
  asyncio.create_task(
357
- self.handle_silence_timeout(
358
- channel_websocket,
359
- on_new_message,
360
- tts_engine,
361
- call_parameters,
362
- )
389
+ self.monitor_silence_timeout(asr_event_queue)
363
390
  )
364
391
  )
365
392
  if isinstance(channel_action, NewAudioAction):
@@ -368,8 +395,13 @@ class VoiceInputChannel(InputChannel):
368
395
  # end stream event came from the other side
369
396
  break
370
397
 
371
- async def consume_asr_events() -> None:
398
+ async def receive_asr_events() -> None:
372
399
  async for event in asr_engine.stream_asr_events():
400
+ await asr_event_queue.put(event)
401
+
402
+ async def handle_asr_events() -> None:
403
+ while True:
404
+ event = await asr_event_queue.get()
373
405
  await self.handle_asr_event(
374
406
  event,
375
407
  channel_websocket,
@@ -378,16 +410,18 @@ class VoiceInputChannel(InputChannel):
378
410
  call_parameters,
379
411
  )
380
412
 
381
- audio_forwarding_task = asyncio.create_task(consume_audio_bytes())
382
- asr_event_task = asyncio.create_task(consume_asr_events())
413
+ tasks = [
414
+ asyncio.create_task(consume_audio_bytes()),
415
+ asyncio.create_task(receive_asr_events()),
416
+ asyncio.create_task(handle_asr_events()),
417
+ ]
383
418
  await asyncio.wait(
384
- [audio_forwarding_task, asr_event_task],
419
+ tasks,
385
420
  return_when=asyncio.FIRST_COMPLETED,
386
421
  )
387
- if not audio_forwarding_task.done():
388
- audio_forwarding_task.cancel()
389
- if not asr_event_task.done():
390
- asr_event_task.cancel()
422
+ for task in tasks:
423
+ if not task.done():
424
+ task.cancel()
391
425
  await tts_engine.close_connection()
392
426
  await asr_engine.close_connection()
393
427
  await channel_websocket.close()
@@ -425,3 +459,13 @@ class VoiceInputChannel(InputChannel):
425
459
  elif isinstance(e, UserIsSpeaking):
426
460
  self._cancel_silence_timeout_watcher()
427
461
  call_state.is_user_speaking = True # type: ignore[attr-defined]
462
+ elif isinstance(e, UserSilence):
463
+ output_channel = self.create_output_channel(voice_websocket, tts_engine)
464
+ message = UserMessage(
465
+ "/silence_timeout",
466
+ output_channel,
467
+ call_parameters.stream_id,
468
+ input_channel=self.name(),
469
+ metadata=asdict(call_parameters),
470
+ )
471
+ await on_new_message(message)
@@ -1,13 +1,12 @@
1
1
  import logging
2
+ from typing import Any, Awaitable, Callable, Dict, Optional, Text
3
+
2
4
  from sanic import Blueprint, response
3
5
  from sanic.request import Request
4
- from typing import Text, Optional, Dict, Any, Callable, Awaitable
5
-
6
6
  from sanic.response import HTTPResponse
7
7
  from webexteamssdk import WebexTeamsAPI, Webhook
8
8
 
9
- from rasa.core.channels.channel import InputChannel
10
- from rasa.core.channels.channel import UserMessage, OutputChannel
9
+ from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
11
10
 
12
11
  logger = logging.getLogger(__name__)
13
12
 
rasa/core/constants.py CHANGED
@@ -110,3 +110,5 @@ UTTER_SOURCE_METADATA_KEY = "utter_source"
110
110
  DOMAIN_GROUND_TRUTH_METADATA_KEY = "domain_ground_truth"
111
111
  ACTIVE_FLOW_METADATA_KEY = "active_flow"
112
112
  STEP_ID_METADATA_KEY = "step_id"
113
+ KEY_IS_CALM_SYSTEM = "is_calm_system"
114
+ KEY_IS_COEXISTENCE_ASSISTANT = "is_coexistence_assistant"
@@ -1,13 +1,14 @@
1
- from rasa.shared.core.domain import Domain
2
- from typing import Optional, Text, List
1
+ import logging
2
+ from typing import List, Optional, Text
3
+
3
4
  from rasa.core.evaluation.marker_base import (
4
- OperatorMarker,
5
5
  ConditionMarker,
6
- MarkerRegistry,
7
6
  Marker,
7
+ MarkerRegistry,
8
+ OperatorMarker,
8
9
  )
9
- from rasa.shared.core.events import ActionExecuted, SlotSet, UserUttered, Event
10
- import logging
10
+ from rasa.shared.core.domain import Domain
11
+ from rasa.shared.core.events import ActionExecuted, Event, SlotSet, UserUttered
11
12
 
12
13
  logger = logging.getLogger(__name__)
13
14
 
@@ -1,42 +1,41 @@
1
1
  from __future__ import annotations
2
+
3
+ import csv
4
+ import logging
2
5
  import os
6
+ import os.path
3
7
  from abc import ABC, abstractmethod
8
+ from dataclasses import dataclass
9
+ from pathlib import Path
4
10
  from typing import (
11
+ TYPE_CHECKING,
12
+ Any,
13
+ AsyncIterator,
5
14
  Dict,
6
15
  Iterator,
16
+ List,
7
17
  Optional,
8
18
  Set,
9
19
  Text,
10
- List,
11
20
  Tuple,
12
21
  Type,
13
22
  TypeVar,
14
- TYPE_CHECKING,
15
23
  Union,
16
- Any,
17
- AsyncIterator,
18
24
  )
19
25
 
20
- from pathlib import Path
21
- from dataclasses import dataclass
22
-
23
26
  import rasa.shared.core.constants
24
27
  import rasa.shared.nlu.constants
25
- import rasa.shared.utils.io
26
28
  import rasa.shared.utils.common
27
- from rasa.shared.data import is_likely_yaml_file
28
- from rasa.shared.exceptions import InvalidConfigException, RasaException
29
- from rasa.shared.core.events import ActionExecuted, UserUttered, Event
29
+ import rasa.shared.utils.io
30
30
  from rasa import telemetry
31
+ from rasa.shared.constants import DOCS_URL_MARKERS
31
32
  from rasa.shared.core.domain import Domain
33
+ from rasa.shared.core.events import ActionExecuted, Event, UserUttered
32
34
  from rasa.shared.core.trackers import DialogueStateTracker
35
+ from rasa.shared.data import is_likely_yaml_file
36
+ from rasa.shared.exceptions import InvalidConfigException, RasaException
33
37
  from rasa.shared.utils.yaml import read_yaml_file
34
38
  from rasa.utils.io import WriteRow
35
- from rasa.shared.constants import DOCS_URL_MARKERS
36
-
37
- import logging
38
- import csv
39
- import os.path
40
39
 
41
40
  if TYPE_CHECKING:
42
41
  from rasa.core.evaluation.marker import OrMarker
@@ -1,14 +1,13 @@
1
1
  from __future__ import annotations
2
- from typing import Dict, Text, Union, List, Tuple
3
2
 
4
- from rasa.utils.io import WriteRow
5
- from pathlib import Path
6
3
  import csv
4
+ from pathlib import Path
5
+ from typing import Dict, List, Text, Tuple, Union
7
6
 
8
7
  import numpy as np
9
8
 
10
-
11
9
  from rasa.core.evaluation.marker_base import EventMetaData
10
+ from rasa.utils.io import WriteRow
12
11
 
13
12
 
14
13
  def compute_statistics(
@@ -1,9 +1,10 @@
1
1
  import random
2
- from rasa.shared.exceptions import RasaException
3
- from rasa.shared.core.trackers import DialogueStateTracker
4
- from typing import Any, Iterable, List, Text, Optional, AsyncIterator
5
- from rasa.core.tracker_store import TrackerStore
2
+ from typing import Any, AsyncIterator, Iterable, List, Optional, Text
3
+
6
4
  import rasa.shared.utils.io
5
+ from rasa.core.tracker_store import TrackerStore
6
+ from rasa.shared.core.trackers import DialogueStateTracker
7
+ from rasa.shared.exceptions import RasaException
7
8
 
8
9
  STRATEGY_ALL = "all"
9
10
  STRATEGY_FIRST_N = "first_n"
rasa/core/exporter.py CHANGED
@@ -1,7 +1,7 @@
1
+ import datetime
1
2
  import logging
2
3
  import uuid
3
- import datetime
4
- from typing import AsyncIterator, Text, Optional, List, Set, Dict, Any
4
+ from typing import Any, AsyncIterator, Dict, List, Optional, Set, Text
5
5
 
6
6
  from tqdm import tqdm
7
7
 
@@ -11,12 +11,12 @@ from rasa.core.brokers.broker import EventBroker
11
11
  from rasa.core.brokers.pika import PikaEventBroker
12
12
  from rasa.core.constants import RASA_EXPORT_PROCESS_ID_HEADER_NAME
13
13
  from rasa.core.tracker_store import TrackerStore
14
- from rasa.shared.core.trackers import EventVerbosity
15
14
  from rasa.exceptions import (
16
- NoEventsToMigrateError,
17
15
  NoConversationsInTrackerStoreError,
16
+ NoEventsToMigrateError,
18
17
  PublishingError,
19
18
  )
19
+ from rasa.shared.core.trackers import EventVerbosity
20
20
 
21
21
  logger = logging.getLogger(__name__)
22
22
 
@@ -1,20 +1,20 @@
1
1
  from __future__ import annotations
2
- from typing import Optional, Text, Dict, List, Union, Iterable, Any
3
- from collections.abc import ValuesView, KeysView
4
2
 
5
- from rasa.engine.graph import GraphComponent
6
- from rasa.engine.storage.storage import ModelStorage
3
+ from collections.abc import KeysView, ValuesView
4
+ from typing import Any, Dict, Iterable, List, Optional, Text, Union
5
+
6
+ import rasa.shared.utils.io
7
+ from rasa.engine.graph import ExecutionContext, GraphComponent
7
8
  from rasa.engine.storage.resource import Resource
8
- from rasa.engine.graph import ExecutionContext
9
+ from rasa.engine.storage.storage import ModelStorage
9
10
  from rasa.shared.core.domain import Domain, SubState
10
- from rasa.shared.core.events import ActionExecuted, UserUttered, Event
11
+ from rasa.shared.core.events import ActionExecuted, Event, UserUttered
11
12
  from rasa.shared.core.trackers import DialogueStateTracker
12
13
  from rasa.shared.core.training_data.structures import StoryGraph
13
14
  from rasa.shared.nlu.constants import ACTION_NAME, ACTION_TEXT, INTENT, TEXT
15
+ from rasa.shared.nlu.training_data.features import Features
14
16
  from rasa.shared.nlu.training_data.message import Message
15
17
  from rasa.shared.nlu.training_data.training_data import TrainingData
16
- from rasa.shared.nlu.training_data.features import Features
17
- import rasa.shared.utils.io
18
18
 
19
19
  # TODO: make precomputations (MessageContainerForCoreFeaturization) cacheable
20
20
 
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from typing import List, Optional, Dict, Text, Set, Any
2
+ from typing import Any, Dict, List, Optional, Set, Text
3
3
 
4
4
  import numpy as np
5
5
  import scipy.sparse
@@ -8,18 +8,18 @@ from rasa.core.featurizers.precomputation import MessageContainerForCoreFeaturiz
8
8
  from rasa.nlu.extractors.extractor import EntityTagSpec
9
9
  from rasa.nlu.utils import bilou_utils
10
10
  from rasa.nlu.utils.bilou_utils import BILOU_PREFIXES
11
- from rasa.shared.core.domain import SubState, State, Domain
12
- from rasa.shared.core.constants import PREVIOUS_ACTION, ACTIVE_LOOP, USER, SLOTS
11
+ from rasa.shared.core.constants import ACTIVE_LOOP, PREVIOUS_ACTION, SLOTS, USER
12
+ from rasa.shared.core.domain import Domain, State, SubState
13
13
  from rasa.shared.core.trackers import is_prev_action_listen_in_state
14
14
  from rasa.shared.nlu.constants import (
15
+ ACTION_NAME,
16
+ ACTION_TEXT,
15
17
  ENTITIES,
18
+ ENTITY_ATTRIBUTE_TYPE,
19
+ ENTITY_TAGS,
16
20
  FEATURE_TYPE_SENTENCE,
17
- ACTION_TEXT,
18
- ACTION_NAME,
19
21
  INTENT,
20
22
  NO_ENTITY_TAG,
21
- ENTITY_ATTRIBUTE_TYPE,
22
- ENTITY_TAGS,
23
23
  TEXT,
24
24
  )
25
25
  from rasa.shared.nlu.training_data.features import Features
@@ -5,20 +5,20 @@ from abc import abstractmethod
5
5
  from collections import defaultdict
6
6
  from pathlib import Path
7
7
  from typing import (
8
- Tuple,
8
+ Any,
9
+ Callable,
10
+ ClassVar,
11
+ DefaultDict,
12
+ Dict,
13
+ Iterator,
9
14
  List,
10
15
  Optional,
11
- Dict,
16
+ Set,
12
17
  Text,
18
+ Tuple,
19
+ Type,
13
20
  Union,
14
- Any,
15
- Iterator,
16
- Set,
17
- DefaultDict,
18
21
  cast,
19
- Type,
20
- Callable,
21
- ClassVar,
22
22
  )
23
23
 
24
24
  import numpy as np
@@ -30,15 +30,15 @@ from rasa.core.exceptions import InvalidTrackerFeaturizerUsageError
30
30
  from rasa.core.featurizers.precomputation import MessageContainerForCoreFeaturization
31
31
  from rasa.core.featurizers.single_state_featurizer import SingleStateFeaturizer
32
32
  from rasa.shared.core.constants import (
33
- USER,
34
33
  ACTION_UNLIKELY_INTENT_NAME,
35
34
  PREVIOUS_ACTION,
35
+ USER,
36
36
  )
37
- from rasa.shared.core.domain import State, Domain
38
- from rasa.shared.core.events import Event, ActionExecuted, UserUttered
37
+ from rasa.shared.core.domain import Domain, State
38
+ from rasa.shared.core.events import ActionExecuted, Event, UserUttered
39
39
  from rasa.shared.core.trackers import DialogueStateTracker
40
40
  from rasa.shared.exceptions import RasaException
41
- from rasa.shared.nlu.constants import TEXT, INTENT, ENTITIES, ACTION_NAME
41
+ from rasa.shared.nlu.constants import ACTION_NAME, ENTITIES, INTENT, TEXT
42
42
  from rasa.shared.nlu.training_data.features import Features
43
43
  from rasa.utils.tensorflow.constants import LABEL_PAD_ID
44
44
  from rasa.utils.tensorflow.model_data import ragged_array_to_ndarray
@@ -1,10 +1,9 @@
1
- import aiohttp
2
-
3
1
  import copy
4
2
  import logging
5
- import structlog
3
+ from typing import Any, Dict, Optional, Text
6
4
 
7
- from typing import Text, Dict, Any, Optional
5
+ import aiohttp
6
+ import structlog
8
7
 
9
8
  from rasa.core import constants
10
9
  from rasa.core.channels import UserMessage
@@ -1,7 +1,7 @@
1
1
  from rasa.core.information_retrieval.information_retrieval import ( # noqa: F401
2
2
  InformationRetrieval,
3
+ InformationRetrievalException,
3
4
  SearchResult,
4
5
  SearchResultList,
5
- InformationRetrievalException,
6
6
  create_from_endpoint_config,
7
7
  )
@@ -1,18 +1,18 @@
1
1
  from pathlib import Path
2
- from typing import TYPE_CHECKING, List, Optional, Text, Any, Dict
2
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Text
3
3
 
4
4
  import structlog
5
5
  from langchain.text_splitter import RecursiveCharacterTextSplitter
6
- from langchain_community.document_loaders.text import TextLoader
7
6
  from langchain_community.document_loaders.directory import DirectoryLoader
7
+ from langchain_community.document_loaders.text import TextLoader
8
8
  from langchain_community.vectorstores.faiss import FAISS
9
- from rasa.utils.endpoints import EndpointConfig
10
9
 
11
10
  from rasa.core.information_retrieval import (
12
- SearchResultList,
13
11
  InformationRetrieval,
14
12
  InformationRetrievalException,
13
+ SearchResultList,
15
14
  )
15
+ from rasa.utils.endpoints import EndpointConfig
16
16
  from rasa.utils.ml_utils import persist_faiss_vector_store
17
17
 
18
18
  if TYPE_CHECKING:
@@ -1,13 +1,13 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import importlib
3
4
  from dataclasses import dataclass
4
- from typing import TYPE_CHECKING, List, Text, Any, Optional
5
+ from typing import TYPE_CHECKING, Any, List, Optional, Text
5
6
 
6
7
  import structlog
7
8
 
8
9
  from rasa.shared.exceptions import RasaException
9
10
  from rasa.utils.endpoints import EndpointConfig
10
- import importlib
11
11
 
12
12
  if TYPE_CHECKING:
13
13
  from langchain.schema import Document
@@ -1,14 +1,14 @@
1
- from typing import Text, Any, Dict
1
+ from typing import Any, Dict, Text
2
2
 
3
3
  import structlog
4
4
  from langchain_community.vectorstores.milvus import Milvus
5
- from rasa.utils.endpoints import EndpointConfig
6
5
 
7
6
  from rasa.core.information_retrieval import (
8
- SearchResultList,
9
7
  InformationRetrieval,
10
8
  InformationRetrievalException,
9
+ SearchResultList,
11
10
  )
11
+ from rasa.utils.endpoints import EndpointConfig
12
12
 
13
13
  logger = structlog.get_logger()
14
14
 
@@ -1,16 +1,16 @@
1
- from typing import Text, Any, Dict
1
+ from typing import Any, Dict, Text
2
2
 
3
3
  import structlog
4
4
  from langchain_community.vectorstores.qdrant import Qdrant
5
5
  from pydantic import ValidationError
6
6
  from qdrant_client import QdrantClient
7
- from rasa.utils.endpoints import EndpointConfig
8
7
 
9
8
  from rasa.core.information_retrieval import (
10
- SearchResultList,
11
9
  InformationRetrieval,
12
10
  InformationRetrievalException,
11
+ SearchResultList,
13
12
  )
13
+ from rasa.utils.endpoints import EndpointConfig
14
14
 
15
15
  logger = structlog.get_logger()
16
16
 
rasa/core/jobs.py CHANGED
@@ -3,6 +3,7 @@ import logging
3
3
 
4
4
  from apscheduler.schedulers.asyncio import AsyncIOScheduler
5
5
  from pytz import UnknownTimeZoneError, utc
6
+
6
7
  import rasa.shared.utils.io
7
8
 
8
9
  __scheduler = None