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:
parent
7912d3fd64
commit
aeb782d479
@ -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',
|
||||
|
||||
@ -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
|
||||
});
|
||||
});
|
||||
|
||||
// 思考流开始
|
||||
|
||||
Loading…
Reference in New Issue
Block a user