529 lines
13 KiB
Markdown
529 lines
13 KiB
Markdown
|
|
# 问题修复 - 重试失败日志增强 v3.12.6
|
|||
|
|
|
|||
|
|
**版本**: v3.12.6
|
|||
|
|
**日期**: 2025-10-08
|
|||
|
|
**类型**: 问题修复 / 日志增强
|
|||
|
|
|
|||
|
|
## 问题描述
|
|||
|
|
|
|||
|
|
用户反馈:
|
|||
|
|
|
|||
|
|
> "失败重试的时候,没有把上次运行失败的项添加进去"
|
|||
|
|
|
|||
|
|
**可能的问题**:
|
|||
|
|
1. 重试时没有正确筛选失败的Token
|
|||
|
|
2. 重试时执行了所有Token而不是只执行失败的
|
|||
|
|
3. 日志信息不够详细,无法确认哪些Token被重试
|
|||
|
|
|
|||
|
|
## 问题分析
|
|||
|
|
|
|||
|
|
### 当前的重试逻辑
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
const retryFailedTasks = async () => {
|
|||
|
|
// 获取所有失败的token ID
|
|||
|
|
const failedTokenIds = Object.keys(taskProgress.value).filter(
|
|||
|
|
tokenId => taskProgress.value[tokenId].status === 'failed'
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
if (failedTokenIds.length === 0) {
|
|||
|
|
console.warn('⚠️ 没有失败的任务需要重试')
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
console.log(`🔄 开始重试 ${failedTokenIds.length} 个失败的任务`)
|
|||
|
|
|
|||
|
|
// 使用当前模板的任务列表
|
|||
|
|
const tasks = currentTemplateTasks.value
|
|||
|
|
|
|||
|
|
// 执行失败的token(标记为重试)
|
|||
|
|
await startBatchExecution(failedTokenIds, tasks, true)
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**逻辑分析**:
|
|||
|
|
- ✅ 正确筛选了 `status === 'failed'` 的Token
|
|||
|
|
- ✅ 正确传递给 `startBatchExecution`
|
|||
|
|
- ❌ 日志信息不够详细,看不到具体哪些Token被重试
|
|||
|
|
|
|||
|
|
### 可能的问题场景
|
|||
|
|
|
|||
|
|
#### 场景1:页面刷新后重试
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. 执行批量任务,3个Token失败
|
|||
|
|
2. 用户刷新页面
|
|||
|
|
3. taskProgress 数据丢失(不是持久化存储)
|
|||
|
|
4. 点击"重试失败"按钮
|
|||
|
|
5. failedTokenIds 为空数组 []
|
|||
|
|
6. 提示"没有失败的任务需要重试"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 场景2:关闭进度显示后重试
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. 执行批量任务,3个Token失败
|
|||
|
|
2. 用户点击"关闭"按钮
|
|||
|
|
3. 进度面板隐藏
|
|||
|
|
4. taskProgress 仍然保留
|
|||
|
|
5. 点击"重试失败"按钮
|
|||
|
|
6. 应该能正常重试
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 场景3:日志信息不够清晰
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. 执行批量任务,3个Token失败
|
|||
|
|
2. 点击"重试失败"按钮
|
|||
|
|
3. 控制台只显示:"🔄 开始重试 3 个失败的任务"
|
|||
|
|
4. 看不到具体是哪3个Token
|
|||
|
|
5. 用户无法确认是否正确
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 解决方案
|
|||
|
|
|
|||
|
|
### 增强日志输出
|
|||
|
|
|
|||
|
|
添加详细的重试信息日志,让用户能清楚看到哪些Token被重试:
|
|||
|
|
|
|||
|
|
#### 修改前
|
|||
|
|
```javascript
|
|||
|
|
const retryFailedTasks = async () => {
|
|||
|
|
const failedTokenIds = Object.keys(taskProgress.value).filter(
|
|||
|
|
tokenId => taskProgress.value[tokenId].status === 'failed'
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
if (failedTokenIds.length === 0) {
|
|||
|
|
console.warn('⚠️ 没有失败的任务需要重试')
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
console.log(`🔄 开始重试 ${failedTokenIds.length} 个失败的任务`)
|
|||
|
|
|
|||
|
|
const tasks = currentTemplateTasks.value
|
|||
|
|
await startBatchExecution(failedTokenIds, tasks, true)
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 修改后
|
|||
|
|
```javascript
|
|||
|
|
const retryFailedTasks = async () => {
|
|||
|
|
// 获取所有失败的token ID
|
|||
|
|
const failedTokenIds = Object.keys(taskProgress.value).filter(
|
|||
|
|
tokenId => taskProgress.value[tokenId].status === 'failed'
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
if (failedTokenIds.length === 0) {
|
|||
|
|
console.warn('⚠️ 没有失败的任务需要重试')
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 🆕 详细的重试信息日志
|
|||
|
|
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`)
|
|||
|
|
console.log(`🔄 开始重试失败任务`)
|
|||
|
|
console.log(`📊 失败Token数量: ${failedTokenIds.length}`)
|
|||
|
|
console.log(`📋 失败Token列表:`, failedTokenIds)
|
|||
|
|
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`)
|
|||
|
|
|
|||
|
|
const tasks = currentTemplateTasks.value
|
|||
|
|
await startBatchExecution(failedTokenIds, tasks, true)
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 增强startBatchExecution的日志
|
|||
|
|
|
|||
|
|
在重试模式下,显示具体要执行的Token列表:
|
|||
|
|
|
|||
|
|
#### 修改前
|
|||
|
|
```javascript
|
|||
|
|
console.log(`🚀 开始批量执行任务${isRetry ? ' (重试)' : ''}`)
|
|||
|
|
console.log(`📋 Token数量: ${targetTokens.length}`)
|
|||
|
|
console.log(`📋 任务列表:`, targetTasks)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 修改后
|
|||
|
|
```javascript
|
|||
|
|
console.log(`🚀 开始批量执行任务${isRetry ? ' (重试)' : ''}`)
|
|||
|
|
console.log(`📋 Token数量: ${targetTokens.length}`)
|
|||
|
|
// 🆕 重试模式下显示Token列表
|
|||
|
|
if (isRetry) {
|
|||
|
|
console.log(`📋 重试Token列表:`, targetTokens)
|
|||
|
|
}
|
|||
|
|
console.log(`📋 任务列表:`, targetTasks)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 修改文件
|
|||
|
|
|
|||
|
|
### src/stores/batchTaskStore.js
|
|||
|
|
|
|||
|
|
**修改位置1**: Line 2053-2057 (retryFailedTasks)
|
|||
|
|
- 添加分隔线和详细的日志输出
|
|||
|
|
- 显示失败Token的数量和具体列表
|
|||
|
|
|
|||
|
|
**修改位置2**: Line 320-322 (startBatchExecution)
|
|||
|
|
- 在重试模式下显示Token列表
|
|||
|
|
|
|||
|
|
## 控制台输出效果
|
|||
|
|
|
|||
|
|
### 修改前
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
🔄 开始重试 3 个失败的任务
|
|||
|
|
🚀 开始批量执行任务 (重试)
|
|||
|
|
📋 Token数量: 3
|
|||
|
|
📋 任务列表: ['dailyFix', 'legionSignIn', ...]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 修改后
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|||
|
|
🔄 开始重试失败任务
|
|||
|
|
📊 失败Token数量: 3
|
|||
|
|
📋 失败Token列表: ['10601服-0-7145...', '10602服-1-7146...', '10603服-2-7147...']
|
|||
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|||
|
|
🚀 开始批量执行任务 (重试)
|
|||
|
|
📋 Token数量: 3
|
|||
|
|
📋 重试Token列表: ['10601服-0-7145...', '10602服-1-7146...', '10603服-2-7147...']
|
|||
|
|
📋 任务列表: ['dailyFix', 'legionSignIn', 'autoStudy', ...]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 诊断指南
|
|||
|
|
|
|||
|
|
### 如何确认重试功能是否正常工作?
|
|||
|
|
|
|||
|
|
#### 步骤1:执行批量任务
|
|||
|
|
|
|||
|
|
1. 开始执行批量任务
|
|||
|
|
2. 等待执行完成
|
|||
|
|
3. 观察统计信息:
|
|||
|
|
```
|
|||
|
|
成功: 97
|
|||
|
|
失败: 3
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 步骤2:点击"重试失败"按钮
|
|||
|
|
|
|||
|
|
1. 点击"重试失败 (3个)"按钮
|
|||
|
|
2. 打开浏览器控制台(F12)
|
|||
|
|
3. 观察日志输出
|
|||
|
|
|
|||
|
|
#### 步骤3:验证日志信息
|
|||
|
|
|
|||
|
|
**预期日志**:
|
|||
|
|
```
|
|||
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|||
|
|
🔄 开始重试失败任务
|
|||
|
|
📊 失败Token数量: 3
|
|||
|
|
📋 失败Token列表: ['Token1', 'Token2', 'Token3']
|
|||
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|||
|
|
🚀 开始批量执行任务 (重试)
|
|||
|
|
📋 Token数量: 3
|
|||
|
|
📋 重试Token列表: ['Token1', 'Token2', 'Token3']
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**验证要点**:
|
|||
|
|
- ✅ 失败Token数量 = 重试Token数量 = 3
|
|||
|
|
- ✅ 失败Token列表与重试Token列表一致
|
|||
|
|
- ✅ 只执行失败的3个Token,不执行成功的97个
|
|||
|
|
|
|||
|
|
### 常见问题诊断
|
|||
|
|
|
|||
|
|
#### 问题1:显示"没有失败的任务需要重试"
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
控制台输出:
|
|||
|
|
⚠️ 没有失败的任务需要重试
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**可能原因**:
|
|||
|
|
1. **页面已刷新**:taskProgress 数据丢失
|
|||
|
|
2. **已全部重试成功**:所有失败任务都已重试成功
|
|||
|
|
3. **进度数据被清空**:某个操作清空了 taskProgress
|
|||
|
|
|
|||
|
|
**解决方法**:
|
|||
|
|
- 重新执行批量任务
|
|||
|
|
- 不要刷新页面
|
|||
|
|
- 失败后立即重试
|
|||
|
|
|
|||
|
|
#### 问题2:重试的Token数量不对
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
预期:3个失败
|
|||
|
|
实际:重试了100个
|
|||
|
|
|
|||
|
|
控制台输出:
|
|||
|
|
📊 失败Token数量: 3
|
|||
|
|
📋 Token数量: 100 ← 数量不一致!
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**可能原因**:
|
|||
|
|
- 代码逻辑错误
|
|||
|
|
- targetTokens 被错误覆盖
|
|||
|
|
|
|||
|
|
**排查方法**:
|
|||
|
|
- 检查 `📋 重试Token列表` 是否正确
|
|||
|
|
- 检查是否有其他代码修改了 targetTokens
|
|||
|
|
|
|||
|
|
#### 问题3:重试后仍然失败
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
第1次执行:失败 3个
|
|||
|
|
重试:失败 3个(相同的Token)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**可能原因**:
|
|||
|
|
1. **错误原因未解决**:如未加入俱乐部
|
|||
|
|
2. **临时性错误**:网络问题、服务器繁忙
|
|||
|
|
3. **配置问题**:任务配置不正确
|
|||
|
|
|
|||
|
|
**解决方法**:
|
|||
|
|
- 检查失败的具体错误信息
|
|||
|
|
- 解决根本原因(如加入俱乐部)
|
|||
|
|
- 调整任务配置或参数
|
|||
|
|
|
|||
|
|
## 技术实现
|
|||
|
|
|
|||
|
|
### 重试流程
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
用户点击"重试失败"
|
|||
|
|
↓
|
|||
|
|
handleRetryFailed() (BatchTaskPanel.vue)
|
|||
|
|
↓
|
|||
|
|
batchStore.retryFailedTasks()
|
|||
|
|
↓
|
|||
|
|
筛选失败的Token: filter(status === 'failed')
|
|||
|
|
↓
|
|||
|
|
输出详细日志(新增)
|
|||
|
|
↓
|
|||
|
|
startBatchExecution(failedTokenIds, tasks, true)
|
|||
|
|
↓
|
|||
|
|
执行失败的Token
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 数据流
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
taskProgress = {
|
|||
|
|
'token1': { status: 'completed', ... },
|
|||
|
|
'token2': { status: 'failed', ... }, ← 筛选
|
|||
|
|
'token3': { status: 'completed', ... },
|
|||
|
|
'token4': { status: 'failed', ... }, ← 筛选
|
|||
|
|
'token5': { status: 'failed', ... }, ← 筛选
|
|||
|
|
}
|
|||
|
|
↓
|
|||
|
|
failedTokenIds = ['token2', 'token4', 'token5']
|
|||
|
|
↓
|
|||
|
|
startBatchExecution(failedTokenIds, tasks, true)
|
|||
|
|
↓
|
|||
|
|
只执行 token2, token4, token5
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 日志格式说明
|
|||
|
|
|
|||
|
|
**分隔线**:
|
|||
|
|
```
|
|||
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|||
|
|
```
|
|||
|
|
作用:区分不同的日志块,提高可读性
|
|||
|
|
|
|||
|
|
**信息格式**:
|
|||
|
|
```
|
|||
|
|
🔄 开始重试失败任务 ← 主标题
|
|||
|
|
📊 失败Token数量: 3 ← 统计信息
|
|||
|
|
📋 失败Token列表: [...] ← 详细列表
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 测试场景
|
|||
|
|
|
|||
|
|
### 场景1:正常重试
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
前置条件:
|
|||
|
|
- 执行100个Token
|
|||
|
|
- 3个失败,97个成功
|
|||
|
|
|
|||
|
|
操作:
|
|||
|
|
1. 点击"重试失败 (3个)"按钮
|
|||
|
|
|
|||
|
|
预期结果:
|
|||
|
|
控制台输出:
|
|||
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|||
|
|
🔄 开始重试失败任务
|
|||
|
|
📊 失败Token数量: 3
|
|||
|
|
📋 失败Token列表: ['Token2', 'Token4', 'Token5']
|
|||
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|||
|
|
🚀 开始批量执行任务 (重试)
|
|||
|
|
📋 Token数量: 3
|
|||
|
|
📋 重试Token列表: ['Token2', 'Token4', 'Token5']
|
|||
|
|
|
|||
|
|
验证:
|
|||
|
|
✅ 数量一致
|
|||
|
|
✅ Token列表一致
|
|||
|
|
✅ 只执行3个Token
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 场景2:无失败任务
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
前置条件:
|
|||
|
|
- 执行100个Token
|
|||
|
|
- 全部成功
|
|||
|
|
|
|||
|
|
操作:
|
|||
|
|
1. 点击"重试失败 (0个)"按钮(如果显示)
|
|||
|
|
|
|||
|
|
预期结果:
|
|||
|
|
⚠️ 没有失败的任务需要重试
|
|||
|
|
(或按钮禁用/隐藏)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 场景3:页面刷新后重试
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
前置条件:
|
|||
|
|
- 执行100个Token
|
|||
|
|
- 3个失败
|
|||
|
|
|
|||
|
|
操作:
|
|||
|
|
1. 刷新页面(F5)
|
|||
|
|
2. 尝试点击"重试失败"按钮
|
|||
|
|
|
|||
|
|
预期结果:
|
|||
|
|
⚠️ 没有失败的任务需要重试
|
|||
|
|
(taskProgress 数据丢失)
|
|||
|
|
|
|||
|
|
建议:
|
|||
|
|
添加持久化存储以支持刷新后重试
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 最佳实践
|
|||
|
|
|
|||
|
|
### 1. 重试前的检查
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// ✅ 好的做法:检查是否有失败的任务
|
|||
|
|
if (failedTokenIds.length === 0) {
|
|||
|
|
console.warn('⚠️ 没有失败的任务需要重试')
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ❌ 不好的做法:不检查直接执行
|
|||
|
|
await startBatchExecution(failedTokenIds, tasks, true)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 详细的日志输出
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// ✅ 好的做法:输出详细信息
|
|||
|
|
console.log(`📊 失败Token数量: ${failedTokenIds.length}`)
|
|||
|
|
console.log(`📋 失败Token列表:`, failedTokenIds)
|
|||
|
|
|
|||
|
|
// ❌ 不好的做法:只输出数量
|
|||
|
|
console.log(`重试 ${failedTokenIds.length} 个`)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 使用分隔线
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// ✅ 好的做法:使用分隔线区分日志块
|
|||
|
|
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`)
|
|||
|
|
console.log(`🔄 开始重试失败任务`)
|
|||
|
|
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`)
|
|||
|
|
|
|||
|
|
// ❌ 不好的做法:日志混在一起
|
|||
|
|
console.log(`🔄 开始重试失败任务`)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 未来改进
|
|||
|
|
|
|||
|
|
### 1. 持久化失败记录
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 将失败的Token保存到localStorage
|
|||
|
|
const saveFailedTokens = (failedTokenIds) => {
|
|||
|
|
localStorage.setItem('failedTokens', JSON.stringify({
|
|||
|
|
tokenIds: failedTokenIds,
|
|||
|
|
timestamp: Date.now()
|
|||
|
|
}))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 页面刷新后恢复失败记录
|
|||
|
|
const loadFailedTokens = () => {
|
|||
|
|
const saved = localStorage.getItem('failedTokens')
|
|||
|
|
if (saved) {
|
|||
|
|
const data = JSON.parse(saved)
|
|||
|
|
// 检查是否过期(如24小时)
|
|||
|
|
if (Date.now() - data.timestamp < 24 * 60 * 60 * 1000) {
|
|||
|
|
return data.tokenIds
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return []
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 失败原因分析
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 统计失败原因
|
|||
|
|
const failureReasons = failedTokenIds.map(tokenId => {
|
|||
|
|
const progress = taskProgress.value[tokenId]
|
|||
|
|
return {
|
|||
|
|
tokenId,
|
|||
|
|
error: progress.error,
|
|||
|
|
failedTasks: Object.keys(progress.result || {}).filter(
|
|||
|
|
taskId => !progress.result[taskId].success
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
console.log(`📊 失败原因统计:`, failureReasons)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 智能重试建议
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 分析失败原因并给出建议
|
|||
|
|
const analyzeFailures = (failedTokenIds) => {
|
|||
|
|
const clubErrors = failedTokenIds.filter(id =>
|
|||
|
|
taskProgress.value[id].error?.includes('未加入俱乐部')
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
if (clubErrors.length > 0) {
|
|||
|
|
console.warn(`⚠️ ${clubErrors.length} 个Token因未加入俱乐部失败`)
|
|||
|
|
console.log(`💡 建议:请先让这些账号加入俱乐部再重试`)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 相关版本
|
|||
|
|
|
|||
|
|
- **v3.7.0**: 首次添加自动重试功能
|
|||
|
|
- **v3.12.6**: 增强重试日志输出(本版本)
|
|||
|
|
|
|||
|
|
## 总结
|
|||
|
|
|
|||
|
|
**问题**:
|
|||
|
|
- ⚠️ 重试时日志信息不够详细
|
|||
|
|
- ⚠️ 无法确认哪些Token被重试
|
|||
|
|
- ⚠️ 难以诊断重试问题
|
|||
|
|
|
|||
|
|
**改进**:
|
|||
|
|
- ✅ 添加详细的重试信息日志
|
|||
|
|
- ✅ 显示失败Token数量和具体列表
|
|||
|
|
- ✅ 使用分隔线提高可读性
|
|||
|
|
- ✅ 重试模式下显示Token列表
|
|||
|
|
|
|||
|
|
**效果**:
|
|||
|
|
- ✅ 用户可以清楚看到哪些Token被重试
|
|||
|
|
- ✅ 便于验证重试功能是否正常工作
|
|||
|
|
- ✅ 便于诊断重试问题
|
|||
|
|
- ✅ 提高透明度和可信度
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**状态**: ✅ 已改进
|
|||
|
|
**版本**: v3.12.6
|
|||
|
|
|