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,31 +1,25 @@
1
- import asyncio
2
1
  import json
3
2
  import logging
3
+ import typing
4
4
  from copy import deepcopy
5
+ from typing import Any, Awaitable, Callable, Dict, List, Optional, Text
6
+
5
7
  from sanic import Blueprint, response
6
8
  from sanic.request import Request
7
9
  from sanic.response import HTTPResponse
8
- from aiogram import Bot
9
- from aiogram.types import (
10
- InlineKeyboardButton,
11
- Update,
12
- InlineKeyboardMarkup,
13
- KeyboardButton,
14
- ReplyKeyboardMarkup,
15
- Message,
16
- )
17
- from aiogram.utils.exceptions import TelegramAPIError
18
- from typing import Dict, Text, Any, List, Optional, Callable, Awaitable
19
-
20
- from rasa.core.channels.channel import InputChannel, UserMessage, OutputChannel
10
+
11
+ from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
21
12
  from rasa.shared.constants import INTENT_MESSAGE_PREFIX
22
13
  from rasa.shared.core.constants import USER_INTENT_RESTART
23
14
  from rasa.shared.exceptions import RasaException
24
15
 
25
16
  logger = logging.getLogger(__name__)
26
17
 
18
+ if typing.TYPE_CHECKING:
19
+ from aiogram.types import Message, Update
20
+
27
21
 
28
- class TelegramOutput(Bot, OutputChannel):
22
+ class TelegramOutput(OutputChannel):
29
23
  """Output channel for Telegram."""
30
24
 
31
25
  # skipcq: PYL-W0236
@@ -34,20 +28,28 @@ class TelegramOutput(Bot, OutputChannel):
34
28
  return "telegram"
35
29
 
36
30
  def __init__(self, access_token: Optional[Text]) -> None:
37
- Bot.__init__(self, access_token)
31
+ try:
32
+ from aiogram import Bot
33
+
34
+ self.bot = Bot(access_token)
35
+ except ImportError:
36
+ raise ImportError(
37
+ "To use the Telegram channel, please install the aiogram package "
38
+ "with 'pip install aiogram'"
39
+ )
38
40
 
39
41
  async def send_text_message(
40
42
  self, recipient_id: Text, text: Text, **kwargs: Any
41
43
  ) -> None:
42
44
  """Sends text message."""
43
45
  for message_part in text.strip().split("\n\n"):
44
- await self.send_message(recipient_id, message_part)
46
+ await self.bot.send_message(recipient_id, message_part)
45
47
 
46
48
  async def send_image_url(
47
49
  self, recipient_id: Text, image: Text, **kwargs: Any
48
50
  ) -> None:
49
51
  """Sends an image."""
50
- await self.send_photo(recipient_id, image)
52
+ await self.bot.send_photo(recipient_id, image)
51
53
 
