DSH 图片附件丢失与 TRANSPORT 恢复
DeepSeek Harness 图片附件丢失:TRANSPORT 重试与恢复
- 作者
- DeepSeekAgent.io 编辑部
- 发布
- 更新
一张历史图片的本地对象丢失后,DeepSeek Harness 可能把确定性的附件错误包装成 TRANSPORT,随后按网络故障重复重试。用户看到的是会话卡住十几秒,实际上请求可能根本没有离开本机。
2026 年 10 月的一份社区复现在 Windows、DSH Desktop 0.2.1-rc.2 和 deepseek-flash 下记录了这条路径:Session 历史仍保留图片引用,但内容寻址存储中的对象不存在;下一轮在 100 ms 内失败,之后触发 5 次无效重试。恢复完全相同的图片字节后,会话立即恢复。
附件为何会留下一半状态
DSH 的持久会话保存附件引用,实际字节则进入内容寻址对象目录。社区复现中的对象路径为:
${DSH_HOME}/attachments/v1/objects/<hash 前两位>/<完整 hash>
这种设计避免在每条消息中重复保存大文件,也允许相同内容复用对象。代价是引用和对象必须一起备份、迁移和恢复。Session 文件存在,并不保证引用的图片仍可读取。
为什么它不属于网络重试
社区分析指出,读取缺失对象时产生的 AttachmentError: ATTACHMENT_NOT_FOUND 被 Adapter 捕获并重新归类为 LlmError(..., "TRANSPORT")。默认重试策略看到 TRANSPORT 后尝试再次发送,但每次都会在本地准备阶段遇到同一个缺失文件。
以下信号更接近本地附件故障:
- 发送后几乎立刻失败,没有正常网络延迟;
- 同一会话的后续纯文本消息也失败,因为历史图片仍需投影;
- 重试间隔存在,但每次错误完全一致;
- 新会话可以调用同一模型;
- Provider 侧没有对应请求记录。
安全恢复顺序
1. 停止自动重试
继续重试不会生成缺失的对象,只会拖延恢复并制造误导性的网络噪声。记录完整错误、Session ID、DSH 版本和附件 hash。
2. 只读核对对象
确认 Session 中的附件引用和对象路径,不要批量删除附件目录。若对象存在,还要核对权限、大小与 hash;若对象缺失,寻找原始文件或同一对象的备份。
3. 从可信备份恢复精确字节
内容寻址存储要求恢复内容与引用 hash 一致。不要用另一张相似图片替代,也不要通过修改文件名伪造对象。恢复后先复制备份,再发送一条最小消息验证。
4. 无法恢复时迁移任务上下文
社区复现报告称,在缺失图片之前创建分支可以得到不包含该图片块的历史;在图片之后分支仍会继承引用。若界面支持从更早节点分支,这是比直接编辑 Session Journal 更稳妥的方案。
如果无法分支,整理已确认结论、待办与必要文字,创建新 Session 继续。除非熟悉 Session 格式、Projection Cache 和校验关系,不要手工删除 Journal 中的图片块。
备份与实现层改进
用户侧备份应同时覆盖 Session、附件对象和 Profile 配置,并通过恢复演练确认引用能解析。只备份 JSONL 会留下不可用的图片历史。
实现层可以保留 ATTACHMENT_NOT_FOUND 这类确定性错误码,并将它排除出 TRANSPORT 自动重试;界面则直接显示缺失 hash、预期位置和恢复/迁移选项。该建议来自社区讨论,不能当作已经进入正式版本的修复。
图片能力配置本身可参考 DSH 视觉模型配置。如果故障发生在插件工具变化之后而非附件读取阶段,请转到动态工具更新与会话恢复。