rasa-pro 3.14.0.dev5__py3-none-any.whl → 3.14.0.dev7__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 (477) hide show
  1. rasa/agents/agent_factory.py +122 -0
  2. rasa/agents/agent_manager.py +163 -0
  3. rasa/agents/constants.py +40 -0
  4. rasa/agents/core/agent_protocol.py +107 -0
  5. rasa/agents/core/types.py +70 -0
  6. rasa/agents/exceptions.py +38 -0
  7. rasa/agents/protocol/__init__.py +5 -0
  8. rasa/agents/protocol/a2a/a2a_agent.py +662 -0
  9. rasa/agents/protocol/mcp/mcp_base_agent.py +685 -0
  10. rasa/agents/protocol/mcp/mcp_open_agent.py +290 -0
  11. rasa/agents/protocol/mcp/mcp_task_agent.py +484 -0
  12. rasa/agents/schemas/__init__.py +12 -0
  13. rasa/agents/schemas/agent_input.py +38 -0
  14. rasa/agents/schemas/agent_output.py +26 -0
  15. rasa/agents/schemas/agent_tool_result.py +67 -0
  16. rasa/agents/schemas/agent_tool_schema.py +134 -0
  17. rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +15 -0
  18. rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +17 -0
  19. rasa/agents/utils.py +77 -0
  20. rasa/agents/validation.py +484 -0
  21. rasa/api.py +14 -6
  22. rasa/cli/arguments/default_arguments.py +12 -0
  23. rasa/cli/arguments/run.py +2 -0
  24. rasa/cli/arguments/train.py +2 -0
  25. rasa/cli/dialogue_understanding_test.py +4 -0
  26. rasa/cli/e2e_test.py +4 -0
  27. rasa/cli/inspect.py +3 -0
  28. rasa/cli/interactive.py +2 -0
  29. rasa/cli/llm_fine_tuning.py +5 -0
  30. rasa/cli/project_templates/tutorial/config.yml +1 -2
  31. rasa/cli/run.py +4 -0
  32. rasa/cli/scaffold.py +2 -46
  33. rasa/cli/shell.py +3 -0
  34. rasa/cli/train.py +2 -0
  35. rasa/cli/utils.py +85 -1
  36. rasa/constants.py +6 -0
  37. rasa/core/actions/action.py +52 -10
  38. rasa/core/agent.py +19 -1
  39. rasa/core/available_agents.py +220 -0
  40. rasa/core/available_endpoints.py +30 -0
  41. rasa/core/channels/channel.py +3 -4
  42. rasa/core/channels/development_inspector.py +4 -4
  43. rasa/core/channels/hangouts.py +2 -2
  44. rasa/core/channels/inspector/dist/assets/{arc-18042c22.js → arc-cce7e0a8.js} +1 -1
  45. rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-fdd6bcfa.js → blockDiagram-38ab4fdb-e2a49be7.js} +1 -1
  46. rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-f5ae6786.js → c4Diagram-3d4e48cf-3def7895.js} +1 -1
  47. rasa/core/channels/inspector/dist/assets/channel-858c2c20.js +1 -0
  48. rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-81efba3e.js → classDiagram-70f12bd4-e66fe4df.js} +1 -1
  49. rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-3b6b6a92.js → classDiagram-v2-f2320105-eb874aaa.js} +1 -1
  50. rasa/core/channels/inspector/dist/assets/clone-4b80996c.js +1 -0
  51. rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-31422447.js → createText-2e5e7dd3-cf934643.js} +1 -1
  52. rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-518a90db.js → edges-e0da2a9e-8fdf9155.js} +1 -1
  53. rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-a6d3c25a.js → erDiagram-9861fffd-6106fb96.js} +1 -1
  54. rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-e048c2be.js → flowDb-956e92f1-4c2bb040.js} +1 -1
  55. rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-c7474c91.js → flowDiagram-66a62f08-f0ff96af.js} +1 -1
  56. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-16f09b7a.js +1 -0
  57. rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-cb4d8723.js → flowchart-elk-definition-4a651766-a21707ec.js} +1 -1
  58. rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-346636a2.js → ganttDiagram-c361ad54-c165acb1.js} +1 -1
  59. rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-7c508874.js → gitGraphDiagram-72cf32ee-b0564cf1.js} +1 -1
  60. rasa/core/channels/inspector/dist/assets/{graph-14702d8a.js → graph-e557e67a.js} +1 -1
  61. rasa/core/channels/inspector/dist/assets/{index-3862675e-f18b534b.js → index-3862675e-1ce60e9e.js} +1 -1
  62. rasa/core/channels/inspector/dist/assets/index-996fe816.js +1353 -0
  63. rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-64154b83.js → infoDiagram-f8f76790-893569e2.js} +1 -1
  64. rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-833a5f95.js → journeyDiagram-49397b02-c29c864f.js} +1 -1
  65. rasa/core/channels/inspector/dist/assets/{layout-5a3b2123.js → layout-649a5eae.js} +1 -1
  66. rasa/core/channels/inspector/dist/assets/{line-2272a8c7.js → line-0e5685ed.js} +1 -1
  67. rasa/core/channels/inspector/dist/assets/{linear-35bcf273.js → linear-eaa320bd.js} +1 -1
  68. rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-92dcb0e9.js → mindmap-definition-fc14e90a-f35df9e6.js} +1 -1
  69. rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-94dbc900.js → pieDiagram-8a3498a8-78339e96.js} +1 -1
  70. rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-8b7a9c33.js → quadrantDiagram-120e2f19-9b5f2f14.js} +1 -1
  71. rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6f7eab81.js → requirementDiagram-deff3bca-d05ddb3a.js} +1 -1
  72. rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-f43e581d.js → sankeyDiagram-04a897e0-d9be5dfd.js} +1 -1
  73. rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-0bcbefc3.js → sequenceDiagram-704730f1-0f1c4348.js} +1 -1
  74. rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-b8a74083.js → stateDiagram-587899a1-9ddf63b3.js} +1 -1
  75. rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-2070218f.js → stateDiagram-v2-d93cdb3a-bc2b81ed.js} +1 -1
  76. rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-f1d54e34.js → styles-6aaf32cf-0a287936.js} +1 -1
  77. rasa/core/channels/inspector/dist/assets/{styles-9a916d00-980de489.js → styles-9a916d00-e3941990.js} +1 -1
  78. rasa/core/channels/inspector/dist/assets/{styles-c10674c1-3c03abde.js → styles-c10674c1-ce4eca24.js} +1 -1
  79. rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-46ba068f.js → svgDrawCommon-08f97a94-d822b1a8.js} +1 -1
  80. rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-901f5e3d.js → timeline-definition-85554ec2-e144c7a7.js} +1 -1
  81. rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-acbc628a.js → xychartDiagram-e933f94c-ab7f4e14.js} +1 -1
  82. rasa/core/channels/inspector/dist/index.html +2 -2
  83. rasa/core/channels/inspector/index.html +1 -1
  84. rasa/core/channels/inspector/src/App.tsx +37 -12
  85. rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
  86. rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +3 -2
  87. rasa/core/channels/inspector/src/components/DialogueInformation.tsx +3 -12
  88. rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
  89. rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
  90. rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
  91. rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
  92. rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
  93. rasa/core/channels/inspector/src/types.ts +21 -0
  94. rasa/core/channels/socketio.py +51 -212
  95. rasa/core/channels/studio_chat.py +29 -49
  96. rasa/core/channels/voice_stream/genesys.py +1 -1
  97. rasa/core/channels/voice_stream/voice_channel.py +3 -5
  98. rasa/core/constants.py +4 -0
  99. rasa/core/policies/enterprise_search_policy.py +11 -6
  100. rasa/core/policies/flow_policy.py +4 -4
  101. rasa/core/policies/flows/flow_executor.py +519 -73
  102. rasa/core/policies/flows/mcp_tool_executor.py +277 -0
  103. rasa/core/policies/intentless_policy.py +1 -1
  104. rasa/core/policies/unexpected_intent_policy.py +1 -0
  105. rasa/core/processor.py +18 -15
  106. rasa/core/run.py +11 -14
  107. rasa/core/tracker_stores/tracker_store.py +3 -7
  108. rasa/core/train.py +1 -1
  109. rasa/core/training/interactive.py +16 -16
  110. rasa/core/training/story_conflict.py +5 -5
  111. rasa/core/utils.py +21 -1
  112. rasa/dialogue_understanding/commands/__init__.py +8 -0
  113. rasa/dialogue_understanding/commands/cancel_flow_command.py +19 -5
  114. rasa/dialogue_understanding/commands/chit_chat_answer_command.py +11 -0
  115. rasa/dialogue_understanding/commands/clarify_command.py +10 -0
  116. rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
  117. rasa/dialogue_understanding/commands/knowledge_answer_command.py +11 -0
  118. rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
  119. rasa/dialogue_understanding/commands/start_flow_command.py +68 -7
  120. rasa/dialogue_understanding/commands/utils.py +124 -2
  121. rasa/dialogue_understanding/generator/command_parser.py +4 -0
  122. rasa/dialogue_understanding/generator/flow_retrieval.py +9 -10
  123. rasa/dialogue_understanding/generator/llm_based_command_generator.py +50 -12
  124. rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
  125. rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
  126. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +61 -0
  127. rasa/{cli/project_templates/telco/prompts/command-generator.jinja2 → dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_gpt_4o_2024_11_20_template.jinja2} +7 -3
  128. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +81 -0
  129. rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +81 -0
  130. rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +7 -6
  131. rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +7 -6
  132. rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +41 -2
  133. rasa/dialogue_understanding/patterns/clarify.py +3 -14
  134. rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
  135. rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +46 -8
  136. rasa/dialogue_understanding/processor/command_processor.py +31 -15
  137. rasa/dialogue_understanding/stack/dialogue_stack.py +123 -2
  138. rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
  139. rasa/dialogue_understanding/stack/utils.py +57 -3
  140. rasa/dialogue_understanding/utils.py +24 -4
  141. rasa/dialogue_understanding_test/du_test_runner.py +7 -2
  142. rasa/e2e_test/e2e_test_runner.py +12 -2
  143. rasa/engine/caching.py +2 -2
  144. rasa/engine/recipes/default_components.py +10 -18
  145. rasa/engine/storage/local_model_storage.py +2 -45
  146. rasa/graph_components/validators/default_recipe_validator.py +134 -134
  147. rasa/hooks.py +5 -5
  148. rasa/llm_fine_tuning/utils.py +2 -2
  149. rasa/model_manager/model_api.py +5 -4
  150. rasa/model_manager/runner_service.py +1 -1
  151. rasa/model_manager/socket_bridge.py +14 -20
  152. rasa/model_manager/trainer_service.py +9 -12
  153. rasa/model_manager/utils.py +29 -1
  154. rasa/model_manager/warm_rasa_process.py +1 -1
  155. rasa/model_training.py +8 -6
  156. rasa/nlu/extractors/extractor.py +2 -1
  157. rasa/plugin.py +8 -8
  158. rasa/privacy/privacy_manager.py +11 -2
  159. rasa/server.py +14 -2
  160. rasa/shared/agents/utils.py +35 -0
  161. rasa/shared/constants.py +8 -0
  162. rasa/shared/core/constants.py +11 -1
  163. rasa/shared/core/domain.py +11 -58
  164. rasa/shared/core/events.py +327 -0
  165. rasa/shared/core/flows/flow_step.py +1 -7
  166. rasa/shared/core/flows/flows_list.py +15 -5
  167. rasa/shared/core/flows/flows_yaml_schema.json +112 -186
  168. rasa/shared/core/flows/steps/call.py +53 -5
  169. rasa/shared/core/flows/validation.py +177 -7
  170. rasa/shared/core/flows/yaml_flows_io.py +9 -17
  171. rasa/shared/core/slots.py +2 -6
  172. rasa/shared/core/trackers.py +5 -2
  173. rasa/shared/exceptions.py +4 -0
  174. rasa/shared/importers/importer.py +0 -6
  175. rasa/shared/importers/rasa.py +1 -1
  176. rasa/shared/importers/utils.py +10 -80
  177. rasa/shared/providers/_utils.py +44 -60
  178. rasa/shared/providers/embedding/default_litellm_embedding_client.py +0 -2
  179. rasa/shared/providers/llm/_base_litellm_client.py +39 -7
  180. rasa/shared/providers/llm/default_litellm_llm_client.py +0 -2
  181. rasa/shared/providers/llm/litellm_router_llm_client.py +8 -4
  182. rasa/shared/providers/llm/llm_client.py +7 -3
  183. rasa/shared/providers/llm/llm_response.py +66 -0
  184. rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
  185. rasa/shared/utils/health_check/health_check.py +7 -3
  186. rasa/shared/utils/llm.py +28 -5
  187. rasa/shared/utils/mcp/server_connection.py +186 -0
  188. rasa/shared/utils/schemas/events.py +42 -0
  189. rasa/shared/utils/yaml.py +3 -1
  190. rasa/studio/upload.py +47 -16
  191. rasa/telemetry.py +23 -97
  192. rasa/tracing/instrumentation/instrumentation.py +14 -10
  193. rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
  194. rasa/utils/common.py +79 -0
  195. rasa/utils/io.py +9 -27
  196. rasa/utils/json_utils.py +1 -6
  197. rasa/utils/log_utils.py +2 -6
  198. rasa/utils/ml_utils.py +1 -1
  199. rasa/utils/tensorflow/rasa_layers.py +1 -1
  200. rasa/utils/train_utils.py +15 -15
  201. rasa/validator.py +19 -21
  202. rasa/version.py +1 -1
  203. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/METADATA +14 -17
  204. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/RECORD +214 -442
  205. rasa/builder/README.md +0 -120
  206. rasa/builder/auth.py +0 -176
  207. rasa/builder/config.py +0 -115
  208. rasa/builder/copilot/constants.py +0 -25
  209. rasa/builder/copilot/copilot.py +0 -372
  210. rasa/builder/copilot/copilot_response_handler.py +0 -487
  211. rasa/builder/copilot/copilot_templated_message_provider.py +0 -58
  212. rasa/builder/copilot/exceptions.py +0 -20
  213. rasa/builder/copilot/models.py +0 -431
  214. rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +0 -726
  215. rasa/builder/copilot/telemetry.py +0 -195
  216. rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +0 -16
  217. rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +0 -26
  218. rasa/builder/document_retrieval/constants.py +0 -15
  219. rasa/builder/document_retrieval/inkeep-rag-response-schema.json +0 -64
  220. rasa/builder/document_retrieval/inkeep_document_retrieval.py +0 -238
  221. rasa/builder/document_retrieval/models.py +0 -62
  222. rasa/builder/download.py +0 -140
  223. rasa/builder/exceptions.py +0 -55
  224. rasa/builder/guardrails/__init__.py +0 -1
  225. rasa/builder/guardrails/constants.py +0 -3
  226. rasa/builder/guardrails/exceptions.py +0 -4
  227. rasa/builder/guardrails/lakera.py +0 -206
  228. rasa/builder/guardrails/models.py +0 -199
  229. rasa/builder/guardrails/utils.py +0 -305
  230. rasa/builder/job_manager.py +0 -87
  231. rasa/builder/jobs.py +0 -234
  232. rasa/builder/llm_service.py +0 -246
  233. rasa/builder/logging_utils.py +0 -209
  234. rasa/builder/main.py +0 -174
  235. rasa/builder/models.py +0 -197
  236. rasa/builder/project_generator.py +0 -450
  237. rasa/builder/project_info.py +0 -72
  238. rasa/builder/scrape_rasa_docs.py +0 -97
  239. rasa/builder/service.py +0 -1142
  240. rasa/builder/shared/tracker_context.py +0 -212
  241. rasa/builder/skill_to_bot_prompt.jinja2 +0 -164
  242. rasa/builder/training_service.py +0 -132
  243. rasa/builder/validation_service.py +0 -93
  244. rasa/cli/project_templates/basic/actions/action_api.py +0 -15
  245. rasa/cli/project_templates/basic/actions/action_human_handoff.py +0 -44
  246. rasa/cli/project_templates/basic/config.yml +0 -23
  247. rasa/cli/project_templates/basic/credentials.yml +0 -34
  248. rasa/cli/project_templates/basic/data/general/feedback.yml +0 -20
  249. rasa/cli/project_templates/basic/data/general/goodbye.yml +0 -6
  250. rasa/cli/project_templates/basic/data/general/hello.yml +0 -7
  251. rasa/cli/project_templates/basic/data/general/help.yml +0 -6
  252. rasa/cli/project_templates/basic/data/general/human_handoff.yml +0 -16
  253. rasa/cli/project_templates/basic/data/general/welcome.yml +0 -9
  254. rasa/cli/project_templates/basic/data/system/pattern_completed.yml +0 -7
  255. rasa/cli/project_templates/basic/data/system/pattern_correction.yml +0 -7
  256. rasa/cli/project_templates/basic/data/system/pattern_search.yml +0 -8
  257. rasa/cli/project_templates/basic/data/system/pattern_session_start.yml +0 -8
  258. rasa/cli/project_templates/basic/docs/rasa_assistant_qa.txt +0 -65
  259. rasa/cli/project_templates/basic/docs/template.txt +0 -7
  260. rasa/cli/project_templates/basic/domain/general/assistant_details.yml +0 -12
  261. rasa/cli/project_templates/basic/domain/general/bot_identity.yml +0 -5
  262. rasa/cli/project_templates/basic/domain/general/cannot_handle.yml +0 -5
  263. rasa/cli/project_templates/basic/domain/general/feedback.yml +0 -28
  264. rasa/cli/project_templates/basic/domain/general/goodbye.yml +0 -7
  265. rasa/cli/project_templates/basic/domain/general/help.yml +0 -5
  266. rasa/cli/project_templates/basic/domain/general/human_handoff_domain.yml +0 -35
  267. rasa/cli/project_templates/basic/domain/general/utils.yml +0 -13
  268. rasa/cli/project_templates/basic/domain/general/welcome.yml +0 -7
  269. rasa/cli/project_templates/basic/endpoints.yml +0 -73
  270. rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +0 -19
  271. rasa/cli/project_templates/finance/actions/__init__.py +0 -46
  272. rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +0 -47
  273. rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +0 -40
  274. rasa/cli/project_templates/finance/actions/action_session_start.py +0 -74
  275. rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +0 -48
  276. rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +0 -36
  277. rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +0 -54
  278. rasa/cli/project_templates/finance/actions/database.py +0 -277
  279. rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
  280. rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +0 -52
  281. rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +0 -51
  282. rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +0 -40
  283. rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +0 -40
  284. rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +0 -46
  285. rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +0 -18
  286. rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +0 -49
  287. rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +0 -19
  288. rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +0 -36
  289. rasa/cli/project_templates/finance/config.yml +0 -21
  290. rasa/cli/project_templates/finance/credentials.yml +0 -32
  291. rasa/cli/project_templates/finance/csvs/accounts.csv +0 -8
  292. rasa/cli/project_templates/finance/csvs/advisors.csv +0 -7
  293. rasa/cli/project_templates/finance/csvs/appointments.csv +0 -211
  294. rasa/cli/project_templates/finance/csvs/branches.csv +0 -10
  295. rasa/cli/project_templates/finance/csvs/cards.csv +0 -11
  296. rasa/cli/project_templates/finance/csvs/payees.csv +0 -11
  297. rasa/cli/project_templates/finance/csvs/transactions.csv +0 -71
  298. rasa/cli/project_templates/finance/csvs/users.csv +0 -4
  299. rasa/cli/project_templates/finance/data/accounts/check_balance.yml +0 -10
  300. rasa/cli/project_templates/finance/data/cards/block_card.yml +0 -66
  301. rasa/cli/project_templates/finance/data/cards/select_card.yml +0 -12
  302. rasa/cli/project_templates/finance/data/general/bot_identity.yml +0 -6
  303. rasa/cli/project_templates/finance/data/general/feedback.yml +0 -20
  304. rasa/cli/project_templates/finance/data/general/goodbye.yml +0 -6
  305. rasa/cli/project_templates/finance/data/general/hello.yml +0 -7
  306. rasa/cli/project_templates/finance/data/general/help.yml +0 -9
  307. rasa/cli/project_templates/finance/data/general/human_handoff.yml +0 -16
  308. rasa/cli/project_templates/finance/data/general/welcome.yml +0 -9
  309. rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +0 -5
  310. rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +0 -7
  311. rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +0 -7
  312. rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +0 -8
  313. rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +0 -8
  314. rasa/cli/project_templates/finance/data/system/source/accounts.json +0 -51
  315. rasa/cli/project_templates/finance/data/system/source/advisors.json +0 -44
  316. rasa/cli/project_templates/finance/data/system/source/appointments.json +0 -1474
  317. rasa/cli/project_templates/finance/data/system/source/branches.json +0 -47
  318. rasa/cli/project_templates/finance/data/system/source/cards.json +0 -72
  319. rasa/cli/project_templates/finance/data/system/source/payees.json +0 -74
  320. rasa/cli/project_templates/finance/data/system/source/transactions.json +0 -492
  321. rasa/cli/project_templates/finance/data/system/source/users.json +0 -29
  322. rasa/cli/project_templates/finance/data/transfers/add_payee.yml +0 -29
  323. rasa/cli/project_templates/finance/data/transfers/list_payees.yml +0 -5
  324. rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +0 -21
  325. rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +0 -67
  326. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +0 -8
  327. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +0 -8
  328. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +0 -8
  329. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +0 -8
  330. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +0 -8
  331. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +0 -7
  332. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +0 -8
  333. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +0 -8
  334. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +0 -8
  335. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +0 -8
  336. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +0 -8
  337. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +0 -8
  338. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +0 -8
  339. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +0 -8
  340. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +0 -8
  341. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +0 -8
  342. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +0 -8
  343. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +0 -8
  344. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +0 -8
  345. rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +0 -8
  346. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +0 -50
  347. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +0 -50
  348. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +0 -48
  349. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +0 -50
  350. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +0 -50
  351. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +0 -47
  352. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +0 -50
  353. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +0 -50
  354. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +0 -47
  355. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +0 -50
  356. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +0 -50
  357. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +0 -50
  358. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +0 -47
  359. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +0 -50
  360. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +0 -50
  361. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +0 -47
  362. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +0 -50
  363. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +0 -50
  364. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +0 -47
  365. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +0 -50
  366. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +0 -50
  367. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +0 -47
  368. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +0 -47
  369. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +0 -50
  370. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +0 -50
  371. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +0 -47
  372. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +0 -50
  373. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +0 -50
  374. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +0 -47
  375. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +0 -50
  376. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +0 -50
  377. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +0 -47
  378. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +0 -50
  379. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +0 -50
  380. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +0 -50
  381. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +0 -47
  382. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +0 -50
  383. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +0 -50
  384. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +0 -47
  385. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +0 -50
  386. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +0 -50
  387. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +0 -47
  388. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +0 -50
  389. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +0 -50
  390. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +0 -50
  391. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +0 -47
  392. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +0 -50
  393. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +0 -50
  394. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +0 -47
  395. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +0 -50
  396. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +0 -50
  397. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +0 -47
  398. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +0 -50
  399. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +0 -50
  400. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +0 -47
  401. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +0 -47
  402. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +0 -50
  403. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +0 -50
  404. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +0 -50
  405. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +0 -50
  406. rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +0 -47
  407. rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +0 -11
  408. rasa/cli/project_templates/finance/domain/cards/block_card.yml +0 -101
  409. rasa/cli/project_templates/finance/domain/cards/select_card.yml +0 -12
  410. rasa/cli/project_templates/finance/domain/general/assistant_details.yml +0 -12
  411. rasa/cli/project_templates/finance/domain/general/bot_identity.yml +0 -5
  412. rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +0 -5
  413. rasa/cli/project_templates/finance/domain/general/defaults.yml +0 -24
  414. rasa/cli/project_templates/finance/domain/general/feedback.yml +0 -28
  415. rasa/cli/project_templates/finance/domain/general/goodbye.yml +0 -7
  416. rasa/cli/project_templates/finance/domain/general/help.yml +0 -5
  417. rasa/cli/project_templates/finance/domain/general/human_handoff.yml +0 -30
  418. rasa/cli/project_templates/finance/domain/general/utils.yml +0 -13
  419. rasa/cli/project_templates/finance/domain/general/welcome.yml +0 -8
  420. rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +0 -47
  421. rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +0 -4
  422. rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +0 -16
  423. rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +0 -79
  424. rasa/cli/project_templates/finance/endpoints.yml +0 -63
  425. rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +0 -19
  426. rasa/cli/project_templates/telco/actions/__init__.py +0 -0
  427. rasa/cli/project_templates/telco/actions/actions_billing.py +0 -204
  428. rasa/cli/project_templates/telco/actions/actions_get_data_from_db.py +0 -48
  429. rasa/cli/project_templates/telco/actions/actions_run_diagnostics.py +0 -28
  430. rasa/cli/project_templates/telco/actions/actions_session_start.py +0 -18
  431. rasa/cli/project_templates/telco/config.yml +0 -25
  432. rasa/cli/project_templates/telco/credentials.yml +0 -33
  433. rasa/cli/project_templates/telco/csvs/billing.csv +0 -10
  434. rasa/cli/project_templates/telco/csvs/customers.csv +0 -5
  435. rasa/cli/project_templates/telco/data/flows/flow_global.yml +0 -5
  436. rasa/cli/project_templates/telco/data/flows/flow_reboot_router.yml +0 -8
  437. rasa/cli/project_templates/telco/data/flows/flow_reset_router.yml +0 -7
  438. rasa/cli/project_templates/telco/data/flows/flow_solve_internet_issue.yml +0 -73
  439. rasa/cli/project_templates/telco/data/flows/flow_undertand_bill.yml +0 -45
  440. rasa/cli/project_templates/telco/data/patterns/pattern_completed.yml +0 -7
  441. rasa/cli/project_templates/telco/data/patterns/pattern_human_handoff.yml +0 -6
  442. rasa/cli/project_templates/telco/data/patterns/pattern_search.yml +0 -7
  443. rasa/cli/project_templates/telco/data/patterns/pattern_session_start.yml +0 -9
  444. rasa/cli/project_templates/telco/docs/reset_vs_rboot_router.txt +0 -1
  445. rasa/cli/project_templates/telco/docs/restart_router.txt +0 -6
  446. rasa/cli/project_templates/telco/docs/run_speed_test.txt +0 -6
  447. rasa/cli/project_templates/telco/domain/domain_global.yml +0 -29
  448. rasa/cli/project_templates/telco/domain/domain_patterns.yml +0 -17
  449. rasa/cli/project_templates/telco/domain/domain_reboot_router.yml +0 -20
  450. rasa/cli/project_templates/telco/domain/domain_reset_router.yml +0 -11
  451. rasa/cli/project_templates/telco/domain/domain_run_speed_test.yml +0 -24
  452. rasa/cli/project_templates/telco/domain/domain_solve_internet_issue.yml +0 -74
  453. rasa/cli/project_templates/telco/domain/domain_undertand_bill.yml +0 -102
  454. rasa/cli/project_templates/telco/endpoints.yml +0 -60
  455. rasa/cli/project_templates/telco/tests/e2e_results_failed.yml +0 -62
  456. rasa/cli/project_templates/telco/tests/e2e_results_passed.yml +0 -130
  457. rasa/cli/project_templates/telco/tests/e2e_test_cases/billing_test_cases.yml +0 -68
  458. rasa/cli/project_templates/telco/tests/e2e_test_cases/global_test_cases.yml +0 -13
  459. rasa/cli/project_templates/telco/tests/e2e_test_cases/internet_slow_test_case.yml +0 -47
  460. rasa/cli/project_templates/telco/tests/e2e_test_cases/out_of_scope_test_case.yml +0 -21
  461. rasa/cli/project_templates/telco/tests/e2e_test_cases/patterns_test_cases.yml +0 -15
  462. rasa/core/channels/constants.py +0 -3
  463. rasa/core/channels/inspector/dist/assets/channel-b9b536fc.js +0 -1
  464. rasa/core/channels/inspector/dist/assets/clone-78d2ddcf.js +0 -1
  465. rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-8b09c060.js +0 -1
  466. rasa/core/channels/inspector/dist/assets/index-4d4bdf3a.js +0 -1335
  467. rasa/utils/openapi.py +0 -144
  468. /rasa/{builder → agents}/__init__.py +0 -0
  469. /rasa/{builder/copilot → agents/core}/__init__.py +0 -0
  470. /rasa/{builder/copilot/prompts → agents/protocol/a2a}/__init__.py +0 -0
  471. /rasa/{builder/copilot/templated_messages → agents/protocol/mcp}/__init__.py +0 -0
  472. /rasa/{builder/document_retrieval → agents/templates}/__init__.py +0 -0
  473. /rasa/{cli/project_templates/finance/actions/accounts → shared/agents}/__init__.py +0 -0
  474. /rasa/{cli/project_templates/finance/actions/cards → shared/utils/mcp}/__init__.py +0 -0
  475. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/NOTICE +0 -0
  476. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/WHEEL +0 -0
  477. {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/entry_points.txt +0 -0
@@ -1,54 +1,34 @@
1
- from __future__ import annotations
2
-
3
- import asyncio
4
1
  import inspect
5
2
  import json
3
+ import logging
6
4
  import uuid
7
- from asyncio import Task
8
- from dataclasses import dataclass
9
5
  from typing import Any, Awaitable, Callable, Dict, Iterable, List, Optional, Text
10
6
 
11
- import structlog
12
7
  from sanic import Blueprint, Sanic, response
13
8
  from sanic.request import Request
14
9
  from sanic.response import HTTPResponse
15
10
  from socketio import AsyncServer
16
11
 
12
+ import rasa.core.channels.channel
17
13
  import rasa.shared.utils.io
18
- from rasa.core.channels.channel import (
19
- InputChannel,
20
- OnNewMessageType,
21
- OutputChannel,
22
- UserMessage,
23
- )
24
- from rasa.core.channels.constants import USER_CONVERSATION_SILENCE_TIMEOUT
25
- from rasa.shared.core.constants import SILENCE_TIMEOUT_SLOT
26
-
27
- logger = structlog.getLogger(__name__)
28
-
14
+ from rasa.core.channels.channel import InputChannel, OutputChannel, UserMessage
29
15
 
30
- @dataclass
31
- class SilenceTimeout:
32
- sender_id: str
33
- timeout: float
34
-
35
-
36
- UserSilenceHandlerType = Callable[[SilenceTimeout], Awaitable[Any]]
16
+ logger = logging.getLogger(__name__)
37
17
 
38
18
 
39
19
  class SocketBlueprint(Blueprint):
40
20
  """Blueprint for socketio connections."""
41
21
 
42
22
  def __init__(
43
- self, sio_server: AsyncServer, socketio_path: Text, *args: Any, **kwargs: Any
23
+ self, sio: AsyncServer, socketio_path: Text, *args: Any, **kwargs: Any
44
24
  ) -> None:
45
- """Creates a :class:`sanic.Blueprint` for routing socketio connections.
25
+ """Creates a :class:`sanic.Blueprint` for routing socketio connenctions.
46
26
 
47
- :param sio_server: Instance of :class:`socketio.AsyncServer` class
27
+ :param sio: Instance of :class:`socketio.AsyncServer` class
48
28
  :param socketio_path: string indicating the route to accept requests on.
49
29
  """
50
30
  super().__init__(*args, **kwargs)
51
- self.ctx.sio_server = sio_server
31
+ self.ctx.sio = sio
52
32
  self.ctx.socketio_path = socketio_path
53
33
 
54
34
  def register(self, app: Sanic, options: Dict[Text, Any]) -> None:
@@ -62,7 +42,7 @@ class SocketBlueprint(Blueprint):
62
42
  path = self.ctx.socketio_path
63
43
  else:
64
44
  path = options.get("url_prefix", "/socket.io")
65
- self.ctx.sio_server.attach(app, path)
45
+ self.ctx.sio.attach(app, path)
66
46
  super().register(app, options)
67
47
 
68
48
 
@@ -71,45 +51,14 @@ class SocketIOOutput(OutputChannel):
71
51
  def name(cls) -> Text:
72
52
  return "socketio"
73
53
 
74
- def __init__(
75
- self,
76
- input_channel: SocketIOInput,
77
- sio_server: AsyncServer,
78
- bot_message_evt: Text,
79
- ) -> None:
54
+ def __init__(self, sio: AsyncServer, bot_message_evt: Text) -> None:
80
55
  super().__init__()
81
- self._input_channel = input_channel
82
- self.sio_server = sio_server
56
+ self.sio = sio
83
57
  self.bot_message_evt = bot_message_evt
84
58
 
85
59
  async def _send_message(self, socket_id: Text, response: Any) -> None:
86
60
  """Sends a message to the recipient using the bot event."""
87
- await self.sio_server.emit(self.bot_message_evt, response, room=socket_id)
88
- if self.tracker_state and self._input_channel.enable_silence_timeout:
89
- silence_timeout = self.tracker_state["slots"][SILENCE_TIMEOUT_SLOT]
90
-
91
- logger.debug(
92
- "socketio_channel.silence_timeout_updated",
93
- sender_id=socket_id,
94
- silence_timeout=silence_timeout,
95
- )
96
-
97
- silence_timeout_counts = self.tracker_state["slots"][
98
- "consecutive_silence_timeouts"
99
- ]
100
-
101
- logger.debug(
102
- "socketio_channel.consecutive_silence_timeouts_updated",
103
- sender_id=socket_id,
104
- silence_timeout_counts=silence_timeout_counts,
105
- )
106
-
107
- self._input_channel.reset_silence_timeout(
108
- SilenceTimeout(
109
- sender_id=socket_id,
110
- timeout=silence_timeout,
111
- ),
112
- )
61
+ await self.sio.emit(self.bot_message_evt, response, room=socket_id)
113
62
 
114
63
  async def send_text_message(
115
64
  self, recipient_id: Text, text: Text, **kwargs: Any
@@ -174,11 +123,9 @@ class SocketIOOutput(OutputChannel):
174
123
  """Sends custom json to the output."""
175
124
  if "data" in json_message:
176
125
  json_message.setdefault("room", recipient_id)
177
- await self.sio_server.emit(self.bot_message_evt, **json_message)
126
+ await self.sio.emit(self.bot_message_evt, **json_message)
178
127
  else:
179
- await self.sio_server.emit(
180
- self.bot_message_evt, json_message, room=recipient_id
181
- )
128
+ await self.sio.emit(self.bot_message_evt, json_message, room=recipient_id)
182
129
 
183
130
  async def send_attachment( # type: ignore[override]
184
131
  self, recipient_id: Text, attachment: Dict[Text, Any], **kwargs: Any
@@ -186,38 +133,26 @@ class SocketIOOutput(OutputChannel):
186
133
  """Sends an attachment to the user."""
187
134
  await self._send_message(recipient_id, {"attachment": attachment})
188
135
 
189
- async def hangup(self, recipient_id: Text, **kwargs: Any) -> None:
190
- """Hangs up the call for the given sender."""
191
- # This method is not applicable for socket.io, but we implement it
192
- # to satisfy the OutputChannel interface.
193
- logger.debug(
194
- "socketio_channel.output.hangup",
195
- message=f"Hanging up call for user {recipient_id}.",
196
- )
197
-
198
- self._input_channel.disconnect(recipient_id)
199
-
200
136
 
201
137
  class SocketIOInput(InputChannel):
202
138
  """A socket.io input channel."""
203
139
 
204
140
  @classmethod
205
- def name(cls) -> str:
141
+ def name(cls) -> Text:
206
142
  return "socketio"
207
143
 
208
144
  @classmethod
209
145
  def from_credentials(cls, credentials: Optional[Dict[Text, Any]]) -> InputChannel:
210
146
  credentials = credentials or {}
211
147
  return cls(
212
- user_message_evt=credentials.get("user_message_evt", "user_uttered"),
213
- bot_message_evt=credentials.get("bot_message_evt", "bot_uttered"),
214
- namespace=credentials.get("namespace"),
215
- session_persistence=credentials.get("session_persistence", False),
216
- socketio_path=credentials.get("socketio_path", "/socket.io"),
217
- jwt_key=credentials.get("jwt_key"),
218
- jwt_method=credentials.get("jwt_method", "HS256"),
219
- metadata_key=credentials.get("metadata_key", "metadata"),
220
- enable_silence_timeout=credentials.get("enable_silence_timeout", False),
148
+ credentials.get("user_message_evt", "user_uttered"),
149
+ credentials.get("bot_message_evt", "bot_uttered"),
150
+ credentials.get("namespace"),
151
+ credentials.get("session_persistence", False),
152
+ credentials.get("socketio_path", "/socket.io"),
153
+ credentials.get("jwt_key"),
154
+ credentials.get("jwt_method", "HS256"),
155
+ credentials.get("metadata_key", "metadata"),
221
156
  )
222
157
 
223
158
  def __init__(
@@ -230,7 +165,6 @@ class SocketIOInput(InputChannel):
230
165
  jwt_key: Optional[Text] = None,
231
166
  jwt_method: Optional[Text] = "HS256",
232
167
  metadata_key: Optional[Text] = "metadata",
233
- enable_silence_timeout: bool = False,
234
168
  ):
235
169
  """Creates a ``SocketIOInput`` object."""
236
170
  self.bot_message_evt = bot_message_evt
@@ -238,18 +172,15 @@ class SocketIOInput(InputChannel):
238
172
  self.user_message_evt = user_message_evt
239
173
  self.namespace = namespace
240
174
  self.socketio_path = socketio_path
241
- self.sio_server: Optional[AsyncServer] = None
175
+ self.sio: Optional[AsyncServer] = None
242
176
  self.metadata_key = metadata_key
243
- self.enable_silence_timeout = enable_silence_timeout
244
177
 
245
178
  self.jwt_key = jwt_key
246
179
  self.jwt_algorithm = jwt_method
247
- self.on_new_message: Optional[OnNewMessageType] = None
248
- self.sender_silence_map: Dict[str, Task] = {}
249
180
 
250
- def get_output_channel(self) -> Optional[OutputChannel]:
181
+ def get_output_channel(self) -> Optional["OutputChannel"]:
251
182
  """Creates socket.io output channel object."""
252
- if self.sio_server is None:
183
+ if self.sio is None:
253
184
  rasa.shared.utils.io.raise_warning(
254
185
  "SocketIO output channel cannot be recreated. "
255
186
  "This is expected behavior when using multiple Sanic "
@@ -258,7 +189,7 @@ class SocketIOInput(InputChannel):
258
189
  "scenarios."
259
190
  )
260
191
  return None
261
- return SocketIOOutput(self, self.sio_server, self.bot_message_evt)
192
+ return SocketIOOutput(self.sio, self.bot_message_evt)
262
193
 
263
194
  async def handle_session_request(
264
195
  self, sid: Text, data: Optional[Dict] = None
@@ -269,26 +200,23 @@ class SocketIOInput(InputChannel):
269
200
  if "session_id" not in data or data["session_id"] is None:
270
201
  data["session_id"] = uuid.uuid4().hex
271
202
  if self.session_persistence:
272
- if inspect.iscoroutinefunction(self.sio_server.enter_room): # type: ignore[union-attr]
273
- await self.sio_server.enter_room(sid, data["session_id"]) # type: ignore[union-attr]
203
+ if inspect.iscoroutinefunction(self.sio.enter_room): # type: ignore[union-attr]
204
+ await self.sio.enter_room(sid, data["session_id"]) # type: ignore[union-attr]
274
205
  else:
275
206
  # for backwards compatibility with python-socketio < 5.10.
276
207
  # previously, this function was NOT async.
277
- self.sio_server.enter_room(sid, data["session_id"]) # type: ignore[union-attr]
278
- await self.sio_server.emit("session_confirm", data["session_id"], room=sid) # type: ignore[union-attr]
279
- logger.debug(
280
- "socketio_channel.input.handle_session_request",
281
- message=f"User {sid} connected to socketIO endpoint.",
282
- )
208
+ self.sio.enter_room(sid, data["session_id"]) # type: ignore[union-attr]
209
+ await self.sio.emit("session_confirm", data["session_id"], room=sid) # type: ignore[union-attr]
210
+ logger.debug(f"User {sid} connected to socketIO endpoint.")
283
211
 
284
212
  async def handle_user_message(
285
213
  self,
286
214
  sid: Text,
287
215
  data: Dict,
288
- on_new_message: OnNewMessageType,
216
+ on_new_message: Callable[[UserMessage], Awaitable[Any]],
289
217
  ) -> None:
290
218
  """Handles user messages received from the client."""
291
- output_channel = self.get_output_channel()
219
+ output_channel = SocketIOOutput(self.sio, self.bot_message_evt)
292
220
 
293
221
  if self.session_persistence:
294
222
  if not data.get("session_id"):
@@ -304,44 +232,38 @@ class SocketIOInput(InputChannel):
304
232
  else:
305
233
  sender_id = sid
306
234
 
307
- # We cancel silence timeout when a new message is received
308
- # to prevent sending a silence timeout message
309
- # if the user sends a message after the silence timeout
310
- self._cancel_silence_timeout(sender_id)
311
-
312
235
  metadata = data.get(self.metadata_key, {})
313
236
  if isinstance(metadata, Text):
314
237
  metadata = json.loads(metadata)
315
238
 
316
239
  message = UserMessage(
317
- text=data.get("message", ""),
318
- output_channel=output_channel,
319
- sender_id=sender_id,
240
+ data.get("message", ""),
241
+ output_channel,
242
+ sender_id,
320
243
  input_channel=self.name(),
321
244
  metadata=metadata,
322
245
  )
323
246
  await on_new_message(message)
324
247
 
325
- def blueprint(self, on_new_message: OnNewMessageType) -> SocketBlueprint:
248
+ def blueprint(
249
+ self, on_new_message: Callable[[UserMessage], Awaitable[Any]]
250
+ ) -> SocketBlueprint:
326
251
  """Defines a Sanic blueprint."""
327
252
  # Workaround so that socketio works with requests from other origins.
328
253
  # https://github.com/miguelgrinberg/python-socketio/issues/205#issuecomment-493769183
329
- sio_server = AsyncServer(async_mode="sanic", cors_allowed_origins=[])
254
+ sio = AsyncServer(async_mode="sanic", cors_allowed_origins=[])
330
255
  socketio_webhook = SocketBlueprint(
331
- sio_server, self.socketio_path, "socketio_webhook", __name__
256
+ sio, self.socketio_path, "socketio_webhook", __name__
332
257
  )
333
258
 
334
- # make sio_server object static to use in get_output_channel
335
- self.sio_server = sio_server
336
- # We need to store the on_new_message callback
337
- # so that we can call it when a silence timeout occurs
338
- self.on_new_message = on_new_message
259
+ # make sio object static to use in get_output_channel
260
+ self.sio = sio
339
261
 
340
262
  @socketio_webhook.route("/", methods=["GET"])
341
263
  async def health(_: Request) -> HTTPResponse:
342
264
  return response.json({"status": "ok"})
343
265
 
344
- @sio_server.on("connect", namespace=self.namespace)
266
+ @sio.on("connect", namespace=self.namespace)
345
267
  async def connect(sid: Text, environ: Dict, auth: Optional[Dict]) -> bool:
346
268
  if self.jwt_key:
347
269
  jwt_payload = None
@@ -351,107 +273,24 @@ class SocketIOInput(InputChannel):
351
273
  )
352
274
 
353
275
  if jwt_payload:
354
- logger.debug(
355
- "socketio_channel.input.connect.jwt",
356
- message=f"User {sid} connected to socketIO endpoint.",
357
- )
358
- # Store the chat state for this user
276
+ logger.debug(f"User {sid} connected to socketIO endpoint.")
359
277
  return True
360
278
  else:
361
279
  return False
362
280
  else:
363
- logger.debug(
364
- "socketio_channel.input.connect",
365
- message=f"User {sid} connected to socketIO endpoint.",
366
- )
367
- # Store the chat state for this user
281
+ logger.debug(f"User {sid} connected to socketIO endpoint.")
368
282
  return True
369
283
 
370
- @sio_server.on("disconnect", namespace=self.namespace)
284
+ @sio.on("disconnect", namespace=self.namespace)
371
285
  async def disconnect(sid: Text) -> None:
372
- logger.debug(
373
- "socketio_channel.input.disconnect",
374
- message=f"User {sid} disconnected from socketIO endpoint.",
375
- )
286
+ logger.debug(f"User {sid} disconnected from socketIO endpoint.")
376
287
 
377
- @sio_server.on("session_request", namespace=self.namespace)
288
+ @sio.on("session_request", namespace=self.namespace)
378
289
  async def session_request(sid: Text, data: Optional[Dict]) -> None:
379
- logger.debug(
380
- "socketio_channel.input.session_request",
381
- message=f"User {sid} requested a session.",
382
- )
383
290
  await self.handle_session_request(sid, data)
384
291
 
385
- @sio_server.on(self.user_message_evt, namespace=self.namespace)
292
+ @sio.on(self.user_message_evt, namespace=self.namespace)
386
293
  async def handle_message(sid: Text, data: Dict) -> None:
387
- logger.debug(
388
- "socketio_channel.input.handle_message",
389
- message=f"User {sid} sent a message.",
390
- data=data,
391
- )
392
294
  await self.handle_user_message(sid, data, on_new_message)
393
295
 
394
296
  return socketio_webhook
395
-
396
- def reset_silence_timeout(self, silence_timeout: SilenceTimeout) -> None:
397
- self._cancel_silence_timeout(silence_timeout.sender_id)
398
-
399
- self.sender_silence_map[silence_timeout.sender_id] = (
400
- asyncio.get_event_loop().create_task(
401
- self._monitor_silence_timeout(
402
- silence_timeout,
403
- )
404
- )
405
- )
406
-
407
- def disconnect(self, sender_id: str) -> None:
408
- """Disconnects the user with the given sender ID."""
409
- self._cancel_silence_timeout(sender_id)
410
- if self.sio_server:
411
- asyncio.get_event_loop().create_task(self.sio_server.disconnect(sender_id))
412
- logger.debug(
413
- "socketio_channel.input.disconnect",
414
- message=f"User {sender_id} disconnected from socketIO endpoint.",
415
- )
416
-
417
- async def _monitor_silence_timeout(self, silence_timeout: SilenceTimeout) -> None:
418
- logger.debug(
419
- "socketio_channel.input.silence_timeout_watch_started",
420
- sender_id=silence_timeout.sender_id,
421
- timeout=silence_timeout.timeout,
422
- )
423
- await asyncio.sleep(silence_timeout.timeout)
424
-
425
- # once the timer is up, we call the handler
426
- # to notify the user about the silence timeout
427
- # this is important if monitoring trask is cancelled while handler is executed
428
- asyncio.get_event_loop().create_task(
429
- self._handle_silence_timeout(silence_timeout)
430
- )
431
-
432
- logger.debug(
433
- "socketio_channel.input.silence_timeout_tripped",
434
- sender_id=silence_timeout.sender_id,
435
- silence_timeout=silence_timeout.timeout,
436
- )
437
-
438
- async def _handle_silence_timeout(self, event: SilenceTimeout) -> None:
439
- if self.on_new_message:
440
- output_channel = self.get_output_channel()
441
- message = UserMessage(
442
- text=USER_CONVERSATION_SILENCE_TIMEOUT,
443
- output_channel=output_channel,
444
- sender_id=event.sender_id,
445
- input_channel=self.name(),
446
- )
447
- await self.on_new_message(message)
448
-
449
- def _cancel_silence_timeout(self, sender_id: str) -> None:
450
- """Cancels the silence timeout task for the given sender."""
451
- task = self.sender_silence_map.pop(sender_id, None)
452
- if task and not task.done():
453
- logger.debug(
454
- "socketio_channel.input.silence_timeout_cancelled",
455
- sender_id=sender_id,
456
- )
457
- task.cancel()
@@ -17,9 +17,9 @@ from typing import (
17
17
  Optional,
18
18
  Text,
19
19
  Tuple,
20
- Union,
21
20
  )
22
21
 
22
+ import orjson
23
23
  import structlog
24
24
 
25
25
  from rasa.core.channels import UserMessage
@@ -47,6 +47,7 @@ if TYPE_CHECKING:
47
47
  from sanic import Sanic, Websocket # type: ignore[attr-defined]
48
48
  from socketio import AsyncServer
49
49
 
50
+ from rasa.core.channels.channel import UserMessage
50
51
  from rasa.shared.core.trackers import DialogueStateTracker
51
52
 
52
53
 
@@ -55,7 +56,7 @@ structlogger = structlog.get_logger()
55
56
 
56
57
  def tracker_as_dump(
57
58
  tracker: "DialogueStateTracker", latency: Optional[float] = None
58
- ) -> Dict[str, Any]:
59
+ ) -> str:
59
60
  """Create a dump of the tracker state."""
60
61
  from rasa.shared.core.trackers import get_trackers_for_conversation_sessions
61
62
 
@@ -66,14 +67,11 @@ def tracker_as_dump(
66
67
  else:
67
68
  last_tracker = multiple_tracker_sessions[-1]
68
69
 
69
- # TODO: this is a bug: the bridge converts this back to json, but it
70
- # should be json in the first place
71
70
  state = last_tracker.current_state(EventVerbosity.AFTER_RESTART)
72
71
 
73
72
  if latency is not None:
74
73
  state["latency"] = {"rasa_processing_latency_ms": latency}
75
-
76
- return state
74
+ return orjson.dumps(state, option=orjson.OPT_SERIALIZE_NUMPY).decode("utf-8")
77
75
 
78
76
 
79
77
  def does_need_action_prediction(tracker: "DialogueStateTracker") -> bool:
@@ -102,12 +100,12 @@ class StudioTrackerUpdatePlugin:
102
100
  """Remove tasks that have already completed."""
103
101
  self.tasks = [task for task in self.tasks if not task.done()]
104
102
 
105
- @hookimpl # type: ignore[misc]
103
+ @hookimpl
106
104
  def after_new_user_message(self, tracker: "DialogueStateTracker") -> None:
107
105
  """Triggers a tracker update notification after a new user message."""
108
106
  self.handle_tracker_update(tracker)
109
107
 
110
- @hookimpl # type: ignore[misc]
108
+ @hookimpl
111
109
  def after_action_executed(self, tracker: "DialogueStateTracker") -> None:
112
110
  """Triggers a tracker update notification after an action is executed."""
113
111
  self.handle_tracker_update(tracker)
@@ -127,7 +125,7 @@ class StudioTrackerUpdatePlugin:
127
125
  self.tasks.append(task)
128
126
  self._cleanup_tasks()
129
127
 
130
- @hookimpl # type: ignore[misc]
128
+ @hookimpl
131
129
  def after_server_stop(self) -> None:
132
130
  """Cancels all remaining tasks when the server stops."""
133
131
  self._cancel_tasks()
@@ -155,7 +153,6 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
155
153
  jwt_key: Optional[Text] = None,
156
154
  jwt_method: Optional[Text] = "HS256",
157
155
  metadata_key: Optional[Text] = "metadata",
158
- enable_silence_timeout: bool = False,
159
156
  ) -> None:
160
157
  """Creates a `StudioChatInput` object."""
161
158
  from rasa.core.agent import Agent
@@ -173,7 +170,6 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
173
170
  jwt_key=jwt_key,
174
171
  jwt_method=jwt_method,
175
172
  metadata_key=metadata_key,
176
- enable_silence_timeout=enable_silence_timeout,
177
173
  )
178
174
 
179
175
  # Initialize the Voice Input Channel
@@ -214,15 +210,14 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
214
210
  jwt_key=credentials.get("jwt_key"),
215
211
  jwt_method=credentials.get("jwt_method", "HS256"),
216
212
  metadata_key=credentials.get("metadata_key", "metadata"),
217
- enable_silence_timeout=credentials.get("enable_silence_timeout", False),
218
213
  )
219
214
 
220
- async def emit(self, event: str, data: Union[Dict, str], room: str) -> None:
215
+ async def emit(self, event: str, data: str, room: str) -> None:
221
216
  """Emits an event to the websocket."""
222
- if not self.sio_server:
217
+ if not self.sio:
223
218
  structlogger.error("studio_chat.emit.sio_not_initialized")
224
219
  return
225
- await self.sio_server.emit(event, data, room=room)
220
+ await self.sio.emit(event, data, room=room)
226
221
 
227
222
  def _register_tracker_update_hook(self) -> None:
228
223
  plugin_manager().register(StudioTrackerUpdatePlugin(self))
@@ -255,22 +250,15 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
255
250
 
256
251
  async def on_message_proxy(
257
252
  self,
258
- on_new_message: Callable[[UserMessage], Awaitable[Any]],
259
- message: UserMessage,
253
+ on_new_message: Callable[["UserMessage"], Awaitable[Any]],
254
+ message: "UserMessage",
260
255
  ) -> None:
261
256
  """Proxies the on_new_message call to the underlying channel.
262
257
 
263
258
  Triggers a tracker update notification after processing the message.
264
259
  """
265
260
  self._record_turn_start_time(message.sender_id)
266
- try:
267
- await on_new_message(message)
268
- except Exception as e:
269
- structlogger.exception(
270
- "studio_chat.on_new_message.error",
271
- error=str(e),
272
- sender_id=message.sender_id,
273
- )
261
+ await on_new_message(message)
274
262
 
275
263
  if not self.agent or not self.agent.is_ready():
276
264
  structlogger.error("studio_chat.on_message_proxy.agent_not_initialized")
@@ -389,7 +377,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
389
377
  call_state.is_bot_speaking = True
390
378
  return ContinueConversationAction()
391
379
 
392
- def _create_output_channel(
380
+ def create_output_channel(
393
381
  self, voice_websocket: "Websocket", tts_engine: TTSEngine
394
382
  ) -> VoiceOutputChannel:
395
383
  """Create a voice output channel."""
@@ -419,7 +407,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
419
407
 
420
408
  # Create a websocket adapter for this connection
421
409
  ws_adapter = SocketIOVoiceWebsocketAdapter(
422
- sio_server=self.sio_server,
410
+ sio=self.sio,
423
411
  session_id=session_id,
424
412
  sid=sid,
425
413
  bot_message_evt=self.bot_message_evt,
@@ -458,7 +446,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
458
446
  if sid in self.active_connections:
459
447
  del self.active_connections[sid]
460
448
 
461
- @hookimpl # type: ignore[misc]
449
+ @hookimpl
462
450
  def after_server_stop(self) -> None:
463
451
  """Cleanup background tasks and active connections when the server stops."""
464
452
  structlogger.info("studio_chat.after_server_stop.cleanup")
@@ -467,12 +455,12 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
467
455
  task.cancel()
468
456
 
469
457
  def blueprint(
470
- self, on_new_message: Callable[[UserMessage], Awaitable[Any]]
458
+ self, on_new_message: Callable[["UserMessage"], Awaitable[Any]]
471
459
  ) -> SocketBlueprint:
472
460
  proxied_on_message = partial(self.on_message_proxy, on_new_message)
473
461
  socket_blueprint = super().blueprint(proxied_on_message)
474
462
 
475
- if not self.sio_server:
463
+ if not self.sio:
476
464
  structlogger.error("studio_chat.blueprint.sio_not_initialized")
477
465
  return socket_blueprint
478
466
 
@@ -482,12 +470,12 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
482
470
  ) -> None:
483
471
  self.agent = app.ctx.agent
484
472
 
485
- @self.sio_server.on("disconnect", namespace=self.namespace)
473
+ @self.sio.on("disconnect", namespace=self.namespace)
486
474
  async def disconnect(sid: Text) -> None:
487
475
  structlogger.debug("studio_chat.sio.disconnect", sid=sid)
488
476
  self._cleanup_tasks_for_sid(sid)
489
477
 
490
- @self.sio_server.on("session_request", namespace=self.namespace)
478
+ @self.sio.on("session_request", namespace=self.namespace)
491
479
  async def session_request(sid: Text, data: Optional[Dict]) -> None:
492
480
  """Overrides the base SocketIOInput session_request handler.
493
481
 
@@ -507,7 +495,7 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
507
495
  if data and data.get("is_voice", False):
508
496
  self._start_voice_session(data["session_id"], sid, proxied_on_message)
509
497
 
510
- @self.sio_server.on(self.user_message_evt, namespace=self.namespace)
498
+ @self.sio.on(self.user_message_evt, namespace=self.namespace)
511
499
  async def handle_message(sid: Text, data: Dict) -> None:
512
500
  """Overrides the base SocketIOInput handle_message handler."""
513
501
  # Handle voice messages
@@ -518,18 +506,10 @@ class StudioChatInput(SocketIOInput, VoiceInputChannel):
518
506
  ws.put_message(data)
519
507
  return
520
508
 
521
- try:
522
- # Handle text messages
523
- await self.handle_user_message(sid, data, proxied_on_message)
524
- except Exception as e:
525
- structlogger.exception(
526
- "studio_chat.sio.handle_message.error",
527
- error=str(e),
528
- sid=sid,
529
- )
530
- await self.emit("error", str(e), room=sid)
509
+ # Handle text messages
510
+ await self.handle_user_message(sid, data, proxied_on_message)
531
511
 
532
- @self.sio_server.on("update_tracker", namespace=self.namespace)
512
+ @self.sio.on("update_tracker", namespace=self.namespace)
533
513
  async def on_update_tracker(sid: Text, data: Dict) -> None:
534
514
  await self.handle_tracker_update(sid, data)
535
515
 
@@ -551,7 +531,7 @@ class StudioVoiceOutputChannel(VoiceOutputChannel):
551
531
 
552
532
  def create_marker_message(self, recipient_id: str) -> Tuple[str, str]:
553
533
  message_id = uuid.uuid4().hex
554
- marker_data = {"marker": message_id}
534
+ marker_data: Dict[str, Any] = {"marker": message_id}
555
535
 
556
536
  # Include comprehensive latency information if available
557
537
  latency_data = {
@@ -566,7 +546,7 @@ class StudioVoiceOutputChannel(VoiceOutputChannel):
566
546
 
567
547
  # Add latency data to marker if any metrics are available
568
548
  if latency_data:
569
- marker_data["latency"] = latency_data # type: ignore[assignment]
549
+ marker_data["latency"] = latency_data
570
550
 
571
551
  return json.dumps(marker_data), message_id
572
552
 
@@ -575,9 +555,9 @@ class SocketIOVoiceWebsocketAdapter:
575
555
  """Adapter to make Socket.IO work like a Sanic WebSocket for voice channels."""
576
556
 
577
557
  def __init__(
578
- self, sio_server: "AsyncServer", session_id: str, sid: str, bot_message_evt: str
558
+ self, sio: "AsyncServer", session_id: str, sid: str, bot_message_evt: str
579
559
  ) -> None:
580
- self.sio_server = sio_server
560
+ self.sio = sio
581
561
  self.bot_message_evt = bot_message_evt
582
562
  self._closed = False
583
563
  self._receive_queue: asyncio.Queue[Any] = asyncio.Queue()
@@ -596,7 +576,7 @@ class SocketIOVoiceWebsocketAdapter:
596
576
  async def send(self, data: Any) -> None:
597
577
  """Send data to the client."""
598
578
  if not self.closed:
599
- await self.sio_server.emit(self.bot_message_evt, data, room=self.sid)
579
+ await self.sio.emit(self.bot_message_evt, data, room=self.sid)
600
580
 
601
581
  async def recv(self) -> Any:
602
582
  """Receive data from the client."""
@@ -274,7 +274,7 @@ class GenesysInputChannel(VoiceInputChannel):
274
274
 
275
275
  def handle_ping(self, ws: Websocket, message: dict) -> None:
276
276
  """Handle ping message from Genesys."""
277
- response = {
277
+ response: Dict[str, Any] = {
278
278
  "version": "2",
279
279
  "type": "pong",
280
280
  "seq": self._get_next_sequence(),