From ff06067a18223e3621715859c5843c27805635dd Mon Sep 17 00:00:00 2001 From: learner-i <3065156865@qq.com> Date: Mon, 25 May 2026 23:13:06 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=A7=BB=E9=99=A4=20fcIdx=20-1=20?= =?UTF-8?q?=E5=81=8F=E7=A7=BB=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E8=B0=83=E7=94=A8=E6=92=9E=E9=94=AE=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20(#5095)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当 Claude 直接以多个 tool_use 块起始(无文本前导,index=0)时, -1 偏移导致 index=0 和 index=1 同时映射到 fcIdx=0: - index=0 的工具 args 先流完,发出一次合法调用 ✓ - index=1 的 args 追加到同一 map 槽位,污染后为非法 JSON,该工具丢失 ✗ - index=2 以后的工具各自独占唯一 fcIdx,正常发出 ✓ 结果:每轮并发调用中第 2 个工具必然丢失, 模型收不到对应的工具结果后重试剩余工具, 产生雪球效应(10个→9个→8个...逐轮收缩)。 修复:直接使用 Claude 的 block index 作为 fcIdx,不做偏移。 fcIdx 仅作为本地 map 的 key,只需保证唯一性,无需从 0 开始。 --- relay/channel/claude/relay-claude.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/relay/channel/claude/relay-claude.go b/relay/channel/claude/relay-claude.go index 046ccfe6..6356cd35 100644 --- a/relay/channel/claude/relay-claude.go +++ b/relay/channel/claude/relay-claude.go @@ -442,10 +442,7 @@ func StreamResponseClaude2OpenAI(claudeResponse *dto.ClaudeResponse) *dto.ChatCo tools := make([]dto.ToolCallResponse, 0) fcIdx := 0 if claudeResponse.Index != nil { - fcIdx = *claudeResponse.Index - 1 - if fcIdx < 0 { - fcIdx = 0 - } + fcIdx = *claudeResponse.Index } var choice dto.ChatCompletionsStreamResponseChoice if claudeResponse.Type == "message_start" {