deepresearch/所有文件/websocket.py
2025-07-02 15:35:36 +08:00

141 lines
4.9 KiB
Python

"""
WebSocket事件处理
实时推送研究进度
"""
from flask_socketio import emit, join_room, leave_room
from flask import request
import logging
logger = logging.getLogger(__name__)
def register_handlers(socketio):
"""注册WebSocket事件处理器"""
@socketio.on('connect')
def handle_connect():
"""客户端连接"""
client_id = request.sid
logger.info(f"客户端连接: {client_id}")
emit('connected', {'message': '连接成功', 'client_id': client_id})
@socketio.on('disconnect')
def handle_disconnect():
"""客户端断开"""
client_id = request.sid
logger.info(f"客户端断开: {client_id}")
@socketio.on('join_session')
def handle_join_session(data):
"""加入研究会话房间"""
session_id = data.get('session_id')
if session_id:
join_room(session_id)
logger.info(f"客户端 {request.sid} 加入房间 {session_id}")
emit('joined', {'session_id': session_id, 'message': '已加入研究会话'})
@socketio.on('leave_session')
def handle_leave_session(data):
"""离开研究会话房间"""
session_id = data.get('session_id')
if session_id:
leave_room(session_id)
logger.info(f"客户端 {request.sid} 离开房间 {session_id}")
emit('left', {'session_id': session_id, 'message': '已离开研究会话'})
# 以下是推送给客户端的事件(由任务调用)
@socketio.on('research_progress')
def broadcast_progress(data):
"""广播研究进度"""
session_id = data.get('session_id')
if session_id:
socketio.emit('progress_update', data, room=session_id)
@socketio.on('research_status_change')
def broadcast_status_change(data):
"""广播状态变化"""
session_id = data.get('session_id')
if session_id:
socketio.emit('status_changed', data, room=session_id)
@socketio.on('subtopic_update')
def broadcast_subtopic_update(data):
"""广播子主题更新"""
session_id = data.get('session_id')
if session_id:
socketio.emit('subtopic_updated', data, room=session_id)
@socketio.on('search_result')
def broadcast_search_result(data):
"""广播搜索结果"""
session_id = data.get('session_id')
if session_id:
socketio.emit('new_search_result', data, room=session_id)
@socketio.on('report_ready')
def broadcast_report_ready(data):
"""广播报告就绪"""
session_id = data.get('session_id')
if session_id:
socketio.emit('report_available', data, room=session_id)
@socketio.on('error_occurred')
def broadcast_error(data):
"""广播错误信息"""
session_id = data.get('session_id')
if session_id:
socketio.emit('research_error', data, room=session_id)
def emit_progress(socketio, session_id: str, progress_data: dict):
"""发送进度更新(供任务调用)"""
socketio.emit('progress_update', {
'session_id': session_id,
**progress_data
}, room=session_id)
def emit_status_change(socketio, session_id: str, status: str, phase: str = None):
"""发送状态变化(供任务调用)"""
data = {
'session_id': session_id,
'status': status
}
if phase:
data['phase'] = phase
socketio.emit('status_changed', data, room=session_id)
def emit_subtopic_progress(socketio, session_id: str, subtopic_id: str,
progress: float, status: str):
"""发送子主题进度(供任务调用)"""
socketio.emit('subtopic_updated', {
'session_id': session_id,
'subtopic_id': subtopic_id,
'progress': progress,
'status': status
}, room=session_id)
def emit_search_complete(socketio, session_id: str, subtopic_id: str,
search_count: int, results_count: int):
"""发送搜索完成通知(供任务调用)"""
socketio.emit('search_completed', {
'session_id': session_id,
'subtopic_id': subtopic_id,
'search_count': search_count,
'results_count': results_count
}, room=session_id)
def emit_report_ready(socketio, session_id: str, report_type: str):
"""发送报告就绪通知(供任务调用)"""
socketio.emit('report_available', {
'session_id': session_id,
'report_type': report_type,
'message': f'{report_type}报告已生成'
}, room=session_id)
def emit_error(socketio, session_id: str, error_message: str, error_type: str = 'general'):
"""发送错误通知(供任务调用)"""
socketio.emit('research_error', {
'session_id': session_id,
'error_type': error_type,
'error_message': error_message
}, room=session_id)