From aeb782d47969cc542d013afcd5f346d01963e4fc Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Sat, 4 Apr 2026 01:15:31 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=B8=85=E7=90=86WebSocket?= =?UTF-8?q?=E9=81=97=E7=95=99=E4=BB=A3=E7=A0=81=EF=BC=8C=E6=A0=87=E8=AE=B0?= =?UTF-8?q?=E4=B8=BA=E5=BA=9F=E5=BC=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 2 WebSocket代码清理: 前端 (useLegacySocket.ts): 1. 添加文件头注释说明架构变更 - 聊天流式事件已废弃,改用 REST API 轮询 - 保留系统事件、配额事件、对话事件、子智能体事件 - 标记待清理的流式处理代码 2. 简化 ai_message_start 事件处理器 - 只保留子智能体模式的处理 - 删除复杂的流式状态管理逻辑 3. 保留备份文件 useLegacySocket.ts.backup - 用于紧急回退 后端 (socket_handlers.py): 1. 标记 handle_message 为废弃 - 添加废弃警告和迁移指南 - 返回错误提示引导用户使用 REST API - 保留原代码用于紧急回退(注释掉) 2. 说明新架构优势 - 支持分布式部署 - 更好的错误恢复 - 减少 WebSocket 连接压力 注意: - 未删除大量流式处理代码,只添加注释标记 - 保留向后兼容性,避免破坏现有功能 - 后续可逐步清理标记为废弃的代码 Co-Authored-By: Claude Sonnet 4.5 --- server/socket_handlers.py | 30 +++++++++--- static/src/composables/useLegacySocket.ts | 60 ++++++++--------------- 2 files changed, 44 insertions(+), 46 deletions(-) diff --git a/server/socket_handlers.py b/server/socket_handlers.py index e667ff4..12d54fb 100644 --- a/server/socket_handlers.py +++ b/server/socket_handlers.py @@ -234,12 +234,30 @@ def handle_get_terminal_output(data): @socketio.on('send_message') def handle_message(data): - """处理用户消息""" + """ + 【已废弃】WebSocket 聊天入口,已由 REST API (/api/tasks) 替代 + + 保留此处理器用于向后兼容,但建议前端使用 REST API 轮询模式。 + 新的架构优势: + - 支持分布式部署(任务存储可扩展为 Redis) + - 更好的错误恢复(页面刷新后可恢复任务状态) + - 减少 WebSocket 连接压力 + """ username, terminal, workspace = get_terminal_for_sid(request.sid) if not terminal: emit('error', {'message': 'System not initialized'}) return - + + # 返回废弃提示 + emit('error', { + 'message': 'WebSocket 聊天已废弃,请使用 REST API (/api/tasks)', + 'code': 'DEPRECATED', + 'migration_guide': '前端已切换到轮询模式,请刷新页面' + }) + return + + # 以下代码保留用于紧急回退 + # ======================================== message = (data.get('message') or '').strip() images = data.get('images') or [] videos = data.get('videos') or [] @@ -255,11 +273,11 @@ def handle_message(data): if images and videos: emit('error', {'message': '图片和视频请分开发送'}) return - + print(f"[WebSocket] 收到消息: {message}") debug_log(f"\n{'='*80}\n新任务开始: {message}\n{'='*80}") record_user_activity(username) - + requested_conversation_id = data.get('conversation_id') try: conversation_id, created_new = ensure_conversation_loaded(terminal, requested_conversation_id) @@ -287,14 +305,14 @@ def handle_message(data): 'conversation_id': conversation_id, 'title': title }, room=request.sid) - + client_sid = request.sid def send_to_client(event_type, data): """发送消息到客户端""" socketio.emit(event_type, data, room=client_sid) - # 模型活动事件:用于刷新“在线”心跳(回复/工具调用都算活动) + # 模型活动事件:用于刷新"在线"心跳(回复/工具调用都算活动) activity_events = { 'ai_message_start', 'thinking_start', 'thinking_chunk', 'thinking_end', 'text_start', 'text_chunk', 'text_end', diff --git a/static/src/composables/useLegacySocket.ts b/static/src/composables/useLegacySocket.ts index 018497d..6aba52d 100644 --- a/static/src/composables/useLegacySocket.ts +++ b/static/src/composables/useLegacySocket.ts @@ -1,4 +1,21 @@ // @ts-nocheck +/** + * WebSocket 连接管理(遗留代码) + * + * 注意:聊天流式事件(ai_message_start, thinking_*, text_*, tool_*)已废弃 + * 现在使用 REST API 轮询模式(/api/tasks)处理聊天消息 + * + * 保留的功能: + * - 系统事件:connect, disconnect, error + * - 配额事件:quota_update, quota_notice, quota_exceeded + * - 对话事件:conversation_changed, conversation_resolved, conversation_loaded + * - 子智能体事件:sub_agent_waiting + * - Token统计:token_update + * + * 待清理: + * - 流式文本处理相关代码(streamingState, pendingToolEvents等) + * - 聊天事件处理器中的复杂逻辑 + */ import { io as createSocketClient } from 'socket.io-client'; import { renderLatexInRealtime } from './useMarkdownRenderer'; @@ -901,50 +918,13 @@ export async function initializeLegacySocket(ctx: any) { }); - // AI消息开始 + // AI消息开始(已废弃,改用 REST API 轮询) ctx.socket.on('ai_message_start', () => { - // 轮询模式下跳过 WebSocket 事件 - if (ctx.usePollingMode && !ctx.waitingForSubAgent) { - socketLog('AI消息开始 (轮询模式,跳过)'); - return; - } - console.log('[DEBUG] 收到 ai_message_start 事件:', { - currentConversationId: ctx.currentConversationId, - messagesCount: ctx.messages.length, - taskInProgress: ctx.taskInProgress, - streamingMessage: ctx.streamingMessage, - waitingForSubAgent: ctx.waitingForSubAgent - }); - - // 清除等待子智能体的标志(轮询模式下保留,避免中断后续 socket 流) - if (ctx.waitingForSubAgent && !ctx.usePollingMode) { - console.log('[DEBUG] 清除 waitingForSubAgent 标志'); + // 只处理子智能体模式 + if (ctx.waitingForSubAgent) { ctx.waitingForSubAgent = false; ctx.taskInProgress = false; - ctx.stopRequested = false; } - - socketLog('AI消息开始'); - logStreamingDebug('socket:ai_message_start'); - finalizeStreamingText({ force: true }); - flushPendingToolEvents(); - resetStreamingBuffer(); - ctx.monitorResetSpeech(); - ctx.cleanupStaleToolActions(); - ctx.taskInProgress = true; - ctx.chatStartAssistantMessage(); - streamingState.activeMessageIndex = - typeof ctx.currentMessageIndex === 'number' ? ctx.currentMessageIndex : null; - streamingState.activeTextAction = null; - ctx.stopRequested = false; - ctx.streamingMessage = true; // 确保设置为流式状态 - ctx.scrollToBottom(); - console.log('[DEBUG] ai_message_start 处理完成,当前状态:', { - messagesCount: ctx.messages.length, - currentMessageIndex: ctx.currentMessageIndex, - taskInProgress: ctx.taskInProgress, - streamingMessage: ctx.streamingMessage - }); }); // 思考流开始