## 现象 模型输出被截断(length / max_tokens)时,截断错误被当作普通 LLM 错误按可重试处理,用相同图片和参数最多请求 4 次。对总是截断的页面(例如内容很多而模型输出上限不够),每页费用变为 4 倍,最后页面仍然失败。用户每点一次「重试失败页」,这一页又会再走 4 次。 ## 复现步骤 用真实 Worker、ModelService、OpenAIClient 配本地 HTTP 服务(每次 mock 用量 1000/4096): | 场景 | HTTP 请求数 | 累计用量(输入/输出) | 结果 | |---|---|---|---| | 正常结束 | 1 | 1000/4096 | 成功 | | 第 1 次截断、第 2 次正常 | 2 | 2000/8192 | 成功 | | 每次都截断 | 4 | 4000/16384 | 页面失败,约 7.6 秒 | 证据:评估探针复现。评估基准 commit `ed7e9e8`。 ## 代码位置 - `src/core/application/workers/ConverterWorker.ts:251`:循环 `attempt <= maxRetries` - `src/core/infrastructure/config/worker.config.ts:41`:`maxRetries` 为 3(最多 4 次) - `ConverterWorker.ts:808-815`:截断错误文案含 "LLM",被归为 `LLM_ERROR` - `ConverterWorker.ts:827`:`isRetryableError` 判为可重试 - `ConverterWorker.ts:313-317`:重试不调整 `maxTokens` ## 风险等级 中。 ## 产品判断 #87 修复后截断不再静默成功,这是对的,但现在截断页会按 4 倍计费再失败,对付费 API 用户是真实的钱。第 2 次可能恢复(模型陷入重复输出时),所以不建议取消重试。修复成本低,有必要修;只写进发版说明不能降低费用。 ## 建议修法 - 截断单独设错误类型,最多重试 1 次(最坏 2 倍费用)。 - 错误文案里的「Try again」建议改为提示换用输出上限更高的模型。 - 同步修改 `ConverterWorker.test.ts:1112` 中「调用 4 次」的断言。 ## 验收标准 - 每次都截断时,单页最多发出 2 次请求,页面标记失败并给出换模型的提示。 - 第 1 次截断、第 2 次正常时仍能成功。 - 其他可重试错误的重试次数不变。 - 测试覆盖以上三种场景。 来源:小S 对 PR #90 审查遗留,经只读评估确认。
Activity
fix(converter): 输出截断最多重试 1 次,避免按 4 倍计费 (#96) (#98)