fix(assistant): 连续错误自动熔断,避免无限重试循环 (#226)

在路径拦截 + sanitize 的基础上再加一道保险:用户粘贴的不只是
markdown 本地图片、而是其他 API 不接受的内容时(如意外内容格式、
鉴权失败、quota 耗尽),单纯清洗无法解决,用户反复点"重试"会陷
入同样的错误循环。

熔断机制:
- 2 分钟滑动窗口内,同一错误指纹累计 ≥3 次触发熔断
- 错误指纹归一化:去掉数字(时间戳/请求 ID)、URL、多余空白,
  只对比核心语义
- 熔断状态下重试按钮禁用 + 警告色样式,hint 文案改为"请先检查
  API 配置或网络",点击后 toast 提示而非触发重试
- 自动恢复:修改配置(saveConfig)或新建会话(createSession)时
  调用 resetCircuit() 清空失败历史

UI 共用:抽出 createRetryBar(session, circuitOpen) 供 sendMessageDirect
和 retryAIResponse 两处复用,消除原本重复的 30 行错误处理代码。
新增 .ast-retry-bar-circuit CSS 变体(warning 色 + 禁用态)。

翻译键(11 语言):
- retryCircuitHint — 熔断状态下的重试栏 hint
- retryCircuitBlocked — 点击已禁用重试按钮时的 toast

Refs: #226
This commit is contained in:
晴天
2026-04-20 03:25:40 +08:00
parent 3a4566d26a
commit 58f5525445
3 changed files with 131 additions and 49 deletions

View File

@@ -1180,6 +1180,25 @@
font-size: 11px;
color: var(--text-tertiary);
margin-left: auto;
display: inline-flex;
align-items: center;
gap: 4px;
}
/* 熔断状态连续错误时的警告变体Fix #226 */
.ast-retry-bar-circuit {
background: color-mix(in srgb, var(--warning, #f59e0b) 10%, var(--bg-secondary));
border-color: var(--warning, #f59e0b);
}
.ast-retry-bar-circuit .ast-retry-hint {
color: var(--warning, #f59e0b);
font-weight: 500;
}
.ast-retry-bar-circuit .ast-btn-retry[disabled] {
opacity: 0.5;
cursor: not-allowed;
}
.ast-retry-bar-circuit .ast-btn-retry[disabled]:hover {
filter: none;
}
/* 发送队列 */