Replies: 1 comment
|
Thanks — this reproduces, and the diagnosis is right. Two things worth adding: the failure is broader than the notice that triggered it, and the fix point the report proposes is not reachable from a plugin, so I shipped the read-boundary half as one. The mechanism, at line level
if (block.type === 'text') return block.text ? [{ type: 'text', text: block.text }] : []
if (block.type !== 'image') return unsupported(`user/tool-result content ${block.type}`)and
Your verification (15 sessions, 147 notice events, 140 Why this cannot be a plugin patch to the serializer I checked whether the fix could live where the report proposes. It cannot, from a plugin:
So the serializer-level degrade you ask for (the way historical tool arguments already become The half that is reachable: a request rewrite before dispatch While it is owed, the read boundary can be emulated on top of
It ships a Stated plainly, it is a workaround and not the fix:
I verified the end-to-end claim by driving a real One seam fact, for anyone else attempting a rewrite
Unrelated, found while testing against each line: a pinned non-latest prerelease line is not installable in a fresh tree, with no plugin involved.
|
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
What happens
With the Messages protocol, which became the DeepSeek default in 0.1.6-alpha.1, every request from a session that holds a subagent settlement notice saved before that release fails:
The session is then unusable on any DeepSeek model. A non-DeepSeek route works, a new session works, and the UI offers no way back into the broken one.
Why
dsh-subagentstores the settlement notice as auser/messagewhose content carries the child's closing message blocks. Before 0.1.6-alpha.1 that included the child'sreasoningandtool-callblocks. The 0.1.6-alpha.1 note says new notices pass body text only, and that saved notices are unchanged.dsh-llm-deepseekserializes user and tool-result content throughinput(), which acceptstextandimageand callsunsupported()for anything else. One old notice therefore poisons the whole history, and it stays in the log, so the session cannot be recovered from the UI. A user who only switches the model for one turn keeps the broken session.The chat-completions serializer in the same package flattens text blocks and silently drops the rest, which is why this appeared only once Messages became the default.
What would fix it
Sanitize historical user and tool-result content at serialization time, the way historical tool arguments are already degraded to
{}instead of failing the request, or migrate stored notices on load. Failing the request makes the session permanently unusable, which is a heavy outcome for data the user cannot see or edit.Reproduction
Verification
Verified on 0.1.6-alpha.2, Node 22, Linux. 15 stored sessions on one machine carried such notices (147 notice events, 140
reasoningblocks and 82tool-callblocks), and every one of them failed the same way on the DeepSeek route. Repairing the stored notices by dropping the blocks the serializer cannot carry restores all of them, which confirms the diagnosis: the failure is caused by the stored notice content alone.Update
@argszero reproduced this and confirmed the diagnosis. The sharper framing, and where each half stands:
reasoningandtool-callare the block types a durableuser/messagecan carry that no DeepSeek protocol can represent there, so any producer that puts assistant vocabulary in a user message breaks a session the same way.UNSUPPORTED_CONTENTis not in the retryable set, so the failure is immediate and permanent. No later turn recovers, which is what makes "permanently unusable" literal rather than rhetorical.DUPLICATE_ADAPTER), and serialization happens inside the adapter, below the publicllm/streamwaterfall.reasoningis representable on both protocols and is required for chain-of-thought passback.All reactions