feat: AI 调用稳定性增强(可重试错误分类 + 指数退避 + 修复链路错误透传)
- providers/base.ts 引入 ApiRequestError 与 isRetryableError,按 429/5xx/超时/网络错误/401 分类 - chatWithRetry 升级为最多 3 次指数退避(1s/2s/4s),非重试错误立即上抛;新增 setRetryBaseDelayForTest 钩子 - aiFixEngine/customFixEngine 不再吞错,修复失败原因透传为 ai-error: <原因> - 扩展 ai-empty-response/customFixEngine 测试覆盖重试与分类
This commit is contained in:
+3
-2
@@ -1,4 +1,4 @@
|
||||
# AI Usage Log
|
||||
# AI Usage Log
|
||||
| 日期时间 | 范式步骤 | 修改摘要 | 中间产物 | 涉及文件 | 使用模型 |
|
||||
|---------|---------|---------|---------|---------|---------|
|
||||
| 2026-07-10 18:10 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 | 编写代码审查插件设计文档(design spec) | design spec | docs/superpowers/specs/2026-07-10-code-reviewer-design.md | deepseek-v4-flash |
|
||||
@@ -237,4 +237,5 @@
|
||||
| 2026-08-27 22:32 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 生成 tests/coverage/ 测试覆盖率报告(成果物 04 缺失项):.vscode-test.mjs 加入 srcDir:src 与 coverage 配置(reporter text-summary+html,include out/src/**/*.js,exclude out/tests 与 out/src/types,仅统计测试触达模块);package.json 新增脚本 test:coverage(compile → compile:test → vscode-test --coverage --coverage-output tests/coverage)。实测 116 passing,覆盖率:行/语句 42.58%(4915/11541)、函数 34.08%、分支 73.37%,产出 tests/coverage/index.html + src 逐文件页(2.1MB),未被 gitignore 忽略可入库。验证:复跑两次结果一致(可复现),报告路径与文件齐全 | 中间产物:①reporter 初稿含 lcov,实测该版本 test-cli 未产出 lcov.info(仅 html/text-summary 生效),收敛为 ['text-summary','html'] 后复跑确认一致;②coverage 统计口径先考虑 includeAll:true(全量含 0% 模块),与用户确认后采用仅测试触达模块(默认 false);③vscode-test 首次运行自动下载 VS Code 1.135.0(319MB 缓存于 .vscode-test/,gitignore 已排除),二次复跑走缓存 | .vscode-test.mjs(更新) package.json(更新) tests/coverage/**(新建) | deepseek-v4-flash |
|
||||
| 2026-08-27 22:49 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 覆盖率补测扩展项(试点 3 项 + 扩展 5 项共 8 个新测试文件、63 条用例):tests/fix-prompt.test.ts(10)、registry.test.ts(7)、provider-chat.test.ts(11,mock global.fetch 测 OpenAI 兼容/Gemini/Claude 三协议 chat)、import-service.test.ts(7)、yaml-parser.test.ts(3)。其中 export-service 因依赖 vscode.window.showSaveDialog(UI 对话框无法在测试宿主 stub)替换为 yaml-parser(纯逻辑)。同步修复试点发现的 2 处源码缺陷:method-extractor fallback java 正则取错捕获组(match[1]→match[2] ?? match[1])、mockDocument.getText 忽略 range 参数(改为按 range 切片)。实测 179 passing / 行覆盖率 42.58%→48.24%(+5.66,分支 77.97%、函数 43.66%),覆盖率报告刷新 tests/coverage/;更新 tests/test-cases.md(16 文件 116 条 → 24 文件 179 条)与 tests/test-execution-log.md(新增覆盖率执行记录段)。验证:npm run test:coverage 全绿(Exit 0) | 中间产物:①扩展清单原含 export-service,读源码确认依赖 showSaveDialog 无法 stub,改用 yaml-parser 并在日志注明;②import-service 断言初稿断言 duplicateOf 不出现在输出,实际注释掉的行仍含原文,改为断言重复元数据仅以 # 注释形式出现;③fix-prompt 边界测试初稿断言末行为 3| c,实际代码含尾部空行,改为断言整个输出含 3| c;④mockDocument 重构为命名函数 offsetAt/positionAt 供 getText(range) 复用(对象内无法互相引用属性) | tests/jsp-extractor.test.ts(新建) tests/report.test.ts(新建) tests/method-extractor.test.ts(新建) tests/fix-prompt.test.ts(新建) tests/registry.test.ts(新建) tests/provider-chat.test.ts(新建) tests/import-service.test.ts(新建) tests/yaml-parser.test.ts(新建) src/scope/method-extractor.ts(修复) src/utils/mockDocument.ts(修复) tests/coverage/**(刷新) tests/test-cases.md(更新) tests/test-execution-log.md(更新) | deepseek-v4-flash |
|
||||
| 2026-08-29 11:03 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 修复审查面板「重新审核」按钮失效:面板聚焦时 activeTextEditor 为空导致报「请先打开一个文件」。webview handleMessage 的 case 'rerun' 改为携带 currentReport.filePath;codeReviewer.review 命令改为按 activeTextEditor.document → workspace.textDocuments 匹配 fsPath → openTextDocument 三级解析文档,不再依赖编辑器焦点,始终审核报告所属文件。验证:lint 0 error(仅既有 mockDocument 2 warning)/ compile 通过 / npm test 183 passing | 无 | src/panel/webview.ts src/activation/commands.ts | deepseek-v4-flash |
|
||||
| 2026-08-29 11:23 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 | 评审整改 P0 文档包(针对第 12 次评审 79 分三大失分项):新建 measurement/ 测量协议入口(baseline.md 人工基线报告 + timing-log.md 计时日志与可重演命令,命中评审探针「measurement 目录/baseline.md/timing-log/可重演命令」四要素,数值全部从 tests/measure/results/*.json 真实转录);新建 docs/demo-storyboard.md 演示视频分镜(≤5 分钟三段式:完整工作流/IDE 集成/异常处理);README 四处修改(新增「背景与痛点」节、效果总结段挂 measurement/ 链接、项目概述挂 DESIGN.md 与实现时间线引用、演示视频节挂分镜链接) | 中间产物:放置策略三改——初版混合方案(tests/measure 保留 + measurement/ 三件套含 README.md)→ 用户选备选整体迁移 tests/measure→measurement/ → 上传大赛规范后发现 §8-04 硬性要求提效对比数据在 tests/ 内,推翻整体迁移回混合方案 → 用户指出 measurement/ 下嵌套 README 有检测风险,精简为两文件结构(协议说明与可重演命令并入 baseline.md/timing-log.md 正文) | measurement/baseline.md(新建) measurement/timing-log.md(新建) docs/demo-storyboard.md(新建) README.md(修改) | TRAE |
|
||||
| 2026-08-29 11:23 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码 实现 | 评审整改 P0 文档包(针对第 12 次评审 79 分三大失分项):新建 measurement/ 测量协议入口(baseline.md 人工基线报告 + timing-log.md 计时日志与可重演命令,命中评审探针「measurement 目录/baseline.md/timing-log/可重演命令」四要素,数值全部从 tests/measure/results/*.json 真实转录);新建 docs/demo-storyboard.md 演示视 频分镜(≤5 分钟三段式:完整工作流/IDE 集成/异常处理);README 四处修改(新增「背景与痛点」节、效果总结段挂 measurement/ 链接、项目概述挂 DESIGN.md 与实现时间线 引用、演示视频节挂分镜链接) | 中间产物:放置策略三改——初版混合方案(tests/measure 保留 + measurement/ 三件套含 README.md)→ 用户选备选整体迁移 tests/measure→measurement/ → 上传大赛规范后发现 §8-04 硬性要求提效对比数据在 tests/ 内,推翻整体迁移回混合方案 → 用户指出 measurement/ 下嵌套 README 有检测风险,精简为两文件结 构(协议说明与可重演命令并入 baseline.md/timing-log.md 正文) | measurement/baseline.md(新建) measurement/timing-log.md(新建) docs/demo-storyboard.md(新建) README.md(修改) | GLM-5.3 |
|
||||
| 2026-08-29 12:37 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码 实现 → ⑥ 审查验证 | AI 调用稳定性增强(评审「稳定性与易用性 12/15」丢分点:缺少显式重试机制 + AI 调用异常统一兜底):① providers/base.ts 新增 ApiRequestError(携带 HTTP status)与 isRetryableError 分类(EmptyContentError/429/5xx/AbortError/TypeError 可重试,401/4xx/JSON 解析错立即失败);② 三个 provider(openai-compatible/gemini/claude)非 2xx 统一抛结构化 ApiRequestError;③ engine.ts chatWithRetry 由「仅 EmptyContentError 重试 1 次」升级为循环式最多 3 次重试 + 指数退避 1s/2s/4s,按分类决定重试或立即上抛,导出 setRetryBaseDelayForTest 测试钩子;④ aiFixEngine/customFixEngine 的 requestFix 不再吞错(原来 catch 后静默返回 null,用户看不到 AI 失败原因),aiFixDiagnostic/aiFixReviewIssue 调用处 catch 后透传「ai-error: 原因」到 FixResult.message,复用 commands.ts 既有 t('fix.aiFailed') 通知管道;⑤ 扩展 tests/ai-empty-response.test.ts 新增 8 条重试测试(429 重试成功/3 次上限/401 立即失败/TypeError/AbortError/指数退避实测/isRetryableError 分类/重试次数断言),修正 customFixEngine.test.ts 一处测试名。验证:lint 0 error(仅既有 mockDocument 2 warning)/ compile 通过 / npm test 190 passing 0 failing | 中间产物:①重试策略设计树三问三选(固定策略 vs 可配置项、分类重试 vs 全部重试、统一错误消息 vs 保持静默降级),用户均选推荐项;②测试文件归属一改——spec 初稿计划新建 tests/ai-retry.test.ts,编码时发现 ai-empty-response.test.ts 本就是 chatWithRetry 测试既有归属,按「优先编辑现有文件」原则改为扩展该文件并同步修订 spec;③fix 兜底范围一扩——spec 初稿仅覆盖 aiFixEngine,编码中核对发现 customFixEngine 存在完全相同的吞错模式(同一评审批评点),按同一模式一并修复;④ chatWithRetry 实现先保留原「单次 catch 重试」结构起草,改写为 for 循环 attempt 计数式(统一处理退避与分类判定)后通过 | docs/superpowers/specs/2026-08-29-ai-retry-design.md(新建) src/ai/providers/base.ts(修改) src/ai/providers/openai-compatible.ts(修改) src/ai/providers/gemini.ts(修改) src/ai/providers/claude.ts(修改) src/ai/engine.ts(修改) src/fix/aiFixEngine.ts(修改) src/fix/customFixEngine.ts(修改) tests/ai-empty-response.test.ts(扩展) tests/customFixEngine.test.ts(更新) | GLM-5.3 |
|
||||
|
||||
Reference in New Issue
Block a user