diff --git a/src/services/ccrRelayService.js b/src/services/ccrRelayService.js index 2f812ad9..3b48f9e9 100644 --- a/src/services/ccrRelayService.js +++ b/src/services/ccrRelayService.js @@ -478,7 +478,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 9b539b8c..6280c57c 100644 --- a/src/services/claudeConsoleRelayService.js +++ b/src/services/claudeConsoleRelayService.js @@ -659,10 +659,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 48b22413..a0366b40 100644 --- a/src/services/claudeRelayService.js +++ b/src/services/claudeRelayService.js @@ -1452,7 +1452,12 @@ class ClaudeRelayService { } ) } 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) {