refactor: 清理WebSocket遗留代码,标记为废弃

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 <noreply@anthropic.com>
This commit is contained in:
JOJO 2026-04-04 01:15:31 +08:00
parent 7912d3fd64
commit aeb782d479
2 changed files with 44 additions and 46 deletions

View File

@ -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',

View File

@ -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
});
});
// 思考流开始