冯杨

测试文件提交

@@ -26,14 +26,14 @@ class WebSocketSession: @@ -26,14 +26,14 @@ class WebSocketSession:
26 self.metadata = {} 26 self.metadata = {}
27 27
28 def __eq__(self, other): 28 def __eq__(self, other):
29 - """基于websocket对象判断会话是否相等""" 29 + """基于session_id判断会话是否相等"""
30 if not isinstance(other, WebSocketSession): 30 if not isinstance(other, WebSocketSession):
31 return False 31 return False
32 - return self.websocket is other.websocket 32 + return self.session_id == other.session_id
33 33
34 def __hash__(self): 34 def __hash__(self):
35 - """基于websocket对象的id生成哈希值"""  
36 - return hash(id(self.websocket)) 35 + """基于session_id生成哈希值"""
  36 + return hash(self.session_id)
37 37
38 def is_alive(self) -> bool: 38 def is_alive(self) -> bool:
39 """检查连接是否存活""" 39 """检查连接是否存活"""
@@ -86,7 +86,7 @@ class UnifiedWebSocketManager: @@ -86,7 +86,7 @@ class UnifiedWebSocketManager:
86 """统一WebSocket管理器""" 86 """统一WebSocket管理器"""
87 87
88 def __init__(self): 88 def __init__(self):
89 - self._sessions: Dict[str, Set[WebSocketSession]] = {} # session_id -> WebSocketSession集合 89 + self._sessions: Dict[str, WebSocketSession] = {} # session_id -> WebSocketSession (单连接)
90 self._websockets: Dict[web.WebSocketResponse, WebSocketSession] = {} # websocket -> session映射 90 self._websockets: Dict[web.WebSocketResponse, WebSocketSession] = {} # websocket -> session映射
91 self._message_handlers: Dict[str, Callable] = {} # 消息类型处理器 91 self._message_handlers: Dict[str, Callable] = {} # 消息类型处理器
92 self._event_handlers: Dict[str, List[Callable]] = {} # 事件处理器 92 self._event_handlers: Dict[str, List[Callable]] = {} # 事件处理器
@@ -121,7 +121,7 @@ class UnifiedWebSocketManager: @@ -121,7 +121,7 @@ class UnifiedWebSocketManager:
121 logger.error(f'事件处理器执行失败 {event_type}: {e}') 121 logger.error(f'事件处理器执行失败 {event_type}: {e}')
122 122
123 def add_session(self, session_id: str, websocket: web.WebSocketResponse) -> WebSocketSession: 123 def add_session(self, session_id: str, websocket: web.WebSocketResponse) -> WebSocketSession:
124 - """添加WebSocket会话""" 124 + """添加WebSocket会话 - 单连接模式,新连接会替换旧连接"""
125 with self._lock: 125 with self._lock:
126 # 检查是否已存在相同的websocket连接 126 # 检查是否已存在相同的websocket连接
127 if websocket in self._websockets: 127 if websocket in self._websockets:
@@ -131,22 +131,25 @@ class UnifiedWebSocketManager: @@ -131,22 +131,25 @@ class UnifiedWebSocketManager:
131 131
132 session = WebSocketSession(session_id, websocket) 132 session = WebSocketSession(session_id, websocket)
133 133
134 - # 初始化会话集合  
135 - if session_id not in self._sessions:  
136 - self._sessions[session_id] = set()  
137 -  
138 - # 检查Set添加前后的大小变化  
139 - before_count = len(self._sessions[session_id])  
140 - self._sessions[session_id].add(session)  
141 - after_count = len(self._sessions[session_id]) 134 + # 如果已存在该session_id的连接,先清理旧连接
  135 + if session_id in self._sessions:
  136 + old_session = self._sessions[session_id]
  137 + # 从websockets映射中移除旧连接
  138 + if old_session.websocket in self._websockets:
  139 + del self._websockets[old_session.websocket]
  140 + # 尝试关闭旧连接
  141 + try:
  142 + if not old_session.websocket.closed:
  143 + asyncio.create_task(old_session.websocket.close())
  144 + logger.info(f"[Session:{session_id}] 已关闭旧连接")
  145 + except Exception as e:
  146 + logger.warning(f"[Session:{session_id}] 关闭旧连接时出错: {e}")