52
54
  async def send_text_with_buttons(
53
55
  self,
@@ -67,34 +69,45 @@ class TelegramOutput(Bot, OutputChannel):
67
69
 
68
70
  :button_type reply: reply keyboard
69
71
  """
72
+ from aiogram.types import InlineKeyboardButton, KeyboardButton
73
+ from aiogram.utils.keyboard import (
74
+ InlineKeyboardBuilder,
75
+ KeyboardBuilder,
76
+ ReplyKeyboardBuilder,
77
+ )
78
+
70
79
  if button_type == "inline":
71
- reply_markup = InlineKeyboardMarkup()
80
+ reply_markup_builder: "KeyboardBuilder" = InlineKeyboardBuilder()
72
81
  button_list = [
73
- InlineKeyboardButton(s["title"], callback_data=s["payload"])
82
+ InlineKeyboardButton(text=s["title"], callback_data=s["payload"])
74
83
  for s in buttons
75
84
  ]
76
- reply_markup.row(*button_list)
85
+ reply_markup_builder.row(*button_list)
86
+ reply_markup = reply_markup_builder.as_markup()
77
87
 
78
88
  elif button_type == "vertical":
79
- reply_markup = InlineKeyboardMarkup()
89
+ reply_markup_builder = InlineKeyboardBuilder()
80
90
  [
81
- reply_markup.row(
82
- InlineKeyboardButton(s["title"], callback_data=s["payload"])
91
+ reply_markup_builder.row(
92
+ InlineKeyboardButton(text=s["title"], callback_data=s["payload"])
83
93
  )
84
94
  for s in buttons
85
95
  ]
96
+ reply_markup = reply_markup_builder.as_markup()
86
97
 
87
98
  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")]
99
+ reply_markup_builder = ReplyKeyboardBuilder()
100
+
93
101
  for idx, button in enumerate(buttons):
94
102
  if isinstance(button, list):
95
- reply_markup.add(KeyboardButton(s["title"]) for s in button)
103
+ reply_markup_builder.add(
104
+ *[KeyboardButton(text=s["title"]) for s in button]
105
+ )
96
106
  else:
97
- reply_markup.add(KeyboardButton(button["title"]))
107
+ reply_markup_builder.add(KeyboardButton(text=button["title"]))
108
+ reply_markup = reply_markup_builder.as_markup(
109
+ resize_keyboard=False, one_time_keyboard=True
110
+ )
98
111
  else:
99
112
  logger.error(
100
113
  "Trying to send text with buttons for unknown button type {}".format(
@@ -103,7 +116,7 @@ class TelegramOutput(Bot, OutputChannel):
103
116
  )
104
117
  return
105
118
 
106
- await self.send_message(recipient_id, text, reply_markup=reply_markup)
119
+ await self.bot.send_message(recipient_id, text, reply_markup=reply_markup)
107
120
 
108
121
  async def send_custom_json(
109
122
  self, recipient_id: Text, json_message: Dict[Text, Any], **kwargs: Any
@@ -143,9 +156,17 @@ class TelegramOutput(Bot, OutputChannel):
143
156
  for params in send_functions.keys():
144
157
  if all(json_message.get(p) is not None for p in params):
145
158
  args = [json_message.pop(p) for p in params]
146
- api_call = getattr(self, send_functions[params])
159
+ api_call = getattr(self.bot, send_functions[params])
147
160
  await api_call(recipient_id, *args, **json_message)
148
161
 
162
+ async def get_me(self) -> Any:
163
+ """Get information about the bot itself."""
164
+ return await self.bot.get_me()
165
+
166
+ async def set_webhook(self, url: Text) -> None:
167
+ """Set the webhook URL for telegram."""
168
+ await self.bot.set_webhook(url=url)
169
+
149
170
 
150
171
  class TelegramInput(InputChannel):
151
172
  """Telegram input channel."""
@@ -178,19 +199,19 @@ class TelegramInput(InputChannel):
178
199
  self.debug_mode = debug_mode
179
200
 
180
201
  @staticmethod
181
- def _is_location(message: Message) -> bool:
202
+ def _is_location(message: "Message") -> bool:
182
203
  return message.location is not None
183
204
 
184
205
  @staticmethod
185
- def _is_user_message(message: Message) -> bool:
206
+ def _is_user_message(message: "Message") -> bool:
186
207
  return message.text is not None
187
208
 
188
209
  @staticmethod
189
- def _is_edited_message(message: Update) -> bool:
210
+ def _is_edited_message(message: "Update") -> bool:
190
211
  return message.edited_message is not None
191
212
 
192
213
  @staticmethod
193
- def _is_button(message: Update) -> bool:
214
+ def _is_button(message: "Update") -> bool:
194
215
  return message.callback_query is not None
195
216
 
196
217
  def blueprint(
@@ -205,16 +226,19 @@ class TelegramInput(InputChannel):
205
226
 
206
227
  @telegram_webhook.route("/set_webhook", methods=["GET", "POST"])
207
228
  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")
229
+ try:
230
+ await self.set_webhook(out_channel)
231
+ except RasaException as exc:
232
+ logger.error(exc)
233
+ return response.text(str(exc))
234
+
235
+ logger.info("Webhook Setup Successful")
236
+ return response.text("Webhook setup successful")
215
237
 
216
238
  @telegram_webhook.route("/webhook", methods=["GET", "POST"])
217
239
  async def message(request: Request) -> Any:
240
+ from aiogram.types import Update
241
+
218
242
  if request.method == "POST":
219
243
  request_dict = request.json
220
244
  if isinstance(request_dict, Text):
@@ -226,24 +250,49 @@ class TelegramInput(InputChannel):
226
250
  return response.text("failed")
227
251
 
228
252
  if self._is_button(update):
229
- msg = update.callback_query.message
230
- text = update.callback_query.data
253
+ msg = (
254
+ update.callback_query.message
255
+ if update.callback_query is not None
256
+ else None
257
+ )
258
+ text = (
259
+ update.callback_query.data
260
+ if update.callback_query is not None
261
+ else None
262
+ )
231
263
  elif self._is_edited_message(update):
232
264
  msg = update.edited_message
233
- text = update.edited_message.text
265
+ text = (
266
+ update.edited_message.text
267
+ if update.edited_message is not None
268
+ else None
269
+ )
234
270
  else:
235
271
  msg = update.message
236
272
  if self._is_user_message(msg):
237
- text = msg.text.replace("/bot", "")
273
+ text = (
274
+ msg.text.replace("/bot", "")
275
+ if msg is not None and msg.text is not None
276
+ else None
277
+ )
238
278
  elif self._is_location(msg):
239
- text = '{{"lng":{0}, "lat":{1}}}'.format(
240
- msg.location.longitude, msg.location.latitude
279
+ text = (
280
+ '{{"lng":{0}, "lat":{1}}}'.format(
281
+ msg.location.longitude, msg.location.latitude
282
+ )
283
+ if msg is not None and msg.location is not None
284
+ else None
241
285
  )
242
286
  else:
243
287
  return response.text("success")
244
- sender_id = msg.chat.id
288
+
245
289
  metadata = self.get_metadata(request)
246
290
  try:
291
+ if msg is not None:
292
+ sender_id = str(msg.chat.id)
293
+ else:
294
+ raise ValueError("No message found.")
295
+
247
296
  if text == (INTENT_MESSAGE_PREFIX + USER_INTENT_RESTART):
248
297
  await on_new_message(
249
298
  UserMessage(
@@ -286,13 +335,14 @@ class TelegramInput(InputChannel):
286
335
 
287
336
  def get_output_channel(self) -> TelegramOutput:
288
337
  """Loads the telegram channel."""
289
- channel = TelegramOutput(self.access_token)
338
+ return TelegramOutput(self.access_token)
339
+
340
+ async def set_webhook(self, channel: TelegramOutput) -> None:
341
+ from aiogram.exceptions import TelegramAPIError
290
342
 
291
343
  try:
292
- asyncio.run(channel.set_webhook(url=self.webhook_url))
344
+ await channel.set_webhook(url=self.webhook_url)
293
345
  except TelegramAPIError as error:
294
346
  raise RasaException(
295
347
  "Failed to set channel webhook: " + str(error)
296
348
  ) 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,28 +1,28 @@
1
1
  import asyncio
2
2
  import copy
3
- from datetime import datetime, timezone, timedelta
4
3
  import json
5
4
  import uuid
6
5
  from collections import defaultdict
7
6
  from dataclasses import asdict
7
+ from datetime import datetime, timedelta, timezone
8
8
  from typing import Any, Awaitable, Callable, Dict, List, Optional, Set, Text, Union
9
9
 
10
10
  import structlog
11
11
  from jsonschema import ValidationError, validate
12
+ from sanic import Blueprint, response
13
+ from sanic.exceptions import NotFound, SanicException, ServerError
14
+ from sanic.request import Request
15
+ from sanic.response import HTTPResponse
16
+
12
17
  from rasa.core import jobs
13
18
  from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
14
19
  from rasa.core.channels.voice_ready.utils import (
15
- validate_voice_license_scope,
16
20
  CallParameters,
21
+ validate_voice_license_scope,
17
22
  )
18
23
  from rasa.shared.constants import INTENT_MESSAGE_PREFIX
19
24
  from rasa.shared.core.constants import USER_INTENT_SESSION_START
20
25
  from rasa.shared.exceptions import RasaException
21
- from sanic import Blueprint, response
22
- from sanic.exceptions import NotFound, SanicException, ServerError
23
- from sanic.request import Request
24
- from sanic.response import HTTPResponse
25
-
26
26
  from rasa.utils.io import remove_emojis
27
27
 
28
28
  structlogger = structlog.get_logger()
@@ -47,8 +47,8 @@ def map_call_params(parameters: Dict[Text, Any]) -> CallParameters:
47
47
  """Map the Audiocodes parameters to the CallParameters dataclass."""
48
48
  return CallParameters(
49
49
  call_id=parameters.get("vaigConversationId"),
50
- user_phone=parameters.get("callee"),
51
- bot_phone=parameters.get("caller"),
50
+ user_phone=parameters.get("caller"),
51
+ bot_phone=parameters.get("callee"),
52
52
  user_name=parameters.get("callerDisplayName"),
53
53
  user_host=parameters.get("callerHost"),
54
54
  bot_host=parameters.get("calleeHost"),
@@ -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
 
@@ -29,7 +29,7 @@ class CallParameters:
29
29
 
30
30
  call_id: str
31
31
  user_phone: str
32
- bot_phone: str
32
+ bot_phone: Optional[str] = None
33
33
  user_name: Optional[str] = None
34
34
  user_host: Optional[str] = None
35
35
  bot_host: Optional[str] = None
@@ -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,
@@ -10,6 +10,7 @@ from typing import (
10
10
  TypeVar,
11
11
  )
12
12
 
13
+ import structlog
13
14
  from websockets.legacy.client import WebSocketClientProtocol
14
15
 
15
16
  from rasa.core.channels.voice_stream.asr.asr_event import ASREvent
@@ -20,6 +21,7 @@ from rasa.shared.utils.common import validate_environment
20
21
 
21
22
  T = TypeVar("T", bound="ASREngineConfig")
22
23
  E = TypeVar("E", bound="ASREngine")
24
+ logger = structlog.get_logger(__name__)
23
25
 
24
26
 
25
27
  @dataclass
@@ -74,10 +76,14 @@ class ASREngine(Generic[T]):
74
76
  """Stream the events returned by the ASR system as it is fed audio bytes."""
75
77
  if self.asr_socket is None:
76
78
  raise ConnectionException("Websocket not connected.")
77
- async for message in self.asr_socket:
78
- asr_event = self.engine_event_to_asr_event(message)
79
- if asr_event:
80
- yield asr_event
79
+
80
+ try:
81
+ async for message in self.asr_socket:
82
+ asr_event = self.engine_event_to_asr_event(message)
83
+ if asr_event:
84
+ yield asr_event
85
+ except Exception as e:
86
+ logger.warning(f"Error while streaming ASR events: {e}")
81
87
 
82
88
  def engine_event_to_asr_event(self, e: Any) -> Optional[ASREvent]:
83
89
  """Translate an engine event to a common ASREvent."""
@@ -16,3 +16,8 @@ class NewTranscript(ASREvent):
16
16
  @dataclass
17
17
  class UserIsSpeaking(ASREvent):
18
18
  pass
19
+
20
+
21
+ @dataclass
22
+ class UserSilence(ASREvent):
23
+ pass
@@ -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 (
@@ -18,6 +18,8 @@ from rasa.shared.exceptions import ConnectionException
18
18
  class AzureASRConfig(ASREngineConfig):
19
19
  language: Optional[str] = None
20
20
  speech_region: Optional[str] = None
21
+ speech_host: Optional[str] = None
22
+ speech_endpoint: Optional[str] = None
21
23
 
22
24
 
23
25
  class AzureASR(ASREngine[AzureASRConfig]):
@@ -52,9 +54,18 @@ class AzureASR(ASREngine[AzureASRConfig]):
52
54
  async def connect(self) -> None:
53
55
  import azure.cognitiveservices.speech as speechsdk
54
56
 
57
+ # connecting to eastus by default
58
+ if (
59
+ self.config.speech_region is None
60
+ and self.config.speech_host is None
61
+ and self.config.speech_endpoint is None
62
+ ):
63
+ self.config.speech_region = "eastus"
55
64
  speech_config = speechsdk.SpeechConfig(
56
65
  subscription=os.environ[AZURE_SPEECH_API_KEY_ENV_VAR],
57
66
  region=self.config.speech_region,
67
+ endpoint=self.config.speech_endpoint,
68
+ host=self.config.speech_host,
58
69
  )
59
70
  audio_format = speechsdk.audio.AudioStreamFormat(
60
71
  samples_per_second=HERTZ,
@@ -123,7 +134,9 @@ class AzureASR(ASREngine[AzureASRConfig]):
123
134
 
124
135
  @staticmethod
125
136
  def get_default_config() -> AzureASRConfig:
126
- return AzureASRConfig("en-US", "germanywestcentral")
137
+ return AzureASRConfig(
138
+ language=None, speech_region=None, speech_host=None, speech_endpoint=None
139
+ )
127
140
 
128
141
  @classmethod
129
142
  def from_config_dict(cls, config: Dict) -> "AzureASR":