调用失败后怎样重试而不丢证据
先设定故障
DSH 规定一次适配器调用就是一次提供方尝试,SDK 自带重试必须禁用。一次流式响应以 chunk 流和 message 流两种形态落盘,重试是持久日志里的显式事件。
失败如何传播
HTTP 库静默重试把失败证据藏进内部循环
HTTP 库静默重试把失败证据藏进内部循环,DSH 要求适配器只发一次请求,失败就规范化为可序列化的 LlmFailure。远程适配器带 streamIdleTimeoutMs 看门狗,空回复映射成 EMPTY_RESPONSE 错误。
[repo]
双流持久
双流持久:每个分片原样追加为 assistant/chunk 事件,流成功后再落一条 assistant/message 并记录 sourceEventSeqs。失败的半截输出不进派生历史,重试开新编号轮次从持久历史重建。
[repo]
恢复与防线
第 2 个 text 块吐了 3 个 delta 后连接被重置,assistant/message 会出现吗: 不会。失败输出只有 chunk 事件,不组装出 assistant/message。重试时看不到那 3 个 delta。
把历史发给另一家 provider 适配器,上一成功消息的 replayState 去哪了: 历史 provider 与目标 provider 不归同一个适配器实例时,replayState 被剥离,对方只拿到 provider 无关内容。
仍会失效的地方
本页结论对应 revision
0a53fb55bea101816fa226bb964ae2bed71c343b。文件位置、命名和默认行为可能随版本变化,引用实现细节时应同时记录 commit。
来源与核验
- [repo] DeepSeek Harness 官方源码(固定 revision)
- [official] DeepSeek Harness 官方介绍
Revision:0a53fb55bea101816fa226bb964ae2bed71c343b · 核验日期:2026-08-31