142 147
  148 + # 添加新连接 (单连接模式)
  149 + self._sessions[session_id] = session
143 self._websockets[websocket] = session 150 self._websockets[websocket] = session
144 151
145 - logger.info(f'[Session:{session_id}] 添加WebSocket会话 (WebSocket={id(websocket)}), 连接数变化: {before_count} -> {after_count}')  
146 -  
147 - # 如果Set大小没有变化,说明可能存在重复  
148 - if before_count == after_count:  
149 - logger.warning(f'[Session:{session_id}] 检测到可能的重复会话添加!Set大小未变化') 152 + logger.info(f'[Session:{session_id}] 添加WebSocket会话 (单连接模式) (WebSocket={id(websocket)})')
150 153
151 return session 154 return session
152 155
@@ -157,11 +160,9 @@ class UnifiedWebSocketManager: @@ -157,11 +160,9 @@ class UnifiedWebSocketManager:
157 session = self._websockets[websocket] 160 session = self._websockets[websocket]
158 session_id = session.session_id 161 session_id = session.session_id
159 162
160 - # 从会话集合中移除  
161 - if session_id in self._sessions:  
162 - self._sessions[session_id].discard(session)  
163 - if not self._sessions[session_id]: # 如果集合为空,删除键  
164 - del self._sessions[session_id] 163 + # 从会话映射中移除(单连接模式)
  164 + if session_id in self._sessions and self._sessions[session_id] == session:
  165 + del self._sessions[session_id]
165 166
166 # 从websocket映射中移除 167 # 从websocket映射中移除
167 del self._websockets[websocket] 168 del self._websockets[websocket]
@@ -174,49 +175,57 @@ class UnifiedWebSocketManager: @@ -174,49 +175,57 @@ class UnifiedWebSocketManager:
174 """获取WebSocket会话""" 175 """获取WebSocket会话"""
175 return self._websockets.get(websocket) 176 return self._websockets.get(websocket)
176 177
177 - def get_sessions_by_id(self, session_id: str) -> Set[WebSocketSession]:  
178 - """根据会话ID获取所有WebSocket会话""" 178 + def get_sessions_by_id(self, session_id: str) -> Optional[WebSocketSession]:
  179 + """根据会话ID获取WebSocket会话(单连接模式)"""
179 with self._lock: 180 with self._lock:
180 # 尝试使用原始session_id查找 181 # 尝试使用原始session_id查找
181 - sessions = self._sessions.get(session_id, set())  
182 - if sessions:  
183 - return sessions.copy() 182 + session = self._sessions.get(session_id)
  183 + if session:
  184 + return session
184 185
185 # 如果是字符串类型但存储的是整数类型,尝试转换 186 # 如果是字符串类型但存储的是整数类型,尝试转换
186 if isinstance(session_id, str) and session_id.isdigit(): 187 if isinstance(session_id, str) and session_id.isdigit():
187 int_session_id = int(session_id) 188 int_session_id = int(session_id)
188 - sessions = self._sessions.get(int_session_id, set())  
189 - if sessions:  
190 - return sessions.copy() 189 + session = self._sessions.get(int_session_id)
  190 + if session:
  191 + return session
191 192
192 # 如果是整数类型但存储的是字符串类型,尝试转换 193 # 如果是整数类型但存储的是字符串类型,尝试转换
193 elif isinstance(session_id, int): 194 elif isinstance(session_id, int):
194 str_session_id = str(session_id) 195 str_session_id = str(session_id)
195 - sessions = self._sessions.get(str_session_id, set())  
196 - if sessions:  
197 - return sessions.copy() 196 + session = self._sessions.get(str_session_id)
  197 + if session:
  198 + return session
