Repository navigation
Replies: 2 comments
|
补充:本次还定位到第二条独立触发路径(与附件缺失去无关,同样表现为"本轮运行失败")。 现象同一实例、换了一个会话,连续多轮失败,但这次错误码不是 ( 原因Messages 序列化器对 user / tool-result 消息只允许 {"type":"user/message","seq":10998,"data":{"role":"user",
"source":{"kind":"subagent-settled","form":"notice","senderSessionId":"…"},
"content":[
{"type":"text","text":"Background subagent … finished and will do no further work unless you send it more."},
{"type":"text","text":"Its closing message:"},
{"type":"reasoning","text":"Now let me write my final report …"},
{"type":"text","text":"…"}]}}
为什么现在才炸(对照)
也就是说:这类"畸形"历史数据一直存在(本机两个数据根里共 31 个会话、105 条同类消息,最早可追溯到 9-11),只是旧链路宽容、新链路严格才暴露出来。 上游侧的一点情况0.1.6-alpha.1 里的
建议在 Messages 序列化器(以及 chat-completions 侧保持一致)对 user / tool-result 内容采用与旧行为一致的降级策略:遇到未知块时跳过该块(并可选记一条 warn),而不是让整轮失败;至少把错误信息补上足够的定位信息(消息 seq / 块类型 / 块索引),现在这句 (本地已按此思路清理了 31 个会话的 105 条历史脏消息,两个数据根各留了一份 |
追加:同一会话的第四个失败面 ——
|
| body 大小 | /chat/completions |
/anthropic/v1/messages |
|---|---|---|
| 2 / 6 / 12 / 24 / 40 MiB | 401 | 401 |
| 64 / 96 MiB | 413 | 413 |
413 的响应体是 nginx 的 <h1>413 Request Entity Too Large</h1>,属网关层限制,与协议、鉴权、apiKey 均无关。所以切协议不能绕过(我一开始猜是端点差异,实测推翻;特此更正)。
为什么会到这个量级
同一会话(12,554 事件)的当前模型上下文估算:
- 未被 prune 的事件 ≈ 39.3 M 字符,其中
assistant/message占 38.5 M - 会话里的 32 张图片字节只有 6.3 MB(base64 后 8.4 MB)——图片不是主因,文本历史才是
- 会话有 5 次 compaction,但
compaction/prune只标记了 44 个 seq(12,511 个事件里)→ 压缩基本没起作用 - 同机另一实例(0.1.5-rc.2,chat-completions)在上下文较小时段能正常完成请求,说明链路本身没问题
期望
- 压缩策略要真的能压:这个会话 5 次 compaction 只 prune 了 44/12,511 个事件,长会话因此能一路膨胀到网关上限;建议 compaction 以"渲染后字节/token 预算"为触发与终止条件,而不是仅按事件数。
- 配额/上限要前置暴露:适配器(或 agent loop)无法从 provider 配置得知网关的请求体上限;如果有一个"渲染后字节上限"的软阈值(例如命中就强制 prune/报
CONTEXT_WINDOW_EXCEEDED类可读错误),就不会以 413 的形式在传输层炸掉。 - 错误可读性:413 被包装成
DeepSeek Messages request failed (413),用户看不出是"请求体过大、需要压缩/新开会话",也不知道阈值在哪。
(本地缓解方式是人工折叠/重建该会话上下文;不改网关行为。)
Uh oh!
There was an error while loading. Please reload this page.
环境
alpha);同机另有 0.1.5-rc.2 实例作对照deepseek-official/deepseek-flash,reasoningEffortmaxhttps://api.deepseek.com/anthropicHTTP_PROXY/HTTPS_PROXY未设置、未设NODE_USE_ENV_PROXY)现象
同一会话连续 7 轮(turn 134–140,约 18 分钟)全部失败:
已重试模型请求(5/5) · 9s,展开只有两行 ——重试延迟:8124 毫秒、失败原因:DeepSeek Messages transport failed;随后本轮运行失败 TRANSPORT。assistant/attempt只含一个finish/error合成 chunk(零内容块、零 usage、无 HTTP status),attempt 自开始到失败约 6–42 ms。dsh-memory插件的上下文注入行(与本问题无关,只是同时出现)。真实原因
该实例的 DSH_HOME(独立数据目录)里没有
attachments/附件库,而会话上下文里有 33 个未 offload 的image块(32 个唯一 sha256 附件 id)。Messages 路径在prepareImages()里逐个attachments.readImageRequest()读图字节时失败(AttachmentError: ATTACHMENT_NOT_FOUND,不是 LlmError),被适配器兜底 catch 统一包装成DeepSeek Messages transport failed/TRANSPORT,随后按默认策略重试 5 次并终止本轮。证据:
attachments/v1/objects/<前2位>/<id>全部存在——图没丢,只是这个数据根里没有附件库;offloaded: true计数为 0、会话里image/offload事件计数为 0 → 请求确实需要读这些字节;POST https://api.deepseek.com/anthropic/v1/messages(假 key)返回 401;body 0.05 / 1 / 10 MiB 分别 150–250 / 193 / 281–488 ms;同一连接池连发 12 次 1 MiB POST 全部 401(68–297 ms);ALPN 探测服务端 h2 与 http/1.1 均可用。失败耗时(6–42 ms)比任何一种成功往返都短,说明请求根本没走到网络。触发条件:把历史会话复制/迁移到另一个数据根,且请求准备阶段需要读图。纯文本会话不会出现;图片恰好全部被 offload 时也不会出现。
已排除
image/offload会话事件不是原因:该会话image/offload事件 = 0、offloaded: true= 0,33 个 image 块都还在上下文里;且适配器是先读图(prepareImages)再做预算判断(requiredImageOffload→IMAGE_OFFLOAD_REQUIRED),本次失败发生在读取阶段,走不到 budget 判断。offload 若触发反而会让请求不再读这些字节,从而掩盖此问题。session-log-deepseek巨型请求体(失败发生在请求发出前);UNSUPPORTED_CONTENT,实际错误码是TRANSPORT)。规避
把完整用户数据目录复制到新数据根(至少
attachments/,另可带llm-deepseek/这个附件→provider file-id 缓存)。我们据此给本地启动器的数据复制清单补上这两个目录后,同一会话即恢复正常。期望上游改进
llm-deepseek的兜底 catch(packages/llm/llm-deepseek/src/protocols/messages/adapter.ts:79,以及 chat-completions 分支的对应处)把请求准备阶段的任何非LlmError都写成TRANSPORT并丢弃cause。建议至少把cause.code/message落到界面细节、会话事件或ctx.logger.warn(例如ATTACHMENT_NOT_FOUND: sha256:…)。否则用户会去查网络、查代理、查这次发布的新特性——本次排查就是这样被带偏的。sha256:xxxx,但当前 DSH_HOME 的附件库中不存在;请检查是否更换过数据目录 / 迁移数据时漏了attachments/"。image/offload事件,也能看到"本轮读取了哪些附件"的轻量记录,便于用户自助定位。关联
可能相关的既有讨论:#6754(同错误串,
session-log-deepseek巨型请求体)、#6401、#4447、#543(传输错误隐藏宿主错误细节)。All reactions