- [复合工具轮签名锚点精准对齐] 解决工具调用伴随进度文本时的签名误错位,保证签名严格锁定首个 functionCall (Fixes #3529, Thanks to @Mortalit):
- 根因分析与实测确诊: 当模型或客户端在生成工具调用的同一轮次回传进度/说明正文(如
[thought, text, functionCall])或占位符时,原parts.iter().position(|p| !is_thought_part(p))逻辑粗暴将首个正文作为锚点,把签名印在text部件上,并在清理非锚点签名时强制清除了后续functionCall的签名。Google Gemini 上游在执行工具调用校验时,只检查functionCall部件是否带有thought_signature,导致即使报文携带了有效签名仍被 400 拦截:Function call is missing a thought_signature in functionCall parts。 - 动态锚点优选机制 (
find_turn_anchor): 终审门禁与流水线重构锚点判定:当本轮包含functionCall时,首个functionCall部件拥有最高锚点优先级,签名严格锁定在工具调用上;仅在纯正文轮次时平滑回退至首个非思考正文部件,实现两类轮次的精准解耦。 - 全轮签名抢救与反向更新闭环:
place_turn_signature增加own_sig全轮扫描机制。若客户端曾将签名误挂在正文或占位符上,网关先将签名抢救提取,再精准迁移至目标functionCall锚点,并反向更新 SQLitetool_signatures与内存缓存。 - 协议适配层对称补齐: 为
claude/response.rs非流式工具调用解析补全SignatureCache::global().cache_tool_signature缓存写入,确保流式与非流式调用双向缓存完全对称。 - 中间件脏占位文本净化: 在
claude/request.rs、openai/request.rs与流水线入站中,对伴随tool_calls/tool_use出现的"..."等无意义客户端占位文本执行纯净化丢弃,保留合法实质性进度正文,确保前缀缓存哈希稳定。
- 根因分析与实测确诊: 当模型或客户端在生成工具调用的同一轮次回传进度/说明正文(如
Full Changelog: v4.8.4...v4.8.5-beta.1