198 199
199 - return set() 200 + return None
200 201
201 def _update_session_id(self, websocket: web.WebSocketResponse, old_session_id: str, new_session_id: str): 202 def _update_session_id(self, websocket: web.WebSocketResponse, old_session_id: str, new_session_id: str):
202 - """更新WebSocket会话的session_id""" 203 + """更新WebSocket会话的session_id(单连接模式)"""
203 with self._lock: 204 with self._lock:
204 if websocket in self._websockets: 205 if websocket in self._websockets:
205 session = self._websockets[websocket] 206 session = self._websockets[websocket]
206 207
207 - # 从旧的session_id集合中移除  
208 - if old_session_id in self._sessions:  
209 - self._sessions[old_session_id].discard(session)  
210 - if not self._sessions[old_session_id]: # 如果集合为空,删除键  
211 - del self._sessions[old_session_id] 208 + # 从旧的session_id映射中移除(只有当前session匹配时)
  209 + if old_session_id in self._sessions and self._sessions[old_session_id] == session:
  210 + del self._sessions[old_session_id]
212 211
213 # 更新session的session_id 212 # 更新session的session_id
214 session.session_id = new_session_id 213 session.session_id = new_session_id
215 214
216 - # 添加到新的session_id集合  
217 - if new_session_id not in self._sessions:  
218 - self._sessions[new_session_id] = set()  
219 - self._sessions[new_session_id].add(session) 215 + # 如果新session_id已存在,先清理旧连接
  216 + if new_session_id in self._sessions:
  217 + old_session = self._sessions[new_session_id]
  218 + if old_session.websocket in self._websockets:
  219 + del self._websockets[old_session.websocket]
  220 + try:
  221 + if not old_session.websocket.closed:
  222 + asyncio.create_task(old_session.websocket.close())
  223 + logger.info(f"[Session:{new_session_id}] 更新时关闭旧连接")
  224 + except Exception as e:
  225 + logger.warning(f"[Session:{new_session_id}] 更新时关闭旧连接出错: {e}")
  226 +
  227 + # 添加到新的session_id映射(单连接模式)
  228 + self._sessions[new_session_id] = session
220 229
221 logger.info(f'[Session] 更新会话ID: {old_session_id} -> {new_session_id}') 230 logger.info(f'[Session] 更新会话ID: {old_session_id} -> {new_session_id}')
222 return True 231 return True
@@ -225,39 +234,32 @@ class UnifiedWebSocketManager: @@ -225,39 +234,32 @@ class UnifiedWebSocketManager:
225 async def broadcast_raw_message_to_session(self, session_id: str, message: Dict,source: str = "原数据") -> int: 234 async def broadcast_raw_message_to_session(self, session_id: str, message: Dict,source: str = "原数据") -> int:
226 """直接广播原始消息到指定会话的所有WebSocket连接""" 235 """直接广播原始消息到指定会话的所有WebSocket连接"""
227 # 确保session_id为字符串类型,保持一致性 236 # 确保session_id为字符串类型,保持一致性
228 - # 确保session_id为字符串类型,保持一致性  
229 if isinstance(session_id, int): 237 if isinstance(session_id, int):
230 session_id = str(session_id) 238 session_id = str(session_id)
231 elif not isinstance(session_id, str): 239 elif not isinstance(session_id, str):
232 session_id = str(session_id) 240 session_id = str(session_id)
233 241
234 - sessions = self.get_sessions_by_id(session_id)  
235 - if not sessions: 242 + session = self.get_sessions_by_id(session_id)
  243 + if not session:
236 logger.warning(f'[Session:{session_id}] 没有找到WebSocket连接') 244 logger.warning(f'[Session:{session_id}] 没有找到WebSocket连接')
237 return 0 245 return 0
238 246
239 # 详细调试日志:显示会话详情 247 # 详细调试日志:显示会话详情
240 - logger.info(f'[Session:{session_id}] 开始广播消息,找到 {len(sessions)} 个连接')  
241 - for i, session in enumerate(sessions):  
242 - logger.info(f'[Session:{session_id}] 连接{i+1}: WebSocket={id(session.websocket)}, 创建时间={session.created_at}, 存活状态={session.is_alive()}') 248 + logger.info(f'[Session:{session_id}] 开始广播消息,找到 1 个连接')
  249 + logger.info(f'[Session:{session_id}] 连接: WebSocket={id(session.websocket)}, 创建时间={session.created_at}, 存活状态={session.is_alive()}')
