Repository navigation
[P1] 按模型错误类别限制重试并提供备用路径,避免额度拒绝和长超时阻断对话 #155
Description
本轮验收范围更新(2026-10-20,依据用户 00:08 UTC 最新指示):继续完成基础能力、必要短测、审查及上线,并据实验收关闭;24 小时/更长 soak、完整负载、真实 provider 与全量 SPA 联合故障矩阵、供应商实际扣费凭证不作为本轮关闭前置条件,未完成项仍明确标为“未验证”,不会改写历史失败或计为通过。基础功能缺口仍须修复,不能仅修改文字关闭。
本 issue 的基础验收:错误分类、有限重试/总截止时间、取消与熔断、已授权备用策略、embedding 边界及共享账本可工作;隔离故障下反馈可恢复,下一条请求可继续。
本轮基础能力、必要短测、独立审查和生产上线已完成,依据最新范围验收关闭;交付 source
554e81ac/ runtime3.5.6,详见下方2026-10-20完成回执。长期和完整矩阵未验证项保留为历史边界。2026-10-17 的“无需部署/停止生产操作”描述已被本次最新上线要求替代,下方原文与旧证据保留为历史记录。固定暂停的 3.5.3 soak 和已暂停自动核验保持不动;不做生产故障注入,不改凭据、安全设置或生产数据。
生产证据
2026-10-16 对保留账本的只读聚合:2,563 次 LLM 调用中 117 次 failed,不是 117 段失败对话。
| 错误类别 | 调用次数 | 已核对的影响 |
|---|---|---|
| HTTP 402 | 68 | 30 次 knowledge-embedding;38 次 native 调用,其中 27 次合成为 9 个 memory_synthesis 失败,10 次对应 turn 失败,另 1 次 turn 最终 partial |
| timeout | 36 | 34 次 structured 调用(部分后来成功),2 次 turn 约 300 秒后失败 |
model request failed after 1 attempts |
3 | 约 90 秒,2 个 turn 最终 failed、1 个最终 succeeded;需保留底层原因 |
| 空 assistant/tool 响应 | 4 | 3 个 turn 后来 succeeded、1 个 partial,已有恢复有效 |
| 未完整结束的 stream/structured response | 2 | 分别 partial/succeeded,不能算新增终态失败 |
| 用户取消 / 不再需要的 compaction | 4 | 应单独归类,不作为供应商可用性失败 |
HTTP 402 和 timeout 是实际观察;旧账本没有保留上游错误 body/request ID,不能进一步断言一定是“余额不足”、哪个计费子项或供应商内部故障。当前发布后观察到的 5 个 work 均 succeeded,以上是历史失败与仍需覆盖的恢复场景,不声称当前仍有 402。
代码路径与缺口
当前镜像 9332947e099d27b7716236a99604fc548059f6ad 使用 LingxiOS 3.4.7;Worker 模型配置 配置单一 primary。native 的 execution/driver 和产品 共享 LLM 入口 已有重试;需要统一总预算和类别,而不是再叠一层通用重试。embedding 代理也走共享 ledger。
方案
- 建立稳定错误分类:网络/408/429/可恢复 5xx 允许有抖动的有限退避并尊重 Retry-After;认证/授权/402 等配置或额度拒绝不在同一账户上热重试。按 provider/model/credential scope 熔断和探测,避免每个后台 job 重复消耗失败请求。
- 同一 work 的所有 SDK/runtime/备用模型尝试共享最大次数与总 deadline;明确 first-byte、流空闲、单次与整轮超时,不再让一次前台请求无提示地等满 300 秒。取消必须向下传播并释放资源,用户取消不触发自动重跑。
- 仅在已批准的数据边界、价格和工具能力范围内使用预先配置的备用模型;它仍要经过共享预算、成本 ledger、原始授权和请求版本验证。没有可用备用时,提交真实 partial 或明确的失败状态;不伪造答案/执行成功。已提交工具写入不得因换模型而重放。
- embedding/检索故障要区分普通概念对话和必须依赖材料的任务。普通对话可标记检索不可用后继续;依赖来源的问题只能基于已有授权证据给有限答案或说明缺口。不得未经重建索引就混用不同 embedding 模型/向量空间。后台 memory synthesis/evaluation 独立退避,不占满交互并发。
- ledger 保留脱敏 provider code、HTTP status、request ID、attempt/elapsed、最终工作状态及
cause分类;不记录 API key、prompt、原始响应正文。明确 402 的账户/模型配置核对流程,使下一次能查到真正原因。
验收
- 在隔离 provider 故障注入中覆盖 402、429、503、断网、无首字节、半途断流、空输出、用户取消;断言请求次数/总耗时有上限、熔断有效、ledger 与费用一致、已提交写入只有一次。
- 覆盖备用可用/不可用和 embedding 失败;已有空输出成功恢复行为不能回退。
- 既有 runtime integration 加一轮受控真实 provider 验证;浏览器 E2E 通过
tester-army/e2e/@e2e-dev/web,保存脱敏调用时间线与可继续发送下一条消息的验证产物。
基础配置瓶颈另见 #153。
Activity
lyyzka commentedon Oct 17, 2026
追加状态:PR171/172/173 已合并 main;精确发布包3.5.1/schema12、实际不可变镜像迁移、完整 SPA 的6项 session/network/PG/Web-restart验收及10项 runtime/identity联合浏览器验收已有脱敏持久证据。402=1次、timeout=3次、context/budget/cancel=0次,持久终态不伪造结果,重读不重复,下一条可成功。
最新证据与边界:https://github.com/LingXi-Org/LingxiLoop/blob/cad71ff73779d0f866526e727415de5bc34156e9/docs/evidence/runtime-measurements/README.md
仍保留 open:父任务已确认没有新增可用的既有 provider/pricing 配置,因此没有实际 provider 调用。生产 Worker bubblewrap 被执行器 user namespace 限制;自动 Komodo rollout 仍在首次连接时失败,无 update ID。上述缺口不能用 fixture、Web/API-only观察或 workflow 跳过状态替代,亦未创建凭据、扩权、手动部署或修改生产安全设置。
lyyzka commentedon Oct 17, 2026
开发复查已补齐两处真实缺口:外层模型总超时现在保留 timeout/model_unavailable 分类并结算已发出的调用;semantic-memory embedding 的402/授权/429 insufficient_quota进入按provider/model/credential隔离的拒绝熔断,保持向量空间缓存标识不变。慢账本结算不会把先发生的模型超时覆盖成后来的根预算超时,调用者取消仍不重跑。
上游 PR26/27 已合并并正式发布3.5.2/schema12;精确 main release-gates39015169232、publish39015407648均422/422。产品 PR174 HEAD
faea44a3a092d2caff49527ae3753c7f7de2d0bf已安装注册表精确包和双锁文件;新增总超时集成从3.5.1红转绿,官方浏览器恢复11/11,服务端106/106。终态/后续请求/调用次数/结算/截图/视频见证据。最终PR CI进行中。仍未宣称受控真实provider验收:当前没有可用且已授权的provider配置、价格及调用/费用上限。此项保留开放;部署已按用户要求移出范围,不再探测Komodo或操作生产。
lyyzka commentedon Oct 17, 2026
后续结果:PR174已普通合并到main
ba9014958f7ab0dc0636a18edd1339d9e9e76e60,main CI39016358468 全部开发门禁和不可变server镜像发布成功;update-manifests/deploy/rollout均按用户要求SKIPPED,没有生产部署。3.5.2公开包与双锁已接线。最终证据。此前说明的外部验收边界不变,issue保持开放,未冒充真实provider/账单/完整24h通过。lyyzka commentedon Oct 17, 2026
3.5.2的完整SPA会话/人类消息恢复补验已完成:PR175已普通合并到main
06ba56169ae8796bf6e067f4eecca0064145a816,6/6、零失败/重试/跳过。真实新建的独立PG/Redis/WuKong/存储与Web/control/D1覆盖了session恢复/过期、网络中断、PG暂停、Web重启及两种401发送竞态;老发送不越权重放,后续发送一次持久落库。保留13截图/6视频及实际计数。证据与逐项验收映射。对153/155/157/161的复查未发现新增产品/runtime代码缺口,当前新增仅隔离夹具及证据。完整Worker预检仍有明确环境失败:宿主
setting up uid map: Read-only file system,独立默认安全配置容器No permissions to create new namespace,均exit1;未扩权。受控真实provider/价格配置未提供。完整Worker/真实provider及费用/完整观察时窗仍属外部验收条件,保持issue开放。这次通过的是3.5.2完整SPA登录后会话/消息链路,不包括captcha登录、模型辅助完整Worker对话或3.5.2耐久验证。原3.5.1 Web/API soak未动、未改版本标签;既有06:50UTC独立复查任务已经核验启用,没有重复安排。部署继续排除。
lyyzka commentedon Oct 19, 2026
2026-10-19 本轮验收继续:既有隔离回归与3.5.2 SPA证据仍按原范围有效;当前云环境已具备现有provider测试配置与生产只读运维访问,正在补充受控真实调用/费用及最终版本验收。不会将fixture、CI门控跳过或旧3.5.1未完成soak当作这些外部条件通过。当前仍保持开放;PR185已审查并合并,最终发布按本轮依赖统一编排。
lyyzka commentedon Oct 19, 2026
阶段进度:补充的产品真实localhost HTTP故障矩阵已在PR192合并,429/503/断连/半流/空输出与既有402/超时/取消/准入/mention联合14/14、零跳过。实际provider工具续接/流式/账本证据另外保留在PR191;两者范围分别记录,不能相互冒充。最终正式runtime复验、生产发布及仍缺的完整Worker/真实模型SPA边界尚未全部完成,issue保持开放。
lyyzka commentedon Oct 19, 2026
状态纠正:PR192 原说明中的否定句仍包含 GitHub 自动关闭关键词,合并时触发了关闭。现已移除该关键词并重新开放;14/14 隔离矩阵不等同于最终版本及完整 Worker/真实模型 SPA 验收,未验收边界继续按此前进度记录。
lyyzka commentedon Oct 19, 2026
本轮代码与正式 LingxiOS 3.5.3 已随 PR194 / 成功发布流程 上线;生产版本/配置/readiness已核验。
正式包 provider 证据保留首轮矩阵 13/14、1失败、0跳过:100ms总deadline用例预期服务收到1请求,实际0。其终态分类断言通过;之后同一源码、正式包和100ms阈值的单项复验 1/1,未重跑或重写首轮。首轮原因未被证明,不归因于未经证实的环境因素。最终源码CI另有281通过、0失败、21门控跳过,跳过不记作通过。
受控真实 GLM-5.3-Flash 验收1/1,4次成功调用覆盖流式预览、工具续接及持久结果。完整产品 Worker/provider 故障与 SPA 联合边界尚未全部完成,故本 issue 保持开放;真实模型成功样本和正常上线不能替代该验收。
lyyzka commentedon Oct 20, 2026
按用户2026-10-20最新范围,基础能力、必要短测、独立审查与上线已完成,验收关闭。
模型错误分类、有限重试/总预算、取消、熔断和授权备用路径通过基础验收。已有业务实现随本次正式候选继续交付。
生产已由正常 CI/CD 发布:source
554e81ac7fc59984d069a104d555adbf48092411,正式 runtime3.5.6;精确 main CI/CD成功。Komodo 实际聚合回执为 Complete / success:true;四个 API/Worker 容器均为该 source 的同一已发布镜像、健康,当前 Docker OOMKilled=false 且 restartCount=0,两个同镜像迁移容器 exit 0,两轮 HTTPS 就绪/版本检查通过。镜像 manifest listsha256:ed3088feac9dacbfe6b639b6d6edd7b0b2c53a2b3ab58740a20f8b76e23aed56。产品迁移46/runtime schema12未新增;本轮没有重新通过直连SQL读取schema/lease,不能把迁移exit回执称为该项验证。交付:回调证据 · PR207 · PR208 · PR209 · PR211 · 上游PR32。
未验证范围:真实供应商故障注入、实际扣费凭证、全量SPA联合故障矩阵未验证;合成provider结果不能证明生产供应商SLO。 固定暂停3.5.3观察与自动核验未触碰;未做生产故障注入、真实provider调用或凭据/安全配置变更。旧文中的长期/完整矩阵复选框保留作为历史边界,不标为通过。