From 2a73d8c4a3568285c4b42b1813d5c4eaa1223d24 Mon Sep 17 00:00:00 2001 From: Luis Pater Date: Wed, 5 Nov 2025 22:48:50 +0800 Subject: [PATCH] fix(translator): simplify tool response handling and adjust JSON schema updates in Gemini modules --- README_CN.md | 2 +- .../gemini-cli/claude/gemini-cli_claude_request.go | 3 ++- .../openai/chat-completions/gemini-cli_openai_request.go | 8 ++------ .../translator/gemini/claude/gemini_claude_request.go | 2 +- .../openai/chat-completions/gemini_openai_request.go | 9 +++------ .../openai/responses/gemini_openai-responses_request.go | 8 +------- 6 files changed, 10 insertions(+), 22 deletions(-) diff --git a/README_CN.md b/README_CN.md index eacda052..1719ebf8 100644 --- a/README_CN.md +++ b/README_CN.md @@ -14,7 +14,7 @@ 本项目由 Z智谱 提供赞助, 他们通过 GLM CODING PLAN 对本项目提供技术支持。 -GLM CODING PLAN 是专为AI编码打造的订阅套餐,每月最低仅需20元,即可在十余款主流AI编码工具如Claude Code、中畅享智谱旗舰模型GLM-4.6,为开发者提供顶尖的编码体验。 +GLM CODING PLAN 是专为AI编码打造的订阅套餐,每月最低仅需20元,即可在十余款主流AI编码工具如 Claude Code、Cline、Roo Code 中畅享智谱旗舰模型GLM-4.6,为开发者提供顶尖的编码体验。 智谱AI为本软件提供了特别优惠,使用以下链接购买可以享受九折优惠:https://www.bigmodel.cn/claude-code?ic=RRVJPB5SII diff --git a/internal/translator/gemini-cli/claude/gemini-cli_claude_request.go b/internal/translator/gemini-cli/claude/gemini-cli_claude_request.go index a4c737f0..ef5c77e8 100644 --- a/internal/translator/gemini-cli/claude/gemini-cli_claude_request.go +++ b/internal/translator/gemini-cli/claude/gemini-cli_claude_request.go @@ -99,7 +99,7 @@ func ConvertClaudeRequestToCLI(modelName string, inputRawJSON []byte, _ bool) [] if len(toolCallIDs) > 1 { funcName = strings.Join(toolCallIDs[0:len(toolCallIDs)-1], "-") } - responseData := contentResult.Get("content").String() + responseData := contentResult.Get("content").Raw functionResponse := client.FunctionResponse{Name: funcName, Response: map[string]interface{}{"result": responseData}} clientContent.Parts = append(clientContent.Parts, client.Part{FunctionResponse: &functionResponse}) } @@ -127,6 +127,7 @@ func ConvertClaudeRequestToCLI(modelName string, inputRawJSON []byte, _ bool) [] inputSchema := inputSchemaResult.Raw tool, _ := sjson.Delete(toolResult.Raw, "input_schema") tool, _ = sjson.SetRaw(tool, "parametersJsonSchema", inputSchema) + tool, _ = sjson.Delete(tool, "strict") var toolDeclaration any if err := json.Unmarshal([]byte(tool), &toolDeclaration); err == nil { tools[0].FunctionDeclarations = append(tools[0].FunctionDeclarations, toolDeclaration) diff --git a/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_request.go b/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_request.go index 164d46ae..646001a7 100644 --- a/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_request.go +++ b/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_request.go @@ -149,11 +149,7 @@ func ConvertOpenAIRequestToGeminiCLI(modelName string, inputRawJSON []byte, _ bo toolCallID := m.Get("tool_call_id").String() if toolCallID != "" { c := m.Get("content") - if c.Type == gjson.String { - toolResponses[toolCallID] = c.String() - } else if c.IsObject() && c.Get("type").String() == "text" { - toolResponses[toolCallID] = c.Get("text").String() - } + toolResponses[toolCallID] = c.Raw } } } @@ -254,7 +250,7 @@ func ConvertOpenAIRequestToGeminiCLI(modelName string, inputRawJSON []byte, _ bo if resp == "" { resp = "{}" } - toolNode, _ = sjson.SetRawBytes(toolNode, "parts."+itoa(pp)+".functionResponse.response", []byte(`{"result":`+quoteIfNeeded(resp)+`}`)) + toolNode, _ = sjson.SetBytes(toolNode, "parts."+itoa(pp)+".functionResponse.response.result", []byte(resp)) pp++ } } diff --git a/internal/translator/gemini/claude/gemini_claude_request.go b/internal/translator/gemini/claude/gemini_claude_request.go index 3f3290ff..19bb27a3 100644 --- a/internal/translator/gemini/claude/gemini_claude_request.go +++ b/internal/translator/gemini/claude/gemini_claude_request.go @@ -92,7 +92,7 @@ func ConvertClaudeRequestToGemini(modelName string, inputRawJSON []byte, _ bool) if len(toolCallIDs) > 1 { funcName = strings.Join(toolCallIDs[0:len(toolCallIDs)-1], "-") } - responseData := contentResult.Get("content").String() + responseData := contentResult.Get("content").Raw functionResponse := client.FunctionResponse{Name: funcName, Response: map[string]interface{}{"result": responseData}} clientContent.Parts = append(clientContent.Parts, client.Part{FunctionResponse: &functionResponse}) } diff --git a/internal/translator/gemini/openai/chat-completions/gemini_openai_request.go b/internal/translator/gemini/openai/chat-completions/gemini_openai_request.go index f98dbbf5..450386f9 100644 --- a/internal/translator/gemini/openai/chat-completions/gemini_openai_request.go +++ b/internal/translator/gemini/openai/chat-completions/gemini_openai_request.go @@ -150,14 +150,11 @@ func ConvertOpenAIRequestToGemini(modelName string, inputRawJSON []byte, _ bool) toolCallID := m.Get("tool_call_id").String() if toolCallID != "" { c := m.Get("content") - if c.Type == gjson.String { - toolResponses[toolCallID] = c.String() - } else if c.IsObject() && c.Get("type").String() == "text" { - toolResponses[toolCallID] = c.Get("text").String() - } + toolResponses[toolCallID] = c.Raw } } } + fmt.Printf("11111") for i := 0; i < len(arr); i++ { m := arr[i] @@ -280,7 +277,7 @@ func ConvertOpenAIRequestToGemini(modelName string, inputRawJSON []byte, _ bool) if resp == "" { resp = "{}" } - toolNode, _ = sjson.SetRawBytes(toolNode, "parts."+itoa(pp)+".functionResponse.response", []byte(`{"result":`+quoteIfNeeded(resp)+`}`)) + toolNode, _ = sjson.SetBytes(toolNode, "parts."+itoa(pp)+".functionResponse.response.result", []byte(resp)) pp++ } } diff --git a/internal/translator/gemini/openai/responses/gemini_openai-responses_request.go b/internal/translator/gemini/openai/responses/gemini_openai-responses_request.go index 287beb43..ad75ae8a 100644 --- a/internal/translator/gemini/openai/responses/gemini_openai-responses_request.go +++ b/internal/translator/gemini/openai/responses/gemini_openai-responses_request.go @@ -143,17 +143,11 @@ func ConvertOpenAIResponsesRequestToGemini(modelName string, inputRawJSON []byte } functionResponse, _ = sjson.Set(functionResponse, "functionResponse.name", functionName) - // Also set response.name to align with docs/convert-2.md - functionResponse, _ = sjson.Set(functionResponse, "functionResponse.response.name", functionName) // Parse output JSON string and set as response content if output != "" { outputResult := gjson.Parse(output) - if outputResult.IsObject() { - functionResponse, _ = sjson.SetRaw(functionResponse, "functionResponse.response.content", outputResult.String()) - } else { - functionResponse, _ = sjson.Set(functionResponse, "functionResponse.response.content", output) - } + functionResponse, _ = sjson.Set(functionResponse, "functionResponse.response.result", outputResult.Raw) } functionContent, _ = sjson.SetRaw(functionContent, "parts.-1", functionResponse)