243 250
244 success_count = 0 251 success_count = 0
245 - failed_sessions = []  
246 -  
247 - for i, session in enumerate(sessions):  
248 - logger.info(f'[Session:{session_id}] 正在向连接{i+1}发送消息 (WebSocket={id(session.websocket)})')  
249 - if await session.send_message(message):  
250 - success_count += 1  
251 - logger.info(f'[Session:{session_id}] 连接{i+1}发送成功')  
252 - else:  
253 - failed_sessions.append(session)  
254 - logger.warning(f'[Session:{session_id}] 连接{i+1}发送失败')  
255 -  
256 - # 清理失败的连接  
257 - for session in failed_sessions: 252 +
  253 + logger.info(f'[Session:{session_id}] 正在发送消息 (WebSocket={id(session.websocket)})')
  254 + if await session.send_message(message):
  255 + success_count = 1
  256 + logger.info(f'[Session:{session_id}] 发送成功')
  257 + else:
  258 + logger.warning(f'[Session:{session_id}] 发送失败')
  259 + # 清理失败的连接
258 self.remove_session(session.websocket) 260 self.remove_session(session.websocket)
259 261
260 - logger.info(f'[Session:{session_id}] 广播原始消息完成: 成功{success_count}/总计{len(sessions)}, 失败{len(failed_sessions)}') 262 + logger.info(f'[Session:{session_id}] 广播原始消息完成: 成功{success_count}/总计1')
261 return success_count 263 return success_count
262 264
263 async def broadcast_to_session(self, session_id: str, message_type: str, content: Any, 265 async def broadcast_to_session(self, session_id: str, message_type: str, content: Any,
@@ -269,11 +271,16 @@ class UnifiedWebSocketManager: @@ -269,11 +271,16 @@ class UnifiedWebSocketManager:
269 elif not isinstance(session_id, str): 271 elif not isinstance(session_id, str):
270 session_id = str(session_id) 272 session_id = str(session_id)
271 273
272 - sessions = self.get_sessions_by_id(session_id)  
273 - if not sessions: 274 + session = self.get_sessions_by_id(session_id)
  275 + if not session:
274 logger.warning(f'[Session:{session_id}] 没有找到WebSocket连接') 276 logger.warning(f'[Session:{session_id}] 没有找到WebSocket连接')
275 return 0 277 return 0
  278 +
  279 + # 详细调试日志:显示会话详情
  280 + logger.info(f'[Session:{session_id}] 开始广播消息,找到 1 个连接')
  281 + logger.info(f'[Session:{session_id}] 连接: WebSocket={id(session.websocket)}, 创建时间={session.created_at}, 存活状态={session.is_alive()}')
276 282
  283 +
277 message = { 284 message = {
278 "type": message_type, 285 "type": message_type,
279 "session_id": session_id, 286 "session_id": session_id,
@@ -284,19 +291,17 @@ class UnifiedWebSocketManager: @@ -284,19 +291,17 @@ class UnifiedWebSocketManager:
284 } 291 }
285 292
286 success_count = 0 293 success_count = 0
287 - failed_sessions = []  
288 294
289 - for session in sessions:  
290 - if await session.send_message(message):  
291 - success_count += 1  
292 - else:  
293 - failed_sessions.append(session)  
294 -  
295 - # 清理失败的连接  
296 - for session in failed_sessions: 295 + logger.info(f'[Session:{session_id}] 正在发送消息 (WebSocket={id(session.websocket)})')
  296 + if await session.send_message(message):
  297 + success_count = 1
  298 + logger.info(f'[Session:{session_id}] 发送成功')
  299 + else:
  300 + logger.warning(f'[Session:{session_id}] 发送失败')
  301 + # 清理失败的连接
297 self.remove_session(session.websocket) 302 self.remove_session(session.websocket)
298 303
299 - logger.info(f'[Session:{session_id}] 广播消息成功: {success_count}/{len(sessions)}') 304 + logger.info(f'[Session:{session_id}] 广播原始消息完成: 成功{success_count}/总计1')
300 return success_count 305 return success_count
301 306
302 async def broadcast_to_all(self, message_type: str, content: Any, 307 async def broadcast_to_all(self, message_type: str, content: Any,
@@ -324,7 +329,7 @@ class UnifiedWebSocketManager: @@ -324,7 +329,7 @@ class UnifiedWebSocketManager:
324 return len(self._websockets) 329 return len(self._websockets)
325 330
326 def get_session_stats(self) -> Dict[str, Any]: 331 def get_session_stats(self) -> Dict[str, Any]:
327 - """获取会话统计信息""" 332 + """获取会话统计信息(单连接模式)"""
328 with self._lock: 333 with self._lock:
329 stats = { 334 stats = {
330 "total_sessions": len(self._sessions), 335 "total_sessions": len(self._sessions),
@@ -332,17 +337,15 @@ class UnifiedWebSocketManager: @@ -332,17 +337,15 @@ class UnifiedWebSocketManager:
332 "session_details": {} 337 "session_details": {}
333 } 338 }
334 339
335 - for session_id, sessions in self._sessions.items(): 340 + for session_id, session in self._sessions.items():
336 stats["session_details"][session_id] = { 341 stats["session_details"][session_id] = {
337 - "connection_count": len(sessions),  
338 - "connections": [  
339 - {  
340 - "created_at": session.created_at,  
341 - "last_ping": session.last_ping,  
342 - "is_alive": session.is_alive(),  
343 - "metadata": session.metadata  
344 - } for session in sessions  
345 - ] 342 + "connection_count": 1, # 单连接模式固定为1
  343 + "connection": {
  344 + "created_at": session.created_at,
  345 + "last_ping": session.last_ping,
  346 + "is_alive": session.is_alive(),
  347 + "metadata": session.metadata
  348 + }
346 } 349 }
347 350
348 return stats 351 return stats
@@ -69,6 +69,8 @@ class WebSocketRouter: @@ -69,6 +69,8 @@ class WebSocketRouter:
69 digital_human_service = get_digital_human_service() 69 digital_human_service = get_digital_human_service()
70 self.service_registry.register_service(digital_human_service) 70 self.service_registry.register_service(digital_human_service)
71 71
  72 +
  73 +
72 # 注册WSA服务 74 # 注册WSA服务
73 from .wsa_websocket_service import WSAWebSocketService, initialize_wsa_service 75 from .wsa_websocket_service import WSAWebSocketService, initialize_wsa_service
74 wsa_service = WSAWebSocketService(self.manager) 76 wsa_service = WSAWebSocketService(self.manager)
@@ -157,7 +159,7 @@ class WebSocketRouter: @@ -157,7 +159,7 @@ class WebSocketRouter:
157 digital_human_service = self.service_registry.get_service("digital_human_service") 159 digital_human_service = self.service_registry.get_service("digital_human_service")
158 if digital_human_service: 160 if digital_human_service:
159 stats["digital_human_stats"] = digital_human_service.get_digital_human_stats() 161 stats["digital_human_stats"] = digital_human_service.get_digital_human_stats()
160 - 162 +
161 return stats 163 return stats
162 164
163 def setup_routes(self, app: web.Application, path: str = '/ws'): 165 def setup_routes(self, app: web.Application, path: str = '/ws'):
@@ -1541,7 +1541,21 @@ @@ -1541,7 +1541,21 @@
1541 // 获取选择的消息类型,默认为chat 1541 // 获取选择的消息类型,默认为chat
1542 var messageType = document.getElementById('message-type') ? document.getElementById('message-type').value : 'chat'; 1542 var messageType = document.getElementById('message-type') ? document.getElementById('message-type').value : 'chat';
1543 1543
1544 - // 发送消息到服务器,不再直接添加到界面,等待WebSocket推送 1544 + // // 立即将用户消息显示在对话框右侧
  1545 + // var senderLabel = '用户';
  1546 + // var messageMode = 'text';
  1547 + // if (messageType === 'chat') {
  1548 + // senderLabel = '用户';
  1549 + // messageMode = 'chat';
  1550 + // } else if (messageType === 'echo') {
  1551 + // senderLabel = '用户';
  1552 + // messageMode = 'echo';
  1553 + // }
  1554 +
  1555 + // // 添加用户消息到界面
  1556 + // addMessage(message, 'right', senderLabel, messageMode, '', 'web');
  1557 +
  1558 + // 发送消息到服务器
1545 var requestData = { 1559 var requestData = {
1546 text: message, 1560 text: message,
1547 type: messageType, 1561 type: messageType,
@@ -1591,6 +1605,7 @@ @@ -1591,6 +1605,7 @@
1591 $('#clear-storage').click(function() { 1605 $('#clear-storage').click(function() {
1592 if (confirm('确定要清理所有本地聊天记录吗?此操作不可恢复!')) { 1606 if (confirm('确定要清理所有本地聊天记录吗?此操作不可恢复!')) {
1593 ChatStorage.clearStorage(); 1607 ChatStorage.clearStorage();
  1608 + localStorage.removeItem('chatHistory');
1594 const chatMessages = document.getElementById("chatMessages"); 1609 const chatMessages = document.getElementById("chatMessages");
1595 if (chatMessages) { 1610 if (chatMessages) {
1596 chatMessages.innerHTML = ''; 1611 chatMessages.innerHTML = '';
@@ -2030,17 +2045,6 @@ @@ -2030,17 +2045,6 @@
2030 saveChatHistory(); 2045 saveChatHistory();
2031 } 2046 }
2032 2047
2033 - // 清空聊天记录函数  
2034 - function clearChatHistory() {  
2035 - const chatMessages = document.getElementById("chatMessages");  
2036 - if (chatMessages) {  
2037 - chatMessages.innerHTML = "";  
2038 - }  
2039 - // 清理新的ChatStorage数据  
2040 - ChatStorage.clearStorage();  
2041 - // 兼容清理旧的localStorage项  
2042 - localStorage.removeItem('chatHistory');  
2043 - }  
2044 2048
2045 // 切换对话框显示/隐藏 2049 // 切换对话框显示/隐藏
2046 function toggleChatOverlay() { 2050 function toggleChatOverlay() {
@@ -2380,6 +2384,7 @@ @@ -2380,6 +2384,7 @@
2380 if (messageData.type === 'login_success') { 2384 if (messageData.type === 'login_success') {
2381 console.log('WebSocket登录成功:', messageData.message); 2385 console.log('WebSocket登录成功:', messageData.message);
2382 console.log('登录成功的sessionid:', messageData.sessionid); 2386 console.log('登录成功的sessionid:', messageData.sessionid);
  2387 +
2383 updateConnectionStatus('connected', `聊天服务器已连接 (会话ID: ${messageData.sessionid || document.getElementById('sessionid').value})`); 2388 updateConnectionStatus('connected', `聊天服务器已连接 (会话ID: ${messageData.sessionid || document.getElementById('sessionid').value})`);
2384 return; 2389 return;
2385 } 2390 }
@@ -2387,6 +2392,11 @@ @@ -2387,6 +2392,11 @@
2387 // 处理心跳响应 2392 // 处理心跳响应
2388 if (messageData.type === 'pong') { 2393 if (messageData.type === 'pong') {
2389 console.log('收到心跳响应'); 2394 console.log('收到心跳响应');
  2395 + // 心跳正常时确保连接状态显示为已连接
  2396 + var currentSessionId = document.getElementById('sessionid').value;
  2397 + if (currentSessionId && parseInt(currentSessionId) !== 0) {
  2398 + updateConnectionStatus('connected', `聊天服务器已连接 (会话ID: ${currentSessionId})`);
  2399 + }
2390 return; 2400 return;
2391 } 2401 }
2392 2402
@@ -2394,14 +2404,32 @@ @@ -2394,14 +2404,32 @@
2394 if (messageData.type === 'chat_message') { 2404 if (messageData.type === 'chat_message') {
2395 console.log('收到聊天消息:', messageData); 2405 console.log('收到聊天消息:', messageData);
2396 2406
2397 - var messageContent = messageData.content || messageData.message || messageData.text || '';  
2398 - var messageType = messageData.message_type || 'text';  
2399 - var sender = messageData.sender || 'unknown'; 2407 + // 正确解析嵌套的content对象
  2408 + var contentObj = messageData.content || {};
  2409 + var messageContent = '';
  2410 + var messageType = 'text';
  2411 + var sender = 'unknown';
2400 var sessionId = messageData.session_id; 2412 var sessionId = messageData.session_id;
2401 - var modelInfo = messageData.model_info || '';  
2402 - var requestSource = messageData.request_source || ''; 2413 + var modelInfo = '';
  2414 + var requestSource = '';
2403 var timestamp = messageData.timestamp || new Date().toISOString(); 2415 var timestamp = messageData.timestamp || new Date().toISOString();
2404 2416
  2417 + // 如果content是对象,从中提取字段
  2418 + if (typeof contentObj === 'object' && contentObj !== null) {
  2419 + messageContent = contentObj.content || contentObj.message || contentObj.text || '';
  2420 + messageType = contentObj.message_type || 'text';
  2421 + sender = contentObj.source || messageData.sender || 'unknown';
  2422 + modelInfo = contentObj.model_info || '';
  2423 + requestSource = contentObj.request_source || '';
  2424 + } else {
  2425 + // 如果content是字符串,直接使用
  2426 + messageContent = contentObj || messageData.message || messageData.text || '';
  2427 + messageType = messageData.message_type || 'text';
  2428 + sender = messageData.sender || 'unknown';
  2429 + modelInfo = messageData.model_info || '';
  2430 + requestSource = messageData.request_source || '';
  2431 + }
  2432 +
2405 // 判断消息方向和样式 2433 // 判断消息方向和样式
2406 var alignment = 'left'; 2434 var alignment = 'left';
2407 var senderLabel = '数字人回复'; 2435 var senderLabel = '数字人回复';
@@ -2516,17 +2544,18 @@ @@ -2516,17 +2544,18 @@
2516 2544
2517 // 在连接关闭前发送WSA注销消息到主服务 2545 // 在连接关闭前发送WSA注销消息到主服务
2518 if (ws.readyState === WebSocket.OPEN) { 2546 if (ws.readyState === WebSocket.OPEN) {
2519 - try {  
2520 - var wsaUnregisterMessage = {  
2521 - type: 'wsa_unregister_web',  
2522 - username: getTemporaryUsername(),  
2523 - timestamp: Date.now()  
2524 - };  
2525 - console.log('发送WSA注销消息到主服务:', wsaUnregisterMessage);  
2526 - ws.send(JSON.stringify(wsaUnregisterMessage));  
2527 - } catch (error) {  
2528 - console.error('发送WSA注销消息失败:', error);  
2529 - } 2547 + // try {
  2548 + // var wsaUnregisterMessage = {
  2549 + // type: 'wsa_unregister_web',
  2550 + // username: getTemporaryUsername(),
  2551 + // timestamp: Date.now()
  2552 + // };
  2553 + // console.log('发送WSA注销消息到主服务:', wsaUnregisterMessage);
  2554 + // ws.send(JSON.stringify(wsaUnregisterMessage));
  2555 + // } catch (error) {
  2556 + // console.error('发送WSA注销消息失败:', error);
  2557 + // }
  2558 + console.debug('close触发:',Date.now());
2530 } 2559 }
2531 2560
2532 updateConnectionStatus('disconnected', 'WebSocket连接已断开,正在重连...'); 2561 updateConnectionStatus('disconnected', 'WebSocket连接已断开,正在重连...');