Repository navigation
Replies: 1 comment
|
一条坏调用能拖垮整轮,是因为解析发生在流翻译内部,抛的是
try { parsed = JSON.parse(content.arguments) } catch (_invalidProviderToolJson) { return malformed('tool input is invalid JSON') }
所以不是重试逻辑没生效,是这条路径上没有"部分成功"的分支:校验在收尾时对所有 block 一次性做,任何一条失败即整条流失败。 改法就在这个 catch 里:把"某条调用的 arguments 坏了"和"流本身坏了"分开,给该 block 记一个 invalid-arguments 标记让 turn 继续,由工具层把这条调用当 版本上核过一遍:你报的是 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
环境
0.2.1-alpha.4,webprofile,Windows x64deepseek-official / deepseek-flash,reasoningEffort: high,maxTokens: 256000现象
一轮直接失败,
turn/end记录:{"type":"turn/end","seq":19,"data":{"turn":1, "reason":{"kind":"error","error":{ "message":"DeepSeek Messages stream: tool input is invalid JSON", "code":"MALFORMED_RESPONSE"}}}}用户侧只看到「本轮运行失败」,拿不到任何部分结果。
复现证据:坏的只有一条调用
同一 step 里模型并行发起了两个 tool-call,其中一条完全合法:
ops_bash{"command": "ls", "description": "List workspace contents"}ops_glob{"pattern": **/example*/**/*.cpp}流末尾:
{"type":"finish","reason":{"kind":"error","failure":{ "message":"DeepSeek Messages stream: tool input is invalid JSON", "code":"MALFORMED_RESPONSE"}}}即:一条语法坏的调用,让整轮(含那条合法调用)全部作废。
相关代码(dsh-llm-deepseek)
为什么值得改
if (reason.kind !== "max-tokens")说明截断场景被考虑过;语法坏 JSON 没有同等宽容,直接整轮失败。tool input is invalid JSON不带工具名、不带片段、不带字节位置,用户和开发者都无从定位。建议
tool input is invalid JSON时丢弃该响应、以同样请求重试 1–2 次(计入 usage,并设上限避免循环)。影响范围(供参考,说明是低频)
同一台机器 31 个会话、数百次 tool-call 中只出现 1 次;但一旦发生就是整轮失败,用户体感很差。
All reactions