diff --git a/src/services/ccrRelayService.js b/src/services/ccrRelayService.js index 5cd1a2a0..fb293ee5 100644 --- a/src/services/ccrRelayService.js +++ b/src/services/ccrRelayService.js @@ -448,7 +448,14 @@ class CcrRelayService { // 更新最后使用时间 await this._updateLastUsedTime(accountId) } catch (error) { - logger.error(`❌ CCR stream relay failed (Account: ${account?.name || accountId}):`, error) + // 客户端主动断开连接是正常情况,使用 INFO 级别 + if (error.message === 'Client disconnected') { + logger.info( + `🔌 CCR stream relay ended: Client disconnected (Account: ${account?.name || accountId})` + ) + } else { + logger.error(`❌ CCR stream relay failed (Account: ${account?.name || accountId}):`, error) + } throw error } finally { // 📬 释放用户消息队列锁 diff --git a/src/services/claudeConsoleRelayService.js b/src/services/claudeConsoleRelayService.js index c8c2c4b8..59e0ffe5 100644 --- a/src/services/claudeConsoleRelayService.js +++ b/src/services/claudeConsoleRelayService.js @@ -635,10 +635,17 @@ class ClaudeConsoleRelayService { // 更新最后使用时间 await this._updateLastUsedTime(accountId) } catch (error) { - logger.error( - `❌ Claude Console stream relay failed (Account: ${account?.name || accountId}):`, - error - ) + // 客户端主动断开连接是正常情况,使用 INFO 级别 + if (error.message === 'Client disconnected') { + logger.info( + `🔌 Claude Console stream relay ended: Client disconnected (Account: ${account?.name || accountId})` + ) + } else { + logger.error( + `❌ Claude Console stream relay failed (Account: ${account?.name || accountId}):`, + error + ) + } throw error } finally { // 🛑 清理租约刷新定时器 diff --git a/src/services/claudeRelayService.js b/src/services/claudeRelayService.js index 742372df..7f32c309 100644 --- a/src/services/claudeRelayService.js +++ b/src/services/claudeRelayService.js @@ -1428,7 +1428,12 @@ class ClaudeRelayService { isDedicatedOfficialAccount ) } catch (error) { - logger.error(`❌ Claude stream relay with usage capture failed:`, error) + // 客户端主动断开连接是正常情况,使用 INFO 级别 + if (error.message === 'Client disconnected') { + logger.info(`🔌 Claude stream relay ended: Client disconnected`) + } else { + logger.error(`❌ Claude stream relay with usage capture failed:`, error) + } throw error } finally { // 📬 释放用户消息队列锁 diff --git a/src/services/droidRelayService.js b/src/services/droidRelayService.js index 25909c4b..115be7d9 100644 --- a/src/services/droidRelayService.js +++ b/src/services/droidRelayService.js @@ -336,7 +336,12 @@ class DroidRelayService { ) } } catch (error) { - logger.error(`❌ Droid relay error: ${error.message}`, error) + // 客户端主动断开连接是正常情况,使用 INFO 级别 + if (error.message === 'Client disconnected') { + logger.info(`🔌 Droid relay ended: Client disconnected`) + } else { + logger.error(`❌ Droid relay error: ${error.message}`, error) + } const status = error?.response?.status if (status >= 400 && status < 500) {