From 465c5edab99d539f9972a7970f8c222845bd6d0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B1=E6=9C=88=E5=96=B5=E6=A2=A6?= <152958106+nekohy@users.noreply.github.com> Date: Mon, 25 May 2026 23:14:01 +0800 Subject: [PATCH] fix:gemini to claude tool_use err (#5041) --- relay/channel/gemini/relay-gemini.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/relay/channel/gemini/relay-gemini.go b/relay/channel/gemini/relay-gemini.go index 53020c3f..e39826dd 100644 --- a/relay/channel/gemini/relay-gemini.go +++ b/relay/channel/gemini/relay-gemini.go @@ -1410,6 +1410,14 @@ func GeminiChatStreamHandler(c *gin.Context, info *relaycommon.RelayInfo, resp * response.Id = id response.Created = createAt response.Model = info.UpstreamModelName + if response.IsToolCall() { + finishReason = constant.FinishReasonToolCalls + if info.RelayFormat == types.RelayFormatClaude { + for choiceIdx := range response.Choices { + response.Choices[choiceIdx].FinishReason = nil + } + } + } for choiceIdx := range response.Choices { choiceKey := response.Choices[choiceIdx].Index for toolIdx := range response.Choices[choiceIdx].Delta.ToolCalls { @@ -1470,7 +1478,9 @@ func GeminiChatStreamHandler(c *gin.Context, info *relaycommon.RelayInfo, resp * logger.LogError(c, err.Error()) } if isStop { - _ = handleStream(c, info, helper.GenerateStopResponse(id, createAt, info.UpstreamModelName, finishReason)) + if info.RelayFormat != types.RelayFormatClaude { + _ = handleStream(c, info, helper.GenerateStopResponse(id, createAt, info.UpstreamModelName, finishReason)) + } } return true }) @@ -1480,6 +1490,10 @@ func GeminiChatStreamHandler(c *gin.Context, info *relaycommon.RelayInfo, resp * } response := helper.GenerateFinalUsageResponse(id, createAt, info.UpstreamModelName, *usage) + if info.RelayFormat == types.RelayFormatClaude && info.ClaudeConvertInfo != nil && !info.ClaudeConvertInfo.Done { + response = helper.GenerateStopResponse(id, createAt, info.UpstreamModelName, finishReason) + response.Usage = usage + } handleErr := handleFinalStream(c, info, response) if handleErr != nil { common.SysLog("send final response failed: " + handleErr.Error())