Skip to content

fix(aistudio): 支持输出纯文本后的工具调用异常续写与写代码助手调用块恢复 - #143

Merged
Mag1cFall merged 2 commits into
Mag1cFall:mainfrom
BLACK-BIRTHDAY:fix/tool-call-continuation-recovery
Nov 11, 2026
Merged

Mag1cFall merged 2 commits into
Mag1cFall:mainfrom
BLACK-BIRTHDAY:fix/tool-call-continuation-recovery

Conversation

@BLACK-BIRTHDAY

Copy link
Copy Markdown
Contributor

改动 / Changes

  • internal/aistudio/generate.go: 上游在已输出纯文本且无函数调用、媒体、可执行代码与服务端工具步骤后以 malformed_function_call、unexpected_tool_call、malformed_response、完成帧前断流或流尾 5xx 结束时,把已输出纯文本作为 model 轮并附加带 <partial_reply>(末尾至多 20000 字符)的用户提示在同一流内续写(最多 3 次),以 continuationPrefixStripper 过滤续写轮开头重复的已输出前缀、保留思考签名并按续写规则合并各轮用量。
  • internal/aistudio/assistant.go:
    • repairJSONStrings 在字符串字面量之外去掉 } 与 ] 前的尾随逗号。
    • 请求声明客户端函数且本轮未解出函数调用时,识别缺失或无法解码的 function_calls 代码块、缺少调用块的 ask_question 交回提问,以及调用 search_web 和 ask_question 之外工作区内置工具的步骤,停止读取该任务后续步骤并在同一应用中追加要求写出 function_calls 代码块与 ask_question 的用户轮(最多 3 次),去重重复前缀并合并用量。
  • docs/protocol.md & docs/build.md: 同步说明输出纯文本后的异常续写流程与写代码助手调用块恢复行为。

验证 / Verification

  • internal/aistudio/compatibility_test.go: 新增 TestGeneratePartialTextMalformedFunctionCallContinuation 与 TestAssistantFunctionCallRepairAndContinuation,覆盖纯文本输出后遇到 malformed_function_call 的流内续写、前缀去重、思考签名保留、用量合并,以及写代码助手尾随逗号修复、损坏/缺失 function_calls 代码块与工作区内置工具拦截后的同应用恢复。
  • 执行 go test ./internal/aistudio ./internal/api 与 go vet ./internal/aistudio ./internal/api 全部通过。

Summary

Generate (Playground / Build)
  decodeStream -> malformed_function_call / unexpected_tool_call / malformed_response
    committed == false -> 原始请求重新生成(最多 3 次)
    committedTextOnly  -> 追加 model(已输出纯文本) + user(<partial_reply> 续写提示)
                       -> continuationPrefixStripper 去掉重复前缀并保留 ThoughtSignature
                       -> mergeContinuedUsage 合并各轮用量

sendAssistant (-build)
  DecodeAssistantStream
    repairJSONStrings  -> 去掉 JSON 字符串外的 } / ] 前尾随逗号
    malformed / invalidTool (未解出客户端函数调用)
                       -> 停止读取当前任务后续步骤
                       -> 同应用追加用户轮要求输出 function_calls 代码块 + ask_question(最多 3 次)
                       -> 去掉重复前缀并合并步骤用量

Evidence

  • Before: 上游在输出引导纯文本后因 malformed_function_call 终止或写代码助手写出带尾随逗号的 JSON、遗漏 function_calls 代码块、误调远程工作区工具时,当前轮次缺失客户端函数调用。
  • After: go test -v -run 'TestGeneratePartialTextMalformedFunctionCallContinuation|TestAssistantFunctionCallRepairAndContinuation' ./internal/aistudio 通过,流内续写补齐工具调用且不重复已输出正文。

Merge Danger

Door: two-way

Blast Radius: small

- 写代码助手追加任务改用 continuationPrefixStripper 去掉重复前缀,删除重复的末尾截取函数
- 重新生成循环去掉空分支,按写代码助手、从头重新生成与续写三种情况判断
- 写代码助手在截断处仍在运行的任务于追加用户轮之前取消,动作数组只解析一次,两个重写提示共用调用格式说明
- 流中断后续写的用量计入中断那一次最近一帧的用量
- 模拟上游流的用例移出正式仓库,保留调用块尾随逗号修正的单元测试
@Mag1cFall
Mag1cFall merged commit a83a5a1 into Mag1cFall:main Nov 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants