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.
- rasa/agents/agent_factory.py +122 -0
- rasa/agents/agent_manager.py +163 -0
- rasa/agents/constants.py +40 -0
- rasa/agents/core/agent_protocol.py +107 -0
- rasa/agents/core/types.py +70 -0
- rasa/agents/exceptions.py +38 -0
- rasa/agents/protocol/__init__.py +5 -0
- rasa/agents/protocol/a2a/a2a_agent.py +662 -0
- rasa/agents/protocol/mcp/mcp_base_agent.py +685 -0
- rasa/agents/protocol/mcp/mcp_open_agent.py +290 -0
- rasa/agents/protocol/mcp/mcp_task_agent.py +484 -0
- rasa/agents/schemas/__init__.py +12 -0
- rasa/agents/schemas/agent_input.py +38 -0
- rasa/agents/schemas/agent_output.py +26 -0
- rasa/agents/schemas/agent_tool_result.py +67 -0
- rasa/agents/schemas/agent_tool_schema.py +134 -0
- rasa/agents/templates/mcp_open_agent_prompt_template.jinja2 +15 -0
- rasa/agents/templates/mcp_task_agent_prompt_template.jinja2 +17 -0
- rasa/agents/utils.py +77 -0
- rasa/agents/validation.py +484 -0
- rasa/api.py +14 -6
- rasa/cli/arguments/default_arguments.py +12 -0
- rasa/cli/arguments/run.py +2 -0
- rasa/cli/arguments/train.py +2 -0
- rasa/cli/dialogue_understanding_test.py +4 -0
- rasa/cli/e2e_test.py +4 -0
- rasa/cli/inspect.py +3 -0
- rasa/cli/interactive.py +2 -0
- rasa/cli/llm_fine_tuning.py +5 -0
- rasa/cli/project_templates/tutorial/config.yml +1 -2
- rasa/cli/run.py +4 -0
- rasa/cli/scaffold.py +2 -46
- rasa/cli/shell.py +3 -0
- rasa/cli/train.py +2 -0
- rasa/cli/utils.py +85 -1
- rasa/constants.py +6 -0
- rasa/core/actions/action.py +52 -10
- rasa/core/agent.py +19 -1
- rasa/core/available_agents.py +220 -0
- rasa/core/available_endpoints.py +30 -0
- rasa/core/channels/channel.py +3 -4
- rasa/core/channels/development_inspector.py +4 -4
- rasa/core/channels/hangouts.py +2 -2
- rasa/core/channels/inspector/dist/assets/{arc-18042c22.js → arc-cce7e0a8.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{blockDiagram-38ab4fdb-fdd6bcfa.js → blockDiagram-38ab4fdb-e2a49be7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{c4Diagram-3d4e48cf-f5ae6786.js → c4Diagram-3d4e48cf-3def7895.js} +1 -1
- rasa/core/channels/inspector/dist/assets/channel-858c2c20.js +1 -0
- rasa/core/channels/inspector/dist/assets/{classDiagram-70f12bd4-81efba3e.js → classDiagram-70f12bd4-e66fe4df.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{classDiagram-v2-f2320105-3b6b6a92.js → classDiagram-v2-f2320105-eb874aaa.js} +1 -1
- rasa/core/channels/inspector/dist/assets/clone-4b80996c.js +1 -0
- rasa/core/channels/inspector/dist/assets/{createText-2e5e7dd3-31422447.js → createText-2e5e7dd3-cf934643.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{edges-e0da2a9e-518a90db.js → edges-e0da2a9e-8fdf9155.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{erDiagram-9861fffd-a6d3c25a.js → erDiagram-9861fffd-6106fb96.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDb-956e92f1-e048c2be.js → flowDb-956e92f1-4c2bb040.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{flowDiagram-66a62f08-c7474c91.js → flowDiagram-66a62f08-f0ff96af.js} +1 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-16f09b7a.js +1 -0
- rasa/core/channels/inspector/dist/assets/{flowchart-elk-definition-4a651766-cb4d8723.js → flowchart-elk-definition-4a651766-a21707ec.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{ganttDiagram-c361ad54-346636a2.js → ganttDiagram-c361ad54-c165acb1.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{gitGraphDiagram-72cf32ee-7c508874.js → gitGraphDiagram-72cf32ee-b0564cf1.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{graph-14702d8a.js → graph-e557e67a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{index-3862675e-f18b534b.js → index-3862675e-1ce60e9e.js} +1 -1
- rasa/core/channels/inspector/dist/assets/index-996fe816.js +1353 -0
- rasa/core/channels/inspector/dist/assets/{infoDiagram-f8f76790-64154b83.js → infoDiagram-f8f76790-893569e2.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{journeyDiagram-49397b02-833a5f95.js → journeyDiagram-49397b02-c29c864f.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{layout-5a3b2123.js → layout-649a5eae.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{line-2272a8c7.js → line-0e5685ed.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{linear-35bcf273.js → linear-eaa320bd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{mindmap-definition-fc14e90a-92dcb0e9.js → mindmap-definition-fc14e90a-f35df9e6.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{pieDiagram-8a3498a8-94dbc900.js → pieDiagram-8a3498a8-78339e96.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{quadrantDiagram-120e2f19-8b7a9c33.js → quadrantDiagram-120e2f19-9b5f2f14.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{requirementDiagram-deff3bca-6f7eab81.js → requirementDiagram-deff3bca-d05ddb3a.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sankeyDiagram-04a897e0-f43e581d.js → sankeyDiagram-04a897e0-d9be5dfd.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{sequenceDiagram-704730f1-0bcbefc3.js → sequenceDiagram-704730f1-0f1c4348.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-587899a1-b8a74083.js → stateDiagram-587899a1-9ddf63b3.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{stateDiagram-v2-d93cdb3a-2070218f.js → stateDiagram-v2-d93cdb3a-bc2b81ed.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-6aaf32cf-f1d54e34.js → styles-6aaf32cf-0a287936.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-9a916d00-980de489.js → styles-9a916d00-e3941990.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{styles-c10674c1-3c03abde.js → styles-c10674c1-ce4eca24.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{svgDrawCommon-08f97a94-46ba068f.js → svgDrawCommon-08f97a94-d822b1a8.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{timeline-definition-85554ec2-901f5e3d.js → timeline-definition-85554ec2-e144c7a7.js} +1 -1
- rasa/core/channels/inspector/dist/assets/{xychartDiagram-e933f94c-acbc628a.js → xychartDiagram-e933f94c-ab7f4e14.js} +1 -1
- rasa/core/channels/inspector/dist/index.html +2 -2
- rasa/core/channels/inspector/index.html +1 -1
- rasa/core/channels/inspector/src/App.tsx +37 -12
- rasa/core/channels/inspector/src/components/DialogueAgentStack.tsx +108 -0
- rasa/core/channels/inspector/src/components/{DialogueStack.tsx → DialogueHistoryStack.tsx} +3 -2
- rasa/core/channels/inspector/src/components/DialogueInformation.tsx +3 -12
- rasa/core/channels/inspector/src/helpers/formatters.test.ts +4 -0
- rasa/core/channels/inspector/src/helpers/formatters.ts +24 -3
- rasa/core/channels/inspector/src/helpers/utils.test.ts +127 -0
- rasa/core/channels/inspector/src/helpers/utils.ts +66 -1
- rasa/core/channels/inspector/src/theme/base/styles.ts +19 -1
- rasa/core/channels/inspector/src/types.ts +21 -0
- rasa/core/channels/socketio.py +51 -212
- rasa/core/channels/studio_chat.py +29 -49
- rasa/core/channels/voice_stream/genesys.py +1 -1
- rasa/core/channels/voice_stream/voice_channel.py +3 -5
- rasa/core/constants.py +4 -0
- rasa/core/policies/enterprise_search_policy.py +11 -6
- rasa/core/policies/flow_policy.py +4 -4
- rasa/core/policies/flows/flow_executor.py +519 -73
- rasa/core/policies/flows/mcp_tool_executor.py +277 -0
- rasa/core/policies/intentless_policy.py +1 -1
- rasa/core/policies/unexpected_intent_policy.py +1 -0
- rasa/core/processor.py +18 -15
- rasa/core/run.py +11 -14
- rasa/core/tracker_stores/tracker_store.py +3 -7
- rasa/core/train.py +1 -1
- rasa/core/training/interactive.py +16 -16
- rasa/core/training/story_conflict.py +5 -5
- rasa/core/utils.py +21 -1
- rasa/dialogue_understanding/commands/__init__.py +8 -0
- rasa/dialogue_understanding/commands/cancel_flow_command.py +19 -5
- rasa/dialogue_understanding/commands/chit_chat_answer_command.py +11 -0
- rasa/dialogue_understanding/commands/clarify_command.py +10 -0
- rasa/dialogue_understanding/commands/continue_agent_command.py +91 -0
- rasa/dialogue_understanding/commands/knowledge_answer_command.py +11 -0
- rasa/dialogue_understanding/commands/restart_agent_command.py +162 -0
- rasa/dialogue_understanding/commands/start_flow_command.py +68 -7
- rasa/dialogue_understanding/commands/utils.py +124 -2
- rasa/dialogue_understanding/generator/command_parser.py +4 -0
- rasa/dialogue_understanding/generator/flow_retrieval.py +9 -10
- rasa/dialogue_understanding/generator/llm_based_command_generator.py +50 -12
- rasa/dialogue_understanding/generator/llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/multi_step/multi_step_llm_command_generator.py +1 -1
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v2_claude_3_5_sonnet_20240620_template.jinja2 +61 -0
- 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
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_claude_3_5_sonnet_20240620_template.jinja2 +81 -0
- rasa/dialogue_understanding/generator/prompt_templates/agent_command_prompt_v3_gpt_4o_2024_11_20_template.jinja2 +81 -0
- rasa/dialogue_understanding/generator/single_step/compact_llm_command_generator.py +7 -6
- rasa/dialogue_understanding/generator/single_step/search_ready_llm_command_generator.py +7 -6
- rasa/dialogue_understanding/generator/single_step/single_step_based_llm_command_generator.py +41 -2
- rasa/dialogue_understanding/patterns/clarify.py +3 -14
- rasa/dialogue_understanding/patterns/continue_interrupted.py +239 -6
- rasa/dialogue_understanding/patterns/default_flows_for_patterns.yml +46 -8
- rasa/dialogue_understanding/processor/command_processor.py +31 -15
- rasa/dialogue_understanding/stack/dialogue_stack.py +123 -2
- rasa/dialogue_understanding/stack/frames/flow_stack_frame.py +57 -0
- rasa/dialogue_understanding/stack/utils.py +57 -3
- rasa/dialogue_understanding/utils.py +24 -4
- rasa/dialogue_understanding_test/du_test_runner.py +7 -2
- rasa/e2e_test/e2e_test_runner.py +12 -2
- rasa/engine/caching.py +2 -2
- rasa/engine/recipes/default_components.py +10 -18
- rasa/engine/storage/local_model_storage.py +2 -45
- rasa/graph_components/validators/default_recipe_validator.py +134 -134
- rasa/hooks.py +5 -5
- rasa/llm_fine_tuning/utils.py +2 -2
- rasa/model_manager/model_api.py +5 -4
- rasa/model_manager/runner_service.py +1 -1
- rasa/model_manager/socket_bridge.py +14 -20
- rasa/model_manager/trainer_service.py +9 -12
- rasa/model_manager/utils.py +29 -1
- rasa/model_manager/warm_rasa_process.py +1 -1
- rasa/model_training.py +8 -6
- rasa/nlu/extractors/extractor.py +2 -1
- rasa/plugin.py +8 -8
- rasa/privacy/privacy_manager.py +11 -2
- rasa/server.py +14 -2
- rasa/shared/agents/utils.py +35 -0
- rasa/shared/constants.py +8 -0
- rasa/shared/core/constants.py +11 -1
- rasa/shared/core/domain.py +11 -58
- rasa/shared/core/events.py +327 -0
- rasa/shared/core/flows/flow_step.py +1 -7
- rasa/shared/core/flows/flows_list.py +15 -5
- rasa/shared/core/flows/flows_yaml_schema.json +112 -186
- rasa/shared/core/flows/steps/call.py +53 -5
- rasa/shared/core/flows/validation.py +177 -7
- rasa/shared/core/flows/yaml_flows_io.py +9 -17
- rasa/shared/core/slots.py +2 -6
- rasa/shared/core/trackers.py +5 -2
- rasa/shared/exceptions.py +4 -0
- rasa/shared/importers/importer.py +0 -6
- rasa/shared/importers/rasa.py +1 -1
- rasa/shared/importers/utils.py +10 -80
- rasa/shared/providers/_utils.py +44 -60
- rasa/shared/providers/embedding/default_litellm_embedding_client.py +0 -2
- rasa/shared/providers/llm/_base_litellm_client.py +39 -7
- rasa/shared/providers/llm/default_litellm_llm_client.py +0 -2
- rasa/shared/providers/llm/litellm_router_llm_client.py +8 -4
- rasa/shared/providers/llm/llm_client.py +7 -3
- rasa/shared/providers/llm/llm_response.py +66 -0
- rasa/shared/providers/llm/self_hosted_llm_client.py +8 -4
- rasa/shared/utils/health_check/health_check.py +7 -3
- rasa/shared/utils/llm.py +28 -5
- rasa/shared/utils/mcp/server_connection.py +186 -0
- rasa/shared/utils/schemas/events.py +42 -0
- rasa/shared/utils/yaml.py +3 -1
- rasa/studio/upload.py +47 -16
- rasa/telemetry.py +23 -97
- rasa/tracing/instrumentation/instrumentation.py +14 -10
- rasa/tracing/instrumentation/intentless_policy_instrumentation.py +4 -4
- rasa/utils/common.py +79 -0
- rasa/utils/io.py +9 -27
- rasa/utils/json_utils.py +1 -6
- rasa/utils/log_utils.py +2 -6
- rasa/utils/ml_utils.py +1 -1
- rasa/utils/tensorflow/rasa_layers.py +1 -1
- rasa/utils/train_utils.py +15 -15
- rasa/validator.py +19 -21
- rasa/version.py +1 -1
- {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/METADATA +14 -17
- {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/RECORD +214 -442
- rasa/builder/README.md +0 -120
- rasa/builder/auth.py +0 -176
- rasa/builder/config.py +0 -115
- rasa/builder/copilot/constants.py +0 -25
- rasa/builder/copilot/copilot.py +0 -372
- rasa/builder/copilot/copilot_response_handler.py +0 -487
- rasa/builder/copilot/copilot_templated_message_provider.py +0 -58
- rasa/builder/copilot/exceptions.py +0 -20
- rasa/builder/copilot/models.py +0 -431
- rasa/builder/copilot/prompts/copilot_system_prompt.jinja2 +0 -726
- rasa/builder/copilot/telemetry.py +0 -195
- rasa/builder/copilot/templated_messages/copilot_internal_messages_templates.yml +0 -16
- rasa/builder/copilot/templated_messages/copilot_templated_responses.yml +0 -26
- rasa/builder/document_retrieval/constants.py +0 -15
- rasa/builder/document_retrieval/inkeep-rag-response-schema.json +0 -64
- rasa/builder/document_retrieval/inkeep_document_retrieval.py +0 -238
- rasa/builder/document_retrieval/models.py +0 -62
- rasa/builder/download.py +0 -140
- rasa/builder/exceptions.py +0 -55
- rasa/builder/guardrails/__init__.py +0 -1
- rasa/builder/guardrails/constants.py +0 -3
- rasa/builder/guardrails/exceptions.py +0 -4
- rasa/builder/guardrails/lakera.py +0 -206
- rasa/builder/guardrails/models.py +0 -199
- rasa/builder/guardrails/utils.py +0 -305
- rasa/builder/job_manager.py +0 -87
- rasa/builder/jobs.py +0 -234
- rasa/builder/llm_service.py +0 -246
- rasa/builder/logging_utils.py +0 -209
- rasa/builder/main.py +0 -174
- rasa/builder/models.py +0 -197
- rasa/builder/project_generator.py +0 -450
- rasa/builder/project_info.py +0 -72
- rasa/builder/scrape_rasa_docs.py +0 -97
- rasa/builder/service.py +0 -1142
- rasa/builder/shared/tracker_context.py +0 -212
- rasa/builder/skill_to_bot_prompt.jinja2 +0 -164
- rasa/builder/training_service.py +0 -132
- rasa/builder/validation_service.py +0 -93
- rasa/cli/project_templates/basic/actions/action_api.py +0 -15
- rasa/cli/project_templates/basic/actions/action_human_handoff.py +0 -44
- rasa/cli/project_templates/basic/config.yml +0 -23
- rasa/cli/project_templates/basic/credentials.yml +0 -34
- rasa/cli/project_templates/basic/data/general/feedback.yml +0 -20
- rasa/cli/project_templates/basic/data/general/goodbye.yml +0 -6
- rasa/cli/project_templates/basic/data/general/hello.yml +0 -7
- rasa/cli/project_templates/basic/data/general/help.yml +0 -6
- rasa/cli/project_templates/basic/data/general/human_handoff.yml +0 -16
- rasa/cli/project_templates/basic/data/general/welcome.yml +0 -9
- rasa/cli/project_templates/basic/data/system/pattern_completed.yml +0 -7
- rasa/cli/project_templates/basic/data/system/pattern_correction.yml +0 -7
- rasa/cli/project_templates/basic/data/system/pattern_search.yml +0 -8
- rasa/cli/project_templates/basic/data/system/pattern_session_start.yml +0 -8
- rasa/cli/project_templates/basic/docs/rasa_assistant_qa.txt +0 -65
- rasa/cli/project_templates/basic/docs/template.txt +0 -7
- rasa/cli/project_templates/basic/domain/general/assistant_details.yml +0 -12
- rasa/cli/project_templates/basic/domain/general/bot_identity.yml +0 -5
- rasa/cli/project_templates/basic/domain/general/cannot_handle.yml +0 -5
- rasa/cli/project_templates/basic/domain/general/feedback.yml +0 -28
- rasa/cli/project_templates/basic/domain/general/goodbye.yml +0 -7
- rasa/cli/project_templates/basic/domain/general/help.yml +0 -5
- rasa/cli/project_templates/basic/domain/general/human_handoff_domain.yml +0 -35
- rasa/cli/project_templates/basic/domain/general/utils.yml +0 -13
- rasa/cli/project_templates/basic/domain/general/welcome.yml +0 -7
- rasa/cli/project_templates/basic/endpoints.yml +0 -73
- rasa/cli/project_templates/basic/prompts/rephraser_demo_personality_prompt.jinja2 +0 -19
- rasa/cli/project_templates/finance/actions/__init__.py +0 -46
- rasa/cli/project_templates/finance/actions/accounts/action_ask_account.py +0 -47
- rasa/cli/project_templates/finance/actions/accounts/action_check_balance.py +0 -40
- rasa/cli/project_templates/finance/actions/action_session_start.py +0 -74
- rasa/cli/project_templates/finance/actions/cards/action_ask_card.py +0 -48
- rasa/cli/project_templates/finance/actions/cards/action_check_card_existence.py +0 -36
- rasa/cli/project_templates/finance/actions/cards/action_update_card_status.py +0 -54
- rasa/cli/project_templates/finance/actions/database.py +0 -277
- rasa/cli/project_templates/finance/actions/transfers/__init__.py +0 -0
- rasa/cli/project_templates/finance/actions/transfers/action_add_payee.py +0 -52
- rasa/cli/project_templates/finance/actions/transfers/action_ask_account_from.py +0 -51
- rasa/cli/project_templates/finance/actions/transfers/action_check_payee_existence.py +0 -40
- rasa/cli/project_templates/finance/actions/transfers/action_check_sufficient_funds.py +0 -40
- rasa/cli/project_templates/finance/actions/transfers/action_list_payees.py +0 -46
- rasa/cli/project_templates/finance/actions/transfers/action_process_immediate_payment.py +0 -18
- rasa/cli/project_templates/finance/actions/transfers/action_remove_payee.py +0 -49
- rasa/cli/project_templates/finance/actions/transfers/action_schedule_payment.py +0 -19
- rasa/cli/project_templates/finance/actions/transfers/action_validate_payment_date.py +0 -36
- rasa/cli/project_templates/finance/config.yml +0 -21
- rasa/cli/project_templates/finance/credentials.yml +0 -32
- rasa/cli/project_templates/finance/csvs/accounts.csv +0 -8
- rasa/cli/project_templates/finance/csvs/advisors.csv +0 -7
- rasa/cli/project_templates/finance/csvs/appointments.csv +0 -211
- rasa/cli/project_templates/finance/csvs/branches.csv +0 -10
- rasa/cli/project_templates/finance/csvs/cards.csv +0 -11
- rasa/cli/project_templates/finance/csvs/payees.csv +0 -11
- rasa/cli/project_templates/finance/csvs/transactions.csv +0 -71
- rasa/cli/project_templates/finance/csvs/users.csv +0 -4
- rasa/cli/project_templates/finance/data/accounts/check_balance.yml +0 -10
- rasa/cli/project_templates/finance/data/cards/block_card.yml +0 -66
- rasa/cli/project_templates/finance/data/cards/select_card.yml +0 -12
- rasa/cli/project_templates/finance/data/general/bot_identity.yml +0 -6
- rasa/cli/project_templates/finance/data/general/feedback.yml +0 -20
- rasa/cli/project_templates/finance/data/general/goodbye.yml +0 -6
- rasa/cli/project_templates/finance/data/general/hello.yml +0 -7
- rasa/cli/project_templates/finance/data/general/help.yml +0 -9
- rasa/cli/project_templates/finance/data/general/human_handoff.yml +0 -16
- rasa/cli/project_templates/finance/data/general/welcome.yml +0 -9
- rasa/cli/project_templates/finance/data/system/patterns/pattern_chitchat.yml +0 -5
- rasa/cli/project_templates/finance/data/system/patterns/pattern_completed.yml +0 -7
- rasa/cli/project_templates/finance/data/system/patterns/pattern_correction.yml +0 -7
- rasa/cli/project_templates/finance/data/system/patterns/pattern_search.yml +0 -8
- rasa/cli/project_templates/finance/data/system/patterns/pattern_session_start.yml +0 -8
- rasa/cli/project_templates/finance/data/system/source/accounts.json +0 -51
- rasa/cli/project_templates/finance/data/system/source/advisors.json +0 -44
- rasa/cli/project_templates/finance/data/system/source/appointments.json +0 -1474
- rasa/cli/project_templates/finance/data/system/source/branches.json +0 -47
- rasa/cli/project_templates/finance/data/system/source/cards.json +0 -72
- rasa/cli/project_templates/finance/data/system/source/payees.json +0 -74
- rasa/cli/project_templates/finance/data/system/source/transactions.json +0 -492
- rasa/cli/project_templates/finance/data/system/source/users.json +0 -29
- rasa/cli/project_templates/finance/data/transfers/add_payee.yml +0 -29
- rasa/cli/project_templates/finance/data/transfers/list_payees.yml +0 -5
- rasa/cli/project_templates/finance/data/transfers/remove_payee.yml +0 -21
- rasa/cli/project_templates/finance/data/transfers/transfer_money.yml +0 -67
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/consequences_of_blocking_card.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/reasons_to_block_card.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/recovering_from_card_fraud.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/tips_for_card_security.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/block_card/what_to_do_if_card_is_lost.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/account_balance_security.txt +0 -7
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/common_balance_inquiries.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/methods_to_check_balance.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/understanding_balance_updates.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/check_balance/what_to_do_if_balance_is_incorrect.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/benefits_of_authorised_payees.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/common_issues_with_payees.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/general_payee_information.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/payee_management_tips.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/manage_payees/understanding_payee_types.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/common_transfer_errors.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/fees_for_transfers.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/general_transfer_information.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/security_tips_for_transfers.txt +0 -8
- rasa/cli/project_templates/finance/docs/bank_of_rasa_faq/transfer_money/transfer_processing_times.txt +0 -8
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part1.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part10.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part11.txt +0 -48
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part12.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part13.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part14.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part15.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part16.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part17.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part18.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part19.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part2.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part20.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part21.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part22.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part23.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part24.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part25.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part26.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part27.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part28.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part29.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part3.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part30.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part31.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part32.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part33.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part34.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part35.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part36.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part37.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part38.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part39.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part4.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part40.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part41.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part42.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part43.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part44.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part45.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part46.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part47.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part48.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part49.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part5.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part50.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part51.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part52.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part53.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part54.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part55.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part56.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part57.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part58.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part59.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part6.txt +0 -47
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part60.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part61.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part7.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part8.txt +0 -50
- rasa/cli/project_templates/finance/docs/huggingface_alpaca_dataset/questions_part9.txt +0 -47
- rasa/cli/project_templates/finance/domain/accounts/check_balance.yml +0 -11
- rasa/cli/project_templates/finance/domain/cards/block_card.yml +0 -101
- rasa/cli/project_templates/finance/domain/cards/select_card.yml +0 -12
- rasa/cli/project_templates/finance/domain/general/assistant_details.yml +0 -12
- rasa/cli/project_templates/finance/domain/general/bot_identity.yml +0 -5
- rasa/cli/project_templates/finance/domain/general/cannot_handle.yml +0 -5
- rasa/cli/project_templates/finance/domain/general/defaults.yml +0 -24
- rasa/cli/project_templates/finance/domain/general/feedback.yml +0 -28
- rasa/cli/project_templates/finance/domain/general/goodbye.yml +0 -7
- rasa/cli/project_templates/finance/domain/general/help.yml +0 -5
- rasa/cli/project_templates/finance/domain/general/human_handoff.yml +0 -30
- rasa/cli/project_templates/finance/domain/general/utils.yml +0 -13
- rasa/cli/project_templates/finance/domain/general/welcome.yml +0 -8
- rasa/cli/project_templates/finance/domain/transfers/add_payee.yml +0 -47
- rasa/cli/project_templates/finance/domain/transfers/list_payees.yml +0 -4
- rasa/cli/project_templates/finance/domain/transfers/remove_payee.yml +0 -16
- rasa/cli/project_templates/finance/domain/transfers/transfer_money.yml +0 -79
- rasa/cli/project_templates/finance/endpoints.yml +0 -63
- rasa/cli/project_templates/finance/prompts/rephraser_demo_personality_prompt.jinja2 +0 -19
- rasa/cli/project_templates/telco/actions/__init__.py +0 -0
- rasa/cli/project_templates/telco/actions/actions_billing.py +0 -204
- rasa/cli/project_templates/telco/actions/actions_get_data_from_db.py +0 -48
- rasa/cli/project_templates/telco/actions/actions_run_diagnostics.py +0 -28
- rasa/cli/project_templates/telco/actions/actions_session_start.py +0 -18
- rasa/cli/project_templates/telco/config.yml +0 -25
- rasa/cli/project_templates/telco/credentials.yml +0 -33
- rasa/cli/project_templates/telco/csvs/billing.csv +0 -10
- rasa/cli/project_templates/telco/csvs/customers.csv +0 -5
- rasa/cli/project_templates/telco/data/flows/flow_global.yml +0 -5
- rasa/cli/project_templates/telco/data/flows/flow_reboot_router.yml +0 -8
- rasa/cli/project_templates/telco/data/flows/flow_reset_router.yml +0 -7
- rasa/cli/project_templates/telco/data/flows/flow_solve_internet_issue.yml +0 -73
- rasa/cli/project_templates/telco/data/flows/flow_undertand_bill.yml +0 -45
- rasa/cli/project_templates/telco/data/patterns/pattern_completed.yml +0 -7
- rasa/cli/project_templates/telco/data/patterns/pattern_human_handoff.yml +0 -6
- rasa/cli/project_templates/telco/data/patterns/pattern_search.yml +0 -7
- rasa/cli/project_templates/telco/data/patterns/pattern_session_start.yml +0 -9
- rasa/cli/project_templates/telco/docs/reset_vs_rboot_router.txt +0 -1
- rasa/cli/project_templates/telco/docs/restart_router.txt +0 -6
- rasa/cli/project_templates/telco/docs/run_speed_test.txt +0 -6
- rasa/cli/project_templates/telco/domain/domain_global.yml +0 -29
- rasa/cli/project_templates/telco/domain/domain_patterns.yml +0 -17
- rasa/cli/project_templates/telco/domain/domain_reboot_router.yml +0 -20
- rasa/cli/project_templates/telco/domain/domain_reset_router.yml +0 -11
- rasa/cli/project_templates/telco/domain/domain_run_speed_test.yml +0 -24
- rasa/cli/project_templates/telco/domain/domain_solve_internet_issue.yml +0 -74
- rasa/cli/project_templates/telco/domain/domain_undertand_bill.yml +0 -102
- rasa/cli/project_templates/telco/endpoints.yml +0 -60
- rasa/cli/project_templates/telco/tests/e2e_results_failed.yml +0 -62
- rasa/cli/project_templates/telco/tests/e2e_results_passed.yml +0 -130
- rasa/cli/project_templates/telco/tests/e2e_test_cases/billing_test_cases.yml +0 -68
- rasa/cli/project_templates/telco/tests/e2e_test_cases/global_test_cases.yml +0 -13
- rasa/cli/project_templates/telco/tests/e2e_test_cases/internet_slow_test_case.yml +0 -47
- rasa/cli/project_templates/telco/tests/e2e_test_cases/out_of_scope_test_case.yml +0 -21
- rasa/cli/project_templates/telco/tests/e2e_test_cases/patterns_test_cases.yml +0 -15
- rasa/core/channels/constants.py +0 -3
- rasa/core/channels/inspector/dist/assets/channel-b9b536fc.js +0 -1
- rasa/core/channels/inspector/dist/assets/clone-78d2ddcf.js +0 -1
- rasa/core/channels/inspector/dist/assets/flowDiagram-v2-96b9c2cf-8b09c060.js +0 -1
- rasa/core/channels/inspector/dist/assets/index-4d4bdf3a.js +0 -1335
- rasa/utils/openapi.py +0 -144
- /rasa/{builder → agents}/__init__.py +0 -0
- /rasa/{builder/copilot → agents/core}/__init__.py +0 -0
- /rasa/{builder/copilot/prompts → agents/protocol/a2a}/__init__.py +0 -0
- /rasa/{builder/copilot/templated_messages → agents/protocol/mcp}/__init__.py +0 -0
- /rasa/{builder/document_retrieval → agents/templates}/__init__.py +0 -0
- /rasa/{cli/project_templates/finance/actions/accounts → shared/agents}/__init__.py +0 -0
- /rasa/{cli/project_templates/finance/actions/cards → shared/utils/mcp}/__init__.py +0 -0
- {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/NOTICE +0 -0
- {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/WHEEL +0 -0
- {rasa_pro-3.14.0.dev5.dist-info → rasa_pro-3.14.0.dev7.dist-info}/entry_points.txt +0 -0
rasa/core/channels/socketio.py
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
23
|
+
self, sio: AsyncServer, socketio_path: Text, *args: Any, **kwargs: Any
|
|
44
24
|
) -> None:
|
|
45
|
-
"""Creates a :class:`sanic.Blueprint` for routing socketio
|
|
25
|
+
"""Creates a :class:`sanic.Blueprint` for routing socketio connenctions.
|
|
46
26
|
|
|
47
|
-
:param
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
126
|
+
await self.sio.emit(self.bot_message_evt, **json_message)
|
|
178
127
|
else:
|
|
179
|
-
await self.
|
|
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) ->
|
|
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
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
273
|
-
await self.
|
|
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.
|
|
278
|
-
await self.
|
|
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:
|
|
216
|
+
on_new_message: Callable[[UserMessage], Awaitable[Any]],
|
|
289
217
|
) -> None:
|
|
290
218
|
"""Handles user messages received from the client."""
|
|
291
|
-
output_channel = self.
|
|
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
|
-
|
|
318
|
-
output_channel
|
|
319
|
-
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(
|
|
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
|
-
|
|
254
|
+
sio = AsyncServer(async_mode="sanic", cors_allowed_origins=[])
|
|
330
255
|
socketio_webhook = SocketBlueprint(
|
|
331
|
-
|
|
256
|
+
sio, self.socketio_path, "socketio_webhook", __name__
|
|
332
257
|
)
|
|
333
258
|
|
|
334
|
-
# make
|
|
335
|
-
self.
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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
|
-
) ->
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
215
|
+
async def emit(self, event: str, data: str, room: str) -> None:
|
|
221
216
|
"""Emits an event to the websocket."""
|
|
222
|
-
if not self.
|
|
217
|
+
if not self.sio:
|
|
223
218
|
structlogger.error("studio_chat.emit.sio_not_initialized")
|
|
224
219
|
return
|
|
225
|
-
await self.
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
522
|
-
|
|
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.
|
|
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
|
|
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,
|
|
558
|
+
self, sio: "AsyncServer", session_id: str, sid: str, bot_message_evt: str
|
|
579
559
|
) -> None:
|
|
580
|
-
self.
|
|
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.
|
|
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(),
|