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')
|
@socketio.on('send_message')
|
||||||
def handle_message(data):
|
def handle_message(data):
|
||||||
"""处理用户消息"""
|
"""
|
||||||
|
【已废弃】WebSocket 聊天入口,已由 REST API (/api/tasks) 替代
|
||||||
|
|
||||||
|
保留此处理器用于向后兼容,但建议前端使用 REST API 轮询模式。
|
||||||
|
新的架构优势:
|
||||||
|
- 支持分布式部署(任务存储可扩展为 Redis)
|
||||||
|
- 更好的错误恢复(页面刷新后可恢复任务状态)
|
||||||
|
- 减少 WebSocket 连接压力
|
||||||
|
"""
|
||||||
username, terminal, workspace = get_terminal_for_sid(request.sid)
|
username, terminal, workspace = get_terminal_for_sid(request.sid)
|
||||||
if not terminal:
|
if not terminal:
|
||||||
emit('error', {'message': 'System not initialized'})
|
emit('error', {'message': 'System not initialized'})
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# 返回废弃提示
|
||||||
|
emit('error', {
|
||||||
|
'message': 'WebSocket 聊天已废弃,请使用 REST API (/api/tasks)',
|
||||||
|
'code': 'DEPRECATED',
|
||||||
|
'migration_guide': '前端已切换到轮询模式,请刷新页面'
|
||||||
|
})
|
||||||
|
return
|
||||||
|
|
||||||
|
# 以下代码保留用于紧急回退
|
||||||
|
# ========================================
|
||||||
message = (data.get('message') or '').strip()
|
message = (data.get('message') or '').strip()
|
||||||
images = data.get('images') or []
|
images = data.get('images') or []
|
||||||
videos = data.get('videos') or []
|
videos = data.get('videos') or []
|
||||||
@ -255,11 +273,11 @@ def handle_message(data):
|
|||||||
if images and videos:
|
if images and videos:
|
||||||
emit('error', {'message': '图片和视频请分开发送'})
|
emit('error', {'message': '图片和视频请分开发送'})
|
||||||
return
|
return
|
||||||
|
|
||||||
print(f"[WebSocket] 收到消息: {message}")
|
print(f"[WebSocket] 收到消息: {message}")
|
||||||
debug_log(f"\n{'='*80}\n新任务开始: {message}\n{'='*80}")
|
debug_log(f"\n{'='*80}\n新任务开始: {message}\n{'='*80}")
|
||||||
record_user_activity(username)
|
record_user_activity(username)
|
||||||
|
|
||||||
requested_conversation_id = data.get('conversation_id')
|
requested_conversation_id = data.get('conversation_id')
|
||||||
try:
|
try:
|
||||||
conversation_id, created_new = ensure_conversation_loaded(terminal, requested_conversation_id)
|
conversation_id, created_new = ensure_conversation_loaded(terminal, requested_conversation_id)
|
||||||
@ -287,14 +305,14 @@ def handle_message(data):
|
|||||||
'conversation_id': conversation_id,
|
'conversation_id': conversation_id,
|
||||||
'title': title
|
'title': title
|
||||||
}, room=request.sid)
|
}, room=request.sid)
|
||||||
|
|
||||||
client_sid = request.sid
|
client_sid = request.sid
|
||||||
|
|
||||||
def send_to_client(event_type, data):
|
def send_to_client(event_type, data):
|
||||||
"""发送消息到客户端"""
|
"""发送消息到客户端"""
|
||||||
socketio.emit(event_type, data, room=client_sid)
|
socketio.emit(event_type, data, room=client_sid)
|
||||||
|
|
||||||
# 模型活动事件:用于刷新“在线”心跳(回复/工具调用都算活动)
|
# 模型活动事件:用于刷新"在线"心跳(回复/工具调用都算活动)
|
||||||
activity_events = {
|
activity_events = {
|
||||||
'ai_message_start', 'thinking_start', 'thinking_chunk', 'thinking_end',
|
'ai_message_start', 'thinking_start', 'thinking_chunk', 'thinking_end',
|
||||||
'text_start', 'text_chunk', 'text_end',
|
'text_start', 'text_chunk', 'text_end',
|
||||||
|
|||||||
@ -1,4 +1,21 @@
|
|||||||
// @ts-nocheck
|
// @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 { io as createSocketClient } from 'socket.io-client';
|
||||||
import { renderLatexInRealtime } from './useMarkdownRenderer';
|
import { renderLatexInRealtime } from './useMarkdownRenderer';
|
||||||
|
|
||||||
@ -901,50 +918,13 @@ export async function initializeLegacySocket(ctx: any) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// AI消息开始
|
// AI消息开始(已废弃,改用 REST API 轮询)
|
||||||
ctx.socket.on('ai_message_start', () => {
|
ctx.socket.on('ai_message_start', () => {
|
||||||
// 轮询模式下跳过 WebSocket 事件
|
// 只处理子智能体模式
|
||||||
if (ctx.usePollingMode && !ctx.waitingForSubAgent) {
|
if (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 标志');
|
|
||||||
ctx.waitingForSubAgent = false;
|
ctx.waitingForSubAgent = false;
|
||||||
ctx.taskInProgress = 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